oh-my-agent 8.47.0 → 8.47.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/bin/cli.js +2 -2
  2. package/package.json +1 -1
package/bin/cli.js CHANGED
@@ -1218,7 +1218,7 @@ ${hc}
1218
1218
 
1219
1219
  Read and follow [.agents/workflows/${K}.md](../../.agents/workflows/${K}.md) step by step.
1220
1220
  `;r2.writeFileSync(Z,Y)}}function sU2($,z){let G=x5($,".agents","rules");if(!r2.existsSync(G))return;let J=x5(z,".agents","rules");p8(J),r2.mkdirSync(J,{recursive:!0}),r2.cpSync(G,J,{recursive:!0,force:!0})}function tU2($,z,G=!1){let J=x5($,".agents","config");if(r2.existsSync(J)){let U=x5(z,".agents","config");if(r2.mkdirSync(U,{recursive:!0}),G)r2.cpSync(J,U,{recursive:!0,force:!0});else for(let Z of r2.readdirSync(J,{withFileTypes:!0})){let Y=x5(U,Z.name),W=x5(J,Z.name);if(!r2.existsSync(Y))r2.cpSync(W,Y,Z.isDirectory()?{recursive:!0}:{})}}let Q=x5($,".agents","mcp.json");if(r2.existsSync(Q)){let U=x5(z,".agents");r2.mkdirSync(U,{recursive:!0});let Z=x5(U,"mcp.json");if(G||!r2.existsSync(Z))r2.cpSync(Q,Z)}let K=x5($,".agents","oma-config.yaml");if(r2.existsSync(K)){let U=x5(z,".agents");r2.mkdirSync(U,{recursive:!0});let Z=x5(U,"oma-config.yaml");if(G||!r2.existsSync(Z))r2.cpSync(K,Z)}}function iK(){return[...Y9.domain,...Y9.design,...Y9.coordination,...Y9.utility,...Y9.infrastructure]}function eU2($){let z=x5($,".agents","mcp.json");if(!r2.existsSync(z))return;let G=x5($,".cursor"),J=x5(G,"mcp.json"),Q={};try{let Z=r2.readFileSync(z,"utf-8"),Y=JSON.parse(Z);if(Y&&typeof Y==="object"&&!Array.isArray(Y))Q=Y}catch{return}let K={};if(Q.mcpServers)K.mcpServers=Q.mcpServers;let U=FU2(K);try{if(r2.lstatSync(J).isSymbolicLink())r2.unlinkSync(J)}catch{}r2.mkdirSync(G,{recursive:!0}),r2.writeFileSync(J,`${JSON.stringify(U,null,2)}
