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
|
@@ -9,6 +9,27 @@ import { getCodeMetricsAnalyzer } from '../../../shared/metrics/index.js';
|
|
|
9
9
|
import { toError } from '../../../shared/error-utils.js';
|
|
10
10
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
11
11
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
12
|
+
import { measuredCoverageSummary, measuredFileCoverage } from '../coverage-report-event.js';
|
|
13
|
+
import { fileCoverageLookupKeys } from '../../coverage-analysis/collected-metrics.js';
|
|
14
|
+
/** Metrics the static analyzer produces when the caller asks for all of them. */
|
|
15
|
+
const ANALYZER_METRICS = ['coverage', 'complexity', 'maintainability', 'duplication', 'testability'];
|
|
16
|
+
/** Metrics computed from parsing each source file. */
|
|
17
|
+
const PARSED_METRICS = new Set(['complexity', 'maintainability', 'testability']);
|
|
18
|
+
/**
|
|
19
|
+
* #1021: a parsed metric with read/parse failures is still evidence when at
|
|
20
|
+
* least this share of the analysable files (in-scope minus excluded) was
|
|
21
|
+
* analysed. Below it, the unseen files are too large a blind spot for an
|
|
22
|
+
* average to describe the target, so the metric is unmeasured. 95% keeps one
|
|
23
|
+
* failure in a 20-file scope acceptable but not one in 10.
|
|
24
|
+
*/
|
|
25
|
+
export const MIN_ANALYSED_SHARE = 0.95;
|
|
26
|
+
/** #1011: the sentinel for "not measured" in score and complexity fields. */
|
|
27
|
+
const UNMEASURED = -1;
|
|
28
|
+
/** First reasons of a failure list, for a one-line explanation. */
|
|
29
|
+
function summariseFailures(failures) {
|
|
30
|
+
return failures.slice(0, 3).map((f) => f.reason).join('; ')
|
|
31
|
+
+ (failures.length > 3 ? `; and ${failures.length - 3} more` : '');
|
|
32
|
+
}
|
|
12
33
|
const DEFAULT_CONFIG = {
|
|
13
34
|
enableTrendAnalysis: true,
|
|
14
35
|
trendDataPointsMin: 3,
|
|
@@ -52,14 +73,15 @@ export class QualityAnalyzerService {
|
|
|
52
73
|
*/
|
|
53
74
|
constructor(memoryOrDependencies, config = {}) {
|
|
54
75
|
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
55
|
-
this.metricsAnalyzer = getCodeMetricsAnalyzer();
|
|
56
76
|
// Support both old and new constructor signatures
|
|
57
77
|
if ('memory' in memoryOrDependencies) {
|
|
58
78
|
// New signature: dependencies object
|
|
59
79
|
this.memory = memoryOrDependencies.memory;
|
|
60
80
|
this.llmRouter = memoryOrDependencies.llmRouter;
|
|
81
|
+
this.metricsAnalyzer = memoryOrDependencies.metricsAnalyzer ?? getCodeMetricsAnalyzer();
|
|
61
82
|
}
|
|
62
83
|
else {
|
|
84
|
+
this.metricsAnalyzer = getCodeMetricsAnalyzer();
|
|
63
85
|
// Old signature: direct MemoryBackend
|
|
64
86
|
this.memory = memoryOrDependencies;
|
|
65
87
|
this.llmRouter = undefined;
|
|
@@ -84,11 +106,11 @@ export class QualityAnalyzerService {
|
|
|
84
106
|
* Generate quality insights using LLM
|
|
85
107
|
* Provides AI-powered explanation and prioritized recommendations
|
|
86
108
|
*/
|
|
87
|
-
async generateQualityInsightsWithLLM(metrics, score, codeContext) {
|
|
109
|
+
async generateQualityInsightsWithLLM(metrics, score, codeContext, unmeasured = []) {
|
|
88
110
|
if (!this.llmRouter)
|
|
89
111
|
return null;
|
|
90
112
|
try {
|
|
91
|
-
const prompt = this.buildQualityInsightsPrompt(metrics, score, codeContext);
|
|
113
|
+
const prompt = this.buildQualityInsightsPrompt(metrics, score, codeContext, unmeasured);
|
|
92
114
|
const modelId = this.getModelForTier(this.config.llmModelTier ?? 2);
|
|
93
115
|
const response = await this.llmRouter.chat({
|
|
94
116
|
messages: [
|
|
@@ -136,7 +158,7 @@ Focus on:
|
|
|
136
158
|
}
|
|
137
159
|
return null;
|
|
138
160
|
}
|
|
139
|
-
catch
|
|
161
|
+
catch {
|
|
140
162
|
logger.warn('LLM insights generation failed:');
|
|
141
163
|
return null;
|
|
142
164
|
}
|
|
@@ -144,13 +166,18 @@ Focus on:
|
|
|
144
166
|
/**
|
|
145
167
|
* Build prompt for quality insights generation
|
|
146
168
|
*/
|
|
147
|
-
buildQualityInsightsPrompt(metrics, score, codeContext) {
|
|
169
|
+
buildQualityInsightsPrompt(metrics, score, codeContext, unmeasured = []) {
|
|
148
170
|
let prompt = `## Quality Analysis Results\n\n`;
|
|
149
|
-
prompt +=
|
|
171
|
+
prompt += score.overall >= 0
|
|
172
|
+
? `### Overall Score: ${score.overall}/100\n\n`
|
|
173
|
+
: `### Overall Score: not measured\n\n`;
|
|
150
174
|
prompt += `### Detailed Metrics:\n`;
|
|
151
175
|
for (const metric of metrics) {
|
|
152
176
|
prompt += `- **${metric.name}**: ${metric.value} (Rating: ${metric.rating}, Trend: ${metric.trend})\n`;
|
|
153
177
|
}
|
|
178
|
+
for (const missing of unmeasured) {
|
|
179
|
+
prompt += `- **${missing.metric}**: not measured (${missing.reason})\n`;
|
|
180
|
+
}
|
|
154
181
|
prompt += `\n`;
|
|
155
182
|
// #996: -1 means "not measured"; never present it to the model as a value.
|
|
156
183
|
const show = (value, unit = '') => (value >= 0 ? `${value}${unit}` : 'not measured');
|
|
@@ -200,7 +227,7 @@ Focus on:
|
|
|
200
227
|
}
|
|
201
228
|
return null;
|
|
202
229
|
}
|
|
203
|
-
catch
|
|
230
|
+
catch {
|
|
204
231
|
logger.warn('Failed to parse LLM insights response:');
|
|
205
232
|
return null;
|
|
206
233
|
}
|
|
@@ -234,8 +261,8 @@ Focus on:
|
|
|
234
261
|
if (sourceFiles.length === 0) {
|
|
235
262
|
return err(new Error('No source files provided for analysis'));
|
|
236
263
|
}
|
|
237
|
-
// Analyze metrics for each file
|
|
238
|
-
const fileMetrics = await this.collectFileMetrics(sourceFiles, includeMetrics);
|
|
264
|
+
// Analyze metrics for each file; failures become unmeasured (#1011)
|
|
265
|
+
const { fileMetrics, unmeasured, excluded, partial } = await this.collectFileMetrics(sourceFiles, includeMetrics, request.explicitFiles ?? []);
|
|
239
266
|
// Calculate aggregated metrics
|
|
240
267
|
const metricDetails = this.aggregateMetrics(fileMetrics);
|
|
241
268
|
// Calculate overall quality score
|
|
@@ -249,7 +276,7 @@ Focus on:
|
|
|
249
276
|
// ADR-051: Generate LLM insights if enabled
|
|
250
277
|
let llmInsights;
|
|
251
278
|
if (this.isLLMInsightsAvailable()) {
|
|
252
|
-
const insights = await this.generateQualityInsightsWithLLM(metricDetails, score);
|
|
279
|
+
const insights = await this.generateQualityInsightsWithLLM(metricDetails, score, undefined, unmeasured);
|
|
253
280
|
if (insights) {
|
|
254
281
|
llmInsights = insights;
|
|
255
282
|
}
|
|
@@ -260,6 +287,9 @@ Focus on:
|
|
|
260
287
|
trends,
|
|
261
288
|
recommendations,
|
|
262
289
|
llmInsights,
|
|
290
|
+
unmeasured,
|
|
291
|
+
excluded,
|
|
292
|
+
partial,
|
|
263
293
|
};
|
|
264
294
|
// Store the report
|
|
265
295
|
await this.storeReport(report, sourceFiles);
|
|
@@ -344,88 +374,149 @@ Focus on:
|
|
|
344
374
|
// ============================================================================
|
|
345
375
|
// Private Helper Methods
|
|
346
376
|
// ============================================================================
|
|
347
|
-
|
|
377
|
+
/**
|
|
378
|
+
* Collect per-file metric values. #1011 / #1021:
|
|
379
|
+
* - excluded files (binary, generated, minified, declarations, refused by
|
|
380
|
+
* reader policy) leave the scope with a reason;
|
|
381
|
+
* - failed files (unreadable, unparseable) make a parsed metric partial, or
|
|
382
|
+
* unmeasured below MIN_ANALYSED_SHARE or when a failed file was named
|
|
383
|
+
* explicitly;
|
|
384
|
+
* - failed duplication detection and missing coverage are unmeasured.
|
|
385
|
+
* Never a fixed fallback value.
|
|
386
|
+
*/
|
|
387
|
+
async collectFileMetrics(files, includeMetrics, explicitFiles) {
|
|
388
|
+
const requested = includeMetrics.length === 0 ? [...ANALYZER_METRICS] : includeMetrics;
|
|
389
|
+
const wants = (metric) => requested.includes(metric);
|
|
348
390
|
const fileMetrics = new Map();
|
|
349
|
-
const
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
duplicationPercentage = 0;
|
|
359
|
-
}
|
|
360
|
-
}
|
|
391
|
+
const unmeasured = [];
|
|
392
|
+
const excluded = [];
|
|
393
|
+
const partial = [];
|
|
394
|
+
const parseFailed = [];
|
|
395
|
+
const unreadable = [];
|
|
396
|
+
const readable = [];
|
|
397
|
+
const missingCoverage = [];
|
|
398
|
+
const explicit = new Set(explicitFiles);
|
|
399
|
+
const needsAnalysis = requested.some((m) => PARSED_METRICS.has(m) || m === 'duplication');
|
|
361
400
|
for (const file of files) {
|
|
362
401
|
const metrics = {};
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
}
|
|
370
|
-
if (includeAll || includeMetrics.includes('maintainability')) {
|
|
371
|
-
metrics.maintainability = fileAnalysis.maintainabilityIndex;
|
|
402
|
+
if (needsAnalysis) {
|
|
403
|
+
const outcome = await this.metricsAnalyzer.analyzeFileDetailed(file);
|
|
404
|
+
const reason = outcome.reason ?? `${file} could not be analysed`;
|
|
405
|
+
if (outcome.status === 'excluded') {
|
|
406
|
+
excluded.push({ file, reason });
|
|
407
|
+
continue;
|
|
372
408
|
}
|
|
373
|
-
if (
|
|
374
|
-
|
|
409
|
+
if (outcome.metrics)
|
|
410
|
+
readable.push(file);
|
|
411
|
+
if (outcome.status === 'failed') {
|
|
412
|
+
(outcome.metrics ? parseFailed : unreadable).push({ file, reason });
|
|
375
413
|
}
|
|
376
|
-
if (
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
metrics.coverage = storedCoverage;
|
|
414
|
+
else if (outcome.metrics) {
|
|
415
|
+
const analysis = outcome.metrics;
|
|
416
|
+
if (wants('complexity'))
|
|
417
|
+
metrics.complexity = analysis.cyclomaticComplexity;
|
|
418
|
+
if (wants('maintainability'))
|
|
419
|
+
metrics.maintainability = analysis.maintainabilityIndex;
|
|
420
|
+
if (wants('testability')) {
|
|
421
|
+
// Testability is derived from complexity and maintainability
|
|
422
|
+
// Lower complexity and higher maintainability = higher testability
|
|
423
|
+
const complexityFactor = Math.max(0, 100 - analysis.cyclomaticComplexity * 3);
|
|
424
|
+
const maintainabilityFactor = analysis.maintainabilityIndex;
|
|
425
|
+
metrics.testability = Math.round((complexityFactor * 0.4 + maintainabilityFactor * 0.6) * 100) / 100;
|
|
389
426
|
}
|
|
390
|
-
// If no coverage data exists, omit the metric rather than guessing
|
|
391
427
|
}
|
|
392
428
|
}
|
|
393
|
-
|
|
394
|
-
//
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
if (storedCoverage !== null) {
|
|
399
|
-
metrics.coverage = storedCoverage;
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
if (includeAll || includeMetrics.includes('complexity')) {
|
|
403
|
-
metrics.complexity = 10;
|
|
429
|
+
if (wants('coverage')) {
|
|
430
|
+
// Coverage requires external data (from test runners) — never fabricate a number
|
|
431
|
+
const storedCoverage = await this.getStoredCoverage(file);
|
|
432
|
+
if (storedCoverage !== null) {
|
|
433
|
+
metrics.coverage = storedCoverage;
|
|
404
434
|
}
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
}
|
|
408
|
-
if (includeAll || includeMetrics.includes('duplication')) {
|
|
409
|
-
metrics.duplication = duplicationPercentage;
|
|
410
|
-
}
|
|
411
|
-
if (includeAll || includeMetrics.includes('testability')) {
|
|
412
|
-
metrics.testability = 70;
|
|
435
|
+
else {
|
|
436
|
+
missingCoverage.push(file);
|
|
413
437
|
}
|
|
414
438
|
}
|
|
415
439
|
fileMetrics.set(file, metrics);
|
|
416
440
|
}
|
|
417
|
-
|
|
441
|
+
const total = fileMetrics.size;
|
|
442
|
+
if (missingCoverage.length > 0) {
|
|
443
|
+
for (const metrics of fileMetrics.values())
|
|
444
|
+
delete metrics.coverage;
|
|
445
|
+
unmeasured.push({
|
|
446
|
+
metric: 'coverage',
|
|
447
|
+
reason: `no measured coverage recorded for ${missingCoverage.length} of ${total} file(s)`,
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
/** Decide whether a metric with these failures is measured, partial or unmeasured. */
|
|
451
|
+
const judge = (metric, failures) => {
|
|
452
|
+
const analysed = total - failures.length;
|
|
453
|
+
if (analysed === 0) {
|
|
454
|
+
unmeasured.push({
|
|
455
|
+
metric,
|
|
456
|
+
reason: total === 0
|
|
457
|
+
? `no analysable files: ${excluded.length} file(s) excluded (${summariseFailures(excluded)})`
|
|
458
|
+
: `none of ${total} file(s) could be analysed: ${summariseFailures(failures)}`,
|
|
459
|
+
...(failures.length > 0 ? { files: failures.map((f) => f.file) } : {}),
|
|
460
|
+
});
|
|
461
|
+
return false;
|
|
462
|
+
}
|
|
463
|
+
if (failures.length === 0)
|
|
464
|
+
return true;
|
|
465
|
+
const share = analysed / total;
|
|
466
|
+
// Round DOWN so a partial scope never reads as 1 / 100% (#1021).
|
|
467
|
+
const permille = Math.floor((analysed * 1000) / total);
|
|
468
|
+
const coverageOfScope = permille / 1000;
|
|
469
|
+
const explicitFailure = failures.find((f) => explicit.has(f.file));
|
|
470
|
+
if (explicitFailure || share < MIN_ANALYSED_SHARE) {
|
|
471
|
+
const why = explicitFailure
|
|
472
|
+
? `explicit target ${explicitFailure.file} could not be analysed`
|
|
473
|
+
: `${analysed} of ${total} file(s) analysed (${permille / 10}%, below ${MIN_ANALYSED_SHARE * 100}%)`;
|
|
474
|
+
unmeasured.push({
|
|
475
|
+
metric,
|
|
476
|
+
reason: `${why}: ${summariseFailures(failures)}`,
|
|
477
|
+
files: failures.map((f) => f.file),
|
|
478
|
+
});
|
|
479
|
+
return false;
|
|
480
|
+
}
|
|
481
|
+
partial.push({ metric, analysedFiles: analysed, totalFiles: total, coverageOfScope, failed: failures });
|
|
482
|
+
return true;
|
|
483
|
+
};
|
|
484
|
+
const failedToParse = [...unreadable, ...parseFailed];
|
|
485
|
+
for (const metric of requested.filter((m) => PARSED_METRICS.has(m))) {
|
|
486
|
+
if (!judge(metric, failedToParse)) {
|
|
487
|
+
for (const metrics of fileMetrics.values())
|
|
488
|
+
delete metrics[metric];
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
// Duplication needs readable text, not a parse (#1021 N2).
|
|
492
|
+
if (wants('duplication') && judge('duplication', unreadable)) {
|
|
493
|
+
try {
|
|
494
|
+
const { percentage } = await this.metricsAnalyzer.detectDuplication(readable);
|
|
495
|
+
for (const metrics of fileMetrics.values())
|
|
496
|
+
metrics.duplication = percentage;
|
|
497
|
+
}
|
|
498
|
+
catch (error) {
|
|
499
|
+
const index = partial.findIndex((p) => p.metric === 'duplication');
|
|
500
|
+
if (index >= 0)
|
|
501
|
+
partial.splice(index, 1);
|
|
502
|
+
unmeasured.push({ metric: 'duplication', reason: `duplication detection failed: ${toError(error).message}` });
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
return { fileMetrics, unmeasured, excluded, partial };
|
|
418
506
|
}
|
|
419
507
|
async getStoredCoverage(file) {
|
|
420
508
|
try {
|
|
421
509
|
// 1. Try per-file coverage stored by test executor
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
510
|
+
// #1014: only measured records count. Legacy unstamped estimate
|
|
511
|
+
// records (written by <= 3.15.4, never expiring) are ignored.
|
|
512
|
+
for (const key of fileCoverageLookupKeys(file)) {
|
|
513
|
+
const fileCoverage = measuredFileCoverage(await this.memory.get(key));
|
|
514
|
+
if (fileCoverage)
|
|
515
|
+
return fileCoverage.line;
|
|
425
516
|
}
|
|
426
517
|
// 2. Fall back to project-wide summary from coverage-analyzer
|
|
427
|
-
const summary = await this.memory.get('coverage:latest');
|
|
428
|
-
if (summary
|
|
518
|
+
const summary = measuredCoverageSummary(await this.memory.get('coverage:latest'));
|
|
519
|
+
if (summary) {
|
|
429
520
|
return summary.line;
|
|
430
521
|
}
|
|
431
522
|
// No coverage data available — return null (never fabricate)
|
|
@@ -480,17 +571,18 @@ Focus on:
|
|
|
480
571
|
weightedSum += normalizedValue * weight;
|
|
481
572
|
totalWeight += weight;
|
|
482
573
|
}
|
|
483
|
-
|
|
574
|
+
// #1011: no measured metric means no score — -1, never 0.
|
|
575
|
+
const overall = totalWeight > 0 ? Math.round(weightedSum / totalWeight) : UNMEASURED;
|
|
484
576
|
// Use -1 to signal "no data available" rather than 0 which implies "0% coverage"
|
|
485
577
|
// (#996: the same holds for every score field — never fabricate a value).
|
|
486
|
-
const valueOf = (name) => metrics.find((m) => m.name === name)?.value ??
|
|
578
|
+
const valueOf = (name) => metrics.find((m) => m.name === name)?.value ?? UNMEASURED;
|
|
487
579
|
return {
|
|
488
580
|
overall,
|
|
489
581
|
coverage: valueOf('coverage'),
|
|
490
582
|
complexity: valueOf('complexity'),
|
|
491
583
|
maintainability: valueOf('maintainability'),
|
|
492
584
|
// No security analysis runs here; -1 = not measured (was a fixed 85 placeholder).
|
|
493
|
-
security:
|
|
585
|
+
security: UNMEASURED,
|
|
494
586
|
};
|
|
495
587
|
}
|
|
496
588
|
async generateTrends(currentMetrics, _compareBaseline) {
|
|
@@ -559,7 +651,7 @@ Focus on:
|
|
|
559
651
|
});
|
|
560
652
|
}
|
|
561
653
|
// Overall score recommendation
|
|
562
|
-
if (score.overall < 70) {
|
|
654
|
+
if (score.overall >= 0 && score.overall < 70) {
|
|
563
655
|
recommendations.push({
|
|
564
656
|
type: 'critical',
|
|
565
657
|
title: 'Overall Quality Improvement Needed',
|
|
@@ -575,50 +667,43 @@ Focus on:
|
|
|
575
667
|
}
|
|
576
668
|
async analyzeFileComplexity(file, requestedMetrics) {
|
|
577
669
|
const includesAll = requestedMetrics.length === 0;
|
|
670
|
+
const wants = (metric) => includesAll || requestedMetrics.includes(metric);
|
|
578
671
|
// Use real CodeMetricsAnalyzer for file analysis
|
|
579
|
-
const
|
|
580
|
-
if (
|
|
672
|
+
const { status, metrics: analysis, reason } = await this.metricsAnalyzer.analyzeFileDetailed(file);
|
|
673
|
+
if (status !== 'measured' || !analysis) {
|
|
674
|
+
// #1011: never invent values for a file that could not be analysed
|
|
581
675
|
return {
|
|
582
676
|
path: file,
|
|
583
|
-
cyclomatic:
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
: 0,
|
|
589
|
-
maintainability: includesAll || requestedMetrics.includes('maintainability')
|
|
590
|
-
? fileAnalysis.maintainabilityIndex
|
|
591
|
-
: 0,
|
|
592
|
-
linesOfCode: fileAnalysis.linesOfCode,
|
|
677
|
+
cyclomatic: UNMEASURED,
|
|
678
|
+
cognitive: UNMEASURED,
|
|
679
|
+
maintainability: UNMEASURED,
|
|
680
|
+
linesOfCode: UNMEASURED,
|
|
681
|
+
unmeasuredReason: reason ?? `${file} could not be analysed`,
|
|
593
682
|
};
|
|
594
683
|
}
|
|
595
|
-
//
|
|
684
|
+
// A metric that was not requested is not measured (-1), not 0 — a 0
|
|
685
|
+
// maintainability would otherwise be reported as a critical hotspot.
|
|
596
686
|
return {
|
|
597
687
|
path: file,
|
|
598
|
-
cyclomatic:
|
|
599
|
-
cognitive:
|
|
600
|
-
maintainability:
|
|
601
|
-
linesOfCode:
|
|
688
|
+
cyclomatic: wants('cyclomatic') ? analysis.cyclomaticComplexity : UNMEASURED,
|
|
689
|
+
cognitive: wants('cognitive') ? analysis.cognitiveComplexity : UNMEASURED,
|
|
690
|
+
maintainability: wants('maintainability') ? analysis.maintainabilityIndex : UNMEASURED,
|
|
691
|
+
linesOfCode: analysis.linesOfCode,
|
|
602
692
|
};
|
|
603
693
|
}
|
|
604
694
|
calculateComplexitySummary(files) {
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
}
|
|
613
|
-
const sumCyclomatic = files.reduce((sum, f) => sum + f.cyclomatic, 0);
|
|
614
|
-
const sumCognitive = files.reduce((sum, f) => sum + f.cognitive, 0);
|
|
615
|
-
const sumMaintainability = files.reduce((sum, f) => sum + f.maintainability, 0);
|
|
616
|
-
const totalLOC = files.reduce((sum, f) => sum + f.linesOfCode, 0);
|
|
695
|
+
// #1011: average measured values only; -1 when nothing was measured.
|
|
696
|
+
const average = (values) => {
|
|
697
|
+
const measured = values.filter((v) => v >= 0);
|
|
698
|
+
if (measured.length === 0)
|
|
699
|
+
return UNMEASURED;
|
|
700
|
+
return Math.round((measured.reduce((sum, v) => sum + v, 0) / measured.length) * 100) / 100;
|
|
701
|
+
};
|
|
617
702
|
return {
|
|
618
|
-
averageCyclomatic:
|
|
619
|
-
averageCognitive:
|
|
620
|
-
averageMaintainability:
|
|
621
|
-
totalLinesOfCode:
|
|
703
|
+
averageCyclomatic: average(files.map((f) => f.cyclomatic)),
|
|
704
|
+
averageCognitive: average(files.map((f) => f.cognitive)),
|
|
705
|
+
averageMaintainability: average(files.map((f) => f.maintainability)),
|
|
706
|
+
totalLinesOfCode: files.reduce((sum, f) => sum + Math.max(0, f.linesOfCode), 0),
|
|
622
707
|
};
|
|
623
708
|
}
|
|
624
709
|
identifyHotspots(files) {
|
|
@@ -647,8 +732,8 @@ Focus on:
|
|
|
647
732
|
: 'Simplify control flow and reduce nesting depth.',
|
|
648
733
|
});
|
|
649
734
|
}
|
|
650
|
-
// Check maintainability (lower is worse)
|
|
651
|
-
if (file.maintainability <= thresholds.maintainability.warning) {
|
|
735
|
+
// Check maintainability (lower is worse); -1 = not measured, never a hotspot
|
|
736
|
+
if (file.maintainability >= 0 && file.maintainability <= thresholds.maintainability.warning) {
|
|
652
737
|
hotspots.push({
|
|
653
738
|
file: file.path,
|
|
654
739
|
function: 'unknown',
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { v4 as uuidv4 } from 'uuid';
|
|
6
6
|
import { ok, err } from '../../../shared/types/index.js';
|
|
7
7
|
import { toError } from '../../../shared/error-utils.js';
|
|
8
|
+
import { isMeasuredMetricValue } from '../evidence-sufficiency.js';
|
|
8
9
|
const DEFAULT_CONFIG = {
|
|
9
10
|
strictMode: false,
|
|
10
11
|
enableWarnings: true,
|
|
@@ -80,6 +81,12 @@ export class QualityGateService {
|
|
|
80
81
|
// Evaluate each threshold
|
|
81
82
|
checks.push(...this.evaluateMinThresholds(metrics, thresholds));
|
|
82
83
|
checks.push(...this.evaluateMaxThresholds(metrics, thresholds));
|
|
84
|
+
if (checks.length === 0) {
|
|
85
|
+
return err(new Error('No thresholds configured for gate evaluation'));
|
|
86
|
+
}
|
|
87
|
+
const unmeasured = checks
|
|
88
|
+
.filter((check) => !isMeasuredMetricValue(check.value))
|
|
89
|
+
.map((check) => check.name);
|
|
83
90
|
// Collect failed checks
|
|
84
91
|
for (const check of checks) {
|
|
85
92
|
if (!check.passed) {
|
|
@@ -89,13 +96,15 @@ export class QualityGateService {
|
|
|
89
96
|
// Calculate overall score (0-100)
|
|
90
97
|
const overallScore = this.calculateOverallScore(checks);
|
|
91
98
|
// Determine pass/fail based on critical checks
|
|
92
|
-
const passed = this.determineGateStatus(checks);
|
|
99
|
+
const passed = unmeasured.length === 0 && this.determineGateStatus(checks);
|
|
93
100
|
const result = {
|
|
94
101
|
gateName,
|
|
95
102
|
passed,
|
|
96
103
|
checks,
|
|
97
104
|
overallScore,
|
|
98
105
|
failedChecks,
|
|
106
|
+
evidenceStatus: unmeasured.length === 0 ? 'measured' : 'insufficient-evidence',
|
|
107
|
+
unmeasured,
|
|
99
108
|
};
|
|
100
109
|
// Store evaluation result in memory
|
|
101
110
|
await this.storeEvaluationResult(result);
|
|
@@ -188,9 +197,9 @@ export class QualityGateService {
|
|
|
188
197
|
return checks;
|
|
189
198
|
}
|
|
190
199
|
createCheck(name, value, threshold, type, severity) {
|
|
191
|
-
const passed = type === 'min'
|
|
200
|
+
const passed = isMeasuredMetricValue(value) && (type === 'min'
|
|
192
201
|
? value >= threshold
|
|
193
|
-
: value <= threshold;
|
|
202
|
+
: value <= threshold);
|
|
194
203
|
return {
|
|
195
204
|
name,
|
|
196
205
|
passed,
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency advisory (OSV) engine for the scan-security task (#1049).
|
|
3
|
+
*
|
|
4
|
+
* Runs the security-compliance DependencyScanner on the project's package.json
|
|
5
|
+
* and turns its outcome into an execution receipt. A failed or partial OSV
|
|
6
|
+
* lookup is a failed/partial engine with the unchecked packages listed, never
|
|
7
|
+
* a completed engine with zero findings.
|
|
8
|
+
*/
|
|
9
|
+
import type { SecurityEngineEvidence } from './scan-evidence.js';
|
|
10
|
+
import type { Vulnerability, UncheckedDependency, LocalDependency } from './interfaces.js';
|
|
11
|
+
import type { DependencyScanResult } from './services/scanners/scanner-types.js';
|
|
12
|
+
import type { Result } from '../../shared/types/index.js';
|
|
13
|
+
export declare const DEPENDENCY_ADVISORY_ENGINE_ID = "osv-dependency-advisories";
|
|
14
|
+
/** The dependency scan as reported to MCP and CLI consumers. */
|
|
15
|
+
export interface DependencyScanReport {
|
|
16
|
+
status: 'complete' | 'incomplete' | 'failed' | 'not-run';
|
|
17
|
+
measured: boolean;
|
|
18
|
+
manifest?: string;
|
|
19
|
+
/** Lockfile the checked versions were resolved from, or null (exact specs only). */
|
|
20
|
+
lockfile?: string | null;
|
|
21
|
+
packagesRequested: number;
|
|
22
|
+
packagesChecked: number;
|
|
23
|
+
uncheckedPackages: UncheckedDependency[];
|
|
24
|
+
/** Local workspace / linked packages: not OSV subjects, excluded from the counts. */
|
|
25
|
+
localPackages: LocalDependency[];
|
|
26
|
+
/** Why the scan is not complete beyond individual packages (malformed lockfile, workspace root #1057). */
|
|
27
|
+
resolutionErrors: string[];
|
|
28
|
+
/** Only direct dependencies are checked; transitive dependencies are not. */
|
|
29
|
+
scope: 'direct';
|
|
30
|
+
vulnerabilities: number;
|
|
31
|
+
scanId?: string;
|
|
32
|
+
error?: string;
|
|
33
|
+
/** One plain sentence for humans; says when advisories could not be checked. */
|
|
34
|
+
message: string;
|
|
35
|
+
}
|
|
36
|
+
export interface DependencyAdvisoryOutcome {
|
|
37
|
+
engine: SecurityEngineEvidence;
|
|
38
|
+
vulnerabilities: Vulnerability[];
|
|
39
|
+
report: DependencyScanReport;
|
|
40
|
+
}
|
|
41
|
+
interface PackageJsonScanner {
|
|
42
|
+
scanPackageJson(packageJsonPath: string): Promise<Result<DependencyScanResult>>;
|
|
43
|
+
}
|
|
44
|
+
/** The package.json for a scan target: the target directory's, else the project root's. */
|
|
45
|
+
export declare function findPackageJson(targetPath: string, env?: NodeJS.ProcessEnv): Promise<string | null>;
|
|
46
|
+
/** Human message for a dependency scan outcome. */
|
|
47
|
+
export declare const DEPENDENCY_SCOPE_NOTE = "direct dependencies of this package.json only; workspace members and transitive dependencies are not checked";
|
|
48
|
+
export declare function dependencyScanMessage(report: Omit<DependencyScanReport, 'message'>): string;
|
|
49
|
+
/** Run the OSV dependency scan for a target and describe it as an engine receipt. */
|
|
50
|
+
export declare function runDependencyAdvisoryScan(scanner: PackageJsonScanner, targetPath: string): Promise<DependencyAdvisoryOutcome>;
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=dependency-advisory-engine.d.ts.map
|