superpowers-mcp 6.3.2 → 6.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +146 -222
- package/README.ko.md +146 -222
- package/README.md +146 -225
- package/README.zh-TW.md +146 -223
- package/out/server.js +228 -34
- package/out/setup-runner.js +57 -0
- package/out/setup.js +58 -0
- package/package.json +11 -6
- package/scripts/copy-skills.js +48 -0
- package/scripts/install.ps1 +59 -0
- package/scripts/install.sh +44 -0
- package/scripts/setup.js +31 -0
- package/skills/brainstorming/spec-document-reviewer-prompt.md +1 -0
- package/skills/subagent-driven-development/implementer-prompt.md +1 -0
- package/skills/using-superpowers/SKILL.md +11 -0
- package/skills/using-superpowers/references/devin-tools.md +41 -0
- package/skills/using-superpowers/references/opencode-tools.md +32 -0
- package/skills/writing-plans/SKILL.md +3 -0
- package/skills/writing-plans/plan-document-reviewer-prompt.md +1 -0
|
@@ -0,0 +1,57 @@
|
|
|
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:
|
|
3
|
+
${c.join(`
|
|
4
|
+
`)}
|
|
5
|
+
`;let m=n.findIndex(l=>/^\s*mcp_servers:\s*$/.test(l));if(m===-1)return`${e.trimEnd()}
|
|
6
|
+
|
|
7
|
+
mcp_servers:
|
|
8
|
+
${c.join(`
|
|
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.
|
|
16
|
+
`),process.exit(1))}if(console.log(`
|
|
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)
|
|
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
|
+
`),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(`
|
|
25
|
+
Superpowers MCP - Targeted Global Setup
|
|
26
|
+
|
|
27
|
+
Usage:
|
|
28
|
+
npx -y superpowers-mcp setup --target <name> [options]
|
|
29
|
+
|
|
30
|
+
Options:
|
|
31
|
+
--target, -t <name> Configure specific harness (Required):
|
|
32
|
+
antigravity (agy, gemini), pi-desktop (pi, pi-agent), cursor,
|
|
33
|
+
copilot (vscode), hermes, kimi, claude, devin (windsurf)
|
|
34
|
+
--bun Use "bunx" instead of "npx" in server commands
|
|
35
|
+
--backup Create a timestamped .bak backup before modifying (Default: false, zero-pollution)
|
|
36
|
+
--remove Remove superpowers MCP configuration from target
|
|
37
|
+
--dry-run Preview changes without writing files
|
|
38
|
+
--help, -h Show this help message
|
|
39
|
+
|
|
40
|
+
Examples:
|
|
41
|
+
npx -y superpowers-mcp setup --target antigravity # Configure Antigravity only
|
|
42
|
+
npx -y superpowers-mcp setup --target pi-desktop # Configure Pi Desktop / Pi Agent only
|
|
43
|
+
npx -y superpowers-mcp setup --target cursor # Configure Cursor only
|
|
44
|
+
npx -y superpowers-mcp setup --target copilot # Configure GitHub Copilot (VS Code) only
|
|
45
|
+
npx -y superpowers-mcp setup --target hermes # Configure Hermes Desktop only
|
|
46
|
+
npx -y superpowers-mcp setup --target kimi # Configure Kimi Work only
|
|
47
|
+
npx -y superpowers-mcp setup --target claude # Configure Claude Desktop only
|
|
48
|
+
npx -y superpowers-mcp setup --target devin # Configure Devin Desktop (Windsurf) only
|
|
49
|
+
|
|
50
|
+
Any Directory:
|
|
51
|
+
You can run this command from ANY directory on your machine.
|
|
52
|
+
It automatically resolves global configuration paths based on your user home folder.
|
|
53
|
+
|
|
54
|
+
Privacy & Safety:
|
|
55
|
+
Superpowers MCP only touches the client you explicitly choose.
|
|
56
|
+
It never bulk-modifies your environment without your consent.
|
|
57
|
+
`)}0&&(module.exports={HARNESS_CONFIGS,isPlainObject,runSetup,runSetupCli,safeWriteConfig,stripJsonComments,updateJsonConfig,updateYamlConfig});
|
package/out/setup.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
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:
|
|
4
|
+
${c.join(`
|
|
5
|
+
`)}
|
|
6
|
+
`;let m=n.findIndex(l=>/^\s*mcp_servers:\s*$/.test(l));if(m===-1)return`${e.trimEnd()}
|
|
7
|
+
|
|
8
|
+
mcp_servers:
|
|
9
|
+
${c.join(`
|
|
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.
|
|
17
|
+
`),process.exit(1))}if(console.log(`
|
|
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)
|
|
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
|
+
`),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(`
|
|
26
|
+
Superpowers MCP - Targeted Global Setup
|
|
27
|
+
|
|
28
|
+
Usage:
|
|
29
|
+
npx -y superpowers-mcp setup --target <name> [options]
|
|
30
|
+
|
|
31
|
+
Options:
|
|
32
|
+
--target, -t <name> Configure specific harness (Required):
|
|
33
|
+
antigravity (agy, gemini), pi-desktop (pi, pi-agent), cursor,
|
|
34
|
+
copilot (vscode), hermes, kimi, claude, devin (windsurf)
|
|
35
|
+
--bun Use "bunx" instead of "npx" in server commands
|
|
36
|
+
--backup Create a timestamped .bak backup before modifying (Default: false, zero-pollution)
|
|
37
|
+
--remove Remove superpowers MCP configuration from target
|
|
38
|
+
--dry-run Preview changes without writing files
|
|
39
|
+
--help, -h Show this help message
|
|
40
|
+
|
|
41
|
+
Examples:
|
|
42
|
+
npx -y superpowers-mcp setup --target antigravity # Configure Antigravity only
|
|
43
|
+
npx -y superpowers-mcp setup --target pi-desktop # Configure Pi Desktop / Pi Agent only
|
|
44
|
+
npx -y superpowers-mcp setup --target cursor # Configure Cursor only
|
|
45
|
+
npx -y superpowers-mcp setup --target copilot # Configure GitHub Copilot (VS Code) only
|
|
46
|
+
npx -y superpowers-mcp setup --target hermes # Configure Hermes Desktop only
|
|
47
|
+
npx -y superpowers-mcp setup --target kimi # Configure Kimi Work only
|
|
48
|
+
npx -y superpowers-mcp setup --target claude # Configure Claude Desktop only
|
|
49
|
+
npx -y superpowers-mcp setup --target devin # Configure Devin Desktop (Windsurf) only
|
|
50
|
+
|
|
51
|
+
Any Directory:
|
|
52
|
+
You can run this command from ANY directory on your machine.
|
|
53
|
+
It automatically resolves global configuration paths based on your user home folder.
|
|
54
|
+
|
|
55
|
+
Privacy & Safety:
|
|
56
|
+
Superpowers MCP only touches the client you explicitly choose.
|
|
57
|
+
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});
|
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.
|
|
5
|
+
"version": "6.3.4",
|
|
6
6
|
"publisher": "superpowers",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"repository": {
|
|
@@ -23,22 +23,27 @@
|
|
|
23
23
|
"agent"
|
|
24
24
|
],
|
|
25
25
|
"bin": {
|
|
26
|
-
"superpowers-mcp": "./out/server.js"
|
|
26
|
+
"superpowers-mcp": "./out/server.js",
|
|
27
|
+
"superpowers-setup": "./out/setup.js"
|
|
27
28
|
},
|
|
28
29
|
"files": [
|
|
29
30
|
"out/server.js",
|
|
31
|
+
"out/setup.js",
|
|
32
|
+
"out/setup-runner.js",
|
|
33
|
+
"scripts",
|
|
30
34
|
"skills"
|
|
31
35
|
],
|
|
32
36
|
"overrides": {
|
|
33
|
-
"@hono/node-server": "2.
|
|
34
|
-
"fast-uri": "4.1.
|
|
35
|
-
"hono": "4.13.
|
|
37
|
+
"@hono/node-server": "^2.1.1",
|
|
38
|
+
"fast-uri": "^4.1.3",
|
|
39
|
+
"hono": "^4.13.7",
|
|
40
|
+
"qs": "^6.16.0"
|
|
36
41
|
},
|
|
37
42
|
"scripts": {
|
|
38
43
|
"build": "node esbuild.js --production",
|
|
39
44
|
"watch": "node esbuild.js --watch",
|
|
40
45
|
"pretest": "npm run build",
|
|
41
|
-
"test": "node tests/edge_cases_test.js && node tests/run_test.js && node tests/brainstorm_server_test.js",
|
|
46
|
+
"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/setup_test.js",
|
|
42
47
|
"prepublishOnly": "npm run build"
|
|
43
48
|
},
|
|
44
49
|
"devDependencies": {
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Copy skills from the parent superpowers repository into the extension's
|
|
4
|
+
* own skills/ directory so they are included in the .vsix package.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const fs = require("fs");
|
|
8
|
+
const path = require("path");
|
|
9
|
+
|
|
10
|
+
const src = path.join(__dirname, "..", "..", "target-learn", "skills");
|
|
11
|
+
const dest = path.join(__dirname, "..", "skills");
|
|
12
|
+
|
|
13
|
+
function copyRecursive(from, to) {
|
|
14
|
+
try {
|
|
15
|
+
if (!fs.existsSync(from)) {
|
|
16
|
+
console.error(`Source not found: ${from}`);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (!fs.existsSync(to)) {
|
|
21
|
+
fs.mkdirSync(to, { recursive: true });
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const entries = fs.readdirSync(from, { withFileTypes: true });
|
|
25
|
+
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
|
+
|
|
35
|
+
if (entry.isDirectory()) {
|
|
36
|
+
copyRecursive(srcPath, destPath);
|
|
37
|
+
} else if (entry.isFile()) {
|
|
38
|
+
fs.copyFileSync(srcPath, destPath);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
} catch (err) {
|
|
42
|
+
console.error(`Fatal error copying files from "${from}" to "${to}":`, err);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
copyRecursive(src, dest);
|
|
48
|
+
console.log(`Skills copied from ${src} to ${dest}`);
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# ==============================================================================
|
|
2
|
+
# Superpowers MCP - One-Click Global Installer (Windows PowerShell)
|
|
3
|
+
# Usage:
|
|
4
|
+
# irm https://raw.githubusercontent.com/Poseidoncode/superpowers-mcp/main/scripts/install.ps1 | iex
|
|
5
|
+
# & ([scriptblock]::Create((irm https://raw.githubusercontent.com/Poseidoncode/superpowers-mcp/main/scripts/install.ps1))) -Target cursor
|
|
6
|
+
# .\scripts\install.ps1 -Target cursor
|
|
7
|
+
# ==============================================================================
|
|
8
|
+
|
|
9
|
+
[CmdletBinding()]
|
|
10
|
+
param (
|
|
11
|
+
[string]$Target = "",
|
|
12
|
+
[switch]$Bun,
|
|
13
|
+
[switch]$Remove,
|
|
14
|
+
[switch]$Backup,
|
|
15
|
+
[switch]$DryRun
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
$ErrorActionPreference = "Stop"
|
|
19
|
+
|
|
20
|
+
Write-Host ""
|
|
21
|
+
Write-Host "========================================================" -ForegroundColor Cyan
|
|
22
|
+
Write-Host "⚡ Superpowers MCP - One-Click Global Setup (Windows)" -ForegroundColor Cyan
|
|
23
|
+
Write-Host "========================================================" -ForegroundColor Cyan
|
|
24
|
+
Write-Host ""
|
|
25
|
+
|
|
26
|
+
$argsList = @()
|
|
27
|
+
if ($Target) { $argsList += "--target", $Target }
|
|
28
|
+
if ($Bun) { $argsList += "--bun" }
|
|
29
|
+
if ($Remove) { $argsList += "--remove" }
|
|
30
|
+
if ($Backup) { $argsList += "--backup" }
|
|
31
|
+
if ($DryRun) { $argsList += "--dry-run" }
|
|
32
|
+
|
|
33
|
+
# Check for local setup.js
|
|
34
|
+
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path -ErrorAction SilentlyContinue
|
|
35
|
+
$localSetup = if ($scriptDir) { Join-Path $scriptDir "setup.js" } else { "" }
|
|
36
|
+
|
|
37
|
+
if ($localSetup -and (Test-Path $localSetup) -and (Get-Command node -ErrorAction SilentlyContinue)) {
|
|
38
|
+
Write-Host "📦 Using local setup engine..." -ForegroundColor Green
|
|
39
|
+
& node $localSetup @argsList
|
|
40
|
+
exit $LASTEXITCODE
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
# Check for bunx or npx
|
|
44
|
+
$runner = $null
|
|
45
|
+
if (Get-Command bunx -ErrorAction SilentlyContinue) {
|
|
46
|
+
$runner = "bunx"
|
|
47
|
+
} elseif (Get-Command npx -ErrorAction SilentlyContinue) {
|
|
48
|
+
$runner = "npx"
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if ($runner) {
|
|
52
|
+
Write-Host "🚀 Running global setup via $runner..." -ForegroundColor Green
|
|
53
|
+
& $runner -y superpowers-mcp setup @argsList
|
|
54
|
+
exit $LASTEXITCODE
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
Write-Host "❌ Error: Node.js (npx) or Bun (bunx) is required to run Superpowers MCP." -ForegroundColor Red
|
|
58
|
+
Write-Host "Please install Node.js from https://nodejs.org or Bun from https://bun.sh and try again." -ForegroundColor Yellow
|
|
59
|
+
exit 1
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ==============================================================================
|
|
3
|
+
# Superpowers MCP - One-Click Global Installer (macOS & Linux)
|
|
4
|
+
# Usage:
|
|
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>
|
|
7
|
+
# ==============================================================================
|
|
8
|
+
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
|
|
11
|
+
echo ""
|
|
12
|
+
echo "========================================================"
|
|
13
|
+
echo "⚡ Superpowers MCP - One-Click Global Setup (macOS / Linux)"
|
|
14
|
+
echo "========================================================"
|
|
15
|
+
echo ""
|
|
16
|
+
|
|
17
|
+
# Find Node / Bun runtime
|
|
18
|
+
RUNNER=""
|
|
19
|
+
if command -v bunx >/dev/null 2>&1; then
|
|
20
|
+
RUNNER="bunx"
|
|
21
|
+
elif command -v npx >/dev/null 2>&1; then
|
|
22
|
+
RUNNER="npx"
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
# Check if running from local repository clone safely
|
|
26
|
+
SCRIPT_DIR=""
|
|
27
|
+
if [ -n "${BASH_SOURCE[0]:-}" ]; then
|
|
28
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd || echo "")"
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
if [ -n "$SCRIPT_DIR" ] && [ -f "$SCRIPT_DIR/setup.js" ] && command -v node >/dev/null 2>&1; then
|
|
32
|
+
echo "📦 Using local setup engine..."
|
|
33
|
+
exec node "$SCRIPT_DIR/setup.js" "$@"
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
if [ -n "$RUNNER" ]; then
|
|
37
|
+
echo "🚀 Running global setup via $RUNNER..."
|
|
38
|
+
$RUNNER -y superpowers-mcp setup "$@"
|
|
39
|
+
exit $?
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
echo "❌ Error: Node.js (npx) or Bun (bunx) is required to run Superpowers MCP."
|
|
43
|
+
echo "Please install Node.js from https://nodejs.org or Bun from https://bun.sh and try again."
|
|
44
|
+
exit 1
|
package/scripts/setup.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Superpowers MCP - Global Setup Forwarder Wrapper
|
|
4
|
+
* Forwards calls to compiled out/setup.js (Single Source of Truth: src/setup-runner.ts)
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const path = require("path");
|
|
8
|
+
const fs = require("fs");
|
|
9
|
+
|
|
10
|
+
const compiledRunner = path.join(__dirname, "..", "out", "setup-runner.js");
|
|
11
|
+
|
|
12
|
+
if (!fs.existsSync(compiledRunner)) {
|
|
13
|
+
const { execSync } = require("child_process");
|
|
14
|
+
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);
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const runner = require(compiledRunner);
|
|
23
|
+
|
|
24
|
+
module.exports = runner;
|
|
25
|
+
|
|
26
|
+
if (require.main === module) {
|
|
27
|
+
runner.runSetupCli().catch((err) => {
|
|
28
|
+
console.error("❌ Fatal error during setup execution:", err);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
@@ -22,6 +22,7 @@ Subagent (general-purpose):
|
|
|
22
22
|
| Consistency | Internal contradictions, conflicting requirements |
|
|
23
23
|
| Clarity | Requirements ambiguous enough to cause someone to build the wrong thing |
|
|
24
24
|
| Scope | Focused enough for a single plan — not covering multiple independent subsystems |
|
|
25
|
+
| Architecture | Units with clear boundaries, well-defined interfaces, independently understandable and testable |
|
|
25
26
|
| YAGNI | Unrequested features, over-engineering |
|
|
26
27
|
|
|
27
28
|
## Calibration
|
|
@@ -17,6 +17,7 @@ Subagent (general-purpose):
|
|
|
17
17
|
|
|
18
18
|
Read your task brief first: [BRIEF_FILE]
|
|
19
19
|
It contains the full task text from the plan.
|
|
20
|
+
If your task brief specifies a **Recommended Skill** (e.g. `superpowers:test-driven-development`), adhere strictly to that skill's workflow and principles during implementation.
|
|
20
21
|
|
|
21
22
|
## Context
|
|
22
23
|
|
|
@@ -30,6 +30,15 @@ When multiple skills apply, process skills come first — they set the approach,
|
|
|
30
30
|
- "Let's build X" → superpowers:brainstorming first, then implementation skills.
|
|
31
31
|
- "Fix this bug" → superpowers:systematic-debugging first, then domain skills.
|
|
32
32
|
|
|
33
|
+
## Skill Compositions & Pipelines
|
|
34
|
+
|
|
35
|
+
Complex engineering workflows chain multiple skills end-to-end (see `docs/skill-compositions.md`):
|
|
36
|
+
|
|
37
|
+
- **Feature Pipeline:** `brainstorming` → `writing-plans` → `using-git-worktrees` → `subagent-driven-development` (with `test-driven-development`) → `verification-before-completion` → `requesting-code-review` → `finishing-a-development-branch`
|
|
38
|
+
- **Troubleshooting Pipeline:** `systematic-debugging` → `using-git-worktrees` → `dispatching-parallel-agents` → `test-driven-development` → `verification-before-completion` → `requesting-code-review`
|
|
39
|
+
- **Refactoring Pipeline:** `brainstorming` → `writing-plans` (skeleton-first) → `using-git-worktrees` → `subagent-driven-development` → `verification-before-completion` → `requesting-code-review`
|
|
40
|
+
|
|
41
|
+
|
|
33
42
|
## Red Flags
|
|
34
43
|
|
|
35
44
|
These thoughts mean STOP—you're rationalizing:
|
|
@@ -57,6 +66,8 @@ If your harness appears here, read its reference file for special instructions:
|
|
|
57
66
|
- Pi: `references/pi-tools.md`
|
|
58
67
|
- Antigravity: `references/antigravity-tools.md`
|
|
59
68
|
- Hermes Agent: `references/hermes-tools.md`
|
|
69
|
+
- Devin CLI: `references/devin-tools.md`
|
|
70
|
+
- OpenCode: `references/opencode-tools.md`
|
|
60
71
|
|
|
61
72
|
## User Instructions
|
|
62
73
|
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Devin CLI Tool Mapping
|
|
2
|
+
|
|
3
|
+
Skills speak in actions ("dispatch a subagent", "create a todo", "read a file"). On Devin CLI these resolve to the tools below.
|
|
4
|
+
|
|
5
|
+
## Tools
|
|
6
|
+
|
|
7
|
+
| Action skills request | Devin CLI tool |
|
|
8
|
+
|---|---|
|
|
9
|
+
| Read a file | `read_file` / `view_file` |
|
|
10
|
+
| Create a new file | `write_to_file` |
|
|
11
|
+
| Edit a file (targeted patch) | `replace_file_content` / `edit_file` |
|
|
12
|
+
| Run a shell command | `run_command` |
|
|
13
|
+
| Search file contents | `grep_search` |
|
|
14
|
+
| Find files by name | `find_by_name` / `list_dir` |
|
|
15
|
+
| Fetch a URL / read a webpage | `read_url_content` / `browser` |
|
|
16
|
+
| Search the web | `search_web` |
|
|
17
|
+
| Dispatch a subagent | `invoke_subagent` / `spawn_agent` |
|
|
18
|
+
| Task tracking | `task_list` / session todo list |
|
|
19
|
+
| Ask user question | `ask_question` |
|
|
20
|
+
| Invoke a skill | Native `skill` tool or `read_skill` via MCP |
|
|
21
|
+
|
|
22
|
+
## Instructions file
|
|
23
|
+
|
|
24
|
+
When a skill mentions "your instructions file," on Devin CLI this is **`DEVIN.md`** or **`AGENTS.md`** in the project root directory.
|
|
25
|
+
|
|
26
|
+
## Invoking a skill
|
|
27
|
+
|
|
28
|
+
Devin CLI auto-discovers skills from installed plugins. To invoke a superpowers skill, invoke the native skill runner or call the MCP tool:
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
skill(name="brainstorming")
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
If native skill resolution is unavailable, fall back to reading the skill file directly or via the MCP server's `read_skill` tool.
|
|
35
|
+
|
|
36
|
+
## Subagent dispatch
|
|
37
|
+
|
|
38
|
+
When executing Subagent-Driven Development (SDD) or parallel dispatch, use Devin's subagent capability (`invoke_subagent`):
|
|
39
|
+
|
|
40
|
+
- **Implementers**: Dispatch focused implementer subagents for single task isolation.
|
|
41
|
+
- **Reviewers**: Dispatch fresh, independent reviewer subagents to review against specifications.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# OpenCode Tool Mapping
|
|
2
|
+
|
|
3
|
+
Skills speak in actions ("dispatch a subagent", "create a todo", "read a file"). On OpenCode these resolve to the tools below.
|
|
4
|
+
|
|
5
|
+
## Tools
|
|
6
|
+
|
|
7
|
+
| Action skills request | OpenCode tool |
|
|
8
|
+
|---|---|
|
|
9
|
+
| Read a file | `read_file` |
|
|
10
|
+
| Create a new file | `write_file` |
|
|
11
|
+
| Edit a file (targeted patch) | `edit_file` |
|
|
12
|
+
| Run a shell command | `bash` / `terminal` |
|
|
13
|
+
| Search file contents | `grep` / `search_files` |
|
|
14
|
+
| Find files by name | `find_files` |
|
|
15
|
+
| Fetch a URL / read a webpage | `fetch_url` |
|
|
16
|
+
| Search the web | `web_search` |
|
|
17
|
+
| Invoke a skill | `use_skill(name="...")` or MCP `read_skill` |
|
|
18
|
+
| List available skills | `find_skills` or MCP `list_skills` |
|
|
19
|
+
|
|
20
|
+
## Instructions file
|
|
21
|
+
|
|
22
|
+
When a skill mentions "your instructions file," on OpenCode this is **`AGENTS.md`** or **`OPENCODE.md`** in the project root directory.
|
|
23
|
+
|
|
24
|
+
## Invoking a skill
|
|
25
|
+
|
|
26
|
+
OpenCode discovers registered skills via its plugin ecosystem or MCP server. To invoke a skill:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
use_skill(name="brainstorming")
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Or when running through the Superpowers MCP Server, use `read_skill(skill_name="brainstorming")`.
|
|
@@ -108,6 +108,8 @@ include this section.]
|
|
|
108
108
|
````markdown
|
|
109
109
|
### Task N: [Component Name]
|
|
110
110
|
|
|
111
|
+
**Recommended Skill:** `superpowers:test-driven-development` (or relevant skill)
|
|
112
|
+
|
|
111
113
|
**Files:**
|
|
112
114
|
- Create: `exact/path/to/file.py`
|
|
113
115
|
- Modify: `exact/path/to/existing.py:123-145`
|
|
@@ -119,6 +121,7 @@ include this section.]
|
|
|
119
121
|
and return types. A task's implementer sees only their own task; this
|
|
120
122
|
block is how they learn the names and types neighboring tasks use.]
|
|
121
123
|
|
|
124
|
+
|
|
122
125
|
- [ ] **Step 1: Write the failing test**
|
|
123
126
|
|
|
124
127
|
```python
|
|
@@ -22,6 +22,7 @@ Subagent (general-purpose):
|
|
|
22
22
|
| Completeness | TODOs, placeholders, incomplete tasks, missing steps |
|
|
23
23
|
| Spec Alignment | Plan covers spec requirements, no major scope creep |
|
|
24
24
|
| Task Decomposition | Tasks have clear boundaries, steps are actionable |
|
|
25
|
+
| Architecture | File structure has units with clear boundaries, no files growing too large to reason about |
|
|
25
26
|
| Buildability | Could an engineer follow this plan without getting stuck? |
|
|
26
27
|
|
|
27
28
|
## Calibration
|