1221
- `)}var tZ5=new Set(["antigravity","claude","codex","cursor","gemini","grok","kiro","qwen"]);function $Z2($){return tZ5.has($)}function yD($){return MM.includes($)}function eZ5($,z){let G=Y3[$];if(G.requiresHomeConsent===!0)return x5(oZ5(),G.homePath);let J="project";try{J=C7()}catch{J="project"}if(J==="global")return x5(z,G.homePath);return x5(z,G.projectPath)}function fc($,z){return eZ5(z,$)}function wY($){return Boolean(Y3[$].requiresHomeConsent)}function zZ2($){let z=Y3[$];return z.requiresHomeConsent?`~/${z.homePath}`:z.projectPath}function vY($,z,G){let J=[],Q=[],K=IY($,Z1);try{r2.realpathSync(K)}catch{return{created:J,skipped:Q}}for(let U of z){let Z=Y3[U],Y=Z.requiresHomeConsent?Z.homePath:Z.projectPath,W=fc($,U);if(!r2.existsSync(W))r2.mkdirSync(W,{recursive:!0});for(let B of G){let V=x5(K,B),L=x5(W,B);if(!r2.existsSync(V)){Q.push(`${Y}/${B} (source missing)`);continue}try{if(r2.lstatSync(L).isSymbolicLink()){if(IY(rZ5(L),r2.readlinkSync(L))===IY(V)){Q.push(`${Y}/${B} (already linked)`);continue}r2.unlinkSync(L)}else{Q.push(`${Y}/${B} (real dir exists)`);continue}}catch{}let X=pU2(W,V);try{Eq(X,L,"dir",K)}catch(H){if(H instanceof Error&&H.message.startsWith("createLink: target")){Q.push(`${Y}/${B} (source escapes SSOT base)`);continue}throw H}J.push(`${Y}/${B}`)}}return{created:J,skipped:Q}}function bq($){let z=x5($,Z1);if(!r2.existsSync(z))return[];return r2.readdirSync(z,{withFileTypes:!0}).filter((G)=>G.isDirectory()&&!G.name.startsWith("_")).map((G)=>G.name)}function GZ2($){let z=[];for(let G of Object.keys(Y3))if(r2.existsSync(fc($,G)))z.push(G);return z}function cK(){try{return mc("gh --version",{stdio:"ignore"}),!0}catch{return!1}}function o0(){try{return mc("gh auth status",{stdio:"ignore"}),!0}catch{return!1}}function lK(){try{return mc(`gh api user/starred/${v1}`,{stdio:"ignore"}),!0}catch{return!1}}function JZ2(){return cK()&&o0()&&lK()}import{existsSync as $W5,readFileSync as zW5}from"node:fs";import{homedir as GW5}from"node:os";import{join as JW5}from"node:path";function TY($=process.env){if($.ANTIGRAVITY_API_KEY?.trim())return!0;let z=JW5(GW5(),".gemini","antigravity-cli","cache","onboarding.json");if(!$W5(z))return!1;try{let G=JSON.parse(zW5(z,"utf-8"));return G.onboardingComplete===!0||G.consumerOnboardingComplete===!0||G.enterpriseOnboardingComplete===!0}catch{return!1}}import{execSync as QW5}from"node:child_process";function EY(){try{let $=QW5("claude auth status",{stdio:["pipe","pipe","ignore"],encoding:"utf-8"});return JSON.parse($).loggedIn===!0}catch{return!1}}import{existsSync as KW5,readFileSync as UW5}from"node:fs";import{homedir as ZW5}from"node:os";import{join as WW5}from"node:path";function PY(){let $=WW5(ZW5(),".codex","auth.json");if(!KW5($))return!1;try{return!!JSON.parse(UW5($,"utf-8")).tokens?.access_token}catch{return!1}}import{existsSync as YW5}from"node:fs";import{homedir as QZ2}from"node:os";import{join as KZ2}from"node:path";var BW5=[KZ2(QZ2(),".commandcode","config.json"),KZ2(QZ2(),".commandcode","auth.json")];function UZ2($=process.env){if($.COMMANDCODE_API_KEY?.trim())return!0;return BW5.some(YW5)}import{execSync as VW5}from"node:child_process";var XW5=["cursor agent status","cursor-agent status"];function LW5($){return!!$.CURSOR_API_KEY?.trim()}function HW5($){try{let G=JSON.parse($);if(typeof G?.authenticated==="boolean")return G.authenticated;if(typeof G?.loggedIn==="boolean")return G.loggedIn}catch{}let z=$.toLowerCase();if(/\b(not authenticated|not logged in|logged out|unauthenticated)\b/.test(z))return!1;return/\b(authenticated|logged in|login successful)\b/.test(z)}function ZZ2($=process.env){if(LW5($))return!0;for(let z of XW5)try{let G=VW5(z,{stdio:["pipe","pipe","ignore"],encoding:"utf-8"});if(HW5(G))return!0}catch{}return!1}import{existsSync as qW5,readFileSync as kW5}from"node:fs";import{homedir as FW5}from"node:os";import{join as jW5}from"node:path";function CY(){let $=jW5(FW5(),".gemini","oauth_creds.json");if(!qW5($))return!1;try{let z=JSON.parse(kW5($,"utf-8"));return!!(z.access_token&&z.refresh_token)}catch{return!1}}import{existsSync as NW5,readFileSync as AW5}from"node:fs";import{homedir as MW5}from"node:os";import{join as OW5}from"node:path";var WZ2=OW5(MW5(),".grok","auth.json");function SD($=process.env){if($.XAI_API_KEY?.trim())return!0;if(!NW5(WZ2))return!1;try{let z=JSON.parse(AW5(WZ2,"utf-8"));if(typeof z!=="object"||z===null)return!1;for(let G of Object.values(z))if(G&&typeof G==="object"){let J=G;if(typeof J.key==="string"&&J.key.length>0)return!0;if(typeof J.refresh_token==="string"&&J.refresh_token.length>0)return!0}return!1}catch{return!1}}import{execSync as IW5}from"node:child_process";function xD(){try{return IW5("kiro-cli whoami",{stdio:["pipe","pipe","ignore"],encoding:"utf-8",timeout:5000}),!0}catch{return!1}}import{existsSync as DW5,readFileSync as RW5}from"node:fs";import{homedir as wW5}from"node:os";import{join as YZ2}from"node:path";var vW5=["ANTHROPIC_API_KEY","OPENAI_API_KEY","GEMINI_API_KEY","GOOGLE_API_KEY","DEEPSEEK_API_KEY","XAI_API_KEY","MISTRAL_API_KEY","AZURE_OPENAI_API_KEY"];function TW5($){let z=$.PI_CODING_AGENT_DIR?.trim();if(z)return z;return YZ2(wW5(),".pi","agent")}function hD($=process.env){if(vW5.some((G)=>$[G]?.trim()))return!0;let z=YZ2(TW5($),"auth.json");if(!DW5(z))return!1;try{let G=JSON.parse(RW5(z,"utf-8"));if(typeof G!=="object"||G===null)return!1;return Object.values(G).some((J)=>{if(typeof J==="string")return J.length>0;if(J&&typeof J==="object")return Object.keys(J).length>0;return!1})}catch{return!1}}import{existsSync as BZ2,readFileSync as VZ2,statSync as EW5}from"node:fs";import{homedir as _q}from"node:os";import{join as yq}from"node:path";function uY(){let $=yq(_q(),".qwen","settings.json");if(!BZ2($))return!1;try{return!!JSON.parse(VZ2($,"utf-8")).security?.auth?.selectedType}catch{return!1}}var PW5=new Date("2026-04-15T00:00:00Z"),CW5=[yq(_q(),".qwen","oauth.json"),yq(_q(),".qwen","credentials.json"),yq(_q(),".config","qwen","auth.json"),yq(_q(),".config","qwen","credentials.json")],uW5=new Set(["refresh_token","oauth_token","oauth_secret","access_token","oauth_callback_confirmed"]),bW5=["oauth_","oauth2_","oidc_"],_W5=new Set(["api_key","bearer"]);function yW5($){let z=Object.keys($),G=z.some((Q)=>uW5.has(Q)||bW5.some((K)=>Q.startsWith(K))),J=z.some((Q)=>_W5.has(Q));return G&&!J}function XZ2(){for(let $ of CW5){if(!BZ2($))continue;try{let G=EW5($).mtime<PW5,J=VZ2($,"utf-8"),Q=JSON.parse(J);if(typeof Q!=="object"||Q===null||Array.isArray(Q))continue;if(G&&yW5(Q))return{hasLegacySession:!0,tokenPath:$,migrationNeeded:!0}}catch{}}return{hasLegacySession:!1,migrationNeeded:!1}}function LZ2($){if(!$.hasLegacySession||!$.migrationNeeded)return;let z=$.tokenPath??"(unknown path)";process.stderr.write(["","⚠ Qwen OAuth sessions were deprecated on 2026-04-15.",`Your credentials at ${z} appear to be legacy OAuth.`,"To continue using Qwen Code, run:"," qwen /auth","and re-authenticate with an API key.",""].join(`
1221
+ `)}var tZ5=new Set(["antigravity","claude","codex","commandcode","cursor","gemini","grok","kiro","qwen"]);function $Z2($){return tZ5.has($)}function yD($){return MM.includes($)}function eZ5($,z){let G=Y3[$];if(G.requiresHomeConsent===!0)return x5(oZ5(),G.homePath);let J="project";try{J=C7()}catch{J="project"}if(J==="global")return x5(z,G.homePath);return x5(z,G.projectPath)}function fc($,z){return eZ5(z,$)}function wY($){return Boolean(Y3[$].requiresHomeConsent)}function zZ2($){let z=Y3[$];return z.requiresHomeConsent?`~/${z.homePath}`:z.projectPath}function vY($,z,G){let J=[],Q=[],K=IY($,Z1);try{r2.realpathSync(K)}catch{return{created:J,skipped:Q}}for(let U of z){let Z=Y3[U],Y=Z.requiresHomeConsent?Z.homePath:Z.projectPath,W=fc($,U);if(!r2.existsSync(W))r2.mkdirSync(W,{recursive:!0});for(let B of G){let V=x5(K,B),L=x5(W,B);if(!r2.existsSync(V)){Q.push(`${Y}/${B} (source missing)`);continue}try{if(r2.lstatSync(L).isSymbolicLink()){if(IY(rZ5(L),r2.readlinkSync(L))===IY(V)){Q.push(`${Y}/${B} (already linked)`);continue}r2.unlinkSync(L)}else{Q.push(`${Y}/${B} (real dir exists)`);continue}}catch{}let X=pU2(W,V);try{Eq(X,L,"dir",K)}catch(H){if(H instanceof Error&&H.message.startsWith("createLink: target")){Q.push(`${Y}/${B} (source escapes SSOT base)`);continue}throw H}J.push(`${Y}/${B}`)}}return{created:J,skipped:Q}}function bq($){let z=x5($,Z1);if(!r2.existsSync(z))return[];return r2.readdirSync(z,{withFileTypes:!0}).filter((G)=>G.isDirectory()&&!G.name.startsWith("_")).map((G)=>G.name)}function GZ2($){let z=[];for(let G of Object.keys(Y3))if(r2.existsSync(fc($,G)))z.push(G);return z}function cK(){try{return mc("gh --version",{stdio:"ignore"}),!0}catch{return!1}}function o0(){try{return mc("gh auth status",{stdio:"ignore"}),!0}catch{return!1}}function lK(){try{return mc(`gh api user/starred/${v1}`,{stdio:"ignore"}),!0}catch{return!1}}function JZ2(){return cK()&&o0()&&lK()}import{existsSync as $W5,readFileSync as zW5}from"node:fs";import{homedir as GW5}from"node:os";import{join as JW5}from"node:path";function TY($=process.env){if($.ANTIGRAVITY_API_KEY?.trim())return!0;let z=JW5(GW5(),".gemini","antigravity-cli","cache","onboarding.json");if(!$W5(z))return!1;try{let G=JSON.parse(zW5(z,"utf-8"));return G.onboardingComplete===!0||G.consumerOnboardingComplete===!0||G.enterpriseOnboardingComplete===!0}catch{return!1}}import{execSync as QW5}from"node:child_process";function EY(){try{let $=QW5("claude auth status",{stdio:["pipe","pipe","ignore"],encoding:"utf-8"});return JSON.parse($).loggedIn===!0}catch{return!1}}import{existsSync as KW5,readFileSync as UW5}from"node:fs";import{homedir as ZW5}from"node:os";import{join as WW5}from"node:path";function PY(){let $=WW5(ZW5(),".codex","auth.json");if(!KW5($))return!1;try{return!!JSON.parse(UW5($,"utf-8")).tokens?.access_token}catch{return!1}}import{existsSync as YW5}from"node:fs";import{homedir as QZ2}from"node:os";import{join as KZ2}from"node:path";var BW5=[KZ2(QZ2(),".commandcode","config.json"),KZ2(QZ2(),".commandcode","auth.json")];function UZ2($=process.env){if($.COMMANDCODE_API_KEY?.trim())return!0;return BW5.some(YW5)}import{execSync as VW5}from"node:child_process";var XW5=["cursor agent status","cursor-agent status"];function LW5($){return!!$.CURSOR_API_KEY?.trim()}function HW5($){try{let G=JSON.parse($);if(typeof G?.authenticated==="boolean")return G.authenticated;if(typeof G?.loggedIn==="boolean")return G.loggedIn}catch{}let z=$.toLowerCase();if(/\b(not authenticated|not logged in|logged out|unauthenticated)\b/.test(z))return!1;return/\b(authenticated|logged in|login successful)\b/.test(z)}function ZZ2($=process.env){if(LW5($))return!0;for(let z of XW5)try{let G=VW5(z,{stdio:["pipe","pipe","ignore"],encoding:"utf-8"});if(HW5(G))return!0}catch{}return!1}import{existsSync as qW5,readFileSync as kW5}from"node:fs";import{homedir as FW5}from"node:os";import{join as jW5}from"node:path";function CY(){let $=jW5(FW5(),".gemini","oauth_creds.json");if(!qW5($))return!1;try{let z=JSON.parse(kW5($,"utf-8"));return!!(z.access_token&&z.refresh_token)}catch{return!1}}import{existsSync as NW5,readFileSync as AW5}from"node:fs";import{homedir as MW5}from"node:os";import{join as OW5}from"node:path";var WZ2=OW5(MW5(),".grok","auth.json");function SD($=process.env){if($.XAI_API_KEY?.trim())return!0;if(!NW5(WZ2))return!1;try{let z=JSON.parse(AW5(WZ2,"utf-8"));if(typeof z!=="object"||z===null)return!1;for(let G of Object.values(z))if(G&&typeof G==="object"){let J=G;if(typeof J.key==="string"&&J.key.length>0)return!0;if(typeof J.refresh_token==="string"&&J.refresh_token.length>0)return!0}return!1}catch{return!1}}import{execSync as IW5}from"node:child_process";function xD(){try{return IW5("kiro-cli whoami",{stdio:["pipe","pipe","ignore"],encoding:"utf-8",timeout:5000}),!0}catch{return!1}}import{existsSync as DW5,readFileSync as RW5}from"node:fs";import{homedir as wW5}from"node:os";import{join as YZ2}from"node:path";var vW5=["ANTHROPIC_API_KEY","OPENAI_API_KEY","GEMINI_API_KEY","GOOGLE_API_KEY","DEEPSEEK_API_KEY","XAI_API_KEY","MISTRAL_API_KEY","AZURE_OPENAI_API_KEY"];function TW5($){let z=$.PI_CODING_AGENT_DIR?.trim();if(z)return z;return YZ2(wW5(),".pi","agent")}function hD($=process.env){if(vW5.some((G)=>$[G]?.trim()))return!0;let z=YZ2(TW5($),"auth.json");if(!DW5(z))return!1;try{let G=JSON.parse(RW5(z,"utf-8"));if(typeof G!=="object"||G===null)return!1;return Object.values(G).some((J)=>{if(typeof J==="string")return J.length>0;if(J&&typeof J==="object")return Object.keys(J).length>0;return!1})}catch{return!1}}import{existsSync as BZ2,readFileSync as VZ2,statSync as EW5}from"node:fs";import{homedir as _q}from"node:os";import{join as yq}from"node:path";function uY(){let $=yq(_q(),".qwen","settings.json");if(!BZ2($))return!1;try{return!!JSON.parse(VZ2($,"utf-8")).security?.auth?.selectedType}catch{return!1}}var PW5=new Date("2026-04-15T00:00:00Z"),CW5=[yq(_q(),".qwen","oauth.json"),yq(_q(),".qwen","credentials.json"),yq(_q(),".config","qwen","auth.json"),yq(_q(),".config","qwen","credentials.json")],uW5=new Set(["refresh_token","oauth_token","oauth_secret","access_token","oauth_callback_confirmed"]),bW5=["oauth_","oauth2_","oidc_"],_W5=new Set(["api_key","bearer"]);function yW5($){let z=Object.keys($),G=z.some((Q)=>uW5.has(Q)||bW5.some((K)=>Q.startsWith(K))),J=z.some((Q)=>_W5.has(Q));return G&&!J}function XZ2(){for(let $ of CW5){if(!BZ2($))continue;try{let G=EW5($).mtime<PW5,J=VZ2($,"utf-8"),Q=JSON.parse(J);if(typeof Q!=="object"||Q===null||Array.isArray(Q))continue;if(G&&yW5(Q))return{hasLegacySession:!0,tokenPath:$,migrationNeeded:!0}}catch{}}return{hasLegacySession:!1,migrationNeeded:!1}}function LZ2($){if(!$.hasLegacySession||!$.migrationNeeded)return;let z=$.tokenPath??"(unknown path)";process.stderr.write(["","⚠ Qwen OAuth sessions were deprecated on 2026-04-15.",`Your credentials at ${z} appear to be legacy OAuth.`,"To continue using Qwen Code, run:"," qwen /auth","and re-authenticate with an API key.",""].join(`
1222
1222
  `))}var gD=[{id:"claude",label:"Claude CLI",isAuthenticated:EY},{id:"gemini",label:"Gemini CLI",isAuthenticated:CY},{id:"codex",label:"Codex CLI",isAuthenticated:PY},{id:"commandcode",label:"Command Code",isAuthenticated:UZ2},{id:"cursor",label:"Cursor CLI",isAuthenticated:ZZ2},{id:"qwen",label:"Qwen CLI",isAuthenticated:uY},{id:"antigravity",label:"Antigravity CLI (agy)",isAuthenticated:()=>TY()},{id:"grok",label:"Grok",isAuthenticated:SD},{id:"kiro",label:"Kiro CLI",isAuthenticated:xD},{id:"pi",label:"pi (Earendil)",isAuthenticated:hD}];var SW5={github:"gh auth login",claude:"claude auth",gemini:"gemini auth",codex:"codex login",cursor:"cursor agent login",qwen:"qwen /auth",antigravity:"agy auth",kiro:"kiro-cli login"};async function ic($=!1){let z=o0(),G=Object.fromEntries(gD.map((Y)=>[Y.id,Y.isAuthenticated()])),J={github:z,...G};if($){console.log(JSON.stringify(J,null,2));return}L1(dK.default.bgMagenta(dK.default.white(" \uD83D\uDD10 oh-my-agent auth status ")));let Q=(Y)=>Y?"✅":"❌",K=(Y)=>Y?dK.default.green("Authenticated"):dK.default.red("Not Authenticated"),U=[["GitHub",z],...gD.map((Y)=>[Y.label,G[Y.id]??!1])];n2(U.map(([Y,W])=>`${Q(W)} ${Y.padEnd(12)} ${K(W)}`).join(`
