oh-my-agent 5.6.1 → 5.8.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/README.md +1 -0
- package/bin/cli.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -59,6 +59,7 @@ Pick a preset and you're ready:
|
|
|
59
59
|
| **oma-qa** | OWASP security, performance, accessibility review |
|
|
60
60
|
| **oma-recap** | Conversation history recap and themed work summaries |
|
|
61
61
|
| **oma-scm** | SCM (software configuration management) — branching, merges, worktrees, baselines; Conventional Commits |
|
|
62
|
+
| **oma-search** | Intent-based search router with trust scoring — docs, web, code, local |
|
|
62
63
|
| **oma-tf-infra** | Multi-cloud Terraform IaC (Infrastructure as Code) |
|
|
63
64
|
| **oma-translator** | Natural multilingual translation |
|
|
64
65
|
|
package/bin/cli.js
CHANGED
|
@@ -823,7 +823,7 @@ source: migrated
|
|
|
823
823
|
`).filter(Boolean),m=[];for(let x of $)if(!r.some((v)=>x.startsWith(v)))m.push(x);if(m.length>0)return y("Scope Check","fail",`${m.length} out-of-scope: ${m[0]}${m.length>1?` +${m.length-1}`:""}`);return y("Scope Check","pass",`All ${$.length} files in scope`)}function Tui(i,n){let u=Wui(i,n);if(!u)return y("Charter Preflight","skip","Result file not found");let o=D8(u,"utf-8");if(!o.includes("CHARTER_CHECK:"))return y("Charter Preflight","warn","Block missing from result");if(/\{[^}]+\}/.test(o.split("CHARTER_CHECK:")[1]?.split("```")[0]||""))return y("Charter Preflight","warn","Contains unfilled placeholders");return y("Charter Preflight","pass","Properly filled")}function Zui(i){let n=["*.py","*.ts","*.tsx","*.js","*.dart"],u=`(password|secret|api_key|token)\\s*=\\s*['"][^'"]{8,}`;for(let o of n){let c=si(`grep -rn --include="${o}" -E "(password|secret|api_key|token)\\s*=\\s*['"][^'"]{8,}" . 2>/dev/null | grep -v test | grep -v example | grep -v node_modules | head -1`,i);if(c)return y("Hardcoded Secrets","fail",`Found in: ${c.split(":")[0]}`)}return y("Hardcoded Secrets","pass","None detected")}function Pui(i){let n=si('grep -rn --include="*.py" --include="*.ts" --include="*.tsx" --include="*.js" --include="*.dart" -E "TODO|FIXME|HACK|XXX" . 2>/dev/null | grep -v node_modules | grep -v ".agents/" | wc -l',i),u=Number.parseInt(n||"0",10);if(u>0)return y("TODO/FIXME Comments","warn",`${u} found`);return y("TODO/FIXME Comments","pass","None found")}function Rui(i){if(!si("which uv",i))return y("Python Syntax","skip","uv not available");let u=si('find . -name "*.py" -not -path "*/node_modules/*" -not -path "*/.venv/*" -exec uv run python -m py_compile {} \\; 2>&1 | head -5',i);if(u&&u.length>0)return y("Python Syntax","fail","Syntax errors found");return y("Python Syntax","pass","Valid")}function Oui(i){if(si(`grep -rn --include="*.py" -E "f['"].*SELECT|f['"].*INSERT|f['"].*UPDATE|f['"].*DELETE" . 2>/dev/null | grep -v test | grep -v node_modules | head -1`,i))return y("SQL Injection","fail","f-string with SQL keywords detected");return y("SQL Injection","pass","None detected")}function nM(i){let n=si("which uv",i),u=ac(tu(i,"pyproject.toml"));if(!n||!u)return y("Python Tests","skip",!n?"uv not available":"pyproject.toml not found");let o=si("uv run pytest -q --tb=no 2>&1",i);if(o?.includes("passed")||o?.includes("no tests ran"))return y("Python Tests","pass","Tests pass");return y("Python Tests","fail","Tests failing")}function jui(i){if(!ac(tu(i,"tsconfig.json")))return y("TypeScript","skip","Not configured");let n=si("npx tsc --noEmit 2>&1",i);if(n===null||n==="")return y("TypeScript","pass","Compilation clean");if(n.includes("error"))return y("TypeScript","fail","Type errors found");return y("TypeScript","pass","Compilation clean")}function Dui(i){let n=si(`grep -rn --include="*.tsx" --include="*.jsx" 'style={{' . 2>/dev/null | grep -v node_modules | wc -l`,i),u=Number.parseInt(n||"0",10);if(u>0)return y("Inline Styles","warn",`${u} found (prefer Tailwind)`);return y("Inline Styles","pass","None found")}function tui(i){let n=si(`grep -rn --include="*.ts" --include="*.tsx" ': any' . 2>/dev/null | grep -v node_modules | grep -v ".d.ts" | wc -l`,i),u=Number.parseInt(n||"0",10);if(u>3)return y("Any Types","fail",`${u} found (limit: 3)`);if(u>0)return y("Any Types","warn",`${u} found`);return y("Any Types","pass","None found")}function uM(i){if(!ac(tu(i,"package.json")))return y("Frontend Tests","skip","No package.json");let n=si("npx vitest run --reporter=verbose 2>&1",i);if(n?.includes("passed")||n?.includes("✓"))return y("Frontend Tests","pass","Tests pass");return y("Frontend Tests","warn","Tests failed or vitest not configured")}function Sui(i){if(!si("which flutter",i)){if(!si("which dart",i))return y("Flutter/Dart Analysis","skip","Not available");if(si("dart analyze 2>&1",i)?.includes("No issues found"))return y("Dart Analysis","pass","Clean");return y("Dart Analysis","fail","Issues found")}if(si("flutter analyze 2>&1",i)?.includes("No issues found"))return y("Flutter Analysis","pass","Clean");return y("Flutter Analysis","fail","Issues found")}function Eui(i){if(!si("which flutter",i))return y("Flutter Tests","skip","Flutter not available");if(si("flutter test 2>&1",i)?.includes("All tests passed"))return y("Flutter Tests","pass","All tests pass");return y("Flutter Tests","fail","Tests failed")}function oM(i){let n=tu(i,".agents","results");if(ac(n))try{let o=cM(n).filter((c)=>c.startsWith("plan-")&&c.endsWith(".json")).sort().reverse();if(o.length>0&&o[0])return tu(n,o[0])}catch{}let u=tu(i,".agents","plan.json");return ac(u)?u:null}function Cui(i){let n=oM(i);if(!n)return y("PM Plan","warn","No plan file found");try{return JSON.parse(D8(n,"utf-8")),y("PM Plan","pass","Valid JSON")}catch{return y("PM Plan","fail","Invalid JSON")}}function yui(i,n){let u=[];switch(i){case"backend":u.push(Rui(n)),u.push(Oui(n)),u.push(nM(n));break;case"frontend":u.push(jui(n)),u.push(Dui(n)),u.push(tui(n)),u.push(uM(n));break;case"mobile":u.push(Sui(n)),u.push(Eui(n));break;case"qa":u.push(y("QA Report","pass","Verified by self-check.md"));break;case"debug":if(ac(tu(n,"pyproject.toml")))u.push(nM(n));else if(ac(tu(n,"package.json")))u.push(uM(n));else u.push(y("Debug Tests","skip","No test runner detected"));break;case"pm":u.push(Cui(n));break}return u}async function rM(i,n,u=!1){let o=i.toLowerCase();if(!iM.includes(o)){let b=`Invalid agent type: ${i}. Valid types: ${iM.join(", ")}`;if(u)console.log(JSON.stringify({ok:!1,error:b}));else fi.error(b);process.exit(2)}let c=n||process.cwd();if(!ac(c)){let b=`Workspace not found: ${c}`;if(u)console.log(JSON.stringify({ok:!1,error:b}));else fi.error(b);process.exit(2)}let r=[];r.push(Lui(c,o)),r.push(Tui(c,o)),r.push(Zui(c)),r.push(Pui(c)),r.push(...yui(o,c));let l=r.filter((b)=>b.status==="pass").length,$=r.filter((b)=>b.status==="fail").length,m=r.filter((b)=>b.status==="warn").length,x={ok:$===0,agent:o,workspace:c,checks:r,summary:{passed:l,failed:$,warned:m}};if(u)console.log(JSON.stringify(x,null,2)),process.exit($>0?1:0);console.clear(),Vi(bn.default.bgCyan(bn.default.white(` \uD83D\uDD0D Verify: ${o} agent `))),j(bn.default.dim(c),"Workspace");let p=["┌────────────────────────────┬────────┬─────────────────────────────┐",`│ ${bn.default.bold("Check")} │ ${bn.default.bold("Status")} │ ${bn.default.bold("Details")} │`,"├────────────────────────────┼────────┼─────────────────────────────┤",...r.map((b)=>{let a;switch(b.status){case"pass":a=bn.default.green("PASS");break;case"fail":a=bn.default.red("FAIL");break;case"warn":a=bn.default.yellow("WARN");break;default:a=bn.default.dim("SKIP")}let I=b.name.padEnd(26),g=a.padEnd(6),U=(b.message||"-").slice(0,27).padEnd(27);return`│ ${I} │ ${g} │ ${U} │`}),"└────────────────────────────┴────────┴─────────────────────────────┘"].join(`
|
|
824
824
|
`);console.log(p),console.log();let v=`${bn.default.green(`${l} passed`)}, ${bn.default.red(`${$} failed`)}, ${bn.default.yellow(`${m} warnings`)}`;if($>0)ii(bn.default.red(`❌ Verification failed: ${v}`)),process.exit(1);ii(bn.default.green(`✅ Verification passed: ${v}`)),process.exit(0)}var Ai=mi(Zi(),1);import{existsSync as kui,readdirSync as lM,readFileSync as dui}from"node:fs";import{join as qu}from"node:path";var $M=Object.fromEntries(Object.entries(On).map(([i,n])=>[i,n.map((u)=>u.name)])),hui={"backend-engineer":"oma-backend","frontend-engineer":"oma-frontend","db-engineer":"oma-db","mobile-engineer":"oma-mobile","pm-planner":"oma-pm","qa-reviewer":"oma-qa","debug-investigator":"oma-debug","architecture-reviewer":"oma-architecture","tf-infra-engineer":"oma-tf-infra"};function t8(i){let n=new Set;for(let u of i.matchAll(/_shared\/((?:[a-z][a-z0-9_-]*\/)*[a-z][a-z0-9_-]*)(?:\.md)?(?=[`)\s/}]|$)/gi))if(u[1])n.add(u[1]);return[...n]}function s1(i){try{return dui(i,"utf-8")}catch{return""}}function S8(i){try{return lM(i).filter((n)=>!n.startsWith("."))}catch{return[]}}function eui(i){try{return lM(i,{withFileTypes:!0}).filter((n)=>!n.name.startsWith("."))}catch{return[]}}function mM(i,n=""){let u=[];for(let o of eui(i)){let c=n?`${n}/${o.name}`:o.name;if(o.isDirectory()){u.push({path:c,isDirectory:!0}),u.push(...mM(qu(i,o.name),c));continue}if(!o.name.endsWith(".md"))continue;u.push({path:c.replace(/\.md$/,""),isDirectory:!1})}return u}function xM(i){let n=[{id:"root",label:"oh-my-agent",category:"root"}],u=new Set,o=[];function c(v,b,a){let I=`${v}|${b}`;if(u.has(I))return;u.add(I),o.push({from:v,to:b,type:a})}let r=qu(i,".agents","skills");for(let[v,b]of Object.entries($M))for(let a of b){let I=qu(r,a);if(!kui(I))continue;let g=`skill:${a}`;n.push({id:g,label:a,category:"skill",group:"Skills",subgroup:v});let U=[s1(qu(I,"SKILL.md")),s1(qu(I,"resources","execution-protocol.md"))].join(`
|
|
825
825
|
`);for(let _ of t8(U))c(g,`shared:${_}`,"references")}let l=qu(i,".agents","workflows");for(let v of S8(l).filter((b)=>b.endsWith(".md"))){let b=v.replace(".md",""),a=`workflow:${b}`;n.push({id:a,label:b,category:"workflow",group:"Workflows"});for(let I of t8(s1(qu(l,v))))c(a,`shared:${I}`,"references")}let $=qu(r,"_shared");for(let v of mM($)){let b=`shared:${v.path}`;if(n.push({id:b,label:v.path,category:"shared",group:"Shared"}),!v.isDirectory){for(let a of t8(s1(qu($,`${v.path}.md`))))if(a!==v.path)c(b,`shared:${a}`,"references")}}let m=qu(i,".claude","agents");for(let v of S8(m).filter((b)=>b.endsWith(".md"))){let b=v.replace(".md",""),a=`agent:${b}`;n.push({id:a,label:b,category:"agent",group:"Claude Agents"});let I=hui[b];if(I)c(a,`skill:${I}`,"implements")}let x=qu(i,".serena","memories");for(let v of S8(x).filter((b)=>b.endsWith(".md")))n.push({id:`memory:${v.replace(".md","")}`,label:v.replace(".md",""),category:"memory",group:"Serena Memories"});let p=new Set(n.map((v)=>v.id));return{nodes:n,edges:o.filter((v)=>p.has(v.from)&&p.has(v.to))}}var sui={root:(i)=>Ai.default.bold(Ai.default.white(i)),skill:Ai.default.green,workflow:Ai.default.blue,shared:Ai.default.yellow,agent:Ai.default.magenta,memory:Ai.default.cyan};function En(i,n){return(sui[n]??Ai.default.white)(i)}function Su(...i){let n=i.sort((c,r)=>c[0]-r[0]),u="",o=0;for(let[c,r,l]of n){if(c>o)u+=" ".repeat(c-o);u+=r,o=c+l}return u}function ici(i){let n=[],u=i.nodes.filter((V)=>V.category==="skill").length,o=i.nodes.filter((V)=>V.category==="workflow").length,c=i.nodes.filter((V)=>V.category==="shared").length,r=i.nodes.filter((V)=>V.category==="agent").length,l=i.nodes.filter((V)=>V.category==="memory").length,$=i.edges.filter((V)=>V.from.startsWith("skill:")&&V.to.startsWith("shared:")).length,m=i.edges.filter((V)=>V.from.startsWith("workflow:")&&V.to.startsWith("shared:")).length,x=i.edges.filter((V)=>V.type==="implements").length,p=i.edges.filter((V)=>V.from.startsWith("shared:")&&V.to.startsWith("shared:")).length,v=`Skills (${u})`,b=`Workflows (${o})`,a=`Shared (${c})`,I=`Agents (${r})`,g=`Memories (${l})`,U=10,_=29,G=48,J=19;n.push(Su([24,En("oh-my-agent","root"),11])),n.push(Su([29,"│",1]));let z=Array(49).fill(" ");z[10]="┌",z[29]="┼",z[48]="┐";for(let V=11;V<48;V++)if(V!==29)z[V]="─";n.push(z.join("")),n.push(Su([10,"▼",1],[29,"▼",1],[48,"▼",1])),n.push(Su([10-(v.length>>1),En(v,"skill"),v.length],[29-(b.length>>1),En(b,"workflow"),b.length],[48-(g.length>>1),En(g,"memory"),g.length])),n.push(Su([10,"│",1],[29,"│",1]));let q=`${$} refs`,Q=`${m} refs`;n.push(Su([10-(q.length>>1),Ai.default.dim(q),q.length],[29-(Q.length>>1),Ai.default.dim(Q),Q.length])),n.push(Su([10,"│",1],[29,"│",1]));let N=Array(30).fill(" ");N[10]="└",N[19]="┬",N[29]="┘";for(let V=11;V<29;V++)if(V!==19)N[V]="─";n.push(N.join("")),n.push(Su([19,"▼",1]));let B=19-(a.length>>1),W=Su([B,En(a,"shared"),a.length]);if(p>0)W+=` ${Ai.default.dim(`◂── ${p} internal`)}`;n.push(W),n.push("");let Z=10-(I.length>>1),S=`──[${x} implements]──▸`;return n.push(Su([Z,En(I,"agent"),I.length])+` ${Ai.default.dim(S)} ${En("Skills","skill")}`),n}function pM(i){let n=[];n.push(...ici(i)),n.push(""),n.push(Ai.default.dim("─".repeat(56))),n.push("");let u=new Map,o=new Map;for(let v of i.edges){if(!u.has(v.from))u.set(v.from,[]);if(u.get(v.from)?.push(v),v.to.startsWith("shared:"))o.set(v.to,(o.get(v.to)??0)+1)}function c(v){let b=u.get(v);if(!b?.length)return"";let a=b.map((g)=>i.nodes.find((U)=>U.id===g.to)?.label.replace(/\.md$/,"")??g.to.split(":")[1]),I=a.length>4?`${a.slice(0,3).join(", ")} +${a.length-3}`:a.join(", ");return` ${Ai.default.dim("──▸")} ${Ai.default.dim(I)}`}let r=i.nodes.filter((v)=>v.category==="skill"),l=Object.keys($M);n.push(Ai.default.bold(`Skills (${r.length})`));for(let v=0;v<l.length;v++){let b=l[v],a=r.filter((U)=>U.subgroup===b);if(!a.length)continue;let I=v===l.length-1;n.push(`${I?"└─":"├─"} ${Ai.default.dim(b)}`);let g=I?" ":"│ ";for(let U of a){let _=U===a.at(-1)?"└─":"├─";n.push(`${g}${_} ${En(U.label,"skill")}${c(U.id)}`)}}n.push("");let $=i.nodes.filter((v)=>v.category==="workflow");n.push(Ai.default.bold(`Workflows (${$.length})`));for(let v of $){let b=v===$.at(-1)?"└─":"├─";n.push(`${b} ${En(v.label,"workflow")}${c(v.id)}`)}n.push("");let m=[...i.nodes.filter((v)=>v.category==="shared")].sort((v,b)=>(o.get(b.id)??0)-(o.get(v.id)??0));n.push(Ai.default.bold(`Shared (${m.length})`));for(let v of m){let b=v===m.at(-1)?"└─":"├─",a=o.get(v.id)??0,I=a>0?Ai.default.dim(` (${a} refs)`):"";n.push(`${b} ${En(v.label,"shared")}${I}${c(v.id)}`)}n.push("");let x=i.nodes.filter((v)=>v.category==="agent");n.push(Ai.default.bold(`Claude Agents (${x.length})`));for(let v of x){let b=v===x.at(-1)?"└─":"├─",a=i.edges.find((g)=>g.from===v.id&&g.type==="implements"),I=a?` ${Ai.default.dim("──▸")} ${En(a.to.split(":")[1]??"","skill")}`:"";n.push(`${b} ${En(v.label,"agent")}${I}`)}n.push("");let p=i.nodes.filter((v)=>v.category==="memory");if(n.push(Ai.default.bold(`Serena Memories (${p.length})`)),!p.length)n.push(`└─ ${Ai.default.dim("(none)")}`);else for(let v of p){let b=v===p.at(-1)?"└─":"├─";n.push(`${b} ${En(v.label,"memory")}`)}return n.join(`
|
|
826
|
-
`)}async function vM(i){let n=xM(process.cwd());if(i.json){console.log(JSON.stringify(n,null,2));return}console.log(pM(n))}var gM="OH_MY_AG_OUTPUT_FORMAT",d$=["text","json"],bM=["gemini","claude","codex","qwen"],aM=["backend","frontend","mobile","qa","debug","pm"];function Bu(i,n="Output as JSON"){return i.option("--json",n).option("--output <format>","Output format (text/json)",(u)=>{let o=u.trim().toLowerCase();if(!d$.includes(o))throw Error(`Invalid output format: ${u}. Expected one of ${d$.join(", ")}`);return o})}function nci(i){if(i?.json)return"json";let n=i?.output?.trim().toLowerCase();if(n&&d$.includes(n))return n;if(process.env[gM]?.trim().toLowerCase()==="json")return"json";return"text"}function mu(i){return nci(i)==="json"}function UM(i){let n=i.at(-1);return n instanceof um?n:null}function uci(i){let n=UM(i);if(n)return n.opts();let u=i.at(-1);return u&&typeof u==="object"?u:{}}function cci(i){if(i instanceof Error)return i.message;return String(i)}function uo(i){throw Error(i)}function C8(i,n){for(let u of i){let o=u.charCodeAt(0);if(o>=0&&o<=31||o===127)uo(`${n} must not contain control characters`)}}function oci(i,n){if(C8(i,n),/[?#%]/.test(i))uo(`${n} must not contain ?, #, or %`);if(i.includes(".."))uo(`${n} must not contain '..'`)}function rci(i,n){C8(i,n);try{new URL(i)}catch{uo(`${n} must be a valid absolute URL`)}}function E8(i,n,u="text"){if(typeof i==="string"){if(u==="identifier"){oci(i,n);return}if(u==="url"){rci(i,n);return}C8(i,n);return}if(Array.isArray(i))for(let[o,c]of i.entries())E8(c,`${n}[${o}]`,u)}function IM(i){let n=i.toLowerCase();if(n==="url"||n.endsWith("url"))return"url";if(n.includes("id")||n.includes("type")||n.includes("vendor")||n.includes("session"))return"identifier";return"text"}function lci(i){let n=i.vendor;if(typeof n==="string"&&!bM.includes(n))uo(`vendor must be one of ${bM.join(", ")}`);let u=i.output;if(typeof u==="string"&&!d$.includes(u))uo(`output must be one of ${d$.join(", ")}`)}function $ci(i){let n=i.processedArgs??i.args??[];(i.registeredArguments??[]).forEach((c,r)=>{let l=c.name?.()||String(r),$=n[r];if(E8($,l,IM(l)),l==="agent-type"&&typeof $==="string"&&!aM.includes($))uo(`agent-type must be one of ${aM.join(", ")}`)});let o=i.opts();lci(o);for(let[c,r]of Object.entries(o))E8(r,c,IM(c))}function mci(i){return(i.registeredArguments??[]).map((n)=>({name:n.name?.()||"",required:!!n.required,variadic:!!n.variadic}))}function xci(i){return i.options.map((n)=>({flags:n.flags,long:n.long||void 0,short:n.short||void 0,description:n.description||"",required:!!n.required||!!n.mandatory,optional:!!n.optional,defaultValue:n.defaultValue}))}function _M(i){let n=[],u=i;while(u?.parent)n.unshift(u.name()),u=u.parent;return n.join(" ")}function pci(i){return i.options.some((n)=>n.long==="--json"||n.long==="--output")}function vci(i){return i.options.some((n)=>n.long==="--dry-run")}function fM(i){return{name:i.name(),path:_M(i),summary:i.summary()||void 0,description:i.description(),arguments:mci(i),options:xci(i),supportsJsonOutput:pci(i),supportsDryRun:vci(i),subcommands:i.commands.map((n)=>fM(n))}}function bci(i,n){if(!n?.trim())return i;let u=n.trim(),o=[...i.commands];while(o.length>0){let c=o.shift();if(!c)continue;if(c.name()===u||_M(c)===u)return c;o.push(...c.commands)}return null}function JM(i,n){let u=bci(i,n);if(!u)uo(`Unknown command: ${n}`);let o={name:i.name(),version:i.version(),description:i.description(),env:{[gM]:"Set to json to force machine-readable output on commands that support it."},command:fM(u)};console.log(JSON.stringify(o,null,2))}function Ki(i,n={}){return async(...u)=>{let o=UM(u),c=uci(u);try{if(o)$ci(o);await i(...u)}catch(r){let l=cci(r);if(n.supportsJsonOutput&&mu(c))console.log(JSON.stringify({error:l},null,2));else console.error(l);process.exitCode=1}}}var GM={name:"oh-my-agent",version:"5.
|
|
826
|
+
`)}async function vM(i){let n=xM(process.cwd());if(i.json){console.log(JSON.stringify(n,null,2));return}console.log(pM(n))}var gM="OH_MY_AG_OUTPUT_FORMAT",d$=["text","json"],bM=["gemini","claude","codex","qwen"],aM=["backend","frontend","mobile","qa","debug","pm"];function Bu(i,n="Output as JSON"){return i.option("--json",n).option("--output <format>","Output format (text/json)",(u)=>{let o=u.trim().toLowerCase();if(!d$.includes(o))throw Error(`Invalid output format: ${u}. Expected one of ${d$.join(", ")}`);return o})}function nci(i){if(i?.json)return"json";let n=i?.output?.trim().toLowerCase();if(n&&d$.includes(n))return n;if(process.env[gM]?.trim().toLowerCase()==="json")return"json";return"text"}function mu(i){return nci(i)==="json"}function UM(i){let n=i.at(-1);return n instanceof um?n:null}function uci(i){let n=UM(i);if(n)return n.opts();let u=i.at(-1);return u&&typeof u==="object"?u:{}}function cci(i){if(i instanceof Error)return i.message;return String(i)}function uo(i){throw Error(i)}function C8(i,n){for(let u of i){let o=u.charCodeAt(0);if(o>=0&&o<=31||o===127)uo(`${n} must not contain control characters`)}}function oci(i,n){if(C8(i,n),/[?#%]/.test(i))uo(`${n} must not contain ?, #, or %`);if(i.includes(".."))uo(`${n} must not contain '..'`)}function rci(i,n){C8(i,n);try{new URL(i)}catch{uo(`${n} must be a valid absolute URL`)}}function E8(i,n,u="text"){if(typeof i==="string"){if(u==="identifier"){oci(i,n);return}if(u==="url"){rci(i,n);return}C8(i,n);return}if(Array.isArray(i))for(let[o,c]of i.entries())E8(c,`${n}[${o}]`,u)}function IM(i){let n=i.toLowerCase();if(n==="url"||n.endsWith("url"))return"url";if(n.includes("id")||n.includes("type")||n.includes("vendor")||n.includes("session"))return"identifier";return"text"}function lci(i){let n=i.vendor;if(typeof n==="string"&&!bM.includes(n))uo(`vendor must be one of ${bM.join(", ")}`);let u=i.output;if(typeof u==="string"&&!d$.includes(u))uo(`output must be one of ${d$.join(", ")}`)}function $ci(i){let n=i.processedArgs??i.args??[];(i.registeredArguments??[]).forEach((c,r)=>{let l=c.name?.()||String(r),$=n[r];if(E8($,l,IM(l)),l==="agent-type"&&typeof $==="string"&&!aM.includes($))uo(`agent-type must be one of ${aM.join(", ")}`)});let o=i.opts();lci(o);for(let[c,r]of Object.entries(o))E8(r,c,IM(c))}function mci(i){return(i.registeredArguments??[]).map((n)=>({name:n.name?.()||"",required:!!n.required,variadic:!!n.variadic}))}function xci(i){return i.options.map((n)=>({flags:n.flags,long:n.long||void 0,short:n.short||void 0,description:n.description||"",required:!!n.required||!!n.mandatory,optional:!!n.optional,defaultValue:n.defaultValue}))}function _M(i){let n=[],u=i;while(u?.parent)n.unshift(u.name()),u=u.parent;return n.join(" ")}function pci(i){return i.options.some((n)=>n.long==="--json"||n.long==="--output")}function vci(i){return i.options.some((n)=>n.long==="--dry-run")}function fM(i){return{name:i.name(),path:_M(i),summary:i.summary()||void 0,description:i.description(),arguments:mci(i),options:xci(i),supportsJsonOutput:pci(i),supportsDryRun:vci(i),subcommands:i.commands.map((n)=>fM(n))}}function bci(i,n){if(!n?.trim())return i;let u=n.trim(),o=[...i.commands];while(o.length>0){let c=o.shift();if(!c)continue;if(c.name()===u||_M(c)===u)return c;o.push(...c.commands)}return null}function JM(i,n){let u=bci(i,n);if(!u)uo(`Unknown command: ${n}`);let o={name:i.name(),version:i.version(),description:i.description(),env:{[gM]:"Set to json to force machine-readable output on commands that support it."},command:fM(u)};console.log(JSON.stringify(o,null,2))}function Ki(i,n={}){return async(...u)=>{let o=UM(u),c=uci(u);try{if(o)$ci(o);await i(...u)}catch(r){let l=cci(r);if(n.supportsJsonOutput&&mu(c))console.log(JSON.stringify({error:l},null,2));else console.error(l);process.exitCode=1}}}var GM={name:"oh-my-agent",version:"5.8.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"]}};import{existsSync as Ici,mkdirSync as gci,readdirSync as h$,readFileSync as Uci,statSync as k8}from"node:fs";import{basename as _ci,join as Yu}from"node:path";var an=mi(Zi(),1),fci="●",Jci="✓",Gci="✗",wci="○",zci="◌";function Xci(){if(process.env.MEMORIES_DIR)return process.env.MEMORIES_DIR;let i=process.argv[3];if(i)return Yu(i,".serena","memories");return Yu(process.cwd(),".serena","memories")}function e$(i){try{return Uci(i,"utf-8")}catch{return""}}function Nci(i){try{let n=h$(i);if(n.includes("orchestrator-session.md"))return Yu(i,"orchestrator-session.md");let u=n.filter((o)=>/^session-.*\.md$/.test(o)).map((o)=>({name:o,mtime:k8(Yu(i,o)).mtimeMs})).sort((o,c)=>c.mtime-o.mtime);if(u.length>0&&u[0])return Yu(i,u[0].name)}catch{}return null}function Qci(i){let n=Nci(i);if(!n)return{id:"N/A",status:"UNKNOWN"};let u=e$(n);if(!u)return{id:"N/A",status:"UNKNOWN"};let o=(u.match(/session-id:\s*(.+)/i)||[])[1]||(u.match(/# Session:\s*(.+)/i)||[])[1]||u.match(/(session-\d{8}-\d{6})/)?.[1]||_ci(n,".md"),c="UNKNOWN";if(/IN PROGRESS|RUNNING|## Active|\[IN PROGRESS\]/i.test(u))c="RUNNING";else if(/COMPLETED|DONE|## Completed|\[COMPLETED\]/i.test(u))c="COMPLETED";else if(/FAILED|ERROR|## Failed|\[FAILED\]/i.test(u))c="FAILED";else if(/Step \d+:.*\[/i.test(u))c="RUNNING";return{id:(o||"N/A").trim(),status:c}}function qci(i){let n=e$(Yu(i,"task-board.md"));if(!n)return[];let u=[],o=n.split(`
|
|
827
827
|
`);for(let c of o){if(!c.startsWith("|")||/^\|\s*-+/.test(c))continue;let r=c.split("|").map((x)=>x.trim()).filter(Boolean),l=r[0];if(r.length<2||!l||/^agent$/i.test(l))continue;let $=r[1],m=r[2];u.push({agent:l,status:$||"pending",task:m||""})}return u}function y8(i,n){try{let u=h$(i).filter((r)=>r.startsWith(`progress-${n}`)&&r.endsWith(".md")).sort().reverse();if(u.length===0||!u[0])return null;let c=e$(Yu(i,u[0])).match(/turn[:\s]*(\d+)/i);return c?.[1]?parseInt(c[1],10):null}catch{return null}}function Bci(i){try{let n=h$(i).filter((o)=>o.endsWith(".md")&&o!==".gitkeep").map((o)=>({name:o,mtime:k8(Yu(i,o)).mtimeMs})).sort((o,c)=>c.mtime-o.mtime).slice(0,5),u=[];for(let o of n){let c=o.name.replace(/^(progress|result|session|debug|task)-?/,"").replace(/[-_]agent/,"").replace(/[-_]completion/,"").replace(/\.md$/,"").replace(/[-_]/g," ").trim()||o.name.replace(/\.md$/,""),l=e$(Yu(i,o.name)).split(`
|
|
828
828
|
`).map((m)=>m.trim()).filter((m)=>m&&!m.startsWith("---")&&m.length>3),$="";for(let m=l.length-1;m>=0;m--){let x=l[m];if(!x)continue;if(/^\*\*|^#+|^-|^\d+\.|Status|Result|Action|Step/i.test(x)){if($=x.replace(/^[#*\-\d.]+\s*/,"").replace(/\*\*/g,"").trim(),$.length>5)break}}if($.length>52)$=`${$.substring(0,49)}...`;if($)u.push({agent:c,message:$})}return u}catch{return[]}}function Yci(i){let n=[],u=new Set;try{let o=h$(i).filter((c)=>c.endsWith(".md")&&c!==".gitkeep").map((c)=>({name:c,mtime:k8(Yu(i,c)).mtimeMs})).sort((c,r)=>r.mtime-c.mtime);for(let c of o){let r=e$(Yu(i,c.name)),l=r.match(/\*\*Agent\*\*:\s*(.+)/i)||r.match(/Agent:\s*(.+)/i)||r.match(/^#+\s*(.+?)\s*Agent/im),$=null;if(l?.[1])$=l[1].trim();else if(/_agent|agent_|-agent/i.test(c.name))$=c.name.replace(/\.md$/,"").replace(/[-_]completion|[-_]progress|[-_]result/gi,"").replace(/[-_]/g," ").trim();if($&&!u.has($.toLowerCase())){u.add($.toLowerCase());let m="unknown";if(/\[COMPLETED\]|## Completed|## Results/i.test(r))m="completed";else if(/\[IN PROGRESS\]|## Progress|IN PROGRESS/i.test(r))m="running";else if(/\[FAILED\]|## Failed|ERROR/i.test(r))m="failed";let x=r.match(/## Task\s*\n+(.+)/i)||r.match(/\*\*Task\*\*:\s*(.+)/i),p=x?.[1]?x[1].trim().substring(0,20):"";n.push({agent:$,status:m,task:p,turn:y8(i,$)})}}}catch{}return n}function Hci(i){let n=i.toLowerCase();if(["running","active","in_progress","in-progress"].includes(n))return`${an.default.green(fci)} running`;else if(["completed","done","finished"].includes(n))return`${an.default.cyan(Jci)} completed`;else if(["failed","error"].includes(n))return`${an.default.red(Gci)} failed`;else if(["blocked","waiting"].includes(n))return`${an.default.yellow(wci)} blocked`;return`${an.default.dim(zci)} pending`}function wM(i){console.clear();let n=Qci(i),o=qci(i).map((g)=>({...g,turn:y8(i,g.agent)}));if(o.length===0)o=Yci(i);if(o.length===0)try{let g=h$(i).filter((U)=>U.startsWith("progress-")&&U.endsWith(".md"));for(let U of g){let _=U.replace(/^progress-/,"").replace(/\.md$/,"");o.push({agent:_,status:"running",task:"",turn:y8(i,_)})}}catch{}let c=56,r="═".repeat(c),l=(g)=>" ".repeat(Math.max(0,g)),$=(g)=>an.default.magenta(g),m=(g)=>an.default.bold(g),x=(g)=>an.default.dim(g),p=an.default.yellow;if(n.status==="RUNNING")p=an.default.green;else if(n.status==="COMPLETED")p=an.default.cyan;else if(n.status==="FAILED")p=an.default.red;console.log(`${$(`╔${r}╗`)}`),console.log(`${$("║")} ${m($("Serena Memory Dashboard"))}${l(c-25)}${$("║")}`);let v=`Session: ${m(n.id.padEnd(20))} [${p(n.status)}]`;if(console.log(`${$("║")} ${v}${l(c-4-v.length-9)}${$("║")}`),console.log(`${$(`╠${r}╣`)}`),console.log(`${$("║")} ${m(`${"Agent".padEnd(12)} ${"Status".padEnd(12)} ${"Turn".padEnd(6)} ${"Task".padEnd(20)}`)} ${$("║")}`),console.log(`${$("║")} ${x(`${"──────────".padEnd(12)} ${"──────────".padEnd(12)} ${"────".padEnd(6)} ${"──────────────────".padEnd(20)}`)} ${$("║")}`),o.length===0)console.log(`${$("║")} ${x(`No agents detected yet${l(32)}`)}${$("║")}`);else for(let g of o){let U=Hci(g.status),_=g.turn!=null?String(g.turn):"-",G=g.task.substring(0,20);console.log(`${$("║")} ${g.agent.padEnd(12)} ${U.padEnd(22)} ${_.padEnd(6)} ${G.padEnd(20)}${$("║")}`)}console.log(`${$(`╠${r}╣`)}`),console.log(`${$("║")} ${m("Latest Activity:")}${l(c-18)}${$("║")}`);let b=Bci(i);if(b.length===0)console.log(`${$("║")} ${x(`No activity yet${l(38)}`)}${$("║")}`);else for(let g of b){let U=`[${g.agent}] ${g.message}`;console.log(`${$("║")} ${x(U.substring(0,52).padEnd(52))}${$("║")}`)}console.log(`${$(`╠${r}╣`)}`);let I=`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(`${$("║")} ${x(I)}${l(c-4-I.length)}${$("║")}`),console.log(`${$(`╚${r}╝`)}`)}async function zM(){let i=Xci();if(!Ici(i))gci(i,{recursive:!0}),console.log(an.default.yellow(`Created ${i} — waiting for memory files...`));console.log(an.default.magenta(`
|
|
829
829
|
\uD83D\uDEF8 Serena Terminal Dashboard`)),console.log(an.default.dim(` Watching: ${i}
|
package/package.json
CHANGED