oh-my-agent 6.5.4 → 6.6.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.
- package/README.md +1 -0
- package/bin/cli.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -89,6 +89,7 @@ Pick a preset and you're ready:
|
|
|
89
89
|
| **oma-pm** | Plans tasks, breaks down requirements, defines API contracts |
|
|
90
90
|
| **oma-qa** | OWASP security, performance, accessibility review |
|
|
91
91
|
| **oma-recap** | Conversation history recap and themed work summaries |
|
|
92
|
+
| **oma-scholar** | Academic research companion — literature search, peer review |
|
|
92
93
|
| **oma-scm** | SCM (software configuration management) — branching, merges, worktrees, baselines; Conventional Commits |
|
|
93
94
|
| **oma-search** | Intent-based search router with trust scoring — docs, web, code, local |
|
|
94
95
|
| **oma-tf-infra** | Multi-cloud Terraform IaC (Infrastructure as Code) |
|
package/bin/cli.js
CHANGED
|
@@ -1393,7 +1393,7 @@ print(json.dumps({
|
|
|
1393
1393
|
}))
|
|
1394
1394
|
`;function PH$(){return process.env.OMA_PYTHON??"python3"}function jH$($){if(EH$.some((J)=>$===J||$.endsWith(`.${J}`)))return["safari","chrome","firefox"];return["chrome","safari","firefox"]}async function CH$($,J,X){return new Promise((G)=>{let Q=TH$(PH$(),["-c",wH$],{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 SH$($,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 qO0($,J){let X=jH$($.hostname),G=[],Q=performance.now();for(let K of X){if(J.signal?.aborted)break;let U=performance.now(),W=await CH$($,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=SH$(W,$.toString(),H),B=k4(z);if(G40(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 BO0="https://r.jina.ai/";function _H$($){let J=`${$.protocol}//${$.hostname}`,X=$.hostname.startsWith("m.")?$.hostname:`m.${$.hostname.replace(/^www\./,"")}`,G=new URL($.toString());return G.hostname=X,[{label:"jina",url:`${BO0}${$.toString()}`,headers:c3({accept:"text/plain"})},{label:"jina-json",url:`${BO0}${$.toString()}`,headers:c3({accept:"application/json"})},{label:"curl-desktop",url:$.toString(),headers:c3({userAgent:P5.desktopFirefox,referer:J})},{label:"curl-mobile",url:G.toString(),headers:c3({userAgent:P5.mobileSafari,referer:J})},{label:"curl-googlebot",url:$.toString(),headers:c3({userAgent:P5.googlebot})}]}function xH$($,J){if(!$.startsWith("jina"))return J;return J}async function OO0($,J){let X=_H$($),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=J40(W);if(z)throw Z=z,Error(`jina-quota:${z.detail}`)}if(!vH$(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:xH$(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 vH$($,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 bH$=["api","probe","impersonate","browser","archive"];function kH$($){if($.only?.length)return $.only;let J=bH$.slice();if(!$.includeArchive)J=J.filter((X)=>X!=="archive");if($.skip?.length)J=J.filter((X)=>!$.skip?.includes(X));return J}async function LO0($,J,X){switch($){case"api":return await WF(J,X)??null;case"probe":return OO0(J,X);case"impersonate":return qO0(J,X);case"browser":return VO0(J,X);case"archive":return PW(J,X)}}function lg($){if($.status==="ok")return!0;if($.status==="auth-required"&&Q40($.signals))return!0;return!1}function yH$($){return $.status==="auth-required"||$.status==="invalid-input"||$.status==="not-found"}async function fH$($){let J=Math.floor(Math.random()*500);await new Promise((X)=>setTimeout(X,$+J))}function hH$($){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 FO0($,J,X={}){let G=kH$(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 LO0(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(lg(W))return W.attempts=Q,W;if(yH$(W))return W.attempts=Q,W;if(X.retryOnRateLimit!==!1&&Y40(W.signals)&&!Y.has(U)){Y.add(U),await fH$(hH$(W.signals));let H=await LO0(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}),lg(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}),lg(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 GL0=c0(JL0(),1);var UV$=["/rss","/feed","/atom.xml","/rss.xml","/index.xml"],WV$=new GL0.XMLParser({ignoreAttributes:!1,attributeNamePrefix:"@_",textNodeName:"#text"});function rg($){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 XL0($){for(let J of rg($)){let X=J?.["@_href"],G=J?.["@_rel"];if(typeof X==="string"&&(G===void 0||G==="alternate"))return X}return}function QL0($){let J;try{J=WV$.parse($)}catch{return null}let X=J.rss;if(X){let Q=X.channel;if(!Q)return null;let Y=rg(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=rg(G.entry);return{kind:"atom",title:Y4(G.title),description:Y4(G.subtitle),link:XL0(G.link),entries:Q.map((Y)=>({title:Y4(Y.title),link:XL0(Y.link),pubDate:Y4(Y.published)??Y4(Y.updated),description:Y4(Y.summary),content:Y4(Y.content)??Y4(Y.summary)}))}}return null}async function YL0($,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=UF(Y.text).alternate?.[0]?.href}catch{}let Q=new Set;if(G)try{Q.add(new URL(G,$).toString())}catch{}for(let Y of UV$)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=QL0(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 ZL0($,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 kR={"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 HV$($){return $.replace(/^www\./,"")}function zV$($){if($ in kR){let X=kR[$];return X?{...X}:null}let J=HV$($);if(J in kR){let X=kR[J];return X?{...X}:null}return null}function VV$($){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 qV$($){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 KL0($){let J=zV$($);if(J)return J;let X=VV$($);if(X)return X;let G=await qV$($);if(G)return G;return{domain:$,level:"unknown",score:null,tags:[],source:"heuristic"}}var UL0=["api","probe","impersonate","browser","archive"];function WL0($){if(!$)return;let J=$.split(",").map((G)=>G.trim()).filter(Boolean),X=J.filter((G)=>!UL0.includes(G));if(X.length>0)throw Error(`Unknown strategy: ${X.join(", ")}. Valid: ${UL0.join(", ")}`);return J}function VK($){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 iG($){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 HL0($){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=VK(X),Y=yX(G),Z=await FO0(Q,Y,{only:WL0(G.only),skip:WL0(G.skip),includeArchive:G.includeArchive});n7(Z,Boolean(G.pretty)),iG(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=VK(X);if(!cv(Q)){console.error(i5.default.yellow(`No API handler matches host ${Q.hostname}`)),process.exitCode=3;return}let Z=yX(G),K=await WF(Q,Z);if(!K){process.exitCode=3;return}n7(K,Boolean(G.pretty)),iG(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 E40(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=VK(X),Y=yX(G),Z=await $40(Q,Y),{content:K,...U}=Z;n7(U,Boolean(G.pretty)),iG(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=VK(X),Y=yX(G),Z=await YL0(Q,Y),{content:K,...U}=Z;n7(U,Boolean(G.pretty)),iG(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=ZL0(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=VK(X),Y=yX(G),Z=G.subLang?G.subLang.split(",").map((U)=>U.trim()).filter(Boolean):void 0,K=await t60(Q,Y,{subtitles:G.subs,...Z?{subLangs:Z}:{},...G.format?{format:G.format}:{}});n7(K,Boolean(G.pretty)),iG(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=VK(X),Y=yX(G),Z=await PW(Q,Y);n7(Z,Boolean(G.pretty)),iG(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 KL0(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 r60(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)),iG(Z)}),J.command("doctor").description("Check dependencies (Chrome, python3 curl_cffi, yt-dlp, gh)").action(async()=>{let X=[],G=pg();X.push({name:"chrome",ok:Boolean(G),detail:G??"Install Chrome or set OMA_CHROME_PATH"}),X.push(await tg("python3",["--version"])),X.push(await BV$()),X.push(await tg("yt-dlp",["--version"])),X.push(await tg("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 tg($,J){return new Promise((X)=>{let{spawn:G}=r("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 BV$(){return new Promise(($)=>{let{spawn:J}=r("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 OV$,spawnSync as zL0}from"node:child_process";import{platform as LV$}from"node:os";function FV$(){let $=LV$();if($==="darwin")return"brew install gh";if($==="win32")return"winget install GitHub.cli";return"sudo apt install gh"}async function VL0(){if(console.clear(),P1(fX.default.bgMagenta(fX.default.white(" ⭐ oh-my-agent star "))),!z3()){let J=FV$(),X=await t6({message:`GitHub CLI (gh) is not installed. Install with ${fX.default.cyan(J)}?`});if(J1(X)||!X){F$("Install gh manually and try again.");return}let G=i8();G.start("Installing GitHub CLI...");let Q=zL0(J,{shell:!0,stdio:"pipe"});if(Q.status!==0){G.stop("Installation failed"),p$.error(Q.stderr?.toString()||"Unknown error"),F$("Please install gh manually.");return}G.stop("GitHub CLI installed!")}if(!A5()){p$.warn("GitHub CLI is not authenticated.");let J=await t6({message:`Run ${fX.default.cyan("gh auth login")} now?`});if(J1(J)||!J){F$("Authenticate and try again.");return}if(zL0("gh",["auth","login"],{stdio:"inherit"}),!A5()){F$("Authentication was not completed. Try again.");return}p$.success("Authenticated!")}if(V3()){F$(`Already starred ${fX.default.cyan(g1)}! Thank you! \uD83D\uDE4F`);return}let $=await t6({message:`Star ${fX.default.cyan(g1)} on GitHub?`});if(J1($)||!$){F$("Maybe next time!");return}try{OV$(`gh api -X PUT /user/starred/${g1}`,{stdio:"ignore"}),F$(`Starred ${fX.default.cyan(g1)}! Thank you! \uD83C\uDF1F`)}catch{p$.error("Failed to star the repository."),F$("Please try again later.")}}function qL0($){$.command("star").description("Star oh-my-agent on GitHub").action(W$(async()=>{await VL0()}))}$8();vv();wU();var $5=c0(q1(),1);import{existsSync as yR,mkdirSync as NV$,readdirSync as MV$,readFileSync as AV$,writeFileSync as BL0}from"node:fs";import{dirname as RV$,join as OL0}from"node:path";function $m($){return OL0($,".serena","metrics.json")}function eg(){return{sessions:0,skillsUsed:{},tasksCompleted:0,totalSessionTime:0,filesChanged:0,linesAdded:0,linesRemoved:0,lastUpdated:new Date().toISOString(),startDate:new Date().toISOString()}}function IV$($){let J=$m($);if(yR(J))try{return JSON.parse(AV$(J,"utf-8"))}catch{return eg()}return eg()}function DV$($,J){let X=$m($),G=RV$(X);if(!yR(G))NV$(G,{recursive:!0});J.lastUpdated=new Date().toISOString(),BL0(X,JSON.stringify(J,null,2),"utf-8")}function TV$($){let J=OL0($,".serena","memories"),X={};if(!yR(J))return X;try{let G=MV$(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 LL0($=!1,J=!1){let X=process.cwd(),G=$m(X);if(J){if(yR(G))BL0(G,JSON.stringify(eg(),null,2),"utf-8");if($)console.log(JSON.stringify({reset:!0}));else console.log($5.default.green("✅ Metrics reset successfully."));return}let Q=IV$(X),Y=$F(X),Z=TV$(X),K=Ti(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,DV$(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(),P1($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(`
|
|
1395
1395
|
`);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(`
|
|
1396
|
-
`);i0(O,"Skills")}F$($5.default.dim(`Data stored in: ${G}`))}function FL0($){L6($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(W$(async(J)=>{await LL0(G6(J),J.reset)},{supportsJsonOutput:!0}))}$8();var D4=c0(q1(),1);import{execSync as _V$}from"node:child_process";import{cpSync as uR,existsSync as J5,mkdirSync as pz,readFileSync as qK,rmSync as Jm,writeFileSync as oG}from"node:fs";import{tmpdir as xV$}from"node:os";import{dirname as RL0,join as a6}from"node:path";var fR=c0(q1(),1);import{execSync as EV$,spawn as wV$}from"node:child_process";import{realpathSync as NL0}from"node:fs";import cz from"node:process";var nG="oh-my-agent";function PV$($=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=NL0($).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=EV$(`brew --prefix ${nG}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(X){let G=NL0(X).replace(/\\/g,"/");if(J.startsWith(G))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${nG}`,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 ${nG}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(J.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${nG}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(J.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${nG}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${nG}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var ML0=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function jV$($,J){let X=$.match(ML0),G=J.match(ML0);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 CV$($=nG,J=2000){try{let X=await DY.get(`https://registry.npmjs.org/${$}/latest`,{timeout:J});return typeof X.data?.version==="string"?X.data.version:null}catch{return null}}async function AL0($){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 CV$();if(!J)return{triggered:!1,reason:"fetch-failed"};if(!jV$($.currentVersion,J))return{triggered:!1,reason:"up-to-date",latest:J};let X=PV$();if(!X.updateCommand)return $.onNotice?.(fR.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. ${X.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:J};try{return wV$(X.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(fR.default.cyan(`global oh-my-agent ${$.currentVersion} → ${J} updating in background. New version applies on next run.`)),{triggered:!0,latest:J}}catch{return $.onNotice?.(fR.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. Run: ${X.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:J}}}var hR={name:"oh-my-agent",version:"6.
|
|
1396
|
+
`);i0(O,"Skills")}F$($5.default.dim(`Data stored in: ${G}`))}function FL0($){L6($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(W$(async(J)=>{await LL0(G6(J),J.reset)},{supportsJsonOutput:!0}))}$8();var D4=c0(q1(),1);import{execSync as _V$}from"node:child_process";import{cpSync as uR,existsSync as J5,mkdirSync as pz,readFileSync as qK,rmSync as Jm,writeFileSync as oG}from"node:fs";import{tmpdir as xV$}from"node:os";import{dirname as RL0,join as a6}from"node:path";var fR=c0(q1(),1);import{execSync as EV$,spawn as wV$}from"node:child_process";import{realpathSync as NL0}from"node:fs";import cz from"node:process";var nG="oh-my-agent";function PV$($=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=NL0($).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=EV$(`brew --prefix ${nG}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(X){let G=NL0(X).replace(/\\/g,"/");if(J.startsWith(G))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${nG}`,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 ${nG}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(J.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${nG}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(J.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${nG}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${nG}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var ML0=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function jV$($,J){let X=$.match(ML0),G=J.match(ML0);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 CV$($=nG,J=2000){try{let X=await DY.get(`https://registry.npmjs.org/${$}/latest`,{timeout:J});return typeof X.data?.version==="string"?X.data.version:null}catch{return null}}async function AL0($){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 CV$();if(!J)return{triggered:!1,reason:"fetch-failed"};if(!jV$($.currentVersion,J))return{triggered:!1,reason:"up-to-date",latest:J};let X=PV$();if(!X.updateCommand)return $.onNotice?.(fR.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. ${X.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:J};try{return wV$(X.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(fR.default.cyan(`global oh-my-agent ${$.currentVersion} → ${J} updating in background. New version applies on next run.`)),{triggered:!0,latest:J}}catch{return $.onNotice?.(fR.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. Run: ${X.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:J}}}var hR={name:"oh-my-agent",version:"6.6.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",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 vV$($){if(!$)return{intro:(X)=>P1(X),outro:(X)=>F$(X),note:(X,G)=>i0(X,G),logError:(X)=>p$.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 bV$($,J){if($!==null)return"ready";return J?"legacy":"missing"}async function Xm($=!1,J=!1){if(!J&&process.stdout.isTTY)console.clear();let X=vV$(J);X.intro(D4.default.bgMagenta(D4.default.white(" \uD83D\uDEF8 oh-my-agent update ")));let G=process.cwd();await AL0({currentVersion:hR.version,enabled:G10(G),onSpawnStart:(H)=>X.note(H,"CLI auto-update"),onNotice:(H)=>X.note(H,"CLI update available")});let Q=await kO(G),Y=ct(G),Z=bV$(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=j3(G);if(K.length>0)X.note(K.map((H)=>`${D4.default.green("✓")} ${H}`).join(`
|
|
1397
1397
|
`),"Migration");let U=K.length>0||I_(G);if(K.length>0&&!I_(G))D_(G,!0);if(!J)await xO(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 pt();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 TY();try{W.message("Copying files..."),j3(G);let q=a6(G,".agents","oma-config.yaml"),O=a6(G,".agents","mcp.json"),L=!$&&J5(q)?qK(q):null,F=!$&&J5(O)?qK(O):null,N=a6(xV$(),`oma-stack-backup-${Date.now()}`),M=a6(G,".agents","skills","oma-backend","stack"),R=!$&&J5(M);if(R)pz(N,{recursive:!0}),uR(M,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=!$&&!R&&D.some((p)=>J5(a6(j,p)));if(uR(a6(B,".agents"),a6(G,".agents"),{recursive:!0,force:!0}),L)oG(q,L);if(F)oG(O,F);if(R)try{pz(M,{recursive:!0}),uR(a6(N,"oma-backend"),M,{recursive:!0,force:!0})}finally{Jm(N,{recursive:!0,force:!0})}if(T){let p=a6(B,".agents","skills","oma-backend","variants","python");if(J5(p))pz(M,{recursive:!0}),uR(p,M,{recursive:!0,force:!0}),oG(a6(M,"stack.yaml"),`language: python
|
|
1398
1398
|
framework: fastapi
|
|
1399
1399
|
orm: sqlalchemy
|
package/package.json
CHANGED