oh-my-agent 6.2.1 → 6.2.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.
- package/README.md +0 -2
- package/bin/cli.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -107,8 +107,6 @@ Or use slash commands for structured workflows:
|
|
|
107
107
|
| 2 | `/architecture` | Software architecture review, tradeoffs, ADR/ATAM/CBAM-style analysis |
|
|
108
108
|
| 2 | `/design` | 7-phase design system workflow |
|
|
109
109
|
| 2 | `/plan` | PM breaks down your feature into tasks |
|
|
110
|
-
| 2 | `/exec-plan` | Track plans as first-class artifacts in `docs/exec-plans/` |
|
|
111
|
-
| 2 | `/stack-set` | Auto-detect tech stack, generate language-specific backend resources |
|
|
112
110
|
| 3 | `/work` | Step-by-step multi-agent execution |
|
|
113
111
|
| 3 | `/orchestrate` | Automated parallel agent spawning |
|
|
114
112
|
| 3 | `/ultrawork` | 5-phase quality workflow with 11 review gates |
|
package/bin/cli.js
CHANGED
|
@@ -1393,7 +1393,7 @@ print(json.dumps({
|
|
|
1393
1393
|
}))
|
|
1394
1394
|
`;function HH$(){return process.env.OMA_PYTHON??"python3"}function zH$($){if(UH$.some((J)=>$===J||$.endsWith(`.${J}`)))return["safari","chrome","firefox"];return["chrome","safari","firefox"]}async function VH$($,J,X){return new Promise((G)=>{let Q=KH$(HH$(),["-c",WH$],{env:{...process.env,OMA_IMPERSONATE_URL:$.toString(),OMA_IMPERSONATE_TARGET:J,OMA_IMPERSONATE_LOCALE:X.locale,OMA_IMPERSONATE_TIMEOUT:String(X.timeoutMs)},stdio:["ignore","pipe","pipe"]}),Y="",Z="";Q.stdout.on("data",(U)=>{Y+=U.toString()}),Q.stderr.on("data",(U)=>{Z+=U.toString()});let K=()=>{Q.kill("SIGTERM")};X.signal?.addEventListener("abort",K),Q.on("close",(U)=>{if(X.signal?.removeEventListener("abort",K),U!==0&&!Y){G({error:`python_exit:${U}:${Z.trim().slice(0,200)}`});return}let W=Y.trim();if(!W){G({error:"empty_stdout"});return}try{G(JSON.parse(W))}catch(H){G({error:`parse_error:${H.message}:${W.slice(0,200)}`})}}),Q.on("error",(U)=>{X.signal?.removeEventListener("abort",K),G({error:`spawn_error:${U.message}`})})})}function qH$($,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 YO0($,J){let X=zH$($.hostname),G=[],Q=performance.now();for(let K of X){if(J.signal?.aborted)break;let U=performance.now(),W=await VH$($,K,J),H=Math.round(performance.now()-U);if(W.error==="curl_cffi_not_installed")return R6({url:$.toString(),strategy:"impersonate",error:Error("curl_cffi is not installed. Run: pip install curl_cffi")});if(W.error){G.push({target:K,detail:W.error});continue}let z=qH$(W,$.toString(),H),B=k4(z);if(a60(B))return{url:$.toString(),status:"blocked",strategy:"impersonate",platform:K,httpStatus:z.status,content:z.text,contentType:z.headers.get("content-type")??void 0,elapsedMs:Math.round(performance.now()-Q),signals:B,error:"js-essential-markers-detected"};if(z.ok&&z.text.length>=200)return{url:$.toString(),status:J9(z,B),strategy:"impersonate",platform:K,httpStatus:z.status,content:z.text,contentType:z.headers.get("content-type")??void 0,elapsedMs:Math.round(performance.now()-Q),signals:B};G.push({target:K,detail:`status=${z.status} size=${z.text.length}`})}let Y=Math.round(performance.now()-Q),Z=G.map((K)=>`${K.target}(${K.detail})`).join(" | ");return{...R6({url:$.toString(),strategy:"impersonate",error:Error(Z?`impersonate_failed: ${Z}`:"impersonate_failed")}),elapsedMs:Y,signals:[]}}var ZO0="https://r.jina.ai/";function BH$($){let J=`${$.protocol}//${$.hostname}`,X=$.hostname.startsWith("m.")?$.hostname:`m.${$.hostname.replace(/^www\./,"")}`,G=new URL($.toString());return G.hostname=X,[{label:"jina",url:`${ZO0}${$.toString()}`,headers:g3({accept:"text/plain"})},{label:"jina-json",url:`${ZO0}${$.toString()}`,headers:g3({accept:"application/json"})},{label:"curl-desktop",url:$.toString(),headers:g3({userAgent:P5.desktopFirefox,referer:J})},{label:"curl-mobile",url:G.toString(),headers:g3({userAgent:P5.mobileSafari,referer:J})},{label:"curl-googlebot",url:$.toString(),headers:g3({userAgent:P5.googlebot})}]}function OH$($,J){if(!$.startsWith("jina"))return J;return J}async function KO0($,J){let X=BH$($),G=new AbortController;if(J.signal)if(J.signal.aborted)G.abort(J.signal.reason);else J.signal.addEventListener("abort",()=>G.abort(J.signal?.reason));let Q=performance.now(),Y={},Z=null,K=X.map(async(U)=>{let W=await S6(U.url,{headers:U.headers,timeoutMs:J.timeoutMs,signal:G.signal,locale:J.locale}),H=k4(W);if(U.label.startsWith("jina")){let z=n60(W);if(z)throw Z=z,Error(`jina-quota:${z.detail}`)}if(!LH$(W,H))throw Y[U.label]=`status=${W.status} size=${W.text.length}`,Error(`weak-response:${U.label}`);return{label:U.label,resp:W,signals:H}});try{let U=await Promise.any(K);G.abort();let W=Math.round(performance.now()-Q);return{url:$.toString(),status:J9(U.resp,U.signals),strategy:"probe",platform:U.label,httpStatus:U.resp.status,content:OH$(U.label,U.resp.text),contentType:U.resp.headers.get("content-type")??void 0,elapsedMs:W,signals:Z?[...U.signals,Z]:U.signals}}catch(U){let W=Math.round(performance.now()-Q),H=Object.entries(Y).map(([z,B])=>`${z}:${B}`).join(" ");if(Z)return{...R6({url:$.toString(),error:Error(`probe failed — ${H}`),strategy:"probe"}),elapsedMs:W,signals:[Z]};return{...R6({url:$.toString(),error:U instanceof AggregateError?Error(H):U,strategy:"probe"}),elapsedMs:W}}}function LH$($,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 FH$=["api","probe","impersonate","browser","archive"];function NH$($){if($.only?.length)return $.only;let J=FH$.slice();if(!$.includeArchive)J=J.filter((X)=>X!=="archive");if($.skip?.length)J=J.filter((X)=>!$.skip?.includes(X));return J}async function UO0($,J,X){switch($){case"api":return await YF(J,X)??null;case"probe":return KO0(J,X);case"impersonate":return YO0(J,X);case"browser":return QO0(J,X);case"archive":return IW(J,X)}}function ug($){if($.status==="ok")return!0;if($.status==="auth-required"&&s60($.signals))return!0;return!1}function MH$($){return $.status==="auth-required"||$.status==="invalid-input"||$.status==="not-found"}async function AH$($){let J=Math.floor(Math.random()*500);await new Promise((X)=>setTimeout(X,$+J))}function RH$($){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 WO0($,J,X={}){let G=NH$(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 UO0(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(ug(W))return W.attempts=Q,W;if(MH$(W))return W.attempts=Q,W;if(X.retryOnRateLimit!==!1&&r60(W.signals)&&!Y.has(U)){Y.add(U),await AH$(RH$(W.signals));let H=await UO0(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}),ug(H))return H.attempts=Q,H;Z=H;continue}}Z=W}if(!G.includes("archive")&&X.includeArchive!==!1){let U=await IW($,J);if(Q.push({strategy:"archive",platform:U.platform,status:U.status,httpStatus:U.httpStatus,elapsedMs:U.elapsedMs,signals:U.signals,error:U.error}),ug(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 aO0=c0(nO0(),1);var dz$=["/rss","/feed","/atom.xml","/rss.xml","/index.xml"],iz$=new aO0.XMLParser({ignoreAttributes:!1,attributeNamePrefix:"@_",textNodeName:"#text"});function ig($){if($===void 0||$===null)return[];return Array.isArray($)?$:[$]}function G4($){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 oO0($){for(let J of ig($)){let X=J?.["@_href"],G=J?.["@_rel"];if(typeof X==="string"&&(G===void 0||G==="alternate"))return X}return}function sO0($){let J;try{J=iz$.parse($)}catch{return null}let X=J.rss;if(X){let Q=X.channel;if(!Q)return null;let Y=ig(Q.item);return{kind:"rss",title:G4(Q.title),description:G4(Q.description),link:G4(Q.link),entries:Y.map((Z)=>({title:G4(Z.title),link:G4(Z.link),pubDate:G4(Z.pubDate),description:G4(Z.description),content:G4(Z["content:encoded"])??G4(Z.content)}))}}let G=J.feed;if(G){let Q=ig(G.entry);return{kind:"atom",title:G4(G.title),description:G4(G.subtitle),link:oO0(G.link),entries:Q.map((Y)=>({title:G4(Y.title),link:oO0(Y.link),pubDate:G4(Y.published)??G4(Y.updated),description:G4(Y.summary),content:G4(Y.content)??G4(Y.summary)}))}}return null}async function rO0($,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=QF(Y.text).alternate?.[0]?.href}catch{}let Q=new Set;if(G)try{Q.add(new URL(G,$).toString())}catch{}for(let Y of dz$)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=sO0(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 tO0($,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 _R={"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 nz$($){return $.replace(/^www\./,"")}function oz$($){if($ in _R){let X=_R[$];return X?{...X}:null}let J=nz$($);if(J in _R){let X=_R[J];return X?{...X}:null}return null}function az$($){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 sz$($){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 eO0($){let J=oz$($);if(J)return J;let X=az$($);if(X)return X;let G=await sz$($);if(G)return G;return{domain:$,level:"unknown",score:null,tags:[],source:"heuristic"}}var $L0=["api","probe","impersonate","browser","archive"];function JL0($){if(!$)return;let J=$.split(",").map((G)=>G.trim()).filter(Boolean),X=J.filter((G)=>!$L0.includes(G));if(X.length>0)throw Error(`Unknown strategy: ${X.join(", ")}. Valid: ${$L0.join(", ")}`);return J}function ZK($){try{return new URL($)}catch{throw Error(`Invalid URL: ${$}`)}}function bX($){return{timeoutMs:$.timeout?Math.max(1000,Math.floor(Number($.timeout)*1000)):15000,locale:$.locale??"en-US,en;q=0.9"}}function i7($,J){if(J)console.log(JSON.stringify($,null,2));else console.log(JSON.stringify($))}function lG($){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 XL0($){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=ZK(X),Y=bX(G),Z=await WO0(Q,Y,{only:JL0(G.only),skip:JL0(G.skip),includeArchive:G.includeArchive});i7(Z,Boolean(G.pretty)),lG(Z)}catch(Q){console.error(i5.default.red(Q.message)),process.exitCode=1}}),J.command("api <url>").description("Fetch via matched platform API (Phase 0)").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(X,G)=>{try{let Q=ZK(X);if(!hv(Q)){console.error(i5.default.yellow(`No API handler matches host ${Q.hostname}`)),process.exitCode=3;return}let Z=bX(G),K=await YF(Q,Z);if(!K){process.exitCode=3;return}i7(K,Boolean(G.pretty)),lG(K)}catch(Q){console.error(i5.default.red(Q.message)),process.exitCode=1}}),J.command("api:search <query>").description("Fan-out keyword search across platforms that support it").option("--platforms <list>","Comma-separated platform ids").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(X,G)=>{let Q=bX(G),Y=G.platforms?G.platforms.split(",").map((K)=>K.trim()).filter(Boolean):void 0,Z=await F40(X,Q,Y);i7(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=ZK(X),Y=bX(G),Z=await i60(Q,Y),{content:K,...U}=Z;i7(U,Boolean(G.pretty)),lG(Z)}catch(Q){console.error(i5.default.red(Q.message)),process.exitCode=1}}),J.command("rss <url>").description("Discover and parse RSS/Atom feed for a URL").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(X,G)=>{try{let Q=ZK(X),Y=bX(G),Z=await rO0(Q,Y),{content:K,...U}=Z;i7(U,Boolean(G.pretty)),lG(Z)}catch(Q){console.error(i5.default.red(Q.message)),process.exitCode=1}}),J.command("rss:google <query>").description("Build Google News RSS URL for a query").option("--locale <value>","Locale (e.g., ko-KR)","en-US").action((X,G)=>{let Q=tO0(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=ZK(X),Y=bX(G),Z=G.subLang?G.subLang.split(",").map((U)=>U.trim()).filter(Boolean):void 0,K=await l60(Q,Y,{subtitles:G.subs,...Z?{subLangs:Z}:{},...G.format?{format:G.format}:{}});i7(K,Boolean(G.pretty)),lG(K)}catch(Q){console.error(i5.default.red(Q.message)),process.exitCode=1}}),J.command("archive <url>").description("Fetch via AMP / archive.today / Wayback").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(X,G)=>{try{let Q=ZK(X),Y=bX(G),Z=await IW(Q,Y);i7(Z,Boolean(G.pretty)),lG(Z)}catch(Q){console.error(i5.default.red(Q.message)),process.exitCode=1}}),J.command("trust <domain>").description("Resolve trust level / score for a domain").option("--pretty","Pretty-print JSON").action(async(X,G)=>{let Q=await eO0(X.toLowerCase());i7(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=bX({}),Z=await p60(X,Y,{host:Q,...G.language?{language:G.language}:{},...G.repo?{repo:G.repo}:{},...G.limit?{limit:Number.parseInt(G.limit,10)}:{}});i7(Z,Boolean(G.pretty)),lG(Z)}),J.command("doctor").description("Check dependencies (Chrome, python3 curl_cffi, yt-dlp, gh)").action(async()=>{let X=[],G=fg();X.push({name:"chrome",ok:Boolean(G),detail:G??"Install Chrome or set OMA_CHROME_PATH"}),X.push(await ng("python3",["--version"])),X.push(await rz$()),X.push(await ng("yt-dlp",["--version"])),X.push(await ng("gh",["--version"]));for(let Q of X){let Y=Q.ok?i5.default.green("✓"):i5.default.yellow("!");console.log(`${Y} ${Q.name}: ${Q.detail}`)}if(X.some((Q)=>!Q.ok))process.exitCode=1})}async function ng($,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 rz$(){return new Promise(($)=>{let{spawn:J}=r("node:child_process"),X=J("python3",["-c","import curl_cffi; print(curl_cffi.__version__)"],{stdio:["ignore","pipe","pipe"]}),G="";X.stdout?.on("data",(Q)=>{G+=Q.toString()}),X.on("error",()=>$({name:"curl_cffi",ok:!1,detail:"python3 not found"})),X.on("close",(Q)=>{if(Q===0)$({name:"curl_cffi",ok:!0,detail:`v${G.trim()}`});else $({name:"curl_cffi",ok:!1,detail:"not installed (pip install curl_cffi)"})})})}$8();var kX=c0(q1(),1);import{execSync as tz$,spawnSync as GL0}from"node:child_process";import{platform as ez$}from"node:os";function $V$(){let $=ez$();if($==="darwin")return"brew install gh";if($==="win32")return"winget install GitHub.cli";return"sudo apt install gh"}async function QL0(){if(console.clear(),P1(kX.default.bgMagenta(kX.default.white(" ⭐ oh-my-agent star "))),!W3()){let J=$V$(),X=await U4({message:`GitHub CLI (gh) is not installed. Install with ${kX.default.cyan(J)}?`});if(U1(X)||!X){F$("Install gh manually and try again.");return}let G=i8();G.start("Installing GitHub CLI...");let Q=GL0(J,{shell:!0,stdio:"pipe"});if(Q.status!==0){G.stop("Installation failed"),o$.error(Q.stderr?.toString()||"Unknown error"),F$("Please install gh manually.");return}G.stop("GitHub CLI installed!")}if(!A5()){o$.warn("GitHub CLI is not authenticated.");let J=await U4({message:`Run ${kX.default.cyan("gh auth login")} now?`});if(U1(J)||!J){F$("Authenticate and try again.");return}if(GL0("gh",["auth","login"],{stdio:"inherit"}),!A5()){F$("Authentication was not completed. Try again.");return}o$.success("Authenticated!")}if(H3()){F$(`Already starred ${kX.default.cyan(g1)}! Thank you! \uD83D\uDE4F`);return}let $=await U4({message:`Star ${kX.default.cyan(g1)} on GitHub?`});if(U1($)||!$){F$("Maybe next time!");return}try{tz$(`gh api -X PUT /user/starred/${g1}`,{stdio:"ignore"}),F$(`Starred ${kX.default.cyan(g1)}! Thank you! \uD83C\uDF1F`)}catch{o$.error("Failed to star the repository."),F$("Please try again later.")}}function YL0($){$.command("star").description("Star oh-my-agent on GitHub").action(W$(async()=>{await QL0()}))}$8();jv();AU();var J5=c0(q1(),1);import{existsSync as xR,mkdirSync as JV$,readdirSync as XV$,readFileSync as GV$,writeFileSync as ZL0}from"node:fs";import{dirname as QV$,join as KL0}from"node:path";function ag($){return KL0($,".serena","metrics.json")}function og(){return{sessions:0,skillsUsed:{},tasksCompleted:0,totalSessionTime:0,filesChanged:0,linesAdded:0,linesRemoved:0,lastUpdated:new Date().toISOString(),startDate:new Date().toISOString()}}function YV$($){let J=ag($);if(xR(J))try{return JSON.parse(GV$(J,"utf-8"))}catch{return og()}return og()}function ZV$($,J){let X=ag($),G=QV$(X);if(!xR(G))JV$(G,{recursive:!0});J.lastUpdated=new Date().toISOString(),ZL0(X,JSON.stringify(J,null,2),"utf-8")}function KV$($){let J=KL0($,".serena","memories"),X={};if(!xR(J))return X;try{let G=XV$(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 UL0($=!1,J=!1){let X=process.cwd(),G=ag(X);if(J){if(xR(G))ZL0(G,JSON.stringify(og(),null,2),"utf-8");if($)console.log(JSON.stringify({reset:!0}));else console.log(J5.default.green("✅ Metrics reset successfully."));return}let Q=YV$(X),Y=sL(X),Z=KV$(X),K=Mi(X),U=PB(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,ZV$(X,Q);let z=Math.max(1,Math.ceil((Date.now()-new Date(Q.startDate).getTime())/86400000)),B=Q.sessions>0?Math.round(Q.totalSessionTime/Q.sessions):0;if($){console.log(JSON.stringify({...Q,gitStats:Y,daysSinceStart:z,avgSessionTime:B},null,2));return}console.clear(),P1(J5.default.bgMagenta(J5.default.white(" \uD83D\uDCCA oh-my-agent stats ")));let V=[J5.default.bold(`\uD83D\uDCC8 Productivity Metrics (${z} days)`),"┌─────────────────────┬──────────────┐",`│ ${J5.default.bold("Metric")} │ ${J5.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 │ ${J5.default.green(`+${Q.linesAdded}`).padEnd(12)} │`,`│ Lines Removed │ ${J5.default.red(`-${Q.linesRemoved}`).padEnd(12)} │`,"└─────────────────────┴──────────────┘"].join(`
|
|
1395
1395
|
`);i0(V,"Overview");let q=Object.entries(Q.skillsUsed).sort(([,O],[,L])=>L-O).slice(0,5);if(q.length>0){let O=[J5.default.bold("\uD83C\uDFC6 Top Skills Used"),...q.map(([L,F],N)=>` ${N+1}. ${L} (${F})`)].join(`
|
|
1396
|
-
`);i0(O,"Skills")}F$(J5.default.dim(`Data stored in: ${G}`))}function WL0($){L6($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(W$(async(J)=>{await UL0(G6(J),J.reset)},{supportsJsonOutput:!0}))}$8();var D4=c0(q1(),1);import{execSync as BV$}from"node:child_process";import{cpSync as kR,existsSync as X5,mkdirSync as fz,readFileSync as KK,rmSync as sg,writeFileSync as iG}from"node:fs";import{tmpdir as OV$}from"node:os";import{dirname as qL0,join as a6}from"node:path";var vR=c0(q1(),1);import{execSync as UV$,spawn as WV$}from"node:child_process";import{realpathSync as HL0}from"node:fs";import hz from"node:process";var dG="oh-my-agent";function HV$($=hz.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(hz.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=HL0($).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(hz.platform==="darwin")try{let X=UV$(`brew --prefix ${dG}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(X){let G=HL0(X).replace(/\\/g,"/");if(J.startsWith(G))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${dG}`,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 ${dG}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(J.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${dG}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(J.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${dG}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${dG}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var zL0=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function zV$($,J){let X=$.match(zL0),G=J.match(zL0);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 VV$($=dG,J=2000){try{let X=await EY.get(`https://registry.npmjs.org/${$}/latest`,{timeout:J});return typeof X.data?.version==="string"?X.data.version:null}catch{return null}}async function VL0($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(hz.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(hz.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let J=await VV$();if(!J)return{triggered:!1,reason:"fetch-failed"};if(!zV$($.currentVersion,J))return{triggered:!1,reason:"up-to-date",latest:J};let X=HV$();if(!X.updateCommand)return $.onNotice?.(vR.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. ${X.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:J};try{return WV$(X.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(vR.default.cyan(`global oh-my-agent ${$.currentVersion} → ${J} updating in background. New version applies on next run.`)),{triggered:!0,latest:J}}catch{return $.onNotice?.(vR.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. Run: ${X.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:J}}}var bR={name:"oh-my-agent",version:"6.2.
|
|
1396
|
+
`);i0(O,"Skills")}F$(J5.default.dim(`Data stored in: ${G}`))}function WL0($){L6($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(W$(async(J)=>{await UL0(G6(J),J.reset)},{supportsJsonOutput:!0}))}$8();var D4=c0(q1(),1);import{execSync as BV$}from"node:child_process";import{cpSync as kR,existsSync as X5,mkdirSync as fz,readFileSync as KK,rmSync as sg,writeFileSync as iG}from"node:fs";import{tmpdir as OV$}from"node:os";import{dirname as qL0,join as a6}from"node:path";var vR=c0(q1(),1);import{execSync as UV$,spawn as WV$}from"node:child_process";import{realpathSync as HL0}from"node:fs";import hz from"node:process";var dG="oh-my-agent";function HV$($=hz.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(hz.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=HL0($).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(hz.platform==="darwin")try{let X=UV$(`brew --prefix ${dG}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(X){let G=HL0(X).replace(/\\/g,"/");if(J.startsWith(G))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${dG}`,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 ${dG}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(J.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${dG}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(J.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${dG}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${dG}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var zL0=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function zV$($,J){let X=$.match(zL0),G=J.match(zL0);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 VV$($=dG,J=2000){try{let X=await EY.get(`https://registry.npmjs.org/${$}/latest`,{timeout:J});return typeof X.data?.version==="string"?X.data.version:null}catch{return null}}async function VL0($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(hz.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(hz.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let J=await VV$();if(!J)return{triggered:!1,reason:"fetch-failed"};if(!zV$($.currentVersion,J))return{triggered:!1,reason:"up-to-date",latest:J};let X=HV$();if(!X.updateCommand)return $.onNotice?.(vR.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. ${X.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:J};try{return WV$(X.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(vR.default.cyan(`global oh-my-agent ${$.currentVersion} → ${J} updating in background. New version applies on next run.`)),{triggered:!0,latest:J}}catch{return $.onNotice?.(vR.default.yellow(`global oh-my-agent ${$.currentVersion} → ${J} available. Run: ${X.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:J}}}var bR={name:"oh-my-agent",version:"6.2.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 LV$($){if(!$)return{intro:(X)=>P1(X),outro:(X)=>F$(X),note:(X,G)=>i0(X,G),logError:(X)=>o$.error(X),spinnerStart:(X)=>{let G=i8();return G.start(X),G}};let J={start(X){},stop(X){if(X)console.log(X)},message(X){console.log(X)}};return{intro:(X)=>console.log(X),outro:(X)=>console.log(X),note:(X,G)=>console.log(X),logError:(X)=>console.error(X),spinnerStart:(X)=>{return console.log(X),J}}}function FV$($,J){if($!==null)return"ready";return J?"legacy":"missing"}async function rg($=!1,J=!1){if(!J&&process.stdout.isTTY)console.clear();let X=LV$(J);X.intro(D4.default.bgMagenta(D4.default.white(" \uD83D\uDEF8 oh-my-agent update ")));let G=process.cwd();await VL0({currentVersion:bR.version,enabled:a$0(G),onSpawnStart:(H)=>X.note(H,"CLI auto-update"),onNotice:(H)=>X.note(H,"CLI update available")});let Q=await xO(G),Y=bt(G),Z=FV$(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=w3(G);if(K.length>0)X.note(K.map((H)=>`${D4.default.green("✓")} ${H}`).join(`
|
|
1397
1397
|
`),"Migration");let U=K.length>0||F_(G);if(K.length>0&&!F_(G))N_(G,!0);if(!J)await eB(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 kt();if(Q===H.version&&!U){W.stop(D4.default.green("Already up to date!")),X.outro(`Current version: ${D4.default.cyan(Q)}`);return}let z=Q===H.version;W.message(`Downloading ${D4.default.cyan(H.version)}...`);let{dir:B,cleanup:V}=await _O();try{W.message("Copying files..."),w3(G);let q=a6(G,".agents","oma-config.yaml"),O=a6(G,".agents","mcp.json"),L=!$&&X5(q)?KK(q):null,F=!$&&X5(O)?KK(O):null,N=a6(OV$(),`oma-stack-backup-${Date.now()}`),M=a6(G,".agents","skills","oma-backend","stack"),R=!$&&X5(M);if(R)fz(N,{recursive:!0}),kR(M,a6(N,"oma-backend"),{recursive:!0});let D=["snippets.md","tech-stack.md","api-template.py"],P=a6(G,".agents","skills","oma-backend","resources"),T=!$&&!R&&D.some((o)=>X5(a6(P,o)));if(kR(a6(B,".agents"),a6(G,".agents"),{recursive:!0,force:!0}),L)iG(q,L);if(F)iG(O,F);if(R)try{fz(M,{recursive:!0}),kR(a6(N,"oma-backend"),M,{recursive:!0,force:!0})}finally{sg(N,{recursive:!0,force:!0})}if(T){let o=a6(B,".agents","skills","oma-backend","variants","python");if(X5(o))fz(M,{recursive:!0}),kR(o,M,{recursive:!0,force:!0}),iG(a6(M,"stack.yaml"),`language: python
|
|
1398
1398
|
framework: fastapi
|
|
1399
1399
|
orm: sqlalchemy
|
package/package.json
CHANGED