1223
1223
  `),"Authentication Status");let Z=U.filter(([,Y])=>!Y).map(([Y])=>{let W=Y==="GitHub"?"github":gD.find((B)=>B.label===Y)?.id;return W==null?void 0:[Y,SW5[W]]}).filter((Y)=>!!Y?.[1]);if(Z.length===0){R5(dK.default.green("All configured CLIs are authenticated."));return}R5(`Login hints: ${Z.map(([Y,W])=>`${Y}: ${dK.default.cyan(W)}`).join("; ")}`)}function HZ2($){b5($.command("auth:status").description("Check authentication status of all supported CLIs")).action(m2(async(z)=>{await ic(C5(z))},{supportsJsonOutput:!0}))}import{spawn as xW5}from"node:child_process";import{existsSync as qZ2,readFileSync as kZ2,writeFileSync as hW5}from"node:fs";import gW5 from"node:http";import fW5 from"node:https";import{homedir as mW5}from"node:os";import{join as FZ2}from"node:path";var iW5="http://localhost:12341/mcp",jZ2=1000,cW5=Number.parseInt(process.env.OH_MY_AG_BRIDGE_PROBE_TIMEOUT_MS??"2000",10),lW5=Number.parseInt(process.env.OH_MY_AG_BRIDGE_STARTUP_TIMEOUT_MS??"120000",10),YJ={};function NZ2(){if(YJ.stdinData)process.stdin.off("data",YJ.stdinData);if(YJ.sigint)process.off("SIGINT",YJ.sigint);if(YJ.sigterm)process.off("SIGTERM",YJ.sigterm);YJ={}}function dW5(){let $=FZ2(mW5(),".serena","serena_config.yml");if(!qZ2($))return;try{let G=kZ2($,"utf8").match(/^projects:\s*\n((?:\s*-\s*.+\n?)*)/m);if(!G)return;let Q=((G[1]??"").match(/^\s*-\s*(.+)$/gm)||[]).map((K)=>K.replace(/^\s*-\s*/,"").trim());for(let K of Q){let U=FZ2(K,".serena","project.yml");if(!qZ2(U))continue;let Z=kZ2(U,"utf8");if(!/^languages:/m.test(Z)){console.error(`[Bridge] Missing 'languages' key in ${U}, adding default...`);let Y=Z.search(/\n(?=\w)/);if(Y!==-1){let W=`${Z.slice(0,Y)}
