oh-my-agent 7.15.0 → 7.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +2 -2
- package/package.json +1 -1
package/bin/cli.js
CHANGED
|
@@ -1106,7 +1106,7 @@ ${U} = ${K}
|
|
|
1106
1106
|
`,LK($,J)}}function y22($,z,G){let J=q$(z,G.hookDir);gc2($,J),xc2(J,G.vendor),ic2(J);let U={};for(let[X,Q]of Object.entries(G.events)){let Z=Array.isArray(Q)?Q:[Q];if(Z.length===0)continue;let j={hooks:Z.map((W)=>({name:hc2(W.hook),type:"command",command:C22(G,W.hook),timeout:W.timeout}))},k=Z.find((W)=>W.matcher)?.matcher;if(k)j.matcher=k;U[X]=[j]}let K={};if(G.statusLine)K.statusLine={type:"command",command:C22(G,G.statusLine.hook)};if(G.extra)Object.assign(K,G.extra);if(mc2(q$(z,G.settingsFile),U,Object.keys(K).length>0?K:void 0),G.featureFlags)fc2(q$(z,G.featureFlags.file),G.featureFlags.section,G.featureFlags.flags)}import{existsSync as m22,mkdirSync as ec2,readdirSync as $n2,readFileSync as f22,writeFileSync as zn2}from"node:fs";import{join as AK}from"node:path";import{cpSync as ff5,existsSync as h22,mkdirSync as x22,readdirSync as lc2,readFileSync as i22,writeFileSync as kj}from"node:fs";import{join as uG}from"node:path";var UV=".agents/rules",cc2=".cursor/rules",nc2=".claude/rules";function YC($){let z=uG($,UV);if(!h22(z))return[];return lc2(z).filter((G)=>G.endsWith(".md")).map((G)=>{let J=i22(uG(z,G),"utf-8"),{frontmatter:U,body:K}=O$(J);return{name:G.replace(".md",""),description:U.description||G.replace(".md",""),globs:U.globs||"",alwaysApply:U.alwaysApply||!1,body:K.trim()}})}function HK($){let z=YC($);if(z.length===0)return[];let G=uG($,cc2);x22(G,{recursive:!0});let J=[];for(let U of z){let K=`<!-- Generated by oh-my-agent. Source: ${UV}/${U.name}.md -->`,X=["---",`description: ${JSON.stringify(U.description)}`,`globs: ${U.globs?JSON.stringify(U.globs):""}`,`alwaysApply: ${U.alwaysApply}`,"---","",K,"",U.body,""].join(`
|
|
1107
1107
|
`);kj(uG(G,`${U.name}.mdc`),X),J.push(U.name)}return J}function g22($){let z=YC($);if(z.length===0)return[];let G=uG($,nc2);x22(G,{recursive:!0});let J=[];for(let U of z){let K={description:U.description};if(!U.alwaysApply&&U.globs)K.paths=U.globs;let X=jK(K,`
|
|
1108
1108
|
${U.body}
|
|
1109
|
-
`);kj(uG(G,`${U.name}.md`),X),J.push(U.name)}return J}var dc2="<!-- OMA:START — managed by oh-my-agent. Do not edit this block manually. -->",ZC="<!-- OMA:END -->",pc2={claude:"CLAUDE.md",gemini:"GEMINI.md",codex:"AGENTS.md",cursor:"AGENTS.md",qwen:"AGENTS.md"},ac2={claude:"Same-vendor native dispatch via Claude Code Agent tool with `.claude/agents/{name}.md`; cross-vendor fallback via `oma agent:spawn`",gemini:"Same-vendor native dispatch via `.gemini/agents/{name}.md`; cross-vendor or unsupported cases fall back to `oma agent:spawn {agent} {prompt} {sessionId}`",cursor:"`@agent-name` (defined in `.cursor/agents/`)",codex:"Same-vendor native dispatch via Codex custom agents in `.codex/agents/{name}.toml`; cross-vendor fallback via `oma agent:spawn`",qwen:"`oma agent:spawn {agent} {prompt} {sessionId}`"},oc2={claude:"Hooks: `UserPromptSubmit` (keyword detection), `PreToolUse`, `Stop` (persistent mode)",gemini:"Hooks: `BeforeAgent` (keyword detection), `BeforeTool`, `AfterAgent` (persistent mode)",codex:"Hooks: `UserPromptSubmit` (keyword detection), `PreToolUse`, `Stop` (persistent mode)",cursor:"Hooks: `UserPromptSubmit` / `beforeSubmitPrompt` (keyword detection)",qwen:"Hooks: `UserPromptSubmit` (keyword detection), `PreToolUse`, `Stop` (persistent mode)"};function rc2($,z){let G=[dc2,"","# oh-my-agent","","## Architecture","","- **SSOT**: `.agents/` directory (do not modify directly)","- **Response language**: Follows `language` in `.agents/oma-config.yaml`","- **Skills**: `.agents/skills/` (domain specialists)","- **Workflows**: `.agents/workflows/` (multi-step orchestration)",`- **Subagents**: ${ac2[$]||"`oma agent:spawn`"}`,"","## Per-Agent Dispatch","","1. Resolve `target_vendor_for_agent` from `.agents/oma-config.yaml`.","2. If `target_vendor_for_agent === current_runtime_vendor`, use the runtime's native subagent path.","3. If vendors differ, or native subagents are unavailable, use `oma agent:spawn` for that agent only.","","## Workflows","","Execute by naming the workflow in your prompt. Keywords are auto-detected via hooks.","","| Workflow | File | Description |","|----------|------|-------------|","| orchestrate | `orchestrate.md` | Parallel subagents + Review Loop |","| work | `work.md` | Step-by-step with remediation loop |","| ultrawork | `ultrawork.md` | 5-Phase Gate Loop (11 reviews) |","| plan | `plan.md` | PM task breakdown |","| brainstorm | `brainstorm.md` | Design-first ideation |","| review | `review.md` | QA audit |","| debug | `debug.md` | Root cause + minimal fix |","| deepsec | `deepsec.md` | Drive `oma-deepsec` end-to-end (setup / scan / pr-review / matchers / triage) |","| scm | `scm.md` | SCM + Git operations + Conventional Commits |","| docs | `docs.md` | Documentation drift verify + sync |","| recap | `recap.md` | Daily / period AI conversation recap |","","To execute: read and follow `.agents/workflows/{name}.md` step by step.","","## Auto-Detection","",oc2[$]||"","Keywords defined in `.agents/hooks/core/triggers.json` (multi-language).","Persistent workflows (orchestrate, ultrawork, work) block termination until complete.",'Deactivate: say "workflow done".',"","## Rules","","1. **Do not modify `.agents/` files** (SSOT protection).","2. Workflows execute via keyword detection or explicit naming, never self-initiated.","3. Response language follows `.agents/oma-config.yaml`",""];if(z.length>0){G.push("## Project Rules","",`Read the relevant file from \`${UV}/\` when working on matching code.`,"","| Rule | File | Scope |","|------|------|-------|");for(let J of z){let U=J.globs||(J.alwaysApply?"always":"on request");G.push(`| ${J.name} | \`${UV}/${J.name}.md\` | ${U} |`)}G.push("")}return G.push(ZC),G.join(`
|
|
1109
|
+
`);kj(uG(G,`${U.name}.md`),X),J.push(U.name)}return J}var dc2="<!-- OMA:START — managed by oh-my-agent. Do not edit this block manually. -->",ZC="<!-- OMA:END -->",pc2={claude:"CLAUDE.md",gemini:"GEMINI.md",codex:"AGENTS.md",cursor:"AGENTS.md",qwen:"AGENTS.md"},ac2={claude:"Same-vendor native dispatch via Claude Code Agent tool with `.claude/agents/{name}.md`; cross-vendor fallback via `oma agent:spawn`",gemini:"Same-vendor native dispatch via `.gemini/agents/{name}.md`; cross-vendor or unsupported cases fall back to `oma agent:spawn {agent} {prompt} {sessionId}`",cursor:"`@agent-name` (defined in `.cursor/agents/`)",codex:"Same-vendor native dispatch via Codex custom agents in `.codex/agents/{name}.toml`; cross-vendor fallback via `oma agent:spawn`",qwen:"`oma agent:spawn {agent} {prompt} {sessionId}`"},oc2={claude:"Hooks: `UserPromptSubmit` (keyword detection), `PreToolUse`, `Stop` (persistent mode)",gemini:"Hooks: `BeforeAgent` (keyword detection), `BeforeTool`, `AfterAgent` (persistent mode)",codex:"Hooks: `UserPromptSubmit` (keyword detection), `PreToolUse`, `Stop` (persistent mode)",cursor:"Hooks: `UserPromptSubmit` / `beforeSubmitPrompt` (keyword detection)",qwen:"Hooks: `UserPromptSubmit` (keyword detection), `PreToolUse`, `Stop` (persistent mode)"};function rc2($,z){let G=[dc2,"","# oh-my-agent","","## Architecture","","- **SSOT**: `.agents/` directory (do not modify directly)","- **Response language**: Follows `language` in `.agents/oma-config.yaml`","- **Skills**: `.agents/skills/` (domain specialists)","- **Workflows**: `.agents/workflows/` (multi-step orchestration)",`- **Subagents**: ${ac2[$]||"`oma agent:spawn`"}`,"","## Per-Agent Dispatch","","1. Resolve `target_vendor_for_agent` from `.agents/oma-config.yaml`.","2. If `target_vendor_for_agent === current_runtime_vendor`, use the runtime's native subagent path.","3. If vendors differ, or native subagents are unavailable, use `oma agent:spawn` for that agent only.","","## Code Search","","Prefer **serena MCP** tools over native find/grep when locating code — they are symbol-aware and faster on large repos. Fall back to native Read / Glob / Grep only when serena is unavailable or for plain file content reads.","","| Task | Preferred tool |","|------|----------------|","| Locate a symbol definition (class / function / variable) | `find_symbol` |","| Find references / callers of a symbol | `find_referencing_symbols` |","| Outline a file's top-level symbols | `get_symbols_overview` |","| Pattern or regex search across the codebase | `search_for_pattern` |","| Find a file by name | `find_file` |","| List directory contents | `list_dir` |","","## Workflows","","Execute by naming the workflow in your prompt. Keywords are auto-detected via hooks.","","| Workflow | File | Description |","|----------|------|-------------|","| orchestrate | `orchestrate.md` | Parallel subagents + Review Loop |","| work | `work.md` | Step-by-step with remediation loop |","| ultrawork | `ultrawork.md` | 5-Phase Gate Loop (11 reviews) |","| plan | `plan.md` | PM task breakdown |","| brainstorm | `brainstorm.md` | Design-first ideation |","| review | `review.md` | QA audit |","| debug | `debug.md` | Root cause + minimal fix |","| deepsec | `deepsec.md` | Drive `oma-deepsec` end-to-end (setup / scan / pr-review / matchers / triage) |","| scm | `scm.md` | SCM + Git operations + Conventional Commits |","| docs | `docs.md` | Documentation drift verify + sync |","| recap | `recap.md` | Daily / period AI conversation recap |","","To execute: read and follow `.agents/workflows/{name}.md` step by step.","","## Auto-Detection","",oc2[$]||"","Keywords defined in `.agents/hooks/core/triggers.json` (multi-language).","Persistent workflows (orchestrate, ultrawork, work) block termination until complete.",'Deactivate: say "workflow done".',"","## Rules","","1. **Do not modify `.agents/` files** (SSOT protection).","2. Workflows execute via keyword detection or explicit naming, never self-initiated.","3. Response language follows `.agents/oma-config.yaml`",""];if(z.length>0){G.push("## Project Rules","",`Read the relevant file from \`${UV}/\` when working on matching code.`,"","| Rule | File | Scope |","|------|------|-------|");for(let J of z){let U=J.globs||(J.alwaysApply?"always":"on request");G.push(`| ${J.name} | \`${UV}/${J.name}.md\` | ${U} |`)}G.push("")}return G.push(ZC),G.join(`
|
|
1110
1110
|
`)}var sc2="<!-- OMA:START";function tc2($,z){if(h22($)){let G=i22($,"utf-8"),J=G.indexOf(sc2),U=G.indexOf(ZC);if(J!==-1&&U!==-1){let K=G.slice(0,J),X=G.slice(U+ZC.length);kj($,`${K}${z}${X}`)}else kj($,`${G.trimEnd()}
|
|
1111
1111
|
|
|
1112
1112
|
${z}
|
|
@@ -1612,7 +1612,7 @@ spawn_error:${Z.message}`})})})}async function RK2($,z,G={}){let J=G.host??"gith
|
|
|
1612
1612
|
spawn_error:${Q.message}`})})})}async function vK2($,z,G={}){let J=performance.now(),U=["--dump-json","--no-warnings","--skip-download"];if(G.format)U.push("-f",G.format);if(G.subtitles){if(U.push("--write-sub","--write-auto-sub","--sub-format","vtt"),G.subLangs?.length)U.push("--sub-lang",G.subLangs.join(","))}U.push($.toString());let{code:K,stdout:X,stderr:Q}=await GU5(U,z),Z=Math.round(performance.now()-J);if(K===null||K!==0){let Y=Q.trim();if(/executable not found|ENOENT/i.test(Y))return{url:$.toString(),status:"error",strategy:"api",platform:"media",content:"",elapsedMs:Z,signals:[],error:"yt-dlp not installed. Install via `pip install yt-dlp` or `brew install yt-dlp`."};return{url:$.toString(),status:"error",strategy:"api",platform:"media",content:X,elapsedMs:Z,signals:[],error:Y||`yt-dlp exited with code ${K}`}}return{url:$.toString(),status:"ok",strategy:"api",platform:"media",content:X.trim(),contentType:"application/json",elapsedMs:Z,signals:[]}}Y8();var zu=/<meta\s+([^>]+)>/gi,Gu=/(\w[\w-]*)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+))/g,mx=/<script[^>]+type=["']application\/ld\+json["'][^>]*>([\s\S]*?)<\/script>/gi,JU5=/<title[^>]*>([\s\S]*?)<\/title>/i,fx=/<link\s+([^>]+)>/gi;function wK2($){let z={};Gu.lastIndex=0;let G=Gu.exec($);while(G!==null){let J=G[1]?.toLowerCase();if(!J){G=Gu.exec($);continue}z[J]=G[2]??G[3]??G[4]??"",G=Gu.exec($)}return z}function Ju($){let z={},G=[],J=[],U;zu.lastIndex=0;let K=zu.exec($);while(K!==null){let k=K[1];if(!k){K=zu.exec($);continue}let W=wK2(k),L=W.property??"",H=W.name??"",B=W.content??"";if(L.startsWith("og:"))z[L.slice(3)]=B;if(H==="description"&&!U)U=B;if(H==="twitter:description"&&!U)U=B;K=zu.exec($)}fx.lastIndex=0;let X=fx.exec($);while(X!==null){let k=X[1];if(k){let W=wK2(k);if(W.rel==="alternate"&&W.type&&(W.type.includes("rss")||W.type.includes("atom")))G.push({type:W.type,href:W.href??"",title:W.title})}X=fx.exec($)}mx.lastIndex=0;let Q=mx.exec($);while(Q!==null){let k=Q[1];if(k)try{J.push(JSON.parse(k))}catch{}Q=mx.exec($)}let Y=JU5.exec($)?.[1]?.trim(),j={};if(Object.keys(z).length>0)j.ogp=z;if(J.length>0)j.jsonLd=J;if(U)j.description=U;if(Y)j.title=Y;if(G.length>0)j.alternate=G;return j}async function PK2($,z){try{let G=await d1($.toString(),{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal}),J=Ju(G.text);return{url:$.toString(),status:G.ok?"ok":"error",strategy:"probe",platform:"metadata",httpStatus:G.status,content:G.text,contentType:G.headers.get("content-type")??void 0,elapsedMs:G.elapsedMs,signals:[],metadata:J}}catch(G){return{url:$.toString(),status:"error",strategy:"probe",platform:"metadata",content:"",elapsedMs:0,signals:[],error:G instanceof Error?G.message:String(G)}}}m$();kk();Y8();m$();D3();var UU5=["archive.ph","archive.is","archive.md","archive.vn","archive.li"];function KU5($){return`https://${$.hostname.replace(/\./g,"-")}.cdn.ampproject.org/c/s/${$.hostname}${$.pathname}${$.search}`}async function XU5($,z){try{let G=KU5($),J=await d1(G,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!J.ok||J.text.length<200)return null;let U=j7(J);return{url:$.toString(),status:v6(J,U),strategy:"archive",provenance:"amp",platform:"amp",httpStatus:J.status,content:J.text,contentType:J.headers.get("content-type")??void 0,elapsedMs:J.elapsedMs,signals:U}}catch{return null}}async function QU5($,z){for(let G of UU5){if(z.signal?.aborted)break;try{let J=`https://${G}/newest/${$.toString()}`,U=await d1(J,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!U.ok||U.text.length<200)continue;let K=j7(U);return{url:$.toString(),status:v6(U,K),strategy:"archive",provenance:"archive-today",platform:G,httpStatus:U.status,content:U.text,contentType:U.headers.get("content-type")??void 0,elapsedMs:U.elapsedMs,signals:K}}catch{}}return null}async function ZU5($,z){try{let G=await d1(`https://archive.org/wayback/available?url=${encodeURIComponent($.toString())}`,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!G.ok)return null;let U=JSON.parse(G.text).archived_snapshots?.closest;if(!U?.available||!U.url)return null;let K=await d1(U.url,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!K.ok||K.text.length<200)return null;let X=j7(K);return{url:$.toString(),status:v6(K,X),strategy:"archive",provenance:"wayback",platform:"wayback",httpStatus:K.status,content:K.text,contentType:K.headers.get("content-type")??void 0,elapsedMs:K.elapsedMs,signals:X}}catch{return null}}async function Sk($,z){let G=[()=>XU5($,z),()=>QU5($,z),()=>ZU5($,z)],J=performance.now();for(let U of G){if(z.signal?.aborted)break;let K=await U();if(K)return K}return{...k1({url:$.toString(),strategy:"archive",error:Error("all archive sources exhausted")}),elapsedMs:Math.round(performance.now()-J)}}m$();D3();import{existsSync as lT2}from"node:fs";import{platform as PP5}from"node:os";var bP5={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary","/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge","/Applications/Brave Browser.app/Contents/MacOS/Brave Browser","/Applications/Chromium.app/Contents/MacOS/Chromium"],linux:["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/chromium","/usr/bin/chromium-browser","/usr/bin/microsoft-edge","/usr/bin/brave-browser"],win32:["C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe","C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe","C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe"]};function Ud(){if(process.env.OMA_CHROME_PATH&&lT2(process.env.OMA_CHROME_PATH))return process.env.OMA_CHROME_PATH;let $=bP5[PP5()]??[];for(let z of $)if(lT2(z))return z;return null}async function CP5(){try{let $=await Promise.resolve().then(() => (fT2(),mT2));return $.default??$}catch{return null}}async function cT2($,z,G={}){let J=await CP5();if(!J)return k1({url:$.toString(),strategy:"browser",error:Error("puppeteer-core not installed. Run: bun add puppeteer-core")});let U=Ud();if(!U)return k1({url:$.toString(),strategy:"browser",error:Error("Chrome/Chromium not found. Install a Chromium-based browser or set OMA_CHROME_PATH.")});let K=performance.now(),X=await J.launch({executablePath:U,headless:"new",args:["--disable-blink-features=AutomationControlled","--disable-dev-shm-usage","--no-sandbox"]});try{let Q=await X.newPage();if(await Q.setViewport({width:1280,height:900}),await Q.setExtraHTTPHeaders({"Accept-Language":z.locale}),z.userAgent)await Q.setUserAgent(z.userAgent);let Z=[];if(G.captureNetwork)Q.on("response",(A)=>{let V=A.url(),F=A.headers(),N=F["content-type"]??"";if(!V.startsWith($.origin))return;if(!N.includes("json")&&!N.includes("xml"))return;let u=F["access-control-request-method"]??"GET";Z.push({url:V,status:A.status(),method:u,contentType:N})});let Y=await Q.goto($.toString(),{waitUntil:"networkidle2",timeout:z.timeoutMs});if(G.waitSelector)await Q.waitForFunction(`document.querySelector(${JSON.stringify(G.waitSelector)}) !== null`,{timeout:z.timeoutMs});else if(G.waitMs&&G.waitMs>0)await new Promise((A)=>setTimeout(A,G.waitMs));let j=await Q.content(),k=Y?.status()??0,W=new Headers;if(Y)for(let[A,V]of Object.entries(Y.headers()))try{W.set(A,V)}catch{}let L={ok:k>=200&&k<400,status:k,headers:W,url:$.toString(),text:j,elapsedMs:Math.round(performance.now()-K),redirected:!1},H=j7(L),B=Math.round(performance.now()-K);return{url:$.toString(),status:A02(H)?"blocked":j.length<200?"error":"ok",strategy:"browser",httpStatus:k,content:j,contentType:W.get("content-type")??"text/html",elapsedMs:B,signals:H,hiddenApis:G.captureNetwork?Z:void 0}}catch(Q){let Z=Math.round(performance.now()-K);return{...k1({url:$.toString(),strategy:"browser",error:Q}),elapsedMs:Z}}finally{await X.close()}}Ly();Y8();m$();D3();var nT2="https://r.jina.ai/";function _P5($){let z=`${$.protocol}//${$.hostname}`,G=$.hostname.startsWith("m.")?$.hostname:`m.${$.hostname.replace(/^www\./,"")}`,J=new URL($.toString());return J.hostname=G,[{label:"jina",url:`${nT2}${$.toString()}`,headers:dG({accept:"text/plain"})},{label:"jina-json",url:`${nT2}${$.toString()}`,headers:dG({accept:"application/json"})},{label:"curl-desktop",url:$.toString(),headers:dG({userAgent:Z8.desktopFirefox,referer:z})},{label:"curl-mobile",url:J.toString(),headers:dG({userAgent:Z8.mobileSafari,referer:z})},{label:"curl-googlebot",url:$.toString(),headers:dG({userAgent:Z8.googlebot})}]}function SP5($,z){if(!$.startsWith("jina"))return z;return z}async function dT2($,z){let G=_P5($),J=new AbortController;if(z.signal)if(z.signal.aborted)J.abort(z.signal.reason);else z.signal.addEventListener("abort",()=>J.abort(z.signal?.reason));let U=performance.now(),K={},X=null,Q=G.map(async(Z)=>{let Y=await d1(Z.url,{headers:Z.headers,timeoutMs:z.timeoutMs,signal:J.signal,locale:z.locale}),j=j7(Y);if(Z.label.startsWith("jina")){let k=B02(Y);if(k)throw X=k,Error(`jina-quota:${k.detail}`)}if(!yP5(Y,j))throw K[Z.label]=`status=${Y.status} size=${Y.text.length}`,Error(`weak-response:${Z.label}`);return{label:Z.label,resp:Y,signals:j}});try{let Z=await Promise.any(Q);J.abort();let Y=Math.round(performance.now()-U);return{url:$.toString(),status:v6(Z.resp,Z.signals),strategy:"probe",platform:Z.label,httpStatus:Z.resp.status,content:SP5(Z.label,Z.resp.text),contentType:Z.resp.headers.get("content-type")??void 0,elapsedMs:Y,signals:X?[...Z.signals,X]:Z.signals}}catch(Z){let Y=Math.round(performance.now()-U),j=Object.entries(K).map(([k,W])=>`${k}:${W}`).join(" ");if(X)return{...k1({url:$.toString(),error:Error(`probe failed — ${j}`),strategy:"probe"}),elapsedMs:Y,signals:[X]};return{...k1({url:$.toString(),error:Z instanceof AggregateError?Error(j):Z,strategy:"probe"}),elapsedMs:Y}}}function yP5($,z){if(!$.ok)return!1;if($.text.length<200)return!1;if(z.some((G)=>G.kind==="waf-body"||G.kind==="challenge-body"||G.kind==="js-essential"||G.kind==="http-status"))return!1;return!0}var hP5=["api","probe","impersonate","browser","archive"];function xP5($){if($.only?.length)return $.only;let z=hP5.slice();if(!$.includeArchive)z=z.filter((G)=>G!=="archive");if($.skip?.length)z=z.filter((G)=>!$.skip?.includes(G));return z}async function pT2($,z,G){switch($){case"api":return await xF(z,G)??null;case"probe":return dT2(z,G);case"impersonate":return hF(z,G);case"browser":return cT2(z,G);case"archive":return Sk(z,G)}}function Kd($){if($.status==="ok")return!0;if($.status==="auth-required"&&F02($.signals))return!0;return!1}function iP5($){return $.status==="auth-required"||$.status==="invalid-input"||$.status==="not-found"}async function gP5($){let z=Math.floor(Math.random()*500);await new Promise((G)=>setTimeout(G,$+z))}function mP5($){let z=$.find((U)=>U.kind==="rate-limit");if(!z)return 1500;let G=z.detail.match(/retry-after=(\d+)/);if(!G?.[1])return 1500;let J=Number.parseInt(G[1],10);if(Number.isNaN(J)||J>10)return 1500;return J*1000}async function aT2($,z,G={}){let J=xP5(G),U=[],K=new Set,X=null,Q=!1;for(let Z of J){if(z.signal?.aborted)break;if(Q&&Z==="impersonate")continue;let Y=await pT2(Z,$,z);if(!Y)continue;if(U.push({strategy:Z,platform:Y.platform,status:Y.status,httpStatus:Y.httpStatus,elapsedMs:Y.elapsedMs,signals:Y.signals,error:Y.error}),Y.signals.some((j)=>j.kind==="js-essential"))Q=!0;if(Kd(Y))return Y.attempts=U,Y;if(iP5(Y))return Y.attempts=U,Y;if(G.retryOnRateLimit!==!1&&N02(Y.signals)&&!K.has(Z)){K.add(Z),await gP5(mP5(Y.signals));let j=await pT2(Z,$,z);if(j){if(U.push({strategy:Z,platform:j.platform,status:j.status,httpStatus:j.httpStatus,elapsedMs:j.elapsedMs,signals:j.signals,error:j.error}),Kd(j))return j.attempts=U,j;X=j;continue}}X=Y}if(!J.includes("archive")&&G.includeArchive!==!1){let Z=await Sk($,z);if(U.push({strategy:"archive",platform:Z.platform,status:Z.status,httpStatus:Z.httpStatus,elapsedMs:Z.elapsedMs,signals:Z.signals,error:Z.error}),Kd(Z))return Z.attempts=U,Z;X=Z}if(X)return X.attempts=U,X;return{url:$.toString(),status:"error",strategy:J[0]??"probe",content:"",elapsedMs:0,signals:[],attempts:U,error:"all strategies failed"}}Y8();var _E2=p2(bE2(),1);var kC5=["/rss","/feed","/atom.xml","/rss.xml","/index.xml"],LC5=new _E2.XMLParser({ignoreAttributes:!1,attributeNamePrefix:"@_",textNodeName:"#text"});function Ld($){if($===void 0||$===null)return[];return Array.isArray($)?$:[$]}function w3($){if($==null)return;if(typeof $==="string")return $;if(typeof $==="object"){let z=$;if(typeof z["#text"]==="string")return z["#text"];if(typeof z["#cdata"]==="string")return z["#cdata"]}return}function CE2($){for(let z of Ld($)){let G=z?.["@_href"],J=z?.["@_rel"];if(typeof G==="string"&&(J===void 0||J==="alternate"))return G}return}function SE2($){let z;try{z=LC5.parse($)}catch{return null}let G=z.rss;if(G){let U=G.channel;if(!U)return null;let K=Ld(U.item);return{kind:"rss",title:w3(U.title),description:w3(U.description),link:w3(U.link),entries:K.map((X)=>({title:w3(X.title),link:w3(X.link),pubDate:w3(X.pubDate),description:w3(X.description),content:w3(X["content:encoded"])??w3(X.content)}))}}let J=z.feed;if(J){let U=Ld(J.entry);return{kind:"atom",title:w3(J.title),description:w3(J.subtitle),link:CE2(J.link),entries:U.map((K)=>({title:w3(K.title),link:CE2(K.link),pubDate:w3(K.published)??w3(K.updated),description:w3(K.summary),content:w3(K.content)??w3(K.summary)}))}}return null}async function yE2($,z){let G=performance.now(),J;try{let K=await d1($.toString(),{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(K.ok)J=Ju(K.text).alternate?.[0]?.href}catch{}let U=new Set;if(J)try{U.add(new URL(J,$).toString())}catch{}for(let K of kC5)U.add(new URL(K,`${$.protocol}//${$.host}`).toString());for(let K of U){if(z.signal?.aborted)break;try{let X=await d1(K,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!X.ok||X.text.length<50)continue;let Q=SE2(X.text);if(!Q||Q.entries.length===0)continue;return{url:$.toString(),status:"ok",strategy:"probe",platform:"rss",httpStatus:X.status,content:X.text,contentType:X.headers.get("content-type")??void 0,elapsedMs:Math.round(performance.now()-G),signals:[],feedUrl:K,feed:Q}}catch{}}return{url:$.toString(),status:"not-found",strategy:"probe",platform:"rss",content:"",elapsedMs:Math.round(performance.now()-G),signals:[],error:"no RSS/Atom feed discovered"}}function hE2($,z="en-US"){let[G,J]=z.split("-"),U=new URL("https://news.google.com/rss/search");return U.searchParams.set("q",$),U.searchParams.set("hl",G??"en"),U.searchParams.set("gl",J??"US"),U.searchParams.set("ceid",`${J??"US"}:${G??"en"}`),U.toString()}kk();Y8();var bM={"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 WC5($){return $.replace(/^www\./,"")}function HC5($){if($ in bM){let G=bM[$];return G?{...G}:null}let z=WC5($);if(z in bM){let G=bM[z];return G?{...G}:null}return null}function BC5($){let z=$.split(".").pop();if(z==="gov"||z==="edu"||z==="mil")return{domain:$,level:"verified",score:0.9,tags:["institution"],source:"heuristic"};if(/\.gov\.[a-z]{2}$/.test($)||/\.ac\.[a-z]{2}$/.test($))return{domain:$,level:"verified",score:0.85,tags:["institution"],source:"heuristic"};return null}async function AC5($){try{let z=await d1(`https://tranco-list.eu/api/ranks/domain/${$}`,{timeoutMs:5000});if(!z.ok)return null;let J=JSON.parse(z.text).ranks?.[0]?.rank;if(!J)return null;let U=J<1e4?0.6:J<1e5?0.4:0.2;return{domain:$,level:J<1e4?"community":"external",score:U,tags:["tranco"],source:"tranco",rank:J}}catch{return null}}async function xE2($){let z=HC5($);if(z)return z;let G=BC5($);if(G)return G;let J=await AC5($);if(J)return J;return{domain:$,level:"unknown",score:null,tags:[],source:"heuristic"}}var iE2=["api","probe","impersonate","browser","archive"];function gE2($){if(!$)return;let z=$.split(",").map((J)=>J.trim()).filter(Boolean),G=z.filter((J)=>!iE2.includes(J));if(G.length>0)throw Error(`Unknown strategy: ${G.join(", ")}. Valid: ${iE2.join(", ")}`);return z}function gZ($){try{return new URL($)}catch{throw Error(`Invalid URL: ${$}`)}}function pz($){return{timeoutMs:$.timeout?Math.max(1000,Math.floor(Number($.timeout)*1000)):15000,locale:$.locale??"en-US,en;q=0.9"}}function c0($,z){if(z)console.log(JSON.stringify($,null,2));else console.log(JSON.stringify($))}function ZU($){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 mE2($){let z=$.command("search").description("Mechanical search primitives — fetch, meta, rss, media, trust, code").alias("s");z.command("fetch <url>").description("Fetch URL via auto-escalating strategy pipeline").option("--only <strategies>","Comma-separated strategies to run").option("--skip <strategies>","Comma-separated strategies to skip").option("--include-archive","Include archive strategy as last fallback").option("--timeout <seconds>","Per-strategy timeout","15").option("--locale <value>","Accept-Language header","en-US,en;q=0.9").option("--pretty","Pretty-print JSON output").action(async(G,J)=>{try{let U=gZ(G),K=pz(J),X=await aT2(U,K,{only:gE2(J.only),skip:gE2(J.skip),includeArchive:J.includeArchive});c0(X,Boolean(J.pretty)),ZU(X)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.command("api <url>").description("Fetch via matched platform API (Phase 0)").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(G,J)=>{try{let U=gZ(G);if(!By(U)){console.error(S8.default.yellow(`No API handler matches host ${U.hostname}`)),process.exitCode=3;return}let X=pz(J),Q=await xF(U,X);if(!Q){process.exitCode=3;return}c0(Q,Boolean(J.pretty)),ZU(Q)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.command("api:search <query>").description("Fan-out keyword search across platforms that support it").option("--platforms <list>","Comma-separated platform ids").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(G,J)=>{let U=pz(J),K=J.platforms?J.platforms.split(",").map((Q)=>Q.trim()).filter(Boolean):void 0,X=await f$(G,U,K);c0(X,Boolean(J.pretty))}),z.command("meta <url>").description("Extract OGP / JSON-LD / Schema.org from URL").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(G,J)=>{try{let U=gZ(G),K=pz(J),X=await PK2(U,K),{content:Q,...Z}=X;c0(Z,Boolean(J.pretty)),ZU(X)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.command("rss <url>").description("Discover and parse RSS/Atom feed for a URL").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(G,J)=>{try{let U=gZ(G),K=pz(J),X=await yE2(U,K),{content:Q,...Z}=X;c0(Z,Boolean(J.pretty)),ZU(X)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.command("rss:google <query>").description("Build Google News RSS URL for a query").option("--locale <value>","Locale (e.g., ko-KR)","en-US").action((G,J)=>{let U=hE2(G,J.locale??"en-US");console.log(U)}),z.command("media <url>").description("Extract media metadata via yt-dlp (1858 sites)").option("--subs","Write subtitles").option("--sub-lang <list>","Subtitle languages (comma-separated)","en").option("--format <spec>","yt-dlp format spec").option("--timeout <seconds>","Timeout","30").option("--pretty","Pretty-print JSON").action(async(G,J)=>{try{let U=gZ(G),K=pz(J),X=J.subLang?J.subLang.split(",").map((Z)=>Z.trim()).filter(Boolean):void 0,Q=await vK2(U,K,{subtitles:J.subs,...X?{subLangs:X}:{},...J.format?{format:J.format}:{}});c0(Q,Boolean(J.pretty)),ZU(Q)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.command("archive <url>").description("Fetch via AMP / archive.today / Wayback").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(G,J)=>{try{let U=gZ(G),K=pz(J),X=await Sk(U,K);c0(X,Boolean(J.pretty)),ZU(X)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.command("trust <domain>").description("Resolve trust level / score for a domain").option("--pretty","Pretty-print JSON").action(async(G,J)=>{let U=await xE2(G.toLowerCase());c0(U,Boolean(J.pretty))}),z.command("code <query>").description("Search code via gh / glab").option("--host <github|gitlab>","Host","github").option("--language <lang>","Language filter").option("--repo <owner/repo>","Scope to a repo").option("--limit <n>","Max results","20").option("--pretty","Pretty-print JSON").action(async(G,J)=>{let U=J.host==="gitlab"||J.host==="github"?J.host:"github",K=pz({}),X=await RK2(G,K,{host:U,...J.language?{language:J.language}:{},...J.repo?{repo:J.repo}:{},...J.limit?{limit:Number.parseInt(J.limit,10)}:{}});c0(X,Boolean(J.pretty)),ZU(X)}),z.command("doctor").description("Check dependencies (Chrome, python3 curl_cffi, yt-dlp, gh)").action(async()=>{let G=[],J=Ud();G.push({name:"chrome",ok:Boolean(J),detail:J??"Install Chrome or set OMA_CHROME_PATH"}),G.push(await Wd("python3",["--version"])),G.push(await VC5()),G.push(await Wd("yt-dlp",["--version"])),G.push(await Wd("gh",["--version"]));for(let U of G){let K=U.ok?S8.default.green("✓"):S8.default.yellow("!");console.log(`${K} ${U.name}: ${U.detail}`)}if(G.some((U)=>!U.ok))process.exitCode=1})}async function Wd($,z){return new Promise((G)=>{let{spawn:J}=X2("node:child_process"),U=J($,z,{stdio:["ignore","pipe","pipe"]}),K="";U.stdout?.on("data",(X)=>{K+=X.toString()}),U.on("error",()=>G({name:$,ok:!1,detail:"not found"})),U.on("close",(X)=>{if(X===0)G({name:$,ok:!0,detail:K.trim()});else G({name:$,ok:!1,detail:`exit code ${X}`})})})}async function VC5(){return new Promise(($)=>{let{spawn:z}=X2("node:child_process"),G=z("python3",["-c","import curl_cffi; print(curl_cffi.__version__)"],{stdio:["ignore","pipe","pipe"]}),J="";G.stdout?.on("data",(U)=>{J+=U.toString()}),G.on("error",()=>$({name:"curl_cffi",ok:!1,detail:"python3 not found"})),G.on("close",(U)=>{if(U===0)$({name:"curl_cffi",ok:!0,detail:`v${J.trim()}`});else $({name:"curl_cffi",ok:!1,detail:"not installed (pip install curl_cffi)"})})})}K7();var az=p2(I4(),1);import{execSync as FC5,spawnSync as fE2}from"node:child_process";import{platform as NC5}from"node:os";function uC5(){let $=NC5();if($==="darwin")return"brew install gh";if($==="win32")return"winget install GitHub.cli";return"sudo apt install gh"}async function lE2(){if(console.clear(),d4(az.default.bgMagenta(az.default.white(" ⭐ oh-my-agent star "))),!qG()){let z=uC5(),G=await F3({message:`GitHub CLI (gh) is not installed. Install with ${az.default.cyan(z)}?`});if(j4(G)||!G){P5("Install gh manually and try again.");return}let J=D6();J.start("Installing GitHub CLI...");let U=fE2(z,{shell:!0,stdio:"pipe"});if(U.status!==0){J.stop("Installation failed"),$4.error(U.stderr?.toString()||"Unknown error"),P5("Please install gh manually.");return}J.stop("GitHub CLI installed!")}if(!J8()){$4.warn("GitHub CLI is not authenticated.");let z=await F3({message:`Run ${az.default.cyan("gh auth login")} now?`});if(j4(z)||!z){P5("Authenticate and try again.");return}if(fE2("gh",["auth","login"],{stdio:"inherit"}),!J8()){P5("Authentication was not completed. Try again.");return}$4.success("Authenticated!")}if(DG()){P5(`Already starred ${az.default.cyan(K1)}! Thank you! \uD83D\uDE4F`);return}let $=await F3({message:`Star ${az.default.cyan(K1)} on GitHub?`});if(j4($)||!$){P5("Maybe next time!");return}try{FC5(`gh api -X PUT /user/starred/${K1}`,{stdio:"ignore"}),P5(`Starred ${az.default.cyan(K1)}! Thank you! \uD83C\uDF1F`)}catch{$4.error("Failed to star the repository."),P5("Please try again later.")}}function cE2($){$.command("star").description("Star oh-my-agent on GitHub").action(j5(async()=>{await lE2()}))}K7();yx();Kj();var P3=p2(I4(),1);import{existsSync as CM,mkdirSync as OC5,readdirSync as qC5,readFileSync as DC5,writeFileSync as pE2}from"node:fs";import{dirname as MC5,join as aE2}from"node:path";function IC5($){let z=_e($),G={},J=0,U=0;for(let K of z){J+=K.tokens;let X=Ce(K.tokens,K.vendor);U+=X;let Q=G[K.vendor]??{tokens:0,spawns:0,usd:0};Q.tokens+=K.tokens,Q.spawns+=1,Q.usd+=X,G[K.vendor]=Q}return{totalTokens:J,totalSpawns:z.length,estimatedUsd:U,byVendor:G}}function nE2($){return $.toLocaleString("en-US")}function dE2($){if($===0)return"$0.00";if($<0.01)return"<$0.01";return`$${$.toFixed(2)}`}function Bd($){return aE2($,".serena","metrics.json")}function Hd(){return{sessions:0,skillsUsed:{},tasksCompleted:0,totalSessionTime:0,filesChanged:0,linesAdded:0,linesRemoved:0,lastUpdated:new Date().toISOString(),startDate:new Date().toISOString()}}function TC5($){let z=Bd($);if(CM(z))try{return JSON.parse(DC5(z,"utf-8"))}catch{return Hd()}return Hd()}function EC5($,z){let G=Bd($),J=MC5(G);if(!CM(J))OC5(J,{recursive:!0});z.lastUpdated=new Date().toISOString(),pE2(G,JSON.stringify(z,null,2),"utf-8")}function RC5($){let z=aE2($,".serena","memories"),G={};if(!CM(z))return G;try{let J=qC5(z);for(let U of J){let K=U.match(/(?:progress|result)-(\w+)/);if(K?.[1]){let X=K[1];G[X]=(G[X]||0)+1}}}catch{}return G}async function oE2($=!1,z=!1){let G=process.cwd(),J=Bd(G);if(z){if(CM(J))pE2(J,JSON.stringify(Hd(),null,2),"utf-8");if($)console.log(JSON.stringify({reset:!0}));else console.log(P3.default.green("✅ Metrics reset successfully."));return}let U=TC5(G),K=oN(G),X=RC5(G),Q=ke(G),Z=dA(G),Y=Z.startedAt?new Date(Z.startedAt):null,j=Y&&!Number.isNaN(Y.getTime())?Math.max(0,Math.floor((Date.now()-Y.getTime())/1000)):0;for(let[A,V]of Object.entries(X))U.skillsUsed[A]=(U.skillsUsed[A]||0)+V;if(Q>U.tasksCompleted)U.tasksCompleted=Q;if(Z.id){if(["completed","failed","aborted"].includes(Z.status||"")&&(U.lastSessionId!==Z.id||U.lastSessionStatus!==Z.status)&&j>0)U.totalSessionTime+=j;U.lastSessionId=Z.id,U.lastSessionStatus=Z.status,U.lastSessionStarted=Z.startedAt,U.lastSessionDuration=j}U.filesChanged+=K.filesChanged,U.linesAdded+=K.linesAdded,U.linesRemoved+=K.linesRemoved,U.sessions+=1,EC5(G,U);let k=Math.max(1,Math.ceil((Date.now()-new Date(U.startDate).getTime())/86400000)),W=U.sessions>0?Math.round(U.totalSessionTime/U.sessions):0,L=IC5(G);if($){console.log(JSON.stringify({...U,gitStats:K,daysSinceStart:k,avgSessionTime:W,cost:L},null,2));return}console.clear(),d4(P3.default.bgMagenta(P3.default.white(" \uD83D\uDCCA oh-my-agent stats ")));let H=[P3.default.bold(`\uD83D\uDCC8 Productivity Metrics (${k} days)`),"┌─────────────────────┬──────────────┐",`│ ${P3.default.bold("Metric")} │ ${P3.default.bold("Value")} │`,"├─────────────────────┼──────────────┤",`│ Sessions │ ${String(U.sessions).padEnd(12)} │`,`│ Tasks Completed │ ${String(U.tasksCompleted).padEnd(12)} │`,`│ Files Changed │ ${String(U.filesChanged).padEnd(12)} │`,`│ Lines Added │ ${P3.default.green(`+${U.linesAdded}`).padEnd(12)} │`,`│ Lines Removed │ ${P3.default.red(`-${U.linesRemoved}`).padEnd(12)} │`,"└─────────────────────┴──────────────┘"].join(`
|
|
1613
1613
|
`);if(G5(H,"Overview"),L.totalSpawns>0){let A=Object.entries(L.byVendor).sort(([,F],[,N])=>N.tokens-F.tokens).map(([F,N])=>` ${F.padEnd(12)} ${nE2(N.tokens).padStart(12)} tokens · ${String(N.spawns).padStart(3)} spawns · ${dE2(N.usd).padStart(7)}`),V=[P3.default.bold("\uD83D\uDCB0 Cost Telemetry (all sessions)"),"┌─────────────────────┬──────────────┐",`│ ${P3.default.bold("Metric")} │ ${P3.default.bold("Value")} │`,"├─────────────────────┼──────────────┤",`│ Total tokens (est.) │ ${nE2(L.totalTokens).padEnd(12)} │`,`│ Total spawns │ ${String(L.totalSpawns).padEnd(12)} │`,`│ Estimated USD │ ${dE2(L.estimatedUsd).padEnd(12)} │`,"└─────────────────────┴──────────────┘",P3.default.dim("By vendor (sorted by tokens):"),...A,P3.default.dim("Estimate is input-only (prompt char approximation); output tokens not yet tracked."),P3.default.dim("Configure session.quota_cap in .agents/oma-config.yaml to enforce budgets.")].join(`
|
|
1614
1614
|
`);G5(V,"Cost")}let B=Object.entries(U.skillsUsed).sort(([,A],[,V])=>V-A).slice(0,5);if(B.length>0){let A=[P3.default.bold("\uD83C\uDFC6 Top Skills Used"),...B.map(([V,F],N)=>` ${N+1}. ${V} (${F})`)].join(`
|
|
1615
|
-
`);G5(A,"Skills")}P5(P3.default.dim(`Data stored in: ${J}`))}function rE2($){$3($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(j5(async(z)=>{await oE2(l1(z),z.reset)},{supportsJsonOutput:!0}))}K7();var c4=p2(I4(),1);import{execSync as SC5}from"node:child_process";import{cpSync as yM,existsSync as y9,mkdirSync as rW,readFileSync as mZ,rmSync as Ad,writeFileSync as jU}from"node:fs";import{tmpdir as yC5}from"node:os";import{dirname as $R2,join as W3}from"node:path";var _M=p2(I4(),1);import{execSync as vC5,spawn as wC5}from"node:child_process";import{realpathSync as sE2}from"node:fs";import oW from"node:process";var YU="oh-my-agent";function PC5($=oW.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(oW.env.IS_BINARY==="true")return{packageManager:"binary",isGlobal:!0,updateMessage:"Running as a standalone binary. Download the latest release from GitHub."};let z;try{z=Q9(sE2($))}catch{return{packageManager:"unknown",isGlobal:!1}}if(z.includes("/.npm/_npx")||z.includes("/npm/_npx"))return{packageManager:"npx",isGlobal:!1,updateMessage:"Running via npx, auto-update not applicable."};if(z.includes("/.pnpm/_pnpx")||z.includes("/.cache/pnpm/dlx"))return{packageManager:"pnpx",isGlobal:!1,updateMessage:"Running via pnpx, auto-update not applicable."};if(z.includes("/.bun/install/cache"))return{packageManager:"bunx",isGlobal:!1,updateMessage:"Running via bunx, auto-update not applicable."};if(oW.platform==="darwin")try{let G=vC5(`brew --prefix ${YU}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(G){let J=Q9(sE2(G));if(z.startsWith(J))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${YU}`,updateMessage:"Installed via Homebrew. Updating in background..."}}}catch{}if(z.includes("/.pnpm/global")||z.includes("/.local/share/pnpm"))return{packageManager:"pnpm",isGlobal:!0,updateCommand:`pnpm add -g ${YU}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(z.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${YU}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(z.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${YU}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${YU}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var tE2=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function bC5($,z){let G=$.match(tE2),J=z.match(tE2);if(!G||!J)return!1;for(let U=1;U<=3;U++){let K=Number(G[U]),X=Number(J[U]);if(K<X)return!0;if(K>X)return!1}return!1}async function CC5($=YU,z=2000){try{let G=await y$.get(`https://registry.npmjs.org/${$}/latest`,{timeout:z});return typeof G.data?.version==="string"?G.data.version:null}catch{return null}}async function eE2($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(oW.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(oW.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let z=await CC5();if(!z)return{triggered:!1,reason:"fetch-failed"};if(!bC5($.currentVersion,z))return{triggered:!1,reason:"up-to-date",latest:z};let G=PC5();if(!G.updateCommand)return $.onNotice?.(_M.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. ${G.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:z};try{return wC5(G.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(_M.default.cyan(`global oh-my-agent ${$.currentVersion} → ${z} updating in background. New version applies on next run.`)),{triggered:!0,latest:z}}catch{return $.onNotice?.(_M.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. Run: ${G.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:z}}}var SM={name:"oh-my-agent",version:"7.
|
|
1615
|
+
`);G5(A,"Skills")}P5(P3.default.dim(`Data stored in: ${J}`))}function rE2($){$3($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(j5(async(z)=>{await oE2(l1(z),z.reset)},{supportsJsonOutput:!0}))}K7();var c4=p2(I4(),1);import{execSync as SC5}from"node:child_process";import{cpSync as yM,existsSync as y9,mkdirSync as rW,readFileSync as mZ,rmSync as Ad,writeFileSync as jU}from"node:fs";import{tmpdir as yC5}from"node:os";import{dirname as $R2,join as W3}from"node:path";var _M=p2(I4(),1);import{execSync as vC5,spawn as wC5}from"node:child_process";import{realpathSync as sE2}from"node:fs";import oW from"node:process";var YU="oh-my-agent";function PC5($=oW.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(oW.env.IS_BINARY==="true")return{packageManager:"binary",isGlobal:!0,updateMessage:"Running as a standalone binary. Download the latest release from GitHub."};let z;try{z=Q9(sE2($))}catch{return{packageManager:"unknown",isGlobal:!1}}if(z.includes("/.npm/_npx")||z.includes("/npm/_npx"))return{packageManager:"npx",isGlobal:!1,updateMessage:"Running via npx, auto-update not applicable."};if(z.includes("/.pnpm/_pnpx")||z.includes("/.cache/pnpm/dlx"))return{packageManager:"pnpx",isGlobal:!1,updateMessage:"Running via pnpx, auto-update not applicable."};if(z.includes("/.bun/install/cache"))return{packageManager:"bunx",isGlobal:!1,updateMessage:"Running via bunx, auto-update not applicable."};if(oW.platform==="darwin")try{let G=vC5(`brew --prefix ${YU}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(G){let J=Q9(sE2(G));if(z.startsWith(J))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${YU}`,updateMessage:"Installed via Homebrew. Updating in background..."}}}catch{}if(z.includes("/.pnpm/global")||z.includes("/.local/share/pnpm"))return{packageManager:"pnpm",isGlobal:!0,updateCommand:`pnpm add -g ${YU}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(z.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${YU}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(z.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${YU}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${YU}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var tE2=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function bC5($,z){let G=$.match(tE2),J=z.match(tE2);if(!G||!J)return!1;for(let U=1;U<=3;U++){let K=Number(G[U]),X=Number(J[U]);if(K<X)return!0;if(K>X)return!1}return!1}async function CC5($=YU,z=2000){try{let G=await y$.get(`https://registry.npmjs.org/${$}/latest`,{timeout:z});return typeof G.data?.version==="string"?G.data.version:null}catch{return null}}async function eE2($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(oW.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(oW.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let z=await CC5();if(!z)return{triggered:!1,reason:"fetch-failed"};if(!bC5($.currentVersion,z))return{triggered:!1,reason:"up-to-date",latest:z};let G=PC5();if(!G.updateCommand)return $.onNotice?.(_M.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. ${G.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:z};try{return wC5(G.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(_M.default.cyan(`global oh-my-agent ${$.currentVersion} → ${z} updating in background. New version applies on next run.`)),{triggered:!0,latest:z}}catch{return $.onNotice?.(_M.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. Run: ${G.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:z}}}var SM={name:"oh-my-agent",version:"7.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","generate:skill-data":"node ./scripts/generate-skill-data.mjs",build:"bun run generate:skill-data && bun run sync:readme && bun build cli.ts --outfile bin/cli.js --target node --minify --external @napi-rs/keyring",dev:"bun run generate:skill-data && 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","@napi-rs/keyring":"^1.3.0",axios:"^1.15.0","better-sqlite3":"^12.9.0",chokidar:"^5.0.0",commander:"^14.0.3","date-fns":"^4.1.0",eld:"^2.0.3","fast-xml-parser":"^4",minimatch:"^10.2.5","p-map":"^7.0.4",picocolors:"^1.1.1","puppeteer-core":"^24",remark:"^15.0.1","remark-frontmatter":"^5.0.0","remark-parse":"^11.0.0","smol-toml":"^1.6.1",unified:"^11.0.5",ws:"^8.18.0",yaml:"^2.8.2",zod:"^4.3.6"},devDependencies:{"@biomejs/biome":"2.4.5","@types/better-sqlite3":"^7.6.13","@types/mdast":"^4.0.4","@types/node":"^24","@types/ws":"^8.18.1","@vitest/coverage-v8":"^4.1.4",typescript:"^6",vitest:"^4.0.18"},repository:{type:"git",url:"https://github.com/first-fluke/oh-my-agent"},antigravity:{skillsPath:".agents/skills",skills:["oma-architecture","oma-brainstorm","oma-coordination","oma-pm","oma-frontend","oma-backend","oma-db","oma-mobile","oma-qa","oma-debug","oma-orchestrator","oma-dev-workflow","oma-tf-infra","oma-scm","oma-pdf","oma-recap"]}};function hC5($){if(!$)return{intro:(G)=>d4(G),outro:(G)=>P5(G),note:(G,J)=>G5(G,J),logError:(G)=>$4.error(G),spinnerStart:(G)=>{let J=D6();return J.start(G),J}};let z={start(G){},stop(G){if(G)console.log(G)},message(G){console.log(G)}};return{intro:(G)=>console.log(G),outro:(G)=>console.log(G),note:(G,J)=>console.log(G),logError:(G)=>console.error(G),spinnerStart:(G)=>{return console.log(G),z}}}function xC5($,z){if($!==null)return"ready";return z?"legacy":"missing"}async function Vd($=!1,z=!1){if(!z&&process.stdout.isTTY)console.clear();let G=hC5(z);G.intro(c4.default.bgMagenta(c4.default.white(" \uD83D\uDEF8 oh-my-agent update ")));let J=process.cwd();await eE2({currentVersion:SM.version,enabled:V82(J),onSpawnStart:(j)=>G.note(j,"CLI auto-update"),onNotice:(j)=>G.note(j,"CLI update available")});let U=await uF(J),K=Q82(J),X=xC5(U,K);if(X==="missing"){if(G.logError("oh-my-agent is not installed in this project. Run `oma install` first."),z)throw Error("oh-my-agent is not installed in this project. Run `oma install` first.");process.exit(1)}let Q=cG(J);if(Q.length>0)G.note(Q.map((j)=>`${c4.default.green("✓")} ${j}`).join(`
|
|
1616
1616
|
`),"Migration");let Z=Q.length>0||aS(J);if(Q.length>0&&!aS(J))oS(J,!0);if(!z)await DF(J);if(X==="legacy")G.note("Existing .agents installation detected without _version.json. Updating in place and restoring version metadata.","Legacy install");let Y;try{Y=G.spinnerStart("Checking for updates...");let j=await W82();if(U===j.version&&!Z){Y.stop(c4.default.green("Already up to date!")),G.outro(`Current version: ${c4.default.cyan(U)}`);return}let k=U===j.version;Y.message(`Downloading ${c4.default.cyan(j.version)}...`);let{dir:W,cleanup:L}=await oK();try{Y.message("Copying files..."),cG(J);let H=W3(J,".agents","oma-config.yaml"),B=W3(J,".agents","mcp.json"),A=!$&&y9(H)?mZ(H):null,V=!$&&y9(B)?mZ(B):null,F=W3(yC5(),`oma-stack-backup-${Date.now()}`),N=W3(J,".agents","skills","oma-backend","stack"),u=!$&&y9(N);if(u)rW(F,{recursive:!0}),yM(N,W3(F,"oma-backend"),{recursive:!0});let q=["snippets.md","tech-stack.md","api-template.py"],I=W3(J,".agents","skills","oma-backend","resources"),M=!$&&!u&&q.some((J2)=>y9(W3(I,J2))),D=rS(J);if(yM(W3(W,".agents"),W3(J,".agents"),{recursive:!0,force:!0}),A)jU(H,A);if(V)jU(B,V);if(u)try{rW(N,{recursive:!0}),yM(W3(F,"oma-backend"),N,{recursive:!0,force:!0})}finally{Ad(F,{recursive:!0,force:!0})}if(M){let J2=W3(W,".agents","skills","oma-backend","variants","python");if(y9(J2))rW(N,{recursive:!0}),yM(J2,N,{recursive:!0,force:!0}),jU(W3(N,"stack.yaml"),`language: python
|
|
1617
1617
|
framework: fastapi
|
|
1618
1618
|
orm: sqlalchemy
|
package/package.json
CHANGED