oh-my-agent 2.11.2 → 2.11.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 (2) hide show
  1. package/bin/cli.js +1 -1
  2. package/package.json +1 -1
package/bin/cli.js CHANGED
@@ -448,7 +448,7 @@ Comparing: ${D.label} (current) vs ${G.label} (prior)
448
448
  </html>`;function ZO(){let $=mi();if(!li($))xi($,{recursive:!0});let u=yi((v,z)=>{if(v.url==="/api/state")z.writeHead(200,{"Content-Type":"application/json"}),z.end(JSON.stringify(mD($)));else z.writeHead(200,{"Content-Type":"text/html"}),z.end(ti)}),g=new yD.default({server:u}),U=null;function I(v,z){if(U)clearTimeout(U);U=setTimeout(()=>{let N=JSON.stringify({type:"update",event:v,file:z,data:mD($)});g.clients.forEach((J)=>{if(J.readyState===kD.default.OPEN)J.send(N)})},100)}let _=mU($,{persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:200,pollInterval:50}});_.on("all",(v,z)=>I(v,AO(z))),g.on("connection",(v)=>{v.send(JSON.stringify({type:"full",data:mD($)})),v.on("error",()=>v.terminate())}),process.on("SIGINT",()=>{console.log(`
449
449
  Shutting down...`),_.close(),g.clients.forEach((v)=>{v.terminate()}),g.close(()=>u.close(()=>process.exit(0))),setTimeout(()=>process.exit(1),3000).unref()}),process.on("SIGTERM",()=>process.emit("SIGINT")),u.listen(WO,()=>{console.log(U1.magenta(`
450
450
  \uD83D\uDEF8 Serena Memory Dashboard`)),console.log(U1.white(` http://localhost:${WO}`)),console.log(U1.dim(` Watching: ${$}
