oh-my-agent 7.18.1 → 7.19.0

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 +1 -1
  2. package/package.json +1 -1
package/bin/cli.js CHANGED
@@ -1620,7 +1620,7 @@ spawn_error:${Z.message}`})})})}async function nK2($,z,G={}){let J=G.host??"gith
1620
1620
  spawn_error:${Q.message}`})})})}async function dK2($,z,G={}){let J=performance.now(),U=["--dump-json","--no-warnings","--skip-download"];if(G.format)U.push("-f",G.format);if(G.subtitles){if(U.push("--write-sub","--write-auto-sub","--sub-format","vtt"),G.subLangs?.length)U.push("--sub-lang",G.subLangs.join(","))}U.push($.toString());let{code:K,stdout:X,stderr:Q}=await yU5(U,z),Z=Math.round(performance.now()-J);if(K===null||K!==0){let Y=Q.trim();if(/executable not found|ENOENT/i.test(Y))return{url:$.toString(),status:"error",strategy:"api",platform:"media",content:"",elapsedMs:Z,signals:[],error:"yt-dlp not installed. Install via `pip install yt-dlp` or `brew install yt-dlp`."};return{url:$.toString(),status:"error",strategy:"api",platform:"media",content:X,elapsedMs:Z,signals:[],error:Y||`yt-dlp exited with code ${K}`}}return{url:$.toString(),status:"ok",strategy:"api",platform:"media",content:X.trim(),contentType:"application/json",elapsedMs:Z,signals:[]}}Y8();var Hu=/<meta\s+([^>]+)>/gi,Bu=/(\w[\w-]*)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+))/g,tx=/<script[^>]+type=["']application\/ld\+json["'][^>]*>([\s\S]*?)<\/script>/gi,hU5=/<title[^>]*>([\s\S]*?)<\/title>/i,ex=/<link\s+([^>]+)>/gi;function pK2($){let z={};Bu.lastIndex=0;let G=Bu.exec($);while(G!==null){let J=G[1]?.toLowerCase();if(!J){G=Bu.exec($);continue}z[J]=G[2]??G[3]??G[4]??"",G=Bu.exec($)}return z}function Au($){let z={},G=[],J=[],U;Hu.lastIndex=0;let K=Hu.exec($);while(K!==null){let j=K[1];if(!j){K=Hu.exec($);continue}let L=pK2(j),W=L.property??"",H=L.name??"",B=L.content??"";if(W.startsWith("og:"))z[W.slice(3)]=B;if(H==="description"&&!U)U=B;if(H==="twitter:description"&&!U)U=B;K=Hu.exec($)}ex.lastIndex=0;let X=ex.exec($);while(X!==null){let j=X[1];if(j){let L=pK2(j);if(L.rel==="alternate"&&L.type&&(L.type.includes("rss")||L.type.includes("atom")))G.push({type:L.type,href:L.href??"",title:L.title})}X=ex.exec($)}tx.lastIndex=0;let Q=tx.exec($);while(Q!==null){let j=Q[1];if(j)try{J.push(JSON.parse(j))}catch{}Q=tx.exec($)}let Y=hU5.exec($)?.[1]?.trim(),k={};if(Object.keys(z).length>0)k.ogp=z;if(J.length>0)k.jsonLd=J;if(U)k.description=U;if(Y)k.title=Y;if(G.length>0)k.alternate=G;return k}async function aK2($,z){try{let G=await d1($.toString(),{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal}),J=Au(G.text);return{url:$.toString(),status:G.ok?"ok":"error",strategy:"probe",platform:"metadata",httpStatus:G.status,content:G.text,contentType:G.headers.get("content-type")??void 0,elapsedMs:G.elapsedMs,signals:[],metadata:J}}catch(G){return{url:$.toString(),status:"error",strategy:"probe",platform:"metadata",content:"",elapsedMs:0,signals:[],error:G instanceof Error?G.message:String(G)}}}l$();uj();Y8();l$();D3();var xU5=["archive.ph","archive.is","archive.md","archive.vn","archive.li"];function iU5($){return`https://${$.hostname.replace(/\./g,"-")}.cdn.ampproject.org/c/s/${$.hostname}${$.pathname}${$.search}`}async function gU5($,z){try{let G=iU5($),J=await d1(G,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!J.ok||J.text.length<200)return null;let U=k7(J);return{url:$.toString(),status:w6(J,U),strategy:"archive",provenance:"amp",platform:"amp",httpStatus:J.status,content:J.text,contentType:J.headers.get("content-type")??void 0,elapsedMs:J.elapsedMs,signals:U}}catch{return null}}async function mU5($,z){for(let G of xU5){if(z.signal?.aborted)break;try{let J=`https://${G}/newest/${$.toString()}`,U=await d1(J,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!U.ok||U.text.length<200)continue;let K=k7(U);return{url:$.toString(),status:w6(U,K),strategy:"archive",provenance:"archive-today",platform:G,httpStatus:U.status,content:U.text,contentType:U.headers.get("content-type")??void 0,elapsedMs:U.elapsedMs,signals:K}}catch{}}return null}async function fU5($,z){try{let G=await d1(`https://archive.org/wayback/available?url=${encodeURIComponent($.toString())}`,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!G.ok)return null;let U=JSON.parse(G.text).archived_snapshots?.closest;if(!U?.available||!U.url)return null;let K=await d1(U.url,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!K.ok||K.text.length<200)return null;let X=k7(K);return{url:$.toString(),status:w6(K,X),strategy:"archive",provenance:"wayback",platform:"wayback",httpStatus:K.status,content:K.text,contentType:K.headers.get("content-type")??void 0,elapsedMs:K.elapsedMs,signals:X}}catch{return null}}async function cj($,z){let G=[()=>gU5($,z),()=>mU5($,z),()=>fU5($,z)],J=performance.now();for(let U of G){if(z.signal?.aborted)break;let K=await U();if(K)return K}return{...j1({url:$.toString(),strategy:"archive",error:Error("all archive sources exhausted")}),elapsedMs:Math.round(performance.now()-J)}}l$();D3();import{existsSync as XE2}from"node:fs";import{platform as jb5}from"node:os";var Wb5={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary","/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge","/Applications/Brave Browser.app/Contents/MacOS/Brave Browser","/Applications/Chromium.app/Contents/MacOS/Chromium"],linux:["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/chromium","/usr/bin/chromium-browser","/usr/bin/microsoft-edge","/usr/bin/brave-browser"],win32:["C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe","C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe","C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe"]};function Bd(){if(process.env.OMA_CHROME_PATH&&XE2(process.env.OMA_CHROME_PATH))return process.env.OMA_CHROME_PATH;let $=Wb5[jb5()]??[];for(let z of $)if(XE2(z))return z;return null}async function Lb5(){try{let $=await Promise.resolve().then(() => (KE2(),UE2));return $.default??$}catch{return null}}async function QE2($,z,G={}){let J=await Lb5();if(!J)return j1({url:$.toString(),strategy:"browser",error:Error("puppeteer-core not installed. Run: bun add puppeteer-core")});let U=Bd();if(!U)return j1({url:$.toString(),strategy:"browser",error:Error("Chrome/Chromium not found. Install a Chromium-based browser or set OMA_CHROME_PATH.")});let K=performance.now(),X=await J.launch({executablePath:U,headless:"new",args:["--disable-blink-features=AutomationControlled","--disable-dev-shm-usage","--no-sandbox"]});try{let Q=await X.newPage();if(await Q.setViewport({width:1280,height:900}),await Q.setExtraHTTPHeaders({"Accept-Language":z.locale}),z.userAgent)await Q.setUserAgent(z.userAgent);let Z=[];if(G.captureNetwork)Q.on("response",(A)=>{let V=A.url(),F=A.headers(),N=F["content-type"]??"";if(!V.startsWith($.origin))return;if(!N.includes("json")&&!N.includes("xml"))return;let u=F["access-control-request-method"]??"GET";Z.push({url:V,status:A.status(),method:u,contentType:N})});let Y=await Q.goto($.toString(),{waitUntil:"networkidle2",timeout:z.timeoutMs});if(G.waitSelector)await Q.waitForFunction(`document.querySelector(${JSON.stringify(G.waitSelector)}) !== null`,{timeout:z.timeoutMs});else if(G.waitMs&&G.waitMs>0)await new Promise((A)=>setTimeout(A,G.waitMs));let k=await Q.content(),j=Y?.status()??0,L=new Headers;if(Y)for(let[A,V]of Object.entries(Y.headers()))try{L.set(A,V)}catch{}let W={ok:j>=200&&j<400,status:j,headers:L,url:$.toString(),text:k,elapsedMs:Math.round(performance.now()-K),redirected:!1},H=k7(W),B=Math.round(performance.now()-K);return{url:$.toString(),status:C02(H)?"blocked":k.length<200?"error":"ok",strategy:"browser",httpStatus:j,content:k,contentType:L.get("content-type")??"text/html",elapsedMs:B,signals:H,hiddenApis:G.captureNetwork?Z:void 0}}catch(Q){let Z=Math.round(performance.now()-K);return{...j1({url:$.toString(),strategy:"browser",error:Q}),elapsedMs:Z}}finally{await X.close()}}Dy();Y8();l$();D3();var ZE2="https://r.jina.ai/";function Hb5($){let z=`${$.protocol}//${$.hostname}`,G=$.hostname.startsWith("m.")?$.hostname:`m.${$.hostname.replace(/^www\./,"")}`,J=new URL($.toString());return J.hostname=G,[{label:"jina",url:`${ZE2}${$.toString()}`,headers:aG({accept:"text/plain"})},{label:"jina-json",url:`${ZE2}${$.toString()}`,headers:aG({accept:"application/json"})},{label:"curl-desktop",url:$.toString(),headers:aG({userAgent:Z8.desktopFirefox,referer:z})},{label:"curl-mobile",url:J.toString(),headers:aG({userAgent:Z8.mobileSafari,referer:z})},{label:"curl-googlebot",url:$.toString(),headers:aG({userAgent:Z8.googlebot})}]}function Bb5($,z){if(!$.startsWith("jina"))return z;return z}async function YE2($,z){let G=Hb5($),J=new AbortController;if(z.signal)if(z.signal.aborted)J.abort(z.signal.reason);else z.signal.addEventListener("abort",()=>J.abort(z.signal?.reason));let U=performance.now(),K={},X=null,Q=G.map(async(Z)=>{let Y=await d1(Z.url,{headers:Z.headers,timeoutMs:z.timeoutMs,signal:J.signal,locale:z.locale}),k=k7(Y);if(Z.label.startsWith("jina")){let j=b02(Y);if(j)throw X=j,Error(`jina-quota:${j.detail}`)}if(!Ab5(Y,k))throw K[Z.label]=`status=${Y.status} size=${Y.text.length}`,Error(`weak-response:${Z.label}`);return{label:Z.label,resp:Y,signals:k}});try{let Z=await Promise.any(Q);J.abort();let Y=Math.round(performance.now()-U);return{url:$.toString(),status:w6(Z.resp,Z.signals),strategy:"probe",platform:Z.label,httpStatus:Z.resp.status,content:Bb5(Z.label,Z.resp.text),contentType:Z.resp.headers.get("content-type")??void 0,elapsedMs:Y,signals:X?[...Z.signals,X]:Z.signals}}catch(Z){let Y=Math.round(performance.now()-U),k=Object.entries(K).map(([j,L])=>`${j}:${L}`).join(" ");if(X)return{...j1({url:$.toString(),error:Error(`probe failed — ${k}`),strategy:"probe"}),elapsedMs:Y,signals:[X]};return{...j1({url:$.toString(),error:Z instanceof AggregateError?Error(k):Z,strategy:"probe"}),elapsedMs:Y}}}function Ab5($,z){if(!$.ok)return!1;if($.text.length<200)return!1;if(z.some((G)=>G.kind==="waf-body"||G.kind==="challenge-body"||G.kind==="js-essential"||G.kind==="http-status"))return!1;return!0}var Vb5=["api","probe","impersonate","browser","archive"];function Fb5($){if($.only?.length)return $.only;let z=Vb5.slice();if(!$.includeArchive)z=z.filter((G)=>G!=="archive");if($.skip?.length)z=z.filter((G)=>!$.skip?.includes(G));return z}async function kE2($,z,G){switch($){case"api":return await sF(z,G)??null;case"probe":return YE2(z,G);case"impersonate":return rF(z,G);case"browser":return QE2(z,G);case"archive":return cj(z,G)}}function Ad($){if($.status==="ok")return!0;if($.status==="auth-required"&&S02($.signals))return!0;return!1}function Nb5($){return $.status==="auth-required"||$.status==="invalid-input"||$.status==="not-found"}async function ub5($){let z=Math.floor(Math.random()*500);await new Promise((G)=>setTimeout(G,$+z))}function Ob5($){let z=$.find((U)=>U.kind==="rate-limit");if(!z)return 1500;let G=z.detail.match(/retry-after=(\d+)/);if(!G?.[1])return 1500;let J=Number.parseInt(G[1],10);if(Number.isNaN(J)||J>10)return 1500;return J*1000}async function jE2($,z,G={}){let J=Fb5(G),U=[],K=new Set,X=null,Q=!1;for(let Z of J){if(z.signal?.aborted)break;if(Q&&Z==="impersonate")continue;let Y=await kE2(Z,$,z);if(!Y)continue;if(U.push({strategy:Z,platform:Y.platform,status:Y.status,httpStatus:Y.httpStatus,elapsedMs:Y.elapsedMs,signals:Y.signals,error:Y.error}),Y.signals.some((k)=>k.kind==="js-essential"))Q=!0;if(Ad(Y))return Y.attempts=U,Y;if(Nb5(Y))return Y.attempts=U,Y;if(G.retryOnRateLimit!==!1&&y02(Y.signals)&&!K.has(Z)){K.add(Z),await ub5(Ob5(Y.signals));let k=await kE2(Z,$,z);if(k){if(U.push({strategy:Z,platform:k.platform,status:k.status,httpStatus:k.httpStatus,elapsedMs:k.elapsedMs,signals:k.signals,error:k.error}),Ad(k))return k.attempts=U,k;X=k;continue}}X=Y}if(!J.includes("archive")&&G.includeArchive!==!1){let Z=await cj($,z);if(U.push({strategy:"archive",platform:Z.platform,status:Z.status,httpStatus:Z.httpStatus,elapsedMs:Z.elapsedMs,signals:Z.signals,error:Z.error}),Ad(Z))return Z.attempts=U,Z;X=Z}if(X)return X.attempts=U,X;return{url:$.toString(),status:"error",strategy:J[0]??"probe",content:"",elapsedMs:0,signals:[],attempts:U,error:"all strategies failed"}}Y8();var sE2=p2(oE2(),1);var nC5=["/rss","/feed","/atom.xml","/rss.xml","/index.xml"],dC5=new sE2.XMLParser({ignoreAttributes:!1,attributeNamePrefix:"@_",textNodeName:"#text"});function Dd($){if($===void 0||$===null)return[];return Array.isArray($)?$:[$]}function P3($){if($==null)return;if(typeof $==="string")return $;if(typeof $==="object"){let z=$;if(typeof z["#text"]==="string")return z["#text"];if(typeof z["#cdata"]==="string")return z["#cdata"]}return}function rE2($){for(let z of Dd($)){let G=z?.["@_href"],J=z?.["@_rel"];if(typeof G==="string"&&(J===void 0||J==="alternate"))return G}return}function tE2($){let z;try{z=dC5.parse($)}catch{return null}let G=z.rss;if(G){let U=G.channel;if(!U)return null;let K=Dd(U.item);return{kind:"rss",title:P3(U.title),description:P3(U.description),link:P3(U.link),entries:K.map((X)=>({title:P3(X.title),link:P3(X.link),pubDate:P3(X.pubDate),description:P3(X.description),content:P3(X["content:encoded"])??P3(X.content)}))}}let J=z.feed;if(J){let U=Dd(J.entry);return{kind:"atom",title:P3(J.title),description:P3(J.subtitle),link:rE2(J.link),entries:U.map((K)=>({title:P3(K.title),link:rE2(K.link),pubDate:P3(K.published)??P3(K.updated),description:P3(K.summary),content:P3(K.content)??P3(K.summary)}))}}return null}async function eE2($,z){let G=performance.now(),J;try{let K=await d1($.toString(),{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(K.ok)J=Au(K.text).alternate?.[0]?.href}catch{}let U=new Set;if(J)try{U.add(new URL(J,$).toString())}catch{}for(let K of nC5)U.add(new URL(K,`${$.protocol}//${$.host}`).toString());for(let K of U){if(z.signal?.aborted)break;try{let X=await d1(K,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!X.ok||X.text.length<50)continue;let Q=tE2(X.text);if(!Q||Q.entries.length===0)continue;return{url:$.toString(),status:"ok",strategy:"probe",platform:"rss",httpStatus:X.status,content:X.text,contentType:X.headers.get("content-type")??void 0,elapsedMs:Math.round(performance.now()-G),signals:[],feedUrl:K,feed:Q}}catch{}}return{url:$.toString(),status:"not-found",strategy:"probe",platform:"rss",content:"",elapsedMs:Math.round(performance.now()-G),signals:[],error:"no RSS/Atom feed discovered"}}function $R2($,z="en-US"){let[G,J]=z.split("-"),U=new URL("https://news.google.com/rss/search");return U.searchParams.set("q",$),U.searchParams.set("hl",G??"en"),U.searchParams.set("gl",J??"US"),U.searchParams.set("ceid",`${J??"US"}:${G??"en"}`),U.toString()}uj();Y8();var nM={"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 pC5($){return $.replace(/^www\./,"")}function aC5($){if($ in nM){let G=nM[$];return G?{...G}:null}let z=pC5($);if(z in nM){let G=nM[z];return G?{...G}:null}return null}function oC5($){let z=$.split(".").pop();if(z==="gov"||z==="edu"||z==="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 rC5($){try{let z=await d1(`https://tranco-list.eu/api/ranks/domain/${$}`,{timeoutMs:5000});if(!z.ok)return null;let J=JSON.parse(z.text).ranks?.[0]?.rank;if(!J)return null;let U=J<1e4?0.6:J<1e5?0.4:0.2;return{domain:$,level:J<1e4?"community":"external",score:U,tags:["tranco"],source:"tranco",rank:J}}catch{return null}}async function zR2($){let z=aC5($);if(z)return z;let G=oC5($);if(G)return G;let J=await rC5($);if(J)return J;return{domain:$,level:"unknown",score:null,tags:[],source:"heuristic"}}var GR2=["api","probe","impersonate","browser","archive"];function JR2($){if(!$)return;let z=$.split(",").map((J)=>J.trim()).filter(Boolean),G=z.filter((J)=>!GR2.includes(J));if(G.length>0)throw Error(`Unknown strategy: ${G.join(", ")}. Valid: ${GR2.join(", ")}`);return z}function nZ($){try{return new URL($)}catch{throw Error(`Invalid URL: ${$}`)}}function oz($){return{timeoutMs:$.timeout?Math.max(1000,Math.floor(Number($.timeout)*1000)):15000,locale:$.locale??"en-US,en;q=0.9"}}function d0($,z){if(z)console.log(JSON.stringify($,null,2));else console.log(JSON.stringify($))}function kU($){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 UR2($){let z=$.command("search").description("Mechanical search primitives — fetch, meta, rss, media, trust, code").alias("s");z.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(G,J)=>{try{let U=nZ(G),K=oz(J),X=await jE2(U,K,{only:JR2(J.only),skip:JR2(J.skip),includeArchive:J.includeArchive});d0(X,Boolean(J.pretty)),kU(X)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.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(G,J)=>{try{let U=nZ(G);if(!Ty(U)){console.error(S8.default.yellow(`No API handler matches host ${U.hostname}`)),process.exitCode=3;return}let X=oz(J),Q=await sF(U,X);if(!Q){process.exitCode=3;return}d0(Q,Boolean(J.pretty)),kU(Q)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.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(G,J)=>{let U=oz(J),K=J.platforms?J.platforms.split(",").map((Q)=>Q.trim()).filter(Boolean):void 0,X=await c$(G,U,K);d0(X,Boolean(J.pretty))}),z.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(G,J)=>{try{let U=nZ(G),K=oz(J),X=await aK2(U,K),{content:Q,...Z}=X;d0(Z,Boolean(J.pretty)),kU(X)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.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(G,J)=>{try{let U=nZ(G),K=oz(J),X=await eE2(U,K),{content:Q,...Z}=X;d0(Z,Boolean(J.pretty)),kU(X)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.command("rss:google <query>").description("Build Google News RSS URL for a query").option("--locale <value>","Locale (e.g., ko-KR)","en-US").action((G,J)=>{let U=$R2(G,J.locale??"en-US");console.log(U)}),z.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(G,J)=>{try{let U=nZ(G),K=oz(J),X=J.subLang?J.subLang.split(",").map((Z)=>Z.trim()).filter(Boolean):void 0,Q=await dK2(U,K,{subtitles:J.subs,...X?{subLangs:X}:{},...J.format?{format:J.format}:{}});d0(Q,Boolean(J.pretty)),kU(Q)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.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(G,J)=>{try{let U=nZ(G),K=oz(J),X=await cj(U,K);d0(X,Boolean(J.pretty)),kU(X)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.command("trust <domain>").description("Resolve trust level / score for a domain").option("--pretty","Pretty-print JSON").action(async(G,J)=>{let U=await zR2(G.toLowerCase());d0(U,Boolean(J.pretty))}),z.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(G,J)=>{let U=J.host==="gitlab"||J.host==="github"?J.host:"github",K=oz({}),X=await nK2(G,K,{host:U,...J.language?{language:J.language}:{},...J.repo?{repo:J.repo}:{},...J.limit?{limit:Number.parseInt(J.limit,10)}:{}});d0(X,Boolean(J.pretty)),kU(X)}),z.command("doctor").description("Check dependencies (Chrome, python3 curl_cffi, yt-dlp, gh)").action(async()=>{let G=[],J=Bd();G.push({name:"chrome",ok:Boolean(J),detail:J??"Install Chrome or set OMA_CHROME_PATH"}),G.push(await Md("python3",["--version"])),G.push(await sC5()),G.push(await Md("yt-dlp",["--version"])),G.push(await Md("gh",["--version"]));for(let U of G){let K=U.ok?S8.default.green("✓"):S8.default.yellow("!");console.log(`${K} ${U.name}: ${U.detail}`)}if(G.some((U)=>!U.ok))process.exitCode=1})}async function Md($,z){return new Promise((G)=>{let{spawn:J}=X2("node:child_process"),U=J($,z,{stdio:["ignore","pipe","pipe"]}),K="";U.stdout?.on("data",(X)=>{K+=X.toString()}),U.on("error",()=>G({name:$,ok:!1,detail:"not found"})),U.on("close",(X)=>{if(X===0)G({name:$,ok:!0,detail:K.trim()});else G({name:$,ok:!1,detail:`exit code ${X}`})})})}async function sC5(){return new Promise(($)=>{let{spawn:z}=X2("node:child_process"),G=z("python3",["-c","import curl_cffi; print(curl_cffi.__version__)"],{stdio:["ignore","pipe","pipe"]}),J="";G.stdout?.on("data",(U)=>{J+=U.toString()}),G.on("error",()=>$({name:"curl_cffi",ok:!1,detail:"python3 not found"})),G.on("close",(U)=>{if(U===0)$({name:"curl_cffi",ok:!0,detail:`v${J.trim()}`});else $({name:"curl_cffi",ok:!1,detail:"not installed (pip install curl_cffi)"})})})}K7();var rz=p2(I4(),1);import{execSync as tC5,spawnSync as KR2}from"node:child_process";import{platform as eC5}from"node:os";function $_5(){let $=eC5();if($==="darwin")return"brew install gh";if($==="win32")return"winget install GitHub.cli";return"sudo apt install gh"}async function XR2(){if(console.clear(),d4(rz.default.bgMagenta(rz.default.white(" ⭐ oh-my-agent star "))),!MG()){let z=$_5(),G=await F3({message:`GitHub CLI (gh) is not installed. Install with ${rz.default.cyan(z)}?`});if(k4(G)||!G){w5("Install gh manually and try again.");return}let J=I6();J.start("Installing GitHub CLI...");let U=KR2(z,{shell:!0,stdio:"pipe"});if(U.status!==0){J.stop("Installation failed"),$4.error(U.stderr?.toString()||"Unknown error"),w5("Please install gh manually.");return}J.stop("GitHub CLI installed!")}if(!J8()){$4.warn("GitHub CLI is not authenticated.");let z=await F3({message:`Run ${rz.default.cyan("gh auth login")} now?`});if(k4(z)||!z){w5("Authenticate and try again.");return}if(KR2("gh",["auth","login"],{stdio:"inherit"}),!J8()){w5("Authentication was not completed. Try again.");return}$4.success("Authenticated!")}if(IG()){w5(`Already starred ${rz.default.cyan(K1)}! Thank you! \uD83D\uDE4F`);return}let $=await F3({message:`Star ${rz.default.cyan(K1)} on GitHub?`});if(k4($)||!$){w5("Maybe next time!");return}try{tC5(`gh api -X PUT /user/starred/${K1}`,{stdio:"ignore"}),w5(`Starred ${rz.default.cyan(K1)}! Thank you! \uD83C\uDF1F`)}catch{$4.error("Failed to star the repository."),w5("Please try again later.")}}function QR2($){$.command("star").description("Star oh-my-agent on GitHub").action(k5(async()=>{await XR2()}))}K7();px();kk();var w3=p2(I4(),1);import{existsSync as UH,mkdirSync as z_5,readdirSync as G_5,readFileSync as ZR2,writeFileSync as jR2}from"node:fs";import{dirname as J_5,join as Id}from"node:path";function U_5($){let z=ne($),G={},J=0,U=0;for(let K of z){J+=K.tokens;let X=ce(K.tokens,K.vendor);U+=X;let Q=G[K.vendor]??{tokens:0,spawns:0,usd:0};Q.tokens+=K.tokens,Q.spawns+=1,Q.usd+=X,G[K.vendor]=Q}return{totalTokens:J,totalSpawns:z.length,estimatedUsd:U,byVendor:G}}function YR2($){return $.toLocaleString("en-US")}function kR2($){if($===0)return"$0.00";if($<0.01)return"<$0.01";return`$${$.toFixed(2)}`}function Td($){return Id($,".agents","state","metrics.json")}function K_5($){return Id($,".serena","metrics.json")}function dM(){return{sessions:0,skillsUsed:{},tasksCompleted:0,totalSessionTime:0,filesChanged:0,linesAdded:0,linesRemoved:0,lastUpdated:new Date().toISOString(),startDate:new Date().toISOString()}}function X_5($){let z=Td($);if(UH(z))try{return JSON.parse(ZR2(z,"utf-8"))}catch{return dM()}let G=K_5($);if(UH(G))try{return JSON.parse(ZR2(G,"utf-8"))}catch{return dM()}return dM()}function Q_5($,z){let G=Td($),J=J_5(G);if(!UH(J))z_5(J,{recursive:!0});z.lastUpdated=new Date().toISOString(),jR2(G,JSON.stringify(z,null,2),"utf-8")}function Z_5($){let z=Id($,".serena","memories"),G={};if(!UH(z))return G;try{let J=G_5(z);for(let U of J){let K=U.match(/(?:progress|result)-(\w+)/);if(K?.[1]){let X=K[1];G[X]=(G[X]||0)+1}}}catch{}return G}async function WR2($=!1,z=!1){let G=process.cwd(),J=Td(G);if(z){if(UH(J))jR2(J,JSON.stringify(dM(),null,2),"utf-8");if($)console.log(JSON.stringify({reset:!0}));else console.log(w3.default.green("✅ Metrics reset successfully."));return}let U=X_5(G),K=Zu(G),X=Z_5(G),Q=qe(G),Z=GV(G),Y=Z.startedAt?new Date(Z.startedAt):null,k=Y&&!Number.isNaN(Y.getTime())?Math.max(0,Math.floor((Date.now()-Y.getTime())/1000)):0;for(let[A,V]of Object.entries(X))U.skillsUsed[A]=(U.skillsUsed[A]||0)+V;if(Q>U.tasksCompleted)U.tasksCompleted=Q;if(Z.id){if(["completed","failed","aborted"].includes(Z.status||"")&&(U.lastSessionId!==Z.id||U.lastSessionStatus!==Z.status)&&k>0)U.totalSessionTime+=k;U.lastSessionId=Z.id,U.lastSessionStatus=Z.status,U.lastSessionStarted=Z.startedAt,U.lastSessionDuration=k}U.filesChanged+=K.filesChanged,U.linesAdded+=K.linesAdded,U.linesRemoved+=K.linesRemoved,U.sessions+=1,Q_5(G,U);let j=Math.max(1,Math.ceil((Date.now()-new Date(U.startDate).getTime())/86400000)),L=U.sessions>0?Math.round(U.totalSessionTime/U.sessions):0,W=U_5(G);if($){console.log(JSON.stringify({...U,gitStats:K,daysSinceStart:j,avgSessionTime:L,cost:W},null,2));return}console.clear(),d4(w3.default.bgMagenta(w3.default.white(" \uD83D\uDCCA oh-my-agent stats ")));let H=[w3.default.bold(`\uD83D\uDCC8 Productivity Metrics (${j} days)`),"┌─────────────────────┬──────────────┐",`│ ${w3.default.bold("Metric")} │ ${w3.default.bold("Value")} │`,"├─────────────────────┼──────────────┤",`│ Sessions │ ${String(U.sessions).padEnd(12)} │`,`│ Tasks Completed │ ${String(U.tasksCompleted).padEnd(12)} │`,`│ Files Changed │ ${String(U.filesChanged).padEnd(12)} │`,`│ Lines Added │ ${w3.default.green(`+${U.linesAdded}`).padEnd(12)} │`,`│ Lines Removed │ ${w3.default.red(`-${U.linesRemoved}`).padEnd(12)} │`,"└─────────────────────┴──────────────┘"].join(`
1621
1621
  `);if(G5(H,"Overview"),W.totalSpawns>0){let A=Object.entries(W.byVendor).sort(([,F],[,N])=>N.tokens-F.tokens).map(([F,N])=>` ${F.padEnd(12)} ${YR2(N.tokens).padStart(12)} tokens · ${String(N.spawns).padStart(3)} spawns · ${kR2(N.usd).padStart(7)}`),V=[w3.default.bold("\uD83D\uDCB0 Cost Telemetry (all sessions)"),"┌─────────────────────┬──────────────┐",`│ ${w3.default.bold("Metric")} │ ${w3.default.bold("Value")} │`,"├─────────────────────┼──────────────┤",`│ Total tokens (est.) │ ${YR2(W.totalTokens).padEnd(12)} │`,`│ Total spawns │ ${String(W.totalSpawns).padEnd(12)} │`,`│ Estimated USD │ ${kR2(W.estimatedUsd).padEnd(12)} │`,"└─────────────────────┴──────────────┘",w3.default.dim("By vendor (sorted by tokens):"),...A,w3.default.dim("Estimate is input-only (prompt char approximation); output tokens not yet tracked."),w3.default.dim("Configure session.quota_cap in .agents/oma-config.yaml to enforce budgets.")].join(`
1622
1622
  `);G5(V,"Cost")}let B=Object.entries(U.skillsUsed).sort(([,A],[,V])=>V-A).slice(0,5);if(B.length>0){let A=[w3.default.bold("\uD83C\uDFC6 Top Skills Used"),...B.map(([V,F],N)=>` ${N+1}. ${V} (${F})`)].join(`
1623
- `);G5(A,"Skills")}w5(w3.default.dim(`Data stored in: ${J}`))}function LR2($){$3($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(k5(async(z)=>{await WR2(l1(z),z.reset)},{supportsJsonOutput:!0}))}K7();var c4=p2(I4(),1);import{execSync as VR2}from"node:child_process";import{cpSync as oM,existsSync as x9,mkdirSync as XH,readFileSync as dZ,rmSync as Ed,writeFileSync as WU}from"node:fs";import{tmpdir as B_5}from"node:os";import{dirname as FR2,join as L3}from"node:path";var pM=p2(I4(),1);import{execSync as Y_5,spawn as k_5}from"node:child_process";import{realpathSync as HR2}from"node:fs";import KH from"node:process";var jU="oh-my-agent";function j_5($=KH.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(KH.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=Y9(HR2($))}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(KH.platform==="darwin")try{let G=Y_5(`brew --prefix ${jU}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(G){let J=Y9(HR2(G));if(z.startsWith(J))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${jU}`,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 ${jU}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(z.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${jU}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(z.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${jU}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${jU}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var BR2=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function W_5($,z){let G=$.match(BR2),J=z.match(BR2);if(!G||!J)return!1;for(let U=1;U<=3;U++){let K=Number(G[U]),X=Number(J[U]);if(K<X)return!0;if(K>X)return!1}return!1}async function L_5($=jU,z=2000){try{let G=await x$.get(`https://registry.npmjs.org/${$}/latest`,{timeout:z});return typeof G.data?.version==="string"?G.data.version:null}catch{return null}}async function AR2($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(KH.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(KH.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let z=await L_5();if(!z)return{triggered:!1,reason:"fetch-failed"};if(!W_5($.currentVersion,z))return{triggered:!1,reason:"up-to-date",latest:z};let G=j_5();if(!G.updateCommand)return $.onNotice?.(pM.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. ${G.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:z};try{return k_5(G.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(pM.default.cyan(`global oh-my-agent ${$.currentVersion} → ${z} updating in background. New version applies on next run.`)),{triggered:!0,latest:z}}catch{return $.onNotice?.(pM.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. Run: ${G.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:z}}}var aM={name:"oh-my-agent",version:"7.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","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 --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.1.0",eld:"^2.0.3","fast-xml-parser":"^4",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"},devDependencies:{"@biomejs/biome":"2.4.5","@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"]}};function A_5($){if(!$)return{intro:(G)=>d4(G),outro:(G)=>w5(G),note:(G,J)=>G5(G,J),logError:(G)=>$4.error(G),spinnerStart:(G)=>{let J=I6();return J.start(G),J}};let z={start(G){},stop(G){if(G)console.log(G)},message(G){console.log(G)}};return{intro:(G)=>console.log(G),outro:(G)=>console.log(G),note:(G,J)=>console.log(G),logError:(G)=>console.error(G),spinnerStart:(G)=>{return console.log(G),z}}}function V_5($,z){if($!==null)return"ready";return z?"legacy":"missing"}async function Rd($=!1,z=!1){if(!z&&process.stdout.isTTY)console.clear();let G=A_5(z);G.intro(c4.default.bgMagenta(c4.default.white(" \uD83D\uDEF8 oh-my-agent update ")));let J=process.cwd();await AR2({currentVersion:aM.version,enabled:P82(J),onSpawnStart:(k)=>G.note(k,"CLI auto-update"),onNotice:(k)=>G.note(k,"CLI update available")});let U=await PF(J),K=u82(J),X=V_5(U,K);if(X==="missing"){if(G.logError("oh-my-agent is not installed in this project. Run `oma install` first."),z)throw Error("oh-my-agent is not installed in this project. Run `oma install` first.");process.exit(1)}let Q=dG(J);if(Q.length>0)G.note(Q.map((k)=>`${c4.default.green("✓")} ${k}`).join(`
1623
+ `);G5(A,"Skills")}w5(w3.default.dim(`Data stored in: ${J}`))}function LR2($){$3($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(k5(async(z)=>{await WR2(l1(z),z.reset)},{supportsJsonOutput:!0}))}K7();var c4=p2(I4(),1);import{execSync as VR2}from"node:child_process";import{cpSync as oM,existsSync as x9,mkdirSync as XH,readFileSync as dZ,rmSync as Ed,writeFileSync as WU}from"node:fs";import{tmpdir as B_5}from"node:os";import{dirname as FR2,join as L3}from"node:path";var pM=p2(I4(),1);import{execSync as Y_5,spawn as k_5}from"node:child_process";import{realpathSync as HR2}from"node:fs";import KH from"node:process";var jU="oh-my-agent";function j_5($=KH.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(KH.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=Y9(HR2($))}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(KH.platform==="darwin")try{let G=Y_5(`brew --prefix ${jU}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(G){let J=Y9(HR2(G));if(z.startsWith(J))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${jU}`,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 ${jU}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(z.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${jU}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(z.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${jU}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${jU}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var BR2=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function W_5($,z){let G=$.match(BR2),J=z.match(BR2);if(!G||!J)return!1;for(let U=1;U<=3;U++){let K=Number(G[U]),X=Number(J[U]);if(K<X)return!0;if(K>X)return!1}return!1}async function L_5($=jU,z=2000){try{let G=await x$.get(`https://registry.npmjs.org/${$}/latest`,{timeout:z});return typeof G.data?.version==="string"?G.data.version:null}catch{return null}}async function AR2($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(KH.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(KH.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let z=await L_5();if(!z)return{triggered:!1,reason:"fetch-failed"};if(!W_5($.currentVersion,z))return{triggered:!1,reason:"up-to-date",latest:z};let G=j_5();if(!G.updateCommand)return $.onNotice?.(pM.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. ${G.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:z};try{return k_5(G.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(pM.default.cyan(`global oh-my-agent ${$.currentVersion} → ${z} updating in background. New version applies on next run.`)),{triggered:!0,latest:z}}catch{return $.onNotice?.(pM.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. Run: ${G.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:z}}}var aM={name:"oh-my-agent",version:"7.19.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 --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.1.0",eld:"^2.0.3","fast-xml-parser":"^4",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"},devDependencies:{"@biomejs/biome":"2.4.5","@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"]}};function A_5($){if(!$)return{intro:(G)=>d4(G),outro:(G)=>w5(G),note:(G,J)=>G5(G,J),logError:(G)=>$4.error(G),spinnerStart:(G)=>{let J=I6();return J.start(G),J}};let z={start(G){},stop(G){if(G)console.log(G)},message(G){console.log(G)}};return{intro:(G)=>console.log(G),outro:(G)=>console.log(G),note:(G,J)=>console.log(G),logError:(G)=>console.error(G),spinnerStart:(G)=>{return console.log(G),z}}}function V_5($,z){if($!==null)return"ready";return z?"legacy":"missing"}async function Rd($=!1,z=!1){if(!z&&process.stdout.isTTY)console.clear();let G=A_5(z);G.intro(c4.default.bgMagenta(c4.default.white(" \uD83D\uDEF8 oh-my-agent update ")));let J=process.cwd();await AR2({currentVersion:aM.version,enabled:P82(J),onSpawnStart:(k)=>G.note(k,"CLI auto-update"),onNotice:(k)=>G.note(k,"CLI update available")});let U=await PF(J),K=u82(J),X=V_5(U,K);if(X==="missing"){if(G.logError("oh-my-agent is not installed in this project. Run `oma install` first."),z)throw Error("oh-my-agent is not installed in this project. Run `oma install` first.");process.exit(1)}let Q=dG(J);if(Q.length>0)G.note(Q.map((k)=>`${c4.default.green("✓")} ${k}`).join(`
1624
1624
  `),"Migration");let Z=Q.length>0||Qy(J);if(Q.length>0&&!Qy(J))Zy(J,!0);if(!z)await CF(J);if(X==="legacy")G.note("Existing .agents installation detected without _version.json. Updating in place and restoring version metadata.","Legacy install");let Y;try{Y=G.spinnerStart("Checking for updates...");let k=await T82();if(U===k.version&&!Z){Y.stop(c4.default.green("Already up to date!")),G.outro(`Current version: ${c4.default.cyan(U)}`);return}let j=U===k.version;Y.message(`Downloading ${c4.default.cyan(k.version)}...`);let{dir:L,cleanup:W}=await rK();try{Y.message("Copying files..."),dG(J);let H=L3(J,".agents","oma-config.yaml"),B=L3(J,".agents","mcp.json"),A=!$&&x9(H)?dZ(H):null,V=!$&&x9(B)?dZ(B):null,F=L3(B_5(),`oma-stack-backup-${Date.now()}`),N=L3(J,".agents","skills","oma-backend","stack"),u=!$&&x9(N);if(u)XH(F,{recursive:!0}),oM(N,L3(F,"oma-backend"),{recursive:!0});let q=["snippets.md","tech-stack.md","api-template.py"],I=L3(J,".agents","skills","oma-backend","resources"),M=!$&&!u&&q.some((J2)=>x9(L3(I,J2))),D=Yy(J);if(oM(L3(L,".agents"),L3(J,".agents"),{recursive:!0,force:!0}),A)WU(H,A);if(V)WU(B,V);if(u)try{XH(N,{recursive:!0}),oM(L3(F,"oma-backend"),N,{recursive:!0,force:!0})}finally{Ed(F,{recursive:!0,force:!0})}if(M){let J2=L3(L,".agents","skills","oma-backend","variants","python");if(x9(J2))XH(N,{recursive:!0}),oM(J2,N,{recursive:!0,force:!0}),WU(L3(N,"stack.yaml"),`language: python
1625
1625
  framework: fastapi
1626
1626
  orm: sqlalchemy
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-agent",
3
- "version": "7.18.1",
3
+ "version": "7.19.0",
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": {