oh-my-agent 4.22.2 → 4.22.3

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 -1
  2. package/bin/cli.js +1 -1
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -17,9 +17,11 @@ Works with all major AI IDEs: Antigravity, Claude Code, Cursor, Gemini CLI, Code
17
17
  curl -fsSL https://raw.githubusercontent.com/first-fluke/oh-my-agent/main/cli/install.sh | bash
18
18
 
19
19
  # Or manual
20
- bunx oh-my-agent
20
+ bunx oh-my-agent@latest
21
21
  ```
22
22
 
23
+ `install.sh` supports macOS/Linux only. On Windows, install `bun` and `uv` manually, then run `bunx oh-my-agent@latest`.
24
+
23
25
  Pick a preset and you're ready:
24
26
 
25
27
  | Preset | What You Get |
package/bin/cli.js CHANGED
@@ -515,7 +515,7 @@ Co-Authored-By: First Fluke <our.first.fluke@gmail.com>`,pr:"Generated with [oh-
515
515
  </html>`;function jO(){let $=Lf();if(!Mf($))Df($,{recursive:!0});let I=Rf((v,J)=>{if(v.url==="/api/state")J.writeHead(200,{"Content-Type":"application/json"}),J.end(JSON.stringify(mg($)));else J.writeHead(200,{"Content-Type":"text/html"}),J.end(jf)}),U=new lg.default({server:I}),_=null;function u(v,J){if(_)clearTimeout(_);_=setTimeout(()=>{let N=JSON.stringify({type:"update",event:v,file:J,data:mg($)});U.clients.forEach((G)=>{if(G.readyState===ng.default.OPEN)G.send(N)})},100)}let z=j2($,{persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:200,pollInterval:50}});z.on("all",(v,J)=>u(v,bO(J))),U.on("connection",(v)=>{v.send(JSON.stringify({type:"full",data:mg($)})),v.on("error",()=>v.terminate())}),process.on("SIGINT",()=>{console.log(`
516
516
  Shutting down...`),z.close(),U.clients.forEach((v)=>{v.terminate()}),U.close(()=>I.close(()=>process.exit(0))),setTimeout(()=>process.exit(1),3000).unref()}),process.on("SIGTERM",()=>process.emit("SIGINT")),I.listen(AO,()=>{console.log(ZI.magenta(`
517
517
  \uD83D\uDEF8 Serena Memory Dashboard`)),console.log(ZI.white(` http://localhost:${AO}`)),console.log(ZI.dim(` Watching: ${$}
