superpowers-mcp 6.3.10 → 6.4.2

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.
Files changed (56) hide show
  1. package/README.ja.md +34 -33
  2. package/README.ko.md +34 -33
  3. package/README.md +34 -33
  4. package/README.zh-TW.md +34 -33
  5. package/docs/skill-compositions.ja.md +6 -2
  6. package/docs/skill-compositions.ko.md +6 -2
  7. package/docs/skill-compositions.md +5 -1
  8. package/docs/skill-compositions.zh-TW.md +6 -2
  9. package/out/server.js +66 -64
  10. package/out/setup-runner.js +17 -16
  11. package/out/setup.js +17 -16
  12. package/package.json +2 -2
  13. package/scripts/copy-skills.js +101 -26
  14. package/scripts/setup.js +99 -6
  15. package/scripts/upstream-drift.js +40 -5
  16. package/skills/brainstorming/visual-companion.md +6 -6
  17. package/skills/diagnosing-superpowers/SKILL.md +120 -0
  18. package/skills/diagnosing-superpowers/prompts/analyst-common.md +38 -0
  19. package/skills/diagnosing-superpowers/prompts/cost-and-time.md +28 -0
  20. package/skills/diagnosing-superpowers/prompts/plan-adherence.md +29 -0
  21. package/skills/diagnosing-superpowers/prompts/quality-evidence.md +26 -0
  22. package/skills/diagnosing-superpowers/prompts/repeated-work.md +30 -0
  23. package/skills/diagnosing-superpowers/prompts/request-conflicts.md +20 -0
  24. package/skills/diagnosing-superpowers/prompts/scrub-audit.md +33 -0
  25. package/skills/diagnosing-superpowers/prompts/scrub.md +29 -0
  26. package/skills/diagnosing-superpowers/prompts/similar-session.md +38 -0
  27. package/skills/diagnosing-superpowers/prompts/skill-timeline.md +30 -0
  28. package/skills/diagnosing-superpowers/prompts/stumbles.md +28 -0
  29. package/skills/diagnosing-superpowers/references/context-safety.md +22 -0
  30. package/skills/diagnosing-superpowers/references/github-issues.md +47 -0
  31. package/skills/diagnosing-superpowers/references/redaction-policy.md +34 -0
  32. package/skills/diagnosing-superpowers/references/session-discovery.md +31 -0
  33. package/skills/diagnosing-superpowers/templates/bundle-README.md +77 -0
  34. package/skills/diagnosing-superpowers/templates/case.md +64 -0
  35. package/skills/diagnosing-superpowers/templates/issue.md +51 -0
  36. package/skills/diagnosing-superpowers/templates/report.md +82 -0
  37. package/skills/executing-plans/SKILL.md +405 -58
  38. package/skills/executing-plans/scripts/task-done +55 -0
  39. package/skills/executing-plans/scripts/task-done.ps1 +83 -0
  40. package/skills/executing-plans/scripts/task-start +30 -0
  41. package/skills/executing-plans/scripts/task-start.ps1 +38 -0
  42. package/skills/requesting-code-review/code-reviewer.md +18 -1
  43. package/skills/subagent-driven-development/SKILL.md +31 -26
  44. package/skills/subagent-driven-development/re-review-prompt.md +1 -1
  45. package/skills/subagent-driven-development/scripts/review-package +4 -0
  46. package/skills/subagent-driven-development/scripts/review-package.ps1 +2 -0
  47. package/skills/subagent-driven-development/scripts/sdd-workspace +9 -5
  48. package/skills/subagent-driven-development/scripts/sdd-workspace.ps1 +10 -0
  49. package/skills/subagent-driven-development/scripts/task-brief +2 -0
  50. package/skills/subagent-driven-development/task-reviewer-prompt.md +2 -2
  51. package/skills/systematic-debugging/root-cause-tracing.md +1 -1
  52. package/skills/using-superpowers/SKILL.md +2 -0
  53. package/skills/using-superpowers/references/claude-code-tools.md +29 -0
  54. package/skills/using-superpowers/references/muse-tools.md +35 -0
  55. package/skills/writing-plans/SKILL.md +23 -12
  56. package/skills/writing-skills/SKILL.md +4 -2
