agentic-qe 3.15.5 → 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/qe-court/evals/fixtures/seeded-mutant-delivery/README.md +9 -2
- package/.claude/skills/qe-court/evals/qe-court.yaml +3 -2
- package/.claude/skills/qe-quality-assessment/schemas/output.json +12 -2
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +262 -0
- package/README.md +2 -0
- package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/README.md +9 -2
- package/assets/skills/qe-court/evals/qe-court.yaml +3 -2
- package/assets/skills/qe-quality-assessment/schemas/output.json +12 -2
- 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-CCTTGCQS.js → agent-booster-wasm-OS5G7KMQ.js} +2 -2
- package/dist/cli/chunks/{agent-handler-DHYUF3NX.js → agent-handler-PI4I7PME.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-642W7CYX.js → agent-memory-branch-J7TXHX4U.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-DHKZI5RX.js +2 -0
- package/dist/cli/chunks/{arena-MUCC7UUN.js → arena-FXESDCFR.js} +4 -4
- package/dist/cli/chunks/{arena-NW2JVAFY.js → arena-OWUGXKNT.js} +2 -2
- package/dist/cli/chunks/{audit-VKQTZJAA.js → audit-EPAWLYIZ.js} +3 -3
- package/dist/cli/chunks/base-QZWK3D5P.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-7ZUFVWLQ.js → better-sqlite3-IYVR5EQY.js} +2 -2
- package/dist/cli/chunks/{brain-handler-7LKAWSBI.js → brain-handler-3W2E6TC6.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-HUNXJKM4.js → branch-enumerator-HU7VACJ4.js} +2 -2
- package/dist/cli/chunks/{browser-ZSZEYUDP.js → browser-72XOR6E2.js} +2 -2
- package/dist/cli/chunks/browser-workflow-ITPX72RX.js +2 -0
- package/dist/cli/chunks/{chunk-PVAE65B4.js → chunk-2423JAA5.js} +1 -1
- package/dist/cli/chunks/{chunk-VLOIEVER.js → chunk-24CENUT4.js} +3 -3
- package/dist/cli/chunks/chunk-2AYBYXOA.js +4 -0
- package/dist/cli/chunks/{chunk-FWYJ6UDX.js → chunk-2E3XWKEU.js} +2 -2
- package/dist/cli/chunks/{chunk-L375O3CZ.js → chunk-2RJYA6WK.js} +2 -2
- package/dist/cli/chunks/{chunk-SDWMLT7B.js → chunk-2YVJ5OUL.js} +5 -5
- package/dist/cli/chunks/{chunk-WN55MNZ2.js → chunk-34JLY3U6.js} +2 -2
- package/dist/cli/chunks/{chunk-6ZIDZ4TJ.js → chunk-3JD2USUH.js} +2 -2
- package/dist/cli/chunks/{chunk-5BOZCMXZ.js → chunk-3RM46XFP.js} +1 -1
- package/dist/cli/chunks/{chunk-UE22ODHN.js → chunk-44DPYNPE.js} +1 -1
- package/dist/cli/chunks/{chunk-AUZXRFOX.js → chunk-4DIZ5BT6.js} +2 -2
- package/dist/cli/chunks/{chunk-RUSLEOMC.js → chunk-4G2VNW4C.js} +2 -2
- package/dist/cli/chunks/{chunk-VML4SG3X.js → chunk-56ZKQYZY.js} +3 -3
- package/dist/cli/chunks/{chunk-FHUJCVT3.js → chunk-5KCBX225.js} +2 -2
- package/dist/cli/chunks/chunk-5KS7HA37.js +2 -0
- package/dist/cli/chunks/{chunk-IJ2EXSMO.js → chunk-5PBRBS7D.js} +2 -2
- package/dist/cli/chunks/chunk-5Q22XPTH.js +2 -0
- package/dist/cli/chunks/{chunk-PDPEMBFV.js → chunk-634D2ENF.js} +2 -2
- package/dist/cli/chunks/{chunk-BYXNHGQC.js → chunk-6AYRAOCA.js} +2 -2
- package/dist/cli/chunks/{chunk-ORTBRO7F.js → chunk-6BO3WCK7.js} +2 -2
- package/dist/cli/chunks/{chunk-6LG5UEQE.js → chunk-6FEQ73BF.js} +2 -2
- package/dist/cli/chunks/{chunk-JYY7AYGA.js → chunk-6JT73S5B.js} +1 -1
- package/dist/cli/chunks/{chunk-LNO5IWGH.js → chunk-6OS7HREG.js} +1 -1
- package/dist/cli/chunks/{chunk-XNEEYXR2.js → chunk-6PKCQXEW.js} +2 -2
- package/dist/cli/chunks/{chunk-KHCALIFP.js → chunk-7EX4DEQR.js} +2 -2
- package/dist/cli/chunks/chunk-7UCVYYWL.js +3 -0
- package/dist/cli/chunks/chunk-AAA4SHEG.js +2 -0
- package/dist/cli/chunks/{chunk-DTJODGCE.js → chunk-AXO7OOOA.js} +2 -2
- package/dist/cli/chunks/{chunk-ZT3GUYM5.js → chunk-B7M323VL.js} +2 -2
- package/dist/cli/chunks/{chunk-L6SVCNXK.js → chunk-BB7OLQKO.js} +1 -1
- package/dist/cli/chunks/{chunk-6UYN5PHA.js → chunk-BTIBXGVQ.js} +4 -4
- package/dist/cli/chunks/chunk-BTYKGVJ5.js +2 -0
- package/dist/cli/chunks/{chunk-6JFGB2JB.js → chunk-C2CUPJGR.js} +1 -1
- package/dist/cli/chunks/{chunk-EAYQCBXL.js → chunk-C2MDBBFF.js} +3 -3
- package/dist/cli/chunks/{chunk-3AYYGR6W.js → chunk-CG5DZCOZ.js} +1 -1
- package/dist/cli/chunks/chunk-CIFWOMNX.js +2 -0
- package/dist/cli/chunks/{chunk-Y2WMPEUP.js → chunk-CWPRU7ZI.js} +2 -2
- package/dist/cli/chunks/{chunk-XNHB6TLC.js → chunk-CXTJ47QS.js} +2 -2
- package/dist/cli/chunks/{chunk-4PT5KNXL.js → chunk-DCJW2DPL.js} +4 -4
- package/dist/cli/chunks/{chunk-VCKDVOPD.js → chunk-DGK6GQMO.js} +2 -2
- package/dist/cli/chunks/{chunk-47GEI2LT.js → chunk-DVPGBDBP.js} +3 -3
- package/dist/cli/chunks/chunk-EB2PP6X2.js +2 -0
- package/dist/cli/chunks/{chunk-CXOXUBYU.js → chunk-ECSLJJOQ.js} +1 -1
- package/dist/cli/chunks/{chunk-A2WOQO2N.js → chunk-ED32XJ5R.js} +2 -2
- package/dist/cli/chunks/{chunk-35MDATQE.js → chunk-EDU72RTW.js} +1 -1
- package/dist/cli/chunks/{chunk-PCCIZFD7.js → chunk-EL75G2A3.js} +1 -1
- package/dist/cli/chunks/{chunk-4UXPDV7E.js → chunk-EV2BYY6T.js} +1 -1
- package/dist/cli/chunks/{chunk-3YASZPLO.js → chunk-F62EKVVC.js} +2 -2
- package/dist/cli/chunks/{chunk-AQN5EDBM.js → chunk-FTTFJ7SJ.js} +1 -1
- package/dist/cli/chunks/chunk-FVBFASOD.js +2 -0
- package/dist/cli/chunks/{chunk-QXY3IRBW.js → chunk-G762PEFO.js} +26 -26
- package/dist/cli/chunks/{chunk-A5J4XJS6.js → chunk-G7YTZTGU.js} +1 -1
- package/dist/cli/chunks/{chunk-YINFES3E.js → chunk-GY2SAIXP.js} +2 -2
- package/dist/cli/chunks/chunk-H4WHDFB5.js +4 -0
- package/dist/cli/chunks/chunk-HLZATDD2.js +2 -0
- package/dist/cli/chunks/{chunk-7EZLOC4K.js → chunk-HPG7354V.js} +2 -2
- package/dist/cli/chunks/{chunk-HLFDC4SF.js → chunk-HSDOOFV7.js} +1 -1
- package/dist/cli/chunks/{chunk-MQGEZA2A.js → chunk-HTWIGQL4.js} +2 -2
- package/dist/cli/chunks/{chunk-HBYQYGXP.js → chunk-HXBAQKMH.js} +2 -2
- package/dist/cli/chunks/chunk-HZFT3P5B.js +2 -0
- package/dist/cli/chunks/{chunk-MS3Z2CP5.js → chunk-I7H4IP7T.js} +2 -2
- package/dist/cli/chunks/{chunk-IHFUEPZH.js → chunk-IARSGAG7.js} +2 -2
- package/dist/cli/chunks/{chunk-ZTC5FBL6.js → chunk-IC2WSSD5.js} +8 -8
- package/dist/cli/chunks/{chunk-GKPRECLL.js → chunk-ICPALF4Q.js} +2 -2
- package/dist/cli/chunks/{chunk-FQKEZVN6.js → chunk-IWQQIXHO.js} +2 -2
- package/dist/cli/chunks/{chunk-DWZI3IVB.js → chunk-IYQ7XNE5.js} +2 -2
- package/dist/cli/chunks/{chunk-ZLBBX24Q.js → chunk-J26GADQE.js} +418 -412
- package/dist/cli/chunks/{chunk-NMJVG22Z.js → chunk-J43DV3ME.js} +1 -1
- package/dist/cli/chunks/{chunk-EUEHBERE.js → chunk-JFPXCQNP.js} +1 -1
- package/dist/cli/chunks/{chunk-3YNP33GB.js → chunk-JK6B3ULP.js} +2 -2
- package/dist/cli/chunks/{chunk-FBEXG4HD.js → chunk-JPHDMHFG.js} +2 -2
- package/dist/cli/chunks/{chunk-U6OVPMQX.js → chunk-JVYPXW6Y.js} +2 -2
- package/dist/cli/chunks/{chunk-X52TMBHU.js → chunk-JY4AIEZ7.js} +1 -1
- package/dist/cli/chunks/{chunk-MNQ36MAF.js → chunk-JY4WLN3K.js} +2 -2
- package/dist/cli/chunks/{chunk-E4VIVMDL.js → chunk-JYXOFN3E.js} +2 -2
- package/dist/cli/chunks/{chunk-CR2JUANW.js → chunk-K7W55B7Q.js} +3 -3
- package/dist/cli/chunks/{chunk-WLIYWBQR.js → chunk-KPOPBUUJ.js} +2 -2
- package/dist/cli/chunks/{chunk-DXVZBJE4.js → chunk-LDXQRNTT.js} +1 -1
- package/dist/cli/chunks/{chunk-W3ZGNNDV.js → chunk-LDZWIV2O.js} +1 -1
- package/dist/cli/chunks/{chunk-VRJPH3LG.js → chunk-LGBN7TKC.js} +2 -2
- package/dist/cli/chunks/{chunk-RUJLVJDE.js → chunk-LMEU64TR.js} +2 -2
- package/dist/cli/chunks/{chunk-JI77KJP7.js → chunk-LP4AS2E4.js} +1 -1
- package/dist/cli/chunks/{chunk-QPV3OKX2.js → chunk-LQOVA4YX.js} +2 -2
- package/dist/cli/chunks/{chunk-NLDFNAOS.js → chunk-LVEX4GID.js} +2 -2
- package/dist/cli/chunks/{chunk-U4TV75AC.js → chunk-M63QB466.js} +2 -2
- package/dist/cli/chunks/{chunk-SAPIRK2G.js → chunk-MDC4G323.js} +1 -1
- package/dist/cli/chunks/chunk-MHZPC4HJ.js +2 -0
- package/dist/cli/chunks/{chunk-WR64BKUE.js → chunk-MJJC6HUK.js} +1 -1
- package/dist/cli/chunks/{chunk-Y7GPLOXB.js → chunk-MKFQNCXI.js} +2 -2
- package/dist/cli/chunks/{chunk-BZFT4QDQ.js → chunk-MMXG3LL6.js} +2 -2
- package/dist/cli/chunks/{chunk-HGBJ2QQ4.js → chunk-MNCF643K.js} +2 -2
- package/dist/cli/chunks/{chunk-XIE7OHML.js → chunk-MNZFEIE5.js} +1 -1
- package/dist/cli/chunks/{chunk-FE3AIZI6.js → chunk-MQ6OF6DU.js} +1 -1
- package/dist/cli/chunks/{chunk-3QD7U3FY.js → chunk-MRHM4COP.js} +2 -2
- package/dist/cli/chunks/{chunk-663ZFPUL.js → chunk-N4PMPSJJ.js} +2 -2
- package/dist/cli/chunks/{chunk-DL5JENWD.js → chunk-NZQPP533.js} +3 -3
- package/dist/cli/chunks/{chunk-4XSCZVON.js → chunk-OA4GR3EZ.js} +2 -2
- package/dist/cli/chunks/{chunk-IJOFZBXD.js → chunk-OJEZNLB6.js} +2 -2
- package/dist/cli/chunks/{chunk-OU4ZAWCC.js → chunk-ONVALAZN.js} +2 -2
- package/dist/cli/chunks/{chunk-A337MD3C.js → chunk-PEKDSJBC.js} +2 -2
- package/dist/cli/chunks/{chunk-D3G2NN7F.js → chunk-PG64YV6C.js} +66 -65
- package/dist/cli/chunks/{chunk-VYDNLQJN.js → chunk-PQV7E7XH.js} +2 -2
- package/dist/cli/chunks/chunk-PTK66HEY.js +2 -0
- package/dist/cli/chunks/{chunk-LRASYSGV.js → chunk-PUECC4WI.js} +2 -2
- package/dist/cli/chunks/{chunk-3OAQPN2N.js → chunk-PXZKPUW6.js} +2 -2
- package/dist/cli/chunks/chunk-PYHYOKYT.js +2 -0
- package/dist/cli/chunks/{chunk-WT3JC4A6.js → chunk-PZG3542B.js} +2 -2
- package/dist/cli/chunks/{chunk-RMJ7PJOS.js → chunk-Q2T5FXEA.js} +2 -2
- package/dist/cli/chunks/chunk-QJE6ZW2X.js +6 -0
- package/dist/cli/chunks/{chunk-2XYTS2WY.js → chunk-QNQSM2OG.js} +2 -2
- package/dist/cli/chunks/{chunk-EVCFUYYK.js → chunk-QQT6QENQ.js} +9 -9
- package/dist/cli/chunks/{chunk-VH3EB6ZG.js → chunk-QVG4ZDXX.js} +3 -3
- package/dist/cli/chunks/chunk-QWLTHFZW.js +16 -0
- package/dist/cli/chunks/{chunk-GGDKOJVF.js → chunk-RCYLCA7E.js} +10 -6
- package/dist/cli/chunks/{chunk-BMWAWZAN.js → chunk-REEIFA6A.js} +2 -2
- package/dist/cli/chunks/{chunk-Y2E3IJ53.js → chunk-RNYX4CPI.js} +2 -2
- package/dist/cli/chunks/{chunk-BY646JOM.js → chunk-RORZ5O5Z.js} +2 -2
- package/dist/cli/chunks/{chunk-JNMUVBAJ.js → chunk-RRPYWBFX.js} +2 -2
- package/dist/cli/chunks/{chunk-XQRE2HWM.js → chunk-RXAFLK34.js} +2 -2
- package/dist/cli/chunks/{chunk-UXZEVIFX.js → chunk-SQHLC6I5.js} +1 -1
- package/dist/cli/chunks/{chunk-DPV33C77.js → chunk-SSP2B2WR.js} +2 -2
- package/dist/cli/chunks/chunk-SX2YSHE7.js +115 -0
- package/dist/cli/chunks/chunk-T3ZDVU6F.js +5 -0
- package/dist/cli/chunks/{chunk-JCC7QEKZ.js → chunk-T6W5APYP.js} +1 -1
- package/dist/cli/chunks/{chunk-DEGWCUMY.js → chunk-TU4LIIOP.js} +2 -2
- package/dist/cli/chunks/{chunk-CQMHDAJS.js → chunk-UBYCR3O4.js} +2 -2
- package/dist/cli/chunks/{chunk-PHP4UJYP.js → chunk-UCLN6AME.js} +1 -1
- package/dist/cli/chunks/{chunk-HIUNCO2W.js → chunk-UIYKR2SA.js} +2 -2
- package/dist/cli/chunks/{chunk-ONCH5AXU.js → chunk-UUHIEM2M.js} +18 -18
- package/dist/cli/chunks/{chunk-CFPR24YK.js → chunk-UY3REQOK.js} +2 -2
- package/dist/cli/chunks/{chunk-FNAYDITO.js → chunk-V2SAEMZY.js} +1 -1
- package/dist/cli/chunks/{chunk-JANLATHN.js → chunk-V5NGBQAQ.js} +2 -2
- package/dist/cli/chunks/{chunk-644DFAGS.js → chunk-VCA6YYII.js} +1 -1
- package/dist/cli/chunks/chunk-VJRZFWR5.js +2 -0
- package/dist/cli/chunks/{chunk-7BIYJRQJ.js → chunk-VKPKYMCT.js} +2 -2
- package/dist/cli/chunks/{chunk-2KWI3MT3.js → chunk-VNW5Q2CX.js} +2 -2
- package/dist/cli/chunks/chunk-VUFRTGML.js +3 -0
- package/dist/cli/chunks/{chunk-PHAQWAEV.js → chunk-W4X2VTIY.js} +2 -2
- package/dist/cli/chunks/{chunk-PURHGLEC.js → chunk-WTLIEBDH.js} +1 -1
- package/dist/cli/chunks/{chunk-3SH23PS3.js → chunk-WUV5RZUI.js} +2 -2
- package/dist/cli/chunks/{chunk-OGYWWZU7.js → chunk-WXI2STKQ.js} +2 -2
- package/dist/cli/chunks/{chunk-OW42F2TX.js → chunk-XEWXYGJI.js} +2 -2
- package/dist/cli/chunks/{chunk-DPYDUKVZ.js → chunk-XNSQZ3O7.js} +2 -2
- package/dist/cli/chunks/{chunk-B2UHTA4Q.js → chunk-XTJMY3KS.js} +1 -1
- package/dist/cli/chunks/{chunk-NF6AFIAX.js → chunk-XXAVQACL.js} +1 -1
- package/dist/cli/chunks/{chunk-V7GNUVYI.js → chunk-Y4SAWE45.js} +1 -1
- package/dist/cli/chunks/{chunk-WC47GICZ.js → chunk-Y6A46M3B.js} +2 -2
- package/dist/cli/chunks/{chunk-3DTEQHFB.js → chunk-YDZJWDR6.js} +3 -3
- package/dist/cli/chunks/{chunk-KJ3KBP24.js → chunk-YFOBQSOW.js} +2 -2
- package/dist/cli/chunks/{chunk-MB4VFAJC.js → chunk-YK3NOC2R.js} +2 -2
- package/dist/cli/chunks/{chunk-GRIPCYW5.js → chunk-YUC7RJGR.js} +1 -1
- package/dist/cli/chunks/{chunk-HPLMX62I.js → chunk-Z3VJLWRR.js} +2 -2
- package/dist/cli/chunks/{chunk-EOR3RECZ.js → chunk-ZLVQSEZK.js} +2 -2
- package/dist/cli/chunks/{chunk-4AZP7ZCW.js → chunk-ZRLNACPY.js} +2 -2
- package/dist/cli/chunks/{chunk-OQDC7GCM.js → chunk-ZTMZFF25.js} +2 -2
- package/dist/cli/chunks/chunk-ZUMDDMDE.js +3 -0
- package/dist/cli/chunks/ci-5HEXJZ2C.js +81 -0
- package/dist/cli/chunks/{ci-config-XDDZOOEI.js → ci-config-WU4NPDAM.js} +2 -2
- package/dist/cli/chunks/{ci-output-7ZUQI4U6.js → ci-output-BJQVXX5E.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-ALXKCFAL.js → circuit-breaker-3BMGTQCB.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-RL7K2NI2.js → claude-flow-setup-GVDGJWMU.js} +2 -2
- package/dist/cli/chunks/client-S7GNYTZ5.js +2 -0
- package/dist/cli/chunks/{cline-installer-2Z2QQKC3.js → cline-installer-V4MRGWVA.js} +2 -2
- package/dist/cli/chunks/{code-QSZTDINQ.js → code-A3TGQPEO.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-5CGR5D3Y.js → code-index-extractor-YJQSYWD3.js} +2 -2
- package/dist/cli/chunks/{codex-installer-7JLSEDE5.js → codex-installer-7N7UQPAH.js} +2 -2
- package/dist/cli/chunks/{completions-U4NBSXEB.js → completions-PPGVYLZS.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-WYZD2YSY.js → complexity-analyzer-XZTFLYV5.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-UPXINJFT.js → continuedev-installer-Z5I57RAH.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-WIVYQRIF.js → copilot-installer-F5YZ6BHB.js} +2 -2
- package/dist/cli/chunks/core-handlers-CUEPOQIO.js +2 -0
- package/dist/cli/chunks/{cost-tracker-RIN4JDDM.js → cost-tracker-GO33ZQAP.js} +2 -2
- package/dist/cli/chunks/coverage-GSHKLY74.js +49 -0
- package/dist/cli/chunks/cross-domain-router-CXN5QFEV.js +2 -0
- package/dist/cli/chunks/{cursor-installer-POM7NGCC.js → cursor-installer-JJ7IVJZB.js} +2 -2
- package/dist/cli/chunks/daemon-3DQCKRYO.js +10 -0
- package/dist/cli/chunks/{daemon-HFGKQ6LB.js → daemon-IRL7QRNE.js} +5 -5
- package/dist/cli/chunks/{dag-attention-scheduler-HJXM7Q5P.js → dag-attention-scheduler-ORXSUHPA.js} +2 -2
- package/dist/cli/chunks/{detect-XKQGLZYN.js → detect-RHU62KRI.js} +2 -2
- package/dist/cli/chunks/{dist-node-SSKB53QL.js → dist-node-3VKV4Z6C.js} +2 -2
- package/dist/cli/chunks/{domain-handler-6BNDHATU.js → domain-handler-SFIML4FK.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-DOX54YE3.js → domain-plugins-CJ4FA3OC.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-FW4ZX3Z7.js → domain-transfer-BCRKPCAA.js} +2 -2
- package/dist/cli/chunks/dream-5AUNJW24.js +2 -0
- package/dist/cli/chunks/embed-and-insert-pattern-VL3HFLPV.js +3 -0
- package/dist/cli/chunks/{eval-K7E4XXBS.js → eval-GGKRI4P5.js} +2 -2
- package/dist/cli/chunks/experience-capture-middleware-F72TIRQY.js +40 -0
- package/dist/cli/chunks/{fast-paths-5JXXTYAG.js → fast-paths-7KOOF3MA.js} +2 -2
- package/dist/cli/chunks/{feature-flags-2CR3CO23.js → feature-flags-FNHBTHBH.js} +2 -2
- package/dist/cli/chunks/{feature-flags-RB72LHOJ.js → feature-flags-IOZEWWFU.js} +2 -2
- package/dist/cli/chunks/file-discovery-AYWF357I.js +2 -0
- package/dist/cli/chunks/{fleet-SDU7QEOA.js → fleet-QX5KXTRC.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-AWCFODUV.js → gnn-wrapper-OH2DOQP7.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-A4PJ3NFP.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-KRS7SSFM.js → hnsw-legacy-bridge-6MLLOGOE.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-OGGCPKPO.js → hnswlib-node-4UDISJ3G.js} +2 -2
- package/dist/cli/chunks/{hooks-XNRNMUBW.js → hooks-NOQJWQ4P.js} +43 -43
- package/dist/cli/chunks/hybrid-backend-LOM54PDD.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-X35LTXYT.js → hypergraph-engine-2OD3APVP.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-M6THKAG6.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-TEPR2ZJD.js → kilocode-installer-RLZYLVQJ.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-RUKHGDEE.js → kiro-installer-LFZOC7VD.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-SDISHO62.js +2 -0
- package/dist/cli/chunks/learning-XRPGLUWR.js +122 -0
- package/dist/cli/chunks/{llm-router-7GECMDCP.js → llm-router-OMK5HYPH.js} +4 -4
- package/dist/cli/chunks/llm-router-service-YTCMRBAN.js +2 -0
- package/dist/cli/chunks/{load-NTJ4Y4ZR.js → load-XADC7KCU.js} +2 -2
- package/dist/cli/chunks/load-test-RPKHLBCC.js +2 -0
- package/dist/cli/chunks/{mcp-4335GTTG.js → mcp-PIBKSSVU.js} +2 -2
- package/dist/cli/chunks/{memory-HYC4M4XS.js → memory-AP7EZERS.js} +5 -5
- package/dist/cli/chunks/memory-backend-BZXFO4JZ.js +2 -0
- package/dist/cli/chunks/memory-handlers-MOFDNB6E.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-T7FYKM6T.js → multi-model-executor-7JJ2FZ33.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-3USXVT5M.js → opencode-installer-ZZZ6EBYJ.js} +2 -2
- package/dist/cli/chunks/orchestrator-2H2YKSGJ.js +452 -0
- package/dist/cli/chunks/pattern-null-store-4PRPIOR6.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-CMZLPX2K.js → pattern-usage-recorder-7MJJWC2Z.js} +2 -2
- package/dist/cli/chunks/{pipeline-BTRZOVSL.js → pipeline-LIE5BWQY.js} +2 -2
- package/dist/cli/chunks/{platform-2MCRKC25.js → platform-SMYUNLGX.js} +2 -2
- package/dist/cli/chunks/plugin-LJDIXQNT.js +27 -0
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-TXFEMBP6.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-DZ26OYVZ.js → protocol-handler-YVM66DLI.js} +2 -2
- package/dist/cli/chunks/{prove-QWONEJWX.js → prove-ZBDT52GD.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-GDZACWKW.js +2 -0
- package/dist/cli/chunks/{quality-WFH54FY7.js → quality-DUKXGDDO.js} +2 -2
- package/dist/cli/chunks/{quality-gate-ONJB7XU7.js → quality-gate-SM3RXF4V.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-LDKLBPD5.js +2 -0
- package/dist/cli/chunks/real-embeddings-4QLQZDB5.js +2 -0
- package/dist/cli/chunks/{ref-validation-HW5Y55ZC.js → ref-validation-M3EO32YQ.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-5OABDNZT.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-CVHVOQTC.js → routing-handler-55FMUACP.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-KKDKFGIQ.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-RFXFU6JD.js +2 -0
- package/dist/cli/chunks/rvf-native-adapter-UXI66OQJ.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-UGUXKIFX.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-YHLLNFHF.js +2 -0
- package/dist/cli/chunks/{shared-rvf-dual-writer-ZSHYG5IA.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-MHZEEYMK.js → standalone-memory-LUHKQAGM.js} +2 -2
- package/dist/cli/chunks/{status-handler-JKXPJ22K.js → status-handler-S6S5PNR7.js} +2 -2
- package/dist/cli/chunks/{structural-health-J4RKCYWF.js → structural-health-PQ7NZAJ4.js} +2 -2
- package/dist/cli/chunks/{sync-PDPORHVN.js → sync-Q6KRQXU6.js} +2 -2
- package/dist/cli/chunks/sync-S744AEJC.js +2 -0
- package/dist/cli/chunks/{task-handler-VERADM44.js → task-handler-GAMGEHUW.js} +2 -2
- package/dist/cli/chunks/{task-handlers-4RUCWUR2.js → task-handlers-6CRDEELN.js} +3 -3
- package/dist/cli/chunks/{test-DMBJFQNL.js → test-FNH67DBK.js} +12 -12
- package/dist/cli/chunks/{test-scheduling-LUPTVGCD.js → test-scheduling-NZA5SHK6.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-CXKG55JD.js +2 -0
- package/dist/cli/chunks/{token-usage-VOA34IKM.js → token-usage-M7WWEDJX.js} +2 -2
- package/dist/cli/chunks/{transformers-GU4TYAN5.js → transformers-2IFMCK6A.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-MZPXAH7C.js → tree-sitter-wasm-parser-NMNA6RJC.js} +2 -2
- package/dist/cli/chunks/{types-K4FLXR2K.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-M3ATDRMK.js → upgrade-KDB5RGL7.js} +2 -2
- package/dist/cli/chunks/{validate-AAP773B3.js → validate-KMUV5FUA.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-7RGAZX5F.js → validate-swarm-ANZWRCJU.js} +2 -2
- package/dist/cli/chunks/visual-security-GXYZV7KR.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-GQMRHGGI.js → web-tree-sitter-SXXC4NMS.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-HG6HF2GF.js → windsurf-installer-2LWSKMBU.js} +2 -2
- package/dist/cli/chunks/witness-chain-52PEIEGK.js +2 -0
- package/dist/cli/chunks/{witness-chain-WKU3ZIBQ.js → witness-chain-JJMSJFZP.js} +2 -2
- package/dist/cli/chunks/witness-chain-repair-OX7VFW6T.js +2 -0
- package/dist/cli/chunks/{witness-chain-verifier-Q2KW3QEQ.js → witness-chain-verifier-QLSMXHAZ.js} +2 -2
- package/dist/cli/chunks/witness-key-manager-3DS4L7LE.js +2 -0
- package/dist/cli/chunks/{workflow-CX6SHFBW.js → workflow-ARWAMHD3.js} +28 -28
- package/dist/cli/chunks/workflow-orchestrator-DORMQMG7.js +2 -0
- package/dist/cli/chunks/wrappers-J6KGTUSJ.js +2 -0
- package/dist/cli/commands/ci.js +47 -25
- package/dist/cli/commands/coverage.d.ts +1 -28
- package/dist/cli/commands/coverage.js +63 -134
- package/dist/cli/commands/daemon.js +7 -1
- package/dist/cli/commands/hooks-handlers/stats-hooks.d.ts +15 -0
- package/dist/cli/commands/hooks-handlers/stats-hooks.js +54 -2
- package/dist/cli/commands/learning.js +50 -9
- package/dist/cli/commands/security.d.ts +16 -0
- package/dist/cli/commands/security.js +76 -9
- package/dist/cli/commands/test.js +6 -7
- package/dist/cli/commands/workflow.js +9 -5
- package/dist/cli/handlers/init-guard.d.ts +33 -0
- package/dist/cli/handlers/init-guard.js +66 -0
- package/dist/cli/handlers/init-handler.d.ts +3 -0
- package/dist/cli/handlers/init-handler.js +64 -54
- package/dist/cli/handlers/interfaces.js +5 -1
- package/dist/cli/index.js +11 -0
- package/dist/cli/scheduler/persistent-scheduler.d.ts +6 -2
- package/dist/cli/scheduler/persistent-scheduler.js +107 -41
- package/dist/cli/utils/ci-output.d.ts +13 -1
- package/dist/cli/utils/ci-output.js +21 -2
- package/dist/cli/utils/coverage-data.d.ts +3 -0
- package/dist/cli/utils/coverage-data.js +14 -39
- package/dist/cli/utils/coverage-verdict.d.ts +130 -0
- package/dist/cli/utils/coverage-verdict.js +193 -0
- package/dist/cli/utils/file-discovery.js +5 -0
- package/dist/coordination/deterministic-actions.js +24 -13
- package/dist/coordination/handlers/code-intelligence-handlers.d.ts +8 -0
- package/dist/coordination/handlers/code-intelligence-handlers.js +39 -0
- package/dist/coordination/handlers/coverage-handlers.js +34 -6
- package/dist/coordination/handlers/coverage-runner.d.ts +22 -0
- package/dist/coordination/handlers/coverage-runner.js +105 -10
- package/dist/coordination/handlers/coverage-target.d.ts +1 -0
- package/dist/coordination/handlers/coverage-target.js +4 -1
- package/dist/coordination/handlers/handler-types.d.ts +9 -0
- package/dist/coordination/handlers/handler-utils.d.ts +14 -1
- package/dist/coordination/handlers/handler-utils.js +46 -22
- package/dist/coordination/handlers/quality-handlers.js +108 -18
- package/dist/coordination/handlers/security-handlers.js +22 -6
- package/dist/coordination/handlers/test-execution-handlers.js +4 -1
- package/dist/coordination/protocols/defect-investigation.d.ts +2 -1
- package/dist/coordination/protocols/defect-investigation.js +12 -3
- package/dist/coordination/protocols/quality-gate.js +10 -6
- package/dist/coordination/protocols/security-audit.js +11 -0
- package/dist/coordination/result-saver.d.ts +31 -0
- package/dist/coordination/result-saver.js +146 -46
- package/dist/coordination/task-executor.d.ts +7 -0
- package/dist/coordination/task-executor.js +32 -3
- package/dist/domains/code-intelligence/plugin.js +4 -0
- package/dist/domains/code-intelligence/services/metric-collector/index.js +9 -2
- package/dist/domains/code-intelligence/services/metric-collector/interfaces.d.ts +21 -0
- package/dist/domains/code-intelligence/services/metric-collector/interfaces.js +25 -0
- package/dist/domains/code-intelligence/services/metric-collector/loc-counter.d.ts +12 -0
- package/dist/domains/code-intelligence/services/metric-collector/loc-counter.js +69 -3
- package/dist/domains/code-intelligence/services/metric-collector/test-counter.js +4 -1
- package/dist/domains/coverage-analysis/collected-metrics.d.ts +35 -0
- package/dist/domains/coverage-analysis/collected-metrics.js +42 -0
- package/dist/domains/coverage-analysis/coordinator.js +18 -6
- package/dist/domains/coverage-analysis/interfaces.d.ts +44 -0
- package/dist/domains/coverage-analysis/interfaces.js +6 -1
- package/dist/domains/coverage-analysis/services/coverage-analyzer.js +61 -34
- package/dist/domains/coverage-analysis/services/gap-detector.js +7 -2
- package/dist/domains/defect-intelligence/plugin.js +4 -0
- package/dist/domains/defect-intelligence/services/defect-predictor.js +13 -8
- package/dist/domains/learning-optimization/coordinator.js +4 -0
- package/dist/domains/learning-optimization/plugin.js +4 -0
- package/dist/domains/quality-assessment/coordinator-rl-integration.d.ts +14 -0
- package/dist/domains/quality-assessment/coordinator-rl-integration.js +54 -16
- package/dist/domains/quality-assessment/coordinator.js +10 -6
- package/dist/domains/quality-assessment/coverage-report-event.d.ts +32 -8
- package/dist/domains/quality-assessment/coverage-report-event.js +28 -6
- package/dist/domains/quality-assessment/index.d.ts +1 -1
- package/dist/domains/quality-assessment/interfaces.d.ts +50 -0
- package/dist/domains/quality-assessment/quality-evidence.d.ts +49 -3
- package/dist/domains/quality-assessment/quality-evidence.js +62 -0
- package/dist/domains/quality-assessment/services/quality-analyzer.d.ts +23 -2
- package/dist/domains/quality-assessment/services/quality-analyzer.js +197 -112
- 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/dast-scanner.js +22 -16
- 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/interfaces.d.ts +10 -6
- package/dist/domains/test-execution/plugin.js +4 -0
- 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 +239 -109
- package/dist/domains/test-generation/coordinator.js +4 -0
- package/dist/domains/test-generation/plugin.js +4 -0
- package/dist/feedback/coverage-learner.js +4 -1
- package/dist/feedback/coverage-session-provenance.d.ts +29 -0
- package/dist/feedback/coverage-session-provenance.js +39 -0
- package/dist/init/orchestrator.js +2 -0
- package/dist/init/phases/09-assets.d.ts +4 -0
- package/dist/init/phases/09-assets.js +35 -0
- package/dist/init/retired-assets.d.ts +86 -0
- package/dist/init/retired-assets.js +230 -0
- package/dist/init/skills-installer.d.ts +2 -0
- package/dist/init/skills-installer.js +4 -0
- package/dist/init/types.d.ts +3 -0
- package/dist/integrations/ruvector/rvf-native-adapter.d.ts +2 -0
- package/dist/integrations/ruvector/rvf-native-adapter.js +5 -0
- package/dist/integrations/ruvector/server-client.js +4 -12
- package/dist/kernel/project-root.d.ts +17 -0
- package/dist/kernel/project-root.js +54 -2
- package/dist/kernel/shared-dirs.d.ts +66 -0
- package/dist/kernel/shared-dirs.js +180 -0
- package/dist/learning/daily-log.js +2 -1
- package/dist/learning/experience-capture-middleware.d.ts +22 -0
- package/dist/learning/experience-capture-middleware.js +35 -0
- package/dist/learning/learnable-result.d.ts +16 -0
- package/dist/learning/learnable-result.js +24 -0
- package/dist/learning/pattern-mutation-error.d.ts +8 -0
- package/dist/learning/pattern-mutation-error.js +12 -0
- package/dist/learning/qe-reasoning-bank.d.ts +10 -0
- package/dist/learning/qe-reasoning-bank.js +50 -1
- package/dist/learning/rvf-reconcile.d.ts +39 -0
- package/dist/learning/rvf-reconcile.js +40 -0
- package/dist/learning/sqlite-persistence.d.ts +14 -0
- package/dist/learning/sqlite-persistence.js +36 -0
- package/dist/mcp/bundle.js +908 -896
- package/dist/mcp/handlers/domain-handler-configs.d.ts +35 -1
- package/dist/mcp/handlers/domain-handler-configs.js +42 -4
- package/dist/mcp/handlers/handler-factory.js +40 -14
- package/dist/mcp/protocol-server.js +29 -3
- package/dist/mcp/tool-cache-scope.d.ts +31 -0
- package/dist/mcp/tool-cache-scope.js +71 -0
- package/dist/mcp/tools/code-intelligence/analyze.js +5 -3
- package/dist/mcp/types.d.ts +10 -0
- package/dist/optimization/session-cache.d.ts +19 -1
- package/dist/optimization/session-cache.js +36 -2
- package/dist/plugins/cache.js +2 -1
- package/dist/plugins/sources/github.js +2 -1
- package/dist/plugins/sources/npm.js +2 -1
- package/dist/shared/aqe-managed-dirs.d.ts +24 -0
- package/dist/shared/aqe-managed-dirs.js +56 -0
- package/dist/shared/events/domain-events.d.ts +18 -3
- package/dist/shared/events/domain-events.js +4 -0
- package/dist/shared/http/http-client.d.ts +6 -0
- package/dist/shared/http/http-client.js +13 -15
- package/dist/shared/io/file-reader.d.ts +26 -0
- package/dist/shared/io/file-reader.js +111 -17
- package/dist/shared/llm/providers/response-deadline.d.ts +7 -2
- package/dist/shared/llm/providers/response-deadline.js +17 -5
- package/dist/shared/metrics/code-metrics.d.ts +24 -0
- package/dist/shared/metrics/code-metrics.js +93 -6
- package/dist/shared/metrics/index.d.ts +1 -1
- 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 +15 -2
- package/dist/workers/namespaced-keys.d.ts +16 -0
- package/dist/workers/namespaced-keys.js +24 -0
- package/dist/workers/quality-daemon/coverage-delta.d.ts +4 -3
- package/dist/workers/quality-daemon/coverage-delta.js +13 -6
- package/dist/workers/quality-daemon/index.js +6 -5
- package/dist/workers/quality-daemon/notification-service.js +3 -3
- package/dist/workers/quality-daemon/persistent-memory.d.ts +3 -3
- package/dist/workers/quality-daemon/persistent-memory.js +4 -4
- package/dist/workers/worker-manager.js +10 -3
- package/dist/workers/workers/coverage-tracker.js +69 -33
- 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/regression-monitor.d.ts +18 -1
- package/dist/workers/workers/regression-monitor.js +276 -117
- 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-EGIPTX5H.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-WP4GCBDT.js +0 -2
- package/dist/cli/chunks/base-6ORFD62I.js +0 -2
- package/dist/cli/chunks/browser-workflow-PIXGERWP.js +0 -2
- package/dist/cli/chunks/chunk-2WFTZSRT.js +0 -2
- package/dist/cli/chunks/chunk-7YB2KELI.js +0 -5
- package/dist/cli/chunks/chunk-BBL6YXD3.js +0 -2
- package/dist/cli/chunks/chunk-BJ5P4IV2.js +0 -2
- package/dist/cli/chunks/chunk-BO4PKNYP.js +0 -102
- package/dist/cli/chunks/chunk-DFPL5N3Q.js +0 -16
- package/dist/cli/chunks/chunk-DLY4YEN3.js +0 -2
- package/dist/cli/chunks/chunk-ERGWWI4Y.js +0 -3
- package/dist/cli/chunks/chunk-GTSOFCMQ.js +0 -2
- package/dist/cli/chunks/chunk-KZVJW2SD.js +0 -2
- package/dist/cli/chunks/chunk-L336HFFE.js +0 -2
- package/dist/cli/chunks/chunk-N2TJNIHA.js +0 -2
- package/dist/cli/chunks/chunk-RCXMUEZN.js +0 -3
- package/dist/cli/chunks/chunk-SEZLYRCS.js +0 -2
- package/dist/cli/chunks/chunk-TDLKXLJC.js +0 -4
- package/dist/cli/chunks/chunk-WOZIXXY5.js +0 -7
- package/dist/cli/chunks/ci-KP4GZKJ7.js +0 -81
- package/dist/cli/chunks/client-C3KHVRM6.js +0 -2
- package/dist/cli/chunks/core-handlers-KSQM6Q6S.js +0 -2
- package/dist/cli/chunks/coverage-SPFVHRRU.js +0 -43
- package/dist/cli/chunks/coverage-target-GSRBNHXE.js +0 -2
- package/dist/cli/chunks/cross-domain-router-CTGNOVCF.js +0 -2
- package/dist/cli/chunks/daemon-M5TD5Y6T.js +0 -10
- package/dist/cli/chunks/dream-MIK2E4UL.js +0 -2
- package/dist/cli/chunks/embed-and-insert-pattern-QST77T2B.js +0 -3
- package/dist/cli/chunks/experience-capture-middleware-X66IYSRV.js +0 -40
- package/dist/cli/chunks/file-discovery-3NHRUQQB.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-OCKRACUW.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-X67XG73C.js +0 -2
- package/dist/cli/chunks/hnsw-index-I7KCQBQR.js +0 -2
- package/dist/cli/chunks/hybrid-backend-FOUHTKAK.js +0 -2
- package/dist/cli/chunks/impact-analyzer-GXYVX46O.js +0 -2
- package/dist/cli/chunks/init-handler-2AXMXHYF.js +0 -86
- package/dist/cli/chunks/init-wizard-C2MRX2QG.js +0 -2
- package/dist/cli/chunks/kernel-Q2IUDIDC.js +0 -2
- package/dist/cli/chunks/knowledge-graph-E2Z6K5EE.js +0 -2
- package/dist/cli/chunks/learning-BEA26RNA.js +0 -122
- package/dist/cli/chunks/llm-router-service-YATYFEDD.js +0 -2
- package/dist/cli/chunks/load-test-LV77JXWA.js +0 -2
- package/dist/cli/chunks/memory-backend-XME3X3QX.js +0 -2
- package/dist/cli/chunks/memory-handlers-VG47X5DX.js +0 -2
- package/dist/cli/chunks/orchestrator-VHUXUYIM.js +0 -452
- package/dist/cli/chunks/pattern-null-store-TAXMLENP.js +0 -2
- package/dist/cli/chunks/plugin-2VAYWAO3.js +0 -27
- package/dist/cli/chunks/project-root-CFFPBGPX.js +0 -2
- package/dist/cli/chunks/protocol-executor-ML76QAVQ.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-LUZH6RYV.js +0 -2
- package/dist/cli/chunks/queen-coordinator-EWXNIXB6.js +0 -2
- package/dist/cli/chunks/real-embeddings-GZV4VKK4.js +0 -2
- package/dist/cli/chunks/router-MXOBVEBF.js +0 -2
- package/dist/cli/chunks/routing-feedback-T6CCRUEK.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-WHXVT3V3.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-JFPWIRCG.js +0 -2
- package/dist/cli/chunks/rvf-migration-coordinator-D4KUBNRZ.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-KOXR7TJL.js +0 -2
- package/dist/cli/chunks/safe-db-CI6IPSIN.js +0 -2
- package/dist/cli/chunks/schedule-X4HW6TVJ.js +0 -2
- package/dist/cli/chunks/scheduler-KCNJ2ON3.js +0 -2
- package/dist/cli/chunks/security-7723AZZ4.js +0 -13
- package/dist/cli/chunks/shared-rvf-adapter-KEQ5CLNI.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-PGHU6VUR.js +0 -2
- package/dist/cli/chunks/sync-EFWXMA2H.js +0 -2
- package/dist/cli/chunks/token-bootstrap-S346YBVO.js +0 -2
- package/dist/cli/chunks/unified-memory-6CK3TUNQ.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-A7BWBGYN.js +0 -2
- package/dist/cli/chunks/unified-persistence-GEPMDBQZ.js +0 -2
- package/dist/cli/chunks/visual-security-L4J7LQWT.js +0 -2
- package/dist/cli/chunks/witness-chain-CDUMX623.js +0 -2
- package/dist/cli/chunks/witness-chain-repair-WNYH6O4L.js +0 -2
- package/dist/cli/chunks/witness-key-manager-NQ5DAAC4.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-USJDWVDR.js +0 -2
- package/dist/cli/chunks/wrappers-CZDI6Z3X.js +0 -2
- /package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.test.ts → budget-tests.ts.fixture} +0 -0
- /package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.ts → budget.ts.fixture} +0 -0
- /package/.claude/skills/testability-scoring/resources/templates/{testability-scoring.spec.template.js → testability-scoring-spec.template.js} +0 -0
- /package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.test.ts → budget-tests.ts.fixture} +0 -0
- /package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.ts → budget.ts.fixture} +0 -0
- /package/assets/skills/testability-scoring/resources/templates/{testability-scoring.spec.template.js → testability-scoring-spec.template.js} +0 -0
|
@@ -30,6 +30,18 @@ import * as os from 'os';
|
|
|
30
30
|
import * as path from 'path';
|
|
31
31
|
import { safeJsonParse } from '../../shared/safe-json.js';
|
|
32
32
|
import { loadCoverageReportFile } from './coverage-target.js';
|
|
33
|
+
/**
|
|
34
|
+
* Outcome of a coverage run's tests (#1027 NB2): 'failed' when the runner's
|
|
35
|
+
* own result reports a failed test or test suite, 'passed' when it reports
|
|
36
|
+
* none — whatever the exit code (a coverage-threshold failure exits 1 with
|
|
37
|
+
* every test passing). Without counts (nyc), the exit code decides.
|
|
38
|
+
*/
|
|
39
|
+
export function testRunStatus(run) {
|
|
40
|
+
if (typeof run.numFailedTests === 'number' || typeof run.numFailedTestSuites === 'number') {
|
|
41
|
+
return (run.numFailedTests ?? 0) > 0 || (run.numFailedTestSuites ?? 0) > 0 ? 'failed' : 'passed';
|
|
42
|
+
}
|
|
43
|
+
return run.exitedCleanly ? 'passed' : 'failed';
|
|
44
|
+
}
|
|
33
45
|
const RESULTS_FILE = 'test-results.json';
|
|
34
46
|
const STDERR_TAIL_BYTES = 2048;
|
|
35
47
|
const STDERR_HEAD_BYTES = 4096;
|
|
@@ -92,13 +104,79 @@ function readDeps(projectRoot) {
|
|
|
92
104
|
return {};
|
|
93
105
|
}
|
|
94
106
|
}
|
|
107
|
+
const RUNNER_DEPS = ['jest', '@jest/core', 'mocha', 'nyc', 'vitest'];
|
|
108
|
+
/**
|
|
109
|
+
* The project and its ancestors up to the repository / workspace root: the
|
|
110
|
+
* project itself, then each parent, stopping after the directory holding
|
|
111
|
+
* `.git` (or a `workspaces` manifest), at $HOME, or after `maxDepth` levels.
|
|
112
|
+
*/
|
|
113
|
+
function projectAndAncestors(projectRoot, maxDepth = 10) {
|
|
114
|
+
const dirs = [];
|
|
115
|
+
let home = null;
|
|
116
|
+
try {
|
|
117
|
+
home = fs.realpathSync(os.homedir());
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
home = null;
|
|
121
|
+
}
|
|
122
|
+
let dir = path.resolve(projectRoot);
|
|
123
|
+
for (let i = 0; i <= maxDepth; i++) {
|
|
124
|
+
if (i > 0 && home !== null && dir === home)
|
|
125
|
+
break;
|
|
126
|
+
dirs.push(dir);
|
|
127
|
+
if (fs.existsSync(path.join(dir, '.git')) || isWorkspaceRoot(dir))
|
|
128
|
+
break;
|
|
129
|
+
const parent = path.dirname(dir);
|
|
130
|
+
if (parent === dir)
|
|
131
|
+
break;
|
|
132
|
+
dir = parent;
|
|
133
|
+
}
|
|
134
|
+
return dirs;
|
|
135
|
+
}
|
|
136
|
+
function isWorkspaceRoot(dir) {
|
|
137
|
+
try {
|
|
138
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf-8'));
|
|
139
|
+
return pkg.workspaces !== undefined;
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Dependencies that decide the runner (#1012): the package's own when it
|
|
147
|
+
* declares a test runner, otherwise those of the nearest ancestor (workspace
|
|
148
|
+
* root) that does. A package of a monorepo whose jest is declared only at the
|
|
149
|
+
* root runs jest, not the vitest default.
|
|
150
|
+
*/
|
|
151
|
+
function readRunnerDeps(projectRoot) {
|
|
152
|
+
for (const dir of projectAndAncestors(projectRoot)) {
|
|
153
|
+
const deps = readDeps(dir);
|
|
154
|
+
if (RUNNER_DEPS.some(d => deps[d]))
|
|
155
|
+
return deps;
|
|
156
|
+
}
|
|
157
|
+
return {};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Every `node_modules/.bin` from the project up to the workspace root,
|
|
161
|
+
* nearest first. Runners that shell out to sibling tools (nyc → mocha) need
|
|
162
|
+
* the hoisted ones too (#1012).
|
|
163
|
+
*/
|
|
164
|
+
export function runnerBinDirs(projectRoot) {
|
|
165
|
+
return projectAndAncestors(projectRoot)
|
|
166
|
+
.map(dir => path.join(dir, 'node_modules', '.bin'))
|
|
167
|
+
.filter(dir => fs.existsSync(dir));
|
|
168
|
+
}
|
|
169
|
+
/** Is the project installed with Yarn Plug'n'Play (no node_modules to resolve from)? */
|
|
170
|
+
function usesPlugNPlay(projectRoot) {
|
|
171
|
+
return projectAndAncestors(projectRoot).some(dir => fs.existsSync(path.join(dir, '.pnp.cjs')) || fs.existsSync(path.join(dir, '.pnp.js')));
|
|
172
|
+
}
|
|
95
173
|
/**
|
|
96
174
|
* Pick the runner and its argv. No shell is involved: `command` is the Node
|
|
97
175
|
* binary and `args[0]` the runner's JS entry, so paths are passed verbatim.
|
|
98
176
|
*/
|
|
99
177
|
export function buildJsCoverageInvocation(projectRoot, reportDir) {
|
|
100
178
|
const resultsFile = path.join(reportDir, RESULTS_FILE);
|
|
101
|
-
const deps =
|
|
179
|
+
const deps = readRunnerDeps(projectRoot);
|
|
102
180
|
let runner = 'vitest';
|
|
103
181
|
let runnerArgs;
|
|
104
182
|
let results = resultsFile;
|
|
@@ -117,8 +195,10 @@ export function buildJsCoverageInvocation(projectRoot, reportDir) {
|
|
|
117
195
|
// vitest is the default — covers vitest, @vitest/coverage-v8, etc.
|
|
118
196
|
// Plain `--outputFile=` (not `.json=`): it overrides a string, object, or
|
|
119
197
|
// absent `outputFile` in the user's config alike.
|
|
198
|
+
// #1027 N4: vitest writes no coverage when a test fails unless asked;
|
|
199
|
+
// coverage from a failing suite is still a measurement (runStatus 'failed').
|
|
120
200
|
runnerArgs = ['run', '--coverage', `--coverage.reportsDirectory=${reportDir}`,
|
|
121
|
-
'--coverage.reporter=json', '--reporter=json', `--outputFile=${resultsFile}`];
|
|
201
|
+
'--coverage.reporter=json', '--coverage.reportOnFailure=true', '--reporter=json', `--outputFile=${resultsFile}`];
|
|
122
202
|
}
|
|
123
203
|
const bin = findPackageBin(projectRoot, runner === 'jest' ? 'jest' : runner);
|
|
124
204
|
return {
|
|
@@ -128,15 +208,23 @@ export function buildJsCoverageInvocation(projectRoot, reportDir) {
|
|
|
128
208
|
resultsFile: results,
|
|
129
209
|
};
|
|
130
210
|
}
|
|
131
|
-
|
|
211
|
+
const NO_COUNTS = {
|
|
212
|
+
numTotalTests: null, numPassedTests: null, numFailedTests: null, numPendingTests: null, numFailedTestSuites: null,
|
|
213
|
+
};
|
|
214
|
+
/** Test counts from the runner's own JSON result (vitest/jest share the shape). */
|
|
215
|
+
function readRunCounts(resultsFile) {
|
|
132
216
|
if (!resultsFile)
|
|
133
|
-
return
|
|
217
|
+
return NO_COUNTS;
|
|
134
218
|
try {
|
|
135
219
|
const parsed = JSON.parse(fs.readFileSync(resultsFile, 'utf-8'));
|
|
136
|
-
|
|
220
|
+
const n = (k) => (typeof parsed[k] === 'number' ? parsed[k] : null);
|
|
221
|
+
return {
|
|
222
|
+
numTotalTests: n('numTotalTests'), numPassedTests: n('numPassedTests'), numFailedTests: n('numFailedTests'),
|
|
223
|
+
numPendingTests: n('numPendingTests'), numFailedTestSuites: n('numFailedTestSuites'),
|
|
224
|
+
};
|
|
137
225
|
}
|
|
138
226
|
catch {
|
|
139
|
-
return
|
|
227
|
+
return NO_COUNTS;
|
|
140
228
|
}
|
|
141
229
|
}
|
|
142
230
|
/**
|
|
@@ -311,15 +399,16 @@ export async function runJsCoverage(projectRoot, options = {}) {
|
|
|
311
399
|
timeoutMs, data: null, numTotalTests: null, stderrTail: '',
|
|
312
400
|
};
|
|
313
401
|
}
|
|
314
|
-
// Runners that shell out to sibling tools (nyc → mocha) find them here
|
|
315
|
-
|
|
402
|
+
// Runners that shell out to sibling tools (nyc → mocha) find them here,
|
|
403
|
+
// including hoisted workspace-root installs (#1012).
|
|
404
|
+
const binDirs = runnerBinDirs(projectRoot);
|
|
316
405
|
// The runner's own temp files (vite's SSR cache, etc.) go inside reportDir
|
|
317
406
|
// too, so a killed run leaves nothing behind in the system temp dir.
|
|
318
407
|
const runnerTmp = path.join(reportDir, 'tmp');
|
|
319
408
|
fs.mkdirSync(runnerTmp);
|
|
320
409
|
const env = {
|
|
321
410
|
...process.env,
|
|
322
|
-
PATH:
|
|
411
|
+
PATH: [...binDirs, process.env.PATH ?? ''].join(path.delimiter),
|
|
323
412
|
TMPDIR: runnerTmp, TMP: runnerTmp, TEMP: runnerTmp,
|
|
324
413
|
};
|
|
325
414
|
const run = await runProcessTree(inv.command, inv.args, {
|
|
@@ -334,7 +423,7 @@ export async function runJsCoverage(projectRoot, options = {}) {
|
|
|
334
423
|
timedOut: run.timedOut,
|
|
335
424
|
timeoutMs,
|
|
336
425
|
data,
|
|
337
|
-
|
|
426
|
+
...(run.timedOut ? NO_COUNTS : readRunCounts(inv.resultsFile)),
|
|
338
427
|
stderrTail: run.stderrTail,
|
|
339
428
|
};
|
|
340
429
|
}
|
|
@@ -350,6 +439,12 @@ export async function runJsCoverage(projectRoot, options = {}) {
|
|
|
350
439
|
* Never "No instrumentation ran" when the runner did run and failed.
|
|
351
440
|
*/
|
|
352
441
|
export function describeRunFailure(run, projectRoot) {
|
|
442
|
+
if (run.missing && usesPlugNPlay(projectRoot)) {
|
|
443
|
+
return `${run.runner} could not be resolved for ${projectRoot}: this project uses Yarn Plug'n'Play, ` +
|
|
444
|
+
'and agentic-qe resolves test runners only from node_modules. Nothing was run and nothing was downloaded. ' +
|
|
445
|
+
`Generate a coverage report (e.g. \`yarn ${run.runner} --coverage\`) and pass it as the target, ` +
|
|
446
|
+
'or use the node-modules linker.';
|
|
447
|
+
}
|
|
353
448
|
if (run.missing) {
|
|
354
449
|
return `${run.runner} is not installed in ${projectRoot} (no node_modules/${run.runner} found); ` +
|
|
355
450
|
'nothing was run and nothing was downloaded. Install it, or generate a coverage report and pass it as the target.';
|
|
@@ -254,7 +254,10 @@ export async function resolveExistingCoverage(targetPath) {
|
|
|
254
254
|
* report) is null, and a null must not drag the average down as a fake 0.
|
|
255
255
|
*/
|
|
256
256
|
export function thresholdVerdict(summary, threshold, collected) {
|
|
257
|
-
|
|
257
|
+
// #1027 N7: lcov / Cobertura carry no statement data; it is left out too.
|
|
258
|
+
const metrics = [summary.line];
|
|
259
|
+
if (collected.statement !== false)
|
|
260
|
+
metrics.push(summary.statement);
|
|
258
261
|
if (collected.branch)
|
|
259
262
|
metrics.push(summary.branch);
|
|
260
263
|
if (collected.function)
|
|
@@ -11,7 +11,10 @@ import type { CoverageAnalyzerService } from '../../domains/coverage-analysis';
|
|
|
11
11
|
import type { SecurityScannerService } from '../../domains/security-compliance';
|
|
12
12
|
import type { TestGeneratorService } from '../../domains/test-generation';
|
|
13
13
|
import type { KnowledgeGraphService } from '../../domains/code-intelligence';
|
|
14
|
+
import type { ICodeIntelligenceCoordinator } from '../../domains/code-intelligence/coordinator';
|
|
14
15
|
import type { QualityAnalyzerService } from '../../domains/quality-assessment';
|
|
16
|
+
/** The coordinator surface the MCP index-code handler needs (#999). */
|
|
17
|
+
export type ProjectMetricsCollector = Pick<ICodeIntelligenceCoordinator, 'collectProjectMetrics'>;
|
|
15
18
|
/** Signature of a single task handler */
|
|
16
19
|
export type InstanceTaskHandler = (task: QueenTask) => Promise<Result<unknown, Error>>;
|
|
17
20
|
/**
|
|
@@ -33,6 +36,12 @@ export interface TaskHandlerContext {
|
|
|
33
36
|
*/
|
|
34
37
|
getTestGenerator(useLLM?: boolean): Promise<TestGeneratorService>;
|
|
35
38
|
getKnowledgeGraph(): KnowledgeGraphService;
|
|
39
|
+
/**
|
|
40
|
+
* #999 MCP-CLI parity: the code-intelligence coordinator, whose
|
|
41
|
+
* collectProjectMetrics step `aqe code index` runs. Resolves to undefined when
|
|
42
|
+
* the domain is unavailable. Optional so lightweight contexts can omit it.
|
|
43
|
+
*/
|
|
44
|
+
getCodeIntelligenceCoordinator?(): Promise<ProjectMetricsCollector | undefined>;
|
|
36
45
|
getQualityAnalyzer(): QualityAnalyzerService;
|
|
37
46
|
/** Executor configuration */
|
|
38
47
|
readonly config: {
|
|
@@ -75,7 +75,20 @@ export interface IstanbulFileCoverage {
|
|
|
75
75
|
*/
|
|
76
76
|
export declare function loadCoverageData(targetPath: string): Promise<CoverageData | null>;
|
|
77
77
|
/**
|
|
78
|
-
*
|
|
78
|
+
* Per-line hit counts of one istanbul file entry, computed the way istanbul's
|
|
79
|
+
* own `FileCoverage#getLineCoverage` (and therefore coverage-summary.json
|
|
80
|
+
* `lines` and lcov.info `DA:` records) does: each statement counts on its
|
|
81
|
+
* START line, and a line's count is the highest count of the statements that
|
|
82
|
+
* start on it. A line is covered when any statement on it ran (#1012).
|
|
83
|
+
*/
|
|
84
|
+
export declare function istanbulLineHits(fd: Pick<IstanbulFileCoverage, 'statementMap' | 's'>): Map<number, number>;
|
|
85
|
+
/**
|
|
86
|
+
* Parse Istanbul/nyc coverage-final.json format.
|
|
87
|
+
*
|
|
88
|
+
* #1012: `lines` are SOURCE LINES (derived from `statementMap` start lines,
|
|
89
|
+
* as istanbul's own summary does), not statements. Before, statement counts
|
|
90
|
+
* were reported as "line", so one project had two different line figures
|
|
91
|
+
* depending on whether coverage-final.json or lcov.info was read.
|
|
79
92
|
*/
|
|
80
93
|
export declare function parseCoverageJson(content: string): CoverageData;
|
|
81
94
|
/**
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import * as fs from 'fs/promises';
|
|
8
8
|
import * as path from 'path';
|
|
9
|
+
import { isAqeManagedDir } from '../../shared/aqe-managed-dirs.js';
|
|
9
10
|
import { safeJsonParse } from '../../shared/safe-json.js';
|
|
10
11
|
// ============================================================================
|
|
11
12
|
// Coverage Data Loaders
|
|
@@ -52,7 +53,32 @@ export async function loadCoverageData(targetPath) {
|
|
|
52
53
|
return null;
|
|
53
54
|
}
|
|
54
55
|
/**
|
|
55
|
-
*
|
|
56
|
+
* Per-line hit counts of one istanbul file entry, computed the way istanbul's
|
|
57
|
+
* own `FileCoverage#getLineCoverage` (and therefore coverage-summary.json
|
|
58
|
+
* `lines` and lcov.info `DA:` records) does: each statement counts on its
|
|
59
|
+
* START line, and a line's count is the highest count of the statements that
|
|
60
|
+
* start on it. A line is covered when any statement on it ran (#1012).
|
|
61
|
+
*/
|
|
62
|
+
export function istanbulLineHits(fd) {
|
|
63
|
+
const lineHits = new Map();
|
|
64
|
+
const statementMap = fd.statementMap || {};
|
|
65
|
+
for (const [id, count] of Object.entries(fd.s || {})) {
|
|
66
|
+
const line = statementMap[id]?.start?.line;
|
|
67
|
+
if (typeof line !== 'number')
|
|
68
|
+
continue;
|
|
69
|
+
const prev = lineHits.get(line);
|
|
70
|
+
if (prev === undefined || prev < count)
|
|
71
|
+
lineHits.set(line, count);
|
|
72
|
+
}
|
|
73
|
+
return lineHits;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Parse Istanbul/nyc coverage-final.json format.
|
|
77
|
+
*
|
|
78
|
+
* #1012: `lines` are SOURCE LINES (derived from `statementMap` start lines,
|
|
79
|
+
* as istanbul's own summary does), not statements. Before, statement counts
|
|
80
|
+
* were reported as "line", so one project had two different line figures
|
|
81
|
+
* depending on whether coverage-final.json or lcov.info was read.
|
|
56
82
|
*/
|
|
57
83
|
export function parseCoverageJson(content) {
|
|
58
84
|
const data = safeJsonParse(content);
|
|
@@ -63,30 +89,21 @@ export function parseCoverageJson(content) {
|
|
|
63
89
|
let totalStatements = 0, coveredStatements = 0;
|
|
64
90
|
for (const [filePath, fileData] of Object.entries(data)) {
|
|
65
91
|
const fd = fileData;
|
|
66
|
-
|
|
67
|
-
const lineMap = fd.statementMap || {};
|
|
68
|
-
const lineCounts = fd.s || {};
|
|
92
|
+
const statementCounts = fd.s || {};
|
|
69
93
|
const branchMap = fd.branchMap || {};
|
|
70
94
|
const branchCounts = fd.b || {};
|
|
71
95
|
const fnCounts = fd.f || {};
|
|
72
|
-
const
|
|
73
|
-
const
|
|
96
|
+
const lineHits = istanbulLineHits(fd);
|
|
97
|
+
const fileLines = lineHits.size;
|
|
98
|
+
const fileCoveredLines = [...lineHits.values()].filter(v => v > 0).length;
|
|
74
99
|
const fileBranches = Object.values(branchCounts).flat().length;
|
|
75
100
|
const fileCoveredBranches = Object.values(branchCounts).flat().filter((v) => v > 0).length;
|
|
76
101
|
const fileFunctions = Object.keys(fnCounts).length;
|
|
77
102
|
const fileCoveredFunctions = Object.values(fnCounts).filter((v) => v > 0).length;
|
|
78
|
-
const fileStatements = Object.keys(
|
|
79
|
-
const fileCoveredStatements = Object.values(
|
|
80
|
-
//
|
|
81
|
-
const uncoveredLines = [];
|
|
82
|
-
for (const [key, count] of Object.entries(lineCounts)) {
|
|
83
|
-
if (count === 0) {
|
|
84
|
-
const stmtInfo = lineMap[key];
|
|
85
|
-
if (stmtInfo?.start?.line) {
|
|
86
|
-
uncoveredLines.push(stmtInfo.start.line);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
103
|
+
const fileStatements = Object.keys(statementCounts).length;
|
|
104
|
+
const fileCoveredStatements = Object.values(statementCounts).filter((v) => v > 0).length;
|
|
105
|
+
// Uncovered lines: lines no statement on which ran.
|
|
106
|
+
const uncoveredLines = [...lineHits.entries()].filter(([, hits]) => hits === 0).map(([line]) => line);
|
|
90
107
|
// Find uncovered branches
|
|
91
108
|
const uncoveredBranches = [];
|
|
92
109
|
for (const [branchId, counts] of Object.entries(branchCounts)) {
|
|
@@ -103,7 +120,7 @@ export function parseCoverageJson(content) {
|
|
|
103
120
|
branches: { covered: fileCoveredBranches, total: fileBranches },
|
|
104
121
|
functions: { covered: fileCoveredFunctions, total: fileFunctions },
|
|
105
122
|
statements: { covered: fileCoveredStatements, total: fileStatements },
|
|
106
|
-
uncoveredLines:
|
|
123
|
+
uncoveredLines: uncoveredLines.sort((a, b) => a - b),
|
|
107
124
|
uncoveredBranches: Array.from(new Set(uncoveredBranches)).sort((a, b) => a - b),
|
|
108
125
|
});
|
|
109
126
|
totalLines += fileLines;
|
|
@@ -218,7 +235,8 @@ export function parseLcovInfo(content) {
|
|
|
218
235
|
lines: { covered: linesCovered, total: linesTotal },
|
|
219
236
|
branches: { covered: branchesCovered, total: branchesTotal },
|
|
220
237
|
functions: { covered: functionsCovered, total: functionsTotal },
|
|
221
|
-
|
|
238
|
+
// #1027 N7: lcov has no statement detail — not collected, not a copy of lines.
|
|
239
|
+
statements: { covered: 0, total: 0 },
|
|
222
240
|
uncoveredLines: Array.from(new Set(uncoveredLines)),
|
|
223
241
|
uncoveredBranches: Array.from(new Set(uncoveredBranches)),
|
|
224
242
|
});
|
|
@@ -355,7 +373,8 @@ export function parseCoberturaXml(content) {
|
|
|
355
373
|
lines: { covered: linesCovered, total: linesTotal },
|
|
356
374
|
branches: { covered: branchesCovered, total: branchesTotal },
|
|
357
375
|
functions: { covered: functionsCovered, total: functionsTotal },
|
|
358
|
-
|
|
376
|
+
// #1027 N7: Cobertura has no statement detail — not collected.
|
|
377
|
+
statements: { covered: 0, total: 0 },
|
|
359
378
|
uncoveredLines,
|
|
360
379
|
uncoveredBranches,
|
|
361
380
|
});
|
|
@@ -449,11 +468,16 @@ export async function discoverSourceFiles(targetPath, options = {}) {
|
|
|
449
468
|
if (['node_modules', '.git', 'dist', 'build', 'coverage', '.nyc_output',
|
|
450
469
|
'__pycache__', '.venv', 'venv', '.tox', '.mypy_cache', 'target',
|
|
451
470
|
'.gradle', 'vendor', '.bundle',
|
|
452
|
-
'.
|
|
471
|
+
'.cache', '.npm', '.yarn',
|
|
453
472
|
'.next', '.nuxt', '.svelte-kit', 'out', '.turbo',
|
|
454
473
|
'tmp', 'temp', '.tmp'].includes(entry.name)) {
|
|
455
474
|
continue;
|
|
456
475
|
}
|
|
476
|
+
// #999: AQE state/assets are not source: .agentic-qe anywhere; .claude at
|
|
477
|
+
// the root or next to a nested .agentic-qe. A plugin's own .claude/hooks
|
|
478
|
+
// source (no AQE install beside it) is kept.
|
|
479
|
+
if (isAqeManagedDir(dir, entry.name, dir === targetPath))
|
|
480
|
+
continue;
|
|
457
481
|
if (files.length >= maxFiles)
|
|
458
482
|
return; // Cap reached
|
|
459
483
|
await walkDir(fullPath);
|
|
@@ -4,9 +4,12 @@
|
|
|
4
4
|
* Extracted from task-executor.ts registerHandlers().
|
|
5
5
|
* Covers: assess-quality
|
|
6
6
|
*/
|
|
7
|
+
import * as nodePath from 'node:path';
|
|
8
|
+
import { existsSync, promises as fsp } from 'node:fs';
|
|
7
9
|
import { ok, err } from '../../shared/types/index.js';
|
|
8
10
|
import { CallerInputError, toError } from '../../shared/error-utils.js';
|
|
9
11
|
import { discoverSourceFiles } from './handler-utils.js';
|
|
12
|
+
import { findProjectRoot } from '../../kernel/project-root.js';
|
|
10
13
|
import { INSUFFICIENT_EVIDENCE, describeMissingMetrics, evaluateQualityEvidence, loadQualityEvidence, } from '../../domains/quality-assessment/quality-evidence.js';
|
|
11
14
|
import { assessEvidenceSufficiency, describeMeasuredFailure, findMeasuredFailures, isMeasuredMetricValue, resolveCoverageOverride, validateRequestedMetrics, } from '../../domains/quality-assessment/evidence-sufficiency.js';
|
|
12
15
|
const DEFAULT_STATIC_METRICS = ['coverage', 'complexity', 'maintainability', 'testability'];
|
|
@@ -17,6 +20,91 @@ const STATIC_ONLY_NOTE = 'Static analysis only; no quality gate was evaluated. '
|
|
|
17
20
|
function sentinel(value) {
|
|
18
21
|
return isMeasuredMetricValue(value) ? value : UNMEASURED;
|
|
19
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* #1011: why each unmeasured metric has no value — the analyzer's reason
|
|
25
|
+
* (unreadable or unparseable file, failed detection, no stored coverage).
|
|
26
|
+
*/
|
|
27
|
+
function unmeasuredReasons(unmeasured, reported) {
|
|
28
|
+
const byMetric = new Map((reported ?? []).map((u) => [u.metric, u.reason]));
|
|
29
|
+
return Object.fromEntries(unmeasured.map((metric) => [
|
|
30
|
+
metric,
|
|
31
|
+
byMetric.get(metric) ?? (metric === 'security'
|
|
32
|
+
? 'static analysis never measures security'
|
|
33
|
+
: 'the static analyzer produced no measured value'),
|
|
34
|
+
]));
|
|
35
|
+
}
|
|
36
|
+
/** Cap on excluded files echoed back in the result (the count is always exact). */
|
|
37
|
+
const MAX_EXCLUDED_LISTED = 50;
|
|
38
|
+
/** True when `candidate` is `root` or lies beneath it. */
|
|
39
|
+
function isWithin(root, candidate) {
|
|
40
|
+
const relative = nodePath.relative(root, candidate);
|
|
41
|
+
return relative === '' || (relative !== '..' && !relative.startsWith(`..${nodePath.sep}`) && !nodePath.isAbsolute(relative));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* #1021 (B2): resolve a caller path against the project root and require it to
|
|
45
|
+
* stay inside — lexically, and by realpath when it exists (so a symlink cannot
|
|
46
|
+
* lead outside). A path that does not exist is returned as resolved; the
|
|
47
|
+
* analyzer reports it as unreadable.
|
|
48
|
+
*/
|
|
49
|
+
async function resolveContained(input, root, label) {
|
|
50
|
+
const resolved = nodePath.resolve(root, input);
|
|
51
|
+
if (input.includes('\0') || !isWithin(root, resolved)) {
|
|
52
|
+
throw new CallerInputError(`${label} ${JSON.stringify(input)} is outside the project root (${root}).`);
|
|
53
|
+
}
|
|
54
|
+
let real;
|
|
55
|
+
try {
|
|
56
|
+
real = await fsp.realpath(resolved);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return resolved;
|
|
60
|
+
}
|
|
61
|
+
const rootReal = await fsp.realpath(root).catch(() => root);
|
|
62
|
+
if (!isWithin(rootReal, real)) {
|
|
63
|
+
throw new CallerInputError(`${label} ${JSON.stringify(input)} resolves outside the project root (${root}).`);
|
|
64
|
+
}
|
|
65
|
+
return resolved;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* #1021 (B2): the files to analyse and which of them the caller named. Explicit
|
|
69
|
+
* sourceFiles win over target; with neither, src/ (else the root) is analysed.
|
|
70
|
+
*/
|
|
71
|
+
async function resolveAnalysisScope(payload) {
|
|
72
|
+
// #1021 round 2b: the AQE project root (AQE_PROJECT_ROOT, else detected),
|
|
73
|
+
// not the process cwd — an MCP server may run from another directory.
|
|
74
|
+
const root = findProjectRoot();
|
|
75
|
+
if (Array.isArray(payload.sourceFiles) && payload.sourceFiles.length > 0) {
|
|
76
|
+
const files = [];
|
|
77
|
+
for (const file of payload.sourceFiles) {
|
|
78
|
+
if (typeof file !== 'string' || file.trim() === '') {
|
|
79
|
+
throw new CallerInputError('sourceFiles must be a non-empty array of file paths.');
|
|
80
|
+
}
|
|
81
|
+
files.push(await resolveContained(file, root, 'sourceFile'));
|
|
82
|
+
}
|
|
83
|
+
return { sourceFiles: files, explicitFiles: files, scope: 'sourceFiles' };
|
|
84
|
+
}
|
|
85
|
+
if (typeof payload.target === 'string' && payload.target.trim() !== '') {
|
|
86
|
+
const target = await resolveContained(payload.target, root, 'target');
|
|
87
|
+
const stat = await fsp.stat(target).catch(() => null);
|
|
88
|
+
if (!stat)
|
|
89
|
+
throw new CallerInputError(`target ${JSON.stringify(payload.target)} does not exist.`);
|
|
90
|
+
if (stat.isFile())
|
|
91
|
+
return { sourceFiles: [target], explicitFiles: [target], scope: target };
|
|
92
|
+
return { sourceFiles: await discoverSourceFiles(target, { includeTests: false }), explicitFiles: [], scope: target };
|
|
93
|
+
}
|
|
94
|
+
// Default to src/ — scanning the entire project root is too slow
|
|
95
|
+
// (node_modules, dist, .git, etc. make it hang on large projects)
|
|
96
|
+
const srcDir = nodePath.join(root, 'src');
|
|
97
|
+
const targetDir = existsSync(srcDir) ? srcDir : root;
|
|
98
|
+
return { sourceFiles: await discoverSourceFiles(targetDir, { includeTests: false }), explicitFiles: [], scope: targetDir };
|
|
99
|
+
}
|
|
100
|
+
/** #1021: one line per partially measured metric, naming the gap. */
|
|
101
|
+
function describePartialMetrics(partial) {
|
|
102
|
+
return (partial ?? []).map((p) => `Partial evidence: ${p.metric} measured over ${p.analysedFiles} of ${p.totalFiles} `
|
|
103
|
+
// coverageOfScope is already rounded down to 3 decimals; round only float noise here.
|
|
104
|
+
+ `file(s) (${Math.round(p.coverageOfScope * 1000) / 10}%); not analysed: `
|
|
105
|
+
+ p.failed.slice(0, 3).map((f) => f.reason).join('; ')
|
|
106
|
+
+ (p.failed.length > 3 ? `; and ${p.failed.length - 3} more` : '') + '.');
|
|
107
|
+
}
|
|
20
108
|
/** #996 (N3): reject a malformed `metrics` list instead of spreading a string into characters. */
|
|
21
109
|
function requestedMetricsFrom(metrics) {
|
|
22
110
|
if (metrics === undefined)
|
|
@@ -81,27 +169,13 @@ export function registerQualityHandlers(ctx) {
|
|
|
81
169
|
const coverageOverride = await coverageOverrideFor(payload);
|
|
82
170
|
const analyzer = ctx.getQualityAnalyzer();
|
|
83
171
|
const threshold = payload.threshold || 80;
|
|
84
|
-
//
|
|
85
|
-
|
|
86
|
-
if (payload.sourceFiles && payload.sourceFiles.length > 0) {
|
|
87
|
-
sourceFiles = payload.sourceFiles;
|
|
88
|
-
}
|
|
89
|
-
else if (payload.target) {
|
|
90
|
-
sourceFiles = await discoverSourceFiles(payload.target, { includeTests: false });
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
// Default to src/ — scanning the entire project root is too slow
|
|
94
|
-
// (node_modules, dist, .git, etc. make it hang on large projects)
|
|
95
|
-
const path = await import('path');
|
|
96
|
-
const fs = await import('fs');
|
|
97
|
-
const srcDir = path.join(process.cwd(), 'src');
|
|
98
|
-
const targetDir = fs.existsSync(srcDir) ? srcDir : process.cwd();
|
|
99
|
-
sourceFiles = await discoverSourceFiles(targetDir, { includeTests: false });
|
|
100
|
-
}
|
|
172
|
+
// #1021 (B2): analyse what the caller scoped, contained in the project root.
|
|
173
|
+
const { sourceFiles, explicitFiles, scope } = await resolveAnalysisScope(payload);
|
|
101
174
|
if (sourceFiles.length === 0) {
|
|
102
175
|
// Nothing was analyzed: every requested metric is unmeasured (#996).
|
|
103
176
|
return ok({
|
|
104
|
-
|
|
177
|
+
// #1011: nothing was analysed, so there is no score (-1), not a score of 0.
|
|
178
|
+
qualityScore: UNMEASURED,
|
|
105
179
|
passed: false,
|
|
106
180
|
threshold,
|
|
107
181
|
metrics: {
|
|
@@ -117,6 +191,7 @@ export function registerQualityHandlers(ctx) {
|
|
|
117
191
|
warning: 'No source files found',
|
|
118
192
|
evidenceStatus: INSUFFICIENT_EVIDENCE,
|
|
119
193
|
unmeasured: requestedMetrics,
|
|
194
|
+
unmeasuredReasons: Object.fromEntries(requestedMetrics.map((m) => [m, 'no source files found to analyse'])),
|
|
120
195
|
measuredFailures: [],
|
|
121
196
|
gateEvaluated: false,
|
|
122
197
|
confidence: 0,
|
|
@@ -127,6 +202,7 @@ export function registerQualityHandlers(ctx) {
|
|
|
127
202
|
const result = await analyzer.analyzeQuality({
|
|
128
203
|
sourceFiles,
|
|
129
204
|
includeMetrics: requestedMetrics,
|
|
205
|
+
explicitFiles,
|
|
130
206
|
});
|
|
131
207
|
if (!result.success) {
|
|
132
208
|
return result;
|
|
@@ -156,13 +232,27 @@ export function registerQualityHandlers(ctx) {
|
|
|
156
232
|
maintainability: sentinel(metrics.maintainability),
|
|
157
233
|
// The analyzer has no security measurement; never report a placeholder.
|
|
158
234
|
security: sentinel(metrics.security),
|
|
235
|
+
// #1011: every requested metric appears, -1 when unmeasured.
|
|
236
|
+
...Object.fromEntries(requestedMetrics.map((name) => [name, sentinel(metrics[name])])),
|
|
159
237
|
...metrics,
|
|
160
238
|
},
|
|
239
|
+
unmeasuredReasons: unmeasuredReasons(sufficiency.unmeasured, report.unmeasured),
|
|
240
|
+
// #1021 round 2b: a score over a subset of the requested metrics (or over
|
|
241
|
+
// part of the files) names what it is based on — it is not a verdict.
|
|
242
|
+
...(insufficient || (report.partial?.length ?? 0) > 0
|
|
243
|
+
? { scoreBasis: report.metrics.map((m) => m.name) }
|
|
244
|
+
: {}),
|
|
161
245
|
recommendations: [
|
|
162
246
|
...measuredFailures.map(describeMeasuredFailure),
|
|
163
247
|
...describeMissingMetrics(sufficiency.unmeasured),
|
|
248
|
+
...describePartialMetrics(report.partial),
|
|
164
249
|
...recommendations,
|
|
165
250
|
],
|
|
251
|
+
...(report.partial && report.partial.length > 0 ? { partialMetrics: report.partial } : {}),
|
|
252
|
+
...(report.excluded && report.excluded.length > 0
|
|
253
|
+
? { excludedFiles: report.excluded.slice(0, MAX_EXCLUDED_LISTED), excludedCount: report.excluded.length }
|
|
254
|
+
: {}),
|
|
255
|
+
scope,
|
|
166
256
|
evidenceStatus: sufficiency.evidenceStatus,
|
|
167
257
|
unmeasured: sufficiency.unmeasured,
|
|
168
258
|
measuredFailures,
|
|
@@ -12,6 +12,7 @@ import { toError } from '../../shared/error-utils.js';
|
|
|
12
12
|
import { FilePath } from '../../shared/value-objects/index.js';
|
|
13
13
|
import { generateSecurityRecommendations } from './handler-utils.js';
|
|
14
14
|
import { discoverSecurityFiles, isSecuritySourceFile } from '../../domains/security-compliance/scan-discovery.js';
|
|
15
|
+
import { runDependencyAdvisoryScan } from '../../domains/security-compliance/dependency-advisory-engine.js';
|
|
15
16
|
export function registerSecurityHandlers(ctx) {
|
|
16
17
|
// Register security scan handler - REAL IMPLEMENTATION
|
|
17
18
|
ctx.registerHandler('scan-security', async (task) => {
|
|
@@ -257,6 +258,13 @@ export function registerSecurityHandlers(ctx) {
|
|
|
257
258
|
status: payload.dast ? 'not-run' : 'disabled', scope: 'url', ruleCoverage: 'unknown',
|
|
258
259
|
errors: payload.dast ? ['DAST was requested without targetUrl.'] : [], limitations: [] });
|
|
259
260
|
}
|
|
261
|
+
// #1049: OSV dependency advisories. A failed or partial lookup is a
|
|
262
|
+
// failed/partial required engine, never a completed scan with no findings.
|
|
263
|
+
let dependencyScan = null;
|
|
264
|
+
if (payload.dependencies === true) {
|
|
265
|
+
dependencyScan = await runDependencyAdvisoryScan(ctx.getSecurityScanner(), targetPath);
|
|
266
|
+
engines.push(dependencyScan.engine);
|
|
267
|
+
}
|
|
260
268
|
if (payload.compliance?.length) {
|
|
261
269
|
engines.push({ id: 'compliance', requested: true, required: true, status: 'not-run',
|
|
262
270
|
scope: 'requested-files', ruleCoverage: 'unknown', errors: [],
|
|
@@ -265,7 +273,7 @@ export function registerSecurityHandlers(ctx) {
|
|
|
265
273
|
const requestedPaths = new Set(filesToScan);
|
|
266
274
|
const analyzedPaths = new Set(fileEvidence.filter(file => file.status === 'analyzed' && requestedPaths.has(file.path)).map(file => file.path));
|
|
267
275
|
const requiredEngines = engines.filter(engine => engine.requested && engine.required);
|
|
268
|
-
const hasExecuted = analyzedPaths.size > 0;
|
|
276
|
+
const hasExecuted = analyzedPaths.size > 0 || (dependencyScan?.report.packagesChecked ?? 0) > 0;
|
|
269
277
|
const complete = hasExecuted && requiredEngines.every(engine => engine.status === 'completed') &&
|
|
270
278
|
(!discoveryResult || discoveryResult.discovery.status === 'complete');
|
|
271
279
|
const evidence = {
|
|
@@ -286,18 +294,21 @@ export function registerSecurityHandlers(ctx) {
|
|
|
286
294
|
low: crossLangVulns.filter(v => v.severity === 'low').length,
|
|
287
295
|
informational: crossLangVulns.filter(v => v.severity === 'informational').length,
|
|
288
296
|
};
|
|
297
|
+
const depVulns = dependencyScan?.vulnerabilities ?? [];
|
|
298
|
+
const depCount = (severity) => depVulns.filter(v => v.severity === severity).length;
|
|
289
299
|
const summary = {
|
|
290
|
-
critical: (sastResult?.summary?.critical || 0) + (dastResult?.summary?.critical || 0) + crossLangSeverityCounts.critical,
|
|
291
|
-
high: (sastResult?.summary?.high || 0) + (dastResult?.summary?.high || 0) + crossLangSeverityCounts.high,
|
|
292
|
-
medium: (sastResult?.summary?.medium || 0) + (dastResult?.summary?.medium || 0) + crossLangSeverityCounts.medium,
|
|
293
|
-
low: (sastResult?.summary?.low || 0) + (dastResult?.summary?.low || 0) + crossLangSeverityCounts.low,
|
|
294
|
-
informational: (sastResult?.summary?.informational || 0) + (dastResult?.summary?.informational || 0) + crossLangSeverityCounts.informational,
|
|
300
|
+
critical: (sastResult?.summary?.critical || 0) + (dastResult?.summary?.critical || 0) + crossLangSeverityCounts.critical + depCount('critical'),
|
|
301
|
+
high: (sastResult?.summary?.high || 0) + (dastResult?.summary?.high || 0) + crossLangSeverityCounts.high + depCount('high'),
|
|
302
|
+
medium: (sastResult?.summary?.medium || 0) + (dastResult?.summary?.medium || 0) + crossLangSeverityCounts.medium + depCount('medium'),
|
|
303
|
+
low: (sastResult?.summary?.low || 0) + (dastResult?.summary?.low || 0) + crossLangSeverityCounts.low + depCount('low'),
|
|
304
|
+
informational: (sastResult?.summary?.informational || 0) + (dastResult?.summary?.informational || 0) + crossLangSeverityCounts.informational + depCount('informational'),
|
|
295
305
|
};
|
|
296
306
|
// Extract top vulnerabilities from all sources
|
|
297
307
|
const allVulns = [
|
|
298
308
|
...(sastResult?.vulnerabilities || []),
|
|
299
309
|
...(dastResult?.vulnerabilities || []),
|
|
300
310
|
...crossLangVulns,
|
|
311
|
+
...depVulns,
|
|
301
312
|
];
|
|
302
313
|
const topVulnerabilities = allVulns
|
|
303
314
|
.sort((a, b) => {
|
|
@@ -316,6 +327,9 @@ export function registerSecurityHandlers(ctx) {
|
|
|
316
327
|
const recommendations = allVulns.length === 0 && evidence.completeness !== 'complete'
|
|
317
328
|
? ['No findings reported; requested analysis is incomplete or unverified. Inspect execution receipts.']
|
|
318
329
|
: generateSecurityRecommendations(allVulns);
|
|
330
|
+
if (dependencyScan && dependencyScan.report.status !== 'complete') {
|
|
331
|
+
recommendations.unshift(dependencyScan.report.message);
|
|
332
|
+
}
|
|
319
333
|
return ok({
|
|
320
334
|
vulnerabilities: allVulns.length,
|
|
321
335
|
critical: summary.critical,
|
|
@@ -329,7 +343,9 @@ export function registerSecurityHandlers(ctx) {
|
|
|
329
343
|
scanTypes: {
|
|
330
344
|
sast: payload.sast !== false,
|
|
331
345
|
dast: payload.dast || false,
|
|
346
|
+
dependencies: payload.dependencies === true,
|
|
332
347
|
},
|
|
348
|
+
...(dependencyScan ? { dependencyScan: dependencyScan.report } : {}),
|
|
333
349
|
status: evidence.completeness === 'complete' ? 'completed' : evidence.completeness === 'partial' ? 'partial' : 'unavailable',
|
|
334
350
|
evidence,
|
|
335
351
|
limitations: evidence.limitations,
|
|
@@ -222,7 +222,10 @@ export function registerTestExecutionHandlers(ctx) {
|
|
|
222
222
|
const executionError = getTestRunnerExecutionError(runner, testFiles.join(', '), execution.status, { passed, failed, skipped }, diagnostics, json);
|
|
223
223
|
if (executionError)
|
|
224
224
|
return err(executionError);
|
|
225
|
-
|
|
225
|
+
// #1027 N5/NB5: this handler runs the tests without --coverage, so it has no
|
|
226
|
+
// coverage figure to return (null, never 0%). For test_execute_parallel the
|
|
227
|
+
// measured coverage + testsPassing are recorded by TestExecutorService.
|
|
228
|
+
return ok({ total, passed, failed, skipped, duration: 0, coverage: null, failedTests: [] });
|
|
226
229
|
}
|
|
227
230
|
}
|
|
228
231
|
}
|