oh-my-agent 5.10.0 → 5.11.0
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
|
@@ -810,7 +810,7 @@ Comparing: ${p.label} (current) vs ${v.label} (prior)
|
|
|
810
810
|
`)),eH(b,I.sessions,I.hourly,c,null);let g=d1(u,b);ii(Ci.default.dim(`Snapshot saved: ${g}`));return}let r;try{r=Cl(i)}catch(p){j(["Usage: oma retro [window]",""," oma retro last 7 days (default)"," oma retro 24h last 24 hours"," oma retro 14d last 14 days"," oma retro 30d last 30 days"," oma retro 2w last 2 weeks"," oma retro --compare compare current vs prior period"," oma retro --compare 14d"].join(`
|
|
811
811
|
`),"Usage"),ii(Ci.default.dim(p.message));return}o.start(`Analyzing ${r.label} window...`);let $=dl(u,r),l=y1(u,r);if(o.stop(`Analysis complete (${$.metrics.commits} commits)`),$.metrics.commits===0){j(Ci.default.yellow("No commits found in this window."),"Empty"),ii(Ci.default.dim("Try a wider window: oma retro 30d"));return}if(n.json){console.log(JSON.stringify($,null,2));return}let m=Z8(u);eH($,l.sessions,l.hourly,c,m);let x=d1(u,$);ii(Ci.default.dim(`Snapshot saved: ${x}`))}Fn();var no=li(Ti(),1);import{execSync as Bui,spawnSync as iM}from"node:child_process";import{platform as Yui}from"node:os";function Hui(){let i=Yui();if(i==="darwin")return"brew install gh";if(i==="win32")return"winget install GitHub.cli";return"sudo apt install gh"}async function nM(){if(console.clear(),Wi(no.default.bgMagenta(no.default.white(" ⭐ oh-my-agent star "))),!Bo()){let n=Hui(),u=await rn({message:`GitHub CLI (gh) is not installed. Install with ${no.default.cyan(n)}?`});if(Qi(u)||!u){ii("Install gh manually and try again.");return}let o=iu();o.start("Installing GitHub CLI...");let c=iM(n,{shell:!0,stdio:"pipe"});if(c.status!==0){o.stop("Installation failed"),Ji.error(c.stderr?.toString()||"Unknown error"),ii("Please install gh manually.");return}o.stop("GitHub CLI installed!")}if(!Zu()){Ji.warn("GitHub CLI is not authenticated.");let n=await rn({message:`Run ${no.default.cyan("gh auth login")} now?`});if(Qi(n)||!n){ii("Authenticate and try again.");return}if(iM("gh",["auth","login"],{stdio:"inherit"}),!Zu()){ii("Authentication was not completed. Try again.");return}Ji.success("Authenticated!")}if(Yo()){ii(`Already starred ${no.default.cyan(Ai)}! Thank you! \uD83D\uDE4F`);return}let i=await rn({message:`Star ${no.default.cyan(Ai)} on GitHub?`});if(Qi(i)||!i){ii("Maybe next time!");return}try{Bui(`gh api -X PUT /user/starred/${Ai}`,{stdio:"ignore"}),ii(`Starred ${no.default.cyan(Ai)}! Thank you! \uD83C\uDF1F`)}catch{Ji.error("Failed to star the repository."),ii("Please try again later.")}}Fn();P8();t0();var Nu=li(Ti(),1);import{existsSync as e1,mkdirSync as Mui,readdirSync as Kui,readFileSync as Fui,writeFileSync as uM}from"node:fs";import{dirname as Vui,join as cM}from"node:path";function S8(i){return cM(i,".serena","metrics.json")}function D8(){return{sessions:0,skillsUsed:{},tasksCompleted:0,totalSessionTime:0,filesChanged:0,linesAdded:0,linesRemoved:0,lastUpdated:new Date().toISOString(),startDate:new Date().toISOString()}}function Wui(i){let n=S8(i);if(e1(n))try{return JSON.parse(Fui(n,"utf-8"))}catch{return D8()}return D8()}function Aui(i,n){let u=S8(i),o=Vui(u);if(!e1(o))Mui(o,{recursive:!0});n.lastUpdated=new Date().toISOString(),uM(u,JSON.stringify(n,null,2),"utf-8")}function Lui(i){let n=cM(i,".serena","memories"),u={};if(!e1(n))return u;try{let o=Kui(n);for(let c of o){let r=c.match(/(?:progress|result)-(\w+)/);if(r?.[1]){let $=r[1];u[$]=(u[$]||0)+1}}}catch{}return u}async function oM(i=!1,n=!1){let u=process.cwd(),o=S8(u);if(n){if(e1(o))uM(o,JSON.stringify(D8(),null,2),"utf-8");if(i)console.log(JSON.stringify({reset:!0}));else console.log(Nu.default.green("✅ Metrics reset successfully."));return}let c=Wui(u),r=h1(u),$=Lui(u),l=G9(u),m=lm(u),x=m.startedAt?new Date(m.startedAt):null,p=x&&!Number.isNaN(x.getTime())?Math.max(0,Math.floor((Date.now()-x.getTime())/1000)):0;for(let[g,U]of Object.entries($))c.skillsUsed[g]=(c.skillsUsed[g]||0)+U;if(l>c.tasksCompleted)c.tasksCompleted=l;if(m.id){if(["completed","failed","aborted"].includes(m.status||"")&&(c.lastSessionId!==m.id||c.lastSessionStatus!==m.status)&&p>0)c.totalSessionTime+=p;c.lastSessionId=m.id,c.lastSessionStatus=m.status,c.lastSessionStarted=m.startedAt,c.lastSessionDuration=p}c.filesChanged+=r.filesChanged,c.linesAdded+=r.linesAdded,c.linesRemoved+=r.linesRemoved,c.sessions+=1,Aui(u,c);let v=Math.max(1,Math.ceil((Date.now()-new Date(c.startDate).getTime())/86400000)),b=c.sessions>0?Math.round(c.totalSessionTime/c.sessions):0;if(i){console.log(JSON.stringify({...c,gitStats:r,daysSinceStart:v,avgSessionTime:b},null,2));return}console.clear(),Wi(Nu.default.bgMagenta(Nu.default.white(" \uD83D\uDCCA oh-my-agent stats ")));let I=[Nu.default.bold(`\uD83D\uDCC8 Productivity Metrics (${v} days)`),"┌─────────────────────┬──────────────┐",`│ ${Nu.default.bold("Metric")} │ ${Nu.default.bold("Value")} │`,"├─────────────────────┼──────────────┤",`│ Sessions │ ${String(c.sessions).padEnd(12)} │`,`│ Tasks Completed │ ${String(c.tasksCompleted).padEnd(12)} │`,`│ Files Changed │ ${String(c.filesChanged).padEnd(12)} │`,`│ Lines Added │ ${Nu.default.green(`+${c.linesAdded}`).padEnd(12)} │`,`│ Lines Removed │ ${Nu.default.red(`-${c.linesRemoved}`).padEnd(12)} │`,"└─────────────────────┴──────────────┘"].join(`
|
|
812
812
|
`);j(I,"Overview");let a=Object.entries(c.skillsUsed).sort(([,g],[,U])=>U-g).slice(0,5);if(a.length>0){let g=[Nu.default.bold("\uD83C\uDFC6 Top Skills Used"),...a.map(([U,_],G)=>` ${G+1}. ${U} (${_})`)].join(`
|
|
813
|
-
`);j(g,"Skills")}ii(Nu.default.dim(`Data stored in: ${o}`))}Fn();var vn=li(Ti(),1);import{execSync as Dui}from"node:child_process";import{cpSync as n2,existsSync as bc,mkdirSync as t8,readFileSync as u2,rmSync as E8,writeFileSync as el}from"node:fs";import{tmpdir as Sui}from"node:os";import{join as pn}from"node:path";var s1=li(Ti(),1);import{execSync as Tui,spawn as Zui}from"node:child_process";import{realpathSync as rM}from"node:fs";import hl from"node:process";var ir="oh-my-agent";function Rui(i=hl.argv[1]){if(!i)return{packageManager:"unknown",isGlobal:!1};if(hl.env.IS_BINARY==="true")return{packageManager:"binary",isGlobal:!0,updateMessage:"Running as a standalone binary. Download the latest release from GitHub."};let n;try{n=rM(i).replace(/\\/g,"/")}catch{return{packageManager:"unknown",isGlobal:!1}}if(n.includes("/.npm/_npx")||n.includes("/npm/_npx"))return{packageManager:"npx",isGlobal:!1,updateMessage:"Running via npx, auto-update not applicable."};if(n.includes("/.pnpm/_pnpx")||n.includes("/.cache/pnpm/dlx"))return{packageManager:"pnpx",isGlobal:!1,updateMessage:"Running via pnpx, auto-update not applicable."};if(n.includes("/.bun/install/cache"))return{packageManager:"bunx",isGlobal:!1,updateMessage:"Running via bunx, auto-update not applicable."};if(hl.platform==="darwin")try{let u=Tui(`brew --prefix ${ir}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(u){let o=rM(u).replace(/\\/g,"/");if(n.startsWith(o))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${ir}`,updateMessage:"Installed via Homebrew. Updating in background..."}}}catch{}if(n.includes("/.pnpm/global")||n.includes("/.local/share/pnpm"))return{packageManager:"pnpm",isGlobal:!0,updateCommand:`pnpm add -g ${ir}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(n.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${ir}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(n.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${ir}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${ir}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var $M=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function Pui(i,n){let u=i.match($M),o=n.match($M);if(!u||!o)return!1;for(let c=1;c<=3;c++){let r=Number(u[c]),$=Number(o[c]);if(r<$)return!0;if(r>$)return!1}return!1}async function Oui(i=ir,n=2000){try{let u=await G0.get(`https://registry.npmjs.org/${i}/latest`,{timeout:n});return typeof u.data?.version==="string"?u.data.version:null}catch{return null}}async function lM(i){if(!i.enabled)return{triggered:!1,reason:"disabled"};if(hl.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(hl.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let n=await Oui();if(!n)return{triggered:!1,reason:"fetch-failed"};if(!Pui(i.currentVersion,n))return{triggered:!1,reason:"up-to-date",latest:n};let u=Rui();if(!u.updateCommand)return i.onNotice?.(s1.default.yellow(`oh-my-agent ${i.currentVersion} → ${n} available. ${u.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:n};try{return Zui(u.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),i.onSpawnStart?.(s1.default.cyan(`oh-my-agent ${i.currentVersion} → ${n} updating in background. New version applies on next run.`)),{triggered:!0,latest:n}}catch{return i.onNotice?.(s1.default.yellow(`oh-my-agent ${i.currentVersion} → ${n} available. Run: ${u.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:n}}}var i2={name:"oh-my-agent",version:"5.
|
|
813
|
+
`);j(g,"Skills")}ii(Nu.default.dim(`Data stored in: ${o}`))}Fn();var vn=li(Ti(),1);import{execSync as Dui}from"node:child_process";import{cpSync as n2,existsSync as bc,mkdirSync as t8,readFileSync as u2,rmSync as E8,writeFileSync as el}from"node:fs";import{tmpdir as Sui}from"node:os";import{join as pn}from"node:path";var s1=li(Ti(),1);import{execSync as Tui,spawn as Zui}from"node:child_process";import{realpathSync as rM}from"node:fs";import hl from"node:process";var ir="oh-my-agent";function Rui(i=hl.argv[1]){if(!i)return{packageManager:"unknown",isGlobal:!1};if(hl.env.IS_BINARY==="true")return{packageManager:"binary",isGlobal:!0,updateMessage:"Running as a standalone binary. Download the latest release from GitHub."};let n;try{n=rM(i).replace(/\\/g,"/")}catch{return{packageManager:"unknown",isGlobal:!1}}if(n.includes("/.npm/_npx")||n.includes("/npm/_npx"))return{packageManager:"npx",isGlobal:!1,updateMessage:"Running via npx, auto-update not applicable."};if(n.includes("/.pnpm/_pnpx")||n.includes("/.cache/pnpm/dlx"))return{packageManager:"pnpx",isGlobal:!1,updateMessage:"Running via pnpx, auto-update not applicable."};if(n.includes("/.bun/install/cache"))return{packageManager:"bunx",isGlobal:!1,updateMessage:"Running via bunx, auto-update not applicable."};if(hl.platform==="darwin")try{let u=Tui(`brew --prefix ${ir}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(u){let o=rM(u).replace(/\\/g,"/");if(n.startsWith(o))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${ir}`,updateMessage:"Installed via Homebrew. Updating in background..."}}}catch{}if(n.includes("/.pnpm/global")||n.includes("/.local/share/pnpm"))return{packageManager:"pnpm",isGlobal:!0,updateCommand:`pnpm add -g ${ir}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(n.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${ir}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(n.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${ir}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${ir}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var $M=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function Pui(i,n){let u=i.match($M),o=n.match($M);if(!u||!o)return!1;for(let c=1;c<=3;c++){let r=Number(u[c]),$=Number(o[c]);if(r<$)return!0;if(r>$)return!1}return!1}async function Oui(i=ir,n=2000){try{let u=await G0.get(`https://registry.npmjs.org/${i}/latest`,{timeout:n});return typeof u.data?.version==="string"?u.data.version:null}catch{return null}}async function lM(i){if(!i.enabled)return{triggered:!1,reason:"disabled"};if(hl.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(hl.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let n=await Oui();if(!n)return{triggered:!1,reason:"fetch-failed"};if(!Pui(i.currentVersion,n))return{triggered:!1,reason:"up-to-date",latest:n};let u=Rui();if(!u.updateCommand)return i.onNotice?.(s1.default.yellow(`oh-my-agent ${i.currentVersion} → ${n} available. ${u.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:n};try{return Zui(u.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),i.onSpawnStart?.(s1.default.cyan(`oh-my-agent ${i.currentVersion} → ${n} updating in background. New version applies on next run.`)),{triggered:!0,latest:n}}catch{return i.onNotice?.(s1.default.yellow(`oh-my-agent ${i.currentVersion} → ${n} available. Run: ${u.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:n}}}var i2={name:"oh-my-agent",version:"5.11.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-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","@date-fns/tz":"^1.4.1",axios:"^1.15.0","better-sqlite3":"^12.9.0",chokidar:"^5.0.0",commander:"^14.0.3","date-fns":"^4.1.0","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/better-sqlite3":"^7.6.13","@types/ws":"^8.18.1",typescript:"^6",vitest:"^4.0.18"},repository:{type:"git",url:"https://github.com/first-fluke/oh-my-agent"},antigravity:{skillsPath:".agents/skills",skills:["oma-architecture","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-scm","oma-pdf","oma-recap"]}};function tui(i){if(!i)return{intro:(u)=>Wi(u),outro:(u)=>ii(u),note:(u,o)=>j(u,o),logError:(u)=>Ji.error(u),spinnerStart:(u)=>{let o=iu();return o.start(u),o}};let n={start(u){},stop(u){if(u)console.log(u)},message(u){console.log(u)}};return{intro:(u)=>console.log(u),outro:(u)=>console.log(u),note:(u,o)=>console.log(u),logError:(u)=>console.error(u),spinnerStart:(u)=>{return console.log(u),n}}}function Eui(i,n){if(i!==null)return"ready";return n?"legacy":"missing"}async function mM(i=!1,n=!1){if(!n&&process.stdout.isTTY)console.clear();let u=tui(n);u.intro(vn.default.bgMagenta(vn.default.white(" \uD83D\uDEF8 oh-my-agent update ")));let o=process.cwd();await lM({currentVersion:i2.version,enabled:ZY(o),onSpawnStart:(p)=>u.note(p,"CLI auto-update"),onNotice:(p)=>u.note(p,"CLI update available")});let c=await Tv(o),r=ON(o),$=Eui(c,r);if($==="missing"){if(u.logError("oh-my-agent is not installed in this project. Run `oma install` first."),n)throw Error("oh-my-agent is not installed in this project. Run `oma install` first.");process.exit(1)}let l=Oo(o);if(l.length>0)u.note(l.map((p)=>`${vn.default.green("✓")} ${p}`).join(`
|
|
814
814
|
`),"Migration");let m=l.length>0||K_(o);if(l.length>0&&!K_(o))F_(o,!0);if(!n)await $v(o);if($==="legacy")u.note("Existing .agents installation detected without _version.json. Updating in place and restoring version metadata.","Legacy install");let x;try{x=u.spinnerStart("Checking for updates...");let p=await jN();if(c===p.version&&!m){x.stop(vn.default.green("Already up to date!")),u.outro(`Current version: ${vn.default.cyan(c)}`);return}let v=c===p.version;x.message(`Downloading ${vn.default.cyan(p.version)}...`);let{dir:b,cleanup:I}=await jv();try{x.message("Copying files..."),Oo(o);let a=pn(o,".agents","oma-config.yaml"),g=pn(o,".agents","mcp.json"),U=!i&&bc(a)?u2(a):null,_=!i&&bc(g)?u2(g):null,G=pn(Sui(),`oma-stack-backup-${Date.now()}`),f=pn(o,".agents","skills","oma-backend","stack"),z=!i&&bc(f);if(z)t8(G,{recursive:!0}),n2(f,pn(G,"oma-backend"),{recursive:!0});let q=["snippets.md","tech-stack.md","api-template.py"],N=pn(o,".agents","skills","oma-backend","resources"),Q=!i&&!z&&q.some((O)=>bc(pn(N,O)));if(n2(pn(b,".agents"),pn(o,".agents"),{recursive:!0,force:!0}),U)el(a,U);if(_)el(g,_);if(z)try{t8(f,{recursive:!0}),n2(pn(G,"oma-backend"),f,{recursive:!0,force:!0})}finally{E8(G,{recursive:!0,force:!0})}if(Q){let O=pn(b,".agents","skills","oma-backend","variants","python");if(bc(O))t8(f,{recursive:!0}),n2(O,f,{recursive:!0,force:!0}),el(pn(f,"stack.yaml"),`language: python
|
|
815
815
|
framework: fastapi
|
|
816
816
|
orm: sqlalchemy
|
package/package.json
CHANGED