1224
1224
 
@@ -2454,7 +2454,7 @@ ${$.reassignedActive.map((U)=>` ${U.category}: ${U.from} -> ${U.to}`).join(`
2454
2454
  `);if(n2(H,"Overview"),X.totalSpawns>0){let k=Object.entries(X.byVendor).sort(([,j],[,N])=>N.tokens-j.tokens).map(([j,N])=>` ${j.padEnd(12)} ${rt2(N.tokens).padStart(12)} tokens · ${String(N.spawns).padStart(3)} spawns · ${st2(N.usd).padStart(7)}`),F=[w7.default.bold("\uD83D\uDCB0 Cost Telemetry (all sessions)"),"┌─────────────────────┬──────────────┐",`│ ${w7.default.bold("Metric")} │ ${w7.default.bold("Value")} │`,"├─────────────────────┼──────────────┤",`│ Total tokens (est.) │ ${rt2(X.totalTokens).padEnd(12)} │`,`│ Total spawns │ ${String(X.totalSpawns).padEnd(12)} │`,`│ Estimated USD │ ${st2(X.estimatedUsd).padEnd(12)} │`,"└─────────────────────┴──────────────┘",w7.default.dim("By vendor (sorted by tokens):"),...k,w7.default.dim("Estimate is input-only (prompt char approximation); output tokens not yet tracked."),w7.default.dim("Configure session.quota_cap in .agents/oma-config.yaml to enforce budgets.")].join(`
2455
2455
  `);n2(F,"Cost")}let q=Object.entries(Q.skillsUsed).sort(([,k],[,F])=>F-k).slice(0,5);if(q.length>0){let k=[w7.default.bold("\uD83C\uDFC6 Top Skills Used"),...q.map(([F,j],N)=>` ${N+1}. ${F} (${j})`)].join(`
2456
2456
  `);n2(k,"Skills")}R5(w7.default.dim(`Data stored in: ${J}`))}function $e2($){b5($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(m2(async(z)=>{await et2(C5(z),z.reset)},{supportsJsonOutput:!0}))}W7();var x8=_2(j5(),1);import*as T6 from"node:fs";import*as Z3 from"node:path";var Yq4="oma-config.yaml",Bq4="mcp.json",Vq4="<!-- oma:generated -->";function LW($){try{let z=T6.lstatSync($);if(z.isSymbolicLink())return"symlink";if(z.isDirectory())return"dir";return"file"}catch{return null}}function Xq4($){try{return T6.readFileSync($,"utf-8").includes(Vq4)}catch{return!1}}function Lq4($,z){let G=Z3.join($,"SKILL.md");try{if(!T6.lstatSync(G).isSymbolicLink())return!1;let J=T6.realpathSync(G),Q=T6.realpathSync(Z3.join(z,".agents","workflows"));return J===Q||J.startsWith(Q+Z3.sep)}catch{return!1}}function V92($){try{return T6.readdirSync($,{withFileTypes:!0})}catch{return[]}}function Hq4($){let z=[],G=[],J=Z3.join($,Z1);for(let B of V92(J)){let V=Z3.join(J,B.name),L=LW(V);if(L===null)continue;let X;if(B.name==="_version.json")X="oma install metadata (saveLocalVersion)";else if(B.name==="_shared")X="shared assets (installShared)";else X="skill directory (installSkill)";z.push({path:V,kind:L,reason:X})}let Q=Z3.join($,".agents","workflows");if(LW(Q)==="dir")z.push({path:Q,kind:"dir",reason:"created by installWorkflows"});let K=Z3.join($,".agents","rules");if(LW(K)==="dir")z.push({path:K,kind:"dir",reason:"created by installRules"});let U=Z3.join($,".agents","config");if(LW(U)==="dir")z.push({path:U,kind:"dir",reason:"created by installConfigs"});let Z=Z3.join($,".agents",Yq4);if(LW(Z)!==null)G.push({path:Z,kind:"file",reason:"user preferences"});let Y=Z3.join($,".agents",Bq4);if(LW(Y)!==null)G.push({path:Y,kind:"file",reason:"may contain user MCP servers"});for(let[B,V]of Object.entries(Y3)){let X=C7()==="global"?V.homePath:V.projectPath,H=Z3.join($,X);for(let q of V92(H)){let k=Z3.join(H,q.name),F=LW(k);if(F===null)continue;if(F==="symlink")z.push({path:k,kind:"symlink",reason:`created by createVendorSymlinks (${B})`});else if(F==="dir"&&Lq4(k,$))z.push({path:k,kind:"dir",reason:`created by createVendorWorkflowSymlinks (${B})`});else G.push({path:k,kind:F,reason:"user-authored skill"})}}let W=Z3.join($,".github","prompts");for(let B of V92(W)){if(!B.isFile()||!B.name.endsWith(".prompt.md"))continue;let V=Z3.join(W,B.name);if(Xq4(V))z.push({path:V,kind:"file",reason:"generated by installCopilotWorkflowPrompts (oma:generated)"})}return{omaOwned:z,userOwned:G}}function ze2($,z){let G=Z3.relative(z,$);return Z3.join("<root>",G)}function qq4($,z,G){let J=$.length===0?[x8.default.dim(" (nothing to remove)")]:$.map((U)=>` ${x8.default.red("✗")} ${ze2(U.path,G).padEnd(55)} ${x8.default.dim(`(${U.kind}, ${U.reason})`)}`),Q=z.length===0?[x8.default.dim(" (none)")]:z.map((U)=>` ${x8.default.green("✓")} ${ze2(U.path,G).padEnd(55)} ${x8.default.dim(`(${U.reason})`)}`),K=[x8.default.bold("The following oma-owned entries will be removed:"),...J,"",x8.default.bold("The following user-owned entries will be preserved:"),...Q].join(`
2457
- `);n2(K,"Uninstall preview")}function kq4($){for(let G of $){if(G.kind!=="symlink")continue;try{T6.unlinkSync(G.path)}catch{}}for(let G of $){if(G.kind!=="file")continue;try{T6.unlinkSync(G.path)}catch{}}let z=$.filter((G)=>G.kind==="dir").sort((G,J)=>J.path.split(Z3.sep).length-G.path.split(Z3.sep).length);for(let G of z)try{T6.rmSync(G.path,{recursive:!0,force:!0})}catch{}}async function Ge2($={}){let z=NY(),G=$.yes===!0||process.env.OMA_YES==="1"||process.env.CI==="true"||process.env.CI==="1",{omaOwned:J,userOwned:Q}=Hq4(z);if(qq4(J,Q,z),$.dryRun){R5(x8.default.yellow("Dry-run — no files were changed."));return}if(J.length===0){R5(x8.default.dim("Nothing to remove."));return}if(!G){let K=await f1({message:`Remove ${J.length} oma-owned entries from ${z}?`,initialValue:!1});if(J4(K)||!K){a4("Uninstall cancelled.");return}}kq4(J),R5(x8.default.green("Uninstall complete. User-owned files were preserved."))}function Je2($){$.command("uninstall").description("Remove oh-my-agent's owned files (preserves oma-config.yaml, mcp.json, and user-authored skills)").option("--dry-run","Preview what would be removed without deleting").option("-y, --yes","Skip confirmation prompt").action(m2(async(z)=>{let G=$.opts();await Ge2({yes:z.yes,dryRun:z.dryRun,global:G.global})}))}W7();var T4=_2(j5(),1);import{execSync as We2}from"node:child_process";import{cpSync as R_,existsSync as t$,mkdirSync as X92,readFileSync as v_,rmSync as w_,writeFileSync as L92}from"node:fs";import{homedir as Rq4,tmpdir as wq4}from"node:os";import{join as z7}from"node:path";var I_=_2(j5(),1);import{execSync as Fq4,spawn as jq4}from"node:child_process";import{realpathSync as Qe2}from"node:fs";import zM from"node:process";var HW="oh-my-agent";function Nq4($=zM.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(zM.env.IS_BINARY==="true")return{packageManager:"binary",isGlobal:!0,updateMessage:"Running as a standalone binary. Download the latest release from GitHub."};let z;try{z=d8(Qe2($))}catch{return{packageManager:"unknown",isGlobal:!1}}if(z.includes("/.npm/_npx")||z.includes("/npm/_npx"))return{packageManager:"npx",isGlobal:!1,updateMessage:"Running via npx, auto-update not applicable."};if(z.includes("/.pnpm/_pnpx")||z.includes("/.cache/pnpm/dlx"))return{packageManager:"pnpx",isGlobal:!1,updateMessage:"Running via pnpx, auto-update not applicable."};if(z.includes("/.bun/install/cache"))return{packageManager:"bunx",isGlobal:!1,updateMessage:"Running via bunx, auto-update not applicable."};if(zM.platform==="darwin")try{let G=Fq4(`brew --prefix ${HW}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(G){let J=d8(Qe2(G));if(z.startsWith(J))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${HW}`,updateMessage:"Installed via Homebrew. Updating in background..."}}}catch{}if(z.includes("/.pnpm/global")||z.includes("/.local/share/pnpm"))return{packageManager:"pnpm",isGlobal:!0,updateCommand:`pnpm add -g ${HW}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(z.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${HW}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(z.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${HW}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${HW}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var Ke2=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function Aq4($,z){let G=$.match(Ke2),J=z.match(Ke2);if(!G||!J)return!1;for(let Q=1;Q<=3;Q++){let K=Number(G[Q]),U=Number(J[Q]);if(K<U)return!0;if(K>U)return!1}return!1}async function Mq4($=HW,z=2000){try{let G=await _1.get(`https://registry.npmjs.org/${$}/latest`,{timeout:z});return typeof G.data?.version==="string"?G.data.version:null}catch{return null}}async function Ue2($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(zM.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(zM.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let z=await Mq4();if(!z)return{triggered:!1,reason:"fetch-failed"};if(!Aq4($.currentVersion,z))return{triggered:!1,reason:"up-to-date",latest:z};let G=Nq4();if(!G.updateCommand)return $.onNotice?.(I_.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. ${G.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:z};try{return jq4(G.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(I_.default.cyan(`global oh-my-agent ${$.currentVersion} → ${z} updating in background. New version applies on next run.`)),{triggered:!0,latest:z}}catch{return $.onNotice?.(I_.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. Run: ${G.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:z}}}var D_={name:"oh-my-agent",version:"8.47.0",description:"Portable multi-agent harness for .agents-based skills and workflows across Antigravity, Claude Code, Codex, OpenCode, and more",type:"module",bin:{"oh-my-agent":"./bin/cli.js",oma:"./bin/cli.js"},files:["bin"],keywords:["oh-my-agent","antigravity",".agents","agent","skills","agent-skills","multi-agent","orchestrator","claude","claude-code","codex","opencode","copilot","cursor","chatgpt","pm","frontend","backend","mobile","qa","debug","terraform","database","workflow","bug-fixing","gemini"],author:"our.first.fluke <our.first.fluke@gmail.com>",contributors:["gracefullight <gracefullight.dev@gmail.com>","gahyun-git <go4it.gh@gmail.com>"],license:"MIT",funding:[{type:"github",url:"https://github.com/sponsors/first-fluke"},{type:"buymeacoffee",url:"https://buymeacoffee.com/firstfluke"}],scripts:{"sync:readme":"node ./scripts/sync-readme.mjs","generate:skill-data":"node ./scripts/generate-skill-data.mjs",build:"bun run generate:skill-data && bun run sync:readme && bun build cli.ts --outfile bin/cli.js --target node --minify --external @napi-rs/keyring",dev:"bun run generate:skill-data && bun run cli.ts",lint:"biome check .","lint:fix":"biome check --write --unsafe .","check:boundaries":"node ./scripts/check-boundaries.mjs",test:"vitest run","test:coverage":"vitest run --coverage",prepublishOnly:"bun run build"},dependencies:{"@clack/prompts":"^1.1.0","@date-fns/tz":"^1.4.1","@napi-rs/keyring":"^1.3.0",axios:"^1.15.0","better-sqlite3":"^12.9.0",chokidar:"^5.0.0",commander:"^14.0.3","date-fns":"^4.2.1",eld:"^2.0.3","fast-xml-parser":"^5",minimatch:"^10.2.5","p-map":"^7.0.4",picocolors:"^1.1.1","puppeteer-core":"^24",remark:"^15.0.1","remark-frontmatter":"^5.0.0","remark-parse":"^11.0.0","smol-toml":"^1.6.1",unified:"^11.0.5",ws:"^8.18.0",yaml:"^2.8.2",zod:"^4.3.6"},optionalDependencies:{pptxgenjs:"^3.12.0"},devDependencies:{"@biomejs/biome":"^2.4.15","@types/better-sqlite3":"^7.6.13","@types/mdast":"^4.0.4","@types/node":"^24","@types/ws":"^8.18.1","@vitest/coverage-v8":"^4.1.4",typescript:"^6",vitest:"^4.0.18"},repository:{type:"git",url:"https://github.com/first-fluke/oh-my-agent"},antigravity:{skillsPath:".agents/skills",skills:["oma-architecture","oma-brainstorm","oma-coordination","oma-pm","oma-frontend","oma-backend","oma-db","oma-mobile","oma-qa","oma-debug","oma-orchestrator","oma-dev-workflow","oma-tf-infra","oma-scm","oma-pdf","oma-recap"]}};ti();function Iq4(){if((process.env.LANG??"").toLowerCase().startsWith("ko"))return"ko";return"en"}var Dq4={"install.sudoRefused":{en:"Refusing to install under sudo. Re-run as the target user.",ko:"sudo로는 설치할 수 없습니다. 대상 사용자로 다시 실행하세요."},"install.cwdHomeWarn":{en:"Running in your HOME directory without --global. This will scatter files in ~/. Are you sure?",ko:"HOME 디렉토리에서 --global 없이 실행 중입니다. ~/ 에 파일이 흩어집니다. 진행할까요?"},"install.ciGlobalWarn":{en:"Running `oma install --global` in CI. This will modify the CI user's HOME.",ko:"CI에서 `oma install --global`을 실행합니다. CI 사용자의 HOME을 수정합니다."},"install.wslHomeInfo":{en:"WSL detected. $HOME is distinct from Windows %USERPROFILE%; oma installs only to the WSL HOME. To install on the Windows side, run from PowerShell.",ko:"WSL이 감지됐습니다. $HOME은 Windows %USERPROFILE%과 다릅니다; oma는 WSL HOME에만 설치합니다. Windows 쪽에 설치하려면 PowerShell에서 실행하세요."},"install.firstGlobalIntro":{en:"This is your first global install of oh-my-agent.",ko:"oh-my-agent를 글로벌로 처음 설치합니다."},"install.lockHeld":{en:"Another oma install/update is running (pid={pid}). If none is running it crashed — remove {path}, or wait ~{grace}s for it to auto-clear.",ko:"다른 oma install/update가 실행 중입니다 (pid={pid}). 실행 중이 아니면 비정상 종료된 것입니다 — {path}를 삭제하거나 ~{grace}초 후 자동 해제를 기다리세요."},"install.outroSuccess":{en:`Done! Next steps:
2457
+ `);n2(K,"Uninstall preview")}function kq4($){for(let G of $){if(G.kind!=="symlink")continue;try{T6.unlinkSync(G.path)}catch{}}for(let G of $){if(G.kind!=="file")continue;try{T6.unlinkSync(G.path)}catch{}}let z=$.filter((G)=>G.kind==="dir").sort((G,J)=>J.path.split(Z3.sep).length-G.path.split(Z3.sep).length);for(let G of z)try{T6.rmSync(G.path,{recursive:!0,force:!0})}catch{}}async function Ge2($={}){let z=NY(),G=$.yes===!0||process.env.OMA_YES==="1"||process.env.CI==="true"||process.env.CI==="1",{omaOwned:J,userOwned:Q}=Hq4(z);if(qq4(J,Q,z),$.dryRun){R5(x8.default.yellow("Dry-run — no files were changed."));return}if(J.length===0){R5(x8.default.dim("Nothing to remove."));return}if(!G){let K=await f1({message:`Remove ${J.length} oma-owned entries from ${z}?`,initialValue:!1});if(J4(K)||!K){a4("Uninstall cancelled.");return}}kq4(J),R5(x8.default.green("Uninstall complete. User-owned files were preserved."))}function Je2($){$.command("uninstall").description("Remove oh-my-agent's owned files (preserves oma-config.yaml, mcp.json, and user-authored skills)").option("--dry-run","Preview what would be removed without deleting").option("-y, --yes","Skip confirmation prompt").action(m2(async(z)=>{let G=$.opts();await Ge2({yes:z.yes,dryRun:z.dryRun,global:G.global})}))}W7();var T4=_2(j5(),1);import{execSync as We2}from"node:child_process";import{cpSync as R_,existsSync as t$,mkdirSync as X92,readFileSync as v_,rmSync as w_,writeFileSync as L92}from"node:fs";import{homedir as Rq4,tmpdir as wq4}from"node:os";import{join as z7}from"node:path";var I_=_2(j5(),1);import{execSync as Fq4,spawn as jq4}from"node:child_process";import{realpathSync as Qe2}from"node:fs";import zM from"node:process";var HW="oh-my-agent";function Nq4($=zM.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(zM.env.IS_BINARY==="true")return{packageManager:"binary",isGlobal:!0,updateMessage:"Running as a standalone binary. Download the latest release from GitHub."};let z;try{z=d8(Qe2($))}catch{return{packageManager:"unknown",isGlobal:!1}}if(z.includes("/.npm/_npx")||z.includes("/npm/_npx"))return{packageManager:"npx",isGlobal:!1,updateMessage:"Running via npx, auto-update not applicable."};if(z.includes("/.pnpm/_pnpx")||z.includes("/.cache/pnpm/dlx"))return{packageManager:"pnpx",isGlobal:!1,updateMessage:"Running via pnpx, auto-update not applicable."};if(z.includes("/.bun/install/cache"))return{packageManager:"bunx",isGlobal:!1,updateMessage:"Running via bunx, auto-update not applicable."};if(zM.platform==="darwin")try{let G=Fq4(`brew --prefix ${HW}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(G){let J=d8(Qe2(G));if(z.startsWith(J))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${HW}`,updateMessage:"Installed via Homebrew. Updating in background..."}}}catch{}if(z.includes("/.pnpm/global")||z.includes("/.local/share/pnpm"))return{packageManager:"pnpm",isGlobal:!0,updateCommand:`pnpm add -g ${HW}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(z.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${HW}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(z.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${HW}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${HW}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var Ke2=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function Aq4($,z){let G=$.match(Ke2),J=z.match(Ke2);if(!G||!J)return!1;for(let Q=1;Q<=3;Q++){let K=Number(G[Q]),U=Number(J[Q]);if(K<U)return!0;if(K>U)return!1}return!1}async function Mq4($=HW,z=2000){try{let G=await _1.get(`https://registry.npmjs.org/${$}/latest`,{timeout:z});return typeof G.data?.version==="string"?G.data.version:null}catch{return null}}async function Ue2($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(zM.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(zM.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let z=await Mq4();if(!z)return{triggered:!1,reason:"fetch-failed"};if(!Aq4($.currentVersion,z))return{triggered:!1,reason:"up-to-date",latest:z};let G=Nq4();if(!G.updateCommand)return $.onNotice?.(I_.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. ${G.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:z};try{return jq4(G.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(I_.default.cyan(`global oh-my-agent ${$.currentVersion} → ${z} updating in background. New version applies on next run.`)),{triggered:!0,latest:z}}catch{return $.onNotice?.(I_.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. Run: ${G.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:z}}}var D_={name:"oh-my-agent",version:"8.47.1",description:"Portable multi-agent harness for .agents-based skills and workflows across Antigravity, Claude Code, Codex, OpenCode, and more",type:"module",bin:{"oh-my-agent":"./bin/cli.js",oma:"./bin/cli.js"},files:["bin"],keywords:["oh-my-agent","antigravity",".agents","agent","skills","agent-skills","multi-agent","orchestrator","claude","claude-code","codex","opencode","copilot","cursor","chatgpt","pm","frontend","backend","mobile","qa","debug","terraform","database","workflow","bug-fixing","gemini"],author:"our.first.fluke <our.first.fluke@gmail.com>",contributors:["gracefullight <gracefullight.dev@gmail.com>","gahyun-git <go4it.gh@gmail.com>"],license:"MIT",funding:[{type:"github",url:"https://github.com/sponsors/first-fluke"},{type:"buymeacoffee",url:"https://buymeacoffee.com/firstfluke"}],scripts:{"sync:readme":"node ./scripts/sync-readme.mjs","generate:skill-data":"node ./scripts/generate-skill-data.mjs",build:"bun run generate:skill-data && bun run sync:readme && bun build cli.ts --outfile bin/cli.js --target node --minify --external @napi-rs/keyring",dev:"bun run generate:skill-data && bun run cli.ts",lint:"biome check .","lint:fix":"biome check --write --unsafe .","check:boundaries":"node ./scripts/check-boundaries.mjs",test:"vitest run","test:coverage":"vitest run --coverage",prepublishOnly:"bun run build"},dependencies:{"@clack/prompts":"^1.1.0","@date-fns/tz":"^1.4.1","@napi-rs/keyring":"^1.3.0",axios:"^1.15.0","better-sqlite3":"^12.9.0",chokidar:"^5.0.0",commander:"^14.0.3","date-fns":"^4.2.1",eld:"^2.0.3","fast-xml-parser":"^5",minimatch:"^10.2.5","p-map":"^7.0.4",picocolors:"^1.1.1","puppeteer-core":"^24",remark:"^15.0.1","remark-frontmatter":"^5.0.0","remark-parse":"^11.0.0","smol-toml":"^1.6.1",unified:"^11.0.5",ws:"^8.18.0",yaml:"^2.8.2",zod:"^4.3.6"},optionalDependencies:{pptxgenjs:"^3.12.0"},devDependencies:{"@biomejs/biome":"^2.4.15","@types/better-sqlite3":"^7.6.13","@types/mdast":"^4.0.4","@types/node":"^24","@types/ws":"^8.18.1","@vitest/coverage-v8":"^4.1.4",typescript:"^6",vitest:"^4.0.18"},repository:{type:"git",url:"https://github.com/first-fluke/oh-my-agent"},antigravity:{skillsPath:".agents/skills",skills:["oma-architecture","oma-brainstorm","oma-coordination","oma-pm","oma-frontend","oma-backend","oma-db","oma-mobile","oma-qa","oma-debug","oma-orchestrator","oma-dev-workflow","oma-tf-infra","oma-scm","oma-pdf","oma-recap"]}};ti();function Iq4(){if((process.env.LANG??"").toLowerCase().startsWith("ko"))return"ko";return"en"}var Dq4={"install.sudoRefused":{en:"Refusing to install under sudo. Re-run as the target user.",ko:"sudo로는 설치할 수 없습니다. 대상 사용자로 다시 실행하세요."},"install.cwdHomeWarn":{en:"Running in your HOME directory without --global. This will scatter files in ~/. Are you sure?",ko:"HOME 디렉토리에서 --global 없이 실행 중입니다. ~/ 에 파일이 흩어집니다. 진행할까요?"},"install.ciGlobalWarn":{en:"Running `oma install --global` in CI. This will modify the CI user's HOME.",ko:"CI에서 `oma install --global`을 실행합니다. CI 사용자의 HOME을 수정합니다."},"install.wslHomeInfo":{en:"WSL detected. $HOME is distinct from Windows %USERPROFILE%; oma installs only to the WSL HOME. To install on the Windows side, run from PowerShell.",ko:"WSL이 감지됐습니다. $HOME은 Windows %USERPROFILE%과 다릅니다; oma는 WSL HOME에만 설치합니다. Windows 쪽에 설치하려면 PowerShell에서 실행하세요."},"install.firstGlobalIntro":{en:"This is your first global install of oh-my-agent.",ko:"oh-my-agent를 글로벌로 처음 설치합니다."},"install.lockHeld":{en:"Another oma install/update is running (pid={pid}). If none is running it crashed — remove {path}, or wait ~{grace}s for it to auto-clear.",ko:"다른 oma install/update가 실행 중입니다 (pid={pid}). 실행 중이 아니면 비정상 종료된 것입니다 — {path}를 삭제하거나 ~{grace}초 후 자동 해제를 기다리세요."},"install.outroSuccess":{en:`Done! Next steps:
2458
2458
  1. Open your project in your IDE
2459
2459
  2. Type /orchestrate to spawn a multi-agent workflow
2460
2460
  3. Run \`oma doctor\` if anything looks off`,ko:`완료! 다음 단계:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-agent",
3
- "version": "8.47.0",
3
+ "version": "8.47.1",
4
4
  "description": "Portable multi-agent harness for .agents-based skills and workflows across Antigravity, Claude Code, Codex, OpenCode, and more",
5
5
  "type": "module",
6
6
  "bin": {