oh-my-agent 5.14.1 → 5.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +1 -0
  2. package/bin/cli.js +1 -1
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -54,6 +54,7 @@ Pick a preset and you're ready:
54
54
  | **oma-frontend** | React/Next.js, TypeScript, Tailwind CSS v4, shadcn/ui |
55
55
  | **oma-hwp** | HWP/HWPX/HWPML to Markdown conversion |
56
56
  | **oma-mobile** | Flutter cross-platform apps |
57
+ | **oma-observability** | OTel pipelines, metrics/logs/traces, SLO, incident forensics |
57
58
  | **oma-orchestrator** | Parallel agent execution via CLI |
58
59
  | **oma-pdf** | PDF to Markdown conversion |
59
60
  | **oma-pm** | Plans tasks, breaks down requirements, defines API contracts |
package/bin/cli.js CHANGED
@@ -1347,7 +1347,7 @@ print(json.dumps({
1347
1347
  }))
1348
1348
  `;function LY$(){return process.env.OMA_PYTHON??"python3"}function FY$($){if(BY$.some((J)=>$===J||$.endsWith(`.${J}`)))return["safari","chrome","firefox"];return["chrome","safari","firefox"]}async function NY$($,J,X){return new Promise((G)=>{let Q=qY$(LY$(),["-c",OY$],{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 MY$($,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 OV0($,J){let X=FY$($.hostname),G=[],Q=performance.now();for(let K of X){if(J.signal?.aborted)break;let U=performance.now(),W=await NY$($,K,J),H=Math.round(performance.now()-U);if(W.error==="curl_cffi_not_installed")return I6({url:$.toString(),strategy:"impersonate",error:Error("curl_cffi is not installed. Run: pip install curl_cffi")});if(W.error){G.push({target:K,detail:W.error});continue}let z=MY$(W,$.toString(),H),B=x4(z);if(Y$0(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:r8(z,B),strategy:"impersonate",platform:K,httpStatus:z.status,content:z.text,contentType:z.headers.get("content-type")??void 0,elapsedMs:Math.round(performance.now()-Q),signals:B};G.push({target:K,detail:`status=${z.status} size=${z.text.length}`})}let Y=Math.round(performance.now()-Q),Z=G.map((K)=>`${K.target}(${K.detail})`).join(" | ");return{...I6({url:$.toString(),strategy:"impersonate",error:Error(Z?`impersonate_failed: ${Z}`:"impersonate_failed")}),elapsedMs:Y,signals:[]}}var LV0="https://r.jina.ai/";function AY$($){let J=`${$.protocol}//${$.hostname}`,X=$.hostname.startsWith("m.")?$.hostname:`m.${$.hostname.replace(/^www\./,"")}`,G=new URL($.toString());return G.hostname=X,[{label:"jina",url:`${LV0}${$.toString()}`,headers:E3({accept:"text/plain"})},{label:"jina-json",url:`${LV0}${$.toString()}`,headers:E3({accept:"application/json"})},{label:"curl-desktop",url:$.toString(),headers:E3({userAgent:O5.desktopFirefox,referer:J})},{label:"curl-mobile",url:G.toString(),headers:E3({userAgent:O5.mobileSafari,referer:J})},{label:"curl-googlebot",url:$.toString(),headers:E3({userAgent:O5.googlebot})}]}function IY$($,J){if(!$.startsWith("jina"))return J;return J}async function FV0($,J){let X=AY$($),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=x4(W);if(U.label.startsWith("jina")){let z=G$0(W);if(z)throw Z=z,Error(`jina-quota:${z.detail}`)}if(!RY$(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:r8(U.resp,U.signals),strategy:"probe",platform:U.label,httpStatus:U.resp.status,content:IY$(U.label,U.resp.text),contentType:U.resp.headers.get("content-type")??void 0,elapsedMs:W,signals:Z?[...U.signals,Z]:U.signals}}catch(U){let W=Math.round(performance.now()-Q),H=Object.entries(Y).map(([z,B])=>`${z}:${B}`).join(" ");if(Z)return{...I6({url:$.toString(),error:Error(`probe failed — ${H}`),strategy:"probe"}),elapsedMs:W,signals:[Z]};return{...I6({url:$.toString(),error:U instanceof AggregateError?Error(H):U,strategy:"probe"}),elapsedMs:W}}}function RY$($,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 DY$=["api","probe","impersonate","browser","archive"];function TY$($){if($.only?.length)return $.only;let J=DY$.slice();if(!$.includeArchive)J=J.filter((X)=>X!=="archive");if($.skip?.length)J=J.filter((X)=>!$.skip?.includes(X));return J}async function NV0($,J,X){switch($){case"api":return await FL(J,X)??null;case"probe":return FV0(J,X);case"impersonate":return OV0(J,X);case"browser":return BV0(J,X);case"archive":return lU(J,X)}}function yu($){if($.status==="ok")return!0;if($.status==="auth-required"&&Z$0($.signals))return!0;return!1}function EY$($){return $.status==="auth-required"||$.status==="invalid-input"||$.status==="not-found"}async function PY$($){let J=Math.floor(Math.random()*500);await new Promise((X)=>setTimeout(X,$+J))}function wY$($){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 MV0($,J,X={}){let G=TY$(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 NV0(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(yu(W))return W.attempts=Q,W;if(EY$(W))return W.attempts=Q,W;if(X.retryOnRateLimit!==!1&&K$0(W.signals)&&!Y.has(U)){Y.add(U),await PY$(wY$(W.signals));let H=await NV0(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}),yu(H))return H.attempts=Q,H;Z=H;continue}}Z=W}if(!G.includes("archive")&&X.includeArchive!==!1){let U=await lU($,J);if(Q.push({strategy:"archive",platform:U.platform,status:U.status,httpStatus:U.httpStatus,elapsedMs:U.elapsedMs,signals:U.signals,error:U.error}),yu(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 Yq0=X$(Gq0(),1);var rZ$=["/rss","/feed","/atom.xml","/rss.xml","/index.xml"],tZ$=new Yq0.XMLParser({ignoreAttributes:!1,attributeNamePrefix:"@_",textNodeName:"#text"});function pu($){if($===void 0||$===null)return[];return Array.isArray($)?$:[$]}function X4($){if($==null)return;if(typeof $==="string")return $;if(typeof $==="object"){let J=$;if(typeof J["#text"]==="string")return J["#text"];if(typeof J["#cdata"]==="string")return J["#cdata"]}return}function Qq0($){for(let J of pu($)){let X=J?.["@_href"],G=J?.["@_rel"];if(typeof X==="string"&&(G===void 0||G==="alternate"))return X}return}function Zq0($){let J;try{J=tZ$.parse($)}catch{return null}let X=J.rss;if(X){let Q=X.channel;if(!Q)return null;let Y=pu(Q.item);return{kind:"rss",title:X4(Q.title),description:X4(Q.description),link:X4(Q.link),entries:Y.map((Z)=>({title:X4(Z.title),link:X4(Z.link),pubDate:X4(Z.pubDate),description:X4(Z.description),content:X4(Z["content:encoded"])??X4(Z.content)}))}}let G=J.feed;if(G){let Q=pu(G.entry);return{kind:"atom",title:X4(G.title),description:X4(G.subtitle),link:Qq0(G.link),entries:Q.map((Y)=>({title:X4(Y.title),link:Qq0(Y.link),pubDate:X4(Y.published)??X4(Y.updated),description:X4(Y.summary),content:X4(Y.content)??X4(Y.summary)}))}}return null}async function Kq0($,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=LL(Y.text).alternate?.[0]?.href}catch{}let Q=new Set;if(G)try{Q.add(new URL(G,$).toString())}catch{}for(let Y of rZ$)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=Zq0(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 Uq0($,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 pA={"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 eZ$($){return $.replace(/^www\./,"")}function $2$($){if($ in pA){let X=pA[$];return X?{...X}:null}let J=eZ$($);if(J in pA){let X=pA[J];return X?{...X}:null}return null}function J2$($){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 X2$($){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 Wq0($){let J=$2$($);if(J)return J;let X=J2$($);if(X)return X;let G=await X2$($);if(G)return G;return{domain:$,level:"unknown",score:null,tags:[],source:"heuristic"}}var Hq0=["api","probe","impersonate","browser","archive"];function zq0($){if(!$)return;let J=$.split(",").map((G)=>G.trim()).filter(Boolean),X=J.filter((G)=>!Hq0.includes(G));if(X.length>0)throw Error(`Unknown strategy: ${X.join(", ")}. Valid: ${Hq0.join(", ")}`);return J}function _2($){try{return new URL($)}catch{throw Error(`Invalid URL: ${$}`)}}function DX($){return{timeoutMs:$.timeout?Math.max(1000,Math.floor(Number($.timeout)*1000)):15000,locale:$.locale??"en-US,en;q=0.9"}}function b7($,J){if(J)console.log(JSON.stringify($,null,2));else console.log(JSON.stringify($))}function CG($){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 Vq0($){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=_2(X),Y=DX(G),Z=await MV0(Q,Y,{only:zq0(G.only),skip:zq0(G.skip),includeArchive:G.includeArchive});b7(Z,Boolean(G.pretty)),CG(Z)}catch(Q){console.error(b5.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=_2(X);if(!bx(Q)){console.error(b5.default.yellow(`No API handler matches host ${Q.hostname}`)),process.exitCode=3;return}let Z=DX(G),K=await FL(Q,Z);if(!K){process.exitCode=3;return}b7(K,Boolean(G.pretty)),CG(K)}catch(Q){console.error(b5.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=DX(G),Y=G.platforms?G.platforms.split(",").map((K)=>K.trim()).filter(Boolean):void 0,Z=await w$0(X,Q,Y);b7(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=_2(X),Y=DX(G),Z=await X$0(Q,Y),{content:K,...U}=Z;b7(U,Boolean(G.pretty)),CG(Z)}catch(Q){console.error(b5.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=_2(X),Y=DX(G),Z=await Kq0(Q,Y),{content:K,...U}=Z;b7(U,Boolean(G.pretty)),CG(Z)}catch(Q){console.error(b5.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=Uq0(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=_2(X),Y=DX(G),Z=G.subLang?G.subLang.split(",").map((U)=>U.trim()).filter(Boolean):void 0,K=await $$0(Q,Y,{subtitles:G.subs,...Z?{subLangs:Z}:{},...G.format?{format:G.format}:{}});b7(K,Boolean(G.pretty)),CG(K)}catch(Q){console.error(b5.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=_2(X),Y=DX(G),Z=await lU(Q,Y);b7(Z,Boolean(G.pretty)),CG(Z)}catch(Q){console.error(b5.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 Wq0(X.toLowerCase());b7(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=DX({}),Z=await e00(X,Y,{host:Q,...G.language?{language:G.language}:{},...G.repo?{repo:G.repo}:{},...G.limit?{limit:Number.parseInt(G.limit,10)}:{}});b7(Z,Boolean(G.pretty)),CG(Z)}),J.command("doctor").description("Check dependencies (Chrome, python3 curl_cffi, yt-dlp, gh)").action(async()=>{let X=[],G=ku();X.push({name:"chrome",ok:Boolean(G),detail:G??"Install Chrome or set OMA_CHROME_PATH"}),X.push(await lu("python3",["--version"])),X.push(await G2$()),X.push(await lu("yt-dlp",["--version"])),X.push(await lu("gh",["--version"]));for(let Q of X){let Y=Q.ok?b5.default.green("✓"):b5.default.yellow("!");console.log(`${Y} ${Q.name}: ${Q.detail}`)}if(X.some((Q)=>!Q.ok))process.exitCode=1})}async function lu($,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 G2$(){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)"})})})}s4();var TX=X$(h1(),1);import{execSync as Q2$,spawnSync as qq0}from"node:child_process";import{platform as Y2$}from"node:os";function Z2$(){let $=Y2$();if($==="darwin")return"brew install gh";if($==="win32")return"winget install GitHub.cli";return"sudo apt install gh"}async function Bq0(){if(console.clear(),u1(TX.default.bgMagenta(TX.default.white(" ⭐ oh-my-agent star "))),!tX()){let J=Z2$(),X=await Y4({message:`GitHub CLI (gh) is not installed. Install with ${TX.default.cyan(J)}?`});if(W1(X)||!X){F$("Install gh manually and try again.");return}let G=p8();G.start("Installing GitHub CLI...");let Q=qq0(J,{shell:!0,stdio:"pipe"});if(Q.status!==0){G.stop("Installation failed"),K1.error(Q.stderr?.toString()||"Unknown error"),F$("Please install gh manually.");return}G.stop("GitHub CLI installed!")}if(!W5()){K1.warn("GitHub CLI is not authenticated.");let J=await Y4({message:`Run ${TX.default.cyan("gh auth login")} now?`});if(W1(J)||!J){F$("Authenticate and try again.");return}if(qq0("gh",["auth","login"],{stdio:"inherit"}),!W5()){F$("Authentication was not completed. Try again.");return}K1.success("Authenticated!")}if(eX()){F$(`Already starred ${TX.default.cyan(g1)}! Thank you! \uD83D\uDE4F`);return}let $=await Y4({message:`Star ${TX.default.cyan(g1)} on GitHub?`});if(W1($)||!$){F$("Maybe next time!");return}try{Q2$(`gh api -X PUT /user/starred/${g1}`,{stdio:"ignore"}),F$(`Starred ${TX.default.cyan(g1)}! Thank you! \uD83C\uDF1F`)}catch{K1.error("Failed to star the repository."),F$("Please try again later.")}}function Oq0($){$.command("star").description("Star oh-my-agent on GitHub").action(O$(async()=>{await Bq0()}))}s4();wx();gK();var a9=X$(h1(),1);import{existsSync as lA,mkdirSync as K2$,readdirSync as U2$,readFileSync as W2$,writeFileSync as Lq0}from"node:fs";import{dirname as H2$,join as Fq0}from"node:path";function iu($){return Fq0($,".serena","metrics.json")}function du(){return{sessions:0,skillsUsed:{},tasksCompleted:0,totalSessionTime:0,filesChanged:0,linesAdded:0,linesRemoved:0,lastUpdated:new Date().toISOString(),startDate:new Date().toISOString()}}function z2$($){let J=iu($);if(lA(J))try{return JSON.parse(W2$(J,"utf-8"))}catch{return du()}return du()}function V2$($,J){let X=iu($),G=H2$(X);if(!lA(G))K2$(G,{recursive:!0});J.lastUpdated=new Date().toISOString(),Lq0(X,JSON.stringify(J,null,2),"utf-8")}function q2$($){let J=Fq0($,".serena","memories"),X={};if(!lA(J))return X;try{let G=U2$(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 Nq0($=!1,J=!1){let X=process.cwd(),G=iu(X);if(J){if(lA(G))Lq0(G,JSON.stringify(du(),null,2),"utf-8");if($)console.log(JSON.stringify({reset:!0}));else console.log(a9.default.green("✅ Metrics reset successfully."));return}let Q=z2$(X),Y=qL(X),Z=q2$(X),K=ol(X),U=cq(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,V2$(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(),u1(a9.default.bgMagenta(a9.default.white(" \uD83D\uDCCA oh-my-agent stats ")));let V=[a9.default.bold(`\uD83D\uDCC8 Productivity Metrics (${z} days)`),"┌─────────────────────┬──────────────┐",`│ ${a9.default.bold("Metric")} │ ${a9.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 │ ${a9.default.green(`+${Q.linesAdded}`).padEnd(12)} │`,`│ Lines Removed │ ${a9.default.red(`-${Q.linesRemoved}`).padEnd(12)} │`,"└─────────────────────┴──────────────┘"].join(`
