oh-my-agent 4.23.2 → 4.23.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 +9 -9
  2. package/bin/cli.js +2 -2
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -37,21 +37,21 @@ Pick a preset and you're ready:
37
37
 
38
38
  | Agent | What They Do |
39
39
  |-------|-------------|
40
- | **oma-brainstorm** | Explores ideas before you commit to building |
41
- | **oma-pm** | Plans tasks, breaks down requirements, defines API contracts |
42
- | **oma-frontend** | React/Next.js, TypeScript, Tailwind CSS v4, shadcn/ui |
43
40
  | **oma-backend** | APIs in Python, Node.js, or Rust |
41
+ | **oma-brainstorm** | Explores ideas before you commit to building |
42
+ | **oma-commit** | Clean conventional commits |
44
43
  | **oma-db** | Schema design, migrations, indexing, vector DB |
45
- | **oma-mobile** | Flutter cross-platform apps |
46
- | **oma-design** | Design systems, tokens, accessibility, responsive |
47
- | **oma-qa** | OWASP security, performance, accessibility review |
48
44
  | **oma-debug** | Root cause analysis, fixes, regression tests |
49
- | **oma-tf-infra** | Multi-cloud Terraform IaC |
45
+ | **oma-design** | Design systems, tokens, accessibility, responsive |
50
46
  | **oma-dev-workflow** | CI/CD, releases, monorepo automation |
51
- | **oma-translator** | Natural multilingual translation |
47
+ | **oma-frontend** | React/Next.js, TypeScript, Tailwind CSS v4, shadcn/ui |
48
+ | **oma-mobile** | Flutter cross-platform apps |
52
49
  | **oma-orchestrator** | Parallel agent execution via CLI |
53
- | **oma-commit** | Clean conventional commits |
54
50
  | **oma-pdf** | PDF to Markdown conversion |
51
+ | **oma-pm** | Plans tasks, breaks down requirements, defines API contracts |
52
+ | **oma-qa** | OWASP security, performance, accessibility review |
53
+ | **oma-tf-infra** | Multi-cloud Terraform IaC |
54
+ | **oma-translator** | Natural multilingual translation |
55
55
 
56
56
  ## How It Works
57
57
 
