oh-my-agent 10.7.2 → 10.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +3 -3
- 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 u4.env){let z=$.attributeName();if(this.getOptionValue(z)===void 0||["default","config","env"].includes(this.getOptionValueSource(z)))if($.required||$.optional)this.emit(`optionEnv:${$.name()}`,u4.env[$.envVar]);else this.emit(`optionEnv:${$.name()}`)}})}_parseOptionsImplied(){let $=new _F5(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),Y=this.options.find((V)=>V.negate&&Z===V.attributeName()),W=this.options.find((V)=>!V.negate&&Z===V.attributeName());if(Y&&(Y.presetArg===void 0&&U===!1||Y.presetArg!==void 0&&U===Y.presetArg))return Y;return W||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 PF5(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=az.basename($,az.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(u4.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 tU2($){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 Wf(){if(u4.env.NO_COLOR||u4.env.FORCE_COLOR==="0"||u4.env.FORCE_COLOR==="false")return!1;if(u4.env.FORCE_COLOR||u4.env.CLICOLOR_FORCE!==void 0)return!0;return}SF5.Command=Yf;SF5.useColor=Wf});var JW2=C((hF5)=>{var{Argument:$W2}=LR(),{Command:Vf}=eU2(),{CommanderError:uF5,InvalidArgumentError:zW2}=cq(),{Help:gF5}=Qf(),{Option:GW2}=Kf();hF5.program=new Vf;hF5.createCommand=($)=>new Vf($);hF5.createOption=($,z)=>new GW2($,z);hF5.createArgument=($,z)=>new $W2($,z);hF5.Command=Vf;hF5.Option=GW2;hF5.Argument=$W2;hF5.Help=gF5;hF5.CommanderError=uF5;hF5.InvalidArgumentError=zW2;hF5.InvalidOptionArgumentError=zW2});var QW2,Jp4,Qp4,Kp4,Zp4,Up4,Wp4,Yp4,qR,Vp4,Bp4,Xp4;var Bf=N(()=>{QW2=E2(JW2(),1),{program:Jp4,createCommand:Qp4,createArgument:Kp4,createOption:Zp4,CommanderError:Up4,InvalidArgumentError:Wp4,InvalidOptionArgumentError:Yp4,Command:qR,Argument:Vp4,Option:Bp4,Help:Xp4}=QW2.default});var FR;var Xf=N(()=>{FR={name:"oh-my-agent",version:"10.7.2",description:"Portable multi-agent harness for .agents-based skills and workflows across Antigravity, Claude Code, Codex, OpenCode, and more",type:"module",bin:{"oh-my-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 wY from"node:fs";import{homedir as tF5}from"node:os";import*as iq from"node:path";function ZW2($){if(kR)throw Error("install context already set in this process");kR=$}function UW2(){if(kR===null)throw Error("install context not set — entry point must call setInstallContext()");return kR}function CY(){return UW2().installRoot}function G6(){return UW2().mode}function PY(){try{return G6()}catch{return"project"}}function WW2($){let z=process.env.OMA_HOME,G=$.global===!0||process.env.OMA_INSTALL_GLOBAL==="1";if(z!==void 0&&z!=="")return eF5(z),{installRoot:z,mode:G?"global":"project"};if(G)return{installRoot:tF5(),mode:"global"};return{installRoot:process.cwd(),mode:"project"}}function eF5($){if(!iq.isAbsolute($))throw Error("OMA_HOME must be absolute path");for(let G of KW2)if($===G||$.startsWith(G+iq.sep))throw Error(`OMA_HOME=${$} is forbidden (system path ${G})`);let z;try{z=wY.realpathSync($)}catch(G){let J=G instanceof Error?G.message:String(G);throw Error(`OMA_HOME=${$}: ${J}`)}for(let G of KW2)if(z===G||z.startsWith(G+iq.sep))throw Error(`OMA_HOME=${z} is forbidden (system path ${G})`);try{wY.accessSync(z,wY.constants.W_OK)}catch{throw Error(`OMA_HOME=${z} is not writable`)}}var kR=null,KW2;var oz=N(()=>{KW2=["/etc","/usr","/bin","/boot","/sys","/proc"]});import{join as $k5}from"node:path";function lq($){return $.endsWith("/")?$:`${$}/`}function C7($,z){let G=z.split("/").filter((J)=>J.length>0);return $k5($,...G)}var R0=".agents",NR,C3,EJ,YW2,VW2,AR,zk5=".antigravitycli",BW2,Gk5=".migration-backup",Jk5,Qk5,Kk5,Zk5,Uk5,Lf;var P3=N(()=>{NR=`${R0}/skills`,C3=`${R0}/results`,EJ=`${R0}/state`,YW2=`${EJ}/sessions`,VW2=`${EJ}/retry`,AR=`${EJ}/archive`,BW2=`${R0}/backup`;Jk5=lq(C3),Qk5=lq(EJ),Kk5=lq(zk5),Zk5=lq(BW2),Uk5=lq(Gk5),Lf=[Kk5,Jk5,Qk5,Zk5,Uk5]});var m1="first-fluke/oh-my-agent",$1,D0,jR,Wk5,Yk5,rz,z3;var sz=N(()=>{P3();$1=NR,D0=["antigravity","claude","codex","commandcode","cursor","grok","kimi","kiro","qwen"],jR=["pi","opencode"],Wk5=["copilot","hermes"],Yk5=["zcode"],rz=[...D0,...Wk5,...Yk5].sort(),z3={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 NW2={};z5(NW2,{runAction:()=>T2,resolveJsonMode:()=>A5,printDescribe:()=>Ok5,addOutputOptions:()=>M5});function M5($,z="Output as JSON"){return $.option("--json",z).option("--output <format>","Output format (text/json)",(G)=>{let J=G.trim().toLowerCase();if(!pq.includes(J))throw Error(`Invalid output format: ${G}. Expected one of ${pq.join(", ")}`);return J})}function Vk5($){if($?.json)return"json";let z=$?.output?.trim().toLowerCase();if(z&&pq.includes(z))return z;if(process.env[HW2]?.trim().toLowerCase()==="json")return"json";return"text"}function A5($){return Vk5($)==="json"}function qW2($){let z=$.at(-1);return z instanceof qR?z:null}function Bk5($){let z=qW2($);if(z)return z.opts();let G=$.at(-1);return G&&typeof G==="object"?G:{}}function Xk5($){if($ instanceof Error)return $.message;return String($)}function wJ($){throw Error($)}function qf($,z){for(let G of $){let J=G.charCodeAt(0);if(J>=0&&J<=31||J===127)wJ(`${z} must not contain control characters`)}}function Lk5($,z){if(qf($,z),/[?#%]/.test($))wJ(`${z} must not contain ?, #, or %`);if($.includes(".."))wJ(`${z} must not contain '..'`)}function Hk5($,z){qf($,z);try{new URL($)}catch{wJ(`${z} must be a valid absolute URL`)}}function Hf($,z,G="text"){if(typeof $==="string"){if(G==="identifier"){Lk5($,z);return}if(G==="url"){Hk5($,z);return}qf($,z);return}if(Array.isArray($))for(let[J,Q]of $.entries())Hf(Q,`${z}[${J}]`,G)}function LW2($){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 qk5($){let z=$.vendor;if(typeof z==="string"){if(z.split(",").map((K)=>K.trim()).filter(Boolean).filter((K)=>!rz.includes(K)).length>0)wJ(`vendor must be one of ${rz.join(", ")}`)}let G=$.output;if(typeof G==="string"&&!pq.includes(G))wJ(`output must be one of ${pq.join(", ")}`)}function Fk5($){let z=$.processedArgs??$.args??[];($.registeredArguments??[]).forEach((Q,K)=>{let Z=Q.name?.()||String(K),U=z[K];if(Hf(U,Z,LW2(Z)),Z==="agent-type"&&typeof U==="string"&&!XW2.includes(U))wJ(`agent-type must be one of ${XW2.join(", ")}`)});let J=$.opts();qk5(J);for(let[Q,K]of Object.entries(J))Hf(K,Q,LW2(Q))}function kk5($){return($.registeredArguments??[]).map((z)=>({name:z.name?.()||"",required:!!z.required,variadic:!!z.variadic}))}function Nk5($){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 FW2($){let z=[],G=$;while(G?.parent)z.unshift(G.name()),G=G.parent;return z.join(" ")}function Ak5($){return $.options.some((z)=>z.long==="--json"||z.long==="--output")}function jk5($){return $.options.some((z)=>z.long==="--dry-run")}function kW2($){return{name:$.name(),path:FW2($),summary:$.summary()||void 0,description:$.description(),arguments:kk5($),options:Nk5($),supportsJsonOutput:Ak5($),supportsDryRun:jk5($),subcommands:$.commands.map((z)=>kW2(z))}}function Mk5($,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||FW2(Q)===G)return Q;J.push(...Q.commands)}return null}function Ok5($,z){let G=Mk5($,z);if(!G)wJ(`Unknown command: ${z}`);let J={name:$.name(),version:$.version(),description:$.description(),env:{[HW2]:"Set to json to force machine-readable output on commands that support it."},command:kW2(G)};console.log(JSON.stringify(J,null,2))}function T2($,z={}){return async(...G)=>{let J=qW2(G);if(J&&G.length>=2)G[G.length-2]=J.optsWithGlobals();let Q=Bk5(G);try{if(J)Fk5(J);await $(...G)}catch(K){let Z=Xk5(K);if(z.supportsJsonOutput&&A5(Q))console.log(JSON.stringify({error:Z},null,2));else console.error(Z);process.exitCode=1}}}var HW2="OH_MY_AG_OUTPUT_FORMAT",pq,XW2;var r4=N(()=>{Bf();sz();pq=["text","json"],XW2=["backend","frontend","mobile","qa","debug","pm"]});var AW2,jW2=($)=>{return $===12288||$>=65281&&$<=65376||$>=65504&&$<=65510},MW2=($)=>{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 OW2=N(()=>{AW2=(()=>{let $=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g;return(z)=>{let G=0;$.lastIndex=0;while($.test(z))G+=1;return z.length-G}})()});var Ik5,Rk5,IW2,Dk5,RW2,vk5,Ek5,wk5,DW2=($,z={},G={})=>{let J=z.limit??1/0,Q=z.ellipsis??"",K=z?.ellipsisWidth??(Q?DW2(Q,wk5,G).width:0),Z=0,U=G.controlWidth??0,Y=G.tabWidth??8,W=G.emojiWidth??2,V=2,B=G.regularWidth??1,L=G.wideWidth??2,X=[[vk5,B],[Ik5,0],[Rk5,U],[Dk5,Y],[RW2,W],[IW2,L]],H=0,q=0,F=$.length,k=0,A=!1,j=F,M=Math.max(0,J-K),O=0,D=0,R=0,I=0;$:while(!0){if(D>O||q>=F&&q>H){let E=$.slice(O,D)||$.slice(H,q);k=0;for(let b of E.replaceAll(Ek5,"")){let _=b.codePointAt(0)||0;if(jW2(_))I=2;else if(MW2(_))I=L;else I=B;if(R+I>M)j=Math.min(j,Math.max(O,H)+k);if(R+I>J){A=!0;break $}k+=b.length,R+=I}O=D=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=_===IW2?AW2($.slice(q,_.lastIndex)):_===RW2?1:_.lastIndex-q,I=k*h,R+I>M)j=Math.min(j,q+Math.floor((M-R)/h));if(R+I>J){A=!0;break $}R+=I,O=H,D=q,q=H=_.lastIndex;continue $}}q+=1}return{width:A?M:R,index:A?j:F,truncated:A,ellipsed:A&&J>=K}},vW2;var EW2=N(()=>{OW2();Ik5=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,Rk5=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,IW2=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/yu,Dk5=/\t{1,1000}/y,RW2=/[\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,vk5=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,Ek5=/\p{M}+/gu,wk5={limit:1/0,ellipsis:""},vW2=DW2});var Ck5,Pk5=($,z={})=>{return vW2($,Ck5,z).width},D6;var Ff=N(()=>{EW2();Ck5={limit:1/0,ellipsis:"",ellipsisWidth:0},D6=Pk5});function E$($,z,G){return String($).normalize().split(xk5).map((J)=>Sk5(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 tU2($){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 Wf(){if(u4.env.NO_COLOR||u4.env.FORCE_COLOR==="0"||u4.env.FORCE_COLOR==="false")return!1;if(u4.env.FORCE_COLOR||u4.env.CLICOLOR_FORCE!==void 0)return!0;return}SF5.Command=Yf;SF5.useColor=Wf});var JW2=C((hF5)=>{var{Argument:$W2}=LR(),{Command:Vf}=eU2(),{CommanderError:uF5,InvalidArgumentError:zW2}=cq(),{Help:gF5}=Qf(),{Option:GW2}=Kf();hF5.program=new Vf;hF5.createCommand=($)=>new Vf($);hF5.createOption=($,z)=>new GW2($,z);hF5.createArgument=($,z)=>new $W2($,z);hF5.Command=Vf;hF5.Option=GW2;hF5.Argument=$W2;hF5.Help=gF5;hF5.CommanderError=uF5;hF5.InvalidArgumentError=zW2;hF5.InvalidOptionArgumentError=zW2});var QW2,Jp4,Qp4,Kp4,Zp4,Up4,Wp4,Yp4,qR,Vp4,Bp4,Xp4;var Bf=N(()=>{QW2=E2(JW2(),1),{program:Jp4,createCommand:Qp4,createArgument:Kp4,createOption:Zp4,CommanderError:Up4,InvalidArgumentError:Wp4,InvalidOptionArgumentError:Yp4,Command:qR,Argument:Vp4,Option:Bp4,Help:Xp4}=QW2.default});var FR;var Xf=N(()=>{FR={name:"oh-my-agent",version:"10.8.0",description:"Portable multi-agent harness for .agents-based skills and workflows across Antigravity, Claude Code, Codex, OpenCode, and more",type:"module",bin:{"oh-my-agent":"./bin/cli.js",oma:"./bin/cli.js"},files:["bin"],keywords:["oh-my-agent","antigravity",".agents","agent","skills","agent-skills","multi-agent","orchestrator","claude","claude-code","codex","opencode","copilot","cursor","chatgpt","pm","frontend","backend","mobile","qa","debug","terraform","database","workflow","bug-fixing"],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 wY from"node:fs";import{homedir as tF5}from"node:os";import*as iq from"node:path";function ZW2($){if(kR)throw Error("install context already set in this process");kR=$}function UW2(){if(kR===null)throw Error("install context not set — entry point must call setInstallContext()");return kR}function CY(){return UW2().installRoot}function G6(){return UW2().mode}function PY(){try{return G6()}catch{return"project"}}function WW2($){let z=process.env.OMA_HOME,G=$.global===!0||process.env.OMA_INSTALL_GLOBAL==="1";if(z!==void 0&&z!=="")return eF5(z),{installRoot:z,mode:G?"global":"project"};if(G)return{installRoot:tF5(),mode:"global"};return{installRoot:process.cwd(),mode:"project"}}function eF5($){if(!iq.isAbsolute($))throw Error("OMA_HOME must be absolute path");for(let G of KW2)if($===G||$.startsWith(G+iq.sep))throw Error(`OMA_HOME=${$} is forbidden (system path ${G})`);let z;try{z=wY.realpathSync($)}catch(G){let J=G instanceof Error?G.message:String(G);throw Error(`OMA_HOME=${$}: ${J}`)}for(let G of KW2)if(z===G||z.startsWith(G+iq.sep))throw Error(`OMA_HOME=${z} is forbidden (system path ${G})`);try{wY.accessSync(z,wY.constants.W_OK)}catch{throw Error(`OMA_HOME=${z} is not writable`)}}var kR=null,KW2;var oz=N(()=>{KW2=["/etc","/usr","/bin","/boot","/sys","/proc"]});import{join as $k5}from"node:path";function lq($){return $.endsWith("/")?$:`${$}/`}function C7($,z){let G=z.split("/").filter((J)=>J.length>0);return $k5($,...G)}var R0=".agents",NR,C3,EJ,YW2,VW2,AR,zk5=".antigravitycli",BW2,Gk5=".migration-backup",Jk5,Qk5,Kk5,Zk5,Uk5,Lf;var P3=N(()=>{NR=`${R0}/skills`,C3=`${R0}/results`,EJ=`${R0}/state`,YW2=`${EJ}/sessions`,VW2=`${EJ}/retry`,AR=`${EJ}/archive`,BW2=`${R0}/backup`;Jk5=lq(C3),Qk5=lq(EJ),Kk5=lq(zk5),Zk5=lq(BW2),Uk5=lq(Gk5),Lf=[Kk5,Jk5,Qk5,Zk5,Uk5]});var m1="first-fluke/oh-my-agent",$1,D0,jR,Wk5,Yk5,rz,z3;var sz=N(()=>{P3();$1=NR,D0=["antigravity","claude","codex","commandcode","cursor","grok","kimi","kiro","qwen"],jR=["pi","opencode"],Wk5=["copilot","hermes"],Yk5=["zcode"],rz=[...D0,...Wk5,...Yk5].sort(),z3={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 NW2={};z5(NW2,{runAction:()=>T2,resolveJsonMode:()=>A5,printDescribe:()=>Ok5,addOutputOptions:()=>M5});function M5($,z="Output as JSON"){return $.option("--json",z).option("--output <format>","Output format (text/json)",(G)=>{let J=G.trim().toLowerCase();if(!pq.includes(J))throw Error(`Invalid output format: ${G}. Expected one of ${pq.join(", ")}`);return J})}function Vk5($){if($?.json)return"json";let z=$?.output?.trim().toLowerCase();if(z&&pq.includes(z))return z;if(process.env[HW2]?.trim().toLowerCase()==="json")return"json";return"text"}function A5($){return Vk5($)==="json"}function qW2($){let z=$.at(-1);return z instanceof qR?z:null}function Bk5($){let z=qW2($);if(z)return z.opts();let G=$.at(-1);return G&&typeof G==="object"?G:{}}function Xk5($){if($ instanceof Error)return $.message;return String($)}function wJ($){throw Error($)}function qf($,z){for(let G of $){let J=G.charCodeAt(0);if(J>=0&&J<=31||J===127)wJ(`${z} must not contain control characters`)}}function Lk5($,z){if(qf($,z),/[?#%]/.test($))wJ(`${z} must not contain ?, #, or %`);if($.includes(".."))wJ(`${z} must not contain '..'`)}function Hk5($,z){qf($,z);try{new URL($)}catch{wJ(`${z} must be a valid absolute URL`)}}function Hf($,z,G="text"){if(typeof $==="string"){if(G==="identifier"){Lk5($,z);return}if(G==="url"){Hk5($,z);return}qf($,z);return}if(Array.isArray($))for(let[J,Q]of $.entries())Hf(Q,`${z}[${J}]`,G)}function LW2($){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 qk5($){let z=$.vendor;if(typeof z==="string"){if(z.split(",").map((K)=>K.trim()).filter(Boolean).filter((K)=>!rz.includes(K)).length>0)wJ(`vendor must be one of ${rz.join(", ")}`)}let G=$.output;if(typeof G==="string"&&!pq.includes(G))wJ(`output must be one of ${pq.join(", ")}`)}function Fk5($){let z=$.processedArgs??$.args??[];($.registeredArguments??[]).forEach((Q,K)=>{let Z=Q.name?.()||String(K),U=z[K];if(Hf(U,Z,LW2(Z)),Z==="agent-type"&&typeof U==="string"&&!XW2.includes(U))wJ(`agent-type must be one of ${XW2.join(", ")}`)});let J=$.opts();qk5(J);for(let[Q,K]of Object.entries(J))Hf(K,Q,LW2(Q))}function kk5($){return($.registeredArguments??[]).map((z)=>({name:z.name?.()||"",required:!!z.required,variadic:!!z.variadic}))}function Nk5($){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 FW2($){let z=[],G=$;while(G?.parent)z.unshift(G.name()),G=G.parent;return z.join(" ")}function Ak5($){return $.options.some((z)=>z.long==="--json"||z.long==="--output")}function jk5($){return $.options.some((z)=>z.long==="--dry-run")}function kW2($){return{name:$.name(),path:FW2($),summary:$.summary()||void 0,description:$.description(),arguments:kk5($),options:Nk5($),supportsJsonOutput:Ak5($),supportsDryRun:jk5($),subcommands:$.commands.map((z)=>kW2(z))}}function Mk5($,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||FW2(Q)===G)return Q;J.push(...Q.commands)}return null}function Ok5($,z){let G=Mk5($,z);if(!G)wJ(`Unknown command: ${z}`);let J={name:$.name(),version:$.version(),description:$.description(),env:{[HW2]:"Set to json to force machine-readable output on commands that support it."},command:kW2(G)};console.log(JSON.stringify(J,null,2))}function T2($,z={}){return async(...G)=>{let J=qW2(G);if(J&&G.length>=2)G[G.length-2]=J.optsWithGlobals();let Q=Bk5(G);try{if(J)Fk5(J);await $(...G)}catch(K){let Z=Xk5(K);if(z.supportsJsonOutput&&A5(Q))console.log(JSON.stringify({error:Z},null,2));else console.error(Z);process.exitCode=1}}}var HW2="OH_MY_AG_OUTPUT_FORMAT",pq,XW2;var r4=N(()=>{Bf();sz();pq=["text","json"],XW2=["backend","frontend","mobile","qa","debug","pm"]});var AW2,jW2=($)=>{return $===12288||$>=65281&&$<=65376||$>=65504&&$<=65510},MW2=($)=>{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 OW2=N(()=>{AW2=(()=>{let $=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g;return(z)=>{let G=0;$.lastIndex=0;while($.test(z))G+=1;return z.length-G}})()});var Ik5,Rk5,IW2,Dk5,RW2,vk5,Ek5,wk5,DW2=($,z={},G={})=>{let J=z.limit??1/0,Q=z.ellipsis??"",K=z?.ellipsisWidth??(Q?DW2(Q,wk5,G).width:0),Z=0,U=G.controlWidth??0,Y=G.tabWidth??8,W=G.emojiWidth??2,V=2,B=G.regularWidth??1,L=G.wideWidth??2,X=[[vk5,B],[Ik5,0],[Rk5,U],[Dk5,Y],[RW2,W],[IW2,L]],H=0,q=0,F=$.length,k=0,A=!1,j=F,M=Math.max(0,J-K),O=0,D=0,R=0,I=0;$:while(!0){if(D>O||q>=F&&q>H){let E=$.slice(O,D)||$.slice(H,q);k=0;for(let b of E.replaceAll(Ek5,"")){let _=b.codePointAt(0)||0;if(jW2(_))I=2;else if(MW2(_))I=L;else I=B;if(R+I>M)j=Math.min(j,Math.max(O,H)+k);if(R+I>J){A=!0;break $}k+=b.length,R+=I}O=D=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=_===IW2?AW2($.slice(q,_.lastIndex)):_===RW2?1:_.lastIndex-q,I=k*h,R+I>M)j=Math.min(j,q+Math.floor((M-R)/h));if(R+I>J){A=!0;break $}R+=I,O=H,D=q,q=H=_.lastIndex;continue $}}q+=1}return{width:A?M:R,index:A?j:F,truncated:A,ellipsed:A&&J>=K}},vW2;var EW2=N(()=>{OW2();Ik5=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,Rk5=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,IW2=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/yu,Dk5=/\t{1,1000}/y,RW2=/[\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,vk5=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,Ek5=/\p{M}+/gu,wk5={limit:1/0,ellipsis:""},vW2=DW2});var Ck5,Pk5=($,z={})=>{return vW2($,Ck5,z).width},D6;var Ff=N(()=>{EW2();Ck5={limit:1/0,ellipsis:"",ellipsisWidth:0},D6=Pk5});function E$($,z,G){return String($).normalize().split(xk5).map((J)=>Sk5(J,z,G)).join(`
|
|
28
28
|
`)}var MR="\x1B",bW2="",Tk5=39,Nf="\x07",_W2="[",bk5="]",SW2="m",Af,wW2,CW2=($)=>{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},PW2=($)=>`${MR}${_W2}${$}${SW2}`,TW2=($)=>`${MR}${Af}${$}${Nf}`,kf=($,z,G)=>{let J=z[Symbol.iterator](),Q=!1,K=!1,Z=$.at(-1),U=Z===void 0?0:D6(Z),Y=J.next(),W=J.next(),V=0;while(!Y.done){let B=Y.value,L=D6(B);if(U+L<=G)$[$.length-1]+=B;else $.push(B),U=0;if(B===MR||B===bW2)Q=!0,K=z.startsWith(Af,V+1);if(Q){if(K){if(B===Nf)Q=!1,K=!1}else if(B===SW2)Q=!1}else if(U+=L,U===G&&!W.done)$.push(""),U=0;Y=W,W=J.next(),V+=B.length}if(Z=$.at(-1),!U&&Z!==void 0&&Z.length&&$.length>1)$[$.length-2]+=$.pop()},_k5=($)=>{let z=$.split(" "),G=z.length;while(G){if(D6(z[G-1]))break;G--}if(G===z.length)return $;return z.slice(0,G).join(" ")+z.slice(G).join("")},Sk5=($,z,G={})=>{if(G.trim!==!1&&$.trim()==="")return"";let J="",Q,K,Z=$.split(" "),U=[""],Y=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,Y=D6(q)}if(B!==0){if(Y>=z&&(G.wordWrap===!1||G.trim===!1))U.push(""),Y=0;if(Y||G.trim===!1)U[U.length-1]+=" ",Y++}let X=D6(L);if(G.hard&&X>z){let H=z-Y,q=1+Math.floor((X-H-1)/z);if(Math.floor((X-1)/z)<q)U.push("");kf(U,L,z),Y=D6(U.at(-1)??"");continue}if(Y+X>z&&Y&&X){if(G.wordWrap===!1&&Y<z){kf(U,L,z),Y=D6(U.at(-1)??"");continue}U.push(""),Y=0}if(Y+X>z&&G.wordWrap===!1){kf(U,L,z),Y=D6(U.at(-1)??"");continue}U[U.length-1]+=L,Y+=X}if(G.trim!==!1)U=U.map((B)=>_k5(B));let W=U.join(`
|
|
29
29
|
`),V=!1;for(let B=0;B<W.length;B++){let L=W[B];if(J+=L,!V){if(V=L>="\uD800"&&L<="\uDBFF",V)continue}else V=!1;if(L===MR||L===bW2){wW2.lastIndex=B+1;let H=wW2.exec(W)?.groups;if(H?.code!==void 0){let q=Number.parseFloat(H.code);Q=q===Tk5?void 0:q}else if(H?.uri!==void 0)K=H.uri.length===0?void 0:H.uri}if(W[B+1]===`
|
|
30
30
|
`){if(K)J+=TW2("");let X=Q?CW2(Q):void 0;if(Q&&X)J+=PW2(X)}else if(L===`
|
|
@@ -145,7 +145,7 @@ read_only_memory_patterns: []
|
|
|
145
145
|
line_ending:
|
|
146
146
|
ignored_memory_patterns: []
|
|
147
147
|
ls_specific_settings: {}
|
|
148
|
-
`;var eq=N(()=>{KY2=["tool","install","-p","3.13","serena-agent@latest","--prerelease=allow"],tq=`uv ${KY2.join(" ")}`;gf=v0(FN5(),".serena","serena_config.yml"),WY2={"oma-frontend":["typescript"],"oma-mobile":["dart"],"oma-tf-infra":["terraform"],"oma-db":["python"]},hf={python:"python",node:"typescript",rust:"rust"};MN5={bash:"~40 MB"}});var S9,XY2;var LY2=N(()=>{S9={domain:[{name:"oma-architecture",desc:"Architecture specialist for software/system design, module and service boundaries, tradeoff analysis, and stakeholder synthesis. Uses context-aware methods such as diagnostic routing, design-twice comparison, ATAM-style risk analysis, CBAM-style prioritization, and ADR-style decision records."},{name:"oma-backend",desc:"Backend specialist for APIs, databases, authentication with clean architecture (Repository/Service/Router pattern). Use for API, endpoint, REST, database, server, migration, and auth work."},{name:"oma-db",desc:"Database specialist for SQL, NoSQL, and vector database modeling, schema design, normalization, indexing, transactions, integrity, concurrency control, backup, capacity planning, data standards, anti-pattern review, and compliance-aware database design. Use for database, schema, ERD, table design, document model, vector index design, RAG retrieval architecture, migration, query tuning, glossary, capacity estimation, backup strategy, database anti-pattern remediation work, and ISO 27001, ISO 27002, or ISO 22301-aware database recommendations."},{name:"oma-frontend",desc:"Frontend specialist for React, Next.js, TypeScript with FSD-lite architecture, shadcn/ui, and design system alignment. Use for UI, component, page, layout, CSS, Tailwind, and shadcn work."},{name:"oma-mobile",desc:"Mobile specialist for Flutter, React Native, and Swift native iOS development. Use for mobile app, Flutter, Dart, React Native, Swift, SwiftUI, iOS, Android, Riverpod, swift-openapi-generator, and widget work."}],design:[{name:"oma-design",desc:"AI design specialist skill with DESIGN.md management, anti-pattern enforcement, optional Stitch MCP integration, and component library guidance. Covers typography, color systems, motion design (motion/react, GSAP, Three.js), responsive-first layouts, and accessibility (WCAG 2.2)."}],coordination:[{name:"oma-brainstorm",desc:"Design-first ideation that explores user intent, constraints, and approaches before any planning or implementation. Use for brainstorming, ideation, exploring concepts, and evaluating approaches."},{name:"oma-coordination",desc:"Guide for coordinating PM, Frontend, Backend, Mobile, and QA agents on complex projects via CLI. Use for manual step-by-step coordination and workflow guidance."},{name:"oma-orchestrator",desc:"Automated multi-agent orchestrator that spawns CLI subagents in parallel, coordinates via MCP Memory, and monitors progress. Use for orchestration, parallel execution, and automated multi-agent workflows."},{name:"oma-pm",desc:"Product manager that decomposes requirements into actionable tasks with priorities and dependencies. Use for planning, requirements, specification, scope, prioritization, task breakdown, and ISO 21500, ISO 31000, or ISO 38500-aligned planning recommendations."},{name:"oma-qa",desc:"Quality assurance specialist for security, performance, accessibility, comprehensive testing, and quality standard alignment. Use for test, review, security audit, OWASP, coverage, lint work, and ISO/IEC 25010 or ISO/IEC 29119-aligned QA recommendations."}],utility:[{name:"oma-academic-writer",desc:"Academic writing specialist for publication-grade English prose. Drafts, revises, and audits essays, reports, analysis sections, executive summaries, conclusions, and literature reviews while enforcing sentence-structure variation, high-frequency academic verbs, calibrated hedging, and anti-AI stylistic compliance. USE for academic writing, essay polish, paragraph rewrite, prose revision against any rubric tier (HD/D/C, A/B/C, top-band/mid-band, etc.), anti-AI audit, reverse outlining, claim-evidence mapping, and rubric enforcement on assignments."},{name:"oma-debug",desc:"Bug diagnosis and fixing specialist - analyzes errors, identifies root causes, provides fixes, and writes regression tests. Use for bug, debug, error, crash, traceback, exception, and regression work."},{name:"oma-deepsec",desc:"Drive Vercel's `deepsec` agent-powered vulnerability scanner end-to-end: installing the `.deepsec/` workspace, bootstrapping `INFO.md`, running cost-aware `scan` / `process` / `triage` / `revalidate` / `export` passes, gating PRs with `process --diff`, writing custom matchers, and triaging findings. Use whenever the user mentions deepsec, asks an agent to scan a repo for vulnerabilities, runs into `pnpm deepsec` / `bunx deepsec` commands, wants a CI-based PR security review, sees a `.deepsec/` directory, or asks about `INFO.md` / matchers / `process --diff` / `revalidate`, even when the tool name is not spoken. Deepsec scans are expensive (a single full scan can cost hundreds to tens of thousands of dollars) so the skill exists in part to keep the user from getting surprised."},{name:"oma-docs",desc:"Verify documentation references against the current codebase and propose updates for diff-affected docs. Use to check if docs still match reality (broken file paths, CLI commands, config keys, env vars, scripts) and to surface docs that may need updating after code changes."},{name:"oma-hwp",desc:"Convert HWP / HWPX / HWPML files to Markdown using kordoc. Extracts text, headings, tables, lists, images, footnotes, and hyperlinks. Use for Korean word processor files (Hangul), government documents, and AI-ready data preparation."},{name:"oma-image",desc:"Multi-vendor AI image generation with authentication-aware parallel dispatch. Routes to Codex (gpt-image-2 via ChatGPT OAuth), Antigravity (gemini-2.5-flash-image aka nano-banana via `agy` CLI + Gemini Code Assist), and Pollinations (flux/zimage, free with signup). Use for image generation, image creation, visual asset generation, and AI art."},{name:"oma-market",desc:"Market research skill for pain-point extraction, trend detection, competitor positioning, and discovery across community sources (Reddit, HN, Bluesky, Mastodon, GitHub Issues, web). Routes via oma-search transport, deterministic CLI compute, intent-auto SWOT/Porter's 5F/PESTEL frameworks. Use for market research, pain point analysis, trend detection, competitor research, user complaints, voice-of-customer, 시장조사, 사용자 페인, 트렌드, 경쟁구도."},{name:"oma-pdf",desc:"Convert PDF files to Markdown using opendataloader-pdf. Extracts text, tables, headings, lists, and images with correct reading order. Use for PDF parsing, PDF to Markdown conversion, document extraction, and AI-ready data preparation."},{name:"oma-recap",desc:"Analyze conversation histories from multiple AI tools (Grok, Claude, Codex, Qwen, Cursor, Antigravity) and generate themed daily/period work summaries. Filter by date or time window."},{name:"oma-refactor",desc:"Behavior-preserving refactoring specialist - plans and executes safe incremental restructuring with code smell / SATD / hotspot targeting, characterization-test safety nets, metric and coverage gates, and refactor-only commits. Use for refactor, refactoring, code smell, technical debt, legacy code modernization, extract method, hotspot, and characterization test work."},{name:"oma-scholar",desc:"Scholarly research companion using Knows sidecar spec (.knows.yaml). Generates, validates, reviews, queries, and compares structured research-paper sidecars, and fetches them from knows.academy. Use for academic literature search, survey synthesis, paper authoring assistance, and peer review with token-efficient claim/evidence/relation access."},{name:"oma-scm",desc:"SCM (software configuration management) and Git: branching, merges, conflicts, worktrees, baselines, audit readiness, plus Conventional Commits and safe staging."},{name:"oma-search",desc:"Intent-based search router with trust scoring. Routes queries to optimal channels (Context7 docs, native web search, gh/glab code search, Serena local) and attaches domain trust labels. Use for search, find, lookup, reference, docs, code search, and web research."},{name:"oma-skill-creator",desc:"Create or update OMA skills in the SSL-lite human-readable format. Use when adding a new `.agents/skills/{skill-name}/SKILL.md`, converting an existing skill to the standardized Scheduling / Structural Flow / Logical Operations / References structure, or validating whether a skill has enough routing, execution, resource, and safety detail."},{name:"oma-slide",desc:"HTML presentation deck generator and multi-format exporter. Generates distinctive, animation-rich HTML decks at a fixed 1920×1080 stage, then deterministically validates, bundles, and exports them to PDF/PNG/PPTX via the `oma slide` CLI. Use for slide, deck, presentation, slides, pptx, keynote, 슬라이드, 발표자료, プレゼン, 幻灯片 requests. Produces self-contained single-file HTML with keyboard/touch nav, speaker notes, and print-to-PDF support."},{name:"oma-translator",desc:"Context-aware translation that preserves tone, style, and natural word order. Use when translating UI strings, documentation, marketing copy, or any multilingual content. Infers register, domain, and style from the source text and surrounding codebase context."},{name:"oma-video",desc:"Short-form, explainer, and demo video generation via a key-optional 3-tier router. Composes scripts, oma-voice narration, oma-image/oma-slide/stock visuals, key-free captions, and a vendored Remotion compositor into reproducible run directories. Routes three modes — shorts/reels (9:16), explainer (16:9 README/code/data), and demo/walkthrough (screen capture, incl. supervised headed web-app capture of any URL). Use for video, shorts, reels, short-form, demo, explainer, walkthrough, screencast, web capture, video generation, 영상, 숏폼, 쇼츠, 릴스, 데모, 설명 영상."},{name:"oma-voice",desc:"Local-first text-to-speech and speech-to-text via the Voicebox MCP server. Generates speech from cloned or preset voice profiles for agent notifications, content voiceovers, and audio asset creation, and transcribes audio files for meeting notes or memos. Runs entirely on-device with no cloud, no API keys, no per-call cost. Use for voice generation, TTS, STT, transcription, voiceover, narration, dictation, audio asset work."}],infrastructure:[{name:"oma-dev-workflow",desc:"Use when setting up or optimizing developer workflows in a monorepo, managing mise tasks, git hooks, CI/CD pipelines, database migrations, or release automation. Invoke for development environment setup, build automation, testing workflows, and release coordination."},{name:"oma-observability",desc:"Intent-based observability + traceability router across layers, boundaries, and signals. Routes to vendor-specific skills via category taxonomy; owns transport tuning, meta-observability, incident forensics. Use for observability, traceability, telemetry, APM, RUM, metrics, logs, traces, profiles, SLO, incident forensics, tracing architecture work."},{name:"oma-tf-infra",desc:"Infrastructure-as-code specialist for multi-cloud provisioning using Terraform across any provider (AWS, GCP, Azure, Oracle Cloud). Use for terraform plan/apply, state management, compute, databases, storage, networking, IAM, OIDC, cost optimization, policy-as-code, ISO/IEC 42001 AI controls, ISO 22301 continuity, and ISO/IEC/IEEE 42010 architecture documentation."}]},XY2={fullstack:["oma-architecture","oma-brainstorm","oma-design","oma-frontend","oma-backend","oma-mobile","oma-db","oma-pm","oma-qa","oma-debug","oma-scm","oma-tf-infra","oma-dev-workflow"],"fullstack-web":["oma-architecture","oma-brainstorm","oma-design","oma-frontend","oma-backend","oma-db","oma-pm","oma-qa","oma-debug","oma-scm","oma-dev-workflow"],"fullstack-mobile":["oma-architecture","oma-brainstorm","oma-design","oma-mobile","oma-backend","oma-db","oma-pm","oma-qa","oma-debug","oma-scm","oma-dev-workflow"],frontend:["oma-architecture","oma-brainstorm","oma-design","oma-frontend","oma-pm","oma-qa","oma-debug","oma-scm"],backend:["oma-architecture","oma-brainstorm","oma-backend","oma-db","oma-pm","oma-qa","oma-debug","oma-scm","oma-dev-workflow"],mobile:["oma-architecture","oma-brainstorm","oma-mobile","oma-pm","oma-qa","oma-debug","oma-scm"],devops:["oma-architecture","oma-brainstorm","oma-tf-infra","oma-dev-workflow","oma-observability","oma-pm","oma-qa","oma-debug","oma-scm"],research:["oma-scholar","oma-market","oma-pdf","oma-hwp","oma-academic-writer","oma-search","oma-translator","oma-scm"],content:["oma-design","oma-image","oma-voice","oma-academic-writer","oma-translator","oma-scm"],all:[...S9.domain,...S9.design,...S9.coordination,...S9.utility,...S9.infrastructure].map(($)=>$.name)}});var C$=N(()=>{P3();LY2();sz()});import*as zG from"node:fs";import{dirname as qY2,join as mf,parse as FY2,resolve as cf,sep as HY2}from"node:path";function v6($){return HY2==="/"?$:$.split(HY2).join("/")}function x9($){try{if(!zG.lstatSync($).isDirectory())zG.unlinkSync($)}catch{}}function Z1($=process.cwd()){let z=cf($),G=FY2(z).root;for(let J=0;J<EN5;J++){if(zG.existsSync(mf(z,".agents")))return z;if(zG.existsSync(mf(z,".git")))return z;if(z===G)break;let Q=qY2(z);if(Q===z)break;z=Q}return cf($)}function P$($,z){let G=cf($),J=FY2(G).root;while(G!==J){let Q=mf(G,z);if(zG.existsSync(Q))return Q;G=qY2(G)}return null}var EN5=20;var a1=()=>{};var I4=C((xN5)=>{var lf=Symbol.for("yaml.alias"),kY2=Symbol.for("yaml.document"),_R=Symbol.for("yaml.map"),NY2=Symbol.for("yaml.pair"),pf=Symbol.for("yaml.scalar"),SR=Symbol.for("yaml.seq"),GG=Symbol.for("yaml.node.type"),wN5=($)=>!!$&&typeof $==="object"&&$[GG]===lf,CN5=($)=>!!$&&typeof $==="object"&&$[GG]===kY2,PN5=($)=>!!$&&typeof $==="object"&&$[GG]===_R,TN5=($)=>!!$&&typeof $==="object"&&$[GG]===NY2,AY2=($)=>!!$&&typeof $==="object"&&$[GG]===pf,bN5=($)=>!!$&&typeof $==="object"&&$[GG]===SR;function jY2($){if($&&typeof $==="object")switch($[GG]){case _R:case SR:return!0}return!1}function _N5($){if($&&typeof $==="object")switch($[GG]){case lf:case _R:case pf:case SR:return!0}return!1}var SN5=($)=>(AY2($)||jY2($))&&!!$.anchor;xN5.ALIAS=lf;xN5.DOC=kY2;xN5.MAP=_R;xN5.NODE_TYPE=GG;xN5.PAIR=NY2;xN5.SCALAR=pf;xN5.SEQ=SR;xN5.hasAnchor=SN5;xN5.isAlias=wN5;xN5.isCollection=jY2;xN5.isDocument=CN5;xN5.isMap=PN5;xN5.isNode=_N5;xN5.isPair=TN5;xN5.isScalar=AY2;xN5.isSeq=bN5});var $F=C((tN5)=>{var d3=I4(),U9=Symbol("break visit"),MY2=Symbol("skip children"),T$=Symbol("remove node");function xR($,z){let G=OY2(z);if(d3.isDocument($)){if(bY(null,$.contents,G,Object.freeze([$]))===T$)$.contents=null}else bY(null,$,G,Object.freeze([]))}xR.BREAK=U9;xR.SKIP=MY2;xR.REMOVE=T$;function bY($,z,G,J){let Q=IY2($,z,G,J);if(d3.isNode(Q)||d3.isPair(Q))return RY2($,J,Q),bY($,Q,G,J);if(typeof Q!=="symbol"){if(d3.isCollection(z)){J=Object.freeze(J.concat(z));for(let K=0;K<z.items.length;++K){let Z=bY(K,z.items[K],G,J);if(typeof Z==="number")K=Z-1;else if(Z===U9)return U9;else if(Z===T$)z.items.splice(K,1),K-=1}}else if(d3.isPair(z)){J=Object.freeze(J.concat(z));let K=bY("key",z.key,G,J);if(K===U9)return U9;else if(K===T$)z.key=null;let Z=bY("value",z.value,G,J);if(Z===U9)return U9;else if(Z===T$)z.value=null}}return Q}async function yR($,z){let G=OY2(z);if(d3.isDocument($)){if(await _Y(null,$.contents,G,Object.freeze([$]))===T$)$.contents=null}else await _Y(null,$,G,Object.freeze([]))}yR.BREAK=U9;yR.SKIP=MY2;yR.REMOVE=T$;async function _Y($,z,G,J){let Q=await IY2($,z,G,J);if(d3.isNode(Q)||d3.isPair(Q))return RY2($,J,Q),_Y($,Q,G,J);if(typeof Q!=="symbol"){if(d3.isCollection(z)){J=Object.freeze(J.concat(z));for(let K=0;K<z.items.length;++K){let Z=await _Y(K,z.items[K],G,J);if(typeof Z==="number")K=Z-1;else if(Z===U9)return U9;else if(Z===T$)z.items.splice(K,1),K-=1}}else if(d3.isPair(z)){J=Object.freeze(J.concat(z));let K=await _Y("key",z.key,G,J);if(K===U9)return U9;else if(K===T$)z.key=null;let Z=await _Y("value",z.value,G,J);if(Z===U9)return U9;else if(Z===T$)z.value=null}}return Q}function OY2($){if(typeof $==="object"&&($.Collection||$.Node||$.Value))return Object.assign({Alias:$.Node,Map:$.Node,Scalar:$.Node,Seq:$.Node},$.Value&&{Map:$.Value,Scalar:$.Value,Seq:$.Value},$.Collection&&{Map:$.Collection,Seq:$.Collection},$);return $}function IY2($,z,G,J){if(typeof G==="function")return G($,z,J);if(d3.isMap(z))return G.Map?.($,z,J);if(d3.isSeq(z))return G.Seq?.($,z,J);if(d3.isPair(z))return G.Pair?.($,z,J);if(d3.isScalar(z))return G.Scalar?.($,z,J);if(d3.isAlias(z))return G.Alias?.($,z,J);return}function RY2($,z,G){let J=z[z.length-1];if(d3.isCollection(J))J.items[$]=G;else if(d3.isPair(J))if($==="key")J.key=G;else J.value=G;else if(d3.isDocument(J))J.contents=G;else{let Q=d3.isAlias(J)?"alias":"scalar";throw Error(`Cannot replace node with ${Q} parent`)}}tN5.visit=xR;tN5.visitAsync=yR});var df=C((QA5)=>{var DY2=I4(),zA5=$F(),GA5={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},JA5=($)=>$.replace(/[!,[\]{}]/g,(z)=>GA5[z]);class I8{constructor($,z){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},I8.defaultYaml,$),this.tags=Object.assign({},I8.defaultTags,z)}clone(){let $=new I8(this.yaml,this.tags);return $.docStart=this.docStart,$}atDocument(){let $=new I8(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:I8.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},I8.defaultTags);break}return $}add($,z){if(this.atNextDocument)this.yaml={explicit:I8.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},I8.defaultTags),this.atNextDocument=!1;let G=$.trim().split(/[ \t]+/),J=G.shift();switch(J){case"%TAG":{if(G.length!==2){if(z(0,"%TAG directive should contain exactly two parts"),G.length<2)return!1}let[Q,K]=G;return this.tags[Q]=K,!0}case"%YAML":{if(this.yaml.explicit=!0,G.length!==1)return z(0,"%YAML directive should contain exactly one part"),!1;let[Q]=G;if(Q==="1.1"||Q==="1.2")return this.yaml.version=Q,!0;else{let K=/^\d+\.\d+$/.test(Q);return z(6,`Unsupported YAML version ${Q}`,K),!1}}default:return z(0,`Unknown directive ${J}`,!0),!1}}tagName($,z){if($==="!")return"!";if($[0]!=="!")return z(`Not a valid tag: ${$}`),null;if($[1]==="<"){let K=$.slice(2,-1);if(K==="!"||K==="!!")return z(`Verbatim tags aren't resolved, so ${$} is invalid.`),null;if($[$.length-1]!==">")z("Verbatim tags must end with a >");return K}let[,G,J]=$.match(/^(.*!)([^!]*)$/s);if(!J)z(`The ${$} tag has no suffix`);let Q=this.tags[G];if(Q)try{return Q+decodeURIComponent(J)}catch(K){return z(String(K)),null}if(G==="!")return $;return z(`Could not resolve tag: ${$}`),null}tagString($){for(let[z,G]of Object.entries(this.tags))if($.startsWith(G))return z+JA5($.substring(G.length));return $[0]==="!"?$:`!<${$}>`}toString($){let z=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],G=Object.entries(this.tags),J;if($&&G.length>0&&DY2.isNode($.contents)){let Q={};zA5.visit($.contents,(K,Z)=>{if(DY2.isNode(Z)&&Z.tag)Q[Z.tag]=!0}),J=Object.keys(Q)}else J=[];for(let[Q,K]of G){if(Q==="!!"&&K==="tag:yaml.org,2002:")continue;if(!$||J.some((Z)=>Z.startsWith(K)))z.push(`%TAG ${Q} ${K}`)}return z.join(`
|
|
148
|
+
`;var eq=N(()=>{KY2=["tool","install","-p","3.13","serena-agent@latest","--prerelease=allow"],tq=`uv ${KY2.join(" ")}`;gf=v0(FN5(),".serena","serena_config.yml"),WY2={"oma-frontend":["typescript"],"oma-mobile":["dart"],"oma-tf-infra":["terraform"],"oma-db":["python"]},hf={python:"python",node:"typescript",rust:"rust"};MN5={bash:"~40 MB"}});var S9,XY2;var LY2=N(()=>{S9={domain:[{name:"oma-architecture",desc:"Architecture specialist for software/system design, module and service boundaries, tradeoff analysis, and stakeholder synthesis. Uses context-aware methods such as diagnostic routing, design-twice comparison, ATAM-style risk analysis, CBAM-style prioritization, and ADR-style decision records."},{name:"oma-backend",desc:"Backend specialist for APIs, databases, authentication with clean architecture (Repository/Service/Router pattern). Use for API, endpoint, REST, database, server, migration, and auth work."},{name:"oma-db",desc:"Database specialist for SQL, NoSQL, and vector database modeling, schema design, normalization, indexing, transactions, integrity, concurrency control, backup, capacity planning, data standards, anti-pattern review, and compliance-aware database design. Use for database, schema, ERD, table design, document model, vector index design, RAG retrieval architecture, migration, query tuning, glossary, capacity estimation, backup strategy, database anti-pattern remediation work, and ISO 27001, ISO 27002, or ISO 22301-aware database recommendations."},{name:"oma-frontend",desc:"Frontend specialist for React, Next.js, Angular, TypeScript with FSD-lite architecture, shadcn/ui, and design system alignment. Use for UI, component, page, layout, CSS, Tailwind, shadcn, Angular, and RxJS work."},{name:"oma-mobile",desc:"Mobile specialist for Flutter, React Native, and Swift native iOS development. Use for mobile app, Flutter, Dart, React Native, Swift, SwiftUI, iOS, Android, Riverpod, swift-openapi-generator, and widget work."}],design:[{name:"oma-design",desc:"AI design specialist skill with DESIGN.md management, anti-pattern enforcement, optional Stitch MCP integration, and component library guidance. Covers typography, color systems, motion design (motion/react, GSAP, Three.js), responsive-first layouts, and accessibility (WCAG 2.2)."}],coordination:[{name:"oma-brainstorm",desc:"Design-first ideation that explores user intent, constraints, and approaches before any planning or implementation. Use for brainstorming, ideation, exploring concepts, and evaluating approaches."},{name:"oma-coordination",desc:"Guide for coordinating PM, Frontend, Backend, Mobile, and QA agents on complex projects via CLI. Use for manual step-by-step coordination and workflow guidance."},{name:"oma-orchestrator",desc:"Automated multi-agent orchestrator that spawns CLI subagents in parallel, coordinates via MCP Memory, and monitors progress. Use for orchestration, parallel execution, and automated multi-agent workflows."},{name:"oma-pm",desc:"Product manager that decomposes requirements into actionable tasks with priorities and dependencies. Use for planning, requirements, specification, scope, prioritization, task breakdown, and ISO 21500, ISO 31000, or ISO 38500-aligned planning recommendations."},{name:"oma-qa",desc:"Quality assurance specialist for security, performance, accessibility, comprehensive testing, and quality standard alignment. Use for test, review, security audit, OWASP, coverage, lint work, and ISO/IEC 25010 or ISO/IEC 29119-aligned QA recommendations."}],utility:[{name:"oma-academic-writer",desc:"Academic writing specialist for publication-grade English prose. Drafts, revises, and audits essays, reports, analysis sections, executive summaries, conclusions, and literature reviews while enforcing sentence-structure variation, high-frequency academic verbs, calibrated hedging, and anti-AI stylistic compliance. USE for academic writing, essay polish, paragraph rewrite, prose revision against any rubric tier (HD/D/C, A/B/C, top-band/mid-band, etc.), anti-AI audit, reverse outlining, claim-evidence mapping, and rubric enforcement on assignments."},{name:"oma-debug",desc:"Bug diagnosis and fixing specialist - analyzes errors, identifies root causes, provides fixes, and writes regression tests. Use for bug, debug, error, crash, traceback, exception, and regression work."},{name:"oma-deepsec",desc:"Drive Vercel's `deepsec` agent-powered vulnerability scanner end-to-end: installing the `.deepsec/` workspace, bootstrapping `INFO.md`, running cost-aware `scan` / `process` / `triage` / `revalidate` / `export` passes, gating PRs with `process --diff`, writing custom matchers, and triaging findings. Use whenever the user mentions deepsec, asks an agent to scan a repo for vulnerabilities, runs into `pnpm deepsec` / `bunx deepsec` commands, wants a CI-based PR security review, sees a `.deepsec/` directory, or asks about `INFO.md` / matchers / `process --diff` / `revalidate`, even when the tool name is not spoken. Deepsec scans are expensive (a single full scan can cost hundreds to tens of thousands of dollars) so the skill exists in part to keep the user from getting surprised."},{name:"oma-docs",desc:"Verify documentation references against the current codebase and propose updates for diff-affected docs. Use to check if docs still match reality (broken file paths, CLI commands, config keys, env vars, scripts) and to surface docs that may need updating after code changes."},{name:"oma-hwp",desc:"Convert HWP / HWPX / HWPML files to Markdown using kordoc. Extracts text, headings, tables, lists, images, footnotes, and hyperlinks. Use for Korean word processor files (Hangul), government documents, and AI-ready data preparation."},{name:"oma-image",desc:"Multi-vendor AI image generation with authentication-aware parallel dispatch. Routes to Codex (gpt-image-2 via ChatGPT OAuth), Antigravity (gemini-2.5-flash-image aka nano-banana via `agy` CLI + Gemini Code Assist), and Pollinations (flux/zimage, free with signup). Use for image generation, image creation, visual asset generation, and AI art."},{name:"oma-market",desc:"Market research skill for pain-point extraction, trend detection, competitor positioning, and discovery across community sources (Reddit, HN, Bluesky, Mastodon, GitHub Issues, web). Routes via oma-search transport, deterministic CLI compute, intent-auto SWOT/Porter's 5F/PESTEL frameworks. Use for market research, pain point analysis, trend detection, competitor research, user complaints, voice-of-customer, 시장조사, 사용자 페인, 트렌드, 경쟁구도."},{name:"oma-pdf",desc:"Convert PDF files to Markdown using opendataloader-pdf. Extracts text, tables, headings, lists, and images with correct reading order. Use for PDF parsing, PDF to Markdown conversion, document extraction, and AI-ready data preparation."},{name:"oma-recap",desc:"Analyze conversation histories from multiple AI tools (Grok, Claude, Codex, Qwen, Cursor, Antigravity) and generate themed daily/period work summaries. Filter by date or time window."},{name:"oma-refactor",desc:"Behavior-preserving refactoring specialist - plans and executes safe incremental restructuring with code smell / SATD / hotspot targeting, characterization-test safety nets, metric and coverage gates, and refactor-only commits. Use for refactor, refactoring, code smell, technical debt, legacy code modernization, extract method, hotspot, and characterization test work."},{name:"oma-scholar",desc:"Scholarly research companion using Knows sidecar spec (.knows.yaml). Generates, validates, reviews, queries, and compares structured research-paper sidecars, and fetches them from knows.academy. Use for academic literature search, survey synthesis, paper authoring assistance, and peer review with token-efficient claim/evidence/relation access."},{name:"oma-scm",desc:"SCM (software configuration management) and Git: branching, merges, conflicts, worktrees, baselines, audit readiness, plus Conventional Commits and safe staging."},{name:"oma-search",desc:"Intent-based search router with trust scoring. Routes queries to optimal channels (Context7 docs, native web search, gh/glab code search, Serena local) and attaches domain trust labels. Use for search, find, lookup, reference, docs, code search, and web research."},{name:"oma-skill-creator",desc:"Create or update OMA skills in the SSL-lite human-readable format. Use when adding a new `.agents/skills/{skill-name}/SKILL.md`, converting an existing skill to the standardized Scheduling / Structural Flow / Logical Operations / References structure, or validating whether a skill has enough routing, execution, resource, and safety detail."},{name:"oma-slide",desc:"HTML presentation deck generator and multi-format exporter. Generates distinctive, animation-rich HTML decks at a fixed 1920×1080 stage, then deterministically validates, bundles, and exports them to PDF/PNG/PPTX via the `oma slide` CLI. Use for slide, deck, presentation, slides, pptx, keynote, 슬라이드, 발표자료, プレゼン, 幻灯片 requests. Produces self-contained single-file HTML with keyboard/touch nav, speaker notes, and print-to-PDF support."},{name:"oma-translator",desc:"Context-aware translation that preserves tone, style, and natural word order. Use when translating UI strings, documentation, marketing copy, or any multilingual content. Infers register, domain, and style from the source text and surrounding codebase context."},{name:"oma-video",desc:"Short-form, explainer, and demo video generation via a key-optional 3-tier router. Composes scripts, oma-voice narration, oma-image/oma-slide/stock visuals, key-free captions, and a vendored Remotion compositor into reproducible run directories. Routes three modes — shorts/reels (9:16), explainer (16:9 README/code/data), and demo/walkthrough (screen capture, incl. supervised headed web-app capture of any URL). Use for video, shorts, reels, short-form, demo, explainer, walkthrough, screencast, web capture, video generation, 영상, 숏폼, 쇼츠, 릴스, 데모, 설명 영상."},{name:"oma-voice",desc:"Local-first text-to-speech and speech-to-text via the Voicebox MCP server. Generates speech from cloned or preset voice profiles for agent notifications, content voiceovers, and audio asset creation, and transcribes audio files for meeting notes or memos. Runs entirely on-device with no cloud, no API keys, no per-call cost. Use for voice generation, TTS, STT, transcription, voiceover, narration, dictation, audio asset work."}],infrastructure:[{name:"oma-dev-workflow",desc:"Use when setting up or optimizing developer workflows in a monorepo, managing mise tasks, git hooks, CI/CD pipelines, database migrations, or release automation. Invoke for development environment setup, build automation, testing workflows, and release coordination."},{name:"oma-observability",desc:"Intent-based observability + traceability router across layers, boundaries, and signals. Routes to vendor-specific skills via category taxonomy; owns transport tuning, meta-observability, incident forensics. Use for observability, traceability, telemetry, APM, RUM, metrics, logs, traces, profiles, SLO, incident forensics, tracing architecture work."},{name:"oma-tf-infra",desc:"Infrastructure-as-code specialist for multi-cloud provisioning using Terraform across any provider (AWS, GCP, Azure, Oracle Cloud). Use for terraform plan/apply, state management, compute, databases, storage, networking, IAM, OIDC, cost optimization, policy-as-code, ISO/IEC 42001 AI controls, ISO 22301 continuity, and ISO/IEC/IEEE 42010 architecture documentation."}]},XY2={fullstack:["oma-architecture","oma-brainstorm","oma-design","oma-frontend","oma-backend","oma-mobile","oma-db","oma-pm","oma-qa","oma-debug","oma-scm","oma-tf-infra","oma-dev-workflow"],"fullstack-web":["oma-architecture","oma-brainstorm","oma-design","oma-frontend","oma-backend","oma-db","oma-pm","oma-qa","oma-debug","oma-scm","oma-dev-workflow"],"fullstack-mobile":["oma-architecture","oma-brainstorm","oma-design","oma-mobile","oma-backend","oma-db","oma-pm","oma-qa","oma-debug","oma-scm","oma-dev-workflow"],frontend:["oma-architecture","oma-brainstorm","oma-design","oma-frontend","oma-pm","oma-qa","oma-debug","oma-scm"],backend:["oma-architecture","oma-brainstorm","oma-backend","oma-db","oma-pm","oma-qa","oma-debug","oma-scm","oma-dev-workflow"],mobile:["oma-architecture","oma-brainstorm","oma-mobile","oma-pm","oma-qa","oma-debug","oma-scm"],devops:["oma-architecture","oma-brainstorm","oma-tf-infra","oma-dev-workflow","oma-observability","oma-pm","oma-qa","oma-debug","oma-scm"],research:["oma-scholar","oma-market","oma-pdf","oma-hwp","oma-academic-writer","oma-search","oma-translator","oma-scm"],content:["oma-design","oma-image","oma-voice","oma-academic-writer","oma-translator","oma-scm"],all:[...S9.domain,...S9.design,...S9.coordination,...S9.utility,...S9.infrastructure].map(($)=>$.name)}});var C$=N(()=>{P3();LY2();sz()});import*as zG from"node:fs";import{dirname as qY2,join as mf,parse as FY2,resolve as cf,sep as HY2}from"node:path";function v6($){return HY2==="/"?$:$.split(HY2).join("/")}function x9($){try{if(!zG.lstatSync($).isDirectory())zG.unlinkSync($)}catch{}}function Z1($=process.cwd()){let z=cf($),G=FY2(z).root;for(let J=0;J<EN5;J++){if(zG.existsSync(mf(z,".agents")))return z;if(zG.existsSync(mf(z,".git")))return z;if(z===G)break;let Q=qY2(z);if(Q===z)break;z=Q}return cf($)}function P$($,z){let G=cf($),J=FY2(G).root;while(G!==J){let Q=mf(G,z);if(zG.existsSync(Q))return Q;G=qY2(G)}return null}var EN5=20;var a1=()=>{};var I4=C((xN5)=>{var lf=Symbol.for("yaml.alias"),kY2=Symbol.for("yaml.document"),_R=Symbol.for("yaml.map"),NY2=Symbol.for("yaml.pair"),pf=Symbol.for("yaml.scalar"),SR=Symbol.for("yaml.seq"),GG=Symbol.for("yaml.node.type"),wN5=($)=>!!$&&typeof $==="object"&&$[GG]===lf,CN5=($)=>!!$&&typeof $==="object"&&$[GG]===kY2,PN5=($)=>!!$&&typeof $==="object"&&$[GG]===_R,TN5=($)=>!!$&&typeof $==="object"&&$[GG]===NY2,AY2=($)=>!!$&&typeof $==="object"&&$[GG]===pf,bN5=($)=>!!$&&typeof $==="object"&&$[GG]===SR;function jY2($){if($&&typeof $==="object")switch($[GG]){case _R:case SR:return!0}return!1}function _N5($){if($&&typeof $==="object")switch($[GG]){case lf:case _R:case pf:case SR:return!0}return!1}var SN5=($)=>(AY2($)||jY2($))&&!!$.anchor;xN5.ALIAS=lf;xN5.DOC=kY2;xN5.MAP=_R;xN5.NODE_TYPE=GG;xN5.PAIR=NY2;xN5.SCALAR=pf;xN5.SEQ=SR;xN5.hasAnchor=SN5;xN5.isAlias=wN5;xN5.isCollection=jY2;xN5.isDocument=CN5;xN5.isMap=PN5;xN5.isNode=_N5;xN5.isPair=TN5;xN5.isScalar=AY2;xN5.isSeq=bN5});var $F=C((tN5)=>{var d3=I4(),U9=Symbol("break visit"),MY2=Symbol("skip children"),T$=Symbol("remove node");function xR($,z){let G=OY2(z);if(d3.isDocument($)){if(bY(null,$.contents,G,Object.freeze([$]))===T$)$.contents=null}else bY(null,$,G,Object.freeze([]))}xR.BREAK=U9;xR.SKIP=MY2;xR.REMOVE=T$;function bY($,z,G,J){let Q=IY2($,z,G,J);if(d3.isNode(Q)||d3.isPair(Q))return RY2($,J,Q),bY($,Q,G,J);if(typeof Q!=="symbol"){if(d3.isCollection(z)){J=Object.freeze(J.concat(z));for(let K=0;K<z.items.length;++K){let Z=bY(K,z.items[K],G,J);if(typeof Z==="number")K=Z-1;else if(Z===U9)return U9;else if(Z===T$)z.items.splice(K,1),K-=1}}else if(d3.isPair(z)){J=Object.freeze(J.concat(z));let K=bY("key",z.key,G,J);if(K===U9)return U9;else if(K===T$)z.key=null;let Z=bY("value",z.value,G,J);if(Z===U9)return U9;else if(Z===T$)z.value=null}}return Q}async function yR($,z){let G=OY2(z);if(d3.isDocument($)){if(await _Y(null,$.contents,G,Object.freeze([$]))===T$)$.contents=null}else await _Y(null,$,G,Object.freeze([]))}yR.BREAK=U9;yR.SKIP=MY2;yR.REMOVE=T$;async function _Y($,z,G,J){let Q=await IY2($,z,G,J);if(d3.isNode(Q)||d3.isPair(Q))return RY2($,J,Q),_Y($,Q,G,J);if(typeof Q!=="symbol"){if(d3.isCollection(z)){J=Object.freeze(J.concat(z));for(let K=0;K<z.items.length;++K){let Z=await _Y(K,z.items[K],G,J);if(typeof Z==="number")K=Z-1;else if(Z===U9)return U9;else if(Z===T$)z.items.splice(K,1),K-=1}}else if(d3.isPair(z)){J=Object.freeze(J.concat(z));let K=await _Y("key",z.key,G,J);if(K===U9)return U9;else if(K===T$)z.key=null;let Z=await _Y("value",z.value,G,J);if(Z===U9)return U9;else if(Z===T$)z.value=null}}return Q}function OY2($){if(typeof $==="object"&&($.Collection||$.Node||$.Value))return Object.assign({Alias:$.Node,Map:$.Node,Scalar:$.Node,Seq:$.Node},$.Value&&{Map:$.Value,Scalar:$.Value,Seq:$.Value},$.Collection&&{Map:$.Collection,Seq:$.Collection},$);return $}function IY2($,z,G,J){if(typeof G==="function")return G($,z,J);if(d3.isMap(z))return G.Map?.($,z,J);if(d3.isSeq(z))return G.Seq?.($,z,J);if(d3.isPair(z))return G.Pair?.($,z,J);if(d3.isScalar(z))return G.Scalar?.($,z,J);if(d3.isAlias(z))return G.Alias?.($,z,J);return}function RY2($,z,G){let J=z[z.length-1];if(d3.isCollection(J))J.items[$]=G;else if(d3.isPair(J))if($==="key")J.key=G;else J.value=G;else if(d3.isDocument(J))J.contents=G;else{let Q=d3.isAlias(J)?"alias":"scalar";throw Error(`Cannot replace node with ${Q} parent`)}}tN5.visit=xR;tN5.visitAsync=yR});var df=C((QA5)=>{var DY2=I4(),zA5=$F(),GA5={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},JA5=($)=>$.replace(/[!,[\]{}]/g,(z)=>GA5[z]);class I8{constructor($,z){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},I8.defaultYaml,$),this.tags=Object.assign({},I8.defaultTags,z)}clone(){let $=new I8(this.yaml,this.tags);return $.docStart=this.docStart,$}atDocument(){let $=new I8(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:I8.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},I8.defaultTags);break}return $}add($,z){if(this.atNextDocument)this.yaml={explicit:I8.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},I8.defaultTags),this.atNextDocument=!1;let G=$.trim().split(/[ \t]+/),J=G.shift();switch(J){case"%TAG":{if(G.length!==2){if(z(0,"%TAG directive should contain exactly two parts"),G.length<2)return!1}let[Q,K]=G;return this.tags[Q]=K,!0}case"%YAML":{if(this.yaml.explicit=!0,G.length!==1)return z(0,"%YAML directive should contain exactly one part"),!1;let[Q]=G;if(Q==="1.1"||Q==="1.2")return this.yaml.version=Q,!0;else{let K=/^\d+\.\d+$/.test(Q);return z(6,`Unsupported YAML version ${Q}`,K),!1}}default:return z(0,`Unknown directive ${J}`,!0),!1}}tagName($,z){if($==="!")return"!";if($[0]!=="!")return z(`Not a valid tag: ${$}`),null;if($[1]==="<"){let K=$.slice(2,-1);if(K==="!"||K==="!!")return z(`Verbatim tags aren't resolved, so ${$} is invalid.`),null;if($[$.length-1]!==">")z("Verbatim tags must end with a >");return K}let[,G,J]=$.match(/^(.*!)([^!]*)$/s);if(!J)z(`The ${$} tag has no suffix`);let Q=this.tags[G];if(Q)try{return Q+decodeURIComponent(J)}catch(K){return z(String(K)),null}if(G==="!")return $;return z(`Could not resolve tag: ${$}`),null}tagString($){for(let[z,G]of Object.entries(this.tags))if($.startsWith(G))return z+JA5($.substring(G.length));return $[0]==="!"?$:`!<${$}>`}toString($){let z=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],G=Object.entries(this.tags),J;if($&&G.length>0&&DY2.isNode($.contents)){let Q={};zA5.visit($.contents,(K,Z)=>{if(DY2.isNode(Z)&&Z.tag)Q[Z.tag]=!0}),J=Object.keys(Q)}else J=[];for(let[Q,K]of G){if(Q==="!!"&&K==="tag:yaml.org,2002:")continue;if(!$||J.some((Z)=>Z.startsWith(K)))z.push(`%TAG ${Q} ${K}`)}return z.join(`
|
|
149
149
|
`)}}I8.defaultYaml={explicit:!1,version:"1.2"};I8.defaultTags={"!!":"tag:yaml.org,2002:"};QA5.Directives=I8});var uR=C((YA5)=>{var vY2=I4(),ZA5=$F();function UA5($){if(/[\x00-\x19\s,[\]{}]/.test($)){let G=`Anchor must not contain whitespace or control characters: ${JSON.stringify($)}`;throw Error(G)}return!0}function EY2($){let z=new Set;return ZA5.visit($,{Value(G,J){if(J.anchor)z.add(J.anchor)}}),z}function wY2($,z){for(let G=1;;++G){let J=`${$}${G}`;if(!z.has(J))return J}}function WA5($,z){let G=[],J=new Map,Q=null;return{onAnchor:(K)=>{G.push(K),Q??(Q=EY2($));let Z=wY2(z,Q);return Q.add(Z),Z},setAnchors:()=>{for(let K of G){let Z=J.get(K);if(typeof Z==="object"&&Z.anchor&&(vY2.isScalar(Z.node)||vY2.isCollection(Z.node)))Z.node.anchor=Z.anchor;else{let U=Error("Failed to resolve repeated object (this should not happen)");throw U.source=K,U}}},sourceObjects:J}}YA5.anchorIsValid=UA5;YA5.anchorNames=EY2;YA5.createNodeAnchors=WA5;YA5.findNewAnchor=wY2});var nf=C((HA5)=>{function zF($,z,G,J){if(J&&typeof J==="object")if(Array.isArray(J))for(let Q=0,K=J.length;Q<K;++Q){let Z=J[Q],U=zF($,J,String(Q),Z);if(U===void 0)delete J[Q];else if(U!==Z)J[Q]=U}else if(J instanceof Map)for(let Q of Array.from(J.keys())){let K=J.get(Q),Z=zF($,J,Q,K);if(Z===void 0)J.delete(Q);else if(Z!==K)J.set(Q,Z)}else if(J instanceof Set)for(let Q of Array.from(J)){let K=zF($,J,Q,Q);if(K===void 0)J.delete(Q);else if(K!==Q)J.delete(Q),J.add(K)}else for(let[Q,K]of Object.entries(J)){let Z=zF($,J,Q,K);if(Z===void 0)delete J[Q];else if(Z!==K)J[Q]=Z}return $.call(z,G,J)}HA5.applyReviver=zF});var bJ=C((kA5)=>{var FA5=I4();function CY2($,z,G){if(Array.isArray($))return $.map((J,Q)=>CY2(J,String(Q),G));if($&&typeof $.toJSON==="function"){if(!G||!FA5.hasAnchor($))return $.toJSON(z,G);let J={aliasCount:0,count:1,res:void 0};G.anchors.set($,J),G.onCreate=(K)=>{J.res=K,delete G.onCreate};let Q=$.toJSON(z,G);if(G.onCreate)G.onCreate(Q);return Q}if(typeof $==="bigint"&&!G?.keep)return Number($);return $}kA5.toJS=CY2});var gR=C((MA5)=>{var AA5=nf(),PY2=I4(),jA5=bJ();class TY2{constructor($){Object.defineProperty(this,PY2.NODE_TYPE,{value:$})}clone(){let $=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));if(this.range)$.range=this.range.slice();return $}toJS($,{mapAsMap:z,maxAliasCount:G,onAnchor:J,reviver:Q}={}){if(!PY2.isDocument($))throw TypeError("A document argument is required");let K={anchors:new Map,doc:$,keep:!0,mapAsMap:z===!0,mapKeyWarned:!1,maxAliasCount:typeof G==="number"?G:100},Z=jA5.toJS(this,"",K);if(typeof J==="function")for(let{count:U,res:Y}of K.anchors.values())J(Y,U);return typeof Q==="function"?AA5.applyReviver(Q,{"":Z},"",Z):Z}}MA5.NodeBase=TY2});var GF=C((EA5)=>{var IA5=uR(),RA5=$F(),SY=I4(),DA5=gR(),vA5=bJ();class bY2 extends DA5.NodeBase{constructor($){super(SY.ALIAS);this.source=$,Object.defineProperty(this,"tag",{set(){throw Error("Alias nodes cannot have tags")}})}resolve($,z){if(z?.maxAliasCount===0)throw ReferenceError("Alias resolution is disabled");let G;if(z?.aliasResolveCache)G=z.aliasResolveCache;else if(G=[],RA5.visit($,{Node:(Q,K)=>{if(SY.isAlias(K)||SY.hasAnchor(K))G.push(K)}}),z)z.aliasResolveCache=G;let J=void 0;for(let Q of G){if(Q===this)break;if(Q.anchor===this.source)J=Q}return J}toJSON($,z){if(!z)return{source:this.source};let{anchors:G,doc:J,maxAliasCount:Q}=z,K=this.resolve(J,z);if(!K){let U=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw ReferenceError(U)}let Z=G.get(K);if(!Z)vA5.toJS(K,null,z),Z=G.get(K);if(Z?.res===void 0)throw ReferenceError("This should not happen: Alias anchor was not resolved?");if(Q>=0){if(Z.count+=1,Z.aliasCount===0)Z.aliasCount=hR(J,K,G);if(Z.count*Z.aliasCount>Q)throw ReferenceError("Excessive alias count indicates a resource exhaustion attack")}return Z.res}toString($,z,G){let J=`*${this.source}`;if($){if(IA5.anchorIsValid(this.source),$.options.verifyAliasOrder&&!$.anchors.has(this.source)){let Q=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw Error(Q)}if($.implicitKey)return`${J} `}return J}}function hR($,z,G){if(SY.isAlias(z)){let J=z.resolve($),Q=G&&J&&G.get(J);return Q?Q.count*Q.aliasCount:0}else if(SY.isCollection(z)){let J=0;for(let Q of z.items){let K=hR($,Q,G);if(K>J)J=K}return J}else if(SY.isPair(z)){let J=hR($,z.key,G),Q=hR($,z.value,G);return Math.max(J,Q)}return 1}EA5.Alias=bY2});var T3=C((_A5)=>{var CA5=I4(),PA5=gR(),TA5=bJ(),bA5=($)=>!$||typeof $!=="function"&&typeof $!=="object";class HZ extends PA5.NodeBase{constructor($){super(CA5.SCALAR);this.value=$}toJSON($,z){return z?.keep?this.value:TA5.toJS(this.value,$,z)}toString(){return String(this.value)}}HZ.BLOCK_FOLDED="BLOCK_FOLDED";HZ.BLOCK_LITERAL="BLOCK_LITERAL";HZ.PLAIN="PLAIN";HZ.QUOTE_DOUBLE="QUOTE_DOUBLE";HZ.QUOTE_SINGLE="QUOTE_SINGLE";_A5.Scalar=HZ;_A5.isScalarValue=bA5});var JF=C((fA5)=>{var yA5=GF(),qZ=I4(),_Y2=T3(),uA5="tag:yaml.org,2002:";function gA5($,z,G){if(z){let J=G.filter((K)=>K.tag===z),Q=J.find((K)=>!K.format)??J[0];if(!Q)throw Error(`Tag ${z} not found`);return Q}return G.find((J)=>J.identify?.($)&&!J.format)}function hA5($,z,G){if(qZ.isDocument($))$=$.contents;if(qZ.isNode($))return $;if(qZ.isPair($)){let B=G.schema[qZ.MAP].createNode?.(G.schema,null,G);return B.items.push($),B}if($ instanceof String||$ instanceof Number||$ instanceof Boolean||typeof BigInt<"u"&&$ instanceof BigInt)$=$.valueOf();let{aliasDuplicateObjects:J,onAnchor:Q,onTagObj:K,schema:Z,sourceObjects:U}=G,Y=void 0;if(J&&$&&typeof $==="object")if(Y=U.get($),Y)return Y.anchor??(Y.anchor=Q($)),new yA5.Alias(Y.anchor);else Y={anchor:null,node:null},U.set($,Y);if(z?.startsWith("!!"))z=uA5+z.slice(2);let W=gA5($,z,Z.tags);if(!W){if($&&typeof $.toJSON==="function")$=$.toJSON();if(!$||typeof $!=="object"){let B=new _Y2.Scalar($);if(Y)Y.node=B;return B}W=$ instanceof Map?Z[qZ.MAP]:(Symbol.iterator in Object($))?Z[qZ.SEQ]:Z[qZ.MAP]}if(K)K(W),delete G.onTagObj;let V=W?.createNode?W.createNode(G.schema,$,G):typeof W?.nodeClass?.from==="function"?W.nodeClass.from(G.schema,$,G):new _Y2.Scalar($);if(z)V.tag=z;else if(!W.default)V.tag=W.tag;if(Y)Y.node=V;return V}fA5.createNode=hA5});var fR=C((lA5)=>{var cA5=JF(),b$=I4(),iA5=gR();function af($,z,G){let J=G;for(let Q=z.length-1;Q>=0;--Q){let K=z[Q];if(typeof K==="number"&&Number.isInteger(K)&&K>=0){let Z=[];Z[K]=J,J=Z}else J=new Map([[K,J]])}return cA5.createNode(J,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw Error("This should not happen, please report a bug.")},schema:$,sourceObjects:new Map})}var SY2=($)=>$==null||typeof $==="object"&&!!$[Symbol.iterator]().next().done;class xY2 extends iA5.NodeBase{constructor($,z){super($);Object.defineProperty(this,"schema",{value:z,configurable:!0,enumerable:!1,writable:!0})}clone($){let z=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));if($)z.schema=$;if(z.items=z.items.map((G)=>b$.isNode(G)||b$.isPair(G)?G.clone($):G),this.range)z.range=this.range.slice();return z}addIn($,z){if(SY2($))this.add(z);else{let[G,...J]=$,Q=this.get(G,!0);if(b$.isCollection(Q))Q.addIn(J,z);else if(Q===void 0&&this.schema)this.set(G,af(this.schema,J,z));else throw Error(`Expected YAML collection at ${G}. Remaining path: ${J}`)}}deleteIn($){let[z,...G]=$;if(G.length===0)return this.delete(z);let J=this.get(z,!0);if(b$.isCollection(J))return J.deleteIn(G);else throw Error(`Expected YAML collection at ${z}. Remaining path: ${G}`)}getIn($,z){let[G,...J]=$,Q=this.get(G,!0);if(J.length===0)return!z&&b$.isScalar(Q)?Q.value:Q;else return b$.isCollection(Q)?Q.getIn(J,z):void 0}hasAllNullValues($){return this.items.every((z)=>{if(!b$.isPair(z))return!1;let G=z.value;return G==null||$&&b$.isScalar(G)&&G.value==null&&!G.commentBefore&&!G.comment&&!G.tag})}hasIn($){let[z,...G]=$;if(G.length===0)return this.has(z);let J=this.get(z,!0);return b$.isCollection(J)?J.hasIn(G):!1}setIn($,z){let[G,...J]=$;if(J.length===0)this.set(G,z);else{let Q=this.get(G,!0);if(b$.isCollection(Q))Q.setIn(J,z);else if(Q===void 0&&this.schema)this.set(G,af(this.schema,J,z));else throw Error(`Expected YAML collection at ${G}. Remaining path: ${J}`)}}}lA5.Collection=xY2;lA5.collectionFromPath=af;lA5.isEmptyPath=SY2});var QF=C((rA5)=>{var aA5=($)=>$.replace(/^(?!$)(?: $)?/gm,"#");function of($,z){if(/^\n+$/.test($))return $.substring(1);return z?$.replace(/^(?! *$)/gm,z):$}var oA5=($,z,G)=>$.endsWith(`
|
|
150
150
|
`)?of(G,z):G.includes(`
|
|
151
151
|
`)?`
|
|
@@ -1403,7 +1403,7 @@ ${G.prunedSerena.map((Q)=>` ${Q}`).join(`
|
|
|
1403
1403
|
`),"Retry queue")}var W5;var Qu2=N(()=>{k1();tB();_U();PA();q52();ET();RT();A52();j52();W5=E2(X5(),1)});var Ku2={};z5(Ku2,{upgradeAgentMemory:()=>bT,uninstallAgentMemoryService:()=>FT,setupAgentMemory:()=>TT,registerMemory:()=>x24,maintainAgentMemory:()=>sB,installAgentMemoryService:()=>aB,getAgentMemoryStatus:()=>PT,getAgentMemoryServicePresence:()=>qT,garbageCollectLocalState:()=>IT,drainMemoryRetryQueue:()=>rB,controlAgentMemoryDaemon:()=>r0});function x24($){M5($.command("memory:init").description("Initialize Serena memory schema in .serena/memories").option("--force","Overwrite empty or existing schema files")).action(T2(async(J)=>{await oy2(A5(J),J.force)},{supportsJsonOutput:!0})),M5($.command("memory:setup").description("Prepare AgentMemory endpoint configuration").option("--endpoint <url>","Write an explicit AgentMemory endpoint URL").option("--port <port>","Write a loopback AgentMemory port").option("--install","Install @agentmemory/agentmemory globally").option("--start","Start AgentMemory after setup").option("--dry-run","Preview setup without writing files")).action(T2(async(J)=>{await sy2(A5(J),{endpoint:J.endpoint,port:J.port,install:J.install,start:J.start,dryRun:J.dryRun})},{supportsJsonOutput:!0}));let z=$.command("memory:daemon").description("Manage an OMA-owned AgentMemory daemon process");M5(z.command("status").description("Show daemon status")).action(T2(async(J)=>{await TA("status",A5(J))},{supportsJsonOutput:!0})),M5(z.command("start").description("Start AgentMemory in the background").option("--port <port>","Loopback REST port","3111").option("--dry-run","Preview the daemon command without starting it")).action(T2(async(J)=>{await TA("start",A5(J),{port:J.port,dryRun:J.dryRun})},{supportsJsonOutput:!0})),M5(z.command("stop").description("Stop the OMA-owned AgentMemory daemon").option("--dry-run","Preview stop without signaling a process")).action(T2(async(J)=>{await TA("stop",A5(J),{dryRun:J.dryRun})},{supportsJsonOutput:!0})),M5(z.command("restart").description("Restart the OMA-owned AgentMemory daemon").option("--port <port>","Loopback REST port","3111").option("--dry-run","Preview restart without signaling a process")).action(T2(async(J)=>{await TA("restart",A5(J),{port:J.port,dryRun:J.dryRun})},{supportsJsonOutput:!0}));let G=$.command("memory:service").description("Manage AgentMemory OS service integration");M5(G.command("install").description("Install AgentMemory launchd/systemd service integration").option("--port <port>","Loopback REST port","3111").option("--dry-run","Preview service install without writing files")).action(T2(async(J)=>{ty2(A5(J),J.dryRun,J.port)},{supportsJsonOutput:!0})),M5(G.command("uninstall").description("Uninstall AgentMemory launchd/systemd service integration").option("--dry-run","Preview service uninstall without changing files")).action(T2(async(J)=>{ey2(A5(J),J.dryRun)},{supportsJsonOutput:!0})),M5($.command("memory:status").description("Show AgentMemory provider health")).action(T2(async(J)=>{await ry2(A5(J))},{supportsJsonOutput:!0})),M5($.command("memory:retry-drain").description("Drain queued AgentMemory observe retries").option("--dry-run","Inspect retry queue without modifying it")).action(T2(async(J)=>{await Ju2(A5(J),J.dryRun)},{supportsJsonOutput:!0})),M5($.command("memory:import").description("Import vendor conversation history into AgentMemory").option("--source <source>","Import source: all, claude, codex, cursor, gemini, qwen, retry","all").option("--since <since>","Import window start: 24h, 7d, 30d, or YYYY-MM-DD","30d").option("--dry-run","Preview import without writing to AgentMemory").option("--force-partial","Accept partial source coverage for locked or best-effort stores")).action(T2(async(J)=>{await xy2(A5(J),{source:J.source,since:J.since,dryRun:J.dryRun,forcePartial:J.forcePartial})},{supportsJsonOutput:!0})),M5($.command("memory:maintain <action>").description("Maintain AgentMemory local storage: backup, prune, vacuum").option("--keep <count>","Backups to keep when pruning","5").option("--dry-run","Preview maintenance without changing files")).action(T2(async(J,Q)=>{if(!["backup","prune","vacuum"].includes(J))throw Error("invalid memory maintain action: use backup, prune, or vacuum");$u2(J,A5(Q),{keep:Q.keep,dryRun:Q.dryRun})},{supportsJsonOutput:!0})),M5($.command("memory:gc").description("Garbage-collect project-local memory: prune old L1 sessions and ephemeral Serena files").option("--scope <scope>","Stores to sweep: all, sessions, serena","all").option("--keep <count>","Most-recent L1 sessions to retain (config: memory.gc.keep_sessions, default 100)").option("--max-age-days <days>","Prune Serena run artifacts older than N days, 0 disables (config: memory.gc.max_age_days, default 50)").option("--dry-run","Preview the prune plan without deleting files")).action(T2(async(J)=>{let Q=J.scope??"all";if(!["all","sessions","serena"].includes(Q))throw Error("invalid memory gc scope: use all, sessions, or serena");zu2(A5(J),{scope:Q,keep:J.keep,maxAgeDays:J.maxAgeDays,dryRun:J.dryRun})},{supportsJsonOutput:!0})),M5($.command("memory:upgrade").description("Stop, backup, upgrade, restart, and health-check AgentMemory").option("--port <port>","Loopback REST port after restart").option("--dry-run","Preview upgrade without changing files")).action(T2(async(J)=>{await Gu2(A5(J),{port:J.port,dryRun:J.dryRun})},{supportsJsonOutput:!0}))}var M52=N(()=>{_U();r4();PA();q52();yy2();ET();Qu2();RT();A52();j52()});import{accessSync as y24,existsSync as O52,constants as u24,readFileSync as g24}from"node:fs";import{homedir as h24}from"node:os";import{join as I52}from"node:path";function f24($){try{let z=JSON.parse($);return typeof z.sid==="string"&&typeof z.kind==="string"&&typeof z.eventId==="string"&&typeof z.ts==="string"}catch{return!1}}function m24($){let z=RA($);if(!O52(z))return{path:z,total:0,invalid:0};let G=g24(z,"utf-8").split(`
|
|
1404
1404
|
`).filter((J)=>J.trim());return{path:z,total:G.length,invalid:G.filter((J)=>!f24(J)).length}}function c24($){return{pidPath:$.pidPath,ownedPid:$.ownedPid,ownedProcessRunning:$.ownedProcessRunning,endpoint:$.endpoint}}function Zu2($){try{return y24($,u24.X_OK),!0}catch{return!1}}function i24($){let z=h24();return[...($.PATH??"").split(":"),I52(z,".bun","bin"),I52(z,".local","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"].filter((G,J,Q)=>G&&Q.indexOf(G)===J)}function l24($,z){if($.includes("/"))return O52($)&&Zu2($)?$:void 0;for(let G of i24(z)){let J=I52(G,$);if(O52(J)&&Zu2(J))return J}return}function p24($){let z=$.AGENTMEMORY_BIN||"agentmemory",G=l24(z,$);return{command:z,available:G!==void 0,path:G}}function d24($){let z=[];if($.status.endpoint&&!$.status.reachable)z.push($.status.reason??"AgentMemory endpoint is not reachable");if(!$.binary.available&&$.service.installed)z.push(`AgentMemory binary not found: ${$.binary.command}`);if($.retryQueue.total>0)z.push(`${$.retryQueue.total} queued AgentMemory observe retries`);if($.retryQueue.invalid>0)z.push(`${$.retryQueue.invalid} invalid AgentMemory retry rows`);return z}async function Uu2($){let z=m24($),G=await r0({action:"status"}),J=G.status,Q=p24(process.env),K=qT();return{status:J,binary:Q,retryQueue:z,service:K,daemon:c24(G),issues:d24({status:J,binary:Q,retryQueue:z,service:K})}}var Wu2=N(()=>{m8();M52()});import{homedir as n24}from"node:os";async function Yu2($){let z=await zU($),G=qw($),J=Hj2($);return{installed:z!==null,version:z,mode:G,schemaVersion:J}}async function Vu2($,z=n24()){let G=await Yu2($),J=await Yu2(z),Q=[];if(G.installed&&J.installed){if(G.version!==J.version)Q.push(`Version mismatch: project=${G.version??"unknown"} vs global=${J.version??"unknown"}. Run \`oma update --global\` or \`oma update\` to align.`);if(G.mode!==null&&G.mode!=="project")Q.push(`Project _version.json has mode=${G.mode}; expected "project".`);if(J.mode!==null&&J.mode!=="global")Q.push(`Global _version.json has mode=${J.mode}; expected "global".`)}else if(!G.installed&&!J.installed)Q.push("No oma install detected. Run `oma install` (project) or `oma install --global` (HOME).");for(let[K,Z]of[["Project",G],["Global",J]])if(Z.installed&&Z.mode===null)Q.push(`${K} install pre-dates the install-mode marker (schemaVersion=1). Run \`oma update${K==="Global"?" --global":""}\` to backfill.`);return{project:G,global:J,warnings:Q}}var Bu2=N(()=>{UN()});import{spawn as a24}from"node:child_process";import{existsSync as bA,readFileSync as Xu2}from"node:fs";import{join as _T}from"node:path";async function R52($,z,G){return new Promise((J)=>{let Q="",K,Z=!1,U=a24(z,["--version"],{stdio:["ignore","pipe","ignore"]});U.stdout.on("data",(V)=>{Q+=V.toString("utf-8")});let Y=(V,B)=>{if(Z)return;Z=!0,clearTimeout(K),J(V?{name:$,installed:!0,version:B,installCmd:G}:{name:$,installed:!1,installCmd:G})};U.on("close",(V)=>{if(V===0)Y(!0,Q.trim());else Y(!1)}),U.on("error",()=>{Y(!1)});let W=setTimeout(()=>{try{U.kill("SIGTERM")}catch{}K=setTimeout(()=>{try{U.kill("SIGKILL")}catch{}},r24),Y(!1)},o24);U.on("close",()=>{clearTimeout(W)})})}function Hu2($){let z=process.env.HOME||process.env.USERPROFILE||"",J={claude:{path:`${z}/.claude.json`,type:"json"},codex:{path:`${z}/.codex/config.toml`,type:"toml"}}[$];if(!J)return{configured:!1};if(!bA(J.path))return{configured:!1};try{let Q=Xu2(J.path,"utf-8");if(J.type==="json"){let K=JSON.parse(Q);return{configured:!!(K.mcpServers||K.mcp),path:J.path}}return{configured:!0,path:J.path}}catch{return{configured:!1}}}function qu2(){let $=_T(process.cwd(),$1);if(!bA($))return[];return GQ().map((z)=>{let G=_T($,z.name);return{name:z.name,installed:bA(G),hasSkillMd:bA(_T(G,"SKILL.md"))}})}function e24($,z){try{let G=_T($,z);if(!bA(G))return!1;return Xu2(G,"utf-8").includes(t24)}catch{return!1}}function Fu2($,z){let G=new Set(z.filter((J)=>J.installed).map((J)=>J.name));return s24.map(({fileName:J,cliNames:Q})=>({fileName:J,required:Q.some((K)=>G.has(K)),hasOmaBlock:e24($,J)}))}var o24,r24=200,Lu2,s24,t24="<!-- OMA:START";var ku2=N(()=>{_7();o24=Number(process.env.OMA_DOCTOR_PROBE_TIMEOUT_MS??5000),Lu2=[["claude","claude","bun install --global @anthropic-ai/claude-code"],["codex","codex","bun install --global @openai/codex"],["qwen","qwen","bun install --global @qwen-code/qwen-code"],["antigravity","agy","curl -fsSL https://antigravity.google/cli/install.sh | bash"],["grok","grok","Follow instructions at https://grok.x.ai"],["kiro","kiro-cli","Follow instructions at https://kiro.dev"],["kimi","kimi","Follow instructions at https://www.kimi.com/code"],["pi","pi","bun install --global @earendil-works/pi-coding-agent"]],s24=[{fileName:"CLAUDE.md",cliNames:["claude"]},{fileName:"AGENTS.md",cliNames:["codex","qwen"]}]});import{existsSync as $54}from"node:fs";import{dirname as z54,join as G54,sep as Nu2}from"node:path";function D52($){return Nu2==="/"?$:$.split(Nu2).join("/")}function v52($){let z=$;for(let G=0;G<J54;G++){if($54(G54(z,".git")))return z;let J=z54(z);if(J===z)return $;z=J}return $}var J54=20;var ST=()=>{};function eB($,z){switch($){case"antigravity":return JSON.stringify({injectSteps:[{ephemeralMessage:z}]});case"claude":case"commandcode":return JSON.stringify({additionalContext:z,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:z}});case"codex":return JSON.stringify({hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:z}});case"cursor":return JSON.stringify({additionalContext:z,additional_context:z,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:z}});case"grok":return JSON.stringify({additionalContext:z});case"kiro":return z;case"kimi":return z;case"pi":return JSON.stringify({additionalContext:z});case"qwen":return JSON.stringify({hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:z}})}}function E52($,z){switch($){case"claude":case"codex":case"commandcode":case"cursor":case"kiro":case"qwen":return JSON.stringify({decision:"block",reason:z});case"antigravity":return JSON.stringify({decision:"continue",reason:z});case"pi":return JSON.stringify({block:!0,reason:z});case"grok":return JSON.stringify({decision:"block",reason:z});case"kimi":return JSON.stringify({decision:"block",reason:z,hookSpecificOutput:{permissionDecision:"deny",permissionDecisionReason:z}})}}function w52($,z){switch($){case"cursor":return JSON.stringify({updated_input:z,hookSpecificOutput:{hookEventName:"PreToolUse",updatedInput:z}});case"claude":case"codex":case"commandcode":case"kimi":case"kiro":case"qwen":return JSON.stringify({hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"allow",updatedInput:z}});case"pi":return JSON.stringify({updatedInput:z});case"antigravity":return JSON.stringify({decision:"allow"});case"grok":return JSON.stringify({decision:"allow",toolInput:z})}}import{existsSync as Q54,readFileSync as K54}from"node:fs";function PG($){return Array.isArray($.workspacePaths)&&typeof $.conversationId==="string"}function C52($){let z=$.workspacePaths;if(Array.isArray(z)&&typeof z[0]==="string")return z[0];return null}function yU($){return typeof $.conversationId==="string"?$.conversationId:null}function _A($){if(typeof $!=="string"||!Q54($))return"";let z="";try{for(let J of K54($,"utf-8").split(`
|
|
1405
1405
|
`)){let Q=J.trim();if(!Q)continue;try{let K=JSON.parse(Q);if(K.type==="USER_INPUT"&&typeof K.content==="string")z=K.content}catch{}}}catch{return""}return(z.match(/<USER_REQUEST>\s*([\s\S]*?)\s*<\/USER_REQUEST>/)?.[1]??z).trim()}var xQ=()=>{};var Au2,$X="unknown";var P52=N(()=>{Au2=["antigravity","claude","codex","commandcode","cursor","grok","kimi","kiro","pi","qwen"]});import{existsSync as Z54,mkdirSync as U54,unlinkSync as W54,writeFileSync as Y54}from"node:fs";import{dirname as V54,join as ju2}from"node:path";function Mu2($){return ju2($,B54)}function Ou2($,z){let G=Mu2($);try{U54(V54(G),{recursive:!0}),Y54(G,`${z.trim()}
|
|
1406
|
-
`)}catch{}}function Iu2($){let z=Mu2($);try{if(Z54(z))W54(z)}catch{}}var B54;var T52=N(()=>{B54=ju2(".grok","rules","oma-state.md")});var zX;var xT=N(()=>{zX={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 L54}from"node:path";function Ru2($){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 L54(".pi","extensions","oma")}}var uU=N(()=>{xQ();ST()});var Tu2={};z5(Tu2,{updateIndex:()=>y52,setLastSession:()=>xA,setActiveSession:()=>j54,sessionsDir:()=>S52,sessionDir:()=>GX,readIndex:()=>SA,indexPath:()=>x52,getActiveSid:()=>u52,defaultIndex:()=>_52,atomicWriteJson:()=>uT,STATE_ROOT:()=>Pu2});import{closeSync as vu2,existsSync as b52,fsyncSync as Eu2,mkdirSync as H54,openSync as wu2,readFileSync as q54,renameSync as F54,statSync as Du2,writeFileSync as k54}from"node:fs";import{dirname as Cu2,join as yT}from"node:path";function S52($){return yT($,Pu2)}function x52($){return yT(S52($),"_index.json")}function GX($,z){return yT(S52($),z)}function _52(){return{schemaVersion:1,active:{}}}function N54($){H54(Cu2($),{recursive:!0})}function A54($){try{let z=wu2(Cu2($),"r");try{Eu2(z)}finally{vu2(z)}}catch{}}function uT($,z){N54($);let G=`${$}.${process.pid}.${Date.now()}.tmp`;k54(G,`${JSON.stringify(z,null,2)}
|
|
1406
|
+
`)}catch{}}function Iu2($){let z=Mu2($);try{if(Z54(z))W54(z)}catch{}}var B54;var T52=N(()=>{B54=ju2(".grok","rules","oma-state.md")});var zX;var xT=N(()=>{zX={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","angular"],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 L54}from"node:path";function Ru2($){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 L54(".pi","extensions","oma")}}var uU=N(()=>{xQ();ST()});var Tu2={};z5(Tu2,{updateIndex:()=>y52,setLastSession:()=>xA,setActiveSession:()=>j54,sessionsDir:()=>S52,sessionDir:()=>GX,readIndex:()=>SA,indexPath:()=>x52,getActiveSid:()=>u52,defaultIndex:()=>_52,atomicWriteJson:()=>uT,STATE_ROOT:()=>Pu2});import{closeSync as vu2,existsSync as b52,fsyncSync as Eu2,mkdirSync as H54,openSync as wu2,readFileSync as q54,renameSync as F54,statSync as Du2,writeFileSync as k54}from"node:fs";import{dirname as Cu2,join as yT}from"node:path";function S52($){return yT($,Pu2)}function x52($){return yT(S52($),"_index.json")}function GX($,z){return yT(S52($),z)}function _52(){return{schemaVersion:1,active:{}}}function N54($){H54(Cu2($),{recursive:!0})}function A54($){try{let z=wu2(Cu2($),"r");try{Eu2(z)}finally{vu2(z)}}catch{}}function uT($,z){N54($);let G=`${$}.${process.pid}.${Date.now()}.tmp`;k54(G,`${JSON.stringify(z,null,2)}
|
|
1407
1407
|
`,"utf-8");let J=wu2(G,"r");try{Eu2(J)}finally{vu2(J)}F54(G,$),A54($)}function SA($){let z=x52($);if(!b52(z))return _52();try{let G=JSON.parse(q54(z,"utf-8"));return{schemaVersion:1,active:G.active??{},lastSession:G.lastSession}}catch{return _52()}}function y52($,z,G=3){let J=x52($);for(let Q=0;Q<G;Q++){let K=b52(J)?Du2(J).mtimeMs:null,Z=SA($);z(Z);let U=b52(J)?Du2(J).mtimeMs:null;if(K!==U)continue;return uT(J,Z),Z}return process.stderr.write(`[oma] _index.json CAS retries exhausted (${G}); leaving it stale.
|
|
1408
1408
|
`),process.stderr.write(`[oma] hint: run 'oma state repair' to re-derive active pointers
|
|
1409
1409
|
`),SA($)}function u52($,z="main"){return $.active[z]??$.active.main??null}function j54($,z,G){return y52($,(J)=>{J.active[z]=G})}function xA($,z,G){return y52($,(J)=>{J.lastSession={vendor:z,vendorSid:G,ts:new Date().toISOString()}})}var Pu2;var yA=N(()=>{Pu2=yT(".agents","state","sessions")});import{existsSync as M54,readFileSync as O54}from"node:fs";import I54 from"node:http";import R54 from"node:https";import{homedir as D54}from"node:os";import{basename as v54,join as E54}from"node:path";function g52(){if(process.env.OMA_NO_AGENTMEMORY==="1")return null;if(process.env.AGENTMEMORY_URL)return process.env.AGENTMEMORY_URL;let $=E54(D54(),".agentmemory","endpoint.json");if(!M54($))return null;try{let z=JSON.parse(O54($,"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 h52($,z,G={}){return new Promise((J,Q)=>{let K=new URL(z,$),Z=K.protocol==="https:"?R54:I54;if(K.protocol!=="http:"&&K.protocol!=="https:"){Q(Error(`unsupported protocol ${K.protocol}`));return}let U=G.body,Y={...G.headers??{}};if(U!==void 0&&Y["content-length"]===void 0)Y["content-length"]=String(Buffer.byteLength(U));let W=Z.request(K,{method:G.method??"GET",headers:Y},(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(W.setTimeout(G.timeoutMs??500,()=>{W.destroy(Error("request timed out"))}),W.on("error",Q),U!==void 0)W.write(U);W.end()})}async function bu2(){if(Zz!==null)return Zz;let $=g52();if(!$)return Zz=!1,Zz;try{let z=await h52($,"/agentmemory/health");if(z.statusCode<200||z.statusCode>=300)return Zz=!1,Zz;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 Zz=Q||Z!==void 0&&w54.test(Z),Zz}catch{return Zz=!1,Zz}}function C54(){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 P54($){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 T54($,z,G=Date.now()){let J;try{J=JSON.parse($)}catch{return[]}if(!Array.isArray(J.results))return[];let Q=(()=>{let Y=Number(process.env.OMA_RECALL_MIN_SCORE);return Number.isFinite(Y)?Y:1})(),K=C54(),Z=K===null?null:G-K,U=[];for(let Y of J.results){let W=typeof Y.score==="number"?Y.score:0;if(W<Q)continue;if(Z!==null){let F=P54(Y);if(F!==null&&F<Z)continue}let V=Y.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:W}),U.length>=z)break}return U}async function _u2($,z=5){if(!$.trim())return[];try{if(!await bu2())return[];let G=g52();if(!G)return[];let J=await h52(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 T54(J.body,z)}catch{return[]}}async function Su2($){try{if(!await bu2())return!1;let z=g52();if(!z)return!1;let G=$.projectDir??process.cwd(),J=await h52(z,"/agentmemory/observe",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({hookType:$.source,sessionId:$.sessionId,project:v54(G),cwd:G,timestamp:new Date().toISOString(),content:$.content})});return J.statusCode>=200&&J.statusCode<300}catch{return!1}}var w54,Zz=null;var f52=N(()=>{w54=/^0\.(9|1\d)\./});var cu2={};z5(cu2,{sortEvents:()=>i52,refreshMeta:()=>mu2,readEvents:()=>hT,metaPath:()=>hu2,eventsPath:()=>m52,emitEvent:()=>c52,deriveMeta:()=>fu2,createEventId:()=>gu2});import{appendFileSync as xu2,existsSync as b54,mkdirSync as yu2,readFileSync as _54}from"node:fs";import{dirname as uu2,join as gT}from"node:path";function gu2($=Date.now()){let z=$.toString(36).padStart(10,"0"),G=Math.random().toString(36).slice(2,10).padEnd(8,"0");return`${z}${G}`}function m52($,z){return gT(GX($,z),"events.jsonl")}function hu2($,z){return gT(GX($,z),"meta.json")}async function c52($,z,G){let J={eventId:G.eventId??gu2(),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=m52($,z);try{yu2(uu2(Q),{recursive:!0}),xu2(Q,`${JSON.stringify(J)}
|
package/package.json
CHANGED