@complexthings/superpowers-agent 9.2.1 → 10.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/claude-handoff/SKILL.md +18 -0
- package/.agents/skills/code-review/SKILL.md +89 -0
- package/.agents/skills/{improve-codebase-architecture → codebase-design}/DEEPENING.md +1 -1
- package/.agents/skills/{improve-codebase-architecture/INTERFACE-DESIGN.md → codebase-design/DESIGN-IT-TWICE.md} +3 -3
- package/.agents/skills/codebase-design/SKILL.md +114 -0
- package/.agents/skills/design-an-interface/SKILL.md +94 -0
- package/.agents/skills/{diagnose → diagnosing-bugs}/SKILL.md +29 -12
- package/.agents/skills/{grill-with-docs → domain-modeling}/CONTEXT-FORMAT.md +1 -4
- package/.agents/skills/domain-modeling/SKILL.md +74 -0
- package/.agents/skills/fable-mode/SKILL.md +95 -0
- package/.agents/skills/git-guardrails-claude-code/SKILL.md +95 -0
- package/.agents/skills/git-guardrails-claude-code/scripts/block-dangerous-git.sh +25 -0
- package/.agents/skills/grill-me/SKILL.md +7 -0
- package/.agents/skills/grill-with-docs/SKILL.md +3 -86
- package/.agents/skills/grilling/SKILL.md +14 -0
- package/.agents/skills/handoff/SKILL.md +2 -1
- package/.agents/skills/i-have-adhd/SKILL.md +120 -0
- package/.agents/skills/implement/SKILL.md +11 -0
- package/.agents/skills/improve-codebase-architecture/HTML-REPORT.md +3 -3
- package/.agents/skills/improve-codebase-architecture/SKILL.md +13 -28
- package/.agents/skills/loop-me/SKILL.md +32 -0
- package/.agents/skills/prototype/SKILL.md +1 -1
- package/.agents/skills/qa/SKILL.md +130 -0
- package/.agents/skills/request-refactor-plan/SKILL.md +68 -0
- package/.agents/skills/research/SKILL.md +12 -0
- package/.agents/skills/resolving-merge-conflicts/SKILL.md +14 -0
- package/.agents/skills/scaffold-exercises/SKILL.md +106 -0
- package/.agents/skills/setup-matt-pocock-skills/SKILL.md +11 -9
- package/.agents/skills/setup-matt-pocock-skills/domain.md +2 -2
- package/.agents/skills/setup-matt-pocock-skills/issue-tracker-github.md +23 -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 +11 -0
- package/.agents/skills/skill-creator/LICENSE.txt +202 -0
- package/.agents/skills/skill-creator/SKILL.md +485 -0
- package/.agents/skills/skill-creator/agents/analyzer.md +274 -0
- package/.agents/skills/skill-creator/agents/comparator.md +202 -0
- package/.agents/skills/skill-creator/agents/grader.md +223 -0
- package/.agents/skills/skill-creator/assets/eval_review.html +146 -0
- package/.agents/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/.agents/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/.agents/skills/skill-creator/references/schemas.md +430 -0
- package/.agents/skills/skill-creator/scripts/__init__.py +0 -0
- package/.agents/skills/skill-creator/scripts/__pycache__/__init__.cpython-314.pyc +0 -0
- package/.agents/skills/skill-creator/scripts/__pycache__/run_eval.cpython-314.pyc +0 -0
- package/.agents/skills/skill-creator/scripts/__pycache__/utils.cpython-314.pyc +0 -0
- package/.agents/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/.agents/skills/skill-creator/scripts/generate_report.py +326 -0
- package/.agents/skills/skill-creator/scripts/improve_description.py +247 -0
- package/.agents/skills/skill-creator/scripts/package_skill.py +136 -0
- package/.agents/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/.agents/skills/skill-creator/scripts/run_eval.py +310 -0
- package/.agents/skills/skill-creator/scripts/run_loop.py +328 -0
- package/.agents/skills/skill-creator/scripts/utils.py +47 -0
- package/.agents/skills/tdd/SKILL.md +17 -90
- package/.agents/skills/tdd/tests.md +16 -0
- package/.agents/skills/teach/GLOSSARY-FORMAT.md +35 -0
- package/.agents/skills/teach/LEARNING-RECORD-FORMAT.md +46 -0
- package/.agents/skills/teach/MISSION-FORMAT.md +31 -0
- package/.agents/skills/teach/RESOURCES-FORMAT.md +32 -0
- package/.agents/skills/teach/SKILL.md +140 -0
- package/.agents/skills/{to-prd → to-spec}/SKILL.md +11 -12
- package/.agents/skills/to-tickets/SKILL.md +114 -0
- package/.agents/skills/triage/AGENT-BRIEF.md +40 -1
- package/.agents/skills/triage/OUT-OF-SCOPE.md +5 -1
- package/.agents/skills/triage/SKILL.md +20 -11
- package/.agents/skills/wayfinder/SKILL.md +127 -0
- package/.agents/skills/writing-great-skills/GLOSSARY.md +201 -0
- package/.agents/skills/writing-great-skills/SKILL.md +83 -0
- package/.agents/superpowers-agent +103 -222
- package/.agents/superpowers-bootstrap.md +3 -3
- package/.agents/templates/AGENTS.md.template +11 -34
- package/.agents/templates/SUPERPOWERS.md.template +4 -4
- package/.github/copilot-instructions.md +23 -99
- package/.github/hooks/rtk-rewrite.json +22 -0
- package/AGENTS.md +7 -6
- package/README.md +53 -174
- package/package.json +2 -2
- package/skills/collaboration/brainstorming/SKILL.md +39 -139
- package/skills/collaboration/brainstorming/skill.json +2 -2
- package/skills/collaboration/leveraging-cli-tools/SKILL.md +70 -71
- package/skills/collaboration/leveraging-cli-tools/references/copilot-instructions.md +30 -0
- package/skills/collaboration/leveraging-cli-tools/scripts/setup-ponytail.sh +185 -0
- package/skills/collaboration/leveraging-cli-tools/scripts/setup-rtk.sh +217 -0
- package/skills/collaboration/leveraging-cli-tools/skill.json +1 -1
- package/skills/meta/create-skill-json/SKILL.md +4 -4
- package/skills/meta/create-skill-json/skill.json +1 -1
- package/skills/meta/create-skill-json/test-scenarios.md +1 -1
- package/skills/setup-skills/SKILL.md +18 -11
- package/skills/setup-skills/skill.json +8 -0
- package/.agents/skills/caveman/SKILL.md +0 -49
- package/.agents/skills/improve-codebase-architecture/LANGUAGE.md +0 -53
- package/.agents/skills/karpathy-guidelines/SKILL.md +0 -75
- package/.agents/skills/review/SKILL.md +0 -78
- package/.agents/skills/tdd/deep-modules.md +0 -33
- package/.agents/skills/tdd/interface-design.md +0 -31
- package/.agents/skills/tdd/refactoring.md +0 -10
- package/.agents/skills/to-issues/SKILL.md +0 -83
- package/.agents/skills/zoom-out/SKILL.md +0 -7
- package/skills/architecture/ABOUT.md +0 -20
- package/skills/architecture/preserving-productive-tensions/SKILL.md +0 -146
- package/skills/architecture/preserving-productive-tensions/skill.json +0 -9
- package/skills/collaboration/brainstorming/spec-document-reviewer-prompt.md +0 -50
- package/skills/collaboration/brainstorming/visual-companion.md +0 -277
- package/skills/collaboration/dispatching-parallel-agents/SKILL.md +0 -174
- package/skills/collaboration/dispatching-parallel-agents/skill.json +0 -9
- package/skills/collaboration/executing-plans/SKILL.md +0 -130
- package/skills/collaboration/executing-plans/skill.json +0 -9
- package/skills/collaboration/finishing-a-development-branch/SKILL.md +0 -261
- package/skills/collaboration/finishing-a-development-branch/skill.json +0 -9
- package/skills/collaboration/leveraging-cli-tools/scripts/slim.py +0 -167
- package/skills/collaboration/receiving-code-review/SKILL.md +0 -233
- package/skills/collaboration/receiving-code-review/skill.json +0 -9
- package/skills/collaboration/requesting-code-review/SKILL.md +0 -110
- package/skills/collaboration/requesting-code-review/code-reviewer.md +0 -146
- package/skills/collaboration/requesting-code-review/skill.json +0 -12
- package/skills/collaboration/subagent-driven-development/SKILL.md +0 -255
- package/skills/collaboration/subagent-driven-development/code-quality-reviewer-prompt.md +0 -26
- package/skills/collaboration/subagent-driven-development/implementer-prompt.md +0 -113
- package/skills/collaboration/subagent-driven-development/skill.json +0 -15
- package/skills/collaboration/subagent-driven-development/spec-reviewer-prompt.md +0 -61
- package/skills/collaboration/using-git-worktrees/SKILL.md +0 -366
- package/skills/collaboration/using-git-worktrees/skill.json +0 -9
- package/skills/collaboration/writing-plans/SKILL.md +0 -121
- package/skills/collaboration/writing-plans/plan-document-reviewer-prompt.md +0 -52
- package/skills/collaboration/writing-plans/skill.json +0 -9
- package/skills/debugging/defense-in-depth/SKILL.md +0 -380
- package/skills/debugging/defense-in-depth/skill.json +0 -9
- package/skills/debugging/root-cause-tracing/SKILL.md +0 -361
- package/skills/debugging/root-cause-tracing/find-polluter.sh +0 -63
- package/skills/debugging/root-cause-tracing/skill.json +0 -12
- package/skills/debugging/systematic-debugging/SKILL.md +0 -299
- package/skills/debugging/systematic-debugging/condition-based-waiting-example.ts +0 -158
- package/skills/debugging/systematic-debugging/condition-based-waiting.md +0 -115
- package/skills/debugging/systematic-debugging/defense-in-depth.md +0 -122
- package/skills/debugging/systematic-debugging/find-polluter.sh +0 -63
- package/skills/debugging/systematic-debugging/root-cause-tracing.md +0 -169
- package/skills/debugging/systematic-debugging/skill.json +0 -9
- package/skills/debugging/systematic-debugging/test-academic.md +0 -14
- package/skills/debugging/systematic-debugging/test-pressure-1.md +0 -58
- package/skills/debugging/systematic-debugging/test-pressure-2.md +0 -68
- package/skills/debugging/systematic-debugging/test-pressure-3.md +0 -69
- package/skills/debugging/verification-before-completion/SKILL.md +0 -143
- package/skills/debugging/verification-before-completion/skill.json +0 -9
- package/skills/finding-skills/SKILL.md +0 -101
- package/skills/finding-skills/skill.json +0 -8
- package/skills/meta/create-agents-md/SKILL.md +0 -182
- package/skills/meta/create-agents-md/skill.json +0 -9
- package/skills/meta/creating-prompts/SKILL.md +0 -349
- package/skills/meta/creating-prompts/examples/do-example.md +0 -65
- package/skills/meta/creating-prompts/examples/plan-example.md +0 -75
- package/skills/meta/creating-prompts/examples/refine-example.md +0 -65
- package/skills/meta/creating-prompts/examples/research-example.md +0 -63
- package/skills/meta/creating-prompts/scripts/get-next-number.sh +0 -27
- package/skills/meta/creating-prompts/skill.json +0 -20
- package/skills/meta/creating-prompts/templates/do-template.md +0 -59
- package/skills/meta/creating-prompts/templates/plan-template.md +0 -58
- package/skills/meta/creating-prompts/templates/refine-template.md +0 -54
- package/skills/meta/creating-prompts/templates/research-template.md +0 -56
- package/skills/meta/using-superpowers/SKILL.md +0 -108
- package/skills/meta/using-superpowers/skill.json +0 -5
- package/skills/meta/writing-prompts/SKILL.md +0 -122
- package/skills/meta/writing-prompts/references/platforms.md +0 -114
- package/skills/meta/writing-prompts/skill.json +0 -9
- package/skills/problem-solving/ABOUT.md +0 -40
- package/skills/problem-solving/collision-zone-thinking/SKILL.md +0 -188
- package/skills/problem-solving/collision-zone-thinking/references/historical-examples.md +0 -393
- package/skills/problem-solving/collision-zone-thinking/skill.json +0 -9
- package/skills/problem-solving/inversion-exercise/SKILL.md +0 -174
- package/skills/problem-solving/inversion-exercise/skill.json +0 -9
- package/skills/problem-solving/meta-pattern-recognition/SKILL.md +0 -116
- package/skills/problem-solving/meta-pattern-recognition/skill.json +0 -9
- package/skills/problem-solving/scale-game/SKILL.md +0 -222
- package/skills/problem-solving/scale-game/skill.json +0 -9
- package/skills/problem-solving/simplification-cascades/SKILL.md +0 -113
- package/skills/problem-solving/simplification-cascades/skill.json +0 -9
- package/skills/problem-solving/when-stuck/SKILL.md +0 -69
- package/skills/problem-solving/when-stuck/skill.json +0 -9
- package/skills/research/ABOUT.md +0 -20
- package/skills/research/tracing-knowledge-lineages/SKILL.md +0 -241
- package/skills/research/tracing-knowledge-lineages/skill.json +0 -9
- package/skills/testing/condition-based-waiting/SKILL.md +0 -359
- package/skills/testing/condition-based-waiting/example.ts +0 -158
- package/skills/testing/condition-based-waiting/skill.json +0 -12
- package/skills/testing/test-driven-development/SKILL.md +0 -434
- package/skills/testing/test-driven-development/skill.json +0 -9
- package/skills/testing/testing-anti-patterns/SKILL.md +0 -298
- package/skills/testing/testing-anti-patterns/skill.json +0 -9
- package/skills/testing/verification-before-completion/SKILL.md +0 -246
- package/skills/testing/verification-before-completion/skill.json +0 -10
- package/skills/using-a-skill/SKILL.md +0 -101
- package/skills/using-a-skill/skill.json +0 -8
- /package/.agents/skills/{diagnose → diagnosing-bugs}/scripts/hitl-loop.template.sh +0 -0
- /package/.agents/skills/{grill-with-docs → domain-modeling}/ADR-FORMAT.md +0 -0
|
@@ -1,189 +1,111 @@
|
|
|
1
1
|
#!/bin/sh
|
|
2
2
|
// 2>/dev/null; exec "$(command -v bun 2>/dev/null || echo node)" "$0" "$@"
|
|
3
|
-
import{
|
|
4
|
-
`),$={name:"",description:"",whenToUse:""},Z=!1;for(let q of Y){if(q.trim()==="---"){if(Z)break;Z=!0;continue}if(Z){let z=q.match(/^(\w+):\s*(.*)$/);if(z){let[,W,K]=z,B={name:"name",description:"description",when_to_use:"whenToUse"};if(B[W])$[B[W]]=K.trim()}}}return $}catch{return{name:"",description:"",whenToUse:""}}},MQ=(Q)=>{try{let X=eQ(Q,"utf8"),Y=$Q(Q),$=X.split(`
|
|
5
|
-
`),Z=!1,q=!1,z=[];for(let W of $){if(W.trim()==="---"){if(Z){q=!0;continue}Z=!0;continue}if(q||!Z)z.push(W)}return{content:z.join(`
|
|
6
|
-
`).trim(),frontmatter:Y}}catch(X){throw Error(`Error reading skill file: ${X.message}`)}};import{existsSync as TQ,readdirSync as YX,statSync as ZX}from"fs";import{join as vQ,relative as lZ}from"path";import{readFileSync as VY,existsSync as _Y}from"fs";import{join as QX}from"path";var qQ=(Q)=>{let X=QX(Q,"skill.json");if(!_Y(X))return null;try{let Y=VY(X,"utf8");return JSON.parse(Y)}catch(Y){return null}};var AQ=(Q)=>{if(Q.startsWith("superpowers:"))return{type:"superpowers",path:Q.substring(12).replace(/^skills\//,"")};if(Q.startsWith("claude:"))return{type:"claude",path:Q.substring(7).replace(/^skills\//,"")};if(Q.startsWith("copilot:"))return{type:"copilot",path:Q.substring(8).replace(/^skills\//,"")};if(Q.startsWith("opencode:"))return{type:"opencode",path:Q.substring(9).replace(/^skills\//,"")};return{type:null,path:Q.replace(/^skills\//,"")}},XX=(Q,X)=>{let Y=qQ(Q);if(!Y||!Y.helpers||!Array.isArray(Y.helpers))return null;let $=Y.helpers,Z=X.toLowerCase(),q=null,z=0;for(let W of $){let K=W.toLowerCase();if(K===Z){q=W;break}if(K.includes(Z)){let E=Z.length/K.length;if(E>z)z=E,q=W}let B=W.split("/").pop().split(".")[0].toLowerCase();if(Z.includes(B)){let E=B.length/Z.length;if(E>z)z=E,q=W}}return q?QX(Q,q):null},s={project:{dir:"projectAgentsSkills",prefix:""},claude:{dir:"projectClaudeSkills",prefix:"claude:"},copilot:{dir:"projectCopilotSkills",prefix:"copilot:"},opencode:{dir:"projectOpencodeSkills",prefix:"opencode:"},personal:{dir:"homePersonalSkills",prefix:""},personalClaude:{dir:"homeClaudeSkills",prefix:"claude:"},personalCopilot:{dir:"homeCopilotSkills",prefix:"copilot:"},personalOpencode:{dir:"homeOpencodeSkills",prefix:"opencode:"},superpowers:{dir:"homeSuperpowersSkills",prefix:"superpowers:"}};var EQ=(Q,X,Y=null)=>{let $=[];if(!TQ(Q))return $;let Z=(q,z)=>{if(Y!==null&&z>Y)return;try{let W=YX(q,{withFileTypes:!0});for(let K of W){if(K.name==="node_modules"||K.name===".git"||K.name.startsWith("."))continue;let B=vQ(q,K.name),E=K.isDirectory();if(K.isSymbolicLink())try{E=ZX(B).isDirectory()}catch{continue}if(!E)continue;let V=vQ(B,"SKILL.md");if(TQ(V))$.push(B);if(Y===null||z<Y)Z(B,z+1)}}catch{}};return Z(Q,0),$};var $X=(Q,X)=>{if(!TQ(Q))return[];let Y=[],$=X.toLowerCase().replace(/\\/g,"/"),Z=(q,z="")=>{try{let W=YX(q,{withFileTypes:!0});for(let K of W){let B=vQ(q,K.name),E=z?`${z}/${K.name}`:K.name,V=K.isDirectory();if(K.isSymbolicLink())try{V=ZX(B).isDirectory()}catch{continue}if(V&&(K.name==="node_modules"||K.name===".git"||K.name.startsWith(".")))continue;if(V)Z(B,E);else if(K.name==="SKILL.md"){let _=z.toLowerCase().replace(/\\/g,"/");if(_===$||_.endsWith("/"+$)||_.endsWith($))Y.push({file:B,path:z})}}}catch(W){}};return Z(Q),Y},qX=(Q,X,Y)=>{let $={project:"project skills (.agents/skills/)",claude:"claude skills (.claude/skills/)",copilot:"copilot skills (.copilot/skills/)",opencode:"opencode skills (.opencode/skill/)",personal:"personal skills (~/.agents/skills/)",personalClaude:"personal claude skills (~/.claude/skills/)",personalCopilot:"personal copilot skills (~/.copilot/skills/)",personalOpencode:"personal opencode skills (~/.config/opencode/skill/)",superpowers:"superpowers skills (~/.agents/superpowers/skills/)"}[Y];console.log(`Error: Multiple skills match "${Q}" in ${$}:
|
|
7
|
-
`);for(let Z of X){let z=s[Y].prefix+Z.path;try{let W=$Q(Z.file),K=W.description||W.whenToUse||"(no description)";console.log(` ${z}`),console.log(` ${K}
|
|
8
|
-
`)}catch(W){console.log(` ${z}`),console.log(` (unable to read description)
|
|
9
|
-
`)}}console.log("Please be more specific. Examples:");for(let Z of X.slice(0,2)){let q=s[Y].prefix;console.log(` superpowers-agent execute ${q}${Z.path}`)}};import{existsSync as CQ}from"fs";import{join as GY,relative as UY}from"path";var IY=(Q)=>{let{type:X,path:Y}=AQ(Q),$={superpowers:[H.homeSuperpowersSkills],claude:[H.projectClaudeSkills,H.homeClaudeSkills],copilot:[H.projectCopilotSkills,H.homeCopilotSkills],opencode:[H.projectOpencodeSkills,H.homeOpencodeSkills],project:[H.projectAgentsSkills],personal:[H.homePersonalSkills]},Z;if(X)Z=($[X]||[]).map((z)=>({type:X,dir:z}));else if(H.isSuperpowersRepo&&CQ(H.projectSkillsDir))Z=[{type:"project",dir:H.projectSkillsDir},{type:"project",dir:H.projectAgentsSkills},{type:"claude",dir:H.projectClaudeSkills},{type:"copilot",dir:H.projectCopilotSkills},{type:"opencode",dir:H.projectOpencodeSkills},{type:"personal",dir:H.homePersonalSkills},{type:"personalClaude",dir:H.homeClaudeSkills},{type:"personalCopilot",dir:H.homeCopilotSkills},{type:"personalOpencode",dir:H.homeOpencodeSkills},{type:"superpowers",dir:H.homeSuperpowersSkills}];else Z=[{type:"project",dir:H.projectAgentsSkills},{type:"claude",dir:H.projectClaudeSkills},{type:"copilot",dir:H.projectCopilotSkills},{type:"opencode",dir:H.projectOpencodeSkills},{type:"personal",dir:H.homePersonalSkills},{type:"personalClaude",dir:H.homeClaudeSkills},{type:"personalCopilot",dir:H.homeCopilotSkills},{type:"personalOpencode",dir:H.homeOpencodeSkills},{type:"superpowers",dir:H.homeSuperpowersSkills}];for(let{type:q,dir:z}of Z){let W=$X(z,Y);if(W.length===1)return{skillFile:W[0].file,sourceType:q,actualSkillPath:W[0].path};if(W.length>1)qX(Y,W,q)}return null},m=(Q)=>{let X=IY(Q);if(X)return X;let{type:Y,path:$}=AQ(Q),Z={superpowers:[H.homeSuperpowersSkills],claude:[H.projectClaudeSkills,H.homeClaudeSkills],copilot:[H.projectCopilotSkills,H.homeCopilotSkills],opencode:[H.projectOpencodeSkills,H.homeOpencodeSkills],project:[H.projectAgentsSkills],personal:[H.homePersonalSkills]},q;if(Y)q=(Z[Y]||[]).map((W)=>({type:Y,dir:W}));else if(H.isSuperpowersRepo&&CQ(H.projectSkillsDir))q=[{type:"project",dir:H.projectSkillsDir},{type:"project",dir:H.projectAgentsSkills},{type:"claude",dir:H.projectClaudeSkills},{type:"copilot",dir:H.projectCopilotSkills},{type:"opencode",dir:H.projectOpencodeSkills},{type:"personal",dir:H.homePersonalSkills},{type:"personalClaude",dir:H.homeClaudeSkills},{type:"personalCopilot",dir:H.homeCopilotSkills},{type:"personalOpencode",dir:H.homeOpencodeSkills},{type:"superpowers",dir:H.homeSuperpowersSkills}];else q=[{type:"project",dir:H.projectAgentsSkills},{type:"claude",dir:H.projectClaudeSkills},{type:"copilot",dir:H.projectCopilotSkills},{type:"opencode",dir:H.projectOpencodeSkills},{type:"personal",dir:H.homePersonalSkills},{type:"personalClaude",dir:H.homeClaudeSkills},{type:"personalCopilot",dir:H.homeCopilotSkills},{type:"personalOpencode",dir:H.homeOpencodeSkills},{type:"superpowers",dir:H.homeSuperpowersSkills}];for(let{type:z,dir:W}of q){if(!CQ(W))continue;let K=EQ(W,z,null);for(let B of K){let E=qQ(B);if(E&&E.aliases&&Array.isArray(E.aliases)){let V=$.toLowerCase();for(let _ of E.aliases)if(_.toLowerCase()===V){let U=GY(B,"SKILL.md"),L=UY(W,B);return{skillFile:U,sourceType:z,actualSkillPath:L}}}}}return null};import{readFileSync as WX,writeFileSync as zX,existsSync as NQ}from"fs";import{join as l}from"path";import{execSync as LY}from"child_process";var bQ=()=>({auto_update:!0,last_update_check:null,last_updated_commit:null}),WQ=()=>{let Q=l(H.superpowersRepo,".config.json");try{if(!NQ(Q))return bQ();let X=WX(Q,"utf8");return{...bQ(),...JSON.parse(X)}}catch{return bQ()}},HX=(Q)=>{let X=l(H.superpowersRepo,".config.json"),$={...WQ(),...Q};try{zX(X,JSON.stringify($,null,2))}catch(Z){console.log(`Warning: couldn't save config: ${Z.message}`)}},y=(Q)=>{let X=Q?l(H.home,".agents","config.json"):l(process.cwd(),".agents","config.json");if(!NQ(X))return{};try{let Y=WX(X,"utf8");return JSON.parse(Y)}catch(Y){return{}}},h=(Q,X)=>{let Y=X?l(H.home,".agents"):l(process.cwd(),".agents"),$=l(Y,"config.json");try{if(!NQ(Y))LY(`mkdir -p "${Y}"`,{stdio:"pipe"});return zX($,JSON.stringify(Q,null,2),"utf8"),!0}catch(Z){throw Error(`Failed to write config: ${Z.message}`)}},k=(Q=!1)=>{return y(Q).repositories||{}},BX=(Q,X,Y)=>{let $=y(Y);if(!$.repositories)$.repositories={};$.repositories[Q]=X,h($,Y)};function KX(Q=!0){return y(Q).installedSkills||{}}function FQ(Q,X=!0){let Y=y(X);if(Y.installedSkills)delete Y.installedSkills[Q];h(Y,X)}function EX(){return y(!0).installedAgents||{}}import{readFileSync as JY}from"fs";import{join as jQ,dirname as wY}from"path";import{fileURLToPath as OY}from"url";import{existsSync as VX}from"fs";import{execSync as MY}from"child_process";var AY=OY(import.meta.url),xQ=wY(AY),P=()=>{try{let Q=jQ(xQ,"package.json");if(!VX(Q))Q=jQ(xQ,"..","package.json");if(!VX(Q))Q=jQ(xQ,"..","..","package.json");return JSON.parse(JY(Q,"utf8")).version||"0.0.0"}catch{return"0.0.0"}},u=()=>{let Q=P();console.log(`^^SAV:${Q}^^`)},VQ=async()=>{try{let X=MY('curl -sS "https://registry.npmjs.org/@complexthings/superpowers-agent/latest"',{encoding:"utf8",timeout:1e4}),Y=JSON.parse(X);if(!Y.version)return P();return Y.version}catch(Q){throw Error(`Failed to fetch remote version: ${Q.message}`)}},_Q=(Q,X)=>{let Y=Q.split(".").map(Number),$=X.split(".").map(Number);for(let Z=0;Z<3;Z++){let q=Y[Z]||0,z=$[Z]||0;if(q>z)return!0;if(q<z)return!1}return!1};var vY={project:{dir:"projectAgentsSkills",prefix:""},claude:{dir:"projectClaudeSkills",prefix:"claude:"},copilot:{dir:"projectCopilotSkills",prefix:"copilot:"},opencode:{dir:"projectOpencodeSkills",prefix:"opencode:"},personal:{dir:"homePersonalSkills",prefix:""},personalClaude:{dir:"homeClaudeSkills",prefix:"claude:"},personalCopilot:{dir:"homeCopilotSkills",prefix:"copilot:"},personalOpencode:{dir:"homeOpencodeSkills",prefix:"opencode:"},superpowers:{dir:"homeSuperpowersSkills",prefix:"superpowers:"}},CY=(Q,X)=>{let Y=TY(Q,"SKILL.md"),{dir:$,prefix:Z}=vY[X],q=_X(H[$],Q).replace(/\\/g,"/");console.log(`${Z}${q}`);let{description:z,whenToUse:W}=$Q(Y);if(z)console.log(` ${z}`);if(W)console.log(` When to use: ${W}`);console.log("")},t=()=>{u();let Q=new Set,X=[{type:"project",dir:H.projectAgentsSkills,maxDepth:null},{type:"claude",dir:H.projectClaudeSkills,maxDepth:null},{type:"copilot",dir:H.projectCopilotSkills,maxDepth:null},{type:"opencode",dir:H.projectOpencodeSkills,maxDepth:null},{type:"personal",dir:H.homePersonalSkills,maxDepth:null},{type:"personalClaude",dir:H.homeClaudeSkills,maxDepth:null},{type:"personalCopilot",dir:H.homeCopilotSkills,maxDepth:null},{type:"personalOpencode",dir:H.homeOpencodeSkills,maxDepth:null},{type:"superpowers",dir:H.homeSuperpowersSkills,maxDepth:null}];for(let{type:Y,dir:$,maxDepth:Z}of X){let q=EQ($,Y,Z);for(let z of q){let W=_X($,z);if(!Q.has(W))Q.add(W),CY(z,Y)}}console.log(`Usage:
|
|
10
|
-
superpowers-agent execute <skill-name> # Load a specific skill`)},UX=()=>{u();let Q=process.argv[3];if(!Q){console.log(`Usage: superpowers-agent execute <skill-name-or-alias>
|
|
11
|
-
|
|
12
|
-
Examples:
|
|
13
|
-
superpowers-agent execute brainstorming
|
|
14
|
-
superpowers-agent execute superpowers:collaboration/brainstorming
|
|
15
|
-
superpowers-agent execute aem/block-collection-and-party
|
|
16
|
-
superpowers-agent execute block-collection # Using alias
|
|
17
|
-
|
|
18
|
-
Description:
|
|
19
|
-
Instructs the agent to execute the specified skill.
|
|
20
|
-
Supports skill aliases defined in skill.json files.`);return}let X=m(Q);if(!X){console.log(`Error: Skill not found: ${Q}
|
|
21
|
-
|
|
22
|
-
Available skills:`),t();return}let{skillFile:Y,sourceType:$}=X,Z=process.cwd(),q=Y.startsWith(Z),z=DQ(H.projectAgentsSkills)||DQ(H.projectClaudeSkills);if(q)console.log(`Open this file with your Read Tool: ${Y}
|
|
23
|
-
|
|
24
|
-
<IMPORTANT>
|
|
25
|
-
USE YOUR Read Tool to process this file. DO NOT use \`cat\` or print commands.
|
|
26
|
-
</IMPORTANT>`);else if(z&&$!=="project")console.log(`Open this file with your Read Tool: ${Y}
|
|
27
|
-
|
|
28
|
-
<IMPORTANT>
|
|
29
|
-
1. Try using your Read Tool first
|
|
30
|
-
2. If your Read tool fails (file outside workspace), use: cat "${Y}"
|
|
31
|
-
3. Consider using workspace-local skills for better tool compatibility
|
|
32
|
-
Run: superpowers-agent setup-skills
|
|
33
|
-
</IMPORTANT>`);else console.log(`Open this file with your Read Tool: ${Y}
|
|
34
|
-
|
|
35
|
-
<IMPORTANT>
|
|
36
|
-
1. Try using your Read Tool first
|
|
37
|
-
2. If your Read tool fails (file outside workspace), use: cat "${Y}"
|
|
38
|
-
3. NEVER skip loading the skill content
|
|
39
|
-
</IMPORTANT>`)},IX=()=>{let Q=process.argv[3];if(!Q){console.log(`Usage: superpowers-agent path <skill-name-or-alias>
|
|
40
|
-
|
|
41
|
-
Examples:
|
|
42
|
-
superpowers-agent path brainstorming
|
|
43
|
-
superpowers-agent path superpowers:collaboration/brainstorming
|
|
44
|
-
superpowers-agent path aem/block-collection-and-party
|
|
45
|
-
superpowers-agent path block-collection # Using alias
|
|
46
|
-
|
|
47
|
-
Description:
|
|
48
|
-
Outputs the file system path of the specified SKILL.md file.
|
|
49
|
-
Supports skill aliases defined in skill.json files.`);return}let X=m(Q);if(!X){console.log(`Error: Skill not found: ${Q}
|
|
50
|
-
|
|
51
|
-
Available skills:`),t();return}let{skillFile:Y}=X;console.log(Y)},LX=()=>{let Q=process.argv[3];if(!Q){console.log(`Usage: superpowers-agent dir <skill-name>
|
|
52
|
-
|
|
53
|
-
Examples:
|
|
54
|
-
superpowers-agent dir brainstorming
|
|
55
|
-
superpowers-agent dir aem/block-collection-and-party
|
|
56
|
-
superpowers-agent dir block-collection # Using alias
|
|
57
|
-
superpowers-agent dir superpowers:testing/test-driven-development
|
|
58
|
-
|
|
59
|
-
Description:
|
|
60
|
-
Returns the directory path where the specified skill is located.
|
|
61
|
-
Supports skill aliases defined in skill.json files.`);return}let X=m(Q);if(!X){console.log(`Error: Skill not found: ${Q}
|
|
62
|
-
|
|
63
|
-
Available skills:`),t();return}let{skillFile:Y}=X,$=GX(Y);console.log($)},JX=()=>{u();let Q=process.argv[3],X=process.argv[4];if(!Q||!X){console.log(`Usage: superpowers-agent get-helpers <skill-name> <helper-search-term>
|
|
64
|
-
|
|
65
|
-
Examples:
|
|
66
|
-
superpowers-agent get-helpers block-collection search-block
|
|
67
|
-
superpowers-agent get-helpers aem/block-collection-and-party get-block-structure
|
|
68
|
-
superpowers-agent get-helpers superpowers:testing/test-driven-development example
|
|
69
|
-
|
|
70
|
-
Description:
|
|
71
|
-
Searches for helper files within a skill's skill.json configuration.
|
|
72
|
-
Returns the full path to the best matching helper file.
|
|
73
|
-
|
|
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 Y=m(Q);if(!Y){console.log(`Error: Skill not found: ${Q}
|
|
76
|
-
|
|
77
|
-
Available skills:`),t();return}let{skillFile:$}=Y,Z=GX($),q=qQ(Z);if(!q){console.log(`Error: No skill.json found for skill: ${Q}
|
|
78
|
-
Location: ${Z}`);return}if(!q.helpers||!Array.isArray(q.helpers)||q.helpers.length===0){console.log(`Error: No helpers defined in skill.json for skill: ${Q}
|
|
79
|
-
Location: ${Z}`);return}let z=XX(Z,X);if(!z){console.log(`Error: No helper found matching "${X}" in skill: ${Q}`),console.log(`
|
|
80
|
-
Available helpers:`);for(let W of q.helpers)console.log(` - ${W}`);return}if(!DQ(z)){console.log(`Error: Helper file not found: ${z}
|
|
81
|
-
Defined in skill.json but missing from filesystem`);return}console.log(z)},wX=()=>{let Q=WQ();console.log("Current configuration:"),console.log(JSON.stringify(Q,null,2))},OX=()=>{let Q=process.argv[3],X=process.argv[4];if(!Q||X===void 0){console.log(`Usage: .agents/superpowers-agent config-set <key> <value>
|
|
3
|
+
import{readFileSync as pz,writeFileSync as cz,existsSync as Uz}from"fs";import{join as l}from"path";import{execSync as hQ}from"child_process";import{homedir as hz,platform as fQ}from"os";import{join as w,parse as kQ,dirname as dz}from"path";import{existsSync as g}from"fs";import{fileURLToPath as PQ}from"url";var gQ=PQ(import.meta.url),Zz=dz(gQ),mQ=()=>{let z=hz();switch(fQ()){case"darwin":return w(z,"Library","Application Support","Code","User");case"win32":return w(z,"AppData","Roaming","Code","User");case"linux":return w(z,".config","Code","User");default:return w(z,".config","Code","User")}},uQ=()=>{let z=process.cwd(),Q=kQ(z).root;while(z!==Q){if(g(w(z,".agents")))return z;z=dz(z)}return process.cwd()},I={home:hz(),vscodeUserDir:mQ(),projectRoot:uQ(),get projectClaudeSkills(){return w(this.projectRoot,".claude","skills")},get projectAgentsSkills(){return w(this.projectRoot,".agents","skills")},get projectCopilotSkills(){return w(this.projectRoot,".copilot","skills")},get projectOpencodeSkills(){return w(this.projectRoot,".opencode","skill")},get projectSkillsDir(){return w(this.projectRoot,"skills")},get homePersonalSkills(){return w(this.home,".agents","skills")},get homeClaudeSkills(){return w(this.home,".claude","skills")},get homeCopilotSkills(){return w(this.home,".copilot","skills")},get claudeSettings(){return w(this.home,".claude","settings.json")},get copilotHooksDir(){return process.env.COPILOT_HOME?w(process.env.COPILOT_HOME,"hooks"):w(this.home,".copilot","hooks")},get homeOpencodeSkills(){return w(this.home,".config","opencode","skill")},get bootstrap(){return w(this.projectRoot,".agents","superpowers-bootstrap.md")},get superpowersRepo(){let z=w(Zz,"..","..","..");if(g(w(z,"skills"))&&g(w(z,".agents","superpowers-agent")))return z;let Q=w(Zz,"..");if(g(w(Q,"skills"))&&g(w(Q,".agents","superpowers-agent")))return Q;return w(this.home,".agents","superpowers")},get homeSuperpowersSkills(){return w(this.superpowersRepo,"skills")},get isSuperpowersRepo(){let z=w(Zz,"..","..","..");if(g(w(z,"skills"))&&g(w(z,".agents","superpowers-agent")))return!0;let Q=w(Zz,"..");return g(w(Q,"skills"))&&g(w(Q,".agents","superpowers-agent"))}};var Jz=()=>({auto_update:!0,last_update_check:null,last_updated_commit:null}),zz=()=>{let z=l(I.superpowersRepo,".config.json");try{if(!Uz(z))return Jz();let Q=pz(z,"utf8");return{...Jz(),...JSON.parse(Q)}}catch{return Jz()}},nz=(z)=>{let Q=l(I.superpowersRepo,".config.json"),$={...zz(),...z};try{cz(Q,JSON.stringify($,null,2))}catch(Z){console.log(`Warning: couldn't save config: ${Z.message}`)}},S=(z)=>{let Q=z?l(I.home,".agents","config.json"):l(process.cwd(),".agents","config.json");if(!Uz(Q))return{};try{let X=pz(Q,"utf8");return JSON.parse(X)}catch(X){return{}}},m=(z,Q)=>{let X=Q?l(I.home,".agents"):l(process.cwd(),".agents"),$=l(X,"config.json");try{if(!Uz(X))hQ(`mkdir -p "${X}"`,{stdio:"pipe"});return cz($,JSON.stringify(z,null,2),"utf8"),!0}catch(Z){throw Error(`Failed to write config: ${Z.message}`)}},P=(z=!1)=>{return S(z).repositories||{}},lz=(z,Q,X)=>{let $=S(X);if(!$.repositories)$.repositories={};$.repositories[z]=Q,m($,X)};function iz(z=!0){return S(z).installedSkills||{}}function Iz(z,Q=!0){let X=S(Q);if(X.installedSkills)delete X.installedSkills[z];m(X,Q)}function az(){return S(!0).installedAgents||{}}import{readFileSync as dQ}from"fs";import{join as _z,dirname as pQ}from"path";import{fileURLToPath as cQ}from"url";import{existsSync as oz}from"fs";import{execSync as nQ}from"child_process";var lQ=cQ(import.meta.url),Lz=pQ(lQ),k=()=>{try{let z=_z(Lz,"package.json");if(!oz(z))z=_z(Lz,"..","package.json");if(!oz(z))z=_z(Lz,"..","..","package.json");return JSON.parse(dQ(z,"utf8")).version||"0.0.0"}catch{return"0.0.0"}},i=()=>{let z=k();console.log(`^^SAV:${z}^^`)},$z=async()=>{try{let Q=nQ('curl -sS "https://registry.npmjs.org/@complexthings/superpowers-agent/latest"',{encoding:"utf8",timeout:1e4}),X=JSON.parse(Q);if(!X.version)return k();return X.version}catch(z){throw Error(`Failed to fetch remote version: ${z.message}`)}},Yz=(z,Q)=>{let X=z.split(".").map(Number),$=Q.split(".").map(Number);for(let Z=0;Z<3;Z++){let Y=X[Z]||0,V=$[Z]||0;if(Y>V)return!0;if(Y<V)return!1}return!1};var rz=()=>{let z=zz();console.log("Current configuration:"),console.log(JSON.stringify(z,null,2))},sz=()=>{let z=process.argv[3],Q=process.argv[4];if(!z||Q===void 0){console.log(`Usage: .agents/superpowers-agent config-set <key> <value>
|
|
82
4
|
|
|
83
5
|
Available keys:
|
|
84
6
|
auto_update (true/false) - Enable/disable automatic updates during bootstrap
|
|
85
7
|
|
|
86
8
|
Examples:
|
|
87
9
|
.agents/superpowers-agent config-set auto_update false
|
|
88
|
-
.agents/superpowers-agent config-set auto_update true`);return}let
|
|
10
|
+
.agents/superpowers-agent config-set auto_update true`);return}let X=Q;if(Q==="true")X=!0;else if(Q==="false")X=!1;nz({[z]:X}),console.log(`✓ Set ${z} = ${X}`)},tz=()=>{i();let z=P(!0),Q=P(!1),X=[];for(let[Y,V]of Object.entries(z))X.push({alias:Y,url:V,source:"global"});for(let[Y,V]of Object.entries(Q)){let q=X.findIndex((B)=>B.alias===Y);if(q>=0)X[q]={alias:Y,url:V,source:"project"};else X.push({alias:Y,url:V,source:"project"})}if(X.length===0){console.log(`No repository aliases configured.
|
|
89
11
|
|
|
90
12
|
Add a repository using:
|
|
91
|
-
superpowers-agent add-repository <git-url> [--as=@alias]`);return}let $=Math.max(5,...
|
|
92
|
-
`),console.log(`${"Alias".padEnd($)} ${"URL".padEnd(Z)} Source`);for(let
|
|
93
|
-
Total: ${
|
|
94
|
-
`);let
|
|
95
|
-
`),
|
|
13
|
+
superpowers-agent add-repository <git-url> [--as=@alias]`);return}let $=Math.max(5,...X.map((Y)=>Y.alias.length)),Z=Math.max(3,...X.map((Y)=>Y.url.length));console.log(`Repositories:
|
|
14
|
+
`),console.log(`${"Alias".padEnd($)} ${"URL".padEnd(Z)} Source`);for(let Y of X)console.log(`${Y.alias.padEnd($)} ${Y.url.padEnd(Z)} (${Y.source})`);console.log(`
|
|
15
|
+
Total: ${X.length} repository alias(es)`)};var qz=async()=>{try{let z=k(),Q=await $z();return{hasUpdates:Yz(Q,z),localVersion:z,remoteVersion:Q}}catch{return{hasUpdates:!1,localVersion:k(),remoteVersion:"",error:!0}}};import{execSync as ez}from"child_process";var wz=async({skipReinstall:z=!1}={})=>{console.log(`# Checking for Superpowers updates...
|
|
16
|
+
`);let Q=await qz();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}
|
|
17
|
+
`),z){console.log(" Skipping install (--no-reinstall flag set)"),console.log(` Run manually: npm install -g @complexthings/superpowers-agent
|
|
96
18
|
`);return}console.log(` Installing update...
|
|
97
|
-
`);try{
|
|
98
|
-
✓ Update complete!`)}catch(
|
|
99
|
-
✗ Update failed: ${
|
|
19
|
+
`);try{ez("npm install -g @complexthings/superpowers-agent",{stdio:"inherit"}),console.log(`
|
|
20
|
+
✓ Update complete!`)}catch(X){console.log(`
|
|
21
|
+
✗ Update failed: ${X.message}`),console.log(" Try running manually: npm install -g @complexthings/superpowers-agent"),process.exit(1)}console.log(`
|
|
100
22
|
Running bootstrap to complete setup...
|
|
101
|
-
`);try{
|
|
102
|
-
✓ Bootstrap complete!`)}catch(
|
|
103
|
-
⚠️ Bootstrap step failed: ${
|
|
104
|
-
`,"utf8")}catch(
|
|
105
|
-
`;if(
|
|
106
|
-
${
|
|
107
|
-
<!-- SUPERPOWERS_SKILLS_END -->`;if(Z){let
|
|
108
|
-
`,
|
|
109
|
-
`+
|
|
110
|
-
`+
|
|
111
|
-
|
|
112
|
-
`+
|
|
113
|
-
|
|
114
|
-
`+
|
|
115
|
-
⚠️ Warning: ${
|
|
116
|
-
`)},
|
|
117
|
-
`),
|
|
118
|
-
|
|
119
|
-
`+
|
|
120
|
-
`;try{return
|
|
121
|
-
`);let
|
|
122
|
-
Expected at: ${
|
|
123
|
-
Please update your Superpowers installation`);return}if(!
|
|
124
|
-
Detected platforms for project: ${
|
|
125
|
-
`);let
|
|
23
|
+
`);try{ez("superpowers-agent bootstrap --no-update",{stdio:"inherit"}),console.log(`
|
|
24
|
+
✓ Bootstrap complete!`)}catch(X){console.log(`
|
|
25
|
+
⚠️ Bootstrap step failed: ${X.message}`),console.log(" The update installed successfully. Run manually to finish setup:"),console.log(" superpowers-agent bootstrap")}},zQ=async()=>{i();let z=k();console.log(`Current version: ${z}`);try{let Q=await $z();if(console.log(`Latest version: ${Q}`),Yz(Q,z))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)}},QQ=()=>{let z=k();console.log(z)};import{existsSync as v,readFileSync as s,writeFileSync as r,rmSync as Az,lstatSync as SX,readdirSync as fX}from"fs";import{join as M,dirname as Fz,parse as a}from"path";import{execSync as f}from"child_process";import{platform as kX}from"os";import{existsSync as aQ}from"fs";import{join as oQ}from"path";import{execSync as iQ}from"child_process";var p=(z)=>{try{return iQ(`which ${z}`,{stdio:"pipe",timeout:2000}),!0}catch{return!1}};var D={opencode:{check:()=>p("opencode"),cli:!0,name:"OpenCode",installUrl:"https://opencode.ai/docs/installation",bootstrapCommand:"install-opencode-commands"},claude:{check:()=>p("claude"),cli:!0,name:"Claude Code",installUrl:"https://code.claude.com/docs/en/installation",bootstrapCommand:"install-claude-commands"},copilot:{check:()=>p("copilot"),cli:!0,name:"GitHub Copilot",bootstrapCommand:"install-copilot-prompts"},pi:{check:()=>p("pi"),cli:!0,name:"Pi Coding Agent"},codex:{check:()=>p("codex"),cli:!0,name:"OpenAI Codex"}},XQ=()=>{let z=[];if(D.copilot.check())z.push("github-copilot");if(D.claude.check())z.push("claude-code");if(D.opencode.check())z.push("opencode");return z},ZQ={"claude-code":".claude","github-copilot":".github",opencode:".opencode",pi:".pi",codex:".codex"},rQ={"claude-code":"claude","github-copilot":"copilot",opencode:"opencode",pi:"pi",codex:"codex"},sQ=(z,Q)=>{let X=ZQ[Q];return X?aQ(oQ(z,X)):!1},$Q=(z)=>{return Object.keys(ZQ).filter((Q)=>{let X=rQ[Q];return sQ(z,Q)||D[X].check()})},YQ=["github-copilot","opencode","pi","codex"];import{existsSync as Oz,readdirSync as gZ,lstatSync as tQ,symlinkSync as qQ,unlinkSync as eQ,mkdirSync as zX,readlinkSync as QX}from"fs";import{join as Tz,dirname as uZ}from"path";import{platform as XX}from"os";var Mz=(z)=>{try{return tQ(z).isSymbolicLink()}catch{return!1}},ZX=(z,Q)=>{try{if(!Mz(z))return!1;return QX(z)===Q}catch{return!1}},WQ=()=>{let z=Tz(I.superpowersRepo,".opencode","plugins","superpowers-agent.js"),Q=Tz(I.home,".config","opencode","plugins"),X=Tz(Q,"superpowers-agent.js");if(console.log("Installing OpenCode plugin symlink..."),!Oz(z))return console.log("⚠️ Source plugin not found, skipping symlink creation"),console.log(` Expected at: ${z}`),{created:!1,error:"Source plugin not found"};if(ZX(X,z))return console.log("✓ Plugin symlink already exists and is correct"),{created:!1,existed:!0};if(Oz(X)&&!Mz(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(!Oz(Q))try{zX(Q,{recursive:!0}),console.log(`✓ Created ${Q.replace(I.home,"~")}`)}catch(Z){return console.log(`⚠️ Failed to create plugins directory: ${Z.message}`),{created:!1,error:`Failed to create directory: ${Z.message}`}}if(Mz(X))try{eQ(X)}catch(Z){return console.log(`⚠️ Failed to remove existing symlink: ${Z.message}`),{created:!1,error:`Failed to remove existing symlink: ${Z.message}`}}let $=XX();try{if($==="win32")qQ(z,X,"file");else qQ(z,X);let Z=z.replace(I.home,"~"),Y=X.replace(I.home,"~");return console.log(`✓ Created symlink: ${Y}`),console.log(` -> ${Z}`),{created:!0}}catch(Z){if($==="win32"&&Z.code==="EPERM")return console.log("⚠️ Windows requires Developer Mode or admin privileges for symlinks"),console.log(" Enable Developer Mode: Settings > Update & Security > For developers"),{created:!1,error:"Windows symlink permission denied"};return console.log(`⚠️ Failed to create symlink: ${Z.message}`),{created:!1,error:`Failed to create symlink: ${Z.message}`}}};import{existsSync as HQ,readdirSync as nZ,readFileSync as $X,writeFileSync as YX,mkdirSync as qX,copyFileSync as WX}from"fs";import{join as iZ,dirname as HX}from"path";var BX="superpowers-agent session-context",VX="superpowers-agent session-context --format=claude 2>/dev/null || true",EX="startup|resume|clear|compact",BQ=(z=I.claudeSettings)=>{let Q={},X=!1,$;if(HQ(z)){X=!0;let G;try{G=$X(z,"utf8")}catch(E){return{error:!0,message:`Failed to read settings.json: ${E.message}`}}try{Q=G.trim()?JSON.parse(G):{}}catch(E){return{error:!0,message:`settings.json is not valid JSON, leaving it untouched: ${E.message}`}}let H=new Date().toISOString().split("T")[0];$=`${z}.backup-${H}`;try{WX(z,$)}catch(E){return{error:!0,message:`Failed to back up settings.json: ${E.message}`}}}if(typeof Q!=="object"||Q===null||Array.isArray(Q))return{error:!0,message:"settings.json root is not an object"};Q.hooks=Q.hooks||{};let Z=Array.isArray(Q.hooks.SessionStart)?Q.hooks.SessionStart:[],Y=(G)=>{try{return JSON.stringify(G).includes(BX)}catch{return!1}},V=Z.some(Y),q=Z.filter((G)=>!Y(G)),B={matcher:EX,hooks:[{type:"command",command:VX}]};Q.hooks.SessionStart=[...q,B];let W=HX(z);if(!HQ(W))try{qX(W,{recursive:!0})}catch(G){return{error:!0,message:`Failed to create ${W}: ${G.message}`}}try{YX(z,JSON.stringify(Q,null,2)+`
|
|
26
|
+
`,"utf8")}catch(G){return{error:!0,message:`Failed to write settings.json: ${G.message}`}}if(!X)return{created:!0};if(V)return{existed:!0,updated:!0,backup:$};return{updated:!0,backup:$}};import{existsSync as Nz,readdirSync as sZ,readFileSync as KX,writeFileSync as GX,mkdirSync as JX}from"fs";import{join as UX}from"path";var IX="superpowers.json",_X=()=>({version:1,hooks:{sessionStart:[{type:"command",bash:"superpowers-agent session-context --format=copilot 2>/dev/null || true",powershell:"superpowers-agent session-context --format=copilot 2>$null; exit 0",timeoutSec:15}]}}),VQ=(z=I.copilotHooksDir)=>{let Q=UX(z,IX),X=JSON.stringify(_X(),null,2)+`
|
|
27
|
+
`;if(Nz(Q)){let Z;try{Z=KX(Q,"utf8")}catch(Y){return{error:!0,message:`Failed to read ${Q}: ${Y.message}`}}if(Z===X)return{existed:!0,path:Q}}if(!Nz(z))try{JX(z,{recursive:!0})}catch(Z){return{error:!0,message:`Failed to create ${z}: ${Z.message}`}}let $=Nz(Q);try{GX(Q,X,"utf8")}catch(Z){return{error:!0,message:`Failed to write ${Q}: ${Z.message}`}}return $?{updated:!0,path:Q}:{created:!0,path:Q}};import{existsSync as h,readdirSync as LX,lstatSync as wX,symlinkSync as Qz,unlinkSync as Wz,mkdirSync as EQ,readlinkSync as OX}from"fs";import{join as u,dirname as KQ,basename as TX}from"path";import{homedir as c,platform as GQ}from"os";var Hz=[{name:"claude",parentDir:()=>u(c(),".claude"),skillsDir:()=>u(c(),".claude","skills")},{name:"copilot",parentDir:()=>u(c(),".copilot"),skillsDir:()=>u(c(),".copilot","skills")},{name:"opencode",parentDir:()=>u(c(),".config","opencode"),skillsDir:()=>u(c(),".config","opencode","skill")}],n=(z)=>{try{return wX(z).isSymbolicLink()}catch{return!1}},JQ=(z,Q)=>{try{if(!n(z))return!1;return OX(z)===Q}catch{return!1}},UQ=(z,Q)=>{if(!h(z))return{created:!1,existed:!1,error:`Source does not exist: ${z}`};if(JQ(Q,z))return{created:!1,existed:!0};if(h(Q)||n(Q))if(n(Q))try{Wz(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=KQ(Q);if(!h(X))try{EQ(X,{recursive:!0})}catch(Z){return{created:!1,existed:!1,error:`Failed to create parent directory: ${Z.message}`}}let $=GQ();try{if($==="win32")Qz(z,Q,"junction");else Qz(z,Q,"dir");return{created:!0,existed:!1}}catch(Z){if($==="win32"&&Z.code==="EPERM")return{created:!1,existed:!1,error:"Windows requires Developer Mode or admin privileges for symlinks. Enable Developer Mode: Settings > Update & Security > For developers"};return{created:!1,existed:!1,error:`Failed to create symlink: ${Z.message}`}}},vz=(z)=>{if(!h(z)&&!n(z))return{removed:!1,error:"Symlink does not exist"};if(!n(z))return{removed:!1,error:"Target is not a symlink"};try{return Wz(z),{removed:!0}}catch(Q){return{removed:!1,error:`Failed to remove symlink: ${Q.message}`}}};var IQ=(z,Q,X="skills")=>{let $=S(!0);if(!$.symlinks||!$.symlinks[z])return;if(X==="superpowers")$.symlinks[z].superpowers=null;else{let Z=$.symlinks[z].skills||[];$.symlinks[z].skills=Z.filter((Y)=>Y!==Q)}m($,!0)};var MX=[".claude/skills",".github/skills",".opencode/skill"],_Q=(z)=>{let Q={created:0,skipped:0};for(let X of MX){let $=u(z,X),Z=KQ($);if(!h(Z)){Q.skipped++;continue}if(h($)&&!n($)){Q.skipped++;continue}if(n($))try{Wz($)}catch{Q.skipped++;continue}try{Qz("../.agents/skills",$,"dir"),Q.created++}catch{Q.skipped++}}return Q},LQ=(z,Q=[])=>{let X;try{X=LX(z,{withFileTypes:!0})}catch{return Q}let $=!1,Z=[];for(let Y of X){if(!Y.isDirectory()&&Y.name==="SKILL.md")$=!0;if(Y.isDirectory()&&!Y.name.startsWith("."))Z.push(u(z,Y.name))}if($)Q.push(z);for(let Y of Z)LQ(Y,Q);return Q},wQ=()=>{let z=I.homeSuperpowersSkills,Q=I.homePersonalSkills;if(!h(z))return{created:0,existed:0,updated:0,errors:[`Skills directory not found: ${z}`]};if(!h(Q))try{EQ(Q,{recursive:!0})}catch(Z){return{created:0,existed:0,updated:0,errors:[`Failed to create ${Q}: ${Z.message}`]}}let X=LQ(z),$={created:0,existed:0,updated:0,errors:[]};for(let Z of X){let Y=TX(Z),V=u(Q,Y);if(JQ(V,Z)){$.existed++;continue}if(n(V))try{Wz(V),$.updated++}catch(B){$.errors.push(`Failed to remove stale symlink ${V}: ${B.message}`);continue}else if(h(V)){$.errors.push(`Skipped ${V}: path exists and is not a symlink`);continue}let q=GQ();try{if(q==="win32")Qz(Z,V,"junction");else Qz(Z,V,"dir");let B=V.replace(c(),"~"),W=Z.replace(c(),"~");console.log(` ✓ ${B} -> ${W}`),$.created++}catch(B){$.errors.push(`Failed to create symlink ${V}: ${B.message}`)}}return $};import{existsSync as NX,lstatSync as vX,readdirSync as AX,readlinkSync as FX,unlinkSync as bX}from"fs";import{basename as CX,join as jX,resolve as OQ,sep as xX}from"path";var DX=new Set(["preserving-productive-tensions","dispatching-parallel-agents","executing-plans","finishing-a-development-branch","receiving-code-review","requesting-code-review","subagent-driven-development","using-git-worktrees","writing-plans","defense-in-depth","root-cause-tracing","systematic-debugging","verification-before-completion","finding-skills","create-agents-md","creating-prompts","using-superpowers","writing-prompts","collision-zone-thinking","inversion-exercise","meta-pattern-recognition","scale-game","simplification-cascades","when-stuck","tracing-knowledge-lineages","condition-based-waiting","test-driven-development","testing-anti-patterns","using-a-skill"]),RX=(z,Q)=>z===Q||z.startsWith(`${Q}${xX}`),yX=({skillDir:z,bundledSkillsDir:Q,retiredSkillNames:X=DX})=>{let $=[],Z=0,Y=OQ(Q);if(!NX(z))return{removed:$,skipped:Z};let V;try{V=AX(z)}catch{return{removed:$,skipped:Z}}for(let q of V){let B=jX(z,q);try{if(!vX(B).isSymbolicLink())continue;let W=OQ(z,FX(B));if(!RX(W,Y)||!X.has(CX(W))){Z++;continue}bX(B),$.push(B)}catch{Z++}}return{removed:$,skipped:Z}},TQ=()=>yX({skillDir:I.homePersonalSkills,bundledSkillsDir:I.homeSuperpowersSkills});var bz=(z)=>{let Q=Fz(z),X=a(z).base;if(v(Q)){for(let Y of fX(Q))if(Y.startsWith(`${X}.backup`))Az(M(Q,Y))}let $=new Date().toISOString().split("T")[0],Z=`${z}.backup-${$}`;return f(`cp "${z}" "${Z}"`,{stdio:"pipe"}),Z},Bz=(z,Q,X,$=!0)=>{let Z=v(z);if(!Z&&!$)return{updated:!1,created:!1,skipped:!0};let Y=Q,V=new Date().toISOString().split("T")[0];Y=Y.replace(/\{\{DATE\}\}/g,V),Y=Y.replace(/\{\{SUPERPOWERS_PATH\}\}/g,I.superpowersRepo);let q=`<!-- SUPERPOWERS_SKILLS_START -->
|
|
28
|
+
${Y}
|
|
29
|
+
<!-- SUPERPOWERS_SKILLS_END -->`;if(Z){let B;try{B=bz(z)}catch(J){return{updated:!1,error:!0,message:`Failed to backup: ${J.message}`}}let W;try{W=s(z,"utf8")}catch(J){return{updated:!1,error:!0,message:`Failed to read: ${J.message}`}}let G="<!-- SUPERPOWERS_SKILLS_START -->",H="<!-- SUPERPOWERS_SKILLS_END -->",E;if(W.includes(G)&&W.includes(H)){let J=new RegExp(`${G}[\\s\\S]*?${H}`,"g");E=W.replace(J,q)}else{let J=W.match(/^#\s+.+$/m);if(J){let O=W.indexOf(`
|
|
30
|
+
`,J.index)+1;E=W.slice(0,O)+`
|
|
31
|
+
`+q+`
|
|
32
|
+
`+W.slice(O)}else E=q+`
|
|
33
|
+
|
|
34
|
+
`+W}try{return r(z,E,"utf8"),{updated:!0,created:!1,backup:B}}catch(J){return{updated:!1,error:!0,message:`Failed to write: ${J.message}`}}}else try{let B=Fz(z);if(!v(B))f(`mkdir -p "${B}"`,{stdio:"pipe"});let H=`# ${a(z).base.toUpperCase()}
|
|
35
|
+
|
|
36
|
+
`+q;return r(z,H,"utf8"),{updated:!1,created:!0}}catch(B){return{updated:!1,created:!1,error:!0,message:`Failed to create: ${B.message}`}}},PX=()=>{console.log("Installing Unix aliases...");let z=M(I.superpowersRepo,".agents","superpowers-agent"),Q=M(I.home,".local","bin"),X=M(Q,"superpowers-agent"),$=M(Q,"superpowers");if(!v(z)){console.log("⚠️ superpowers-agent executable not found");return}if(!v(Q))try{f(`mkdir -p "${Q}"`,{stdio:"pipe"}),console.log(`✓ Created ${Q}`)}catch(Y){console.log(`⚠️ Failed to create ${Q}: ${Y.message}`);return}try{if(v(X))f(`rm "${X}"`,{stdio:"pipe"});f(`ln -s "${z}" "${X}"`,{stdio:"pipe"}),console.log(`✓ Created symlink: superpowers-agent -> ${z}`)}catch(Y){console.log(`⚠️ Failed to create superpowers-agent symlink: ${Y.message}`)}try{if(v($))f(`rm "${$}"`,{stdio:"pipe"});f(`ln -s "${z}" "${$}"`,{stdio:"pipe"}),console.log(`✓ Created symlink: superpowers -> ${z}`)}catch(Y){console.log(`⚠️ Failed to create superpowers symlink: ${Y.message}`)}if(!(process.env.PATH||"").includes(Q))console.log(`
|
|
37
|
+
⚠️ 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"
|
|
38
|
+
`)},gX=()=>{console.log("Installing Windows aliases..."),console.log("✓ Windows alias installation (implementation pending)")},Cz=()=>{let z=kX();if(console.log(`## Installing Universal Aliases
|
|
39
|
+
`),z==="win32")return gX();else return PX()},mX=(z)=>{let Q=M(I.superpowersRepo,".github","copilot-instructions.md"),X=M(z,".github","copilot-instructions.md"),$="<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->",Z="<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->";if(!v(Q))return{error:!0,message:"Source template not found"};let Y;try{Y=s(Q,"utf8")}catch(B){return{error:!0,message:`Failed to read source template: ${B.message}`}}if(!Y.includes("<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->")||!Y.includes("<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->"))return{error:!0,message:"Template is missing required markers"};let V=Y.match(new RegExp("<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->[\\s\\S]*?<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->"))[0],q=Fz(X);try{if(!v(q))f(`mkdir -p "${q}"`,{stdio:"pipe"})}catch(B){return{error:!0,message:`Failed to create .github directory: ${B.message}`}}if(v(X)){let B;try{B=s(X,"utf8")}catch(G){return{error:!0,message:`Failed to read existing file: ${G.message}`}}let W;try{W=bz(X)}catch(G){return{error:!0,message:`Failed to backup: ${G.message}`}}if(B.includes("<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->")&&B.includes("<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->")){let G=new RegExp("<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->[\\s\\S]*?<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->","g"),H=B.replace(G,V);try{return r(X,H,"utf8"),{updated:!0,backup:W}}catch(E){return{error:!0,message:`Failed to update: ${E.message}`}}}else{let G=B.trimEnd()+`
|
|
40
|
+
|
|
41
|
+
`+Y.trim()+`
|
|
42
|
+
`;try{return r(X,G,"utf8"),{updated:!0,backup:W}}catch(H){return{error:!0,message:`Failed to append: ${H.message}`}}}}else try{return r(X,Y,"utf8"),{created:!0}}catch(B){return{error:!0,message:`Failed to create: ${B.message}`}}},MQ=()=>{i(),console.log(`# Setting up Superpowers skills for this project
|
|
43
|
+
`);let z=process.cwd(),Q=M(z,".agents"),X=M(Q,"skills"),$=M(z,"AGENTS.md"),Z=M(Q,"AGENTS.md"),Y=v($)?$:Z,V=M(I.superpowersRepo,".agents","templates","AGENTS.md.template");if(!v(V)){console.log(`✗ Error: AGENTS.md template not found
|
|
44
|
+
Expected at: ${V}
|
|
45
|
+
Please update your Superpowers installation`);return}if(!v(Q))try{f(`mkdir -p "${Q}"`,{stdio:"pipe"}),console.log("✓ Created .agents/ directory")}catch(L){console.log(`✗ Failed to create .agents/ directory: ${L.message}`);return}else console.log("✓ .agents/ directory exists");if(!v(X))try{f(`mkdir -p "${X}"`,{stdio:"pipe"}),f(`touch "${M(X,".gitkeep")}"`,{stdio:"pipe"}),console.log("✓ Created .agents/skills/ directory")}catch(L){console.log(`✗ Failed to create skills directory: ${L.message}`);return}else console.log("✓ .agents/skills/ directory exists");let q=_Q(z);console.log(`✓ Synced per-harness skills symlinks (${q.created} created, ${q.skipped} skipped)`);let B=M(Q,"docs"),W=M(B,"SUPERPOWERS.md"),G=M(I.superpowersRepo,".agents","templates","SUPERPOWERS.md.template");if(!v(B))try{f(`mkdir -p "${B}"`,{stdio:"pipe"}),console.log("✓ Created .agents/docs/ directory")}catch(L){console.log(`⚠️ Failed to create docs directory: ${L.message}`)}else console.log("✓ .agents/docs/ directory exists");let H=v(Y);if(H)try{let L=bz(Y);console.log(`✓ Backed up existing AGENTS.md to ${a(L).base}`)}catch(L){console.log(`✗ Failed to backup AGENTS.md: ${L.message}`);return}let E;try{E=s(V,"utf8")}catch(L){console.log(`✗ Failed to read template: ${L.message}`);return}let J=k();if(E=E.replace(/\{\{VERSION\}\}/g,J),v(G))try{let L=s(G,"utf8"),o=new Date().toISOString().split("T")[0];L=L.replace(/\{\{VERSION\}\}/g,J),L=L.replace(/\{\{DATE\}\}/g,o),r(W,L,"utf8"),console.log("✓ Created .agents/docs/SUPERPOWERS.md")}catch(L){console.log(`⚠️ Failed to create SUPERPOWERS.md: ${L.message}`)}else console.log("⚠️ SUPERPOWERS.md.template not found");let O=$Q(z),U=M(z,"CLAUDE.md"),N=M(Q,"CLAUDE.md");console.log(`
|
|
46
|
+
Detected platforms for project: ${O.join(", ")||"none"}
|
|
47
|
+
`);let C=O.filter((L)=>YQ.includes(L)),j=Bz(Y,E,C,!H);if(j.created)console.log(`✓ Created AGENTS.md with platform tool mappings (${Y===$?"root":".agents/"})`);else if(j.updated)console.log(`✓ Updated AGENTS.md with platform tool mappings (${Y===$?"root":".agents/"})`);else if(j.error)console.log("⚠️ Failed to update AGENTS.md");let A=v(U)?U:N,R=Bz(A,E,["claude-code"],!1);if(R.created)console.log(`✓ Created CLAUDE.md with Claude Code tool mappings (${A===U?"root":".agents/"})`);else if(R.updated){if(console.log(`✓ Updated CLAUDE.md with Claude Code tool mappings (${A===U?"root":".agents/"})`),R.backup)console.log(` Backed up to ${a(R.backup).base}`)}else if(R.skipped)console.log("ℹ️ Skipped CLAUDE.md (does not exist)");else if(R.error)console.log("⚠️ Failed to update CLAUDE.md");let K=M(z,".github","copilot-instructions.md"),_={skipped:!0};if(O.includes("github-copilot")){if(_=mX(z),_.created)console.log("✓ Created .github/copilot-instructions.md with Superpowers instructions");else if(_.updated){if(console.log("✓ Updated .github/copilot-instructions.md with Superpowers instructions"),_.backup)console.log(` Backed up to ${a(_.backup).base}`)}else if(_.error)console.log(`⚠️ Failed to update .github/copilot-instructions.md: ${_.message||""}`)}else console.log("ℹ️ Skipped .github/copilot-instructions.md (GitHub Copilot not detected)");let y=!v($)&&!v(Z);if(v(K)&&y){let L=Bz(K,E,["github-copilot"],!1);if(L.updated){if(console.log("✓ Updated .github/copilot-instructions.md with GitHub Copilot tool mappings"),L.backup)console.log(` Backed up to ${a(L.backup).base}`)}else if(L.error)console.log("⚠️ Failed to update .github/copilot-instructions.md with tool mappings")}else if(v(K)&&!y)console.log("ℹ️ Skipped .github/copilot-instructions.md tool mappings (AGENTS.md exists, using that instead)");else if(!v(K)&&!O.includes("github-copilot"))console.log("ℹ️ Skipped .github/copilot-instructions.md tool mappings (does not exist)");let F=`
|
|
126
48
|
# Setup complete!
|
|
127
49
|
|
|
128
50
|
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
|
-
- .github/copilot-instructions.md with Superpowers instructions`;
|
|
133
|
-
- .agents/skills/ ready for project-specific skills`,
|
|
51
|
+
- .agents/ directory structure`;if(j.updated||j.created)F+=`
|
|
52
|
+
- AGENTS.md with universal skills instructions`;if(R.updated||R.created)F+=`
|
|
53
|
+
- CLAUDE.md with Claude Code skills instructions`;if(_.updated||_.created)F+=`
|
|
54
|
+
- .github/copilot-instructions.md with Superpowers instructions`;F+=`
|
|
55
|
+
- .agents/skills/ ready for project-specific skills`,F+=`
|
|
134
56
|
- .agents/docs/SUPERPOWERS.md for detailed reference
|
|
135
|
-
`,console.log(
|
|
57
|
+
`,console.log(F)},uX=()=>{let z=[...["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)=>M(I.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)=>M(I.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)=>M(I.home,".config","opencode","command",X))],Q=0;for(let X of z)if(v(X))try{Az(X),Q++}catch($){console.log(` ⚠️ Could not remove ${X}: ${$.message}`)}if(Q>0)console.log(`✓ Removed ${Q} legacy prompt/command file${Q!==1?"s":""}`);else console.log("✓ No legacy prompt/command files found")},hX=()=>{let z=0;for(let Q of Hz){let X=Q.skillsDir(),$=M(X,"superpowers");try{if(SX($).isSymbolicLink())Az($),console.log(`✓ Removed legacy superpowers symlink from ${X.replace(I.home,"~")}`),z++}catch{}}if(z===0)console.log("✓ No legacy superpowers directory symlinks found")},NQ=async()=>{i(),console.log(`# Superpowers Bootstrap for Agents
|
|
136
58
|
# ==================================
|
|
137
|
-
`);let
|
|
59
|
+
`);let z=process.argv.includes("--no-update"),X=new Set(["copilot","claude","opencode"].filter((V)=>process.argv.includes(`--force-${V}`))),$=X.size>0;if(!z){let V=zz(),q=await qz();if(q.error)console.log(`## Update Check
|
|
138
60
|
|
|
139
61
|
⚠️ Could not check for updates (network issue)
|
|
140
62
|
|
|
141
63
|
---
|
|
142
|
-
`);else if(
|
|
143
|
-
`),console.log(`⚠️ Update available: v${
|
|
64
|
+
`);else if(q.hasUpdates)console.log(`## Update Available
|
|
65
|
+
`),console.log(`⚠️ Update available: v${q.localVersion} → v${q.remoteVersion}
|
|
144
66
|
To update, run: \`npm install -g @complexthings/superpowers-agent\``),console.log(`
|
|
145
67
|
---
|
|
146
|
-
`)}if(!$)
|
|
68
|
+
`)}if(!$)Cz(),console.log(`---
|
|
147
69
|
`);if(!$)console.log(`## Cleaning Up Legacy Files
|
|
148
|
-
`),
|
|
70
|
+
`),uX(),console.log(`
|
|
149
71
|
---
|
|
150
|
-
`);if(!$||
|
|
151
|
-
`),console.log("✓ Skill symlinks handled in sync step below"),
|
|
72
|
+
`);if(!$||X.has("copilot")){if(console.log(`## GitHub Copilot Integration
|
|
73
|
+
`),console.log("✓ Skill symlinks handled in sync step below"),p("copilot")||v(M(I.home,".copilot"))||X.has("copilot")){let q=VQ();if(q.created)console.log(`✓ Installed Copilot sessionStart hook -> ${q.path.replace(I.home,"~")}`);else if(q.updated)console.log(`✓ Updated Copilot sessionStart hook -> ${q.path.replace(I.home,"~")}`);else if(q.existed)console.log("✓ Copilot sessionStart hook already up to date");else if(q.error)console.log(`⚠️ Failed to install Copilot sessionStart hook: ${q.message}`)}else console.log("ℹ️ Skipped Copilot sessionStart hook (Copilot CLI not detected; run with --force-copilot to install anyway)");console.log(`
|
|
152
74
|
---
|
|
153
|
-
`)}if(!$||
|
|
154
|
-
`),!
|
|
75
|
+
`)}if(!$||X.has("claude")){if(console.log(`## Claude Code Integration
|
|
76
|
+
`),!D.claude.check()&&!X.has("claude"))console.log(`⚠️ Skipped (${D.claude.name} CLI not detected)
|
|
155
77
|
\uD83D\uDCA1 To enable Claude Code integration:
|
|
156
|
-
1. Install Claude Code: ${
|
|
157
|
-
2. Run: superpowers-agent bootstrap --force-claude`);else{console.log("✓ Skill symlinks handled in sync step below");let
|
|
78
|
+
1. Install Claude Code: ${D.claude.installUrl}
|
|
79
|
+
2. Run: superpowers-agent bootstrap --force-claude`);else{console.log("✓ Skill symlinks handled in sync step below");let q=BQ();if(q.created)console.log(`✓ Installed SessionStart hook -> ${I.claudeSettings.replace(I.home,"~")}`);else if(q.updated){if(console.log(`✓ ${q.existed?"Refreshed":"Added"} SessionStart hook in ${I.claudeSettings.replace(I.home,"~")}`),q.backup)console.log(` Backed up to ${a(q.backup).base}`)}else if(q.error)console.log(`⚠️ Failed to install SessionStart hook: ${q.message}`)}console.log(`
|
|
158
80
|
---
|
|
159
|
-
`)}if(!$||
|
|
160
|
-
`),
|
|
81
|
+
`)}if(!$||X.has("opencode")){if(console.log(`## OpenCode Integration
|
|
82
|
+
`),D.opencode.check())WQ();else console.log(`⚠️ Skipped (${D.opencode.name} CLI not detected)
|
|
161
83
|
\uD83D\uDCA1 To enable OpenCode integration:
|
|
162
|
-
1. Install OpenCode: ${
|
|
163
|
-
2. Run: superpowers-agent ${
|
|
84
|
+
1. Install OpenCode: ${D.opencode.installUrl}
|
|
85
|
+
2. Run: superpowers-agent ${D.opencode.bootstrapCommand}`);console.log(`
|
|
164
86
|
---
|
|
165
87
|
`)}if(!$){console.log(`## Generating Platform-Specific Files
|
|
166
|
-
`);let
|
|
167
|
-
`);let
|
|
168
|
-
`)}if(
|
|
88
|
+
`);let V=XQ();console.log(`Detected platforms: ${V.join(", ")||"none"}
|
|
89
|
+
`);let q=M(I.superpowersRepo,".agents","templates","AGENTS.md.template"),B="";try{B=s(q,"utf8")}catch(W){console.log(`⚠️ Could not read AGENTS.md template: ${W.message}
|
|
90
|
+
`)}if(B){let W=k();B=B.replace(/\{\{VERSION\}\}/g,W);let G=M(I.home,".agents","AGENTS.md"),H=Bz(G,B,V,!0);if(H.created)console.log(`✓ Created ${G}`);else if(H.updated)console.log(`✓ Updated ${G}`)}console.log(`
|
|
169
91
|
---
|
|
170
92
|
`)}console.log(`## Cleaning Up Legacy Superpowers Dir Symlinks
|
|
171
|
-
`),
|
|
93
|
+
`),hX(),console.log(`
|
|
172
94
|
---
|
|
173
95
|
`),console.log(`## Syncing Repo Skills -> ~/.agents/skills/
|
|
174
|
-
`);let Z=
|
|
96
|
+
`);let Z=wQ();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 V of Z.errors)console.log(` ⚠️ ${V}`);else console.log(` ✓ ${Z.existed} skill symlinks already up to date`);console.log(`
|
|
175
97
|
---
|
|
176
|
-
`),console.log(`##
|
|
177
|
-
`);let
|
|
98
|
+
`),console.log(`## Reconciling Retired Repo-Managed Skill Symlinks
|
|
99
|
+
`);let Y=TQ();if(Y.removed.length>0){console.log(` ✓ Removed ${Y.removed.length} retired skill symlink(s):`);for(let V of Y.removed)console.log(` - ${V}`)}else console.log(" ✓ No retired repo-managed skill symlinks found");console.log(`
|
|
178
100
|
---
|
|
179
101
|
`),console.log(`# Bootstrap Complete!
|
|
180
102
|
`),console.log("✓ All integrations installed"),console.log("✓ Skills system ready"),console.log(`✓ Skill symlinks synced
|
|
181
|
-
`),console.log("Next steps:"),console.log(" -
|
|
182
|
-
⚠ Could not parse agents.json: ${
|
|
183
|
-
⚠ Invalid agents.json: ${Z.error}`);return}for(let
|
|
184
|
-
\uD83D\uDCE6 Found agents.json (${
|
|
185
|
-
${
|
|
186
|
-
${
|
|
103
|
+
`),console.log("Next steps:"),console.log(" - Use your platform's native skill tool to see available skills"),console.log(" - Run `superpowers-agent setup-skills` in your project directory")};import{existsSync as b,readFileSync as Ez,mkdirSync as rX,rmSync as fz,cpSync as sX,lstatSync as tX}from"fs";import{join as T,dirname as Kz,parse as Xz,sep as eX}from"path";import{execSync as x}from"child_process";import{homedir as d}from"os";import{createInterface as zZ}from"readline";import{readFileSync as dX,existsSync as Rz,unlinkSync as pX,lstatSync as cX,mkdirSync as nX}from"fs";import{join as lX,dirname as iX}from"path";import{join as t}from"path";import{homedir as jz}from"os";var xz={github:{name:"github",sourceDir:".github/agents",sourceExt:".agent.md",getDestDir:()=>t(I.vscodeUserDir,"prompts"),getExtraDestDirs:()=>[t(jz(),".copilot","agents")],destExt:".agent.md"},opencode:{name:"opencode",sourceDir:".opencode/agents",sourceExt:".md",getDestDir:()=>t(jz(),".config","opencode","agents"),destExt:".md"},claude:{name:"claude",sourceDir:".claude/agents",sourceExt:".md",getDestDir:()=>t(jz(),".claude","agents"),destExt:".md"}};function vQ(z,Q,X){let $=xz[Q];if(!$)return null;return t(z,$.sourceDir,`${X}${$.sourceExt}`)}function AQ(z,Q){let X=xz[z];if(!X)return[];return[X.getDestDir(),...X.getExtraDestDirs?X.getExtraDestDirs():[]].map((Z)=>t(Z,`${Q}${X.destExt}`))}function Dz(){return Object.keys(xz)}function aX(z){if(!z||typeof z!=="object")return{valid:!1,error:"agents.json must be a JSON object"};if(!z.version||typeof z.version!=="string")return{valid:!1,error:'agents.json must have a "version" string field'};if(!z.agents||typeof z.agents!=="object")return{valid:!1,error:'agents.json must have an "agents" object field'};let Q=Dz(),X=[];for(let[$,Z]of Object.entries(z.agents)){if(!Q.includes($)){X.push($);continue}if(!Array.isArray(Z))return{valid:!1,error:`agents.${$} must be an array of agent names`};for(let Y of Z)if(typeof Y!=="string")return{valid:!1,error:`agents.${$} must contain only string agent names`}}return{valid:!0,data:z,skippedPlatforms:X}}function oX(z,Q){if(!Rz(z))return{installed:!1,error:`Source file not found: ${z}`};if(Rz(Q))try{if(!cX(Q).isSymbolicLink())pX(Q)}catch($){}nX(iX(Q),{recursive:!0});let X=UQ(z,Q);if(X.error)return{installed:!1,error:X.error};return{installed:!0}}function yz(z,Q={}){let X=lX(z,"agents.json");if(!Rz(X))return;let $;try{$=JSON.parse(dX(X,"utf8"))}catch(J){console.log(`
|
|
104
|
+
⚠ Could not parse agents.json: ${J.message}`);return}let Z=aX($);if(!Z.valid){console.log(`
|
|
105
|
+
⚠ Invalid agents.json: ${Z.error}`);return}for(let J of Z.skippedPlatforms)console.log(` ⚠ Skipping unknown platform: ${J}`);let Y=$.repository||"unknown",V=$.version,q=Q.isUpdate?"Updating":"Installing",B=Q.isUpdate?"Updated":"Installed";console.log(`
|
|
106
|
+
\uD83D\uDCE6 Found agents.json (${Y} v${V})`);let W=Dz(),G=0,H=0,E=[];for(let[J,O]of Object.entries($.agents)){if(!W.includes(J))continue;console.log(`
|
|
107
|
+
${q} ${J} agents:`);for(let U of O){let N=vQ(z,J,U),C=AQ(J,U),j=[],A=[];for(let R of C){let K=oX(N,R);if(K.installed)j.push(R);else A.push(K.error)}if(j.length>0)console.log(` ✓ ${U}`),E.push({platformKey:J,agentName:U,sourcePath:N,destPaths:j}),G++;else console.log(` ✗ ${U}: ${A.join("; ")}`),H++}}if(E.length>0){let J=S(!0);if(!J.installedAgents)J.installedAgents={};if(!J.installedAgents[Y])J.installedAgents[Y]={version:V,agents:{}};J.installedAgents[Y].version=V;for(let{platformKey:O,agentName:U,sourcePath:N,destPaths:C}of E){if(!J.installedAgents[Y].agents[O])J.installedAgents[Y].agents[O]={};J.installedAgents[Y].agents[O][U]={source:N,destination:C[0],destinations:C,installedAt:new Date().toISOString()}}m(J,!0)}if(G>0)console.log(`
|
|
108
|
+
${B} ${G} agent(s)${H>0?` (${H} failed)`:""}`)}var FQ=(z,Q)=>{if(Q.type==="local"){let $=z;for(let Z=0;Z<10;Z++){if(b(T($,"agents.json")))return $;let Y=Kz($);if(Y===$)break;$=Y}return z}let X=T(".agents","tmp");if(z.includes(X)){let $=z.indexOf(X),Y=z.substring($+X.length+1).split(eX)[0];return T(z.substring(0,$),".agents","tmp",Y)}return z},bQ=(z,Q)=>{let X=T(d(),".agents","repos"),$=Q.replace(/^@/,"").replace(/[^a-zA-Z0-9_-]/g,"_"),Z=T(X,$);try{if(rX(X,{recursive:!0}),b(Z))fz(Z,{recursive:!0,force:!0});return sX(z,Z,{recursive:!0}),Z}catch(Y){return console.log(` Warning: Could not persist repository for agents: ${Y.message}`),null}},kz=(z)=>{let Q=z.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/tree\/([^/]+)\/(.+)$/);if(Q){let[,Z,Y,V,q]=Q;return{type:"git-tree",repoUrl:`https://github.com/${Z}/${Y}.git`,branch:V,path:q,original:z}}let X=z.match(/^git@github\.com:([^/]+)\/([^/]+?)(?:\.git)?$/);if(X){let[,Z,Y]=X;return{type:"git-repo",repoUrl:`git@github.com:${Z}/${Y}.git`,branch:null,path:null,original:z}}let $=z.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/);if($){let[,Z,Y]=$;return{type:"git-repo",repoUrl:`https://github.com/${Z}/${Y}.git`,branch:null,path:null,original:z}}if(b(z))return{type:"local",path:z,original:z};return null},Pz=(z)=>{let Q=z.includes("--global")||z.includes("-g"),X=z.includes("--project")||z.includes("-p");if(Q)return T(d(),".agents","skills");if(X)return T(process.cwd(),".agents","skills");let $=T(process.cwd(),".agents","config.json"),Z=T(d(),".agents","config.json");for(let Y of[$,Z])if(b(Y))try{if(JSON.parse(Ez(Y,"utf8")).installLocation==="project")return T(process.cwd(),".agents","skills")}catch(V){}return T(d(),".agents","skills")},gz=(z,Q)=>{let X=T(d(),".agents","tmp",`skill-install-${Date.now()}`);try{if(x(`mkdir -p "${X}"`,{stdio:"pipe"}),Q)x(`git clone --branch ${Q} --depth 1 "${z}" "${X}"`,{stdio:"pipe",timeout:30000});else x(`git clone --depth 1 "${z}" "${X}"`,{stdio:"pipe",timeout:30000});return X}catch($){try{x(`rm -rf "${X}"`,{stdio:"pipe"})}catch{}throw Error(`Failed to clone repository: ${$.message}`)}},e=(z)=>{let Q=T(z,"skill.json");if(!b(Q))return null;try{let X=Ez(Q,"utf8");return JSON.parse(X)}catch(X){throw Error(`Failed to read skill.json: ${X.message}`)}},Vz=(z,Q,X,$)=>{let Z=T(z,Q);if(!b(Z)){$.errors.push(`Skill directory not found: ${Q}`);return}let Y=e(Z);if(!Y){$.errors.push(`No skill.json found in: ${Q}`);return}let V=Y.name||Q,q=V.split("/").pop()||V,B=T(X,q),W=Kz(B);try{x(`mkdir -p "${W}"`,{stdio:"pipe"})}catch(G){$.errors.push(`Failed to create directory ${W}: ${G.message}`);return}try{if(b(B))x(`rm -rf "${B}"`,{stdio:"pipe"});x(`cp -R "${Z}" "${B}"`,{stdio:"pipe"}),$.installed.push({name:q,path:B,title:Y.title||Y.description||q})}catch(G){$.errors.push(`Failed to install ${Q}: ${G.message}`)}},CQ=(z,Q,X,$,Z=null)=>{let Y=S($);if(!Y.installedSkills)Y.installedSkills={};let V={source:z,installBase:Q,installedAt:new Date().toISOString(),skills:X.installed.map((q)=>({name:q.name,path:q.path}))};if(Y.installedSkills[z]=V,Z&&Z!==z)Y.installedSkills[Z]=V;m(Y,$)},jQ=()=>{let z=process.argv.slice(3),Q=z.find((H)=>!H.startsWith("-")),X=z.filter((H)=>H.startsWith("-"));if(!Q){console.log(`Usage: superpowers-agent add <url-or-path|@alias> [skill-path] [options]
|
|
187
109
|
|
|
188
110
|
Options:
|
|
189
111
|
--global, -g Install skills globally in ~/.agents/skills/ (default)
|
|
@@ -205,18 +127,18 @@ Description:
|
|
|
205
127
|
|
|
206
128
|
Repository aliases can be added using:
|
|
207
129
|
superpowers-agent add-repository <git-url> [--as=@alias]`);return}console.log(`Installing skill(s)...
|
|
208
|
-
`);let $=!
|
|
209
|
-
Available aliases:`);let
|
|
210
|
-
Add a repository using:`),console.log(" superpowers-agent add-repository <git-url>");else for(let[
|
|
211
|
-
`);else
|
|
212
|
-
`);else if(
|
|
130
|
+
`);let $=!X.includes("--project")&&!X.includes("-p"),Z=null,Y=null,V=null;if(Q.startsWith("@")){let H=Q;V=H,Y=z.find((U,N)=>N>0&&!U.startsWith("-")&&U!==H);let E=P(!1),J=P(!0);if(E[H])Z=E[H],console.log(`Using project repository alias: ${H}`);else if(J[H])Z=J[H],console.log(`Using global repository alias: ${H}`);else{console.log(`Error: Repository alias not found: ${H}`),console.log(`
|
|
131
|
+
Available aliases:`);let U={...J,...E};if(Object.keys(U).length===0)console.log(" (none)"),console.log(`
|
|
132
|
+
Add a repository using:`),console.log(" superpowers-agent add-repository <git-url>");else for(let[N,C]of Object.entries(U))console.log(` ${N} -> ${C}`);return}let O=b(Z);if(Y)if(O)Q=T(Z,Y),console.log(`Repository path: ${Z}`),console.log(`Skill path: ${Y}
|
|
133
|
+
`);else Q=Z,console.log(`Repository URL: ${Z}`),console.log(`Skill path: ${Y}
|
|
134
|
+
`);else if(Q=Z,O)console.log(`Repository path: ${Z}
|
|
213
135
|
`);else console.log(`Repository URL: ${Z}
|
|
214
|
-
`)}let
|
|
215
|
-
`);let
|
|
216
|
-
`);for(let
|
|
217
|
-
**Successfully installed skills:**`),console.log(`- Source: ${
|
|
218
|
-
**Errors:**`);for(let
|
|
219
|
-
Error: ${
|
|
136
|
+
`)}let q=kz(Q);if(!q){console.log(`Error: Invalid URL or path not found: ${Q}`);return}if(Y&&q.type==="git-repo"&&!q.path)q.path=Y;let B=Pz(X);console.log(`Install location: ${B}
|
|
137
|
+
`);let W,G=!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(W=gz(q.repoUrl,q.branch),G=!0,q.path){if(W=T(W,q.path),!b(W))throw Error(`Path not found in repository: ${q.path}`)}console.log("")}else W=q.path;let H=e(W);if(!H)throw Error("No skill.json found in source directory");let E={installed:[],errors:[],source:q.original};if(H.skills&&Array.isArray(H.skills)){console.log(`Found ${H.skills.length} skill(s) to install
|
|
138
|
+
`);for(let U of H.skills)Vz(W,U,B,E)}else{let U=H.name||Xz(W).base;Vz(Kz(W),Xz(W).base,B,E)}let J=FQ(W,q),O=T(J,"agents.json");if(b(O)){let U=J;if(G){let N;try{N=JSON.parse(Ez(O,"utf8"))}catch{}let C=N?.repository||q.original,j=bQ(J,C);if(j)U=j}yz(U,{isUpdate:!1})}if(G&&W)try{let U=W.split("/.agents/tmp/")[0]+"/.agents/tmp/"+W.split("/.agents/tmp/")[1].split("/")[0];x(`rm -rf "${U}"`,{stdio:"pipe"})}catch{}if(console.log(`
|
|
139
|
+
**Successfully installed skills:**`),console.log(`- Source: ${E.source}`),E.installed.length>0)for(let U of E.installed)console.log(` - Installed: ${U.name} at ${U.path}`),console.log(` ${U.title}`);if(E.errors.length>0){console.log(`
|
|
140
|
+
**Errors:**`);for(let U of E.errors)console.log(` - ${U}`)}if(E.installed.length===0&&E.errors.length===0)console.log(" No skills were installed");if(E.installed.length>0)CQ(q.original,B,E,$,V)}catch(H){if(G&&W)try{let E=W.split("/.agents/tmp/")[0]+"/.agents/tmp/"+W.split("/.agents/tmp/")[1].split("/")[0];x(`rm -rf "${E}"`,{stdio:"pipe"})}catch{}console.log(`
|
|
141
|
+
Error: ${H.message}`)}},xQ=()=>{let z=process.argv.slice(3),Q=z.find((H)=>!H.startsWith("-")),X=z.filter((H)=>H.startsWith("-"));if(!Q){console.log(`Usage: superpowers-agent pull <url-or-path|@alias> [skill-path] [options]
|
|
220
142
|
|
|
221
143
|
Options:
|
|
222
144
|
--global, -g Update skills globally in ~/.agents/skills/ (default)
|
|
@@ -241,18 +163,18 @@ Description:
|
|
|
241
163
|
|
|
242
164
|
Repository aliases can be added using:
|
|
243
165
|
superpowers-agent add-repository <git-url> [--as=@alias]`);return}console.log(`Updating skill(s)...
|
|
244
|
-
`);let $=!
|
|
245
|
-
Available aliases:`);let
|
|
246
|
-
Add a repository using:`),console.log(" superpowers-agent add-repository <git-url>");else for(let[
|
|
247
|
-
`);else
|
|
248
|
-
`);else if(
|
|
166
|
+
`);let $=!X.includes("--project")&&!X.includes("-p"),Z=null,Y=null,V=null;if(Q.startsWith("@")){let H=Q;V=H,Y=z.find((U,N)=>N>0&&!U.startsWith("-")&&U!==H);let E=P(!1),J=P(!0);if(E[H])Z=E[H],console.log(`Using project repository alias: ${H}`);else if(J[H])Z=J[H],console.log(`Using global repository alias: ${H}`);else{console.log(`Error: Repository alias not found: ${H}`),console.log(`
|
|
167
|
+
Available aliases:`);let U={...J,...E};if(Object.keys(U).length===0)console.log(" (none)"),console.log(`
|
|
168
|
+
Add a repository using:`),console.log(" superpowers-agent add-repository <git-url>");else for(let[N,C]of Object.entries(U))console.log(` ${N} -> ${C}`);return}let O=b(Z);if(Y)if(O)Q=T(Z,Y),console.log(`Repository path: ${Z}`),console.log(`Skill path: ${Y}
|
|
169
|
+
`);else Q=Z,console.log(`Repository URL: ${Z}`),console.log(`Skill path: ${Y}
|
|
170
|
+
`);else if(Q=Z,O)console.log(`Repository path: ${Z}
|
|
249
171
|
`);else console.log(`Repository URL: ${Z}
|
|
250
|
-
`)}let
|
|
251
|
-
`);let
|
|
252
|
-
`);for(let
|
|
253
|
-
**Successfully updated skills:**`),console.log(`- Source: ${
|
|
254
|
-
**Errors:**`);for(let
|
|
255
|
-
Error: ${
|
|
172
|
+
`)}let q=kz(Q);if(!q){console.log(`Error: Invalid URL or path not found: ${Q}`);return}if(Y&&q.type==="git-repo"&&!q.path)q.path=Y;let B=Pz(X);console.log(`Install location: ${B}
|
|
173
|
+
`);let W,G=!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(W=gz(q.repoUrl,q.branch),G=!0,q.path){if(W=T(W,q.path),!b(W))throw Error(`Path not found in repository: ${q.path}`)}console.log("")}else W=q.path;let H=e(W);if(!H)throw Error("No skill.json found in source directory");let E={installed:[],errors:[],source:q.original};if(H.skills&&Array.isArray(H.skills)){console.log(`Found ${H.skills.length} skill(s) to update
|
|
174
|
+
`);for(let U of H.skills)Vz(W,U,B,E)}else{let U=H.name||Xz(W).base;Vz(Kz(W),Xz(W).base,B,E)}let J=FQ(W,q),O=T(J,"agents.json");if(b(O)){let U=J;if(G){let N;try{N=JSON.parse(Ez(O,"utf8"))}catch{}let C=N?.repository||q.original,j=bQ(J,C);if(j)U=j}yz(U,{isUpdate:!0})}if(G&&W)try{let U=W.split("/.agents/tmp/")[0]+"/.agents/tmp/"+W.split("/.agents/tmp/")[1].split("/")[0];x(`rm -rf "${U}"`,{stdio:"pipe"})}catch{}if(console.log(`
|
|
175
|
+
**Successfully updated skills:**`),console.log(`- Source: ${E.source}`),E.installed.length>0)for(let U of E.installed)console.log(` - Updated: ${U.name} at ${U.path}`),console.log(` ${U.title}`);if(E.errors.length>0){console.log(`
|
|
176
|
+
**Errors:**`);for(let U of E.errors)console.log(` - ${U}`)}if(E.installed.length===0&&E.errors.length===0)console.log(" No skills were updated");if(E.installed.length>0)CQ(q.original,B,E,$,V)}catch(H){if(G&&W)try{let E=W.split("/.agents/tmp/")[0]+"/.agents/tmp/"+W.split("/.agents/tmp/")[1].split("/")[0];x(`rm -rf "${E}"`,{stdio:"pipe"})}catch{}console.log(`
|
|
177
|
+
Error: ${H.message}`)}},QZ=(z)=>new Promise((Q)=>{let X=zZ({input:process.stdin,output:process.stdout});X.question(z,($)=>{X.close(),Q($.trim())})}),Sz=(z)=>{try{return tX(z).isSymbolicLink()}catch{return!1}},DQ=async()=>{let z=process.argv.slice(3),Q=z.find((K)=>!K.startsWith("-")),X=z.filter((K)=>K.startsWith("-"));if(!Q){console.log(`Usage: superpowers-agent rm <url-or-path|@alias> [options]
|
|
256
178
|
|
|
257
179
|
Options:
|
|
258
180
|
--global, -g Remove globally installed skills (default)
|
|
@@ -261,10 +183,10 @@ Options:
|
|
|
261
183
|
Examples:
|
|
262
184
|
superpowers-agent rm https://github.com/example/skills
|
|
263
185
|
superpowers-agent rm @myrepo
|
|
264
|
-
superpowers-agent rm ~/my-local-skills`);return}let $=!
|
|
265
|
-
`);let
|
|
266
|
-
Proceed? [y/N] `)).toLowerCase()!=="y"){console.log("Aborted.");return}for(let
|
|
267
|
-
Done.`)},
|
|
186
|
+
superpowers-agent rm ~/my-local-skills`);return}let $=!X.includes("--project")&&!X.includes("-p"),Z=Q,Y=null;if(Q.startsWith("@")){Y=Q;let K=P(!1),_=P(!0);if(K[Q])Z=K[Q];else if(_[Q])Z=_[Q];else{console.log(`Error: Repository alias not found: ${Q}`);return}}let V=iz($),q=V[Q]||V[Z],B=q?.installBase||Pz(X),W=[];if(q)W=q.skills;else{console.log(`No tracking data found. Attempting to re-resolve skills from source...
|
|
187
|
+
`);let K=kz(Z);if(!K){console.log(`Error: Invalid URL or path not found: ${Z}`);return}let _,y=!1;try{if(K.type==="git-repo"||K.type==="git-tree"){if(console.log(`Cloning repository: ${K.repoUrl}`),_=gz(K.repoUrl,K.branch),y=!0,K.path){if(_=T(_,K.path),!b(_))throw Error(`Path not found in repository: ${K.path}`)}}else _=K.path;let F=e(_);if(!F)throw Error("No skill.json found in source");let L=F.skills&&Array.isArray(F.skills)?F.skills:[F.name||Xz(_).base];for(let o of L){let Gz=o;if(F.skills){let mz=T(_,o);if(b(mz)){let uz=e(mz);if(uz?.name)Gz=uz.name}}W.push({name:Gz,path:T(B,Gz)})}if(y)try{let o=_.split("/.agents/tmp/")[0]+"/.agents/tmp/"+_.split("/.agents/tmp/")[1].split("/")[0];x(`rm -rf "${o}"`,{stdio:"pipe"})}catch{}}catch(F){if(y&&_)try{let L=_.split("/.agents/tmp/")[0]+"/.agents/tmp/"+_.split("/.agents/tmp/")[1].split("/")[0];x(`rm -rf "${L}"`,{stdio:"pipe"})}catch{}console.log(`Error resolving source: ${F.message}`);return}}let G=W.filter((K)=>b(K.path)||Sz(K.path)),H=[];for(let K of W)for(let _ of Hz){let y=T(_.skillsDir(),K.name);if(b(y)||Sz(y))H.push({platform:_.name,path:y})}let E=az(),J=Y||Z,O=[];if(E[J])for(let[,K]of Object.entries(E[J].agents||{}))for(let[,_]of Object.entries(K)){let y=_.destinations||(_.destination?[_.destination]:[]);for(let F of y)if(F&&(b(F)||Sz(F)))O.push({path:F})}let U=J.replace(/^@/,"").replace(/[^a-zA-Z0-9_-]/g,"_"),N=T(d(),".agents","repos",U),C=b(N),j=d(),A=(K)=>K.replace(j,"~");if(G.length===0&&H.length===0&&O.length===0&&!C){console.log("Nothing to remove.");return}if(console.log("Will remove:"),G.length>0){console.log(" Skills:");for(let K of G)console.log(` ${A(K.path)}`)}if(H.length>0){console.log(" Platform symlinks:");for(let K of H)console.log(` ${A(K.path)}`)}if(O.length>0){console.log(" Agents:");for(let K of O)console.log(` ${A(K.path)}`)}if(C)console.log(" Persisted repo:"),console.log(` ${A(N)}`);if((await QZ(`
|
|
188
|
+
Proceed? [y/N] `)).toLowerCase()!=="y"){console.log("Aborted.");return}for(let K of H){let _=vz(K.path);if(_.removed)console.log(`Removed symlink: ${A(K.path)}`),IQ(K.platform,K.path,"skills");else if(_.error==="Symlink does not exist")console.log(`Already removed: ${A(K.path)}`);else console.log(`Warning: ${A(K.path)}: ${_.error}`)}for(let K of O){let _=vz(K.path);if(_.removed)console.log(`Removed agent: ${A(K.path)}`);else if(_.error==="Symlink does not exist")console.log(`Already removed: ${A(K.path)}`);else console.log(`Warning: ${A(K.path)}: ${_.error}`)}if(C)try{fz(N,{recursive:!0,force:!0}),console.log(`Removed persisted repo: ${A(N)}`)}catch(K){console.log(`Warning: Failed to remove persisted repo: ${K.message}`)}for(let K of G){if(!b(K.path)){console.log(`Already removed: ${A(K.path)}`);continue}try{fz(K.path,{recursive:!0,force:!0}),console.log(`Removed skill: ${A(K.path)}`)}catch(_){console.log(`Warning: Failed to remove ${A(K.path)}: ${_.message}`)}}if(Iz(Q,$),Z!==Q)Iz(Z,$);if(E[J]){let K=S(!0);if(K.installedAgents)delete K.installedAgents[J],m(K,!0)}console.log(`
|
|
189
|
+
Done.`)},RQ=()=>{let z=process.argv.slice(3),Q=z.find((W)=>!W.startsWith("-")),X=z.filter((W)=>W.startsWith("-"));if(!Q){console.log(`Usage: superpowers-agent add-repository <git-url> [options]
|
|
268
190
|
|
|
269
191
|
Options:
|
|
270
192
|
--global, -g Add repository globally in ~/.agents/config.json (default)
|
|
@@ -282,47 +204,12 @@ Description:
|
|
|
282
204
|
The repository's skill.json will be read to determine the default alias.
|
|
283
205
|
Use --as to specify a custom alias.
|
|
284
206
|
After adding, you can install skills using: superpowers-agent add @alias path/to/skill`);return}console.log(`Adding repository...
|
|
285
|
-
`);let $=
|
|
286
|
-
You can now install skills using:`),console.log(` superpowers-agent add ${
|
|
287
|
-
Error: ${
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
# ============================================
|
|
292
|
-
|
|
293
|
-
${$}`,W},ZY=(Q)=>{if(!Q){console.log(`Usage: superpowers-agent use-skill <skill-name>
|
|
294
|
-
|
|
295
|
-
Examples (smart matching):
|
|
296
|
-
superpowers-agent use-skill brainstorming # Matches superpowers:collaboration/brainstorming
|
|
297
|
-
superpowers-agent use-skill collaboration/brainstorming # More specific suffix
|
|
298
|
-
superpowers-agent use-skill test-driven-development # Matches superpowers:testing/test-driven-development
|
|
299
|
-
|
|
300
|
-
Examples (explicit paths):
|
|
301
|
-
superpowers-agent use-skill superpowers:collaboration/brainstorming # Full superpowers skill path
|
|
302
|
-
superpowers-agent use-skill claude:email-assistant # Full claude skill path
|
|
303
|
-
superpowers-agent use-skill my-custom-skill # Project skill
|
|
304
|
-
|
|
305
|
-
Smart matching:
|
|
306
|
-
- Type just the skill name or any suffix of the path
|
|
307
|
-
- Priority: .agents/skills/ > .claude/skills/ > ~/.agents/skills/ > ~/.agents/superpowers/skills/
|
|
308
|
-
- If multiple skills match at same priority, you'll see them with descriptions`);return}let X=m(Q);if(!X){console.log(`Error: Skill not found: ${Q}
|
|
309
|
-
|
|
310
|
-
Available skills:`),console.log("Run: superpowers-agent find-skills");return}let{skillFile:Y,sourceType:$,actualSkillPath:Z}=X;try{let{content:q,frontmatter:z}=MQ(Y),W=s[$].prefix+Z,K=XY(Y),B=`# ${z.name||W}`;if(z.description)B+=`
|
|
311
|
-
# ${z.description}`;if(z.whenToUse)B+=`
|
|
312
|
-
# When to use: ${z.whenToUse}`;B+=`
|
|
313
|
-
# Supporting tools and docs are in ${K}
|
|
314
|
-
# ============================================
|
|
315
|
-
|
|
316
|
-
${q}`,console.log(B)}catch(q){console.log(q.message)}};var xZ=`You have superpowers.
|
|
317
|
-
|
|
318
|
-
**IMPORTANT: The using-superpowers skill content is included below. It is ALREADY LOADED - you are currently following it. Do NOT use the skill tool to load "using-superpowers" again - that would be redundant.**`,DZ="---\n\n**YOU MUST read and use the `leveraging-cli-tools` skill** the moment a task involves using BASH, searching code, parsing JSON/YAML, finding files, structural refactors, data wrangling, or any command that floods your context with verbose output (logs, CI logs, test runs). Load it with your skill tool BEFORE you reach for grep/find/sed or before you read large command output. It routes you to high-performance tools (rg, jq, fd, yq, ast-grep, gh, sd) and reduces output to just the signal — cutting token cost and latency 5-50x. Skipping it wastes tokens and time on work the right tool does instantly.",RZ=()=>{let Q=m("using-superpowers");if(!Q)return null;let X;try{X=YY(Q.skillFile,Q.sourceType,Q.actualSkillPath)}catch{return null}return`<EXTREMELY_IMPORTANT>
|
|
319
|
-
${xZ}
|
|
320
|
-
|
|
321
|
-
${X}
|
|
322
|
-
|
|
323
|
-
${DZ}
|
|
324
|
-
</EXTREMELY_IMPORTANT>`},fZ=(Q="raw")=>{let X=RZ();if(Q==="claude")return JSON.stringify({hookSpecificOutput:{hookEventName:"SessionStart",additionalContext:X||""}});if(Q==="copilot")return JSON.stringify({additionalContext:X||""});return X||""},$Y=()=>{let Q=process.argv.find((Y)=>Y.startsWith("--format=")),X=Q?Q.split("=")[1]:"raw";process.stdout.write(fZ(X)+`
|
|
325
|
-
`)};var qY={bootstrap:nX,version:vX,"check-updates":()=>{TX().catch((Q)=>{console.error(Q.message),process.exit(1)})},update:()=>{let Q=process.argv.includes("--no-reinstall");RQ({skipReinstall:Q})},"config-get":wX,"config-set":OX,"setup-skills":cX,"use-skill":()=>ZY(process.argv[3]),"session-context":$Y,execute:UX,"find-skills":t,add:sX,"add-repository":QY,"list-repositories":MX,pull:tX,rm:eX,dir:LX,path:IX,"get-helpers":JX,"install-aliases":uQ,default:()=>{console.log(`Superpowers for Agents
|
|
207
|
+
`);let $=X.some((W)=>W==="--global"||W==="-g"),Z=X.some((W)=>W==="--project"||W==="-p"),Y=X.find((W)=>W.startsWith("--as=")),V=Y?Y.split("=")[1]:null,q=Z?!1:!0,B;try{console.log(`Cloning repository: ${Q}`),B=T(d(),".agents","tmp",`repo-add-${Date.now()}`),x(`mkdir -p "${B}"`,{stdio:"pipe"}),x(`git clone --depth 1 "${Q}" "${B}"`,{stdio:"pipe",timeout:30000}),console.log("");let W=e(B);if(!W)throw Error("No skill.json found in repository");let G;if(V)G=V;else if(W.repository)G=W.repository;else{let J=Q.match(/\/([^/]+?)(?:\.git)?$/);if(J)G="@"+J[1];else throw Error("Could not determine repository alias. Use --as=@alias to specify manually.")}lz(G,Q,q),x(`rm -rf "${B}"`,{stdio:"pipe"});let H=q?"globally":"in project",E=q?T(d(),".agents","config.json"):T(process.cwd(),".agents","config.json");console.log(`✓ Repository added ${H}`),console.log(` Alias: ${G}`),console.log(` URL: ${Q}`),console.log(` Config: ${E}`),console.log(`
|
|
208
|
+
You can now install skills using:`),console.log(` superpowers-agent add ${G} <path-to-skill>`)}catch(W){if(B)try{x(`rm -rf "${B}"`,{stdio:"pipe"})}catch{}console.log(`
|
|
209
|
+
Error: ${W.message}`)}};var XZ=()=>`<EXTREMELY_IMPORTANT>
|
|
210
|
+
${"---\n\n**YOU MUST read and use the `leveraging-cli-tools` skill** the moment a task involves using BASH, searching code, parsing JSON/YAML, finding files, structural refactors, data wrangling, or any command that floods your context with verbose output (logs, CI logs, test runs). Load it with your skill tool BEFORE you reach for grep/find/sed or before you read large command output. It routes you to high-performance tools (rg, jq, fd, yq, ast-grep, gh, sd) and reduces output to just the signal — cutting token cost and latency 5-50x. Skipping it wastes tokens and time on work the right tool does instantly."}
|
|
211
|
+
</EXTREMELY_IMPORTANT>`,ZZ=(z="raw")=>{let Q=XZ();if(z==="claude")return JSON.stringify({hookSpecificOutput:{hookEventName:"SessionStart",additionalContext:Q}});if(z==="copilot")return JSON.stringify({additionalContext:Q});return Q},yQ=()=>{let z=process.argv.find((X)=>X.startsWith("--format=")),Q=z?z.split("=")[1]:"raw";process.stdout.write(ZZ(Q)+`
|
|
212
|
+
`)};var SQ={bootstrap:NQ,version:QQ,"check-updates":()=>{zQ().catch((z)=>{console.error(z.message),process.exit(1)})},update:()=>{let z=process.argv.includes("--no-reinstall");wz({skipReinstall:z})},"config-get":rz,"config-set":sz,"setup-skills":MQ,"session-context":yQ,add:jQ,"add-repository":RQ,"list-repositories":tz,pull:xQ,rm:DQ,"install-aliases":Cz,default:()=>{console.log(`Superpowers for Agents
|
|
326
213
|
Usage:
|
|
327
214
|
superpowers-agent bootstrap [--no-update] [--force] # Run complete bootstrap
|
|
328
215
|
superpowers-agent version # Show current version
|
|
@@ -331,19 +218,13 @@ Usage:
|
|
|
331
218
|
superpowers-agent config-get # Show configuration
|
|
332
219
|
superpowers-agent config-set <key> <value> # Update configuration
|
|
333
220
|
superpowers-agent setup-skills # Initialize project skills
|
|
334
|
-
superpowers-agent use-skill <skill-name> # Load a skill
|
|
335
221
|
superpowers-agent session-context [--format=claude|copilot|raw] # Print session-start context (used by hooks)
|
|
336
|
-
superpowers-agent find-skills # List available skills
|
|
337
222
|
superpowers-agent add <url-or-path|@alias> [path] [options] # Install skills
|
|
338
223
|
superpowers-agent add-repository <git-url> [--as=@alias] [opts] # Add repository alias
|
|
339
224
|
superpowers-agent list-repositories # List configured repository aliases
|
|
340
225
|
superpowers-agent pull <url-or-path|@alias> [path] [options] # Update skills
|
|
341
|
-
superpowers-agent rm <url-or-path|@alias> [options]
|
|
342
|
-
superpowers-agent dir <skill-name> # Get skill directory
|
|
343
|
-
superpowers-agent path <skill-name> # Get skill file path
|
|
344
|
-
superpowers-agent execute <skill-name> # Execute a skill
|
|
345
|
-
superpowers-agent get-helpers <skill> <search-term> # Get helper file path
|
|
226
|
+
superpowers-agent rm <url-or-path|@alias> [options] # Remove skills
|
|
346
227
|
superpowers-agent install-aliases # Install universal aliases (superpowers, superpowers-agent)
|
|
347
228
|
|
|
348
229
|
Documentation: https://github.com/complexthings/superpowers
|
|
349
|
-
`)}}
|
|
230
|
+
`)}},$Z=process.argv[2]||"default",YZ=SQ[$Z]||SQ.default;try{let z=YZ();if(z&&typeof z.then==="function")z.catch((Q)=>{console.error(`Error: ${Q.message}`),process.exit(1)})}catch(z){console.error(`Error: ${z.message}`),process.exit(1)}
|