oh-my-agent 7.14.0 → 7.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +3 -0
  2. package/bin/cli.js +2 -2
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -64,6 +64,7 @@ Pick a preset and you're ready:
64
64
 
65
65
  | Agent | What They Do |
66
66
  |-------|-------------|
67
+ | **oma-academic-writer** | Publication-grade academic prose drafting, revision, and rubric-based audits |
67
68
  | **oma-architecture** | Architectural tradeoffs, boundaries, ADR/ATAM/CBAM-aware analysis |
68
69
  | **oma-backend** | APIs in Python, Node.js, or Rust |
69
70
  | **oma-brainstorm** | Explores ideas before you commit to building |
@@ -76,6 +77,7 @@ Pick a preset and you're ready:
76
77
  | **oma-frontend** | React/Next.js, TypeScript, Tailwind CSS v4, shadcn/ui |
77
78
  | **oma-hwp** | HWP/HWPX/HWPML to Markdown conversion |
78
79
  | **oma-image** | Multi-vendor AI image generation |
80
+ | **oma-market** | Community-signal market research for pain/trend/competitor/discovery with SWOT/5F/PESTEL |
79
81
  | **oma-mobile** | Flutter cross-platform apps |
80
82
  | **oma-observability** | Observability router for APM/RUM, metrics/logs/traces/profiles, SLO, incident forensics, transport tuning |
81
83
  | **oma-orchestrator** | Parallel agent execution via CLI |
@@ -89,6 +91,7 @@ Pick a preset and you're ready:
89
91
  | **oma-skill-creator** | Authors and audits OMA skills in the SSL-lite format |
90
92
  | **oma-tf-infra** | Multi-cloud Terraform IaC (Infrastructure as Code) |
91
93
  | **oma-translator** | Natural multilingual translation |
94
+ | **oma-voice** | Local-first TTS/STT via Voicebox MCP for voice generation, voiceover, and transcription |
92
95
 
93
96
  ## How It Works
94
97
 
package/bin/cli.js CHANGED
@@ -1201,7 +1201,7 @@ ls_specific_settings: {}
1201
1201
  `;function fe2($,z){let G=z8($,".serena"),J=z8(G,"project.yml");if(vG(J))return!1;let U=$.split("/").pop()||$.split("\\").pop()||"project";k62(G,{recursive:!0}),cV(J,me2(z,U));let K=z8(G,".gitignore");if(!vG(K))cV(K,`/cache
1202
1202
  `);let X=z8(G,"memories");k62(X,{recursive:!0});let Q=z8(X,".gitkeep");if(!vG(Q))cV(Q,"");return!0}function nV($,z){let G=fe2($,z),J=ge2($);return{configured:G,registered:J}}import{existsSync as l8,mkdirSync as le2,readdirSync as A62,readFileSync as dV,writeFileSync as B62}from"node:fs";import{dirname as ce2,join as O6}from"node:path";async function pV($){let z=O6($,k3,"_version.json");if(!l8(z))return null;try{let G=dV(z,"utf-8");return JSON.parse(G).version||null}catch{return null}}function QS($){let z=O6($,k3,"_version.json");if(!l8(z))return!1;try{let G=dV(z,"utf-8");return JSON.parse(G).needsReconcile===!0}catch{return!1}}function ZS($,z){let G=O6($,k3,"_version.json");if(!l8(G))return;try{let J=dV(G,"utf-8"),U=JSON.parse(J);if(z)U.needsReconcile=!0;else delete U.needsReconcile;B62(G,JSON.stringify(U,null,2),"utf-8")}catch{}}function V62($){let z=O6($,k3);if(!l8(z))return!1;return[O6($,".agents","oma-config.yaml"),O6($,".agents","mcp.json"),O6($,".agents","workflows")].some((J)=>l8(J))}async function aV($,z){let G=O6($,k3,"_version.json"),J=ce2(G);if(!l8(J))le2(J,{recursive:!0});B62(G,JSON.stringify({version:z},null,2),"utf-8")}function kS($){let z=O6($,k3),G=O6($,".agents","workflows"),J=l8(z)?A62(z,{withFileTypes:!0}).filter((K)=>K.isDirectory()&&K.name.startsWith("oma-")).map((K)=>K.name):[],U=l8(G)?A62(G,{withFileTypes:!0}).filter((K)=>K.isFile()&&K.name.endsWith(".md")).map((K)=>K.name.replace(/\.md$/,"")):[];return{skills:J.sort(),workflows:U.sort()}}function F62($,z){let G=new Set($.skills),J=new Set(z.skills),U=new Set($.workflows),K=new Set(z.workflows);return{addedSkills:z.skills.filter((X)=>!G.has(X)),removedSkills:$.skills.filter((X)=>!J.has(X)),addedWorkflows:z.workflows.filter((X)=>!U.has(X)),removedWorkflows:$.workflows.filter((X)=>!K.has(X))}}function u62($){return $.addedSkills.length>0||$.removedSkills.length>0||$.addedWorkflows.length>0||$.removedWorkflows.length>0}function N62($){if(!l8($))return"";let{frontmatter:z}=j$(dV($,"utf-8")),G=z.description;if(typeof G!=="string")return"";let J=G.trim().split(/(?<=[.!?])\s+/)[0]??G.trim();return J.length>100?`${J.slice(0,97)}...`:J}function O62($,z){return N62(O6($,k3,z,"SKILL.md"))}function q62($,z){return N62(O6($,".agents","workflows",`${z}.md`))}async function D62(){let $=`https://raw.githubusercontent.com/${$1}/main/prompt-manifest.json`;return(await E$.get($)).data}O7();var oV=d2(q4(),1);import{execSync as M62}from"node:child_process";import{existsSync as e3,readFileSync as xK,rmSync as R$,writeFileSync as YS}from"node:fs";import{join as $7}from"node:path";function ne2($){for(let z of[".omc",".omx"]){let G=$7($,z);if(e3(G))R$(G,{recursive:!0,force:!0})}}function de2($){let z=process.env.HOME||process.env.USERPROFILE||"",G=[],J=$7(z,".claude","CLAUDE.md"),U=!1;if(e3(J))try{U=xK(J,"utf-8").includes("OMC:START")}catch{}if(U)G.push({name:"omc",displayName:"oh-my-claudecode",uninstall:()=>{let Q=$7(z,".claude");for(let j of["architect","document-specialist","explore","designer","writer","vision","critic","analyst","executor","planner"]){let W=$7(Q,"agents",`${j}.md`);if(e3(W))R$(W,{force:!0})}for(let j of["coordinator","omc","ultrawork","deepsearch","analyze","plan","review","planner","orchestrator","update"]){let W=$7(Q,"commands",`${j}.md`);if(e3(W))R$(W,{force:!0})}for(let j of["ultrawork","git-master","frontend-ui-ux"]){let W=$7(Q,"skills",j);if(!e3(W))continue;let L=$7(W,"SKILL.md");if(e3(L))try{if(xK(L,"utf-8").includes(".agents/workflows/"))continue}catch{continue}R$(W,{recursive:!0,force:!0})}for(let j of["keyword-detector.sh","silent-auto-update.sh","stop-continuation.sh"]){let W=$7(Q,"hooks",j);if(e3(W))R$(W,{force:!0})}for(let j of[".omc-version.json",".omc-silent-update.json",".omc-update.log",".omc-config.json"]){let W=$7(Q,j);if(e3(W))R$(W,{force:!0})}let Z=$7($,".omc");if(e3(Z))R$(Z,{recursive:!0,force:!0});let k=$7(Q,"settings.json");if(e3(k))try{let j=JSON.parse(xK(k,"utf-8"));if(j.hooks){for(let W of Object.keys(j.hooks)){if(!Array.isArray(j.hooks[W]))continue;if(j.hooks[W]=j.hooks[W].map((L)=>{if(Array.isArray(L.hooks))L.hooks=L.hooks.filter((H)=>!H.command||!(H.command.includes("keyword-detector.sh")||H.command.includes("silent-auto-update.sh")||H.command.includes("stop-continuation.sh")));return L}).filter((L)=>!L.hooks||L.hooks.length>0),j.hooks[W].length===0)delete j.hooks[W]}if(Object.keys(j.hooks).length===0)delete j.hooks;YS(k,`${JSON.stringify(j,null,2)}
