superpowers-mcp 6.3.4 → 6.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,27 +1,27 @@
1
- "use strict";var N=Object.create;var C=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,J=Object.prototype.hasOwnProperty;var H=(e,t)=>{for(var r in t)C(e,r,{get:t[r],enumerable:!0})},A=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of W(t))!J.call(e,n)&&n!==r&&C(e,n,{get:()=>t[n],enumerable:!(s=M(t,n))||s.enumerable});return e};var x=(e,t,r)=>(r=e!=null?N(F(e)):{},A(t||!e||!e.__esModule?C(r,"default",{value:e,enumerable:!0}):r,e)),T=e=>A(C({},"__esModule",{value:!0}),e);var K={};H(K,{HARNESS_CONFIGS:()=>j,isPlainObject:()=>b,runSetup:()=>O,runSetupCli:()=>L,safeWriteConfig:()=>I,stripJsonComments:()=>_,updateJsonConfig:()=>R,updateYamlConfig:()=>E});module.exports=T(K);var a=x(require("fs")),i=x(require("path")),P=x(require("os")),D=x(require("crypto")),j={copilot:{name:"GitHub Copilot (VS Code)",aliases:["vscode","code","copilot"],getConfigPath:(e,t,r,s)=>e==="win32"?i.join(r||i.join(t,"AppData","Roaming"),"Code","User","mcp.json"):e==="darwin"?i.join(t,"Library","Application Support","Code","User","mcp.json"):i.join(t,".config","Code","User","mcp.json"),type:"json-servers",defaultConfig:(e,t)=>({command:e,args:t,type:"stdio"})},cursor:{name:"Cursor",aliases:["cursor"],getConfigPath:(e,t)=>i.join(t,".cursor","mcp.json"),type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},hermes:{name:"Hermes Desktop / Agent",aliases:["hermes","hermes-desktop"],getConfigPath:(e,t,r,s)=>{if(e==="win32"){let n=s||i.join(t,"AppData","Local");return i.join(n,"hermes","config.yaml")}return i.join(t,".hermes","config.yaml")},type:"yaml",defaultConfig:(e,t)=>({command:e,args:t})},kimi:{name:"Kimi Work / Kimi Code",aliases:["kimi","kimi-work","kimi-code"],getConfigPath:(e,t)=>i.join(t,".kimi-code","mcp.json"),type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},claude:{name:"Claude Desktop",aliases:["claude","claude-desktop"],getConfigPath:(e,t,r)=>e==="win32"?i.join(r||i.join(t,"AppData","Roaming"),"Claude","claude_desktop_config.json"):e==="darwin"?i.join(t,"Library","Application Support","Claude","claude_desktop_config.json"):i.join(t,".config","Claude","claude_desktop_config.json"),type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},devin:{name:"Devin Desktop (formerly Windsurf)",aliases:["devin","devin-desktop","windsurf","codeium"],getConfigPath:(e,t)=>{let r=i.join(t,".config","devin","mcp_config.json");return a.existsSync(r)?r:i.join(t,".codeium","windsurf","mcp_config.json")},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},antigravity:{name:"Antigravity (Google DeepMind)",aliases:["antigravity","agy","gemini"],getConfigPath:(e,t)=>i.join(t,".gemini","config","mcp_config.json"),type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},"pi-desktop":{name:"Pi Desktop / Pi Agent",aliases:["pi-desktop","pi","pi-agent"],getConfigPath:(e,t,r)=>{if(e==="win32"){let p=i.join(r||i.join(t,"AppData","Roaming"),".pi","agent","mcp.json");if(a.existsSync(p))return p;let o=i.join(t,".pi","agent","mcp.json");if(a.existsSync(o))return o;let f=i.join(t,".pi","mcp.json");return a.existsSync(f)?f:o}let s=i.join(t,".pi","agent","mcp.json");if(a.existsSync(s))return s;let n=i.join(t,".pi","mcp.json");return a.existsSync(n)?n:s},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})}};function b(e){return Object.prototype.toString.call(e)==="[object Object]"}function _(e){return e.replace(/\/\*[\s\S]*?\*\//g,"").replace(/(^|[^:])\/\/.*$/gm,"$1").replace(/,\s*([\]}])/g,"$1")}function E(e,t,r,s=!1){let n=e?e.split(/\r?\n/):[];if(s){let l=[],g=!1,v=0,d=!1,S=0;for(let h=0;h<n.length;h++){let y=n[h],w=y.match(/^(\s*)mcp_servers:\s*$/);if(w){g=!0,v=w[1].length,l.push(y);continue}if(g){let k=y.match(/^(\s*)/)?.[1].length||0;if(y.trim()!==""&&k<=v)g=!1,d=!1;else{let $=y.match(/^(\s*)superpowers:\s*$/);if($&&$[1].length>v){d=!0,S=$[1].length;continue}if(d){if(k>S||y.trim()==="")continue;d=!1}}}l.push(y)}return l.join(`
2
- `)}let p=" ";for(let l of n){let g=l.match(/^(\s+)[a-zA-Z0-9_-]+:/);if(g&&g[1].length>0){p=g[1];break}}let o=JSON.stringify(t),f=JSON.stringify(r),c=[`${p}superpowers:`,`${p}${p}command: ${o}`,`${p}${p}args: ${f}`];if(!e||e.trim()==="")return`mcp_servers:
1
+ "use strict";var q=Object.create;var x=Object.defineProperty;var O=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var N=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty;var K=(t,e)=>{for(var s in e)x(t,s,{get:e[s],enumerable:!0})},_=(t,e,s,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of T(e))!H.call(t,r)&&r!==s&&x(t,r,{get:()=>e[r],enumerable:!(n=O(e,r))||n.enumerable});return t};var b=(t,e,s)=>(s=t!=null?q(N(t)):{},_(e||!t||!t.__esModule?x(s,"default",{value:t,enumerable:!0}):s,t)),L=t=>_(x({},"__esModule",{value:!0}),t);var F={};K(F,{HARNESS_CONFIGS:()=>k,isPlainObject:()=>P,runSetup:()=>U,runSetupCli:()=>W,safeWriteConfig:()=>E,stripJsonComments:()=>R,updateJsonConfig:()=>I,updateYamlConfig:()=>D});module.exports=L(F);var i=b(require("fs")),o=b(require("path")),A=b(require("os")),$=b(require("crypto")),k={copilot:{name:"GitHub Copilot (VS Code)",aliases:["vscode","code","copilot"],getConfigPath:(t,e,s,n)=>t==="win32"?o.join(s||o.join(e,"AppData","Roaming"),"Code","User","mcp.json"):t==="darwin"?o.join(e,"Library","Application Support","Code","User","mcp.json"):o.join(e,".config","Code","User","mcp.json"),type:"json-servers",defaultConfig:(t,e)=>({command:t,args:e,type:"stdio"})},"copilot-insiders":{name:"GitHub Copilot (VS Code Insiders)",aliases:["vscode-insiders","code-insiders","insiders","insider","vscode-insider","code-insider","copilot-insider"],getConfigPath:(t,e,s,n)=>t==="win32"?o.join(s||o.join(e,"AppData","Roaming"),"Code - Insiders","User","mcp.json"):t==="darwin"?o.join(e,"Library","Application Support","Code - Insiders","User","mcp.json"):o.join(e,".config","Code - Insiders","User","mcp.json"),type:"json-servers",defaultConfig:(t,e)=>({command:t,args:e,type:"stdio"})},cursor:{name:"Cursor",aliases:["cursor"],getConfigPath:(t,e)=>o.join(e,".cursor","mcp.json"),type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})},hermes:{name:"Hermes Desktop / Agent",aliases:["hermes","hermes-desktop"],getConfigPath:(t,e,s,n)=>{if(t==="win32"){let r=n||o.join(e,"AppData","Local");return o.join(r,"hermes","config.yaml")}return o.join(e,".hermes","config.yaml")},type:"yaml",defaultConfig:(t,e)=>({command:t,args:e})},kimi:{name:"Kimi Work / Kimi Code",aliases:["kimi","kimi-work","kimi-code"],getConfigPath:(t,e)=>o.join(e,".kimi-code","mcp.json"),type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})},claude:{name:"Claude Desktop",aliases:["claude","claude-desktop"],getConfigPath:(t,e,s)=>t==="win32"?o.join(s||o.join(e,"AppData","Roaming"),"Claude","claude_desktop_config.json"):t==="darwin"?o.join(e,"Library","Application Support","Claude","claude_desktop_config.json"):o.join(e,".config","Claude","claude_desktop_config.json"),type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})},devin:{name:"Devin Desktop (formerly Windsurf)",aliases:["devin","devin-desktop","windsurf","codeium"],getConfigPath:(t,e)=>{let s=o.join(e,".config","devin","mcp_config.json");return i.existsSync(s)?s:o.join(e,".codeium","windsurf","mcp_config.json")},type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})},antigravity:{name:"Antigravity (Google DeepMind)",aliases:["antigravity","agy","gemini"],getConfigPath:(t,e)=>o.join(e,".gemini","config","mcp_config.json"),type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})},"pi-desktop":{name:"Pi Desktop / Pi Agent",aliases:["pi-desktop","pi","pi-agent"],getConfigPath:(t,e,s)=>{if(t==="win32"){let l=o.join(s||o.join(e,"AppData","Roaming"),".pi","agent","mcp.json");if(i.existsSync(l))return l;let a=o.join(e,".pi","agent","mcp.json");if(i.existsSync(a))return a;let g=o.join(e,".pi","mcp.json");return i.existsSync(g)?g:a}let n=o.join(e,".pi","agent","mcp.json");if(i.existsSync(n))return n;let r=o.join(e,".pi","mcp.json");return i.existsSync(r)?r:n},type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})},qwenpaw:{name:"QwenPaw (Personal Agent Workstation)",aliases:["qwenpaw","qwen-paw","copaw"],getConfigPath:(t,e)=>{let s=o.join(e,".qwenpaw","config.json");if(i.existsSync(s))return s;let n=o.join(e,".copaw","config.json");return i.existsSync(n)?n:s},type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})},cline:{name:"Cline (VS Code / CLI)",aliases:["cline","claude-dev"],getConfigPath:(t,e,s)=>{let n="";if(t==="win32"?n=o.join(s||o.join(e,"AppData","Roaming"),"Code","User","globalStorage","saoudrizwan.claude-dev","settings","cline_mcp_settings.json"):t==="darwin"?n=o.join(e,"Library","Application Support","Code","User","globalStorage","saoudrizwan.claude-dev","settings","cline_mcp_settings.json"):n=o.join(e,".config","Code","User","globalStorage","saoudrizwan.claude-dev","settings","cline_mcp_settings.json"),i.existsSync(n))return n;let r=o.join(e,".cline","data","settings","cline_mcp_settings.json");return i.existsSync(r)?r:n},type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})},kilo:{name:"Kilo Code",aliases:["kilo","kilocode","kilo-code"],getConfigPath:(t,e)=>{let s=o.join(e,".config","kilo","kilo.jsonc");if(i.existsSync(s))return s;let n=o.join(e,".config","kilo","kilo.json");return i.existsSync(n)?n:s},type:"json-mcp",defaultConfig:(t,e)=>({type:"local",command:[t,...e],enabled:!0})},qoder:{name:"Qoder",aliases:["qoder"],getConfigPath:(t,e)=>o.join(e,".qoder","settings.json"),type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})},kiro:{name:"Kiro",aliases:["kiro","kiro-code"],getConfigPath:(t,e)=>o.join(e,".kiro","settings","mcp.json"),type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})},trae:{name:"Trae",aliases:["trae"],getConfigPath:(t,e,s)=>{if(t==="win32"){let n=o.join(s||o.join(e,"AppData","Roaming"),"Trae","User","mcp.json");if(i.existsSync(n))return n;let r=o.join(s||o.join(e,"AppData","Roaming"),"Trae CN","User","mcp.json");return i.existsSync(r)?r:n}else if(t==="darwin"){let n=o.join(e,"Library","Application Support","Trae","User","mcp.json");if(i.existsSync(n))return n;let r=o.join(e,"Library","Application Support","Trae CN","User","mcp.json");return i.existsSync(r)?r:n}else{let n=o.join(e,".config","Trae","User","mcp.json");if(i.existsSync(n))return n;let r=o.join(e,".config","Trae CN","User","mcp.json");return i.existsSync(r)?r:n}},type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})}};function P(t){return Object.prototype.toString.call(t)==="[object Object]"}function R(t){return t.replace(/\/\*[\s\S]*?\*\//g,"").replace(/(^|[^:])\/\/.*$/gm,"$1").replace(/,\s*([\]}])/g,"$1")}function D(t,e,s,n=!1){let r=t?t.split(/\r?\n/):[];if(n){let p=[],f=!1,S=0,m=!1,h=0;for(let w=0;w<r.length;w++){let y=r[w],j=y.match(/^(\s*)mcp_servers:\s*$/);if(j){f=!0,S=j[1].length,p.push(y);continue}if(f){let C=y.match(/^(\s*)/)?.[1].length||0;if(y.trim()!==""&&C<=S)f=!1,m=!1;else{let v=y.match(/^(\s*)superpowers:\s*$/);if(v&&v[1].length>S){m=!0,h=v[1].length;continue}if(m){if(C>h||y.trim()==="")continue;m=!1}}}p.push(y)}return p.join(`
2
+ `)}let l=" ";for(let p of r){let f=p.match(/^(\s+)[a-zA-Z0-9_-]+:/);if(f&&f[1].length>0){l=f[1];break}}let a=JSON.stringify(e),g=JSON.stringify(s),c=[`${l}superpowers:`,`${l}${l}command: ${a}`,`${l}${l}args: ${g}`];if(!t||t.trim()==="")return`mcp_servers:
3
3
  ${c.join(`
4
4
  `)}
5
- `;let m=n.findIndex(l=>/^\s*mcp_servers:\s*$/.test(l));if(m===-1)return`${e.trimEnd()}
5
+ `;let d=r.findIndex(p=>/^\s*mcp_servers:\s*$/.test(p));if(d===-1)return`${t.trimEnd()}
6
6
 
7
7
  mcp_servers:
8
8
  ${c.join(`
9
9
  `)}
10
- `;let u=-1;for(let l=m+1;l<n.length;l++){let g=n[l];if(/^[^\s#]/.test(g))break;if(/^\s+superpowers:\s*$/.test(g)){u=l;break}}if(u!==-1){let l=n[u].match(/^(\s*)/)?.[1].length||2,g=u+1;for(;g<n.length;){let v=n[g];if((v.match(/^(\s*)/)?.[1].length||0)>l||v.trim()==="")g++;else break}return n.splice(u,g-u,...c),n.join(`
11
- `)}else return n.splice(m+1,0,...c),n.join(`
12
- `)}function R(e,t,r,s,n=!1){let p={};if(e&&e.trim()!=="")try{let c=JSON.parse(e);b(c)?p=c:p={}}catch{try{let m=_(e),u=JSON.parse(m);b(u)?p=u:p={}}catch(m){let u=m instanceof Error?m.message:String(m);throw new Error(`Failed to parse existing JSON: ${u}`)}}let o=t==="json-servers"?"servers":"mcpServers";b(p[o])||(p[o]={});let f=p[o];return n?delete f.superpowers:t==="json-servers"?f.superpowers={command:r,args:s,type:"stdio"}:f.superpowers={command:r,args:s},JSON.stringify(p,null,2)+`
13
- `}function I(e,t,r=!1){let s=e;try{let c=a.lstatSync(e,{throwIfNoEntry:!1});if(c&&c.isSymbolicLink())try{s=a.realpathSync(e)}catch{let u=a.readlinkSync(e);s=i.resolve(i.dirname(e),u)}}catch{}let n=i.dirname(s);a.existsSync(n)||a.mkdirSync(n,{recursive:!0,mode:448});let p=384;if(a.existsSync(s)){try{p=a.statSync(s).mode}catch{}if(r){let c=a.readFileSync(s,"utf8"),m=`${s}.${Date.now()}.bak`;try{a.writeFileSync(m,c,{encoding:"utf8",mode:p})}catch(u){let l=u instanceof Error?u.message:String(u);throw new Error(`Failed to create safe backup before write: ${l}`)}}}let o=D.randomBytes(8).toString("hex"),f=i.join(n,`.tmp.${i.basename(s)}.${process.pid}.${o}`);try{a.writeFileSync(f,t,{encoding:"utf8",mode:p,flag:"wx"}),a.renameSync(f,s)}catch(c){try{a.existsSync(f)&&a.unlinkSync(f)}catch{}throw c}}async function O(e={}){let t=e.platform||P.platform(),r=e.homeDir||P.homedir(),s=e.appData||process.env.APPDATA,n=e.localAppData||process.env.LOCALAPPDATA,p=!!e.dryRun,o=!!e.remove,f=!!e.bun,c=e.target?e.target.toLowerCase():null,m=f?"bunx":"npx",u=["-y","superpowers-mcp"],l=[];if(!c)throw new Error(`No target client specified. Please specify which client to configure using --target <${Object.keys(j).join("|")}>.`);let g=Object.keys(j).find(d=>d===c||j[d].aliases.includes(c));if(!g)throw new Error(`Unknown harness target: "${c}". Supported targets: ${Object.keys(j).join(", ")}`);let v=[g];for(let d of v){let S=j[d],h=S.getConfigPath(t,r,s,n),y=a.existsSync(h);if(o&&!y){l.push({target:d,name:S.name,path:h,status:"up-to-date",message:"Already not configured (file does not exist)"});continue}try{let w="";y&&(w=a.readFileSync(h,"utf8"));let k="";if(S.type==="yaml"?k=E(w,m,u,o):k=R(w,S.type,m,u,o),w.trim()===k.trim()&&y){l.push({target:d,name:S.name,path:h,status:"up-to-date",message:o?"Already not configured":"Already configured and up-to-date"});continue}p||I(h,k,!!e.backup),l.push({target:d,name:S.name,path:h,status:o?"removed":y?"updated":"created",message:p?`[Dry Run] Would ${o?"remove from":y?"update":"create"} ${h}`:`Successfully ${o?"removed from":y?"updated":"configured"}!`})}catch(w){let k=w instanceof Error?w.message:String(w);l.push({target:d,name:S.name,path:h,status:"error",message:k})}}return l}async function L(e=process.argv.slice(2)){let t={dryRun:!1,remove:!1,bun:!1,backup:!1,target:null};for(let r=0;r<e.length;r++){let s=e[r];if(!(s==="setup"||s==="--setup"))if(s==="--dry-run")t.dryRun=!0;else if(s==="--remove"||s==="--uninstall")t.remove=!0;else if(s==="--bun")t.bun=!0;else if(s==="--backup")t.backup=!0;else if(s==="--target"||s==="-t"){let n=e[r+1];(!n||n.startsWith("-"))&&(console.error(`\u274C Error: Missing value for --target flag.
14
- `),process.exit(1)),t.target=e[++r]}else if(s.startsWith("--target=")){let n=s.split("=")[1];n||(console.error(`\u274C Error: Missing value for --target flag.
15
- `),process.exit(1)),t.target=n}else if(s==="--help"||s==="-h"){U();return}else!s.startsWith("-")&&!t.target&&s!=="setup"?t.target=s:s.startsWith("-")&&(console.error(`\u274C Error: Unknown option "${s}". Use --help for usage.
10
+ `;let u=-1;for(let p=d+1;p<r.length;p++){let f=r[p];if(/^[^\s#]/.test(f))break;if(/^\s+superpowers:\s*$/.test(f)){u=p;break}}if(u!==-1){let p=r[u].match(/^(\s*)/)?.[1].length||2,f=u+1;for(;f<r.length;){let S=r[f];if((S.match(/^(\s*)/)?.[1].length||0)>p||S.trim()==="")f++;else break}return r.splice(u,f-u,...c),r.join(`
11
+ `)}else return r.splice(d+1,0,...c),r.join(`
12
+ `)}function I(t,e,s,n,r=!1,l){let a={};if(t&&t.trim()!=="")try{let d=JSON.parse(t);P(d)?a=d:a={}}catch{try{let u=R(t),p=JSON.parse(u);P(p)?a=p:a={}}catch(u){let p=u instanceof Error?u.message:String(u);throw new Error(`Failed to parse existing JSON: ${p}`)}}let g="mcpServers";e==="json-servers"?g="servers":e==="json-mcp"&&(g="mcp"),P(a[g])||(a[g]={});let c=a[g];return r?delete c.superpowers:l?c.superpowers=l:e==="json-servers"?c.superpowers={command:s,args:n,type:"stdio"}:e==="json-mcp"?c.superpowers={type:"local",command:[s,...n],enabled:!0}:c.superpowers={command:s,args:n},JSON.stringify(a,null,2)+`
13
+ `}function E(t,e,s=!1){let n=t;try{let c=i.lstatSync(t,{throwIfNoEntry:!1});if(c&&c.isSymbolicLink())try{n=i.realpathSync(t)}catch{let u=i.readlinkSync(t);n=o.resolve(o.dirname(t),u)}}catch{}let r=o.dirname(n);i.existsSync(r)||i.mkdirSync(r,{recursive:!0,mode:448});let l=384;if(i.existsSync(n)){try{l=i.statSync(n).mode}catch{}if(s){let c=i.readFileSync(n,"utf8"),d=`${n}.${Date.now()}.bak`;try{i.writeFileSync(d,c,{encoding:"utf8",mode:l})}catch(u){let p=u instanceof Error?u.message:String(u);throw new Error(`Failed to create safe backup before write: ${p}`)}}}let a=$.randomBytes(8).toString("hex"),g=o.join(r,`.tmp.${o.basename(n)}.${process.pid}.${a}`);try{i.writeFileSync(g,e,{encoding:"utf8",mode:l,flag:"wx"}),i.renameSync(g,n)}catch(c){try{i.existsSync(g)&&i.unlinkSync(g)}catch{}throw c}}async function U(t={}){let e=t.platform||A.platform(),s=t.homeDir||A.homedir(),n=t.appData||process.env.APPDATA,r=t.localAppData||process.env.LOCALAPPDATA,l=!!t.dryRun,a=!!t.remove,g=!!t.bun,c=t.target?t.target.toLowerCase():null,d=g?"bunx":"npx",u=["-y","superpowers-mcp"],p=[];if(!c)throw new Error(`No target client specified. Please specify which client to configure using --target <${Object.keys(k).join("|")}>.`);let f=Object.keys(k).find(m=>m===c||k[m].aliases.includes(c));if(!f)throw new Error(`Unknown harness target: "${c}". Supported targets: ${Object.keys(k).join(", ")}`);let S=[f];for(let m of S){let h=k[m],w=h.getConfigPath(e,s,n,r),y=i.existsSync(w);if(a&&!y){p.push({target:m,name:h.name,path:w,status:"up-to-date",message:"Already not configured (file does not exist)"});continue}try{let j="";y&&(j=i.readFileSync(w,"utf8"));let C="";if(h.type==="yaml")C=D(j,d,u,a);else{let v=typeof h.defaultConfig=="function"?h.defaultConfig(d,u):void 0;C=I(j,h.type,d,u,a,v)}if(j.trim()===C.trim()&&y){p.push({target:m,name:h.name,path:w,status:"up-to-date",message:a?"Already not configured":"Already configured and up-to-date"});continue}l||E(w,C,!!t.backup),p.push({target:m,name:h.name,path:w,status:a?"removed":y?"updated":"created",message:l?`[Dry Run] Would ${a?"remove from":y?"update":"create"} ${w}`:`Successfully ${a?"removed from":y?"updated":"configured"}!`})}catch(j){let C=j instanceof Error?j.message:String(j);p.push({target:m,name:h.name,path:w,status:"error",message:C})}}return p}async function W(t=process.argv.slice(2)){let e={dryRun:!1,remove:!1,bun:!1,backup:!1,target:null};for(let s=0;s<t.length;s++){let n=t[s];if(!(n==="setup"||n==="--setup"))if(n==="--dry-run")e.dryRun=!0;else if(n==="--remove"||n==="--uninstall")e.remove=!0;else if(n==="--bun")e.bun=!0;else if(n==="--backup")e.backup=!0;else if(n==="--target"||n==="-t"){let r=t[s+1];(!r||r.startsWith("-"))&&(console.error(`\u274C Error: Missing value for --target flag.
14
+ `),process.exit(1)),e.target=t[++s]}else if(n.startsWith("--target=")){let r=n.split("=")[1];r||(console.error(`\u274C Error: Missing value for --target flag.
15
+ `),process.exit(1)),e.target=r}else if(n==="--help"||n==="-h"){M();return}else!n.startsWith("-")&&!e.target&&n!=="setup"?e.target=n:n.startsWith("-")&&(console.error(`\u274C Error: Unknown option "${n}". Use --help for usage.
16
16
  `),process.exit(1))}if(console.log(`
17
17
  ========================================================`),console.log("\u26A1 Superpowers MCP - Targeted Client Setup"),console.log(`========================================================
18
- `),!t.target){console.log(`Please select which AI Agent client you would like to configure:
19
- `),console.log(" npx -y superpowers-mcp setup --target antigravity # Antigravity (~/.gemini/config/mcp_config.json)"),console.log(" npx -y superpowers-mcp setup --target pi-desktop # Pi Desktop / Pi Agent (~/.pi/agent/mcp.json)"),console.log(" npx -y superpowers-mcp setup --target cursor # Cursor (~/.cursor/mcp.json)"),console.log(" npx -y superpowers-mcp setup --target copilot # GitHub Copilot (VS Code mcp.json)"),console.log(" npx -y superpowers-mcp setup --target hermes # Hermes Desktop / Agent"),console.log(" npx -y superpowers-mcp setup --target kimi # Kimi Work / Kimi Code"),console.log(" npx -y superpowers-mcp setup --target claude # Claude Desktop"),console.log(` npx -y superpowers-mcp setup --target devin # Devin Desktop (formerly Windsurf)
18
+ `),!e.target){console.log(`Please select which AI Agent client you would like to configure:
19
+ `),console.log(" npx -y superpowers-mcp setup --target antigravity # Antigravity (~/.gemini/config/mcp_config.json)"),console.log(" npx -y superpowers-mcp setup --target pi-desktop # Pi Desktop / Pi Agent (~/.pi/agent/mcp.json)"),console.log(" npx -y superpowers-mcp setup --target cursor # Cursor (~/.cursor/mcp.json)"),console.log(" npx -y superpowers-mcp setup --target copilot # GitHub Copilot (VS Code mcp.json)"),console.log(" npx -y superpowers-mcp setup --target copilot-insiders # GitHub Copilot (VS Code Insiders mcp.json)"),console.log(" npx -y superpowers-mcp setup --target hermes # Hermes Desktop / Agent"),console.log(" npx -y superpowers-mcp setup --target kimi # Kimi Work / Kimi Code"),console.log(" npx -y superpowers-mcp setup --target claude # Claude Desktop"),console.log(" npx -y superpowers-mcp setup --target devin # Devin Desktop (formerly Windsurf)"),console.log(" npx -y superpowers-mcp setup --target qwenpaw # QwenPaw / CoPaw (~/.qwenpaw/config.json)"),console.log(" npx -y superpowers-mcp setup --target cline # Cline (~/.../cline_mcp_settings.json)"),console.log(" npx -y superpowers-mcp setup --target kilo # Kilo Code (~/.config/kilo/kilo.jsonc)"),console.log(" npx -y superpowers-mcp setup --target qoder # Qoder (~/.qoder/settings.json)"),console.log(" npx -y superpowers-mcp setup --target kiro # Kiro (~/.kiro/settings/mcp.json)"),console.log(` npx -y superpowers-mcp setup --target trae # Trae (~/.../Trae/User/mcp.json)
20
20
  `),console.log("\u{1F4A1} Tip:"),console.log(" You can run this setup command from ANY folder on your system."),console.log(` It automatically targets your global config files (~/...) without needing to clone this repo.
21
21
  `),console.log("\u{1F4A1} Privacy & Safety:"),console.log(" Superpowers MCP only configures the specific client you explicitly choose."),console.log(` It will NEVER silently scan or modify unselected environments.
22
- `);return}try{let r=await O(t),s=0,n=0,p=0;for(let o of r){let f=o.status==="created"||o.status==="updated"||o.status==="removed"?"\u2705":o.status==="up-to-date"?"\u2728":o.status==="skipped"?"\u23ED\uFE0F ":"\u274C";console.log(`${f} [${o.name}] (${o.status})`),console.log(` Path: ${o.path}`),console.log(` Info: ${o.message}
23
- `),o.status==="created"||o.status==="updated"||o.status==="up-to-date"||o.status==="removed"?s++:o.status==="skipped"?n++:o.status==="error"&&p++}console.log("--------------------------------------------------------"),p>0&&(console.error(`\u26A0\uFE0F Setup finished with errors: ${p} failure(s), ${s} succeeded.`),process.exit(1)),console.log(`\u{1F389} Setup complete! ${s} environment(s) ready.`)}catch(r){let s=r instanceof Error?r.message:String(r);console.error(`\u274C Setup failed: ${s}
24
- `),process.exit(1)}}function U(){console.log(`
22
+ `);return}try{let s=await U(e),n=0,r=0,l=0;for(let a of s){let g=a.status==="created"||a.status==="updated"||a.status==="removed"?"\u2705":a.status==="up-to-date"?"\u2728":a.status==="skipped"?"\u23ED\uFE0F ":"\u274C";console.log(`${g} [${a.name}] (${a.status})`),console.log(` Path: ${a.path}`),console.log(` Info: ${a.message}
23
+ `),a.status==="created"||a.status==="updated"||a.status==="up-to-date"||a.status==="removed"?n++:a.status==="skipped"?r++:a.status==="error"&&l++}console.log("--------------------------------------------------------"),l>0&&(console.error(`\u26A0\uFE0F Setup finished with errors: ${l} failure(s), ${n} succeeded.`),process.exit(1)),console.log(`\u{1F389} Setup complete! ${n} environment(s) ready.`)}catch(s){let n=s instanceof Error?s.message:String(s);console.error(`\u274C Setup failed: ${n}
24
+ `),process.exit(1)}}function M(){console.log(`
25
25
  Superpowers MCP - Targeted Global Setup
26
26
 
27
27
  Usage:
@@ -30,7 +30,10 @@ Usage:
30
30
  Options:
31
31
  --target, -t <name> Configure specific harness (Required):
32
32
  antigravity (agy, gemini), pi-desktop (pi, pi-agent), cursor,
33
- copilot (vscode), hermes, kimi, claude, devin (windsurf)
33
+ copilot (vscode), copilot-insiders (vscode-insiders, code-insiders, insiders),
34
+ hermes, kimi, claude, devin (windsurf),
35
+ qwenpaw (qwen-paw, copaw), cline (claude-dev), kilo (kilocode),
36
+ qoder, kiro (kiro-code), trae
34
37
  --bun Use "bunx" instead of "npx" in server commands
35
38
  --backup Create a timestamped .bak backup before modifying (Default: false, zero-pollution)
36
39
  --remove Remove superpowers MCP configuration from target
@@ -42,10 +45,17 @@ Examples:
42
45
  npx -y superpowers-mcp setup --target pi-desktop # Configure Pi Desktop / Pi Agent only
43
46
  npx -y superpowers-mcp setup --target cursor # Configure Cursor only
44
47
  npx -y superpowers-mcp setup --target copilot # Configure GitHub Copilot (VS Code) only
48
+ npx -y superpowers-mcp setup --target copilot-insiders # Configure GitHub Copilot (VS Code Insiders) only
45
49
  npx -y superpowers-mcp setup --target hermes # Configure Hermes Desktop only
46
50
  npx -y superpowers-mcp setup --target kimi # Configure Kimi Work only
47
51
  npx -y superpowers-mcp setup --target claude # Configure Claude Desktop only
48
52
  npx -y superpowers-mcp setup --target devin # Configure Devin Desktop (Windsurf) only
53
+ npx -y superpowers-mcp setup --target qwenpaw # Configure QwenPaw only
54
+ npx -y superpowers-mcp setup --target cline # Configure Cline only
55
+ npx -y superpowers-mcp setup --target kilo # Configure Kilo Code only
56
+ npx -y superpowers-mcp setup --target qoder # Configure Qoder only
57
+ npx -y superpowers-mcp setup --target kiro # Configure Kiro only
58
+ npx -y superpowers-mcp setup --target trae # Configure Trae only
49
59
 
50
60
  Any Directory:
51
61
  You can run this command from ANY directory on your machine.
package/out/setup.js CHANGED
@@ -1,28 +1,28 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var F=Object.create;var C=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var J=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty;var T=(e,t)=>{for(var r in t)C(e,r,{get:t[r],enumerable:!0})},D=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of W(t))!H.call(e,n)&&n!==r&&C(e,n,{get:()=>t[n],enumerable:!(s=M(t,n))||s.enumerable});return e};var x=(e,t,r)=>(r=e!=null?F(J(e)):{},D(t||!e||!e.__esModule?C(r,"default",{value:e,enumerable:!0}):r,e)),L=e=>D(C({},"__esModule",{value:!0}),e);var K={};T(K,{HARNESS_CONFIGS:()=>j,isPlainObject:()=>b,runSetup:()=>N,runSetupCli:()=>A,safeWriteConfig:()=>O,stripJsonComments:()=>E,updateJsonConfig:()=>I,updateYamlConfig:()=>R});module.exports=L(K);var a=x(require("fs")),i=x(require("path")),$=x(require("os")),_=x(require("crypto")),j={copilot:{name:"GitHub Copilot (VS Code)",aliases:["vscode","code","copilot"],getConfigPath:(e,t,r,s)=>e==="win32"?i.join(r||i.join(t,"AppData","Roaming"),"Code","User","mcp.json"):e==="darwin"?i.join(t,"Library","Application Support","Code","User","mcp.json"):i.join(t,".config","Code","User","mcp.json"),type:"json-servers",defaultConfig:(e,t)=>({command:e,args:t,type:"stdio"})},cursor:{name:"Cursor",aliases:["cursor"],getConfigPath:(e,t)=>i.join(t,".cursor","mcp.json"),type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},hermes:{name:"Hermes Desktop / Agent",aliases:["hermes","hermes-desktop"],getConfigPath:(e,t,r,s)=>{if(e==="win32"){let n=s||i.join(t,"AppData","Local");return i.join(n,"hermes","config.yaml")}return i.join(t,".hermes","config.yaml")},type:"yaml",defaultConfig:(e,t)=>({command:e,args:t})},kimi:{name:"Kimi Work / Kimi Code",aliases:["kimi","kimi-work","kimi-code"],getConfigPath:(e,t)=>i.join(t,".kimi-code","mcp.json"),type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},claude:{name:"Claude Desktop",aliases:["claude","claude-desktop"],getConfigPath:(e,t,r)=>e==="win32"?i.join(r||i.join(t,"AppData","Roaming"),"Claude","claude_desktop_config.json"):e==="darwin"?i.join(t,"Library","Application Support","Claude","claude_desktop_config.json"):i.join(t,".config","Claude","claude_desktop_config.json"),type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},devin:{name:"Devin Desktop (formerly Windsurf)",aliases:["devin","devin-desktop","windsurf","codeium"],getConfigPath:(e,t)=>{let r=i.join(t,".config","devin","mcp_config.json");return a.existsSync(r)?r:i.join(t,".codeium","windsurf","mcp_config.json")},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},antigravity:{name:"Antigravity (Google DeepMind)",aliases:["antigravity","agy","gemini"],getConfigPath:(e,t)=>i.join(t,".gemini","config","mcp_config.json"),type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},"pi-desktop":{name:"Pi Desktop / Pi Agent",aliases:["pi-desktop","pi","pi-agent"],getConfigPath:(e,t,r)=>{if(e==="win32"){let p=i.join(r||i.join(t,"AppData","Roaming"),".pi","agent","mcp.json");if(a.existsSync(p))return p;let o=i.join(t,".pi","agent","mcp.json");if(a.existsSync(o))return o;let f=i.join(t,".pi","mcp.json");return a.existsSync(f)?f:o}let s=i.join(t,".pi","agent","mcp.json");if(a.existsSync(s))return s;let n=i.join(t,".pi","mcp.json");return a.existsSync(n)?n:s},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})}};function b(e){return Object.prototype.toString.call(e)==="[object Object]"}function E(e){return e.replace(/\/\*[\s\S]*?\*\//g,"").replace(/(^|[^:])\/\/.*$/gm,"$1").replace(/,\s*([\]}])/g,"$1")}function R(e,t,r,s=!1){let n=e?e.split(/\r?\n/):[];if(s){let l=[],g=!1,v=0,d=!1,S=0;for(let h=0;h<n.length;h++){let y=n[h],w=y.match(/^(\s*)mcp_servers:\s*$/);if(w){g=!0,v=w[1].length,l.push(y);continue}if(g){let k=y.match(/^(\s*)/)?.[1].length||0;if(y.trim()!==""&&k<=v)g=!1,d=!1;else{let P=y.match(/^(\s*)superpowers:\s*$/);if(P&&P[1].length>v){d=!0,S=P[1].length;continue}if(d){if(k>S||y.trim()==="")continue;d=!1}}}l.push(y)}return l.join(`
3
- `)}let p=" ";for(let l of n){let g=l.match(/^(\s+)[a-zA-Z0-9_-]+:/);if(g&&g[1].length>0){p=g[1];break}}let o=JSON.stringify(t),f=JSON.stringify(r),c=[`${p}superpowers:`,`${p}${p}command: ${o}`,`${p}${p}args: ${f}`];if(!e||e.trim()==="")return`mcp_servers:
2
+ "use strict";var O=Object.create;var x=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var H=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty;var L=(t,e)=>{for(var s in e)x(t,s,{get:e[s],enumerable:!0})},$=(t,e,s,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of N(e))!K.call(t,r)&&r!==s&&x(t,r,{get:()=>e[r],enumerable:!(n=T(e,r))||n.enumerable});return t};var b=(t,e,s)=>(s=t!=null?O(H(t)):{},$(e||!t||!t.__esModule?x(s,"default",{value:t,enumerable:!0}):s,t)),W=t=>$(x({},"__esModule",{value:!0}),t);var M={};L(M,{HARNESS_CONFIGS:()=>k,isPlainObject:()=>P,runSetup:()=>q,runSetupCli:()=>_,safeWriteConfig:()=>U,stripJsonComments:()=>D,updateJsonConfig:()=>I,updateYamlConfig:()=>E});module.exports=W(M);var i=b(require("fs")),o=b(require("path")),A=b(require("os")),R=b(require("crypto")),k={copilot:{name:"GitHub Copilot (VS Code)",aliases:["vscode","code","copilot"],getConfigPath:(t,e,s,n)=>t==="win32"?o.join(s||o.join(e,"AppData","Roaming"),"Code","User","mcp.json"):t==="darwin"?o.join(e,"Library","Application Support","Code","User","mcp.json"):o.join(e,".config","Code","User","mcp.json"),type:"json-servers",defaultConfig:(t,e)=>({command:t,args:e,type:"stdio"})},"copilot-insiders":{name:"GitHub Copilot (VS Code Insiders)",aliases:["vscode-insiders","code-insiders","insiders","insider","vscode-insider","code-insider","copilot-insider"],getConfigPath:(t,e,s,n)=>t==="win32"?o.join(s||o.join(e,"AppData","Roaming"),"Code - Insiders","User","mcp.json"):t==="darwin"?o.join(e,"Library","Application Support","Code - Insiders","User","mcp.json"):o.join(e,".config","Code - Insiders","User","mcp.json"),type:"json-servers",defaultConfig:(t,e)=>({command:t,args:e,type:"stdio"})},cursor:{name:"Cursor",aliases:["cursor"],getConfigPath:(t,e)=>o.join(e,".cursor","mcp.json"),type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})},hermes:{name:"Hermes Desktop / Agent",aliases:["hermes","hermes-desktop"],getConfigPath:(t,e,s,n)=>{if(t==="win32"){let r=n||o.join(e,"AppData","Local");return o.join(r,"hermes","config.yaml")}return o.join(e,".hermes","config.yaml")},type:"yaml",defaultConfig:(t,e)=>({command:t,args:e})},kimi:{name:"Kimi Work / Kimi Code",aliases:["kimi","kimi-work","kimi-code"],getConfigPath:(t,e)=>o.join(e,".kimi-code","mcp.json"),type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})},claude:{name:"Claude Desktop",aliases:["claude","claude-desktop"],getConfigPath:(t,e,s)=>t==="win32"?o.join(s||o.join(e,"AppData","Roaming"),"Claude","claude_desktop_config.json"):t==="darwin"?o.join(e,"Library","Application Support","Claude","claude_desktop_config.json"):o.join(e,".config","Claude","claude_desktop_config.json"),type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})},devin:{name:"Devin Desktop (formerly Windsurf)",aliases:["devin","devin-desktop","windsurf","codeium"],getConfigPath:(t,e)=>{let s=o.join(e,".config","devin","mcp_config.json");return i.existsSync(s)?s:o.join(e,".codeium","windsurf","mcp_config.json")},type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})},antigravity:{name:"Antigravity (Google DeepMind)",aliases:["antigravity","agy","gemini"],getConfigPath:(t,e)=>o.join(e,".gemini","config","mcp_config.json"),type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})},"pi-desktop":{name:"Pi Desktop / Pi Agent",aliases:["pi-desktop","pi","pi-agent"],getConfigPath:(t,e,s)=>{if(t==="win32"){let l=o.join(s||o.join(e,"AppData","Roaming"),".pi","agent","mcp.json");if(i.existsSync(l))return l;let a=o.join(e,".pi","agent","mcp.json");if(i.existsSync(a))return a;let g=o.join(e,".pi","mcp.json");return i.existsSync(g)?g:a}let n=o.join(e,".pi","agent","mcp.json");if(i.existsSync(n))return n;let r=o.join(e,".pi","mcp.json");return i.existsSync(r)?r:n},type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})},qwenpaw:{name:"QwenPaw (Personal Agent Workstation)",aliases:["qwenpaw","qwen-paw","copaw"],getConfigPath:(t,e)=>{let s=o.join(e,".qwenpaw","config.json");if(i.existsSync(s))return s;let n=o.join(e,".copaw","config.json");return i.existsSync(n)?n:s},type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})},cline:{name:"Cline (VS Code / CLI)",aliases:["cline","claude-dev"],getConfigPath:(t,e,s)=>{let n="";if(t==="win32"?n=o.join(s||o.join(e,"AppData","Roaming"),"Code","User","globalStorage","saoudrizwan.claude-dev","settings","cline_mcp_settings.json"):t==="darwin"?n=o.join(e,"Library","Application Support","Code","User","globalStorage","saoudrizwan.claude-dev","settings","cline_mcp_settings.json"):n=o.join(e,".config","Code","User","globalStorage","saoudrizwan.claude-dev","settings","cline_mcp_settings.json"),i.existsSync(n))return n;let r=o.join(e,".cline","data","settings","cline_mcp_settings.json");return i.existsSync(r)?r:n},type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})},kilo:{name:"Kilo Code",aliases:["kilo","kilocode","kilo-code"],getConfigPath:(t,e)=>{let s=o.join(e,".config","kilo","kilo.jsonc");if(i.existsSync(s))return s;let n=o.join(e,".config","kilo","kilo.json");return i.existsSync(n)?n:s},type:"json-mcp",defaultConfig:(t,e)=>({type:"local",command:[t,...e],enabled:!0})},qoder:{name:"Qoder",aliases:["qoder"],getConfigPath:(t,e)=>o.join(e,".qoder","settings.json"),type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})},kiro:{name:"Kiro",aliases:["kiro","kiro-code"],getConfigPath:(t,e)=>o.join(e,".kiro","settings","mcp.json"),type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})},trae:{name:"Trae",aliases:["trae"],getConfigPath:(t,e,s)=>{if(t==="win32"){let n=o.join(s||o.join(e,"AppData","Roaming"),"Trae","User","mcp.json");if(i.existsSync(n))return n;let r=o.join(s||o.join(e,"AppData","Roaming"),"Trae CN","User","mcp.json");return i.existsSync(r)?r:n}else if(t==="darwin"){let n=o.join(e,"Library","Application Support","Trae","User","mcp.json");if(i.existsSync(n))return n;let r=o.join(e,"Library","Application Support","Trae CN","User","mcp.json");return i.existsSync(r)?r:n}else{let n=o.join(e,".config","Trae","User","mcp.json");if(i.existsSync(n))return n;let r=o.join(e,".config","Trae CN","User","mcp.json");return i.existsSync(r)?r:n}},type:"json-mcpServers",defaultConfig:(t,e)=>({command:t,args:e})}};function P(t){return Object.prototype.toString.call(t)==="[object Object]"}function D(t){return t.replace(/\/\*[\s\S]*?\*\//g,"").replace(/(^|[^:])\/\/.*$/gm,"$1").replace(/,\s*([\]}])/g,"$1")}function E(t,e,s,n=!1){let r=t?t.split(/\r?\n/):[];if(n){let p=[],f=!1,S=0,m=!1,h=0;for(let w=0;w<r.length;w++){let y=r[w],j=y.match(/^(\s*)mcp_servers:\s*$/);if(j){f=!0,S=j[1].length,p.push(y);continue}if(f){let C=y.match(/^(\s*)/)?.[1].length||0;if(y.trim()!==""&&C<=S)f=!1,m=!1;else{let v=y.match(/^(\s*)superpowers:\s*$/);if(v&&v[1].length>S){m=!0,h=v[1].length;continue}if(m){if(C>h||y.trim()==="")continue;m=!1}}}p.push(y)}return p.join(`
3
+ `)}let l=" ";for(let p of r){let f=p.match(/^(\s+)[a-zA-Z0-9_-]+:/);if(f&&f[1].length>0){l=f[1];break}}let a=JSON.stringify(e),g=JSON.stringify(s),c=[`${l}superpowers:`,`${l}${l}command: ${a}`,`${l}${l}args: ${g}`];if(!t||t.trim()==="")return`mcp_servers:
4
4
  ${c.join(`
5
5
  `)}
6
- `;let m=n.findIndex(l=>/^\s*mcp_servers:\s*$/.test(l));if(m===-1)return`${e.trimEnd()}
6
+ `;let d=r.findIndex(p=>/^\s*mcp_servers:\s*$/.test(p));if(d===-1)return`${t.trimEnd()}
7
7
 
8
8
  mcp_servers:
9
9
  ${c.join(`
10
10
  `)}
11
- `;let u=-1;for(let l=m+1;l<n.length;l++){let g=n[l];if(/^[^\s#]/.test(g))break;if(/^\s+superpowers:\s*$/.test(g)){u=l;break}}if(u!==-1){let l=n[u].match(/^(\s*)/)?.[1].length||2,g=u+1;for(;g<n.length;){let v=n[g];if((v.match(/^(\s*)/)?.[1].length||0)>l||v.trim()==="")g++;else break}return n.splice(u,g-u,...c),n.join(`
12
- `)}else return n.splice(m+1,0,...c),n.join(`
13
- `)}function I(e,t,r,s,n=!1){let p={};if(e&&e.trim()!=="")try{let c=JSON.parse(e);b(c)?p=c:p={}}catch{try{let m=E(e),u=JSON.parse(m);b(u)?p=u:p={}}catch(m){let u=m instanceof Error?m.message:String(m);throw new Error(`Failed to parse existing JSON: ${u}`)}}let o=t==="json-servers"?"servers":"mcpServers";b(p[o])||(p[o]={});let f=p[o];return n?delete f.superpowers:t==="json-servers"?f.superpowers={command:r,args:s,type:"stdio"}:f.superpowers={command:r,args:s},JSON.stringify(p,null,2)+`
14
- `}function O(e,t,r=!1){let s=e;try{let c=a.lstatSync(e,{throwIfNoEntry:!1});if(c&&c.isSymbolicLink())try{s=a.realpathSync(e)}catch{let u=a.readlinkSync(e);s=i.resolve(i.dirname(e),u)}}catch{}let n=i.dirname(s);a.existsSync(n)||a.mkdirSync(n,{recursive:!0,mode:448});let p=384;if(a.existsSync(s)){try{p=a.statSync(s).mode}catch{}if(r){let c=a.readFileSync(s,"utf8"),m=`${s}.${Date.now()}.bak`;try{a.writeFileSync(m,c,{encoding:"utf8",mode:p})}catch(u){let l=u instanceof Error?u.message:String(u);throw new Error(`Failed to create safe backup before write: ${l}`)}}}let o=_.randomBytes(8).toString("hex"),f=i.join(n,`.tmp.${i.basename(s)}.${process.pid}.${o}`);try{a.writeFileSync(f,t,{encoding:"utf8",mode:p,flag:"wx"}),a.renameSync(f,s)}catch(c){try{a.existsSync(f)&&a.unlinkSync(f)}catch{}throw c}}async function N(e={}){let t=e.platform||$.platform(),r=e.homeDir||$.homedir(),s=e.appData||process.env.APPDATA,n=e.localAppData||process.env.LOCALAPPDATA,p=!!e.dryRun,o=!!e.remove,f=!!e.bun,c=e.target?e.target.toLowerCase():null,m=f?"bunx":"npx",u=["-y","superpowers-mcp"],l=[];if(!c)throw new Error(`No target client specified. Please specify which client to configure using --target <${Object.keys(j).join("|")}>.`);let g=Object.keys(j).find(d=>d===c||j[d].aliases.includes(c));if(!g)throw new Error(`Unknown harness target: "${c}". Supported targets: ${Object.keys(j).join(", ")}`);let v=[g];for(let d of v){let S=j[d],h=S.getConfigPath(t,r,s,n),y=a.existsSync(h);if(o&&!y){l.push({target:d,name:S.name,path:h,status:"up-to-date",message:"Already not configured (file does not exist)"});continue}try{let w="";y&&(w=a.readFileSync(h,"utf8"));let k="";if(S.type==="yaml"?k=R(w,m,u,o):k=I(w,S.type,m,u,o),w.trim()===k.trim()&&y){l.push({target:d,name:S.name,path:h,status:"up-to-date",message:o?"Already not configured":"Already configured and up-to-date"});continue}p||O(h,k,!!e.backup),l.push({target:d,name:S.name,path:h,status:o?"removed":y?"updated":"created",message:p?`[Dry Run] Would ${o?"remove from":y?"update":"create"} ${h}`:`Successfully ${o?"removed from":y?"updated":"configured"}!`})}catch(w){let k=w instanceof Error?w.message:String(w);l.push({target:d,name:S.name,path:h,status:"error",message:k})}}return l}async function A(e=process.argv.slice(2)){let t={dryRun:!1,remove:!1,bun:!1,backup:!1,target:null};for(let r=0;r<e.length;r++){let s=e[r];if(!(s==="setup"||s==="--setup"))if(s==="--dry-run")t.dryRun=!0;else if(s==="--remove"||s==="--uninstall")t.remove=!0;else if(s==="--bun")t.bun=!0;else if(s==="--backup")t.backup=!0;else if(s==="--target"||s==="-t"){let n=e[r+1];(!n||n.startsWith("-"))&&(console.error(`\u274C Error: Missing value for --target flag.
15
- `),process.exit(1)),t.target=e[++r]}else if(s.startsWith("--target=")){let n=s.split("=")[1];n||(console.error(`\u274C Error: Missing value for --target flag.
16
- `),process.exit(1)),t.target=n}else if(s==="--help"||s==="-h"){U();return}else!s.startsWith("-")&&!t.target&&s!=="setup"?t.target=s:s.startsWith("-")&&(console.error(`\u274C Error: Unknown option "${s}". Use --help for usage.
11
+ `;let u=-1;for(let p=d+1;p<r.length;p++){let f=r[p];if(/^[^\s#]/.test(f))break;if(/^\s+superpowers:\s*$/.test(f)){u=p;break}}if(u!==-1){let p=r[u].match(/^(\s*)/)?.[1].length||2,f=u+1;for(;f<r.length;){let S=r[f];if((S.match(/^(\s*)/)?.[1].length||0)>p||S.trim()==="")f++;else break}return r.splice(u,f-u,...c),r.join(`
12
+ `)}else return r.splice(d+1,0,...c),r.join(`
13
+ `)}function I(t,e,s,n,r=!1,l){let a={};if(t&&t.trim()!=="")try{let d=JSON.parse(t);P(d)?a=d:a={}}catch{try{let u=D(t),p=JSON.parse(u);P(p)?a=p:a={}}catch(u){let p=u instanceof Error?u.message:String(u);throw new Error(`Failed to parse existing JSON: ${p}`)}}let g="mcpServers";e==="json-servers"?g="servers":e==="json-mcp"&&(g="mcp"),P(a[g])||(a[g]={});let c=a[g];return r?delete c.superpowers:l?c.superpowers=l:e==="json-servers"?c.superpowers={command:s,args:n,type:"stdio"}:e==="json-mcp"?c.superpowers={type:"local",command:[s,...n],enabled:!0}:c.superpowers={command:s,args:n},JSON.stringify(a,null,2)+`
14
+ `}function U(t,e,s=!1){let n=t;try{let c=i.lstatSync(t,{throwIfNoEntry:!1});if(c&&c.isSymbolicLink())try{n=i.realpathSync(t)}catch{let u=i.readlinkSync(t);n=o.resolve(o.dirname(t),u)}}catch{}let r=o.dirname(n);i.existsSync(r)||i.mkdirSync(r,{recursive:!0,mode:448});let l=384;if(i.existsSync(n)){try{l=i.statSync(n).mode}catch{}if(s){let c=i.readFileSync(n,"utf8"),d=`${n}.${Date.now()}.bak`;try{i.writeFileSync(d,c,{encoding:"utf8",mode:l})}catch(u){let p=u instanceof Error?u.message:String(u);throw new Error(`Failed to create safe backup before write: ${p}`)}}}let a=R.randomBytes(8).toString("hex"),g=o.join(r,`.tmp.${o.basename(n)}.${process.pid}.${a}`);try{i.writeFileSync(g,e,{encoding:"utf8",mode:l,flag:"wx"}),i.renameSync(g,n)}catch(c){try{i.existsSync(g)&&i.unlinkSync(g)}catch{}throw c}}async function q(t={}){let e=t.platform||A.platform(),s=t.homeDir||A.homedir(),n=t.appData||process.env.APPDATA,r=t.localAppData||process.env.LOCALAPPDATA,l=!!t.dryRun,a=!!t.remove,g=!!t.bun,c=t.target?t.target.toLowerCase():null,d=g?"bunx":"npx",u=["-y","superpowers-mcp"],p=[];if(!c)throw new Error(`No target client specified. Please specify which client to configure using --target <${Object.keys(k).join("|")}>.`);let f=Object.keys(k).find(m=>m===c||k[m].aliases.includes(c));if(!f)throw new Error(`Unknown harness target: "${c}". Supported targets: ${Object.keys(k).join(", ")}`);let S=[f];for(let m of S){let h=k[m],w=h.getConfigPath(e,s,n,r),y=i.existsSync(w);if(a&&!y){p.push({target:m,name:h.name,path:w,status:"up-to-date",message:"Already not configured (file does not exist)"});continue}try{let j="";y&&(j=i.readFileSync(w,"utf8"));let C="";if(h.type==="yaml")C=E(j,d,u,a);else{let v=typeof h.defaultConfig=="function"?h.defaultConfig(d,u):void 0;C=I(j,h.type,d,u,a,v)}if(j.trim()===C.trim()&&y){p.push({target:m,name:h.name,path:w,status:"up-to-date",message:a?"Already not configured":"Already configured and up-to-date"});continue}l||U(w,C,!!t.backup),p.push({target:m,name:h.name,path:w,status:a?"removed":y?"updated":"created",message:l?`[Dry Run] Would ${a?"remove from":y?"update":"create"} ${w}`:`Successfully ${a?"removed from":y?"updated":"configured"}!`})}catch(j){let C=j instanceof Error?j.message:String(j);p.push({target:m,name:h.name,path:w,status:"error",message:C})}}return p}async function _(t=process.argv.slice(2)){let e={dryRun:!1,remove:!1,bun:!1,backup:!1,target:null};for(let s=0;s<t.length;s++){let n=t[s];if(!(n==="setup"||n==="--setup"))if(n==="--dry-run")e.dryRun=!0;else if(n==="--remove"||n==="--uninstall")e.remove=!0;else if(n==="--bun")e.bun=!0;else if(n==="--backup")e.backup=!0;else if(n==="--target"||n==="-t"){let r=t[s+1];(!r||r.startsWith("-"))&&(console.error(`\u274C Error: Missing value for --target flag.
15
+ `),process.exit(1)),e.target=t[++s]}else if(n.startsWith("--target=")){let r=n.split("=")[1];r||(console.error(`\u274C Error: Missing value for --target flag.
16
+ `),process.exit(1)),e.target=r}else if(n==="--help"||n==="-h"){F();return}else!n.startsWith("-")&&!e.target&&n!=="setup"?e.target=n:n.startsWith("-")&&(console.error(`\u274C Error: Unknown option "${n}". Use --help for usage.
17
17
  `),process.exit(1))}if(console.log(`
18
18
  ========================================================`),console.log("\u26A1 Superpowers MCP - Targeted Client Setup"),console.log(`========================================================
19
- `),!t.target){console.log(`Please select which AI Agent client you would like to configure:
20
- `),console.log(" npx -y superpowers-mcp setup --target antigravity # Antigravity (~/.gemini/config/mcp_config.json)"),console.log(" npx -y superpowers-mcp setup --target pi-desktop # Pi Desktop / Pi Agent (~/.pi/agent/mcp.json)"),console.log(" npx -y superpowers-mcp setup --target cursor # Cursor (~/.cursor/mcp.json)"),console.log(" npx -y superpowers-mcp setup --target copilot # GitHub Copilot (VS Code mcp.json)"),console.log(" npx -y superpowers-mcp setup --target hermes # Hermes Desktop / Agent"),console.log(" npx -y superpowers-mcp setup --target kimi # Kimi Work / Kimi Code"),console.log(" npx -y superpowers-mcp setup --target claude # Claude Desktop"),console.log(` npx -y superpowers-mcp setup --target devin # Devin Desktop (formerly Windsurf)
19
+ `),!e.target){console.log(`Please select which AI Agent client you would like to configure:
20
+ `),console.log(" npx -y superpowers-mcp setup --target antigravity # Antigravity (~/.gemini/config/mcp_config.json)"),console.log(" npx -y superpowers-mcp setup --target pi-desktop # Pi Desktop / Pi Agent (~/.pi/agent/mcp.json)"),console.log(" npx -y superpowers-mcp setup --target cursor # Cursor (~/.cursor/mcp.json)"),console.log(" npx -y superpowers-mcp setup --target copilot # GitHub Copilot (VS Code mcp.json)"),console.log(" npx -y superpowers-mcp setup --target copilot-insiders # GitHub Copilot (VS Code Insiders mcp.json)"),console.log(" npx -y superpowers-mcp setup --target hermes # Hermes Desktop / Agent"),console.log(" npx -y superpowers-mcp setup --target kimi # Kimi Work / Kimi Code"),console.log(" npx -y superpowers-mcp setup --target claude # Claude Desktop"),console.log(" npx -y superpowers-mcp setup --target devin # Devin Desktop (formerly Windsurf)"),console.log(" npx -y superpowers-mcp setup --target qwenpaw # QwenPaw / CoPaw (~/.qwenpaw/config.json)"),console.log(" npx -y superpowers-mcp setup --target cline # Cline (~/.../cline_mcp_settings.json)"),console.log(" npx -y superpowers-mcp setup --target kilo # Kilo Code (~/.config/kilo/kilo.jsonc)"),console.log(" npx -y superpowers-mcp setup --target qoder # Qoder (~/.qoder/settings.json)"),console.log(" npx -y superpowers-mcp setup --target kiro # Kiro (~/.kiro/settings/mcp.json)"),console.log(` npx -y superpowers-mcp setup --target trae # Trae (~/.../Trae/User/mcp.json)
21
21
  `),console.log("\u{1F4A1} Tip:"),console.log(" You can run this setup command from ANY folder on your system."),console.log(` It automatically targets your global config files (~/...) without needing to clone this repo.
22
22
  `),console.log("\u{1F4A1} Privacy & Safety:"),console.log(" Superpowers MCP only configures the specific client you explicitly choose."),console.log(` It will NEVER silently scan or modify unselected environments.
23
- `);return}try{let r=await N(t),s=0,n=0,p=0;for(let o of r){let f=o.status==="created"||o.status==="updated"||o.status==="removed"?"\u2705":o.status==="up-to-date"?"\u2728":o.status==="skipped"?"\u23ED\uFE0F ":"\u274C";console.log(`${f} [${o.name}] (${o.status})`),console.log(` Path: ${o.path}`),console.log(` Info: ${o.message}
24
- `),o.status==="created"||o.status==="updated"||o.status==="up-to-date"||o.status==="removed"?s++:o.status==="skipped"?n++:o.status==="error"&&p++}console.log("--------------------------------------------------------"),p>0&&(console.error(`\u26A0\uFE0F Setup finished with errors: ${p} failure(s), ${s} succeeded.`),process.exit(1)),console.log(`\u{1F389} Setup complete! ${s} environment(s) ready.`)}catch(r){let s=r instanceof Error?r.message:String(r);console.error(`\u274C Setup failed: ${s}
25
- `),process.exit(1)}}function U(){console.log(`
23
+ `);return}try{let s=await q(e),n=0,r=0,l=0;for(let a of s){let g=a.status==="created"||a.status==="updated"||a.status==="removed"?"\u2705":a.status==="up-to-date"?"\u2728":a.status==="skipped"?"\u23ED\uFE0F ":"\u274C";console.log(`${g} [${a.name}] (${a.status})`),console.log(` Path: ${a.path}`),console.log(` Info: ${a.message}
24
+ `),a.status==="created"||a.status==="updated"||a.status==="up-to-date"||a.status==="removed"?n++:a.status==="skipped"?r++:a.status==="error"&&l++}console.log("--------------------------------------------------------"),l>0&&(console.error(`\u26A0\uFE0F Setup finished with errors: ${l} failure(s), ${n} succeeded.`),process.exit(1)),console.log(`\u{1F389} Setup complete! ${n} environment(s) ready.`)}catch(s){let n=s instanceof Error?s.message:String(s);console.error(`\u274C Setup failed: ${n}
25
+ `),process.exit(1)}}function F(){console.log(`
26
26
  Superpowers MCP - Targeted Global Setup
27
27
 
28
28
  Usage:
@@ -31,7 +31,10 @@ Usage:
31
31
  Options:
32
32
  --target, -t <name> Configure specific harness (Required):
33
33
  antigravity (agy, gemini), pi-desktop (pi, pi-agent), cursor,
34
- copilot (vscode), hermes, kimi, claude, devin (windsurf)
34
+ copilot (vscode), copilot-insiders (vscode-insiders, code-insiders, insiders),
35
+ hermes, kimi, claude, devin (windsurf),
36
+ qwenpaw (qwen-paw, copaw), cline (claude-dev), kilo (kilocode),
37
+ qoder, kiro (kiro-code), trae
35
38
  --bun Use "bunx" instead of "npx" in server commands
36
39
  --backup Create a timestamped .bak backup before modifying (Default: false, zero-pollution)
37
40
  --remove Remove superpowers MCP configuration from target
@@ -43,10 +46,17 @@ Examples:
43
46
  npx -y superpowers-mcp setup --target pi-desktop # Configure Pi Desktop / Pi Agent only
44
47
  npx -y superpowers-mcp setup --target cursor # Configure Cursor only
45
48
  npx -y superpowers-mcp setup --target copilot # Configure GitHub Copilot (VS Code) only
49
+ npx -y superpowers-mcp setup --target copilot-insiders # Configure GitHub Copilot (VS Code Insiders) only
46
50
  npx -y superpowers-mcp setup --target hermes # Configure Hermes Desktop only
47
51
  npx -y superpowers-mcp setup --target kimi # Configure Kimi Work only
48
52
  npx -y superpowers-mcp setup --target claude # Configure Claude Desktop only
49
53
  npx -y superpowers-mcp setup --target devin # Configure Devin Desktop (Windsurf) only
54
+ npx -y superpowers-mcp setup --target qwenpaw # Configure QwenPaw only
55
+ npx -y superpowers-mcp setup --target cline # Configure Cline only
56
+ npx -y superpowers-mcp setup --target kilo # Configure Kilo Code only
57
+ npx -y superpowers-mcp setup --target qoder # Configure Qoder only
58
+ npx -y superpowers-mcp setup --target kiro # Configure Kiro only
59
+ npx -y superpowers-mcp setup --target trae # Configure Trae only
50
60
 
51
61
  Any Directory:
52
62
  You can run this command from ANY directory on your machine.
@@ -55,4 +65,4 @@ Any Directory:
55
65
  Privacy & Safety:
56
66
  Superpowers MCP only touches the client you explicitly choose.
57
67
  It never bulk-modifies your environment without your consent.
58
- `)}A().catch(e=>{let t=e instanceof Error?e.message:String(e);console.error(`\u274C Fatal error: ${t}`),process.exit(1)});0&&(module.exports={HARNESS_CONFIGS,isPlainObject,runSetup,runSetupCli,safeWriteConfig,stripJsonComments,updateJsonConfig,updateYamlConfig});
68
+ `)}_().catch(t=>{let e=t instanceof Error?t.message:String(t);console.error(`\u274C Fatal error: ${e}`),process.exit(1)});0&&(module.exports={HARNESS_CONFIGS,isPlainObject,runSetup,runSetupCli,safeWriteConfig,stripJsonComments,updateJsonConfig,updateYamlConfig});
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "superpowers-mcp",
3
3
  "displayName": "Superpowers MCP",
4
4
  "description": "Superpowers skills library (TDD, debugging, collaboration workflows) as an MCP server for VSCode and Antigravity",
5
- "version": "6.3.4",
5
+ "version": "6.3.5",
6
6
  "publisher": "superpowers",
7
7
  "license": "MIT",
8
8
  "repository": {
@@ -3,7 +3,7 @@
3
3
  # Superpowers MCP - One-Click Global Installer (macOS & Linux)
4
4
  # Usage:
5
5
  # curl -fsSL https://raw.githubusercontent.com/Poseidoncode/superpowers-mcp/main/scripts/install.sh | bash -s -- --target <client>
6
- # ./scripts/install.sh --target <antigravity|pi-desktop|cursor|copilot|hermes|kimi|claude|devin>
6
+ # ./scripts/install.sh --target <antigravity|pi-desktop|cursor|copilot|copilot-insiders|hermes|kimi|claude|devin|qwenpaw|cline|kilo|qoder|kiro|trae>
7
7
  # ==============================================================================
8
8
 
9
9
  set -euo pipefail