@alenfitz/spec-copilot 2.1.1 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/adapters/index.js +2 -2
- package/bin/cli.js +2 -2
- package/bin/frontend-checks.js +11 -0
- package/commands/spec:apply.md +3 -0
- package/commands/spec:smoke.md +28 -9
- package/framework/AGENTS.md.template +9 -3
- package/framework/CHANGELOG.md +37 -0
- package/framework/VERSION +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* @alenfitz/spec-copilot v2.2.0
|
|
3
|
+
* Copyright (c) 2026 alenfitz. All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* This file is proprietary and obfuscated. Reverse engineering, decompilation,
|
|
6
|
+
* disassembly, or unauthorized redistribution of any kind is strictly prohibited.
|
|
7
|
+
* Source code is NOT licensed under MIT/Apache and is NOT available for derivative work.
|
|
8
|
+
*
|
|
9
|
+
* Bugs / feature requests: https://github.com/Alenfitz/spec_copilit/issues
|
|
10
|
+
*/
|
|
11
|
+
function _0x96d5(){const _0x59d6fa=['odq3odaWognxsvvKBW','BgvUz3rO','5yMn56UVihrHC2SG5ywO6yoO','C29YDa','yNvZzq','zsaTCsaTrhnRAq','CguTy2HLy2S','D2PZzve','Dg9gAxHLza','5l2n57Ue5lU2','Bs54BwW','zxzLCNK','CMvHzgrPCLn5BG','DxjzrLC','AYdMMk8Gva','6l+E57UTia','CgLWzq','yLPUELK','z3jbtwy','kcGOlISPkYKRkq','77Yj4Ocuiow6Los6PoE7H+AoKUwiLW','rvbrDLy','BwfW','BxbPBgvkyxzH','tKvTChr5','nteYnZe4ndbothnjy0u','BM9pC08','txjyC2u','Dg9tDhjPBMC','AxneAxjLy3rVCG','rxndt0q','zxnZ','CMvSyxrPDMu','BMfTzq','Bwf4q29UC2vJDq','y2HPBgrFChjVyW','ufrvEvO','Aw5JBhvKzxm','BNrLCMXLyxzPBG','mJa4otiYtvzWtNHx','Be9wuKy','Cgf0Aa','6zUg5lIT5zYOidCWjsdKUyVLKi4','sxvMt0O','wgfJCuG','t2nivem','sKfwzwe','tfv5qMu','wNPhzgG','5lMo5lI656M6','A0rpzfG','DgvZDa','D2L0AezPBgvuEq','BwLU','zwWTzw1WDhK','y2HLy2TcDwLSza','z3zKvxq','v291uhe','DxrMltG','C2XPy2u','CwHlwKC','DgfZAYdMLBdPH48Gpca','qKTmqu4','Cxfdufi','B1vnt2O','DhLWzs1JAgvJAW','AM9PBG','yMfJA2vUza','CKTYDLq','nZuYnZG4oe1WBK9HwG','5B6f5A6E546W','5yMn56UV5lYA6kkR5OYK5yIW5PYa5zco5A+86iE0','zMLSDgvY','y2HLy2TuyxnRsq','uvLSsM4','wwnfrw0','zgLYBMfTzq','DgL2zujL','C29Tzq','zgv0zwn0qw55qq','CfvjALq','CgDgquK','ufvlufO','yw55q291BNq','Dw4GyNvPBgqG57Ut','DKn2t3K','CwLdtNy','mtiXotm4mLvhELnHCG','zxHPC3rZu3LUyW','y29TCgLSzuPHDG','ELzXrfm','C3rKzxjY','phrLBxbSyxrLpG','5lUf5zcRigvTChr5iownOa','t2jIBhi','5B6f6kgL5ywf','CgfYC2u','5PwS6k+35PYF5B6f','Bwf4qwXSB3DLza','C3jJ','5A6A5lMj5lQgihbYB3bZlW','Bwf4','CgfZCW','B3zLCNnPEMvK','CMvHzezPBgvtEq','nJKXotqXnw5pDg9mDG','AwXKlMDYywrSzq','vw91Cxu','zw5KrxzPzgvUyW','quvTChr5','BxzUignVBxbPBa','DhjPBq','BvLUv2O','C3rHDfn5BMm','EMDMtMq','ywnRywDLlMPZBW','C2nYAxb0CW','ANPsv0G','z01jsfa','teDhDuu','CgvZ','y2nms0y','zvjYtK8','C3r6BKi','zxjYB3i','zNjVBNrLBMqVCa','y2HLy2TgCM9UDa','C2TLBgv0B25Z','AvH6rxK','5PYQ56M/5O+s5yMn56UVihrHC2S','A2nfDxq','BI1LBxb0Eq','lsqX','yMvdB3vUDa','vg12sgW','sKzHCeK','57Y65Bcr55sO5OI35Pon5l2C6lEV5B6e5O+p6l+W','oIdLIy3NQ68GDgfZAYa','CeTJCLq','DNzrwhe','seTdEhe','ChvZAa','BK1ouK0','uMrRBuy','77Yi56YS5lIa5lIQ5yMn56UVihrHCW','zMfPBhvYzxm','zNjVBNrLBMq','rwXfBxb0Eq','CMvWBgfJzq','Bwf0y2G','Dg90ywW','ys1LBxb0Eq','77Yi5lIk6zMqidmG5lIQ77Yj4Ocuia','B0LpyNi','6AQm6k+b57Ut5P6C57Y65Bcr5P6e5BU66l6t5yE6','ysaTCq','5B6f5A6m5zAe','5PQc5PYQ5A6E546W','BNbTihj1BIb0Eq','y21K','yNvPBgq','ve9etW','zxHWB3j0CW','zgLY','C2vHCMnO','sgXXCNq','zvD0DNe','zNjVBNrLBMqVCW','z3jHzgXLDYbJBW','y29UC3rYDwn0BW','wwnHrvC','lI9NCMfKBgv3ia','AgftqMy','mtK4nJm2mejpzNnUDW','Dg9mB3DLCKnHCW','ENjUDuC','zMvdB3vUDa','EePprfi','CMfUDwXHCML0Eq','iokgKIdLOAVLHPKG4OAsioApKos6Pa','C2mGlYbUCg0GCG','mJD2q1zgzNO','5B6f5zco56UV','C3bSAxq','C3rHCNrZv2L0Aa'];_0x96d5=function(){return _0x59d6fa;};return _0x96d5();}function _0x86b1(_0x1b47eb,_0x90df6f){_0x1b47eb=_0x1b47eb-(0x1095+-0x1e5b+0xfa5);const _0x5a3dd0=_0x96d5();let _0x36e68f=_0x5a3dd0[_0x1b47eb];if(_0x86b1['jEFJBA']===undefined){var _0x531aa9=function(_0x51c34f){const _0x7b1895='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xc99fd9='',_0x579a7c='',_0x19c410=_0xc99fd9+_0x531aa9,_0x119b44=(''+function(){return-0x1f59+-0x26a4+-0x30b*-0x17;})['indexOf']('\x0a')!==-(-0x66e+-0x53f+0x1a*0x73);for(let _0x3741f0=0x1*0x15bd+-0x30b*0x1+-0x12b2*0x1,_0x2ea2f1,_0x5ead05,_0x41178a=0x23fa+0x1be+-0x25b8;_0x5ead05=_0x51c34f['charAt'](_0x41178a++);~_0x5ead05&&(_0x2ea2f1=_0x3741f0%(-0xb32*0x1+-0x3*-0xbfb+-0x18bb)?_0x2ea2f1*(0x3*-0x6b3+0xd*-0x1da+0x2c6b)+_0x5ead05:_0x5ead05,_0x3741f0++%(-0x12d6*0x1+0x1*-0x209+-0x14e3*-0x1))?_0xc99fd9+=_0x119b44||_0x19c410['charCodeAt'](_0x41178a+(0x499*-0x2+-0x2222+0x2b5e))-(0x237d+-0x10d9+-0x129a)!==0x25f1+-0x6d0*-0x1+-0x2cc1?String['fromCharCode'](-0x1*0x35f+0x963+-0x505&_0x2ea2f1>>(-(-0x1868+0x1ccc+0x11*-0x42)*_0x3741f0&0x3*0xbae+0x232d+-0x77*0x97)):_0x3741f0:0xe5d+0x1*-0x36b+-0xaf2){_0x5ead05=_0x7b1895['indexOf'](_0x5ead05);}for(let _0x49ac5c=-0x17*0xf+0x2658+0x549*-0x7,_0x451a27=_0xc99fd9['length'];_0x49ac5c<_0x451a27;_0x49ac5c++){_0x579a7c+='%'+('00'+_0xc99fd9['charCodeAt'](_0x49ac5c)['toString'](0x2625+0x1*-0x24ad+-0x168))['slice'](-(-0x2*0x37f+-0x14f5*-0x1+-0x1*0xdf5));}return decodeURIComponent(_0x579a7c);};_0x86b1['mkdkUc']=_0x531aa9,_0x86b1['hcphqm']={},_0x86b1['jEFJBA']=!![];}const _0x460017=_0x5a3dd0[0x1b7c+0x2d2+-0x1e4e],_0x6facd9=_0x1b47eb+_0x460017,_0xa40ade=_0x86b1['hcphqm'][_0x6facd9];if(!_0xa40ade){const _0x54a6f4=function(_0x57f8cb){this['EXciJu']=_0x57f8cb,this['xAbTUU']=[-0x1a62+-0x36d*0x7+0x325e,0x1ad5+-0x38b*-0x1+-0x1e60,-0x1eb5+-0x5*0x30c+0x13*0x26b],this['NoIKiG']=function(){return'newState';},this['uJPWVg']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['ygfGXI']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x54a6f4['prototype']['uKwzDz']=function(){const _0x2cb2e7=new RegExp(this['uJPWVg']+this['ygfGXI']),_0x51d60e=_0x2cb2e7['test'](this['NoIKiG']['toString']())?--this['xAbTUU'][0x2288+0x68f+-0x2916]:--this['xAbTUU'][-0xb*0xa5+-0x3*0x2ae+0xf21];return this['nQHyVn'](_0x51d60e);},_0x54a6f4['prototype']['nQHyVn']=function(_0x20bd23){if(!Boolean(~_0x20bd23))return _0x20bd23;return this['KQfETc'](this['EXciJu']);},_0x54a6f4['prototype']['KQfETc']=function(_0x46364e){for(let _0x37acb1=-0xd1b+-0xcaa+0x3*0x897,_0xe4edd9=this['xAbTUU']['length'];_0x37acb1<_0xe4edd9;_0x37acb1++){this['xAbTUU']['push'](Math['round'](Math['random']())),_0xe4edd9=this['xAbTUU']['length'];}return _0x46364e(this['xAbTUU'][0x53*0x40+-0x1*-0xf9e+-0x245e]);},(''+function(){return-0x1*0x163a+0x2*-0x6b3+0x3*0xbe0;})['indexOf']('\x0a')===-(0x4a*0x17+-0x617*-0x1+-0xcbc)&&new _0x54a6f4(_0x86b1)['uKwzDz'](),_0x36e68f=_0x86b1['mkdkUc'](_0x36e68f),_0x86b1['hcphqm'][_0x6facd9]=_0x36e68f;}else _0x36e68f=_0xa40ade;return _0x36e68f;}const _0x22709b=_0x86b1,_0x2a293a=_0x86b1;(function(_0x5939bc,_0x364c0e){const _0x389bc2={_0x274c91:0x24a,_0x4ba8b0:0x21f,_0x1fe2f:0x28c,_0x575805:0x223},_0x4c7536=_0x86b1,_0x3bb572=_0x86b1,_0x3e5bc2=_0x5939bc();while(!![]){try{const _0x3517e4=-parseInt(_0x4c7536(0x27a))/(0x15d*0xa+0x1719+0x2*-0x125d)+parseInt(_0x4c7536(_0x389bc2._0x274c91))/(-0xddf+0x1*0x741+0x8*0xd4)*(-parseInt(_0x3bb572(_0x389bc2._0x4ba8b0))/(-0x83a+-0x1aa3+-0xc*-0x2e8))+parseInt(_0x4c7536(0x217))/(-0x1*0x246+0x9*-0x3e7+0x9d*0x3d)+-parseInt(_0x3bb572(_0x389bc2._0x1fe2f))/(-0x52*0xe+0xfcb+-0xb4a)+-parseInt(_0x3bb572(0x268))/(0xa56+-0x1225*0x1+-0x191*-0x5)+-parseInt(_0x4c7536(_0x389bc2._0x575805))/(-0x1025*-0x2+-0x2d*-0x89+0x3858*-0x1)+parseInt(_0x3bb572(0x23c))/(0xb*0x1e7+0x225+-0x7ae*0x3);if(_0x3517e4===_0x364c0e)break;else _0x3e5bc2['push'](_0x3e5bc2['shift']());}catch(_0x42a884){_0x3e5bc2['push'](_0x3e5bc2['shift']());}}}(_0x96d5,-0x3117+0x332aa*-0x4+0x1aa92b));const _0x1a4845=(function(){let _0x373be9=!![];return function(_0x3dd214,_0x55b98c){const _0x16ae1f=_0x373be9?function(){if(_0x55b98c){const _0x69bc09=_0x55b98c['apply'](_0x3dd214,arguments);return _0x55b98c=null,_0x69bc09;}}:function(){};return _0x373be9=![],_0x16ae1f;};}()),_0x429857=_0x1a4845(this,function(){const _0xbbb8cf={_0x388460:0x236,_0x377998:0x23f,_0x38b9ee:0x20e},_0x5e2964=_0x86b1,_0x440dd0=_0x86b1,_0x424fd7={};_0x424fd7['HKCxq']=_0x5e2964(_0xbbb8cf._0x388460)+'+$';const _0x1a9426=_0x424fd7;return _0x429857[_0x5e2964(_0xbbb8cf._0x377998)]()[_0x5e2964(_0xbbb8cf._0x38b9ee)](_0x440dd0(0x236)+'+$')[_0x5e2964(0x23f)]()[_0x440dd0(0x213)+'r'](_0x429857)['search'](_0x1a9426[_0x440dd0(0x1f6)]);});_0x429857();const fs=require('fs'),path=require(_0x22709b(0x24c)),{execSync}=require(_0x22709b(0x246)+_0x2a293a(0x242));function walkFiles(_0x5c0352,_0xca9bdc,_0x1f2dae=[]){const _0x48c94b={_0x43950d:0x22f,_0x299c66:0x240},_0x203590=_0x2a293a,_0x346296=_0x2a293a,_0x522fd0={'tyemO':function(_0x2bdd4a,_0x25c836,_0x355590,_0x47dc7d){return _0x2bdd4a(_0x25c836,_0x355590,_0x47dc7d);},'gvdUt':function(_0x5c16f4,_0x290ccf){return _0x5c16f4(_0x290ccf);}};if(!fs[_0x203590(0x27b)](_0x5c0352))return _0x1f2dae;const _0x1e41b1={};_0x1e41b1[_0x346296(0x257)+_0x346296(0x1e2)]=!![];for(const _0x4a3ccb of fs[_0x346296(_0x48c94b._0x43950d)+'c'](_0x5c0352,_0x1e41b1)){const _0x37dac4=path['join'](_0x5c0352,_0x4a3ccb[_0x203590(0x244)]);if(_0x4a3ccb[_0x346296(_0x48c94b._0x299c66)+'y']())!/node_modules|dist|\.git|\.nuxt|\.next/[_0x346296(0x256)](_0x4a3ccb[_0x203590(0x244)])&&_0x522fd0['tyemO'](walkFiles,_0x37dac4,_0xca9bdc,_0x1f2dae);else _0x522fd0[_0x346296(0x25b)](_0xca9bdc,_0x4a3ccb[_0x346296(0x244)])&&_0x1f2dae[_0x346296(0x1f7)](_0x37dac4);}return _0x1f2dae;}function findFeRoots(_0xc59527){const _0x3481fd={_0x3b212d:0x211,_0x3f26d6:0x286,_0x543df0:0x22a,_0xc23ef2:0x26b},_0x34c2c1={_0x32568b:0x27b,_0x326492:0x294},_0x121deb=_0x22709b,_0xd50cb=_0x22709b,_0x1a365d={};_0x1a365d['eRrNO']=_0x121deb(_0x3481fd._0x3b212d)+'rc',_0x1a365d['wjseQ']=_0xd50cb(_0x3481fd._0x3f26d6);const _0x1e8227=_0x1a365d;return[_0x1e8227[_0xd50cb(0x1e4)],'app/src',_0x1e8227[_0xd50cb(_0x3481fd._0x543df0)]][_0x121deb(_0x3481fd._0xc23ef2)](_0x4b3c85=>{const _0xee95d5=_0x121deb,_0xbfc5a6=_0x121deb,_0x4b9f6a=path['join'](_0xc59527,_0x4b3c85);return fs[_0xee95d5(_0x34c2c1._0x32568b)](_0x4b9f6a)&&fs[_0xee95d5(_0x34c2c1._0x326492)](_0x4b9f6a)['isDirector'+'y']();});}function extractVueTemplate(_0x1641f0){const _0x48280b=_0x2a293a,_0x550d4f=_0x1641f0[_0x48280b(0x1ff)](/<template[^>]*>([\s\S]*?)<\/template>/);return _0x550d4f?_0x550d4f[0x7c8+-0x139+-0x68e]:'';}function extractVueScript(_0x3ecd32){const _0x4d255a=_0x3ecd32['match'](/<script[^>]*>([\s\S]*?)<\/script>/);return _0x4d255a?_0x4d255a[0x685*-0x3+-0xe6f+0x21ff*0x1]:'';}const EMPTY_COMPONENTS=[_0x22709b(0x259),_0x22709b(0x201),_0x22709b(0x1ed),'van-empty',_0x2a293a(0x1fd),_0x22709b(0x290),_0x2a293a(0x23b)],PLACEHOLDER_WORDS=[_0x2a293a(0x20b),_0x22709b(0x269),_0x2a293a(0x206),'占位',_0x22709b(0x220),'待开发',_0x22709b(0x282),'placeholde'+'r',_0x22709b(0x207),_0x2a293a(0x284)];function detectSkeletonComponents(_0x4863e6){const _0x2fee4b={_0x2fabc1:0x233,_0x3e3e35:0x23a,_0xdf6d60:0x219,_0xf5996a:0x21b,_0x8a0fcd:0x1f7,_0x15cb26:0x25e,_0xd7f838:0x265,_0x33c85c:0x256,_0x2d9fec:0x27f,_0x4dde08:0x1fe,_0x170568:0x22e,_0x4b50ad:0x24e,_0x2498f9:0x214,_0x198fb4:0x265,_0x2b3b0c:0x1e5,_0x5d8f2b:0x20d,_0x163162:0x27e,_0x2620ef:0x292,_0x3e1dd8:0x20d,_0x245dd6:0x280,_0x154253:0x1f4,_0x49c958:0x224,_0x57d4a8:0x271,_0x1b9002:0x26b,_0x51663e:0x25e,_0x30e5c7:0x224,_0x5bb431:0x247,_0x389b24:0x26e,_0x282186:0x256,_0x4ddf0e:0x224,_0x51e91f:0x1f7,_0xfdf449:0x287,_0x2ac542:0x254,_0x99b0b7:0x1e9,_0x4f72fc:0x200},_0x3d2300=_0x2a293a,_0x72a418=_0x2a293a,_0x1ee99c={'vvQXq':function(_0x2c12f6,_0x55d4ea,_0xaa63fc){return _0x2c12f6(_0x55d4ea,_0xaa63fc);},'stznB':_0x3d2300(0x266),'iXzEy':_0x72a418(_0x2fee4b._0x2fabc1),'NMcWr':'gradlew\x20co'+_0x3d2300(_0x2fee4b._0x3e3e35),'TmvHl':function(_0x5b5e4b,_0x4dce33,_0xfd27e3,_0x368220){return _0x5b5e4b(_0x4dce33,_0xfd27e3,_0x368220);},'qCNNB':function(_0x2a0cfd,_0x2635fd){return _0x2a0cfd===_0x2635fd;},'pgFAI':'mtFxG','xJODR':_0x3d2300(_0x2fee4b._0xdf6d60),'LmoAq':function(_0x290ba7,_0x47fd9b,_0x5b871e){return _0x290ba7(_0x47fd9b,_0x5b871e);},'eWtvq':function(_0x5c6394,_0x4c788e){return _0x5c6394!==_0x4c788e;},'IufOJ':_0x3d2300(0x214),'pKcrT':function(_0xefb43a,_0x3ecc70){return _0xefb43a>_0x3ecc70;},'LUyBe':function(_0x2845f4,_0x437e66){return _0x2845f4<=_0x437e66;},'PTUyZ':function(_0x1e45c0,_0x4cacd2){return _0x1e45c0!==_0x4cacd2;},'YcEEm':_0x72a418(0x281),'FQvio':function(_0x504d42,_0x2114bf){return _0x504d42(_0x2114bf);},'urYFW':function(_0x56c01b,_0x15db00){return _0x56c01b||_0x15db00;}},_0x204fa9=findFeRoots(_0x4863e6),_0x177a49=[];let _0x510808=-0x3f8*0x6+-0x205c*0x1+0x1c16*0x2;for(const _0x4661c9 of _0x204fa9){if(_0x1ee99c['qCNNB'](_0x1ee99c[_0x72a418(0x274)],_0x1ee99c[_0x72a418(_0x2fee4b._0xf5996a)]))_0x2f8604[_0x72a418(_0x2fee4b._0x8a0fcd)]({'task':_0x430b7e,'title':_0x4e39f1[_0x3d2300(_0x2fee4b._0x15cb26)](0x128*0x2+0xdd5+-0x1*0x1025,0xaf*0x31+0x7*0x2cf+-0x4*0xd40),'vueCount':_0x58934['length'],'files':_0x376bb9['slice'](-0x1869+0xde*0x6+0x1335,-0x3*0x97a+-0x53*-0x47+0x7*0xc7)});else{const _0x1c4f33=_0x1ee99c['LmoAq'](walkFiles,path[_0x72a418(_0x2fee4b._0xd7f838)](_0x4863e6,_0x4661c9),_0x5ebede=>/\.vue$/[_0x3d2300(0x256)](_0x5ebede));for(const _0x3aa812 of _0x1c4f33){const _0x421e47=path['basename'](_0x3aa812);if(/^(App|main|index)\./i[_0x72a418(_0x2fee4b._0x33c85c)](_0x421e47))continue;_0x510808++;const _0x33bcd9=fs[_0x3d2300(0x28b)+'nc'](_0x3aa812,'utf-8'),_0x7aa284=extractVueTemplate(_0x33bcd9);if(!_0x7aa284[_0x72a418(0x292)]()){_0x177a49['push']({'file':path['relative'](_0x4863e6,_0x3aa812),'reason':_0x3d2300(_0x2fee4b._0x2d9fec)+'\x20为空'});continue;}const _0x47c907=_0x7aa284[_0x3d2300(0x1fe)](/<!--[\s\S]*?-->/g,'')[_0x72a418(_0x2fee4b._0x4dde08)](/<[^>]+>/g,'\x20')['replace'](/\s+/g,'\x20')[_0x3d2300(0x292)](),_0x3493a9=EMPTY_COMPONENTS[_0x72a418(0x271)](_0x3faf6f=>_0x7aa284[_0x3d2300(0x248)]('<'+_0x3faf6f)||_0x7aa284[_0x3d2300(0x248)]('<'+_0x3faf6f[_0x3d2300(0x1fe)](/([A-Z])/g,_0x3d2300(0x1ee))['toLowerCas'+'e']()['replace'](/^-/,''))),_0x3da734=_0x7aa284['replace'](/<!--[\s\S]*?-->/g,'')[_0x3d2300(0x1ff)](/<[a-zA-Z][\w-]*[^>]*(?:\/>|>)/g)||[],_0x2dab8e=_0x3da734[_0x3d2300(0x26b)](_0x1a350f=>!EMPTY_COMPONENTS[_0x72a418(0x271)](_0x4e163f=>_0x1a350f[_0x3d2300(0x248)](_0x4e163f)||_0x1a350f[_0x72a418(0x248)](_0x4e163f['replace'](/([A-Z])/g,_0x72a418(0x1ee))[_0x72a418(0x218)+'e']()['replace'](/^-/,'')))),_0xc948b0=_0x2dab8e[_0x3d2300(_0x2fee4b._0x170568)](_0x3a7d4c=>/^<(div|section|template|el-card|a-card|n-card)\b/[_0x72a418(0x256)](_0x3a7d4c));if(_0x3493a9&&(_0x2dab8e[_0x3d2300(0x224)]<=-0x21b6+-0x20e8+0x42a0||_0xc948b0)){if(_0x1ee99c[_0x72a418(0x210)](_0x1ee99c[_0x72a418(_0x2fee4b._0x4b50ad)],_0x3d2300(_0x2fee4b._0x2498f9)))try{_0x1ee99c[_0x72a418(0x1f5)](_0x4e07cd,_0x3d2300(0x215)+_0x72a418(0x27c)+_0x72a418(0x205),{'cwd':_0x3add14[_0x3d2300(_0x2fee4b._0x198fb4)](_0x11e0c7,_0x1ee99c[_0x72a418(_0x2fee4b._0x2b3b0c)]),'encoding':_0x3d2300(0x25d),'stdio':[_0x1ee99c[_0x3d2300(0x1ea)],_0x3d2300(0x233),_0x1ee99c['iXzEy']],'timeout':0x2bf20});const _0x4d9d39={};_0x4d9d39[_0x72a418(0x289)]=!![],_0x4d9d39[_0x3d2300(0x209)]=_0x1ee99c['NMcWr'],_0x4d9d39[_0x72a418(_0x2fee4b._0x5d8f2b)]=_0x3d2300(0x266),_0x2a1359['backend']=_0x4d9d39;}catch(_0x5899cf){const _0x5dd2be=(_0x5899cf[_0x72a418(_0x2fee4b._0x163162)]||'')[_0x72a418(_0x2fee4b._0x2620ef)]()['split']('\x0a')[_0x72a418(0x25e)](-(0x243b+-0x2a7*-0xd+-0x46ac))[_0x3d2300(0x265)]('\x0a'),_0x4ae144={};_0x4ae144['pass']=![],_0x4ae144['cmd']=_0x3d2300(0x212)+_0x72a418(0x23a),_0x4ae144[_0x72a418(_0x2fee4b._0x3e1dd8)]='backend',_0x4ae144[_0x72a418(0x1e6)]=_0x5dd2be,_0x90df6f['backend']=_0x4ae144;}else{_0x177a49[_0x72a418(_0x2fee4b._0x8a0fcd)]({'file':path['relative'](_0x4863e6,_0x3aa812),'reason':_0x72a418(_0x2fee4b._0x245dd6)+_0x3d2300(0x22c)});continue;}}if(_0x1ee99c[_0x3d2300(_0x2fee4b._0x154253)](_0x47c907['length'],-0x1*0x776+0x43*0x6b+0x6d9*-0x3)&&_0x47c907[_0x3d2300(_0x2fee4b._0x49c958)]<-0x1*-0x38b+0x1*-0x110b+0xde4){const _0x56a725=PLACEHOLDER_WORDS[_0x3d2300(_0x2fee4b._0x57d4a8)](_0x17c91a=>_0x47c907['includes'](_0x17c91a)),_0x7ef16d=_0x3da734[_0x3d2300(_0x2fee4b._0x1b9002)](_0x3b2d01=>!/<(div|section|template|span|p)\b/[_0x3d2300(0x256)](_0x3b2d01)&&!EMPTY_COMPONENTS['some'](_0x5287ce=>_0x3b2d01[_0x72a418(0x248)](_0x5287ce)))['length'];if(_0x56a725&&_0x1ee99c[_0x72a418(0x252)](_0x7ef16d,-0x1900+0x1709+0x1f8)){_0x177a49[_0x72a418(0x1f7)]({'file':path['relative'](_0x4863e6,_0x3aa812),'reason':'模板仅含占位文字:\x20'+'\x22'+_0x47c907[_0x3d2300(_0x2fee4b._0x51663e)](-0x495+-0x15c7+0x4*0x697,0xc29*-0x2+-0xee2+0x2770)+'\x22'});continue;}}if(_0x3da734[_0x72a418(_0x2fee4b._0x30e5c7)]<=0x1ab4+0x383*0x1+-0x1e35&&_0x47c907['length']<-0x1e30+-0x1*-0x11b0+0xaa*0x13){if(_0x1ee99c[_0x72a418(_0x2fee4b._0x5bb431)](_0x3d2300(0x281),_0x1ee99c[_0x3d2300(_0x2fee4b._0x389b24)]))Idlhrf[_0x3d2300(0x1f0)](_0x528707,_0x2b7754,_0x234744,_0x2b925b);else{const _0x18f1df=_0x1ee99c['FQvio'](extractVueScript,_0x33bcd9),_0x5496fa=/defineProps|props\s*:/[_0x72a418(_0x2fee4b._0x33c85c)](_0x18f1df),_0x316aa4=/defineEmits|emits\s*:/[_0x72a418(_0x2fee4b._0x282186)](_0x18f1df);if(_0x1ee99c[_0x72a418(0x230)](_0x5496fa,_0x316aa4)&&_0x3da734[_0x72a418(_0x2fee4b._0x4ddf0e)]<=0xf11+0x9*0x162+-0x1b82){_0x177a49[_0x3d2300(_0x2fee4b._0x51e91f)]({'file':path['relative'](_0x4863e6,_0x3aa812),'reason':_0x72a418(_0x2fee4b._0xfdf449)+'emits\x20但模板几'+_0x72a418(_0x2fee4b._0x2ac542)});continue;}}}}}}const _0x25f150={};return _0x25f150[_0x72a418(_0x2fee4b._0x99b0b7)]=_0x177a49,_0x25f150[_0x72a418(_0x2fee4b._0x4f72fc)]=_0x510808,_0x25f150;}function checkBuildable(_0x5f201d){const _0x4fedb9={_0x12e8fd:0x278,_0x4721f4:0x264,_0x543a46:0x233,_0x522319:0x22d,_0x52c010:0x1e0,_0x5b8e73:0x228,_0x7b67b4:0x266,_0x6d9ae4:0x291,_0x1b21db:0x288,_0x323153:0x297,_0x553d55:0x20a,_0x1c5c5b:0x26f,_0x1eec22:0x295,_0x2db05a:0x275,_0x3f918d:0x234,_0x33aa55:0x25d,_0xbb5082:0x1fc,_0x4583d4:0x1ff,_0x3ae781:0x261,_0x516b17:0x250,_0x36703d:0x265,_0x1fb344:0x28d,_0x3036ff:0x23e,_0x5dd14e:0x233,_0x12b886:0x216,_0x4c98b9:0x289,_0x3cc5e1:0x209,_0x1210a8:0x20d,_0x40b4cc:0x23e,_0x55c17f:0x1f7,_0x440da5:0x243,_0x5edc3a:0x22b,_0x2810cc:0x221,_0x6c808a:0x25e,_0x58c99f:0x255,_0x50ba23:0x1e6,_0x143c55:0x266,_0x3480ba:0x273,_0x446828:0x265,_0x206ac4:0x263,_0x46156b:0x212,_0x221275:0x20d,_0x573c7b:0x265,_0x466bba:0x244,_0x56101c:0x240,_0x2c3943:0x244,_0x56c8b2:0x27e,_0x405643:0x265,_0x2444b1:0x209},_0x111482=_0x2a293a,_0xa3a799=_0x2a293a,_0x4fddc0={'HDvlm':function(_0x39ec85,_0x4e83e1){return _0x39ec85===_0x4e83e1;},'azGKy':_0x111482(0x262),'JAVea':_0xa3a799(_0x4fedb9._0x12e8fd),'oUMOj':_0xa3a799(0x25d),'grAMf':_0xa3a799(_0x4fedb9._0x4721f4),'zgfNd':function(_0x2d8da0,_0x118c9e){return _0x2d8da0!==_0x118c9e;},'ZEkAN':_0xa3a799(0x1df),'bZnzY':function(_0x583975,_0x4f4ed9,_0x113008){return _0x583975(_0x4f4ed9,_0x113008);},'haSBf':_0xa3a799(_0x4fedb9._0x543a46),'BKLAN':'OcHTC','oIObr':'backend/po'+_0xa3a799(_0x4fedb9._0x522319),'zVqDS':_0x111482(_0x4fedb9._0x52c010),'qhKZG':_0xa3a799(0x291)+_0xa3a799(_0x4fedb9._0x5b8e73)+'pTests','MrXse':_0x111482(_0x4fedb9._0x7b67b4),'kDOdX':_0xa3a799(_0x4fedb9._0x6d9ae4)+'e'},_0x3e2df1={};_0x3e2df1[_0xa3a799(0x1fc)]=null,_0x3e2df1[_0x111482(0x266)]=null;const _0x2f0d3d=_0x3e2df1,_0x91162=[_0xa3a799(0x1e7)+_0x111482(0x296)+'n','package.js'+'on']['map'](_0x120528=>path[_0x111482(0x265)](_0x5f201d,_0x120528));for(const _0x5a6cef of _0x91162){if(_0x4fddc0['azGKy']===_0x4fddc0[_0x111482(0x251)])_0x4fddc0['HDvlm'](_0x49ad37,'be')?(_0x5bc970++,_0xea7204=_0x37e038[_0x111482(_0x4fedb9._0x1b21db)](_0x389af3,_0x2149d0)):_0x155eb1=0x643+-0x250d+0x1eca;else{if(!fs[_0x111482(0x27b)](_0x5a6cef))continue;const _0x325116=JSON[_0x111482(0x283)](fs[_0x111482(0x28b)+'nc'](_0x5a6cef,_0x4fddc0['oUMOj']));if(!_0x325116[_0xa3a799(_0x4fedb9._0x323153)]||!_0x325116['scripts'][_0x111482(_0x4fedb9._0x553d55)]&&!_0x325116[_0xa3a799(0x297)][_0x111482(_0x4fedb9._0x4721f4)])continue;const _0x31c81d=path[_0xa3a799(_0x4fedb9._0x1c5c5b)](_0x5a6cef),_0x35d0b9=_0x325116[_0x111482(0x297)][_0x4fddc0[_0xa3a799(0x235)]]?_0xa3a799(0x208)+_0x111482(0x229):'npm\x20run\x20bu'+'ild';try{if(_0x4fddc0[_0x111482(_0x4fedb9._0x1eec22)](_0x111482(_0x4fedb9._0x2db05a),_0x4fddc0['ZEkAN']))_0x4fddc0[_0x111482(_0x4fedb9._0x3f918d)](execSync,_0x35d0b9,{'cwd':_0x31c81d,'encoding':_0x111482(_0x4fedb9._0x33aa55),'stdio':[_0x4fddc0[_0xa3a799(0x216)],_0x4fddc0['haSBf'],'pipe'],'timeout':0x1d4c0}),_0x2f0d3d[_0xa3a799(_0x4fedb9._0xbb5082)]={'pass':!![],'cmd':_0x35d0b9,'dir':path['relative'](_0x5f201d,_0x31c81d)};else{const _0x27a239=_0x56b025[_0x111482(_0x4fedb9._0x4583d4)](/<template[^>]*>([\s\S]*?)<\/template>/);return _0x27a239?_0x27a239[0x779*0x1+-0x1f27*0x1+0x17af]:'';}}catch(_0x254e8b){if(_0x4fddc0[_0xa3a799(_0x4fedb9._0x3ae781)]!==_0xa3a799(_0x4fedb9._0x516b17))_0x4fff8b=0x21ac+-0x942+-0x186a;else{const _0x537e55=(_0x254e8b[_0x111482(0x27e)]||'')[_0xa3a799(0x292)]()[_0xa3a799(0x221)]('\x0a')[_0x111482(0x25e)](-(-0x111e+-0x124*-0x1+0x802*0x2))['join']('\x0a');_0x2f0d3d[_0x111482(_0x4fedb9._0xbb5082)]={'pass':![],'cmd':_0x35d0b9,'dir':path[_0xa3a799(0x243)](_0x5f201d,_0x31c81d),'error':_0x537e55};}}break;}}const _0x898d50=path[_0xa3a799(_0x4fedb9._0x36703d)](_0x5f201d,_0x4fddc0[_0x111482(0x203)]),_0x1cf6bc=path[_0xa3a799(0x265)](_0x5f201d,'backend/bu'+_0x111482(_0x4fedb9._0x1fb344));if(fs[_0xa3a799(0x27b)](_0x898d50))try{if(_0x111482(_0x4fedb9._0x52c010)===_0x4fddc0[_0xa3a799(0x27d)]){execSync(_0x4fddc0[_0x111482(0x25f)],{'cwd':path[_0xa3a799(0x265)](_0x5f201d,_0x4fddc0[_0xa3a799(_0x4fedb9._0x3036ff)]),'encoding':_0x4fddc0[_0x111482(0x263)],'stdio':['pipe',_0xa3a799(_0x4fedb9._0x5dd14e),_0x4fddc0[_0x111482(_0x4fedb9._0x12b886)]],'timeout':0x2bf20});const _0x217254={};_0x217254[_0xa3a799(_0x4fedb9._0x4c98b9)]=!![],_0x217254[_0xa3a799(_0x4fedb9._0x3cc5e1)]='mvn\x20compil'+'e',_0x217254[_0xa3a799(_0x4fedb9._0x1210a8)]=_0x4fddc0[_0xa3a799(_0x4fedb9._0x40b4cc)],_0x2f0d3d['backend']=_0x217254;}else _0x19640d[_0x111482(_0x4fedb9._0x55c17f)]({'file':_0x5a5276[_0x111482(_0x4fedb9._0x440da5)](_0xf8b97,_0x16a1fb),'anyCount':_0x1d067f,'lineCount':_0x4dc75c,'ratio':_0x3f9278[_0xa3a799(_0x4fedb9._0x5edc3a)](0x13be*-0x1+-0x3b9+-0x2ef*-0x8)});}catch(_0x39fe5d){const _0xcb60c9=(_0x39fe5d[_0xa3a799(0x27e)]||'')['trim']()[_0xa3a799(_0x4fedb9._0x2810cc)]('\x0a')[_0x111482(_0x4fedb9._0x6c808a)](-(-0x56*-0x2+0x1a4b+-0x71*0x3d))[_0xa3a799(0x265)]('\x0a'),_0x1aa244={};_0x1aa244[_0x111482(0x289)]=![],_0x1aa244['cmd']=_0x4fddc0[_0xa3a799(_0x4fedb9._0x58c99f)],_0x1aa244[_0xa3a799(0x20d)]=_0x4fddc0['MrXse'],_0x1aa244[_0x111482(_0x4fedb9._0x50ba23)]=_0xcb60c9,_0x2f0d3d[_0xa3a799(_0x4fedb9._0x143c55)]=_0x1aa244;}else{if(fs['existsSync'](_0x1cf6bc))try{if(_0x111482(_0x4fedb9._0x3480ba)===_0xa3a799(0x273)){_0x4fddc0[_0xa3a799(0x234)](execSync,_0x111482(0x215)+_0x111482(0x27c)+'a\x20-q',{'cwd':path[_0x111482(_0x4fedb9._0x446828)](_0x5f201d,'backend'),'encoding':_0x4fddc0[_0xa3a799(_0x4fedb9._0x206ac4)],'stdio':['pipe',_0x4fddc0[_0x111482(0x216)],_0x4fddc0[_0xa3a799(0x216)]],'timeout':0x2bf20});const _0x69aaa1={};_0x69aaa1[_0x111482(0x289)]=!![],_0x69aaa1[_0x111482(_0x4fedb9._0x3cc5e1)]=_0xa3a799(_0x4fedb9._0x46156b)+_0x111482(0x23a),_0x69aaa1[_0x111482(_0x4fedb9._0x221275)]=_0x4fddc0[_0xa3a799(0x23e)],_0x2f0d3d[_0xa3a799(_0x4fedb9._0x143c55)]=_0x69aaa1;}else{const _0x30162d=_0x24b713[_0xa3a799(_0x4fedb9._0x573c7b)](_0x1faa2c,_0x2205ab[_0x111482(_0x4fedb9._0x466bba)]);if(_0x5b8dd5[_0x111482(_0x4fedb9._0x56101c)+'y']())!/node_modules|dist|\.git|\.nuxt|\.next/[_0x111482(0x256)](_0x4bd009[_0xa3a799(_0x4fedb9._0x2c3943)])&&_0x593e0c(_0x30162d,_0x18b32d,_0x2d3407);else _0x17ef86(_0x17293b[_0x111482(_0x4fedb9._0x466bba)])&&_0x5a8b70['push'](_0x30162d);}}catch(_0x3cf11d){const _0x1f8afe=(_0x3cf11d[_0xa3a799(_0x4fedb9._0x56c8b2)]||'')[_0xa3a799(0x292)]()[_0xa3a799(_0x4fedb9._0x2810cc)]('\x0a')[_0x111482(_0x4fedb9._0x6c808a)](-(0x1b1*-0x11+-0x2*0xbe7+0x3499))[_0x111482(_0x4fedb9._0x405643)]('\x0a'),_0x2c10d4={};_0x2c10d4[_0xa3a799(0x289)]=![],_0x2c10d4[_0xa3a799(_0x4fedb9._0x2444b1)]='gradlew\x20co'+'mpileJava',_0x2c10d4[_0x111482(_0x4fedb9._0x1210a8)]=_0x111482(0x266),_0x2c10d4['error']=_0x1f8afe,_0x2f0d3d[_0x111482(0x266)]=_0x2c10d4;}}return _0x2f0d3d;}function detectAnyAbuse(_0x224c64,_0x2df967=0xa7b+0x1235+-0x1cab){const _0x532930={_0x2be953:0x26b,_0x4e1f98:0x1e1,_0x148243:0x1f9,_0x39142e:0x1f7,_0x21595a:0x243,_0x4b2ed2:0x22b},_0x583e48={_0x5dec49:0x292,_0x29500c:0x222,_0x21f8e7:0x1eb},_0x46efc6=_0x2a293a,_0x46e44b=_0x2a293a,_0x350de7={'jpBcq':function(_0x33e87b,_0x3eac73){return _0x33e87b===_0x3eac73;},'iixJI':'JFapI','ccLKF':function(_0x2e35ec,_0x4dfeeb){return _0x2e35ec(_0x4dfeeb);},'hiMdZ':'utf-8','RdkmF':function(_0x53fd15,_0x138f65){return _0x53fd15>_0x138f65;},'LGGuE':function(_0x32b294,_0x2c5869){return _0x32b294*_0x2c5869;},'yikRS':function(_0x17638a,_0x20f42a){return _0x17638a>_0x20f42a;},'wflwH':function(_0x12e00a,_0x39684d){return _0x12e00a/_0x39684d;}},_0x25cb52=_0x350de7[_0x46efc6(0x1e3)](findFeRoots,_0x224c64),_0x467ba7=[];let _0x2b239e=0x25cf+0x3d2+0x29a1*-0x1,_0x196b8e=-0x1164+0x2a*-0x80+0x2f4*0xd;for(const _0x23fe8f of _0x25cb52){const _0x3ff2b7=walkFiles(path['join'](_0x224c64,_0x23fe8f),_0x51c2e0=>/\.(ts|tsx|vue)$/[_0x46efc6(0x256)](_0x51c2e0));for(const _0x11fa09 of _0x3ff2b7){const _0x3f36c0=fs[_0x46e44b(0x28b)+'nc'](_0x11fa09,_0x350de7['hiMdZ']),_0x41f0db=_0x3f36c0[_0x46efc6(0x221)]('\x0a'),_0x4de188=_0x41f0db[_0x46efc6(0x224)],_0x525e50=_0x41f0db[_0x46e44b(_0x532930._0x2be953)](_0x3228a9=>{const _0x35c7cb=_0x46e44b,_0x4c655a=_0x46e44b;if(_0x350de7['jpBcq'](_0x35c7cb(0x1f1),_0x350de7['iixJI'])){const _0x5a911f=_0x3228a9[_0x4c655a(_0x583e48._0x5dec49)]();if(_0x5a911f['startsWith']('//')||_0x5a911f[_0x35c7cb(_0x583e48._0x29500c)]('*'))return![];return/:\s*any\b|as\s+any\b|<any>|any\[\]/[_0x4c655a(0x256)](_0x3228a9);}else _0x160eb0[_0x4c655a(0x1f7)]('连续\x20'+_0x216297+('\x20个后端\x20task\x20'+_0x35c7cb(_0x583e48._0x21f8e7)+_0x4c655a(0x202)+_0x4c655a(0x26a)+'骨架'));}),_0x4fd459=_0x525e50[_0x46efc6(0x224)];_0x2b239e+=_0x4de188,_0x196b8e+=_0x4fd459;if(_0x350de7['RdkmF'](_0x4de188,0x190e+-0x1*-0xf8a+0xd88*-0x3)&&_0x4fd459>-0x12d1+0x30a*0x8+0x57f*-0x1){const _0x2645b1=_0x350de7[_0x46e44b(_0x532930._0x4e1f98)](_0x4fd459/_0x4de188,-0x28c+-0x1*0x80b+0xafb);_0x350de7[_0x46efc6(_0x532930._0x148243)](_0x2645b1,_0x2df967)&&_0x467ba7[_0x46efc6(_0x532930._0x39142e)]({'file':path[_0x46e44b(_0x532930._0x21595a)](_0x224c64,_0x11fa09),'anyCount':_0x4fd459,'lineCount':_0x4de188,'ratio':_0x2645b1[_0x46e44b(0x22b)](-0x1770+0x56a*-0x2+0x2245*0x1)});}}}return{'totalAnys':_0x196b8e,'totalLines':_0x2b239e,'globalRatio':_0x350de7['yikRS'](_0x2b239e,0x3*-0x1c2+0xd*-0x24d+-0x232f*-0x1)?(_0x350de7['wflwH'](_0x196b8e,_0x2b239e)*(0x1089+-0x814+-0x23*0x3b))[_0x46efc6(_0x532930._0x4b2ed2)](-0x1*-0x4dc+-0x1120+0xc46*0x1):'0','abusers':_0x467ba7[_0x46e44b(0x226)]((_0x5a757f,_0x3f5789)=>_0x3f5789[_0x46e44b(0x276)]-_0x5a757f[_0x46e44b(0x276)])};}function checkTaskInterleaving(_0x40f4b5){const _0x3843ae={_0x2cb835:0x24f,_0xfe2ca9:0x253,_0x31478a:0x260,_0x162a26:0x25c,_0x2b2c35:0x224,_0x549350:0x253,_0x128786:0x288,_0x58fa3e:0x26b,_0x3616d7:0x26b,_0x38d293:0x224,_0x45c311:0x1f7,_0x2d46ad:0x232,_0x45d0de:0x1eb,_0x23c346:0x26a,_0x1b9552:0x239,_0x5123e6:0x26b,_0x458673:0x224,_0x225ea5:0x267,_0x3bd75e:0x231,_0x1cee01:0x237},_0x5dfeab={_0x5ddbf4:0x256,_0x57710a:0x1f7,_0x5ca228:0x225,_0x4dc198:0x231,_0x3b7cca:0x224,_0x3c2d40:0x237},_0x1534e5=_0x22709b,_0x49a3c2=_0x22709b,_0x46beac={};_0x46beac[_0x1534e5(_0x3843ae._0x2cb835)]=function(_0x32104b,_0x414992){return _0x32104b&&_0x414992;},_0x46beac['WouPq']=function(_0x2b61d4,_0x2abcaf){return _0x2b61d4<_0x2abcaf;},_0x46beac[_0x1534e5(_0x3843ae._0xfe2ca9)]=_0x49a3c2(_0x3843ae._0x31478a)+'4,跳过交织检查',_0x46beac[_0x1534e5(0x1f8)]=function(_0x34b911,_0x5e0d1c){return _0x34b911===_0x5e0d1c;},_0x46beac['rKrvT']=function(_0x5aebea,_0x3c1459){return _0x5aebea>_0x3c1459;};const _0x31a369=_0x46beac,_0x427a0c=_0x40f4b5[_0x1534e5(0x221)](/(?=^## Task \d+)/m)[_0x49a3c2(0x26b)](_0x5dd80a=>/^## Task \d+/[_0x1534e5(0x256)](_0x5dd80a));if(_0x31a369[_0x49a3c2(_0x3843ae._0x162a26)](_0x427a0c[_0x49a3c2(_0x3843ae._0x2b2c35)],0x19d4+-0x3ad*-0x5+-0x9*0x4e9))return{'pass':!![],'message':_0x31a369[_0x1534e5(_0x3843ae._0x549350)]};const _0x2873d5=_0x427a0c[_0x1534e5(0x239)](_0x1becec=>{const _0x47028b=_0x49a3c2,_0x51e67e=_0x49a3c2;if('Uouqu'===_0x47028b(0x28e)){const _0x5b70b9=(_0x1becec[_0x51e67e(0x1ff)](/^## Task \d+[::]\s*(.*)$/m)||[])[0x5a8+0x17a6+-0x1d4d]||'',_0x505546=/前端|页面|组件|vue|react|UI|界面|列表页|编辑页|弹框|弹窗|面板/[_0x51e67e(0x256)](_0x5b70b9),_0x18f087=/后端|接口|API|service|controller|mapper|数据库|表结构/[_0x47028b(_0x5dfeab._0x5ddbf4)](_0x5b70b9);if(_0x31a369[_0x51e67e(0x24f)](_0x505546,!_0x18f087))return'fe';if(_0x18f087&&!_0x505546)return'be';return'mixed';}else _0x277cfb[_0x51e67e(_0x5dfeab._0x57710a)](_0x51e67e(_0x5dfeab._0x5ca228)+_0x47028b(0x24d)+_0x51e67e(0x1fa)+_0x51e67e(_0x5dfeab._0x4dc198)+(_0x3bffeb+(-0x1f9+-0x1af*-0x17+-0x199*0x17))+'/'+_0x5c0dd0[_0x47028b(_0x5dfeab._0x3b7cca)]+_0x51e67e(_0x5dfeab._0x3c2d40));});let _0x9a7f81=0x2*0x751+-0x1*-0x18b+-0x102d*0x1,_0xfff210=0x1*0x799+-0x4fd+-0x14e*0x2;for(const _0x3bc655 of _0x2873d5){_0x31a369['nMNRM'](_0x3bc655,'be')?(_0xfff210++,_0x9a7f81=Math[_0x1534e5(_0x3843ae._0x128786)](_0x9a7f81,_0xfff210)):_0xfff210=-0x65*-0x2b+-0x1*-0x1d4e+-0x1*0x2e45;}const _0xd9175d=_0x2873d5[_0x1534e5(_0x3843ae._0x58fa3e)](_0x4ae976=>_0x4ae976==='fe')['length'],_0x2b7aa5=_0x2873d5[_0x1534e5(_0x3843ae._0x3616d7)](_0x246c6d=>_0x246c6d==='be')[_0x49a3c2(_0x3843ae._0x38d293)],_0x50dc23=[];_0x9a7f81>-0x1371*-0x2+-0x9c9+-0x1d16&&_0x50dc23[_0x1534e5(_0x3843ae._0x45c311)](_0x1534e5(_0x3843ae._0x2d46ad)+_0x9a7f81+('\x20个后端\x20task\x20'+_0x49a3c2(_0x3843ae._0x45d0de)+'(上限\x203\x20个)—\x20'+_0x49a3c2(_0x3843ae._0x23c346)+'骨架'));const _0x4f60f9=_0x2873d5[_0x1534e5(_0x3843ae._0x1b9552)]((_0x30d676,_0x1e2ecf)=>_0x30d676==='fe'?_0x1e2ecf:-(0x48f+0x15d5+0x23*-0xc1))[_0x49a3c2(_0x3843ae._0x5123e6)](_0x5c7d61=>_0x5c7d61>=0x18d*0x16+-0x5b4*-0x1+-0x13e9*0x2);if(_0x31a369[_0x49a3c2(0x267)](_0x4f60f9[_0x49a3c2(_0x3843ae._0x458673)],-0x2a2+-0x6b9*-0x5+-0x2d1*0xb)&&_0x31a369[_0x49a3c2(_0x3843ae._0x225ea5)](_0x2b7aa5,-0xc04*0x1+-0xeec+0x8*0x35e)){const _0x1d28fd=Math[_0x49a3c2(0x258)](..._0x4f60f9);_0x1d28fd>_0x2873d5['length']*(-0xb99*-0x3+0xad*-0x1+-0x221e+0.7)&&_0x50dc23['push']('前端\x20task\x20全部'+'集中在\x2070%\x20之后'+_0x49a3c2(0x1fa)+_0x1534e5(_0x3843ae._0x3bd75e)+(_0x1d28fd+(0x903+0x24e3*0x1+-0x2de5))+'/'+_0x2873d5['length']+_0x1534e5(_0x3843ae._0x1cee01));}const _0x1ab61b={};return _0x1ab61b[_0x49a3c2(0x289)]=_0x50dc23[_0x1534e5(0x224)]===0x1e*0x37+0x1c1e+-0x2290,_0x1ab61b[_0x49a3c2(0x21a)]=_0xd9175d,_0x1ab61b[_0x49a3c2(0x1ef)]=_0x2b7aa5,_0x1ab61b[_0x49a3c2(0x245)+_0x1534e5(0x270)]=_0x9a7f81,_0x1ab61b['taskTypes']=_0x2873d5,_0x1ab61b['failures']=_0x50dc23,_0x1ab61b;}function checkTaskGranularity(_0x5007fd,_0x1dda66=-0x1a75+-0x68c*0x1+0x2105){const _0x5935ea={_0x4f5b6c:0x23d,_0x3cee57:0x20f,_0xc54b49:0x24b,_0x1b273a:0x26d,_0x4c692e:0x221,_0x294102:0x293,_0x57d9e4:0x279,_0x4cfd36:0x1ff,_0x46b04f:0x26d,_0x87d774:0x25e,_0x187e34:0x285},_0x2001c0=_0x2a293a,_0x53ec85=_0x2a293a,_0x5dd54a={};_0x5dd54a[_0x2001c0(_0x5935ea._0x4f5b6c)]=function(_0x4f43cc,_0x46e8c3){return _0x4f43cc*_0x46e8c3;},_0x5dd54a[_0x2001c0(_0x5935ea._0x3cee57)]=function(_0x22d482,_0x4316e7){return _0x22d482>_0x4316e7;},_0x5dd54a[_0x2001c0(_0x5935ea._0xc54b49)]=function(_0x3b1001,_0x2bb739){return _0x3b1001===_0x2bb739;},_0x5dd54a[_0x53ec85(0x293)]=_0x53ec85(0x238),_0x5dd54a['qiCNv']=_0x53ec85(0x1ec),_0x5dd54a[_0x2001c0(_0x5935ea._0x1b273a)]=function(_0x30d8a8,_0x83d9a1){return _0x30d8a8>_0x83d9a1;};const _0x3f4f60=_0x5dd54a,_0xb51a12=_0x5007fd[_0x53ec85(_0x5935ea._0x4c692e)](/(?=^## Task \d+)/m)[_0x2001c0(0x26b)](_0x321d5d=>/^## Task \d+/[_0x2001c0(0x256)](_0x321d5d)),_0x51f791=[];for(const _0x5b719d of _0xb51a12){if(_0x3f4f60[_0x2001c0(0x24b)](_0x3f4f60[_0x2001c0(_0x5935ea._0x294102)],_0x3f4f60[_0x53ec85(_0x5935ea._0x57d9e4)])){const _0x363dcf=HUEovS[_0x2001c0(0x23d)](_0x969efa/_0x5ab435,0xdc5+0x1767+-0x24c8);HUEovS['Hlqrt'](_0x363dcf,_0x130105)&&_0x99ff5['push']({'file':_0x2bde15[_0x53ec85(0x243)](_0x1784fb,_0x1fa2fc),'anyCount':_0x375a07,'lineCount':_0x42cf48,'ratio':_0x363dcf[_0x2001c0(0x22b)](0x2f*0x95+0x10aa+-0xc*0x3ab)});}else{const _0xf7bd7d=_0x5b719d[_0x2001c0(_0x5935ea._0x4cfd36)](/^## (Task \d+)[::]\s*(.*)$/m),_0x2ea53e=_0xf7bd7d?_0xf7bd7d[0x66e*-0x1+-0x20bd+-0x2*-0x1396]:'?',_0x3c8e5c=_0xf7bd7d?_0xf7bd7d[-0x457+0x25f1+-0x2*0x10cc]:'',_0x3f2e6c=/前端|页面|组件|vue|react|UI|界面|列表页|编辑页/[_0x2001c0(0x256)](_0x3c8e5c);if(!_0x3f2e6c)continue;const _0x85e9b5=_0x5b719d[_0x53ec85(0x1ff)](/[\w-]+\.vue/g)||[],_0x1c457a=[...new Set(_0x85e9b5)];_0x3f4f60[_0x2001c0(_0x5935ea._0x46b04f)](_0x1c457a[_0x2001c0(0x224)],_0x1dda66)&&_0x51f791['push']({'task':_0x2ea53e,'title':_0x3c8e5c[_0x53ec85(_0x5935ea._0x87d774)](-0x1*0x12d5+-0x18aa+0x83*0x55,0x218d+-0x6b9*0x5+0x38),'vueCount':_0x1c457a[_0x53ec85(0x224)],'files':_0x1c457a['slice'](0x157e+-0x33*-0x60+-0x289e,-0x25*-0xc6+-0x1f10+0x27a)});}}const _0x54e7d6={};return _0x54e7d6[_0x53ec85(0x28a)]=_0x51f791,_0x54e7d6[_0x2001c0(_0x5935ea._0x187e34)]=_0x1dda66,_0x54e7d6;}function checkFrontendEvidence(_0x259060){const _0x379c23={_0x10f98d:0x26b,_0x398c84:0x1ff,_0x5e0387:0x256,_0x3d747a:0x256,_0x5cf97f:0x224,_0x2bf894:0x1f7,_0x29fab3:0x204,_0x38cf06:0x21e,_0x3a6f47:0x277,_0x49f682:0x241,_0x50450f:0x1f7,_0x7477e0:0x1f2,_0x74064c:0x21d},_0x36dcbb=_0x22709b,_0x21223f=_0x22709b,_0x2d1c38={};_0x2d1c38[_0x36dcbb(0x241)]=function(_0xf000b8,_0x14fd83){return _0xf000b8<_0x14fd83;};const _0x4e1e2a=_0x2d1c38,_0x505a6f=_0x259060[_0x36dcbb(0x221)](/(?=^## Task \d+)/m)[_0x36dcbb(_0x379c23._0x10f98d)](_0x19b243=>/^## Task \d+/[_0x36dcbb(0x256)](_0x19b243)),_0x1b08e6=[];for(const _0x367e7e of _0x505a6f){const _0x572ff7=_0x367e7e[_0x21223f(_0x379c23._0x398c84)](/^## (Task \d+)[::]\s*(.*)$/m),_0x30cbe1=_0x572ff7?_0x572ff7[0x1fe5+-0x774+-0x1870]:'?',_0x422ecd=_0x572ff7?_0x572ff7[0x61c+-0x9*0x433+0x7*0x487]:'',_0x15f9a9=/前端|页面|组件|vue|react|UI|界面|列表页|编辑页|弹框/[_0x21223f(0x256)](_0x422ecd);if(!_0x15f9a9)continue;const _0x905fcb=/状态[::]\s*(✅|已完成|完成|已交付|done)/i[_0x21223f(_0x379c23._0x5e0387)](_0x367e7e)||/实际验证结果/[_0x36dcbb(0x256)](_0x367e7e);if(!_0x905fcb)continue;const _0x2b6546=/vue-tsc|tsc\s|npm run build|vite build|webpack|构建成功|build.*success|零错误|0 error/i[_0x21223f(0x256)](_0x367e7e),_0x3e8ba3=/用户操作路径|操作路径|用户路径|交互路径/[_0x21223f(_0x379c23._0x3d747a)](_0x367e7e),_0x128261=/→|->|点击|进入|打开|跳转|弹出|显示|输入|选择|提交/[_0x21223f(0x256)](_0x367e7e),_0x369247=(_0x367e7e[_0x36dcbb(0x1ff)](/→|->/)||[])[_0x21223f(_0x379c23._0x5cf97f)];!_0x2b6546&&_0x1b08e6[_0x21223f(_0x379c23._0x2bf894)](_0x30cbe1+(':\x20前端\x20task\x20'+_0x36dcbb(_0x379c23._0x29fab3)+'(需包含\x20vue-t'+_0x36dcbb(_0x379c23._0x38cf06)+_0x36dcbb(_0x379c23._0x3a6f47)+'果)')),!_0x3e8ba3&&_0x4e1e2a[_0x36dcbb(_0x379c23._0x49f682)](_0x369247,-0xe3*-0x11+0x375*0x9+-0x2e2e)&&_0x1b08e6[_0x21223f(_0x379c23._0x50450f)](_0x30cbe1+(_0x36dcbb(0x1f3)+_0x21223f(_0x379c23._0x7477e0)+'(如\x22列表页\x20→\x20点'+'击新增\x20→\x20弹出弹框'+_0x21223f(_0x379c23._0x74064c)+'\x22)'));}const _0x42dacd={};return _0x42dacd[_0x36dcbb(0x1fb)]=_0x1b08e6,_0x42dacd;}const _0x4f85ba={};_0x4f85ba['detectSkel'+'etonCompon'+'ents']=detectSkeletonComponents,_0x4f85ba[_0x2a293a(0x25a)+'able']=checkBuildable,_0x4f85ba[_0x2a293a(0x272)+_0x22709b(0x227)]=detectAnyAbuse,_0x4f85ba[_0x2a293a(0x26c)+_0x2a293a(0x249)+'g']=checkTaskInterleaving,_0x4f85ba['checkTaskG'+_0x22709b(0x21c)]=checkTaskGranularity,_0x4f85ba[_0x22709b(0x1e8)+_0x2a293a(0x28f)+'e']=checkFrontendEvidence,module[_0x2a293a(0x20c)]=_0x4f85ba;
|
package/commands/spec:apply.md
CHANGED
|
@@ -9,6 +9,9 @@ description: 执行编码(逐 task 推进,每个 task 停顿等确认)
|
|
|
9
9
|
## 前置检查(缺一不过)
|
|
10
10
|
|
|
11
11
|
1. 运行 `npx @alenfitz/spec-copilot gate <变更名> apply`(跨平台门禁检查)
|
|
12
|
+
- v2.2.0 新增:gate 会检查 tasks.md 的前后端 task 交织度和前端 task 粒度
|
|
13
|
+
- 连续 > 3 个后端 task 未穿插前端 → gate fail(必须调整 task 顺序)
|
|
14
|
+
- 单个前端 task 涉及 > 4 个 .vue 文件 → gate fail(必须拆分 task)
|
|
12
15
|
2. Gate 通过后:`git checkout -b feature/<变更名>`(如已在分支则跳过)
|
|
13
16
|
3. 告知用户当前分支名
|
|
14
17
|
|
package/commands/spec:smoke.md
CHANGED
|
@@ -1,27 +1,46 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: 冒烟验证(构建 + 骨架检测 + 接口测试)
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
请按 AGENTS.md 中定义的 /smoke 流程执行:
|
|
6
6
|
|
|
7
7
|
**变更名**:$ARGUMENTS
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
2.
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
## 步骤
|
|
10
|
+
|
|
11
|
+
### Step 0:程序化 gate 检查(v2.2.0 新增)
|
|
12
|
+
|
|
13
|
+
运行 CLI 门禁,获取客观构建结果和骨架检测结果:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npx @alenfitz/spec-copilot gate $ARGUMENTS smoke
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
此命令自动执行:
|
|
20
|
+
- 前后端构建验证(npm run build / mvn compile)
|
|
21
|
+
- 骨架组件检测(el-empty / TODO-only / 空壳组件)
|
|
22
|
+
- TypeScript any 泛滥检测(warning 级别)
|
|
23
|
+
|
|
24
|
+
**gate 未通过 → 直接进入 /spec:fix,不执行后续步骤。**
|
|
25
|
+
|
|
26
|
+
### Step 1:接口冒烟
|
|
27
|
+
|
|
28
|
+
1. 读取 spec.md §3 功能点列表和 §6 API 契约
|
|
29
|
+
2. 对 spec 中**每个 API 接口**执行 curl 验证(不仅限"核心接口"),记录状态码和响应摘要
|
|
30
|
+
3. 统计接口冒烟覆盖率:`通过接口数/总接口数`
|
|
16
31
|
|
|
17
32
|
> ⚠️ 仅验证"核心接口"是不够的。Spec 定义的每个 API 都必须 curl 验证可达。不可达的接口记录为失败项。
|
|
18
33
|
|
|
34
|
+
### Step 2:前端页面验证
|
|
35
|
+
|
|
36
|
+
如有前端页面,逐页面确认可渲染、核心交互可操作。
|
|
37
|
+
|
|
19
38
|
## 结束后
|
|
20
39
|
|
|
21
40
|
1. **记录到 log.md**:在 `## 时间线` 表格尾部追加一行 `| 当前时间 | smoke | 冒烟测试通过 ✓ |`(失败则写 `| 当前时间 | smoke | 冒烟失败 ✗ <原因> |`)
|
|
22
41
|
2. 读取 spec.md §2 复杂度等级后输出:
|
|
23
42
|
|
|
24
|
-
|
|
43
|
+
**通过(gate ✓ + 接口返回正常):**
|
|
25
44
|
|
|
26
45
|
🟡 中等需求:
|
|
27
46
|
```
|
|
@@ -158,13 +158,19 @@ npx @alenfitz/spec-copilot gate <变更名> <phase>
|
|
|
158
158
|
|
|
159
159
|
| 门禁 | 检查项 | 失败时阻止进入 |
|
|
160
160
|
|------|--------|-------------|
|
|
161
|
-
| `apply` | spec.md 存在 + §9
|
|
162
|
-
| `
|
|
161
|
+
| `apply` | spec.md 存在 + §9 清空 +(🔴)tasks.md 存在 + **前后端 task 交织度** + **前端 task 粒度上限** | /spec:apply |
|
|
162
|
+
| `smoke` | **前后端构建验证** + **骨架组件检测** + TypeScript any 检测 | /spec:smoke |
|
|
163
|
+
| `review` | smoke 哨兵 + 冒烟记录 + 所有 task 已提交 + **骨架组件检测** + **前端 task 功能性自证** | /spec:review |
|
|
163
164
|
| `test` | 🔴 复杂需求强制进入 | /spec:test |
|
|
164
|
-
| `archive` | spec.md §12 审查结论为通过 | /spec:archive |
|
|
165
|
+
| `archive` | spec.md §12 审查结论为通过 + review 哨兵 | /spec:archive |
|
|
165
166
|
|
|
166
167
|
门禁不通过 → 阻断当前阶段,提示缺失的前置条件。不允许跳过。
|
|
167
168
|
|
|
169
|
+
**v2.2.0 前端硬检测**(加粗项为新增):
|
|
170
|
+
- `apply` gate 阻止前端 task 被挤到最后(连续 > 3 个后端 task = fail)和粒度过大(单 task > 4 个 .vue = fail)
|
|
171
|
+
- `smoke` gate 执行客观构建验证和骨架组件扫描,不依赖 AI 自述
|
|
172
|
+
- `review` gate 双重兜底:骨架检测 + 前端 task 必须有构建输出和用户操作路径
|
|
173
|
+
|
|
168
174
|
## Git 规范
|
|
169
175
|
1. 禁止 master/main 分支直接变更,/spec:apply 开始前必须建 feature 分支
|
|
170
176
|
2. 每个 task 验证通过后**立即** commit(不等"继续"),commit 必须可编译
|
package/framework/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,43 @@
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## [2.2.0] - 2026-05-23
|
|
8
|
+
|
|
9
|
+
### 新增
|
|
10
|
+
|
|
11
|
+
**前端硬检测体系(解决"骨架组件反复出现"的根因问题):**
|
|
12
|
+
|
|
13
|
+
治本层(apply gate — 防止骨架产生):
|
|
14
|
+
- **前后端 task 交织检查**:tasks.md 中连续 > 3 个后端 task 未穿插前端 → gate fail。防止前端 task 被挤到最后导致 context 耗尽
|
|
15
|
+
- **前端 task 粒度上限**:单个前端 task 涉及 > 4 个 .vue 文件 → gate fail。防止单 task 塞过多组件导致后半段降级为骨架
|
|
16
|
+
- **前端 task 集中度检测**:前端 task 全部集中在 70% 之后 → gate fail
|
|
17
|
+
|
|
18
|
+
治标层(smoke gate — 客观验证,不依赖 AI 自述):
|
|
19
|
+
- **新增 `gate <name> smoke` phase**:smoke 从纯 prompt 阶段升级为 CLI 可验证阶段
|
|
20
|
+
- **构建验证**:自动检测并执行 `npm run build` / `mvn compile`,构建失败 = gate fail
|
|
21
|
+
- **骨架组件检测**:扫描 .vue 文件 `<template>` 区块,检测 el-empty / TODO-only / 空壳组件
|
|
22
|
+
- **TypeScript any 泛滥检测**:统计 `: any` / `as any` 出现密度,超标 = warning
|
|
23
|
+
- **smoke 哨兵文件**:通过后写入 `.gate-smoke-passed`,review 阶段可校验
|
|
24
|
+
|
|
25
|
+
兜底层(review gate — 最后防线):
|
|
26
|
+
- **反"太嗨"机制 8:骨架组件检测**:拦截"文件存在、被引用、但内容是空壳"的组件 — 现有 stub/死代码检测的盲区
|
|
27
|
+
- **前端 task 功能性自证检测**:前端 task 的验证结果必须包含构建输出 + 用户操作路径描述
|
|
28
|
+
|
|
29
|
+
### 变更
|
|
30
|
+
|
|
31
|
+
- `gate` 命令支持 5 个 phase:apply / **smoke** / review / test / archive(新增 smoke)
|
|
32
|
+
- `spec:smoke.md` 增加 Step 0:运行 `gate <name> smoke` 获取客观检测结果
|
|
33
|
+
- `spec:apply.md` 前置检查说明新增 task 交织度和粒度检查
|
|
34
|
+
- 新增独立模块 `bin/frontend-checks.js`,导出 6 个检查函数供 cli.js 调用
|
|
35
|
+
|
|
36
|
+
### 设计理念
|
|
37
|
+
|
|
38
|
+
> 之前三版迭代反复加 prompt 级约束("前端骨架=未完成"铁律、4条完成判定、前后端1:3比例)但问题反复出现。
|
|
39
|
+
> 根因:prompt 解决"知道该做什么",解决不了"验证做没做到"。
|
|
40
|
+
> v2.2.0 核心转变:**治本(改变 task 结构防止骨架产生)+ 治标(CLI 自动化验证代替 AI 自述)**。
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
7
44
|
## [1.6.0] - 2026-05-21
|
|
8
45
|
|
|
9
46
|
### 新增
|
package/framework/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2.
|
|
1
|
+
2.2.0
|
package/package.json
CHANGED