oh-my-agent 7.3.0 → 7.3.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/README.md +4 -4
- package/bin/cli.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -77,15 +77,15 @@ Pick a preset and you're ready:
|
|
|
77
77
|
| **oma-hwp** | HWP/HWPX/HWPML to Markdown conversion |
|
|
78
78
|
| **oma-image** | Multi-vendor AI image generation |
|
|
79
79
|
| **oma-mobile** | Flutter cross-platform apps |
|
|
80
|
-
| **oma-observability** | Observability router
|
|
80
|
+
| **oma-observability** | Observability router for APM/RUM, metrics/logs/traces/profiles, SLO, incident forensics, transport tuning |
|
|
81
81
|
| **oma-orchestrator** | Parallel agent execution via CLI |
|
|
82
82
|
| **oma-pdf** | PDF to Markdown conversion |
|
|
83
83
|
| **oma-pm** | Plans tasks, breaks down requirements, defines API contracts |
|
|
84
84
|
| **oma-qa** | OWASP security, performance, accessibility review |
|
|
85
85
|
| **oma-recap** | Conversation history recap and themed work summaries |
|
|
86
|
-
| **oma-scholar** | Academic research companion
|
|
87
|
-
| **oma-scm** |
|
|
88
|
-
| **oma-search** | Intent-based search router with trust scoring
|
|
86
|
+
| **oma-scholar** | Academic research companion for literature search and peer review |
|
|
87
|
+
| **oma-scm** | Software configuration management with branching, merges, worktrees, baselines, Conventional Commits |
|
|
88
|
+
| **oma-search** | Intent-based search router with trust scoring across docs, web, code, local |
|
|
89
89
|
| **oma-skill-creator** | Authors and audits OMA skills in the SSL-lite format |
|
|
90
90
|
| **oma-tf-infra** | Multi-cloud Terraform IaC (Infrastructure as Code) |
|
|
91
91
|
| **oma-translator** | Natural multilingual translation |
|
package/bin/cli.js
CHANGED
|
@@ -1463,7 +1463,7 @@ print(json.dumps({
|
|
|
1463
1463
|
}))
|
|
1464
1464
|
`;function MN5(){return process.env.OMA_PYTHON??"python3"}function IN5($){if(qN5.some((z)=>$===z||$.endsWith(`.${z}`)))return["safari","chrome","firefox"];return["chrome","safari","firefox"]}async function EN5($,z,G){return new Promise((J)=>{let U=ON5(MN5(),["-c",DN5],{env:{...process.env,OMA_IMPERSONATE_URL:$.toString(),OMA_IMPERSONATE_TARGET:z,OMA_IMPERSONATE_LOCALE:G.locale,OMA_IMPERSONATE_TIMEOUT:String(G.timeoutMs)},stdio:["ignore","pipe","pipe"]}),K="",X="";U.stdout.on("data",(Z)=>{K+=Z.toString()}),U.stderr.on("data",(Z)=>{X+=Z.toString()});let Q=()=>{U.kill("SIGTERM")};G.signal?.addEventListener("abort",Q),U.on("close",(Z)=>{if(G.signal?.removeEventListener("abort",Q),Z!==0&&!K){J({error:`python_exit:${Z}:${X.trim().slice(0,200)}`});return}let k=K.trim();if(!k){J({error:"empty_stdout"});return}try{J(JSON.parse(k))}catch(L){J({error:`parse_error:${L.message}:${k.slice(0,200)}`})}}),U.on("error",(Z)=>{G.signal?.removeEventListener("abort",Q),J({error:`spawn_error:${Z.message}`})})})}function TN5($,z,G){let J=new Headers;if($.headers)for(let[U,K]of Object.entries($.headers))try{J.set(U,K)}catch{}return{ok:($.status??0)>=200&&($.status??0)<400,status:$.status??0,headers:J,url:$.url??z,text:$.body??"",elapsedMs:G,redirected:($.url??z)!==z}}async function mN2($,z){let G=IN5($.hostname),J=[],U=performance.now();for(let Q of G){if(z.signal?.aborted)break;let Z=performance.now(),k=await EN5($,Q,z),L=Math.round(performance.now()-Z);if(k.error==="curl_cffi_not_installed")return b1({url:$.toString(),strategy:"impersonate",error:Error("curl_cffi is not installed. Run: pip install curl_cffi")});if(k.error){J.push({target:Q,detail:k.error});continue}let Y=TN5(k,$.toString(),L),H=$7(Y);if(w02(H))return{url:$.toString(),status:"blocked",strategy:"impersonate",platform:Q,httpStatus:Y.status,content:Y.text,contentType:Y.headers.get("content-type")??void 0,elapsedMs:Math.round(performance.now()-U),signals:H,error:"js-essential-markers-detected"};if(Y.ok&&Y.text.length>=200)return{url:$.toString(),status:M6(Y,H),strategy:"impersonate",platform:Q,httpStatus:Y.status,content:Y.text,contentType:Y.headers.get("content-type")??void 0,elapsedMs:Math.round(performance.now()-U),signals:H};J.push({target:Q,detail:`status=${Y.status} size=${Y.text.length}`})}let K=Math.round(performance.now()-U),X=J.map((Q)=>`${Q.target}(${Q.detail})`).join(" | ");return{...b1({url:$.toString(),strategy:"impersonate",error:Error(X?`impersonate_failed: ${X}`:"impersonate_failed")}),elapsedMs:K,signals:[]}}var gN2="https://r.jina.ai/";function RN5($){let z=`${$.protocol}//${$.hostname}`,G=$.hostname.startsWith("m.")?$.hostname:`m.${$.hostname.replace(/^www\./,"")}`,J=new URL($.toString());return J.hostname=G,[{label:"jina",url:`${gN2}${$.toString()}`,headers:PG({accept:"text/plain"})},{label:"jina-json",url:`${gN2}${$.toString()}`,headers:PG({accept:"application/json"})},{label:"curl-desktop",url:$.toString(),headers:PG({userAgent:$8.desktopFirefox,referer:z})},{label:"curl-mobile",url:J.toString(),headers:PG({userAgent:$8.mobileSafari,referer:z})},{label:"curl-googlebot",url:$.toString(),headers:PG({userAgent:$8.googlebot})}]}function vN5($,z){if(!$.startsWith("jina"))return z;return z}async function fN2($,z){let G=RN5($),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 k=await m1(Z.url,{headers:Z.headers,timeoutMs:z.timeoutMs,signal:J.signal,locale:z.locale}),L=$7(k);if(Z.label.startsWith("jina")){let Y=R02(k);if(Y)throw X=Y,Error(`jina-quota:${Y.detail}`)}if(!wN5(k,L))throw K[Z.label]=`status=${k.status} size=${k.text.length}`,Error(`weak-response:${Z.label}`);return{label:Z.label,resp:k,signals:L}});try{let Z=await Promise.any(Q);J.abort();let k=Math.round(performance.now()-U);return{url:$.toString(),status:M6(Z.resp,Z.signals),strategy:"probe",platform:Z.label,httpStatus:Z.resp.status,content:vN5(Z.label,Z.resp.text),contentType:Z.resp.headers.get("content-type")??void 0,elapsedMs:k,signals:X?[...Z.signals,X]:Z.signals}}catch(Z){let k=Math.round(performance.now()-U),L=Object.entries(K).map(([Y,H])=>`${Y}:${H}`).join(" ");if(X)return{...b1({url:$.toString(),error:Error(`probe failed — ${L}`),strategy:"probe"}),elapsedMs:k,signals:[X]};return{...b1({url:$.toString(),error:Z instanceof AggregateError?Error(L):Z,strategy:"probe"}),elapsedMs:k}}}function wN5($,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 PN5=["api","probe","impersonate","browser","archive"];function bN5($){if($.only?.length)return $.only;let z=PN5.slice();if(!$.includeArchive)z=z.filter((G)=>G!=="archive");if($.skip?.length)z=z.filter((G)=>!$.skip?.includes(G));return z}async function lN2($,z,G){switch($){case"api":return await sV(z,G)??null;case"probe":return fN2(z,G);case"impersonate":return mN2(z,G);case"browser":return xN2(z,G);case"archive":return mL(z,G)}}function cl($){if($.status==="ok")return!0;if($.status==="auth-required"&&P02($.signals))return!0;return!1}function CN5($){return $.status==="auth-required"||$.status==="invalid-input"||$.status==="not-found"}async function SN5($){let z=Math.floor(Math.random()*500);await new Promise((G)=>setTimeout(G,$+z))}function _N5($){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 cN2($,z,G={}){let J=bN5(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 k=await lN2(Z,$,z);if(!k)continue;if(U.push({strategy:Z,platform:k.platform,status:k.status,httpStatus:k.httpStatus,elapsedMs:k.elapsedMs,signals:k.signals,error:k.error}),k.signals.some((L)=>L.kind==="js-essential"))Q=!0;if(cl(k))return k.attempts=U,k;if(CN5(k))return k.attempts=U,k;if(G.retryOnRateLimit!==!1&&b02(k.signals)&&!K.has(Z)){K.add(Z),await SN5(_N5(k.signals));let L=await lN2(Z,$,z);if(L){if(U.push({strategy:Z,platform:L.platform,status:L.status,httpStatus:L.httpStatus,elapsedMs:L.elapsedMs,signals:L.signals,error:L.error}),cl(L))return L.attempts=U,L;X=L;continue}}X=k}if(!J.includes("archive")&&G.includeArchive!==!1){let Z=await mL($,z);if(U.push({strategy:"archive",platform:Z.platform,status:Z.status,httpStatus:Z.httpStatus,elapsedMs:Z.elapsedMs,signals:Z.signals,error:Z.error}),cl(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"}}var wO2=d2(RO2(),1);var Kq5=["/rss","/feed","/atom.xml","/rss.xml","/index.xml"],Xq5=new wO2.XMLParser({ignoreAttributes:!1,attributeNamePrefix:"@_",textNodeName:"#text"});function sl($){if($===void 0||$===null)return[];return Array.isArray($)?$:[$]}function F3($){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 vO2($){for(let z of sl($)){let G=z?.["@_href"],J=z?.["@_rel"];if(typeof G==="string"&&(J===void 0||J==="alternate"))return G}return}function PO2($){let z;try{z=Xq5.parse($)}catch{return null}let G=z.rss;if(G){let U=G.channel;if(!U)return null;let K=sl(U.item);return{kind:"rss",title:F3(U.title),description:F3(U.description),link:F3(U.link),entries:K.map((X)=>({title:F3(X.title),link:F3(X.link),pubDate:F3(X.pubDate),description:F3(X.description),content:F3(X["content:encoded"])??F3(X.content)}))}}let J=z.feed;if(J){let U=sl(J.entry);return{kind:"atom",title:F3(J.title),description:F3(J.subtitle),link:vO2(J.link),entries:U.map((K)=>({title:F3(K.title),link:vO2(K.link),pubDate:F3(K.published)??F3(K.updated),description:F3(K.summary),content:F3(K.content)??F3(K.summary)}))}}return null}async function bO2($,z){let G=performance.now(),J;try{let K=await m1($.toString(),{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(K.ok)J=rV(K.text).alternate?.[0]?.href}catch{}let U=new Set;if(J)try{U.add(new URL(J,$).toString())}catch{}for(let K of Kq5)U.add(new URL(K,`${$.protocol}//${$.host}`).toString());for(let K of U){if(z.signal?.aborted)break;try{let X=await m1(K,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!X.ok||X.text.length<50)continue;let Q=PO2(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 CO2($,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()}var DD={"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 Qq5($){return $.replace(/^www\./,"")}function Zq5($){if($ in DD){let G=DD[$];return G?{...G}:null}let z=Qq5($);if(z in DD){let G=DD[z];return G?{...G}:null}return null}function kq5($){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 Lq5($){try{let z=await m1(`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 SO2($){let z=Zq5($);if(z)return z;let G=kq5($);if(G)return G;let J=await Lq5($);if(J)return J;return{domain:$,level:"unknown",score:null,tags:[],source:"heuristic"}}var _O2=["api","probe","impersonate","browser","archive"];function yO2($){if(!$)return;let z=$.split(",").map((J)=>J.trim()).filter(Boolean),G=z.filter((J)=>!_O2.includes(J));if(G.length>0)throw Error(`Unknown strategy: ${G.join(", ")}. Valid: ${_O2.join(", ")}`);return z}function XZ($){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 M0($,z){if(z)console.log(JSON.stringify($,null,2));else console.log(JSON.stringify($))}function _J($){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 hO2($){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=XZ(G),K=Oz(J),X=await cN2(U,K,{only:yO2(J.only),skip:yO2(J.skip),includeArchive:J.includeArchive});M0(X,Boolean(J.pretty)),_J(X)}catch(U){console.error(F8.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=XZ(G);if(!fy(U)){console.error(F8.default.yellow(`No API handler matches host ${U.hostname}`)),process.exitCode=3;return}let X=Oz(J),Q=await sV(U,X);if(!Q){process.exitCode=3;return}M0(Q,Boolean(J.pretty)),_J(Q)}catch(U){console.error(F8.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 t02(G,U,K);M0(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=XZ(G),K=Oz(J),X=await T02(U,K),{content:Q,...Z}=X;M0(Z,Boolean(J.pretty)),_J(X)}catch(U){console.error(F8.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=XZ(G),K=Oz(J),X=await bO2(U,K),{content:Q,...Z}=X;M0(Z,Boolean(J.pretty)),_J(X)}catch(U){console.error(F8.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=CO2(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=XZ(G),K=Oz(J),X=J.subLang?J.subLang.split(",").map((Z)=>Z.trim()).filter(Boolean):void 0,Q=await I02(U,K,{subtitles:J.subs,...X?{subLangs:X}:{},...J.format?{format:J.format}:{}});M0(Q,Boolean(J.pretty)),_J(Q)}catch(U){console.error(F8.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=XZ(G),K=Oz(J),X=await mL(U,K);M0(X,Boolean(J.pretty)),_J(X)}catch(U){console.error(F8.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 SO2(G.toLowerCase());M0(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 M02(G,K,{host:U,...J.language?{language:J.language}:{},...J.repo?{repo:J.repo}:{},...J.limit?{limit:Number.parseInt(J.limit,10)}:{}});M0(X,Boolean(J.pretty)),_J(X)}),z.command("doctor").description("Check dependencies (Chrome, python3 curl_cffi, yt-dlp, gh)").action(async()=>{let G=[],J=ll();G.push({name:"chrome",ok:Boolean(J),detail:J??"Install Chrome or set OMA_CHROME_PATH"}),G.push(await tl("python3",["--version"])),G.push(await Yq5()),G.push(await tl("yt-dlp",["--version"])),G.push(await tl("gh",["--version"]));for(let U of G){let K=U.ok?F8.default.green("✓"):F8.default.yellow("!");console.log(`${K} ${U.name}: ${U.detail}`)}if(G.some((U)=>!U.ok))process.exitCode=1})}async function tl($,z){return new Promise((G)=>{let{spawn:J}=K2("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 Yq5(){return new Promise(($)=>{let{spawn:z}=K2("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)"})})})}F7();var qz=d2(N4(),1);import{execSync as jq5,spawnSync as iO2}from"node:child_process";import{platform as Hq5}from"node:os";function Wq5(){let $=Hq5();if($==="darwin")return"brew install gh";if($==="win32")return"winget install GitHub.cli";return"sudo apt install gh"}async function xO2(){if(console.clear(),i4(qz.default.bgMagenta(qz.default.white(" ⭐ oh-my-agent star "))),!oz()){let z=Wq5(),G=await k3({message:`GitHub CLI (gh) is not installed. Install with ${qz.default.cyan(z)}?`});if(Y4(G)||!G){R5("Install gh manually and try again.");return}let J=W6();J.start("Installing GitHub CLI...");let U=iO2(z,{shell:!0,stdio:"pipe"});if(U.status!==0){J.stop("Installation failed"),s5.error(U.stderr?.toString()||"Unknown error"),R5("Please install gh manually.");return}J.stop("GitHub CLI installed!")}if(!n9()){s5.warn("GitHub CLI is not authenticated.");let z=await k3({message:`Run ${qz.default.cyan("gh auth login")} now?`});if(Y4(z)||!z){R5("Authenticate and try again.");return}if(iO2("gh",["auth","login"],{stdio:"inherit"}),!n9()){R5("Authentication was not completed. Try again.");return}s5.success("Authenticated!")}if(rz()){R5(`Already starred ${qz.default.cyan(s4)}! Thank you! \uD83D\uDE4F`);return}let $=await k3({message:`Star ${qz.default.cyan(s4)} on GitHub?`});if(Y4($)||!$){R5("Maybe next time!");return}try{jq5(`gh api -X PUT /user/starred/${s4}`,{stdio:"ignore"}),R5(`Starred ${qz.default.cyan(s4)}! Thank you! \uD83C\uDF1F`)}catch{s5.error("Failed to star the repository."),R5("Please try again later.")}}function mO2($){$.command("star").description("Star oh-my-agent on GitHub").action(Y5(async()=>{await xO2()}))}F7();Cy();Nk();var E9=d2(N4(),1);import{existsSync as MD,mkdirSync as Aq5,readdirSync as uq5,readFileSync as Bq5,writeFileSync as gO2}from"node:fs";import{dirname as Vq5,join as fO2}from"node:path";function $c($){return fO2($,".serena","metrics.json")}function el(){return{sessions:0,skillsUsed:{},tasksCompleted:0,totalSessionTime:0,filesChanged:0,linesAdded:0,linesRemoved:0,lastUpdated:new Date().toISOString(),startDate:new Date().toISOString()}}function Fq5($){let z=$c($);if(MD(z))try{return JSON.parse(Bq5(z,"utf-8"))}catch{return el()}return el()}function Nq5($,z){let G=$c($),J=Vq5(G);if(!MD(J))Aq5(J,{recursive:!0});z.lastUpdated=new Date().toISOString(),gO2(G,JSON.stringify(z,null,2),"utf-8")}function Oq5($){let z=fO2($,".serena","memories"),G={};if(!MD(z))return G;try{let J=uq5(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 lO2($=!1,z=!1){let G=process.cwd(),J=$c(G);if(z){if(MD(J))gO2(J,JSON.stringify(el(),null,2),"utf-8");if($)console.log(JSON.stringify({reset:!0}));else console.log(E9.default.green("✅ Metrics reset successfully."));return}let U=Fq5(G),K=fV(G),X=Oq5(G),Q=ho(G),Z=pA(G),k=Z.startedAt?new Date(Z.startedAt):null,L=k&&!Number.isNaN(k.getTime())?Math.max(0,Math.floor((Date.now()-k.getTime())/1000)):0;for(let[A,u]of Object.entries(X))U.skillsUsed[A]=(U.skillsUsed[A]||0)+u;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)&&L>0)U.totalSessionTime+=L;U.lastSessionId=Z.id,U.lastSessionStatus=Z.status,U.lastSessionStarted=Z.startedAt,U.lastSessionDuration=L}U.filesChanged+=K.filesChanged,U.linesAdded+=K.linesAdded,U.linesRemoved+=K.linesRemoved,U.sessions+=1,Nq5(G,U);let Y=Math.max(1,Math.ceil((Date.now()-new Date(U.startDate).getTime())/86400000)),H=U.sessions>0?Math.round(U.totalSessionTime/U.sessions):0;if($){console.log(JSON.stringify({...U,gitStats:K,daysSinceStart:Y,avgSessionTime:H},null,2));return}console.clear(),i4(E9.default.bgMagenta(E9.default.white(" \uD83D\uDCCA oh-my-agent stats ")));let j=[E9.default.bold(`\uD83D\uDCC8 Productivity Metrics (${Y} days)`),"┌─────────────────────┬──────────────┐",`│ ${E9.default.bold("Metric")} │ ${E9.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 │ ${E9.default.green(`+${U.linesAdded}`).padEnd(12)} │`,`│ Lines Removed │ ${E9.default.red(`-${U.linesRemoved}`).padEnd(12)} │`,"└─────────────────────┴──────────────┘"].join(`
|
|
1465
1465
|
`);J5(j,"Overview");let W=Object.entries(U.skillsUsed).sort(([,A],[,u])=>u-A).slice(0,5);if(W.length>0){let A=[E9.default.bold("\uD83C\uDFC6 Top Skills Used"),...W.map(([u,B],V)=>` ${V+1}. ${u} (${B})`)].join(`
|
|
1466
|
-
`);J5(A,"Skills")}R5(E9.default.dim(`Data stored in: ${J}`))}function cO2($){a1($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(Y5(async(z)=>{await lO2(i1(z),z.reset)},{supportsJsonOutput:!0}))}F7();var x3=d2(N4(),1);import{execSync as Rq5}from"node:child_process";import{cpSync as TD,existsSync as T9,mkdirSync as GH,readFileSync as QZ,rmSync as zc,writeFileSync as hJ}from"node:fs";import{tmpdir as vq5}from"node:os";import{dirname as aO2,join as X3}from"node:path";var ID=d2(N4(),1);import{execSync as qq5,spawn as Dq5}from"node:child_process";import{realpathSync as nO2}from"node:fs";import zH from"node:process";var yJ="oh-my-agent";function Mq5($=zH.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(zH.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=s6(nO2($))}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(zH.platform==="darwin")try{let G=qq5(`brew --prefix ${yJ}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(G){let J=s6(nO2(G));if(z.startsWith(J))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${yJ}`,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 ${yJ}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(z.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${yJ}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(z.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${yJ}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${yJ}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var dO2=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function Iq5($,z){let G=$.match(dO2),J=z.match(dO2);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 Eq5($=yJ,z=2000){try{let G=await u$.get(`https://registry.npmjs.org/${$}/latest`,{timeout:z});return typeof G.data?.version==="string"?G.data.version:null}catch{return null}}async function pO2($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(zH.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(zH.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let z=await Eq5();if(!z)return{triggered:!1,reason:"fetch-failed"};if(!Iq5($.currentVersion,z))return{triggered:!1,reason:"up-to-date",latest:z};let G=Mq5();if(!G.updateCommand)return $.onNotice?.(ID.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. ${G.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:z};try{return Dq5(G.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(ID.default.cyan(`global oh-my-agent ${$.currentVersion} → ${z} updating in background. New version applies on next run.`)),{triggered:!0,latest:z}}catch{return $.onNotice?.(ID.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. Run: ${G.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:z}}}var ED={name:"oh-my-agent",version:"7.3.
|
|
1466
|
+
`);J5(A,"Skills")}R5(E9.default.dim(`Data stored in: ${J}`))}function cO2($){a1($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(Y5(async(z)=>{await lO2(i1(z),z.reset)},{supportsJsonOutput:!0}))}F7();var x3=d2(N4(),1);import{execSync as Rq5}from"node:child_process";import{cpSync as TD,existsSync as T9,mkdirSync as GH,readFileSync as QZ,rmSync as zc,writeFileSync as hJ}from"node:fs";import{tmpdir as vq5}from"node:os";import{dirname as aO2,join as X3}from"node:path";var ID=d2(N4(),1);import{execSync as qq5,spawn as Dq5}from"node:child_process";import{realpathSync as nO2}from"node:fs";import zH from"node:process";var yJ="oh-my-agent";function Mq5($=zH.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(zH.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=s6(nO2($))}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(zH.platform==="darwin")try{let G=qq5(`brew --prefix ${yJ}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(G){let J=s6(nO2(G));if(z.startsWith(J))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${yJ}`,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 ${yJ}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(z.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${yJ}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(z.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${yJ}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${yJ}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var dO2=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function Iq5($,z){let G=$.match(dO2),J=z.match(dO2);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 Eq5($=yJ,z=2000){try{let G=await u$.get(`https://registry.npmjs.org/${$}/latest`,{timeout:z});return typeof G.data?.version==="string"?G.data.version:null}catch{return null}}async function pO2($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(zH.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(zH.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let z=await Eq5();if(!z)return{triggered:!1,reason:"fetch-failed"};if(!Iq5($.currentVersion,z))return{triggered:!1,reason:"up-to-date",latest:z};let G=Mq5();if(!G.updateCommand)return $.onNotice?.(ID.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. ${G.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:z};try{return Dq5(G.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(ID.default.cyan(`global oh-my-agent ${$.currentVersion} → ${z} updating in background. New version applies on next run.`)),{triggered:!0,latest:z}}catch{return $.onNotice?.(ID.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. Run: ${G.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:z}}}var ED={name:"oh-my-agent",version:"7.3.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",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 wq5($){if(!$)return{intro:(G)=>i4(G),outro:(G)=>R5(G),note:(G,J)=>J5(G,J),logError:(G)=>s5.error(G),spinnerStart:(G)=>{let J=W6();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 Pq5($,z){if($!==null)return"ready";return z?"legacy":"missing"}async function Gc($=!1,z=!1){if(!z&&process.stdout.isTTY)console.clear();let G=wq5(z);G.intro(x3.default.bgMagenta(x3.default.white(" \uD83D\uDEF8 oh-my-agent update ")));let J=process.cwd();await pO2({currentVersion:ED.version,enabled:w92(J),onSpawnStart:(L)=>G.note(L,"CLI auto-update"),onNotice:(L)=>G.note(L,"CLI update available")});let U=await qB(J),K=U32(J),X=Pq5(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=BG(J);if(Q.length>0)G.note(Q.map((L)=>`${x3.default.green("✓")} ${L}`).join(`
|
|
1467
1467
|
`),"Migration");let Z=Q.length>0||FS(J);if(Q.length>0&&!FS(J))NS(J,!0);if(!z)await FB(J);if(X==="legacy")G.note("Existing .agents installation detected without _version.json. Updating in place and restoring version metadata.","Legacy install");let k;try{k=G.spinnerStart("Checking for updates...");let L=await K32();if(U===L.version&&!Z){k.stop(x3.default.green("Already up to date!")),G.outro(`Current version: ${x3.default.cyan(U)}`);return}let Y=U===L.version;k.message(`Downloading ${x3.default.cyan(L.version)}...`);let{dir:H,cleanup:j}=await FK();try{k.message("Copying files..."),BG(J);let W=X3(J,".agents","oma-config.yaml"),A=X3(J,".agents","mcp.json"),u=!$&&T9(W)?QZ(W):null,B=!$&&T9(A)?QZ(A):null,V=X3(vq5(),`oma-stack-backup-${Date.now()}`),F=X3(J,".agents","skills","oma-backend","stack"),N=!$&&T9(F);if(N)GH(V,{recursive:!0}),TD(F,X3(V,"oma-backend"),{recursive:!0});let M=["snippets.md","tech-stack.md","api-template.py"],E=X3(J,".agents","skills","oma-backend","resources"),q=!$&&!N&&M.some((p)=>T9(X3(E,p)));if(TD(X3(H,".agents"),X3(J,".agents"),{recursive:!0,force:!0}),u)hJ(W,u);if(B)hJ(A,B);if(N)try{GH(F,{recursive:!0}),TD(X3(V,"oma-backend"),F,{recursive:!0,force:!0})}finally{zc(V,{recursive:!0,force:!0})}if(q){let p=X3(H,".agents","skills","oma-backend","variants","python");if(T9(p))GH(F,{recursive:!0}),TD(p,F,{recursive:!0,force:!0}),hJ(X3(F,"stack.yaml"),`language: python
|
|
1468
1468
|
framework: fastapi
|
|
1469
1469
|
orm: sqlalchemy
|
package/package.json
CHANGED