451
- `))})}var FO={name:"oh-my-agent",version:"2.11.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:"^5"},repository:{type:"git",url:"https://github.com/first-fluke/oh-my-agent"},antigravity:{skillsPath:".agents/skills",skills:["brainstorm","workflow-guide","pm-agent","frontend-agent","backend-agent","db-agent","mobile-agent","qa-agent","debug-agent","orchestrator","dev-workflow","tf-infra-agent","commit"]}};import{existsSync as ei,mkdirSync as si,readdirSync as Z6,readFileSync as $n,statSync as oD}from"node:fs";import{basename as un,join as Yu}from"node:path";var E$=Q$(A$(),1),In="●",gn="✓",Un="✗",_n="○",vn="◌";function zn(){if(process.env.MEMORIES_DIR)return process.env.MEMORIES_DIR;let $=process.argv[3];if($)return Yu($,".serena","memories");return Yu(process.cwd(),".serena","memories")}function F6($){try{return $n($,"utf-8")}catch{return""}}function Nn($){try{let u=Z6($);if(u.includes("orchestrator-session.md"))return Yu($,"orchestrator-session.md");let g=u.filter((U)=>/^session-.*\.md$/.test(U)).map((U)=>({name:U,mtime:oD(Yu($,U)).mtimeMs})).sort((U,I)=>I.mtime-U.mtime);if(g.length>0&&g[0])return Yu($,g[0].name)}catch{}return null}function Jn($){let u=Nn($);if(!u)return{id:"N/A",status:"UNKNOWN"};let g=F6(u);if(!g)return{id:"N/A",status:"UNKNOWN"};let U=(g.match(/session-id:\s*(.+)/i)||[])[1]||(g.match(/# Session:\s*(.+)/i)||[])[1]||g.match(/(session-\d{8}-\d{6})/)?.[1]||un(u,".md"),I="UNKNOWN";if(/IN PROGRESS|RUNNING|## Active|\[IN PROGRESS\]/i.test(g))I="RUNNING";else if(/COMPLETED|DONE|## Completed|\[COMPLETED\]/i.test(g))I="COMPLETED";else if(/FAILED|ERROR|## Failed|\[FAILED\]/i.test(g))I="FAILED";else if(/Step \d+:.*\[/i.test(g))I="RUNNING";return{id:(U||"N/A").trim(),status:I}}function Gn($){let u=F6(Yu($,"task-board.md"));if(!u)return[];let g=[],U=u.split(`
451
+ `))})}var FO={name:"oh-my-agent",version:"2.11.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:"^5"},repository:{type:"git",url:"https://github.com/first-fluke/oh-my-agent"},antigravity:{skillsPath:".agents/skills",skills:["brainstorm","workflow-guide","pm-agent","frontend-agent","backend-agent","db-agent","mobile-agent","qa-agent","debug-agent","orchestrator","dev-workflow","tf-infra-agent","commit"]}};import{existsSync as ei,mkdirSync as si,readdirSync as Z6,readFileSync as $n,statSync as oD}from"node:fs";import{basename as un,join as Yu}from"node:path";var E$=Q$(A$(),1),In="●",gn="✓",Un="✗",_n="○",vn="◌";function zn(){if(process.env.MEMORIES_DIR)return process.env.MEMORIES_DIR;let $=process.argv[3];if($)return Yu($,".serena","memories");return Yu(process.cwd(),".serena","memories")}function F6($){try{return $n($,"utf-8")}catch{return""}}function Nn($){try{let u=Z6($);if(u.includes("orchestrator-session.md"))return Yu($,"orchestrator-session.md");let g=u.filter((U)=>/^session-.*\.md$/.test(U)).map((U)=>({name:U,mtime:oD(Yu($,U)).mtimeMs})).sort((U,I)=>I.mtime-U.mtime);if(g.length>0&&g[0])return Yu($,g[0].name)}catch{}return null}function Jn($){let u=Nn($);if(!u)return{id:"N/A",status:"UNKNOWN"};let g=F6(u);if(!g)return{id:"N/A",status:"UNKNOWN"};let U=(g.match(/session-id:\s*(.+)/i)||[])[1]||(g.match(/# Session:\s*(.+)/i)||[])[1]||g.match(/(session-\d{8}-\d{6})/)?.[1]||un(u,".md"),I="UNKNOWN";if(/IN PROGRESS|RUNNING|## Active|\[IN PROGRESS\]/i.test(g))I="RUNNING";else if(/COMPLETED|DONE|## Completed|\[COMPLETED\]/i.test(g))I="COMPLETED";else if(/FAILED|ERROR|## Failed|\[FAILED\]/i.test(g))I="FAILED";else if(/Step \d+:.*\[/i.test(g))I="RUNNING";return{id:(U||"N/A").trim(),status:I}}function Gn($){let u=F6(Yu($,"task-board.md"));if(!u)return[];let g=[],U=u.split(`
452
452
  `);for(let I of U){if(!I.startsWith("|")||/^\|\s*-+/.test(I))continue;let _=I.split("|").map((J)=>J.trim()).filter(Boolean),v=_[0];if(_.length<2||!v||/^agent$/i.test(v))continue;let z=_[1],N=_[2];g.push({agent:v,status:z||"pending",task:N||""})}return g}function dD($,u){try{let g=Z6($).filter((_)=>_.startsWith(`progress-${u}`)&&_.endsWith(".md")).sort().reverse();if(g.length===0||!g[0])return null;let I=F6(Yu($,g[0])).match(/turn[:\s]*(\d+)/i);return I?.[1]?parseInt(I[1],10):null}catch{return null}}function Dn($){try{let u=Z6($).filter((U)=>U.endsWith(".md")&&U!==".gitkeep").map((U)=>({name:U,mtime:oD(Yu($,U)).mtimeMs})).sort((U,I)=>I.mtime-U.mtime).slice(0,5),g=[];for(let U of u){let I=U.name.replace(/^(progress|result|session|debug|task)-?/,"").replace(/[-_]agent/,"").replace(/[-_]completion/,"").replace(/\.md$/,"").replace(/[-_]/g," ").trim()||U.name.replace(/\.md$/,""),v=F6(Yu($,U.name)).split(`