package/bin/cli.js CHANGED
@@ -369,7 +369,7 @@ ${X}`,initialValue:!0});if(e(q)||!q)return{shouldCleanupBrain:!1,shouldCleanupIm
369
369
  ${i.default.dim(`${O} memory files found`)}`,"Serena Memory");else y(`${i.default.yellow("⚠️")} Serena memory directory not found
370
370
  ${i.default.dim("Dashboard will show 'No agents detected'")}`,"Serena Memory");if(g.installed)y(`${i.default.green("✅")} Global workflows installed
371
371
  ${i.default.dim(`${g.count} workflow files found`)}`,"Global Workflows");else y(`${i.default.red("❌")} Global workflows missing
372
- ${i.default.dim("Run 'oh-my-ag' to install or reinstall global workflows")}`,"Global Workflows");if(G)y(`${i.default.green("✅")} git rerere is enabled`,"Git Config");else{let T=await B$({message:"Enable git rerere? (Recommended for multi-agent merge conflict reuse)",initialValue:!0});if(!e(T)&&T)try{ov("git config --global rerere.enabled true"),c.success(i.default.green("git rerere enabled globally!"))}catch(A){c.error(`Failed to enable git rerere: ${A}`)}else y(`${i.default.yellow("⚠️")} git rerere is not enabled
372
+ ${i.default.dim("Run 'oma' to install or reinstall global workflows")}`,"Global Workflows");if(G)y(`${i.default.green("✅")} git rerere is enabled`,"Git Config");else{let T=await B$({message:"Enable git rerere? (Recommended for multi-agent merge conflict reuse)",initialValue:!0});if(!e(T)&&T)try{ov("git config --global rerere.enabled true"),c.success(i.default.green("git rerere enabled globally!"))}catch(A){c.error(`Failed to enable git rerere: ${A}`)}else y(`${i.default.yellow("⚠️")} git rerere is not enabled
373
373
  ${i.default.dim("Run: git config --global rerere.enabled true")}`,"Git Config")}if(v){if(X)y(`${i.default.green("✅")} Claude Code recommended settings applied`,"Claude Config");else{let T=await B$({message:"Apply recommended Claude Code settings?",initialValue:!0});if(!e(T)&&T)try{let A={};if($6(N))A=JSON.parse(uu(N,"utf-8"));A.env={...A.env||{},cleanupPeriodDays:180,CLAUDE_CODE_FILE_READ_MAX_OUTPUT_TOKENS:1e5,CLAUDE_AUTOCOMPACT_PCT_OVERRIDE:80,DISABLE_TELEMETRY:"1",DISABLE_ERROR_REPORTING:"1",CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY:"1"},A.attribution={commit:`Generated with oh-my-agent
374
374
 
375
375
  Co-Authored-By: First Fluke <our.first.fluke@gmail.com>`,pr:"Generated with [oh-my-agent](https://github.com/first-fluke/oh-my-agent)"},rS(N,`${JSON.stringify(A,null,2)}
@@ -514,7 +514,7 @@ Co-Authored-By: First Fluke <our.first.fluke@gmail.com>`,pr:"Generated with [oh-
514
514
  </html>`;function kT(){let $=mf();if(!kf($))yf($,{recursive:!0});let I=rf((J,g)=>{if(J.url==="/api/state")g.writeHead(200,{"Content-Type":"application/json"}),g.end(JSON.stringify(cq($)));else g.writeHead(200,{"Content-Type":"text/html"}),g.end(of)}),_=new dq.default({server:I}),u=null;function U(J,g){if(u)clearTimeout(u);u=setTimeout(()=>{let G=JSON.stringify({type:"update",event:J,file:g,data:cq($)});_.clients.forEach((v)=>{if(v.readyState===hq.default.OPEN)v.send(G)})},100)}let z=Au($,{persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:200,pollInterval:50}});z.on("all",(J,g)=>U(J,xT(g))),_.on("connection",(J)=>{J.send(JSON.stringify({type:"full",data:cq($)})),J.on("error",()=>J.terminate())}),process.on("SIGINT",()=>{console.log(`
515
515
  Shutting down...`),z.close(),_.clients.forEach((J)=>{J.terminate()}),_.close(()=>I.close(()=>process.exit(0))),setTimeout(()=>process.exit(1),3000).unref()}),process.on("SIGTERM",()=>process.emit("SIGINT")),I.listen(fT,()=>{console.log(W0.magenta(`
516
516
  \uD83D\uDEF8 Serena Memory Dashboard`)),console.log(W0.white(` http://localhost:${fT}`)),console.log(W0.dim(` Watching: ${$}
517
- `))})}var yT={name:"oh-my-agent",version:"4.23.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","oma-pdf"]}};import{existsSync as af,mkdirSync as ef,readdirSync as _U,readFileSync as sf,statSync as aq}from"node:fs";import{basename as $x,join as A4}from"node:path";var y$=Q$(b$(),1),Ix="●",Ux="✓",_x="✗",ux="○",zx="◌";function Jx(){if(process.env.MEMORIES_DIR)return process.env.MEMORIES_DIR;let $=process.argv[3];if($)return A4($,".serena","memories");return A4(process.cwd(),".serena","memories")}function uU($){try{return sf($,"utf-8")}catch{return""}}function gx($){try{let I=_U($);if(I.includes("orchestrator-session.md"))return A4($,"orchestrator-session.md");let _=I.filter((u)=>/^session-.*\.md$/.test(u)).map((u)=>({name:u,mtime:aq(A4($,u)).mtimeMs})).sort((u,U)=>U.mtime-u.mtime);if(_.length>0&&_[0])return A4($,_[0].name)}catch{}return null}function Gx($){let I=gx($);if(!I)return{id:"N/A",status:"UNKNOWN"};let _=uU(I);if(!_)return{id:"N/A",status:"UNKNOWN"};let u=(_.match(/session-id:\s*(.+)/i)||[])[1]||(_.match(/# Session:\s*(.+)/i)||[])[1]||_.match(/(session-\d{8}-\d{6})/)?.[1]||$x(I,".md"),U="UNKNOWN";if(/IN PROGRESS|RUNNING|## Active|\[IN PROGRESS\]/i.test(_))U="RUNNING";else if(/COMPLETED|DONE|## Completed|\[COMPLETED\]/i.test(_))U="COMPLETED";else if(/FAILED|ERROR|## Failed|\[FAILED\]/i.test(_))U="FAILED";else if(/Step \d+:.*\[/i.test(_))U="RUNNING";return{id:(u||"N/A").trim(),status:U}}function vx($){let I=uU(A4($,"task-board.md"));if(!I)return[];let _=[],u=I.split(`
517
+ `))})}var yT={name:"oh-my-agent",version:"4.23.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-agent":"./bin/cli.js",oma:"./bin/cli.js"},files:["bin"],keywords:["oh-my-agent","antigravity",".agents","agent","skills","agent-skills","multi-agent","orchestrator","claude","claude-code","codex","opencode","copilot","cursor","chatgpt","pm","frontend","backend","mobile","qa","debug","terraform","database","workflow","bug-fixing","gemini"],author:"our.first.fluke <our.first.fluke@gmail.com>",contributors:["gracefullight <gracefullight.dev@gmail.com>","gahyun-git <go4it.gh@gmail.com>"],license:"MIT",funding:[{type:"github",url:"https://github.com/sponsors/first-fluke"},{type:"buymeacoffee",url:"https://buymeacoffee.com/firstfluke"}],scripts:{"sync:readme":"node ./scripts/sync-readme.mjs",build:"bun run sync:readme && bun build cli.ts --outfile bin/cli.js --target node --minify",dev:"bun run cli.ts",lint:"biome check --write --unsafe .",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","oma-pdf"]}};import{existsSync as af,mkdirSync as ef,readdirSync as _U,readFileSync as sf,statSync as aq}from"node:fs";import{basename as $x,join as A4}from"node:path";var y$=Q$(b$(),1),Ix="●",Ux="✓",_x="✗",ux="○",zx="◌";function Jx(){if(process.env.MEMORIES_DIR)return process.env.MEMORIES_DIR;let $=process.argv[3];if($)return A4($,".serena","memories");return A4(process.cwd(),".serena","memories")}function uU($){try{return sf($,"utf-8")}catch{return""}}function gx($){try{let I=_U($);if(I.includes("orchestrator-session.md"))return A4($,"orchestrator-session.md");let _=I.filter((u)=>/^session-.*\.md$/.test(u)).map((u)=>({name:u,mtime:aq(A4($,u)).mtimeMs})).sort((u,U)=>U.mtime-u.mtime);if(_.length>0&&_[0])return A4($,_[0].name)}catch{}return null}function Gx($){let I=gx($);if(!I)return{id:"N/A",status:"UNKNOWN"};let _=uU(I);if(!_)return{id:"N/A",status:"UNKNOWN"};let u=(_.match(/session-id:\s*(.+)/i)||[])[1]||(_.match(/# Session:\s*(.+)/i)||[])[1]||_.match(/(session-\d{8}-\d{6})/)?.[1]||$x(I,".md"),U="UNKNOWN";if(/IN PROGRESS|RUNNING|## Active|\[IN PROGRESS\]/i.test(_))U="RUNNING";else if(/COMPLETED|DONE|## Completed|\[COMPLETED\]/i.test(_))U="COMPLETED";else if(/FAILED|ERROR|## Failed|\[FAILED\]/i.test(_))U="FAILED";else if(/Step \d+:.*\[/i.test(_))U="RUNNING";return{id:(u||"N/A").trim(),status:U}}function vx($){let I=uU(A4($,"task-board.md"));if(!I)return[];let _=[],u=I.split(`
518
518
  `);for(let U of u){if(!U.startsWith("|")||/^\|\s*-+/.test(U))continue;let z=U.split("|").map((v)=>v.trim()).filter(Boolean),J=z[0];if(z.length<2||!J||/^agent$/i.test(J))continue;let g=z[1],G=z[2];_.push({agent:J,status:g||"pending",task:G||""})}return _}function tq($,I){try{let _=_U($).filter((z)=>z.startsWith(`progress-${I}`)&&z.endsWith(".md")).sort().reverse();if(_.length===0||!_[0])return null;let U=uU(A4($,_[0])).match(/turn[:\s]*(\d+)/i);return U?.[1]?parseInt(U[1],10):null}catch{return null}}function qx($){try{let I=_U($).filter((u)=>u.endsWith(".md")&&u!==".gitkeep").map((u)=>({name:u,mtime:aq(A4($,u)).mtimeMs})).sort((u,U)=>U.mtime-u.mtime).slice(0,5),_=[];for(let u of I){let U=u.name.replace(/^(progress|result|session|debug|task)-?/,"").replace(/[-_]agent/,"").replace(/[-_]completion/,"").replace(/\.md$/,"").replace(/[-_]/g," ").trim()||u.name.replace(/\.md$/,""),J=uU(A4($,u.name)).split(`
519
519
  `).map((G)=>G.trim()).filter((G)=>G&&!G.startsWith("---")&&G.length>3),g="";for(let G=J.length-1;G>=0;G--){let v=J[G];if(!v)continue;if(/^\*\*|^#+|^-|^\d+\.|Status|Result|Action|Step/i.test(v)){if(g=v.replace(/^[#*\-\d.]+\s*/,"").replace(/\*\*/g,"").trim(),g.length>5)break}}if(g.length>52)g=`${g.substring(0,49)}...`;if(g)_.push({agent:U,message:g})}return _}catch{return[]}}function Xx($){let I=[],_=new Set;try{let u=_U($).filter((U)=>U.endsWith(".md")&&U!==".gitkeep").map((U)=>({name:U,mtime:aq(A4($,U)).mtimeMs})).sort((U,z)=>z.mtime-U.mtime);for(let U of u){let z=uU(A4($,U.name)),J=z.match(/\*\*Agent\*\*:\s*(.+)/i)||z.match(/Agent:\s*(.+)/i)||z.match(/^#+\s*(.+?)\s*Agent/im),g=null;if(J?.[1])g=J[1].trim();else if(/_agent|agent_|-agent/i.test(U.name))g=U.name.replace(/\.md$/,"").replace(/[-_]completion|[-_]progress|[-_]result/gi,"").replace(/[-_]/g," ").trim();if(g&&!_.has(g.toLowerCase())){_.add(g.toLowerCase());let G="unknown";if(/\[COMPLETED\]|## Completed|## Results/i.test(z))G="completed";else if(/\[IN PROGRESS\]|## Progress|IN PROGRESS/i.test(z))G="running";else if(/\[FAILED\]|## Failed|ERROR/i.test(z))G="failed";let v=z.match(/## Task\s*\n+(.+)/i)||z.match(/\*\*Task\*\*:\s*(.+)/i),X=v?.[1]?v[1].trim().substring(0,20):"";I.push({agent:g,status:G,task:X,turn:tq($,g)})}}}catch{}return I}function Nx($){let I=$.toLowerCase();if(["running","active","in_progress","in-progress"].includes(I))return`${y$.default.green(Ix)} running`;else if(["completed","done","finished"].includes(I))return`${y$.default.cyan(Ux)} completed`;else if(["failed","error"].includes(I))return`${y$.default.red(_x)} failed`;else if(["blocked","waiting"].includes(I))return`${y$.default.yellow(ux)} blocked`;return`${y$.default.dim(zx)} pending`}function iT($){console.clear();let I=Gx($),u=vx($).map((Q)=>({...Q,turn:tq($,Q.agent)}));if(u.length===0)u=Xx($);if(u.length===0)try{let Q=_U($).filter((O)=>O.startsWith("progress-")&&O.endsWith(".md"));for(let O of Q){let D=O.replace(/^progress-/,"").replace(/\.md$/,"");u.push({agent:D,status:"running",task:"",turn:tq($,D)})}}catch{}let U=56,z="═".repeat(U),J=(Q)=>" ".repeat(Math.max(0,Q)),g=(Q)=>y$.default.magenta(Q),G=(Q)=>y$.default.bold(Q),v=(Q)=>y$.default.dim(Q),X=y$.default.yellow;if(I.status==="RUNNING")X=y$.default.green;else if(I.status==="COMPLETED")X=y$.default.cyan;else if(I.status==="FAILED")X=y$.default.red;console.log(`${g(`╔${z}╗`)}`),console.log(`${g("║")} ${G(g("Serena Memory Dashboard"))}${J(U-25)}${g("║")}`);let q=`Session: ${G(I.id.padEnd(20))} [${X(I.status)}]`;if(console.log(`${g("║")} ${q}${J(U-4-q.length-9)}${g("║")}`),console.log(`${g(`╠${z}╣`)}`),console.log(`${g("║")} ${G(`${"Agent".padEnd(12)} ${"Status".padEnd(12)} ${"Turn".padEnd(6)} ${"Task".padEnd(20)}`)} ${g("║")}`),console.log(`${g("║")} ${v(`${"──────────".padEnd(12)} ${"──────────".padEnd(12)} ${"────".padEnd(6)} ${"──────────────────".padEnd(20)}`)} ${g("║")}`),u.length===0)console.log(`${g("║")} ${v(`No agents detected yet${J(32)}`)}${g("║")}`);else for(let Q of u){let O=Nx(Q.status),D=Q.turn!=null?String(Q.turn):"-",V=Q.task.substring(0,20);console.log(`${g("║")} ${Q.agent.padEnd(12)} ${O.padEnd(22)} ${D.padEnd(6)} ${V.padEnd(20)}${g("║")}`)}console.log(`${g(`╠${z}╣`)}`),console.log(`${g("║")} ${G("Latest Activity:")}${J(U-18)}${g("║")}`);let N=qx($);if(N.length===0)console.log(`${g("║")} ${v(`No activity yet${J(38)}`)}${g("║")}`);else for(let Q of N){let O=`[${Q.agent}] ${Q.message}`;console.log(`${g("║")} ${v(O.substring(0,52).padEnd(52))}${g("║")}`)}console.log(`${g(`╠${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(`${g("║")} ${v(H)}${J(U-4-H.length)}${g("║")}`),console.log(`${g(`╚${z}╝`)}`)}async function lT(){let $=Jx();if(!af($))ef($,{recursive:!0}),console.log(y$.default.yellow(`Created ${$} — waiting for memory files...`));console.log(y$.default.magenta(`
520
520
  \uD83D\uDEF8 Serena Terminal Dashboard`)),console.log(y$.default.dim(` Watching: ${$}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "oh-my-agent",
3
- "version": "4.23.2",
3
+ "version": "4.23.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": {
7
- "oh-my-ag": "./bin/cli.js",
7
+ "oh-my-agent": "./bin/cli.js",
8
8
  "oma": "./bin/cli.js"
9
9
  },
10
10
  "files": [