1203
1203
  `)}}catch{}let Y=$7(Q,"CLAUDE.md");if(e3(Y))try{let j=xK(Y,"utf-8");if(j.includes("OMC:START")){let W=j.replace(/<!-- OMC:START[\s\S]*?OMC:END -->\n?/g,"");YS(Y,W)}}catch{}}});for(let Q of["opencode.json","opencode.jsonc"]){let Z=$7(z,".config","opencode",Q);if(!e3(Z))continue;try{let Y=xK(Z,"utf-8").replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/,\s*([\]}])/g,"$1"),j=JSON.parse(Y);if(Array.isArray(j.plugin)&&j.plugin.includes("oh-my-opencode")){G.push({name:"omo",displayName:"oh-my-opencode",uninstall:()=>{let L=xK(Z,"utf-8").replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/,\s*([\]}])/g,"$1"),H=JSON.parse(L);H.plugin=H.plugin.filter((A)=>A!=="oh-my-opencode"),YS(Z,JSON.stringify(H,null,2))}});break}}catch{}}let K=$7(z,".agents","skills","superpowers"),X=$7(z,".codex","superpowers");if(e3(K)||e3(X))G.push({name:"superpowers",displayName:"superpowers",uninstall:()=>{for(let Q of[K,X])if(e3(Q))R$(Q,{recursive:!0,force:!0})}});try{M62("npm ls -g oh-my-codex",{stdio:"pipe",timeout:1e4}),G.push({name:"omx",displayName:"oh-my-codex",uninstall:()=>{M62("npx -y oh-my-codex@latest uninstall --yes",{stdio:"pipe",timeout:60000})}})}catch{}return G}async function rV($){ne2($);let z=de2($);if(z.length===0)return[];let G=z.map((X)=>X.name),J=await L3({message:`${oV.default.yellow(G.join(", "))} detected. Remove all?`,initialValue:!0});if(W4(J)||!J)return[];let U=[],K=V6();K.start("Removing competing tools...");for(let X of z)try{X.uninstall(),U.push(`${X.displayName} removed`)}catch(Q){let Z=Q instanceof Error?Q.message:String(Q);U.push(`${X.displayName} removal failed: ${Z}`)}return K.stop(U.map((X)=>X.includes("failed")?`${oV.default.red("✗")} ${X}`:`${oV.default.green("✓")} ${X}`).join(`
1204
- `)),U}var T62=d2(n3(),1);import{existsSync as pe2,readFileSync as ae2}from"node:fs";import{join as I62}from"node:path";function jS($){let z=$||process.cwd();for(let G=0;G<10;G++){let J=I62(z,".agents","oma-config.yaml");if(pe2(J)){let K;try{K=ae2(J,"utf-8")}catch{return null}try{return T62.parse(K)}catch(X){let Q=X&&typeof X==="object"&&"linePos"in X&&Array.isArray(X.linePos)&&X.linePos.length>0?X.linePos[0]:null,Z=Q?`${J}:${Q.line}:${Q.col}`:J;return console.warn(`[config] Failed to parse YAML at ${Z}: ${X instanceof Error?X.message:String(X)}`),null}}let U=I62(z,"..");if(U===z)break;z=U}return null}function E62($){return jS($)?.auto_update_cli!==!1}function iK($){return jS($)?.telemetry===!0}function R62($){let z=jS($);if(z?.timezone&&typeof z.timezone==="string")return z.timezone;return Intl.DateTimeFormat().resolvedOptions().timeZone}var v62={cleanupPeriodDays:180,CLAUDE_CODE_FILE_READ_MAX_OUTPUT_TOKENS:1e5,CLAUDE_AUTOCOMPACT_PCT_OVERRIDE:80,DISABLE_ERROR_REPORTING:"1",CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY:"1",CLAUDE_CODE_DISABLE_AUTO_MEMORY:"1",CLAUDE_CODE_DISABLE_GIT_INSTRUCTIONS:"1",CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING:"1",ENABLE_PROMPT_CACHING_1H:"1"},w62=["DISABLE_PROMPT_CACHING"];var LS={skipDangerousModePermissionPrompt:!0,effortLevel:"high",skillListingBudgetFraction:0.02},P62={low:0,medium:1,high:2,xhigh:3},oe2=P62[LS.effortLevel]??0;function b62($){if(typeof $!=="string")return!1;let z=P62[$];if(z===void 0)return!1;return z>=oe2}var re2={commit:`Generated with oh-my-agent
1204
+ `)),U}var T62=d2(n3(),1);import{existsSync as pe2,readFileSync as ae2}from"node:fs";import{join as I62}from"node:path";function jS($){let z=$||process.cwd();for(let G=0;G<10;G++){let J=I62(z,".agents","oma-config.yaml");if(pe2(J)){let K;try{K=ae2(J,"utf-8")}catch{return null}try{return T62.parse(K)}catch(X){let Q=X&&typeof X==="object"&&"linePos"in X&&Array.isArray(X.linePos)&&X.linePos.length>0?X.linePos[0]:null,Z=Q?`${J}:${Q.line}:${Q.col}`:J;return console.warn(`[config] Failed to parse YAML at ${Z}: ${X instanceof Error?X.message:String(X)}`),null}}let U=I62(z,"..");if(U===z)break;z=U}return null}function E62($){return jS($)?.auto_update_cli!==!1}function iK($){return jS($)?.telemetry===!0}function R62($){let z=jS($);if(z?.timezone&&typeof z.timezone==="string")return z.timezone;return Intl.DateTimeFormat().resolvedOptions().timeZone}var v62={cleanupPeriodDays:180,CLAUDE_CODE_FILE_READ_MAX_OUTPUT_TOKENS:1e5,CLAUDE_AUTOCOMPACT_PCT_OVERRIDE:80,DISABLE_ERROR_REPORTING:"1",CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY:"1",CLAUDE_CODE_DISABLE_AUTO_MEMORY:"1",CLAUDE_CODE_DISABLE_GIT_INSTRUCTIONS:"1",CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING:"1",ENABLE_PROMPT_CACHING_1H:"1"},w62=["DISABLE_PROMPT_CACHING"];var LS={skipDangerousModePermissionPrompt:!0,effortLevel:"xhigh",skillListingBudgetFraction:0.02},P62={low:0,medium:1,high:2,xhigh:3},oe2=P62[LS.effortLevel]??0;function b62($){if(typeof $!=="string")return!1;let z=P62[$];if(z===void 0)return!1;return z>=oe2}var re2={commit:`Generated with oh-my-agent
1205
1205
 
