apt-mcp-agent-setup 1.2.0 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +1 -1
- package/bundle/NOTICES.md +0 -0
- package/bundle/core.enc +0 -0
- package/bundle/mcp-rules.enc +0 -0
- package/bundle/skills-aso.enc +0 -0
- package/bundle/skills-base.enc +0 -0
- package/bundle/skills-be.enc +0 -0
- package/bundle/skills-fe.enc +0 -0
- package/bundle/skills-mobile.enc +0 -0
- package/integrity-manifest.json +16 -16
- package/package.json +1 -1
- package/src/installer/global-setup.js +1 -1
- package/src/installer/platform-config.js +1 -1
- package/src/installer/prerequisites.js +1 -1
- package/src/installer/project-setup.js +1 -1
- package/src/installer/setup-wizard.js +1 -1
- package/src/license/crypto.js +1 -1
- package/src/license/fingerprint.js +1 -1
- package/src/license/terms.js +1 -1
- package/src/license/verify.js +1 -1
- package/src/presets/index.js +1 -1
- package/src/proxy/backends.js +1 -1
- package/src/proxy/router.config.js +1 -1
- package/src/proxy/router.js +1 -1
- package/src/proxy/server.js +1 -1
- package/src/templates/AGENTS.md +140 -140
- package/src/templates/GEMINI.md +116 -116
package/src/proxy/server.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const _0x2b0ea7=_0x235a;(function(_0x5cec3b,_0x2936a2){const _0x489c2e=_0x235a,_0x89cac6=_0x5cec3b();while(!![]){try{const _0x26bb02=parseInt(_0x489c2e(0x144))/0x1*(parseInt(_0x489c2e(0x147))/0x2)+parseInt(_0x489c2e(0x11f))/0x3*(parseInt(_0x489c2e(0x121))/0x4)+-parseInt(_0x489c2e(0x177))/0x5+parseInt(_0x489c2e(0x138))/0x6+parseInt(_0x489c2e(0x10d))/0x7+parseInt(_0x489c2e(0x12e))/0x8*(-parseInt(_0x489c2e(0x12d))/0x9)+-parseInt(_0x489c2e(0x109))/0xa*(parseInt(_0x489c2e(0x127))/0xb);if(_0x26bb02===_0x2936a2)break;else _0x89cac6['push'](_0x89cac6['shift']());}catch(_0x14280e){_0x89cac6['push'](_0x89cac6['shift']());}}}(_0x2f2c,0x49a9f));function _0x2f2c(){const _0x1bdd61=['w01ducbbz2vUDf0GsgvHCNrIzwf0ihjLzNjLC2GGzMfPBgvKoIbtzxj2zxiGCMv0DxjUzwqG','lI9YB3v0zxiUANm','C2vUzfjLCxvLC3q','CgfYC2u','yMfJA2vUza','Dg9ju09tDhjPBMC','DMfSAwq','lI4VBgLJzw5Zzs92zxjPzNKUANm','zgLNzxn0','w01ducbbz2vUDf0GrMfPBgvKihrVigLUAxrPywXPEMuGC2vYDMLJzsa','lIbdB250Aw51Aw5NihDPDgGGy2fJAgvKihrVA2vUlG','zxHPC3rZu3LUyW','y29Kzq','Dg9Rzw4','Ag9TzwrPCG','CMvTB3zLtgLZDgvUzxi','zNjVBq','w01ducbbz2vUDf0Gsw50zwDYAxr5ignOzwnRigzHAwXLzdOG','Ahr0Chm6lY9Hz2vUDgTPDc5HBhbOyxrLy2HZlMfP','Cgf5Bg9Hza','C3rKAw4','w01ducbbz2vUDf0GugvYAw9KAwmGAgvHCNrIzwf0igvYCM9YoG','w01ducbbz2vUDf0GtgLJzw5ZzsbRzxKGDMvYAwzPy2f0Aw9UigzHAwXLzdOG','Dg9VBhm','Aw50zwDYAxr5twfUAwzLC3rqyxrO','D3jPDgvgAwXLu3LUyW','y2fWywjPBgL0AwvZ','w01ducbbz2vUDf0GtgLJzw5ZzsbRzxKGAgfZigjLzw4GCMv2B2TLzc4GrxHPDgLUzY4','y2HPBgq','zgLYBMfTzq','w01ducbbz2vUDf0GtgLJzw5ZzsbLEhbPCMvKig9Uia','DxbKyxrL','Bg9HzeXPy2vUC2vlzxK','ANnVBNjWyW','Agv4','zM9YD2fYzfjLCxvLC3q','C2LNBMf0DxjL','D3jPDgvfCNjVCG','w01ducbbz2vUDf0GDg9VBhmVBgLZDcbYzxf1zxn0igzHAwXLzcbMB3iGC2vYDMLJzsa','lI9IywnRzw5KCY5QCW','l2HLyxj0yMvHDa','mI4W','ChjVDg9JB2XwzxjZAw9U','lI4VBgLJzw5Zzs9MAw5NzxjWCMLUDc5QCW','w01ducbbz2vUDf0Gu3rHCNrPBMCGC2vYDMvYigf0ia','y3jLyxrLsgfZAa','odmXmJmWv05usfnM','zgv2AwnLswq','vg9VBcbLEgvJDxrPB24GzMfPBgvKoIa','ANnVBG','C3rVCa','AM9PBG','BwTKAxjtEw5J','C3bSAxq','ufjprfvdveLptL9qvujmsunFs0vz','BM93','yMfJA2vUzhm','ywjVCNq','w01ducbbz2vUDf0Gsw50zwDYAxr5ignOzwnRigzHAwXLzdOGrMfPBgvKihrVihbHCNnLigLUDgvNCML0Es1Tyw5PzMvZDc5QC29UlIbfEgL0Aw5NlG','D3jPDgu','DMfSDwvZ','zMXHDa','AgfUzgXLq2XPzw50rgf0yq','igLZig5VDcbYDw5UAw5N','CNvUBMLUzW','DMvYAwz5','C3rYAw5NAwz5','y3DK','DhjPBq','vg9VBcbUB3qGzM91BMq6ia','BwvZC2fNzq','ChjVAMvJDfbHDgG','BwfPBG','zxHW','CMvZDwX0','lMfUAgrO','mJaYnc0Xms0Wnq','mtbbrgfewe0','zgLZDa','BgLJzw5ZzuTLEq','lIbdB250ywn0ihn1ChbVCNqGyxqGC3vWCg9YDebHBMHKAc5PBY4GrxHPDgLUzY4','otG0mZGYqMPUCKjR','Dg9VBhmVBgLZDa','C3rHCNq','rMfPBgvKihrVihf1zxj5ihrVB2WGBgLZDdOG','D3jPDgvuB0nSAwvUDa','ywrTAw4','CMvJDxjZAxzL','ChvIBgLJs2v5','Dg9VBhmVy2fSBa','Cgf0Aa','ig1VzgLMAwvKlIbfEgL0Aw5NlG','C2vYDMvYsw5MBW','BwfZDgvYlNb1yMXPyY5Wzw0','y2f0y2G','w01ducbbz2vUDf0GsgvHCNrIzwf0ignOzwnRoIb0B2TLBIbOyxmGBgvZCYb0AgfUidyGzgf5CYbYzw1HAw5PBMCUifjLzNjLC2HPBMCUlI4','Aw50zwDYAxr5lw1HBMLMzxn0lMPZB24','AgvHCNrIzwf0sw50zxj2ywW','y3j5ChrV','mtjzwKn5B1K','DxnLCG','mJu0mZu2A0X0s0Lb','Cgf1C2u','zxHWB3j0CW','y2XPzw50qNvMzMvY','zxjYB3i','C3rKB3v0','nda3mJa5wwr6v09X','BwnWlwfNzw50lxbYB3H5','C3rHDhvZ','w01ducbbz2vUDf0GsgvHCNrIzwf0ignOzwnRigzHAwXLzcbVCIb0Aw1LzcbVDxq6','yxbWBgLJyxrPB24VANnVBG','ywXS','mti1muLurwHoBq','mJCZnJbfr0PQruS','ms4WlJa','rMfPBgvKihrVihn0yxj0ifbYB3H5u2vYDMvYoG','CMvHC29U','C3rKAw5mAxn0zw5LCG','yMfZzty0DxjS','Dg9tDhjPBMC','AgfUzgXLq2XPzw50twvZC2fNzq','CgvYzM9YBuHLyxj0yMvHDa','CgfYyw1Z','odi4mdbWD1nQu3a','Aw5PDgLHBgL6zq','CMvHzezPBgvtEw5J','BMfTzq','ue9tva','DxrMoa','Cg9W','zw50CMLLCW','w01ducbbz2vUDf0GtgLJzw5ZzsbRzxKGzxHWAxjLzcbVCIbPBNzHBgLKlIbfEgL0Aw5NlG','w01ducbbz2vUDf0Gsw50zwDYAxr5ignOzwnRigzHAwXLzdOGAw50zwDYAxr5lw1HBMLMzxn0lMPZB24GBwLZC2LUzY4GrxHPDgLUzY4','BgLJzw5Zzs5RzxK','zgf0yq','mJyXmgfAtKXPqW','zxHPDa','zMLSzxm','ndm4ELLeELPO','lI4VlI4'];_0x2f2c=function(){return _0x1bdd61;};return _0x2f2c();}const fs=require('fs'),path=require(_0x2b0ea7(0x116)),os=require('os'),{verifyLicense}=require(_0x2b0ea7(0x150)),{spawnBackends}=require(_0x2b0ea7(0x170)),{translateToolList,mapExposedToOriginal}=require(_0x2b0ea7(0x14a));class ProxyServer{constructor(_0x2fd09e={}){const _0x4a0081=_0x2b0ea7;this['projectPath']=_0x2fd09e['projectPath']||process[_0x4a0081(0xff)](),this[_0x4a0081(0x10b)]=_0x2fd09e[_0x4a0081(0x10b)]||this[_0x4a0081(0x169)](),this[_0x4a0081(0xeb)]=_0x2fd09e[_0x4a0081(0xeb)],this['publicKey']=_0x2fd09e[_0x4a0081(0x114)]||_0x2fd09e['masterSecret'],this['backends']=null,this['clientBuffer']='',this[_0x4a0081(0xfc)]=![],this[_0x4a0081(0x126)]=_0x2fd09e[_0x4a0081(0x126)]||process['stdout'],this[_0x4a0081(0x161)]=_0x2fd09e[_0x4a0081(0x161)]||path[_0x4a0081(0xef)](__dirname,_0x4a0081(0x148),_0x4a0081(0x11c));}['loadLicenseKey'](){const _0x5a5ff1=_0x2b0ea7,_0x1a47ed=path[_0x5a5ff1(0xef)](os['homedir'](),_0x5a5ff1(0x107),'license.key');if(fs[_0x5a5ff1(0x154)](_0x1a47ed))return fs[_0x5a5ff1(0x13a)](_0x1a47ed,_0x5a5ff1(0x13d))[_0x5a5ff1(0x100)]();return null;}async[_0x2b0ea7(0x136)](){const _0x333afe=_0x2b0ea7,_0x34a600=process.env.MCP_SKIP_LICENSE_CHECK==='1';if(_0x34a600||!this['licenseKey'])return;const _0x3b8d3d=this[_0x333afe(0x10b)][_0x333afe(0xf1)]('.');if(_0x3b8d3d['length']!==0x3)return;let _0x4f0ac8;try{_0x4f0ac8=JSON['parse'](Buffer[_0x333afe(0x159)](_0x3b8d3d[0x1],_0x333afe(0x133))[_0x333afe(0x134)](_0x333afe(0x13d)));}catch(_0x5bf809){return;}if(!_0x4f0ac8||!_0x4f0ac8['exp'])return;const _0x21a63a=0x6*0x18*0xe10*0x3e8,_0xef8557=_0x4f0ac8['exp']-Date[_0x333afe(0xf3)]();if(_0xef8557<_0x21a63a){console[_0x333afe(0x125)](_0x333afe(0x11b));const _0xd0b9db=process.env.MCP_ACTIVATION_URL||_0x333afe(0x15b),_0x22ab24=_0xd0b9db+_0x333afe(0x171),_0x3d957f=new AbortController(),_0x126c4f=setTimeout(()=>_0x3d957f[_0x333afe(0xf5)](),0x1388);try{const _0x7001cb={};_0x7001cb['Content-Type']=_0x333afe(0x12b);const _0x565e3b={};_0x565e3b[_0x333afe(0x156)]=this[_0x333afe(0x10b)];const _0x3f9552=await fetch(_0x22ab24,{'method':_0x333afe(0x13c),'headers':_0x7001cb,'body':JSON[_0x333afe(0xfe)](_0x565e3b),'signal':_0x3d957f['signal']});clearTimeout(_0x126c4f);if(_0x3f9552[_0x333afe(0x129)]===0x193){console['error'](_0x333afe(0x164)),process[_0x333afe(0x145)](0x1);return;}if(_0x3f9552[_0x333afe(0x129)]===0x191){console[_0x333afe(0x125)](_0x333afe(0x140)),process[_0x333afe(0x145)](0x1);return;}if(!_0x3f9552['ok']){console[_0x333afe(0x125)](_0x333afe(0x149)+_0x3f9552[_0x333afe(0x129)]+'.\x20Continuing\x20with\x20cached\x20token.');return;}const _0x498a15=await _0x3f9552[_0x333afe(0xed)]();if(_0x498a15&&_0x498a15[_0x333afe(0x156)]){this[_0x333afe(0x10b)]=_0x498a15[_0x333afe(0x156)];const _0x192933=path[_0x333afe(0xef)](os[_0x333afe(0x157)](),_0x333afe(0x107),_0x333afe(0x142));try{const _0x28538d={};_0x28538d[_0x333afe(0x113)]=!![],fs[_0x333afe(0xf0)](path[_0x333afe(0x166)](_0x192933),_0x28538d),fs[_0x333afe(0x162)](_0x192933,_0x498a15[_0x333afe(0x156)],_0x333afe(0x13d)),console[_0x333afe(0x125)]('[MCP\x20Agent]\x20Heartbeat:\x20License\x20token\x20successfully\x20refreshed.');}catch(_0x3e5a9d){console[_0x333afe(0x125)]('[MCP\x20Agent]\x20Failed\x20to\x20save\x20refreshed\x20license\x20token\x20to\x20disk:',_0x3e5a9d['message']);}}}catch(_0x224b41){clearTimeout(_0x126c4f),console['error'](_0x333afe(0x12a),_0x224b41[_0x333afe(0x102)],_0x333afe(0x153));}}}async[_0x2b0ea7(0x10f)](){const _0x37d64b=_0x2b0ea7;console[_0x37d64b(0x125)](_0x37d64b(0x175)+this[_0x37d64b(0x103)]);if(!this[_0x37d64b(0x114)]){if(process.env.MCP_ADMIN_DIR){const _0x2cee86=path[_0x37d64b(0xef)](process.env.MCP_ADMIN_DIR,_0x37d64b(0x119));fs[_0x37d64b(0x154)](_0x2cee86)&&(this[_0x37d64b(0x114)]=fs[_0x37d64b(0x13a)](_0x2cee86,_0x37d64b(0x13d))[_0x37d64b(0x100)]());}if(!this[_0x37d64b(0x114)]){let _0x17ad43=__dirname;while(_0x17ad43){const _0x5f0547=path['join'](_0x17ad43,_0x37d64b(0x112),_0x37d64b(0x119));if(fs[_0x37d64b(0x154)](_0x5f0547)){this['publicKey']=fs[_0x37d64b(0x13a)](_0x5f0547,_0x37d64b(0x13d))[_0x37d64b(0x100)]();break;}const _0x1a82b2=path[_0x37d64b(0x166)](_0x17ad43);if(_0x1a82b2===_0x17ad43)break;_0x17ad43=_0x1a82b2;}}}const _0x5118ac=this[_0x37d64b(0x161)],_0x3bc6e8=!__dirname['replace'](/\\/g,'/')[_0x37d64b(0xf1)]('/')['includes'](_0x37d64b(0x10a)),_0x43c67f=process.env.MCP_SKIP_INTEGRITY_CHECK==='1'||_0x3bc6e8&&!fs['existsSync'](_0x5118ac);if(!_0x43c67f){const _0x27e8d0=require(_0x37d64b(0x11e));if(!fs[_0x37d64b(0x154)](_0x5118ac)){console['error'](_0x37d64b(0x141)),process[_0x37d64b(0x145)](0x1);return;}let _0x2c88bf;try{_0x2c88bf=JSON[_0x37d64b(0x14c)](fs[_0x37d64b(0x13a)](_0x5118ac,_0x37d64b(0x13d)));}catch(_0x3ab039){console[_0x37d64b(0x125)](_0x37d64b(0xf6)),process[_0x37d64b(0x145)](0x1);return;}if(!_0x2c88bf[_0x37d64b(0x146)]||!_0x2c88bf[_0x37d64b(0x16d)]){console[_0x37d64b(0x125)]('[MCP\x20Agent]\x20Integrity\x20check\x20failed:\x20Invalid\x20manifest\x20format.\x20Exiting.'),process[_0x37d64b(0x145)](0x1);return;}const _0x438fc9=this[_0x37d64b(0x114)]||require(_0x37d64b(0x150))[_0x37d64b(0xf2)];try{const _0x3e8545=JSON[_0x37d64b(0xfe)](_0x2c88bf[_0x37d64b(0x146)]),_0x5c7339=Buffer[_0x37d64b(0x159)](_0x2c88bf[_0x37d64b(0x16d)],_0x37d64b(0x133)),_0x2f731c=_0x27e8d0[_0x37d64b(0xfd)](null,Buffer[_0x37d64b(0x159)](_0x3e8545),_0x438fc9,_0x5c7339);if(!_0x2f731c){console['error']('[MCP\x20Agent]\x20Integrity\x20check\x20failed:\x20Invalid\x20signature.\x20Exiting.'),process[_0x37d64b(0x145)](0x1);return;}}catch(_0x13c1ce){console[_0x37d64b(0x125)]('[MCP\x20Agent]\x20Integrity\x20check\x20failed:\x20Signature\x20verification\x20failed.\x20Exiting.'),process[_0x37d64b(0x145)](0x1);return;}const _0xc804da=path[_0x37d64b(0xef)](__dirname,_0x37d64b(0x148));for(const [_0x4dc5f2,_0x19ccdd]of Object[_0x37d64b(0x13f)](_0x2c88bf[_0x37d64b(0x146)])){const _0x9132f8=path['join'](_0xc804da,_0x4dc5f2);if(!fs[_0x37d64b(0x154)](_0x9132f8)){console['error'](_0x37d64b(0x15a)+_0x4dc5f2+_0x37d64b(0x117)),process['exit'](0x1);return;}try{const _0x1b8f75=fs[_0x37d64b(0x13a)](_0x9132f8),_0x240e65=_0x27e8d0[_0x37d64b(0x176)]('sha256')[_0x37d64b(0x168)](_0x1b8f75)[_0x37d64b(0x151)](_0x37d64b(0x16b));if(_0x240e65!==_0x19ccdd){console[_0x37d64b(0x125)](_0x37d64b(0x15a)+_0x4dc5f2+_0x37d64b(0x117)),process[_0x37d64b(0x145)](0x1);return;}}catch(_0x3cb9fa){console[_0x37d64b(0x125)]('[MCP\x20Agent]\x20Integrity\x20check\x20failed:\x20'+_0x4dc5f2+_0x37d64b(0x117)),process[_0x37d64b(0x145)](0x1);return;}}}const _0x722ae6=process.env.MCP_SKIP_LICENSE_CHECK==='1';if(!_0x722ae6){if(!this['deviceId']){const {getFingerprint:_0xb9d8b0}=require(_0x37d64b(0x174));this['deviceId']=_0xb9d8b0();}const _0x20e606=verifyLicense(this['licenseKey'],this[_0x37d64b(0xeb)],this['publicKey']);if(!_0x20e606[_0x37d64b(0x14f)]){if(_0x20e606[_0x37d64b(0x131)]==='License\x20expired'){const _0x54a6b0=_0x20e606['payload']||{},_0x40b47=_0x54a6b0[_0x37d64b(0x105)]?new Date(_0x54a6b0[_0x37d64b(0x105)])[_0x37d64b(0x14e)]()[_0x37d64b(0xf1)]('T')[0x0]:'unknown';console[_0x37d64b(0x125)](_0x37d64b(0x167)+_0x40b47+'.\x20Renew\x20at\x20https://anhdh.io/renew.\x20Exiting.');}else console[_0x37d64b(0x125)](_0x37d64b(0x15f)+_0x20e606[_0x37d64b(0x131)]+_0x37d64b(0x10c));process[_0x37d64b(0x145)](0x1);return;}console[_0x37d64b(0x125)]('[MCP\x20Agent]\x20License\x20key\x20verified\x20successfully\x20for\x20user:\x20'+_0x20e606[_0x37d64b(0x15c)][_0x37d64b(0x120)]),await this[_0x37d64b(0x136)](),this[_0x37d64b(0x11d)]=setInterval(()=>{this['performHeartbeat']()['catch'](_0x537cb5=>{const _0x52cb10=_0x235a;console[_0x52cb10(0x125)](_0x52cb10(0x15e),_0x537cb5['message']);});},0x18*0x3c*0x3c*0x3e8);}this[_0x37d64b(0xf4)]=spawnBackends(this[_0x37d64b(0x103)]),this[_0x37d64b(0xfc)]=!![];for(const _0x3e96e0 of Object[_0x37d64b(0xf8)](this[_0x37d64b(0xf4)])){_0x3e96e0[_0x37d64b(0x10f)]();}this[_0x37d64b(0x132)]=_0x2eaa36=>{const _0x46a05e=_0x37d64b;this[_0x46a05e(0xfa)](_0x2eaa36[_0x46a05e(0x134)]());},process[_0x37d64b(0x15d)]['on'](_0x37d64b(0x143),this[_0x37d64b(0x132)]);}[_0x2b0ea7(0xfa)](_0x2b93b5){const _0x5e982e=_0x2b0ea7;this[_0x5e982e(0x124)]+=_0x2b93b5;const _0x1105ba=this[_0x5e982e(0x124)][_0x5e982e(0xf1)]('\x0a');this[_0x5e982e(0x124)]=_0x1105ba[_0x5e982e(0x13e)]();for(const _0x365a83 of _0x1105ba){const _0x4fe192=_0x365a83['trim']();if(!_0x4fe192)continue;try{const _0x50148c=JSON[_0x5e982e(0x14c)](_0x4fe192);this[_0x5e982e(0x135)](_0x50148c);}catch(_0x376534){console[_0x5e982e(0x125)]('[MCP\x20Agent]\x20Failed\x20to\x20parse\x20JSON-RPC\x20message\x20from\x20client:',_0x365a83,_0x376534[_0x5e982e(0x102)]);}}}async[_0x2b0ea7(0x135)](_0x6bc95a){const _0x474305=_0x2b0ea7,{id:_0x2bb0f8,method:_0x5c8c10,params:_0x1c13b8}=_0x6bc95a;if(!_0x5c8c10)return;if(_0x5c8c10===_0x474305(0x139)){Promise[_0x474305(0x12c)](Object[_0x474305(0xf8)](this[_0x474305(0xf4)])['map'](_0x19d36b=>_0x19d36b[_0x474305(0x14b)](_0x474305(0x139),_0x1c13b8)[_0x474305(0x11a)](_0x24db88=>{const _0x2109e2=_0x474305;console[_0x2109e2(0x125)](_0x2109e2(0x152)+(_0x19d36b['displayName']||_0x19d36b['name'])+':',_0x24db88['message']);})));const _0x4de9cc={};_0x4de9cc['listChanged']=![];const _0x2a5198={};_0x2a5198[_0x474305(0x160)]=_0x4de9cc;const _0x4e82e8={};_0x4e82e8['name']=_0x474305(0x128),_0x4e82e8['version']=_0x474305(0x12f);const _0xdc6b6f={};_0xdc6b6f[_0x474305(0x173)]=_0x1c13b8[_0x474305(0x173)]||_0x474305(0x108),_0xdc6b6f[_0x474305(0x163)]=_0x2a5198,_0xdc6b6f[_0x474305(0x118)]=_0x4e82e8;const _0x1338aa={};_0x1338aa['jsonrpc']=_0x474305(0x172),_0x1338aa['id']=_0x2bb0f8,_0x1338aa['result']=_0xdc6b6f;const _0x19a2ac=_0x1338aa;this[_0x474305(0x111)](_0x19a2ac);return;}if(_0x5c8c10===_0x474305(0x10e)){try{const _0x737214=Object[_0x474305(0x13f)](this['backends'])['map'](async([_0x5988d2,_0x1efa5b])=>{const _0x437be8=_0x474305;try{const _0x5508b7=await _0x1efa5b['sendRequest'](_0x437be8(0x10e)),_0x5942f4=_0x5508b7&&_0x5508b7['result']&&_0x5508b7[_0x437be8(0x106)][_0x437be8(0x160)]||[];return translateToolList(_0x5942f4,_0x5988d2);}catch(_0x2ca5ad){return console[_0x437be8(0x125)](_0x437be8(0x16f)+_0x5988d2+':',_0x2ca5ad[_0x437be8(0x102)]),[];}}),_0x249c8b=await Promise['all'](_0x737214),_0x318203=_0x249c8b[_0x474305(0xf9)](),_0x4d7525={};_0x4d7525['tools']=_0x318203;const _0x5a8be6={};_0x5a8be6[_0x474305(0x16a)]=_0x474305(0x172),_0x5a8be6['id']=_0x2bb0f8,_0x5a8be6[_0x474305(0x106)]=_0x4d7525;const _0x392498=_0x5a8be6;this[_0x474305(0x111)](_0x392498);}catch(_0x27711d){this['writeError'](_0x2bb0f8,-0x7f5b,_0x474305(0x110)+_0x27711d['message']);}return;}if(_0x5c8c10===_0x474305(0x115)){const _0x45288f=_0x1c13b8[_0x474305(0x13b)],_0x502e3b=mapExposedToOriginal(_0x45288f);if(!_0x502e3b)return this[_0x474305(0x16e)](_0x2bb0f8,-0x7f59,_0x474305(0x101)+_0x45288f);try{const _0x31cb26=this[_0x474305(0xf4)][_0x502e3b[_0x474305(0x14d)]];if(!_0x31cb26)return this['writeError'](_0x2bb0f8,-0x7f5b,'Target\x20backend\x20'+_0x502e3b[_0x474305(0x14d)]+_0x474305(0xfb));const _0x280a09={..._0x1c13b8};_0x280a09[_0x474305(0x13b)]=_0x502e3b['originalName'];const _0x273357={..._0x6bc95a};_0x273357[_0x474305(0x137)]=_0x280a09;const _0x33d139=_0x273357,_0x170b5c=await _0x31cb26[_0x474305(0x16c)](_0x33d139);this['writeToClient'](_0x170b5c);}catch(_0x19496c){this[_0x474305(0x16e)](_0x2bb0f8,-0x7f5b,_0x474305(0xec)+_0x19496c[_0x474305(0x102)]);}return;}for(const _0xcf107 of Object['values'](this[_0x474305(0xf4)])){_0xcf107[_0x474305(0x165)]&&_0xcf107['child'][_0x474305(0x15d)][_0x474305(0xf7)](JSON[_0x474305(0xfe)](_0x6bc95a)+'\x0a');}}[_0x2b0ea7(0x111)](_0x28f60e){const _0x5024e4=_0x2b0ea7;this[_0x5024e4(0x126)][_0x5024e4(0xf7)](JSON[_0x5024e4(0xfe)](_0x28f60e)+'\x0a');}[_0x2b0ea7(0x16e)](_0x1791e8,_0x400a10,_0x225375){const _0x3e76f1=_0x2b0ea7,_0x33f327={};_0x33f327[_0x3e76f1(0x155)]=_0x400a10,_0x33f327[_0x3e76f1(0x102)]=_0x225375;const _0x3558ed={};_0x3558ed['jsonrpc']=_0x3e76f1(0x172),_0x3558ed['id']=_0x1791e8,_0x3558ed[_0x3e76f1(0x125)]=_0x33f327;const _0x87bdd8=_0x3558ed;this[_0x3e76f1(0x111)](_0x87bdd8);}[_0x2b0ea7(0xee)](){const _0x30bc92=_0x2b0ea7;this[_0x30bc92(0xfc)]=![];this[_0x30bc92(0x11d)]&&(clearInterval(this[_0x30bc92(0x11d)]),this[_0x30bc92(0x11d)]=null);this[_0x30bc92(0x132)]&&(process['stdin'][_0x30bc92(0x158)]('data',this[_0x30bc92(0x132)]),this['stdinListener']=null,process[_0x30bc92(0x15d)][_0x30bc92(0x122)]());if(this[_0x30bc92(0xf4)])for(const _0x54d49f of Object[_0x30bc92(0xf8)](this['backends'])){_0x54d49f['stop']();}}}const _0xee64b8={};_0xee64b8['ProxyServer']=ProxyServer,module[_0x2b0ea7(0x123)]=_0xee64b8;function _0x235a(_0x94d90e,_0x2870c4){_0x94d90e=_0x94d90e-0xeb;const _0x2f2c40=_0x2f2c();let _0x235ab8=_0x2f2c40[_0x94d90e];if(_0x235a['UHgZgY']===undefined){var _0x537f82=function(_0x190c0f){const _0x1af47a='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x5495be='',_0x3f16be='';for(let _0x46a0c6=0x0,_0x1c48b8,_0x4dfb4d,_0x425f08=0x0;_0x4dfb4d=_0x190c0f['charAt'](_0x425f08++);~_0x4dfb4d&&(_0x1c48b8=_0x46a0c6%0x4?_0x1c48b8*0x40+_0x4dfb4d:_0x4dfb4d,_0x46a0c6++%0x4)?_0x5495be+=String['fromCharCode'](0xff&_0x1c48b8>>(-0x2*_0x46a0c6&0x6)):0x0){_0x4dfb4d=_0x1af47a['indexOf'](_0x4dfb4d);}for(let _0xe3416b=0x0,_0x4d2344=_0x5495be['length'];_0xe3416b<_0x4d2344;_0xe3416b++){_0x3f16be+='%'+('00'+_0x5495be['charCodeAt'](_0xe3416b)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x3f16be);};_0x235a['hJqEKF']=_0x537f82,_0x235a['jxVeOP']={},_0x235a['UHgZgY']=!![];}const _0x27591b=_0x2f2c40[0x0],_0x42461c=_0x94d90e+_0x27591b,_0x40d100=_0x235a['jxVeOP'][_0x42461c];return!_0x40d100?(_0x235ab8=_0x235a['hJqEKF'](_0x235ab8),_0x235a['jxVeOP'][_0x42461c]=_0x235ab8):_0x235ab8=_0x40d100,_0x235ab8;}if(require[_0x2b0ea7(0x104)]===module){const server=new ProxyServer();server[_0x2b0ea7(0x10f)]()[_0x2b0ea7(0x11a)](_0x48fbfa=>{const _0x2e07fd=_0x2b0ea7;console[_0x2e07fd(0x125)](_0x2e07fd(0x130),_0x48fbfa[_0x2e07fd(0x102)]),process[_0x2e07fd(0x145)](0x1);});}
|
|
1
|
+
const _0x62cf2d=_0x3b32;(function(_0x56c8ce,_0x29bc2a){const _0x12897a=_0x3b32,_0xc34ac4=_0x56c8ce();while(!![]){try{const _0xb7e20f=parseInt(_0x12897a(0x1d8))/0x1+-parseInt(_0x12897a(0x233))/0x2*(parseInt(_0x12897a(0x23d))/0x3)+parseInt(_0x12897a(0x20e))/0x4+-parseInt(_0x12897a(0x1dc))/0x5+parseInt(_0x12897a(0x1d4))/0x6*(-parseInt(_0x12897a(0x253))/0x7)+-parseInt(_0x12897a(0x1d5))/0x8*(parseInt(_0x12897a(0x260))/0x9)+parseInt(_0x12897a(0x25f))/0xa*(parseInt(_0x12897a(0x1fa))/0xb);if(_0xb7e20f===_0x29bc2a)break;else _0xc34ac4['push'](_0xc34ac4['shift']());}catch(_0x349ee9){_0xc34ac4['push'](_0xc34ac4['shift']());}}}(_0x52f7,0x507b3));const fs=require('fs'),path=require(_0x62cf2d(0x213)),os=require('os'),{verifyLicense}=require('../license/verify.js'),{spawnBackends}=require(_0x62cf2d(0x238)),{translateToolList,mapExposedToOriginal}=require(_0x62cf2d(0x239));class ProxyServer{constructor(_0x84822={}){const _0x281ffa=_0x62cf2d;this[_0x281ffa(0x1f0)]=_0x84822[_0x281ffa(0x1f0)]||process['cwd'](),this[_0x281ffa(0x254)]=_0x84822['licenseKey']||this[_0x281ffa(0x1d2)](),this[_0x281ffa(0x1f9)]=_0x84822[_0x281ffa(0x1f9)],this['publicKey']=_0x84822['publicKey']||_0x84822[_0x281ffa(0x214)],this[_0x281ffa(0x251)]=null,this['clientBuffer']='',this[_0x281ffa(0x22e)]=![],this[_0x281ffa(0x232)]=_0x84822[_0x281ffa(0x232)]||process[_0x281ffa(0x232)],this[_0x281ffa(0x1e2)]=_0x84822[_0x281ffa(0x1e2)]||path[_0x281ffa(0x20d)](__dirname,'../..',_0x281ffa(0x237));}['loadLicenseKey'](){const _0x802802=_0x62cf2d,_0x5b4fd5=path[_0x802802(0x20d)](os[_0x802802(0x1f2)](),_0x802802(0x256),_0x802802(0x226));if(fs['existsSync'](_0x5b4fd5))return fs[_0x802802(0x1fe)](_0x5b4fd5,_0x802802(0x1d9))['trim']();return null;}async[_0x62cf2d(0x247)](){const _0x51b7df=_0x62cf2d,_0x56e612=process.env.MCP_SKIP_LICENSE_CHECK==='1';if(_0x56e612||!this[_0x51b7df(0x254)])return;const _0x2e5237=this[_0x51b7df(0x254)][_0x51b7df(0x208)]('.');if(_0x2e5237[_0x51b7df(0x1e9)]!==0x3)return;let _0x3ba99f;try{_0x3ba99f=JSON['parse'](Buffer[_0x51b7df(0x200)](_0x2e5237[0x1],'base64url')['toString'](_0x51b7df(0x1d9)));}catch(_0x1983b0){return;}if(!_0x3ba99f||!_0x3ba99f[_0x51b7df(0x1dd)])return;const _0x588c67=0x6*0x18*0xe10*0x3e8,_0x1229ca=_0x3ba99f['exp']-Date[_0x51b7df(0x1f8)]();if(_0x1229ca<_0x588c67){console['error'](_0x51b7df(0x20c));const _0x1ea274=process.env.MCP_ACTIVATION_URL||_0x51b7df(0x234),_0x178e9c=_0x1ea274+_0x51b7df(0x1e4),_0x2e6172=new AbortController(),_0x1359b5=setTimeout(()=>_0x2e6172[_0x51b7df(0x1e0)](),0x1388);try{const _0x4e9a58={};_0x4e9a58['Content-Type']=_0x51b7df(0x246);const _0xf2baa8={};_0xf2baa8[_0x51b7df(0x21d)]=this['licenseKey'];const _0x35c12e=await fetch(_0x178e9c,{'method':_0x51b7df(0x229),'headers':_0x4e9a58,'body':JSON[_0x51b7df(0x23a)](_0xf2baa8),'signal':_0x2e6172[_0x51b7df(0x1ff)]});clearTimeout(_0x1359b5);if(_0x35c12e[_0x51b7df(0x241)]===0x193){console[_0x51b7df(0x1fd)](_0x51b7df(0x204)),process[_0x51b7df(0x249)](0x1);return;}if(_0x35c12e[_0x51b7df(0x241)]===0x191){console['error'](_0x51b7df(0x242)),process['exit'](0x1);return;}if(!_0x35c12e['ok']){console[_0x51b7df(0x1fd)](_0x51b7df(0x1f3)+_0x35c12e['status']+_0x51b7df(0x235));return;}const _0x35fbf7=await _0x35c12e['json']();if(_0x35fbf7&&_0x35fbf7['token']){this[_0x51b7df(0x254)]=_0x35fbf7[_0x51b7df(0x21d)];const _0x1b098b=path[_0x51b7df(0x20d)](os[_0x51b7df(0x1f2)](),_0x51b7df(0x256),_0x51b7df(0x226));try{const _0x43c537={};_0x43c537[_0x51b7df(0x20a)]=!![],fs[_0x51b7df(0x236)](path[_0x51b7df(0x230)](_0x1b098b),_0x43c537),fs[_0x51b7df(0x1df)](_0x1b098b,_0x35fbf7[_0x51b7df(0x21d)],_0x51b7df(0x1d9)),console['error'](_0x51b7df(0x24c));}catch(_0x396b74){console[_0x51b7df(0x1fd)](_0x51b7df(0x1e5),_0x396b74['message']);}}}catch(_0x241f3f){clearTimeout(_0x1359b5),console[_0x51b7df(0x1fd)]('[MCP\x20Agent]\x20Heartbeat\x20check\x20failed\x20or\x20timed\x20out:',_0x241f3f[_0x51b7df(0x1ea)],_0x51b7df(0x235));}}}async[_0x62cf2d(0x220)](){const _0x5944b4=_0x62cf2d;console[_0x5944b4(0x1fd)](_0x5944b4(0x1e1)+this[_0x5944b4(0x1f0)]);if(!this[_0x5944b4(0x262)]){if(process.env.MCP_ADMIN_DIR){const _0xb97682=path['join'](process.env.MCP_ADMIN_DIR,_0x5944b4(0x24b));fs['existsSync'](_0xb97682)&&(this['publicKey']=fs[_0x5944b4(0x1fe)](_0xb97682,_0x5944b4(0x1d9))[_0x5944b4(0x243)]());}if(!this[_0x5944b4(0x262)]){let _0x6dba5d=__dirname;while(_0x6dba5d){const _0x35377f=path[_0x5944b4(0x20d)](_0x6dba5d,_0x5944b4(0x223),_0x5944b4(0x24b));if(fs[_0x5944b4(0x1d3)](_0x35377f)){this['publicKey']=fs[_0x5944b4(0x1fe)](_0x35377f,_0x5944b4(0x1d9))[_0x5944b4(0x243)]();break;}const _0x1384ce=path[_0x5944b4(0x230)](_0x6dba5d);if(_0x1384ce===_0x6dba5d)break;_0x6dba5d=_0x1384ce;}}}const _0x27a590=this['integrityManifestPath'],_0x4939c9=!__dirname[_0x5944b4(0x250)](/\\/g,'/')[_0x5944b4(0x208)]('/')[_0x5944b4(0x21e)](_0x5944b4(0x217)),_0x3aa5e7=process.env.MCP_SKIP_INTEGRITY_CHECK==='1'||_0x4939c9&&!fs[_0x5944b4(0x1d3)](_0x27a590);if(!_0x3aa5e7){const _0xb51758=require(_0x5944b4(0x24a));if(!fs[_0x5944b4(0x1d3)](_0x27a590)){console['error'](_0x5944b4(0x21f)),process[_0x5944b4(0x249)](0x1);return;}let _0x506c0e;try{_0x506c0e=JSON[_0x5944b4(0x25d)](fs['readFileSync'](_0x27a590,_0x5944b4(0x1d9)));}catch(_0x2b2e00){console['error']('[MCP\x20Agent]\x20Integrity\x20check\x20failed:\x20Failed\x20to\x20parse\x20integrity-manifest.json.\x20Exiting.'),process[_0x5944b4(0x249)](0x1);return;}if(!_0x506c0e[_0x5944b4(0x1e8)]||!_0x506c0e[_0x5944b4(0x25a)]){console[_0x5944b4(0x1fd)](_0x5944b4(0x1ef)),process['exit'](0x1);return;}const _0x1c9b4f=this[_0x5944b4(0x262)]||require(_0x5944b4(0x21b))[_0x5944b4(0x1fc)];try{const _0x3b3a61=JSON[_0x5944b4(0x23a)](_0x506c0e[_0x5944b4(0x1e8)]),_0x4303aa=Buffer[_0x5944b4(0x200)](_0x506c0e[_0x5944b4(0x25a)],_0x5944b4(0x1e7)),_0x4fbeb6=_0xb51758['verify'](null,Buffer[_0x5944b4(0x200)](_0x3b3a61),_0x1c9b4f,_0x4303aa);if(!_0x4fbeb6){console[_0x5944b4(0x1fd)](_0x5944b4(0x205)),process['exit'](0x1);return;}}catch(_0x3fce06){console[_0x5944b4(0x1fd)](_0x5944b4(0x1ee)),process['exit'](0x1);return;}const _0x2e0e3c=path[_0x5944b4(0x20d)](__dirname,'../..');for(const [_0x347824,_0x4d7770]of Object[_0x5944b4(0x22f)](_0x506c0e['files'])){const _0x45263d=path[_0x5944b4(0x20d)](_0x2e0e3c,_0x347824);if(!fs[_0x5944b4(0x1d3)](_0x45263d)){console['error']('[MCP\x20Agent]\x20Integrity\x20check\x20failed:\x20'+_0x347824+_0x5944b4(0x244)),process[_0x5944b4(0x249)](0x1);return;}try{const _0x4bf16a=fs[_0x5944b4(0x1fe)](_0x45263d),_0x20e09a=_0xb51758[_0x5944b4(0x24d)]('sha256')[_0x5944b4(0x212)](_0x4bf16a)[_0x5944b4(0x248)](_0x5944b4(0x1f4));if(_0x20e09a!==_0x4d7770){console[_0x5944b4(0x1fd)](_0x5944b4(0x255)+_0x347824+_0x5944b4(0x244)),process[_0x5944b4(0x249)](0x1);return;}}catch(_0xe01490){console[_0x5944b4(0x1fd)](_0x5944b4(0x255)+_0x347824+'\x20modified.\x20Exiting.'),process['exit'](0x1);return;}}}const _0x16ea03=process.env.MCP_SKIP_LICENSE_CHECK==='1';if(!_0x16ea03){if(!this['deviceId']){const {getFingerprint:_0x1aed44}=require(_0x5944b4(0x1fb));this[_0x5944b4(0x1f9)]=_0x1aed44();}const _0x238119=verifyLicense(this[_0x5944b4(0x254)],this[_0x5944b4(0x1f9)],this['publicKey']);if(!_0x238119[_0x5944b4(0x24e)]){if(_0x238119['reason']===_0x5944b4(0x1f5)){const _0xa04420=_0x238119[_0x5944b4(0x23f)]||{},_0x4b92f5=_0xa04420['exp']?new Date(_0xa04420[_0x5944b4(0x1dd)])['toISOString']()[_0x5944b4(0x208)]('T')[0x0]:_0x5944b4(0x23e);console[_0x5944b4(0x1fd)](_0x5944b4(0x23b)+_0x4b92f5+'.\x20Renew\x20at\x20https://anhdh.io/renew.\x20Exiting.');}else console[_0x5944b4(0x1fd)]('[MCP\x20Agent]\x20License\x20key\x20verification\x20failed:\x20'+_0x238119[_0x5944b4(0x224)]+_0x5944b4(0x1f1));process['exit'](0x1);return;}console[_0x5944b4(0x1fd)](_0x5944b4(0x1e3)+_0x238119[_0x5944b4(0x23f)][_0x5944b4(0x221)]),await this[_0x5944b4(0x247)](),this[_0x5944b4(0x203)]=setInterval(()=>{const _0x30a5b0=_0x5944b4;this[_0x30a5b0(0x247)]()[_0x30a5b0(0x252)](_0x44004d=>{const _0x4da93d=_0x30a5b0;console[_0x4da93d(0x1fd)](_0x4da93d(0x1f6),_0x44004d['message']);});},0x18*0x3c*0x3c*0x3e8);}this[_0x5944b4(0x251)]=spawnBackends(this[_0x5944b4(0x1f0)]),this[_0x5944b4(0x22e)]=!![];for(const _0x461b87 of Object[_0x5944b4(0x209)](this[_0x5944b4(0x251)])){_0x461b87['start']();}this[_0x5944b4(0x1db)]=_0xbf6f9d=>{this['handleClientData'](_0xbf6f9d['toString']());},process[_0x5944b4(0x231)]['on'](_0x5944b4(0x207),this['stdinListener']);}[_0x62cf2d(0x23c)](_0x5ec13a){const _0x15ada2=_0x62cf2d;this[_0x15ada2(0x22d)]+=_0x5ec13a;const _0x41a7ce=this['clientBuffer'][_0x15ada2(0x208)]('\x0a');this[_0x15ada2(0x22d)]=_0x41a7ce[_0x15ada2(0x219)]();for(const _0x324901 of _0x41a7ce){const _0xc09349=_0x324901['trim']();if(!_0xc09349)continue;try{const _0x392f2d=JSON['parse'](_0xc09349);this['handleClientMessage'](_0x392f2d);}catch(_0x30de93){console[_0x15ada2(0x1fd)](_0x15ada2(0x240),_0x324901,_0x30de93[_0x15ada2(0x1ea)]);}}}async[_0x62cf2d(0x21a)](_0xb202d0){const _0x440a3c=_0x62cf2d,{id:_0x82f741,method:_0x6f185c,params:_0x32c10d}=_0xb202d0;if(!_0x6f185c)return;if(_0x6f185c===_0x440a3c(0x25e)){Promise[_0x440a3c(0x1f7)](Object['values'](this[_0x440a3c(0x251)])[_0x440a3c(0x1ec)](_0x19d1d6=>_0x19d1d6['sendRequest'](_0x440a3c(0x25e),_0x32c10d)[_0x440a3c(0x252)](_0x505405=>{const _0x1fb822=_0x440a3c;console['error'](_0x1fb822(0x257)+(_0x19d1d6[_0x1fb822(0x24f)]||_0x19d1d6['name'])+':',_0x505405[_0x1fb822(0x1ea)]);})));const _0x589ae4={};_0x589ae4['listChanged']=![];const _0x4bc692={};_0x4bc692[_0x440a3c(0x21c)]=_0x589ae4;const _0x3feaf9={};_0x3feaf9[_0x440a3c(0x1ed)]='mcp-agent-proxy',_0x3feaf9[_0x440a3c(0x222)]=_0x440a3c(0x211);const _0x5d2d5f={};_0x5d2d5f[_0x440a3c(0x1e6)]=_0x32c10d[_0x440a3c(0x1e6)]||_0x440a3c(0x215),_0x5d2d5f[_0x440a3c(0x1d6)]=_0x4bc692,_0x5d2d5f[_0x440a3c(0x25c)]=_0x3feaf9;const _0x3b5df4={};_0x3b5df4[_0x440a3c(0x206)]=_0x440a3c(0x225),_0x3b5df4['id']=_0x82f741,_0x3b5df4[_0x440a3c(0x1d7)]=_0x5d2d5f;const _0x1aa61b=_0x3b5df4;this[_0x440a3c(0x1da)](_0x1aa61b);return;}if(_0x6f185c===_0x440a3c(0x228)){try{const _0x9239c=Object[_0x440a3c(0x22f)](this['backends'])['map'](async([_0x3d8061,_0x4b7d5a])=>{const _0x50fdf3=_0x440a3c;try{const _0x3c4093=await _0x4b7d5a[_0x50fdf3(0x201)](_0x50fdf3(0x228)),_0x19248a=_0x3c4093&&_0x3c4093[_0x50fdf3(0x1d7)]&&_0x3c4093['result']['tools']||[];return translateToolList(_0x19248a,_0x3d8061);}catch(_0x206616){return console[_0x50fdf3(0x1fd)](_0x50fdf3(0x1de)+_0x3d8061+':',_0x206616[_0x50fdf3(0x1ea)]),[];}}),_0x22fc72=await Promise[_0x440a3c(0x1f7)](_0x9239c),_0x1b490d=_0x22fc72[_0x440a3c(0x227)](),_0x5e5dda={};_0x5e5dda['tools']=_0x1b490d;const _0x40bbef={};_0x40bbef['jsonrpc']=_0x440a3c(0x225),_0x40bbef['id']=_0x82f741,_0x40bbef[_0x440a3c(0x1d7)]=_0x5e5dda;const _0x1d8ce8=_0x40bbef;this[_0x440a3c(0x1da)](_0x1d8ce8);}catch(_0x32ff98){this[_0x440a3c(0x22c)](_0x82f741,-0x7f5b,'Failed\x20to\x20query\x20tool\x20list:\x20'+_0x32ff98[_0x440a3c(0x1ea)]);}return;}if(_0x6f185c===_0x440a3c(0x210)){const _0x5200ae=_0x32c10d[_0x440a3c(0x1ed)],_0x38b50d=mapExposedToOriginal(_0x5200ae);if(!_0x38b50d)return this['writeError'](_0x82f741,-0x7f59,_0x440a3c(0x25b)+_0x5200ae);try{const _0x18353c=this[_0x440a3c(0x251)][_0x38b50d[_0x440a3c(0x20f)]];if(!_0x18353c)return this[_0x440a3c(0x22c)](_0x82f741,-0x7f5b,_0x440a3c(0x218)+_0x38b50d[_0x440a3c(0x20f)]+_0x440a3c(0x261));const _0x2d0d96={..._0x32c10d};_0x2d0d96['name']=_0x38b50d[_0x440a3c(0x259)];const _0x2eff13={..._0xb202d0};_0x2eff13[_0x440a3c(0x1eb)]=_0x2d0d96;const _0x55cf66=_0x2eff13,_0x17665d=await _0x18353c[_0x440a3c(0x22a)](_0x55cf66);this[_0x440a3c(0x1da)](_0x17665d);}catch(_0x29520b){this[_0x440a3c(0x22c)](_0x82f741,-0x7f5b,'Tool\x20execution\x20failed:\x20'+_0x29520b[_0x440a3c(0x1ea)]);}return;}for(const _0x417b6f of Object[_0x440a3c(0x209)](this[_0x440a3c(0x251)])){_0x417b6f[_0x440a3c(0x202)]&&_0x417b6f[_0x440a3c(0x202)][_0x440a3c(0x231)][_0x440a3c(0x245)](JSON[_0x440a3c(0x23a)](_0xb202d0)+'\x0a');}}[_0x62cf2d(0x1da)](_0x39a384){const _0x3ec4c5=_0x62cf2d;this[_0x3ec4c5(0x232)][_0x3ec4c5(0x245)](JSON[_0x3ec4c5(0x23a)](_0x39a384)+'\x0a');}[_0x62cf2d(0x22c)](_0x35eea7,_0x1b589c,_0x25f36e){const _0x40928c=_0x62cf2d,_0x2aac0f={};_0x2aac0f['code']=_0x1b589c,_0x2aac0f[_0x40928c(0x1ea)]=_0x25f36e;const _0x34df17={};_0x34df17[_0x40928c(0x206)]=_0x40928c(0x225),_0x34df17['id']=_0x35eea7,_0x34df17[_0x40928c(0x1fd)]=_0x2aac0f;const _0x37d5de=_0x34df17;this[_0x40928c(0x1da)](_0x37d5de);}[_0x62cf2d(0x20b)](){const _0x328cb8=_0x62cf2d;this[_0x328cb8(0x22e)]=![];this[_0x328cb8(0x203)]&&(clearInterval(this['heartbeatInterval']),this[_0x328cb8(0x203)]=null);this[_0x328cb8(0x1db)]&&(process['stdin']['removeListener'](_0x328cb8(0x207),this[_0x328cb8(0x1db)]),this[_0x328cb8(0x1db)]=null,process[_0x328cb8(0x231)][_0x328cb8(0x22b)]());if(this['backends'])for(const _0x47593e of Object[_0x328cb8(0x209)](this[_0x328cb8(0x251)])){_0x47593e[_0x328cb8(0x20b)]();}}}function _0x3b32(_0x3be6f2,_0x53dfbf){_0x3be6f2=_0x3be6f2-0x1d2;const _0x52f738=_0x52f7();let _0x3b3245=_0x52f738[_0x3be6f2];if(_0x3b32['Lfvmne']===undefined){var _0x417533=function(_0x32c131){const _0x445596='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x32dc0b='',_0x57b3de='';for(let _0x311c74=0x0,_0x12d022,_0x4259c7,_0x1b194a=0x0;_0x4259c7=_0x32c131['charAt'](_0x1b194a++);~_0x4259c7&&(_0x12d022=_0x311c74%0x4?_0x12d022*0x40+_0x4259c7:_0x4259c7,_0x311c74++%0x4)?_0x32dc0b+=String['fromCharCode'](0xff&_0x12d022>>(-0x2*_0x311c74&0x6)):0x0){_0x4259c7=_0x445596['indexOf'](_0x4259c7);}for(let _0x3703a2=0x0,_0x24a49e=_0x32dc0b['length'];_0x3703a2<_0x24a49e;_0x3703a2++){_0x57b3de+='%'+('00'+_0x32dc0b['charCodeAt'](_0x3703a2)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x57b3de);};_0x3b32['UUwrYv']=_0x417533,_0x3b32['NHYhAD']={},_0x3b32['Lfvmne']=!![];}const _0x5d9537=_0x52f738[0x0],_0x15c770=_0x3be6f2+_0x5d9537,_0x140f3c=_0x3b32['NHYhAD'][_0x15c770];return!_0x140f3c?(_0x3b3245=_0x3b32['UUwrYv'](_0x3b3245),_0x3b32['NHYhAD'][_0x15c770]=_0x3b3245):_0x3b3245=_0x140f3c,_0x3b3245;}const _0x5eeb48={};_0x5eeb48[_0x62cf2d(0x258)]=ProxyServer,module['exports']=_0x5eeb48;if(require[_0x62cf2d(0x216)]===module){const server=new ProxyServer();server['start']()[_0x62cf2d(0x252)](_0xe73ee1=>{const _0x50576e=_0x62cf2d;console[_0x50576e(0x1fd)]('Failed\x20to\x20start\x20ProxyServer:',_0xe73ee1[_0x50576e(0x1ea)]),process['exit'](0x1);});}function _0x52f7(){const _0x53403c=['D3jPDgvgAwXLu3LUyW','ywjVCNq','w01ducbbz2vUDf0Gu3rHCNrPBMCGC2vYDMvYigf0ia','Aw50zwDYAxr5twfUAwzLC3rqyxrO','w01ducbbz2vUDf0GtgLJzw5ZzsbRzxKGDMvYAwzPzwqGC3vJy2vZC2z1BgX5igzVCIb1C2vYoIa','l2HLyxj0yMvHDa','w01ducbbz2vUDf0GrMfPBgvKihrVihnHDMuGCMvMCMvZAgvKigXPy2vUC2uGDg9Rzw4GDg8GzgLZAZO','ChjVDg9JB2XwzxjZAw9U','yMfZzty0DxjS','zMLSzxm','BgvUz3rO','BwvZC2fNzq','CgfYyw1Z','BwfW','BMfTzq','w01ducbbz2vUDf0Gsw50zwDYAxr5ignOzwnRigzHAwXLzdOGu2LNBMf0DxjLihzLCMLMAwnHDgLVBIbMywLSzwqUiev4AxrPBMCU','w01ducbbz2vUDf0Gsw50zwDYAxr5ignOzwnRigzHAwXLzdOGsw52ywXPzcbTyw5PzMvZDcbMB3jTyxqUiev4AxrPBMCU','ChjVAMvJDfbHDgG','lIbdB250ywn0ihn1ChbVCNqGyxqGC3vWCg9YDebHBMHKAc5PBY4GrxHPDgLUzY4','Ag9TzwrPCG','w01ducbbz2vUDf0GsgvHCNrIzwf0ihjLzNjLC2GGzMfPBgvKoIbtzxj2zxiGCMv0DxjUzwqG','Agv4','tgLJzw5ZzsbLEhbPCMvK','w01ducbbz2vUDf0GugvYAw9KAwmGAgvHCNrIzwf0igvYCM9YoG','ywXS','BM93','zgv2AwnLswq','mte5ndiXntbyAer0DNm','lI4VBgLJzw5Zzs9MAw5NzxjWCMLUDc5QCW','ufjprfvdveLptL9qvujmsunFs0vz','zxjYB3i','CMvHzezPBgvtEw5J','C2LNBMfS','zNjVBq','C2vUzfjLCxvLC3q','y2HPBgq','AgvHCNrIzwf0sw50zxj2ywW','w01ducbbz2vUDf0GtgLJzw5ZzsbRzxKGAgfZigjLzw4GCMv2B2TLzc4GrxHPDgLUzY4','w01ducbbz2vUDf0Gsw50zwDYAxr5ignOzwnRigzHAwXLzdOGsw52ywXPzcbZAwDUyxr1CMuUiev4AxrPBMCU','ANnVBNjWyW','zgf0yq','C3bSAxq','DMfSDwvZ','CMvJDxjZAxzL','C3rVCa','w01ducbbz2vUDf0GsgvHCNrIzwf0ignOzwnRoIb0B2TLBIbOyxmGBgvZCYb0AgfUidyGzgf5CYbYzw1HAw5PBMCUifjLzNjLC2HPBMCUlI4','AM9PBG','mteXmZuWmejACLDlva','yMfJA2vUza','Dg9VBhmVy2fSBa','ms4WlJa','DxbKyxrL','Cgf0Aa','BwfZDgvYu2vJCMv0','mJaYnc0Xms0Wnq','BwfPBG','zgLZDa','vgfYz2v0igjHy2TLBMqG','Cg9W','AgfUzgXLq2XPzw50twvZC2fNzq','lI4VBgLJzw5Zzs92zxjPzNKUANm','Dg9VBhm','Dg9Rzw4','Aw5JBhvKzxm','w01ducbbz2vUDf0Gsw50zwDYAxr5ignOzwnRigzHAwXLzdOGAw50zwDYAxr5lw1HBMLMzxn0lMPZB24GBwLZC2LUzY4GrxHPDgLUzY4','C3rHCNq','DxnLCG','DMvYC2LVBG','ywrTAw4','CMvHC29U','mI4W','BgLJzw5Zzs5RzxK','zMXHDa','Dg9VBhmVBgLZDa','ue9tva','zM9YD2fYzfjLCxvLC3q','Cgf1C2u','D3jPDgvfCNjVCG','y2XPzw50qNvMzMvY','CNvUBMLUzW','zw50CMLLCW','zgLYBMfTzq','C3rKAw4','C3rKB3v0','ndu2runkrg1K','Ahr0Chm6lY9Hz2vUDgTPDc5HBhbOyxrLy2HZlMfPl2fWAq','lIbdB250Aw51Aw5NihDPDgGGy2fJAgvKihrVA2vUlG','BwTKAxjtEw5J','Aw50zwDYAxr5lw1HBMLMzxn0lMPZB24','lI9IywnRzw5KCY5QCW','lI9YB3v0zxiUANm','C3rYAw5NAwz5','w01ducbbz2vUDf0GtgLJzw5ZzsbLEhbPCMvKig9Uia','AgfUzgXLq2XPzw50rgf0yq','ndu0oe9oDeXOsq','Dw5RBM93BG','Cgf5Bg9Hza','w01ducbbz2vUDf0GrMfPBgvKihrVihbHCNnLiePtt04TuLbdig1LC3nHz2uGzNjVBsbJBgLLBNq6','C3rHDhvZ','w01ducbbz2vUDf0GtgLJzw5ZzsbRzxKGzxHWAxjLzcbVCIbPBNzHBgLKlIbfEgL0Aw5NlG','DhjPBq','ig1VzgLMAwvKlIbfEgL0Aw5NlG','D3jPDgu','yxbWBgLJyxrPB24VANnVBG','CgvYzM9YBuHLyxj0yMvHDa','zgLNzxn0','zxHPDa','y3j5ChrV','BwfZDgvYlNb1yMXPyY5Wzw0','w01ducbbz2vUDf0GsgvHCNrIzwf0oIbmAwnLBNnLihrVA2vUihn1y2nLC3nMDwXSEsbYzwzYzxnOzwqU','y3jLyxrLsgfZAa','DMfSAwq','zgLZCgXHEu5HBwu','CMvWBgfJzq','yMfJA2vUzhm','y2f0y2G','mJe3zMHNu2L0','BgLJzw5ZzuTLEq','w01ducbbz2vUDf0Gsw50zwDYAxr5ignOzwnRigzHAwXLzdOG','lMfUAgrO','w01ducbbz2vUDf0GrMfPBgvKihrVigLUAxrPywXPEMuGC2vYDMLJzsa','uhjVEhLtzxj2zxi','B3jPz2LUywXoyw1L','C2LNBMf0DxjL','vg9VBcbUB3qGzM91BMq6ia','C2vYDMvYsw5MBW','CgfYC2u','Aw5PDgLHBgL6zq','mtbwqxrbD1O','ntu4EKTmrMzz','igLZig5VDcbYDw5UAw5N','ChvIBgLJs2v5','Bg9HzeXPy2vUC2vlzxK','zxHPC3rZu3LUyW','mZa5ndHbA3DPDwS','ndC5nZzlDg95EMe','y2fWywjPBgL0AwvZ','CMvZDwX0','nZiZnLvvzvfVvG','DxrMoa','D3jPDgvuB0nSAwvUDa','C3rKAw5mAxn0zw5LCG','odiXmJuWvwP1vhnX','zxHW','w01ducbbz2vUDf0GDg9VBhmVBgLZDcbYzxf1zxn0igzHAwXLzcbMB3iGC2vYDMLJzsa'];_0x52f7=function(){return _0x53403c;};return _0x52f7();}
|
package/src/templates/AGENTS.md
CHANGED
|
@@ -1,140 +1,140 @@
|
|
|
1
|
-
## Agent skills
|
|
2
|
-
|
|
3
|
-
### Support & issues
|
|
4
|
-
|
|
5
|
-
For bug reports, feature requests, or licensing questions, contact: `info.alphatechs.ai@gmail.com`
|
|
6
|
-
|
|
7
|
-
### Issue tracker
|
|
8
|
-
|
|
9
|
-
Issues are tracked in GitLab Issues. See `docs/agents/issue-tracker.md`.
|
|
10
|
-
|
|
11
|
-
### Triage labels
|
|
12
|
-
|
|
13
|
-
Default label vocabulary (needs-triage, needs-info, ready-for-agent, ready-for-human, wontfix). See `docs/agents/triage-labels.md`.
|
|
14
|
-
|
|
15
|
-
### Domain docs
|
|
16
|
-
|
|
17
|
-
Single-context layout — one `CONTEXT.md` + `docs/adr/` at the repo root. See `docs/agents/domain.md`.
|
|
18
|
-
|
|
19
|
-
### FE Web design (taste-skill)
|
|
20
|
-
|
|
21
|
-
Anti-slop frontend design skill for landing pages, portfolios, and redesigns.
|
|
22
|
-
|
|
23
|
-
- `ui-style-rules` — anti-slop design rules, typography, color calibration, layout discipline for code generation.
|
|
24
|
-
- `web-mockup-gen` — web design image/mockup generation (image-only, no code).
|
|
25
|
-
|
|
26
|
-
### FE Mobile design
|
|
27
|
-
|
|
28
|
-
- `mobile-mockup-gen` — mobile app screen mockup generation (image-only, no code).
|
|
29
|
-
- `mobile-rules` — mobile-first design thinking (touch, performance, platform conventions).
|
|
30
|
-
|
|
31
|
-
### Flutter development
|
|
32
|
-
|
|
33
|
-
Skills for Flutter architecture, testing, layout, routing, localization, and serialization.
|
|
34
|
-
|
|
35
|
-
Skills: `flutter-add-integration-test`, `flutter-add-widget-preview`, `flutter-add-widget-test`, `flutter-apply-architecture-best-practices`, `flutter-build-responsive-layout`, `flutter-fix-layout-issues`, `flutter-implement-json-serialization`, `flutter-setup-declarative-routing`, `flutter-setup-localization`, `flutter-use-http-package`.
|
|
36
|
-
|
|
37
|
-
### MCP tools
|
|
38
|
-
|
|
39
|
-
Tool selection rules, index policies, memory conventions, and auto-skill activation. See `docs/agents/mcp-tools.md`.
|
|
40
|
-
|
|
41
|
-
**Quick reference:**
|
|
42
|
-
- Code search: `code_search` (default), `grep_search` (non-code only)
|
|
43
|
-
- Impact: `impact_analysis` (always update index first)
|
|
44
|
-
- Memory: `remember` / `recall` / `read_knowledge` (see conventions in mcp-tools.md)
|
|
45
|
-
|
|
46
|
-
### PM tools
|
|
47
|
-
|
|
48
|
-
PM preset connects to Jira for project management. See `docs/agents/jira-config.md`.
|
|
49
|
-
|
|
50
|
-
**Quick reference:**
|
|
51
|
-
- Search tasks: `pm-search-tasks` (JQL query)
|
|
52
|
-
- Task CRUD: `pm-get-task`, `pm-create-task`, `pm-update-task`
|
|
53
|
-
- Status transitions: `pm-change-status`
|
|
54
|
-
- Comments: `pm-add-comment`
|
|
55
|
-
- Projects/Boards: `pm-list-projects`, `pm-get-board`
|
|
56
|
-
- Confluence: `pm-search-docs`, `pm-get-doc`
|
|
57
|
-
|
|
58
|
-
### Design tools
|
|
59
|
-
|
|
60
|
-
Optional design tool integration for FE/mobile. See `docs/agents/design-config.md`.
|
|
61
|
-
|
|
62
|
-
**Quick reference:**
|
|
63
|
-
- Figma: `design-read-figma` (extract layout/styles), `design-get-figma-images` (download assets)
|
|
64
|
-
- Stitch: `design-stitch-generate` (create screen), `design-stitch-get-code` (pull code), `design-stitch-get-dna` (design tokens)
|
|
65
|
-
|
|
66
|
-
### ASO tools
|
|
67
|
-
|
|
68
|
-
ASO preset integrates all 40 ASO skills under `.agents/skills/aso-*`.
|
|
69
|
-
|
|
70
|
-
**Quick reference:**
|
|
71
|
-
- Route: `aso-router`
|
|
72
|
-
- Marketing Context: `aso-marketing-context`
|
|
73
|
-
- Audit: `aso-audit`
|
|
74
|
-
- Competitors: `aso-competitor-analysis`, `aso-competitor-tracking`
|
|
75
|
-
- Store listings: `aso-ab-test-store-listing`, `aso-metadata-optimization`, `aso-screenshot-optimization`
|
|
76
|
-
- Revenue: `aso-monetization-strategy`, `aso-paywall-optimization`, `aso-subscription-lifecycle`
|
|
77
|
-
- Retention: `aso-retention-optimization`, `aso-onboarding-optimization`, `aso-rating-prompt-strategy`
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
## Session Start Protocol (MANDATORY)
|
|
82
|
-
|
|
83
|
-
At the start of every session:
|
|
84
|
-
1. Read `.agents/ARCHITECTURE.md` to understand Agents, Skills, and Scripts.
|
|
85
|
-
2. Read `.agents/memory/MEMORY.md` to load persistent project conventions.
|
|
86
|
-
3. Read `docs/agents/mcp-tools.md` to load MCP tool selection rules & memory conventions.
|
|
87
|
-
4. Call `read_knowledge` to load dynamic knowledge graph from memory.
|
|
88
|
-
5. **Read `.agents/skill-triggers.json` to load auto-routing rules for all skills/workflows/tools.**
|
|
89
|
-
|
|
90
|
-
---
|
|
91
|
-
|
|
92
|
-
## Unified Auto-Routing (MANDATORY)
|
|
93
|
-
|
|
94
|
-
All 60+ skills, 12 workflows, and 28 MCP tools are indexed in `.agents/skill-triggers.json`.
|
|
95
|
-
The agent MUST use this trigger map to automatically invoke the right tool based on user's natural language.
|
|
96
|
-
|
|
97
|
-
**How it works:**
|
|
98
|
-
1. **Detect** — Scan user message for keywords (EN + VI), URL patterns, file extensions
|
|
99
|
-
2. **Filter** — Only match skills the user has installed (preset-aware)
|
|
100
|
-
3. **Execute** — Based on risk level:
|
|
101
|
-
|
|
102
|
-
| Risk Level | Behavior | Examples |
|
|
103
|
-
|---|---|---|
|
|
104
|
-
| `safe` | 🔄 Auto-invoke, announce skill name | analytics, search, review, debug |
|
|
105
|
-
| `suggest` | 💡 Show suggestion, wait for confirm | create, deploy, refactor, generate |
|
|
106
|
-
| `ambiguous` | 🤔 Show alternatives, let user choose | "design" → Stitch / Figma / mockup |
|
|
107
|
-
|
|
108
|
-
**Override:** User can always use explicit `@agent` mentions or `/slash-commands`. Explicit > auto-routing.
|
|
109
|
-
|
|
110
|
-
**Missing preset:** If trigger matches but preset not installed → show install hint, don't silently fail.
|
|
111
|
-
|
|
112
|
-
**Context awareness:** Track conversation topic to improve routing (e.g., Flutter context + "add test" → `flutter-add-widget-test`, not generic `testing-patterns`).
|
|
113
|
-
|
|
114
|
-
Full routing protocol: `.agents/skills/intelligent-routing/SKILL.md`
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
## Socratic Gate
|
|
119
|
-
|
|
120
|
-
Every user request must pass through the Socratic Gate before ANY implementation:
|
|
121
|
-
|
|
122
|
-
| Request Type | Strategy | Required Action |
|
|
123
|
-
|---|---|---|
|
|
124
|
-
| **New Feature / Build** | Deep Discovery | ASK minimum 3 strategic questions |
|
|
125
|
-
| **Code Edit / Bug Fix** | Context Check | Confirm understanding + ask impact questions |
|
|
126
|
-
| **Vague / Simple** | Clarification | Ask Purpose, Users, and Scope |
|
|
127
|
-
|
|
128
|
-
---
|
|
129
|
-
|
|
130
|
-
## Universal Rules
|
|
131
|
-
|
|
132
|
-
### Clean Code (Global Mandatory)
|
|
133
|
-
- **Code**: Concise, direct, no over-engineering. Self-documenting.
|
|
134
|
-
- **Testing**: Mandatory. Pyramid (Unit > Int > E2E) + AAA Pattern.
|
|
135
|
-
- **Performance**: Measure first. Adhere to current Core Web Vitals standards.
|
|
136
|
-
|
|
137
|
-
### Quick Reference
|
|
138
|
-
- **Masters**: `orchestrator`, `project-planner`, `security-auditor`, `backend-specialist`, `frontend-specialist`, `mobile-developer`, `pm-specialist`, `debugger`
|
|
139
|
-
- **Auto-routing**: `.agents/skill-triggers.json` (85+ triggers, all roles)
|
|
140
|
-
- **Key docs**: `docs/agents/mcp-tools.md`, `docs/agents/jira-config.md`, `docs/agents/design-config.md`
|
|
1
|
+
## Agent skills
|
|
2
|
+
|
|
3
|
+
### Support & issues
|
|
4
|
+
|
|
5
|
+
For bug reports, feature requests, or licensing questions, contact: `info.alphatechs.ai@gmail.com`
|
|
6
|
+
|
|
7
|
+
### Issue tracker
|
|
8
|
+
|
|
9
|
+
Issues are tracked in GitLab Issues. See `docs/agents/issue-tracker.md`.
|
|
10
|
+
|
|
11
|
+
### Triage labels
|
|
12
|
+
|
|
13
|
+
Default label vocabulary (needs-triage, needs-info, ready-for-agent, ready-for-human, wontfix). See `docs/agents/triage-labels.md`.
|
|
14
|
+
|
|
15
|
+
### Domain docs
|
|
16
|
+
|
|
17
|
+
Single-context layout — one `CONTEXT.md` + `docs/adr/` at the repo root. See `docs/agents/domain.md`.
|
|
18
|
+
|
|
19
|
+
### FE Web design (taste-skill)
|
|
20
|
+
|
|
21
|
+
Anti-slop frontend design skill for landing pages, portfolios, and redesigns.
|
|
22
|
+
|
|
23
|
+
- `ui-style-rules` — anti-slop design rules, typography, color calibration, layout discipline for code generation.
|
|
24
|
+
- `web-mockup-gen` — web design image/mockup generation (image-only, no code).
|
|
25
|
+
|
|
26
|
+
### FE Mobile design
|
|
27
|
+
|
|
28
|
+
- `mobile-mockup-gen` — mobile app screen mockup generation (image-only, no code).
|
|
29
|
+
- `mobile-rules` — mobile-first design thinking (touch, performance, platform conventions).
|
|
30
|
+
|
|
31
|
+
### Flutter development
|
|
32
|
+
|
|
33
|
+
Skills for Flutter architecture, testing, layout, routing, localization, and serialization.
|
|
34
|
+
|
|
35
|
+
Skills: `flutter-add-integration-test`, `flutter-add-widget-preview`, `flutter-add-widget-test`, `flutter-apply-architecture-best-practices`, `flutter-build-responsive-layout`, `flutter-fix-layout-issues`, `flutter-implement-json-serialization`, `flutter-setup-declarative-routing`, `flutter-setup-localization`, `flutter-use-http-package`.
|
|
36
|
+
|
|
37
|
+
### MCP tools
|
|
38
|
+
|
|
39
|
+
Tool selection rules, index policies, memory conventions, and auto-skill activation. See `docs/agents/mcp-tools.md`.
|
|
40
|
+
|
|
41
|
+
**Quick reference:**
|
|
42
|
+
- Code search: `code_search` (default), `grep_search` (non-code only)
|
|
43
|
+
- Impact: `impact_analysis` (always update index first)
|
|
44
|
+
- Memory: `remember` / `recall` / `read_knowledge` (see conventions in mcp-tools.md)
|
|
45
|
+
|
|
46
|
+
### PM tools
|
|
47
|
+
|
|
48
|
+
PM preset connects to Jira for project management. See `docs/agents/jira-config.md`.
|
|
49
|
+
|
|
50
|
+
**Quick reference:**
|
|
51
|
+
- Search tasks: `pm-search-tasks` (JQL query)
|
|
52
|
+
- Task CRUD: `pm-get-task`, `pm-create-task`, `pm-update-task`
|
|
53
|
+
- Status transitions: `pm-change-status`
|
|
54
|
+
- Comments: `pm-add-comment`
|
|
55
|
+
- Projects/Boards: `pm-list-projects`, `pm-get-board`
|
|
56
|
+
- Confluence: `pm-search-docs`, `pm-get-doc`
|
|
57
|
+
|
|
58
|
+
### Design tools
|
|
59
|
+
|
|
60
|
+
Optional design tool integration for FE/mobile. See `docs/agents/design-config.md`.
|
|
61
|
+
|
|
62
|
+
**Quick reference:**
|
|
63
|
+
- Figma: `design-read-figma` (extract layout/styles), `design-get-figma-images` (download assets)
|
|
64
|
+
- Stitch: `design-stitch-generate` (create screen), `design-stitch-get-code` (pull code), `design-stitch-get-dna` (design tokens)
|
|
65
|
+
|
|
66
|
+
### ASO tools
|
|
67
|
+
|
|
68
|
+
ASO preset integrates all 40 ASO skills under `.agents/skills/aso-*`.
|
|
69
|
+
|
|
70
|
+
**Quick reference:**
|
|
71
|
+
- Route: `aso-router`
|
|
72
|
+
- Marketing Context: `aso-marketing-context`
|
|
73
|
+
- Audit: `aso-audit`
|
|
74
|
+
- Competitors: `aso-competitor-analysis`, `aso-competitor-tracking`
|
|
75
|
+
- Store listings: `aso-ab-test-store-listing`, `aso-metadata-optimization`, `aso-screenshot-optimization`
|
|
76
|
+
- Revenue: `aso-monetization-strategy`, `aso-paywall-optimization`, `aso-subscription-lifecycle`
|
|
77
|
+
- Retention: `aso-retention-optimization`, `aso-onboarding-optimization`, `aso-rating-prompt-strategy`
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Session Start Protocol (MANDATORY)
|
|
82
|
+
|
|
83
|
+
At the start of every session:
|
|
84
|
+
1. Read `.agents/ARCHITECTURE.md` to understand Agents, Skills, and Scripts.
|
|
85
|
+
2. Read `.agents/memory/MEMORY.md` to load persistent project conventions.
|
|
86
|
+
3. Read `docs/agents/mcp-tools.md` to load MCP tool selection rules & memory conventions.
|
|
87
|
+
4. Call `read_knowledge` to load dynamic knowledge graph from memory.
|
|
88
|
+
5. **Read `.agents/skill-triggers.json` to load auto-routing rules for all skills/workflows/tools.**
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Unified Auto-Routing (MANDATORY)
|
|
93
|
+
|
|
94
|
+
All 60+ skills, 12 workflows, and 28 MCP tools are indexed in `.agents/skill-triggers.json`.
|
|
95
|
+
The agent MUST use this trigger map to automatically invoke the right tool based on user's natural language.
|
|
96
|
+
|
|
97
|
+
**How it works:**
|
|
98
|
+
1. **Detect** — Scan user message for keywords (EN + VI), URL patterns, file extensions
|
|
99
|
+
2. **Filter** — Only match skills the user has installed (preset-aware)
|
|
100
|
+
3. **Execute** — Based on risk level:
|
|
101
|
+
|
|
102
|
+
| Risk Level | Behavior | Examples |
|
|
103
|
+
|---|---|---|
|
|
104
|
+
| `safe` | 🔄 Auto-invoke, announce skill name | analytics, search, review, debug |
|
|
105
|
+
| `suggest` | 💡 Show suggestion, wait for confirm | create, deploy, refactor, generate |
|
|
106
|
+
| `ambiguous` | 🤔 Show alternatives, let user choose | "design" → Stitch / Figma / mockup |
|
|
107
|
+
|
|
108
|
+
**Override:** User can always use explicit `@agent` mentions or `/slash-commands`. Explicit > auto-routing.
|
|
109
|
+
|
|
110
|
+
**Missing preset:** If trigger matches but preset not installed → show install hint, don't silently fail.
|
|
111
|
+
|
|
112
|
+
**Context awareness:** Track conversation topic to improve routing (e.g., Flutter context + "add test" → `flutter-add-widget-test`, not generic `testing-patterns`).
|
|
113
|
+
|
|
114
|
+
Full routing protocol: `.agents/skills/intelligent-routing/SKILL.md`
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Socratic Gate
|
|
119
|
+
|
|
120
|
+
Every user request must pass through the Socratic Gate before ANY implementation:
|
|
121
|
+
|
|
122
|
+
| Request Type | Strategy | Required Action |
|
|
123
|
+
|---|---|---|
|
|
124
|
+
| **New Feature / Build** | Deep Discovery | ASK minimum 3 strategic questions |
|
|
125
|
+
| **Code Edit / Bug Fix** | Context Check | Confirm understanding + ask impact questions |
|
|
126
|
+
| **Vague / Simple** | Clarification | Ask Purpose, Users, and Scope |
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Universal Rules
|
|
131
|
+
|
|
132
|
+
### Clean Code (Global Mandatory)
|
|
133
|
+
- **Code**: Concise, direct, no over-engineering. Self-documenting.
|
|
134
|
+
- **Testing**: Mandatory. Pyramid (Unit > Int > E2E) + AAA Pattern.
|
|
135
|
+
- **Performance**: Measure first. Adhere to current Core Web Vitals standards.
|
|
136
|
+
|
|
137
|
+
### Quick Reference
|
|
138
|
+
- **Masters**: `orchestrator`, `project-planner`, `security-auditor`, `backend-specialist`, `frontend-specialist`, `mobile-developer`, `pm-specialist`, `debugger`
|
|
139
|
+
- **Auto-routing**: `.agents/skill-triggers.json` (85+ triggers, all roles)
|
|
140
|
+
- **Key docs**: `docs/agents/mcp-tools.md`, `docs/agents/jira-config.md`, `docs/agents/design-config.md`
|
package/src/templates/GEMINI.md
CHANGED
|
@@ -1,116 +1,116 @@
|
|
|
1
|
-
---
|
|
2
|
-
trigger: always_on
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# GEMINI.md - AG Kit
|
|
6
|
-
|
|
7
|
-
> This file defines how the AI behaves in this workspace.
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Agent skills
|
|
12
|
-
|
|
13
|
-
### Support & issues
|
|
14
|
-
|
|
15
|
-
For bug reports, feature requests, or licensing questions, contact: `info.alphatechs.ai@gmail.com`
|
|
16
|
-
|
|
17
|
-
### Issue tracker
|
|
18
|
-
|
|
19
|
-
Issues are tracked in GitLab Issues. See `docs/agents/issue-tracker.md`.
|
|
20
|
-
|
|
21
|
-
### Triage labels
|
|
22
|
-
|
|
23
|
-
Default label vocabulary (needs-triage, needs-info, ready-for-agent, ready-for-human, wontfix). See `docs/agents/triage-labels.md`.
|
|
24
|
-
|
|
25
|
-
### Domain docs
|
|
26
|
-
|
|
27
|
-
Single-context layout — one `CONTEXT.md` + `docs/adr/` at the repo root. See `docs/agents/domain.md`.
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
## CRITICAL: AGENT & SKILL PROTOCOL (START HERE)
|
|
32
|
-
|
|
33
|
-
> **MANDATORY:** You MUST read the appropriate agent file and its skills BEFORE performing any implementation. This is the highest priority rule.
|
|
34
|
-
|
|
35
|
-
### 🗺️ System Map & Memory Read (MANDATORY at session start)
|
|
36
|
-
1. Read `.agents/ARCHITECTURE.md` to understand Agents, Skills, and Scripts.
|
|
37
|
-
2. Read `.agents/memory/MEMORY.md` to load persistent project conventions.
|
|
38
|
-
3. Read `docs/agents/mcp-tools.md` to load MCP tool selection rules & memory conventions.
|
|
39
|
-
4. Call `read_knowledge` to load dynamic knowledge graph from memory.
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
## 🤖 INTELLIGENT AGENT ROUTING
|
|
44
|
-
|
|
45
|
-
### Agent Routing Checklist
|
|
46
|
-
| Step | Check | If Unchecked |
|
|
47
|
-
|------|-------|--------------|
|
|
48
|
-
| 1 | Did I identify the correct agent for this domain? | → STOP. Analyze request domain first. |
|
|
49
|
-
| 2 | Did I READ the agent's `.md` file (or recall its rules)? | → STOP. Open `.agents/agent/{agent}.md` |
|
|
50
|
-
| 3 | Did I announce `🤖 Applying knowledge of @[agent]...`? | → STOP. Add announcement before response. |
|
|
51
|
-
| 4 | Did I load required skills from agent's frontmatter? | → STOP. Check `skills:` field and read them. |
|
|
52
|
-
| 5 | Did I check MCP tool selection rules? | → STOP. Read `docs/agents/mcp-tools.md` |
|
|
53
|
-
| 6 | Is this a UI task? Did I load design skill? | → STOP. Load appropriate design skill first |
|
|
54
|
-
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
## 🎯 AUTO-TRIGGER SKILLS (MANDATORY)
|
|
58
|
-
|
|
59
|
-
Workflow Skills — tự trigger theo request type:
|
|
60
|
-
|
|
61
|
-
| Skill | Trigger Conditions | Agent Action |
|
|
62
|
-
|---|---|---|
|
|
63
|
-
| `spec-clarification` | Design decision, architecture choice, plan review, "should we X or Y?", "/plan" | Load SKILL.md → Start alignment session |
|
|
64
|
-
| `bug-diagnostics` | Bug report, error log, "bị lỗi", "không hoạt động", "fails", "crashes", "/debug" | Load SKILL.md → Reproduce → minimise → hypothesise → fix |
|
|
65
|
-
| `task-breakdown` | Plan/PRD just completed, "break down", "tách task", "create tickets", "/to-issues" | Load SKILL.md → Convert plan to vertical-slice issues |
|
|
66
|
-
| `prd-gen` | New feature/product description with enough context for spec, "/to-prd" | Load SKILL.md → Extract PRD from conversation context |
|
|
67
|
-
| `prototype` | "thử xem", "mockup", "explore options", unclear UI/logic, "/prototype" | Load SKILL.md → Pick branch (logic vs UI) → Build throwaway prototype |
|
|
68
|
-
| `tdd-loop` | Feature implementation, bug fix, "write tests", "red-green", "/tdd" | Load SKILL.md → Apply RED-GREEN-REFACTOR loop |
|
|
69
|
-
|
|
70
|
-
UI/UX Design Skills — tự trigger khi touch UI/design:
|
|
71
|
-
|
|
72
|
-
| Skill | Trigger Conditions | Agent Action |
|
|
73
|
-
|---|---|---|
|
|
74
|
-
| `ui-style-rules` | Any web UI task: page layout, component styling, redesign, landing page | Load SKILL.md → Apply anti-slop design rules |
|
|
75
|
-
| `web-mockup-gen` | "mockup web", "design page", web UI concept needed before coding | Load SKILL.md → Generate web design reference images (no code) |
|
|
76
|
-
| `mobile-mockup-gen` | "mockup app", "design screen", mobile UI concept needed before coding | Load SKILL.md → Generate mobile screen mockups in phone frames |
|
|
77
|
-
| `mobile-rules` | Any mobile UI implementation: Flutter widget, screen, touch interaction | Load SKILL.md → Apply platform conventions, touch patterns, performance |
|
|
78
|
-
| `flutter-*` | Flutter-specific tasks: layout fix, routing, serialization, testing, etc. | Auto-select matching flutter skill based on task type |
|
|
79
|
-
|
|
80
|
-
### UI/UX Auto-Detection Rules
|
|
81
|
-
- **mobile-flutter preset**: Load `mobile-rules` + `ui-style-rules` (adapted) + `mobile-mockup-gen` + matching `flutter-*`
|
|
82
|
-
- **fe-react / fe-angular / fe-vue presets**: Load `ui-style-rules` + `web-mockup-gen`
|
|
83
|
-
- **aso preset**: Load `aso-router` + matching `aso-*` skills
|
|
84
|
-
- **system preset**: All of the above based on file context
|
|
85
|
-
|
|
86
|
-
**Failure Condition:**
|
|
87
|
-
- ❌ Writing UI code without loading design skill = **SLOP RISK**
|
|
88
|
-
- ❌ Creating mobile screen without `mobile-rules` = **PLATFORM VIOLATION**
|
|
89
|
-
- ❌ Designing web page without `ui-style-rules` = **GENERIC OUTPUT**
|
|
90
|
-
|
|
91
|
-
---
|
|
92
|
-
|
|
93
|
-
## 🛑 GLOBAL SOCRATIC GATE (TIER 0)
|
|
94
|
-
|
|
95
|
-
Every user request must pass through the Socratic Gate before ANY tool use or implementation:
|
|
96
|
-
|
|
97
|
-
| Request Type | Strategy | Required Action |
|
|
98
|
-
|---|---|---|
|
|
99
|
-
| **New Feature / Build** | Deep Discovery | ASK minimum 3 strategic questions |
|
|
100
|
-
| **Code Edit / Bug Fix** | Context Check | Confirm understanding + ask impact questions |
|
|
101
|
-
| **Vague / Simple** | Clarification | Ask Purpose, Users, and Scope |
|
|
102
|
-
| **Full Orchestration** | Gatekeeper | **STOP** subagents until user confirms plan details |
|
|
103
|
-
| **Direct "Proceed"** | Validation | **STOP** → Even if answers are given, ask 2 "Edge Case" questions |
|
|
104
|
-
|
|
105
|
-
---
|
|
106
|
-
|
|
107
|
-
## TIER 0: UNIVERSAL RULES
|
|
108
|
-
|
|
109
|
-
### 🧹 Clean Code (Global Mandatory)
|
|
110
|
-
- **Code**: Concise, direct, no over-engineering. Self-documenting.
|
|
111
|
-
- **Testing**: Mandatory. Pyramid (Unit > Int > E2E) + AAA Pattern.
|
|
112
|
-
- **Performance**: Measure first. Adhere to current Core Web Vitals standards.
|
|
113
|
-
|
|
114
|
-
### 🗺️ Quick Reference
|
|
115
|
-
- **Masters**: `orchestrator`, `project-planner`, `security-auditor`, `backend-specialist`, `frontend-specialist`, `mobile-developer`, `aso-specialist`, `debugger`
|
|
116
|
-
- **Key Skills**: `clean-code`, `brainstorming`, `ui-style-rules`, `mobile-rules`, `web-mockup-gen`, `mobile-mockup-gen`, `bug-diagnostics`, `tdd-loop`, `spec-clarification`, `prd-gen`, `task-breakdown`, `prototype`, `aso-router`
|
|
1
|
+
---
|
|
2
|
+
trigger: always_on
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# GEMINI.md - AG Kit
|
|
6
|
+
|
|
7
|
+
> This file defines how the AI behaves in this workspace.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Agent skills
|
|
12
|
+
|
|
13
|
+
### Support & issues
|
|
14
|
+
|
|
15
|
+
For bug reports, feature requests, or licensing questions, contact: `info.alphatechs.ai@gmail.com`
|
|
16
|
+
|
|
17
|
+
### Issue tracker
|
|
18
|
+
|
|
19
|
+
Issues are tracked in GitLab Issues. See `docs/agents/issue-tracker.md`.
|
|
20
|
+
|
|
21
|
+
### Triage labels
|
|
22
|
+
|
|
23
|
+
Default label vocabulary (needs-triage, needs-info, ready-for-agent, ready-for-human, wontfix). See `docs/agents/triage-labels.md`.
|
|
24
|
+
|
|
25
|
+
### Domain docs
|
|
26
|
+
|
|
27
|
+
Single-context layout — one `CONTEXT.md` + `docs/adr/` at the repo root. See `docs/agents/domain.md`.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## CRITICAL: AGENT & SKILL PROTOCOL (START HERE)
|
|
32
|
+
|
|
33
|
+
> **MANDATORY:** You MUST read the appropriate agent file and its skills BEFORE performing any implementation. This is the highest priority rule.
|
|
34
|
+
|
|
35
|
+
### 🗺️ System Map & Memory Read (MANDATORY at session start)
|
|
36
|
+
1. Read `.agents/ARCHITECTURE.md` to understand Agents, Skills, and Scripts.
|
|
37
|
+
2. Read `.agents/memory/MEMORY.md` to load persistent project conventions.
|
|
38
|
+
3. Read `docs/agents/mcp-tools.md` to load MCP tool selection rules & memory conventions.
|
|
39
|
+
4. Call `read_knowledge` to load dynamic knowledge graph from memory.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 🤖 INTELLIGENT AGENT ROUTING
|
|
44
|
+
|
|
45
|
+
### Agent Routing Checklist
|
|
46
|
+
| Step | Check | If Unchecked |
|
|
47
|
+
|------|-------|--------------|
|
|
48
|
+
| 1 | Did I identify the correct agent for this domain? | → STOP. Analyze request domain first. |
|
|
49
|
+
| 2 | Did I READ the agent's `.md` file (or recall its rules)? | → STOP. Open `.agents/agent/{agent}.md` |
|
|
50
|
+
| 3 | Did I announce `🤖 Applying knowledge of @[agent]...`? | → STOP. Add announcement before response. |
|
|
51
|
+
| 4 | Did I load required skills from agent's frontmatter? | → STOP. Check `skills:` field and read them. |
|
|
52
|
+
| 5 | Did I check MCP tool selection rules? | → STOP. Read `docs/agents/mcp-tools.md` |
|
|
53
|
+
| 6 | Is this a UI task? Did I load design skill? | → STOP. Load appropriate design skill first |
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 🎯 AUTO-TRIGGER SKILLS (MANDATORY)
|
|
58
|
+
|
|
59
|
+
Workflow Skills — tự trigger theo request type:
|
|
60
|
+
|
|
61
|
+
| Skill | Trigger Conditions | Agent Action |
|
|
62
|
+
|---|---|---|
|
|
63
|
+
| `spec-clarification` | Design decision, architecture choice, plan review, "should we X or Y?", "/plan" | Load SKILL.md → Start alignment session |
|
|
64
|
+
| `bug-diagnostics` | Bug report, error log, "bị lỗi", "không hoạt động", "fails", "crashes", "/debug" | Load SKILL.md → Reproduce → minimise → hypothesise → fix |
|
|
65
|
+
| `task-breakdown` | Plan/PRD just completed, "break down", "tách task", "create tickets", "/to-issues" | Load SKILL.md → Convert plan to vertical-slice issues |
|
|
66
|
+
| `prd-gen` | New feature/product description with enough context for spec, "/to-prd" | Load SKILL.md → Extract PRD from conversation context |
|
|
67
|
+
| `prototype` | "thử xem", "mockup", "explore options", unclear UI/logic, "/prototype" | Load SKILL.md → Pick branch (logic vs UI) → Build throwaway prototype |
|
|
68
|
+
| `tdd-loop` | Feature implementation, bug fix, "write tests", "red-green", "/tdd" | Load SKILL.md → Apply RED-GREEN-REFACTOR loop |
|
|
69
|
+
|
|
70
|
+
UI/UX Design Skills — tự trigger khi touch UI/design:
|
|
71
|
+
|
|
72
|
+
| Skill | Trigger Conditions | Agent Action |
|
|
73
|
+
|---|---|---|
|
|
74
|
+
| `ui-style-rules` | Any web UI task: page layout, component styling, redesign, landing page | Load SKILL.md → Apply anti-slop design rules |
|
|
75
|
+
| `web-mockup-gen` | "mockup web", "design page", web UI concept needed before coding | Load SKILL.md → Generate web design reference images (no code) |
|
|
76
|
+
| `mobile-mockup-gen` | "mockup app", "design screen", mobile UI concept needed before coding | Load SKILL.md → Generate mobile screen mockups in phone frames |
|
|
77
|
+
| `mobile-rules` | Any mobile UI implementation: Flutter widget, screen, touch interaction | Load SKILL.md → Apply platform conventions, touch patterns, performance |
|
|
78
|
+
| `flutter-*` | Flutter-specific tasks: layout fix, routing, serialization, testing, etc. | Auto-select matching flutter skill based on task type |
|
|
79
|
+
|
|
80
|
+
### UI/UX Auto-Detection Rules
|
|
81
|
+
- **mobile-flutter preset**: Load `mobile-rules` + `ui-style-rules` (adapted) + `mobile-mockup-gen` + matching `flutter-*`
|
|
82
|
+
- **fe-react / fe-angular / fe-vue presets**: Load `ui-style-rules` + `web-mockup-gen`
|
|
83
|
+
- **aso preset**: Load `aso-router` + matching `aso-*` skills
|
|
84
|
+
- **system preset**: All of the above based on file context
|
|
85
|
+
|
|
86
|
+
**Failure Condition:**
|
|
87
|
+
- ❌ Writing UI code without loading design skill = **SLOP RISK**
|
|
88
|
+
- ❌ Creating mobile screen without `mobile-rules` = **PLATFORM VIOLATION**
|
|
89
|
+
- ❌ Designing web page without `ui-style-rules` = **GENERIC OUTPUT**
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 🛑 GLOBAL SOCRATIC GATE (TIER 0)
|
|
94
|
+
|
|
95
|
+
Every user request must pass through the Socratic Gate before ANY tool use or implementation:
|
|
96
|
+
|
|
97
|
+
| Request Type | Strategy | Required Action |
|
|
98
|
+
|---|---|---|
|
|
99
|
+
| **New Feature / Build** | Deep Discovery | ASK minimum 3 strategic questions |
|
|
100
|
+
| **Code Edit / Bug Fix** | Context Check | Confirm understanding + ask impact questions |
|
|
101
|
+
| **Vague / Simple** | Clarification | Ask Purpose, Users, and Scope |
|
|
102
|
+
| **Full Orchestration** | Gatekeeper | **STOP** subagents until user confirms plan details |
|
|
103
|
+
| **Direct "Proceed"** | Validation | **STOP** → Even if answers are given, ask 2 "Edge Case" questions |
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## TIER 0: UNIVERSAL RULES
|
|
108
|
+
|
|
109
|
+
### 🧹 Clean Code (Global Mandatory)
|
|
110
|
+
- **Code**: Concise, direct, no over-engineering. Self-documenting.
|
|
111
|
+
- **Testing**: Mandatory. Pyramid (Unit > Int > E2E) + AAA Pattern.
|
|
112
|
+
- **Performance**: Measure first. Adhere to current Core Web Vitals standards.
|
|
113
|
+
|
|
114
|
+
### 🗺️ Quick Reference
|
|
115
|
+
- **Masters**: `orchestrator`, `project-planner`, `security-auditor`, `backend-specialist`, `frontend-specialist`, `mobile-developer`, `aso-specialist`, `debugger`
|
|
116
|
+
- **Key Skills**: `clean-code`, `brainstorming`, `ui-style-rules`, `mobile-rules`, `web-mockup-gen`, `mobile-mockup-gen`, `bug-diagnostics`, `tdd-loop`, `spec-clarification`, `prd-gen`, `task-breakdown`, `prototype`, `aso-router`
|