oh-my-agent 7.3.2 → 7.4.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/README.md +3 -1
- package/bin/cli.js +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -70,6 +70,7 @@ Pick a preset and you're ready:
|
|
|
70
70
|
| **oma-coordination** | Manual step-by-step multi-agent coordination guide |
|
|
71
71
|
| **oma-db** | Schema design, migrations, indexing, vector DB |
|
|
72
72
|
| **oma-debug** | Root cause analysis, fixes, regression tests |
|
|
73
|
+
| **oma-deepsec** | Drives Vercel deepsec — agent-powered vulnerability scanning, PR gate, custom matchers |
|
|
73
74
|
| **oma-design** | Design systems, tokens, accessibility, responsive |
|
|
74
75
|
| **oma-dev-workflow** | CI/CD, releases, monorepo automation |
|
|
75
76
|
| **oma-docs** | Reference integrity checks, diff-affected doc detection |
|
|
@@ -118,6 +119,7 @@ Or use slash commands for structured workflows:
|
|
|
118
119
|
| 3 | `/ultrawork` | 5-phase quality workflow with 11 review gates |
|
|
119
120
|
| 3 | `/ralph` | Wraps `/ultrawork` in an independent verifier loop until criteria pass |
|
|
120
121
|
| 4 | `/review` | Security + performance + accessibility audit |
|
|
122
|
+
| 4 | `/deepsec` | Deep agent-powered security scan via Vercel deepsec |
|
|
121
123
|
| 5 | `/debug` | Structured root-cause debugging |
|
|
122
124
|
| 5 | `/docs` | Documentation drift verify + sync via `oma-docs` |
|
|
123
125
|
| 6 | `/scm` | SCM + Git workflow and Conventional Commit support |
|
|
@@ -153,7 +155,7 @@ Set `model_preset` in `.agents/oma-config.yaml` to choose which AI models each a
|
|
|
153
155
|
|
|
154
156
|
```yaml
|
|
155
157
|
language: en
|
|
156
|
-
model_preset: antigravity # claude-only | codex-only | gemini-only | qwen-only | antigravity
|
|
158
|
+
model_preset: antigravity # claude-only | codex-only | gemini-only | qwen-only | cursor-only | antigravity
|
|
157
159
|
|
|
158
160
|
# Optional per-agent overrides
|
|
159
161
|
agents:
|
package/bin/cli.js
CHANGED
|
@@ -902,7 +902,7 @@ ${U} = ${K}
|
|
|
902
902
|
`,xU($,J)}}function tr($,z,G){let J=z$(z,G.hookDir);ki2($,J),Qi2(J,G.vendor),Zi2(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 L={hooks:Z.map((H)=>({name:Xi2(H.hook),type:"command",command:or(G,H.hook),timeout:H.timeout}))},Y=Z.find((H)=>H.matcher)?.matcher;if(Y)L.matcher=Y;U[X]=[L]}let K={};if(G.statusLine)K.statusLine={type:"command",command:or(G,G.statusLine.hook)};if(G.extra)Object.assign(K,G.extra);if(Li2(z$(z,G.settingsFile),U,Object.keys(K).length>0?K:void 0),G.featureFlags)Yi2(z$(z,G.featureFlags.file),G.featureFlags.section,G.featureFlags.flags)}import{existsSync as Js,mkdirSync as qi2,readdirSync as Di2,readFileSync as Us,writeFileSync as Mi2}from"node:fs";import{join as lU}from"node:path";import{cpSync as VP5,existsSync as er,mkdirSync as $s,readdirSync as ji2,readFileSync as zs,writeFileSync as Ik}from"node:fs";import{join as pz}from"node:path";var Zu=".agents/rules",Hi2=".cursor/rules",Wi2=".claude/rules";function iP($){let z=pz($,Zu);if(!er(z))return[];return ji2(z).filter((G)=>G.endsWith(".md")).map((G)=>{let J=zs(pz(z,G),"utf-8"),{frontmatter:U,body:K}=yU(J);return{name:G.replace(".md",""),description:U.description||G.replace(".md",""),globs:U.globs||"",alwaysApply:U.alwaysApply||!1,body:K.trim()}})}function gU($){let z=iP($);if(z.length===0)return[];let G=pz($,Hi2);$s(G,{recursive:!0});let J=[];for(let U of z){let K=`<!-- Generated by oh-my-agent. Source: ${Zu}/${U.name}.md -->`,X=["---",`description: ${JSON.stringify(U.description)}`,`globs: ${U.globs?JSON.stringify(U.globs):""}`,`alwaysApply: ${U.alwaysApply}`,"---","",K,"",U.body,""].join(`
|
|
903
903
|
`);Ik(pz(G,`${U.name}.mdc`),X),J.push(U.name)}return J}function Gs($){let z=iP($);if(z.length===0)return[];let G=pz($,Wi2);$s(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=hU(K,`
|
|
904
904
|
${U.body}
|
|
905
|
-
`);Ik(pz(G,`${U.name}.md`),X),J.push(U.name)}return J}var Ai2="<!-- OMA:START — managed by oh-my-agent. Do not edit this block manually. -->",hP="<!-- OMA:END -->",ui2={claude:"CLAUDE.md",gemini:"GEMINI.md",codex:"AGENTS.md",cursor:"AGENTS.md",qwen:"AGENTS.md"},Bi2={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}`"},Vi2={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 Fi2($,z){let G=[Ai2,"","# 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**: ${Bi2[$]||"`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 |","| scm | `scm.md` | SCM + Git operations + Conventional Commits |","| docs | `docs.md` | Documentation drift verify + sync |","","To execute: read and follow `.agents/workflows/{name}.md` step by step.","","## Auto-Detection","",Vi2[$]||"","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 \`${Zu}/\` 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} | \`${Zu}/${J.name}.md\` | ${U} |`)}G.push("")}return G.push(hP),G.join(`
|
|
905
|
+
`);Ik(pz(G,`${U.name}.md`),X),J.push(U.name)}return J}var Ai2="<!-- OMA:START — managed by oh-my-agent. Do not edit this block manually. -->",hP="<!-- OMA:END -->",ui2={claude:"CLAUDE.md",gemini:"GEMINI.md",codex:"AGENTS.md",cursor:"AGENTS.md",qwen:"AGENTS.md"},Bi2={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}`"},Vi2={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 Fi2($,z){let G=[Ai2,"","# 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**: ${Bi2[$]||"`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 |","","To execute: read and follow `.agents/workflows/{name}.md` step by step.","","## Auto-Detection","",Vi2[$]||"","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 \`${Zu}/\` 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} | \`${Zu}/${J.name}.md\` | ${U} |`)}G.push("")}return G.push(hP),G.join(`
|
|
906
906
|
`)}var Ni2="<!-- OMA:START";function Oi2($,z){if(er($)){let G=zs($,"utf-8"),J=G.indexOf(Ni2),U=G.indexOf(hP);if(J!==-1&&U!==-1){let K=G.slice(0,J),X=G.slice(U+hP.length);Ik($,`${K}${z}${X}`)}else Ik($,`${G.trimEnd()}
|
|
907
907
|
|
|
908
908
|
${z}
|
|
@@ -1463,7 +1463,7 @@ print(json.dumps({
|
|
|
1463
1463
|
}))
|
|
1464
1464
|
`;function IN5(){return process.env.OMA_PYTHON??"python3"}function EN5($){if(DN5.some((z)=>$===z||$.endsWith(`.${z}`)))return["safari","chrome","firefox"];return["chrome","safari","firefox"]}async function TN5($,z,G){return new Promise((J)=>{let U=qN5(IN5(),["-c",MN5],{env:{...process.env,OMA_IMPERSONATE_URL:$.toString(),OMA_IMPERSONATE_TARGET:z,OMA_IMPERSONATE_LOCALE:G.locale,OMA_IMPERSONATE_TIMEOUT:String(G.timeoutMs)},stdio:["ignore","pipe","pipe"]}),K="",X="";U.stdout.on("data",(Z)=>{K+=Z.toString()}),U.stderr.on("data",(Z)=>{X+=Z.toString()});let Q=()=>{U.kill("SIGTERM")};G.signal?.addEventListener("abort",Q),U.on("close",(Z)=>{if(G.signal?.removeEventListener("abort",Q),Z!==0&&!K){J({error:`python_exit:${Z}:${X.trim().slice(0,200)}`});return}let k=K.trim();if(!k){J({error:"empty_stdout"});return}try{J(JSON.parse(k))}catch(L){J({error:`parse_error:${L.message}:${k.slice(0,200)}`})}}),U.on("error",(Z)=>{G.signal?.removeEventListener("abort",Q),J({error:`spawn_error:${Z.message}`})})})}function RN5($,z,G){let J=new Headers;if($.headers)for(let[U,K]of Object.entries($.headers))try{J.set(U,K)}catch{}return{ok:($.status??0)>=200&&($.status??0)<400,status:$.status??0,headers:J,url:$.url??z,text:$.body??"",elapsedMs:G,redirected:($.url??z)!==z}}async function gN2($,z){let G=EN5($.hostname),J=[],U=performance.now();for(let Q of G){if(z.signal?.aborted)break;let Z=performance.now(),k=await TN5($,Q,z),L=Math.round(performance.now()-Z);if(k.error==="curl_cffi_not_installed")return b1({url:$.toString(),strategy:"impersonate",error:Error("curl_cffi is not installed. Run: pip install curl_cffi")});if(k.error){J.push({target:Q,detail:k.error});continue}let Y=RN5(k,$.toString(),L),H=$7(Y);if(P02(H))return{url:$.toString(),status:"blocked",strategy:"impersonate",platform:Q,httpStatus:Y.status,content:Y.text,contentType:Y.headers.get("content-type")??void 0,elapsedMs:Math.round(performance.now()-U),signals:H,error:"js-essential-markers-detected"};if(Y.ok&&Y.text.length>=200)return{url:$.toString(),status:M6(Y,H),strategy:"impersonate",platform:Q,httpStatus:Y.status,content:Y.text,contentType:Y.headers.get("content-type")??void 0,elapsedMs:Math.round(performance.now()-U),signals:H};J.push({target:Q,detail:`status=${Y.status} size=${Y.text.length}`})}let K=Math.round(performance.now()-U),X=J.map((Q)=>`${Q.target}(${Q.detail})`).join(" | ");return{...b1({url:$.toString(),strategy:"impersonate",error:Error(X?`impersonate_failed: ${X}`:"impersonate_failed")}),elapsedMs:K,signals:[]}}var fN2="https://r.jina.ai/";function vN5($){let z=`${$.protocol}//${$.hostname}`,G=$.hostname.startsWith("m.")?$.hostname:`m.${$.hostname.replace(/^www\./,"")}`,J=new URL($.toString());return J.hostname=G,[{label:"jina",url:`${fN2}${$.toString()}`,headers:PG({accept:"text/plain"})},{label:"jina-json",url:`${fN2}${$.toString()}`,headers:PG({accept:"application/json"})},{label:"curl-desktop",url:$.toString(),headers:PG({userAgent:$8.desktopFirefox,referer:z})},{label:"curl-mobile",url:J.toString(),headers:PG({userAgent:$8.mobileSafari,referer:z})},{label:"curl-googlebot",url:$.toString(),headers:PG({userAgent:$8.googlebot})}]}function wN5($,z){if(!$.startsWith("jina"))return z;return z}async function lN2($,z){let G=vN5($),J=new AbortController;if(z.signal)if(z.signal.aborted)J.abort(z.signal.reason);else z.signal.addEventListener("abort",()=>J.abort(z.signal?.reason));let U=performance.now(),K={},X=null,Q=G.map(async(Z)=>{let k=await m1(Z.url,{headers:Z.headers,timeoutMs:z.timeoutMs,signal:J.signal,locale:z.locale}),L=$7(k);if(Z.label.startsWith("jina")){let Y=v02(k);if(Y)throw X=Y,Error(`jina-quota:${Y.detail}`)}if(!PN5(k,L))throw K[Z.label]=`status=${k.status} size=${k.text.length}`,Error(`weak-response:${Z.label}`);return{label:Z.label,resp:k,signals:L}});try{let Z=await Promise.any(Q);J.abort();let k=Math.round(performance.now()-U);return{url:$.toString(),status:M6(Z.resp,Z.signals),strategy:"probe",platform:Z.label,httpStatus:Z.resp.status,content:wN5(Z.label,Z.resp.text),contentType:Z.resp.headers.get("content-type")??void 0,elapsedMs:k,signals:X?[...Z.signals,X]:Z.signals}}catch(Z){let k=Math.round(performance.now()-U),L=Object.entries(K).map(([Y,H])=>`${Y}:${H}`).join(" ");if(X)return{...b1({url:$.toString(),error:Error(`probe failed — ${L}`),strategy:"probe"}),elapsedMs:k,signals:[X]};return{...b1({url:$.toString(),error:Z instanceof AggregateError?Error(L):Z,strategy:"probe"}),elapsedMs:k}}}function PN5($,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 bN5=["api","probe","impersonate","browser","archive"];function CN5($){if($.only?.length)return $.only;let z=bN5.slice();if(!$.includeArchive)z=z.filter((G)=>G!=="archive");if($.skip?.length)z=z.filter((G)=>!$.skip?.includes(G));return z}async function cN2($,z,G){switch($){case"api":return await sV(z,G)??null;case"probe":return lN2(z,G);case"impersonate":return gN2(z,G);case"browser":return mN2(z,G);case"archive":return mL(z,G)}}function cl($){if($.status==="ok")return!0;if($.status==="auth-required"&&b02($.signals))return!0;return!1}function SN5($){return $.status==="auth-required"||$.status==="invalid-input"||$.status==="not-found"}async function _N5($){let z=Math.floor(Math.random()*500);await new Promise((G)=>setTimeout(G,$+z))}function yN5($){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 nN2($,z,G={}){let J=CN5(G),U=[],K=new Set,X=null,Q=!1;for(let Z of J){if(z.signal?.aborted)break;if(Q&&Z==="impersonate")continue;let k=await cN2(Z,$,z);if(!k)continue;if(U.push({strategy:Z,platform:k.platform,status:k.status,httpStatus:k.httpStatus,elapsedMs:k.elapsedMs,signals:k.signals,error:k.error}),k.signals.some((L)=>L.kind==="js-essential"))Q=!0;if(cl(k))return k.attempts=U,k;if(SN5(k))return k.attempts=U,k;if(G.retryOnRateLimit!==!1&&C02(k.signals)&&!K.has(Z)){K.add(Z),await _N5(yN5(k.signals));let L=await cN2(Z,$,z);if(L){if(U.push({strategy:Z,platform:L.platform,status:L.status,httpStatus:L.httpStatus,elapsedMs:L.elapsedMs,signals:L.signals,error:L.error}),cl(L))return L.attempts=U,L;X=L;continue}}X=k}if(!J.includes("archive")&&G.includeArchive!==!1){let Z=await mL($,z);if(U.push({strategy:"archive",platform:Z.platform,status:Z.status,httpStatus:Z.httpStatus,elapsedMs:Z.elapsedMs,signals:Z.signals,error:Z.error}),cl(Z))return Z.attempts=U,Z;X=Z}if(X)return X.attempts=U,X;return{url:$.toString(),status:"error",strategy:J[0]??"probe",content:"",elapsedMs:0,signals:[],attempts:U,error:"all strategies failed"}}var PO2=d2(vO2(),1);var Xq5=["/rss","/feed","/atom.xml","/rss.xml","/index.xml"],Qq5=new PO2.XMLParser({ignoreAttributes:!1,attributeNamePrefix:"@_",textNodeName:"#text"});function sl($){if($===void 0||$===null)return[];return Array.isArray($)?$:[$]}function F3($){if($==null)return;if(typeof $==="string")return $;if(typeof $==="object"){let z=$;if(typeof z["#text"]==="string")return z["#text"];if(typeof z["#cdata"]==="string")return z["#cdata"]}return}function wO2($){for(let z of sl($)){let G=z?.["@_href"],J=z?.["@_rel"];if(typeof G==="string"&&(J===void 0||J==="alternate"))return G}return}function bO2($){let z;try{z=Qq5.parse($)}catch{return null}let G=z.rss;if(G){let U=G.channel;if(!U)return null;let K=sl(U.item);return{kind:"rss",title:F3(U.title),description:F3(U.description),link:F3(U.link),entries:K.map((X)=>({title:F3(X.title),link:F3(X.link),pubDate:F3(X.pubDate),description:F3(X.description),content:F3(X["content:encoded"])??F3(X.content)}))}}let J=z.feed;if(J){let U=sl(J.entry);return{kind:"atom",title:F3(J.title),description:F3(J.subtitle),link:wO2(J.link),entries:U.map((K)=>({title:F3(K.title),link:wO2(K.link),pubDate:F3(K.published)??F3(K.updated),description:F3(K.summary),content:F3(K.content)??F3(K.summary)}))}}return null}async function CO2($,z){let G=performance.now(),J;try{let K=await m1($.toString(),{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(K.ok)J=rV(K.text).alternate?.[0]?.href}catch{}let U=new Set;if(J)try{U.add(new URL(J,$).toString())}catch{}for(let K of Xq5)U.add(new URL(K,`${$.protocol}//${$.host}`).toString());for(let K of U){if(z.signal?.aborted)break;try{let X=await m1(K,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!X.ok||X.text.length<50)continue;let Q=bO2(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 SO2($,z="en-US"){let[G,J]=z.split("-"),U=new URL("https://news.google.com/rss/search");return U.searchParams.set("q",$),U.searchParams.set("hl",G??"en"),U.searchParams.set("gl",J??"US"),U.searchParams.set("ceid",`${J??"US"}:${G??"en"}`),U.toString()}var DD={"github.com":{domain:"github.com",level:"verified",score:0.95,tags:["code-host"],source:"registry"},"docs.github.com":{domain:"docs.github.com",level:"verified",score:0.95,tags:["lang-docs"],source:"registry"},"developer.mozilla.org":{domain:"developer.mozilla.org",level:"verified",score:0.95,tags:["lang-docs"],source:"registry"},"nextjs.org":{domain:"nextjs.org",level:"verified",score:0.9,tags:["vendor","lang-docs"],source:"registry"},"vercel.com":{domain:"vercel.com",level:"verified",score:0.9,tags:["vendor"],source:"registry"},"typescriptlang.org":{domain:"typescriptlang.org",level:"verified",score:0.95,tags:["lang-docs"],source:"registry"},"stackoverflow.com":{domain:"stackoverflow.com",level:"community",score:0.7,tags:["qna"],source:"registry"},"dev.to":{domain:"dev.to",level:"external",score:0.4,tags:["blog"],source:"registry"},"medium.com":{domain:"medium.com",level:"external",score:0.35,tags:["blog"],source:"registry"},"npmjs.com":{domain:"npmjs.com",level:"verified",score:0.9,tags:["registry"],source:"registry"},"pypi.org":{domain:"pypi.org",level:"verified",score:0.9,tags:["registry"],source:"registry"},"news.ycombinator.com":{domain:"news.ycombinator.com",level:"community",score:0.65,tags:["news"],source:"registry"},"reddit.com":{domain:"reddit.com",level:"community",score:0.55,tags:["forum"],source:"registry"},"wikipedia.org":{domain:"wikipedia.org",level:"community",score:0.75,tags:["encyclopedia"],source:"registry"},"arxiv.org":{domain:"arxiv.org",level:"verified",score:0.9,tags:["academic"],source:"registry"},"doi.org":{domain:"doi.org",level:"verified",score:0.95,tags:["academic"],source:"registry"}};function Zq5($){return $.replace(/^www\./,"")}function kq5($){if($ in DD){let G=DD[$];return G?{...G}:null}let z=Zq5($);if(z in DD){let G=DD[z];return G?{...G}:null}return null}function Lq5($){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 Yq5($){try{let z=await m1(`https://tranco-list.eu/api/ranks/domain/${$}`,{timeoutMs:5000});if(!z.ok)return null;let J=JSON.parse(z.text).ranks?.[0]?.rank;if(!J)return null;let U=J<1e4?0.6:J<1e5?0.4:0.2;return{domain:$,level:J<1e4?"community":"external",score:U,tags:["tranco"],source:"tranco",rank:J}}catch{return null}}async function _O2($){let z=kq5($);if(z)return z;let G=Lq5($);if(G)return G;let J=await Yq5($);if(J)return J;return{domain:$,level:"unknown",score:null,tags:[],source:"heuristic"}}var yO2=["api","probe","impersonate","browser","archive"];function hO2($){if(!$)return;let z=$.split(",").map((J)=>J.trim()).filter(Boolean),G=z.filter((J)=>!yO2.includes(J));if(G.length>0)throw Error(`Unknown strategy: ${G.join(", ")}. Valid: ${yO2.join(", ")}`);return z}function XZ($){try{return new URL($)}catch{throw Error(`Invalid URL: ${$}`)}}function Oz($){return{timeoutMs:$.timeout?Math.max(1000,Math.floor(Number($.timeout)*1000)):15000,locale:$.locale??"en-US,en;q=0.9"}}function M0($,z){if(z)console.log(JSON.stringify($,null,2));else console.log(JSON.stringify($))}function _J($){if(!$){process.exitCode=1;return}if($.status==="ok")process.exitCode=0;else if($.status==="blocked")process.exitCode=2;else if($.status==="not-found")process.exitCode=3;else if($.status==="invalid-input")process.exitCode=4;else if($.status==="auth-required")process.exitCode=5;else if($.status==="timeout")process.exitCode=6;else process.exitCode=1}function iO2($){let z=$.command("search").description("Mechanical search primitives — fetch, meta, rss, media, trust, code").alias("s");z.command("fetch <url>").description("Fetch URL via auto-escalating strategy pipeline").option("--only <strategies>","Comma-separated strategies to run").option("--skip <strategies>","Comma-separated strategies to skip").option("--include-archive","Include archive strategy as last fallback").option("--timeout <seconds>","Per-strategy timeout","15").option("--locale <value>","Accept-Language header","en-US,en;q=0.9").option("--pretty","Pretty-print JSON output").action(async(G,J)=>{try{let U=XZ(G),K=Oz(J),X=await nN2(U,K,{only:hO2(J.only),skip:hO2(J.skip),includeArchive:J.includeArchive});M0(X,Boolean(J.pretty)),_J(X)}catch(U){console.error(F8.default.red(U.message)),process.exitCode=1}}),z.command("api <url>").description("Fetch via matched platform API (Phase 0)").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(G,J)=>{try{let U=XZ(G);if(!fy(U)){console.error(F8.default.yellow(`No API handler matches host ${U.hostname}`)),process.exitCode=3;return}let X=Oz(J),Q=await sV(U,X);if(!Q){process.exitCode=3;return}M0(Q,Boolean(J.pretty)),_J(Q)}catch(U){console.error(F8.default.red(U.message)),process.exitCode=1}}),z.command("api:search <query>").description("Fan-out keyword search across platforms that support it").option("--platforms <list>","Comma-separated platform ids").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(G,J)=>{let U=Oz(J),K=J.platforms?J.platforms.split(",").map((Q)=>Q.trim()).filter(Boolean):void 0,X=await e02(G,U,K);M0(X,Boolean(J.pretty))}),z.command("meta <url>").description("Extract OGP / JSON-LD / Schema.org from URL").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(G,J)=>{try{let U=XZ(G),K=Oz(J),X=await R02(U,K),{content:Q,...Z}=X;M0(Z,Boolean(J.pretty)),_J(X)}catch(U){console.error(F8.default.red(U.message)),process.exitCode=1}}),z.command("rss <url>").description("Discover and parse RSS/Atom feed for a URL").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(G,J)=>{try{let U=XZ(G),K=Oz(J),X=await CO2(U,K),{content:Q,...Z}=X;M0(Z,Boolean(J.pretty)),_J(X)}catch(U){console.error(F8.default.red(U.message)),process.exitCode=1}}),z.command("rss:google <query>").description("Build Google News RSS URL for a query").option("--locale <value>","Locale (e.g., ko-KR)","en-US").action((G,J)=>{let U=SO2(G,J.locale??"en-US");console.log(U)}),z.command("media <url>").description("Extract media metadata via yt-dlp (1858 sites)").option("--subs","Write subtitles").option("--sub-lang <list>","Subtitle languages (comma-separated)","en").option("--format <spec>","yt-dlp format spec").option("--timeout <seconds>","Timeout","30").option("--pretty","Pretty-print JSON").action(async(G,J)=>{try{let U=XZ(G),K=Oz(J),X=J.subLang?J.subLang.split(",").map((Z)=>Z.trim()).filter(Boolean):void 0,Q=await E02(U,K,{subtitles:J.subs,...X?{subLangs:X}:{},...J.format?{format:J.format}:{}});M0(Q,Boolean(J.pretty)),_J(Q)}catch(U){console.error(F8.default.red(U.message)),process.exitCode=1}}),z.command("archive <url>").description("Fetch via AMP / archive.today / Wayback").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(G,J)=>{try{let U=XZ(G),K=Oz(J),X=await mL(U,K);M0(X,Boolean(J.pretty)),_J(X)}catch(U){console.error(F8.default.red(U.message)),process.exitCode=1}}),z.command("trust <domain>").description("Resolve trust level / score for a domain").option("--pretty","Pretty-print JSON").action(async(G,J)=>{let U=await _O2(G.toLowerCase());M0(U,Boolean(J.pretty))}),z.command("code <query>").description("Search code via gh / glab").option("--host <github|gitlab>","Host","github").option("--language <lang>","Language filter").option("--repo <owner/repo>","Scope to a repo").option("--limit <n>","Max results","20").option("--pretty","Pretty-print JSON").action(async(G,J)=>{let U=J.host==="gitlab"||J.host==="github"?J.host:"github",K=Oz({}),X=await I02(G,K,{host:U,...J.language?{language:J.language}:{},...J.repo?{repo:J.repo}:{},...J.limit?{limit:Number.parseInt(J.limit,10)}:{}});M0(X,Boolean(J.pretty)),_J(X)}),z.command("doctor").description("Check dependencies (Chrome, python3 curl_cffi, yt-dlp, gh)").action(async()=>{let G=[],J=ll();G.push({name:"chrome",ok:Boolean(J),detail:J??"Install Chrome or set OMA_CHROME_PATH"}),G.push(await tl("python3",["--version"])),G.push(await jq5()),G.push(await tl("yt-dlp",["--version"])),G.push(await tl("gh",["--version"]));for(let U of G){let K=U.ok?F8.default.green("✓"):F8.default.yellow("!");console.log(`${K} ${U.name}: ${U.detail}`)}if(G.some((U)=>!U.ok))process.exitCode=1})}async function tl($,z){return new Promise((G)=>{let{spawn:J}=K2("node:child_process"),U=J($,z,{stdio:["ignore","pipe","pipe"]}),K="";U.stdout?.on("data",(X)=>{K+=X.toString()}),U.on("error",()=>G({name:$,ok:!1,detail:"not found"})),U.on("close",(X)=>{if(X===0)G({name:$,ok:!0,detail:K.trim()});else G({name:$,ok:!1,detail:`exit code ${X}`})})})}async function jq5(){return new Promise(($)=>{let{spawn:z}=K2("node:child_process"),G=z("python3",["-c","import curl_cffi; print(curl_cffi.__version__)"],{stdio:["ignore","pipe","pipe"]}),J="";G.stdout?.on("data",(U)=>{J+=U.toString()}),G.on("error",()=>$({name:"curl_cffi",ok:!1,detail:"python3 not found"})),G.on("close",(U)=>{if(U===0)$({name:"curl_cffi",ok:!0,detail:`v${J.trim()}`});else $({name:"curl_cffi",ok:!1,detail:"not installed (pip install curl_cffi)"})})})}F7();var qz=d2(N4(),1);import{execSync as Hq5,spawnSync as xO2}from"node:child_process";import{platform as Wq5}from"node:os";function Aq5(){let $=Wq5();if($==="darwin")return"brew install gh";if($==="win32")return"winget install GitHub.cli";return"sudo apt install gh"}async function mO2(){if(console.clear(),i4(qz.default.bgMagenta(qz.default.white(" ⭐ oh-my-agent star "))),!oz()){let z=Aq5(),G=await k3({message:`GitHub CLI (gh) is not installed. Install with ${qz.default.cyan(z)}?`});if(Y4(G)||!G){R5("Install gh manually and try again.");return}let J=W6();J.start("Installing GitHub CLI...");let U=xO2(z,{shell:!0,stdio:"pipe"});if(U.status!==0){J.stop("Installation failed"),s5.error(U.stderr?.toString()||"Unknown error"),R5("Please install gh manually.");return}J.stop("GitHub CLI installed!")}if(!n9()){s5.warn("GitHub CLI is not authenticated.");let z=await k3({message:`Run ${qz.default.cyan("gh auth login")} now?`});if(Y4(z)||!z){R5("Authenticate and try again.");return}if(xO2("gh",["auth","login"],{stdio:"inherit"}),!n9()){R5("Authentication was not completed. Try again.");return}s5.success("Authenticated!")}if(rz()){R5(`Already starred ${qz.default.cyan(s4)}! Thank you! \uD83D\uDE4F`);return}let $=await k3({message:`Star ${qz.default.cyan(s4)} on GitHub?`});if(Y4($)||!$){R5("Maybe next time!");return}try{Hq5(`gh api -X PUT /user/starred/${s4}`,{stdio:"ignore"}),R5(`Starred ${qz.default.cyan(s4)}! Thank you! \uD83C\uDF1F`)}catch{s5.error("Failed to star the repository."),R5("Please try again later.")}}function gO2($){$.command("star").description("Star oh-my-agent on GitHub").action(Y5(async()=>{await mO2()}))}F7();Cy();Nk();var E9=d2(N4(),1);import{existsSync as MD,mkdirSync as uq5,readdirSync as Bq5,readFileSync as Vq5,writeFileSync as fO2}from"node:fs";import{dirname as Fq5,join as lO2}from"node:path";function $c($){return lO2($,".serena","metrics.json")}function el(){return{sessions:0,skillsUsed:{},tasksCompleted:0,totalSessionTime:0,filesChanged:0,linesAdded:0,linesRemoved:0,lastUpdated:new Date().toISOString(),startDate:new Date().toISOString()}}function Nq5($){let z=$c($);if(MD(z))try{return JSON.parse(Vq5(z,"utf-8"))}catch{return el()}return el()}function Oq5($,z){let G=$c($),J=Fq5(G);if(!MD(J))uq5(J,{recursive:!0});z.lastUpdated=new Date().toISOString(),fO2(G,JSON.stringify(z,null,2),"utf-8")}function qq5($){let z=lO2($,".serena","memories"),G={};if(!MD(z))return G;try{let J=Bq5(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 cO2($=!1,z=!1){let G=process.cwd(),J=$c(G);if(z){if(MD(J))fO2(J,JSON.stringify(el(),null,2),"utf-8");if($)console.log(JSON.stringify({reset:!0}));else console.log(E9.default.green("✅ Metrics reset successfully."));return}let U=Nq5(G),K=fV(G),X=qq5(G),Q=io(G),Z=pA(G),k=Z.startedAt?new Date(Z.startedAt):null,L=k&&!Number.isNaN(k.getTime())?Math.max(0,Math.floor((Date.now()-k.getTime())/1000)):0;for(let[A,u]of Object.entries(X))U.skillsUsed[A]=(U.skillsUsed[A]||0)+u;if(Q>U.tasksCompleted)U.tasksCompleted=Q;if(Z.id){if(["completed","failed","aborted"].includes(Z.status||"")&&(U.lastSessionId!==Z.id||U.lastSessionStatus!==Z.status)&&L>0)U.totalSessionTime+=L;U.lastSessionId=Z.id,U.lastSessionStatus=Z.status,U.lastSessionStarted=Z.startedAt,U.lastSessionDuration=L}U.filesChanged+=K.filesChanged,U.linesAdded+=K.linesAdded,U.linesRemoved+=K.linesRemoved,U.sessions+=1,Oq5(G,U);let Y=Math.max(1,Math.ceil((Date.now()-new Date(U.startDate).getTime())/86400000)),H=U.sessions>0?Math.round(U.totalSessionTime/U.sessions):0;if($){console.log(JSON.stringify({...U,gitStats:K,daysSinceStart:Y,avgSessionTime:H},null,2));return}console.clear(),i4(E9.default.bgMagenta(E9.default.white(" \uD83D\uDCCA oh-my-agent stats ")));let j=[E9.default.bold(`\uD83D\uDCC8 Productivity Metrics (${Y} days)`),"┌─────────────────────┬──────────────┐",`│ ${E9.default.bold("Metric")} │ ${E9.default.bold("Value")} │`,"├─────────────────────┼──────────────┤",`│ Sessions │ ${String(U.sessions).padEnd(12)} │`,`│ Tasks Completed │ ${String(U.tasksCompleted).padEnd(12)} │`,`│ Files Changed │ ${String(U.filesChanged).padEnd(12)} │`,`│ Lines Added │ ${E9.default.green(`+${U.linesAdded}`).padEnd(12)} │`,`│ Lines Removed │ ${E9.default.red(`-${U.linesRemoved}`).padEnd(12)} │`,"└─────────────────────┴──────────────┘"].join(`
|
|
1465
1465
|
`);J5(j,"Overview");let W=Object.entries(U.skillsUsed).sort(([,A],[,u])=>u-A).slice(0,5);if(W.length>0){let A=[E9.default.bold("\uD83C\uDFC6 Top Skills Used"),...W.map(([u,B],V)=>` ${V+1}. ${u} (${B})`)].join(`
|
|
1466
|
-
`);J5(A,"Skills")}R5(E9.default.dim(`Data stored in: ${J}`))}function nO2($){a1($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(Y5(async(z)=>{await cO2(i1(z),z.reset)},{supportsJsonOutput:!0}))}F7();var x3=d2(N4(),1);import{execSync as vq5}from"node:child_process";import{cpSync as TD,existsSync as T9,mkdirSync as GH,readFileSync as QZ,rmSync as zc,writeFileSync as hJ}from"node:fs";import{tmpdir as wq5}from"node:os";import{dirname as oO2,join as X3}from"node:path";var ID=d2(N4(),1);import{execSync as Dq5,spawn as Mq5}from"node:child_process";import{realpathSync as dO2}from"node:fs";import zH from"node:process";var yJ="oh-my-agent";function Iq5($=zH.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(zH.env.IS_BINARY==="true")return{packageManager:"binary",isGlobal:!0,updateMessage:"Running as a standalone binary. Download the latest release from GitHub."};let z;try{z=s6(dO2($))}catch{return{packageManager:"unknown",isGlobal:!1}}if(z.includes("/.npm/_npx")||z.includes("/npm/_npx"))return{packageManager:"npx",isGlobal:!1,updateMessage:"Running via npx, auto-update not applicable."};if(z.includes("/.pnpm/_pnpx")||z.includes("/.cache/pnpm/dlx"))return{packageManager:"pnpx",isGlobal:!1,updateMessage:"Running via pnpx, auto-update not applicable."};if(z.includes("/.bun/install/cache"))return{packageManager:"bunx",isGlobal:!1,updateMessage:"Running via bunx, auto-update not applicable."};if(zH.platform==="darwin")try{let G=Dq5(`brew --prefix ${yJ}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(G){let J=s6(dO2(G));if(z.startsWith(J))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${yJ}`,updateMessage:"Installed via Homebrew. Updating in background..."}}}catch{}if(z.includes("/.pnpm/global")||z.includes("/.local/share/pnpm"))return{packageManager:"pnpm",isGlobal:!0,updateCommand:`pnpm add -g ${yJ}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(z.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${yJ}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(z.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${yJ}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${yJ}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var pO2=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function Eq5($,z){let G=$.match(pO2),J=z.match(pO2);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 Tq5($=yJ,z=2000){try{let G=await u$.get(`https://registry.npmjs.org/${$}/latest`,{timeout:z});return typeof G.data?.version==="string"?G.data.version:null}catch{return null}}async function aO2($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(zH.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(zH.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let z=await Tq5();if(!z)return{triggered:!1,reason:"fetch-failed"};if(!Eq5($.currentVersion,z))return{triggered:!1,reason:"up-to-date",latest:z};let G=Iq5();if(!G.updateCommand)return $.onNotice?.(ID.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. ${G.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:z};try{return Mq5(G.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(ID.default.cyan(`global oh-my-agent ${$.currentVersion} → ${z} updating in background. New version applies on next run.`)),{triggered:!0,latest:z}}catch{return $.onNotice?.(ID.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. Run: ${G.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:z}}}var ED={name:"oh-my-agent",version:"7.
|
|
1466
|
+
`);J5(A,"Skills")}R5(E9.default.dim(`Data stored in: ${J}`))}function nO2($){a1($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(Y5(async(z)=>{await cO2(i1(z),z.reset)},{supportsJsonOutput:!0}))}F7();var x3=d2(N4(),1);import{execSync as vq5}from"node:child_process";import{cpSync as TD,existsSync as T9,mkdirSync as GH,readFileSync as QZ,rmSync as zc,writeFileSync as hJ}from"node:fs";import{tmpdir as wq5}from"node:os";import{dirname as oO2,join as X3}from"node:path";var ID=d2(N4(),1);import{execSync as Dq5,spawn as Mq5}from"node:child_process";import{realpathSync as dO2}from"node:fs";import zH from"node:process";var yJ="oh-my-agent";function Iq5($=zH.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(zH.env.IS_BINARY==="true")return{packageManager:"binary",isGlobal:!0,updateMessage:"Running as a standalone binary. Download the latest release from GitHub."};let z;try{z=s6(dO2($))}catch{return{packageManager:"unknown",isGlobal:!1}}if(z.includes("/.npm/_npx")||z.includes("/npm/_npx"))return{packageManager:"npx",isGlobal:!1,updateMessage:"Running via npx, auto-update not applicable."};if(z.includes("/.pnpm/_pnpx")||z.includes("/.cache/pnpm/dlx"))return{packageManager:"pnpx",isGlobal:!1,updateMessage:"Running via pnpx, auto-update not applicable."};if(z.includes("/.bun/install/cache"))return{packageManager:"bunx",isGlobal:!1,updateMessage:"Running via bunx, auto-update not applicable."};if(zH.platform==="darwin")try{let G=Dq5(`brew --prefix ${yJ}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(G){let J=s6(dO2(G));if(z.startsWith(J))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${yJ}`,updateMessage:"Installed via Homebrew. Updating in background..."}}}catch{}if(z.includes("/.pnpm/global")||z.includes("/.local/share/pnpm"))return{packageManager:"pnpm",isGlobal:!0,updateCommand:`pnpm add -g ${yJ}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(z.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${yJ}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(z.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${yJ}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${yJ}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var pO2=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function Eq5($,z){let G=$.match(pO2),J=z.match(pO2);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 Tq5($=yJ,z=2000){try{let G=await u$.get(`https://registry.npmjs.org/${$}/latest`,{timeout:z});return typeof G.data?.version==="string"?G.data.version:null}catch{return null}}async function aO2($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(zH.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(zH.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let z=await Tq5();if(!z)return{triggered:!1,reason:"fetch-failed"};if(!Eq5($.currentVersion,z))return{triggered:!1,reason:"up-to-date",latest:z};let G=Iq5();if(!G.updateCommand)return $.onNotice?.(ID.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. ${G.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:z};try{return Mq5(G.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(ID.default.cyan(`global oh-my-agent ${$.currentVersion} → ${z} updating in background. New version applies on next run.`)),{triggered:!0,latest:z}}catch{return $.onNotice?.(ID.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. Run: ${G.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:z}}}var ED={name:"oh-my-agent",version:"7.4.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",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 Pq5($){if(!$)return{intro:(G)=>i4(G),outro:(G)=>R5(G),note:(G,J)=>J5(G,J),logError:(G)=>s5.error(G),spinnerStart:(G)=>{let J=W6();return J.start(G),J}};let z={start(G){},stop(G){if(G)console.log(G)},message(G){console.log(G)}};return{intro:(G)=>console.log(G),outro:(G)=>console.log(G),note:(G,J)=>console.log(G),logError:(G)=>console.error(G),spinnerStart:(G)=>{return console.log(G),z}}}function bq5($,z){if($!==null)return"ready";return z?"legacy":"missing"}async function Gc($=!1,z=!1){if(!z&&process.stdout.isTTY)console.clear();let G=Pq5(z);G.intro(x3.default.bgMagenta(x3.default.white(" \uD83D\uDEF8 oh-my-agent update ")));let J=process.cwd();await aO2({currentVersion:ED.version,enabled:P92(J),onSpawnStart:(L)=>G.note(L,"CLI auto-update"),onNotice:(L)=>G.note(L,"CLI update available")});let U=await qB(J),K=K32(J),X=bq5(U,K);if(X==="missing"){if(G.logError("oh-my-agent is not installed in this project. Run `oma install` first."),z)throw Error("oh-my-agent is not installed in this project. Run `oma install` first.");process.exit(1)}let Q=BG(J);if(Q.length>0)G.note(Q.map((L)=>`${x3.default.green("✓")} ${L}`).join(`
|
|
1467
1467
|
`),"Migration");let Z=Q.length>0||FS(J);if(Q.length>0&&!FS(J))NS(J,!0);if(!z)await FB(J);if(X==="legacy")G.note("Existing .agents installation detected without _version.json. Updating in place and restoring version metadata.","Legacy install");let k;try{k=G.spinnerStart("Checking for updates...");let L=await X32();if(U===L.version&&!Z){k.stop(x3.default.green("Already up to date!")),G.outro(`Current version: ${x3.default.cyan(U)}`);return}let Y=U===L.version;k.message(`Downloading ${x3.default.cyan(L.version)}...`);let{dir:H,cleanup:j}=await FK();try{k.message("Copying files..."),BG(J);let W=X3(J,".agents","oma-config.yaml"),A=X3(J,".agents","mcp.json"),u=!$&&T9(W)?QZ(W):null,B=!$&&T9(A)?QZ(A):null,V=X3(wq5(),`oma-stack-backup-${Date.now()}`),F=X3(J,".agents","skills","oma-backend","stack"),N=!$&&T9(F);if(N)GH(V,{recursive:!0}),TD(F,X3(V,"oma-backend"),{recursive:!0});let M=["snippets.md","tech-stack.md","api-template.py"],E=X3(J,".agents","skills","oma-backend","resources"),q=!$&&!N&&M.some((p)=>T9(X3(E,p)));if(TD(X3(H,".agents"),X3(J,".agents"),{recursive:!0,force:!0}),u)hJ(W,u);if(B)hJ(A,B);if(N)try{GH(F,{recursive:!0}),TD(X3(V,"oma-backend"),F,{recursive:!0,force:!0})}finally{zc(V,{recursive:!0,force:!0})}if(q){let p=X3(H,".agents","skills","oma-backend","variants","python");if(T9(p))GH(F,{recursive:!0}),TD(p,F,{recursive:!0,force:!0}),hJ(X3(F,"stack.yaml"),`language: python
|
|
1468
1468
|
framework: fastapi
|
|
1469
1469
|
orm: sqlalchemy
|
package/package.json
CHANGED