518
- `))})}var FO={name:"oh-my-agent",version:"4.22.2",description:"Portable multi-agent harness for .agents-based skills and workflows across Antigravity, Claude Code, Codex, OpenCode, and more",type:"module",bin:{"oh-my-ag":"./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 .",test:"vitest run",prepublishOnly:"bun run build"},dependencies:{"@clack/prompts":"^1.1.0",chokidar:"^5.0.0",commander:"^14.0.3","p-map":"^7.0.4",picocolors:"^1.1.1",ws:"^8.18.0",yaml:"^2.8.2",zod:"^4.3.6"},devDependencies:{"@biomejs/biome":"2.4.5","@types/bun":"^1.3.10","@types/ws":"^8.18.1",vitest:"^4.0.18"},peerDependencies:{typescript:"^6"},repository:{type:"git",url:"https://github.com/first-fluke/oh-my-agent"},antigravity:{skillsPath:".agents/skills",skills:["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-commit"]}};import{existsSync as wf,mkdirSync as Sf,readdirSync as _u,readFileSync as Ef,statSync as pg}from"node:fs";import{basename as Cf,join as b4}from"node:path";var i$=Q$(b$(),1),ff="●",xf="✓",kf="✗",yf="○",rf="◌";function nf(){if(process.env.MEMORIES_DIR)return process.env.MEMORIES_DIR;let $=process.argv[3];if($)return b4($,".serena","memories");return b4(process.cwd(),".serena","memories")}function zu($){try{return Ef($,"utf-8")}catch{return""}}function lf($){try{let I=_u($);if(I.includes("orchestrator-session.md"))return b4($,"orchestrator-session.md");let U=I.filter((_)=>/^session-.*\.md$/.test(_)).map((_)=>({name:_,mtime:pg(b4($,_)).mtimeMs})).sort((_,u)=>u.mtime-_.mtime);if(U.length>0&&U[0])return b4($,U[0].name)}catch{}return null}function mf($){let I=lf($);if(!I)return{id:"N/A",status:"UNKNOWN"};let U=zu(I);if(!U)return{id:"N/A",status:"UNKNOWN"};let _=(U.match(/session-id:\s*(.+)/i)||[])[1]||(U.match(/# Session:\s*(.+)/i)||[])[1]||U.match(/(session-\d{8}-\d{6})/)?.[1]||Cf(I,".md"),u="UNKNOWN";if(/IN PROGRESS|RUNNING|## Active|\[IN PROGRESS\]/i.test(U))u="RUNNING";else if(/COMPLETED|DONE|## Completed|\[COMPLETED\]/i.test(U))u="COMPLETED";else if(/FAILED|ERROR|## Failed|\[FAILED\]/i.test(U))u="FAILED";else if(/Step \d+:.*\[/i.test(U))u="RUNNING";return{id:(_||"N/A").trim(),status:u}}function hf($){let I=zu(b4($,"task-board.md"));if(!I)return[];let U=[],_=I.split(`
518
+ `))})}var FO={name:"oh-my-agent",version:"4.22.3",description:"Portable multi-agent harness for .agents-based skills and workflows across Antigravity, Claude Code, Codex, OpenCode, and more",type:"module",bin:{"oh-my-ag":"./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 .",test:"vitest run",prepublishOnly:"bun run build"},dependencies:{"@clack/prompts":"^1.1.0",chokidar:"^5.0.0",commander:"^14.0.3","p-map":"^7.0.4",picocolors:"^1.1.1",ws:"^8.18.0",yaml:"^2.8.2",zod:"^4.3.6"},devDependencies:{"@biomejs/biome":"2.4.5","@types/bun":"^1.3.10","@types/ws":"^8.18.1",vitest:"^4.0.18"},peerDependencies:{typescript:"^6"},repository:{type:"git",url:"https://github.com/first-fluke/oh-my-agent"},antigravity:{skillsPath:".agents/skills",skills:["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-commit"]}};import{existsSync as wf,mkdirSync as Sf,readdirSync as _u,readFileSync as Ef,statSync as pg}from"node:fs";import{basename as Cf,join as b4}from"node:path";var i$=Q$(b$(),1),ff="●",xf="✓",kf="✗",yf="○",rf="◌";function nf(){if(process.env.MEMORIES_DIR)return process.env.MEMORIES_DIR;let $=process.argv[3];if($)return b4($,".serena","memories");return b4(process.cwd(),".serena","memories")}function zu($){try{return Ef($,"utf-8")}catch{return""}}function lf($){try{let I=_u($);if(I.includes("orchestrator-session.md"))return b4($,"orchestrator-session.md");let U=I.filter((_)=>/^session-.*\.md$/.test(_)).map((_)=>({name:_,mtime:pg(b4($,_)).mtimeMs})).sort((_,u)=>u.mtime-_.mtime);if(U.length>0&&U[0])return b4($,U[0].name)}catch{}return null}function mf($){let I=lf($);if(!I)return{id:"N/A",status:"UNKNOWN"};let U=zu(I);if(!U)return{id:"N/A",status:"UNKNOWN"};let _=(U.match(/session-id:\s*(.+)/i)||[])[1]||(U.match(/# Session:\s*(.+)/i)||[])[1]||U.match(/(session-\d{8}-\d{6})/)?.[1]||Cf(I,".md"),u="UNKNOWN";if(/IN PROGRESS|RUNNING|## Active|\[IN PROGRESS\]/i.test(U))u="RUNNING";else if(/COMPLETED|DONE|## Completed|\[COMPLETED\]/i.test(U))u="COMPLETED";else if(/FAILED|ERROR|## Failed|\[FAILED\]/i.test(U))u="FAILED";else if(/Step \d+:.*\[/i.test(U))u="RUNNING";return{id:(_||"N/A").trim(),status:u}}function hf($){let I=zu(b4($,"task-board.md"));if(!I)return[];let U=[],_=I.split(`
519
519
  `);for(let u of _){if(!u.startsWith("|")||/^\|\s*-+/.test(u))continue;let z=u.split("|").map((G)=>G.trim()).filter(Boolean),v=z[0];if(z.length<2||!v||/^agent$/i.test(v))continue;let J=z[1],N=z[2];U.push({agent:v,status:J||"pending",task:N||""})}return U}function dg($,I){try{let U=_u($).filter((z)=>z.startsWith(`progress-${I}`)&&z.endsWith(".md")).sort().reverse();if(U.length===0||!U[0])return null;let u=zu(b4($,U[0])).match(/turn[:\s]*(\d+)/i);return u?.[1]?parseInt(u[1],10):null}catch{return null}}function cf($){try{let I=_u($).filter((_)=>_.endsWith(".md")&&_!==".gitkeep").map((_)=>({name:_,mtime:pg(b4($,_)).mtimeMs})).sort((_,u)=>u.mtime-_.mtime).slice(0,5),U=[];for(let _ of I){let u=_.name.replace(/^(progress|result|session|debug|task)-?/,"").replace(/[-_]agent/,"").replace(/[-_]completion/,"").replace(/\.md$/,"").replace(/[-_]/g," ").trim()||_.name.replace(/\.md$/,""),v=zu(b4($,_.name)).split(`
