agentic-qe 3.15.6 → 3.15.7
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/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +141 -0
- package/README.md +2 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +8 -6
- package/dist/cli/chunks/adapter-PEOUNYXJ.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-SY7UCLBL.js → agent-booster-wasm-OS5G7KMQ.js} +2 -2
- package/dist/cli/chunks/{agent-handler-KAMYBU3S.js → agent-handler-PI4I7PME.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-2CAW3KUM.js → agent-memory-branch-J7TXHX4U.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-DHKZI5RX.js +2 -0
- package/dist/cli/chunks/{arena-QCCVIOAH.js → arena-FXESDCFR.js} +4 -4
- package/dist/cli/chunks/{arena-4OFLJ3R2.js → arena-OWUGXKNT.js} +2 -2
- package/dist/cli/chunks/{audit-RBDQJQJB.js → audit-EPAWLYIZ.js} +3 -3
- package/dist/cli/chunks/base-QZWK3D5P.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-5JRACCDQ.js → better-sqlite3-IYVR5EQY.js} +2 -2
- package/dist/cli/chunks/{brain-handler-W4QIIRT4.js → brain-handler-3W2E6TC6.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-IBNGI572.js → branch-enumerator-HU7VACJ4.js} +2 -2
- package/dist/cli/chunks/{browser-GMSCVAOI.js → browser-72XOR6E2.js} +2 -2
- package/dist/cli/chunks/browser-workflow-ITPX72RX.js +2 -0
- package/dist/cli/chunks/{chunk-CR66HNAE.js → chunk-2423JAA5.js} +1 -1
- package/dist/cli/chunks/{chunk-LAY7NCQK.js → chunk-24CENUT4.js} +3 -3
- package/dist/cli/chunks/{chunk-PEMSXSP2.js → chunk-2AYBYXOA.js} +2 -2
- package/dist/cli/chunks/{chunk-TUDENMAE.js → chunk-2E3XWKEU.js} +2 -2
- package/dist/cli/chunks/{chunk-KIDOBLUO.js → chunk-2RJYA6WK.js} +2 -2
- package/dist/cli/chunks/{chunk-2IWPJUVV.js → chunk-2YVJ5OUL.js} +5 -5
- package/dist/cli/chunks/{chunk-34MDMFET.js → chunk-34JLY3U6.js} +2 -2
- package/dist/cli/chunks/{chunk-SV5BUYHH.js → chunk-3JD2USUH.js} +2 -2
- package/dist/cli/chunks/{chunk-EF5UHDCG.js → chunk-3RM46XFP.js} +1 -1
- package/dist/cli/chunks/{chunk-7XTANLTN.js → chunk-44DPYNPE.js} +1 -1
- package/dist/cli/chunks/{chunk-ONPPBLRB.js → chunk-4DIZ5BT6.js} +2 -2
- package/dist/cli/chunks/{chunk-22OZIJAD.js → chunk-4G2VNW4C.js} +2 -2
- package/dist/cli/chunks/{chunk-LJCEDTUM.js → chunk-56ZKQYZY.js} +3 -3
- package/dist/cli/chunks/{chunk-HOEWMEF2.js → chunk-5KCBX225.js} +2 -2
- package/dist/cli/chunks/{chunk-V3OLS2NG.js → chunk-5KS7HA37.js} +2 -2
- package/dist/cli/chunks/{chunk-MQCTLTGE.js → chunk-5PBRBS7D.js} +2 -2
- package/dist/cli/chunks/{chunk-TVLOED6O.js → chunk-5Q22XPTH.js} +2 -2
- package/dist/cli/chunks/{chunk-B7RHBKHL.js → chunk-634D2ENF.js} +2 -2
- package/dist/cli/chunks/{chunk-7TVIX4WL.js → chunk-6AYRAOCA.js} +2 -2
- package/dist/cli/chunks/{chunk-4KOVHQXK.js → chunk-6BO3WCK7.js} +2 -2
- package/dist/cli/chunks/{chunk-5HAPS6VD.js → chunk-6FEQ73BF.js} +2 -2
- package/dist/cli/chunks/{chunk-FQ5N666N.js → chunk-6JT73S5B.js} +1 -1
- package/dist/cli/chunks/{chunk-6MXAJBEA.js → chunk-6OS7HREG.js} +1 -1
- package/dist/cli/chunks/{chunk-6R3FBFCJ.js → chunk-6PKCQXEW.js} +2 -2
- package/dist/cli/chunks/{chunk-DQNUPEY5.js → chunk-7EX4DEQR.js} +2 -2
- package/dist/cli/chunks/{chunk-KCB6P463.js → chunk-7UCVYYWL.js} +2 -2
- package/dist/cli/chunks/{chunk-RLB7K7QP.js → chunk-AAA4SHEG.js} +1 -1
- package/dist/cli/chunks/{chunk-ITIJ23K2.js → chunk-AXO7OOOA.js} +2 -2
- package/dist/cli/chunks/{chunk-6RDVY26I.js → chunk-B7M323VL.js} +2 -2
- package/dist/cli/chunks/{chunk-EJ4KZFZN.js → chunk-BB7OLQKO.js} +1 -1
- package/dist/cli/chunks/{chunk-5NC7QEJ6.js → chunk-BTIBXGVQ.js} +4 -4
- package/dist/cli/chunks/{chunk-RD5BYLN7.js → chunk-BTYKGVJ5.js} +1 -1
- package/dist/cli/chunks/{chunk-YXU35GGD.js → chunk-C2CUPJGR.js} +1 -1
- package/dist/cli/chunks/{chunk-XFPQIWEH.js → chunk-C2MDBBFF.js} +3 -3
- package/dist/cli/chunks/{chunk-QLKUCMZC.js → chunk-CG5DZCOZ.js} +1 -1
- package/dist/cli/chunks/{chunk-YLNYPQDR.js → chunk-CIFWOMNX.js} +1 -1
- package/dist/cli/chunks/{chunk-ORBODZSO.js → chunk-CWPRU7ZI.js} +2 -2
- package/dist/cli/chunks/{chunk-WKDWRRDT.js → chunk-CXTJ47QS.js} +2 -2
- package/dist/cli/chunks/{chunk-SOSJWM3E.js → chunk-DCJW2DPL.js} +4 -4
- package/dist/cli/chunks/{chunk-GVRFSXY6.js → chunk-DGK6GQMO.js} +2 -2
- package/dist/cli/chunks/{chunk-X33F7NXH.js → chunk-DVPGBDBP.js} +3 -3
- package/dist/cli/chunks/chunk-EB2PP6X2.js +2 -0
- package/dist/cli/chunks/{chunk-HZFK2Z2Z.js → chunk-ECSLJJOQ.js} +1 -1
- package/dist/cli/chunks/{chunk-JCE76MPP.js → chunk-ED32XJ5R.js} +2 -2
- package/dist/cli/chunks/{chunk-ULCHPPW2.js → chunk-EDU72RTW.js} +1 -1
- package/dist/cli/chunks/{chunk-ZOUEQ6DL.js → chunk-EL75G2A3.js} +1 -1
- package/dist/cli/chunks/{chunk-GNYOHZVV.js → chunk-EV2BYY6T.js} +1 -1
- package/dist/cli/chunks/{chunk-RUTO67PT.js → chunk-F62EKVVC.js} +2 -2
- package/dist/cli/chunks/{chunk-IVJIHZSM.js → chunk-FTTFJ7SJ.js} +1 -1
- package/dist/cli/chunks/{chunk-NYS2GUNO.js → chunk-FVBFASOD.js} +2 -2
- package/dist/cli/chunks/{chunk-5DH5QI7G.js → chunk-G762PEFO.js} +3 -3
- package/dist/cli/chunks/{chunk-JPJEAK4G.js → chunk-G7YTZTGU.js} +1 -1
- package/dist/cli/chunks/{chunk-5VUIXDY2.js → chunk-GY2SAIXP.js} +2 -2
- package/dist/cli/chunks/{chunk-7XUB7U6Z.js → chunk-H4WHDFB5.js} +2 -2
- package/dist/cli/chunks/{chunk-72MQCZSM.js → chunk-HLZATDD2.js} +2 -2
- package/dist/cli/chunks/{chunk-AX26QJ6T.js → chunk-HPG7354V.js} +2 -2
- package/dist/cli/chunks/{chunk-7SAMMQVS.js → chunk-HSDOOFV7.js} +1 -1
- package/dist/cli/chunks/{chunk-K55EAWZ5.js → chunk-HTWIGQL4.js} +2 -2
- package/dist/cli/chunks/{chunk-BXATKI5S.js → chunk-HXBAQKMH.js} +2 -2
- package/dist/cli/chunks/{chunk-46HBVDMU.js → chunk-HZFT3P5B.js} +1 -1
- package/dist/cli/chunks/{chunk-RFDFET3O.js → chunk-I7H4IP7T.js} +2 -2
- package/dist/cli/chunks/{chunk-AJT3XDRD.js → chunk-IARSGAG7.js} +2 -2
- package/dist/cli/chunks/{chunk-TL5GV3PR.js → chunk-IC2WSSD5.js} +3 -3
- package/dist/cli/chunks/{chunk-TLUIO37P.js → chunk-ICPALF4Q.js} +2 -2
- package/dist/cli/chunks/{chunk-ZSBD4FUX.js → chunk-IWQQIXHO.js} +2 -2
- package/dist/cli/chunks/{chunk-AUOSHM63.js → chunk-IYQ7XNE5.js} +2 -2
- package/dist/cli/chunks/{chunk-RHIQ6QO5.js → chunk-J26GADQE.js} +281 -281
- package/dist/cli/chunks/{chunk-AUN4FG7V.js → chunk-J43DV3ME.js} +1 -1
- package/dist/cli/chunks/{chunk-ALCIUWFC.js → chunk-JFPXCQNP.js} +1 -1
- package/dist/cli/chunks/{chunk-R363XXGH.js → chunk-JK6B3ULP.js} +2 -2
- package/dist/cli/chunks/{chunk-7VTKR44N.js → chunk-JPHDMHFG.js} +2 -2
- package/dist/cli/chunks/{chunk-FOJRPEIP.js → chunk-JVYPXW6Y.js} +2 -2
- package/dist/cli/chunks/{chunk-ZUTFHGEO.js → chunk-JY4AIEZ7.js} +1 -1
- package/dist/cli/chunks/{chunk-47Q7JL3V.js → chunk-JY4WLN3K.js} +2 -2
- package/dist/cli/chunks/{chunk-IEPWO4XP.js → chunk-JYXOFN3E.js} +2 -2
- package/dist/cli/chunks/{chunk-2CIDFR2H.js → chunk-K7W55B7Q.js} +2 -2
- package/dist/cli/chunks/{chunk-D5N2O5EH.js → chunk-KPOPBUUJ.js} +2 -2
- package/dist/cli/chunks/{chunk-OQ4S6B7P.js → chunk-LDXQRNTT.js} +1 -1
- package/dist/cli/chunks/{chunk-6T6AHVLF.js → chunk-LDZWIV2O.js} +1 -1
- package/dist/cli/chunks/{chunk-A7ANPS4E.js → chunk-LGBN7TKC.js} +2 -2
- package/dist/cli/chunks/{chunk-X2DR27AY.js → chunk-LMEU64TR.js} +2 -2
- package/dist/cli/chunks/{chunk-GI5HWS4H.js → chunk-LP4AS2E4.js} +1 -1
- package/dist/cli/chunks/{chunk-VVF337SV.js → chunk-LQOVA4YX.js} +2 -2
- package/dist/cli/chunks/{chunk-KYVIOC3C.js → chunk-LVEX4GID.js} +2 -2
- package/dist/cli/chunks/{chunk-BO7UFNYV.js → chunk-M63QB466.js} +2 -2
- package/dist/cli/chunks/{chunk-UHHMAKPE.js → chunk-MDC4G323.js} +1 -1
- package/dist/cli/chunks/{chunk-4CLDYT36.js → chunk-MHZPC4HJ.js} +2 -2
- package/dist/cli/chunks/{chunk-24ZSGYC6.js → chunk-MJJC6HUK.js} +1 -1
- package/dist/cli/chunks/{chunk-ZL5LJT7D.js → chunk-MKFQNCXI.js} +2 -2
- package/dist/cli/chunks/{chunk-XZ46CI35.js → chunk-MMXG3LL6.js} +2 -2
- package/dist/cli/chunks/{chunk-OPDZBRIL.js → chunk-MNCF643K.js} +2 -2
- package/dist/cli/chunks/{chunk-CEXNW5TR.js → chunk-MNZFEIE5.js} +1 -1
- package/dist/cli/chunks/{chunk-L4D3TPFP.js → chunk-MQ6OF6DU.js} +1 -1
- package/dist/cli/chunks/{chunk-UB6DQGWM.js → chunk-MRHM4COP.js} +2 -2
- package/dist/cli/chunks/{chunk-CLAMMGY3.js → chunk-N4PMPSJJ.js} +2 -2
- package/dist/cli/chunks/{chunk-XQ53PZEF.js → chunk-NZQPP533.js} +3 -3
- package/dist/cli/chunks/{chunk-FU7LNUD7.js → chunk-OA4GR3EZ.js} +2 -2
- package/dist/cli/chunks/{chunk-ORFL3YXB.js → chunk-OJEZNLB6.js} +2 -2
- package/dist/cli/chunks/{chunk-5LST62QR.js → chunk-ONVALAZN.js} +2 -2
- package/dist/cli/chunks/{chunk-DA7DGDTI.js → chunk-PEKDSJBC.js} +2 -2
- package/dist/cli/chunks/{chunk-3DJNKNBR.js → chunk-PG64YV6C.js} +57 -57
- package/dist/cli/chunks/{chunk-2ZTWPMTK.js → chunk-PQV7E7XH.js} +2 -2
- package/dist/cli/chunks/chunk-PTK66HEY.js +2 -0
- package/dist/cli/chunks/{chunk-CZBIREL5.js → chunk-PUECC4WI.js} +2 -2
- package/dist/cli/chunks/{chunk-JYKQVYX2.js → chunk-PXZKPUW6.js} +2 -2
- package/dist/cli/chunks/{chunk-I7WAW7TM.js → chunk-PYHYOKYT.js} +2 -2
- package/dist/cli/chunks/{chunk-LCCTJ2PC.js → chunk-PZG3542B.js} +2 -2
- package/dist/cli/chunks/{chunk-F7A2UBZO.js → chunk-Q2T5FXEA.js} +2 -2
- package/dist/cli/chunks/{chunk-PS6WFCA4.js → chunk-QJE6ZW2X.js} +2 -2
- package/dist/cli/chunks/{chunk-LZWJ5BMP.js → chunk-QNQSM2OG.js} +2 -2
- package/dist/cli/chunks/{chunk-QLYO3H7E.js → chunk-QQT6QENQ.js} +2 -2
- package/dist/cli/chunks/{chunk-VCONCVSY.js → chunk-QVG4ZDXX.js} +2 -2
- package/dist/cli/chunks/{chunk-NMY4KTWA.js → chunk-QWLTHFZW.js} +2 -2
- package/dist/cli/chunks/{chunk-NBUXM5X6.js → chunk-RCYLCA7E.js} +2 -2
- package/dist/cli/chunks/{chunk-P7DXVL2S.js → chunk-REEIFA6A.js} +2 -2
- package/dist/cli/chunks/{chunk-5MT7DMD7.js → chunk-RNYX4CPI.js} +2 -2
- package/dist/cli/chunks/{chunk-HAN4MS5T.js → chunk-RORZ5O5Z.js} +2 -2
- package/dist/cli/chunks/{chunk-ZCP4P6O2.js → chunk-RRPYWBFX.js} +2 -2
- package/dist/cli/chunks/{chunk-3NJ7O3OH.js → chunk-RXAFLK34.js} +2 -2
- package/dist/cli/chunks/{chunk-VAYZ5QIE.js → chunk-SQHLC6I5.js} +1 -1
- package/dist/cli/chunks/{chunk-Q2RBOC7V.js → chunk-SSP2B2WR.js} +2 -2
- package/dist/cli/chunks/{chunk-CCL436IU.js → chunk-SX2YSHE7.js} +14 -6
- package/dist/cli/chunks/{chunk-ZTB32K5N.js → chunk-T3ZDVU6F.js} +3 -3
- package/dist/cli/chunks/{chunk-624QRKQX.js → chunk-T6W5APYP.js} +1 -1
- package/dist/cli/chunks/{chunk-BAYGQRNP.js → chunk-TU4LIIOP.js} +2 -2
- package/dist/cli/chunks/{chunk-L2TDHJR3.js → chunk-UBYCR3O4.js} +2 -2
- package/dist/cli/chunks/{chunk-JAPBSSFY.js → chunk-UCLN6AME.js} +1 -1
- package/dist/cli/chunks/{chunk-66NW3ZB4.js → chunk-UIYKR2SA.js} +2 -2
- package/dist/cli/chunks/{chunk-BIXRTOH3.js → chunk-UUHIEM2M.js} +3 -3
- package/dist/cli/chunks/{chunk-ELI4GDQO.js → chunk-UY3REQOK.js} +2 -2
- package/dist/cli/chunks/{chunk-BUTGIVKW.js → chunk-V2SAEMZY.js} +1 -1
- package/dist/cli/chunks/{chunk-6WOZUSSN.js → chunk-V5NGBQAQ.js} +2 -2
- package/dist/cli/chunks/{chunk-7TJZDRDU.js → chunk-VCA6YYII.js} +1 -1
- package/dist/cli/chunks/chunk-VJRZFWR5.js +2 -0
- package/dist/cli/chunks/{chunk-5GIJU2ZY.js → chunk-VKPKYMCT.js} +2 -2
- package/dist/cli/chunks/{chunk-XPB5BVU6.js → chunk-VNW5Q2CX.js} +2 -2
- package/dist/cli/chunks/{chunk-7QVPMH25.js → chunk-VUFRTGML.js} +2 -2
- package/dist/cli/chunks/{chunk-MP3FSUNB.js → chunk-W4X2VTIY.js} +2 -2
- package/dist/cli/chunks/{chunk-GWM4M5NF.js → chunk-WTLIEBDH.js} +1 -1
- package/dist/cli/chunks/{chunk-QS5KZYUZ.js → chunk-WUV5RZUI.js} +2 -2
- package/dist/cli/chunks/{chunk-HEGGV2PT.js → chunk-WXI2STKQ.js} +2 -2
- package/dist/cli/chunks/{chunk-GFB6BZWU.js → chunk-XEWXYGJI.js} +2 -2
- package/dist/cli/chunks/{chunk-NHRF3V4B.js → chunk-XNSQZ3O7.js} +2 -2
- package/dist/cli/chunks/{chunk-4POOJYXA.js → chunk-XTJMY3KS.js} +1 -1
- package/dist/cli/chunks/{chunk-LMAEMVPA.js → chunk-XXAVQACL.js} +1 -1
- package/dist/cli/chunks/{chunk-RV6HSMKJ.js → chunk-Y4SAWE45.js} +1 -1
- package/dist/cli/chunks/{chunk-DLSFT6PO.js → chunk-Y6A46M3B.js} +2 -2
- package/dist/cli/chunks/{chunk-5UPIL62W.js → chunk-YDZJWDR6.js} +3 -3
- package/dist/cli/chunks/{chunk-F3KS3TAB.js → chunk-YFOBQSOW.js} +2 -2
- package/dist/cli/chunks/{chunk-XBEI2JBA.js → chunk-YK3NOC2R.js} +2 -2
- package/dist/cli/chunks/{chunk-MQTA6KIO.js → chunk-YUC7RJGR.js} +1 -1
- package/dist/cli/chunks/{chunk-A74J23QB.js → chunk-Z3VJLWRR.js} +2 -2
- package/dist/cli/chunks/{chunk-YNG7E26C.js → chunk-ZLVQSEZK.js} +2 -2
- package/dist/cli/chunks/{chunk-6HWARQWV.js → chunk-ZRLNACPY.js} +2 -2
- package/dist/cli/chunks/{chunk-XBFQJZWX.js → chunk-ZTMZFF25.js} +2 -2
- package/dist/cli/chunks/chunk-ZUMDDMDE.js +3 -0
- package/dist/cli/chunks/{ci-GEJCXMBK.js → ci-5HEXJZ2C.js} +2 -2
- package/dist/cli/chunks/{ci-config-2ZVV4OXL.js → ci-config-WU4NPDAM.js} +2 -2
- package/dist/cli/chunks/{ci-output-E45OGVPR.js → ci-output-BJQVXX5E.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-X73ITYZC.js → circuit-breaker-3BMGTQCB.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-W4PPH46C.js → claude-flow-setup-GVDGJWMU.js} +2 -2
- package/dist/cli/chunks/client-S7GNYTZ5.js +2 -0
- package/dist/cli/chunks/{cline-installer-NUEPMWDE.js → cline-installer-V4MRGWVA.js} +2 -2
- package/dist/cli/chunks/{code-6WQHBS7G.js → code-A3TGQPEO.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-BXQIFIFT.js → code-index-extractor-YJQSYWD3.js} +2 -2
- package/dist/cli/chunks/{codex-installer-Z337R2KH.js → codex-installer-7N7UQPAH.js} +2 -2
- package/dist/cli/chunks/{completions-F5DMYFHV.js → completions-PPGVYLZS.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-W2SYPZDI.js → complexity-analyzer-XZTFLYV5.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-ZCHUIFTN.js → continuedev-installer-Z5I57RAH.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-M5JNODXF.js → copilot-installer-F5YZ6BHB.js} +2 -2
- package/dist/cli/chunks/core-handlers-CUEPOQIO.js +2 -0
- package/dist/cli/chunks/{cost-tracker-LSYTHBHV.js → cost-tracker-GO33ZQAP.js} +2 -2
- package/dist/cli/chunks/{coverage-PGMRS5SS.js → coverage-GSHKLY74.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-CXN5QFEV.js +2 -0
- package/dist/cli/chunks/{cursor-installer-XPUA73UW.js → cursor-installer-JJ7IVJZB.js} +2 -2
- package/dist/cli/chunks/daemon-3DQCKRYO.js +10 -0
- package/dist/cli/chunks/{daemon-ITKDIYMW.js → daemon-IRL7QRNE.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-T55AXLD6.js → dag-attention-scheduler-ORXSUHPA.js} +2 -2
- package/dist/cli/chunks/{detect-DR7J6K4O.js → detect-RHU62KRI.js} +2 -2
- package/dist/cli/chunks/{dist-node-LAJJBOUT.js → dist-node-3VKV4Z6C.js} +2 -2
- package/dist/cli/chunks/{domain-handler-OMSHCRMK.js → domain-handler-SFIML4FK.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-EQXSKC5K.js → domain-plugins-CJ4FA3OC.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-FKRAGVSW.js → domain-transfer-BCRKPCAA.js} +2 -2
- package/dist/cli/chunks/dream-5AUNJW24.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-JZFPCNL3.js → embed-and-insert-pattern-VL3HFLPV.js} +2 -2
- package/dist/cli/chunks/{eval-JSNNASBW.js → eval-GGKRI4P5.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-UPD3IZBK.js → experience-capture-middleware-F72TIRQY.js} +3 -3
- package/dist/cli/chunks/{fast-paths-YNMIBS2E.js → fast-paths-7KOOF3MA.js} +2 -2
- package/dist/cli/chunks/{feature-flags-SRLXDKBI.js → feature-flags-FNHBTHBH.js} +2 -2
- package/dist/cli/chunks/{feature-flags-VIR7O4L7.js → feature-flags-IOZEWWFU.js} +2 -2
- package/dist/cli/chunks/file-discovery-AYWF357I.js +2 -0
- package/dist/cli/chunks/{fleet-K2ED46EL.js → fleet-QX5KXTRC.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-QCU4ZRYW.js → gnn-wrapper-OH2DOQP7.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-YYQI4WZM.js → heartbeat-handler-W67NXTNE.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-7ZIDVXIP.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-P77OC7FM.js +2 -0
- package/dist/cli/chunks/hnsw-index-3LBOTQAW.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-C5TJSWTZ.js → hnsw-legacy-bridge-6MLLOGOE.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-SE3MJJYS.js → hnswlib-node-4UDISJ3G.js} +2 -2
- package/dist/cli/chunks/{hooks-C572SRDH.js → hooks-NOQJWQ4P.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-LOM54PDD.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-35A6G3M5.js → hypergraph-engine-2OD3APVP.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-U2756CWI.js → hypergraph-handler-5AZGMBUM.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-QSDJVBPS.js +2 -0
- package/dist/cli/chunks/init-guard-SMGJ45PW.js +2 -0
- package/dist/cli/chunks/init-handler-5T4MP2NM.js +88 -0
- package/dist/cli/chunks/init-wizard-MK2325JJ.js +2 -0
- package/dist/cli/chunks/kernel-2NJQQ2KT.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-32PX5YH7.js → kilocode-installer-RLZYLVQJ.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-C4ROMMUS.js → kiro-installer-LFZOC7VD.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-SDISHO62.js +2 -0
- package/dist/cli/chunks/{learning-GEPVZGJQ.js → learning-XRPGLUWR.js} +20 -20
- package/dist/cli/chunks/{llm-router-XRKTTJTX.js → llm-router-OMK5HYPH.js} +4 -4
- package/dist/cli/chunks/llm-router-service-YTCMRBAN.js +2 -0
- package/dist/cli/chunks/{load-XVH6HW7E.js → load-XADC7KCU.js} +2 -2
- package/dist/cli/chunks/load-test-RPKHLBCC.js +2 -0
- package/dist/cli/chunks/{mcp-IULSTM4Z.js → mcp-PIBKSSVU.js} +2 -2
- package/dist/cli/chunks/{memory-6K7IAU4T.js → memory-AP7EZERS.js} +5 -5
- package/dist/cli/chunks/memory-backend-BZXFO4JZ.js +2 -0
- package/dist/cli/chunks/{memory-handlers-CG6DRLAW.js → memory-handlers-MOFDNB6E.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-VZDUYPLX.js → multi-model-executor-7JJ2FZ33.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-QUTXKNH4.js → opencode-installer-ZZZ6EBYJ.js} +2 -2
- package/dist/cli/chunks/{orchestrator-PCKKUWOP.js → orchestrator-2H2YKSGJ.js} +5 -5
- package/dist/cli/chunks/pattern-null-store-4PRPIOR6.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-PX5HQVRL.js → pattern-usage-recorder-7MJJWC2Z.js} +2 -2
- package/dist/cli/chunks/{pipeline-O562GTOG.js → pipeline-LIE5BWQY.js} +2 -2
- package/dist/cli/chunks/{platform-PM7Q2AZS.js → platform-SMYUNLGX.js} +2 -2
- package/dist/cli/chunks/{plugin-OTYTFGPY.js → plugin-LJDIXQNT.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-6CFXTHC2.js → prime-radiant-advanced-wasm-RIDNE5D2.js} +2 -2
- package/dist/cli/chunks/project-root-NBIQF63D.js +2 -0
- package/dist/cli/chunks/protocol-executor-BRPGIYWQ.js +2 -0
- package/dist/cli/chunks/{protocol-handler-PPGNSAOS.js → protocol-handler-YVM66DLI.js} +2 -2
- package/dist/cli/chunks/{prove-WQ3BKRZG.js → prove-ZBDT52GD.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-GDZACWKW.js +2 -0
- package/dist/cli/chunks/{quality-C5WUU3AA.js → quality-DUKXGDDO.js} +2 -2
- package/dist/cli/chunks/{quality-gate-WSSRKD5U.js → quality-gate-SM3RXF4V.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-LDKLBPD5.js +2 -0
- package/dist/cli/chunks/{real-embeddings-CFQE7IRQ.js → real-embeddings-4QLQZDB5.js} +2 -2
- package/dist/cli/chunks/{ref-validation-DHKHXVZT.js → ref-validation-M3EO32YQ.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-3PPODABV.js → roocode-installer-S6Q5OLV5.js} +2 -2
- package/dist/cli/chunks/router-H5YSIRH2.js +2 -0
- package/dist/cli/chunks/routing-feedback-5R36TJDH.js +2 -0
- package/dist/cli/chunks/{routing-handler-JNXTGT6T.js → routing-handler-55FMUACP.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-6YLROPVP.js → ruvector-commands-QATKAAPK.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-TT2DBQQQ.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-BCLFJKSK.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-4DWB4WRK.js → rvf-migration-coordinator-RFXFU6JD.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-UXI66OQJ.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-YKR2ZNBF.js → rvf-store-integrity-PKDVXQAW.js} +2 -2
- package/dist/cli/chunks/safe-db-MSTD2GDH.js +2 -0
- package/dist/cli/chunks/schedule-KST6KIFD.js +2 -0
- package/dist/cli/chunks/scheduler-FTQS6YK3.js +2 -0
- package/dist/cli/chunks/security-CMRB6WA3.js +18 -0
- package/dist/cli/chunks/{shared-rvf-adapter-LNRLFP5I.js → shared-rvf-adapter-YHLLNFHF.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-GWU6YQNS.js → shared-rvf-dual-writer-4BGDVPQ7.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-ZX5QFDMR.js +2 -0
- package/dist/cli/chunks/{standalone-memory-46KKBSSV.js → standalone-memory-LUHKQAGM.js} +2 -2
- package/dist/cli/chunks/{status-handler-35T5FTDQ.js → status-handler-S6S5PNR7.js} +2 -2
- package/dist/cli/chunks/{structural-health-P7QPQWLO.js → structural-health-PQ7NZAJ4.js} +2 -2
- package/dist/cli/chunks/{sync-W6Z4R4PL.js → sync-Q6KRQXU6.js} +2 -2
- package/dist/cli/chunks/{sync-Y43EWBSY.js → sync-S744AEJC.js} +2 -2
- package/dist/cli/chunks/{task-handler-5CX3ZYT7.js → task-handler-GAMGEHUW.js} +2 -2
- package/dist/cli/chunks/{task-handlers-DQZGOJNE.js → task-handlers-6CRDEELN.js} +3 -3
- package/dist/cli/chunks/{test-TPP53VVV.js → test-FNH67DBK.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-WBV4UMQH.js → test-scheduling-NZA5SHK6.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-GIIDXHLC.js → token-bootstrap-CXKG55JD.js} +2 -2
- package/dist/cli/chunks/{token-usage-AKK37RB7.js → token-usage-M7WWEDJX.js} +2 -2
- package/dist/cli/chunks/{transformers-7MASPELS.js → transformers-2IFMCK6A.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-YZKD6UGB.js → tree-sitter-wasm-parser-NMNA6RJC.js} +2 -2
- package/dist/cli/chunks/{types-AZ3BTXDP.js → types-N7FWTOLD.js} +2 -2
- package/dist/cli/chunks/unified-memory-2Z2F446J.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-A4EWYPJQ.js +2 -0
- package/dist/cli/chunks/unified-persistence-Z6N6JZFA.js +2 -0
- package/dist/cli/chunks/{upgrade-L7OTDKEK.js → upgrade-KDB5RGL7.js} +2 -2
- package/dist/cli/chunks/{validate-O3QVFIGP.js → validate-KMUV5FUA.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-2UGBGLTX.js → validate-swarm-ANZWRCJU.js} +2 -2
- package/dist/cli/chunks/visual-security-GXYZV7KR.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-J75IYPRO.js → web-tree-sitter-SXXC4NMS.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-FQ5DBFCG.js → windsurf-installer-2LWSKMBU.js} +2 -2
- package/dist/cli/chunks/witness-chain-52PEIEGK.js +2 -0
- package/dist/cli/chunks/{witness-chain-I7TN4MXZ.js → witness-chain-JJMSJFZP.js} +2 -2
- package/dist/cli/chunks/{witness-chain-repair-D3NE3NQK.js → witness-chain-repair-OX7VFW6T.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-RU2WOP5M.js → witness-chain-verifier-QLSMXHAZ.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-IHQB2FR5.js → witness-key-manager-3DS4L7LE.js} +2 -2
- package/dist/cli/chunks/{workflow-6BWTNVV6.js → workflow-ARWAMHD3.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-DORMQMG7.js +2 -0
- package/dist/cli/chunks/{wrappers-URVP25VU.js → wrappers-J6KGTUSJ.js} +2 -2
- package/dist/cli/commands/learning.js +3 -2
- package/dist/cli/commands/security.d.ts +16 -0
- package/dist/cli/commands/security.js +76 -9
- package/dist/cli/handlers/init-guard.d.ts +21 -1
- package/dist/cli/handlers/init-guard.js +51 -8
- package/dist/cli/handlers/init-handler.js +57 -56
- package/dist/cli/index.js +11 -0
- package/dist/cli/utils/ci-output.d.ts +5 -0
- package/dist/cli/utils/ci-output.js +8 -0
- package/dist/coordination/handlers/security-handlers.js +22 -6
- package/dist/coordination/protocols/defect-investigation.js +7 -1
- package/dist/coordination/protocols/security-audit.js +11 -0
- package/dist/coordination/result-saver.d.ts +9 -0
- package/dist/coordination/result-saver.js +34 -4
- package/dist/domains/coverage-analysis/collected-metrics.d.ts +2 -0
- package/dist/domains/coverage-analysis/collected-metrics.js +6 -0
- package/dist/domains/defect-intelligence/services/defect-predictor.js +9 -6
- package/dist/domains/quality-assessment/interfaces.d.ts +4 -0
- package/dist/domains/quality-assessment/quality-evidence.d.ts +1 -1
- package/dist/domains/quality-assessment/services/quality-analyzer.js +7 -5
- package/dist/domains/quality-assessment/services/quality-gate.js +12 -3
- package/dist/domains/security-compliance/dependency-advisory-engine.d.ts +52 -0
- package/dist/domains/security-compliance/dependency-advisory-engine.js +113 -0
- package/dist/domains/security-compliance/interfaces.d.ts +30 -0
- package/dist/domains/security-compliance/plugin.d.ts +7 -1
- package/dist/domains/security-compliance/plugin.js +19 -0
- package/dist/domains/security-compliance/services/scanners/dependency-resolver.d.ts +71 -0
- package/dist/domains/security-compliance/services/scanners/dependency-resolver.js +232 -0
- package/dist/domains/security-compliance/services/scanners/dependency-scanner.d.ts +21 -6
- package/dist/domains/security-compliance/services/scanners/dependency-scanner.js +142 -64
- package/dist/domains/security-compliance/services/scanners/lockfile-versions.d.ts +43 -0
- package/dist/domains/security-compliance/services/scanners/lockfile-versions.js +248 -0
- package/dist/domains/security-compliance/services/scanners/scanner-types.d.ts +30 -2
- package/dist/domains/security-compliance/services/security-auditor.d.ts +19 -6
- package/dist/domains/security-compliance/services/security-auditor.js +133 -92
- package/dist/domains/test-execution/services/retry-handler.js +17 -6
- package/dist/domains/test-execution/services/test-executor.d.ts +1 -0
- package/dist/domains/test-execution/services/test-executor.js +87 -7
- package/dist/kernel/shared-dirs.js +17 -5
- package/dist/mcp/bundle.js +874 -874
- package/dist/mcp/handlers/domain-handler-configs.d.ts +4 -0
- package/dist/mcp/handlers/domain-handler-configs.js +5 -1
- package/dist/mcp/protocol-server.js +2 -1
- package/dist/mcp/types.d.ts +6 -0
- package/dist/shared/security/index.d.ts +2 -2
- package/dist/shared/security/index.js +1 -1
- package/dist/shared/security/osv-client.d.ts +79 -132
- package/dist/shared/security/osv-client.js +344 -167
- package/dist/shared/security/osv-lookup.d.ts +124 -0
- package/dist/shared/security/osv-lookup.js +246 -0
- package/dist/shared/security/osv-types.d.ts +119 -0
- package/dist/shared/security/osv-types.js +6 -0
- package/dist/workers/interfaces.d.ts +6 -1
- package/dist/workers/namespaced-keys.d.ts +16 -0
- package/dist/workers/namespaced-keys.js +24 -0
- package/dist/workers/quality-daemon/persistent-memory.d.ts +1 -1
- package/dist/workers/quality-daemon/persistent-memory.js +2 -2
- package/dist/workers/worker-manager.js +5 -2
- package/dist/workers/workers/defect-predictor.d.ts +25 -8
- package/dist/workers/workers/defect-predictor.js +223 -216
- package/dist/workers/workers/performance-baseline.d.ts +24 -9
- package/dist/workers/workers/performance-baseline.js +187 -230
- package/dist/workers/workers/quality-gate.d.ts +11 -9
- package/dist/workers/workers/quality-gate.js +125 -267
- package/dist/workers/workers/security-scan-records.d.ts +111 -0
- package/dist/workers/workers/security-scan-records.js +128 -0
- package/dist/workers/workers/security-scan.d.ts +25 -7
- package/dist/workers/workers/security-scan.js +187 -164
- package/package.json +2 -2
- package/dist/cli/chunks/adapter-PP3XIXDV.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-VDUQJKKY.js +0 -2
- package/dist/cli/chunks/base-QSYWWPCE.js +0 -2
- package/dist/cli/chunks/browser-workflow-WXXPBSCM.js +0 -2
- package/dist/cli/chunks/chunk-45MVRQG4.js +0 -2
- package/dist/cli/chunks/chunk-5VZVMO7B.js +0 -3
- package/dist/cli/chunks/chunk-EECF4CMA.js +0 -2
- package/dist/cli/chunks/client-6XKSQ4JT.js +0 -2
- package/dist/cli/chunks/core-handlers-OJYW4Y6M.js +0 -2
- package/dist/cli/chunks/cross-domain-router-QVUPQ2SC.js +0 -2
- package/dist/cli/chunks/daemon-QBYTCIMH.js +0 -10
- package/dist/cli/chunks/dream-3UABDRZJ.js +0 -2
- package/dist/cli/chunks/file-discovery-ZFGZTKZ4.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-MJ6MTPDF.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-FQWJCFVW.js +0 -2
- package/dist/cli/chunks/hnsw-index-NJYKJUHC.js +0 -2
- package/dist/cli/chunks/hybrid-backend-SL7RFID7.js +0 -2
- package/dist/cli/chunks/impact-analyzer-5ZJTXPVC.js +0 -2
- package/dist/cli/chunks/init-handler-PCLYQUSB.js +0 -88
- package/dist/cli/chunks/init-wizard-MQMDSIOF.js +0 -2
- package/dist/cli/chunks/kernel-MEJ5GMRH.js +0 -2
- package/dist/cli/chunks/knowledge-graph-XUBZSEZE.js +0 -2
- package/dist/cli/chunks/llm-router-service-QZAPAEPX.js +0 -2
- package/dist/cli/chunks/load-test-OVXIQ3AF.js +0 -2
- package/dist/cli/chunks/memory-backend-TRPOMPK4.js +0 -2
- package/dist/cli/chunks/pattern-null-store-JWYBRBZG.js +0 -2
- package/dist/cli/chunks/project-root-VVSTHIP4.js +0 -2
- package/dist/cli/chunks/protocol-executor-PXZCLZD3.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-42FRS5V3.js +0 -2
- package/dist/cli/chunks/queen-coordinator-UI3B7DI6.js +0 -2
- package/dist/cli/chunks/router-HYRPWLAY.js +0 -2
- package/dist/cli/chunks/routing-feedback-BPZ5R6F3.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-DEKDQ6KO.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-L53VBS7I.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-I6RUGD2D.js +0 -2
- package/dist/cli/chunks/safe-db-KS65XDCP.js +0 -2
- package/dist/cli/chunks/schedule-KD2VN6GB.js +0 -2
- package/dist/cli/chunks/scheduler-ZH3RMUHY.js +0 -2
- package/dist/cli/chunks/security-PWQTGDRU.js +0 -13
- package/dist/cli/chunks/sqlite-persistence-6DTVME5D.js +0 -2
- package/dist/cli/chunks/unified-memory-FCX7NLFZ.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-VU5QJK37.js +0 -2
- package/dist/cli/chunks/unified-persistence-FM376LGE.js +0 -2
- package/dist/cli/chunks/visual-security-EU7Y3X46.js +0 -2
- package/dist/cli/chunks/witness-chain-CSEBT52D.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-ALNKOM3N.js +0 -2
|
@@ -2,13 +2,24 @@
|
|
|
2
2
|
* Agentic QE v3 - Defect Predictor Worker
|
|
3
3
|
* ADR-014: Background Workers for QE Monitoring
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
8
|
-
*
|
|
9
|
-
*
|
|
5
|
+
* Surfaces the defect-intelligence domain's latest predictions:
|
|
6
|
+
* - High-risk files and their contributing factors
|
|
7
|
+
* - Targeted review / refactoring / coverage recommendations
|
|
8
|
+
*
|
|
9
|
+
* #1043: every prediction comes from a run of the defect-intelligence
|
|
10
|
+
* predictor (`defect-intelligence:predictor:prediction:<id>` in the
|
|
11
|
+
* `defect-intelligence` namespace, written by DefectPredictorService), and
|
|
12
|
+
* only files that exist in the project are kept. Code hotspots have no
|
|
13
|
+
* measured source and are reported unmeasured. Nothing predicted → nothing
|
|
14
|
+
* stored, an "unmeasured" info finding. A `defect:predictions` record without
|
|
15
|
+
* the measured stamp (the invented one written by <= 3.15.6) is ignored and
|
|
16
|
+
* replaced by the next measured run.
|
|
10
17
|
*/
|
|
18
|
+
import * as fs from 'fs';
|
|
19
|
+
import * as path from 'path';
|
|
20
|
+
import { bareSearchKey } from '../namespaced-keys.js';
|
|
11
21
|
import { BaseWorker } from '../base-worker.js';
|
|
22
|
+
import { findProjectRoot } from '../../kernel/project-root.js';
|
|
12
23
|
const CONFIG = {
|
|
13
24
|
id: 'defect-predictor',
|
|
14
25
|
name: 'Defect Predictor',
|
|
@@ -21,6 +32,82 @@ const CONFIG = {
|
|
|
21
32
|
retryCount: 2,
|
|
22
33
|
retryDelayMs: 15000,
|
|
23
34
|
};
|
|
35
|
+
const DEFECT_NAMESPACE = 'defect-intelligence';
|
|
36
|
+
const PREDICTION_KEY_PATTERN = 'defect-intelligence:predictor:prediction:*';
|
|
37
|
+
const PREDICTIONS_KEY = 'defect:predictions';
|
|
38
|
+
const SCHEMA_VERSION = 1;
|
|
39
|
+
/** The predictor keeps its records for 7 days; nothing older is current. */
|
|
40
|
+
const MAX_PREDICTION_AGE_MS = 7 * 24 * 60 * 60 * 1000;
|
|
41
|
+
const MAX_PREDICTION_RECORDS = 1000;
|
|
42
|
+
const RISK_LEVELS = ['critical', 'high', 'medium', 'low', 'info'];
|
|
43
|
+
/**
|
|
44
|
+
* Where a predicted path lies, resolved against the project root with
|
|
45
|
+
* symlinks followed: only a regular file whose real path is inside the
|
|
46
|
+
* project's real root is a project file (#1043 round 2b).
|
|
47
|
+
*/
|
|
48
|
+
function classifyPredictedFile(file, realRoot) {
|
|
49
|
+
let real;
|
|
50
|
+
try {
|
|
51
|
+
real = fs.realpathSync(path.resolve(realRoot, file));
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Unresolvable: missing when it would lie inside the root, else outside.
|
|
55
|
+
const lexical = path.resolve(realRoot, file);
|
|
56
|
+
const rel = path.relative(realRoot, lexical);
|
|
57
|
+
return rel && !rel.startsWith('..') && !path.isAbsolute(rel) ? 'missing' : 'outside';
|
|
58
|
+
}
|
|
59
|
+
const rel = path.relative(realRoot, real);
|
|
60
|
+
if (rel === '' || rel.startsWith('..') || path.isAbsolute(rel))
|
|
61
|
+
return 'outside';
|
|
62
|
+
try {
|
|
63
|
+
return fs.statSync(real).isFile() ? 'inside' : 'missing';
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return 'missing';
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function realProjectRoot() {
|
|
70
|
+
const root = findProjectRoot();
|
|
71
|
+
try {
|
|
72
|
+
return fs.realpathSync(root);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return path.resolve(root);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const isRecord = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
79
|
+
function parseFilePrediction(raw) {
|
|
80
|
+
if (!isRecord(raw))
|
|
81
|
+
return null;
|
|
82
|
+
const { file, probability, riskLevel } = raw;
|
|
83
|
+
if (typeof file !== 'string' || file.length === 0)
|
|
84
|
+
return null;
|
|
85
|
+
if (typeof probability !== 'number' || !Number.isFinite(probability) || probability < 0 || probability > 1)
|
|
86
|
+
return null;
|
|
87
|
+
if (!RISK_LEVELS.includes(riskLevel))
|
|
88
|
+
return null;
|
|
89
|
+
const factors = Array.isArray(raw.factors)
|
|
90
|
+
? raw.factors.filter((f) => isRecord(f) && typeof f.name === 'string' && typeof f.contribution === 'number' && Number.isFinite(f.contribution))
|
|
91
|
+
: [];
|
|
92
|
+
const recommendations = Array.isArray(raw.recommendations)
|
|
93
|
+
? raw.recommendations.filter((r) => typeof r === 'string')
|
|
94
|
+
: [];
|
|
95
|
+
return { file, probability, riskLevel: riskLevel, factors, recommendations };
|
|
96
|
+
}
|
|
97
|
+
/** A recorded prediction run, or `null` when the record is not a usable one. */
|
|
98
|
+
function parsePredictionRecord(raw, now) {
|
|
99
|
+
if (!isRecord(raw) || typeof raw.id !== 'string' || typeof raw.timestamp !== 'string')
|
|
100
|
+
return null;
|
|
101
|
+
const t = Date.parse(raw.timestamp);
|
|
102
|
+
if (!Number.isFinite(t) || t > now + 60_000 || now - t > MAX_PREDICTION_AGE_MS)
|
|
103
|
+
return null;
|
|
104
|
+
if (!Array.isArray(raw.predictions) || raw.predictions.length === 0)
|
|
105
|
+
return null;
|
|
106
|
+
const predictions = raw.predictions.map(parseFilePrediction);
|
|
107
|
+
if (predictions.some((p) => p === null))
|
|
108
|
+
return null;
|
|
109
|
+
return { id: raw.id, timestamp: raw.timestamp, predictions: predictions };
|
|
110
|
+
}
|
|
24
111
|
export class DefectPredictorWorker extends BaseWorker {
|
|
25
112
|
constructor() {
|
|
26
113
|
super(CONFIG);
|
|
@@ -30,23 +117,46 @@ export class DefectPredictorWorker extends BaseWorker {
|
|
|
30
117
|
context.logger.info('Starting defect prediction analysis');
|
|
31
118
|
const findings = [];
|
|
32
119
|
const recommendations = [];
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
120
|
+
const { measured: latest, unusable } = await this.readLatestPrediction(context);
|
|
121
|
+
if (!latest) {
|
|
122
|
+
findings.push({
|
|
123
|
+
type: 'defect-prediction-unmeasured',
|
|
124
|
+
severity: 'info',
|
|
125
|
+
domain: 'defect-intelligence',
|
|
126
|
+
title: 'Defect Prediction Unmeasured',
|
|
127
|
+
description: (unusable
|
|
128
|
+
? `The latest defect prediction (${unusable.id}) names no file inside this project ` +
|
|
129
|
+
`(${unusable.outside} outside the project root, ${unusable.missing} missing), so no risk is reported. `
|
|
130
|
+
: 'No defect prediction for files in this project has been recorded in the last 7 days, so no risk is reported. ') +
|
|
131
|
+
'Run defect_predict on the files to assess.',
|
|
132
|
+
});
|
|
133
|
+
if (unusable)
|
|
134
|
+
await this.markPreviousStale(context, unusable.id);
|
|
135
|
+
context.logger.info('Defect prediction complete', { measured: false });
|
|
136
|
+
return this.createResult(Date.now() - startTime, {
|
|
137
|
+
itemsAnalyzed: 0,
|
|
138
|
+
issuesFound: 0,
|
|
139
|
+
healthScore: 100,
|
|
140
|
+
trend: 'stable',
|
|
141
|
+
domainMetrics: {
|
|
142
|
+
filesAnalyzed: 0,
|
|
143
|
+
highRiskFiles: 0,
|
|
144
|
+
hotspots: 'unmeasured',
|
|
145
|
+
avgDefectProbability: 'unmeasured',
|
|
146
|
+
},
|
|
147
|
+
}, findings, recommendations);
|
|
148
|
+
}
|
|
149
|
+
const { predictions } = latest;
|
|
38
150
|
this.analyzeHighRiskPredictions(predictions, findings, recommendations);
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
await context.memory.set('defect:hotspots', hotspots);
|
|
44
|
-
await context.memory.set('defect:lastAnalysis', new Date().toISOString());
|
|
45
|
-
const healthScore = this.calculateHealthScore(predictions, hotspots);
|
|
151
|
+
await context.memory.set(PREDICTIONS_KEY, latest);
|
|
152
|
+
await context.memory.set('defect:lastAnalysis', latest.evaluatedAt);
|
|
153
|
+
const healthScore = this.calculateHealthScore(predictions);
|
|
154
|
+
const highRisk = predictions.filter(p => p.riskLevel === 'high' || p.riskLevel === 'critical').length;
|
|
46
155
|
context.logger.info('Defect prediction complete', {
|
|
156
|
+
measured: true,
|
|
47
157
|
healthScore,
|
|
158
|
+
predictionId: latest.predictionId,
|
|
48
159
|
predictionsCount: predictions.length,
|
|
49
|
-
hotspotsCount: hotspots.length,
|
|
50
160
|
});
|
|
51
161
|
return this.createResult(Date.now() - startTime, {
|
|
52
162
|
itemsAnalyzed: predictions.length,
|
|
@@ -55,237 +165,134 @@ export class DefectPredictorWorker extends BaseWorker {
|
|
|
55
165
|
trend: 'stable',
|
|
56
166
|
domainMetrics: {
|
|
57
167
|
filesAnalyzed: predictions.length,
|
|
58
|
-
highRiskFiles:
|
|
59
|
-
|
|
168
|
+
highRiskFiles: highRisk,
|
|
169
|
+
missingFilesSkipped: latest.missingFilesSkipped,
|
|
170
|
+
outsideProjectSkipped: latest.outsideProjectSkipped,
|
|
171
|
+
hotspots: 'unmeasured',
|
|
60
172
|
avgDefectProbability: (predictions.reduce((sum, p) => sum + p.probability, 0) / predictions.length).toFixed(2),
|
|
61
173
|
},
|
|
62
174
|
}, findings, recommendations);
|
|
63
175
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
{ name: 'size', weight: 0.2, description: 'Large file (1500+ lines)' },
|
|
79
|
-
{ name: 'coupling', weight: 0.15, description: 'High coupling with 8 other modules' },
|
|
80
|
-
],
|
|
81
|
-
recentChanges: 15,
|
|
82
|
-
historicalDefects: 3,
|
|
83
|
-
complexity: 28,
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
file: 'src/domains/security-compliance/services/security-scanner.ts',
|
|
87
|
-
probability: 0.65,
|
|
88
|
-
riskLevel: 'high',
|
|
89
|
-
factors: [
|
|
90
|
-
{ name: 'complexity', weight: 0.35, description: 'High cyclomatic complexity (32)' },
|
|
91
|
-
{ name: 'size', weight: 0.25, description: 'Very large file (1200+ lines)' },
|
|
92
|
-
{ name: 'test-coverage', weight: 0.2, description: 'Low test coverage (45%)' },
|
|
93
|
-
],
|
|
94
|
-
recentChanges: 8,
|
|
95
|
-
historicalDefects: 2,
|
|
96
|
-
complexity: 32,
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
file: 'src/kernel/memory-backend.ts',
|
|
100
|
-
probability: 0.45,
|
|
101
|
-
riskLevel: 'medium',
|
|
102
|
-
factors: [
|
|
103
|
-
{ name: 'change-frequency', weight: 0.4, description: 'Changed 10 times in last 30 days' },
|
|
104
|
-
{ name: 'authors', weight: 0.3, description: 'Multiple authors (4)' },
|
|
105
|
-
],
|
|
106
|
-
recentChanges: 10,
|
|
107
|
-
historicalDefects: 1,
|
|
108
|
-
complexity: 15,
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
file: 'src/shared/http/http-client.ts',
|
|
112
|
-
probability: 0.25,
|
|
113
|
-
riskLevel: 'low',
|
|
114
|
-
factors: [
|
|
115
|
-
{ name: 'stability', weight: 0.5, description: 'Stable code, few recent changes' },
|
|
116
|
-
],
|
|
117
|
-
recentChanges: 2,
|
|
118
|
-
historicalDefects: 0,
|
|
119
|
-
complexity: 8,
|
|
120
|
-
},
|
|
121
|
-
];
|
|
176
|
+
/**
|
|
177
|
+
* #1043 round 2b: the newest prediction names no usable file, so a stored
|
|
178
|
+
* measured record from an older prediction is no longer current — stamp it
|
|
179
|
+
* stale (once) instead of leaving it looking like the latest analysis.
|
|
180
|
+
*/
|
|
181
|
+
async markPreviousStale(context, supersededBy) {
|
|
182
|
+
const stored = await context.memory.get(PREDICTIONS_KEY);
|
|
183
|
+
if (!stored || typeof stored !== 'object' || stored.measured !== true || stored.schemaVersion !== SCHEMA_VERSION)
|
|
184
|
+
return;
|
|
185
|
+
if (stored.stale === true || stored.predictionId === supersededBy)
|
|
186
|
+
return;
|
|
187
|
+
await context.memory.set(PREDICTIONS_KEY, {
|
|
188
|
+
...stored, stale: true, staleSince: new Date().toISOString(), supersededBy,
|
|
189
|
+
});
|
|
122
190
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
191
|
+
/**
|
|
192
|
+
* #1043: the most recent prediction run the defect-intelligence predictor
|
|
193
|
+
* recorded, restricted to regular files whose real path is inside the
|
|
194
|
+
* project root. `measured` is `null` when there is no such prediction;
|
|
195
|
+
* `unusable` describes a newest prediction none of whose files qualify.
|
|
196
|
+
*/
|
|
197
|
+
async readLatestPrediction(context) {
|
|
198
|
+
const keys = await context.memory.search(PREDICTION_KEY_PATTERN, MAX_PREDICTION_RECORDS, { namespace: DEFECT_NAMESPACE });
|
|
199
|
+
const now = Date.now();
|
|
200
|
+
let latest = null;
|
|
201
|
+
for (const found of keys) {
|
|
202
|
+
// #1049: the in-memory backend returns `<namespace>:<key>` from a namespaced search.
|
|
203
|
+
const key = bareSearchKey(found, DEFECT_NAMESPACE, PREDICTION_KEY_PATTERN);
|
|
204
|
+
const parsed = parsePredictionRecord(await context.memory.get(key, { namespace: DEFECT_NAMESPACE }), now);
|
|
205
|
+
if (parsed && (!latest || Date.parse(parsed.timestamp) > Date.parse(latest.timestamp)))
|
|
206
|
+
latest = parsed;
|
|
207
|
+
}
|
|
208
|
+
if (!latest)
|
|
209
|
+
return { measured: null, unusable: null };
|
|
210
|
+
const realRoot = realProjectRoot();
|
|
211
|
+
const disposition = latest.predictions.map((p) => classifyPredictedFile(p.file, realRoot));
|
|
212
|
+
const existing = latest.predictions.filter((_, i) => disposition[i] === 'inside');
|
|
213
|
+
const outside = disposition.filter((d) => d === 'outside').length;
|
|
214
|
+
const missing = disposition.filter((d) => d === 'missing').length;
|
|
215
|
+
if (outside > 0) {
|
|
216
|
+
context.logger.warn('Ignoring defect predictions for paths outside the project root', { predictionId: latest.id, outside });
|
|
217
|
+
}
|
|
218
|
+
if (existing.length === 0) {
|
|
219
|
+
context.logger.info('Latest defect prediction names no file inside the project', { predictionId: latest.id });
|
|
220
|
+
return { measured: null, unusable: { id: latest.id, outside, missing } };
|
|
221
|
+
}
|
|
222
|
+
return { unusable: null, measured: {
|
|
223
|
+
measured: true,
|
|
224
|
+
schemaVersion: SCHEMA_VERSION,
|
|
225
|
+
source: 'defect-intelligence',
|
|
226
|
+
predictionId: latest.id,
|
|
227
|
+
predictedAt: latest.timestamp,
|
|
228
|
+
evaluatedAt: new Date().toISOString(),
|
|
229
|
+
predictions: existing,
|
|
230
|
+
missingFilesSkipped: missing,
|
|
231
|
+
outsideProjectSkipped: outside,
|
|
232
|
+
} };
|
|
151
233
|
}
|
|
152
234
|
analyzeHighRiskPredictions(predictions, findings, recommendations) {
|
|
153
235
|
const critical = predictions.filter(p => p.riskLevel === 'critical');
|
|
154
236
|
const high = predictions.filter(p => p.riskLevel === 'high');
|
|
155
|
-
for (const prediction of critical) {
|
|
237
|
+
for (const prediction of [...critical, ...high]) {
|
|
238
|
+
const name = prediction.file.split(/[\\/]/).pop();
|
|
156
239
|
findings.push({
|
|
157
|
-
type:
|
|
158
|
-
severity:
|
|
240
|
+
type: `${prediction.riskLevel}-defect-risk`,
|
|
241
|
+
severity: prediction.riskLevel,
|
|
159
242
|
domain: 'defect-intelligence',
|
|
160
|
-
title:
|
|
161
|
-
description: `${(prediction.probability * 100).toFixed(0)}%
|
|
243
|
+
title: `${prediction.riskLevel === 'critical' ? 'Critical' : 'High'} Defect Risk: ${name}`,
|
|
244
|
+
description: `${(prediction.probability * 100).toFixed(0)}% predicted defect probability (defect-intelligence predictor)`,
|
|
162
245
|
resource: prediction.file,
|
|
163
246
|
context: {
|
|
164
247
|
probability: prediction.probability,
|
|
165
248
|
factors: prediction.factors,
|
|
166
|
-
|
|
167
|
-
historicalDefects: prediction.historicalDefects,
|
|
249
|
+
recommendations: prediction.recommendations,
|
|
168
250
|
},
|
|
169
251
|
});
|
|
170
252
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
}
|
|
186
|
-
if (critical.length > 0 || high.length > 0) {
|
|
253
|
+
if (critical.length === 0 && high.length === 0)
|
|
254
|
+
return;
|
|
255
|
+
recommendations.push({
|
|
256
|
+
priority: 'p0',
|
|
257
|
+
domain: 'defect-intelligence',
|
|
258
|
+
action: 'Prioritize Code Review for High-Risk Files',
|
|
259
|
+
description: `${critical.length + high.length} files have elevated predicted defect risk. Schedule focused code reviews.`,
|
|
260
|
+
estimatedImpact: 'high',
|
|
261
|
+
effort: 'medium',
|
|
262
|
+
autoFixable: false,
|
|
263
|
+
});
|
|
264
|
+
const risky = [...critical, ...high];
|
|
265
|
+
const complexity = risky.filter(p => p.factors.some(f => f.name === 'codeComplexity' && f.contribution > 0.1));
|
|
266
|
+
if (complexity.length > 0) {
|
|
187
267
|
recommendations.push({
|
|
188
|
-
priority: '
|
|
268
|
+
priority: 'p1',
|
|
189
269
|
domain: 'defect-intelligence',
|
|
190
|
-
action: '
|
|
191
|
-
description: `${
|
|
270
|
+
action: 'Reduce Code Complexity',
|
|
271
|
+
description: `${complexity.length} high-risk files have code complexity as a major risk factor. Consider refactoring.`,
|
|
192
272
|
estimatedImpact: 'high',
|
|
193
|
-
effort: 'medium',
|
|
194
|
-
autoFixable: false,
|
|
195
|
-
});
|
|
196
|
-
// Specific recommendations based on factors
|
|
197
|
-
const complexityIssues = predictions.filter(p => p.factors.some(f => f.name === 'complexity' && f.weight > 0.25));
|
|
198
|
-
if (complexityIssues.length > 0) {
|
|
199
|
-
recommendations.push({
|
|
200
|
-
priority: 'p1',
|
|
201
|
-
domain: 'defect-intelligence',
|
|
202
|
-
action: 'Reduce Code Complexity',
|
|
203
|
-
description: `${complexityIssues.length} files have high complexity as a defect risk factor. Consider refactoring.`,
|
|
204
|
-
estimatedImpact: 'high',
|
|
205
|
-
effort: 'high',
|
|
206
|
-
autoFixable: false,
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
const coverageIssues = predictions.filter(p => p.factors.some(f => f.name === 'test-coverage'));
|
|
210
|
-
if (coverageIssues.length > 0) {
|
|
211
|
-
recommendations.push({
|
|
212
|
-
priority: 'p1',
|
|
213
|
-
domain: 'defect-intelligence',
|
|
214
|
-
action: 'Improve Test Coverage for Risky Files',
|
|
215
|
-
description: `${coverageIssues.length} high-risk files have low test coverage. Add targeted tests.`,
|
|
216
|
-
estimatedImpact: 'high',
|
|
217
|
-
effort: 'medium',
|
|
218
|
-
autoFixable: true,
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
analyzeHotspots(hotspots, findings, recommendations) {
|
|
224
|
-
const criticalHotspots = hotspots.filter(h => h.score > 0.7);
|
|
225
|
-
if (criticalHotspots.length > 0) {
|
|
226
|
-
findings.push({
|
|
227
|
-
type: 'code-hotspots',
|
|
228
|
-
severity: 'medium',
|
|
229
|
-
domain: 'defect-intelligence',
|
|
230
|
-
title: `${criticalHotspots.length} Code Hotspots Detected`,
|
|
231
|
-
description: 'Files with high change frequency and defect density identified',
|
|
232
|
-
context: {
|
|
233
|
-
hotspots: criticalHotspots.map(h => ({
|
|
234
|
-
file: h.file,
|
|
235
|
-
changeFrequency: h.changeFrequency,
|
|
236
|
-
score: h.score.toFixed(2),
|
|
237
|
-
})),
|
|
238
|
-
},
|
|
239
|
-
});
|
|
240
|
-
recommendations.push({
|
|
241
|
-
priority: 'p2',
|
|
242
|
-
domain: 'defect-intelligence',
|
|
243
|
-
action: 'Address Code Hotspots',
|
|
244
|
-
description: 'Consider refactoring frequently-changed, defect-prone files to improve stability.',
|
|
245
|
-
estimatedImpact: 'medium',
|
|
246
273
|
effort: 'high',
|
|
247
274
|
autoFixable: false,
|
|
248
275
|
});
|
|
249
276
|
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
if (silos.length > 0) {
|
|
253
|
-
findings.push({
|
|
254
|
-
type: 'knowledge-silo',
|
|
255
|
-
severity: 'medium',
|
|
256
|
-
domain: 'defect-intelligence',
|
|
257
|
-
title: 'Knowledge Silos Detected',
|
|
258
|
-
description: `${silos.length} frequently-changed files have only one author`,
|
|
259
|
-
context: {
|
|
260
|
-
files: silos.map(s => s.file),
|
|
261
|
-
},
|
|
262
|
-
});
|
|
277
|
+
const coverage = risky.filter(p => p.factors.some(f => f.name === 'testCoverage' && f.contribution > 0.1));
|
|
278
|
+
if (coverage.length > 0) {
|
|
263
279
|
recommendations.push({
|
|
264
|
-
priority: '
|
|
280
|
+
priority: 'p1',
|
|
265
281
|
domain: 'defect-intelligence',
|
|
266
|
-
action: '
|
|
267
|
-
description:
|
|
268
|
-
estimatedImpact: '
|
|
269
|
-
effort: '
|
|
270
|
-
autoFixable:
|
|
282
|
+
action: 'Improve Test Coverage for Risky Files',
|
|
283
|
+
description: `${coverage.length} high-risk files have low test coverage as a major risk factor. Add targeted tests.`,
|
|
284
|
+
estimatedImpact: 'high',
|
|
285
|
+
effort: 'medium',
|
|
286
|
+
autoFixable: true,
|
|
271
287
|
});
|
|
272
288
|
}
|
|
273
289
|
}
|
|
274
|
-
calculateHealthScore(predictions
|
|
290
|
+
calculateHealthScore(predictions) {
|
|
275
291
|
if (predictions.length === 0)
|
|
276
292
|
return 100;
|
|
277
|
-
// Base score from average defect probability (inverted)
|
|
278
293
|
const avgProbability = predictions.reduce((sum, p) => sum + p.probability, 0) / predictions.length;
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
const highRiskCount = predictions.filter(p => p.riskLevel === 'critical' || p.riskLevel === 'high').length;
|
|
282
|
-
score -= (highRiskCount / predictions.length) * 20;
|
|
283
|
-
// Penalty for hotspots
|
|
284
|
-
const criticalHotspots = hotspots.filter(h => h.score > 0.7).length;
|
|
285
|
-
score -= criticalHotspots * 3;
|
|
286
|
-
// Bonus for stable codebase
|
|
287
|
-
const lowRiskRatio = predictions.filter(p => p.riskLevel === 'low').length / predictions.length;
|
|
288
|
-
score += lowRiskRatio * 20;
|
|
294
|
+
const highRisk = predictions.filter(p => p.riskLevel === 'critical' || p.riskLevel === 'high').length;
|
|
295
|
+
const score = (1 - avgProbability) * 80 - (highRisk / predictions.length) * 20 + 20;
|
|
289
296
|
return Math.max(0, Math.min(100, Math.round(score)));
|
|
290
297
|
}
|
|
291
298
|
}
|
|
@@ -2,24 +2,39 @@
|
|
|
2
2
|
* Agentic QE v3 - Performance Baseline Worker
|
|
3
3
|
* ADR-014: Background Workers for QE Monitoring
|
|
4
4
|
*
|
|
5
|
-
* Tracks
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* -
|
|
9
|
-
*
|
|
5
|
+
* Tracks test execution time against a baseline built from measured runs.
|
|
6
|
+
*
|
|
7
|
+
* #1043: every figure comes from a recorded test run — the run behind the
|
|
8
|
+
* latest usable testsPassing evidence (`test-run:<runId>` in `test-execution`),
|
|
9
|
+
* read the same way the regression monitor reads it (#1028). Build and
|
|
10
|
+
* resource figures have no measured source and are reported unmeasured.
|
|
11
|
+
* Nothing measured → nothing stored or compared. A baseline without the
|
|
12
|
+
* measured stamp (the invented one written by <= 3.15.6) is ignored and
|
|
13
|
+
* replaced by the next measured run.
|
|
10
14
|
*/
|
|
11
15
|
import { BaseWorker } from '../base-worker';
|
|
12
16
|
import { WorkerContext, WorkerResult } from '../interfaces';
|
|
13
17
|
export declare class PerformanceBaselineWorker extends BaseWorker {
|
|
14
18
|
constructor();
|
|
15
19
|
protected doExecute(context: WorkerContext): Promise<WorkerResult>;
|
|
16
|
-
private
|
|
17
|
-
|
|
20
|
+
private baselineStatus;
|
|
21
|
+
/**
|
|
22
|
+
* #1043: the run behind the latest usable testsPassing evidence, with its
|
|
23
|
+
* recorded wall time and test count. `null` when there is no such evidence
|
|
24
|
+
* or the run's result was not recorded.
|
|
25
|
+
*/
|
|
26
|
+
private collectMeasuredRun;
|
|
27
|
+
/**
|
|
28
|
+
* Compare a measured run with the measured baseline of the same test set.
|
|
29
|
+
* The recorded duration is the run's wall time; per-test time across
|
|
30
|
+
* different test sets would mostly measure runner overhead (#1028 N1).
|
|
31
|
+
*/
|
|
18
32
|
private detectAnomalies;
|
|
19
33
|
private analyzeAnomalies;
|
|
20
34
|
private formatMetricName;
|
|
21
|
-
|
|
22
|
-
private
|
|
35
|
+
/** Blend a measured run into a comparable baseline, or start a new one from it. */
|
|
36
|
+
private nextBaseline;
|
|
37
|
+
private appendHistory;
|
|
23
38
|
private calculateHealthScore;
|
|
24
39
|
}
|
|
25
40
|
//# sourceMappingURL=performance-baseline.d.ts.map
|