oh-my-agent 6.12.0 → 6.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +1 -1
- package/package.json +1 -1
package/bin/cli.js
CHANGED
|
@@ -1400,7 +1400,7 @@ print(json.dumps({
|
|
|
1400
1400
|
}))
|
|
1401
1401
|
`;function xH$(){return process.env.OMA_PYTHON??"python3"}function vH$($){if(SH$.some((J)=>$===J||$.endsWith(`.${J}`)))return["safari","chrome","firefox"];return["chrome","safari","firefox"]}async function bH$($,J,X){return new Promise((G)=>{let Q=CH$(xH$(),["-c",_H$],{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 kH$($,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 MO0($,J){let X=vH$($.hostname),G=[],Q=performance.now();for(let K of X){if(J.signal?.aborted)break;let U=performance.now(),W=await bH$($,K,J),H=Math.round(performance.now()-U);if(W.error==="curl_cffi_not_installed")return R6({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=kH$(W,$.toString(),H),B=k4(z);if(W40(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:J9(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{...R6({url:$.toString(),strategy:"impersonate",error:Error(Z?`impersonate_failed: ${Z}`:"impersonate_failed")}),elapsedMs:Y,signals:[]}}var AO0="https://r.jina.ai/";function yH$($){let J=`${$.protocol}//${$.hostname}`,X=$.hostname.startsWith("m.")?$.hostname:`m.${$.hostname.replace(/^www\./,"")}`,G=new URL($.toString());return G.hostname=X,[{label:"jina",url:`${AO0}${$.toString()}`,headers:p3({accept:"text/plain"})},{label:"jina-json",url:`${AO0}${$.toString()}`,headers:p3({accept:"application/json"})},{label:"curl-desktop",url:$.toString(),headers:p3({userAgent:P5.desktopFirefox,referer:J})},{label:"curl-mobile",url:G.toString(),headers:p3({userAgent:P5.mobileSafari,referer:J})},{label:"curl-googlebot",url:$.toString(),headers:p3({userAgent:P5.googlebot})}]}function fH$($,J){if(!$.startsWith("jina"))return J;return J}async function RO0($,J){let X=yH$($),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=k4(W);if(U.label.startsWith("jina")){let z=K40(W);if(z)throw Z=z,Error(`jina-quota:${z.detail}`)}if(!hH$(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:J9(U.resp,U.signals),strategy:"probe",platform:U.label,httpStatus:U.resp.status,content:fH$(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{...R6({url:$.toString(),error:Error(`probe failed — ${H}`),strategy:"probe"}),elapsedMs:W,signals:[Z]};return{...R6({url:$.toString(),error:U instanceof AggregateError?Error(H):U,strategy:"probe"}),elapsedMs:W}}}function hH$($,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 uH$=["api","probe","impersonate","browser","archive"];function gH$($){if($.only?.length)return $.only;let J=uH$.slice();if(!$.includeArchive)J=J.filter((X)=>X!=="archive");if($.skip?.length)J=J.filter((X)=>!$.skip?.includes(X));return J}async function IO0($,J,X){switch($){case"api":return await HF(J,X)??null;case"probe":return RO0(J,X);case"impersonate":return MO0(J,X);case"browser":return NO0(J,X);case"archive":return PW(J,X)}}function dg($){if($.status==="ok")return!0;if($.status==="auth-required"&&H40($.signals))return!0;return!1}function mH$($){return $.status==="auth-required"||$.status==="invalid-input"||$.status==="not-found"}async function cH$($){let J=Math.floor(Math.random()*500);await new Promise((X)=>setTimeout(X,$+J))}function pH$($){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 DO0($,J,X={}){let G=gH$(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 IO0(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(dg(W))return W.attempts=Q,W;if(mH$(W))return W.attempts=Q,W;if(X.retryOnRateLimit!==!1&&z40(W.signals)&&!Y.has(U)){Y.add(U),await cH$(pH$(W.signals));let H=await IO0(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}),dg(H))return H.attempts=Q,H;Z=H;continue}}Z=W}if(!G.includes("archive")&&X.includeArchive!==!1){let U=await PW($,J);if(Q.push({strategy:"archive",platform:U.platform,status:U.status,httpStatus:U.httpStatus,elapsedMs:U.elapsedMs,signals:U.signals,error:U.error}),dg(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 WL0=c0(KL0(),1);var qV$=["/rss","/feed","/atom.xml","/rss.xml","/index.xml"],BV$=new WL0.XMLParser({ignoreAttributes:!1,attributeNamePrefix:"@_",textNodeName:"#text"});function tg($){if($===void 0||$===null)return[];return Array.isArray($)?$:[$]}function Y4($){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 UL0($){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 HL0($){let J;try{J=BV$.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:Y4(Q.title),description:Y4(Q.description),link:Y4(Q.link),entries:Y.map((Z)=>({title:Y4(Z.title),link:Y4(Z.link),pubDate:Y4(Z.pubDate),description:Y4(Z.description),content:Y4(Z["content:encoded"])??Y4(Z.content)}))}}let G=J.feed;if(G){let Q=tg(G.entry);return{kind:"atom",title:Y4(G.title),description:Y4(G.subtitle),link:UL0(G.link),entries:Q.map((Y)=>({title:Y4(Y.title),link:UL0(Y.link),pubDate:Y4(Y.published)??Y4(Y.updated),description:Y4(Y.summary),content:Y4(Y.content)??Y4(Y.summary)}))}}return null}async function zL0($,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=WF(Y.text).alternate?.[0]?.href}catch{}let Q=new Set;if(G)try{Q.add(new URL(G,$).toString())}catch{}for(let Y of qV$)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=HL0(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 VL0($,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 yR={"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 OV$($){return $.replace(/^www\./,"")}function LV$($){if($ in yR){let X=yR[$];return X?{...X}:null}let J=OV$($);if(J in yR){let X=yR[J];return X?{...X}:null}return null}function FV$($){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 NV$($){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 qL0($){let J=LV$($);if(J)return J;let X=FV$($);if(X)return X;let G=await NV$($);if(G)return G;return{domain:$,level:"unknown",score:null,tags:[],source:"heuristic"}}var BL0=["api","probe","impersonate","browser","archive"];function OL0($){if(!$)return;let J=$.split(",").map((G)=>G.trim()).filter(Boolean),X=J.filter((G)=>!BL0.includes(G));if(X.length>0)throw Error(`Unknown strategy: ${X.join(", ")}. Valid: ${BL0.join(", ")}`);return J}function qK($){try{return new URL($)}catch{throw Error(`Invalid URL: ${$}`)}}function yX($){return{timeoutMs:$.timeout?Math.max(1000,Math.floor(Number($.timeout)*1000)):15000,locale:$.locale??"en-US,en;q=0.9"}}function n7($,J){if(J)console.log(JSON.stringify($,null,2));else console.log(JSON.stringify($))}function nG($){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 LL0($){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=qK(X),Y=yX(G),Z=await DO0(Q,Y,{only:OL0(G.only),skip:OL0(G.skip),includeArchive:G.includeArchive});n7(Z,Boolean(G.pretty)),nG(Z)}catch(Q){console.error(i5.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=qK(X);if(!pv(Q)){console.error(i5.default.yellow(`No API handler matches host ${Q.hostname}`)),process.exitCode=3;return}let Z=yX(G),K=await HF(Q,Z);if(!K){process.exitCode=3;return}n7(K,Boolean(G.pretty)),nG(K)}catch(Q){console.error(i5.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=yX(G),Y=G.platforms?G.platforms.split(",").map((K)=>K.trim()).filter(Boolean):void 0,Z=await _40(X,Q,Y);n7(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=qK(X),Y=yX(G),Z=await Z40(Q,Y),{content:K,...U}=Z;n7(U,Boolean(G.pretty)),nG(Z)}catch(Q){console.error(i5.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=qK(X),Y=yX(G),Z=await zL0(Q,Y),{content:K,...U}=Z;n7(U,Boolean(G.pretty)),nG(Z)}catch(Q){console.error(i5.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=VL0(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=qK(X),Y=yX(G),Z=G.subLang?G.subLang.split(",").map((U)=>U.trim()).filter(Boolean):void 0,K=await Q40(Q,Y,{subtitles:G.subs,...Z?{subLangs:Z}:{},...G.format?{format:G.format}:{}});n7(K,Boolean(G.pretty)),nG(K)}catch(Q){console.error(i5.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=qK(X),Y=yX(G),Z=await PW(Q,Y);n7(Z,Boolean(G.pretty)),nG(Z)}catch(Q){console.error(i5.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 qL0(X.toLowerCase());n7(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=yX({}),Z=await G40(X,Y,{host:Q,...G.language?{language:G.language}:{},...G.repo?{repo:G.repo}:{},...G.limit?{limit:Number.parseInt(G.limit,10)}:{}});n7(Z,Boolean(G.pretty)),nG(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 MV$()),X.push(await eg("yt-dlp",["--version"])),X.push(await eg("gh",["--version"]));for(let Q of X){let Y=Q.ok?i5.default.green("✓"):i5.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}=$0("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 MV$(){return new Promise(($)=>{let{spawn:J}=$0("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)"})})})}$8();var fX=c0(q1(),1);import{execSync as AV$,spawnSync as FL0}from"node:child_process";import{platform as RV$}from"node:os";function IV$(){let $=RV$();if($==="darwin")return"brew install gh";if($==="win32")return"winget install GitHub.cli";return"sudo apt install gh"}async function NL0(){if(console.clear(),j1(fX.default.bgMagenta(fX.default.white(" ⭐ oh-my-agent star "))),!V3()){let J=IV$(),X=await t6({message:`GitHub CLI (gh) is not installed. Install with ${fX.default.cyan(J)}?`});if(J1(X)||!X){N$("Install gh manually and try again.");return}let G=i8();G.start("Installing GitHub CLI...");let Q=FL0(J,{shell:!0,stdio:"pipe"});if(Q.status!==0){G.stop("Installation failed"),f$.error(Q.stderr?.toString()||"Unknown error"),N$("Please install gh manually.");return}G.stop("GitHub CLI installed!")}if(!A5()){f$.warn("GitHub CLI is not authenticated.");let J=await t6({message:`Run ${fX.default.cyan("gh auth login")} now?`});if(J1(J)||!J){N$("Authenticate and try again.");return}if(FL0("gh",["auth","login"],{stdio:"inherit"}),!A5()){N$("Authentication was not completed. Try again.");return}f$.success("Authenticated!")}if(q3()){N$(`Already starred ${fX.default.cyan(m1)}! Thank you! \uD83D\uDE4F`);return}let $=await t6({message:`Star ${fX.default.cyan(m1)} on GitHub?`});if(J1($)||!$){N$("Maybe next time!");return}try{AV$(`gh api -X PUT /user/starred/${m1}`,{stdio:"ignore"}),N$(`Starred ${fX.default.cyan(m1)}! Thank you! \uD83C\uDF1F`)}catch{f$.error("Failed to star the repository."),N$("Please try again later.")}}function ML0($){$.command("star").description("Star oh-my-agent on GitHub").action(W$(async()=>{await NL0()}))}$8();bv();wU();var $5=c0(q1(),1);import{existsSync as fR,mkdirSync as DV$,readdirSync as TV$,readFileSync as EV$,writeFileSync as AL0}from"node:fs";import{dirname as wV$,join as RL0}from"node:path";function Jm($){return RL0($,".serena","metrics.json")}function $m(){return{sessions:0,skillsUsed:{},tasksCompleted:0,totalSessionTime:0,filesChanged:0,linesAdded:0,linesRemoved:0,lastUpdated:new Date().toISOString(),startDate:new Date().toISOString()}}function PV$($){let J=Jm($);if(fR(J))try{return JSON.parse(EV$(J,"utf-8"))}catch{return $m()}return $m()}function jV$($,J){let X=Jm($),G=wV$(X);if(!fR(G))DV$(G,{recursive:!0});J.lastUpdated=new Date().toISOString(),AL0(X,JSON.stringify(J,null,2),"utf-8")}function CV$($){let J=RL0($,".serena","memories"),X={};if(!fR(J))return X;try{let G=TV$(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 IL0($=!1,J=!1){let X=process.cwd(),G=Jm(X);if(J){if(fR(G))AL0(G,JSON.stringify($m(),null,2),"utf-8");if($)console.log(JSON.stringify({reset:!0}));else console.log($5.default.green("✅ Metrics reset successfully."));return}let Q=PV$(X),Y=JF(X),Z=CV$(X),K=wi(X),U=xB(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,jV$(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(),j1($5.default.bgMagenta($5.default.white(" \uD83D\uDCCA oh-my-agent stats ")));let V=[$5.default.bold(`\uD83D\uDCC8 Productivity Metrics (${z} days)`),"┌─────────────────────┬──────────────┐",`│ ${$5.default.bold("Metric")} │ ${$5.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 │ ${$5.default.green(`+${Q.linesAdded}`).padEnd(12)} │`,`│ Lines Removed │ ${$5.default.red(`-${Q.linesRemoved}`).padEnd(12)} │`,"└─────────────────────┴──────────────┘"].join(`
|
|
1402
1402
|
`);i0(V,"Overview");let q=Object.entries(Q.skillsUsed).sort(([,O],[,L])=>L-O).slice(0,5);if(q.length>0){let O=[$5.default.bold("\uD83C\uDFC6 Top Skills Used"),...q.map(([L,F],N)=>` ${N+1}. ${L} (${F})`)].join(`
|
|
1403
|
-
`);i0(O,"Skills")}N$($5.default.dim(`Data stored in: ${G}`))}function DL0($){L6($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(W$(async(J)=>{await IL0(G6(J),J.reset)},{supportsJsonOutput:!0}))}$8();var D4=c0(q1(),1);import{execSync as yV$}from"node:child_process";import{cpSync as gR,existsSync as J5,mkdirSync as pz,readFileSync as BK,rmSync as Xm,writeFileSync as aG}from"node:fs";import{tmpdir as fV$}from"node:os";import{dirname as PL0,join as a6}from"node:path";var hR=c0(q1(),1);import{execSync as SV$,spawn as _V$}from"node:child_process";import{realpathSync as TL0}from"node:fs";import cz from"node:process";var oG="oh-my-agent";function xV$($=cz.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(cz.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=TL0($).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(cz.platform==="darwin")try{let X=SV$(`brew --prefix ${oG}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(X){let G=TL0(X).replace(/\\/g,"/");if(J.startsWith(G))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${oG}`,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 ${oG}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(J.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${oG}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(J.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${oG}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${oG}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var EL0=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function vV$($,J){let X=$.match(EL0),G=J.match(EL0);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 bV$($=oG,J=2000){try{let X=await TY.get(`https://registry.npmjs.org/${$}/latest`,{timeout:J});return typeof X.data?.version==="string"?X.data.version:null}catch{return null}}async function wL0($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(cz.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(cz.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let J=await bV$();if(!J)return{triggered:!1,reason:"fetch-failed"};if(!vV$($.currentVersion,J))return{triggered:!1,reason:"up-to-date",latest:J};let X=xV$();if(!X.updateCommand)return $.onNotice?.(hR.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. ${X.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:J};try{return _V$(X.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(hR.default.cyan(`global oh-my-agent ${$.currentVersion} → ${J} updating in background. New version applies on next run.`)),{triggered:!0,latest:J}}catch{return $.onNotice?.(hR.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. Run: ${X.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:J}}}var uR={name:"oh-my-agent",version:"6.12.
|
|
1403
|
+
`);i0(O,"Skills")}N$($5.default.dim(`Data stored in: ${G}`))}function DL0($){L6($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(W$(async(J)=>{await IL0(G6(J),J.reset)},{supportsJsonOutput:!0}))}$8();var D4=c0(q1(),1);import{execSync as yV$}from"node:child_process";import{cpSync as gR,existsSync as J5,mkdirSync as pz,readFileSync as BK,rmSync as Xm,writeFileSync as aG}from"node:fs";import{tmpdir as fV$}from"node:os";import{dirname as PL0,join as a6}from"node:path";var hR=c0(q1(),1);import{execSync as SV$,spawn as _V$}from"node:child_process";import{realpathSync as TL0}from"node:fs";import cz from"node:process";var oG="oh-my-agent";function xV$($=cz.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(cz.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=TL0($).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(cz.platform==="darwin")try{let X=SV$(`brew --prefix ${oG}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(X){let G=TL0(X).replace(/\\/g,"/");if(J.startsWith(G))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${oG}`,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 ${oG}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(J.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${oG}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(J.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${oG}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${oG}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var EL0=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function vV$($,J){let X=$.match(EL0),G=J.match(EL0);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 bV$($=oG,J=2000){try{let X=await TY.get(`https://registry.npmjs.org/${$}/latest`,{timeout:J});return typeof X.data?.version==="string"?X.data.version:null}catch{return null}}async function wL0($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(cz.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(cz.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let J=await bV$();if(!J)return{triggered:!1,reason:"fetch-failed"};if(!vV$($.currentVersion,J))return{triggered:!1,reason:"up-to-date",latest:J};let X=xV$();if(!X.updateCommand)return $.onNotice?.(hR.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. ${X.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:J};try{return _V$(X.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(hR.default.cyan(`global oh-my-agent ${$.currentVersion} → ${J} updating in background. New version applies on next run.`)),{triggered:!0,latest:J}}catch{return $.onNotice?.(hR.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. Run: ${X.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:J}}}var uR={name:"oh-my-agent",version:"6.12.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 hV$($){if(!$)return{intro:(X)=>j1(X),outro:(X)=>N$(X),note:(X,G)=>i0(X,G),logError:(X)=>f$.error(X),spinnerStart:(X)=>{let G=i8();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 uV$($,J){if($!==null)return"ready";return J?"legacy":"missing"}async function Gm($=!1,J=!1){if(!J&&process.stdout.isTTY)console.clear();let X=hV$(J);X.intro(D4.default.bgMagenta(D4.default.white(" \uD83D\uDEF8 oh-my-agent update ")));let G=process.cwd();await wL0({currentVersion:uR.version,enabled:W10(G),onSpawnStart:(H)=>X.note(H,"CLI auto-update"),onNotice:(H)=>X.note(H,"CLI update available")});let Q=await yO(G),Y=it(G),Z=uV$(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=C3(G);if(K.length>0)X.note(K.map((H)=>`${D4.default.green("✓")} ${H}`).join(`
|
|
1404
1404
|
`),"Migration");let U=K.length>0||D_(G);if(K.length>0&&!D_(G))T_(G,!0);if(!J)await vO(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 nt();if(Q===H.version&&!U){W.stop(D4.default.green("Already up to date!")),X.outro(`Current version: ${D4.default.cyan(Q)}`);return}let z=Q===H.version;W.message(`Downloading ${D4.default.cyan(H.version)}...`);let{dir:B,cleanup:V}=await EY();try{W.message("Copying files..."),C3(G);let q=a6(G,".agents","oma-config.yaml"),O=a6(G,".agents","mcp.json"),L=!$&&J5(q)?BK(q):null,F=!$&&J5(O)?BK(O):null,N=a6(fV$(),`oma-stack-backup-${Date.now()}`),M=a6(G,".agents","skills","oma-backend","stack"),R=!$&&J5(M);if(R)pz(N,{recursive:!0}),gR(M,a6(N,"oma-backend"),{recursive:!0});let T=["snippets.md","tech-stack.md","api-template.py"],P=a6(G,".agents","skills","oma-backend","resources"),D=!$&&!R&&T.some((i)=>J5(a6(P,i)));if(gR(a6(B,".agents"),a6(G,".agents"),{recursive:!0,force:!0}),L)aG(q,L);if(F)aG(O,F);if(R)try{pz(M,{recursive:!0}),gR(a6(N,"oma-backend"),M,{recursive:!0,force:!0})}finally{Xm(N,{recursive:!0,force:!0})}if(D){let i=a6(B,".agents","skills","oma-backend","variants","python");if(J5(i))pz(M,{recursive:!0}),gR(i,M,{recursive:!0,force:!0}),aG(a6(M,"stack.yaml"),`language: python
|
|
1405
1405
|
framework: fastapi
|
|
1406
1406
|
orm: sqlalchemy
|
package/package.json
CHANGED