oh-my-agent 4.2.0 → 4.2.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 +66 -101
  2. package/bin/cli.js +1 -1
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -6,112 +6,17 @@
6
6
 
7
7
  The portable, role-based agent harness for serious AI-assisted engineering.
8
8
 
9
- Orchestrate 10 specialized domain agents (PM, Frontend, Backend, DB, Mobile, QA, Debug, Brainstorm, DevWorkflow, Terraform) via **Serena Memory**. `oh-my-agent` uses `.agents/` as the source of truth for portable skills and workflows, then projects compatibility to other AI IDEs and CLIs. It combines role-based agents, explicit workflows, real-time observability, and standards-aware guidance for teams that want less AI slop and more disciplined execution.
9
+ Orchestrate 10 specialized domain agents (PM, Frontend, Backend, DB, Mobile, QA, Debug, Brainstorm, DevWorkflow, Terraform). `oh-my-agent` works with all major AI IDEs including Antigravity, Claude Code, Cursor, Gemini, OpenCode, and more. It combines role-based agents, explicit workflows, real-time observability, and standards-aware guidance for teams that want less AI slop and more disciplined execution.
10
10
 
11
11
  ## Table of Contents
12
12
 
13
- - [Architecture](#architecture)
14
- - [Why Different](#why-different)
15
- - [Compatibility](#compatibility)
16
- - [The `.agents` Spec](#the-agents-spec)
17
13
  - [What Is This?](#what-is-this)
14
+ - [Why Different](#why-different)
18
15
  - [Quick Start](#quick-start)
16
+ - [Architecture](#architecture)
19
17
  - [Sponsors](#sponsors)
20
18
  - [License](#license)
21
19
 
22
- ## Architecture
23
-
24
- ```mermaid
25
- flowchart TD
26
- subgraph Workflows["Workflows"]
27
- direction TB
28
- W0["/brainstorm"]
29
- W1["/coordinate"]
30
- W1b["/ultrawork"]
31
- W2["/orchestrate"]
32
- W3["/plan"]
33
- W4["/review"]
34
- W5["/debug"]
35
- W6["/deepinit"]
36
- end
37
-
38
- subgraph Orchestration["Orchestration"]
39
- direction TB
40
- PM[oma-pm]
41
- ORC[oma-orchestrator]
42
- end
43
-
44
- subgraph Domain["Domain Agents"]
45
- direction TB
46
- FE[oma-frontend]
47
- BE[oma-backend]
48
- DB[oma-db]
49
- MB[oma-mobile]
50
- TF[oma-tf-infra]
51
- end
52
-
53
- subgraph Quality["Quality"]
54
- direction TB
55
- QA[oma-qa]
56
- DBG[oma-debug]
57
- end
58
-
59
- Workflows --> Orchestration
60
- Orchestration --> Domain
61
- Domain --> Quality
62
- Quality --> CMT([oma-commit])
63
- ```
64
-
65
- ## Why Different
66
-
67
- - **`.agents/` is the source of truth**: skills, workflows, shared resources, and config live in one portable project structure instead of being trapped inside one IDE plugin.
68
- - **Role-shaped agent teams**: PM, QA, DB, Infra, Frontend, Backend, Mobile, Debug, and Workflow agents are modeled like an engineering org, not just a pile of prompts.
69
- - **Workflow-first orchestration**: planning, review, debug, and coordinated execution are first-class workflows, not afterthoughts.
70
- - **Standards-aware by design**: agents now carry focused guidance for ISO-driven planning, QA, database continuity/security, and infrastructure governance.
71
- - **Built for verification**: dashboards, manifest generation, shared execution protocols, and structured outputs favor traceability over vibe-only generation.
72
-
73
- ## Compatibility
74
-
75
- `oh-my-agent` is designed around `.agents/` and then bridges to other tool-specific skill folders when needed.
76
-
77
- | Tool / IDE | Skills Source | Interop Mode | Notes |
78
- |------------|---------------|--------------|-------|
79
- | Antigravity | `.agents/skills/` | Native | Primary source-of-truth layout; no custom subagent spawning |
80
- | Claude Code | `.claude/skills/` + `.claude/agents/` | Native + Adapter | Symlinks for domain skills + thin router workflow skills, subagents generated from `.agents/agents/`, and CLAUDE.md |
81
- | Codex CLI | `.codex/agents/` + `.agents/skills/` | Native + Adapter | Agent TOML generated from `.agents/agents/` (planned) |
82
- | Gemini CLI | `.gemini/agents/` + `.agents/skills/` | Native + Adapter | Agent MD generated from `.agents/agents/` (planned) |
83
- | OpenCode | `.agents/skills/` | Native-compatible | Uses the same project-level skill source |
84
- | Amp | `.agents/skills/` | Native-compatible | Shares the same project-level source |
85
- | Cursor | `.agents/skills/` | Native-compatible | Can consume the same project-level skill source |
86
- | GitHub Copilot | `.github/skills/` | Optional symlink | Installed when selected during setup |
87
-
88
- See [SUPPORTED_AGENTS.md](https://github.com/first-fluke/oh-my-agent/blob/main/docs/SUPPORTED_AGENTS.md) for the current support matrix and interoperability notes.
89
-
90
- ### Claude Code Native Integration
91
-
92
- Claude Code has first-class native integration beyond symlinks:
93
-
94
- - **`CLAUDE.md`** — project identity, architecture, and rules (auto-loaded by Claude Code)
95
- - **`.claude/skills/`** — 12 thin router SKILL.md files that delegate to `.agents/workflows/` (e.g., `/orchestrate`, `/coordinate`, `/ultrawork`). Skills are explicitly invoked via slash commands, not keyword-auto-activated.
96
- - **`.claude/agents/`** — 7 subagent definitions generated from `.agents/agents/*.yaml`, spawned via Task tool (backend-engineer, frontend-engineer, mobile-engineer, db-engineer, qa-reviewer, debug-investigator, pm-planner)
97
- - **Native loop patterns** — Review Loop, Issue Remediation Loop, and Phase Gate Loop using synchronous Task tool results instead of CLI polling
98
-
99
- Domain skills (oma-backend, oma-frontend, etc.) remain as symlinks from `.agents/skills/`. Workflow skills are thin router SKILL.md files that delegate to the corresponding `.agents/workflows/*.md` source of truth.
100
-
101
- ## The `.agents` Spec
102
-
103
- `oh-my-agent` treats `.agents/` as a portable project convention for agent skills, workflows, and shared context.
104
-
105
- - Skills live in `.agents/skills/<skill-name>/SKILL.md`
106
- - Abstract agent definitions live in `.agents/agents/` (vendor-neutral SSOT; the CLI generates `.claude/agents/`, `.codex/agents/` (planned), `.gemini/agents/` (planned) from these)
107
- - Shared resources live in `.agents/skills/_shared/`
108
- and are grouped into `core/`, `conditional/`, and `runtime/`
109
- - Workflows live in `.agents/workflows/*.md`
110
- - Project config lives in `.agents/config/`
111
- - CLI metadata and packaging stay aligned through generated manifests
112
-
113
- See [AGENTS_SPEC.md](https://github.com/first-fluke/oh-my-agent/blob/main/docs/AGENTS_SPEC.md) for the project layout, required files, interoperability rules, and source-of-truth model.
114
-
115
20
  ## What Is This?
116
21
 
117
22
  A collection of **Agent Skills** enabling collaborative multi-agent development. Work is distributed across expert agents with explicit roles, workflows, and verification boundaries:
@@ -128,9 +33,23 @@ A collection of **Agent Skills** enabling collaborative multi-agent development.
128
33
  | **Debug Agent** | Bug diagnosis, root cause analysis, regression tests | "bug", "error", "crash" |
129
34
  | **Developer Workflow** | Monorepo task automation, mise tasks, CI/CD, migrations, release | "dev workflow", "mise tasks", "CI/CD pipeline" |
130
35
  | **TF Infra Agent** | Multi-cloud IaC provisioning (AWS, GCP, Azure, OCI) | "infrastructure", "terraform", "cloud setup" |
131
- | **Orchestrator** | CLI-based parallel agent execution with Serena Memory | "spawn agent", "parallel execution" |
36
+ | **Orchestrator** | CLI-based parallel agent execution | "spawn agent", "parallel execution" |
132
37
  | **Commit** | Conventional Commits with project-specific rules | "commit", "save changes" |
133
38
 
39
+
40
+
41
+ ## Why Different
42
+
43
+ - **`.agents/` is the source of truth**: skills, workflows, shared resources, and config live in one portable project structure instead of being trapped inside one IDE plugin.
44
+ - **Role-shaped agent teams**: PM, QA, DB, Infra, Frontend, Backend, Mobile, Debug, and Workflow agents are modeled like an engineering org, not just a pile of prompts.
45
+ - **Workflow-first orchestration**: planning, review, debug, and coordinated execution are first-class workflows, not afterthoughts.
46
+ - **Standards-aware by design**: agents now carry focused guidance for ISO-driven planning, QA, database continuity/security, and infrastructure governance.
47
+ - **Built for verification**: dashboards, manifest generation, shared execution protocols, and structured outputs favor traceability over vibe-only generation.
48
+
49
+
50
+
51
+
52
+
134
53
  ## Quick Start
135
54
 
136
55
  ### Prerequisites
@@ -219,6 +138,53 @@ You'll also need at least one CLI tool:
219
138
 
220
139
  For dashboard setup and usage details, see [`web/content/en/guide/usage.md`](https://github.com/first-fluke/oh-my-agent/blob/main/web/content/en/guide/usage.md#real-time-dashboards).
221
140
 
141
+
142
+
143
+ ## Architecture
144
+
145
+ ```mermaid
146
+ flowchart TD
147
+ subgraph Workflows["Workflows"]
148
+ direction TB
149
+ W0["/brainstorm"]
150
+ W1["/coordinate"]
151
+ W1b["/ultrawork"]
152
+ W2["/orchestrate"]
153
+ W3["/plan"]
154
+ W4["/review"]
155
+ W5["/debug"]
156
+ W6["/deepinit"]
157
+ end
158
+
159
+ subgraph Orchestration["Orchestration"]
160
+ direction TB
161
+ PM[oma-pm]
162
+ ORC[oma-orchestrator]
163
+ end
164
+
165
+ subgraph Domain["Domain Agents"]
166
+ direction TB
167
+ FE[oma-frontend]
168
+ BE[oma-backend]
169
+ DB[oma-db]
170
+ MB[oma-mobile]
171
+ TF[oma-tf-infra]
172
+ end
173
+
174
+ subgraph Quality["Quality"]
175
+ direction TB
176
+ QA[oma-qa]
177
+ DBG[oma-debug]
178
+ end
179
+
180
+ Workflows --> Orchestration
181
+ Orchestration --> Domain
182
+ Domain --> Quality
183
+ Quality --> CMT([oma-commit])
184
+ ```
185
+
186
+
187
+
222
188
  ## Sponsors
223
189
 
224
190
  This project is maintained thanks to our generous sponsors.
@@ -254,10 +220,9 @@ This project is maintained thanks to our generous sponsors.
254
220
 
255
221
  See [SPONSORS.md](https://github.com/first-fluke/oh-my-agent/blob/main/SPONSORS.md) for a full list of supporters.
256
222
 
257
- ## Star History
258
223
 
259
- [![Star History Chart](https://api.star-history.com/svg?repos=first-fluke/oh-my-agent&type=date&legend=bottom-right)](https://www.star-history.com/#first-fluke/oh-my-agent&type=date&legend=bottom-right)
260
224
 
261
225
  ## License
262
226
 
263
227
  MIT
228
+
package/bin/cli.js CHANGED
@@ -466,7 +466,7 @@ source: migrated
466
466
  </html>`;function UH(){let $=Af();if(!bf($))Kf($,{recursive:!0});let u=Sf((v,z)=>{if(v.url==="/api/state")z.writeHead(200,{"Content-Type":"application/json"}),z.end(JSON.stringify(T9($)));else z.writeHead(200,{"Content-Type":"text/html"}),z.end(ff)}),g=new Q9.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:T9($)});g.clients.forEach((J)=>{if(J.readyState===X9.default.OPEN)J.send(N)})},100)}let _=I_($,{persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:200,pollInterval:50}});_.on("all",(v,z)=>I(v,gH(z))),g.on("connection",(v)=>{v.send(JSON.stringify({type:"full",data:T9($)})),v.on("error",()=>v.terminate())}),process.on("SIGINT",()=>{console.log(`
467
467
  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(IH,()=>{console.log(J1.magenta(`
468
468
  \uD83D\uDEF8 Serena Memory Dashboard`)),console.log(J1.white(` http://localhost:${IH}`)),console.log(J1.dim(` Watching: ${$}
469
- `))})}var _H={name:"oh-my-agent",version:"4.2.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-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:["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 nf,mkdirSync as xf,readdirSync as x6,readFileSync as lf,statSync as Y9}from"node:fs";import{basename as rf,join as Bu}from"node:path";var x$=G$(K$(),1),kf="●",yf="✓",mf="✗",hf="○",cf="◌";function df(){if(process.env.MEMORIES_DIR)return process.env.MEMORIES_DIR;let $=process.argv[3];if($)return Bu($,".serena","memories");return Bu(process.cwd(),".serena","memories")}function l6($){try{return lf($,"utf-8")}catch{return""}}function of($){try{let u=x6($);if(u.includes("orchestrator-session.md"))return Bu($,"orchestrator-session.md");let g=u.filter((U)=>/^session-.*\.md$/.test(U)).map((U)=>({name:U,mtime:Y9(Bu($,U)).mtimeMs})).sort((U,I)=>I.mtime-U.mtime);if(g.length>0&&g[0])return Bu($,g[0].name)}catch{}return null}function pf($){let u=of($);if(!u)return{id:"N/A",status:"UNKNOWN"};let g=l6(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]||rf(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 tf($){let u=l6(Bu($,"task-board.md"));if(!u)return[];let g=[],U=u.split(`
469
+ `))})}var _H={name:"oh-my-agent",version:"4.2.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-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:["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 nf,mkdirSync as xf,readdirSync as x6,readFileSync as lf,statSync as Y9}from"node:fs";import{basename as rf,join as Bu}from"node:path";var x$=G$(K$(),1),kf="●",yf="✓",mf="✗",hf="○",cf="◌";function df(){if(process.env.MEMORIES_DIR)return process.env.MEMORIES_DIR;let $=process.argv[3];if($)return Bu($,".serena","memories");return Bu(process.cwd(),".serena","memories")}function l6($){try{return lf($,"utf-8")}catch{return""}}function of($){try{let u=x6($);if(u.includes("orchestrator-session.md"))return Bu($,"orchestrator-session.md");let g=u.filter((U)=>/^session-.*\.md$/.test(U)).map((U)=>({name:U,mtime:Y9(Bu($,U)).mtimeMs})).sort((U,I)=>I.mtime-U.mtime);if(g.length>0&&g[0])return Bu($,g[0].name)}catch{}return null}function pf($){let u=of($);if(!u)return{id:"N/A",status:"UNKNOWN"};let g=l6(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]||rf(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 tf($){let u=l6(Bu($,"task-board.md"));if(!u)return[];let g=[],U=u.split(`
470
470
  `);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 H9($,u){try{let g=x6($).filter((_)=>_.startsWith(`progress-${u}`)&&_.endsWith(".md")).sort().reverse();if(g.length===0||!g[0])return null;let I=l6(Bu($,g[0])).match(/turn[:\s]*(\d+)/i);return I?.[1]?parseInt(I[1],10):null}catch{return null}}function af($){try{let u=x6($).filter((U)=>U.endsWith(".md")&&U!==".gitkeep").map((U)=>({name:U,mtime:Y9(Bu($,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=l6(Bu($,U.name)).split(`
471
471
  `).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 ef($){let u=[],g=new Set;try{let U=x6($).filter((I)=>I.endsWith(".md")&&I!==".gitkeep").map((I)=>({name:I,mtime:Y9(Bu($,I)).mtimeMs})).sort((I,_)=>_.mtime-I.mtime);for(let I of U){let _=l6(Bu($,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),q=J?.[1]?J[1].trim().substring(0,20):"";u.push({agent:z,status:N,task:q,turn:H9($,z)})}}}catch{}return u}function sf($){let u=$.toLowerCase();if(["running","active","in_progress","in-progress"].includes(u))return`${x$.default.green(kf)} running`;else if(["completed","done","finished"].includes(u))return`${x$.default.cyan(yf)} completed`;else if(["failed","error"].includes(u))return`${x$.default.red(mf)} failed`;else if(["blocked","waiting"].includes(u))return`${x$.default.yellow(hf)} blocked`;return`${x$.default.dim(cf)} pending`}function vH($){console.clear();let u=pf($),U=tf($).map((Q)=>({...Q,turn:H9($,Q.agent)}));if(U.length===0)U=ef($);if(U.length===0)try{let Q=x6($).filter((O)=>O.startsWith("progress-")&&O.endsWith(".md"));for(let O of Q){let M=O.replace(/^progress-/,"").replace(/\.md$/,"");U.push({agent:M,status:"running",task:"",turn:H9($,M)})}}catch{}let I=56,_="═".repeat(I),v=(Q)=>" ".repeat(Math.max(0,Q)),z=(Q)=>x$.default.magenta(Q),N=(Q)=>x$.default.bold(Q),J=(Q)=>x$.default.dim(Q),q=x$.default.yellow;if(u.status==="RUNNING")q=x$.default.green;else if(u.status==="COMPLETED")q=x$.default.cyan;else if(u.status==="FAILED")q=x$.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))} [${q(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=sf(Q.status),M=Q.turn!=null?String(Q.turn):"-",H=Q.task.substring(0,20);console.log(`${z("║")} ${Q.agent.padEnd(12)} ${O.padEnd(22)} ${M.padEnd(6)} ${H.padEnd(20)}${z("║")}`)}console.log(`${z(`╠${_}╣`)}`),console.log(`${z("║")} ${N("Latest Activity:")}${v(I-18)}${z("║")}`);let X=af($);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 D=`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(D)}${v(I-4-D.length)}${z("║")}`),console.log(`${z(`╚${_}╝`)}`)}async function zH(){let $=df();if(!nf($))xf($,{recursive:!0}),console.log(x$.default.yellow(`Created ${$} — waiting for memory files...`));console.log(x$.default.magenta(`
472
472
  \uD83D\uDEF8 Serena Terminal Dashboard`)),console.log(x$.default.dim(` Watching: ${$}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-agent",
3
- "version": "4.2.0",
3
+ "version": "4.2.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": {