453
453
  `).map((N)=>N.trim()).filter((N)=>N&&!N.startsWith("---")&&N.length>3),z="";for(let N=v.length-1;N>=0;N--){let J=v[N];if(!J)continue;if(/^\*\*|^#+|^-|^\d+\.|Status|Result|Action|Step/i.test(J)){if(z=J.replace(/^[#*\-\d.]+\s*/,"").replace(/\*\*/g,"").trim(),z.length>5)break}}if(z.length>52)z=`${z.substring(0,49)}...`;if(z)g.push({agent:I,message:z})}return g}catch{return[]}}function Xn($){let u=[],g=new Set;try{let U=Z6($).filter((I)=>I.endsWith(".md")&&I!==".gitkeep").map((I)=>({name:I,mtime:oD(Yu($,I)).mtimeMs})).sort((I,_)=>_.mtime-I.mtime);for(let I of U){let _=F6(Yu($,I.name)),v=_.match(/\*\*Agent\*\*:\s*(.+)/i)||_.match(/Agent:\s*(.+)/i)||_.match(/^#+\s*(.+?)\s*Agent/im),z=null;if(v?.[1])z=v[1].trim();else if(/_agent|agent_|-agent/i.test(I.name))z=I.name.replace(/\.md$/,"").replace(/[-_]completion|[-_]progress|[-_]result/gi,"").replace(/[-_]/g," ").trim();if(z&&!g.has(z.toLowerCase())){g.add(z.toLowerCase());let N="unknown";if(/\[COMPLETED\]|## Completed|## Results/i.test(_))N="completed";else if(/\[IN PROGRESS\]|## Progress|IN PROGRESS/i.test(_))N="running";else if(/\[FAILED\]|## Failed|ERROR/i.test(_))N="failed";let J=_.match(/## Task\s*\n+(.+)/i)||_.match(/\*\*Task\*\*:\s*(.+)/i),D=J?.[1]?J[1].trim().substring(0,20):"";u.push({agent:z,status:N,task:D,turn:dD($,z)})}}}catch{}return u}function qn($){let u=$.toLowerCase();if(["running","active","in_progress","in-progress"].includes(u))return`${E$.default.green(In)} running`;else if(["completed","done","finished"].includes(u))return`${E$.default.cyan(gn)} completed`;else if(["failed","error"].includes(u))return`${E$.default.red(Un)} failed`;else if(["blocked","waiting"].includes(u))return`${E$.default.yellow(_n)} blocked`;return`${E$.default.dim(vn)} pending`}function wO($){console.clear();let u=Jn($),U=Gn($).map((q)=>({...q,turn:dD($,q.agent)}));if(U.length===0)U=Xn($);if(U.length===0)try{let q=Z6($).filter((O)=>O.startsWith("progress-")&&O.endsWith(".md"));for(let O of q){let H=O.replace(/^progress-/,"").replace(/\.md$/,"");U.push({agent:H,status:"running",task:"",turn:dD($,H)})}}catch{}let I=56,_="═".repeat(I),v=(q)=>" ".repeat(Math.max(0,q)),z=(q)=>E$.default.magenta(q),N=(q)=>E$.default.bold(q),J=(q)=>E$.default.dim(q),D=E$.default.yellow;if(u.status==="RUNNING")D=E$.default.green;else if(u.status==="COMPLETED")D=E$.default.cyan;else if(u.status==="FAILED")D=E$.default.red;console.log(`${z(`╔${_}╗`)}`),console.log(`${z("║")} ${N(z("Serena Memory Dashboard"))}${v(I-25)}${z("║")}`);let G=`Session: ${N(u.id.padEnd(20))} [${D(u.status)}]`;if(console.log(`${z("║")} ${G}${v(I-4-G.length-9)}${z("║")}`),console.log(`${z(`╠${_}╣`)}`),console.log(`${z("║")} ${N(`${"Agent".padEnd(12)} ${"Status".padEnd(12)} ${"Turn".padEnd(6)} ${"Task".padEnd(20)}`)} ${z("║")}`),console.log(`${z("║")} ${J(`${"──────────".padEnd(12)} ${"──────────".padEnd(12)} ${"────".padEnd(6)} ${"──────────────────".padEnd(20)}`)} ${z("║")}`),U.length===0)console.log(`${z("║")} ${J(`No agents detected yet${v(32)}`)}${z("║")}`);else for(let q of U){let O=qn(q.status),H=q.turn!=null?String(q.turn):"-",M=q.task.substring(0,20);console.log(`${z("║")} ${q.agent.padEnd(12)} ${O.padEnd(22)} ${H.padEnd(6)} ${M.padEnd(20)}${z("║")}`)}console.log(`${z(`╠${_}╣`)}`),console.log(`${z("║")} ${N("Latest Activity:")}${v(I-18)}${z("║")}`);let X=Dn($);if(X.length===0)console.log(`${z("║")} ${J(`No activity yet${v(38)}`)}${z("║")}`);else for(let q of X){let O=`[${q.agent}] ${q.message}`;console.log(`${z("║")} ${J(O.substring(0,52).padEnd(52))}${z("║")}`)}console.log(`${z(`╠${_}╣`)}`);let T=`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(`${z("║")} ${J(T)}${v(I-4-T.length)}${z("║")}`),console.log(`${z(`╚${_}╝`)}`)}async function iO(){let $=zn();if(!ei($))si($,{recursive:!0}),console.log(E$.default.yellow(`Created ${$} — waiting for memory files...`));console.log(E$.default.magenta(`
454
454
  \uD83D\uDEF8 Serena Terminal Dashboard`)),console.log(E$.default.dim(` Watching: ${$}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-agent",
3
- "version": "2.11.2",
3
+ "version": "2.11.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": {