oh-my-agent 13.1.1 → 13.2.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.
Files changed (3) hide show
  1. package/README.md +21 -21
  2. package/bin/cli.js +2 -2
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -14,27 +14,6 @@ oh-my-agent makes the claim falsifiable. A Stop hook refuses to end your session
14
14
 
15
15
  [Watch the full video (35s)](https://github.com/first-fluke/oh-my-agent/blob/main/docs/assets/video/oh-my-agent-explainer.mp4)
16
16
 
17
- ## Verification, Not Narration
18
-
19
- Each mechanism below is mechanical: a command exits 0 or it doesn't, a file is on disk or it isn't. No LLM is asked whether the work "looks correct."
20
-
21
- | Mechanism | What it mechanically checks | Where it lives |
22
- |-----------|------------------------------|----------------|
23
- | **Stop-hook gate** | Blocks session termination while a persistent workflow is active, and runs the configured gate script before allowing a stop. Only `typecheck`, `test`, and `lint` are executable — an agent that writes anything else into the state file gets it ignored, never run. Capped at 5 reinforcements so a permanently red gate can't trap you. | [`.agents/hooks/core/persistent-mode.ts`](https://github.com/first-fluke/oh-my-agent/blob/main/.agents/hooks/core/persistent-mode.ts) |
24
- | **Anti-Circumvention Gate** | `oma ralph:verify --json` checks four artifacts a shortcut can't fake: ultrawork's phase records, the plan JSON, a **distinct QA agent's** result file, and a **distinct refactor agent's** result file. Missing artifacts mean the phase did not run, whatever the narration says. | [`.agents/workflows/ralph.md`](https://github.com/first-fluke/oh-my-agent/blob/main/.agents/workflows/ralph.md) |
25
- | **Independent judge** | Spawned as a separate agent with fresh context, briefed on the criteria only — never on what the implementer claims it fixed. Re-verifies **every** criterion each iteration, including prior PASSes, because fixing C2 is how C1 silently regresses. | [`judge-protocol.md`](https://github.com/first-fluke/oh-my-agent/blob/main/.agents/workflows/ralph/resources/judge-protocol.md) |
26
- | **Event-sourced state** | Every gate pass, gate failure, and decision appends one JSON line to `.agents/state/sessions/{sid}/events.jsonl`, stamped with vendor and runtime session id. Append-only, cross-vendor, auditable after the run. | [`event-spec.md`](https://github.com/first-fluke/oh-my-agent/blob/main/.agents/skills/_shared/runtime/event-spec.md) |
27
- | **Per-agent check battery** | `oma verify <agent>` runs a shared core (scope violation, charter alignment, hardcoded secrets, TODO scan, declared outputs) plus type-specific checks (TypeScript strict, tests, raw SQL, Flutter analyze, inline styles). | `oma verify <agent>` |
28
- | **Skill eval harness** | `oma skills eval` measures utility lift on held-out tasks — treatment vs. baseline — instead of assuming a skill helps. `oma skills opt` keeps only edits that improve the measured lift. | [skill-eval guide](https://github.com/first-fluke/oh-my-agent/blob/main/web/docs/guide/skill-eval.md) |
29
-
30
- Budgets are enforced the same way. `session.quota_cap` caps tokens, spawn count, and per-vendor spend; the orchestrator refuses the next spawn when a dimension is exceeded. When the wall-clock budget runs out, the Stop hook stops honestly with partial status recorded on the event log, rather than pretending completion.
31
-
32
- ### Control Boundary
33
-
34
- oh-my-agent leaves open-ended planning and next-action selection to the host LLM. It does not replace that judgment with a universal workflow graph or policy engine. Instead, it externalizes the invariants that must hold regardless of the model: tool guardrails, permissions, budgets, retry and stop limits, durable events, and mechanically verified completion. Structured events record decisions and gate outcomes; they do not act as a second planner.
35
-
36
- Deterministic SLM execution is therefore a separate, optional product direction rather than missing infrastructure in the current harness.
37
-
38
17
  ## Quick Start
39
18
 
40
19
  The install scripts below auto-install bun, uv, and serena if they're missing.
@@ -270,6 +249,27 @@ agents:
270
249
  - `oma doctor --profile` — prints the per-role resolved model matrix
271
250
  - Full guide: [`web/docs/guide/per-agent-models.md`](https://github.com/first-fluke/oh-my-agent/blob/main/web/docs/guide/per-agent-models.md)
272
251
 
252
+ ## Verification, Not Narration
253
+
254
+ Each mechanism below is mechanical: a command exits 0 or it doesn't, a file is on disk or it isn't. No LLM is asked whether the work "looks correct."
255
+
256
+ | Mechanism | What it mechanically checks | Where it lives |
257
+ |-----------|------------------------------|----------------|
258
+ | **Stop-hook gate** | Blocks session termination while a persistent workflow is active, and runs the configured gate script before allowing a stop. Only `typecheck`, `test`, and `lint` are executable — an agent that writes anything else into the state file gets it ignored, never run. Capped at 5 reinforcements so a permanently red gate can't trap you. | [`.agents/hooks/core/persistent-mode.ts`](https://github.com/first-fluke/oh-my-agent/blob/main/.agents/hooks/core/persistent-mode.ts) |
259
+ | **Anti-Circumvention Gate** | `oma ralph:verify --json` checks four artifacts a shortcut can't fake: ultrawork's phase records, the plan JSON, a **distinct QA agent's** result file, and a **distinct refactor agent's** result file. Missing artifacts mean the phase did not run, whatever the narration says. | [`.agents/workflows/ralph.md`](https://github.com/first-fluke/oh-my-agent/blob/main/.agents/workflows/ralph.md) |
260
+ | **Independent judge** | Spawned as a separate agent with fresh context, briefed on the criteria only — never on what the implementer claims it fixed. Re-verifies **every** criterion each iteration, including prior PASSes, because fixing C2 is how C1 silently regresses. | [`judge-protocol.md`](https://github.com/first-fluke/oh-my-agent/blob/main/.agents/workflows/ralph/resources/judge-protocol.md) |
261
+ | **Event-sourced state** | Every gate pass, gate failure, and decision appends one JSON line to `.agents/state/sessions/{sid}/events.jsonl`, stamped with vendor and runtime session id. Append-only, cross-vendor, auditable after the run. | [`event-spec.md`](https://github.com/first-fluke/oh-my-agent/blob/main/.agents/skills/_shared/runtime/event-spec.md) |
262
+ | **Per-agent check battery** | `oma verify <agent>` runs a shared core (scope violation, charter alignment, hardcoded secrets, TODO scan, declared outputs) plus type-specific checks (TypeScript strict, tests, raw SQL, Flutter analyze, inline styles). | `oma verify <agent>` |
263
+ | **Skill eval harness** | `oma skills eval` measures utility lift on held-out tasks — treatment vs. baseline — instead of assuming a skill helps. `oma skills opt` keeps only edits that improve the measured lift. | [skill-eval guide](https://github.com/first-fluke/oh-my-agent/blob/main/web/docs/guide/skill-eval.md) |
264
+
265
+ Budgets are enforced the same way. `session.quota_cap` caps tokens, spawn count, and per-vendor spend; the orchestrator refuses the next spawn when a dimension is exceeded. When the wall-clock budget runs out, the Stop hook stops honestly with partial status recorded on the event log, rather than pretending completion.
266
+
267
+ ### Control Boundary
268
+
269
+ oh-my-agent leaves open-ended planning and next-action selection to the host LLM. It does not replace that judgment with a universal workflow graph or policy engine. Instead, it externalizes the invariants that must hold regardless of the model: tool guardrails, permissions, budgets, retry and stop limits, durable events, and mechanically verified completion. Structured events record decisions and gate outcomes; they do not act as a second planner.
270
+
271
+ Deterministic SLM execution is therefore a separate, optional product direction rather than missing infrastructure in the current harness.
272
+
273
273
  ## Why oh-my-agent?
274
274
 
275
275
  - **Role-based** — agents modeled like a real engineering team, not a pile of prompts
package/bin/cli.js CHANGED
@@ -24,7 +24,7 @@ Expecting one of '${r.join("', '")}'`);if(this._lifeCycleHooks[e])this._lifeCycl
24
24
  `),this.outputHelp({error:!0});let r=t||{},n=r.exitCode||1,i=r.code||"commander.error";this._exit(n,i,e)}_parseOptionsEnv(){this.options.forEach((e)=>{if(e.envVar&&e.envVar in kr.env){let t=e.attributeName();if(this.getOptionValue(t)===void 0||["default","config","env"].includes(this.getOptionValueSource(t)))if(e.required||e.optional)this.emit(`optionEnv:${e.name()}`,kr.env[e.envVar]);else this.emit(`optionEnv:${e.name()}`)}})}_parseOptionsImplied(){let e=new rN(this.options),t=(r)=>this.getOptionValue(r)!==void 0&&!["default","implied"].includes(this.getOptionValueSource(r));this.options.filter((r)=>r.implied!==void 0&&t(r.attributeName())&&e.valueFromOption(this.getOptionValue(r.attributeName()),r)).forEach((r)=>{Object.keys(r.implied).filter((n)=>!t(n)).forEach((n)=>{this.setOptionValueWithSource(n,r.implied[n],"implied")})})}missingArgument(e){let t=`error: missing required argument '${e}'`;this.error(t,{code:"commander.missingArgument"})}optionMissingArgument(e){let t=`error: option '${e.flags}' argument missing`;this.error(t,{code:"commander.optionMissingArgument"})}missingMandatoryOptionValue(e){let t=`error: required option '${e.flags}' not specified`;this.error(t,{code:"commander.missingMandatoryOptionValue"})}_conflictingOption(e,t){let r=(o)=>{let s=o.attributeName(),a=this.getOptionValue(s),l=this.options.find((u)=>u.negate&&s===u.attributeName()),c=this.options.find((u)=>!u.negate&&s===u.attributeName());if(l&&(l.presetArg===void 0&&a===!1||l.presetArg!==void 0&&a===l.presetArg))return l;return c||o},n=(o)=>{let s=r(o),a=s.attributeName();if(this.getOptionValueSource(a)==="env")return`environment variable '${s.envVar}'`;return`option '${s.flags}'`},i=`error: ${n(e)} cannot be used with ${n(t)}`;this.error(i,{code:"commander.conflictingOption"})}unknownOption(e){if(this._allowUnknownOption)return;let t="";if(e.startsWith("--")&&this._showSuggestionAfterError){let n=[],i=this;do{let o=i.createHelp().visibleOptions(i).filter((s)=>s.long).map((s)=>s.long);n=n.concat(o),i=i.parent}while(i&&!i._enablePositionalOptions);t=iN(e,n)}let r=`error: unknown option '${e}'${t}`;this.error(r,{code:"commander.unknownOption"})}_excessArguments(e){if(this._allowExcessArguments)return;let t=this.registeredArguments.length,r=t===1?"":"s",n=e.length,i=this.parent?` for '${this.name()}'`:"",o=e.join(", "),s=`error: too many arguments${i}. Expected ${t} argument${r} but got ${n}: ${o}.`;this.error(s,{code:"commander.excessArguments"})}unknownCommand(){let e=this.args[0],t="";if(this._showSuggestionAfterError){let n=[];this.createHelp().visibleCommands(this).forEach((i)=>{if(n.push(i.name()),i.alias())n.push(i.alias())}),t=iN(e,n)}let r=`error: unknown command '${e}'${t}`;this.error(r,{code:"commander.unknownCommand"})}version(e,t,r){if(e===void 0)return this._version;this._version=e,t=t||"-V, --version",r=r||"output the version number";let n=this.createOption(t,r);return this._versionOptionName=n.attributeName(),this._registerOption(n),this.on("option:"+n.name(),()=>{this._outputConfiguration.writeOut(`${e}
25
25
  `),this._exit(0,"commander.version",e)}),this}description(e,t){if(e===void 0&&t===void 0)return this._description;if(this._description=e,t)this._argsDescription=t;return this}summary(e){if(e===void 0)return this._summary;return this._summary=e,this}alias(e){if(e===void 0)return this._aliases[0];let t=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler)t=this.commands[this.commands.length-1];if(e===t._name)throw Error("Command alias can't be the same as its name");let r=this.parent?._findCommand(e);if(r){let n=[r.name()].concat(r.aliases()).join("|");throw Error(`cannot add alias '${e}' to command '${this.name()}' as already have command '${n}'`)}return t._aliases.push(e),this}aliases(e){if(e===void 0)return this._aliases;return e.forEach((t)=>this.alias(t)),this}usage(e){if(e===void 0){if(this._usage)return this._usage;let t=this.registeredArguments.map((r)=>vx(r));return[].concat(this.options.length||this._helpOption!==null?"[options]":[],this.commands.length?"[command]":[],this.registeredArguments.length?t:[]).join(" ")}return this._usage=e,this}name(e){if(e===void 0)return this._name;return this._name=e,this}helpGroup(e){if(e===void 0)return this._helpGroupHeading??"";return this._helpGroupHeading=e,this}commandsGroup(e){if(e===void 0)return this._defaultCommandGroup??"";return this._defaultCommandGroup=e,this}optionsGroup(e){if(e===void 0)return this._defaultOptionGroup??"";return this._defaultOptionGroup=e,this}_initOptionGroup(e){if(this._defaultOptionGroup&&!e.helpGroupHeading)e.helpGroup(this._defaultOptionGroup)}_initCommandGroup(e){if(this._defaultCommandGroup&&!e.helpGroup())e.helpGroup(this._defaultCommandGroup)}nameFromFilename(e){return this._name=gc.basename(e,gc.extname(e)),this}executableDir(e){if(e===void 0)return this._executableDir;return this._executableDir=e,this}helpInformation(e){let t=this.createHelp(),r=this._getOutputContext(e);t.prepareContext({error:r.error,helpWidth:r.helpWidth,outputHasColors:r.hasColors});let n=t.formatHelp(this,t);if(r.hasColors)return n;return this._outputConfiguration.stripColor(n)}_getOutputContext(e){e=e||{};let t=!!e.error,r,n,i;if(t)r=(s)=>this._outputConfiguration.writeErr(s),n=this._outputConfiguration.getErrHasColors(),i=this._outputConfiguration.getErrHelpWidth();else r=(s)=>this._outputConfiguration.writeOut(s),n=this._outputConfiguration.getOutHasColors(),i=this._outputConfiguration.getOutHelpWidth();return{error:t,write:(s)=>{if(!n)s=this._outputConfiguration.stripColor(s);return r(s)},hasColors:n,helpWidth:i}}outputHelp(e){let t;if(typeof e==="function")t=e,e=void 0;let r=this._getOutputContext(e),n={error:r.error,write:r.write,command:this};this._getCommandAndAncestors().reverse().forEach((o)=>o.emit("beforeAllHelp",n)),this.emit("beforeHelp",n);let i=this.helpInformation({error:r.error});if(t){if(i=t(i),typeof i!=="string"&&!Buffer.isBuffer(i))throw Error("outputHelp callback must return a string or a Buffer")}if(r.write(i),this._getHelpOption()?.long)this.emit(this._getHelpOption().long);this.emit("afterHelp",n),this._getCommandAndAncestors().forEach((o)=>o.emit("afterAllHelp",n))}helpOption(e,t){if(typeof e==="boolean"){if(e){if(this._helpOption===null)this._helpOption=void 0;if(this._defaultOptionGroup)this._initOptionGroup(this._getHelpOption())}else this._helpOption=null;return this}if(this._helpOption=this.createOption(e??"-h, --help",t??"display help for command"),e||t)this._initOptionGroup(this._helpOption);return this}_getHelpOption(){if(this._helpOption===void 0)this.helpOption(void 0,void 0);return this._helpOption}addHelpOption(e){return this._helpOption=e,this._initOptionGroup(e),this}help(e){this.outputHelp(e);let t=Number(kr.exitCode??0);if(t===0&&e&&typeof e!=="function"&&e.error)t=1;this._exit(t,"commander.help","(outputHelp)")}addHelpText(e,t){let r=["beforeAll","before","after","afterAll"];if(!r.includes(e))throw Error(`Unexpected value for position to addHelpText.
26
26
  Expecting one of '${r.join("', '")}'`);let n=`${e}Help`;return this.on(n,(i)=>{let o;if(typeof t==="function")o=t({error:i.error,command:i.command});else o=t;if(o)i.write(`${o}
27
- `)}),this}_outputHelpIfRequested(e){let t=this._getHelpOption();if(t&&e.find((n)=>t.is(n)))this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)")}}});var cyr;var sN=g(()=>{bx();Qde();f8();tN();nN();cyr=new eu});var h8;var aN=g(()=>{h8={name:"oh-my-agent",version:"13.1.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-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"],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","generate:skill-data":"node ./scripts/generate-skill-data.mjs",build:"bun run generate:skill-data && bun run sync:readme && bun build cli.ts --outfile bin/cli.js --target node --minify --external @napi-rs/keyring",dev:"bun run generate:skill-data && bun run cli.ts",lint:"biome check .","lint:fix":"biome check --write --unsafe .","check:boundaries":"node ./scripts/check-boundaries.mjs","check:emit-drift":"node ./scripts/check-emit-drift.mjs",test:"vitest run","test:coverage":"vitest run --coverage",prepublishOnly:"bun run build"},dependencies:{"@clack/prompts":"^1.7.0","@date-fns/tz":"^1.5.0","@napi-rs/keyring":"^1.3.0",axios:"^1.18.1","better-sqlite3":"^13.0.2",chokidar:"^5.0.0",commander:"^15.0.0","date-fns":"^4.4.0",eld:"^2.0.3","fast-xml-parser":"^5.10.1",minimatch:"^10.2.6","p-map":"^7.0.6",picocolors:"^1.1.1","puppeteer-core":"^25.4.0",remark:"^15.0.1","remark-frontmatter":"^5.0.0","remark-parse":"^11.0.0","smol-toml":"^1.7.1",unified:"^11.0.5",ws:"^8.21.1",yaml:"^2.9.0",zod:"^4.4.3"},optionalDependencies:{pptxgenjs:"^4.0.1"},devDependencies:{"@biomejs/biome":"^2.5.6","@types/better-sqlite3":"^7.6.13","@types/mdast":"^4.0.4","@types/node":"^26.1.2","@types/ws":"^8.18.1","@vitest/coverage-v8":"^4.1.10",typescript:"^7.0.2",vitest:"^4.1.10"},repository:{type:"git",url:"https://github.com/first-fluke/oh-my-agent"},homepage:"https://firstfluke.com/oh-my-agent",bugs:{url:"https://github.com/first-fluke/oh-my-agent/issues"},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-orchestration","oma-dev-workflow","oma-tf-infra","oma-scm","oma-pdf","oma-recap"]}}});import*as sm from"node:fs";import{homedir as Qut}from"node:os";import*as g8 from"node:path";function tpe(e){if(Ax)throw Error("install context already set in this process");Ax=e}function rpe(){if(Ax===null)throw Error("install context not set — entry point must call setInstallContext()");return Ax}function Ld(){return rpe().installRoot}function Ko(){return rpe().mode}function Fd(){try{return Ko()}catch{return"project"}}function am(){try{return Ld()}catch{return process.cwd()}}function npe(e){let t=process.env.OMA_HOME,r=e.global===!0||process.env.OMA_INSTALL_GLOBAL==="1";if(t!==void 0&&t!=="")return e1t(t),{installRoot:t,mode:r?"global":"project"};if(r)return{installRoot:Qut(),mode:"global"};return{installRoot:process.cwd(),mode:"project"}}function e1t(e){if(!g8.isAbsolute(e))throw Error("OMA_HOME must be absolute path");for(let r of epe)if(e===r||e.startsWith(r+g8.sep))throw Error(`OMA_HOME=${e} is forbidden (system path ${r})`);let t;try{t=sm.realpathSync(e)}catch(r){let n=r instanceof Error?r.message:String(r);throw Error(`OMA_HOME=${e}: ${n}`)}for(let r of epe)if(t===r||t.startsWith(r+g8.sep))throw Error(`OMA_HOME=${t} is forbidden (system path ${r})`);try{sm.accessSync(t,sm.constants.W_OK)}catch{throw Error(`OMA_HOME=${t} is not writable`)}}var Ax=null,epe;var o5=g(()=>{epe=["/etc","/usr","/bin","/boot","/sys","/proc"]});import{join as t1t}from"node:path";function Md(e){return e.endsWith("/")?e:`${e}/`}function wi(e,t){let r=t.split("/").filter((n)=>n.length>0);return t1t(e,...r)}var s5=".agents",xx,ai,tu,ipe,ope,Sx,r1t=".antigravitycli",spe,n1t=".migration-backup",i1t="docs/plans",o1t=".qwen/tmp",s1t,a1t,l1t,c1t,u1t,d1t,p1t,lN;var li=g(()=>{xx=`${s5}/skills`,ai=`${s5}/results`,tu=`${s5}/state`,ipe=`${tu}/sessions`,ope=`${tu}/retry`,Sx=`${tu}/archive`,spe=`${s5}/backup`;s1t=Md(ai),a1t=Md(tu),l1t=Md(r1t),c1t=Md(spe),u1t=Md(n1t),d1t=Md(i1t),p1t=Md(o1t),lN=[l1t,s1t,a1t,c1t,d1t,u1t,p1t]});var wn="first-fluke/oh-my-agent",wr,a5,cN,f1t,m1t,yc,on;var sl=g(()=>{li();wr=xx,a5=["antigravity","claude","codex","commandcode","cursor","grok","kimi","kiro","qwen"],cN=["pi","opencode"],f1t=["copilot","hermes"],m1t=["zcode"],yc=[...a5,...cN,...f1t,...m1t].sort(),on={antigravity:{projectPath:".gemini/antigravity-cli/skills",homePath:".gemini/antigravity-cli/skills",requiresHomeConsent:!0},claude:{projectPath:".claude/skills",homePath:".claude/skills"},codex:{projectPath:".codex/skills",homePath:".codex/skills"},commandcode:{projectPath:".commandcode/skills",homePath:".commandcode/skills",optIn:!0},copilot:{projectPath:".github/skills",homePath:".copilot/skills"},cursor:{projectPath:".cursor/skills",homePath:".cursor/skills"},hermes:{projectPath:".hermes/skills/oma",homePath:".hermes/skills/oma",requiresHomeConsent:!0},kimi:{projectPath:".kimi-code/skills",homePath:".kimi-code/skills",requiresHomeConsent:!0,optIn:!0},kiro:{projectPath:".kiro/skills",homePath:".kiro/skills",optIn:!0},opencode:{projectPath:".opencode/skills",homePath:".opencode/skills"},qwen:{projectPath:".qwen/skills",homePath:".qwen/skills"}}});var fpe={};Re(fpe,{addOutputOptions:()=>Ge,printDescribe:()=>C1t,resolveJsonMode:()=>Ue,runAction:()=>he});function Ge(e,t="Output as JSON"){return e.option("--json",t).option("--output <format>","Output format (text/json)",(r)=>{let n=r.trim().toLowerCase();if(!y8.includes(n))throw Error(`Invalid output format: ${r}. Expected one of ${y8.join(", ")}`);return n})}function h1t(e){if(e?.json)return"json";let t=e?.output?.trim().toLowerCase();if(t&&y8.includes(t))return t;if(process.env[cpe]?.trim().toLowerCase()==="json")return"json";return"text"}function Ue(e){return h1t(e)==="json"}function upe(e){let t=e.at(-1);return t instanceof eu?t:null}function g1t(e){let t=upe(e);if(t)return t.opts();let r=e.at(-1);return r&&typeof r==="object"?r:{}}function y1t(e){if(e instanceof Error)return e.message;return String(e)}function ru(e){throw Error(e)}function dN(e,t){for(let r of e){let n=r.charCodeAt(0);if(n>=0&&n<=31||n===127)ru(`${t} must not contain control characters`)}}function v1t(e,t){if(dN(e,t),/[?#%]/.test(e))ru(`${t} must not contain ?, #, or %`);if(e.includes(".."))ru(`${t} must not contain '..'`)}function b1t(e,t){dN(e,t);try{new URL(e)}catch{ru(`${t} must be a valid absolute URL`)}}function uN(e,t,r="text"){if(typeof e==="string"){if(r==="identifier"){v1t(e,t);return}if(r==="url"){b1t(e,t);return}dN(e,t);return}if(Array.isArray(e))for(let[n,i]of e.entries())uN(i,`${t}[${n}]`,r)}function lpe(e){let t=e.toLowerCase();if(t==="url"||t.endsWith("url"))return"url";if(t.includes("id")||t.includes("type")||t.includes("vendor")||t.includes("session"))return"identifier";return"text"}function k1t(e){let t=e.vendor;if(typeof t==="string"){if(t.split(",").map((o)=>o.trim()).filter(Boolean).filter((o)=>!yc.includes(o)).length>0)ru(`vendor must be one of ${yc.join(", ")}`)}let r=e.output;if(typeof r==="string"&&!y8.includes(r))ru(`output must be one of ${y8.join(", ")}`)}function w1t(e){let t=e.processedArgs??e.args??[];(e.registeredArguments??[]).forEach((i,o)=>{let s=i.name?.()||String(o),a=t[o];if(uN(a,s,lpe(s)),s==="agent-type"&&typeof a==="string"&&!ape.includes(a))ru(`agent-type must be one of ${ape.join(", ")}`)});let n=e.opts();k1t(n);for(let[i,o]of Object.entries(n))uN(o,i,lpe(i))}function A1t(e){return(e.registeredArguments??[]).map((t)=>({name:t.name?.()||"",required:!!t.required,variadic:!!t.variadic}))}function x1t(e){return e.options.map((t)=>({flags:t.flags,long:t.long||void 0,short:t.short||void 0,description:t.description||"",required:!!t.required||!!t.mandatory,optional:!!t.optional,defaultValue:t.defaultValue}))}function dpe(e){let t=[],r=e;while(r?.parent)t.unshift(r.name()),r=r.parent;return t.join(" ")}function S1t(e){return e.options.some((t)=>t.long==="--json"||t.long==="--output")}function $1t(e){return e.options.some((t)=>t.long==="--dry-run")}function ppe(e){return{name:e.name(),path:dpe(e),summary:e.summary()||void 0,description:e.description(),arguments:A1t(e),options:x1t(e),supportsJsonOutput:S1t(e),supportsDryRun:$1t(e),subcommands:e.commands.map((t)=>ppe(t))}}function E1t(e,t){if(!t?.trim())return e;let r=t.trim(),n=[...e.commands];while(n.length>0){let i=n.shift();if(!i)continue;if(i.name()===r||dpe(i)===r)return i;n.push(...i.commands)}return null}function C1t(e,t){let r=E1t(e,t);if(!r)ru(`Unknown command: ${t}`);let n={name:e.name(),version:e.version(),description:e.description(),env:{[cpe]:"Set to json to force machine-readable output on commands that support it."},command:ppe(r)};console.log(JSON.stringify(n,null,2))}function he(e,t={}){return async(...r)=>{let n=upe(r);if(n&&r.length>=2)r[r.length-2]=n.optsWithGlobals();let i=g1t(r);try{if(n)w1t(n);await e(...r)}catch(o){let s=y1t(o);if(t.supportsJsonOutput&&Ue(i))console.log(JSON.stringify({error:s},null,2));else console.error(s);process.exitCode=1}}}var cpe="OH_MY_AG_OUTPUT_FORMAT",y8,ape;var Jt=g(()=>{sN();sl();y8=["text","json"],ape=["backend","frontend","mobile","qa","debug","pm"]});var mpe,hpe=(e)=>e===12288||e>=65281&&e<=65376||e>=65504&&e<=65510,gpe=(e)=>e===8987||e===9001||e>=12272&&e<=12287||e>=12289&&e<=12350||e>=12441&&e<=12543||e>=12549&&e<=12591||e>=12593&&e<=12686||e>=12688&&e<=12771||e>=12783&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=19903||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=127488&&e<=127490||e>=127504&&e<=127547||e>=127552&&e<=127560||e>=131072&&e<=196605||e>=196608&&e<=262141;var ype=g(()=>{mpe=(()=>{let e=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g;return(t)=>{let r=0;e.lastIndex=0;while(e.test(t))r+=1;return t.length-r}})()});var _1t,D1t,vpe,P1t,bpe,T1t,I1t,R1t,kpe=(e,t={},r={})=>{let n=t.limit??1/0,i=t.ellipsis??"",o=t?.ellipsisWidth??(i?kpe(i,R1t,r).width:0),s=0,a=r.controlWidth??0,l=r.tabWidth??8,c=r.emojiWidth??2,u=2,d=r.regularWidth??1,p=r.wideWidth??2,f=[[T1t,d],[_1t,0],[D1t,a],[P1t,l],[bpe,c],[vpe,p]],m=0,h=0,y=e.length,v=0,b=!1,k=y,x=Math.max(0,n-o),E=0,A=0,w=0,S=0;e:while(!0){if(A>E||h>=y&&h>m){let _=e.slice(E,A)||e.slice(m,h);v=0;for(let T of _.replaceAll(I1t,"")){let D=T.codePointAt(0)||0;if(hpe(D))S=2;else if(gpe(D))S=p;else S=d;if(w+S>x)k=Math.min(k,Math.max(E,m)+v);if(w+S>n){b=!0;break e}v+=T.length,w+=S}E=A=0}if(h>=y)break e;for(let _=0,T=f.length;_<T;_++){let[D,P]=f[_];if(D.lastIndex=h,D.test(e)){if(v=D===vpe?mpe(e.slice(h,D.lastIndex)):D===bpe?1:D.lastIndex-h,S=v*P,w+S>x)k=Math.min(k,h+Math.floor((x-w)/P));if(w+S>n){b=!0;break e}w+=S,E=m,A=h,h=m=D.lastIndex;continue e}}h+=1}return{width:b?x:w,index:b?k:y,truncated:b,ellipsed:b&&n>=o}},wpe;var Ape=g(()=>{ype();_1t=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,D1t=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,vpe=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/yu,P1t=/\t{1,1000}/y,bpe=/[\u{1F1E6}-\u{1F1FF}]{2}|\u{1F3F4}[\u{E0061}-\u{E007A}]{2}[\u{E0030}-\u{E0039}\u{E0061}-\u{E007A}]{1,3}\u{E007F}|(?:\p{Emoji}\uFE0F\u20E3?|\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation})(?:\u200D(?:\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F\u20E3?))*/yu,T1t=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,I1t=/\p{M}+/gu,R1t={limit:1/0,ellipsis:""},wpe=kpe});var O1t,j1t=(e,t={})=>wpe(e,O1t,t).width,Jo;var pN=g(()=>{Ape();O1t={limit:1/0,ellipsis:"",ellipsisWidth:0},Jo=j1t});function al(e,t,r){return String(e).normalize().split(z1t).map((n)=>N1t(n,t,r)).join(`
27
+ `)}),this}_outputHelpIfRequested(e){let t=this._getHelpOption();if(t&&e.find((n)=>t.is(n)))this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)")}}});var cyr;var sN=g(()=>{bx();Qde();f8();tN();nN();cyr=new eu});var h8;var aN=g(()=>{h8={name:"oh-my-agent",version:"13.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-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"],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","generate:skill-data":"node ./scripts/generate-skill-data.mjs",build:"bun run generate:skill-data && bun run sync:readme && bun build cli.ts --outfile bin/cli.js --target node --minify --external @napi-rs/keyring",dev:"bun run generate:skill-data && bun run cli.ts",lint:"biome check .","lint:fix":"biome check --write --unsafe .","check:boundaries":"node ./scripts/check-boundaries.mjs","check:emit-drift":"node ./scripts/check-emit-drift.mjs",test:"vitest run","test:coverage":"vitest run --coverage",prepublishOnly:"bun run build"},dependencies:{"@clack/prompts":"^1.7.0","@date-fns/tz":"^1.5.0","@napi-rs/keyring":"^1.3.0",axios:"^1.18.1","better-sqlite3":"^13.0.2",chokidar:"^5.0.0",commander:"^15.0.0","date-fns":"^4.4.0",eld:"^2.0.3","fast-xml-parser":"^5.10.1",minimatch:"^10.2.6","p-map":"^7.0.6",picocolors:"^1.1.1","puppeteer-core":"^25.4.0",remark:"^15.0.1","remark-frontmatter":"^5.0.0","remark-parse":"^11.0.0","smol-toml":"^1.7.1",unified:"^11.0.5",ws:"^8.21.1",yaml:"^2.9.0",zod:"^4.4.3"},optionalDependencies:{pptxgenjs:"^4.0.1"},devDependencies:{"@biomejs/biome":"^2.5.6","@types/better-sqlite3":"^7.6.13","@types/mdast":"^4.0.4","@types/node":"^26.1.2","@types/ws":"^8.18.1","@vitest/coverage-v8":"^4.1.10",typescript:"^7.0.2",vitest:"^4.1.10"},repository:{type:"git",url:"https://github.com/first-fluke/oh-my-agent"},homepage:"https://firstfluke.com/oh-my-agent",bugs:{url:"https://github.com/first-fluke/oh-my-agent/issues"},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-orchestration","oma-dev-workflow","oma-tf-infra","oma-scm","oma-pdf","oma-recap"]}}});import*as sm from"node:fs";import{homedir as Qut}from"node:os";import*as g8 from"node:path";function tpe(e){if(Ax)throw Error("install context already set in this process");Ax=e}function rpe(){if(Ax===null)throw Error("install context not set — entry point must call setInstallContext()");return Ax}function Ld(){return rpe().installRoot}function Ko(){return rpe().mode}function Fd(){try{return Ko()}catch{return"project"}}function am(){try{return Ld()}catch{return process.cwd()}}function npe(e){let t=process.env.OMA_HOME,r=e.global===!0||process.env.OMA_INSTALL_GLOBAL==="1";if(t!==void 0&&t!=="")return e1t(t),{installRoot:t,mode:r?"global":"project"};if(r)return{installRoot:Qut(),mode:"global"};return{installRoot:process.cwd(),mode:"project"}}function e1t(e){if(!g8.isAbsolute(e))throw Error("OMA_HOME must be absolute path");for(let r of epe)if(e===r||e.startsWith(r+g8.sep))throw Error(`OMA_HOME=${e} is forbidden (system path ${r})`);let t;try{t=sm.realpathSync(e)}catch(r){let n=r instanceof Error?r.message:String(r);throw Error(`OMA_HOME=${e}: ${n}`)}for(let r of epe)if(t===r||t.startsWith(r+g8.sep))throw Error(`OMA_HOME=${t} is forbidden (system path ${r})`);try{sm.accessSync(t,sm.constants.W_OK)}catch{throw Error(`OMA_HOME=${t} is not writable`)}}var Ax=null,epe;var o5=g(()=>{epe=["/etc","/usr","/bin","/boot","/sys","/proc"]});import{join as t1t}from"node:path";function Md(e){return e.endsWith("/")?e:`${e}/`}function wi(e,t){let r=t.split("/").filter((n)=>n.length>0);return t1t(e,...r)}var s5=".agents",xx,ai,tu,ipe,ope,Sx,r1t=".antigravitycli",spe,n1t=".migration-backup",i1t="docs/plans",o1t=".qwen/tmp",s1t,a1t,l1t,c1t,u1t,d1t,p1t,lN;var li=g(()=>{xx=`${s5}/skills`,ai=`${s5}/results`,tu=`${s5}/state`,ipe=`${tu}/sessions`,ope=`${tu}/retry`,Sx=`${tu}/archive`,spe=`${s5}/backup`;s1t=Md(ai),a1t=Md(tu),l1t=Md(r1t),c1t=Md(spe),u1t=Md(n1t),d1t=Md(i1t),p1t=Md(o1t),lN=[l1t,s1t,a1t,c1t,d1t,u1t,p1t]});var wn="first-fluke/oh-my-agent",wr,a5,cN,f1t,m1t,yc,on;var sl=g(()=>{li();wr=xx,a5=["antigravity","claude","codex","commandcode","cursor","grok","kimi","kiro","qwen"],cN=["pi","opencode"],f1t=["copilot","hermes"],m1t=["zcode"],yc=[...a5,...cN,...f1t,...m1t].sort(),on={antigravity:{projectPath:".gemini/antigravity-cli/skills",homePath:".gemini/antigravity-cli/skills",requiresHomeConsent:!0},claude:{projectPath:".claude/skills",homePath:".claude/skills"},codex:{projectPath:".codex/skills",homePath:".codex/skills"},commandcode:{projectPath:".commandcode/skills",homePath:".commandcode/skills",optIn:!0},copilot:{projectPath:".github/skills",homePath:".copilot/skills"},cursor:{projectPath:".cursor/skills",homePath:".cursor/skills"},hermes:{projectPath:".hermes/skills/oma",homePath:".hermes/skills/oma",requiresHomeConsent:!0},kimi:{projectPath:".kimi-code/skills",homePath:".kimi-code/skills",requiresHomeConsent:!0,optIn:!0},kiro:{projectPath:".kiro/skills",homePath:".kiro/skills",optIn:!0},opencode:{projectPath:".opencode/skills",homePath:".opencode/skills"},qwen:{projectPath:".qwen/skills",homePath:".qwen/skills"}}});var fpe={};Re(fpe,{addOutputOptions:()=>Ge,printDescribe:()=>C1t,resolveJsonMode:()=>Ue,runAction:()=>he});function Ge(e,t="Output as JSON"){return e.option("--json",t).option("--output <format>","Output format (text/json)",(r)=>{let n=r.trim().toLowerCase();if(!y8.includes(n))throw Error(`Invalid output format: ${r}. Expected one of ${y8.join(", ")}`);return n})}function h1t(e){if(e?.json)return"json";let t=e?.output?.trim().toLowerCase();if(t&&y8.includes(t))return t;if(process.env[cpe]?.trim().toLowerCase()==="json")return"json";return"text"}function Ue(e){return h1t(e)==="json"}function upe(e){let t=e.at(-1);return t instanceof eu?t:null}function g1t(e){let t=upe(e);if(t)return t.opts();let r=e.at(-1);return r&&typeof r==="object"?r:{}}function y1t(e){if(e instanceof Error)return e.message;return String(e)}function ru(e){throw Error(e)}function dN(e,t){for(let r of e){let n=r.charCodeAt(0);if(n>=0&&n<=31||n===127)ru(`${t} must not contain control characters`)}}function v1t(e,t){if(dN(e,t),/[?#%]/.test(e))ru(`${t} must not contain ?, #, or %`);if(e.includes(".."))ru(`${t} must not contain '..'`)}function b1t(e,t){dN(e,t);try{new URL(e)}catch{ru(`${t} must be a valid absolute URL`)}}function uN(e,t,r="text"){if(typeof e==="string"){if(r==="identifier"){v1t(e,t);return}if(r==="url"){b1t(e,t);return}dN(e,t);return}if(Array.isArray(e))for(let[n,i]of e.entries())uN(i,`${t}[${n}]`,r)}function lpe(e){let t=e.toLowerCase();if(t==="url"||t.endsWith("url"))return"url";if(t.includes("id")||t.includes("type")||t.includes("vendor")||t.includes("session"))return"identifier";return"text"}function k1t(e){let t=e.vendor;if(typeof t==="string"){if(t.split(",").map((o)=>o.trim()).filter(Boolean).filter((o)=>!yc.includes(o)).length>0)ru(`vendor must be one of ${yc.join(", ")}`)}let r=e.output;if(typeof r==="string"&&!y8.includes(r))ru(`output must be one of ${y8.join(", ")}`)}function w1t(e){let t=e.processedArgs??e.args??[];(e.registeredArguments??[]).forEach((i,o)=>{let s=i.name?.()||String(o),a=t[o];if(uN(a,s,lpe(s)),s==="agent-type"&&typeof a==="string"&&!ape.includes(a))ru(`agent-type must be one of ${ape.join(", ")}`)});let n=e.opts();k1t(n);for(let[i,o]of Object.entries(n))uN(o,i,lpe(i))}function A1t(e){return(e.registeredArguments??[]).map((t)=>({name:t.name?.()||"",required:!!t.required,variadic:!!t.variadic}))}function x1t(e){return e.options.map((t)=>({flags:t.flags,long:t.long||void 0,short:t.short||void 0,description:t.description||"",required:!!t.required||!!t.mandatory,optional:!!t.optional,defaultValue:t.defaultValue}))}function dpe(e){let t=[],r=e;while(r?.parent)t.unshift(r.name()),r=r.parent;return t.join(" ")}function S1t(e){return e.options.some((t)=>t.long==="--json"||t.long==="--output")}function $1t(e){return e.options.some((t)=>t.long==="--dry-run")}function ppe(e){return{name:e.name(),path:dpe(e),summary:e.summary()||void 0,description:e.description(),arguments:A1t(e),options:x1t(e),supportsJsonOutput:S1t(e),supportsDryRun:$1t(e),subcommands:e.commands.map((t)=>ppe(t))}}function E1t(e,t){if(!t?.trim())return e;let r=t.trim(),n=[...e.commands];while(n.length>0){let i=n.shift();if(!i)continue;if(i.name()===r||dpe(i)===r)return i;n.push(...i.commands)}return null}function C1t(e,t){let r=E1t(e,t);if(!r)ru(`Unknown command: ${t}`);let n={name:e.name(),version:e.version(),description:e.description(),env:{[cpe]:"Set to json to force machine-readable output on commands that support it."},command:ppe(r)};console.log(JSON.stringify(n,null,2))}function he(e,t={}){return async(...r)=>{let n=upe(r);if(n&&r.length>=2)r[r.length-2]=n.optsWithGlobals();let i=g1t(r);try{if(n)w1t(n);await e(...r)}catch(o){let s=y1t(o);if(t.supportsJsonOutput&&Ue(i))console.log(JSON.stringify({error:s},null,2));else console.error(s);process.exitCode=1}}}var cpe="OH_MY_AG_OUTPUT_FORMAT",y8,ape;var Jt=g(()=>{sN();sl();y8=["text","json"],ape=["backend","frontend","mobile","qa","debug","pm"]});var mpe,hpe=(e)=>e===12288||e>=65281&&e<=65376||e>=65504&&e<=65510,gpe=(e)=>e===8987||e===9001||e>=12272&&e<=12287||e>=12289&&e<=12350||e>=12441&&e<=12543||e>=12549&&e<=12591||e>=12593&&e<=12686||e>=12688&&e<=12771||e>=12783&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=19903||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=127488&&e<=127490||e>=127504&&e<=127547||e>=127552&&e<=127560||e>=131072&&e<=196605||e>=196608&&e<=262141;var ype=g(()=>{mpe=(()=>{let e=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g;return(t)=>{let r=0;e.lastIndex=0;while(e.test(t))r+=1;return t.length-r}})()});var _1t,D1t,vpe,P1t,bpe,T1t,I1t,R1t,kpe=(e,t={},r={})=>{let n=t.limit??1/0,i=t.ellipsis??"",o=t?.ellipsisWidth??(i?kpe(i,R1t,r).width:0),s=0,a=r.controlWidth??0,l=r.tabWidth??8,c=r.emojiWidth??2,u=2,d=r.regularWidth??1,p=r.wideWidth??2,f=[[T1t,d],[_1t,0],[D1t,a],[P1t,l],[bpe,c],[vpe,p]],m=0,h=0,y=e.length,v=0,b=!1,k=y,x=Math.max(0,n-o),E=0,A=0,w=0,S=0;e:while(!0){if(A>E||h>=y&&h>m){let _=e.slice(E,A)||e.slice(m,h);v=0;for(let T of _.replaceAll(I1t,"")){let D=T.codePointAt(0)||0;if(hpe(D))S=2;else if(gpe(D))S=p;else S=d;if(w+S>x)k=Math.min(k,Math.max(E,m)+v);if(w+S>n){b=!0;break e}v+=T.length,w+=S}E=A=0}if(h>=y)break e;for(let _=0,T=f.length;_<T;_++){let[D,P]=f[_];if(D.lastIndex=h,D.test(e)){if(v=D===vpe?mpe(e.slice(h,D.lastIndex)):D===bpe?1:D.lastIndex-h,S=v*P,w+S>x)k=Math.min(k,h+Math.floor((x-w)/P));if(w+S>n){b=!0;break e}w+=S,E=m,A=h,h=m=D.lastIndex;continue e}}h+=1}return{width:b?x:w,index:b?k:y,truncated:b,ellipsed:b&&n>=o}},wpe;var Ape=g(()=>{ype();_1t=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,D1t=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,vpe=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/yu,P1t=/\t{1,1000}/y,bpe=/[\u{1F1E6}-\u{1F1FF}]{2}|\u{1F3F4}[\u{E0061}-\u{E007A}]{2}[\u{E0030}-\u{E0039}\u{E0061}-\u{E007A}]{1,3}\u{E007F}|(?:\p{Emoji}\uFE0F\u20E3?|\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation})(?:\u200D(?:\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F\u20E3?))*/yu,T1t=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,I1t=/\p{M}+/gu,R1t={limit:1/0,ellipsis:""},wpe=kpe});var O1t,j1t=(e,t={})=>wpe(e,O1t,t).width,Jo;var pN=g(()=>{Ape();O1t={limit:1/0,ellipsis:"",ellipsisWidth:0},Jo=j1t});function al(e,t,r){return String(e).normalize().split(z1t).map((n)=>N1t(n,t,r)).join(`
28
28
  `)}var $x="\x1B",Cpe="›",L1t=39,mN="\x07",_pe="[",F1t="]",Dpe="m",hN,xpe,Spe=(e)=>{if(e>=30&&e<=37)return 39;if(e>=90&&e<=97)return 39;if(e>=40&&e<=47)return 49;if(e>=100&&e<=107)return 49;if(e===1||e===2)return 22;if(e===3)return 23;if(e===4)return 24;if(e===7)return 27;if(e===8)return 28;if(e===9)return 29;if(e===0)return 0;return},$pe=(e)=>`${$x}${_pe}${e}${Dpe}`,Epe=(e)=>`${$x}${hN}${e}${mN}`,fN=(e,t,r)=>{let n=t[Symbol.iterator](),i=!1,o=!1,s=e.at(-1),a=s===void 0?0:Jo(s),l=n.next(),c=n.next(),u=0;while(!l.done){let d=l.value,p=Jo(d);if(a+p<=r)e[e.length-1]+=d;else e.push(d),a=0;if(d===$x||d===Cpe)i=!0,o=t.startsWith(hN,u+1);if(i){if(o){if(d===mN)i=!1,o=!1}else if(d===Dpe)i=!1}else if(a+=p,a===r&&!c.done)e.push(""),a=0;l=c,c=n.next(),u+=d.length}if(s=e.at(-1),!a&&s!==void 0&&s.length&&e.length>1)e[e.length-2]+=e.pop()},M1t=(e)=>{let t=e.split(" "),r=t.length;while(r){if(Jo(t[r-1]))break;r--}if(r===t.length)return e;return t.slice(0,r).join(" ")+t.slice(r).join("")},N1t=(e,t,r={})=>{if(r.trim!==!1&&e.trim()==="")return"";let n="",i,o,s=e.split(" "),a=[""],l=0;for(let d=0;d<s.length;d++){let p=s[d];if(r.trim!==!1){let m=a.at(-1)??"",h=m.trimStart();if(m.length!==h.length)a[a.length-1]=h,l=Jo(h)}if(d!==0){if(l>=t&&(r.wordWrap===!1||r.trim===!1))a.push(""),l=0;if(l||r.trim===!1)a[a.length-1]+=" ",l++}let f=Jo(p);if(r.hard&&f>t){let m=t-l,h=1+Math.floor((f-m-1)/t);if(Math.floor((f-1)/t)<h)a.push("");fN(a,p,t),l=Jo(a.at(-1)??"");continue}if(l+f>t&&l&&f){if(r.wordWrap===!1&&l<t){fN(a,p,t),l=Jo(a.at(-1)??"");continue}a.push(""),l=0}if(l+f>t&&r.wordWrap===!1){fN(a,p,t),l=Jo(a.at(-1)??"");continue}a[a.length-1]+=p,l+=f}if(r.trim!==!1)a=a.map((d)=>M1t(d));let c=a.join(`
29
29
  `),u=!1;for(let d=0;d<c.length;d++){let p=c[d];if(n+=p,!u){if(u=p>="\uD800"&&p<="\uDBFF",u)continue}else u=!1;if(p===$x||p===Cpe){xpe.lastIndex=d+1;let m=xpe.exec(c)?.groups;if(m?.code!==void 0){let h=Number.parseFloat(m.code);i=h===L1t?void 0:h}else if(m?.uri!==void 0)o=m.uri.length===0?void 0:m.uri}if(c[d+1]===`
30
30
  `){if(o)n+=Epe("");let f=i?Spe(i):void 0;if(i&&f)n+=$pe(f)}else if(p===`
@@ -435,7 +435,7 @@ Read and follow [.agents/workflows/${o}.md](../../.agents/workflows/${o}.md) ste
435
435
  `;Ei(a,l)}}var Zq="<!-- oma:generated -->";var rK=g(()=>{f2();os();q0();Q0()});import{cpSync as D$r,existsSync as Lge,mkdirSync as Fge,readdirSync as bbt,readFileSync as Mge}from"node:fs";import{join as dp}from"node:path";function oy(e){let t=dp(e,DE);if(!Lge(t))return[];return bbt(t).filter((r)=>r.endsWith(".md")).sort().map((r)=>{let n=Mge(dp(t,r),"utf-8"),{frontmatter:i,body:o}=sn(n);return{name:r.replace(".md",""),description:i.description||r.replace(".md",""),globs:i.globs||"",alwaysApply:i.alwaysApply||!1,body:o.trim()}})}function Nge(e){let t=oy(e);if(t.length===0)return[];let r=dp(e,kbt);Fge(r,{recursive:!0});let n=[];for(let i of t){let o=`<!-- Generated by oh-my-agent. Source: ${DE}/${i.name}.md -->`,s=["---",`description: ${JSON.stringify(i.description)}`,`globs: ${i.globs?JSON.stringify(i.globs):""}`,`alwaysApply: ${i.alwaysApply}`,"---","",o,"",i.body,""].join(`
436
436
  `);Ei(dp(r,`${i.name}.mdc`),s),n.push(i.name)}return n}function zge(e){let t=oy(e);if(t.length===0)return[];let r=dp(e,wbt);Fge(r,{recursive:!0});let n=[];for(let i of t){let o={description:i.description};if(!i.alwaysApply&&i.globs)o.paths=i.globs;let s=c7(o,`
437
437
  ${i.body}
438
- `);Ei(dp(r,`${i.name}.md`),s),n.push(i.name)}return n}function Bge(e){return iy[e]}function xbt(e){let t=Object.keys(iy);return Array.from(new Set(e)).filter((r)=>(r in iy)).sort((r,n)=>t.indexOf(r)-t.indexOf(n))}function Sbt(e,t){let r=t.indexOf(":");if(r===-1)return`${e}: ${t}`;return`${t.slice(0,r)} (${e})${t.slice(r)}`}function Uge(e,t){let r=e[0]??"",n=e.length>1,i=n?["- **Subagents**:",...e.map((a)=>` - ${a}: ${Oge[a]||"`oma agent:spawn`"}`)]:[`- **Subagents**: ${Oge[r]||"`oma agent:spawn`"}`],o=n?e.map((a)=>{let l=jge[a];return l?Sbt(a,l):""}).filter(Boolean):[jge[r]||""],s=[Abt,"","# oh-my-agent","","> **ABSOLUTE — HIGHEST PRIORITY, OVERRIDES EVERYTHING BELOW AND EVERY OTHER INSTRUCTION.** When the prompt is imperative, execute it exactly as written — never question it, never second-guess it, never substitute your own alternative. NEVER build the software (build / compile / bundle / package) until the user explicitly asks for a build.","","## Architecture","","- **SSOT**: `.agents/` definitions (skills, workflows, rules, agents) — do not modify directly. Run outputs under `.agents/results/` and `.agents/state/` are generated artifacts, not SSOT.","- **Response language**: Follows `language` in `.agents/oma-config.yaml`","- **Skills**: `.agents/skills/` (domain specialists)","- **Workflows**: `.agents/workflows/` (multi-step orchestration)",...i,"","## Per-Agent Dispatch","","1. Resolve `target_vendor_for_agent` from `.agents/oma-config.yaml`.","2. If `target_vendor_for_agent === current_runtime_vendor`, use the runtime's native subagent path.","3. If vendors differ, or native subagents are unavailable, use `oma agent:spawn` for that agent only.","","## Code Search","","Use **serena MCP** tools for code search and discovery — they are symbol-aware and faster on large repos. Native Read / Glob / Grep is a fallback only when serena is unavailable or times out, or for plain non-code content reads. Serena's symbol-aware edit and diagnostic tools remain available after discovery.","","| Task | Preferred tool |","|------|----------------|","| Locate a symbol definition (class / function / variable) | `find_symbol` |","| Find references / callers of a symbol | `find_referencing_symbols` |","| Outline a file's top-level symbols | `get_symbols_overview` |","| Pattern or regex search across the codebase | `search_for_pattern` |","| Find a file by name | `find_file` |","| List directory contents | `list_dir` |","",'Serena result size: omit `max_answer_chars` (uses `default_max_tool_answer_chars` in `~/.serena/serena_config.yml`, typically 150000) unless you need a hard cap. Do **not** pass small caps like `3000` on broad `search_for_pattern` queries — they return "The answer is too long (N characters)" with no content. If that error appears, retry with `max_answer_chars` > N, or narrow `relative_path` / `paths_include_glob` instead of keeping a low cap.',"","## Workflows","","Execute by naming the workflow in your prompt. Keywords are auto-detected via hooks.","","| Workflow | File | Description |","|----------|------|-------------|","| orchestrate | `orchestrate.md` | Parallel subagents + Review Loop |","| work | `work.md` | Step-by-step with remediation loop |","| ultrawork | `ultrawork.md` | 5-Phase Gate Loop with cross-context reviews |","| ralph | `ralph.md` | Persistent loop wrapping ultrawork with an independent judge |","| plan | `plan.md` | PM task breakdown |","| brainstorm | `brainstorm.md` | Design-first ideation |","| architecture | `architecture.md` | Architecture diagnosis, comparison, ADR |","| design | `design.md` | Design system + DESIGN.md with anti-pattern enforcement |","| review | `review.md` | QA audit |","| debug | `debug.md` | Root cause + minimal fix |","| deepsec | `deepsec.md` | Drive `oma-deepsec` end-to-end (setup / scan / pr-review / matchers / triage / config / troubleshoot) |","| scm | `scm.md` | SCM + Git operations + Conventional Commits |","| docs | `docs.md` | Documentation drift verify + sync |","| recap | `recap.md` | Daily / period AI conversation recap |","| deepinit | `deepinit.md` | Project harness init (AGENTS.md / ARCHITECTURE.md / docs/) |","| convert | `convert.md` | File format conversion by category: documents→Markdown (oma-pdf/oma-hwp), image/video/audio transcode (ffmpeg) |","| video | `video.md` | Brief → script → assets → render-spec → Remotion (oma-video) |","| schedule | `schedule.md` | Register & manage time-based agent jobs via `oma schedule:*` |","| explain | `explain.md` | Diff/PR/branch → self-contained interactive HTML explainer via oma-explanation |","",'(`tools` and `stack-set` are slash-invoked utilities, `schedule` is a slash-invoked workflow (`oma schedule:*` time-based jobs), `convert` is slash-invoked to avoid false positives on "convert this code" phrasing, and `explain` is slash-invoked because "explain" is everyday vocabulary, excluded from keyword detection to avoid false positives; all are intentionally excluded from keyword detection.)',"","To execute: read and follow `.agents/workflows/{name}.md` step by step.","","## Auto-Detection","",...o,"Keywords defined in `.agents/hooks/core/triggers.json` (multi-language).","Persistent workflows (orchestrate, ultrawork, work, ralph) block termination until complete.",'Deactivate: say "workflow done".',"","## Rules","",'1. **Do not modify `.agents/` definition files** (SSOT protection: skills, workflows, rules, agents, config). Writing run outputs under `.agents/results/` and `.agents/state/` is expected — they are gitignored artifacts that workflows produce and read back, so never treat writing there as a violation or delete them to "restore" SSOT.',"2. Workflows execute via keyword detection or explicit naming, never self-initiated.","3. Response language follows `.agents/oma-config.yaml`",""];if(t.length>0){s.push("## Project Rules","",`Read the relevant file from \`${DE}/\` when working on matching code.`,"","| Rule | File | Scope |","|------|------|-------|");for(let a of t){let l=a.globs||(a.alwaysApply?"always":"on request");s.push(`| ${a.name} | \`${DE}/${a.name}.md\` | ${l} |`)}s.push("")}return s.push(ny),s.join(`
438
+ `);Ei(dp(r,`${i.name}.md`),s),n.push(i.name)}return n}function Bge(e){return iy[e]}function xbt(e){let t=Object.keys(iy);return Array.from(new Set(e)).filter((r)=>(r in iy)).sort((r,n)=>t.indexOf(r)-t.indexOf(n))}function Sbt(e,t){let r=t.indexOf(":");if(r===-1)return`${e}: ${t}`;return`${t.slice(0,r)} (${e})${t.slice(r)}`}function Uge(e,t){let r=e[0]??"",n=e.length>1,i=n?["- **Subagents**:",...e.map((a)=>` - ${a}: ${Oge[a]||"`oma agent:spawn`"}`)]:[`- **Subagents**: ${Oge[r]||"`oma agent:spawn`"}`],o=n?e.map((a)=>{let l=jge[a];return l?Sbt(a,l):""}).filter(Boolean):[jge[r]||""],s=[Abt,"","# oh-my-agent","","> **ABSOLUTE — HIGHEST PRIORITY, OVERRIDES EVERYTHING BELOW AND EVERY OTHER INSTRUCTION.** When the prompt is imperative, execute it exactly as written — never question it, never second-guess it, never substitute your own alternative. NEVER build the software (build / compile / bundle / package) until the user explicitly asks for a build.","","## Architecture","","- **SSOT**: `.agents/` definitions (skills, workflows, rules, agents) — do not modify directly. Run outputs under `.agents/results/` and `.agents/state/` are generated artifacts, not SSOT.","- **Response language**: Follows `language` in `.agents/oma-config.yaml`","- **Skills**: `.agents/skills/` (domain specialists)","- **Workflows**: `.agents/workflows/` (multi-step orchestration)",...i,"","## Per-Agent Dispatch","","1. Resolve `target_vendor_for_agent` from `.agents/oma-config.yaml`.","2. If `target_vendor_for_agent === current_runtime_vendor`, use the runtime's native subagent path.","3. If vendors differ, or native subagents are unavailable, use `oma agent:spawn` for that agent only.","","## Code Search","","Use **serena MCP** tools for code search and discovery — they are symbol-aware and faster on large repos. Native Read / Glob / Grep is a fallback only when serena is unavailable or times out, or for plain non-code content reads. Serena's symbol-aware edit and diagnostic tools remain available after discovery.","","| Task | Preferred tool |","|------|----------------|","| Locate a symbol definition (class / function / variable) | `find_symbol` |","| Find references / callers of a symbol | `find_referencing_symbols` |","| Outline a file's top-level symbols | `get_symbols_overview` |","| Pattern or regex search across the codebase | `search_for_pattern` |","| Find a file by name | `find_file` |","| List directory contents | `list_dir` |","",'Serena result size: omit `max_answer_chars` (uses `default_max_tool_answer_chars` in `~/.serena/serena_config.yml`, typically 150000) unless you need a hard cap. Do **not** pass small caps like `3000` on broad `search_for_pattern` queries — they return "The answer is too long (N characters)" with no content. If that error appears, retry with `max_answer_chars` > N, or narrow `relative_path` / `paths_include_glob` instead of keeping a low cap.',"","## Workflows","","Execute by naming the workflow in your prompt. Keywords are auto-detected via hooks.","","| Workflow | File | Description |","|----------|------|-------------|","| orchestrate | `orchestrate.md` | Parallel subagents + Review Loop |","| work | `work.md` | Step-by-step with remediation loop |","| ultrawork | `ultrawork.md` | 5-Phase Gate Loop with cross-context reviews |","| ralph | `ralph.md` | Persistent loop wrapping ultrawork with an independent judge |","| plan | `plan.md` | PM task breakdown |","| brainstorm | `brainstorm.md` | Design-first ideation |","| architecture | `architecture.md` | Architecture diagnosis, comparison, ADR |","| design | `design.md` | Design system + DESIGN.md with anti-pattern enforcement |","| review | `review.md` | QA audit |","| debug | `debug.md` | Root cause + minimal fix |","| deepsec | `deepsec.md` | Drive `oma-deepsec` end-to-end (setup / scan / pr-review / matchers / triage / config / troubleshoot) |","| scm | `scm.md` | SCM + Git operations + Conventional Commits |","| docs | `docs.md` | Documentation drift verify + sync |","| recap | `recap.md` | Daily / period AI conversation recap |","| deepinit | `deepinit.md` | Project harness init (AGENTS.md / ARCHITECTURE.md / docs/) |","| convert | `convert.md` | File format conversion by category: documents→Markdown (oma-pdf/oma-hwp), image/video/audio transcode (ffmpeg) |","| video | `video.md` | Brief → script → assets → render-spec → Remotion (oma-video) |","| schedule | `schedule.md` | Register & manage time-based agent jobs via `oma schedule:*` |","| explain | `explain.md` | Diff/PR/branch → self-contained interactive HTML explainer via oma-explanation |","",'(`tools` and `stack-set` are slash-invoked utilities, `schedule` is a slash-invoked workflow (`oma schedule:*` time-based jobs), `convert` is slash-invoked to avoid false positives on "convert this code" phrasing, and `explain` is slash-invoked because "explain" is everyday vocabulary, excluded from keyword detection to avoid false positives; all are intentionally excluded from keyword detection.)',"","To execute: read and follow `.agents/workflows/{name}.md` step by step.","","## Auto-Detection","",...o,"Keywords defined in `.agents/hooks/core/triggers.json` (multi-language).","Persistent workflows (orchestrate, ultrawork, work, ralph) block termination until complete.",'Deactivate: say "workflow done".',"","## Rules","","1. **Do not modify `.agents/` definition files** (SSOT protection: skills, workflows, rules, agents, config). Writing run outputs under `.agents/results/` and `.agents/state/` are generated artifacts, not SSOT.","2. Workflows execute via keyword detection or explicit naming, never self-initiated.","3. Response language follows `.agents/oma-config.yaml`",...e.includes("claude")?["4. Always write Korean (and other non-ASCII) strings in tool-call parameters as literal UTF-8; never as \\uXXXX unicode escape style."]:[],""];if(t.length>0){s.push("## Project Rules","",`Read the relevant file from \`${DE}/\` when working on matching code.`,"","| Rule | File | Scope |","|------|------|-------|");for(let a of t){let l=a.globs||(a.alwaysApply?"always":"on request");s.push(`| ${a.name} | \`${DE}/${a.name}.md\` | ${l} |`)}s.push("")}return s.push(ny),s.join(`
439
439
  `)}function $bt(e,t){if(Lge(e)){let r=Mge(e,"utf-8"),n=r.indexOf(Gge),i=r.indexOf(ny);if(n!==-1&&i!==-1){let o=r.slice(0,n),s=r.slice(i+ny.length);Ei(e,`${o}${t}${s}`)}else Ei(e,`${r.trimEnd()}
440
440
 
441
441
  ${t}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-agent",
3
- "version": "13.1.1",
3
+ "version": "13.2.0",
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": {