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.
- package/README.md +66 -101
- package/bin/cli.js +1 -1
- 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)
|
|
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
|
|
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
|
-
[](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.
|
|
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