520
520
  `).map((N)=>N.trim()).filter((N)=>N&&!N.startsWith("---")&&N.length>3),J="";for(let N=v.length-1;N>=0;N--){let G=v[N];if(!G)continue;if(/^\*\*|^#+|^-|^\d+\.|Status|Result|Action|Step/i.test(G)){if(J=G.replace(/^[#*\-\d.]+\s*/,"").replace(/\*\*/g,"").trim(),J.length>5)break}}if(J.length>52)J=`${J.substring(0,49)}...`;if(J)U.push({agent:u,message:J})}return U}catch{return[]}}function df($){let I=[],U=new Set;try{let _=_u($).filter((u)=>u.endsWith(".md")&&u!==".gitkeep").map((u)=>({name:u,mtime:pg(b4($,u)).mtimeMs})).sort((u,z)=>z.mtime-u.mtime);for(let u of _){let z=zu(b4($,u.name)),v=z.match(/\*\*Agent\*\*:\s*(.+)/i)||z.match(/Agent:\s*(.+)/i)||z.match(/^#+\s*(.+?)\s*Agent/im),J=null;if(v?.[1])J=v[1].trim();else if(/_agent|agent_|-agent/i.test(u.name))J=u.name.replace(/\.md$/,"").replace(/[-_]completion|[-_]progress|[-_]result/gi,"").replace(/[-_]/g," ").trim();if(J&&!U.has(J.toLowerCase())){U.add(J.toLowerCase());let N="unknown";if(/\[COMPLETED\]|## Completed|## Results/i.test(z))N="completed";else if(/\[IN PROGRESS\]|## Progress|IN PROGRESS/i.test(z))N="running";else if(/\[FAILED\]|## Failed|ERROR/i.test(z))N="failed";let G=z.match(/## Task\s*\n+(.+)/i)||z.match(/\*\*Task\*\*:\s*(.+)/i),X=G?.[1]?G[1].trim().substring(0,20):"";I.push({agent:J,status:N,task:X,turn:dg($,J)})}}}catch{}return I}function pf($){let I=$.toLowerCase();if(["running","active","in_progress","in-progress"].includes(I))return`${i$.default.green(ff)} running`;else if(["completed","done","finished"].includes(I))return`${i$.default.cyan(xf)} completed`;else if(["failed","error"].includes(I))return`${i$.default.red(kf)} failed`;else if(["blocked","waiting"].includes(I))return`${i$.default.yellow(yf)} blocked`;return`${i$.default.dim(rf)} pending`}function wO($){console.clear();let I=mf($),_=hf($).map((Q)=>({...Q,turn:dg($,Q.agent)}));if(_.length===0)_=df($);if(_.length===0)try{let Q=_u($).filter((Y)=>Y.startsWith("progress-")&&Y.endsWith(".md"));for(let Y of Q){let V=Y.replace(/^progress-/,"").replace(/\.md$/,"");_.push({agent:V,status:"running",task:"",turn:dg($,V)})}}catch{}let u=56,z="═".repeat(u),v=(Q)=>" ".repeat(Math.max(0,Q)),J=(Q)=>i$.default.magenta(Q),N=(Q)=>i$.default.bold(Q),G=(Q)=>i$.default.dim(Q),X=i$.default.yellow;if(I.status==="RUNNING")X=i$.default.green;else if(I.status==="COMPLETED")X=i$.default.cyan;else if(I.status==="FAILED")X=i$.default.red;console.log(`${J(`╔${z}╗`)}`),console.log(`${J("║")} ${N(J("Serena Memory Dashboard"))}${v(u-25)}${J("║")}`);let g=`Session: ${N(I.id.padEnd(20))} [${X(I.status)}]`;if(console.log(`${J("║")} ${g}${v(u-4-g.length-9)}${J("║")}`),console.log(`${J(`╠${z}╣`)}`),console.log(`${J("║")} ${N(`${"Agent".padEnd(12)} ${"Status".padEnd(12)} ${"Turn".padEnd(6)} ${"Task".padEnd(20)}`)} ${J("║")}`),console.log(`${J("║")} ${G(`${"──────────".padEnd(12)} ${"──────────".padEnd(12)} ${"────".padEnd(6)} ${"──────────────────".padEnd(20)}`)} ${J("║")}`),_.length===0)console.log(`${J("║")} ${G(`No agents detected yet${v(32)}`)}${J("║")}`);else for(let Q of _){let Y=pf(Q.status),V=Q.turn!=null?String(Q.turn):"-",K=Q.task.substring(0,20);console.log(`${J("║")} ${Q.agent.padEnd(12)} ${Y.padEnd(22)} ${V.padEnd(6)} ${K.padEnd(20)}${J("║")}`)}console.log(`${J(`╠${z}╣`)}`),console.log(`${J("║")} ${N("Latest Activity:")}${v(u-18)}${J("║")}`);let q=cf($);if(q.length===0)console.log(`${J("║")} ${G(`No activity yet${v(38)}`)}${J("║")}`);else for(let Q of q){let Y=`[${Q.agent}] ${Q.message}`;console.log(`${J("║")} ${G(Y.substring(0,52).padEnd(52))}${J("║")}`)}console.log(`${J(`╠${z}╣`)}`);let H=`Updated: ${new Date().toLocaleString("en-US",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})} | Ctrl+C to exit`;console.log(`${J("║")} ${G(H)}${v(u-4-H.length)}${J("║")}`),console.log(`${J(`╚${z}╝`)}`)}async function SO(){let $=nf();if(!wf($))Sf($,{recursive:!0}),console.log(i$.default.yellow(`Created ${$} — waiting for memory files...`));console.log(i$.default.magenta(`
521
521
  \uD83D\uDEF8 Serena Terminal Dashboard`)),console.log(i$.default.dim(` Watching: ${$}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-agent",
3
- "version": "4.22.2",
3
+ "version": "4.22.3",
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": {