oh-my-ag 2.10.1 → 2.10.2
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/bin/cli.js +1 -1
- package/package.json +1 -1
package/bin/cli.js
CHANGED
|
@@ -453,7 +453,7 @@ Shutting down...`),_.close(),g.clients.forEach((v)=>{v.terminate()}),g.close(()=
|
|
|
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 Nn($){let u=[],g=new Set;try{let U=Z6($).filter((I)=>I.endsWith(".md")&&I!==".gitkeep").map((I)=>({name:I,mtime:c8(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:h8($,z)})}}}catch{}return u}function Jn($){let u=$.toLowerCase();if(["running","active","in_progress","in-progress"].includes(u))return`${E$.default.green(ei)} running`;else if(["completed","done","finished"].includes(u))return`${E$.default.cyan(si)} completed`;else if(["failed","error"].includes(u))return`${E$.default.red($n)} failed`;else if(["blocked","waiting"].includes(u))return`${E$.default.yellow(un)} blocked`;return`${E$.default.dim(In)} pending`}function WP($){console.clear();let u=_n($),U=vn($).map((q)=>({...q,turn:h8($,q.agent)}));if(U.length===0)U=Nn($);if(U.length===0)try{let q=Z6($).filter((P)=>P.startsWith("progress-")&&P.endsWith(".md"));for(let P of q){let O=P.replace(/^progress-/,"").replace(/\.md$/,"");U.push({agent:O,status:"running",task:"",turn:h8($,O)})}}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 P=Jn(q.status),O=q.turn!=null?String(q.turn):"-",S=q.task.substring(0,20);console.log(`${z("║")} ${q.agent.padEnd(12)} ${P.padEnd(22)} ${O.padEnd(6)} ${S.padEnd(20)}${z("║")}`)}console.log(`${z(`╠${_}╣`)}`),console.log(`${z("║")} ${N("Latest Activity:")}${v(I-18)}${z("║")}`);let X=zn($);if(X.length===0)console.log(`${z("║")} ${J(`No activity yet${v(38)}`)}${z("║")}`);else for(let q of X){let P=`[${q.agent}] ${q.message}`;console.log(`${z("║")} ${J(P.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 AP(){let $=gn();if(!oi($))pi($,{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: ${$}
|
|
455
455
|
`)),WP($);let u=yU($,{persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:200,pollInterval:50}});return u.on("all",()=>WP($)),new Promise((g)=>{process.on("SIGINT",()=>{console.log(`
|
|
456
|
-
`),u.close(),g(),process.exit(0)}),process.on("SIGTERM",()=>process.emit("SIGINT"))})}var ZP={name:"oh-my-agent",version:"2.10.
|
|
456
|
+
`),u.close(),g(),process.exit(0)}),process.on("SIGTERM",()=>process.emit("SIGINT"))})}var ZP={name:"oh-my-agent",version:"2.10.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"]}};var nP=ZP.version,EP="OH_MY_AG_OUTPUT_FORMAT",w6=["text","json"],FP=["gemini","claude","codex","qwen"],wP=["backend","frontend","mobile","qa","debug","pm"];function b4($,u="Output as JSON"){return $.option("--json",u).option("--output <format>","Output format (text/json)",(g)=>{let U=g.trim().toLowerCase();if(!w6.includes(U))throw Error(`Invalid output format: ${g}. Expected one of ${w6.join(", ")}`);return U})}function Dn($){if($?.json)return"json";let u=$?.output?.trim().toLowerCase();if(u&&w6.includes(u))return u;if(process.env[EP]?.trim().toLowerCase()==="json")return"json";return"text"}function ou($){return Dn($)==="json"}function fP($){let u=$.at(-1);return u instanceof X_?u:null}function Xn($){let u=fP($);if(u)return u.opts();let g=$.at(-1);return g&&typeof g==="object"?g:{}}function qn($){if($ instanceof Error)return $.message;return String($)}function B4($){throw Error($)}function o8($,u){for(let g of $){let U=g.charCodeAt(0);if(U>=0&&U<=31||U===127)B4(`${u} must not contain control characters`)}}function Qn($,u){if(o8($,u),/[?#%]/.test($))B4(`${u} must not contain ?, #, or %`);if($.includes(".."))B4(`${u} must not contain '..'`)}function Tn($,u){o8($,u);try{new URL($)}catch{B4(`${u} must be a valid absolute URL`)}}function d8($,u,g="text"){if(typeof $==="string"){if(g==="identifier"){Qn($,u);return}if(g==="url"){Tn($,u);return}o8($,u);return}if(Array.isArray($))for(let[U,I]of $.entries())d8(I,`${u}[${U}]`,g)}function iP($){let u=$.toLowerCase();if(u==="url"||u.endsWith("url"))return"url";if(u.includes("id")||u.includes("type")||u.includes("vendor")||u.includes("session"))return"identifier";return"text"}function Pn($){let u=$.vendor;if(typeof u==="string"&&!FP.includes(u))B4(`vendor must be one of ${FP.join(", ")}`);let g=$.output;if(typeof g==="string"&&!w6.includes(g))B4(`output must be one of ${w6.join(", ")}`)}function On($){let u=$.processedArgs??$.args??[];($.registeredArguments??[]).forEach((I,_)=>{let v=I.name?.()||String(_),z=u[_];if(d8(z,v,iP(v)),v==="agent-type"&&typeof z==="string"&&!wP.includes(z))B4(`agent-type must be one of ${wP.join(", ")}`)});let U=$.opts();Pn(U);for(let[I,_]of Object.entries(U))d8(_,I,iP(I))}function Hn($){return($.registeredArguments??[]).map((u)=>({name:u.name?.()||"",required:!!u.required,variadic:!!u.variadic}))}function Yn($){return $.options.map((u)=>({flags:u.flags,long:u.long||void 0,short:u.short||void 0,description:u.description||"",required:!!u.required||!!u.mandatory,optional:!!u.optional,defaultValue:u.defaultValue}))}function CP($){let u=[],g=$;while(g?.parent)u.unshift(g.name()),g=g.parent;return u.join(" ")}function Sn($){return $.options.some((u)=>u.long==="--json"||u.long==="--output")}function Mn($){return $.options.some((u)=>u.long==="--dry-run")}function rP($){return{name:$.name(),path:CP($),summary:$.summary()||void 0,description:$.description(),arguments:Hn($),options:Yn($),supportsJsonOutput:Sn($),supportsDryRun:Mn($),subcommands:$.commands.map((u)=>rP(u))}}function Vn($,u){if(!u)return $;let g=u.trim();if(!g)return $;let U=[...$.commands];while(U.length>0){let I=U.shift();if(!I)continue;if(I.name()===g||CP(I)===g)return I;U.push(...I.commands)}return null}function Ln($,u){let g=Vn($,u);if(!g)B4(`Unknown command: ${u}`);let U={name:$.name(),version:$.version(),description:$.description(),env:{[EP]:"Set to json to force machine-readable output on commands that support it."},command:rP(g)};console.log(JSON.stringify(U,null,2))}function L$($,u={}){return async(...g)=>{let U=fP(g),I=Xn(g);try{if(U)On(U);await $(...g)}catch(_){let v=qn(_);if(u.supportsJsonOutput&&ou(I))console.log(JSON.stringify({error:v},null,2));else console.error(v);process.exitCode=1}}}var T$=new X_;T$.name("oh-my-ag").description("Multi-Agent Orchestrator for AI IDEs").version(nP).showSuggestionAfterError().showHelpAfterError().addHelpText("after",`
|
|
457
457
|
Aliases:
|
|
458
458
|
oma Alias for oh-my-ag after global installation.
|
|
459
459
|
`).action(L$(async()=>{await fQ()}));T$.command("describe [command-path]").description("Describe CLI commands as JSON for runtime introspection").action(L$(($)=>{Ln(T$,$)},{supportsJsonOutput:!0}));T$.command("dashboard").description("Start terminal dashboard (real-time agent monitoring)").action(L$(async()=>{await AP()}));T$.command("dashboard:web").description("Start web dashboard on http://localhost:9847").action(L$(()=>{jP()}));b4(T$.command("usage:anti").description("Show model usage quotas (connects to local Antigravity IDE)").option("--raw","Dump raw RPC response")).action(L$(async($)=>{await mT(ou($),$.raw)},{supportsJsonOutput:!0}));T$.command("update").description("Update skills to latest version from registry").action(L$(async()=>{await iT()}));b4(T$.command("doctor").description("Check CLI installations, MCP configs, and skill status"),"Output as JSON for CI/CD").action(L$(async($)=>{await jQ(ou($))},{supportsJsonOutput:!0}));b4(T$.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(L$(async($)=>{await KT(ou($),$.reset)},{supportsJsonOutput:!0}));b4(T$.command("retro [window]").description("Engineering retrospective with metrics & trends").option("--interactive","Interactive mode (manual entry)").option("--compare","Compare current window vs prior same-length window")).action(L$(async($,u)=>{await VT($,{json:ou(u),compare:u.compare,interactive:u.interactive})},{supportsJsonOutput:!0}));b4(T$.command("cleanup").description("Clean up orphaned subagent processes and temp files").option("--dry-run","Show what would be cleaned without making changes").option("-y, --yes","Skip confirmation prompts and clean everything")).action(L$(async($)=>{await TQ($.dryRun,ou($),$.yes)},{supportsJsonOutput:!0}));T$.command("bridge [url]").description("Bridge MCP stdio to Streamable HTTP (for Serena)").action(L$(async($)=>{await l5($)}));T$.command("agent:spawn <agent-id> <prompt> <session-id>").description("Spawn a subagent (prompt can be inline text or a file path)").option("-v, --vendor <vendor>","CLI vendor override (gemini/claude/codex/qwen)").option("-w, --workspace <path>","Working directory for the agent (auto-detected if omitted)").action(L$(async($,u,g,U)=>{await F5($,u,g,U.workspace||".",U.vendor)}));T$.command("agent:status <session-id> [agent-ids...]").description("Check status of subagents").option("-r, --root <path>","Root path for memory checks",process.cwd()).action(L$(async($,u,g)=>{await w5($,u,g.root)}));T$.command("agent:parallel [tasks...]").description("Run multiple sub-agents in parallel").option("-v, --vendor <vendor>","CLI vendor override (gemini/claude/codex/qwen)").option("-i, --inline","Inline mode: specify tasks as agent:task arguments").option("--no-wait","Don't wait for completion (background mode)").action(L$(async($,u)=>{await i5($,{vendor:u.vendor,inline:u.inline,noWait:!u.wait})}));b4(T$.command("memory:init").description("Initialize Serena memory schema in .serena/memories").option("--force","Overwrite empty or existing schema files")).action(L$(async($)=>{await cQ(ou($),$.force)},{supportsJsonOutput:!0}));b4(T$.command("verify <agent-type>").description("Verify subagent output (backend/frontend/mobile/qa/debug/pm)").option("-w, --workspace <path>","Workspace path",process.cwd())).action(L$(async($,u)=>{await pT($,u.workspace,ou(u))},{supportsJsonOutput:!0}));T$.command("star").description("Star oh-my-agent on GitHub").action(L$(async()=>{await RT()}));b4(T$.command("visualize").alias("viz").description("Visualize project structure as a dependency graph")).action(L$(async($)=>{await $7({json:ou($)})},{supportsJsonOutput:!0}));T$.command("help").description("Show help information").action(L$(()=>{T$.help()}));T$.command("version").description("Show version number").action(L$(()=>{console.log(nP)}));T$.parse();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oh-my-ag",
|
|
3
|
-
"version": "2.10.
|
|
3
|
+
"version": "2.10.2",
|
|
4
4
|
"description": "Portable multi-agent harness for .agents-based skills and workflows across Antigravity, Claude Code, Codex, OpenCode, and more (legacy package name)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|