1349
1349
  `);d0(V,"Overview");let q=Object.entries(Q.skillsUsed).sort(([,O],[,L])=>L-O).slice(0,5);if(q.length>0){let O=[a9.default.bold("\uD83C\uDFC6 Top Skills Used"),...q.map(([L,F],N)=>` ${N+1}. ${L} (${F})`)].join(`
1350
- `);d0(O,"Skills")}F$(a9.default.dim(`Data stored in: ${G}`))}function Mq0($){L6($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(O$(async(J)=>{await Nq0(G6(J),J.reset)},{supportsJsonOutput:!0}))}s4();var M4=X$(h1(),1);import{execSync as A2$}from"node:child_process";import{cpSync as nA,existsSync as s9,mkdirSync as Zz,readFileSync as x2,rmSync as nu,writeFileSync as _G}from"node:fs";import{tmpdir as I2$}from"node:os";import{dirname as Dq0,join as o6}from"node:path";var dA=X$(h1(),1);import{execSync as B2$,spawn as O2$}from"node:child_process";import{realpathSync as Aq0}from"node:fs";import Yz from"node:process";var SG="oh-my-agent";function L2$($=Yz.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(Yz.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=Aq0($).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(Yz.platform==="darwin")try{let X=B2$(`brew --prefix ${SG}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(X){let G=Aq0(X).replace(/\\/g,"/");if(J.startsWith(G))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${SG}`,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 ${SG}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(J.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${SG}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(J.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${SG}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${SG}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var Iq0=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function F2$($,J){let X=$.match(Iq0),G=J.match(Iq0);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 N2$($=SG,J=2000){try{let X=await sQ.get(`https://registry.npmjs.org/${$}/latest`,{timeout:J});return typeof X.data?.version==="string"?X.data.version:null}catch{return null}}async function Rq0($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(Yz.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(Yz.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let J=await N2$();if(!J)return{triggered:!1,reason:"fetch-failed"};if(!F2$($.currentVersion,J))return{triggered:!1,reason:"up-to-date",latest:J};let X=L2$();if(!X.updateCommand)return $.onNotice?.(dA.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. ${X.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:J};try{return O2$(X.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(dA.default.cyan(`global oh-my-agent ${$.currentVersion} → ${J} updating in background. New version applies on next run.`)),{triggered:!0,latest:J}}catch{return $.onNotice?.(dA.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. Run: ${X.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:J}}}var iA={name:"oh-my-agent",version:"5.14.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 R2$($){if(!$)return{intro:(X)=>u1(X),outro:(X)=>F$(X),note:(X,G)=>d0(X,G),logError:(X)=>K1.error(X),spinnerStart:(X)=>{let G=p8();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 D2$($,J){if($!==null)return"ready";return J?"legacy":"missing"}async function ou($=!1,J=!1){if(!J&&process.stdout.isTTY)console.clear();let X=R2$(J);X.intro(M4.default.bgMagenta(M4.default.white(" \uD83D\uDEF8 oh-my-agent update ")));let G=process.cwd();await Rq0({currentVersion:iA.version,enabled:je(G),onSpawnStart:(H)=>X.note(H,"CLI auto-update"),onNotice:(H)=>X.note(H,"CLI update available")});let Q=await iB(G),Y=zs(G),Z=D2$(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=V3(G);if(K.length>0)X.note(K.map((H)=>`${M4.default.green("✓")} ${H}`).join(`
1350
+ `);d0(O,"Skills")}F$(a9.default.dim(`Data stored in: ${G}`))}function Mq0($){L6($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(O$(async(J)=>{await Nq0(G6(J),J.reset)},{supportsJsonOutput:!0}))}s4();var M4=X$(h1(),1);import{execSync as A2$}from"node:child_process";import{cpSync as nA,existsSync as s9,mkdirSync as Zz,readFileSync as x2,rmSync as nu,writeFileSync as _G}from"node:fs";import{tmpdir as I2$}from"node:os";import{dirname as Dq0,join as o6}from"node:path";var dA=X$(h1(),1);import{execSync as B2$,spawn as O2$}from"node:child_process";import{realpathSync as Aq0}from"node:fs";import Yz from"node:process";var SG="oh-my-agent";function L2$($=Yz.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(Yz.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=Aq0($).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(Yz.platform==="darwin")try{let X=B2$(`brew --prefix ${SG}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(X){let G=Aq0(X).replace(/\\/g,"/");if(J.startsWith(G))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${SG}`,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 ${SG}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(J.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${SG}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(J.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${SG}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${SG}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var Iq0=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function F2$($,J){let X=$.match(Iq0),G=J.match(Iq0);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 N2$($=SG,J=2000){try{let X=await sQ.get(`https://registry.npmjs.org/${$}/latest`,{timeout:J});return typeof X.data?.version==="string"?X.data.version:null}catch{return null}}async function Rq0($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(Yz.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(Yz.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let J=await N2$();if(!J)return{triggered:!1,reason:"fetch-failed"};if(!F2$($.currentVersion,J))return{triggered:!1,reason:"up-to-date",latest:J};let X=L2$();if(!X.updateCommand)return $.onNotice?.(dA.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. ${X.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:J};try{return O2$(X.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(dA.default.cyan(`global oh-my-agent ${$.currentVersion} → ${J} updating in background. New version applies on next run.`)),{triggered:!0,latest:J}}catch{return $.onNotice?.(dA.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. Run: ${X.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:J}}}var iA={name:"oh-my-agent",version:"5.14.2",description:"Portable multi-agent harness for .agents-based skills and workflows across Antigravity, Claude Code, Codex, OpenCode, and more",type:"module",bin:{"oh-my-agent":"./bin/cli.js",oma:"./bin/cli.js"},files:["bin"],keywords:["oh-my-agent","antigravity",".agents","agent","skills","agent-skills","multi-agent","orchestrator","claude","claude-code","codex","opencode","copilot","cursor","chatgpt","pm","frontend","backend","mobile","qa","debug","terraform","database","workflow","bug-fixing","gemini"],author:"our.first.fluke <our.first.fluke@gmail.com>",contributors:["gracefullight <gracefullight.dev@gmail.com>","gahyun-git <go4it.gh@gmail.com>"],license:"MIT",funding:[{type:"github",url:"https://github.com/sponsors/first-fluke"},{type:"buymeacoffee",url:"https://buymeacoffee.com/firstfluke"}],scripts:{"sync:readme":"node ./scripts/sync-readme.mjs",build:"bun run sync:readme && bun build cli.ts --outfile bin/cli.js --target node --minify",dev:"bun run cli.ts",lint:"biome check --write --unsafe .","check:boundaries":"node ./scripts/check-boundaries.mjs",test:"vitest run","test:coverage":"vitest run --coverage",prepublishOnly:"bun run build"},dependencies:{"@clack/prompts":"^1.1.0","@date-fns/tz":"^1.4.1",axios:"^1.15.0","better-sqlite3":"^12.9.0",chokidar:"^5.0.0",commander:"^14.0.3","date-fns":"^4.1.0","fast-xml-parser":"^4","p-map":"^7.0.4",picocolors:"^1.1.1","puppeteer-core":"^24","smol-toml":"^1.6.1",ws:"^8.18.0",yaml:"^2.8.2",zod:"^4.3.6"},devDependencies:{"@biomejs/biome":"2.4.5","@types/better-sqlite3":"^7.6.13","@types/ws":"^8.18.1","@vitest/coverage-v8":"^4.1.4",typescript:"^6",vitest:"^4.0.18"},repository:{type:"git",url:"https://github.com/first-fluke/oh-my-agent"},antigravity:{skillsPath:".agents/skills",skills:["oma-architecture","oma-brainstorm","oma-coordination","oma-pm","oma-frontend","oma-backend","oma-db","oma-mobile","oma-qa","oma-debug","oma-orchestrator","oma-dev-workflow","oma-tf-infra","oma-scm","oma-pdf","oma-recap"]}};function R2$($){if(!$)return{intro:(X)=>u1(X),outro:(X)=>F$(X),note:(X,G)=>d0(X,G),logError:(X)=>K1.error(X),spinnerStart:(X)=>{let G=p8();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 D2$($,J){if($!==null)return"ready";return J?"legacy":"missing"}async function ou($=!1,J=!1){if(!J&&process.stdout.isTTY)console.clear();let X=R2$(J);X.intro(M4.default.bgMagenta(M4.default.white(" \uD83D\uDEF8 oh-my-agent update ")));let G=process.cwd();await Rq0({currentVersion:iA.version,enabled:je(G),onSpawnStart:(H)=>X.note(H,"CLI auto-update"),onNotice:(H)=>X.note(H,"CLI update available")});let Q=await iB(G),Y=zs(G),Z=D2$(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=V3(G);if(K.length>0)X.note(K.map((H)=>`${M4.default.green("✓")} ${H}`).join(`
1351
1351
  `),"Migration");let U=K.length>0||LS(G);if(K.length>0&&!LS(G))FS(G,!0);if(!J)await qB(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 Vs();if(Q===H.version&&!U){W.stop(M4.default.green("Already up to date!")),X.outro(`Current version: ${M4.default.cyan(Q)}`);return}let z=Q===H.version;W.message(`Downloading ${M4.default.cyan(H.version)}...`);let{dir:B,cleanup:V}=await dB();try{W.message("Copying files..."),V3(G);let q=o6(G,".agents","oma-config.yaml"),O=o6(G,".agents","mcp.json"),L=!$&&s9(q)?x2(q):null,F=!$&&s9(O)?x2(O):null,N=o6(I2$(),`oma-stack-backup-${Date.now()}`),A=o6(G,".agents","skills","oma-backend","stack"),I=!$&&s9(A);if(I)Zz(N,{recursive:!0}),nA(A,o6(N,"oma-backend"),{recursive:!0});let T=["snippets.md","tech-stack.md","api-template.py"],w=o6(G,".agents","skills","oma-backend","resources"),D=!$&&!I&&T.some((d)=>s9(o6(w,d)));if(nA(o6(B,".agents"),o6(G,".agents"),{recursive:!0,force:!0}),L)_G(q,L);if(F)_G(O,F);if(I)try{Zz(A,{recursive:!0}),nA(o6(N,"oma-backend"),A,{recursive:!0,force:!0})}finally{nu(N,{recursive:!0,force:!0})}if(D){let d=o6(B,".agents","skills","oma-backend","variants","python");if(s9(d))Zz(A,{recursive:!0}),nA(d,A,{recursive:!0,force:!0}),_G(o6(A,"stack.yaml"),`language: python
1352
1352
  framework: fastapi
1353
1353
  orm: sqlalchemy
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-agent",
3
- "version": "5.14.1",
3
+ "version": "5.14.2",
4
4
  "description": "Portable multi-agent harness for .agents-based skills and workflows across Antigravity, Claude Code, Codex, OpenCode, and more",
5
5
  "type": "module",
6
6
  "bin": {