oh-my-agent 5.18.1 → 5.18.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 (2) hide show
  1. package/bin/cli.js +3 -3
  2. package/package.json +1 -1
package/bin/cli.js CHANGED
@@ -916,7 +916,7 @@ ${J.map((Y)=>` - ${Y}`).join(`
916
916
  ${Q}
917
917
  `;p0.writeFileSync(X,G)}function CB($,J,X,G){let Q=$1($,".agents","skills",J);if(!p0.existsSync(Q))return!1;let Y=$1(X,j4,J);a5(Y),p0.mkdirSync(Y,{recursive:!0}),p0.cpSync(Q,Y,{recursive:!0,force:!0});let Z=$1(Q,"variants"),K=$1(Y,"stack");if(G&&p0.existsSync($1(Z,G)))p0.mkdirSync(K,{recursive:!0}),p0.cpSync($1(Z,G),K,{recursive:!0,force:!0}),p0.writeFileSync($1(K,"stack.yaml"),`language: ${G}
918
918
  source: preset
919
- `);let U=$1(Y,"variants");if(p0.existsSync(U))p0.rmSync(U,{recursive:!0,force:!0});return!0}function SB($,J){let X=$1($,".agents","skills","_shared");if(!p0.existsSync(X))return;let G=$1(J,j4,"_shared");a5(G),p0.mkdirSync(G,{recursive:!0}),p0.cpSync(X,G,{recursive:!0,force:!0})}function Bn($,J){let X=$1($,".agents","workflows");if(!p0.existsSync(X))return;let G=$1(J,".agents","workflows");a5(G),p0.mkdirSync(G,{recursive:!0}),p0.cpSync(X,G,{recursive:!0,force:!0})}function On($,J){let X=$1($,".agents","rules");if(!p0.existsSync(X))return;let G=$1(J,".agents","rules");a5(G),p0.mkdirSync(G,{recursive:!0}),p0.cpSync(X,G,{recursive:!0,force:!0})}function Hn($){try{if(!p0.existsSync($))return null;let X=p0.readFileSync($,"utf-8").match(/^version:\s*["']?([^"'\s]+)["']?\s*$/m);return X?X[1]:null}catch{return null}}function Ln($,J,X=!1,G={}){let Q=$1($,".agents","config"),Y="defaults.yaml";if(p0.existsSync(Q)){let K=$1(J,".agents","config");if(p0.mkdirSync(K,{recursive:!0}),X)p0.cpSync(Q,K,{recursive:!0,force:!0});else for(let U of p0.readdirSync(Q,{withFileTypes:!0})){let W=$1(K,U.name),H=$1(Q,U.name);if(U.name==="defaults.yaml"&&p0.existsSync(W)){let z=Hn(W),B=Hn(H);if(G.updateDefaults)p0.cpSync(H,W),console.log(`[install] Updated .agents/config/defaults.yaml (${z??"unknown"} → ${B??"unknown"})`);else if(B&&z&&B!==z)console.warn(`[install] .agents/config/defaults.yaml is ${z}; bundled is ${B}. Run 'oma install --update-defaults' to upgrade.`);continue}if(!p0.existsSync(W))p0.cpSync(H,W,U.isDirectory()?{recursive:!0}:{})}}let Z=$1($,".agents","mcp.json");if(p0.existsSync(Z)){let K=$1(J,".agents");p0.mkdirSync(K,{recursive:!0});let U=$1(K,"mcp.json");if(X||!p0.existsSync(U))p0.cpSync(Z,U)}}function XG(){return[...O8.domain,...O8.design,...O8.coordination,...O8.utility,...O8.infrastructure]}function mQ($){let J=$1($,".agents","mcp.json");if(!p0.existsSync(J))return;let X=$1($,".cursor"),G=$1(X,"mcp.json"),Q=Vn(X,J);try{if(p0.lstatSync(G).isSymbolicLink()){if(BU(zn(G),p0.readlinkSync(G))===BU(J))return;p0.unlinkSync(G)}else return}catch{}p0.mkdirSync(X,{recursive:!0}),p0.symlinkSync(Q,G,"file")}function cQ($,J,X){let G=[],Q=[],Y=BU($,j4);for(let Z of J){let K=NC[Z],U=$1($,K);if(!p0.existsSync(U))p0.mkdirSync(U,{recursive:!0});for(let W of X){let H=$1(Y,W),z=$1(U,W);if(!p0.existsSync(H)){Q.push(`${K}/${W} (source missing)`);continue}try{if(p0.lstatSync(z).isSymbolicLink()){if(BU(zn(z),p0.readlinkSync(z))===BU(H)){Q.push(`${K}/${W} (already linked)`);continue}p0.unlinkSync(z)}else{Q.push(`${K}/${W} (real dir exists)`);continue}}catch{}let B=Vn(U,H);p0.symlinkSync(B,z,"dir"),G.push(`${K}/${W}`)}}return{created:G,skipped:Q}}function _B($){let J=$1($,j4);if(!p0.existsSync(J))return[];return p0.readdirSync(J,{withFileTypes:!0}).filter((X)=>X.isDirectory()&&!X.name.startsWith("_")).map((X)=>X.name)}function xB($){let J=[];for(let[X,G]of Object.entries(NC))if(p0.existsSync($1($,G)))J.push(X);return J}function GG(){try{return TC("gh --version",{stdio:"ignore"}),!0}catch{return!1}}function q5(){try{return TC("gh auth status",{stdio:"ignore"}),!0}catch{return!1}}function QG(){try{return TC(`gh api user/starred/${g1}`,{stdio:"ignore"}),!0}catch{return!1}}function Fn(){return GG()&&q5()&&QG()}import{execSync as d_0}from"node:child_process";function pQ(){try{let $=d_0("claude auth status",{stdio:["pipe","pipe","ignore"],encoding:"utf-8"});return JSON.parse($).loggedIn===!0}catch{return!1}}import{existsSync as i_0,readFileSync as n_0}from"node:fs";import{homedir as o_0}from"node:os";import{join as a_0}from"node:path";function lQ(){let $=a_0(o_0(),".codex","auth.json");if(!i_0($))return!1;try{return!!JSON.parse(n_0($,"utf-8")).tokens?.access_token}catch{return!1}}import{existsSync as s_0,readFileSync as r_0}from"node:fs";import{homedir as t_0}from"node:os";import{join as e_0}from"node:path";function dQ(){let $=e_0(t_0(),".gemini","oauth_creds.json");if(!s_0($))return!1;try{let J=JSON.parse(r_0($,"utf-8"));return!!(J.access_token&&J.refresh_token)}catch{return!1}}import{existsSync as Nn,readFileSync as Mn,statSync as $x0}from"node:fs";import{homedir as OU}from"node:os";import{join as LU}from"node:path";function iQ(){let $=LU(OU(),".qwen","settings.json");if(!Nn($))return!1;try{return!!JSON.parse(Mn($,"utf-8")).security?.auth?.selectedType}catch{return!1}}var Jx0=new Date("2026-04-15T00:00:00Z"),Xx0=[LU(OU(),".qwen","oauth.json"),LU(OU(),".qwen","credentials.json"),LU(OU(),".config","qwen","auth.json"),LU(OU(),".config","qwen","credentials.json")],Gx0=new Set(["refresh_token","oauth_token","oauth_secret","access_token","oauth_callback_confirmed"]),Qx0=["oauth_","oauth2_","oidc_"],Yx0=new Set(["api_key","bearer"]);function Zx0($){let J=Object.keys($),X=J.some((Q)=>Gx0.has(Q)||Qx0.some((Y)=>Q.startsWith(Y))),G=J.some((Q)=>Yx0.has(Q));return X&&!G}function An(){for(let $ of Xx0){if(!Nn($))continue;try{let X=$x0($).mtime<Jx0,G=Mn($,"utf-8"),Q=JSON.parse(G);if(typeof Q!=="object"||Q===null||Array.isArray(Q))continue;if(X&&Zx0(Q))return{hasLegacySession:!0,tokenPath:$,migrationNeeded:!0}}catch{}}return{hasLegacySession:!1,migrationNeeded:!1}}function In($){if(!$.hasLegacySession||!$.migrationNeeded)return;let J=$.tokenPath??"(unknown path)";process.stderr.write(["","⚠ Qwen OAuth sessions were deprecated on 2026-04-15.",`Your credentials at ${J} appear to be legacy OAuth.`,"To continue using Qwen Code, run:"," qwen /auth","and re-authenticate with an API key.",""].join(`
919
+ `);let U=$1(Y,"variants");if(p0.existsSync(U))p0.rmSync(U,{recursive:!0,force:!0});return!0}function SB($,J){let X=$1($,".agents","skills","_shared");if(!p0.existsSync(X))return;let G=$1(J,j4,"_shared");a5(G),p0.mkdirSync(G,{recursive:!0}),p0.cpSync(X,G,{recursive:!0,force:!0})}function Bn($,J){let X=$1($,".agents","workflows");if(!p0.existsSync(X))return;let G=$1(J,".agents","workflows");a5(G),p0.mkdirSync(G,{recursive:!0}),p0.cpSync(X,G,{recursive:!0,force:!0})}function On($,J){let X=$1($,".agents","rules");if(!p0.existsSync(X))return;let G=$1(J,".agents","rules");a5(G),p0.mkdirSync(G,{recursive:!0}),p0.cpSync(X,G,{recursive:!0,force:!0})}function Hn($){try{if(!p0.existsSync($))return null;return p0.readFileSync($,"utf-8").match(/^version:\s*["']?([^"'\s]+)["']?\s*$/m)?.[1]??null}catch{return null}}function Ln($,J,X=!1,G={}){let Q=$1($,".agents","config"),Y="defaults.yaml";if(p0.existsSync(Q)){let K=$1(J,".agents","config");if(p0.mkdirSync(K,{recursive:!0}),X)p0.cpSync(Q,K,{recursive:!0,force:!0});else for(let U of p0.readdirSync(Q,{withFileTypes:!0})){let W=$1(K,U.name),H=$1(Q,U.name);if(U.name==="defaults.yaml"&&p0.existsSync(W)){let z=Hn(W),B=Hn(H);if(G.updateDefaults)p0.cpSync(H,W),console.log(`[install] Updated .agents/config/defaults.yaml (${z??"unknown"} → ${B??"unknown"})`);else if(B&&z&&B!==z)console.warn(`[install] .agents/config/defaults.yaml is ${z}; bundled is ${B}. Run 'oma install --update-defaults' to upgrade.`);continue}if(!p0.existsSync(W))p0.cpSync(H,W,U.isDirectory()?{recursive:!0}:{})}}let Z=$1($,".agents","mcp.json");if(p0.existsSync(Z)){let K=$1(J,".agents");p0.mkdirSync(K,{recursive:!0});let U=$1(K,"mcp.json");if(X||!p0.existsSync(U))p0.cpSync(Z,U)}}function XG(){return[...O8.domain,...O8.design,...O8.coordination,...O8.utility,...O8.infrastructure]}function mQ($){let J=$1($,".agents","mcp.json");if(!p0.existsSync(J))return;let X=$1($,".cursor"),G=$1(X,"mcp.json"),Q=Vn(X,J);try{if(p0.lstatSync(G).isSymbolicLink()){if(BU(zn(G),p0.readlinkSync(G))===BU(J))return;p0.unlinkSync(G)}else return}catch{}p0.mkdirSync(X,{recursive:!0}),p0.symlinkSync(Q,G,"file")}function cQ($,J,X){let G=[],Q=[],Y=BU($,j4);for(let Z of J){let K=NC[Z],U=$1($,K);if(!p0.existsSync(U))p0.mkdirSync(U,{recursive:!0});for(let W of X){let H=$1(Y,W),z=$1(U,W);if(!p0.existsSync(H)){Q.push(`${K}/${W} (source missing)`);continue}try{if(p0.lstatSync(z).isSymbolicLink()){if(BU(zn(z),p0.readlinkSync(z))===BU(H)){Q.push(`${K}/${W} (already linked)`);continue}p0.unlinkSync(z)}else{Q.push(`${K}/${W} (real dir exists)`);continue}}catch{}let B=Vn(U,H);p0.symlinkSync(B,z,"dir"),G.push(`${K}/${W}`)}}return{created:G,skipped:Q}}function _B($){let J=$1($,j4);if(!p0.existsSync(J))return[];return p0.readdirSync(J,{withFileTypes:!0}).filter((X)=>X.isDirectory()&&!X.name.startsWith("_")).map((X)=>X.name)}function xB($){let J=[];for(let[X,G]of Object.entries(NC))if(p0.existsSync($1($,G)))J.push(X);return J}function GG(){try{return TC("gh --version",{stdio:"ignore"}),!0}catch{return!1}}function q5(){try{return TC("gh auth status",{stdio:"ignore"}),!0}catch{return!1}}function QG(){try{return TC(`gh api user/starred/${g1}`,{stdio:"ignore"}),!0}catch{return!1}}function Fn(){return GG()&&q5()&&QG()}import{execSync as d_0}from"node:child_process";function pQ(){try{let $=d_0("claude auth status",{stdio:["pipe","pipe","ignore"],encoding:"utf-8"});return JSON.parse($).loggedIn===!0}catch{return!1}}import{existsSync as i_0,readFileSync as n_0}from"node:fs";import{homedir as o_0}from"node:os";import{join as a_0}from"node:path";function lQ(){let $=a_0(o_0(),".codex","auth.json");if(!i_0($))return!1;try{return!!JSON.parse(n_0($,"utf-8")).tokens?.access_token}catch{return!1}}import{existsSync as s_0,readFileSync as r_0}from"node:fs";import{homedir as t_0}from"node:os";import{join as e_0}from"node:path";function dQ(){let $=e_0(t_0(),".gemini","oauth_creds.json");if(!s_0($))return!1;try{let J=JSON.parse(r_0($,"utf-8"));return!!(J.access_token&&J.refresh_token)}catch{return!1}}import{existsSync as Nn,readFileSync as Mn,statSync as $x0}from"node:fs";import{homedir as OU}from"node:os";import{join as LU}from"node:path";function iQ(){let $=LU(OU(),".qwen","settings.json");if(!Nn($))return!1;try{return!!JSON.parse(Mn($,"utf-8")).security?.auth?.selectedType}catch{return!1}}var Jx0=new Date("2026-04-15T00:00:00Z"),Xx0=[LU(OU(),".qwen","oauth.json"),LU(OU(),".qwen","credentials.json"),LU(OU(),".config","qwen","auth.json"),LU(OU(),".config","qwen","credentials.json")],Gx0=new Set(["refresh_token","oauth_token","oauth_secret","access_token","oauth_callback_confirmed"]),Qx0=["oauth_","oauth2_","oidc_"],Yx0=new Set(["api_key","bearer"]);function Zx0($){let J=Object.keys($),X=J.some((Q)=>Gx0.has(Q)||Qx0.some((Y)=>Q.startsWith(Y))),G=J.some((Q)=>Yx0.has(Q));return X&&!G}function An(){for(let $ of Xx0){if(!Nn($))continue;try{let X=$x0($).mtime<Jx0,G=Mn($,"utf-8"),Q=JSON.parse(G);if(typeof Q!=="object"||Q===null||Array.isArray(Q))continue;if(X&&Zx0(Q))return{hasLegacySession:!0,tokenPath:$,migrationNeeded:!0}}catch{}}return{hasLegacySession:!1,migrationNeeded:!1}}function In($){if(!$.hasLegacySession||!$.migrationNeeded)return;let J=$.tokenPath??"(unknown path)";process.stderr.write(["","⚠ Qwen OAuth sessions were deprecated on 2026-04-15.",`Your credentials at ${J} appear to be legacy OAuth.`,"To continue using Qwen Code, run:"," qwen /auth","and re-authenticate with an API key.",""].join(`
920
920
  `))}var EC=[{id:"claude",label:"Claude CLI",isAuthenticated:pQ},{id:"gemini",label:"Gemini CLI",isAuthenticated:dQ},{id:"codex",label:"Codex CLI",isAuthenticated:lQ},{id:"qwen",label:"Qwen CLI",isAuthenticated:iQ}];async function PC($=!1){let J=q5(),X=Object.fromEntries(EC.map((K)=>[K.id,K.isAuthenticated()])),G={github:J,...X};if($){console.log(JSON.stringify(G,null,2));return}w1(YG.default.bgMagenta(YG.default.white(" \uD83D\uDD10 oh-my-agent auth status ")));let Q=(K)=>K?"✅":"❌",Y=(K)=>K?YG.default.green("Authenticated"):YG.default.red("Not Authenticated"),Z=[["GitHub",J],...EC.map((K)=>[K.label,X[K.id]??!1])];o0(Z.map(([K,U])=>`${Q(U)} ${K.padEnd(12)} ${Y(U)}`).join(`
921
921
  `),"Authentication Status"),L$(`Use ${YG.default.cyan("gemini auth")}, ${YG.default.cyan("claude auth")}, etc. to login.`)}function Rn($){L6($.command("auth:status").description("Check authentication status of all supported CLIs")).action(N$(async(J)=>{await PC(G6(J))},{supportsJsonOutput:!0}))}import{spawn as Kx0}from"node:child_process";import{existsSync as Dn,readFileSync as Tn,writeFileSync as Ux0}from"node:fs";import Wx0 from"node:http";import Hx0 from"node:https";import{homedir as zx0}from"node:os";import{join as En}from"node:path";var Vx0="http://localhost:12341/mcp",Pn=1000,qx0=Number.parseInt(process.env.OH_MY_AG_BRIDGE_PROBE_TIMEOUT_MS??"2000",10),Bx0=Number.parseInt(process.env.OH_MY_AG_BRIDGE_STARTUP_TIMEOUT_MS??"120000",10),LJ={};function wn(){if(LJ.stdinData)process.stdin.off("data",LJ.stdinData);if(LJ.sigint)process.off("SIGINT",LJ.sigint);if(LJ.sigterm)process.off("SIGTERM",LJ.sigterm);LJ={}}function Ox0(){let $=En(zx0(),".serena","serena_config.yml");if(!Dn($))return;try{let X=Tn($,"utf8").match(/^projects:\s*\n((?:\s*-\s*.+\n?)*)/m);if(!X)return;let Q=((X[1]??"").match(/^\s*-\s*(.+)$/gm)||[]).map((Y)=>Y.replace(/^\s*-\s*/,"").trim());for(let Y of Q){let Z=En(Y,".serena","project.yml");if(!Dn(Z))continue;let K=Tn(Z,"utf8");if(!/^languages:/m.test(K)){console.error(`[Bridge] Missing 'languages' key in ${Z}, adding default...`);let U=K.search(/\n(?=\w)/);if(U!==-1){let W=`${K.slice(0,U)}
922
922
 
@@ -1003,7 +1003,7 @@ Co-Authored-By: First Fluke <our.first.fluke@gmail.com>`,pr:"Generated with [oh-
1003
1003
  `),J.push("~/.claude/CLAUDE.md: OMA block removed (migrated to local ./CLAUDE.md)");return J}};import{existsSync as K_,renameSync as Wu0,rmSync as St}from"node:fs";import{join as EO}from"node:path";var _t={name:"005-rename-oma-scm",up($){let J=[],X=EO($,".agents","skills"),G=EO(X,"oma-commit"),Q=EO(X,"oma-scm"),Y=EO($,".agents","workflows","commit.md");if(K_(Y))St(Y,{force:!0}),J.push("workflows/commit.md (removed legacy workflow)");if(!K_(G))return J;if(!K_(Q))return Wu0(G,Q),J.push("skills/oma-commit → skills/oma-scm"),J;return St(G,{recursive:!0,force:!0}),J.push("skills/oma-commit (removed, replaced by oma-scm)"),J}};import{existsSync as Hu0,readFileSync as zu0,writeFileSync as Vu0}from"node:fs";import{join as qu0}from"node:path";function cU($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function Bu0($){let J=!1,X=$.hooks;if(!cU(X))return!1;let G=X.BeforeTool;if(!Array.isArray(G))return!1;for(let Q of G){if(!cU(Q))continue;if(Q.matcher==="Bash")Q.matcher="run_shell_command",J=!0;let Y=Q.hooks;if(!Array.isArray(Y))continue;for(let Z of Y){if(!cU(Z))continue;if(Z.name===void 0&&typeof Z.command==="string"){if(Z.command.includes("test-filter.ts"))Z.name="test-filter",J=!0}if(typeof Z.timeout==="number"&&Z.timeout>0&&Z.timeout<1000)Z.timeout=Z.timeout*1000,J=!0}}for(let Q of["BeforeAgent","AfterAgent"]){let Y=X[Q];if(!Array.isArray(Y))continue;for(let Z of Y){if(!cU(Z))continue;let K=Z.hooks;if(!Array.isArray(K))continue;for(let U of K){if(!cU(U))continue;if(U.name===void 0&&typeof U.command==="string"){if(U.command.includes("keyword-detector.ts"))U.name="keyword-detector",J=!0;if(U.command.includes("persistent-mode.ts"))U.name="persistent-mode",J=!0}if(typeof U.timeout==="number"&&U.timeout>0&&U.timeout<1000)U.timeout=U.timeout*1000,J=!0}}}return J}var xt={name:"006-gemini-cli-compat",up($){let J=[],X=qu0($,".gemini","settings.json");if(!Hu0(X))return J;let G;try{G=JSON.parse(zu0(X,"utf-8"))}catch{return J}let Q=RO(G),Y=Bu0(Q),Z=JSON.stringify(Q),K=EJ(Q),U=Z!==JSON.stringify(K);if(!U&&!Y)return J;if(Vu0(X,`${JSON.stringify(K,null,2)}
1004
1004
  `),U)J.push(".gemini/settings.json (Gemini CLI compatibility updated)");if(Y)J.push(".gemini/settings.json hooks (Gemini matcher/timeout normalized)");return J}};import{existsSync as vt,readFileSync as bt,writeFileSync as kt}from"node:fs";import{join as yt}from"node:path";var ht={name:"007-codex-qwen-serena",up($){let J=[],X=yt($,".qwen","settings.json");if(vt(X)){let Q={};try{Q=JSON.parse(bt(X,"utf-8"))}catch{Q={}}if(PJ(Q)){let Y=wJ(Q);kt(X,`${JSON.stringify(Y,null,2)}
1005
1005
  `),J.push(".qwen/settings.json (Serena MCP registered)")}}let G=yt($,".codex","config.toml");if(vt(G)){let Q=bt(G,"utf-8"),Y=W5(Q);if(KJ(Y)){let Z=UJ(Y);kt(G,`${H5(Z)}
1006
- `),J.push(".codex/config.toml (Serena MCP registered)")}}return J}};var Ou0=[Mt,Tt,wt,Ct,_t,xt,ht];function MG($){let J=[];for(let X of Ou0)J.push(...X.up($));return J}var Iu0={en:"English",ko:"한국어",ja:"日本語",zh:"中文",vi:"Tiếng Việt",de:"Deutsch",es:"Español",fr:"Français",nl:"Nederlands",pl:"Polski",pt:"Português",ru:"Русский"};function Ru0($){let J=F5($,"docs"),X=["en"];if(jJ(J))for(let G of gt(J)){let Q=G.match(/^README\.(.+)\.md$/);if(Q?.[1])X.push(Q[1])}return X.map((G)=>({value:G,label:Iu0[G]??G}))}function Du0($){let J=F5($,".agents","oma-config.yaml");if(!jJ(J))return null;try{return OY(J,"utf-8").match(/^language:\s*([A-Za-z-]+)/m)?.[1]??null}catch{return null}}function Tu0($){if(!jJ($))return;let J;try{J=gt($,{withFileTypes:!0})}catch{return}for(let X of J){if(!X.isSymbolicLink())continue;let G=F5($,X.name),Q;try{Q=Nu0(G)}catch{continue}let Y=Au0($,Q),Z;try{Fu0(Y),Z=!0}catch{Z=!1}if(!Z)try{Mu0(G),console.log(`cleaned broken symlink: ${G}`)}catch{}}}async function PO($={}){console.clear(),w1(r1.default.bgMagenta(r1.default.white(" \uD83D\uDEF8 oh-my-agent ")));let J=MG(process.cwd());if(J.length>0)o0(J.map((N)=>`${r1.default.green("✓")} ${N}`).join(`
1006
+ `),J.push(".codex/config.toml (Serena MCP registered)")}}return J}};var Ou0=[Mt,Tt,wt,Ct,_t,xt,ht];function MG($){let J=[];for(let X of Ou0)J.push(...X.up($));return J}var Iu0={en:"English",ko:"한국어",ja:"日本語",zh:"中文",vi:"Tiếng Việt",de:"Deutsch",es:"Español",fr:"Français",nl:"Nederlands",pl:"Polski",pt:"Português",ru:"Русский"};function Ru0($){let J=F5($,"docs"),X=["en"];if(jJ(J))for(let G of gt(J)){let Q=G.match(/^README\.(.+)\.md$/);if(Q?.[1])X.push(Q[1])}return X.map((G)=>({value:G,label:Iu0[G]??G}))}function Du0($){let J=F5($,".agents","oma-config.yaml");if(!jJ(J))return null;try{return OY(J,"utf-8").match(/^language:\s*([A-Za-z-]+)/m)?.[1]??null}catch{return null}}function Tu0($){if(!jJ($))return;let J;try{J=gt($,{withFileTypes:!0,encoding:"utf-8"})}catch{return}for(let X of J){if(!X.isSymbolicLink())continue;let G=F5($,X.name),Q;try{Q=Nu0(G)}catch{continue}let Y=Au0($,Q),Z;try{Fu0(Y),Z=!0}catch{Z=!1}if(!Z)try{Mu0(G),console.log(`cleaned broken symlink: ${G}`)}catch{}}}async function PO($={}){console.clear(),w1(r1.default.bgMagenta(r1.default.white(" \uD83D\uDEF8 oh-my-agent ")));let J=MG(process.cwd());if(J.length>0)o0(J.map((N)=>`${r1.default.green("✓")} ${N}`).join(`
1007
1007
  `),"Migration");await fB(process.cwd());let X=l8();X.start("Downloading...");let G,Q;try{let N=await LO();G=N.dir,Q=N.cleanup}catch(N){X.stop("Download failed"),n$.error(N instanceof Error?N.message:String(N)),process.exit(1)}X.stop("Downloaded!");let Y=Ru0(G),Z=Du0(process.cwd()),K=Y.some((N)=>N.value===Z)?Z:"en",U=await BJ({message:"Response language?",options:Y,initialValue:K});if(W1(U))Q(),w4("Cancelled."),process.exit(0);let W=await BJ({message:"What type of project?",options:[{value:"all",label:"✨ All",hint:"Install everything"},{value:"fullstack",label:"\uD83C\uDF10 Fullstack",hint:"Frontend + Backend + PM + QA"},{value:"frontend",label:"\uD83C\uDFA8 Frontend",hint:"React/Next.js"},{value:"backend",label:"⚙️ Backend",hint:"Python, Node.js, Rust, ..."},{value:"mobile",label:"\uD83D\uDCF1 Mobile",hint:"Flutter/Dart"},{value:"devops",label:"\uD83D\uDE80 DevOps",hint:"Terraform + CI/CD + Workflows"},{value:"custom",label:"\uD83D\uDD27 Custom",hint:"Choose skills"}]});if(W1(W))w4("Cancelled."),process.exit(0);let H;if(W==="custom"){let N=XG(),A=await zU({message:"Select skills:",options:N.map((I)=>({value:I.name,label:I.name,hint:I.desc})),required:!0});if(W1(A))w4("Cancelled."),process.exit(0);H=A}else H=ai[W]??[];let z=process.cwd(),B={};if(H.includes("oma-backend")){let N=await BJ({message:"Backend language?",options:[{value:"python",label:"\uD83D\uDC0D Python",hint:"FastAPI/SQLAlchemy (default)"},{value:"node",label:"\uD83D\uDFE2 Node.js",hint:"NestJS/Hono + Prisma/Drizzle"},{value:"rust",label:"\uD83E\uDD80 Rust",hint:"Axum/Actix-web"},{value:"other",label:"\uD83D\uDD27 Other / Auto-detect",hint:"Configure later with /stack-set"}],initialValue:"python"});if(W1(N))w4("Cancelled."),process.exit(0);if(N!=="other")B["oma-backend"]=N}let V=[{value:"claude",label:"Claude Code",hint:"hooks + settings + CLAUDE.md"},{value:"codex",label:"Codex CLI",hint:"hooks + plugin"},{value:"copilot",label:"GitHub Copilot",hint:"skill symlinks"},{value:"cursor",label:"Cursor",hint:".cursor/rules/ export + prompt hooks"},{value:"gemini",label:"Gemini CLI",hint:"hooks + Serena MCP"},{value:"qwen",label:"Qwen Code",hint:"hooks + settings"}],q=await zU({message:"CLI tools to configure:",options:V,initialValues:V.map((N)=>N.value),required:!0});if(W1(q))w4("Cancelled."),process.exit(0);let O=q,L=O.filter((N)=>N!=="copilot"),F=[];if(O.includes("claude"))F.push("claude");if(O.includes("copilot"))F.push("copilot");X.start("Installing skills...");try{try{let I=[".claude/skills",".codex/skills",".gemini/skills",".github/skills"];for(let R of I)Tu0(F5(z,R));SB(G,z),Bn(G,z),On(G,z),Ln(G,z,!1,{updateDefaults:$.updateDefaults});for(let R of H)X.message(`Installing ${r1.default.cyan(R)}...`),CB(G,R,z,B[R]);if(X.stop("Skills installed!"),X.start("Installing vendor adaptations..."),gQ(G,z,L),O.includes("claude")){let R=F5(z,".claude","settings.json"),C={};if(jJ(R))try{C=JSON.parse(OY(R,"utf-8"))}catch{C={}}if(MO(C))AO(C),pU(R,`${JSON.stringify(C,null,2)}
1008
1008
  `)}if(O.includes("gemini")){let R=F5(z,".gemini","settings.json"),C={};if(jJ(R))try{C=JSON.parse(OY(R,"utf-8"))}catch{C={}}if(BY(C))EJ(C),pU(R,`${JSON.stringify(C,null,2)}
1009
1009
  `)}if(O.includes("qwen")){let R=F5(z,".qwen","settings.json"),C={};if(jJ(R))try{C=JSON.parse(OY(R,"utf-8"))}catch{C={}}if(PJ(C)){let f=wJ(C);ft(ut(R),{recursive:!0}),pU(R,`${JSON.stringify(f,null,2)}
@@ -1371,7 +1371,7 @@ print(json.dumps({
1371
1371
  }))
1372
1372
  `;function FU$(){return process.env.OMA_PYTHON??"python3"}function NU$($){if(OU$.some((J)=>$===J||$.endsWith(`.${J}`)))return["safari","chrome","firefox"];return["chrome","safari","firefox"]}async function MU$($,J,X){return new Promise((G)=>{let Q=BU$(FU$(),["-c",LU$],{env:{...process.env,OMA_IMPERSONATE_URL:$.toString(),OMA_IMPERSONATE_TARGET:J,OMA_IMPERSONATE_LOCALE:X.locale,OMA_IMPERSONATE_TIMEOUT:String(X.timeoutMs)},stdio:["ignore","pipe","pipe"]}),Y="",Z="";Q.stdout.on("data",(U)=>{Y+=U.toString()}),Q.stderr.on("data",(U)=>{Z+=U.toString()});let K=()=>{Q.kill("SIGTERM")};X.signal?.addEventListener("abort",K),Q.on("close",(U)=>{if(X.signal?.removeEventListener("abort",K),U!==0&&!Y){G({error:`python_exit:${U}:${Z.trim().slice(0,200)}`});return}let W=Y.trim();if(!W){G({error:"empty_stdout"});return}try{G(JSON.parse(W))}catch(H){G({error:`parse_error:${H.message}:${W.slice(0,200)}`})}}),Q.on("error",(U)=>{X.signal?.removeEventListener("abort",K),G({error:`spawn_error:${U.message}`})})})}function AU$($,J,X){let G=new Headers;if($.headers)for(let[Q,Y]of Object.entries($.headers))try{G.set(Q,Y)}catch{}return{ok:($.status??0)>=200&&($.status??0)<400,status:$.status??0,headers:G,url:$.url??J,text:$.body??"",elapsedMs:X,redirected:($.url??J)!==J}}async function XB0($,J){let X=NU$($.hostname),G=[],Q=performance.now();for(let K of X){if(J.signal?.aborted)break;let U=performance.now(),W=await MU$($,K,J),H=Math.round(performance.now()-U);if(W.error==="curl_cffi_not_installed")return I6({url:$.toString(),strategy:"impersonate",error:Error("curl_cffi is not installed. Run: pip install curl_cffi")});if(W.error){G.push({target:K,detail:W.error});continue}let z=AU$(W,$.toString(),H),B=v4(z);if(i10(B))return{url:$.toString(),status:"blocked",strategy:"impersonate",platform:K,httpStatus:z.status,content:z.text,contentType:z.headers.get("content-type")??void 0,elapsedMs:Math.round(performance.now()-Q),signals:B,error:"js-essential-markers-detected"};if(z.ok&&z.text.length>=200)return{url:$.toString(),status:e8(z,B),strategy:"impersonate",platform:K,httpStatus:z.status,content:z.text,contentType:z.headers.get("content-type")??void 0,elapsedMs:Math.round(performance.now()-Q),signals:B};G.push({target:K,detail:`status=${z.status} size=${z.text.length}`})}let Y=Math.round(performance.now()-Q),Z=G.map((K)=>`${K.target}(${K.detail})`).join(" | ");return{...I6({url:$.toString(),strategy:"impersonate",error:Error(Z?`impersonate_failed: ${Z}`:"impersonate_failed")}),elapsedMs:Y,signals:[]}}var GB0="https://r.jina.ai/";function IU$($){let J=`${$.protocol}//${$.hostname}`,X=$.hostname.startsWith("m.")?$.hostname:`m.${$.hostname.replace(/^www\./,"")}`,G=new URL($.toString());return G.hostname=X,[{label:"jina",url:`${GB0}${$.toString()}`,headers:_G({accept:"text/plain"})},{label:"jina-json",url:`${GB0}${$.toString()}`,headers:_G({accept:"application/json"})},{label:"curl-desktop",url:$.toString(),headers:_G({userAgent:I5.desktopFirefox,referer:J})},{label:"curl-mobile",url:G.toString(),headers:_G({userAgent:I5.mobileSafari,referer:J})},{label:"curl-googlebot",url:$.toString(),headers:_G({userAgent:I5.googlebot})}]}function RU$($,J){if(!$.startsWith("jina"))return J;return J}async function QB0($,J){let X=IU$($),G=new AbortController;if(J.signal)if(J.signal.aborted)G.abort(J.signal.reason);else J.signal.addEventListener("abort",()=>G.abort(J.signal?.reason));let Q=performance.now(),Y={},Z=null,K=X.map(async(U)=>{let W=await S6(U.url,{headers:U.headers,timeoutMs:J.timeoutMs,signal:G.signal,locale:J.locale}),H=v4(W);if(U.label.startsWith("jina")){let z=l10(W);if(z)throw Z=z,Error(`jina-quota:${z.detail}`)}if(!DU$(W,H))throw Y[U.label]=`status=${W.status} size=${W.text.length}`,Error(`weak-response:${U.label}`);return{label:U.label,resp:W,signals:H}});try{let U=await Promise.any(K);G.abort();let W=Math.round(performance.now()-Q);return{url:$.toString(),status:e8(U.resp,U.signals),strategy:"probe",platform:U.label,httpStatus:U.resp.status,content:RU$(U.label,U.resp.text),contentType:U.resp.headers.get("content-type")??void 0,elapsedMs:W,signals:Z?[...U.signals,Z]:U.signals}}catch(U){let W=Math.round(performance.now()-Q),H=Object.entries(Y).map(([z,B])=>`${z}:${B}`).join(" ");if(Z)return{...I6({url:$.toString(),error:Error(`probe failed — ${H}`),strategy:"probe"}),elapsedMs:W,signals:[Z]};return{...I6({url:$.toString(),error:U instanceof AggregateError?Error(H):U,strategy:"probe"}),elapsedMs:W}}}function DU$($,J){if(!$.ok)return!1;if($.text.length<200)return!1;if(J.some((X)=>X.kind==="waf-body"||X.kind==="challenge-body"||X.kind==="js-essential"||X.kind==="http-status"))return!1;return!0}var TU$=["api","probe","impersonate","browser","archive"];function EU$($){if($.only?.length)return $.only;let J=TU$.slice();if(!$.includeArchive)J=J.filter((X)=>X!=="archive");if($.skip?.length)J=J.filter((X)=>!$.skip?.includes(X));return J}async function YB0($,J,X){switch($){case"api":return await fL(J,X)??null;case"probe":return QB0(J,X);case"impersonate":return XB0(J,X);case"browser":return JB0(J,X);case"archive":return WW(J,X)}}function Fg($){if($.status==="ok")return!0;if($.status==="auth-required"&&n10($.signals))return!0;return!1}function PU$($){return $.status==="auth-required"||$.status==="invalid-input"||$.status==="not-found"}async function wU$($){let J=Math.floor(Math.random()*500);await new Promise((X)=>setTimeout(X,$+J))}function jU$($){let J=$.find((Q)=>Q.kind==="rate-limit");if(!J)return 1500;let X=J.detail.match(/retry-after=(\d+)/);if(!X?.[1])return 1500;let G=Number.parseInt(X[1],10);if(Number.isNaN(G)||G>10)return 1500;return G*1000}async function ZB0($,J,X={}){let G=EU$(X),Q=[],Y=new Set,Z=null,K=!1;for(let U of G){if(J.signal?.aborted)break;if(K&&U==="impersonate")continue;let W=await YB0(U,$,J);if(!W)continue;if(Q.push({strategy:U,platform:W.platform,status:W.status,httpStatus:W.httpStatus,elapsedMs:W.elapsedMs,signals:W.signals,error:W.error}),W.signals.some((H)=>H.kind==="js-essential"))K=!0;if(Fg(W))return W.attempts=Q,W;if(PU$(W))return W.attempts=Q,W;if(X.retryOnRateLimit!==!1&&o10(W.signals)&&!Y.has(U)){Y.add(U),await wU$(jU$(W.signals));let H=await YB0(U,$,J);if(H){if(Q.push({strategy:U,platform:H.platform,status:H.status,httpStatus:H.httpStatus,elapsedMs:H.elapsedMs,signals:H.signals,error:H.error}),Fg(H))return H.attempts=Q,H;Z=H;continue}}Z=W}if(!G.includes("archive")&&X.includeArchive!==!1){let U=await WW($,J);if(Q.push({strategy:"archive",platform:U.platform,status:U.status,httpStatus:U.httpStatus,elapsedMs:U.elapsedMs,signals:U.signals,error:U.error}),Fg(U))return U.attempts=Q,U;Z=U}if(Z)return Z.attempts=Q,Z;return{url:$.toString(),status:"error",strategy:G[0]??"probe",content:"",elapsedMs:0,signals:[],attempts:Q,error:"all strategies failed"}}var iB0=d0(lB0(),1);var tW$=["/rss","/feed","/atom.xml","/rss.xml","/index.xml"],eW$=new iB0.XMLParser({ignoreAttributes:!1,attributeNamePrefix:"@_",textNodeName:"#text"});function Tg($){if($===void 0||$===null)return[];return Array.isArray($)?$:[$]}function X4($){if($==null)return;if(typeof $==="string")return $;if(typeof $==="object"){let J=$;if(typeof J["#text"]==="string")return J["#text"];if(typeof J["#cdata"]==="string")return J["#cdata"]}return}function dB0($){for(let J of Tg($)){let X=J?.["@_href"],G=J?.["@_rel"];if(typeof X==="string"&&(G===void 0||G==="alternate"))return X}return}function nB0($){let J;try{J=eW$.parse($)}catch{return null}let X=J.rss;if(X){let Q=X.channel;if(!Q)return null;let Y=Tg(Q.item);return{kind:"rss",title:X4(Q.title),description:X4(Q.description),link:X4(Q.link),entries:Y.map((Z)=>({title:X4(Z.title),link:X4(Z.link),pubDate:X4(Z.pubDate),description:X4(Z.description),content:X4(Z["content:encoded"])??X4(Z.content)}))}}let G=J.feed;if(G){let Q=Tg(G.entry);return{kind:"atom",title:X4(G.title),description:X4(G.subtitle),link:dB0(G.link),entries:Q.map((Y)=>({title:X4(Y.title),link:dB0(Y.link),pubDate:X4(Y.published)??X4(Y.updated),description:X4(Y.summary),content:X4(Y.content)??X4(Y.summary)}))}}return null}async function oB0($,J){let X=performance.now(),G;try{let Y=await S6($.toString(),{timeoutMs:J.timeoutMs,locale:J.locale,signal:J.signal});if(Y.ok)G=hL(Y.text).alternate?.[0]?.href}catch{}let Q=new Set;if(G)try{Q.add(new URL(G,$).toString())}catch{}for(let Y of tW$)Q.add(new URL(Y,`${$.protocol}//${$.host}`).toString());for(let Y of Q){if(J.signal?.aborted)break;try{let Z=await S6(Y,{timeoutMs:J.timeoutMs,locale:J.locale,signal:J.signal});if(!Z.ok||Z.text.length<50)continue;let K=nB0(Z.text);if(!K||K.entries.length===0)continue;return{url:$.toString(),status:"ok",strategy:"probe",platform:"rss",httpStatus:Z.status,content:Z.text,contentType:Z.headers.get("content-type")??void 0,elapsedMs:Math.round(performance.now()-X),signals:[],feedUrl:Y,feed:K}}catch{}}return{url:$.toString(),status:"not-found",strategy:"probe",platform:"rss",content:"",elapsedMs:Math.round(performance.now()-X),signals:[],error:"no RSS/Atom feed discovered"}}function aB0($,J="en-US"){let[X,G]=J.split("-"),Q=new URL("https://news.google.com/rss/search");return Q.searchParams.set("q",$),Q.searchParams.set("hl",X??"en"),Q.searchParams.set("gl",G??"US"),Q.searchParams.set("ceid",`${G??"US"}:${X??"en"}`),Q.toString()}var HI={"github.com":{domain:"github.com",level:"verified",score:0.95,tags:["code-host"],source:"registry"},"docs.github.com":{domain:"docs.github.com",level:"verified",score:0.95,tags:["lang-docs"],source:"registry"},"developer.mozilla.org":{domain:"developer.mozilla.org",level:"verified",score:0.95,tags:["lang-docs"],source:"registry"},"nextjs.org":{domain:"nextjs.org",level:"verified",score:0.9,tags:["vendor","lang-docs"],source:"registry"},"vercel.com":{domain:"vercel.com",level:"verified",score:0.9,tags:["vendor"],source:"registry"},"typescriptlang.org":{domain:"typescriptlang.org",level:"verified",score:0.95,tags:["lang-docs"],source:"registry"},"stackoverflow.com":{domain:"stackoverflow.com",level:"community",score:0.7,tags:["qna"],source:"registry"},"dev.to":{domain:"dev.to",level:"external",score:0.4,tags:["blog"],source:"registry"},"medium.com":{domain:"medium.com",level:"external",score:0.35,tags:["blog"],source:"registry"},"npmjs.com":{domain:"npmjs.com",level:"verified",score:0.9,tags:["registry"],source:"registry"},"pypi.org":{domain:"pypi.org",level:"verified",score:0.9,tags:["registry"],source:"registry"},"news.ycombinator.com":{domain:"news.ycombinator.com",level:"community",score:0.65,tags:["news"],source:"registry"},"reddit.com":{domain:"reddit.com",level:"community",score:0.55,tags:["forum"],source:"registry"},"wikipedia.org":{domain:"wikipedia.org",level:"community",score:0.75,tags:["encyclopedia"],source:"registry"},"arxiv.org":{domain:"arxiv.org",level:"verified",score:0.9,tags:["academic"],source:"registry"},"doi.org":{domain:"doi.org",level:"verified",score:0.95,tags:["academic"],source:"registry"}};function $H$($){return $.replace(/^www\./,"")}function JH$($){if($ in HI){let X=HI[$];return X?{...X}:null}let J=$H$($);if(J in HI){let X=HI[J];return X?{...X}:null}return null}function XH$($){let J=$.split(".").pop();if(J==="gov"||J==="edu"||J==="mil")return{domain:$,level:"verified",score:0.9,tags:["institution"],source:"heuristic"};if(/\.gov\.[a-z]{2}$/.test($)||/\.ac\.[a-z]{2}$/.test($))return{domain:$,level:"verified",score:0.85,tags:["institution"],source:"heuristic"};return null}async function GH$($){try{let J=await S6(`https://tranco-list.eu/api/ranks/domain/${$}`,{timeoutMs:5000});if(!J.ok)return null;let G=JSON.parse(J.text).ranks?.[0]?.rank;if(!G)return null;let Q=G<1e4?0.6:G<1e5?0.4:0.2;return{domain:$,level:G<1e4?"community":"external",score:Q,tags:["tranco"],source:"tranco",rank:G}}catch{return null}}async function sB0($){let J=JH$($);if(J)return J;let X=XH$($);if(X)return X;let G=await GH$($);if(G)return G;return{domain:$,level:"unknown",score:null,tags:[],source:"heuristic"}}var rB0=["api","probe","impersonate","browser","archive"];function tB0($){if(!$)return;let J=$.split(",").map((G)=>G.trim()).filter(Boolean),X=J.filter((G)=>!rB0.includes(G));if(X.length>0)throw Error(`Unknown strategy: ${X.join(", ")}. Valid: ${rB0.join(", ")}`);return J}function iZ($){try{return new URL($)}catch{throw Error(`Invalid URL: ${$}`)}}function jX($){return{timeoutMs:$.timeout?Math.max(1000,Math.floor(Number($.timeout)*1000)):15000,locale:$.locale??"en-US,en;q=0.9"}}function f7($,J){if(J)console.log(JSON.stringify($,null,2));else console.log(JSON.stringify($))}function k3($){if(!$){process.exitCode=1;return}if($.status==="ok")process.exitCode=0;else if($.status==="blocked")process.exitCode=2;else if($.status==="not-found")process.exitCode=3;else if($.status==="invalid-input")process.exitCode=4;else if($.status==="auth-required")process.exitCode=5;else if($.status==="timeout")process.exitCode=6;else process.exitCode=1}function eB0($){let J=$.command("search").description("Mechanical search primitives — fetch, meta, rss, media, trust, code").alias("s");J.command("fetch <url>").description("Fetch URL via auto-escalating strategy pipeline").option("--only <strategies>","Comma-separated strategies to run").option("--skip <strategies>","Comma-separated strategies to skip").option("--include-archive","Include archive strategy as last fallback").option("--timeout <seconds>","Per-strategy timeout","15").option("--locale <value>","Accept-Language header","en-US,en;q=0.9").option("--pretty","Pretty-print JSON output").action(async(X,G)=>{try{let Q=iZ(X),Y=jX(G),Z=await ZB0(Q,Y,{only:tB0(G.only),skip:tB0(G.skip),includeArchive:G.includeArchive});f7(Z,Boolean(G.pretty)),k3(Z)}catch(Q){console.error(g5.default.red(Q.message)),process.exitCode=1}}),J.command("api <url>").description("Fetch via matched platform API (Phase 0)").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(X,G)=>{try{let Q=iZ(X);if(!Ov(Q)){console.error(g5.default.yellow(`No API handler matches host ${Q.hostname}`)),process.exitCode=3;return}let Z=jX(G),K=await fL(Q,Z);if(!K){process.exitCode=3;return}f7(K,Boolean(G.pretty)),k3(K)}catch(Q){console.error(g5.default.red(Q.message)),process.exitCode=1}}),J.command("api:search <query>").description("Fan-out keyword search across platforms that support it").option("--platforms <list>","Comma-separated platform ids").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(X,G)=>{let Q=jX(G),Y=G.platforms?G.platforms.split(",").map((K)=>K.trim()).filter(Boolean):void 0,Z=await B60(X,Q,Y);f7(Z,Boolean(G.pretty))}),J.command("meta <url>").description("Extract OGP / JSON-LD / Schema.org from URL").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(X,G)=>{try{let Q=iZ(X),Y=jX(G),Z=await p10(Q,Y),{content:K,...U}=Z;f7(U,Boolean(G.pretty)),k3(Z)}catch(Q){console.error(g5.default.red(Q.message)),process.exitCode=1}}),J.command("rss <url>").description("Discover and parse RSS/Atom feed for a URL").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(X,G)=>{try{let Q=iZ(X),Y=jX(G),Z=await oB0(Q,Y),{content:K,...U}=Z;f7(U,Boolean(G.pretty)),k3(Z)}catch(Q){console.error(g5.default.red(Q.message)),process.exitCode=1}}),J.command("rss:google <query>").description("Build Google News RSS URL for a query").option("--locale <value>","Locale (e.g., ko-KR)","en-US").action((X,G)=>{let Q=aB0(X,G.locale??"en-US");console.log(Q)}),J.command("media <url>").description("Extract media metadata via yt-dlp (1858 sites)").option("--subs","Write subtitles").option("--sub-lang <list>","Subtitle languages (comma-separated)","en").option("--format <spec>","yt-dlp format spec").option("--timeout <seconds>","Timeout","30").option("--pretty","Pretty-print JSON").action(async(X,G)=>{try{let Q=iZ(X),Y=jX(G),Z=G.subLang?G.subLang.split(",").map((U)=>U.trim()).filter(Boolean):void 0,K=await m10(Q,Y,{subtitles:G.subs,...Z?{subLangs:Z}:{},...G.format?{format:G.format}:{}});f7(K,Boolean(G.pretty)),k3(K)}catch(Q){console.error(g5.default.red(Q.message)),process.exitCode=1}}),J.command("archive <url>").description("Fetch via AMP / archive.today / Wayback").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(X,G)=>{try{let Q=iZ(X),Y=jX(G),Z=await WW(Q,Y);f7(Z,Boolean(G.pretty)),k3(Z)}catch(Q){console.error(g5.default.red(Q.message)),process.exitCode=1}}),J.command("trust <domain>").description("Resolve trust level / score for a domain").option("--pretty","Pretty-print JSON").action(async(X,G)=>{let Q=await sB0(X.toLowerCase());f7(Q,Boolean(G.pretty))}),J.command("code <query>").description("Search code via gh / glab").option("--host <github|gitlab>","Host","github").option("--language <lang>","Language filter").option("--repo <owner/repo>","Scope to a repo").option("--limit <n>","Max results","20").option("--pretty","Pretty-print JSON").action(async(X,G)=>{let Q=G.host==="gitlab"||G.host==="github"?G.host:"github",Y=jX({}),Z=await g10(X,Y,{host:Q,...G.language?{language:G.language}:{},...G.repo?{repo:G.repo}:{},...G.limit?{limit:Number.parseInt(G.limit,10)}:{}});f7(Z,Boolean(G.pretty)),k3(Z)}),J.command("doctor").description("Check dependencies (Chrome, python3 curl_cffi, yt-dlp, gh)").action(async()=>{let X=[],G=Lg();X.push({name:"chrome",ok:Boolean(G),detail:G??"Install Chrome or set OMA_CHROME_PATH"}),X.push(await Eg("python3",["--version"])),X.push(await QH$()),X.push(await Eg("yt-dlp",["--version"])),X.push(await Eg("gh",["--version"]));for(let Q of X){let Y=Q.ok?g5.default.green("✓"):g5.default.yellow("!");console.log(`${Y} ${Q.name}: ${Q.detail}`)}if(X.some((Q)=>!Q.ok))process.exitCode=1})}async function Eg($,J){return new Promise((X)=>{let{spawn:G}=t("node:child_process"),Q=G($,J,{stdio:["ignore","pipe","pipe"]}),Y="";Q.stdout?.on("data",(Z)=>{Y+=Z.toString()}),Q.on("error",()=>X({name:$,ok:!1,detail:"not found"})),Q.on("close",(Z)=>{if(Z===0)X({name:$,ok:!0,detail:Y.trim()});else X({name:$,ok:!1,detail:`exit code ${Z}`})})})}async function QH$(){return new Promise(($)=>{let{spawn:J}=t("node:child_process"),X=J("python3",["-c","import curl_cffi; print(curl_cffi.__version__)"],{stdio:["ignore","pipe","pipe"]}),G="";X.stdout?.on("data",(Q)=>{G+=Q.toString()}),X.on("error",()=>$({name:"curl_cffi",ok:!1,detail:"python3 not found"})),X.on("close",(Q)=>{if(Q===0)$({name:"curl_cffi",ok:!0,detail:`v${G.trim()}`});else $({name:"curl_cffi",ok:!1,detail:"not installed (pip install curl_cffi)"})})})}r4();var CX=d0(A1(),1);import{execSync as YH$,spawnSync as $O0}from"node:child_process";import{platform as ZH$}from"node:os";function KH$(){let $=ZH$();if($==="darwin")return"brew install gh";if($==="win32")return"winget install GitHub.cli";return"sudo apt install gh"}async function JO0(){if(console.clear(),w1(CX.default.bgMagenta(CX.default.white(" ⭐ oh-my-agent star "))),!GG()){let J=KH$(),X=await Z4({message:`GitHub CLI (gh) is not installed. Install with ${CX.default.cyan(J)}?`});if(W1(X)||!X){L$("Install gh manually and try again.");return}let G=l8();G.start("Installing GitHub CLI...");let Q=$O0(J,{shell:!0,stdio:"pipe"});if(Q.status!==0){G.stop("Installation failed"),n$.error(Q.stderr?.toString()||"Unknown error"),L$("Please install gh manually.");return}G.stop("GitHub CLI installed!")}if(!q5()){n$.warn("GitHub CLI is not authenticated.");let J=await Z4({message:`Run ${CX.default.cyan("gh auth login")} now?`});if(W1(J)||!J){L$("Authenticate and try again.");return}if($O0("gh",["auth","login"],{stdio:"inherit"}),!q5()){L$("Authentication was not completed. Try again.");return}n$.success("Authenticated!")}if(QG()){L$(`Already starred ${CX.default.cyan(g1)}! Thank you! \uD83D\uDE4F`);return}let $=await Z4({message:`Star ${CX.default.cyan(g1)} on GitHub?`});if(W1($)||!$){L$("Maybe next time!");return}try{YH$(`gh api -X PUT /user/starred/${g1}`,{stdio:"ignore"}),L$(`Starred ${CX.default.cyan(g1)}! Thank you! \uD83C\uDF1F`)}catch{n$.error("Failed to star the repository."),L$("Please try again later.")}}function XO0($){$.command("star").description("Star oh-my-agent on GitHub").action(N$(async()=>{await JO0()}))}r4();Uv();KU();var s9=d0(A1(),1);import{existsSync as zI,mkdirSync as UH$,readdirSync as WH$,readFileSync as HH$,writeFileSync as GO0}from"node:fs";import{dirname as zH$,join as QO0}from"node:path";function wg($){return QO0($,".serena","metrics.json")}function Pg(){return{sessions:0,skillsUsed:{},tasksCompleted:0,totalSessionTime:0,filesChanged:0,linesAdded:0,linesRemoved:0,lastUpdated:new Date().toISOString(),startDate:new Date().toISOString()}}function VH$($){let J=wg($);if(zI(J))try{return JSON.parse(HH$(J,"utf-8"))}catch{return Pg()}return Pg()}function qH$($,J){let X=wg($),G=zH$(X);if(!zI(G))UH$(G,{recursive:!0});J.lastUpdated=new Date().toISOString(),GO0(X,JSON.stringify(J,null,2),"utf-8")}function BH$($){let J=QO0($,".serena","memories"),X={};if(!zI(J))return X;try{let G=WH$(J);for(let Q of G){let Y=Q.match(/(?:progress|result)-(\w+)/);if(Y?.[1]){let Z=Y[1];X[Z]=(X[Z]||0)+1}}}catch{}return X}async function YO0($=!1,J=!1){let X=process.cwd(),G=wg(X);if(J){if(zI(G))GO0(G,JSON.stringify(Pg(),null,2),"utf-8");if($)console.log(JSON.stringify({reset:!0}));else console.log(s9.default.green("✅ Metrics reset successfully."));return}let Q=VH$(X),Y=bL(X),Z=BH$(X),K=id(X),U=VB(X),W=U.startedAt?new Date(U.startedAt):null,H=W&&!Number.isNaN(W.getTime())?Math.max(0,Math.floor((Date.now()-W.getTime())/1000)):0;for(let[O,L]of Object.entries(Z))Q.skillsUsed[O]=(Q.skillsUsed[O]||0)+L;if(K>Q.tasksCompleted)Q.tasksCompleted=K;if(U.id){if(["completed","failed","aborted"].includes(U.status||"")&&(Q.lastSessionId!==U.id||Q.lastSessionStatus!==U.status)&&H>0)Q.totalSessionTime+=H;Q.lastSessionId=U.id,Q.lastSessionStatus=U.status,Q.lastSessionStarted=U.startedAt,Q.lastSessionDuration=H}Q.filesChanged+=Y.filesChanged,Q.linesAdded+=Y.linesAdded,Q.linesRemoved+=Y.linesRemoved,Q.sessions+=1,qH$(X,Q);let z=Math.max(1,Math.ceil((Date.now()-new Date(Q.startDate).getTime())/86400000)),B=Q.sessions>0?Math.round(Q.totalSessionTime/Q.sessions):0;if($){console.log(JSON.stringify({...Q,gitStats:Y,daysSinceStart:z,avgSessionTime:B},null,2));return}console.clear(),w1(s9.default.bgMagenta(s9.default.white(" \uD83D\uDCCA oh-my-agent stats ")));let V=[s9.default.bold(`\uD83D\uDCC8 Productivity Metrics (${z} days)`),"┌─────────────────────┬──────────────┐",`│ ${s9.default.bold("Metric")} │ ${s9.default.bold("Value")} │`,"├─────────────────────┼──────────────┤",`│ Sessions │ ${String(Q.sessions).padEnd(12)} │`,`│ Tasks Completed │ ${String(Q.tasksCompleted).padEnd(12)} │`,`│ Files Changed │ ${String(Q.filesChanged).padEnd(12)} │`,`│ Lines Added │ ${s9.default.green(`+${Q.linesAdded}`).padEnd(12)} │`,`│ Lines Removed │ ${s9.default.red(`-${Q.linesRemoved}`).padEnd(12)} │`,"└─────────────────────┴──────────────┘"].join(`
1373
1373
  `);o0(V,"Overview");let q=Object.entries(Q.skillsUsed).sort(([,O],[,L])=>L-O).slice(0,5);if(q.length>0){let O=[s9.default.bold("\uD83C\uDFC6 Top Skills Used"),...q.map(([L,F],N)=>` ${N+1}. ${L} (${F})`)].join(`
1374
- `);o0(O,"Skills")}L$(s9.default.dim(`Data stored in: ${G}`))}function ZO0($){L6($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(N$(async(J)=>{await YO0(G6(J),J.reset)},{supportsJsonOutput:!0}))}r4();var A4=d0(A1(),1);import{execSync as IH$}from"node:child_process";import{cpSync as BI,existsSync as r9,mkdirSync as Ez,readFileSync as nZ,rmSync as jg,writeFileSync as h3}from"node:fs";import{tmpdir as RH$}from"node:os";import{dirname as HO0,join as a6}from"node:path";var VI=d0(A1(),1);import{execSync as OH$,spawn as LH$}from"node:child_process";import{realpathSync as KO0}from"node:fs";import Tz from"node:process";var y3="oh-my-agent";function FH$($=Tz.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(Tz.env.IS_BINARY==="true")return{packageManager:"binary",isGlobal:!0,updateMessage:"Running as a standalone binary. Download the latest release from GitHub."};let J;try{J=KO0($).replace(/\\/g,"/")}catch{return{packageManager:"unknown",isGlobal:!1}}if(J.includes("/.npm/_npx")||J.includes("/npm/_npx"))return{packageManager:"npx",isGlobal:!1,updateMessage:"Running via npx, auto-update not applicable."};if(J.includes("/.pnpm/_pnpx")||J.includes("/.cache/pnpm/dlx"))return{packageManager:"pnpx",isGlobal:!1,updateMessage:"Running via pnpx, auto-update not applicable."};if(J.includes("/.bun/install/cache"))return{packageManager:"bunx",isGlobal:!1,updateMessage:"Running via bunx, auto-update not applicable."};if(Tz.platform==="darwin")try{let X=OH$(`brew --prefix ${y3}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(X){let G=KO0(X).replace(/\\/g,"/");if(J.startsWith(G))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${y3}`,updateMessage:"Installed via Homebrew. Updating in background..."}}}catch{}if(J.includes("/.pnpm/global")||J.includes("/.local/share/pnpm"))return{packageManager:"pnpm",isGlobal:!0,updateCommand:`pnpm add -g ${y3}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(J.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${y3}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(J.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${y3}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${y3}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var UO0=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function NH$($,J){let X=$.match(UO0),G=J.match(UO0);if(!X||!G)return!1;for(let Q=1;Q<=3;Q++){let Y=Number(X[Q]),Z=Number(G[Q]);if(Y<Z)return!0;if(Y>Z)return!1}return!1}async function MH$($=y3,J=2000){try{let X=await VY.get(`https://registry.npmjs.org/${$}/latest`,{timeout:J});return typeof X.data?.version==="string"?X.data.version:null}catch{return null}}async function WO0($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(Tz.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(Tz.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let J=await MH$();if(!J)return{triggered:!1,reason:"fetch-failed"};if(!NH$($.currentVersion,J))return{triggered:!1,reason:"up-to-date",latest:J};let X=FH$();if(!X.updateCommand)return $.onNotice?.(VI.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. ${X.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:J};try{return LH$(X.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(VI.default.cyan(`global oh-my-agent ${$.currentVersion} → ${J} updating in background. New version applies on next run.`)),{triggered:!0,latest:J}}catch{return $.onNotice?.(VI.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. Run: ${X.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:J}}}var qI={name:"oh-my-agent",version:"5.18.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",build:"bun run sync:readme && bun build cli.ts --outfile bin/cli.js --target node --minify",dev:"bun run cli.ts",lint:"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",axios:"^1.15.0","better-sqlite3":"^12.9.0",chokidar:"^5.0.0",commander:"^14.0.3","date-fns":"^4.1.0","fast-xml-parser":"^4","p-map":"^7.0.4",picocolors:"^1.1.1","puppeteer-core":"^24","smol-toml":"^1.6.1",ws:"^8.18.0",yaml:"^2.8.2",zod:"^4.3.6"},devDependencies:{"@biomejs/biome":"2.4.5","@types/better-sqlite3":"^7.6.13","@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"]}};function DH$($){if(!$)return{intro:(X)=>w1(X),outro:(X)=>L$(X),note:(X,G)=>o0(X,G),logError:(X)=>n$.error(X),spinnerStart:(X)=>{let G=l8();return G.start(X),G}};let J={start(X){},stop(X){if(X)console.log(X)},message(X){console.log(X)}};return{intro:(X)=>console.log(X),outro:(X)=>console.log(X),note:(X,G)=>console.log(X),logError:(X)=>console.error(X),spinnerStart:(X)=>{return console.log(X),J}}}function TH$($,J){if($!==null)return"ready";return J?"legacy":"missing"}async function Cg($=!1,J=!1){if(!J&&process.stdout.isTTY)console.clear();let X=DH$(J);X.intro(A4.default.bgMagenta(A4.default.white(" \uD83D\uDEF8 oh-my-agent update ")));let G=process.cwd();await WO0({currentVersion:qI.version,enabled:O$0(G),onSpawnStart:(H)=>X.note(H,"CLI auto-update"),onNotice:(H)=>X.note(H,"CLI update available")});let Q=await FO(G),Y=Qt(G),Z=TH$(Q,Y);if(Z==="missing"){if(X.logError("oh-my-agent is not installed in this project. Run `oma install` first."),J)throw Error("oh-my-agent is not installed in this project. Run `oma install` first.");process.exit(1)}let K=MG(G);if(K.length>0)X.note(K.map((H)=>`${A4.default.green("✓")} ${H}`).join(`
1374
+ `);o0(O,"Skills")}L$(s9.default.dim(`Data stored in: ${G}`))}function ZO0($){L6($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(N$(async(J)=>{await YO0(G6(J),J.reset)},{supportsJsonOutput:!0}))}r4();var A4=d0(A1(),1);import{execSync as IH$}from"node:child_process";import{cpSync as BI,existsSync as r9,mkdirSync as Ez,readFileSync as nZ,rmSync as jg,writeFileSync as h3}from"node:fs";import{tmpdir as RH$}from"node:os";import{dirname as HO0,join as a6}from"node:path";var VI=d0(A1(),1);import{execSync as OH$,spawn as LH$}from"node:child_process";import{realpathSync as KO0}from"node:fs";import Tz from"node:process";var y3="oh-my-agent";function FH$($=Tz.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(Tz.env.IS_BINARY==="true")return{packageManager:"binary",isGlobal:!0,updateMessage:"Running as a standalone binary. Download the latest release from GitHub."};let J;try{J=KO0($).replace(/\\/g,"/")}catch{return{packageManager:"unknown",isGlobal:!1}}if(J.includes("/.npm/_npx")||J.includes("/npm/_npx"))return{packageManager:"npx",isGlobal:!1,updateMessage:"Running via npx, auto-update not applicable."};if(J.includes("/.pnpm/_pnpx")||J.includes("/.cache/pnpm/dlx"))return{packageManager:"pnpx",isGlobal:!1,updateMessage:"Running via pnpx, auto-update not applicable."};if(J.includes("/.bun/install/cache"))return{packageManager:"bunx",isGlobal:!1,updateMessage:"Running via bunx, auto-update not applicable."};if(Tz.platform==="darwin")try{let X=OH$(`brew --prefix ${y3}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(X){let G=KO0(X).replace(/\\/g,"/");if(J.startsWith(G))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${y3}`,updateMessage:"Installed via Homebrew. Updating in background..."}}}catch{}if(J.includes("/.pnpm/global")||J.includes("/.local/share/pnpm"))return{packageManager:"pnpm",isGlobal:!0,updateCommand:`pnpm add -g ${y3}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(J.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${y3}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(J.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${y3}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${y3}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var UO0=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function NH$($,J){let X=$.match(UO0),G=J.match(UO0);if(!X||!G)return!1;for(let Q=1;Q<=3;Q++){let Y=Number(X[Q]),Z=Number(G[Q]);if(Y<Z)return!0;if(Y>Z)return!1}return!1}async function MH$($=y3,J=2000){try{let X=await VY.get(`https://registry.npmjs.org/${$}/latest`,{timeout:J});return typeof X.data?.version==="string"?X.data.version:null}catch{return null}}async function WO0($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(Tz.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(Tz.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let J=await MH$();if(!J)return{triggered:!1,reason:"fetch-failed"};if(!NH$($.currentVersion,J))return{triggered:!1,reason:"up-to-date",latest:J};let X=FH$();if(!X.updateCommand)return $.onNotice?.(VI.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. ${X.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:J};try{return LH$(X.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(VI.default.cyan(`global oh-my-agent ${$.currentVersion} → ${J} updating in background. New version applies on next run.`)),{triggered:!0,latest:J}}catch{return $.onNotice?.(VI.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. Run: ${X.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:J}}}var qI={name:"oh-my-agent",version:"5.18.2",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",build:"bun run sync:readme && bun build cli.ts --outfile bin/cli.js --target node --minify",dev:"bun run cli.ts",lint:"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",axios:"^1.15.0","better-sqlite3":"^12.9.0",chokidar:"^5.0.0",commander:"^14.0.3","date-fns":"^4.1.0","fast-xml-parser":"^4","p-map":"^7.0.4",picocolors:"^1.1.1","puppeteer-core":"^24","smol-toml":"^1.6.1",ws:"^8.18.0",yaml:"^2.8.2",zod:"^4.3.6"},devDependencies:{"@biomejs/biome":"2.4.5","@types/better-sqlite3":"^7.6.13","@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"]}};function DH$($){if(!$)return{intro:(X)=>w1(X),outro:(X)=>L$(X),note:(X,G)=>o0(X,G),logError:(X)=>n$.error(X),spinnerStart:(X)=>{let G=l8();return G.start(X),G}};let J={start(X){},stop(X){if(X)console.log(X)},message(X){console.log(X)}};return{intro:(X)=>console.log(X),outro:(X)=>console.log(X),note:(X,G)=>console.log(X),logError:(X)=>console.error(X),spinnerStart:(X)=>{return console.log(X),J}}}function TH$($,J){if($!==null)return"ready";return J?"legacy":"missing"}async function Cg($=!1,J=!1){if(!J&&process.stdout.isTTY)console.clear();let X=DH$(J);X.intro(A4.default.bgMagenta(A4.default.white(" \uD83D\uDEF8 oh-my-agent update ")));let G=process.cwd();await WO0({currentVersion:qI.version,enabled:O$0(G),onSpawnStart:(H)=>X.note(H,"CLI auto-update"),onNotice:(H)=>X.note(H,"CLI update available")});let Q=await FO(G),Y=Qt(G),Z=TH$(Q,Y);if(Z==="missing"){if(X.logError("oh-my-agent is not installed in this project. Run `oma install` first."),J)throw Error("oh-my-agent is not installed in this project. Run `oma install` first.");process.exit(1)}let K=MG(G);if(K.length>0)X.note(K.map((H)=>`${A4.default.green("✓")} ${H}`).join(`
1375
1375
  `),"Migration");let U=K.length>0||X_(G);if(K.length>0&&!X_(G))G_(G,!0);if(!J)await fB(G);if(Z==="legacy")X.note("Existing .agents installation detected without _version.json. Updating in place and restoring version metadata.","Legacy install");let W;try{W=X.spinnerStart("Checking for updates...");let H=await Yt();if(Q===H.version&&!U){W.stop(A4.default.green("Already up to date!")),X.outro(`Current version: ${A4.default.cyan(Q)}`);return}let z=Q===H.version;W.message(`Downloading ${A4.default.cyan(H.version)}...`);let{dir:B,cleanup:V}=await LO();try{W.message("Copying files..."),MG(G);let q=a6(G,".agents","oma-config.yaml"),O=a6(G,".agents","mcp.json"),L=!$&&r9(q)?nZ(q):null,F=!$&&r9(O)?nZ(O):null,N=a6(RH$(),`oma-stack-backup-${Date.now()}`),A=a6(G,".agents","skills","oma-backend","stack"),I=!$&&r9(A);if(I)Ez(N,{recursive:!0}),BI(A,a6(N,"oma-backend"),{recursive:!0});let D=["snippets.md","tech-stack.md","api-template.py"],j=a6(G,".agents","skills","oma-backend","resources"),T=!$&&!I&&D.some((d)=>r9(a6(j,d)));if(BI(a6(B,".agents"),a6(G,".agents"),{recursive:!0,force:!0}),L)h3(q,L);if(F)h3(O,F);if(I)try{Ez(A,{recursive:!0}),BI(a6(N,"oma-backend"),A,{recursive:!0,force:!0})}finally{jg(N,{recursive:!0,force:!0})}if(T){let d=a6(B,".agents","skills","oma-backend","variants","python");if(r9(d))Ez(A,{recursive:!0}),BI(d,A,{recursive:!0,force:!0}),h3(a6(A,"stack.yaml"),`language: python
1376
1376
  framework: fastapi
1377
1377
  orm: sqlalchemy
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-agent",
3
- "version": "5.18.1",
3
+ "version": "5.18.2",
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": {