oh-my-agent 6.16.0 → 6.16.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.
Files changed (3) hide show
  1. package/README.md +1 -1
  2. package/bin/cli.js +1 -1
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -72,7 +72,7 @@ Pick a preset and you're ready:
72
72
  | **oma-debug** | Root cause analysis, fixes, regression tests |
73
73
  | **oma-design** | Design systems, tokens, accessibility, responsive |
74
74
  | **oma-dev-workflow** | CI/CD, releases, monorepo automation |
75
- | **oma-docs** | Documentation drift detection — verify code↔docs refs, sync diff-affected docs |
75
+ | **oma-docs** | Reference integrity checks, diff-affected doc detection |
76
76
  | **oma-frontend** | React/Next.js, TypeScript, Tailwind CSS v4, shadcn/ui |
77
77
  | **oma-hwp** | HWP/HWPX/HWPML to Markdown conversion |
78
78
  | **oma-image** | Multi-vendor AI image generation |
package/bin/cli.js CHANGED
@@ -1416,7 +1416,7 @@ print(json.dumps({
1416
1416
  }))
1417
1417
  `;function MN$(){return process.env.OMA_PYTHON??"python3"}function AN$($){if(FN$.some((J)=>$===J||$.endsWith(`.${J}`)))return["safari","chrome","firefox"];return["chrome","safari","firefox"]}async function DN$($,J,X){return new Promise((G)=>{let Y=ON$(MN$(),["-c",NN$],{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"]}),Q="",Z="";Y.stdout.on("data",(U)=>{Q+=U.toString()}),Y.stderr.on("data",(U)=>{Z+=U.toString()});let K=()=>{Y.kill("SIGTERM")};X.signal?.addEventListener("abort",K),Y.on("close",(U)=>{if(X.signal?.removeEventListener("abort",K),U!==0&&!Q){G({error:`python_exit:${U}:${Z.trim().slice(0,200)}`});return}let W=Q.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)}`})}}),Y.on("error",(U)=>{X.signal?.removeEventListener("abort",K),G({error:`spawn_error:${U.message}`})})})}function RN$($,J,X){let G=new Headers;if($.headers)for(let[Y,Q]of Object.entries($.headers))try{G.set(Y,Q)}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 FM0($,J){let X=AN$($.hostname),G=[],Y=performance.now();for(let K of X){if(J.signal?.aborted)break;let U=performance.now(),W=await DN$($,K,J),H=Math.round(performance.now()-U);if(W.error==="curl_cffi_not_installed")return x6({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 q=RN$(W,$.toString(),H),z=s4(q);if(K70(z))return{url:$.toString(),status:"blocked",strategy:"impersonate",platform:K,httpStatus:q.status,content:q.text,contentType:q.headers.get("content-type")??void 0,elapsedMs:Math.round(performance.now()-Y),signals:z,error:"js-essential-markers-detected"};if(q.ok&&q.text.length>=200)return{url:$.toString(),status:D9(q,z),strategy:"impersonate",platform:K,httpStatus:q.status,content:q.text,contentType:q.headers.get("content-type")??void 0,elapsedMs:Math.round(performance.now()-Y),signals:z};G.push({target:K,detail:`status=${q.status} size=${q.text.length}`})}let Q=Math.round(performance.now()-Y),Z=G.map((K)=>`${K.target}(${K.detail})`).join(" | ");return{...x6({url:$.toString(),strategy:"impersonate",error:Error(Z?`impersonate_failed: ${Z}`:"impersonate_failed")}),elapsedMs:Q,signals:[]}}var NM0="https://r.jina.ai/";function IN$($){let J=`${$.protocol}//${$.hostname}`,X=$.hostname.startsWith("m.")?$.hostname:`m.${$.hostname.replace(/^www\./,"")}`,G=new URL($.toString());return G.hostname=X,[{label:"jina",url:`${NM0}${$.toString()}`,headers:EG({accept:"text/plain"})},{label:"jina-json",url:`${NM0}${$.toString()}`,headers:EG({accept:"application/json"})},{label:"curl-desktop",url:$.toString(),headers:EG({userAgent:a5.desktopFirefox,referer:J})},{label:"curl-mobile",url:G.toString(),headers:EG({userAgent:a5.mobileSafari,referer:J})},{label:"curl-googlebot",url:$.toString(),headers:EG({userAgent:a5.googlebot})}]}function TN$($,J){if(!$.startsWith("jina"))return J;return J}async function MM0($,J){let X=IN$($),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 Y=performance.now(),Q={},Z=null,K=X.map(async(U)=>{let W=await f6(U.url,{headers:U.headers,timeoutMs:J.timeoutMs,signal:G.signal,locale:J.locale}),H=s4(W);if(U.label.startsWith("jina")){let q=Q70(W);if(q)throw Z=q,Error(`jina-quota:${q.detail}`)}if(!EN$(W,H))throw Q[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()-Y);return{url:$.toString(),status:D9(U.resp,U.signals),strategy:"probe",platform:U.label,httpStatus:U.resp.status,content:TN$(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()-Y),H=Object.entries(Q).map(([q,z])=>`${q}:${z}`).join(" ");if(Z)return{...x6({url:$.toString(),error:Error(`probe failed — ${H}`),strategy:"probe"}),elapsedMs:W,signals:[Z]};return{...x6({url:$.toString(),error:U instanceof AggregateError?Error(H):U,strategy:"probe"}),elapsedMs:W}}}function EN$($,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 wN$=["api","probe","impersonate","browser","archive"];function jN$($){if($.only?.length)return $.only;let J=wN$.slice();if(!$.includeArchive)J=J.filter((X)=>X!=="archive");if($.skip?.length)J=J.filter((X)=>!$.skip?.includes(X));return J}async function AM0($,J,X){switch($){case"api":return await SN(J,X)??null;case"probe":return MM0(J,X);case"impersonate":return FM0(J,X);case"browser":return OM0(J,X);case"archive":return PH(J,X)}}function Vp($){if($.status==="ok")return!0;if($.status==="auth-required"&&U70($.signals))return!0;return!1}function PN$($){return $.status==="auth-required"||$.status==="invalid-input"||$.status==="not-found"}async function CN$($){let J=Math.floor(Math.random()*500);await new Promise((X)=>setTimeout(X,$+J))}function _N$($){let J=$.find((Y)=>Y.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 DM0($,J,X={}){let G=jN$(X),Y=[],Q=new Set,Z=null,K=!1;for(let U of G){if(J.signal?.aborted)break;if(K&&U==="impersonate")continue;let W=await AM0(U,$,J);if(!W)continue;if(Y.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(Vp(W))return W.attempts=Y,W;if(PN$(W))return W.attempts=Y,W;if(X.retryOnRateLimit!==!1&&W70(W.signals)&&!Q.has(U)){Q.add(U),await CN$(_N$(W.signals));let H=await AM0(U,$,J);if(H){if(Y.push({strategy:U,platform:H.platform,status:H.status,httpStatus:H.httpStatus,elapsedMs:H.elapsedMs,signals:H.signals,error:H.error}),Vp(H))return H.attempts=Y,H;Z=H;continue}}Z=W}if(!G.includes("archive")&&X.includeArchive!==!1){let U=await PH($,J);if(Y.push({strategy:"archive",platform:U.platform,status:U.status,httpStatus:U.httpStatus,elapsedMs:U.elapsedMs,signals:U.signals,error:U.error}),Vp(U))return U.attempts=Y,U;Z=U}if(Z)return Z.attempts=Y,Z;return{url:$.toString(),status:"error",strategy:G[0]??"probe",content:"",elapsedMs:0,signals:[],attempts:Y,error:"all strategies failed"}}var KA0=o0(QA0(),1);var $A$=["/rss","/feed","/atom.xml","/rss.xml","/index.xml"],JA$=new KA0.XMLParser({ignoreAttributes:!1,attributeNamePrefix:"@_",textNodeName:"#text"});function Mp($){if($===void 0||$===null)return[];return Array.isArray($)?$:[$]}function O4($){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 ZA0($){for(let J of Mp($)){let X=J?.["@_href"],G=J?.["@_rel"];if(typeof X==="string"&&(G===void 0||G==="alternate"))return X}return}function UA0($){let J;try{J=JA$.parse($)}catch{return null}let X=J.rss;if(X){let Y=X.channel;if(!Y)return null;let Q=Mp(Y.item);return{kind:"rss",title:O4(Y.title),description:O4(Y.description),link:O4(Y.link),entries:Q.map((Z)=>({title:O4(Z.title),link:O4(Z.link),pubDate:O4(Z.pubDate),description:O4(Z.description),content:O4(Z["content:encoded"])??O4(Z.content)}))}}let G=J.feed;if(G){let Y=Mp(G.entry);return{kind:"atom",title:O4(G.title),description:O4(G.subtitle),link:ZA0(G.link),entries:Y.map((Q)=>({title:O4(Q.title),link:ZA0(Q.link),pubDate:O4(Q.published)??O4(Q.updated),description:O4(Q.summary),content:O4(Q.content)??O4(Q.summary)}))}}return null}async function WA0($,J){let X=performance.now(),G;try{let Q=await f6($.toString(),{timeoutMs:J.timeoutMs,locale:J.locale,signal:J.signal});if(Q.ok)G=_N(Q.text).alternate?.[0]?.href}catch{}let Y=new Set;if(G)try{Y.add(new URL(G,$).toString())}catch{}for(let Q of $A$)Y.add(new URL(Q,`${$.protocol}//${$.host}`).toString());for(let Q of Y){if(J.signal?.aborted)break;try{let Z=await f6(Q,{timeoutMs:J.timeoutMs,locale:J.locale,signal:J.signal});if(!Z.ok||Z.text.length<50)continue;let K=UA0(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:Q,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 HA0($,J="en-US"){let[X,G]=J.split("-"),Y=new URL("https://news.google.com/rss/search");return Y.searchParams.set("q",$),Y.searchParams.set("hl",X??"en"),Y.searchParams.set("gl",G??"US"),Y.searchParams.set("ceid",`${G??"US"}:${X??"en"}`),Y.toString()}var GI={"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 XA$($){return $.replace(/^www\./,"")}function GA$($){if($ in GI){let X=GI[$];return X?{...X}:null}let J=XA$($);if(J in GI){let X=GI[J];return X?{...X}:null}return null}function YA$($){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 QA$($){try{let J=await f6(`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 Y=G<1e4?0.6:G<1e5?0.4:0.2;return{domain:$,level:G<1e4?"community":"external",score:Y,tags:["tranco"],source:"tranco",rank:G}}catch{return null}}async function qA0($){let J=GA$($);if(J)return J;let X=YA$($);if(X)return X;let G=await QA$($);if(G)return G;return{domain:$,level:"unknown",score:null,tags:[],source:"heuristic"}}var VA0=["api","probe","impersonate","browser","archive"];function zA0($){if(!$)return;let J=$.split(",").map((G)=>G.trim()).filter(Boolean),X=J.filter((G)=>!VA0.includes(G));if(X.length>0)throw Error(`Unknown strategy: ${X.join(", ")}. Valid: ${VA0.join(", ")}`);return J}function eK($){try{return new URL($)}catch{throw Error(`Invalid URL: ${$}`)}}function z3($){return{timeoutMs:$.timeout?Math.max(1000,Math.floor(Number($.timeout)*1000)):15000,locale:$.locale??"en-US,en;q=0.9"}}function NJ($,J){if(J)console.log(JSON.stringify($,null,2));else console.log(JSON.stringify($))}function CY($){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 BA0($){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 Y=eK(X),Q=z3(G),Z=await DM0(Y,Q,{only:zA0(G.only),skip:zA0(G.skip),includeArchive:G.includeArchive});NJ(Z,Boolean(G.pretty)),CY(Z)}catch(Y){console.error(B7.default.red(Y.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 Y=eK(X);if(!Hk(Y)){console.error(B7.default.yellow(`No API handler matches host ${Y.hostname}`)),process.exitCode=3;return}let Z=z3(G),K=await SN(Y,Z);if(!K){process.exitCode=3;return}NJ(K,Boolean(G.pretty)),CY(K)}catch(Y){console.error(B7.default.red(Y.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 Y=z3(G),Q=G.platforms?G.platforms.split(",").map((K)=>K.trim()).filter(Boolean):void 0,Z=await C70(X,Y,Q);NJ(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 Y=eK(X),Q=z3(G),Z=await Y70(Y,Q),{content:K,...U}=Z;NJ(U,Boolean(G.pretty)),CY(Z)}catch(Y){console.error(B7.default.red(Y.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 Y=eK(X),Q=z3(G),Z=await WA0(Y,Q),{content:K,...U}=Z;NJ(U,Boolean(G.pretty)),CY(Z)}catch(Y){console.error(B7.default.red(Y.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 Y=HA0(X,G.locale??"en-US");console.log(Y)}),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 Y=eK(X),Q=z3(G),Z=G.subLang?G.subLang.split(",").map((U)=>U.trim()).filter(Boolean):void 0,K=await X70(Y,Q,{subtitles:G.subs,...Z?{subLangs:Z}:{},...G.format?{format:G.format}:{}});NJ(K,Boolean(G.pretty)),CY(K)}catch(Y){console.error(B7.default.red(Y.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 Y=eK(X),Q=z3(G),Z=await PH(Y,Q);NJ(Z,Boolean(G.pretty)),CY(Z)}catch(Y){console.error(B7.default.red(Y.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 Y=await qA0(X.toLowerCase());NJ(Y,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 Y=G.host==="gitlab"||G.host==="github"?G.host:"github",Q=z3({}),Z=await J70(X,Q,{host:Y,...G.language?{language:G.language}:{},...G.repo?{repo:G.repo}:{},...G.limit?{limit:Number.parseInt(G.limit,10)}:{}});NJ(Z,Boolean(G.pretty)),CY(Z)}),J.command("doctor").description("Check dependencies (Chrome, python3 curl_cffi, yt-dlp, gh)").action(async()=>{let X=[],G=qp();X.push({name:"chrome",ok:Boolean(G),detail:G??"Install Chrome or set OMA_CHROME_PATH"}),X.push(await Ap("python3",["--version"])),X.push(await ZA$()),X.push(await Ap("yt-dlp",["--version"])),X.push(await Ap("gh",["--version"]));for(let Y of X){let Q=Y.ok?B7.default.green("✓"):B7.default.yellow("!");console.log(`${Q} ${Y.name}: ${Y.detail}`)}if(X.some((Y)=>!Y.ok))process.exitCode=1})}async function Ap($,J){return new Promise((X)=>{let{spawn:G}=Q0("node:child_process"),Y=G($,J,{stdio:["ignore","pipe","pipe"]}),Q="";Y.stdout?.on("data",(Z)=>{Q+=Z.toString()}),Y.on("error",()=>X({name:$,ok:!1,detail:"not found"})),Y.on("close",(Z)=>{if(Z===0)X({name:$,ok:!0,detail:Q.trim()});else X({name:$,ok:!1,detail:`exit code ${Z}`})})})}async function ZA$(){return new Promise(($)=>{let{spawn:J}=Q0("node:child_process"),X=J("python3",["-c","import curl_cffi; print(curl_cffi.__version__)"],{stdio:["ignore","pipe","pipe"]}),G="";X.stdout?.on("data",(Y)=>{G+=Y.toString()}),X.on("error",()=>$({name:"curl_cffi",ok:!1,detail:"python3 not found"})),X.on("close",(Y)=>{if(Y===0)$({name:"curl_cffi",ok:!0,detail:`v${G.trim()}`});else $({name:"curl_cffi",ok:!1,detail:"not installed (pip install curl_cffi)"})})})}O8();var B3=o0(I1(),1);import{execSync as KA$,spawnSync as LA0}from"node:child_process";import{platform as UA$}from"node:os";function WA$(){let $=UA$();if($==="darwin")return"brew install gh";if($==="win32")return"winget install GitHub.cli";return"sudo apt install gh"}async function OA0(){if(console.clear(),u1(B3.default.bgMagenta(B3.default.white(" ⭐ oh-my-agent star "))),!p3()){let J=WA$(),X=await K4({message:`GitHub CLI (gh) is not installed. Install with ${B3.default.cyan(J)}?`});if(q1(X)||!X){P$("Install gh manually and try again.");return}let G=q9();G.start("Installing GitHub CLI...");let Y=LA0(J,{shell:!0,stdio:"pipe"});if(Y.status!==0){G.stop("Installation failed"),s$.error(Y.stderr?.toString()||"Unknown error"),P$("Please install gh manually.");return}G.stop("GitHub CLI installed!")}if(!m5()){s$.warn("GitHub CLI is not authenticated.");let J=await K4({message:`Run ${B3.default.cyan("gh auth login")} now?`});if(q1(J)||!J){P$("Authenticate and try again.");return}if(LA0("gh",["auth","login"],{stdio:"inherit"}),!m5()){P$("Authentication was not completed. Try again.");return}s$.success("Authenticated!")}if(l3()){P$(`Already starred ${B3.default.cyan(s1)}! Thank you! \uD83D\uDE4F`);return}let $=await K4({message:`Star ${B3.default.cyan(s1)} on GitHub?`});if(q1($)||!$){P$("Maybe next time!");return}try{KA$(`gh api -X PUT /user/starred/${s1}`,{stdio:"ignore"}),P$(`Starred ${B3.default.cyan(s1)}! Thank you! \uD83C\uDF1F`)}catch{s$.error("Failed to star the repository."),P$("Please try again later.")}}function FA0($){$.command("star").description("Star oh-my-agent on GitHub").action(z$(async()=>{await OA0()}))}O8();Jk();VW();var D5=o0(I1(),1);import{existsSync as YI,mkdirSync as HA$,readdirSync as qA$,readFileSync as VA$,writeFileSync as NA0}from"node:fs";import{dirname as zA$,join as MA0}from"node:path";function Rp($){return MA0($,".serena","metrics.json")}function Dp(){return{sessions:0,skillsUsed:{},tasksCompleted:0,totalSessionTime:0,filesChanged:0,linesAdded:0,linesRemoved:0,lastUpdated:new Date().toISOString(),startDate:new Date().toISOString()}}function BA$($){let J=Rp($);if(YI(J))try{return JSON.parse(VA$(J,"utf-8"))}catch{return Dp()}return Dp()}function LA$($,J){let X=Rp($),G=zA$(X);if(!YI(G))HA$(G,{recursive:!0});J.lastUpdated=new Date().toISOString(),NA0(X,JSON.stringify(J,null,2),"utf-8")}function OA$($){let J=MA0($,".serena","memories"),X={};if(!YI(J))return X;try{let G=qA$(J);for(let Y of G){let Q=Y.match(/(?:progress|result)-(\w+)/);if(Q?.[1]){let Z=Q[1];X[Z]=(X[Z]||0)+1}}}catch{}return X}async function AA0($=!1,J=!1){let X=process.cwd(),G=Rp(X);if(J){if(YI(G))NA0(G,JSON.stringify(Dp(),null,2),"utf-8");if($)console.log(JSON.stringify({reset:!0}));else console.log(D5.default.green("✅ Metrics reset successfully."));return}let Y=BA$(X),Q=RN(X),Z=OA$(X),K=ao(X),U=vL(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[L,O]of Object.entries(Z))Y.skillsUsed[L]=(Y.skillsUsed[L]||0)+O;if(K>Y.tasksCompleted)Y.tasksCompleted=K;if(U.id){if(["completed","failed","aborted"].includes(U.status||"")&&(Y.lastSessionId!==U.id||Y.lastSessionStatus!==U.status)&&H>0)Y.totalSessionTime+=H;Y.lastSessionId=U.id,Y.lastSessionStatus=U.status,Y.lastSessionStarted=U.startedAt,Y.lastSessionDuration=H}Y.filesChanged+=Q.filesChanged,Y.linesAdded+=Q.linesAdded,Y.linesRemoved+=Q.linesRemoved,Y.sessions+=1,LA$(X,Y);let q=Math.max(1,Math.ceil((Date.now()-new Date(Y.startDate).getTime())/86400000)),z=Y.sessions>0?Math.round(Y.totalSessionTime/Y.sessions):0;if($){console.log(JSON.stringify({...Y,gitStats:Q,daysSinceStart:q,avgSessionTime:z},null,2));return}console.clear(),u1(D5.default.bgMagenta(D5.default.white(" \uD83D\uDCCA oh-my-agent stats ")));let V=[D5.default.bold(`\uD83D\uDCC8 Productivity Metrics (${q} days)`),"┌─────────────────────┬──────────────┐",`│ ${D5.default.bold("Metric")} │ ${D5.default.bold("Value")} │`,"├─────────────────────┼──────────────┤",`│ Sessions │ ${String(Y.sessions).padEnd(12)} │`,`│ Tasks Completed │ ${String(Y.tasksCompleted).padEnd(12)} │`,`│ Files Changed │ ${String(Y.filesChanged).padEnd(12)} │`,`│ Lines Added │ ${D5.default.green(`+${Y.linesAdded}`).padEnd(12)} │`,`│ Lines Removed │ ${D5.default.red(`-${Y.linesRemoved}`).padEnd(12)} │`,"└─────────────────────┴──────────────┘"].join(`
1418
1418
  `);G$(V,"Overview");let B=Object.entries(Y.skillsUsed).sort(([,L],[,O])=>O-L).slice(0,5);if(B.length>0){let L=[D5.default.bold("\uD83C\uDFC6 Top Skills Used"),...B.map(([O,F],N)=>` ${N+1}. ${O} (${F})`)].join(`
1419
- `);G$(L,"Skills")}P$(D5.default.dim(`Data stored in: ${G}`))}function DA0($){E6($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(z$(async(J)=>{await AA0(H6(J),J.reset)},{supportsJsonOutput:!0}))}O8();var k4=o0(I1(),1);import{execSync as IA$}from"node:child_process";import{cpSync as KI,existsSync as R5,mkdirSync as lV,readFileSync as $U,rmSync as Ip,writeFileSync as SY}from"node:fs";import{tmpdir as TA$}from"node:os";import{dirname as EA0,join as Y4}from"node:path";var QI=o0(I1(),1);import{execSync as FA$,spawn as NA$}from"node:child_process";import{realpathSync as RA0}from"node:fs";import pV from"node:process";var _Y="oh-my-agent";function MA$($=pV.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(pV.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=RA0($).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(pV.platform==="darwin")try{let X=FA$(`brew --prefix ${_Y}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(X){let G=RA0(X).replace(/\\/g,"/");if(J.startsWith(G))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${_Y}`,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 ${_Y}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(J.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${_Y}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(J.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${_Y}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${_Y}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var IA0=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function AA$($,J){let X=$.match(IA0),G=J.match(IA0);if(!X||!G)return!1;for(let Y=1;Y<=3;Y++){let Q=Number(X[Y]),Z=Number(G[Y]);if(Q<Z)return!0;if(Q>Z)return!1}return!1}async function DA$($=_Y,J=2000){try{let X=await UX.get(`https://registry.npmjs.org/${$}/latest`,{timeout:J});return typeof X.data?.version==="string"?X.data.version:null}catch{return null}}async function TA0($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(pV.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(pV.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let J=await DA$();if(!J)return{triggered:!1,reason:"fetch-failed"};if(!AA$($.currentVersion,J))return{triggered:!1,reason:"up-to-date",latest:J};let X=MA$();if(!X.updateCommand)return $.onNotice?.(QI.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. ${X.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:J};try{return NA$(X.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(QI.default.cyan(`global oh-my-agent ${$.currentVersion} → ${J} updating in background. New version applies on next run.`)),{triggered:!0,latest:J}}catch{return $.onNotice?.(QI.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. Run: ${X.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:J}}}var ZI={name:"oh-my-agent",version:"6.16.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",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/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 EA$($){if(!$)return{intro:(X)=>u1(X),outro:(X)=>P$(X),note:(X,G)=>G$(X,G),logError:(X)=>s$.error(X),spinnerStart:(X)=>{let G=q9();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 wA$($,J){if($!==null)return"ready";return J?"legacy":"missing"}async function Tp($=!1,J=!1){if(!J&&process.stdout.isTTY)console.clear();let X=EA$(J);X.intro(k4.default.bgMagenta(k4.default.white(" \uD83D\uDEF8 oh-my-agent update ")));let G=process.cwd();await TA0({currentVersion:ZI.version,enabled:K90(G),onSpawnStart:(H)=>X.note(H,"CLI auto-update"),onNotice:(H)=>X.note(H,"CLI update available")});let Y=await GF(G),Q=l10(G),Z=wA$(Y,Q);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=qG(G);if(K.length>0)X.note(K.map((H)=>`${k4.default.green("✓")} ${H}`).join(`
1419
+ `);G$(L,"Skills")}P$(D5.default.dim(`Data stored in: ${G}`))}function DA0($){E6($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(z$(async(J)=>{await AA0(H6(J),J.reset)},{supportsJsonOutput:!0}))}O8();var k4=o0(I1(),1);import{execSync as IA$}from"node:child_process";import{cpSync as KI,existsSync as R5,mkdirSync as lV,readFileSync as $U,rmSync as Ip,writeFileSync as SY}from"node:fs";import{tmpdir as TA$}from"node:os";import{dirname as EA0,join as Y4}from"node:path";var QI=o0(I1(),1);import{execSync as FA$,spawn as NA$}from"node:child_process";import{realpathSync as RA0}from"node:fs";import pV from"node:process";var _Y="oh-my-agent";function MA$($=pV.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(pV.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=RA0($).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(pV.platform==="darwin")try{let X=FA$(`brew --prefix ${_Y}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(X){let G=RA0(X).replace(/\\/g,"/");if(J.startsWith(G))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${_Y}`,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 ${_Y}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(J.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${_Y}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(J.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${_Y}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${_Y}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var IA0=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function AA$($,J){let X=$.match(IA0),G=J.match(IA0);if(!X||!G)return!1;for(let Y=1;Y<=3;Y++){let Q=Number(X[Y]),Z=Number(G[Y]);if(Q<Z)return!0;if(Q>Z)return!1}return!1}async function DA$($=_Y,J=2000){try{let X=await UX.get(`https://registry.npmjs.org/${$}/latest`,{timeout:J});return typeof X.data?.version==="string"?X.data.version:null}catch{return null}}async function TA0($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(pV.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(pV.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let J=await DA$();if(!J)return{triggered:!1,reason:"fetch-failed"};if(!AA$($.currentVersion,J))return{triggered:!1,reason:"up-to-date",latest:J};let X=MA$();if(!X.updateCommand)return $.onNotice?.(QI.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. ${X.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:J};try{return NA$(X.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(QI.default.cyan(`global oh-my-agent ${$.currentVersion} → ${J} updating in background. New version applies on next run.`)),{triggered:!0,latest:J}}catch{return $.onNotice?.(QI.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. Run: ${X.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:J}}}var ZI={name:"oh-my-agent",version:"6.16.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",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/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 EA$($){if(!$)return{intro:(X)=>u1(X),outro:(X)=>P$(X),note:(X,G)=>G$(X,G),logError:(X)=>s$.error(X),spinnerStart:(X)=>{let G=q9();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 wA$($,J){if($!==null)return"ready";return J?"legacy":"missing"}async function Tp($=!1,J=!1){if(!J&&process.stdout.isTTY)console.clear();let X=EA$(J);X.intro(k4.default.bgMagenta(k4.default.white(" \uD83D\uDEF8 oh-my-agent update ")));let G=process.cwd();await TA0({currentVersion:ZI.version,enabled:K90(G),onSpawnStart:(H)=>X.note(H,"CLI auto-update"),onNotice:(H)=>X.note(H,"CLI update available")});let Y=await GF(G),Q=l10(G),Z=wA$(Y,Q);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=qG(G);if(K.length>0)X.note(K.map((H)=>`${k4.default.green("✓")} ${H}`).join(`
1420
1420
  `),"Migration");let U=K.length>0||lv(G);if(K.length>0&&!lv(G))dv(G,!0);if(!J)await $F(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 d10();if(Y===H.version&&!U){W.stop(k4.default.green("Already up to date!")),X.outro(`Current version: ${k4.default.cyan(Y)}`);return}let q=Y===H.version;W.message(`Downloading ${k4.default.cyan(H.version)}...`);let{dir:z,cleanup:V}=await q2();try{W.message("Copying files..."),qG(G);let B=Y4(G,".agents","oma-config.yaml"),L=Y4(G,".agents","mcp.json"),O=!$&&R5(B)?$U(B):null,F=!$&&R5(L)?$U(L):null,N=Y4(TA$(),`oma-stack-backup-${Date.now()}`),M=Y4(G,".agents","skills","oma-backend","stack"),A=!$&&R5(M);if(A)lV(N,{recursive:!0}),KI(M,Y4(N,"oma-backend"),{recursive:!0});let T=["snippets.md","tech-stack.md","api-template.py"],w=Y4(G,".agents","skills","oma-backend","resources"),R=!$&&!A&&T.some((n)=>R5(Y4(w,n)));if(KI(Y4(z,".agents"),Y4(G,".agents"),{recursive:!0,force:!0}),O)SY(B,O);if(F)SY(L,F);if(A)try{lV(M,{recursive:!0}),KI(Y4(N,"oma-backend"),M,{recursive:!0,force:!0})}finally{Ip(N,{recursive:!0,force:!0})}if(R){let n=Y4(z,".agents","skills","oma-backend","variants","python");if(R5(n))lV(M,{recursive:!0}),KI(n,M,{recursive:!0,force:!0}),SY(Y4(M,"stack.yaml"),`language: python
1421
1421
  framework: fastapi
1422
1422
  orm: sqlalchemy
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-agent",
3
- "version": "6.16.0",
3
+ "version": "6.16.1",
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": {