@@ -1,20 +1,21 @@
1
- "use strict";var q=Object.create;var A=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var H=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty;var F=(e,t)=>{for(var r in t)A(e,r,{get:t[r],enumerable:!0})},R=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of M(t))!K.call(e,s)&&s!==r&&A(e,s,{get:()=>t[s],enumerable:!(o=J(t,s))||o.enumerable});return e};var _=(e,t,r)=>(r=e!=null?q(H(e)):{},R(t||!e||!e.__esModule?A(r,"default",{value:e,enumerable:!0}):r,e)),V=e=>R(A({},"__esModule",{value:!0}),e);var Q={};F(Q,{HARNESS_CONFIGS:()=>b,JSON_SERVER_ROOT_KEYS:()=>W,isPlainObject:()=>P,runSetup:()=>U,runSetupCli:()=>G,safeWriteConfig:()=>N,stripJsonComments:()=>I,updateJsonConfig:()=>T,updateYamlConfig:()=>O});module.exports=V(Q);var i=_(require("fs")),n=_(require("path")),x=_(require("os")),D=_(require("crypto")),b={lmstudio:{name:"LM Studio",aliases:["lmstudio","lm-studio"],getConfigPath:(e,t)=>n.join(t,".lmstudio","mcp.json"),type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},roo:{name:"Roo Code (VS Code Desktop)",aliases:["roo","roo-code","roocode"],getConfigPath:(e,t,r)=>{let o=e==="win32"?r||n.join(t,"AppData","Roaming"):e==="darwin"?n.join(t,"Library","Application Support"):n.join(t,".config");return n.join(o,"Code","User","globalStorage","rooveterinaryinc.roo-cline","settings","mcp_settings.json")},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},copilot:{name:"GitHub Copilot (VS Code)",aliases:["vscode","code","copilot"],getConfigPath:(e,t,r,o)=>e==="win32"?n.join(r||n.join(t,"AppData","Roaming"),"Code","User","mcp.json"):e==="darwin"?n.join(t,"Library","Application Support","Code","User","mcp.json"):n.join(t,".config","Code","User","mcp.json"),type:"json-servers",defaultConfig:(e,t)=>({command:e,args:t,type:"stdio"})},"copilot-insiders":{name:"GitHub Copilot (VS Code Insiders)",aliases:["vscode-insiders","code-insiders","insiders","insider","vscode-insider","code-insider","copilot-insider"],getConfigPath:(e,t,r,o)=>e==="win32"?n.join(r||n.join(t,"AppData","Roaming"),"Code - Insiders","User","mcp.json"):e==="darwin"?n.join(t,"Library","Application Support","Code - Insiders","User","mcp.json"):n.join(t,".config","Code - Insiders","User","mcp.json"),type:"json-servers",defaultConfig:(e,t)=>({command:e,args:t,type:"stdio"})},cursor:{name:"Cursor",aliases:["cursor"],getConfigPath:(e,t)=>n.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,o)=>{if(e==="win32"){let s=o||n.join(t,"AppData","Local");return n.join(s,"hermes","config.yaml")}return n.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)=>n.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"?n.join(r||n.join(t,"AppData","Roaming"),"Claude","claude_desktop_config.json"):e==="darwin"?n.join(t,"Library","Application Support","Claude","claude_desktop_config.json"):n.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=n.join(t,".config","devin","mcp_config.json");return i.existsSync(r)?r:n.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)=>n.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 a=n.join(r||n.join(t,"AppData","Roaming"),".pi","agent","mcp.json");if(i.existsSync(a))return a;let c=n.join(t,".pi","agent","mcp.json");if(i.existsSync(c))return c;let g=n.join(t,".pi","mcp.json");return i.existsSync(g)?g:c}let o=n.join(t,".pi","agent","mcp.json");if(i.existsSync(o))return o;let s=n.join(t,".pi","mcp.json");return i.existsSync(s)?s:o},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},qwenpaw:{name:"QwenPaw (Personal Agent Workstation)",aliases:["qwenpaw","qwen-paw","copaw"],getConfigPath:(e,t)=>{let r=n.join(t,".qwenpaw","config.json");if(i.existsSync(r))return r;let o=n.join(t,".copaw","config.json");return i.existsSync(o)?o:r},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},cline:{name:"Cline (VS Code / CLI)",aliases:["cline","claude-dev"],getConfigPath:(e,t,r)=>{let o="";if(e==="win32"?o=n.join(r||n.join(t,"AppData","Roaming"),"Code","User","globalStorage","saoudrizwan.claude-dev","settings","cline_mcp_settings.json"):e==="darwin"?o=n.join(t,"Library","Application Support","Code","User","globalStorage","saoudrizwan.claude-dev","settings","cline_mcp_settings.json"):o=n.join(t,".config","Code","User","globalStorage","saoudrizwan.claude-dev","settings","cline_mcp_settings.json"),i.existsSync(o))return o;let s=n.join(t,".cline","data","settings","cline_mcp_settings.json");return i.existsSync(s)?s:o},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},kilo:{name:"Kilo Code",aliases:["kilo","kilocode","kilo-code"],getConfigPath:(e,t)=>{let r=n.join(t,".config","kilo","kilo.jsonc");if(i.existsSync(r))return r;let o=n.join(t,".config","kilo","kilo.json");return i.existsSync(o)?o:r},type:"json-mcp",defaultConfig:(e,t)=>({type:"local",command:[e,...t],enabled:!0})},qoder:{name:"Qoder",aliases:["qoder"],getConfigPath:(e,t)=>n.join(t,".qoder","settings.json"),type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},kiro:{name:"Kiro",aliases:["kiro","kiro-code"],getConfigPath:(e,t)=>n.join(t,".kiro","settings","mcp.json"),type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},trae:{name:"Trae",aliases:["trae"],getConfigPath:(e,t,r)=>{if(e==="win32"){let o=n.join(r||n.join(t,"AppData","Roaming"),"Trae","User","mcp.json");if(i.existsSync(o))return o;let s=n.join(r||n.join(t,"AppData","Roaming"),"Trae CN","User","mcp.json");return i.existsSync(s)?s:o}else if(e==="darwin"){let o=n.join(t,"Library","Application Support","Trae","User","mcp.json");if(i.existsSync(o))return o;let s=n.join(t,"Library","Application Support","Trae CN","User","mcp.json");return i.existsSync(s)?s:o}else{let o=n.join(t,".config","Trae","User","mcp.json");if(i.existsSync(o))return o;let s=n.join(t,".config","Trae CN","User","mcp.json");return i.existsSync(s)?s:o}},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})}},W=["mcpServers","servers","mcp"];function P(e){return Object.prototype.toString.call(e)==="[object Object]"}function I(e,t=!1){if(!e)return"";if(!t)try{return JSON.parse(e),e}catch{}let r=e.length,o=[],s=!1,a=!1,c=!1,g=!1,h=-1;for(let f=0;f<r;f++){let p=e[f],d=f+1<r?e[f+1]:"";if(c){(p===`
2
- `||p==="\r")&&(c=!1,o.push(p));continue}if(g){p==="*"&&d==="/"&&(g=!1,f++);continue}if(s){o.push(p),a?a=!1:p==="\\"?a=!0:p==='"'&&(s=!1);continue}if(p==='"'){s=!0,a=!1,h=-1,o.push(p);continue}if(p==="/"&&d==="/"){c=!0,f++;continue}if(p==="/"&&d==="*"){g=!0,f++;continue}if(p===","){h=o.length,o.push(p);continue}if(p==="}"||p==="]"){h!==-1&&(o[h]=" ",h=-1),o.push(p);continue}p!==" "&&p!==" "&&p!==`
3
- `&&p!=="\r"&&(h=-1),o.push(p)}return o.join("")}var $=/\s/;function z(e){for(let t=1;t<e.length;t++){if(e[t]!=="#"||!$.test(e[t-1]))continue;let r=t-1;for(;r>0&&$.test(e[r-1]);)r--;return e.slice(r)}return""}function O(e,t,r,o=!1){let s=e?e.split(/\r?\n/):[],a=s.map((u,w)=>{let C=u.match(/^(\s*)mcp_servers:/);return C?{index:w,indent:C[1],tail:u.slice(C[0].length).trim()}:null}).filter(u=>u!==null);if(a.length>1)throw new Error("Cannot safely update YAML with duplicate mcp_servers keys");if(a.length===1){let u=a[0];if(u.indent!==""||u.tail!==""&&!u.tail.startsWith("#"))throw new Error("Cannot safely update YAML unless mcp_servers is a root-level block mapping")}let c=" ";if(a.length===1)for(let u=a[0].index+1;u<s.length;u++){if(s[u].trim()===""||s[u].trimStart().startsWith("#"))continue;if(/^[^\s]/.test(s[u]))break;let w=s[u].match(/^(\s+)\S/);w&&(c=w[1]);break}if(o){let u=[],w=!1,C=0,y=!1,S=0;for(let j=0;j<s.length;j++){let l=s[j],m=l.match(/^(\s*)mcp_servers:\s*(?:#.*)?$/);if(m){w=!0,C=m[1].length,u.push(l);continue}if(w){let v=l.match(/^(\s*)/)?.[1].length||0;if(l.trimStart().startsWith("#")){u.push(l);continue}if(l.trim()!==""&&v<=C)w=!1,y=!1;else{let k=l.match(/^(\s*)superpowers:\s*(?:#.*)?$/);if(k&&k[1]===c){y=!0,S=k[1].length;continue}if(y){if(v>S||l.trim()==="")continue;y=!1}}}u.push(l)}return u.join(`
4
- `)}let g=JSON.stringify(t),h=JSON.stringify(r),f=[`${c}superpowers:`,`${c}${c}command: ${g}`,`${c}${c}args: ${h}`];if(!e||e.trim()==="")return`mcp_servers:
5
- ${f.join(`
1
+ "use strict";var M=Object.create;var E=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var H=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,V=Object.prototype.hasOwnProperty;var F=(e,t)=>{for(var r in t)E(e,r,{get:t[r],enumerable:!0})},$=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of H(t))!V.call(e,s)&&s!==r&&E(e,s,{get:()=>t[s],enumerable:!(o=q(t,s))||o.enumerable});return e};var _=(e,t,r)=>(r=e!=null?M(K(e)):{},$(t||!e||!e.__esModule?E(r,"default",{value:e,enumerable:!0}):r,e)),z=e=>$(E({},"__esModule",{value:!0}),e);var X={};F(X,{HARNESS_CONFIGS:()=>b,JSON_SERVER_ROOT_KEYS:()=>O,isPlainObject:()=>P,runSetup:()=>J,runSetupCli:()=>Q,safeWriteConfig:()=>U,stripJsonComments:()=>I,updateJsonConfig:()=>T,updateYamlConfig:()=>N});module.exports=z(X);var a=_(require("fs")),n=_(require("path")),k=_(require("os")),D=_(require("crypto")),b={lmstudio:{name:"LM Studio",aliases:["lmstudio","lm-studio"],getConfigPath:(e,t)=>n.join(t,".lmstudio","mcp.json"),type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},roo:{name:"Roo Code (VS Code Desktop)",aliases:["roo","roo-code","roocode"],getConfigPath:(e,t,r)=>{let o=e==="win32"?r||n.join(t,"AppData","Roaming"):e==="darwin"?n.join(t,"Library","Application Support"):n.join(t,".config");return n.join(o,"Code","User","globalStorage","rooveterinaryinc.roo-cline","settings","mcp_settings.json")},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},copilot:{name:"GitHub Copilot (VS Code)",aliases:["vscode","code","copilot"],getConfigPath:(e,t,r,o)=>e==="win32"?n.join(r||n.join(t,"AppData","Roaming"),"Code","User","mcp.json"):e==="darwin"?n.join(t,"Library","Application Support","Code","User","mcp.json"):n.join(t,".config","Code","User","mcp.json"),type:"json-servers",defaultConfig:(e,t)=>({command:e,args:t,type:"stdio"})},"copilot-insiders":{name:"GitHub Copilot (VS Code Insiders)",aliases:["vscode-insiders","code-insiders","insiders","insider","vscode-insider","code-insider","copilot-insider"],getConfigPath:(e,t,r,o)=>e==="win32"?n.join(r||n.join(t,"AppData","Roaming"),"Code - Insiders","User","mcp.json"):e==="darwin"?n.join(t,"Library","Application Support","Code - Insiders","User","mcp.json"):n.join(t,".config","Code - Insiders","User","mcp.json"),type:"json-servers",defaultConfig:(e,t)=>({command:e,args:t,type:"stdio"})},cursor:{name:"Cursor",aliases:["cursor"],getConfigPath:(e,t)=>n.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,o)=>{if(e==="win32"){let s=o||n.join(t,"AppData","Local");return n.join(s,"hermes","config.yaml")}return n.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)=>n.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"?n.join(r||n.join(t,"AppData","Roaming"),"Claude","claude_desktop_config.json"):e==="darwin"?n.join(t,"Library","Application Support","Claude","claude_desktop_config.json"):n.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,r)=>{let o=e==="win32"&&r?r:n.join(t,".config"),s=n.join(o,"devin","mcp_config.json");return a.existsSync(s)?s:n.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)=>n.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 c=n.join(r||n.join(t,"AppData","Roaming"),".pi","agent","mcp.json");if(a.existsSync(c))return c;let i=n.join(t,".pi","agent","mcp.json");if(a.existsSync(i))return i;let p=n.join(t,".pi","mcp.json");return a.existsSync(p)?p:i}let o=n.join(t,".pi","agent","mcp.json");if(a.existsSync(o))return o;let s=n.join(t,".pi","mcp.json");return a.existsSync(s)?s:o},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},qwenpaw:{name:"QwenPaw (Personal Agent Workstation)",aliases:["qwenpaw","qwen-paw","copaw"],getConfigPath:(e,t)=>{let r=n.join(t,".qwenpaw","config.json");if(a.existsSync(r))return r;let o=n.join(t,".copaw","config.json");return a.existsSync(o)?o:r},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},cline:{name:"Cline (VS Code / CLI)",aliases:["cline","claude-dev"],getConfigPath:(e,t,r)=>{let o="";if(e==="win32"?o=n.join(r||n.join(t,"AppData","Roaming"),"Code","User","globalStorage","saoudrizwan.claude-dev","settings","cline_mcp_settings.json"):e==="darwin"?o=n.join(t,"Library","Application Support","Code","User","globalStorage","saoudrizwan.claude-dev","settings","cline_mcp_settings.json"):o=n.join(t,".config","Code","User","globalStorage","saoudrizwan.claude-dev","settings","cline_mcp_settings.json"),a.existsSync(o))return o;let s=n.join(t,".cline","data","settings","cline_mcp_settings.json");return a.existsSync(s)?s:o},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},kilo:{name:"Kilo Code",aliases:["kilo","kilocode","kilo-code"],getConfigPath:(e,t)=>{let r=n.join(t,".config","kilo","kilo.jsonc");if(a.existsSync(r))return r;let o=n.join(t,".config","kilo","kilo.json");return a.existsSync(o)?o:r},type:"json-mcp",defaultConfig:(e,t)=>({type:"local",command:[e,...t],enabled:!0})},qoder:{name:"Qoder",aliases:["qoder"],getConfigPath:(e,t)=>n.join(t,".qoder","settings.json"),type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},kiro:{name:"Kiro",aliases:["kiro","kiro-code"],getConfigPath:(e,t)=>n.join(t,".kiro","settings","mcp.json"),type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},trae:{name:"Trae",aliases:["trae"],getConfigPath:(e,t,r)=>{if(e==="win32"){let o=n.join(r||n.join(t,"AppData","Roaming"),"Trae","User","mcp.json");if(a.existsSync(o))return o;let s=n.join(r||n.join(t,"AppData","Roaming"),"Trae CN","User","mcp.json");return a.existsSync(s)?s:o}else if(e==="darwin"){let o=n.join(t,"Library","Application Support","Trae","User","mcp.json");if(a.existsSync(o))return o;let s=n.join(t,"Library","Application Support","Trae CN","User","mcp.json");return a.existsSync(s)?s:o}else{let o=n.join(t,".config","Trae","User","mcp.json");if(a.existsSync(o))return o;let s=n.join(t,".config","Trae CN","User","mcp.json");return a.existsSync(s)?s:o}},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})}},O=["mcpServers","servers","mcp"];function P(e){return Object.prototype.toString.call(e)==="[object Object]"}function I(e,t=!1){if(!e)return"";if(!t)try{return JSON.parse(e),e}catch{}let r=e.length,o=[],s=!1,c=!1,i=!1,p=!1,S=-1;for(let m=0;m<r;m++){let g=e[m],C=m+1<r?e[m+1]:"";if(i){(g===`
2
+ `||g==="\r")&&(i=!1,o.push(g));continue}if(p){g==="*"&&C==="/"&&(p=!1,m++);continue}if(s){o.push(g),c?c=!1:g==="\\"?c=!0:g==='"'&&(s=!1);continue}if(g==='"'){s=!0,c=!1,S=-1,o.push(g);continue}if(g==="/"&&C==="/"){i=!0,m++;continue}if(g==="/"&&C==="*"){p=!0,m++;continue}if(g===","){S=o.length,o.push(g);continue}if(g==="}"||g==="]"){S!==-1&&(o[S]=" ",S=-1),o.push(g);continue}g!==" "&&g!==" "&&g!==`
3
+ `&&g!=="\r"&&(S=-1),o.push(g)}return o.join("")}var W=/\s/;function G(e){for(let t=1;t<e.length;t++){if(e[t]!=="#"||!W.test(e[t-1]))continue;let r=t-1;for(;r>0&&W.test(e[r-1]);)r--;return e.slice(r)}return""}function N(e,t,r,o=!1){let s=e?e.split(/\r?\n/):[],c=s.map((l,d)=>{let y=l.match(/^(\s*)mcp_servers:/);return y?{index:d,indent:y[1],tail:l.slice(y[0].length).trim()}:null}).filter(l=>l!==null),i=c.filter(l=>l.indent==="");if(i.length>1)throw new Error("Cannot safely update YAML with duplicate mcp_servers keys");if(i.length===1){let l=i[0];if(l.tail!==""&&!l.tail.startsWith("#"))throw new Error("Cannot safely update YAML unless mcp_servers is a root-level block mapping")}else if(c.length>0)throw new Error("Cannot safely update YAML unless mcp_servers is a root-level block mapping");let p=" ";if(i.length===1)for(let l=i[0].index+1;l<s.length;l++){if(s[l].trim()===""||s[l].trimStart().startsWith("#"))continue;if(/^[^\s]/.test(s[l]))break;let d=s[l].match(/^(\s+)\S/);d&&(p=d[1]);break}if(o){let l=[],d=!1,y=0,j=!1,w=0;for(let f=0;f<s.length;f++){let u=s[f],v=u.match(/^(\s*)mcp_servers:\s*(?:#.*)?$/);if(v){d=!0,y=v[1].length,l.push(u);continue}if(d){let x=u.match(/^(\s*)/)?.[1].length||0;if(u.trimStart().startsWith("#")){l.push(u);continue}if(u.trim()!==""&&x<=y)d=!1,j=!1;else{let A=u.match(/^(\s*)superpowers:\s*(?:#.*)?$/);if(A&&A[1]===p){j=!0,w=A[1].length;continue}if(j){if(x>w||u.trim()==="")continue;j=!1}}}l.push(u)}return l.join(`
4
+ `)}let S=JSON.stringify(t),m=JSON.stringify(r),g=[`${p}superpowers:`,`${p}${p}command: ${S}`,`${p}${p}args: ${m}`];if(!e||e.trim()==="")return`mcp_servers:
5
+ ${g.join(`
6
6
  `)}
7
- `;let p=a.length===1?a[0].index:-1;if(p===-1)return`${e.trimEnd()}
7
+ `;let C=i.length===1?i[0].index:-1;if(C===-1)return`${e.trimEnd()}
8
8
 
9
9
  mcp_servers:
10
- ${f.join(`
10
+ ${g.join(`
11
11
  `)}
12
- `;let d=-1;for(let u=p+1;u<s.length;u++){let w=s[u];if(/^[^\s#]/.test(w))break;if((w.match(/^(\s*)/)?.[1]||"")===c&&/^\s+["']?superpowers["']?\s*:\s*(?:#.*)?$/.test(w)){d=u;break}}if(d!==-1){let u=s[d].match(/^(\s*)/)?.[1].length||2,w=d+1;for(;w<s.length;){let S=s[w];if((S.match(/^(\s*)/)?.[1].length||0)>u||S.trim()==="")w++;else break}let C=[],y=-1;for(let S=d+1;S<w;S++){let j=s[S];if(j.trim()==="")continue;let l=j.match(/^(\s*)/)?.[1].length??0;if(!(y!==-1&&l>y)){if(y=-1,l>u&&/^\s*["']?(?:command|args)["']?\s*:/.test(j)){y=l;continue}C.push(j)}}return f[0]+=z(s[d]),s.splice(d,w-d,...f,...C),s.join(`
13
- `)}else return s.splice(p+1,0,...f),s.join(`
14
- `)}function T(e,t,r,o,s=!1,a){let c={};if(e&&e.trim()!=="")try{let p=JSON.parse(e);if(!P(p))throw new Error("Existing JSON root must be an object");c=p}catch{try{let d=I(e,!0),u=JSON.parse(d);if(!P(u))throw new Error("Existing JSON root must be an object");c=u}catch(d){let u=d instanceof Error?d.message:String(d);throw new Error(`Failed to parse existing JSON: ${u}`)}}let g=t==="json-servers"?"servers":t==="json-mcp"?"mcp":"mcpServers",h=W.find(p=>P(c[p])&&c[p].superpowers!==void 0)??g;if(c[h]!==void 0&&!P(c[h]))throw new Error(`Existing JSON field "${h}" must be an object`);c[h]===void 0&&(c[h]={});let f=c[h];if(s)delete f.superpowers;else{let p;a?p={...a}:t==="json-servers"?p={command:r,args:o,type:"stdio"}:t==="json-mcp"?p={type:"local",command:[r,...o],enabled:!0}:p={command:r,args:o};let d=f.superpowers;if(!P(d))f.superpowers=p;else{let u={...d,...p};(d.enabled!==void 0||d.disabled!==void 0)&&(d.enabled!==void 0?u.enabled=d.enabled:delete u.enabled),t==="json-mcp"&&Array.isArray(u.command)&&delete u.args,f.superpowers=u}}return JSON.stringify(c,null,2)+`
15
- `}function N(e,t,r=!1,o=[],s){if(o.length===0)throw new Error("safeWriteConfig requires at least one allowed destination root");let a=e;try{let l=i.lstatSync(e,{throwIfNoEntry:!1});if(l&&l.isSymbolicLink()){try{a=i.realpathSync(e)}catch{let L=i.readlinkSync(e);a=n.resolve(n.dirname(e),L)}let m=n.normalize(n.resolve(a)).toLowerCase(),v=n.normalize(n.resolve(x.tmpdir())).toLowerCase();if(!(m===v||m.startsWith(v+n.sep))&&(["/etc","/bin","/sbin","/usr","/root","/sys","/proc","/dev","/private/etc","c:\\windows"].some(E=>m===E||m.startsWith(E+n.sep))||m==="/var"||m.startsWith("/var"+n.sep)&&!m.startsWith("/var/folders"+n.sep)||m==="/private/var"||m.startsWith("/private/var"+n.sep)&&!m.startsWith("/private/var/folders"+n.sep)))throw new Error(`Refusing to write to unsafe symlink target: ${a}`)}}catch(l){if(l instanceof Error&&l.message.includes("Refusing to write to unsafe symlink target"))throw l}let c=n.dirname(a);i.existsSync(c)||i.mkdirSync(c,{recursive:!0,mode:448});let g=i.realpathSync(c),h=i.statSync(g);a=n.join(g,n.basename(a));let f=n.normalize(n.resolve(a)).toLowerCase(),p=n.normalize(n.resolve(x.tmpdir())).toLowerCase(),d=f===p||f.startsWith(p+n.sep),w=["/etc","/bin","/sbin","/usr","/root","/sys","/proc","/dev","/private/etc","c:\\windows"].some(l=>f===l||f.startsWith(l+n.sep))||f==="/var"||f.startsWith("/var"+n.sep)&&!f.startsWith("/var/folders"+n.sep)||f==="/private/var"||f.startsWith("/private/var"+n.sep)&&!f.startsWith("/private/var/folders"+n.sep);if(!d&&w)throw new Error(`Refusing to write to unsafe configuration target: ${a}`);if(!o.some(l=>{if(!l)return!1;let m=n.resolve(l);try{m=i.realpathSync(m)}catch{}let v=n.relative(m,a);return v!==".."&&!v.startsWith(`..${n.sep}`)&&!n.isAbsolute(v)}))throw new Error(`Refusing to write configuration outside allowed roots: ${a}`);let y=384;if(i.existsSync(a)){try{y=i.statSync(a).mode}catch{}if(r){let l=i.readFileSync(a,"utf8"),m=`${a}.${Date.now()}.bak`;try{i.writeFileSync(m,l,{encoding:"utf8",mode:y})}catch(v){let k=v instanceof Error?v.message:String(v);throw new Error(`Failed to create safe backup before write: ${k}`)}}}let S=D.randomBytes(8).toString("hex"),j=n.join(g,`.tmp.${n.basename(a)}.${process.pid}.${S}`);try{i.writeFileSync(j,t,{encoding:"utf8",mode:y,flag:"wx"});let l=i.existsSync(a);if(s===null&&l)throw new Error("Configuration changed concurrently before it could be created");if(s!=null&&(!l||i.readFileSync(a,"utf8")!==s))throw new Error("Configuration changed concurrently; refusing to overwrite newer content");let m=i.realpathSync(c),v=i.statSync(m);if(m!==g||v.dev!==h.dev||v.ino!==h.ino)throw new Error("Configuration directory changed while writing");i.renameSync(j,a)}catch(l){try{i.existsSync(j)&&i.unlinkSync(j)}catch{}throw l}}async function U(e={}){let t=e.platform||x.platform(),r=e.homeDir||x.homedir(),o=e.appData||process.env.APPDATA,s=e.localAppData||process.env.LOCALAPPDATA,a=!!e.dryRun,c=!!e.remove,g=!!e.bun,h=e.target?e.target.toLowerCase():null,f=g?"bunx":"npx",p=["-y","superpowers-mcp"],d=[];if(!h)throw new Error(`No target client specified. Please specify which client to configure using --target <${Object.keys(b).join("|")}>.`);let u=Object.keys(b).find(C=>C===h||b[C].aliases.includes(h));if(!u)throw new Error(`Unknown harness target: "${h}". Supported targets: ${Object.keys(b).join(", ")}`);let w=[u];for(let C of w){let y=b[C],S=y.getConfigPath(t,r,o,s),j=i.existsSync(S);if(c&&!j){d.push({target:C,name:y.name,path:S,status:"up-to-date",message:"Already not configured (file does not exist)"});continue}try{let l="";j&&(l=i.readFileSync(S,"utf8"));let m="";if(y.type==="yaml")m=O(l,f,p,c);else{let v=typeof y.defaultConfig=="function"?y.defaultConfig(f,p):void 0;m=T(l,y.type,f,p,c,v)}if(l.trim()===m.trim()&&j){d.push({target:C,name:y.name,path:S,status:"up-to-date",message:c?"Already not configured":"Already configured and up-to-date"});continue}a||N(S,m,!!e.backup,[r,o||"",s||""],j?l:null),d.push({target:C,name:y.name,path:S,status:c?"removed":j?"updated":"created",message:a?`[Dry Run] Would ${c?"remove from":j?"update":"create"} ${S}`:`Successfully ${c?"removed from":j?"updated":"configured"}!`})}catch(l){let m=l instanceof Error?l.message:String(l);d.push({target:C,name:y.name,path:S,status:"error",message:m})}}return d}async function G(e=process.argv.slice(2)){let t=!1,r={dryRun:!1,remove:!1,bun:!1,backup:!1,target:null};for(let o=0;o<e.length;o++){let s=e[o];if(!(s==="setup"||s==="install"||s==="--setup"))if(s==="--print-config")t=!0;else if(s==="--dry-run")r.dryRun=!0;else if(s==="--remove"||s==="--uninstall")r.remove=!0;else if(s==="--bun")r.bun=!0;else if(s==="--backup")r.backup=!0;else if(s==="--target"||s==="-t"){let a=e[o+1];if(!a||a.startsWith("-")){console.error(`\u274C Error: Missing value for --target flag.
16
- `),process.exitCode=1;return}r.target=e[++o]}else if(s.startsWith("--target=")){let a=s.split("=")[1];if(!a){console.error(`\u274C Error: Missing value for --target flag.
17
- `),process.exitCode=1;return}r.target=a}else if(s==="--help"||s==="-h"){Y();return}else if(s.startsWith("-")){console.error(`\u274C Error: Unknown option "${s}". Use --help for usage.
12
+ `;let h=-1;for(let l=C+1;l<s.length;l++){let d=s[l];if(/^[^\s#]/.test(d))break;if((d.match(/^(\s*)/)?.[1]||"")===p&&/^\s+["']?superpowers["']?\s*:\s*(?:#.*)?$/.test(d)){h=l;break}}if(h!==-1){let l=s[h].match(/^(\s*)/)?.[1].length||2,d=h+1;for(;d<s.length;){let w=s[d];if((w.match(/^(\s*)/)?.[1].length||0)>l||w.trim()==="")d++;else break}let y=[],j=-1;for(let w=h+1;w<d;w++){let f=s[w];if(f.trim()==="")continue;let u=f.match(/^(\s*)/)?.[1].length??0;if(!(j!==-1&&u>j)){if(j=-1,u>l&&/^\s*["']?(?:command|args)["']?\s*:/.test(f)){j=u;continue}y.push(f)}}return g[0]+=G(s[h]),s.splice(h,d-h,...g,...y),s.join(`
13
+ `)}else return s.splice(C+1,0,...g),s.join(`
14
+ `)}function T(e,t,r,o,s=!1,c){let i={},p=!1;if(e&&e.trim()!=="")try{let h=JSON.parse(e);if(!P(h))throw new Error("Existing JSON root must be an object");i=h}catch(h){try{let l=I(e,!0),d=JSON.parse(l);if(!P(d))throw new Error("Existing JSON root must be an object");i=d,p=l!==e}catch(l){let d=l instanceof Error?l.message:String(l),y=h instanceof Error?h.message:String(h);throw new Error(`Failed to parse existing JSON: ${d} (raw JSON error: ${y})`)}}let S=t==="json-servers"?"servers":t==="json-mcp"?"mcp":"mcpServers",m=O.find(h=>P(i[h])&&i[h].superpowers!==void 0)??S;if(i[m]!==void 0&&!P(i[m]))throw new Error(`Existing JSON field "${m}" must be an object`);i[m]===void 0&&(i[m]={});let g=i[m];if(s)delete g.superpowers;else{let h;c?h={...c}:t==="json-servers"?h={command:r,args:o,type:"stdio"}:t==="json-mcp"?h={type:"local",command:[r,...o],enabled:!0}:h={command:r,args:o};let l=g.superpowers;if(!P(l))g.superpowers=h;else{let d={...l,...h};(l.enabled!==void 0||l.disabled!==void 0)&&(l.enabled!==void 0?d.enabled=l.enabled:delete d.enabled),t==="json-mcp"&&Array.isArray(d.command)&&delete d.args,g.superpowers=d}}let C=JSON.stringify(i,null,2)+`
15
+ `;return p&&C!==e&&process.stderr.write(`[superpowers-mcp] Warning: JSONC comments/trailing commas in the existing config were removed while updating it (the file is rewritten as plain JSON).
16
+ `),C}function Y(e,t=10){try{let r=n.dirname(e),o=`${n.basename(e)}.`,s=".bak",c=a.readdirSync(r).filter(i=>{if(!i.startsWith(o)||!i.endsWith(s))return!1;let p=i.slice(o.length,i.length-s.length);return/^\d+$/.test(p)}).map(i=>{let p=n.join(r,i);try{return{full:p,mtimeMs:a.statSync(p).mtimeMs}}catch{return{full:p,mtimeMs:0}}}).sort((i,p)=>p.mtimeMs-i.mtimeMs);for(let i of c.slice(t))try{a.unlinkSync(i.full)}catch{}}catch{}}function U(e,t,r=!1,o=[],s){if(o.length===0)throw new Error("safeWriteConfig requires at least one allowed destination root");let c=e;try{let f=a.lstatSync(e,{throwIfNoEntry:!1});if(f&&f.isSymbolicLink()){try{c=a.realpathSync(e)}catch{let L=a.readlinkSync(e);c=n.resolve(n.dirname(e),L)}let u=n.normalize(n.resolve(c)).toLowerCase(),v=n.normalize(n.resolve(k.tmpdir())).toLowerCase();if(!(u===v||u.startsWith(v+n.sep))&&(["/etc","/bin","/sbin","/usr","/root","/sys","/proc","/dev","/private/etc","c:\\windows"].some(R=>u===R||u.startsWith(R+n.sep))||u==="/var"||u.startsWith("/var"+n.sep)&&!u.startsWith("/var/folders"+n.sep)||u==="/private/var"||u.startsWith("/private/var"+n.sep)&&!u.startsWith("/private/var/folders"+n.sep)))throw new Error(`Refusing to write to unsafe symlink target: ${c}`)}}catch(f){if(f instanceof Error&&f.message.includes("Refusing to write to unsafe symlink target"))throw f}let i=n.dirname(c);a.existsSync(i)||a.mkdirSync(i,{recursive:!0,mode:448});let p=a.realpathSync(i),S=a.statSync(p);c=n.join(p,n.basename(c));let m=n.normalize(n.resolve(c)).toLowerCase(),g=n.normalize(n.resolve(k.tmpdir())).toLowerCase(),C=m===g||m.startsWith(g+n.sep),l=["/etc","/bin","/sbin","/usr","/root","/sys","/proc","/dev","/private/etc","c:\\windows"].some(f=>m===f||m.startsWith(f+n.sep))||m==="/var"||m.startsWith("/var"+n.sep)&&!m.startsWith("/var/folders"+n.sep)||m==="/private/var"||m.startsWith("/private/var"+n.sep)&&!m.startsWith("/private/var/folders"+n.sep);if(!C&&l)throw new Error(`Refusing to write to unsafe configuration target: ${c}`);if(!o.some(f=>{if(!f)return!1;let u=n.resolve(f);try{u=a.realpathSync(u)}catch{}let v=n.relative(u,c);return v!==".."&&!v.startsWith(`..${n.sep}`)&&!n.isAbsolute(v)}))throw new Error(`Refusing to write configuration outside allowed roots: ${c}`);let y=384;if(a.existsSync(c)){try{y=a.statSync(c).mode}catch{}if(r){let f=a.readFileSync(c,"utf8"),u=`${c}.${Date.now()}.bak`;try{a.writeFileSync(u,f,{encoding:"utf8",mode:y})}catch(v){let x=v instanceof Error?v.message:String(v);throw new Error(`Failed to create safe backup before write: ${x}`)}Y(c)}}let j=D.randomBytes(8).toString("hex"),w=n.join(p,`.tmp.${n.basename(c)}.${process.pid}.${j}`);try{a.writeFileSync(w,t,{encoding:"utf8",mode:y,flag:"wx"});let f=a.existsSync(c);if(s===null&&f)throw new Error("Configuration changed concurrently before it could be created");if(s!=null&&(!f||a.readFileSync(c,"utf8")!==s))throw new Error("Configuration changed concurrently; refusing to overwrite newer content");let u=a.realpathSync(i),v=a.statSync(u);if(u!==p||v.dev!==S.dev||v.ino!==S.ino)throw new Error("Configuration directory changed while writing");a.renameSync(w,c)}catch(f){try{a.existsSync(w)&&a.unlinkSync(w)}catch{}throw f}}async function J(e={}){let t=e.platform||k.platform(),r=e.homeDir||k.homedir(),o=e.appData||process.env.APPDATA,s=e.localAppData||process.env.LOCALAPPDATA,c=!!e.dryRun,i=!!e.remove,p=!!e.bun,S=e.target?e.target.toLowerCase():null,m=p?"bunx":"npx",g=["-y","superpowers-mcp"],C=[];if(!S)throw new Error(`No target client specified. Please specify which client to configure using --target <${Object.keys(b).join("|")}>.`);let h=Object.keys(b).find(d=>d===S||b[d].aliases.includes(S));if(!h)throw new Error(`Unknown harness target: "${S}". Supported targets: ${Object.keys(b).join(", ")}`);let l=[h];for(let d of l){let y=b[d],j=y.getConfigPath(t,r,o,s),w=a.existsSync(j);if(i&&!w){C.push({target:d,name:y.name,path:j,status:"up-to-date",message:"Already not configured (file does not exist)"});continue}try{let f="";w&&(f=a.readFileSync(j,"utf8"));let u="";if(y.type==="yaml")u=N(f,m,g,i);else{let v=typeof y.defaultConfig=="function"?y.defaultConfig(m,g):void 0;u=T(f,y.type,m,g,i,v)}if(f.trim()===u.trim()&&w){C.push({target:d,name:y.name,path:j,status:"up-to-date",message:i?"Already not configured":"Already configured and up-to-date"});continue}c||U(j,u,!!e.backup,[r,o||"",s||""],w?f:null),C.push({target:d,name:y.name,path:j,status:i?"removed":w?"updated":"created",message:c?`[Dry Run] Would ${i?"remove from":w?"update":"create"} ${j}`:`Successfully ${i?"removed from":w?"updated":"configured"}!`})}catch(f){let u=f instanceof Error?f.message:String(f);C.push({target:d,name:y.name,path:j,status:"error",message:u})}}return C}async function Q(e=process.argv.slice(2)){let t=!1,r={dryRun:!1,remove:!1,bun:!1,backup:!1,target:null};for(let o=0;o<e.length;o++){let s=e[o];if(!(s==="setup"||s==="install"||s==="--setup"))if(s==="--print-config")t=!0;else if(s==="--dry-run")r.dryRun=!0;else if(s==="--remove"||s==="--uninstall")r.remove=!0;else if(s==="--bun")r.bun=!0;else if(s==="--backup")r.backup=!0;else if(s==="--target"||s==="-t"){let c=e[o+1];if(!c||c.startsWith("-")){console.error(`\u274C Error: Missing value for --target flag.
17
+ `),process.exitCode=1;return}r.target=e[++o]}else if(s.startsWith("--target=")){let c=s.split("=")[1];if(!c){console.error(`\u274C Error: Missing value for --target flag.
18
+ `),process.exitCode=1;return}r.target=c}else if(s==="--help"||s==="-h"){B();return}else if(s.startsWith("-")){console.error(`\u274C Error: Unknown option "${s}". Use --help for usage.
18
19
  `),process.exitCode=1;return}else if(!r.target)r.target=s;else{console.error(`\u274C Error: Unexpected argument "${s}". Use --help for usage.
19
20
  `),process.exitCode=1;return}}if(t){if(r.target||r.remove||r.backup||r.dryRun){console.error("--print-config supports only --bun; omit target and file-operation flags."),process.exitCode=1;return}console.log(JSON.stringify({mcpServers:{superpowers:{command:r.bun?"bunx":"npx",args:["-y","superpowers-mcp"]}}},null,2));return}if(console.log(`
20
21
  ========================================================`),console.log("\u26A1 Superpowers MCP - Targeted Client Setup"),console.log(`========================================================
@@ -22,9 +23,9 @@ ${f.join(`
22
23
  `),console.log(" npx -y superpowers-mcp setup --target lmstudio # LM Studio (~/.lmstudio/mcp.json)"),console.log(" npx -y superpowers-mcp setup --target roo # Roo Code in VS Code Desktop"),console.log(" npx -y superpowers-mcp setup --print-config # JSON for desktop app import"),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)
23
24
  `),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.
24
25
  `),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.
25
- `),process.exitCode=1;return}try{let o=await U(r),s=0,a=0,c=0;for(let g of o){let h=g.status==="created"||g.status==="updated"||g.status==="removed"?"\u2705":g.status==="up-to-date"?"\u2728":g.status==="skipped"?"\u23ED\uFE0F ":"\u274C";console.log(`${h} [${g.name}] (${g.status})`),console.log(` Path: ${g.path}`),console.log(` Info: ${g.message}
26
- `),g.status==="created"||g.status==="updated"||g.status==="up-to-date"||g.status==="removed"?s++:g.status==="skipped"?a++:g.status==="error"&&c++}if(console.log("--------------------------------------------------------"),c>0){console.error(`\u26A0\uFE0F Setup finished with errors: ${c} failure(s), ${s} succeeded.`),process.exitCode=1;return}console.log(`\u{1F389} Setup complete! ${s} environment(s) ready.`)}catch(o){let s=o instanceof Error?o.message:String(o);console.error(`\u274C Setup failed: ${s}
27
- `),process.exitCode=1}}function Y(){console.log(`
26
+ `),process.exitCode=1;return}try{let o=await J(r),s=0,c=0,i=0;for(let p of o){let S=p.status==="created"||p.status==="updated"||p.status==="removed"?"\u2705":p.status==="up-to-date"?"\u2728":p.status==="skipped"?"\u23ED\uFE0F ":"\u274C";console.log(`${S} [${p.name}] (${p.status})`),console.log(` Path: ${p.path}`),console.log(` Info: ${p.message}
27
+ `),p.status==="created"||p.status==="updated"||p.status==="up-to-date"||p.status==="removed"?s++:p.status==="skipped"?c++:p.status==="error"&&i++}if(console.log("--------------------------------------------------------"),i>0){console.error(`\u26A0\uFE0F Setup finished with errors: ${i} failure(s), ${s} succeeded.`),process.exitCode=1;return}console.log(`\u{1F389} Setup complete! ${s} environment(s) ready.`)}catch(o){let s=o instanceof Error?o.message:String(o);console.error(`\u274C Setup failed: ${s}
28
+ `),process.exitCode=1}}function B(){console.log(`
28
29
  Superpowers MCP - Targeted Global Setup
29
30
 
30
31
  Usage:
package/out/setup.js CHANGED
@@ -1,21 +1,22 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var J=Object.create;var A=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var H=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var V=(e,t)=>{for(var r in t)A(e,r,{get:t[r],enumerable:!0})},$=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of H(t))!F.call(e,s)&&s!==r&&A(e,s,{get:()=>t[s],enumerable:!(o=M(t,s))||o.enumerable});return e};var E=(e,t,r)=>(r=e!=null?J(K(e)):{},$(t||!e||!e.__esModule?A(r,"default",{value:e,enumerable:!0}):r,e)),z=e=>$(A({},"__esModule",{value:!0}),e);var Q={};V(Q,{HARNESS_CONFIGS:()=>b,JSON_SERVER_ROOT_KEYS:()=>I,isPlainObject:()=>P,runSetup:()=>L,runSetupCli:()=>R,safeWriteConfig:()=>U,stripJsonComments:()=>O,updateJsonConfig:()=>N,updateYamlConfig:()=>T});module.exports=z(Q);var i=E(require("fs")),n=E(require("path")),x=E(require("os")),W=E(require("crypto")),b={lmstudio:{name:"LM Studio",aliases:["lmstudio","lm-studio"],getConfigPath:(e,t)=>n.join(t,".lmstudio","mcp.json"),type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},roo:{name:"Roo Code (VS Code Desktop)",aliases:["roo","roo-code","roocode"],getConfigPath:(e,t,r)=>{let o=e==="win32"?r||n.join(t,"AppData","Roaming"):e==="darwin"?n.join(t,"Library","Application Support"):n.join(t,".config");return n.join(o,"Code","User","globalStorage","rooveterinaryinc.roo-cline","settings","mcp_settings.json")},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},copilot:{name:"GitHub Copilot (VS Code)",aliases:["vscode","code","copilot"],getConfigPath:(e,t,r,o)=>e==="win32"?n.join(r||n.join(t,"AppData","Roaming"),"Code","User","mcp.json"):e==="darwin"?n.join(t,"Library","Application Support","Code","User","mcp.json"):n.join(t,".config","Code","User","mcp.json"),type:"json-servers",defaultConfig:(e,t)=>({command:e,args:t,type:"stdio"})},"copilot-insiders":{name:"GitHub Copilot (VS Code Insiders)",aliases:["vscode-insiders","code-insiders","insiders","insider","vscode-insider","code-insider","copilot-insider"],getConfigPath:(e,t,r,o)=>e==="win32"?n.join(r||n.join(t,"AppData","Roaming"),"Code - Insiders","User","mcp.json"):e==="darwin"?n.join(t,"Library","Application Support","Code - Insiders","User","mcp.json"):n.join(t,".config","Code - Insiders","User","mcp.json"),type:"json-servers",defaultConfig:(e,t)=>({command:e,args:t,type:"stdio"})},cursor:{name:"Cursor",aliases:["cursor"],getConfigPath:(e,t)=>n.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,o)=>{if(e==="win32"){let s=o||n.join(t,"AppData","Local");return n.join(s,"hermes","config.yaml")}return n.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)=>n.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"?n.join(r||n.join(t,"AppData","Roaming"),"Claude","claude_desktop_config.json"):e==="darwin"?n.join(t,"Library","Application Support","Claude","claude_desktop_config.json"):n.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=n.join(t,".config","devin","mcp_config.json");return i.existsSync(r)?r:n.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)=>n.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 a=n.join(r||n.join(t,"AppData","Roaming"),".pi","agent","mcp.json");if(i.existsSync(a))return a;let c=n.join(t,".pi","agent","mcp.json");if(i.existsSync(c))return c;let g=n.join(t,".pi","mcp.json");return i.existsSync(g)?g:c}let o=n.join(t,".pi","agent","mcp.json");if(i.existsSync(o))return o;let s=n.join(t,".pi","mcp.json");return i.existsSync(s)?s:o},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},qwenpaw:{name:"QwenPaw (Personal Agent Workstation)",aliases:["qwenpaw","qwen-paw","copaw"],getConfigPath:(e,t)=>{let r=n.join(t,".qwenpaw","config.json");if(i.existsSync(r))return r;let o=n.join(t,".copaw","config.json");return i.existsSync(o)?o:r},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},cline:{name:"Cline (VS Code / CLI)",aliases:["cline","claude-dev"],getConfigPath:(e,t,r)=>{let o="";if(e==="win32"?o=n.join(r||n.join(t,"AppData","Roaming"),"Code","User","globalStorage","saoudrizwan.claude-dev","settings","cline_mcp_settings.json"):e==="darwin"?o=n.join(t,"Library","Application Support","Code","User","globalStorage","saoudrizwan.claude-dev","settings","cline_mcp_settings.json"):o=n.join(t,".config","Code","User","globalStorage","saoudrizwan.claude-dev","settings","cline_mcp_settings.json"),i.existsSync(o))return o;let s=n.join(t,".cline","data","settings","cline_mcp_settings.json");return i.existsSync(s)?s:o},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},kilo:{name:"Kilo Code",aliases:["kilo","kilocode","kilo-code"],getConfigPath:(e,t)=>{let r=n.join(t,".config","kilo","kilo.jsonc");if(i.existsSync(r))return r;let o=n.join(t,".config","kilo","kilo.json");return i.existsSync(o)?o:r},type:"json-mcp",defaultConfig:(e,t)=>({type:"local",command:[e,...t],enabled:!0})},qoder:{name:"Qoder",aliases:["qoder"],getConfigPath:(e,t)=>n.join(t,".qoder","settings.json"),type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},kiro:{name:"Kiro",aliases:["kiro","kiro-code"],getConfigPath:(e,t)=>n.join(t,".kiro","settings","mcp.json"),type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},trae:{name:"Trae",aliases:["trae"],getConfigPath:(e,t,r)=>{if(e==="win32"){let o=n.join(r||n.join(t,"AppData","Roaming"),"Trae","User","mcp.json");if(i.existsSync(o))return o;let s=n.join(r||n.join(t,"AppData","Roaming"),"Trae CN","User","mcp.json");return i.existsSync(s)?s:o}else if(e==="darwin"){let o=n.join(t,"Library","Application Support","Trae","User","mcp.json");if(i.existsSync(o))return o;let s=n.join(t,"Library","Application Support","Trae CN","User","mcp.json");return i.existsSync(s)?s:o}else{let o=n.join(t,".config","Trae","User","mcp.json");if(i.existsSync(o))return o;let s=n.join(t,".config","Trae CN","User","mcp.json");return i.existsSync(s)?s:o}},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})}},I=["mcpServers","servers","mcp"];function P(e){return Object.prototype.toString.call(e)==="[object Object]"}function O(e,t=!1){if(!e)return"";if(!t)try{return JSON.parse(e),e}catch{}let r=e.length,o=[],s=!1,a=!1,c=!1,g=!1,h=-1;for(let f=0;f<r;f++){let p=e[f],d=f+1<r?e[f+1]:"";if(c){(p===`
3
- `||p==="\r")&&(c=!1,o.push(p));continue}if(g){p==="*"&&d==="/"&&(g=!1,f++);continue}if(s){o.push(p),a?a=!1:p==="\\"?a=!0:p==='"'&&(s=!1);continue}if(p==='"'){s=!0,a=!1,h=-1,o.push(p);continue}if(p==="/"&&d==="/"){c=!0,f++;continue}if(p==="/"&&d==="*"){g=!0,f++;continue}if(p===","){h=o.length,o.push(p);continue}if(p==="}"||p==="]"){h!==-1&&(o[h]=" ",h=-1),o.push(p);continue}p!==" "&&p!==" "&&p!==`
4
- `&&p!=="\r"&&(h=-1),o.push(p)}return o.join("")}var D=/\s/;function G(e){for(let t=1;t<e.length;t++){if(e[t]!=="#"||!D.test(e[t-1]))continue;let r=t-1;for(;r>0&&D.test(e[r-1]);)r--;return e.slice(r)}return""}function T(e,t,r,o=!1){let s=e?e.split(/\r?\n/):[],a=s.map((u,w)=>{let C=u.match(/^(\s*)mcp_servers:/);return C?{index:w,indent:C[1],tail:u.slice(C[0].length).trim()}:null}).filter(u=>u!==null);if(a.length>1)throw new Error("Cannot safely update YAML with duplicate mcp_servers keys");if(a.length===1){let u=a[0];if(u.indent!==""||u.tail!==""&&!u.tail.startsWith("#"))throw new Error("Cannot safely update YAML unless mcp_servers is a root-level block mapping")}let c=" ";if(a.length===1)for(let u=a[0].index+1;u<s.length;u++){if(s[u].trim()===""||s[u].trimStart().startsWith("#"))continue;if(/^[^\s]/.test(s[u]))break;let w=s[u].match(/^(\s+)\S/);w&&(c=w[1]);break}if(o){let u=[],w=!1,C=0,y=!1,S=0;for(let j=0;j<s.length;j++){let l=s[j],m=l.match(/^(\s*)mcp_servers:\s*(?:#.*)?$/);if(m){w=!0,C=m[1].length,u.push(l);continue}if(w){let v=l.match(/^(\s*)/)?.[1].length||0;if(l.trimStart().startsWith("#")){u.push(l);continue}if(l.trim()!==""&&v<=C)w=!1,y=!1;else{let k=l.match(/^(\s*)superpowers:\s*(?:#.*)?$/);if(k&&k[1]===c){y=!0,S=k[1].length;continue}if(y){if(v>S||l.trim()==="")continue;y=!1}}}u.push(l)}return u.join(`
5
- `)}let g=JSON.stringify(t),h=JSON.stringify(r),f=[`${c}superpowers:`,`${c}${c}command: ${g}`,`${c}${c}args: ${h}`];if(!e||e.trim()==="")return`mcp_servers:
6
- ${f.join(`
2
+ "use strict";var q=Object.create;var E=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,V=Object.prototype.hasOwnProperty;var z=(e,t)=>{for(var r in t)E(e,r,{get:t[r],enumerable:!0})},W=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of K(t))!V.call(e,s)&&s!==r&&E(e,s,{get:()=>t[s],enumerable:!(o=H(t,s))||o.enumerable});return e};var _=(e,t,r)=>(r=e!=null?q(F(e)):{},W(t||!e||!e.__esModule?E(r,"default",{value:e,enumerable:!0}):r,e)),G=e=>W(E({},"__esModule",{value:!0}),e);var X={};z(X,{HARNESS_CONFIGS:()=>b,JSON_SERVER_ROOT_KEYS:()=>I,isPlainObject:()=>P,runSetup:()=>L,runSetupCli:()=>R,safeWriteConfig:()=>J,stripJsonComments:()=>N,updateJsonConfig:()=>U,updateYamlConfig:()=>T});module.exports=G(X);var a=_(require("fs")),n=_(require("path")),k=_(require("os")),O=_(require("crypto")),b={lmstudio:{name:"LM Studio",aliases:["lmstudio","lm-studio"],getConfigPath:(e,t)=>n.join(t,".lmstudio","mcp.json"),type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},roo:{name:"Roo Code (VS Code Desktop)",aliases:["roo","roo-code","roocode"],getConfigPath:(e,t,r)=>{let o=e==="win32"?r||n.join(t,"AppData","Roaming"):e==="darwin"?n.join(t,"Library","Application Support"):n.join(t,".config");return n.join(o,"Code","User","globalStorage","rooveterinaryinc.roo-cline","settings","mcp_settings.json")},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},copilot:{name:"GitHub Copilot (VS Code)",aliases:["vscode","code","copilot"],getConfigPath:(e,t,r,o)=>e==="win32"?n.join(r||n.join(t,"AppData","Roaming"),"Code","User","mcp.json"):e==="darwin"?n.join(t,"Library","Application Support","Code","User","mcp.json"):n.join(t,".config","Code","User","mcp.json"),type:"json-servers",defaultConfig:(e,t)=>({command:e,args:t,type:"stdio"})},"copilot-insiders":{name:"GitHub Copilot (VS Code Insiders)",aliases:["vscode-insiders","code-insiders","insiders","insider","vscode-insider","code-insider","copilot-insider"],getConfigPath:(e,t,r,o)=>e==="win32"?n.join(r||n.join(t,"AppData","Roaming"),"Code - Insiders","User","mcp.json"):e==="darwin"?n.join(t,"Library","Application Support","Code - Insiders","User","mcp.json"):n.join(t,".config","Code - Insiders","User","mcp.json"),type:"json-servers",defaultConfig:(e,t)=>({command:e,args:t,type:"stdio"})},cursor:{name:"Cursor",aliases:["cursor"],getConfigPath:(e,t)=>n.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,o)=>{if(e==="win32"){let s=o||n.join(t,"AppData","Local");return n.join(s,"hermes","config.yaml")}return n.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)=>n.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"?n.join(r||n.join(t,"AppData","Roaming"),"Claude","claude_desktop_config.json"):e==="darwin"?n.join(t,"Library","Application Support","Claude","claude_desktop_config.json"):n.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,r)=>{let o=e==="win32"&&r?r:n.join(t,".config"),s=n.join(o,"devin","mcp_config.json");return a.existsSync(s)?s:n.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)=>n.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 c=n.join(r||n.join(t,"AppData","Roaming"),".pi","agent","mcp.json");if(a.existsSync(c))return c;let i=n.join(t,".pi","agent","mcp.json");if(a.existsSync(i))return i;let p=n.join(t,".pi","mcp.json");return a.existsSync(p)?p:i}let o=n.join(t,".pi","agent","mcp.json");if(a.existsSync(o))return o;let s=n.join(t,".pi","mcp.json");return a.existsSync(s)?s:o},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},qwenpaw:{name:"QwenPaw (Personal Agent Workstation)",aliases:["qwenpaw","qwen-paw","copaw"],getConfigPath:(e,t)=>{let r=n.join(t,".qwenpaw","config.json");if(a.existsSync(r))return r;let o=n.join(t,".copaw","config.json");return a.existsSync(o)?o:r},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},cline:{name:"Cline (VS Code / CLI)",aliases:["cline","claude-dev"],getConfigPath:(e,t,r)=>{let o="";if(e==="win32"?o=n.join(r||n.join(t,"AppData","Roaming"),"Code","User","globalStorage","saoudrizwan.claude-dev","settings","cline_mcp_settings.json"):e==="darwin"?o=n.join(t,"Library","Application Support","Code","User","globalStorage","saoudrizwan.claude-dev","settings","cline_mcp_settings.json"):o=n.join(t,".config","Code","User","globalStorage","saoudrizwan.claude-dev","settings","cline_mcp_settings.json"),a.existsSync(o))return o;let s=n.join(t,".cline","data","settings","cline_mcp_settings.json");return a.existsSync(s)?s:o},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},kilo:{name:"Kilo Code",aliases:["kilo","kilocode","kilo-code"],getConfigPath:(e,t)=>{let r=n.join(t,".config","kilo","kilo.jsonc");if(a.existsSync(r))return r;let o=n.join(t,".config","kilo","kilo.json");return a.existsSync(o)?o:r},type:"json-mcp",defaultConfig:(e,t)=>({type:"local",command:[e,...t],enabled:!0})},qoder:{name:"Qoder",aliases:["qoder"],getConfigPath:(e,t)=>n.join(t,".qoder","settings.json"),type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},kiro:{name:"Kiro",aliases:["kiro","kiro-code"],getConfigPath:(e,t)=>n.join(t,".kiro","settings","mcp.json"),type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})},trae:{name:"Trae",aliases:["trae"],getConfigPath:(e,t,r)=>{if(e==="win32"){let o=n.join(r||n.join(t,"AppData","Roaming"),"Trae","User","mcp.json");if(a.existsSync(o))return o;let s=n.join(r||n.join(t,"AppData","Roaming"),"Trae CN","User","mcp.json");return a.existsSync(s)?s:o}else if(e==="darwin"){let o=n.join(t,"Library","Application Support","Trae","User","mcp.json");if(a.existsSync(o))return o;let s=n.join(t,"Library","Application Support","Trae CN","User","mcp.json");return a.existsSync(s)?s:o}else{let o=n.join(t,".config","Trae","User","mcp.json");if(a.existsSync(o))return o;let s=n.join(t,".config","Trae CN","User","mcp.json");return a.existsSync(s)?s:o}},type:"json-mcpServers",defaultConfig:(e,t)=>({command:e,args:t})}},I=["mcpServers","servers","mcp"];function P(e){return Object.prototype.toString.call(e)==="[object Object]"}function N(e,t=!1){if(!e)return"";if(!t)try{return JSON.parse(e),e}catch{}let r=e.length,o=[],s=!1,c=!1,i=!1,p=!1,S=-1;for(let m=0;m<r;m++){let g=e[m],C=m+1<r?e[m+1]:"";if(i){(g===`
3
+ `||g==="\r")&&(i=!1,o.push(g));continue}if(p){g==="*"&&C==="/"&&(p=!1,m++);continue}if(s){o.push(g),c?c=!1:g==="\\"?c=!0:g==='"'&&(s=!1);continue}if(g==='"'){s=!0,c=!1,S=-1,o.push(g);continue}if(g==="/"&&C==="/"){i=!0,m++;continue}if(g==="/"&&C==="*"){p=!0,m++;continue}if(g===","){S=o.length,o.push(g);continue}if(g==="}"||g==="]"){S!==-1&&(o[S]=" ",S=-1),o.push(g);continue}g!==" "&&g!==" "&&g!==`
4
+ `&&g!=="\r"&&(S=-1),o.push(g)}return o.join("")}var D=/\s/;function Y(e){for(let t=1;t<e.length;t++){if(e[t]!=="#"||!D.test(e[t-1]))continue;let r=t-1;for(;r>0&&D.test(e[r-1]);)r--;return e.slice(r)}return""}function T(e,t,r,o=!1){let s=e?e.split(/\r?\n/):[],c=s.map((l,d)=>{let y=l.match(/^(\s*)mcp_servers:/);return y?{index:d,indent:y[1],tail:l.slice(y[0].length).trim()}:null}).filter(l=>l!==null),i=c.filter(l=>l.indent==="");if(i.length>1)throw new Error("Cannot safely update YAML with duplicate mcp_servers keys");if(i.length===1){let l=i[0];if(l.tail!==""&&!l.tail.startsWith("#"))throw new Error("Cannot safely update YAML unless mcp_servers is a root-level block mapping")}else if(c.length>0)throw new Error("Cannot safely update YAML unless mcp_servers is a root-level block mapping");let p=" ";if(i.length===1)for(let l=i[0].index+1;l<s.length;l++){if(s[l].trim()===""||s[l].trimStart().startsWith("#"))continue;if(/^[^\s]/.test(s[l]))break;let d=s[l].match(/^(\s+)\S/);d&&(p=d[1]);break}if(o){let l=[],d=!1,y=0,j=!1,w=0;for(let f=0;f<s.length;f++){let u=s[f],v=u.match(/^(\s*)mcp_servers:\s*(?:#.*)?$/);if(v){d=!0,y=v[1].length,l.push(u);continue}if(d){let x=u.match(/^(\s*)/)?.[1].length||0;if(u.trimStart().startsWith("#")){l.push(u);continue}if(u.trim()!==""&&x<=y)d=!1,j=!1;else{let A=u.match(/^(\s*)superpowers:\s*(?:#.*)?$/);if(A&&A[1]===p){j=!0,w=A[1].length;continue}if(j){if(x>w||u.trim()==="")continue;j=!1}}}l.push(u)}return l.join(`
5
+ `)}let S=JSON.stringify(t),m=JSON.stringify(r),g=[`${p}superpowers:`,`${p}${p}command: ${S}`,`${p}${p}args: ${m}`];if(!e||e.trim()==="")return`mcp_servers:
6
+ ${g.join(`
7
7
  `)}
8
- `;let p=a.length===1?a[0].index:-1;if(p===-1)return`${e.trimEnd()}
8
+ `;let C=i.length===1?i[0].index:-1;if(C===-1)return`${e.trimEnd()}
9
9
 
10
10
  mcp_servers:
11
- ${f.join(`
11
+ ${g.join(`
12
12
  `)}
13
- `;let d=-1;for(let u=p+1;u<s.length;u++){let w=s[u];if(/^[^\s#]/.test(w))break;if((w.match(/^(\s*)/)?.[1]||"")===c&&/^\s+["']?superpowers["']?\s*:\s*(?:#.*)?$/.test(w)){d=u;break}}if(d!==-1){let u=s[d].match(/^(\s*)/)?.[1].length||2,w=d+1;for(;w<s.length;){let S=s[w];if((S.match(/^(\s*)/)?.[1].length||0)>u||S.trim()==="")w++;else break}let C=[],y=-1;for(let S=d+1;S<w;S++){let j=s[S];if(j.trim()==="")continue;let l=j.match(/^(\s*)/)?.[1].length??0;if(!(y!==-1&&l>y)){if(y=-1,l>u&&/^\s*["']?(?:command|args)["']?\s*:/.test(j)){y=l;continue}C.push(j)}}return f[0]+=G(s[d]),s.splice(d,w-d,...f,...C),s.join(`
14
- `)}else return s.splice(p+1,0,...f),s.join(`
15
- `)}function N(e,t,r,o,s=!1,a){let c={};if(e&&e.trim()!=="")try{let p=JSON.parse(e);if(!P(p))throw new Error("Existing JSON root must be an object");c=p}catch{try{let d=O(e,!0),u=JSON.parse(d);if(!P(u))throw new Error("Existing JSON root must be an object");c=u}catch(d){let u=d instanceof Error?d.message:String(d);throw new Error(`Failed to parse existing JSON: ${u}`)}}let g=t==="json-servers"?"servers":t==="json-mcp"?"mcp":"mcpServers",h=I.find(p=>P(c[p])&&c[p].superpowers!==void 0)??g;if(c[h]!==void 0&&!P(c[h]))throw new Error(`Existing JSON field "${h}" must be an object`);c[h]===void 0&&(c[h]={});let f=c[h];if(s)delete f.superpowers;else{let p;a?p={...a}:t==="json-servers"?p={command:r,args:o,type:"stdio"}:t==="json-mcp"?p={type:"local",command:[r,...o],enabled:!0}:p={command:r,args:o};let d=f.superpowers;if(!P(d))f.superpowers=p;else{let u={...d,...p};(d.enabled!==void 0||d.disabled!==void 0)&&(d.enabled!==void 0?u.enabled=d.enabled:delete u.enabled),t==="json-mcp"&&Array.isArray(u.command)&&delete u.args,f.superpowers=u}}return JSON.stringify(c,null,2)+`
16
- `}function U(e,t,r=!1,o=[],s){if(o.length===0)throw new Error("safeWriteConfig requires at least one allowed destination root");let a=e;try{let l=i.lstatSync(e,{throwIfNoEntry:!1});if(l&&l.isSymbolicLink()){try{a=i.realpathSync(e)}catch{let q=i.readlinkSync(e);a=n.resolve(n.dirname(e),q)}let m=n.normalize(n.resolve(a)).toLowerCase(),v=n.normalize(n.resolve(x.tmpdir())).toLowerCase();if(!(m===v||m.startsWith(v+n.sep))&&(["/etc","/bin","/sbin","/usr","/root","/sys","/proc","/dev","/private/etc","c:\\windows"].some(_=>m===_||m.startsWith(_+n.sep))||m==="/var"||m.startsWith("/var"+n.sep)&&!m.startsWith("/var/folders"+n.sep)||m==="/private/var"||m.startsWith("/private/var"+n.sep)&&!m.startsWith("/private/var/folders"+n.sep)))throw new Error(`Refusing to write to unsafe symlink target: ${a}`)}}catch(l){if(l instanceof Error&&l.message.includes("Refusing to write to unsafe symlink target"))throw l}let c=n.dirname(a);i.existsSync(c)||i.mkdirSync(c,{recursive:!0,mode:448});let g=i.realpathSync(c),h=i.statSync(g);a=n.join(g,n.basename(a));let f=n.normalize(n.resolve(a)).toLowerCase(),p=n.normalize(n.resolve(x.tmpdir())).toLowerCase(),d=f===p||f.startsWith(p+n.sep),w=["/etc","/bin","/sbin","/usr","/root","/sys","/proc","/dev","/private/etc","c:\\windows"].some(l=>f===l||f.startsWith(l+n.sep))||f==="/var"||f.startsWith("/var"+n.sep)&&!f.startsWith("/var/folders"+n.sep)||f==="/private/var"||f.startsWith("/private/var"+n.sep)&&!f.startsWith("/private/var/folders"+n.sep);if(!d&&w)throw new Error(`Refusing to write to unsafe configuration target: ${a}`);if(!o.some(l=>{if(!l)return!1;let m=n.resolve(l);try{m=i.realpathSync(m)}catch{}let v=n.relative(m,a);return v!==".."&&!v.startsWith(`..${n.sep}`)&&!n.isAbsolute(v)}))throw new Error(`Refusing to write configuration outside allowed roots: ${a}`);let y=384;if(i.existsSync(a)){try{y=i.statSync(a).mode}catch{}if(r){let l=i.readFileSync(a,"utf8"),m=`${a}.${Date.now()}.bak`;try{i.writeFileSync(m,l,{encoding:"utf8",mode:y})}catch(v){let k=v instanceof Error?v.message:String(v);throw new Error(`Failed to create safe backup before write: ${k}`)}}}let S=W.randomBytes(8).toString("hex"),j=n.join(g,`.tmp.${n.basename(a)}.${process.pid}.${S}`);try{i.writeFileSync(j,t,{encoding:"utf8",mode:y,flag:"wx"});let l=i.existsSync(a);if(s===null&&l)throw new Error("Configuration changed concurrently before it could be created");if(s!=null&&(!l||i.readFileSync(a,"utf8")!==s))throw new Error("Configuration changed concurrently; refusing to overwrite newer content");let m=i.realpathSync(c),v=i.statSync(m);if(m!==g||v.dev!==h.dev||v.ino!==h.ino)throw new Error("Configuration directory changed while writing");i.renameSync(j,a)}catch(l){try{i.existsSync(j)&&i.unlinkSync(j)}catch{}throw l}}async function L(e={}){let t=e.platform||x.platform(),r=e.homeDir||x.homedir(),o=e.appData||process.env.APPDATA,s=e.localAppData||process.env.LOCALAPPDATA,a=!!e.dryRun,c=!!e.remove,g=!!e.bun,h=e.target?e.target.toLowerCase():null,f=g?"bunx":"npx",p=["-y","superpowers-mcp"],d=[];if(!h)throw new Error(`No target client specified. Please specify which client to configure using --target <${Object.keys(b).join("|")}>.`);let u=Object.keys(b).find(C=>C===h||b[C].aliases.includes(h));if(!u)throw new Error(`Unknown harness target: "${h}". Supported targets: ${Object.keys(b).join(", ")}`);let w=[u];for(let C of w){let y=b[C],S=y.getConfigPath(t,r,o,s),j=i.existsSync(S);if(c&&!j){d.push({target:C,name:y.name,path:S,status:"up-to-date",message:"Already not configured (file does not exist)"});continue}try{let l="";j&&(l=i.readFileSync(S,"utf8"));let m="";if(y.type==="yaml")m=T(l,f,p,c);else{let v=typeof y.defaultConfig=="function"?y.defaultConfig(f,p):void 0;m=N(l,y.type,f,p,c,v)}if(l.trim()===m.trim()&&j){d.push({target:C,name:y.name,path:S,status:"up-to-date",message:c?"Already not configured":"Already configured and up-to-date"});continue}a||U(S,m,!!e.backup,[r,o||"",s||""],j?l:null),d.push({target:C,name:y.name,path:S,status:c?"removed":j?"updated":"created",message:a?`[Dry Run] Would ${c?"remove from":j?"update":"create"} ${S}`:`Successfully ${c?"removed from":j?"updated":"configured"}!`})}catch(l){let m=l instanceof Error?l.message:String(l);d.push({target:C,name:y.name,path:S,status:"error",message:m})}}return d}async function R(e=process.argv.slice(2)){let t=!1,r={dryRun:!1,remove:!1,bun:!1,backup:!1,target:null};for(let o=0;o<e.length;o++){let s=e[o];if(!(s==="setup"||s==="install"||s==="--setup"))if(s==="--print-config")t=!0;else if(s==="--dry-run")r.dryRun=!0;else if(s==="--remove"||s==="--uninstall")r.remove=!0;else if(s==="--bun")r.bun=!0;else if(s==="--backup")r.backup=!0;else if(s==="--target"||s==="-t"){let a=e[o+1];if(!a||a.startsWith("-")){console.error(`\u274C Error: Missing value for --target flag.
17
- `),process.exitCode=1;return}r.target=e[++o]}else if(s.startsWith("--target=")){let a=s.split("=")[1];if(!a){console.error(`\u274C Error: Missing value for --target flag.
18
- `),process.exitCode=1;return}r.target=a}else if(s==="--help"||s==="-h"){Y();return}else if(s.startsWith("-")){console.error(`\u274C Error: Unknown option "${s}". Use --help for usage.
13
+ `;let h=-1;for(let l=C+1;l<s.length;l++){let d=s[l];if(/^[^\s#]/.test(d))break;if((d.match(/^(\s*)/)?.[1]||"")===p&&/^\s+["']?superpowers["']?\s*:\s*(?:#.*)?$/.test(d)){h=l;break}}if(h!==-1){let l=s[h].match(/^(\s*)/)?.[1].length||2,d=h+1;for(;d<s.length;){let w=s[d];if((w.match(/^(\s*)/)?.[1].length||0)>l||w.trim()==="")d++;else break}let y=[],j=-1;for(let w=h+1;w<d;w++){let f=s[w];if(f.trim()==="")continue;let u=f.match(/^(\s*)/)?.[1].length??0;if(!(j!==-1&&u>j)){if(j=-1,u>l&&/^\s*["']?(?:command|args)["']?\s*:/.test(f)){j=u;continue}y.push(f)}}return g[0]+=Y(s[h]),s.splice(h,d-h,...g,...y),s.join(`
14
+ `)}else return s.splice(C+1,0,...g),s.join(`
15
+ `)}function U(e,t,r,o,s=!1,c){let i={},p=!1;if(e&&e.trim()!=="")try{let h=JSON.parse(e);if(!P(h))throw new Error("Existing JSON root must be an object");i=h}catch(h){try{let l=N(e,!0),d=JSON.parse(l);if(!P(d))throw new Error("Existing JSON root must be an object");i=d,p=l!==e}catch(l){let d=l instanceof Error?l.message:String(l),y=h instanceof Error?h.message:String(h);throw new Error(`Failed to parse existing JSON: ${d} (raw JSON error: ${y})`)}}let S=t==="json-servers"?"servers":t==="json-mcp"?"mcp":"mcpServers",m=I.find(h=>P(i[h])&&i[h].superpowers!==void 0)??S;if(i[m]!==void 0&&!P(i[m]))throw new Error(`Existing JSON field "${m}" must be an object`);i[m]===void 0&&(i[m]={});let g=i[m];if(s)delete g.superpowers;else{let h;c?h={...c}:t==="json-servers"?h={command:r,args:o,type:"stdio"}:t==="json-mcp"?h={type:"local",command:[r,...o],enabled:!0}:h={command:r,args:o};let l=g.superpowers;if(!P(l))g.superpowers=h;else{let d={...l,...h};(l.enabled!==void 0||l.disabled!==void 0)&&(l.enabled!==void 0?d.enabled=l.enabled:delete d.enabled),t==="json-mcp"&&Array.isArray(d.command)&&delete d.args,g.superpowers=d}}let C=JSON.stringify(i,null,2)+`
16
+ `;return p&&C!==e&&process.stderr.write(`[superpowers-mcp] Warning: JSONC comments/trailing commas in the existing config were removed while updating it (the file is rewritten as plain JSON).
17
+ `),C}function Q(e,t=10){try{let r=n.dirname(e),o=`${n.basename(e)}.`,s=".bak",c=a.readdirSync(r).filter(i=>{if(!i.startsWith(o)||!i.endsWith(s))return!1;let p=i.slice(o.length,i.length-s.length);return/^\d+$/.test(p)}).map(i=>{let p=n.join(r,i);try{return{full:p,mtimeMs:a.statSync(p).mtimeMs}}catch{return{full:p,mtimeMs:0}}}).sort((i,p)=>p.mtimeMs-i.mtimeMs);for(let i of c.slice(t))try{a.unlinkSync(i.full)}catch{}}catch{}}function J(e,t,r=!1,o=[],s){if(o.length===0)throw new Error("safeWriteConfig requires at least one allowed destination root");let c=e;try{let f=a.lstatSync(e,{throwIfNoEntry:!1});if(f&&f.isSymbolicLink()){try{c=a.realpathSync(e)}catch{let M=a.readlinkSync(e);c=n.resolve(n.dirname(e),M)}let u=n.normalize(n.resolve(c)).toLowerCase(),v=n.normalize(n.resolve(k.tmpdir())).toLowerCase();if(!(u===v||u.startsWith(v+n.sep))&&(["/etc","/bin","/sbin","/usr","/root","/sys","/proc","/dev","/private/etc","c:\\windows"].some($=>u===$||u.startsWith($+n.sep))||u==="/var"||u.startsWith("/var"+n.sep)&&!u.startsWith("/var/folders"+n.sep)||u==="/private/var"||u.startsWith("/private/var"+n.sep)&&!u.startsWith("/private/var/folders"+n.sep)))throw new Error(`Refusing to write to unsafe symlink target: ${c}`)}}catch(f){if(f instanceof Error&&f.message.includes("Refusing to write to unsafe symlink target"))throw f}let i=n.dirname(c);a.existsSync(i)||a.mkdirSync(i,{recursive:!0,mode:448});let p=a.realpathSync(i),S=a.statSync(p);c=n.join(p,n.basename(c));let m=n.normalize(n.resolve(c)).toLowerCase(),g=n.normalize(n.resolve(k.tmpdir())).toLowerCase(),C=m===g||m.startsWith(g+n.sep),l=["/etc","/bin","/sbin","/usr","/root","/sys","/proc","/dev","/private/etc","c:\\windows"].some(f=>m===f||m.startsWith(f+n.sep))||m==="/var"||m.startsWith("/var"+n.sep)&&!m.startsWith("/var/folders"+n.sep)||m==="/private/var"||m.startsWith("/private/var"+n.sep)&&!m.startsWith("/private/var/folders"+n.sep);if(!C&&l)throw new Error(`Refusing to write to unsafe configuration target: ${c}`);if(!o.some(f=>{if(!f)return!1;let u=n.resolve(f);try{u=a.realpathSync(u)}catch{}let v=n.relative(u,c);return v!==".."&&!v.startsWith(`..${n.sep}`)&&!n.isAbsolute(v)}))throw new Error(`Refusing to write configuration outside allowed roots: ${c}`);let y=384;if(a.existsSync(c)){try{y=a.statSync(c).mode}catch{}if(r){let f=a.readFileSync(c,"utf8"),u=`${c}.${Date.now()}.bak`;try{a.writeFileSync(u,f,{encoding:"utf8",mode:y})}catch(v){let x=v instanceof Error?v.message:String(v);throw new Error(`Failed to create safe backup before write: ${x}`)}Q(c)}}let j=O.randomBytes(8).toString("hex"),w=n.join(p,`.tmp.${n.basename(c)}.${process.pid}.${j}`);try{a.writeFileSync(w,t,{encoding:"utf8",mode:y,flag:"wx"});let f=a.existsSync(c);if(s===null&&f)throw new Error("Configuration changed concurrently before it could be created");if(s!=null&&(!f||a.readFileSync(c,"utf8")!==s))throw new Error("Configuration changed concurrently; refusing to overwrite newer content");let u=a.realpathSync(i),v=a.statSync(u);if(u!==p||v.dev!==S.dev||v.ino!==S.ino)throw new Error("Configuration directory changed while writing");a.renameSync(w,c)}catch(f){try{a.existsSync(w)&&a.unlinkSync(w)}catch{}throw f}}async function L(e={}){let t=e.platform||k.platform(),r=e.homeDir||k.homedir(),o=e.appData||process.env.APPDATA,s=e.localAppData||process.env.LOCALAPPDATA,c=!!e.dryRun,i=!!e.remove,p=!!e.bun,S=e.target?e.target.toLowerCase():null,m=p?"bunx":"npx",g=["-y","superpowers-mcp"],C=[];if(!S)throw new Error(`No target client specified. Please specify which client to configure using --target <${Object.keys(b).join("|")}>.`);let h=Object.keys(b).find(d=>d===S||b[d].aliases.includes(S));if(!h)throw new Error(`Unknown harness target: "${S}". Supported targets: ${Object.keys(b).join(", ")}`);let l=[h];for(let d of l){let y=b[d],j=y.getConfigPath(t,r,o,s),w=a.existsSync(j);if(i&&!w){C.push({target:d,name:y.name,path:j,status:"up-to-date",message:"Already not configured (file does not exist)"});continue}try{let f="";w&&(f=a.readFileSync(j,"utf8"));let u="";if(y.type==="yaml")u=T(f,m,g,i);else{let v=typeof y.defaultConfig=="function"?y.defaultConfig(m,g):void 0;u=U(f,y.type,m,g,i,v)}if(f.trim()===u.trim()&&w){C.push({target:d,name:y.name,path:j,status:"up-to-date",message:i?"Already not configured":"Already configured and up-to-date"});continue}c||J(j,u,!!e.backup,[r,o||"",s||""],w?f:null),C.push({target:d,name:y.name,path:j,status:i?"removed":w?"updated":"created",message:c?`[Dry Run] Would ${i?"remove from":w?"update":"create"} ${j}`:`Successfully ${i?"removed from":w?"updated":"configured"}!`})}catch(f){let u=f instanceof Error?f.message:String(f);C.push({target:d,name:y.name,path:j,status:"error",message:u})}}return C}async function R(e=process.argv.slice(2)){let t=!1,r={dryRun:!1,remove:!1,bun:!1,backup:!1,target:null};for(let o=0;o<e.length;o++){let s=e[o];if(!(s==="setup"||s==="install"||s==="--setup"))if(s==="--print-config")t=!0;else if(s==="--dry-run")r.dryRun=!0;else if(s==="--remove"||s==="--uninstall")r.remove=!0;else if(s==="--bun")r.bun=!0;else if(s==="--backup")r.backup=!0;else if(s==="--target"||s==="-t"){let c=e[o+1];if(!c||c.startsWith("-")){console.error(`\u274C Error: Missing value for --target flag.
18
+ `),process.exitCode=1;return}r.target=e[++o]}else if(s.startsWith("--target=")){let c=s.split("=")[1];if(!c){console.error(`\u274C Error: Missing value for --target flag.
19
+ `),process.exitCode=1;return}r.target=c}else if(s==="--help"||s==="-h"){B();return}else if(s.startsWith("-")){console.error(`\u274C Error: Unknown option "${s}". Use --help for usage.
19
20
  `),process.exitCode=1;return}else if(!r.target)r.target=s;else{console.error(`\u274C Error: Unexpected argument "${s}". Use --help for usage.
20
21
  `),process.exitCode=1;return}}if(t){if(r.target||r.remove||r.backup||r.dryRun){console.error("--print-config supports only --bun; omit target and file-operation flags."),process.exitCode=1;return}console.log(JSON.stringify({mcpServers:{superpowers:{command:r.bun?"bunx":"npx",args:["-y","superpowers-mcp"]}}},null,2));return}if(console.log(`
21
22
  ========================================================`),console.log("\u26A1 Superpowers MCP - Targeted Client Setup"),console.log(`========================================================
@@ -23,9 +24,9 @@ ${f.join(`
23
24
  `),console.log(" npx -y superpowers-mcp setup --target lmstudio # LM Studio (~/.lmstudio/mcp.json)"),console.log(" npx -y superpowers-mcp setup --target roo # Roo Code in VS Code Desktop"),console.log(" npx -y superpowers-mcp setup --print-config # JSON for desktop app import"),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)
24
25
  `),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.
25
26
  `),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.
26
- `),process.exitCode=1;return}try{let o=await L(r),s=0,a=0,c=0;for(let g of o){let h=g.status==="created"||g.status==="updated"||g.status==="removed"?"\u2705":g.status==="up-to-date"?"\u2728":g.status==="skipped"?"\u23ED\uFE0F ":"\u274C";console.log(`${h} [${g.name}] (${g.status})`),console.log(` Path: ${g.path}`),console.log(` Info: ${g.message}
27
- `),g.status==="created"||g.status==="updated"||g.status==="up-to-date"||g.status==="removed"?s++:g.status==="skipped"?a++:g.status==="error"&&c++}if(console.log("--------------------------------------------------------"),c>0){console.error(`\u26A0\uFE0F Setup finished with errors: ${c} failure(s), ${s} succeeded.`),process.exitCode=1;return}console.log(`\u{1F389} Setup complete! ${s} environment(s) ready.`)}catch(o){let s=o instanceof Error?o.message:String(o);console.error(`\u274C Setup failed: ${s}
28
- `),process.exitCode=1}}function Y(){console.log(`
27
+ `),process.exitCode=1;return}try{let o=await L(r),s=0,c=0,i=0;for(let p of o){let S=p.status==="created"||p.status==="updated"||p.status==="removed"?"\u2705":p.status==="up-to-date"?"\u2728":p.status==="skipped"?"\u23ED\uFE0F ":"\u274C";console.log(`${S} [${p.name}] (${p.status})`),console.log(` Path: ${p.path}`),console.log(` Info: ${p.message}
28
+ `),p.status==="created"||p.status==="updated"||p.status==="up-to-date"||p.status==="removed"?s++:p.status==="skipped"?c++:p.status==="error"&&i++}if(console.log("--------------------------------------------------------"),i>0){console.error(`\u26A0\uFE0F Setup finished with errors: ${i} failure(s), ${s} succeeded.`),process.exitCode=1;return}console.log(`\u{1F389} Setup complete! ${s} environment(s) ready.`)}catch(o){let s=o instanceof Error?o.message:String(o);console.error(`\u274C Setup failed: ${s}
29
+ `),process.exitCode=1}}function B(){console.log(`
29
30
  Superpowers MCP - Targeted Global Setup
30
31
 
31
32
  Usage:
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.10",
5
+ "version": "6.4.2",
6
6
  "engines": {
7
7
  "node": ">=18"
8
8
  },
@@ -47,7 +47,7 @@
47
47
  "build": "node esbuild.js --production",
48
48
  "watch": "node esbuild.js --watch",
49
49
  "pretest": "npm run build",
50
- "test": "node tests/edge_cases_test.js && node tests/run_test.js && node tests/brainstorm_server_test.js && node tests/prompts_compositions_test.js && node tests/upstream_sync_test.js && node tests/mcp_coverage_test.js && node tests/drift_test.js && node tests/setup_test.js",
50
+ "test": "node tests/edge_cases_test.js && node tests/run_test.js && node tests/brainstorm_server_test.js && node tests/prompts_compositions_test.js && node tests/upstream_sync_test.js && node tests/mcp_coverage_test.js && node tests/drift_test.js && node tests/setup_test.js && bash tests/executing-plans/test-task-start.sh && bash tests/executing-plans/test-task-done.sh",
51
51
  "drift": "node scripts/upstream-drift.js --fetch",
52
52
  "drift:record": "node scripts/upstream-drift.js --record",
53
53
  "prepublishOnly": "npm run build"
@@ -2,6 +2,10 @@
2
2
  /**
3
3
  * Copy skills from the parent superpowers repository into the extension's
4
4
  * own skills/ directory so they are included in the .vsix package.
5
+ *
6
+ * Copies are incremental (unchanged files are skipped) and a manifest records
7
+ * what this script copied so that skills removed/renamed upstream are cleaned up
8
+ * without ever deleting fork-specific skills the manifest does not know about.
5
9
  */
6
10
 
7
11
  const fs = require("fs");
@@ -9,40 +13,111 @@ const path = require("path");
9
13
 
10
14
  const src = path.join(__dirname, "..", "..", "target-learn", "skills");
11
15
  const dest = path.join(__dirname, "..", "skills");
16
+ const manifestPath = path.join(__dirname, ".copy-skills-manifest.json");
12
17
 
13
- function copyRecursive(from, to) {
14
- try {
15
- if (!fs.existsSync(from)) {
16
- console.error(`Source not found: ${from}`);
17
- process.exit(1);
18
- }
18
+ if (!fs.existsSync(src)) {
19
+ console.log(`Source not found, skipping copy: ${src}`);
20
+ process.exit(0);
21
+ }
19
22
 
20
- if (!fs.existsSync(to)) {
21
- fs.mkdirSync(to, { recursive: true });
23
+ function listFiles(root) {
24
+ const out = [];
25
+ const walk = (dir, rel) => {
26
+ let entries;
27
+ try {
28
+ entries = fs.readdirSync(dir, { withFileTypes: true });
29
+ } catch {
30
+ return;
22
31
  }
23
-
24
- const entries = fs.readdirSync(from, { withFileTypes: true });
25
32
  for (const entry of entries) {
26
- const srcPath = path.join(from, entry.name);
27
- const destPath = path.join(to, entry.name);
28
-
29
- // 防禦性設計:過濾符號連結防止無限迴圈或任意讀寫
30
- if (entry.isSymbolicLink()) {
31
- console.warn(`Warning: Skipping symbolic link: ${srcPath}`);
32
- continue;
33
- }
34
-
33
+ const abs = path.join(dir, entry.name);
34
+ const childRel = rel ? `${rel}/${entry.name}` : entry.name;
35
35
  if (entry.isDirectory()) {
36
- copyRecursive(srcPath, destPath);
36
+ walk(abs, childRel);
37
37
  } else if (entry.isFile()) {
38
- fs.copyFileSync(srcPath, destPath);
38
+ out.push(childRel);
39
39
  }
40
40
  }
41
- } catch (err) {
42
- console.error(`Fatal error copying files from "${from}" to "${to}":`, err);
43
- process.exit(1);
41
+ };
42
+ walk(root, "");
43
+ return out.sort();
44
+ }
45
+
46
+ function sameFile(a, b) {
47
+ try {
48
+ const sa = fs.statSync(a);
49
+ const sb = fs.statSync(b);
50
+ return sa.size === sb.size && Math.floor(sa.mtimeMs) === Math.floor(sb.mtimeMs);
51
+ } catch {
52
+ return false;
53
+ }
54
+ }
55
+
56
+ function loadManifest() {
57
+ try {
58
+ const parsed = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
59
+ return Array.isArray(parsed.files) ? parsed.files : [];
60
+ } catch {
61
+ return [];
44
62
  }
45
63
  }
46
64
 
47
- copyRecursive(src, dest);
48
- console.log(`Skills copied from ${src} to ${dest}`);
65
+ const srcFiles = listFiles(src);
66
+ const previousCopied = loadManifest();
67
+ const currentlyCopied = new Set();
68
+
69
+ fs.mkdirSync(dest, { recursive: true });
70
+
71
+ let copied = 0;
72
+ let skipped = 0;
73
+ for (const rel of srcFiles) {
74
+ const from = path.join(src, rel);
75
+ const to = path.join(dest, rel);
76
+ currentlyCopied.add(rel);
77
+ if (fs.existsSync(to) && sameFile(from, to)) {
78
+ skipped++;
79
+ continue; // unchanged — avoid needless disk writes and mtime churn
80
+ }
81
+ fs.mkdirSync(path.dirname(to), { recursive: true });
82
+ fs.copyFileSync(from, to);
83
+ copied++;
84
+ }
85
+
86
+ // Remove only files THIS script copied previously that no longer exist upstream.
87
+ // Fork-specific skills (never in the manifest) are left untouched.
88
+ const currentSet = new Set(srcFiles);
89
+ const stale = previousCopied.filter((rel) => !currentSet.has(rel));
90
+ for (const rel of stale) {
91
+ const target = path.join(dest, rel);
92
+ try {
93
+ if (fs.existsSync(target)) {
94
+ fs.unlinkSync(target);
95
+ }
96
+ } catch {
97
+ // best-effort
98
+ }
99
+ }
100
+
101
+ // Prune directories that are now empty and were part of the previous copy set.
102
+ const staleDirs = [...new Set(stale.map((rel) => path.posix.dirname(rel)))]
103
+ .filter((d) => d && d !== ".")
104
+ .sort((a, b) => b.split("/").length - a.split("/").length);
105
+ for (const dir of staleDirs) {
106
+ const target = path.join(dest, dir);
107
+ try {
108
+ if (fs.existsSync(target) && fs.readdirSync(target).length === 0) {
109
+ fs.rmdirSync(target);
110
+ }
111
+ } catch {
112
+ // best-effort
113
+ }
114
+ }
115
+
116
+ try {
117
+ fs.mkdirSync(path.dirname(manifestPath), { recursive: true });
118
+ fs.writeFileSync(manifestPath, JSON.stringify({ files: [...currentlyCopied].sort() }, null, 2) + "\n", "utf-8");
119
+ } catch {
120
+ // Manifest write is best-effort; a missing manifest just means no stale cleanup next run.
121
+ }
122
+
123
+ console.log(`✅ Copied ${copied} file(s), skipped ${skipped} unchanged, removed ${stale.length} stale file(s).`);
package/scripts/setup.js CHANGED
@@ -7,16 +7,109 @@
7
7
  const path = require("path");
8
8
  const fs = require("fs");
9
9
 
10
- const compiledRunner = path.join(__dirname, "..", "out", "setup-runner.js");
10
+ const repoRoot = path.join(__dirname, "..");
11
+ const compiledRunner = path.join(repoRoot, "out", "setup-runner.js");
12
+ const lockPath = path.join(repoRoot, "out", ".setup-build.lock");
11
13
 
12
- if (!fs.existsSync(compiledRunner)) {
13
- const { execSync } = require("child_process");
14
+ const inputFiles = [
15
+ path.join(repoRoot, "src", "setup-runner.ts"),
16
+ path.join(repoRoot, "src", "setup-cli.ts"),
17
+ path.join(repoRoot, "esbuild.js"),
18
+ path.join(repoRoot, "package.json"),
19
+ ];
20
+
21
+ function sleepSync(ms) {
22
+ // Portable synchronous sleep; blocks this thread while waiting on the lock.
23
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
24
+ }
25
+
26
+ function newestInputMtime() {
27
+ let newest = 0;
28
+ for (const file of inputFiles) {
29
+ try {
30
+ newest = Math.max(newest, fs.statSync(file).mtimeMs);
31
+ } catch {
32
+ // Ignore missing inputs.
33
+ }
34
+ }
35
+ return newest;
36
+ }
37
+
38
+ // Rebuild when the output is missing OR any build input is newer, so edits to the
39
+ // sources are never silently ignored (the old check only tested for existence).
40
+ function needsBuild() {
41
+ if (!fs.existsSync(compiledRunner)) {
42
+ return true;
43
+ }
44
+ try {
45
+ return fs.statSync(compiledRunner).mtimeMs < newestInputMtime();
46
+ } catch {
47
+ return true;
48
+ }
49
+ }
50
+
51
+ function acquireLock() {
52
+ fs.mkdirSync(path.dirname(lockPath), { recursive: true });
53
+ try {
54
+ fs.writeFileSync(lockPath, String(process.pid), { flag: "wx" });
55
+ return true;
56
+ } catch (err) {
57
+ if (err && err.code === "EEXIST") {
58
+ return false; // another build holds the lock
59
+ }
60
+ // Unexpected lock error (e.g. permissions) — proceed without exclusion; the
61
+ // build itself will surface any real failure.
62
+ return true;
63
+ }
64
+ }
65
+
66
+ function releaseLock() {
14
67
  try {
15
- execSync("node esbuild.js", { cwd: path.join(__dirname, ".."), stdio: "inherit" });
16
- } catch (e) {
17
- console.error("Failed to build out/setup-runner.js automatically:", e.message);
68
+ fs.unlinkSync(lockPath);
69
+ } catch {
70
+ // Ignore: we may not own it.
71
+ }
72
+ }
73
+
74
+ function lockIsStale() {
75
+ try {
76
+ return Date.now() - fs.statSync(lockPath).mtimeMs > 120000;
77
+ } catch {
78
+ return false; // already gone
79
+ }
80
+ }
81
+
82
+ if (needsBuild()) {
83
+ const { execSync } = require("child_process");
84
+
85
+ const deadline = Date.now() + 60000;
86
+ let owned = acquireLock();
87
+
88
+ // Wait for a concurrent build to finish (and release the lock) before building,
89
+ // so two invocations never run esbuild at once and interleave writes to out/*.
90
+ while (!owned && needsBuild() && Date.now() < deadline) {
91
+ if (lockIsStale()) {
92
+ releaseLock();
93
+ owned = acquireLock();
94
+ break;
95
+ }
96
+ sleepSync(250);
97
+ }
98
+
99
+ if (owned) {
100
+ try {
101
+ execSync("node esbuild.js", { cwd: repoRoot, stdio: "inherit" });
102
+ } catch (e) {
103
+ console.error("Failed to build out/setup-runner.js automatically:", e.message);
104
+ process.exit(1);
105
+ } finally {
106
+ releaseLock();
107
+ }
108
+ } else if (needsBuild()) {
109
+ console.error("Timed out waiting for a concurrent build of out/setup-runner.js.");
18
110
  process.exit(1);
19
111
  }
112
+ // If !owned but !needsBuild(), another process finished the build — reuse it.
20
113
  }
21
114
 
22
115
  const runner = require(compiledRunner);