oh-my-agent 10.3.0 → 10.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +2 -2
- package/package.json +1 -1
package/bin/cli.js
CHANGED
|
@@ -24,7 +24,7 @@ Expecting one of '${G.join("', '")}'`);if(this._lifeCycleHooks[$])this._lifeCycl
|
|
|
24
24
|
`),this.outputHelp({error:!0});let G=z||{},J=G.exitCode||1,Q=G.code||"commander.error";this._exit(J,Q,$)}_parseOptionsEnv(){this.options.forEach(($)=>{if($.envVar&&$.envVar in y4.env){let z=$.attributeName();if(this.getOptionValue(z)===void 0||["default","config","env"].includes(this.getOptionValueSource(z)))if($.required||$.optional)this.emit(`optionEnv:${$.name()}`,y4.env[$.envVar]);else this.emit(`optionEnv:${$.name()}`)}})}_parseOptionsImplied(){let $=new sq5(this.options),z=(G)=>{return this.getOptionValue(G)!==void 0&&!["default","implied"].includes(this.getOptionValueSource(G))};this.options.filter((G)=>G.implied!==void 0&&z(G.attributeName())&&$.valueFromOption(this.getOptionValue(G.attributeName()),G)).forEach((G)=>{Object.keys(G.implied).filter((J)=>!z(J)).forEach((J)=>{this.setOptionValueWithSource(J,G.implied[J],"implied")})})}missingArgument($){let z=`error: missing required argument '${$}'`;this.error(z,{code:"commander.missingArgument"})}optionMissingArgument($){let z=`error: option '${$.flags}' argument missing`;this.error(z,{code:"commander.optionMissingArgument"})}missingMandatoryOptionValue($){let z=`error: required option '${$.flags}' not specified`;this.error(z,{code:"commander.missingMandatoryOptionValue"})}_conflictingOption($,z){let G=(K)=>{let Z=K.attributeName(),U=this.getOptionValue(Z),W=this.options.find((V)=>V.negate&&Z===V.attributeName()),Y=this.options.find((V)=>!V.negate&&Z===V.attributeName());if(W&&(W.presetArg===void 0&&U===!1||W.presetArg!==void 0&&U===W.presetArg))return W;return Y||K},J=(K)=>{let Z=G(K),U=Z.attributeName();if(this.getOptionValueSource(U)==="env")return`environment variable '${Z.envVar}'`;return`option '${Z.flags}'`},Q=`error: ${J($)} cannot be used with ${J(z)}`;this.error(Q,{code:"commander.conflictingOption"})}unknownOption($){if(this._allowUnknownOption)return;let z="";if($.startsWith("--")&&this._showSuggestionAfterError){let J=[],Q=this;do{let K=Q.createHelp().visibleOptions(Q).filter((Z)=>Z.long).map((Z)=>Z.long);J=J.concat(K),Q=Q.parent}while(Q&&!Q._enablePositionalOptions);z=SU2($,J)}let G=`error: unknown option '${$}'${z}`;this.error(G,{code:"commander.unknownOption"})}_excessArguments($){if(this._allowExcessArguments)return;let z=this.registeredArguments.length,G=z===1?"":"s",Q=`error: too many arguments${this.parent?` for '${this.name()}'`:""}. Expected ${z} argument${G} but got ${$.length}.`;this.error(Q,{code:"commander.excessArguments"})}unknownCommand(){let $=this.args[0],z="";if(this._showSuggestionAfterError){let J=[];this.createHelp().visibleCommands(this).forEach((Q)=>{if(J.push(Q.name()),Q.alias())J.push(Q.alias())}),z=SU2($,J)}let G=`error: unknown command '${$}'${z}`;this.error(G,{code:"commander.unknownCommand"})}version($,z,G){if($===void 0)return this._version;this._version=$,z=z||"-V, --version",G=G||"output the version number";let J=this.createOption(z,G);return this._versionOptionName=J.attributeName(),this._registerOption(J),this.on("option:"+J.name(),()=>{this._outputConfiguration.writeOut(`${$}
|
|
25
25
|
`),this._exit(0,"commander.version",$)}),this}description($,z){if($===void 0&&z===void 0)return this._description;if(this._description=$,z)this._argsDescription=z;return this}summary($){if($===void 0)return this._summary;return this._summary=$,this}alias($){if($===void 0)return this._aliases[0];let z=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler)z=this.commands[this.commands.length-1];if($===z._name)throw Error("Command alias can't be the same as its name");let G=this.parent?._findCommand($);if(G){let J=[G.name()].concat(G.aliases()).join("|");throw Error(`cannot add alias '${$}' to command '${this.name()}' as already have command '${J}'`)}return z._aliases.push($),this}aliases($){if($===void 0)return this._aliases;return $.forEach((z)=>this.alias(z)),this}usage($){if($===void 0){if(this._usage)return this._usage;let z=this.registeredArguments.map((G)=>{return aq5(G)});return[].concat(this.options.length||this._helpOption!==null?"[options]":[],this.commands.length?"[command]":[],this.registeredArguments.length?z:[]).join(" ")}return this._usage=$,this}name($){if($===void 0)return this._name;return this._name=$,this}helpGroup($){if($===void 0)return this._helpGroupHeading??"";return this._helpGroupHeading=$,this}commandsGroup($){if($===void 0)return this._defaultCommandGroup??"";return this._defaultCommandGroup=$,this}optionsGroup($){if($===void 0)return this._defaultOptionGroup??"";return this._defaultOptionGroup=$,this}_initOptionGroup($){if(this._defaultOptionGroup&&!$.helpGroupHeading)$.helpGroup(this._defaultOptionGroup)}_initCommandGroup($){if(this._defaultCommandGroup&&!$.helpGroup())$.helpGroup(this._defaultCommandGroup)}nameFromFilename($){return this._name=lz.basename($,lz.extname($)),this}executableDir($){if($===void 0)return this._executableDir;return this._executableDir=$,this}helpInformation($){let z=this.createHelp(),G=this._getOutputContext($);z.prepareContext({error:G.error,helpWidth:G.helpWidth,outputHasColors:G.hasColors});let J=z.formatHelp(this,z);if(G.hasColors)return J;return this._outputConfiguration.stripColor(J)}_getOutputContext($){$=$||{};let z=!!$.error,G,J,Q;if(z)G=(Z)=>this._outputConfiguration.writeErr(Z),J=this._outputConfiguration.getErrHasColors(),Q=this._outputConfiguration.getErrHelpWidth();else G=(Z)=>this._outputConfiguration.writeOut(Z),J=this._outputConfiguration.getOutHasColors(),Q=this._outputConfiguration.getOutHelpWidth();return{error:z,write:(Z)=>{if(!J)Z=this._outputConfiguration.stripColor(Z);return G(Z)},hasColors:J,helpWidth:Q}}outputHelp($){let z;if(typeof $==="function")z=$,$=void 0;let G=this._getOutputContext($),J={error:G.error,write:G.write,command:this};this._getCommandAndAncestors().reverse().forEach((K)=>K.emit("beforeAllHelp",J)),this.emit("beforeHelp",J);let Q=this.helpInformation({error:G.error});if(z){if(Q=z(Q),typeof Q!=="string"&&!Buffer.isBuffer(Q))throw Error("outputHelp callback must return a string or a Buffer")}if(G.write(Q),this._getHelpOption()?.long)this.emit(this._getHelpOption().long);this.emit("afterHelp",J),this._getCommandAndAncestors().forEach((K)=>K.emit("afterAllHelp",J))}helpOption($,z){if(typeof $==="boolean"){if($){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($??"-h, --help",z??"display help for command"),$||z)this._initOptionGroup(this._helpOption);return this}_getHelpOption(){if(this._helpOption===void 0)this.helpOption(void 0,void 0);return this._helpOption}addHelpOption($){return this._helpOption=$,this._initOptionGroup($),this}help($){this.outputHelp($);let z=Number(y4.exitCode??0);if(z===0&&$&&typeof $!=="function"&&$.error)z=1;this._exit(z,"commander.help","(outputHelp)")}addHelpText($,z){let G=["beforeAll","before","after","afterAll"];if(!G.includes($))throw Error(`Unexpected value for position to addHelpText.
|
|
26
26
|
Expecting one of '${G.join("', '")}'`);let J=`${$}Help`;return this.on(J,(Q)=>{let K;if(typeof z==="function")K=z({error:Q.error,command:Q.command});else K=z;if(K)Q.write(`${K}
|
|
27
|
-
`)}),this}_outputHelpIfRequested($){let z=this._getHelpOption();if(z&&$.find((J)=>z.is(J)))this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)")}}function xU2($){return $.map((z)=>{if(!z.startsWith("--inspect"))return z;let G,J="127.0.0.1",Q="9229",K;if((K=z.match(/^(--inspect(-brk)?)$/))!==null)G=K[1];else if((K=z.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null)if(G=K[1],/^\d+$/.test(K[3]))Q=K[3];else J=K[3];else if((K=z.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null)G=K[1],J=K[3],Q=K[4];if(G&&Q!=="0")return`${G}=${J}:${parseInt(Q)+1}`;return z})}function oh(){if(y4.env.NO_COLOR||y4.env.FORCE_COLOR==="0"||y4.env.FORCE_COLOR==="false")return!1;if(y4.env.FORCE_COLOR||y4.env.CLICOLOR_FORCE!==void 0)return!0;return}tq5.Command=rh;tq5.useColor=oh});var fU2=P((JF5)=>{var{Argument:uU2}=GR(),{Command:sh}=yU2(),{CommanderError:zF5,InvalidArgumentError:gU2}=xq(),{Help:GF5}=dh(),{Option:hU2}=ph();JF5.program=new sh;JF5.createCommand=($)=>new sh($);JF5.createOption=($,z)=>new hU2($,z);JF5.createArgument=($,z)=>new uU2($,z);JF5.Command=sh;JF5.Option=hU2;JF5.Argument=uU2;JF5.Help=GF5;JF5.CommanderError=zF5;JF5.InvalidArgumentError=gU2;JF5.InvalidOptionArgumentError=gU2});var mU2,oi4,ri4,si4,ti4,ei4,$l4,zl4,QR,Gl4,Jl4,Ql4;var th=N(()=>{mU2=E2(fU2(),1),{program:oi4,createCommand:ri4,createArgument:si4,createOption:ti4,CommanderError:ei4,InvalidArgumentError:$l4,InvalidOptionArgumentError:zl4,Command:QR,Argument:Gl4,Option:Jl4,Help:Ql4}=mU2.default});var KR;var eh=N(()=>{KR={name:"oh-my-agent",version:"10.3.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",test:"vitest run","test:coverage":"vitest run --coverage",prepublishOnly:"bun run build"},dependencies:{"@clack/prompts":"^1.1.0","@date-fns/tz":"^1.4.1","@napi-rs/keyring":"^1.3.0",axios:"^1.15.0","better-sqlite3":"^12.9.0",chokidar:"^5.0.0",commander:"^14.0.3","date-fns":"^4.2.1",eld:"^2.0.3","fast-xml-parser":"^5",minimatch:"^10.2.5","p-map":"^7.0.4",picocolors:"^1.1.1","puppeteer-core":"^24",remark:"^15.0.1","remark-frontmatter":"^5.0.0","remark-parse":"^11.0.0","smol-toml":"^1.6.1",unified:"^11.0.5",ws:"^8.18.0",yaml:"^2.8.2",zod:"^4.3.6"},optionalDependencies:{pptxgenjs:"^3.12.0"},devDependencies:{"@biomejs/biome":"^2.4.15","@types/better-sqlite3":"^7.6.13","@types/mdast":"^4.0.4","@types/node":"^24","@types/ws":"^8.18.1","@vitest/coverage-v8":"^4.1.4",typescript:"^6",vitest:"^4.0.18"},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-orchestrator","oma-dev-workflow","oma-tf-infra","oma-scm","oma-pdf","oma-recap"]}}});import*as OY from"node:fs";import{homedir as FF5}from"node:os";import*as yq from"node:path";function iU2($){if(ZR)throw Error("install context already set in this process");ZR=$}function lU2(){if(ZR===null)throw Error("install context not set — entry point must call setInstallContext()");return ZR}function IY(){return lU2().installRoot}function t7(){return lU2().mode}function UR(){try{return t7()}catch{return"project"}}function dU2($){let z=process.env.OMA_HOME,G=$.global===!0||process.env.OMA_INSTALL_GLOBAL==="1";if(z!==void 0&&z!=="")return kF5(z),{installRoot:z,mode:G?"global":"project"};if(G)return{installRoot:FF5(),mode:"global"};return{installRoot:process.cwd(),mode:"project"}}function kF5($){if(!yq.isAbsolute($))throw Error("OMA_HOME must be absolute path");for(let G of cU2)if($===G||$.startsWith(G+yq.sep))throw Error(`OMA_HOME=${$} is forbidden (system path ${G})`);let z;try{z=OY.realpathSync($)}catch(G){let J=G instanceof Error?G.message:String(G);throw Error(`OMA_HOME=${$}: ${J}`)}for(let G of cU2)if(z===G||z.startsWith(G+yq.sep))throw Error(`OMA_HOME=${z} is forbidden (system path ${G})`);try{OY.accessSync(z,OY.constants.W_OK)}catch{throw Error(`OMA_HOME=${z} is not writable`)}}var ZR=null,cU2;var dz=N(()=>{cU2=["/etc","/usr","/bin","/boot","/sys","/proc"]});import{join as NF5}from"node:path";function uq($){return $.endsWith("/")?$:`${$}/`}function R7($,z){let G=z.split("/").filter((J)=>J.length>0);return NF5($,...G)}var M0=".agents",WR,v3,OJ,pU2,nU2,YR,AF5=".antigravitycli",aU2,jF5=".migration-backup",MF5,OF5,IF5,RF5,DF5,$f;var E3=N(()=>{WR=`${M0}/skills`,v3=`${M0}/results`,OJ=`${M0}/state`,pU2=`${OJ}/sessions`,nU2=`${OJ}/retry`,YR=`${OJ}/archive`,aU2=`${M0}/backup`;MF5=uq(v3),OF5=uq(OJ),IF5=uq(AF5),RF5=uq(aU2),DF5=uq(jF5),$f=[IF5,MF5,OF5,RF5,DF5]});var u1="first-fluke/oh-my-agent",e4,O0,VR,vF5,pz,s1;var nz=N(()=>{E3();e4=WR,O0=["antigravity","claude","codex","commandcode","cursor","grok","kimi","kiro","qwen"],VR=["pi","opencode"],vF5=["copilot","hermes"],pz=[...O0,...vF5].sort(),s1={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 zW2={};z5(zW2,{runAction:()=>T2,resolveJsonMode:()=>A5,printDescribe:()=>hF5,addOutputOptions:()=>j5});function j5($,z="Output as JSON"){return $.option("--json",z).option("--output <format>","Output format (text/json)",(G)=>{let J=G.trim().toLowerCase();if(!gq.includes(J))throw Error(`Invalid output format: ${G}. Expected one of ${gq.join(", ")}`);return J})}function EF5($){if($?.json)return"json";let z=$?.output?.trim().toLowerCase();if(z&&gq.includes(z))return z;if(process.env[sU2]?.trim().toLowerCase()==="json")return"json";return"text"}function A5($){return EF5($)==="json"}function tU2($){let z=$.at(-1);return z instanceof QR?z:null}function wF5($){let z=tU2($);if(z)return z.opts();let G=$.at(-1);return G&&typeof G==="object"?G:{}}function PF5($){if($ instanceof Error)return $.message;return String($)}function IJ($){throw Error($)}function Gf($,z){for(let G of $){let J=G.charCodeAt(0);if(J>=0&&J<=31||J===127)IJ(`${z} must not contain control characters`)}}function CF5($,z){if(Gf($,z),/[?#%]/.test($))IJ(`${z} must not contain ?, #, or %`);if($.includes(".."))IJ(`${z} must not contain '..'`)}function TF5($,z){Gf($,z);try{new URL($)}catch{IJ(`${z} must be a valid absolute URL`)}}function zf($,z,G="text"){if(typeof $==="string"){if(G==="identifier"){CF5($,z);return}if(G==="url"){TF5($,z);return}Gf($,z);return}if(Array.isArray($))for(let[J,Q]of $.entries())zf(Q,`${z}[${J}]`,G)}function rU2($){let z=$.toLowerCase();if(z==="url"||z.endsWith("url"))return"url";if(z.includes("id")||z.includes("type")||z.includes("vendor")||z.includes("session"))return"identifier";return"text"}function bF5($){let z=$.vendor;if(typeof z==="string"){if(z.split(",").map((K)=>K.trim()).filter(Boolean).filter((K)=>!pz.includes(K)).length>0)IJ(`vendor must be one of ${pz.join(", ")}`)}let G=$.output;if(typeof G==="string"&&!gq.includes(G))IJ(`output must be one of ${gq.join(", ")}`)}function _F5($){let z=$.processedArgs??$.args??[];($.registeredArguments??[]).forEach((Q,K)=>{let Z=Q.name?.()||String(K),U=z[K];if(zf(U,Z,rU2(Z)),Z==="agent-type"&&typeof U==="string"&&!oU2.includes(U))IJ(`agent-type must be one of ${oU2.join(", ")}`)});let J=$.opts();bF5(J);for(let[Q,K]of Object.entries(J))zf(K,Q,rU2(Q))}function SF5($){return($.registeredArguments??[]).map((z)=>({name:z.name?.()||"",required:!!z.required,variadic:!!z.variadic}))}function xF5($){return $.options.map((z)=>({flags:z.flags,long:z.long||void 0,short:z.short||void 0,description:z.description||"",required:!!z.required||!!z.mandatory,optional:!!z.optional,defaultValue:z.defaultValue}))}function eU2($){let z=[],G=$;while(G?.parent)z.unshift(G.name()),G=G.parent;return z.join(" ")}function yF5($){return $.options.some((z)=>z.long==="--json"||z.long==="--output")}function uF5($){return $.options.some((z)=>z.long==="--dry-run")}function $W2($){return{name:$.name(),path:eU2($),summary:$.summary()||void 0,description:$.description(),arguments:SF5($),options:xF5($),supportsJsonOutput:yF5($),supportsDryRun:uF5($),subcommands:$.commands.map((z)=>$W2(z))}}function gF5($,z){if(!z?.trim())return $;let G=z.trim(),J=[...$.commands];while(J.length>0){let Q=J.shift();if(!Q)continue;if(Q.name()===G||eU2(Q)===G)return Q;J.push(...Q.commands)}return null}function hF5($,z){let G=gF5($,z);if(!G)IJ(`Unknown command: ${z}`);let J={name:$.name(),version:$.version(),description:$.description(),env:{[sU2]:"Set to json to force machine-readable output on commands that support it."},command:$W2(G)};console.log(JSON.stringify(J,null,2))}function T2($,z={}){return async(...G)=>{let J=tU2(G);if(J&&G.length>=2)G[G.length-2]=J.optsWithGlobals();let Q=wF5(G);try{if(J)_F5(J);await $(...G)}catch(K){let Z=PF5(K);if(z.supportsJsonOutput&&A5(Q))console.log(JSON.stringify({error:Z},null,2));else console.error(Z);process.exitCode=1}}}var sU2="OH_MY_AG_OUTPUT_FORMAT",gq,oU2;var a4=N(()=>{th();nz();gq=["text","json"],oU2=["backend","frontend","mobile","qa","debug","pm"]});var GW2,JW2=($)=>{return $===12288||$>=65281&&$<=65376||$>=65504&&$<=65510},QW2=($)=>{return $===8987||$===9001||$>=12272&&$<=12287||$>=12289&&$<=12350||$>=12441&&$<=12543||$>=12549&&$<=12591||$>=12593&&$<=12686||$>=12688&&$<=12771||$>=12783&&$<=12830||$>=12832&&$<=12871||$>=12880&&$<=19903||$>=65040&&$<=65049||$>=65072&&$<=65106||$>=65108&&$<=65126||$>=65128&&$<=65131||$>=127488&&$<=127490||$>=127504&&$<=127547||$>=127552&&$<=127560||$>=131072&&$<=196605||$>=196608&&$<=262141};var KW2=N(()=>{GW2=(()=>{let $=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g;return(z)=>{let G=0;$.lastIndex=0;while($.test(z))G+=1;return z.length-G}})()});var fF5,mF5,ZW2,cF5,UW2,iF5,lF5,dF5,WW2=($,z={},G={})=>{let J=z.limit??1/0,Q=z.ellipsis??"",K=z?.ellipsisWidth??(Q?WW2(Q,dF5,G).width:0),Z=0,U=G.controlWidth??0,W=G.tabWidth??8,Y=G.emojiWidth??2,V=2,B=G.regularWidth??1,L=G.wideWidth??2,X=[[iF5,B],[fF5,0],[mF5,U],[cF5,W],[UW2,Y],[ZW2,L]],H=0,q=0,F=$.length,k=0,A=!1,j=F,M=Math.max(0,J-K),O=0,I=0,D=0,R=0;$:while(!0){if(I>O||q>=F&&q>H){let E=$.slice(O,I)||$.slice(H,q);k=0;for(let b of E.replaceAll(lF5,"")){let _=b.codePointAt(0)||0;if(JW2(_))R=2;else if(QW2(_))R=L;else R=B;if(D+R>M)j=Math.min(j,Math.max(O,H)+k);if(D+R>J){A=!0;break $}k+=b.length,D+=R}O=I=0}if(q>=F)break $;for(let E=0,b=X.length;E<b;E++){let[_,h]=X[E];if(_.lastIndex=q,_.test($)){if(k=_===ZW2?GW2($.slice(q,_.lastIndex)):_===UW2?1:_.lastIndex-q,R=k*h,D+R>M)j=Math.min(j,q+Math.floor((M-D)/h));if(D+R>J){A=!0;break $}D+=R,O=H,I=q,q=H=_.lastIndex;continue $}}q+=1}return{width:A?M:D,index:A?j:F,truncated:A,ellipsed:A&&J>=K}},YW2;var VW2=N(()=>{KW2();fF5=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,mF5=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,ZW2=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/yu,cF5=/\t{1,1000}/y,UW2=/[\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,iF5=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,lF5=/\p{M}+/gu,dF5={limit:1/0,ellipsis:""},YW2=WW2});var pF5,nF5=($,z={})=>{return YW2($,pF5,z).width},O6;var Jf=N(()=>{VW2();pF5={limit:1/0,ellipsis:"",ellipsisWidth:0},O6=nF5});function D$($,z,G){return String($).normalize().split(tF5).map((J)=>sF5(J,z,G)).join(`
|
|
27
|
+
`)}),this}_outputHelpIfRequested($){let z=this._getHelpOption();if(z&&$.find((J)=>z.is(J)))this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)")}}function xU2($){return $.map((z)=>{if(!z.startsWith("--inspect"))return z;let G,J="127.0.0.1",Q="9229",K;if((K=z.match(/^(--inspect(-brk)?)$/))!==null)G=K[1];else if((K=z.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null)if(G=K[1],/^\d+$/.test(K[3]))Q=K[3];else J=K[3];else if((K=z.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null)G=K[1],J=K[3],Q=K[4];if(G&&Q!=="0")return`${G}=${J}:${parseInt(Q)+1}`;return z})}function oh(){if(y4.env.NO_COLOR||y4.env.FORCE_COLOR==="0"||y4.env.FORCE_COLOR==="false")return!1;if(y4.env.FORCE_COLOR||y4.env.CLICOLOR_FORCE!==void 0)return!0;return}tq5.Command=rh;tq5.useColor=oh});var fU2=P((JF5)=>{var{Argument:uU2}=GR(),{Command:sh}=yU2(),{CommanderError:zF5,InvalidArgumentError:gU2}=xq(),{Help:GF5}=dh(),{Option:hU2}=ph();JF5.program=new sh;JF5.createCommand=($)=>new sh($);JF5.createOption=($,z)=>new hU2($,z);JF5.createArgument=($,z)=>new uU2($,z);JF5.Command=sh;JF5.Option=hU2;JF5.Argument=uU2;JF5.Help=GF5;JF5.CommanderError=zF5;JF5.InvalidArgumentError=gU2;JF5.InvalidOptionArgumentError=gU2});var mU2,oi4,ri4,si4,ti4,ei4,$l4,zl4,QR,Gl4,Jl4,Ql4;var th=N(()=>{mU2=E2(fU2(),1),{program:oi4,createCommand:ri4,createArgument:si4,createOption:ti4,CommanderError:ei4,InvalidArgumentError:$l4,InvalidOptionArgumentError:zl4,Command:QR,Argument:Gl4,Option:Jl4,Help:Ql4}=mU2.default});var KR;var eh=N(()=>{KR={name:"oh-my-agent",version:"10.3.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",test:"vitest run","test:coverage":"vitest run --coverage",prepublishOnly:"bun run build"},dependencies:{"@clack/prompts":"^1.1.0","@date-fns/tz":"^1.4.1","@napi-rs/keyring":"^1.3.0",axios:"^1.15.0","better-sqlite3":"^12.9.0",chokidar:"^5.0.0",commander:"^14.0.3","date-fns":"^4.2.1",eld:"^2.0.3","fast-xml-parser":"^5",minimatch:"^10.2.5","p-map":"^7.0.4",picocolors:"^1.1.1","puppeteer-core":"^24",remark:"^15.0.1","remark-frontmatter":"^5.0.0","remark-parse":"^11.0.0","smol-toml":"^1.6.1",unified:"^11.0.5",ws:"^8.18.0",yaml:"^2.8.2",zod:"^4.3.6"},optionalDependencies:{pptxgenjs:"^3.12.0"},devDependencies:{"@biomejs/biome":"^2.4.15","@types/better-sqlite3":"^7.6.13","@types/mdast":"^4.0.4","@types/node":"^24","@types/ws":"^8.18.1","@vitest/coverage-v8":"^4.1.4",typescript:"^6",vitest:"^4.0.18"},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-orchestrator","oma-dev-workflow","oma-tf-infra","oma-scm","oma-pdf","oma-recap"]}}});import*as OY from"node:fs";import{homedir as FF5}from"node:os";import*as yq from"node:path";function iU2($){if(ZR)throw Error("install context already set in this process");ZR=$}function lU2(){if(ZR===null)throw Error("install context not set — entry point must call setInstallContext()");return ZR}function IY(){return lU2().installRoot}function t7(){return lU2().mode}function UR(){try{return t7()}catch{return"project"}}function dU2($){let z=process.env.OMA_HOME,G=$.global===!0||process.env.OMA_INSTALL_GLOBAL==="1";if(z!==void 0&&z!=="")return kF5(z),{installRoot:z,mode:G?"global":"project"};if(G)return{installRoot:FF5(),mode:"global"};return{installRoot:process.cwd(),mode:"project"}}function kF5($){if(!yq.isAbsolute($))throw Error("OMA_HOME must be absolute path");for(let G of cU2)if($===G||$.startsWith(G+yq.sep))throw Error(`OMA_HOME=${$} is forbidden (system path ${G})`);let z;try{z=OY.realpathSync($)}catch(G){let J=G instanceof Error?G.message:String(G);throw Error(`OMA_HOME=${$}: ${J}`)}for(let G of cU2)if(z===G||z.startsWith(G+yq.sep))throw Error(`OMA_HOME=${z} is forbidden (system path ${G})`);try{OY.accessSync(z,OY.constants.W_OK)}catch{throw Error(`OMA_HOME=${z} is not writable`)}}var ZR=null,cU2;var dz=N(()=>{cU2=["/etc","/usr","/bin","/boot","/sys","/proc"]});import{join as NF5}from"node:path";function uq($){return $.endsWith("/")?$:`${$}/`}function R7($,z){let G=z.split("/").filter((J)=>J.length>0);return NF5($,...G)}var M0=".agents",WR,v3,OJ,pU2,nU2,YR,AF5=".antigravitycli",aU2,jF5=".migration-backup",MF5,OF5,IF5,RF5,DF5,$f;var E3=N(()=>{WR=`${M0}/skills`,v3=`${M0}/results`,OJ=`${M0}/state`,pU2=`${OJ}/sessions`,nU2=`${OJ}/retry`,YR=`${OJ}/archive`,aU2=`${M0}/backup`;MF5=uq(v3),OF5=uq(OJ),IF5=uq(AF5),RF5=uq(aU2),DF5=uq(jF5),$f=[IF5,MF5,OF5,RF5,DF5]});var u1="first-fluke/oh-my-agent",e4,O0,VR,vF5,pz,s1;var nz=N(()=>{E3();e4=WR,O0=["antigravity","claude","codex","commandcode","cursor","grok","kimi","kiro","qwen"],VR=["pi","opencode"],vF5=["copilot","hermes"],pz=[...O0,...vF5].sort(),s1={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 zW2={};z5(zW2,{runAction:()=>T2,resolveJsonMode:()=>A5,printDescribe:()=>hF5,addOutputOptions:()=>j5});function j5($,z="Output as JSON"){return $.option("--json",z).option("--output <format>","Output format (text/json)",(G)=>{let J=G.trim().toLowerCase();if(!gq.includes(J))throw Error(`Invalid output format: ${G}. Expected one of ${gq.join(", ")}`);return J})}function EF5($){if($?.json)return"json";let z=$?.output?.trim().toLowerCase();if(z&&gq.includes(z))return z;if(process.env[sU2]?.trim().toLowerCase()==="json")return"json";return"text"}function A5($){return EF5($)==="json"}function tU2($){let z=$.at(-1);return z instanceof QR?z:null}function wF5($){let z=tU2($);if(z)return z.opts();let G=$.at(-1);return G&&typeof G==="object"?G:{}}function PF5($){if($ instanceof Error)return $.message;return String($)}function IJ($){throw Error($)}function Gf($,z){for(let G of $){let J=G.charCodeAt(0);if(J>=0&&J<=31||J===127)IJ(`${z} must not contain control characters`)}}function CF5($,z){if(Gf($,z),/[?#%]/.test($))IJ(`${z} must not contain ?, #, or %`);if($.includes(".."))IJ(`${z} must not contain '..'`)}function TF5($,z){Gf($,z);try{new URL($)}catch{IJ(`${z} must be a valid absolute URL`)}}function zf($,z,G="text"){if(typeof $==="string"){if(G==="identifier"){CF5($,z);return}if(G==="url"){TF5($,z);return}Gf($,z);return}if(Array.isArray($))for(let[J,Q]of $.entries())zf(Q,`${z}[${J}]`,G)}function rU2($){let z=$.toLowerCase();if(z==="url"||z.endsWith("url"))return"url";if(z.includes("id")||z.includes("type")||z.includes("vendor")||z.includes("session"))return"identifier";return"text"}function bF5($){let z=$.vendor;if(typeof z==="string"){if(z.split(",").map((K)=>K.trim()).filter(Boolean).filter((K)=>!pz.includes(K)).length>0)IJ(`vendor must be one of ${pz.join(", ")}`)}let G=$.output;if(typeof G==="string"&&!gq.includes(G))IJ(`output must be one of ${gq.join(", ")}`)}function _F5($){let z=$.processedArgs??$.args??[];($.registeredArguments??[]).forEach((Q,K)=>{let Z=Q.name?.()||String(K),U=z[K];if(zf(U,Z,rU2(Z)),Z==="agent-type"&&typeof U==="string"&&!oU2.includes(U))IJ(`agent-type must be one of ${oU2.join(", ")}`)});let J=$.opts();bF5(J);for(let[Q,K]of Object.entries(J))zf(K,Q,rU2(Q))}function SF5($){return($.registeredArguments??[]).map((z)=>({name:z.name?.()||"",required:!!z.required,variadic:!!z.variadic}))}function xF5($){return $.options.map((z)=>({flags:z.flags,long:z.long||void 0,short:z.short||void 0,description:z.description||"",required:!!z.required||!!z.mandatory,optional:!!z.optional,defaultValue:z.defaultValue}))}function eU2($){let z=[],G=$;while(G?.parent)z.unshift(G.name()),G=G.parent;return z.join(" ")}function yF5($){return $.options.some((z)=>z.long==="--json"||z.long==="--output")}function uF5($){return $.options.some((z)=>z.long==="--dry-run")}function $W2($){return{name:$.name(),path:eU2($),summary:$.summary()||void 0,description:$.description(),arguments:SF5($),options:xF5($),supportsJsonOutput:yF5($),supportsDryRun:uF5($),subcommands:$.commands.map((z)=>$W2(z))}}function gF5($,z){if(!z?.trim())return $;let G=z.trim(),J=[...$.commands];while(J.length>0){let Q=J.shift();if(!Q)continue;if(Q.name()===G||eU2(Q)===G)return Q;J.push(...Q.commands)}return null}function hF5($,z){let G=gF5($,z);if(!G)IJ(`Unknown command: ${z}`);let J={name:$.name(),version:$.version(),description:$.description(),env:{[sU2]:"Set to json to force machine-readable output on commands that support it."},command:$W2(G)};console.log(JSON.stringify(J,null,2))}function T2($,z={}){return async(...G)=>{let J=tU2(G);if(J&&G.length>=2)G[G.length-2]=J.optsWithGlobals();let Q=wF5(G);try{if(J)_F5(J);await $(...G)}catch(K){let Z=PF5(K);if(z.supportsJsonOutput&&A5(Q))console.log(JSON.stringify({error:Z},null,2));else console.error(Z);process.exitCode=1}}}var sU2="OH_MY_AG_OUTPUT_FORMAT",gq,oU2;var a4=N(()=>{th();nz();gq=["text","json"],oU2=["backend","frontend","mobile","qa","debug","pm"]});var GW2,JW2=($)=>{return $===12288||$>=65281&&$<=65376||$>=65504&&$<=65510},QW2=($)=>{return $===8987||$===9001||$>=12272&&$<=12287||$>=12289&&$<=12350||$>=12441&&$<=12543||$>=12549&&$<=12591||$>=12593&&$<=12686||$>=12688&&$<=12771||$>=12783&&$<=12830||$>=12832&&$<=12871||$>=12880&&$<=19903||$>=65040&&$<=65049||$>=65072&&$<=65106||$>=65108&&$<=65126||$>=65128&&$<=65131||$>=127488&&$<=127490||$>=127504&&$<=127547||$>=127552&&$<=127560||$>=131072&&$<=196605||$>=196608&&$<=262141};var KW2=N(()=>{GW2=(()=>{let $=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g;return(z)=>{let G=0;$.lastIndex=0;while($.test(z))G+=1;return z.length-G}})()});var fF5,mF5,ZW2,cF5,UW2,iF5,lF5,dF5,WW2=($,z={},G={})=>{let J=z.limit??1/0,Q=z.ellipsis??"",K=z?.ellipsisWidth??(Q?WW2(Q,dF5,G).width:0),Z=0,U=G.controlWidth??0,W=G.tabWidth??8,Y=G.emojiWidth??2,V=2,B=G.regularWidth??1,L=G.wideWidth??2,X=[[iF5,B],[fF5,0],[mF5,U],[cF5,W],[UW2,Y],[ZW2,L]],H=0,q=0,F=$.length,k=0,A=!1,j=F,M=Math.max(0,J-K),O=0,I=0,D=0,R=0;$:while(!0){if(I>O||q>=F&&q>H){let E=$.slice(O,I)||$.slice(H,q);k=0;for(let b of E.replaceAll(lF5,"")){let _=b.codePointAt(0)||0;if(JW2(_))R=2;else if(QW2(_))R=L;else R=B;if(D+R>M)j=Math.min(j,Math.max(O,H)+k);if(D+R>J){A=!0;break $}k+=b.length,D+=R}O=I=0}if(q>=F)break $;for(let E=0,b=X.length;E<b;E++){let[_,h]=X[E];if(_.lastIndex=q,_.test($)){if(k=_===ZW2?GW2($.slice(q,_.lastIndex)):_===UW2?1:_.lastIndex-q,R=k*h,D+R>M)j=Math.min(j,q+Math.floor((M-D)/h));if(D+R>J){A=!0;break $}D+=R,O=H,I=q,q=H=_.lastIndex;continue $}}q+=1}return{width:A?M:D,index:A?j:F,truncated:A,ellipsed:A&&J>=K}},YW2;var VW2=N(()=>{KW2();fF5=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,mF5=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,ZW2=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/yu,cF5=/\t{1,1000}/y,UW2=/[\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,iF5=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,lF5=/\p{M}+/gu,dF5={limit:1/0,ellipsis:""},YW2=WW2});var pF5,nF5=($,z={})=>{return YW2($,pF5,z).width},O6;var Jf=N(()=>{VW2();pF5={limit:1/0,ellipsis:"",ellipsisWidth:0},O6=nF5});function D$($,z,G){return String($).normalize().split(tF5).map((J)=>sF5(J,z,G)).join(`
|
|
28
28
|
`)}var BR="\x1B",qW2="",aF5=39,Kf="\x07",FW2="[",oF5="]",kW2="m",Zf,BW2,XW2=($)=>{if($>=30&&$<=37)return 39;if($>=90&&$<=97)return 39;if($>=40&&$<=47)return 49;if($>=100&&$<=107)return 49;if($===1||$===2)return 22;if($===3)return 23;if($===4)return 24;if($===7)return 27;if($===8)return 28;if($===9)return 29;if($===0)return 0;return},LW2=($)=>`${BR}${FW2}${$}${kW2}`,HW2=($)=>`${BR}${Zf}${$}${Kf}`,Qf=($,z,G)=>{let J=z[Symbol.iterator](),Q=!1,K=!1,Z=$.at(-1),U=Z===void 0?0:O6(Z),W=J.next(),Y=J.next(),V=0;while(!W.done){let B=W.value,L=O6(B);if(U+L<=G)$[$.length-1]+=B;else $.push(B),U=0;if(B===BR||B===qW2)Q=!0,K=z.startsWith(Zf,V+1);if(Q){if(K){if(B===Kf)Q=!1,K=!1}else if(B===kW2)Q=!1}else if(U+=L,U===G&&!Y.done)$.push(""),U=0;W=Y,Y=J.next(),V+=B.length}if(Z=$.at(-1),!U&&Z!==void 0&&Z.length&&$.length>1)$[$.length-2]+=$.pop()},rF5=($)=>{let z=$.split(" "),G=z.length;while(G){if(O6(z[G-1]))break;G--}if(G===z.length)return $;return z.slice(0,G).join(" ")+z.slice(G).join("")},sF5=($,z,G={})=>{if(G.trim!==!1&&$.trim()==="")return"";let J="",Q,K,Z=$.split(" "),U=[""],W=0;for(let B=0;B<Z.length;B++){let L=Z[B];if(G.trim!==!1){let H=U.at(-1)??"",q=H.trimStart();if(H.length!==q.length)U[U.length-1]=q,W=O6(q)}if(B!==0){if(W>=z&&(G.wordWrap===!1||G.trim===!1))U.push(""),W=0;if(W||G.trim===!1)U[U.length-1]+=" ",W++}let X=O6(L);if(G.hard&&X>z){let H=z-W,q=1+Math.floor((X-H-1)/z);if(Math.floor((X-1)/z)<q)U.push("");Qf(U,L,z),W=O6(U.at(-1)??"");continue}if(W+X>z&&W&&X){if(G.wordWrap===!1&&W<z){Qf(U,L,z),W=O6(U.at(-1)??"");continue}U.push(""),W=0}if(W+X>z&&G.wordWrap===!1){Qf(U,L,z),W=O6(U.at(-1)??"");continue}U[U.length-1]+=L,W+=X}if(G.trim!==!1)U=U.map((B)=>rF5(B));let Y=U.join(`
|
|
29
29
|
`),V=!1;for(let B=0;B<Y.length;B++){let L=Y[B];if(J+=L,!V){if(V=L>="\uD800"&&L<="\uDBFF",V)continue}else V=!1;if(L===BR||L===qW2){BW2.lastIndex=B+1;let H=BW2.exec(Y)?.groups;if(H?.code!==void 0){let q=Number.parseFloat(H.code);Q=q===aF5?void 0:q}else if(H?.uri!==void 0)K=H.uri.length===0?void 0:H.uri}if(Y[B+1]===`
|
|
30
30
|
`){if(K)J+=HW2("");let X=Q?XW2(Q):void 0;if(Q&&X)J+=LW2(X)}else if(L===`
|
|
@@ -1400,7 +1400,7 @@ ${G.prunedSerena.map((Q)=>` ${Q}`).join(`
|
|
|
1400
1400
|
`)}catch{}}function py2($){let z=ly2($);try{if(te5(z))$24(z)}catch{}}var J24;var H52=N(()=>{J24=iy2(".grok","rules","oma-state.md")});var nB;var IT=N(()=>{nB={workflows:{orchestrate:{persistent:!0,keywords:{"*":["orchestrate"],en:["parallel","do everything","run everything","do it all","run all tasks","automate","execute everything","handle everything"],ko:["자동 실행","자동으로 실행","자동으로 해","병렬 실행","전부 실행","전부 해","전부 돌려","자동으로 해줘","병렬로 해줘","전부 해줘","전부 돌려줘","한번에 다 해줘","한번에 해줘","한꺼번에 해","알아서 해줘","자동으로 처리해"],ja:["オーケストレート","並列実行","自動実行","全部実行","全部やって","自動でやって","並列でやって","全部お願い","まとめてやって"],zh:["编排","并行执行","自动执行","全部执行","全部做","自动处理","一起做","全做了","帮我全做"],es:["orquestar","paralelo","ejecutar todo","hazlo todo","ejecuta todo","automatiza","haz todo"],fr:["orchestrer","parallèle","tout exécuter","fais tout","exécute tout","automatise","gère tout"],de:["orchestrieren","parallel","alles ausführen","mach alles","alles erledigen","automatisieren","alles auf einmal"],pt:["orquestrar","paralelo","executar tudo","faça tudo","execute tudo","automatize","resolva tudo"],ru:["оркестровать","параллельно","выполнить всё","сделай всё","запусти всё","автоматизируй","всё сразу"],nl:["orkestreren","parallel","alles uitvoeren","doe alles","voer alles uit","automatiseer","alles tegelijk"],pl:["orkiestrować","równolegle","wykonaj wszystko","zrób wszystko","uruchom wszystko","zautomatyzuj","wszystko naraz"]},patterns:{"*":["\\b(build|create|make|develop|implement|scaffold)\\s+(?:me\\s+)?(?:an?|the)\\s+(?:[\\w-]+\\s+){0,3}(app|api|service|server|cli|tool|website|dashboard|system|feature|backend|frontend|prototype|mvp|bot)\\b","\\bi\\s+want\\s+(?:a|an)\\s+(?:[\\w-]+\\s+){0,3}(app|api|service|server|cli|tool|website|dashboard|system|feature|backend|frontend|prototype|mvp|bot)\\b"],ko:["(앱|API|서비스|서버|CLI|도구|웹사이트|대시보드|시스템|기능|백엔드|프론트엔드|프로토타입|MVP|봇)\\s*(?:을|를|이|가)?\\s*(?:만들어\\s*(?:주세요|줘|줄래)?|구현해\\s*(?:주세요|줘|줄래)?|개발해\\s*(?:주세요|줘|줄래)?|만들자|구현하자|개발하자)"]}},ultrawork:{persistent:!0,keywords:{"*":["ultrawork","ulw"]}},architecture:{persistent:!1,keywords:{"*":["architecture","ADR","ATAM","CBAM"],en:["system design","software design","architecture review","architectural review","module boundary","service boundary","design twice","tradeoff analysis","quality attribute"],ko:["아키텍처","시스템 설계","소프트웨어 설계","아키텍처 리뷰","구조 리뷰","모듈 경계","서비스 경계","설계 두 번","트레이드오프","품질 속성"],ja:["アーキテクチャ","システム設計","ソフトウェア設計","アーキテクチャレビュー","モジュール境界","サービス境界","トレードオフ","品質特性"],zh:["架构","系统设计","软件设计","架构评审","模块边界","服务边界","权衡分析","质量属性"],es:["arquitectura","diseño de sistemas","diseño de software","revisión de arquitectura","límite de módulo","límite de servicio","análisis de compensaciones","atributo de calidad"],fr:["architecture","conception système","conception logicielle","revue d'architecture","frontière de module","frontière de service","analyse des compromis","attribut de qualité"],de:["architektur","systemdesign","softwaredesign","architekturreview","modulgrenze","servicegrenze","trade-off-analyse","qualitätsattribut"],pt:["arquitetura","design de sistemas","design de software","revisão de arquitetura","limite de módulo","limite de serviço","análise de trade-off","atributo de qualidade"],ru:["архитектура","системный дизайн","архитектура ПО","архитектурное ревью","граница модуля","граница сервиса","анализ компромиссов","атрибут качества"],nl:["architectuur","systeemontwerp","softwareontwerp","architectuurreview","modulegrens","servicegrens","trade-offanalyse","kwaliteitsattribuut"],pl:["architektura","projekt systemu","projekt oprogramowania","przegląd architektury","granica modułu","granica usługi","analiza kompromisów","atrybut jakości"]}},plan:{persistent:!1,keywords:{"*":["task breakdown"],en:["plan","make a plan","create a plan","break down","analyze requirements","plan this","decompose"],ko:["계획","요구사항 분석","스펙 분석","스펙 정리","계획 세워줘","계획 짜줘","분석해줘","분석해","태스크 분해","작업 분해","기획","기획해줘","설계해줘","스펙 정리해줘","요구사항 정리해줘","플랜 짜줘"],ja:["計画","要件分析","タスク分解","計画を立てて","計画して","分析して","分解して","設計して","プランを作って"],zh:["计划","需求分析","任务分解","制定计划","做个计划","分析一下","拆分任务","规划一下"],es:["plan","planificar","análisis de requisitos","haz un plan","crea un plan","analiza","descomponer","planifica esto"],fr:["plan","planifier","analyse des exigences","fais un plan","crée un plan","analyse","décompose","planifie"],de:["plan","planen","anforderungsanalyse","mach einen plan","erstelle einen plan","analysiere","zerlege","plane das"],pt:["plano","planejar","análise de requisitos","faça um plano","crie um plano","analise","decomponha","planeje isso"],ru:["план","планировать","анализ требований","составь план","создай план","проанализируй","разбей на задачи","спланируй"],nl:["plan","plannen","vereistenanalyse","maak een plan","analyseer","splits op","plan dit"],pl:["plan","planować","analiza wymagań","zrób plan","stwórz plan","przeanalizuj","rozłóż na zadania","zaplanuj to"]}},review:{persistent:!1,keywords:{"*":["code review","security audit","security review"],en:["review","review this","review my code","check my code","audit","inspect","code check"],ko:["리뷰","코드 검토","보안 검토","성능 검토","리뷰해줘","검토해줘","코드 검토해줘","한번 봐줘","코드 봐줘","점검해줘","코드 점검","보안 감사","성능 분석"],ja:["レビュー","コードレビュー","セキュリティ監査","レビューして","確認して","コードを見て","チェックして","点検して","コード確認"],zh:["审查","代码审查","安全审计","审查一下","检查一下","看看代码","检查代码","代码检查","安全检查"],es:["revisión","revisar código","auditoría de seguridad","revisa","revisa esto","revisa mi código","verifica","inspecciona","chequea el código"],fr:["revue","revue de code","audit de sécurité","révise","vérifie","regarde mon code","inspecte","vérifie le code"],de:["review","code-review","sicherheitsaudit","überprüfe","prüfe","schau dir den code an","kontrolliere","code prüfen"],pt:["revisão","revisar código","auditoria de segurança","revise","verifique","confira","olhe o código","cheque o código"],ru:["ревью","обзор кода","аудит безопасности","проверь","посмотри код","проведи ревью","проверь код","осмотри код"],nl:["review","code review","beveiligingsaudit","bekijk","controleer","check de code","inspecteer","beoordeel"],pl:["przegląd","przegląd kodu","audyt bezpieczeństwa","sprawdź","sprawdź to","przejrzyj kod","skontroluj","zweryfikuj kod"]}},deepsec:{persistent:!1,keywords:{"*":["/deepsec","deepsec workflow"],en:["run deepsec","deepsec scan this repo","scan repo with deepsec","deepsec pr review","deepsec ci gate","deepsec triage","deepsec matchers"],ko:["딥섹 워크플로우","딥섹 실행","딥섹 스캔","딥섹으로 검사","딥섹 PR 리뷰","딥섹 CI 게이트"],ja:["ディープセック実行","deepsecワークフロー","deepsecでスキャン","deepsec PRレビュー"],zh:["运行 deepsec","deepsec 工作流","用 deepsec 扫描","deepsec PR 审查"]}},debug:{persistent:!1,keywords:{"*":["debug"],en:["fix bug","fix error","fix crash","fix the bug","fix the error","fix the crash","fix it","fix this","troubleshoot","broken","not working","doesn't work","debug this","find the bug"],ko:["디버그","버그 수정","에러 수정","오류 수정","버그 찾아","버그 고쳐","버그 잡아","고쳐줘","고쳐","수정해줘","수정해","에러 고쳐줘","에러 고쳐","에러 잡아줘","오류 고쳐줘","오류 고쳐","오류 잡아줘","버그 고쳐줘","버그 수정해줘","버그 잡아줘","에러 수정해줘","에러 찾아줘","오류 수정해줘","오류 찾아줘","왜 안돼","안 돼","동작 안해","작동 안해","깨졌어","터졌어","에러남","에러나"],ja:["デバッグ","バグ修正","エラー修正","直して","修正して","壊れた","動かない","エラーが出る","バグを直して","エラーを直して","動作しない","クラッシュ"],zh:["调试","修复 bug","修复错误","修复崩溃","修一下","修复","坏了","不工作","不能用","出错了","报错","有 bug","崩溃了"],es:["depurar","corregir bug","corregir error","arregla","arréglalo","está roto","no funciona","no va","tiene un bug","corrige esto","repara"],fr:["déboguer","corriger bug","corriger erreur","répare","corrige","c'est cassé","ça ne marche pas","ne fonctionne pas","a un bug","corrige ça"],de:["debuggen","bug beheben","fehler beheben","repariere","ist kaputt","funktioniert nicht","geht nicht","hat einen bug","behebe das","fixen"],pt:["depurar","corrigir bug","corrigir erro","conserte","arrume","está quebrado","não funciona","tem um bug","corrija isso","repare"],ru:["отладка","исправить баг","исправить ошибку","почини","исправь","сломалось","не работает","ошибка","есть баг","исправь это","починить"],nl:["debuggen","bug oplossen","fout oplossen","repareer","is kapot","werkt niet","doet het niet","heeft een bug","los dit op","fixen"],pl:["debugować","naprawić bug","naprawić błąd","napraw","napraw to","jest zepsuty","nie działa","ma buga","popraw to","napraw błąd"]}},brainstorm:{persistent:!1,keywords:{"*":["brainstorm"],en:["ideate","explore design","ideas","come up with","what if","how about","explore options","explore ideas"],ko:["브레인스토밍","아이디어","설계 탐색","디자인 탐색","아이디어 좀","아이디어 내줘","같이 생각해보자","뭐가 좋을까","어떻게 하면 좋을까","생각해봐","구상","구상해줘"],ja:["ブレインストーミング","アイデア","設計探索","アイデアを出して","考えてみて","どうかな","アイデアちょうだい","一緒に考えよう"],zh:["头脑风暴","创意","设计探索","想想","出主意","有什么想法","想个办法","出点子","集思广益"],es:["lluvia de ideas","idear","explorar diseño","piensa en","qué tal si","ideas para","sugiere","se te ocurre"],fr:["brainstorming","idéer","explorer le design","réfléchis","et si","des idées pour","propose","imagine"],de:["brainstorming","ideenfindung","design erkunden","denk nach","was wäre wenn","ideen für","vorschläge","lass uns überlegen"],pt:["brainstorming","idear","explorar design","pense em","e se","ideias para","sugira","imagine"],ru:["мозговой штурм","идеи","исследовать дизайн","подумай","а что если","идеи для","предложи","давай придумаем"],nl:["brainstormen","ideeën","ontwerp verkennen","bedenk","wat als","ideeën voor","stel voor","laten we nadenken"],pl:["burza mózgów","pomysły","eksploracja projektu","pomyśl","co jeśli","pomysły na","zaproponuj","zastanówmy się"]}},work:{persistent:!0,keywords:{"*":["work","step by step"],en:["one by one","guide me","walk me through","manual mode","one step at a time"],ko:["단계별","단계별로","단계별로 해줘","단계별로 진행해줘","하나씩 해줘","순서대로 해줘","차근차근","차근차근 해줘","수동으로 해줘"],ja:["ステップバイステップ","一歩ずつ","ガイドして","手動で","一つずつ","順番にやって","手順を教えて"],zh:["逐步","一步一步","指导我","手动","一个一个","按顺序","带我做"],es:["paso a paso","guíame","uno por uno","modo manual","de a uno","llévame paso a paso"],fr:["étape par étape","guide-moi","un par un","mode manuel","accompagne-moi","montre-moi étape par étape"],de:["schritt für schritt","führe mich","eins nach dem anderen","manueller modus","zeig mir wie","der reihe nach"],pt:["passo a passo","me guie","um por um","modo manual","me acompanhe","me mostre passo a passo"],ru:["шаг за шагом","направь меня","по одному","ручной режим","покажи по шагам","веди меня"],nl:["stap voor stap","begeleid me","een voor een","handmatige modus","leid me erdoor","stap voor stap uitleg"],pl:["krok po kroku","poprowadź mnie","jeden po drugim","tryb ręczny","przeprowadź mnie","pokaż krok po kroku"]}},deepinit:{persistent:!1,keywords:{"*":["deepinit"],en:["init project","initialize","setup project","new project","scaffold","bootstrap"],ko:["프로젝트 초기화","코드베이스 초기화","프로젝트 시작","프로젝트 설정","초기화해줘","새 프로젝트","프로젝트 만들어줘","셋업","셋업해줘"],ja:["プロジェクト初期化","プロジェクト開始","新しいプロジェクト","セットアップ","初期化して","プロジェクトを作って","プロジェクト設定"],zh:["项目初始化","新项目","设置项目","搭建项目","初始化","创建项目","项目配置"],es:["inicializar proyecto","nuevo proyecto","configurar proyecto","inicializa","crea un proyecto","monta el proyecto"],fr:["initialiser projet","nouveau projet","configurer projet","initialise","crée un projet","monte le projet"],de:["projekt initialisieren","neues projekt","projekt einrichten","initialisiere","erstelle ein projekt","projekt aufsetzen"],pt:["inicializar projeto","novo projeto","configurar projeto","inicialize","crie um projeto","monte o projeto"],ru:["инициализация проекта","новый проект","настроить проект","инициализируй","создай проект","настрой проект"],nl:["project initialiseren","nieuw project","project opzetten","initialiseer","maak een project","project configureren"],pl:["inicjalizacja projektu","nowy projekt","skonfiguruj projekt","zainicjalizuj","stwórz projekt","przygotuj projekt"]}},scm:{persistent:!1,keywords:{"*":["scm","configuration management","gitflow","github flow","gitlab flow","trunk-based","merge conflict","rebase","worktree","cherry-pick","submodule","subtree","codeowners","branch protection","protected branch","release tag","tagging","version baseline","squash merge","rebase merge","fast-forward","fast forward","merge strategy"],en:["commit","git commit","branch strategy","gitflow","github flow","gitlab flow","trunk-based","merge conflict","resolve conflict","rebase","worktree","release branch","baseline","conventional commits"],ko:["커밋","커밋해줘","깃 커밋","형상관리","브랜치 전략","gitflow","github flow","gitlab flow","트렁크 기반","머지 충돌","충돌 해결","리베이스","워크트리","릴리즈 브랜치","베이스라인","컨벤셔널 커밋","체리픽","서브모듈","서브트리","코드오너","브랜치 보호","보호 브랜치","릴리즈 태그","태깅","버전 베이스라인","스쿼시 머지","리베이스 머지","패스트포워드","머지 전략"],ja:["コミット","gitコミット","構成管理","ブランチ戦略","gitflow","github flow","gitlab flow","トランクベース","マージコンフリクト","コンフリクト解決","リベース","ワークツリー","リリースブランチ","ベースライン","conventional commits"],zh:["提交","git 提交","配置管理","分支策略","gitflow","github flow","gitlab flow","主干开发","合并冲突","冲突解决","rebase","worktree","发布分支","基线","conventional commits"],es:["commit","git commit","gestión de configuración","estrategia de ramas","gitflow","github flow","gitlab flow","trunk-based","conflicto de merge","resolver conflicto","rebase","worktree","rama de release","línea base","conventional commits"],fr:["commit","git commit","gestion de configuration","stratégie de branche","gitflow","github flow","gitlab flow","trunk-based","conflit de merge","résoudre conflit","rebase","worktree","branche de release","baseline","conventional commits"],de:["commit","git commit","konfigurationsmanagement","branch-strategie","gitflow","github flow","gitlab flow","trunk-based","merge-konflikt","konflikt lösen","rebase","worktree","release-branch","baseline","conventional commits"],pt:["commit","git commit","gestão de configuração","estratégia de branch","gitflow","github flow","gitlab flow","trunk-based","conflito de merge","resolver conflito","rebase","worktree","branch de release","linha de base","conventional commits"],ru:["коммит","git commit","управление конфигурацией","стратегия ветвления","gitflow","github flow","gitlab flow","trunk-based","конфликт слияния","разрешить конфликт","rebase","worktree","релизная ветка","базовая линия","conventional commits"],nl:["commit","git commit","configuratiemanagement","branchstrategie","gitflow","github flow","gitlab flow","trunk-based","mergeconflict","conflict oplossen","rebase","worktree","release branch","baseline","conventional commits"],pl:["commit","git commit","zarządzanie konfiguracją","strategia gałęzi","gitflow","github flow","gitlab flow","trunk-based","konflikt scalania","rozwiąż konflikt","rebase","worktree","gałąź wydania","linia bazowa","conventional commits"]}},ralph:{persistent:!0,keywords:{"*":["ralph"],en:["don't stop","do not stop","must complete","until done","keep going","finish everything","complete everything","run to completion","no stopping","see it through","don't give up","never stop","carry on","push through","finish it all","complete all"],ko:["랄프","멈추지마","멈추지 말고","끝까지","완료될때까지","될때까지 해","끝날때까지","다 끝내","다 해","전부 완료","끝까지 해","중단하지마","끝장내","끝까지 해줘","다 끝내줘","계속해","계속 해줘","그만두지마","포기하지마","멈추지 말아줘"],ja:["止まるな","完了まで","最後まで","全部終わらせて","止めないで","完了するまで","最後までやって","諦めないで","続けて","中断しないで","全部やりきって"],zh:["不要停","直到完成","做到完成","全部完成","别停","做完为止","一直做到完","别放弃","继续做","不要中断","全部做完"],es:["no pares","hasta completar","hasta terminar","termina todo","no te detengas","completa todo","no abandones","sigue adelante","acaba todo"],fr:["n'arrête pas","jusqu'à complétion","jusqu'au bout","termine tout","ne t'arrête pas","complète tout","n'abandonne pas","continue","finis tout"],de:["hör nicht auf","bis zur fertigstellung","bis es fertig ist","alles fertigstellen","nicht aufhören","mach alles fertig","gib nicht auf","mach weiter","alles abschließen"],pt:["não pare","até completar","até terminar","termine tudo","complete tudo","não pare até terminar","não desista","continue","finalize tudo"],ru:["не останавливайся","до завершения","пока не закончишь","заверши всё","не прекращай","доделай всё","не сдавайся","продолжай","закончи всё"],nl:["stop niet","tot voltooiing","tot het klaar is","maak alles af","niet stoppen","alles afronden","geef niet op","ga door","maak alles klaar"],pl:["nie zatrzymuj się","do ukończenia","aż skończysz","dokończ wszystko","nie przerywaj","skończ wszystko","nie poddawaj się","kontynuuj","zakończ wszystko"]}},design:{persistent:!1,keywords:{"*":["design system","DESIGN.md","design token"],en:["design","landing page","ui design","color palette","typography","dark theme","responsive design","glassmorphism","style guide","theme","color scheme","visual design","layout","wireframe","mockup"],ko:["디자인","랜딩페이지","디자인 시스템","UI 디자인","색상 팔레트","타이포그래피","다크 테마","반응형","디자인해줘","디자인 만들어줘","UI 만들어줘","화면 디자인","페이지 디자인","색상 정해줘","테마 만들어줘"],ja:["デザイン","ランディングページ","デザインシステム","UIデザイン","カラーパレット","タイポグラフィ","ダークテーマ","レスポンシブ","デザインして","デザインを作って","UIを作って","画面デザイン","レイアウト","ワイヤーフレーム","モックアップ"],zh:["设计","着陆页","设计系统","UI设计","配色方案","字体排版","暗色主题","响应式","设计一下","做个设计","做UI","页面设计","布局","线框图","原型"],es:["diseño","página de aterrizaje","sistema de diseño","diseño UI","paleta de colores","tipografía","tema oscuro","diseño responsivo","diseña","crea un diseño","haz el diseño","maqueta"],fr:["design","page d'atterrissage","système de design","design UI","palette de couleurs","typographie","thème sombre","design responsif","fais le design","crée un design","maquette"],de:["Design","Landingpage","Designsystem","UI-Design","Farbpalette","Typografie","dunkles Theme","responsives Design","gestalte","erstelle ein Design","mach das Design","Wireframe","Mockup"],pt:["design","página de destino","sistema de design","design UI","paleta de cores","tipografia","tema escuro","design responsivo","faça o design","crie um design","monte o design","wireframe"],ru:["дизайн","лендинг","дизайн-система","UI дизайн","цветовая палитра","типографика","тёмная тема","адаптивный дизайн","сделай дизайн","создай дизайн","оформи","макет","wireframe"],nl:["ontwerp","landingspagina","ontwerpsysteem","UI-ontwerp","kleurenpalet","typografie","donker thema","responsief ontwerp","ontwerp dit","maak een ontwerp","wireframe","mockup"],pl:["projekt","strona docelowa","system projektowy","projekt UI","paleta kolorów","typografia","ciemny motyw","responsywny projekt","zaprojektuj","stwórz projekt","zrób design","wireframe","makieta"]}},docs:{persistent:!1,keywords:{"*":["oma-docs","doc-refs","docs verify","docs sync"],en:["verify docs","verify documentation","check docs","check documentation","docs drift","documentation drift","broken docs","broken doc links","stale docs","stale documentation","sync docs","sync documentation","update docs after change","patch docs","doc verify","doc sync"],ko:["문서 검증","문서 검증해줘","문서 점검","문서 점검해줘","문서 드리프트","문서 동기화","문서 동기화해줘","문서 싱크","문서 싱크 맞춰","문서 싱크 맞춰줘","깨진 문서 링크","깨진 문서","오래된 문서","낡은 문서","문서 갱신","문서 업데이트","docs 검증","docs 싱크","docs 동기화"],ja:["ドキュメント検証","ドキュメント点検","ドキュメントドリフト","ドキュメント同期","ドキュメントを同期","壊れたドキュメントリンク","古いドキュメント","ドキュメント更新","docsを検証","docsを同期"],zh:["文档校验","文档检查","文档漂移","文档同步","同步文档","失效文档链接","陈旧文档","更新文档","docs 校验","docs 同步"],es:["verificar documentación","comprobar documentación","deriva de documentación","sincronizar documentación","enlaces rotos en documentación","documentación obsoleta","actualizar documentación"],fr:["vérifier la documentation","contrôler la documentation","dérive de documentation","synchroniser la documentation","liens cassés dans la documentation","documentation obsolète","mettre à jour la documentation"],de:["Doku verifizieren","Dokumentation prüfen","Dokumentations-Drift","Doku synchronisieren","kaputte Doku-Links","veraltete Dokumentation","Doku aktualisieren"],pt:["verificar documentação","checar documentação","drift de documentação","sincronizar documentação","links quebrados na documentação","documentação desatualizada","atualizar documentação"],ru:["проверить документацию","верифицировать документацию","дрейф документации","синхронизировать документацию","битые ссылки в документации","устаревшая документация","обновить документацию"],nl:["documentatie verifiëren","documentatie controleren","documentatie-drift","documentatie synchroniseren","kapotte documentatielinks","verouderde documentatie","documentatie bijwerken"],pl:["zweryfikuj dokumentację","sprawdź dokumentację","dryf dokumentacji","zsynchronizuj dokumentację","zepsute linki w dokumentacji","przestarzała dokumentacja","zaktualizuj dokumentację"]}},recap:{persistent:!1,keywords:{"*":["recap"],ko:["리캡"],ja:["リキャップ"]}},video:{persistent:!1,keywords:{"*":["oma-video","remotion","shorts","reels","screencast"],en:["generate video","generate a video","create video","create a video","make a video","short-form video","shorts video","reels video","youtube short","tiktok video","explainer video","demo video","walkthrough video","screencast video","turn this into a video","video from readme","video from code"],ko:["영상 만들어","영상 만들어줘","영상 생성","영상 생성해","영상 생성해줘","비디오 만들어","비디오 만들어줘","숏폼 만들어","숏폼 영상","쇼츠 만들어","쇼츠 영상","릴스 만들어","릴스 영상","데모 영상","설명 영상","설명 영상 만들어","스크린캐스트","영상으로 만들어"],ja:["動画を生成","動画生成","動画を作","動画を作成","ショート動画","リール動画","解説動画","デモ動画","スクリーンキャスト"],zh:["生成视频","生成一段视频","制作视频","做个视频","短视频","竖屏短视频","讲解视频","演示视频","录屏视频"],es:["generar video","crear video","hazme un video","video corto","video explicativo"],fr:["générer une vidéo","créer une vidéo","fais-moi une vidéo","vidéo courte","vidéo explicative"],de:["video generieren","video erstellen","erstelle ein video","kurzvideo","erklärvideo"]}}},skills:{"oma-architecture":{keywords:{"*":[],en:["design the system","architecture doc","high level design","define boundaries","architecture tradeoffs"],ko:["아키텍처 짜줘","시스템 구조 설계","경계 정의해줘","구조 검토해줘","아키텍처 문서"],ja:["アーキテクチャを設計","システム構成を考えて","境界を定義","構成レビュー","アーキ文書"],zh:["设计架构","系统架构方案","定义边界","架构文档","架构权衡"]}},"oma-backend":{keywords:{"*":["CRUD","JWT auth"],en:["build an api","add endpoint","server side logic","write a migration","repository pattern","rest api","api endpoint","backend service","database migration","auth flow","server implementation","clean architecture"],ko:["api 만들어줘","엔드포인트 추가","백엔드 구현","마이그레이션 작성","인증 붙여줘"],ja:["apiを作って","エンドポイント追加","バックエンド実装","マイグレーション書いて","認証を実装"],zh:["写个接口","加接口","后端实现","写迁移","加认证"]}},"oma-brainstorm":{keywords:{"*":[],en:["toss around ideas","kick around options","spitball","some ideas please","ideation session"],ko:["아이디어 좀 뽑아줘","같이 고민해줘","아이디어 내보자","방향성 고민"],ja:["アイデア出して","一緒に考えて","方向性を探りたい","案を出して"],zh:["帮我想想","一起想想办法","给点灵感"]}},"oma-coordination":{keywords:{"*":[],en:["coordinate the agents","hand off to agent","multi agent workflow","run agents manually","multi agent coordination","coordinate agents","cli handoff","manual orchestration"],ko:["에이전트 조율","에이전트끼리 협업","수동으로 에이전트 돌려","에이전트 순서 잡아줘"],ja:["エージェントを調整","エージェント連携","手動でエージェント","エージェントの順序"],zh:["协调代理","代理之间协作","手动跑代理","代理之间衔接"]}},"oma-db":{keywords:{"*":["ERD","vector db"],en:["design a schema","normalize tables","tune the index","slow query","plan capacity","schema design","ERD","normalization","index tuning","query tuning","vector index","RAG retrieval","data migration","capacity planning"],ko:["스키마 설계","테이블 설계","인덱스 튜닝","쿼리 느려","용량 산정"],ja:["スキーマ設計","テーブル設計","インデックス調整","クエリが遅い","容量見積"],zh:["设计表结构","表设计","索引优化","查询很慢","容量评估"]}},"oma-debug":{keywords:{"*":[],en:["find the root cause","why does it crash","write a regression test","analyze this stack trace","bug diagnosis","root cause","regression test","stack trace","crash fix","error investigation"],ko:["버그 찾아줘","에러 원인","크래시 분석","스택트레이스 봐줘","원인 파악해줘"],ja:["バグを探して","エラー原因","クラッシュを分析","スタックトレースを見て","原因を特定"],zh:["找出 bug","错误原因","分析崩溃","看堆栈","定位原因"]}},"oma-design":{keywords:{"*":["WCAG"],en:["design tokens","build a landing page","pick a color palette","typography scale","motion spec","typography system","landing page design","responsive layout","motion design"],ko:["디자인 토큰","랜딩 만들어줘","컬러 팔레트 잡아줘","타이포 스케일","모션 가이드"],ja:["デザイントークン","ランディング作成","カラーパレット決めて","モーション設計"],zh:["设计令牌","做个落地页","定配色","字体层级","动效规范"]}},"oma-dev-workflow":{keywords:{"*":["mise.toml","CI/CD"],en:["setup mise task","configure ci pipeline","automate release","add git hook","monorepo tasks","mise task","monorepo workflow","ci/cd pipeline","git hook","release automation","build automation"],ko:["mise 태스크","ci 파이프라인","릴리즈 자동화","깃 훅 설정","모노레포 워크플로우"],ja:["miseタスク","ciパイプライン","リリース自動化","gitフック","モノレポ作業"],zh:["mise 任务","ci 流水线","发布自动化","git 钩子","monorepo 工作流"]}},"oma-frontend":{keywords:{"*":["shadcn","FSD","next.js","nextjs","react","tailwind","tsx","frontend"],en:["make a react component","build a next page","style with tailwind","hook up shadcn","react component","next.js page","tailwind styling","shadcn component","frontend ui","FSD architecture"],ko:["리액트 컴포넌트","넥스트 페이지","tailwind로 스타일","shadcn 붙여줘","프론트 구현"],ja:["reactコンポーネント","nextページ","tailwindで装飾","shadcn導入","フロント実装"],zh:["写个 react 组件","next 页面","用 tailwind","接入 shadcn","前端实现"]}},"oma-hwp":{keywords:{"*":["kordoc","hwp","hwpx","hwpml"],en:["convert this hwp","hwp to markdown","parse hwp","parse hwpx","extract hwp content","hangul word processor","hwp ingestion"],ko:["한글 파일","한글 변환","한글 파싱","hwp 변환","hwp 파싱","hwp 마크다운","hwpx 변환","hwpx 파싱"],ja:["hwp変換","hwpをマークダウン","hwpを解析","韓国語ワープロ"],zh:["hwp 转换","hwp 解析","hwp 转 markdown","韩文文档"]}},"oma-mobile":{keywords:{"*":["riverpod","cupertino","swiftui","swift-openapi-generator"],en:["flutter screen","react native view","dart widget","ios android build","flutter widget","react native screen","dart code","riverpod state","mobile app","android ios","swift native","swift ios","swiftui view","ios native app"],ko:["플러터 화면","리액트 네이티브 화면","다트 위젯","안드로이드 아이폰 앱","모바일 앱"],ja:["flutter画面","react native画面","dartウィジェット","iosアンドロイド","モバイルアプリ"],zh:["flutter 页面","react native 页面","dart 组件","安卓 ios","移动端应用"]}},"oma-market":{keywords:{"*":[],en:["market research","pain point","pain points","voice of customer","competitor research","competitor analysis","trend detection","user complaints","discovery research","market signal"],ko:["시장조사","시장 조사","사용자 페인","페인 포인트","트렌드 분석","경쟁구도","경쟁사 분석","사용자 불만","경쟁 분석"],ja:["市場調査","ペインポイント","ユーザー不満","競合調査","トレンド分析"]}},"oma-observability":{keywords:{"*":["OpenTelemetry","OTel","OTLP","W3C Trace Context","traceparent","MELT","APM","RUM","SLO","SLI","burn-rate","PromQL","Prometheus","Grafana","Jaeger","Tempo","Loki","Mimir","Fluent Bit","OpenCost","OpenFeature","Flagger","Falco","Parca","Pyroscope","Honeycomb","Datadog","Sentry","Crashlytics","Core Web Vitals"],en:["observability","traceability","telemetry","distributed tracing","instrument my service","set up OTel","OTel pipeline","collector topology","tail sampling","cardinality budget","clock skew","error budget","burn rate alert","canary analysis","progressive delivery","feature flag observability","incident forensics","6-dimension localization","root cause across services","multi-tenant telemetry","per-tenant sampling","data residency telemetry","redact PII in logs","observability as code","dashboard as code","PrometheusRule CRD","Grafana Jsonnet","Perses dashboard","UDP MTU telemetry","StatsD fragmentation","OTLP gRPC vs HTTP","propagator matrix","BGP observability","QUIC observability","eBPF observability","service mesh tracing","zero code instrumentation","mobile crash analytics","crash-free rate","symbolication pipeline","offline telemetry queue","WAF observability","WAF rule hit rate","WAF false positive","edge 403 storm","ruleset rollback","cascading failure observability","third-party dependency outage","fail-closed dependency"],ko:["관측성","관측 가능성","추적성","추적 가능성","텔레메트리","텔레메트리 수집","분산 트레이싱","OTel 도입","OTel 셋업","OTel 계측","OTel 파이프라인","컬렉터 토폴로지","테일 샘플링","카디널리티","카디널리티 관리","클록 스큐","시계 드리프트","에러 버짓","에러 예산","번레이트 알람","번레이트","카나리 분석","프로그레시브 딜리버리","점진 배포","피처 플래그 관측","사건 부검","장애 부검","장애 원인 분석","6차원 좁히기","멀티테넌트 관측","테넌트별 샘플링","데이터 거주 관측","로그 PII 제거","로그 익명화","로그 가명화","관측성 as code","대시보드 as code","대시보드 코드화","PrometheusRule","Grafana Jsonnet","Perses 대시보드","UDP MTU 튜닝","StatsD 단편화","OTLP gRPC 선택","전파자 매핑","BGP 관측","QUIC 관측","eBPF 관측","서비스 메시 트레이싱","zero-code 계측","모바일 크래시 분석","크래시 프리 레이트","심볼리케이션","오프라인 텔레메트리 큐","WAF 관측","WAF 차단","WAF 오탐","방화벽 차단","엣지 403 폭주","룰셋 롤백","연쇄 장애","디펜던시 장애","외부 의존성 장애","서드파티 장애","페일클로즈드"],ja:["オブザーバビリティ","トレーサビリティ","テレメトリ","分散トレーシング","OTel導入","OTelパイプライン","コレクタ構成","テイルサンプリング","カーディナリティ予算","クロックスキュー","エラーバジェット","バーンレートアラート","カナリア分析","プログレッシブデリバリ","機能フラグ観測","インシデントフォレンジック","マルチテナント観測","データ居住性観測","ログPII除去","Observability as Code","Dashboard as Code","UDP MTUチューニング","StatsDフラグメンテーション","OTLP選択","プロパゲータマッピング","BGP観測","QUIC観測","eBPF観測","サービスメッシュトレース","モバイルクラッシュ分析","クラッシュフリーレート","シンボリケーション","オフラインテレメトリ","WAF観測","WAFブロック","WAF誤検知","ファイアウォールブロック","エッジ403","ルールセットロールバック","カスケード障害","依存サービス障害","サードパーティ障害","フェイルクローズド"],zh:["可观测性","可追溯性","遥测","分布式追踪","OTel 接入","OTel 流水线","采集器拓扑","尾采样","基数预算","时钟漂移","错误预算","燃烧率告警","金丝雀分析","渐进式发布","特性开关观测","事件取证","多租户观测","数据驻留观测","日志脱敏","可观测性即代码","仪表盘即代码","UDP MTU 调优","StatsD 分片","OTLP 选择","传播器映射","BGP 观测","QUIC 观测","eBPF 观测","服务网格追踪","零代码探针","移动崩溃分析","崩溃无事率","符号化","离线遥测队列","WAF 观测","WAF 拦截","WAF 误报","防火墙拦截","边缘 403 风暴","规则集回滚","级联故障","依赖方故障","第三方故障","故障关闭"]}},"oma-orchestrator":{keywords:{"*":["MCP Memory"],en:["spawn parallel agents","run agents in parallel","fan out work","review loop pipeline","parallel subagents","multi agent orchestration","spawn agents","review loop","mcp memory coordination"],ko:["에이전트 병렬 실행","동시에 에이전트 돌려","fan-out","리뷰 루프 돌려"],ja:["エージェント並列実行","同時にエージェント","fan-out","レビューループ"],zh:["并行跑代理","同时派发代理","fan-out 任务","评审循环"]}},"oma-pdf":{keywords:{"*":["opendataloader-pdf"],en:["convert this pdf","pdf to markdown","extract pdf content","parse pdf document","parse pdf","extract pdf","convert pdf","pdf ingestion"],ko:["pdf 변환","pdf 파싱","pdf 마크다운","pdf 내용 추출"],ja:["pdf変換","pdfをマークダウン","pdfを解析","pdfの内容を抽出"],zh:["pdf 转换","pdf 解析","pdf 转 markdown","提取 pdf 内容"]}},"oma-pm":{keywords:{"*":["PRD","WBS"],en:["break down requirements","write a spec","prioritize features","define scope","product roadmap","requirements breakdown","task decomposition","product spec","scope definition","prioritization matrix"],ko:["요구사항 정리","스펙 문서","우선순위 매겨줘","스코프 정의","제품 로드맵"],ja:["要件を整理","スペック作成","優先度付け","スコープ定義","プロダクトロードマップ"],zh:["梳理需求","写规格书","排优先级","界定范围","产品路线图"]}},"oma-qa":{keywords:{"*":["OWASP","WCAG","lighthouse"],en:["run a security audit","accessibility check","performance review","coverage report","quality gate","owasp review","accessibility audit","test coverage"],ko:["접근성 점검","성능 점검","커버리지 확인","품질 게이트"],ja:["アクセシビリティ確認","パフォーマンス点検","カバレッジ確認","品質ゲート"],zh:["无障碍检查","性能检查","覆盖率报告","质量门禁"]}},"oma-recap":{keywords:{"*":["recap"],en:["summarize my day","daily recap","weekly summary","what did i work on","transcript summary","conversation recap","daily summary","work summary","transcript analysis","multi tool recap"],ko:["오늘 한 일 정리","하루 요약","주간 요약","작업 내용 정리","대화 요약"],ja:["今日の作業まとめ","日次サマリ","週次サマリ","作業振り返り","会話まとめ"],zh:["今天做了什么","日报总结","周报总结","工作回顾","对话总结"]}},"oma-scm":{keywords:{"*":[],en:["set up branching","resolve merge conflict","rebase my branch","tag a release","use git worktree","branching strategy","rebase workflow","git worktree"],ko:["머지 충돌 해결","리베이스해줘","워크트리 써줘"],ja:["マージ衝突解決","リベースして","リリースタグ","worktree使って"],zh:["解决合并冲突","帮我 rebase","打发布标签","用 worktree"]}},"oma-search":{keywords:{"*":["context7"],en:["look up docs","find the library","search the web","reference docs","library api","search docs","find library","code search","web research","library reference","context7 docs"],ko:["검색해줘","찾아줘","레퍼런스 찾아","문서 찾아줘","라이브러리 찾아줘"],ja:["検索して","調べて","ドキュメント探して","ライブラリ調べて","リファレンス探して"],zh:["帮我查","搜一下","找找文档","找个库","查参考资料"]}},"oma-slide":{keywords:{"*":["pptx","keynote"],en:["make a presentation","create slides","build a deck","slide deck","pitch deck","presentation slides","html slides","convert pptx"],ko:["발표자료 만들어","슬라이드 만들어","프레젠테이션 만들어","피피티 만들어","덱 만들어"],ja:["プレゼン作って","スライド作って","発表資料作って","デッキ作って"],zh:["做个演示","做幻灯片","做个PPT","做演示文稿"]}},"oma-tf-infra":{keywords:{"*":["terraform","OIDC","IAM"],en:["terraform plan","provision infrastructure","iac module","cloud resources","optimize cost","iac provisioning","cloud infrastructure","iam policy","oidc setup","cost optimization"],ko:["테라폼 플랜","인프라 프로비저닝","iac 모듈","클라우드 리소스","비용 최적화"],ja:["terraformプラン","インフラ構築","iacモジュール","クラウドリソース","コスト最適化"],zh:["terraform plan","搭建基础设施","iac 模块","云资源","成本优化"]}},"oma-translator":{keywords:{"*":["arb","i18n"],en:["translate this","localize the strings","ui translation","multilingual copy","translate to english","translate strings","localization copy","multilingual content","arb translation"],ko:["번역해줘","번역 부탁","다국어로","영어로 바꿔줘","현지화해줘"],ja:["翻訳して","英訳","多言語化","ローカライズして","訳して"],zh:["翻译一下","帮我翻译","多语言","本地化","翻成英文"]}},"oma-deepsec":{keywords:{"*":["deepsec",".deepsec","bunx deepsec","pnpm deepsec","npx deepsec","deepsec.config","process --diff","INFO.md","MatcherPlugin","noiseTier","AI_GATEWAY_API_KEY"],en:["scan repo for vulnerabilities","scan the repo for vulns","security scan with an agent","vulnerability scanner","agent security scan","run a security scan","pr security review","ci security gate","diff security review","write a custom matcher","revalidate findings","triage findings"],ko:["취약점 스캔","보안 스캔","딥섹","딥섹 돌려","PR 보안 리뷰","보안 점검","매처 작성","파인딩 트리아지","파인딩 재검증"],ja:["脆弱性スキャン","セキュリティスキャン","ディープセック","PRセキュリティレビュー","マッチャーを書く","ファインディングをトリアージ"],zh:["漏洞扫描","安全扫描","深度安全扫描","PR 安全审查","编写自定义匹配器","重新验证发现"]}},"oma-image":{keywords:{"*":["nano-banana","nanobanana","gpt-image","pollinations","oma-image"],en:["generate image","generate an image","create image","create an image","make a picture","make an image","render image","render a picture","draw me","draw a","ai image","image generation","generate a photo","create picture","picture of","image of"],ko:["이미지 만들어","이미지 만들어줘","이미지 생성","이미지 생성해","이미지 생성해줘","사진 만들어","사진 만들어줘","그림 그려","그림 그려줘","이미지 뽑아","이미지 뽑아줘","이미지 그려줘","이미지 출력","나노바나나","나노 바나나","바나나로 뽑","이미지 생성기","ai 이미지"],ja:["画像を生成","画像生成","画像を作","画像を作成","絵を描いて","画像出力","イラストを生成","写真を生成"],zh:["生成图像","生成图片","生成一张","画一张","画一幅","帮我画","出图","图像生成","图片生成"],es:["generar imagen","crear imagen","hazme una imagen","genera una foto"],fr:["générer une image","créer une image","fais-moi une image","dessine-moi"],de:["bild generieren","bild erstellen","erstelle ein bild","zeichne mir"]}},"oma-video":{keywords:{"*":["oma-video","remotion","shorts","reels","screencast"],en:["generate video","generate a video","create video","create a video","make a video","short-form video","shorts video","reels video","youtube short","tiktok video","explainer video","demo video","walkthrough video","screencast video","turn this into a video","video from readme","video from code"],ko:["영상 만들어","영상 만들어줘","영상 생성","영상 생성해","영상 생성해줘","비디오 만들어","비디오 만들어줘","숏폼 만들어","숏폼 영상","쇼츠 만들어","쇼츠 영상","릴스 만들어","릴스 영상","데모 영상","설명 영상","설명 영상 만들어","스크린캐스트","영상으로 만들어"],ja:["動画を生成","動画生成","動画を作","動画を作成","ショート動画","リール動画","解説動画","デモ動画","スクリーンキャスト"],zh:["生成视频","生成一段视频","制作视频","做个视频","短视频","竖屏短视频","讲解视频","演示视频","录屏视频"],es:["generar video","crear video","hazme un video","video corto","video explicativo"],fr:["générer une vidéo","créer une vidéo","fais-moi une vidéo","vidéo courte","vidéo explicative"],de:["video generieren","video erstellen","erstelle ein video","kurzvideo","erklärvideo"]}},"oma-voice":{keywords:{"*":["voicebox","oma-voice","tts","stt"],en:["text to speech","speech to text","transcribe audio","transcribe this","generate speech","voice notification","narrate this","make a voiceover","create a voiceover","read this aloud","speak this","say this","dictation","voice memo","meeting transcript","audio to text"],ko:["음성으로 알려","음성으로 읽어","음성으로 말해","음성 만들어","음성 만들어줘","음성 생성","음성 생성해","음성 생성해줘","보이스오버 만들어","보이스오버 생성","나레이션 만들어","오디오 파일 전사","오디오를 텍스트로","받아 적어","받아적어","받아 써","받아써","회의록 만들어","회의록 작성","음성 메모"],ja:["音声を生成","音声生成","音声で読み上げ","ナレーション","テキストを読み上げ","音声に変換","文字起こし","音声を文字に","ボイスオーバー"],zh:["生成语音","语音生成","朗读这段","文字转语音","语音转文字","音频转写","转录音频","语音备忘","会议转录"]}},"oma-refactor":{keywords:{"*":["oma-refactor"],en:["refactor this","refactoring plan","extract class","extract method","reduce complexity","measure complexity","code smell","technical debt","characterization test","hotspot analysis","split this class","clean up this code"],ko:["리팩토링","리팩터링","복잡도 줄여","복잡도 측정","코드 스멜","기술 부채","클래스 분리","메서드 추출","코드 정리해줘"],ja:["リファクタリング","複雑度を下げ","複雑度を測定","コードスメル","技術的負債","クラスを分割","メソッド抽出"],zh:["重构","降低复杂度","测量复杂度","代码异味","技术债","拆分类","提取方法"]}}},informationalPatterns:{"*":["what is","what are","how to","how does","how do","how can","how would","explain","describe","tell me about","keyword","false positive","false-positive","detected","detector","fires when","trigger when","auto-trigger","auto trigger","what triggers","should we trigger","if we trigger","trigger logic","trigger mechanism","should we","should i","should you","could we","would you","what if","what about","why build","why create","why make","artifact"],ko:["뭐야","뭐임","무엇","어떻게","설명해","알려줘","키워드","감지","오탐","트리거","발동","메타","트리거하면","트리거 해주면","트리거해야","키워드 나오면","왜 만들","어떻게 만들","어떨까","하면 좋을","한다면","할까요","보강할","에 대해","에 대한","한번 봐","깊게 봐","코드를 한번","그 워크플로우","이 워크플로우","워크플로우 자체","고도화","아티팩트"],ja:["とは","って何","どうやって","説明して","キーワード","検出","誤検出"],zh:["是什么","什么是","怎么","解释","关键词","检测","误报"],es:["qué es","cómo","explica","palabra clave","falso positivo","detectado"],fr:["c'est quoi","comment","explique","mot-clé","faux positif","détecté"],de:["was ist","wie","erkläre","schlüsselwort","falsch positiv","erkannt"],pt:["o que é","como","explique","palavra-chave","falso positivo","detectado"],ru:["что такое","как","объясни","ключевое слово","ложное срабатывание","обнаружено"],nl:["wat is","hoe","leg uit","sleutelwoord","vals positief","gedetecteerd"],pl:["co to","jak","wyjaśnij","słowo kluczowe","fałszywy alarm","wykryto"]},excludedWorkflows:["tools","stack-set","schedule"],cjkScripts:["ko","ja","zh"],extensionRouting:{"frontend-engineer":["tsx","jsx","css","scss","less","vue","svelte","html"],"backend-engineer":["go","py","java","rs","rb","php","controller","service","resolver"],"db-engineer":["sql","prisma","graphql","migration"],"mobile-engineer":["dart","swift","kt","xib","storyboard"],designer:["figma","sketch","svg"]}}});import{join as K24}from"node:path";function ny2($){switch($){case"claude":return".claude/hooks";case"codex":return".codex/hooks";case"commandcode":return".commandcode/hooks";case"cursor":return".cursor/hooks";case"antigravity":return".agents/hooks/core";case"qwen":return".qwen/hooks";case"grok":return".grok/hooks";case"kiro":return".kiro/hooks";case"kimi":return".agents/hooks/core";case"pi":return K24(".pi","extensions","oma")}}var TU=N(()=>{bQ();OT()});var $u2={};z5($u2,{updateIndex:()=>A52,setLastSession:()=>DA,setActiveSession:()=>X24,sessionsDir:()=>k52,sessionDir:()=>aB,readIndex:()=>RA,indexPath:()=>N52,getActiveSid:()=>j52,defaultIndex:()=>F52,atomicWriteJson:()=>DT,STATE_ROOT:()=>ey2});import{closeSync as oy2,existsSync as q52,fsyncSync as ry2,mkdirSync as Z24,openSync as sy2,readFileSync as U24,renameSync as W24,statSync as ay2,writeFileSync as Y24}from"node:fs";import{dirname as ty2,join as RT}from"node:path";function k52($){return RT($,ey2)}function N52($){return RT(k52($),"_index.json")}function aB($,z){return RT(k52($),z)}function F52(){return{schemaVersion:1,active:{}}}function V24($){Z24(ty2($),{recursive:!0})}function B24($){try{let z=sy2(ty2($),"r");try{ry2(z)}finally{oy2(z)}}catch{}}function DT($,z){V24($);let G=`${$}.${process.pid}.${Date.now()}.tmp`;Y24(G,`${JSON.stringify(z,null,2)}
|
|
1401
1401
|
`,"utf-8");let J=sy2(G,"r");try{ry2(J)}finally{oy2(J)}W24(G,$),B24($)}function RA($){let z=N52($);if(!q52(z))return F52();try{let G=JSON.parse(U24(z,"utf-8"));return{schemaVersion:1,active:G.active??{},lastSession:G.lastSession}}catch{return F52()}}function A52($,z,G=3){let J=N52($);for(let Q=0;Q<G;Q++){let K=q52(J)?ay2(J).mtimeMs:null,Z=RA($);z(Z);let U=q52(J)?ay2(J).mtimeMs:null;if(K!==U)continue;return DT(J,Z),Z}return process.stderr.write(`[oma] _index.json CAS retries exhausted (${G}); leaving it stale.
|
|
1402
1402
|
`),process.stderr.write(`[oma] hint: run 'oma state repair' to re-derive active pointers
|
|
1403
|
-
`),RA($)}function j52($,z="main"){return $.active[z]??$.active.main??null}function X24($,z,G){return A52($,(J)=>{J.active[z]=G})}function DA($,z,G){return A52($,(J)=>{J.lastSession={vendor:z,vendorSid:G,ts:new Date().toISOString()}})}var ey2;var vA=N(()=>{ey2=RT(".agents","state","sessions")});import{existsSync as L24,readFileSync as H24}from"node:fs";import q24 from"node:http";import F24 from"node:https";import{homedir as k24}from"node:os";import{basename as N24,join as A24}from"node:path";function M52(){if(process.env.OMA_NO_AGENTMEMORY==="1")return null;if(process.env.AGENTMEMORY_URL)return process.env.AGENTMEMORY_URL;let $=A24(k24(),".agentmemory","endpoint.json");if(!L24($))return null;try{let z=JSON.parse(H24($,"utf-8"));if(typeof z.port==="number")return`http://127.0.0.1:${z.port}`;if(typeof z.url==="string"&&z.url.trim())return z.url;return null}catch{return null}}function O52($,z,G={}){return new Promise((J,Q)=>{let K=new URL(z,$),Z=K.protocol==="https:"?F24:q24;if(K.protocol!=="http:"&&K.protocol!=="https:"){Q(Error(`unsupported protocol ${K.protocol}`));return}let U=G.body,W={...G.headers??{}};if(U!==void 0&&W["content-length"]===void 0)W["content-length"]=String(Buffer.byteLength(U));let Y=Z.request(K,{method:G.method??"GET",headers:W},(V)=>{let B="";V.setEncoding("utf-8"),V.on("data",(L)=>{B+=L}),V.on("end",()=>{J({statusCode:V.statusCode??0,headers:V.headers,body:B})}),V.on("error",Q)});if(Y.setTimeout(G.timeoutMs??500,()=>{Y.destroy(Error("request timed out"))}),Y.on("error",Q),U!==void 0)Y.write(U);Y.end()})}async function zu2(){if(Gz!==null)return Gz;let $=M52();if(!$)return Gz=!1,Gz;try{let z=await O52($,"/agentmemory/health");if(z.statusCode<200||z.statusCode>=300)return Gz=!1,Gz;let G=z.headers["x-agentmemory-version"],J=Array.isArray(G)?G[0]:G,Q=!1,K;try{let U=JSON.parse(z.body);if(Q=U.service==="agentmemory"||U.status==="healthy"||U.status==="ok",typeof U.version==="string")K=U.version}catch{}let Z=J??K;return Gz=Q||Z!==void 0&&j24.test(Z),Gz}catch{return Gz=!1,Gz}}function M24(){let $=process.env.OMA_RECALL_MAX_AGE_DAYS,z=$===void 0?30:Number($);if(!Number.isFinite(z)||z<=0)return null;return z*24*60*60*1000}function O24($){let z=$.observation??{},G=[z.timestamp,z.created_at,$.timestamp,$.created_at];for(let J of G){if(typeof J==="number"&&Number.isFinite(J))return J<1000000000000?J*1000:J;if(typeof J==="string"&&J.trim()){let Q=Date.parse(J);if(Number.isFinite(Q))return Q}}return null}function I24($,z,G=Date.now()){let J;try{J=JSON.parse($)}catch{return[]}if(!Array.isArray(J.results))return[];let Q=(()=>{let W=Number(process.env.OMA_RECALL_MIN_SCORE);return Number.isFinite(W)?W:1})(),K=M24(),Z=K===null?null:G-K,U=[];for(let W of J.results){let Y=typeof W.score==="number"?W.score:0;if(Y<Q)continue;if(Z!==null){let F=O24(W);if(F!==null&&F<Z)continue}let V=W.observation??{},B=typeof V.narrative==="string"&&V.narrative.trim()?V.narrative.trim():"",L=Array.isArray(V.facts)?V.facts.filter((F)=>typeof F==="string").join("; "):"",X=typeof V.title==="string"?V.title.trim():"",H=B||L||X;if(!H)continue;let q=typeof V.type==="string"?V.type:void 0;if(U.push({text:H,source:q,score:Y}),U.length>=z)break}return U}async function Gu2($,z=5){if(!$.trim())return[];if(!await zu2())return[];let G=M52();if(!G)return[];
|
|
1403
|
+
`),RA($)}function j52($,z="main"){return $.active[z]??$.active.main??null}function X24($,z,G){return A52($,(J)=>{J.active[z]=G})}function DA($,z,G){return A52($,(J)=>{J.lastSession={vendor:z,vendorSid:G,ts:new Date().toISOString()}})}var ey2;var vA=N(()=>{ey2=RT(".agents","state","sessions")});import{existsSync as L24,readFileSync as H24}from"node:fs";import q24 from"node:http";import F24 from"node:https";import{homedir as k24}from"node:os";import{basename as N24,join as A24}from"node:path";function M52(){if(process.env.OMA_NO_AGENTMEMORY==="1")return null;if(process.env.AGENTMEMORY_URL)return process.env.AGENTMEMORY_URL;let $=A24(k24(),".agentmemory","endpoint.json");if(!L24($))return null;try{let z=JSON.parse(H24($,"utf-8"));if(typeof z.port==="number")return`http://127.0.0.1:${z.port}`;if(typeof z.url==="string"&&z.url.trim())return z.url;return null}catch{return null}}function O52($,z,G={}){return new Promise((J,Q)=>{let K=new URL(z,$),Z=K.protocol==="https:"?F24:q24;if(K.protocol!=="http:"&&K.protocol!=="https:"){Q(Error(`unsupported protocol ${K.protocol}`));return}let U=G.body,W={...G.headers??{}};if(U!==void 0&&W["content-length"]===void 0)W["content-length"]=String(Buffer.byteLength(U));let Y=Z.request(K,{method:G.method??"GET",headers:W},(V)=>{let B="";V.setEncoding("utf-8"),V.on("data",(L)=>{B+=L}),V.on("end",()=>{J({statusCode:V.statusCode??0,headers:V.headers,body:B})}),V.on("error",Q)});if(Y.setTimeout(G.timeoutMs??500,()=>{Y.destroy(Error("request timed out"))}),Y.on("error",Q),U!==void 0)Y.write(U);Y.end()})}async function zu2(){if(Gz!==null)return Gz;let $=M52();if(!$)return Gz=!1,Gz;try{let z=await O52($,"/agentmemory/health");if(z.statusCode<200||z.statusCode>=300)return Gz=!1,Gz;let G=z.headers["x-agentmemory-version"],J=Array.isArray(G)?G[0]:G,Q=!1,K;try{let U=JSON.parse(z.body);if(Q=U.service==="agentmemory"||U.status==="healthy"||U.status==="ok",typeof U.version==="string")K=U.version}catch{}let Z=J??K;return Gz=Q||Z!==void 0&&j24.test(Z),Gz}catch{return Gz=!1,Gz}}function M24(){let $=process.env.OMA_RECALL_MAX_AGE_DAYS,z=$===void 0?30:Number($);if(!Number.isFinite(z)||z<=0)return null;return z*24*60*60*1000}function O24($){let z=$.observation??{},G=[z.timestamp,z.created_at,$.timestamp,$.created_at];for(let J of G){if(typeof J==="number"&&Number.isFinite(J))return J<1000000000000?J*1000:J;if(typeof J==="string"&&J.trim()){let Q=Date.parse(J);if(Number.isFinite(Q))return Q}}return null}function I24($,z,G=Date.now()){let J;try{J=JSON.parse($)}catch{return[]}if(!Array.isArray(J.results))return[];let Q=(()=>{let W=Number(process.env.OMA_RECALL_MIN_SCORE);return Number.isFinite(W)?W:1})(),K=M24(),Z=K===null?null:G-K,U=[];for(let W of J.results){let Y=typeof W.score==="number"?W.score:0;if(Y<Q)continue;if(Z!==null){let F=O24(W);if(F!==null&&F<Z)continue}let V=W.observation??{},B=typeof V.narrative==="string"&&V.narrative.trim()?V.narrative.trim():"",L=Array.isArray(V.facts)?V.facts.filter((F)=>typeof F==="string").join("; "):"",X=typeof V.title==="string"?V.title.trim():"",H=B||L||X;if(!H)continue;let q=typeof V.type==="string"?V.type:void 0;if(U.push({text:H,source:q,score:Y}),U.length>=z)break}return U}async function Gu2($,z=5){if(!$.trim())return[];try{if(!await zu2())return[];let G=M52();if(!G)return[];let J=await O52(G,"/agentmemory/search",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({query:$,limit:z}),timeoutMs:2000});if(J.statusCode<200||J.statusCode>=300)return[];return I24(J.body,z)}catch{return[]}}async function Ju2($){try{if(!await zu2())return!1;let z=M52();if(!z)return!1;let G=$.projectDir??process.cwd(),J=await O52(z,"/agentmemory/observe",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({hookType:$.source,sessionId:$.sessionId,project:N24(G),cwd:G,timestamp:new Date().toISOString(),content:$.content})});return J.statusCode>=200&&J.statusCode<300}catch{return!1}}var j24,Gz=null;var I52=N(()=>{j24=/^0\.(9|1\d)\./});var Bu2={};z5(Bu2,{sortEvents:()=>v52,refreshMeta:()=>Vu2,readEvents:()=>ET,metaPath:()=>Wu2,eventsPath:()=>R52,emitEvent:()=>D52,deriveMeta:()=>Yu2,createEventId:()=>Uu2});import{appendFileSync as Qu2,existsSync as R24,mkdirSync as Ku2,readFileSync as D24}from"node:fs";import{dirname as Zu2,join as vT}from"node:path";function Uu2($=Date.now()){let z=$.toString(36).padStart(10,"0"),G=Math.random().toString(36).slice(2,10).padEnd(8,"0");return`${z}${G}`}function R52($,z){return vT(aB($,z),"events.jsonl")}function Wu2($,z){return vT(aB($,z),"meta.json")}async function D52($,z,G){let J={eventId:G.eventId??Uu2(),ts:G.ts??new Date().toISOString(),sid:z,kind:G.kind,writerPid:G.writerPid??process.pid,vendor:G.vendor,vendorSid:G.vendorSid,parentEventId:G.parentEventId,causalityKey:G.causalityKey,payload:G.payload},Q=R52($,z);try{Ku2(Zu2(Q),{recursive:!0}),Qu2(Q,`${JSON.stringify(J)}
|
|
1404
1404
|
`,"utf-8")}catch(K){let Z=K instanceof Error?K.message:String(K);throw process.stderr.write(`[oma] L1 events.jsonl write failed: ${Z}
|
|
1405
1405
|
`),process.stderr.write(`[oma] path=${Q}
|
|
1406
1406
|
`),process.stderr.write(`[oma] hint: run 'oma doctor' to diagnose disk/permission/corruption
|
package/package.json
CHANGED