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
|
@@ -112,12 +112,17 @@ export class PersistentScheduler {
|
|
|
112
112
|
}
|
|
113
113
|
try {
|
|
114
114
|
const content = fs.readFileSync(this.schedulesPath, 'utf-8');
|
|
115
|
-
const data = this.parseSchedulesFile(content);
|
|
115
|
+
const { file: data, skipped } = this.parseSchedulesFile(content);
|
|
116
|
+
if (skipped.length > 0) {
|
|
117
|
+
console.warn(`[PersistentScheduler] Skipped ${skipped.length} malformed schedule ` +
|
|
118
|
+
`entries in ${this.schedulesPath} (not an object, no id, or duplicate id)`);
|
|
119
|
+
}
|
|
116
120
|
this.log(`Loaded ${data.schedules.length} schedules`);
|
|
117
121
|
return data.schedules;
|
|
118
122
|
}
|
|
119
123
|
catch (error) {
|
|
120
|
-
//
|
|
124
|
+
// Only a genuinely unparseable file gets here (bad JSON, no schedules
|
|
125
|
+
// array, oversize); malformed entries are disabled or skipped (#991).
|
|
121
126
|
await this.handleCorruptFile(error);
|
|
122
127
|
return [];
|
|
123
128
|
}
|
|
@@ -128,7 +133,7 @@ export class PersistentScheduler {
|
|
|
128
133
|
async saveSchedule(schedule) {
|
|
129
134
|
await this.initialize();
|
|
130
135
|
await this.withFileLock(async () => {
|
|
131
|
-
const schedules =
|
|
136
|
+
const { schedules, skipped } = this.loadForWrite();
|
|
132
137
|
const existingIndex = schedules.findIndex(s => s.id === schedule.id);
|
|
133
138
|
if (existingIndex >= 0) {
|
|
134
139
|
schedules[existingIndex] = schedule;
|
|
@@ -138,7 +143,7 @@ export class PersistentScheduler {
|
|
|
138
143
|
schedules.push(schedule);
|
|
139
144
|
this.log(`Added schedule: ${schedule.id}`);
|
|
140
145
|
}
|
|
141
|
-
await this.writeSchedules(schedules);
|
|
146
|
+
await this.writeSchedules(schedules, skipped);
|
|
142
147
|
});
|
|
143
148
|
}
|
|
144
149
|
/**
|
|
@@ -147,13 +152,13 @@ export class PersistentScheduler {
|
|
|
147
152
|
async removeSchedule(id) {
|
|
148
153
|
await this.initialize();
|
|
149
154
|
await this.withFileLock(async () => {
|
|
150
|
-
const schedules =
|
|
155
|
+
const { schedules, skipped } = this.loadForWrite();
|
|
151
156
|
const newSchedules = schedules.filter(s => s.id !== id);
|
|
152
157
|
if (newSchedules.length === schedules.length) {
|
|
153
158
|
this.log(`Schedule not found: ${id}`);
|
|
154
159
|
return;
|
|
155
160
|
}
|
|
156
|
-
await this.writeSchedules(newSchedules);
|
|
161
|
+
await this.writeSchedules(newSchedules, skipped);
|
|
157
162
|
this.log(`Removed schedule: ${id}`);
|
|
158
163
|
});
|
|
159
164
|
}
|
|
@@ -189,15 +194,20 @@ export class PersistentScheduler {
|
|
|
189
194
|
async markExecuted(id) {
|
|
190
195
|
await this.initialize();
|
|
191
196
|
await this.withFileLock(async () => {
|
|
192
|
-
const schedules =
|
|
197
|
+
const { schedules, skipped } = this.loadForWrite();
|
|
193
198
|
const schedule = schedules.find(s => s.id === id);
|
|
194
199
|
if (!schedule) {
|
|
195
200
|
throw new Error(`Schedule not found: ${id}`);
|
|
196
201
|
}
|
|
197
202
|
const now = new Date();
|
|
198
203
|
schedule.lastRun = now.toISOString();
|
|
199
|
-
|
|
200
|
-
|
|
204
|
+
// #913: an entry disabled on load (legacy/invalid cron, missing fields)
|
|
205
|
+
// has no computable next run. Record the run and keep it disabled
|
|
206
|
+
// instead of throwing from calculateNextRun.
|
|
207
|
+
if (!schedule.disabledReason) {
|
|
208
|
+
schedule.nextRun = calculateNextRun(schedule.schedule, now).toISOString();
|
|
209
|
+
}
|
|
210
|
+
await this.writeSchedules(schedules, skipped);
|
|
201
211
|
this.log(`Marked executed: ${id}, next run: ${schedule.nextRun}`);
|
|
202
212
|
});
|
|
203
213
|
}
|
|
@@ -207,17 +217,22 @@ export class PersistentScheduler {
|
|
|
207
217
|
async setEnabled(id, enabled) {
|
|
208
218
|
await this.initialize();
|
|
209
219
|
await this.withFileLock(async () => {
|
|
210
|
-
const schedules =
|
|
220
|
+
const { schedules, skipped } = this.loadForWrite();
|
|
211
221
|
const schedule = schedules.find(s => s.id === id);
|
|
212
222
|
if (!schedule) {
|
|
213
223
|
throw new Error(`Schedule not found: ${id}`);
|
|
214
224
|
}
|
|
225
|
+
// #913/#991: an entry disabled on load cannot run; say why instead of
|
|
226
|
+
// failing inside calculateNextRun (or with no cron at all).
|
|
227
|
+
if (enabled && schedule.disabledReason) {
|
|
228
|
+
throw new Error(`Cannot enable schedule ${id}: ${schedule.disabledReason}`);
|
|
229
|
+
}
|
|
215
230
|
schedule.enabled = enabled;
|
|
216
231
|
// If re-enabling, recalculate next run from now
|
|
217
232
|
if (enabled) {
|
|
218
233
|
schedule.nextRun = calculateNextRun(schedule.schedule, new Date()).toISOString();
|
|
219
234
|
}
|
|
220
|
-
await this.writeSchedules(schedules);
|
|
235
|
+
await this.writeSchedules(schedules, skipped);
|
|
221
236
|
this.log(`Set enabled=${enabled}: ${id}`);
|
|
222
237
|
});
|
|
223
238
|
}
|
|
@@ -241,7 +256,8 @@ export class PersistentScheduler {
|
|
|
241
256
|
async clearAll() {
|
|
242
257
|
await this.initialize();
|
|
243
258
|
await this.withFileLock(async () => {
|
|
244
|
-
|
|
259
|
+
const { skipped } = this.loadForWrite();
|
|
260
|
+
await this.writeSchedules([], skipped);
|
|
245
261
|
this.log('Cleared all schedules');
|
|
246
262
|
});
|
|
247
263
|
}
|
|
@@ -262,19 +278,22 @@ export class PersistentScheduler {
|
|
|
262
278
|
// Private Helper Methods
|
|
263
279
|
// ============================================================================
|
|
264
280
|
/**
|
|
265
|
-
* Load schedules
|
|
281
|
+
* Load schedules for a locked read-modify-write. A genuinely unparseable
|
|
282
|
+
* file is backed up (not removed) first, so the write that follows cannot
|
|
283
|
+
* silently replace it with fewer schedules.
|
|
266
284
|
*/
|
|
267
|
-
|
|
285
|
+
loadForWrite() {
|
|
268
286
|
if (!fs.existsSync(this.schedulesPath)) {
|
|
269
|
-
return [];
|
|
287
|
+
return { schedules: [], skipped: [] };
|
|
270
288
|
}
|
|
271
289
|
try {
|
|
272
290
|
const content = fs.readFileSync(this.schedulesPath, 'utf-8');
|
|
273
|
-
const
|
|
274
|
-
return
|
|
291
|
+
const { file, skipped } = this.parseSchedulesFile(content);
|
|
292
|
+
return { schedules: file.schedules, skipped };
|
|
275
293
|
}
|
|
276
|
-
catch {
|
|
277
|
-
|
|
294
|
+
catch (error) {
|
|
295
|
+
this.backupCorruptFile(error);
|
|
296
|
+
return { schedules: [], skipped: [] };
|
|
278
297
|
}
|
|
279
298
|
}
|
|
280
299
|
/**
|
|
@@ -288,32 +307,53 @@ export class PersistentScheduler {
|
|
|
288
307
|
throw new Error(`Schedules file exceeds maximum allowed size (${MAX_SCHEDULES_FILE_SIZE / (1024 * 1024)}MB). File is ${(contentSize / (1024 * 1024)).toFixed(2)}MB.`);
|
|
289
308
|
}
|
|
290
309
|
const data = safeJsonParse(content);
|
|
291
|
-
// Validate structure
|
|
292
|
-
if (!data
|
|
310
|
+
// Validate structure: only a missing schedules array makes the file corrupt.
|
|
311
|
+
if (!isPlainObject(data) || !Array.isArray(data.schedules)) {
|
|
293
312
|
throw new Error('Invalid schedules file: missing schedules array');
|
|
294
313
|
}
|
|
295
|
-
//
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
314
|
+
// #991: validate each entry on its own. A malformed entry is disabled
|
|
315
|
+
// (when it can still be addressed by id) or skipped; it never makes the
|
|
316
|
+
// whole file "corrupt", which used to back up and REMOVE schedules.json.
|
|
317
|
+
const schedules = [];
|
|
318
|
+
const skipped = [];
|
|
319
|
+
const seen = new Set();
|
|
320
|
+
for (const entry of data.schedules) {
|
|
321
|
+
if (!isPlainObject(entry) || typeof entry.id !== 'string' || entry.id.length === 0 || seen.has(entry.id)) {
|
|
322
|
+
skipped.push(entry);
|
|
323
|
+
continue;
|
|
299
324
|
}
|
|
300
|
-
|
|
301
|
-
|
|
325
|
+
const schedule = entry;
|
|
326
|
+
seen.add(schedule.id);
|
|
327
|
+
const reason = scheduleDisabledReason(entry);
|
|
328
|
+
if (reason) {
|
|
329
|
+
schedule.disabledReason = reason;
|
|
302
330
|
if (schedule.enabled) {
|
|
303
|
-
console.warn(`[PersistentScheduler] Disabled schedule ${schedule.id}: ${
|
|
331
|
+
console.warn(`[PersistentScheduler] Disabled schedule ${schedule.id}: ${reason}`);
|
|
304
332
|
}
|
|
305
333
|
schedule.enabled = false;
|
|
306
334
|
}
|
|
307
335
|
else {
|
|
308
336
|
delete schedule.disabledReason;
|
|
309
337
|
}
|
|
338
|
+
schedules.push(schedule);
|
|
310
339
|
}
|
|
311
|
-
return data;
|
|
340
|
+
return { file: { ...data, schedules }, skipped };
|
|
312
341
|
}
|
|
313
342
|
/**
|
|
314
343
|
* Write schedules to disk
|
|
315
344
|
*/
|
|
316
|
-
async writeSchedules(schedules) {
|
|
345
|
+
async writeSchedules(schedules, skipped = []) {
|
|
346
|
+
// #991: entries skipped on load are not written back; keep a copy next to
|
|
347
|
+
// the file first so nothing a user stored is lost silently.
|
|
348
|
+
if (skipped.length > 0) {
|
|
349
|
+
const quarantinePath = `${this.schedulesPath}.quarantine.${Date.now()}.json`;
|
|
350
|
+
fs.writeFileSync(quarantinePath, JSON.stringify({
|
|
351
|
+
quarantinedAt: new Date().toISOString(),
|
|
352
|
+
reason: 'Malformed schedule entries (not an object, no id, or duplicate id)',
|
|
353
|
+
entries: skipped,
|
|
354
|
+
}, null, 2), { encoding: 'utf-8', flag: 'wx' });
|
|
355
|
+
console.warn(`[PersistentScheduler] Moved ${skipped.length} malformed schedule entries to ${quarantinePath}`);
|
|
356
|
+
}
|
|
317
357
|
const data = {
|
|
318
358
|
version: FILE_VERSION,
|
|
319
359
|
updatedAt: new Date().toISOString(),
|
|
@@ -329,17 +369,7 @@ export class PersistentScheduler {
|
|
|
329
369
|
async handleCorruptFile(error) {
|
|
330
370
|
const errorMsg = toErrorMessage(error);
|
|
331
371
|
this.log(`Corrupt schedules file detected: ${errorMsg}`);
|
|
332
|
-
|
|
333
|
-
const backupPath = `${this.schedulesPath}.corrupt.${Date.now()}`;
|
|
334
|
-
try {
|
|
335
|
-
if (fs.existsSync(this.schedulesPath)) {
|
|
336
|
-
fs.copyFileSync(this.schedulesPath, backupPath);
|
|
337
|
-
this.log(`Backed up corrupt file to: ${backupPath}`);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
catch (backupError) {
|
|
341
|
-
this.log(`Failed to backup corrupt file: ${backupError}`);
|
|
342
|
-
}
|
|
372
|
+
this.backupCorruptFile(error);
|
|
343
373
|
// Remove corrupt file
|
|
344
374
|
try {
|
|
345
375
|
if (fs.existsSync(this.schedulesPath)) {
|
|
@@ -351,6 +381,20 @@ export class PersistentScheduler {
|
|
|
351
381
|
this.log(`Failed to remove corrupt file: ${removeError}`);
|
|
352
382
|
}
|
|
353
383
|
}
|
|
384
|
+
/** Copy an unparseable schedules file to `.corrupt.<ts>` (left in place). */
|
|
385
|
+
backupCorruptFile(error) {
|
|
386
|
+
this.log(`Corrupt schedules file detected: ${toErrorMessage(error)}`);
|
|
387
|
+
const backupPath = `${this.schedulesPath}.corrupt.${Date.now()}`;
|
|
388
|
+
try {
|
|
389
|
+
if (fs.existsSync(this.schedulesPath)) {
|
|
390
|
+
fs.copyFileSync(this.schedulesPath, backupPath, fs.constants.COPYFILE_EXCL);
|
|
391
|
+
this.log(`Backed up corrupt file to: ${backupPath}`);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
catch (backupError) {
|
|
395
|
+
this.log(`Failed to backup corrupt file: ${backupError}`);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
354
398
|
/**
|
|
355
399
|
* Execute a function with file locking for safe concurrent access
|
|
356
400
|
*/
|
|
@@ -433,6 +477,28 @@ export class PersistentScheduler {
|
|
|
433
477
|
}
|
|
434
478
|
}
|
|
435
479
|
// ============================================================================
|
|
480
|
+
// Entry validation (#991)
|
|
481
|
+
// ============================================================================
|
|
482
|
+
function isPlainObject(value) {
|
|
483
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Why a persisted entry cannot run, or undefined when it is valid. Such
|
|
487
|
+
* entries are kept (disabled) so `workflow list` shows them with the reason.
|
|
488
|
+
*/
|
|
489
|
+
function scheduleDisabledReason(entry) {
|
|
490
|
+
if (!Object.prototype.hasOwnProperty.call(entry, 'schedule')) {
|
|
491
|
+
return 'Missing cron expression (no schedule field)';
|
|
492
|
+
}
|
|
493
|
+
if (typeof entry.schedule !== 'string' || !isValidCronExpression(entry.schedule)) {
|
|
494
|
+
return `Invalid cron expression: ${String(entry.schedule)}`;
|
|
495
|
+
}
|
|
496
|
+
if (typeof entry.workflowId !== 'string' || entry.workflowId.length === 0) {
|
|
497
|
+
return 'Missing workflowId';
|
|
498
|
+
}
|
|
499
|
+
return undefined;
|
|
500
|
+
}
|
|
501
|
+
// ============================================================================
|
|
436
502
|
// Factory Function
|
|
437
503
|
// ============================================================================
|
|
438
504
|
/**
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import type { SecurityCoverage } from '../../domains/security-compliance/interfaces.js';
|
|
8
8
|
import type { SecurityScanEvidence } from '../../domains/security-compliance/scan-evidence.js';
|
|
9
9
|
import type { discoverSecurityFiles } from '../../domains/security-compliance/scan-discovery.js';
|
|
10
|
+
import type { DependencyScanReport } from '../../domains/security-compliance/dependency-advisory-engine.js';
|
|
10
11
|
export type OutputFormat = 'text' | 'json' | 'sarif' | 'junit' | 'markdown';
|
|
11
12
|
export interface CIOutputOptions {
|
|
12
13
|
format: OutputFormat;
|
|
@@ -20,6 +21,8 @@ export interface SecurityVulnerability {
|
|
|
20
21
|
message: string;
|
|
21
22
|
ruleId?: string;
|
|
22
23
|
cweId?: string;
|
|
24
|
+
/** CVE id of a dependency advisory, when the advisory has one (#1049). */
|
|
25
|
+
cveId?: string;
|
|
23
26
|
}
|
|
24
27
|
export interface SecurityScanResult {
|
|
25
28
|
vulnerabilities: SecurityVulnerability[];
|
|
@@ -38,6 +41,8 @@ export interface SecurityScanResult {
|
|
|
38
41
|
coverage?: SecurityCoverage;
|
|
39
42
|
evidence?: SecurityScanEvidence;
|
|
40
43
|
discovery?: Awaited<ReturnType<typeof discoverSecurityFiles>>['discovery'];
|
|
44
|
+
/** #1049: OSV dependency advisory scan; any status but 'complete' is not a clean result. */
|
|
45
|
+
dependencyScan?: DependencyScanReport;
|
|
41
46
|
}
|
|
42
47
|
export type SecurityExecutionStatus = 'complete' | 'partial' | 'none' | 'failed' | 'not-run' | 'unverified';
|
|
43
48
|
export interface SecurityCheckResult {
|
|
@@ -71,8 +76,15 @@ export interface CoverageResult {
|
|
|
71
76
|
function: number | null;
|
|
72
77
|
statement: number | null;
|
|
73
78
|
};
|
|
74
|
-
|
|
79
|
+
/** `null` = no verdict: nothing was measured (UNMEASURED or estimate only, #1012). */
|
|
80
|
+
meetsThreshold: boolean | null;
|
|
75
81
|
threshold: number;
|
|
82
|
+
/** Provenance, the same vocabulary as MCP `coverage_analyze_sublinear` (#1012). */
|
|
83
|
+
measured?: boolean;
|
|
84
|
+
estimated?: boolean;
|
|
85
|
+
unmeasured?: boolean;
|
|
86
|
+
coverageMethod?: string;
|
|
87
|
+
warning?: string;
|
|
76
88
|
files?: Array<{
|
|
77
89
|
path: string;
|
|
78
90
|
lineCoverage: number;
|
|
@@ -207,17 +207,28 @@ export function toJUnit(summary) {
|
|
|
207
207
|
// ============================================================================
|
|
208
208
|
export function coverageToMarkdown(result) {
|
|
209
209
|
let md = `# Coverage Report\n\n`;
|
|
210
|
+
// #1012: an estimate is labelled and carries no verdict.
|
|
211
|
+
if (result.estimated) {
|
|
212
|
+
md += `> **STATIC ESTIMATE — not measured.** ${result.warning ?? ''}\n\n`;
|
|
213
|
+
}
|
|
214
|
+
const evaluated = result.meetsThreshold !== null && !result.estimated;
|
|
215
|
+
// #1027 N7: one decimal, never `~33.33333333333333%`.
|
|
216
|
+
const fmt = (v) => String(Math.round(v * 10) / 10);
|
|
210
217
|
md += `| Metric | Value | Status |\n`;
|
|
211
218
|
md += `|--------|-------|--------|\n`;
|
|
212
219
|
// #995: an uncollected metric is "n/a", with no pass/fail mark — it is not 0%.
|
|
213
220
|
const row = (label, v) => v === null
|
|
214
221
|
? `| ${label} | n/a (not collected) | \u2014 |\n`
|
|
215
|
-
:
|
|
222
|
+
: evaluated
|
|
223
|
+
? `| ${label} | ${fmt(v)}% | ${v >= result.threshold ? '\u2705' : '\u274C'} |\n`
|
|
224
|
+
: `| ${label} | ~${fmt(v)}% (estimate) | \u2014 |\n`;
|
|
216
225
|
md += row('Lines', result.summary.line);
|
|
217
226
|
md += row('Branches', result.summary.branch);
|
|
218
227
|
md += row('Functions', result.summary.function);
|
|
219
228
|
md += row('Statements', result.summary.statement);
|
|
220
|
-
md +=
|
|
229
|
+
md += evaluated
|
|
230
|
+
? `\n**Threshold:** ${result.threshold}% \u2014 ${result.meetsThreshold ? '\u2705 Met' : '\u274C Not met'}\n`
|
|
231
|
+
: `\n**Threshold:** ${result.threshold}% \u2014 not evaluated (UNMEASURED)\n`;
|
|
221
232
|
if (result.gaps && result.gaps.length > 0) {
|
|
222
233
|
md += `\n## Coverage Gaps\n\n`;
|
|
223
234
|
md += `| File | Uncovered Lines | Risk | Severity |\n`;
|
|
@@ -286,6 +297,14 @@ export function securityToMarkdown(result) {
|
|
|
286
297
|
if (result.evidence || result.discovery) {
|
|
287
298
|
md += `## Execution receipts\n\n\`\`\`json\n${toJSON({ evidence: result.evidence, discovery: result.discovery })}\n\`\`\`\n\n`;
|
|
288
299
|
}
|
|
300
|
+
if (result.dependencyScan) {
|
|
301
|
+
md += `## Dependency advisories (OSV)\n\n**Status:** ${result.dependencyScan.status}\n\n${result.dependencyScan.message}\n\n`;
|
|
302
|
+
for (const pkg of result.dependencyScan.uncheckedPackages) {
|
|
303
|
+
md += `- not checked: ${pkg.name}@${pkg.version} (${pkg.reason})\n`;
|
|
304
|
+
}
|
|
305
|
+
if (result.dependencyScan.uncheckedPackages.length > 0)
|
|
306
|
+
md += '\n';
|
|
307
|
+
}
|
|
289
308
|
if (result.vulnerabilities.length > 0) {
|
|
290
309
|
md += `## Vulnerabilities\n\n`;
|
|
291
310
|
md += `| Severity | Type | File | Line | Message |\n`;
|
|
@@ -50,6 +50,9 @@ export interface CoverageData {
|
|
|
50
50
|
/**
|
|
51
51
|
* Try to read real coverage data from a coverage-final.json file.
|
|
52
52
|
* Returns null if no instrumented coverage is available.
|
|
53
|
+
*
|
|
54
|
+
* #1012: per-file figures come from the shared istanbul parser, so the CLI
|
|
55
|
+
* and MCP compute "line" coverage the same way (source lines, not statements).
|
|
53
56
|
*/
|
|
54
57
|
export declare function readInstrumentedCoverage(projectRoot: string): Map<string, FileCoverage> | null;
|
|
55
58
|
/** Aggregate per-file coverage into whole-number percentages. */
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import * as fs from 'fs';
|
|
13
13
|
import * as path from 'path';
|
|
14
|
+
import { parseCoverageJson } from '../../coordination/handlers/handler-utils.js';
|
|
14
15
|
// ============================================================================
|
|
15
16
|
// V8/Istanbul Coverage Reader
|
|
16
17
|
// ============================================================================
|
|
@@ -23,6 +24,9 @@ const COVERAGE_JSON_PATHS = [
|
|
|
23
24
|
/**
|
|
24
25
|
* Try to read real coverage data from a coverage-final.json file.
|
|
25
26
|
* Returns null if no instrumented coverage is available.
|
|
27
|
+
*
|
|
28
|
+
* #1012: per-file figures come from the shared istanbul parser, so the CLI
|
|
29
|
+
* and MCP compute "line" coverage the same way (source lines, not statements).
|
|
26
30
|
*/
|
|
27
31
|
export function readInstrumentedCoverage(projectRoot) {
|
|
28
32
|
for (const relPath of COVERAGE_JSON_PATHS) {
|
|
@@ -30,50 +34,16 @@ export function readInstrumentedCoverage(projectRoot) {
|
|
|
30
34
|
if (!fs.existsSync(fullPath))
|
|
31
35
|
continue;
|
|
32
36
|
try {
|
|
33
|
-
const
|
|
37
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
38
|
+
const raw = JSON.parse(content);
|
|
34
39
|
// coverage-summary.json has a different shape
|
|
35
40
|
if (raw.total && raw.total.lines) {
|
|
36
41
|
return readCoverageSummary(raw, projectRoot);
|
|
37
42
|
}
|
|
38
43
|
// coverage-final.json: Record<filepath, IstanbulFileCoverage>
|
|
39
44
|
const coverageMap = new Map();
|
|
40
|
-
for (const
|
|
41
|
-
|
|
42
|
-
const stmtKeys = Object.keys(cov.s);
|
|
43
|
-
const stmtCovered = stmtKeys.filter(k => cov.s[k] > 0).length;
|
|
44
|
-
const branchKeys = Object.keys(cov.b);
|
|
45
|
-
let branchTotal = 0;
|
|
46
|
-
let branchCovered = 0;
|
|
47
|
-
for (const k of branchKeys) {
|
|
48
|
-
for (const count of cov.b[k]) {
|
|
49
|
-
branchTotal++;
|
|
50
|
-
if (count > 0)
|
|
51
|
-
branchCovered++;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
const fnKeys = Object.keys(cov.f);
|
|
55
|
-
const fnCovered = fnKeys.filter(k => cov.f[k] > 0).length;
|
|
56
|
-
// Compute uncovered lines from statement map
|
|
57
|
-
const coveredLineSet = new Set();
|
|
58
|
-
const allLineSet = new Set();
|
|
59
|
-
for (const stmtKey of stmtKeys) {
|
|
60
|
-
const stmt = cov.statementMap[stmtKey];
|
|
61
|
-
for (let line = stmt.start.line; line <= stmt.end.line; line++) {
|
|
62
|
-
allLineSet.add(line);
|
|
63
|
-
if (cov.s[stmtKey] > 0)
|
|
64
|
-
coveredLineSet.add(line);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
const uncoveredLines = [...allLineSet].filter(l => !coveredLineSet.has(l)).sort((a, b) => a - b);
|
|
68
|
-
coverageMap.set(filePath, {
|
|
69
|
-
path: filePath,
|
|
70
|
-
lines: { covered: coveredLineSet.size, total: allLineSet.size },
|
|
71
|
-
branches: { covered: branchCovered, total: branchTotal },
|
|
72
|
-
functions: { covered: fnCovered, total: fnKeys.length },
|
|
73
|
-
statements: { covered: stmtCovered, total: stmtKeys.length },
|
|
74
|
-
uncoveredLines,
|
|
75
|
-
uncoveredBranches: uncoveredLines.slice(0, Math.floor(uncoveredLines.length / 2)),
|
|
76
|
-
});
|
|
45
|
+
for (const file of parseCoverageJson(content).files) {
|
|
46
|
+
coverageMap.set(file.path, file);
|
|
77
47
|
}
|
|
78
48
|
return coverageMap.size > 0 ? coverageMap : null;
|
|
79
49
|
}
|
|
@@ -167,11 +137,16 @@ export function summarizeCoverage(files) {
|
|
|
167
137
|
const safeDiv = (a, b) => b > 0 ? Math.round((a / b) * 100) : 0;
|
|
168
138
|
const totalLines = sum(f => f.lines.total);
|
|
169
139
|
const coveredLines = sum(f => f.lines.covered);
|
|
140
|
+
// #1012: statements are statements. A report without statement detail
|
|
141
|
+
// (lcov) carries its line figures in `statements`, so this falls back alike.
|
|
142
|
+
const totalStatements = sum(f => f.statements.total);
|
|
170
143
|
return {
|
|
171
144
|
line: safeDiv(coveredLines, totalLines),
|
|
172
145
|
branch: safeDiv(sum(f => f.branches.covered), sum(f => f.branches.total)),
|
|
173
146
|
function: safeDiv(sum(f => f.functions.covered), sum(f => f.functions.total)),
|
|
174
|
-
statement:
|
|
147
|
+
statement: totalStatements > 0
|
|
148
|
+
? safeDiv(sum(f => f.statements.covered), totalStatements)
|
|
149
|
+
: safeDiv(coveredLines, totalLines),
|
|
175
150
|
files: files.length,
|
|
176
151
|
};
|
|
177
152
|
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Shared CLI coverage verdict (#995, #1010, #1012)
|
|
3
|
+
*
|
|
4
|
+
* One resolution and one verdict for every CLI surface that reports coverage
|
|
5
|
+
* (`aqe coverage`, the `aqe ci` coverage phase), built on the same shared
|
|
6
|
+
* functions as the MCP `coverage_analyze_sublinear` handler
|
|
7
|
+
* (`resolveExistingCoverage`, `thresholdVerdict`, `reconcileRecommendations`):
|
|
8
|
+
*
|
|
9
|
+
* - measured — an instrumented report covers the target: judged on the
|
|
10
|
+
* metrics the report collected (an uncollected metric is null,
|
|
11
|
+
* never 0%, and is left out of the threshold);
|
|
12
|
+
* - unmeasured — the report has no entry for the target, the runner ran 0
|
|
13
|
+
* tests, or only test files were reported: no figure, exit 3;
|
|
14
|
+
* - estimate — no report exists, so the CLI shows a labelled STATIC
|
|
15
|
+
* ESTIMATE. It carries no threshold verdict, is never
|
|
16
|
+
* persisted as evidence, and also exits 3: nothing was measured;
|
|
17
|
+
* - error — the target is missing or the given report is unreadable.
|
|
18
|
+
*/
|
|
19
|
+
import { type CoverageData } from './coverage-data.js';
|
|
20
|
+
import { type NoDataReason } from '../../coordination/handlers/coverage-target.js';
|
|
21
|
+
/** `aqe coverage` exit code when no coverage measurement exists for the target (#995). */
|
|
22
|
+
export declare const EXIT_UNMEASURED = 3;
|
|
23
|
+
/** Provenance labels, the same vocabulary as MCP `coverage_analyze_sublinear`. */
|
|
24
|
+
export declare const MEASURED_METHOD = "instrumented-report";
|
|
25
|
+
export declare const ESTIMATE_METHOD = "static-estimation";
|
|
26
|
+
export type CliCoverage = {
|
|
27
|
+
kind: 'data';
|
|
28
|
+
data: CoverageData;
|
|
29
|
+
projectRoot?: string;
|
|
30
|
+
} | {
|
|
31
|
+
kind: 'no-data';
|
|
32
|
+
reason: NoDataReason;
|
|
33
|
+
message: string;
|
|
34
|
+
} | {
|
|
35
|
+
kind: 'no-sources';
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Resolve the coverage data for a CLI target (#995).
|
|
39
|
+
*
|
|
40
|
+
* Uses the SAME resolution and verdict as the MCP handler
|
|
41
|
+
* (`resolveExistingCoverage`), so CLI and MCP cannot disagree about what a
|
|
42
|
+
* report says for a target:
|
|
43
|
+
* - a coverage report file (lcov.info, coverage-final.json, ...) is parsed
|
|
44
|
+
* directly;
|
|
45
|
+
* - a directory or source file is scoped against the instrumented report of
|
|
46
|
+
* its PROJECT ROOT (nearest package.json/.git above it), not the cwd;
|
|
47
|
+
* - with no report at the project root, the CLI falls back to its labelled
|
|
48
|
+
* heuristic estimate (the CLI never runs the test suite).
|
|
49
|
+
*/
|
|
50
|
+
export declare function resolveCliCoverageData(targetPath: string, log?: (message: string) => void): Promise<CliCoverage>;
|
|
51
|
+
/** Which optional metrics an instrumented report actually carries. */
|
|
52
|
+
export declare function metricsCollected(data: CoverageData): {
|
|
53
|
+
branch: boolean;
|
|
54
|
+
function: boolean;
|
|
55
|
+
statement: boolean;
|
|
56
|
+
};
|
|
57
|
+
/** The slice of the coverage-analysis domain API the verdict needs. */
|
|
58
|
+
export interface CoverageAnalyzeAPI {
|
|
59
|
+
analyze(request: {
|
|
60
|
+
coverageData: CoverageData;
|
|
61
|
+
threshold?: number;
|
|
62
|
+
includeFileDetails?: boolean;
|
|
63
|
+
measured?: boolean;
|
|
64
|
+
projectRoot?: string;
|
|
65
|
+
}): Promise<{
|
|
66
|
+
success: boolean;
|
|
67
|
+
value?: unknown;
|
|
68
|
+
error?: Error;
|
|
69
|
+
}>;
|
|
70
|
+
}
|
|
71
|
+
/** Summary figures; `null` = not collected / not measured — never 0%. */
|
|
72
|
+
export interface NullableSummary {
|
|
73
|
+
line: number | null;
|
|
74
|
+
branch: number | null;
|
|
75
|
+
function: number | null;
|
|
76
|
+
statement: number | null;
|
|
77
|
+
}
|
|
78
|
+
export type CliCoverageOutcome = {
|
|
79
|
+
kind: 'no-sources';
|
|
80
|
+
} | {
|
|
81
|
+
kind: 'error';
|
|
82
|
+
reason: NoDataReason;
|
|
83
|
+
message: string;
|
|
84
|
+
} | {
|
|
85
|
+
kind: 'unmeasured';
|
|
86
|
+
reason: NoDataReason;
|
|
87
|
+
message: string;
|
|
88
|
+
} | {
|
|
89
|
+
kind: 'analysis-failed';
|
|
90
|
+
message: string;
|
|
91
|
+
} | {
|
|
92
|
+
kind: 'estimate';
|
|
93
|
+
data: CoverageData;
|
|
94
|
+
/** Estimated figures — for display only. */
|
|
95
|
+
summary: NullableSummary & {
|
|
96
|
+
files: number;
|
|
97
|
+
};
|
|
98
|
+
message: string;
|
|
99
|
+
} | {
|
|
100
|
+
kind: 'measured';
|
|
101
|
+
data: CoverageData;
|
|
102
|
+
summary: NullableSummary & {
|
|
103
|
+
files: number;
|
|
104
|
+
};
|
|
105
|
+
collected: {
|
|
106
|
+
branch: boolean;
|
|
107
|
+
function: boolean;
|
|
108
|
+
statement: boolean;
|
|
109
|
+
};
|
|
110
|
+
verdict: {
|
|
111
|
+
overall: number;
|
|
112
|
+
meetsThreshold: boolean;
|
|
113
|
+
};
|
|
114
|
+
recommendations: string[];
|
|
115
|
+
};
|
|
116
|
+
/** Caller-facing explanation of a static estimate. */
|
|
117
|
+
export declare function estimateMessage(): string;
|
|
118
|
+
/**
|
|
119
|
+
* Resolve, analyze and judge coverage for a CLI target. Shared by
|
|
120
|
+
* `aqe coverage` and the `aqe ci` coverage phase.
|
|
121
|
+
*/
|
|
122
|
+
export declare function evaluateCliCoverage(api: CoverageAnalyzeAPI, targetPath: string, threshold: number, log?: (message: string) => void): Promise<CliCoverageOutcome>;
|
|
123
|
+
/**
|
|
124
|
+
* Exit code: 0 meets (by more than 5%), 1 below / error, 2 within 5% above,
|
|
125
|
+
* 3 UNMEASURED (not in the report, 0 tests, test-only report, or estimate only).
|
|
126
|
+
*/
|
|
127
|
+
export declare function coverageExitCode(outcome: CliCoverageOutcome, threshold: number): number;
|
|
128
|
+
/** The `-F json` document for an outcome (same shape in every case). */
|
|
129
|
+
export declare function coverageJson(outcome: CliCoverageOutcome, threshold: number, target: string): Record<string, unknown>;
|
|
130
|
+
//# sourceMappingURL=coverage-verdict.d.ts.map
|