1206
1206
  Co-Authored-By: First Fluke <our.first.fluke@gmail.com>`,pr:"Generated with [oh-my-agent](https://github.com/first-fluke/oh-my-agent)"};function sV($,z={}){let G=$?.env;if(!G)return!0;for(let J of w62)if(J in G)return!0;if(z.telemetry===!0){if("DISABLE_TELEMETRY"in G)return!0}else if(G.DISABLE_TELEMETRY!=="1")return!0;for(let[J,U]of Object.entries(v62)){let K=G[J];if(typeof U==="number"){if((K??0)<U)return!0}else if(K!==U)return!0}for(let[J,U]of Object.entries(LS)){if(J==="effortLevel"){if(!b62($[J]))return!0;continue}if($[J]!==U)return!0}if(!$.attribution?.commit||!$.attribution?.pr)return!0;return!1}function tV($,z={}){let G={...$.env||{},...v62};for(let U of w62)delete G[U];if(z.telemetry===!0)delete G.DISABLE_TELEMETRY;else G.DISABLE_TELEMETRY="1";$.env=G;let J=b62($.effortLevel)?$.effortLevel:void 0;if(Object.assign($,LS),J)$.effortLevel=J;return $.attribution={...re2},$}var C62={enableNotifications:!0},_62={enableAgents:!0},se2={serena:{url:"http://localhost:12341/mcp"}};function gK($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var te2=new Set(["command","args","env","cwd","url","httpUrl","headers","tcp","type","timeout","trust","description","includeTools","excludeTools","extension","oauth","authProviderType","targetAudience","targetServiceAccount"]);function ee2($){let z={};for(let[J,U]of Object.entries($)){if(U===void 0||U===null)continue;if(!te2.has(J))continue;z[J]=U}let G=$.available_tools;if(Array.isArray(G)&&z.includeTools===void 0)z.includeTools=G.map((J)=>String(J).trim()).filter(Boolean);return z}function S62($){if(!$)return!1;return typeof $.command==="string"||typeof $.url==="string"||typeof $.httpUrl==="string"||typeof $.tcp==="string"}function eV($){let z=y62($);if(z.mcpServers)z.mcpServers=Object.fromEntries(Object.entries(z.mcpServers).map(([G,J])=>[G,ee2(J)]));return z}function y62($){if(!gK($))return{};let z=gK($.general)?$.general:void 0,G=gK($.experimental)?$.experimental:void 0,J=gK($.mcpServers)?$.mcpServers:void 0;return{...$,general:z,experimental:G,mcpServers:J}}function mK($,z={}){let G=y62($),J=eV($);if(JSON.stringify(G)!==JSON.stringify(J))return!0;let U=J.general;if(!U)return!0;for(let[Z,k]of Object.entries(C62))if(U[Z]!==k)return!0;let K=J.experimental;if(!K)return!0;for(let[Z,k]of Object.entries(_62))if(K[Z]!==k)return!0;let X=J.mcpServers?.serena;if(!S62(X))return!0;let Q=gK(J.privacy)?J.privacy:void 0;if(z.telemetry===!0){if(Q&&"usageStatisticsEnabled"in Q)return!0}else if(Q?.usageStatisticsEnabled!==!1)return!0;return!1}function v$($,z={}){let G=eV($),J=G.mcpServers?.serena,U=S62(J)?J:{...J||{},...se2.serena};G.general={...G.general||{},...C62},G.experimental={...G.experimental||{},..._62},G.mcpServers={...G.mcpServers||{},serena:U};let K=gK(G.privacy)?{...G.privacy}:{};if(z.telemetry===!0)delete K.usageStatisticsEnabled;else K.usageStatisticsEnabled=!1;if(Object.keys(K).length>0)G.privacy=K;else if("privacy"in G)delete G.privacy;return G}var $25={serena:{command:"uvx",args:["--from","git+https://github.com/oraios/serena","serena","start-mcp-server","--context","agent","--project","."],env:{SERENA_LOG_LEVEL:"info"}}};function $F($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var z25=new Set(["command","args","env","cwd","url","httpUrl","headers","tcp","type","timeout","trust","description","includeTools","excludeTools"]);function G25($){let z={};for(let[G,J]of Object.entries($)){if(J===void 0||J===null)continue;if(!z25.has(G))continue;z[G]=J}return z}function h62($){if(!$)return!1;return typeof $.command==="string"||typeof $.url==="string"||typeof $.httpUrl==="string"||typeof $.tcp==="string"}function x62($){let z=i62($);if(z.mcpServers)z.mcpServers=Object.fromEntries(Object.entries(z.mcpServers).map(([G,J])=>[G,G25(J)]));return z}function i62($){if(!$F($))return{};let z=$F($.mcpServers)?$.mcpServers:void 0;return{...$,mcpServers:z}}function w$($,z={}){let G=i62($),J=x62($);if(JSON.stringify(G)!==JSON.stringify(J))return!0;let U=J.mcpServers?.serena;if(!h62(U))return!0;let K=$F(J.privacy)?J.privacy:void 0;if(z.telemetry===!0){if(K&&"usageStatisticsEnabled"in K)return!0}else if(K?.usageStatisticsEnabled!==!1)return!0;return!1}function P$($,z={}){let G=x62($),J=G.mcpServers?.serena,U=h62(J)?J:{...J||{},...$25.serena};G.mcpServers={...G.mcpServers||{},serena:U};let K=$F(G.privacy)?{...G.privacy}:{};if(z.telemetry===!0)delete K.usageStatisticsEnabled;else K.usageStatisticsEnabled=!1;if(Object.keys(K).length>0)G.privacy=K;else if("privacy"in G)delete G.privacy;return G}import{existsSync as P3,lstatSync as g62,readdirSync as WS,renameSync as zF,rmSync as GF,unlinkSync as m62}from"node:fs";import{join as q6}from"node:path";var J25={"backend-agent":"oma-backend","db-agent":"oma-db","debug-agent":"oma-debug","frontend-agent":"oma-frontend","mobile-agent":"oma-mobile","pm-agent":"oma-pm","qa-agent":"oma-qa","tf-infra-agent":"oma-tf-infra",brainstorm:"oma-brainstorm",commit:"oma-commit",orchestrator:"oma-orchestrator","dev-workflow":"oma-dev-workflow",translator:"oma-translator","workflow-guide":"oma-coordination"},U25={"backend-impl.md":"backend-engineer.md","db-impl.md":"db-engineer.md","frontend-impl.md":"frontend-engineer.md","mobile-impl.md":"mobile-engineer.md"},f62={name:"001-agents-dir",up($){let z=[],G=q6($,".agent"),J=q6($,".agents");if(P3(G)&&!P3(J))zF(G,J),z.push(".agent/ → .agents/ (renamed)");else if(P3(G)&&P3(J))try{let X=WS(G);for(let Q of X){let Z=q6(G,Q),k=q6(J,Q);if(!P3(k))zF(Z,k),z.push(`.agent/${Q} → .agents/${Q} (merged)`)}GF(G,{recursive:!0,force:!0}),z.push(".agent/ (removed after merge)")}catch{}for(let X of[".cursor/skills"]){let Q=q6($,X);if(!P3(Q))continue;try{if(g62(Q).isSymbolicLink())m62(Q),z.push(`${X} (removed symlink)`);else{let k=WS(Q),Y=0;for(let W of k){let L=q6(Q,W);if(g62(L).isSymbolicLink())m62(L),Y++}if(WS(Q).length===0)GF(Q,{recursive:!0}),z.push(`${X} (removed ${Y} symlinks, cleaned dir)`);else if(Y>0)z.push(`${X} (removed ${Y} symlinks)`)}}catch{}}let U=q6($,".agents","skills");if(P3(U))for(let[X,Q]of Object.entries(J25)){let Z=q6(U,X),k=q6(U,Q);if(P3(Z)&&!P3(k))zF(Z,k),z.push(`skills/${X} → skills/${Q}`);else if(P3(Z)&&P3(k))GF(Z,{recursive:!0}),z.push(`skills/${X} (removed, replaced by ${Q})`)}let K=q6($,".claude","agents");if(P3(K))for(let[X,Q]of Object.entries(U25)){let Z=q6(K,X),k=q6(K,Q);if(P3(Z)&&!P3(k))zF(Z,k),z.push(`agents/${X} → agents/${Q}`);else if(P3(Z)&&P3(k))GF(Z),z.push(`agents/${X} (removed, replaced by ${Q})`)}return z}};import{existsSync as HS,mkdirSync as l62,readdirSync as K25,readFileSync as c62,renameSync as X25,rmSync as n62,writeFileSync as Q25}from"node:fs";import{dirname as d62,join as JF}from"node:path";var Z25=[{from:".agents/skills/_shared/api-contracts/README.md",to:".agents/skills/_shared/core/api-contracts/README.md"},{from:".agents/skills/_shared/api-contracts/template.md",to:".agents/skills/_shared/core/api-contracts/template.md"},{from:".agents/skills/_shared/clarification-protocol.md",to:".agents/skills/_shared/core/clarification-protocol.md"},{from:".agents/skills/_shared/common-checklist.md",to:".agents/skills/_shared/core/common-checklist.md"},{from:".agents/skills/_shared/context-budget.md",to:".agents/skills/_shared/core/context-budget.md"},{from:".agents/skills/_shared/context-loading.md",to:".agents/skills/_shared/core/context-loading.md"},{from:".agents/skills/_shared/difficulty-guide.md",to:".agents/skills/_shared/core/difficulty-guide.md"},{from:".agents/skills/_shared/lessons-learned.md",to:".agents/skills/_shared/core/lessons-learned.md"},{from:".agents/skills/_shared/prompt-structure.md",to:".agents/skills/_shared/core/prompt-structure.md"},{from:".agents/skills/_shared/quality-principles.md",to:".agents/skills/_shared/core/quality-principles.md"},{from:".agents/skills/_shared/reasoning-templates.md",to:".agents/skills/_shared/core/reasoning-templates.md"},{from:".agents/skills/_shared/session-metrics.md",to:".agents/skills/_shared/core/session-metrics.md"},{from:".agents/skills/_shared/skill-routing.md",to:".agents/skills/_shared/core/skill-routing.md"},{from:".agents/skills/_shared/experiment-ledger.md",to:".agents/skills/_shared/conditional/experiment-ledger.md"},{from:".agents/skills/_shared/exploration-loop.md",to:".agents/skills/_shared/conditional/exploration-loop.md"},{from:".agents/skills/_shared/quality-score.md",to:".agents/skills/_shared/conditional/quality-score.md"},{from:".agents/skills/_shared/memory-protocol.md",to:".agents/skills/_shared/runtime/memory-protocol.md"},{from:".agents/skills/_shared/execution-protocols/claude.md",to:".agents/skills/_shared/runtime/execution-protocols/claude.md"},{from:".agents/skills/_shared/execution-protocols/codex.md",to:".agents/skills/_shared/runtime/execution-protocols/codex.md"},{from:".agents/skills/_shared/execution-protocols/gemini.md",to:".agents/skills/_shared/runtime/execution-protocols/gemini.md"},{from:".agents/skills/_shared/execution-protocols/qwen.md",to:".agents/skills/_shared/runtime/execution-protocols/qwen.md"},{from:".agents/skills/_shared/multi-review-protocol.md",to:".agents/workflows/ultrawork/resources/multi-review-protocol.md"},{from:".agents/skills/_shared/phase-gates.md",to:".agents/workflows/ultrawork/resources/phase-gates.md"}],k25=[".agents/skills/_shared/api-contracts",".agents/skills/_shared/execution-protocols"];function Y25($,z){let G=z.replace(/^\.agents\//,"");return JF($,".agents",".migration-backup","shared-layout-v2",G)}function j25($){return`.agents/.migration-backup/shared-layout-v2/${$.replace(/^\.agents\//,"")}`}var p62={name:"002-shared-layout",up($){let z=[];for(let G of Z25){let J=JF($,G.from),U=JF($,G.to);if(!HS(J))continue;if(!HS(U)){l62(d62(U),{recursive:!0}),X25(J,U),z.push(`${G.from} → ${G.to}`);continue}let K=c62(J,"utf-8"),X=c62(U,"utf-8");if(K!==X){let Q=Y25($,G.from),Z=j25(G.from);l62(d62(Q),{recursive:!0}),Q25(Q,K,"utf-8"),z.push(`${G.from} → ${Z} (backup)`)}n62(J,{force:!0}),z.push(`${G.from} (removed legacy path)`)}for(let G of k25){let J=JF($,G);if(!HS(J))continue;try{if(K25(J).length===0)n62(J,{recursive:!0,force:!0}),z.push(`${G} (removed empty dir)`)}catch{}}return z}};import{cpSync as L25,existsSync as a62,readdirSync as W25,rmSync as o62}from"node:fs";import{join as AS}from"node:path";var r62={name:"003-oma-config",up($){let z=[],G=AS($,".agents","config","user-preferences.yaml"),J=AS($,".agents","oma-config.yaml");if(a62(G)){L25(G,J,{force:!0}),o62(G),z.push(".agents/config/user-preferences.yaml → .agents/oma-config.yaml");let U=AS($,".agents","config");if(a62(U)&&W25(U).length===0)o62(U,{recursive:!0}),z.push(".agents/config/ (removed empty dir)")}return z}};import{existsSync as H25,readFileSync as A25,rmSync as B25,writeFileSync as V25}from"node:fs";import{join as F25}from"node:path";var u25="<!-- OMA:START",s62="<!-- OMA:END -->",t62={name:"004-claude-md-local",up($){let z=[],G=process.env.HOME||process.env.USERPROFILE||"";if(!G)return z;let J=F25(G,".claude","CLAUDE.md");if(!H25(J))return z;let U=A25(J,"utf-8"),K=U.indexOf(u25),X=U.indexOf(s62);if(K===-1||X===-1)return z;let Q=U.slice(0,K),Z=U.slice(X+s62.length),k=`${Q}${Z}`.trim();if(k.length===0)B25(J),z.push("~/.claude/CLAUDE.md removed (OMA block was only content)");else V25(J,`${k}
1207
1207
  `),z.push("~/.claude/CLAUDE.md: OMA block removed (migrated to local ./CLAUDE.md)");return z}};import{existsSync as BS,renameSync as N25,rmSync as e62}from"node:fs";import{join as UF}from"node:path";var $92={name:"005-rename-oma-scm",up($){let z=[],G=UF($,".agents","skills"),J=UF(G,"oma-commit"),U=UF(G,"oma-scm"),K=UF($,".agents","workflows","commit.md");if(BS(K))e62(K,{force:!0}),z.push("workflows/commit.md (removed legacy workflow)");if(!BS(J))return z;if(!BS(U))return N25(J,U),z.push("skills/oma-commit → skills/oma-scm"),z;return e62(J,{recursive:!0,force:!0}),z.push("skills/oma-commit (removed, replaced by oma-scm)"),z}};import{existsSync as O25,readFileSync as q25,writeFileSync as D25}from"node:fs";import{join as M25}from"node:path";function yY($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function I25($){let z=!1,G=$.hooks;if(!yY(G))return!1;let J=G.BeforeTool;if(!Array.isArray(J))return!1;for(let U of J){if(!yY(U))continue;if(U.matcher==="Bash")U.matcher="run_shell_command",z=!0;let K=U.hooks;if(!Array.isArray(K))continue;for(let X of K){if(!yY(X))continue;if(X.name===void 0&&typeof X.command==="string"){if(X.command.includes("test-filter.ts"))X.name="test-filter",z=!0}if(typeof X.timeout==="number"&&X.timeout>0&&X.timeout<1000)X.timeout=X.timeout*1000,z=!0}}for(let U of["BeforeAgent","AfterAgent"]){let K=G[U];if(!Array.isArray(K))continue;for(let X of K){if(!yY(X))continue;let Q=X.hooks;if(!Array.isArray(Q))continue;for(let Z of Q){if(!yY(Z))continue;if(Z.name===void 0&&typeof Z.command==="string"){if(Z.command.includes("keyword-detector.ts"))Z.name="keyword-detector",z=!0;if(Z.command.includes("persistent-mode.ts"))Z.name="persistent-mode",z=!0}if(typeof Z.timeout==="number"&&Z.timeout>0&&Z.timeout<1000)Z.timeout=Z.timeout*1000,z=!0}}}return z}var z92={name:"006-gemini-cli-compat",up($){let z=[],G=M25($,".gemini","settings.json");if(!O25(G))return z;let J;try{J=JSON.parse(q25(G,"utf-8"))}catch{return z}let U=eV(J),K=I25(U),X=JSON.stringify(U),Q={telemetry:iK($)},Z=v$(U,Q),k=X!==JSON.stringify(Z);if(!k&&!K)return z;if(D25(G,`${JSON.stringify(Z,null,2)}
@@ -1561,7 +1561,7 @@ ${cG.default.dim("Examples:")}
1561
1561
  spawn_error:${Z.message}`})})})}async function xJ2($,z,G={}){let J=G.host??"github",U=G.limit??20,K=performance.now();if(J==="gitlab"){let Y=new URLSearchParams({scope:"blobs",search:$,per_page:String(U)}),{code:j,stdout:W,stderr:L}=await yJ2("glab",["api",`/search?${Y.toString()}`],z);return hJ2("gitlab",$,j,W,L,performance.now()-K)}let X=["search","code",$,"--limit",String(U),"--json","repository,path,url,textMatches"];if(G.language)X.push("--language",G.language);if(G.repo)X.push("--repo",G.repo);let{code:Q,stdout:Z,stderr:k}=await yJ2("gh",X,z);return hJ2("github",$,Q,Z,k,performance.now()-K)}function hJ2($,z,G,J,U,K){let X=Math.round(K);if(G===null||G!==0){let Q=U.trim();if(/command not found|ENOENT/i.test(Q))return{url:`search:${$}:${z}`,status:"error",strategy:"api",platform:`${$}-cli`,content:"",elapsedMs:X,signals:[],error:$==="github"?"GitHub CLI (gh) not installed. https://cli.github.com/":"GitLab CLI (glab) not installed. https://gitlab.com/gitlab-org/cli"};if(/rate limit/i.test(Q))return{url:`search:${$}:${z}`,status:"blocked",strategy:"api",platform:`${$}-cli`,content:"",elapsedMs:X,signals:[{kind:"rate-limit",detail:Q}],error:Q};return{url:`search:${$}:${z}`,status:"error",strategy:"api",platform:`${$}-cli`,content:"",elapsedMs:X,signals:[],error:Q||`${$} cli exited ${G}`}}return{url:`search:${$}:${z}`,status:"ok",strategy:"api",platform:`${$}-cli`,content:J.trim(),contentType:"application/json",elapsedMs:X,signals:[]}}import{spawn as R$5}from"node:child_process";function v$5(){return process.env.OMA_YTDLP??"yt-dlp"}async function w$5($,z){return new Promise((G)=>{let J=R$5(v$5(),$,{stdio:["ignore","pipe","pipe"]}),U="",K="";J.stdout.on("data",(Q)=>{U+=Q.toString()}),J.stderr.on("data",(Q)=>{K+=Q.toString()});let X=()=>J.kill("SIGTERM");z.signal?.addEventListener("abort",X),J.on("close",(Q)=>{z.signal?.removeEventListener("abort",X),G({code:Q,stdout:U,stderr:K})}),J.on("error",(Q)=>{z.signal?.removeEventListener("abort",X),G({code:-1,stdout:U,stderr:`${K}
1562
1562
  spawn_error:${Q.message}`})})})}async function iJ2($,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 w$5(U,z),Z=Math.round(performance.now()-J);if(K===null||K!==0){let k=Q.trim();if(/executable not found|ENOENT/i.test(k))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:k||`yt-dlp exited with code ${K}`}}return{url:$.toString(),status:"ok",strategy:"api",platform:"media",content:X.trim(),contentType:"application/json",elapsedMs:Z,signals:[]}}J8();var Ru=/<meta\s+([^>]+)>/gi,vu=/(\w[\w-]*)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+))/g,$x=/<script[^>]+type=["']application\/ld\+json["'][^>]*>([\s\S]*?)<\/script>/gi,P$5=/<title[^>]*>([\s\S]*?)<\/title>/i,zx=/<link\s+([^>]+)>/gi;function gJ2($){let z={};vu.lastIndex=0;let G=vu.exec($);while(G!==null){let J=G[1]?.toLowerCase();if(!J){G=vu.exec($);continue}z[J]=G[2]??G[3]??G[4]??"",G=vu.exec($)}return z}function wu($){let z={},G=[],J=[],U;Ru.lastIndex=0;let K=Ru.exec($);while(K!==null){let j=K[1];if(!j){K=Ru.exec($);continue}let W=gJ2(j),L=W.property??"",H=W.name??"",A=W.content??"";if(L.startsWith("og:"))z[L.slice(3)]=A;if(H==="description"&&!U)U=A;if(H==="twitter:description"&&!U)U=A;K=Ru.exec($)}zx.lastIndex=0;let X=zx.exec($);while(X!==null){let j=X[1];if(j){let W=gJ2(j);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=zx.exec($)}$x.lastIndex=0;let Q=$x.exec($);while(Q!==null){let j=Q[1];if(j)try{J.push(JSON.parse(j))}catch{}Q=$x.exec($)}let k=P$5.exec($)?.[1]?.trim(),Y={};if(Object.keys(z).length>0)Y.ogp=z;if(J.length>0)Y.jsonLd=J;if(U)Y.description=U;if(k)Y.title=k;if(G.length>0)Y.alternate=G;return Y}async function mJ2($,z){try{let G=await f1($.toString(),{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal}),J=wu(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)}}}b$();iY();J8();b$();F3();var b$5=["archive.ph","archive.is","archive.md","archive.vn","archive.li"];function C$5($){return`https://${$.hostname.replace(/\./g,"-")}.cdn.ampproject.org/c/s/${$.hostname}${$.pathname}${$.search}`}async function _$5($,z){try{let G=C$5($),J=await f1(G,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!J.ok||J.text.length<200)return null;let U=z7(J);return{url:$.toString(),status:D6(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 S$5($,z){for(let G of b$5){if(z.signal?.aborted)break;try{let J=`https://${G}/newest/${$.toString()}`,U=await f1(J,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!U.ok||U.text.length<200)continue;let K=z7(U);return{url:$.toString(),status:D6(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 y$5($,z){try{let G=await f1(`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 f1(U.url,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!K.ok||K.text.length<200)return null;let X=z7(K);return{url:$.toString(),status:D6(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 kj($,z){let G=[()=>_$5($,z),()=>S$5($,z),()=>y$5($,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)}}b$();F3();import{existsSync as EM2}from"node:fs";import{platform as RE5}from"node:os";var vE5={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 Gn(){if(process.env.OMA_CHROME_PATH&&EM2(process.env.OMA_CHROME_PATH))return process.env.OMA_CHROME_PATH;let $=vE5[RE5()]??[];for(let z of $)if(EM2(z))return z;return null}async function wE5(){try{let $=await Promise.resolve().then(() => (TM2(),IM2));return $.default??$}catch{return null}}async function RM2($,z,G={}){let J=await wE5();if(!J)return K1({url:$.toString(),strategy:"browser",error:Error("puppeteer-core not installed. Run: bun add puppeteer-core")});let U=Gn();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",(B)=>{let V=B.url(),F=B.headers(),u=F["content-type"]??"";if(!V.startsWith($.origin))return;if(!u.includes("json")&&!u.includes("xml"))return;let N=F["access-control-request-method"]??"GET";Z.push({url:V,status:B.status(),method:N,contentType:u})});let k=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((B)=>setTimeout(B,G.waitMs));let Y=await Q.content(),j=k?.status()??0,W=new Headers;if(k)for(let[B,V]of Object.entries(k.headers()))try{W.set(B,V)}catch{}let L={ok:j>=200&&j<400,status:j,headers:W,url:$.toString(),text:Y,elapsedMs:Math.round(performance.now()-K),redirected:!1},H=z7(L),A=Math.round(performance.now()-K);return{url:$.toString(),status:T92(H)?"blocked":Y.length<200?"error":"ok",strategy:"browser",httpStatus:j,content:Y,contentType:W.get("content-type")??"text/html",elapsedMs:A,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()}}IS();J8();b$();F3();var vM2="https://r.jina.ai/";function PE5($){let z=`${$.protocol}//${$.hostname}`,G=$.hostname.startsWith("m.")?$.hostname:`m.${$.hostname.replace(/^www\./,"")}`,J=new URL($.toString());return J.hostname=G,[{label:"jina",url:`${vM2}${$.toString()}`,headers:bG({accept:"text/plain"})},{label:"jina-json",url:`${vM2}${$.toString()}`,headers:bG({accept:"application/json"})},{label:"curl-desktop",url:$.toString(),headers:bG({userAgent:G8.desktopFirefox,referer:z})},{label:"curl-mobile",url:J.toString(),headers:bG({userAgent:G8.mobileSafari,referer:z})},{label:"curl-googlebot",url:$.toString(),headers:bG({userAgent:G8.googlebot})}]}function bE5($,z){if(!$.startsWith("jina"))return z;return z}async function wM2($,z){let G=PE5($),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 f1(Z.url,{headers:Z.headers,timeoutMs:z.timeoutMs,signal:J.signal,locale:z.locale}),Y=z7(k);if(Z.label.startsWith("jina")){let j=I92(k);if(j)throw X=j,Error(`jina-quota:${j.detail}`)}if(!CE5(k,Y))throw K[Z.label]=`status=${k.status} size=${k.text.length}`,Error(`weak-response:${Z.label}`);return{label:Z.label,resp:k,signals:Y}});try{let Z=await Promise.any(Q);J.abort();let k=Math.round(performance.now()-U);return{url:$.toString(),status:D6(Z.resp,Z.signals),strategy:"probe",platform:Z.label,httpStatus:Z.resp.status,content:bE5(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),Y=Object.entries(K).map(([j,W])=>`${j}:${W}`).join(" ");if(X)return{...K1({url:$.toString(),error:Error(`probe failed — ${Y}`),strategy:"probe"}),elapsedMs:k,signals:[X]};return{...K1({url:$.toString(),error:Z instanceof AggregateError?Error(Y):Z,strategy:"probe"}),elapsedMs:k}}}function CE5($,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 _E5=["api","probe","impersonate","browser","archive"];function SE5($){if($.only?.length)return $.only;let z=_E5.slice();if(!$.includeArchive)z=z.filter((G)=>G!=="archive");if($.skip?.length)z=z.filter((G)=>!$.skip?.includes(G));return z}async function PM2($,z,G){switch($){case"api":return await jF(z,G)??null;case"probe":return wM2(z,G);case"impersonate":return YF(z,G);case"browser":return RM2(z,G);case"archive":return kj(z,G)}}function Jn($){if($.status==="ok")return!0;if($.status==="auth-required"&&R92($.signals))return!0;return!1}function yE5($){return $.status==="auth-required"||$.status==="invalid-input"||$.status==="not-found"}async function hE5($){let z=Math.floor(Math.random()*500);await new Promise((G)=>setTimeout(G,$+z))}function xE5($){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 bM2($,z,G={}){let J=SE5(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 PM2(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((Y)=>Y.kind==="js-essential"))Q=!0;if(Jn(k))return k.attempts=U,k;if(yE5(k))return k.attempts=U,k;if(G.retryOnRateLimit!==!1&&v92(k.signals)&&!K.has(Z)){K.add(Z),await hE5(xE5(k.signals));let Y=await PM2(Z,$,z);if(Y){if(U.push({strategy:Z,platform:Y.platform,status:Y.status,httpStatus:Y.httpStatus,elapsedMs:Y.elapsedMs,signals:Y.signals,error:Y.error}),Jn(Y))return Y.attempts=U,Y;X=Y;continue}}X=k}if(!J.includes("archive")&&G.includeArchive!==!1){let Z=await kj($,z);if(U.push({strategy:"archive",platform:Z.platform,status:Z.status,httpStatus:Z.httpStatus,elapsedMs:Z.elapsedMs,signals:Z.signals,error:Z.error}),Jn(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"}}J8();var FI2=d2(BI2(),1);var Zv5=["/rss","/feed","/atom.xml","/rss.xml","/index.xml"],kv5=new FI2.XMLParser({ignoreAttributes:!1,attributeNamePrefix:"@_",textNodeName:"#text"});function Yn($){if($===void 0||$===null)return[];return Array.isArray($)?$:[$]}function D3($){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 VI2($){for(let z of Yn($)){let G=z?.["@_href"],J=z?.["@_rel"];if(typeof G==="string"&&(J===void 0||J==="alternate"))return G}return}function uI2($){let z;try{z=kv5.parse($)}catch{return null}let G=z.rss;if(G){let U=G.channel;if(!U)return null;let K=Yn(U.item);return{kind:"rss",title:D3(U.title),description:D3(U.description),link:D3(U.link),entries:K.map((X)=>({title:D3(X.title),link:D3(X.link),pubDate:D3(X.pubDate),description:D3(X.description),content:D3(X["content:encoded"])??D3(X.content)}))}}let J=z.feed;if(J){let U=Yn(J.entry);return{kind:"atom",title:D3(J.title),description:D3(J.subtitle),link:VI2(J.link),entries:U.map((K)=>({title:D3(K.title),link:VI2(K.link),pubDate:D3(K.published)??D3(K.updated),description:D3(K.summary),content:D3(K.content)??D3(K.summary)}))}}return null}async function NI2($,z){let G=performance.now(),J;try{let K=await f1($.toString(),{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(K.ok)J=wu(K.text).alternate?.[0]?.href}catch{}let U=new Set;if(J)try{U.add(new URL(J,$).toString())}catch{}for(let K of Zv5)U.add(new URL(K,`${$.protocol}//${$.host}`).toString());for(let K of U){if(z.signal?.aborted)break;try{let X=await f1(K,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!X.ok||X.text.length<50)continue;let Q=uI2(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 OI2($,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()}iY();J8();var GM={"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 Yv5($){return $.replace(/^www\./,"")}function jv5($){if($ in GM){let G=GM[$];return G?{...G}:null}let z=Yv5($);if(z in GM){let G=GM[z];return G?{...G}:null}return null}function Lv5($){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 Wv5($){try{let z=await f1(`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 qI2($){let z=jv5($);if(z)return z;let G=Lv5($);if(G)return G;let J=await Wv5($);if(J)return J;return{domain:$,level:"unknown",score:null,tags:[],source:"heuristic"}}var DI2=["api","probe","impersonate","browser","archive"];function MI2($){if(!$)return;let z=$.split(",").map((J)=>J.trim()).filter(Boolean),G=z.filter((J)=>!DI2.includes(J));if(G.length>0)throw Error(`Unknown strategy: ${G.join(", ")}. Valid: ${DI2.join(", ")}`);return z}function NZ($){try{return new URL($)}catch{throw Error(`Invalid URL: ${$}`)}}function _z($){return{timeoutMs:$.timeout?Math.max(1000,Math.floor(Number($.timeout)*1000)):15000,locale:$.locale??"en-US,en;q=0.9"}}function _0($,z){if(z)console.log(JSON.stringify($,null,2));else console.log(JSON.stringify($))}function aJ($){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 II2($){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=NZ(G),K=_z(J),X=await bM2(U,K,{only:MI2(J.only),skip:MI2(J.skip),includeArchive:J.includeArchive});_0(X,Boolean(J.pretty)),aJ(X)}catch(U){console.error(E8.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=NZ(G);if(!RS(U)){console.error(E8.default.yellow(`No API handler matches host ${U.hostname}`)),process.exitCode=3;return}let X=_z(J),Q=await jF(U,X);if(!Q){process.exitCode=3;return}_0(Q,Boolean(J.pretty)),aJ(Q)}catch(U){console.error(E8.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=_z(J),K=J.platforms?J.platforms.split(",").map((Q)=>Q.trim()).filter(Boolean):void 0,X=await C$(G,U,K);_0(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=NZ(G),K=_z(J),X=await mJ2(U,K),{content:Q,...Z}=X;_0(Z,Boolean(J.pretty)),aJ(X)}catch(U){console.error(E8.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=NZ(G),K=_z(J),X=await NI2(U,K),{content:Q,...Z}=X;_0(Z,Boolean(J.pretty)),aJ(X)}catch(U){console.error(E8.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=OI2(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=NZ(G),K=_z(J),X=J.subLang?J.subLang.split(",").map((Z)=>Z.trim()).filter(Boolean):void 0,Q=await iJ2(U,K,{subtitles:J.subs,...X?{subLangs:X}:{},...J.format?{format:J.format}:{}});_0(Q,Boolean(J.pretty)),aJ(Q)}catch(U){console.error(E8.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=NZ(G),K=_z(J),X=await kj(U,K);_0(X,Boolean(J.pretty)),aJ(X)}catch(U){console.error(E8.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 qI2(G.toLowerCase());_0(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=_z({}),X=await xJ2(G,K,{host:U,...J.language?{language:J.language}:{},...J.repo?{repo:J.repo}:{},...J.limit?{limit:Number.parseInt(J.limit,10)}:{}});_0(X,Boolean(J.pretty)),aJ(X)}),z.command("doctor").description("Check dependencies (Chrome, python3 curl_cffi, yt-dlp, gh)").action(async()=>{let G=[],J=Gn();G.push({name:"chrome",ok:Boolean(J),detail:J??"Install Chrome or set OMA_CHROME_PATH"}),G.push(await jn("python3",["--version"])),G.push(await Hv5()),G.push(await jn("yt-dlp",["--version"])),G.push(await jn("gh",["--version"]));for(let U of G){let K=U.ok?E8.default.green("✓"):E8.default.yellow("!");console.log(`${K} ${U.name}: ${U.detail}`)}if(G.some((U)=>!U.ok))process.exitCode=1})}async function jn($,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 Hv5(){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)"})})})}O7();var Sz=d2(q4(),1);import{execSync as Av5,spawnSync as TI2}from"node:child_process";import{platform as Bv5}from"node:os";function Vv5(){let $=Bv5();if($==="darwin")return"brew install gh";if($==="win32")return"winget install GitHub.cli";return"sudo apt install gh"}async function EI2(){if(console.clear(),f4(Sz.default.bgMagenta(Sz.default.white(" ⭐ oh-my-agent star "))),!ZG()){let z=Vv5(),G=await L3({message:`GitHub CLI (gh) is not installed. Install with ${Sz.default.cyan(z)}?`});if(W4(G)||!G){v5("Install gh manually and try again.");return}let J=V6();J.start("Installing GitHub CLI...");let U=TI2(z,{shell:!0,stdio:"pipe"});if(U.status!==0){J.stop("Installation failed"),e5.error(U.stderr?.toString()||"Unknown error"),v5("Please install gh manually.");return}J.stop("GitHub CLI installed!")}if(!s9()){e5.warn("GitHub CLI is not authenticated.");let z=await L3({message:`Run ${Sz.default.cyan("gh auth login")} now?`});if(W4(z)||!z){v5("Authenticate and try again.");return}if(TI2("gh",["auth","login"],{stdio:"inherit"}),!s9()){v5("Authentication was not completed. Try again.");return}e5.success("Authenticated!")}if(kG()){v5(`Already starred ${Sz.default.cyan($1)}! Thank you! \uD83D\uDE4F`);return}let $=await L3({message:`Star ${Sz.default.cyan($1)} on GitHub?`});if(W4($)||!$){v5("Maybe next time!");return}try{Av5(`gh api -X PUT /user/starred/${$1}`,{stdio:"ignore"}),v5(`Starred ${Sz.default.cyan($1)}! Thank you! \uD83C\uDF1F`)}catch{e5.error("Failed to star the repository."),v5("Please try again later.")}}function RI2($){$.command("star").description("Star oh-my-agent on GitHub").action(L5(async()=>{await EI2()}))}O7();oh();ik();var w9=d2(q4(),1);import{existsSync as JM,mkdirSync as Fv5,readdirSync as uv5,readFileSync as Nv5,writeFileSync as vI2}from"node:fs";import{dirname as Ov5,join as wI2}from"node:path";function Wn($){return wI2($,".serena","metrics.json")}function Ln(){return{sessions:0,skillsUsed:{},tasksCompleted:0,totalSessionTime:0,filesChanged:0,linesAdded:0,linesRemoved:0,lastUpdated:new Date().toISOString(),startDate:new Date().toISOString()}}function qv5($){let z=Wn($);if(JM(z))try{return JSON.parse(Nv5(z,"utf-8"))}catch{return Ln()}return Ln()}function Dv5($,z){let G=Wn($),J=Ov5(G);if(!JM(J))Fv5(J,{recursive:!0});z.lastUpdated=new Date().toISOString(),vI2(G,JSON.stringify(z,null,2),"utf-8")}function Mv5($){let z=wI2($,".serena","memories"),G={};if(!JM(z))return G;try{let J=uv5(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 PI2($=!1,z=!1){let G=process.cwd(),J=Wn(G);if(z){if(JM(J))vI2(J,JSON.stringify(Ln(),null,2),"utf-8");if($)console.log(JSON.stringify({reset:!0}));else console.log(w9.default.green("✅ Metrics reset successfully."));return}let U=qv5(G),K=qu(G),X=Mv5(G),Q=ss(G),Z=NB(G),k=Z.startedAt?new Date(Z.startedAt):null,Y=k&&!Number.isNaN(k.getTime())?Math.max(0,Math.floor((Date.now()-k.getTime())/1000)):0;for(let[A,B]of Object.entries(X))U.skillsUsed[A]=(U.skillsUsed[A]||0)+B;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)&&Y>0)U.totalSessionTime+=Y;U.lastSessionId=Z.id,U.lastSessionStatus=Z.status,U.lastSessionStarted=Z.startedAt,U.lastSessionDuration=Y}U.filesChanged+=K.filesChanged,U.linesAdded+=K.linesAdded,U.linesRemoved+=K.linesRemoved,U.sessions+=1,Dv5(G,U);let j=Math.max(1,Math.ceil((Date.now()-new Date(U.startDate).getTime())/86400000)),W=U.sessions>0?Math.round(U.totalSessionTime/U.sessions):0;if($){console.log(JSON.stringify({...U,gitStats:K,daysSinceStart:j,avgSessionTime:W},null,2));return}console.clear(),f4(w9.default.bgMagenta(w9.default.white(" \uD83D\uDCCA oh-my-agent stats ")));let L=[w9.default.bold(`\uD83D\uDCC8 Productivity Metrics (${j} days)`),"┌─────────────────────┬──────────────┐",`│ ${w9.default.bold("Metric")} │ ${w9.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 │ ${w9.default.green(`+${U.linesAdded}`).padEnd(12)} │`,`│ Lines Removed │ ${w9.default.red(`-${U.linesRemoved}`).padEnd(12)} │`,"└─────────────────────┴──────────────┘"].join(`
1563
1563
  `);U5(L,"Overview");let H=Object.entries(U.skillsUsed).sort(([,A],[,B])=>B-A).slice(0,5);if(H.length>0){let A=[w9.default.bold("\uD83C\uDFC6 Top Skills Used"),...H.map(([B,V],F)=>` ${F+1}. ${B} (${V})`)].join(`
1564
- `);U5(A,"Skills")}v5(w9.default.dim(`Data stored in: ${J}`))}function bI2($){r1($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(L5(async(z)=>{await PI2(g1(z),z.reset)},{supportsJsonOutput:!0}))}O7();var g4=d2(q4(),1);import{execSync as Pv5}from"node:child_process";import{cpSync as XM,existsSync as P9,mkdirSync as IW,readFileSync as OZ,rmSync as Hn,writeFileSync as rJ}from"node:fs";import{tmpdir as bv5}from"node:os";import{dirname as yI2,join as Z3}from"node:path";var UM=d2(q4(),1);import{execSync as Iv5,spawn as Tv5}from"node:child_process";import{realpathSync as CI2}from"node:fs";import MW from"node:process";var oJ="oh-my-agent";function Ev5($=MW.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(MW.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=z9(CI2($))}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(MW.platform==="darwin")try{let G=Iv5(`brew --prefix ${oJ}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(G){let J=z9(CI2(G));if(z.startsWith(J))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${oJ}`,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 ${oJ}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(z.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${oJ}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(z.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${oJ}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${oJ}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var _I2=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function Rv5($,z){let G=$.match(_I2),J=z.match(_I2);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 vv5($=oJ,z=2000){try{let G=await E$.get(`https://registry.npmjs.org/${$}/latest`,{timeout:z});return typeof G.data?.version==="string"?G.data.version:null}catch{return null}}async function SI2($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(MW.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(MW.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let z=await vv5();if(!z)return{triggered:!1,reason:"fetch-failed"};if(!Rv5($.currentVersion,z))return{triggered:!1,reason:"up-to-date",latest:z};let G=Ev5();if(!G.updateCommand)return $.onNotice?.(UM.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. ${G.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:z};try{return Tv5(G.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(UM.default.cyan(`global oh-my-agent ${$.currentVersion} → ${z} updating in background. New version applies on next run.`)),{triggered:!0,latest:z}}catch{return $.onNotice?.(UM.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. Run: ${G.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:z}}}var KM={name:"oh-my-agent",version:"7.14.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",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",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 Cv5($){if(!$)return{intro:(G)=>f4(G),outro:(G)=>v5(G),note:(G,J)=>U5(G,J),logError:(G)=>e5.error(G),spinnerStart:(G)=>{let J=V6();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 _v5($,z){if($!==null)return"ready";return z?"legacy":"missing"}async function An($=!1,z=!1){if(!z&&process.stdout.isTTY)console.clear();let G=Cv5(z);G.intro(g4.default.bgMagenta(g4.default.white(" \uD83D\uDEF8 oh-my-agent update ")));let J=process.cwd();await SI2({currentVersion:KM.version,enabled:E62(J),onSpawnStart:(Y)=>G.note(Y,"CLI auto-update"),onNotice:(Y)=>G.note(Y,"CLI update available")});let U=await pV(J),K=V62(J),X=_v5(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=wG(J);if(Q.length>0)G.note(Q.map((Y)=>`${g4.default.green("✓")} ${Y}`).join(`
1564
+ `);U5(A,"Skills")}v5(w9.default.dim(`Data stored in: ${J}`))}function bI2($){r1($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(L5(async(z)=>{await PI2(g1(z),z.reset)},{supportsJsonOutput:!0}))}O7();var g4=d2(q4(),1);import{execSync as Pv5}from"node:child_process";import{cpSync as XM,existsSync as P9,mkdirSync as IW,readFileSync as OZ,rmSync as Hn,writeFileSync as rJ}from"node:fs";import{tmpdir as bv5}from"node:os";import{dirname as yI2,join as Z3}from"node:path";var UM=d2(q4(),1);import{execSync as Iv5,spawn as Tv5}from"node:child_process";import{realpathSync as CI2}from"node:fs";import MW from"node:process";var oJ="oh-my-agent";function Ev5($=MW.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(MW.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=z9(CI2($))}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(MW.platform==="darwin")try{let G=Iv5(`brew --prefix ${oJ}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(G){let J=z9(CI2(G));if(z.startsWith(J))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${oJ}`,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 ${oJ}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(z.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${oJ}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(z.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${oJ}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${oJ}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var _I2=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function Rv5($,z){let G=$.match(_I2),J=z.match(_I2);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 vv5($=oJ,z=2000){try{let G=await E$.get(`https://registry.npmjs.org/${$}/latest`,{timeout:z});return typeof G.data?.version==="string"?G.data.version:null}catch{return null}}async function SI2($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(MW.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(MW.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let z=await vv5();if(!z)return{triggered:!1,reason:"fetch-failed"};if(!Rv5($.currentVersion,z))return{triggered:!1,reason:"up-to-date",latest:z};let G=Ev5();if(!G.updateCommand)return $.onNotice?.(UM.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. ${G.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:z};try{return Tv5(G.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(UM.default.cyan(`global oh-my-agent ${$.currentVersion} → ${z} updating in background. New version applies on next run.`)),{triggered:!0,latest:z}}catch{return $.onNotice?.(UM.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. Run: ${G.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:z}}}var KM={name:"oh-my-agent",version:"7.14.1",description:"Portable multi-agent harness for .agents-based skills and workflows across Antigravity, Claude Code, Codex, OpenCode, and more",type:"module",bin:{"oh-my-agent":"./bin/cli.js",oma:"./bin/cli.js"},files:["bin"],keywords:["oh-my-agent","antigravity",".agents","agent","skills","agent-skills","multi-agent","orchestrator","claude","claude-code","codex","opencode","copilot","cursor","chatgpt","pm","frontend","backend","mobile","qa","debug","terraform","database","workflow","bug-fixing","gemini"],author:"our.first.fluke <our.first.fluke@gmail.com>",contributors:["gracefullight <gracefullight.dev@gmail.com>","gahyun-git <go4it.gh@gmail.com>"],license:"MIT",funding:[{type:"github",url:"https://github.com/sponsors/first-fluke"},{type:"buymeacoffee",url:"https://buymeacoffee.com/firstfluke"}],scripts:{"sync:readme":"node ./scripts/sync-readme.mjs","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",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",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 Cv5($){if(!$)return{intro:(G)=>f4(G),outro:(G)=>v5(G),note:(G,J)=>U5(G,J),logError:(G)=>e5.error(G),spinnerStart:(G)=>{let J=V6();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 _v5($,z){if($!==null)return"ready";return z?"legacy":"missing"}async function An($=!1,z=!1){if(!z&&process.stdout.isTTY)console.clear();let G=Cv5(z);G.intro(g4.default.bgMagenta(g4.default.white(" \uD83D\uDEF8 oh-my-agent update ")));let J=process.cwd();await SI2({currentVersion:KM.version,enabled:E62(J),onSpawnStart:(Y)=>G.note(Y,"CLI auto-update"),onNotice:(Y)=>G.note(Y,"CLI update available")});let U=await pV(J),K=V62(J),X=_v5(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=wG(J);if(Q.length>0)G.note(Q.map((Y)=>`${g4.default.green("✓")} ${Y}`).join(`
1565
1565
  `),"Migration");let Z=Q.length>0||QS(J);if(Q.length>0&&!QS(J))ZS(J,!0);if(!z)await rV(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 Y=await D62();if(U===Y.version&&!Z){k.stop(g4.default.green("Already up to date!")),G.outro(`Current version: ${g4.default.cyan(U)}`);return}let j=U===Y.version;k.message(`Downloading ${g4.default.cyan(Y.version)}...`);let{dir:W,cleanup:L}=await bK();try{k.message("Copying files..."),wG(J);let H=Z3(J,".agents","oma-config.yaml"),A=Z3(J,".agents","mcp.json"),B=!$&&P9(H)?OZ(H):null,V=!$&&P9(A)?OZ(A):null,F=Z3(bv5(),`oma-stack-backup-${Date.now()}`),u=Z3(J,".agents","skills","oma-backend","stack"),N=!$&&P9(u);if(N)IW(F,{recursive:!0}),XM(u,Z3(F,"oma-backend"),{recursive:!0});let I=["snippets.md","tech-stack.md","api-template.py"],T=Z3(J,".agents","skills","oma-backend","resources"),q=!$&&!N&&I.some((e)=>P9(Z3(T,e))),D=kS(J);if(XM(Z3(W,".agents"),Z3(J,".agents"),{recursive:!0,force:!0}),B)rJ(H,B);if(V)rJ(A,V);if(N)try{IW(u,{recursive:!0}),XM(Z3(F,"oma-backend"),u,{recursive:!0,force:!0})}finally{Hn(F,{recursive:!0,force:!0})}if(q){let e=Z3(W,".agents","skills","oma-backend","variants","python");if(P9(e))IW(u,{recursive:!0}),XM(e,u,{recursive:!0,force:!0}),rJ(Z3(u,"stack.yaml"),`language: python
1566
1566
  framework: fastapi
1567
1567
  orm: sqlalchemy
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-agent",
3
- "version": "7.14.0",
3
+ "version": "7.14.1",
4
4
  "description": "Portable multi-agent harness for .agents-based skills and workflows across Antigravity, Claude Code, Codex, OpenCode, and more",
5
5
  "type": "module",
6
6
  "bin": {