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
|
@@ -0,0 +1,113 @@
|
|
|
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 * as fs from 'fs/promises';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
export const DEPENDENCY_ADVISORY_ENGINE_ID = 'osv-dependency-advisories';
|
|
12
|
+
/** The package.json for a scan target: the target directory's, else the project root's. */
|
|
13
|
+
export async function findPackageJson(targetPath, env = process.env) {
|
|
14
|
+
let dir = targetPath;
|
|
15
|
+
try {
|
|
16
|
+
if (!(await fs.stat(targetPath)).isDirectory())
|
|
17
|
+
dir = path.dirname(targetPath);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
dir = path.dirname(targetPath);
|
|
21
|
+
}
|
|
22
|
+
const candidates = [dir, env.AQE_PROJECT_ROOT ? path.resolve(env.AQE_PROJECT_ROOT) : null];
|
|
23
|
+
for (const candidate of candidates) {
|
|
24
|
+
if (!candidate)
|
|
25
|
+
continue;
|
|
26
|
+
const manifest = path.join(candidate, 'package.json');
|
|
27
|
+
try {
|
|
28
|
+
if ((await fs.stat(manifest)).isFile())
|
|
29
|
+
return manifest;
|
|
30
|
+
}
|
|
31
|
+
catch { /* try next */ }
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
/** Human message for a dependency scan outcome. */
|
|
36
|
+
export const DEPENDENCY_SCOPE_NOTE = 'direct dependencies of this package.json only; workspace members and transitive dependencies are not checked';
|
|
37
|
+
export function dependencyScanMessage(report) {
|
|
38
|
+
return `${statusMessage(report)} Scope: ${DEPENDENCY_SCOPE_NOTE}.`;
|
|
39
|
+
}
|
|
40
|
+
function statusMessage(report) {
|
|
41
|
+
switch (report.status) {
|
|
42
|
+
case 'complete':
|
|
43
|
+
return report.packagesRequested === 0
|
|
44
|
+
? `No registry dependencies to check${report.localPackages.length ? ` (${report.localPackages.length} local package(s) excluded)` : ' in package.json'}; nothing to check (complete).`
|
|
45
|
+
: `Dependency advisories checked for all ${report.packagesChecked} package(s): ${report.vulnerabilities} advisory finding(s).`;
|
|
46
|
+
case 'incomplete':
|
|
47
|
+
return (report.uncheckedPackages.length > 0
|
|
48
|
+
? `Dependency advisories could not be checked for ${report.uncheckedPackages.length} of ${report.packagesRequested} package(s); ` : '') +
|
|
49
|
+
(report.resolutionErrors.length > 0 ? `${report.resolutionErrors.slice(0, 3).join('; ')}; ` : '') +
|
|
50
|
+
`${report.vulnerabilities} finding(s) from the ${report.packagesChecked} checked package(s). Dependency scan is INCOMPLETE, not clean.`;
|
|
51
|
+
case 'failed':
|
|
52
|
+
return `${report.error ?? `Dependency advisories could not be checked for ${report.uncheckedPackages.length} package(s)`}. ` +
|
|
53
|
+
'Dependency vulnerabilities are UNMEASURED, not zero.';
|
|
54
|
+
default:
|
|
55
|
+
return report.error ?? 'Dependency advisory scan did not run.';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function notRun(reason, manifest) {
|
|
59
|
+
const base = { status: 'not-run', measured: false, ...(manifest ? { manifest } : {}),
|
|
60
|
+
packagesRequested: 0, packagesChecked: 0, uncheckedPackages: [], localPackages: [],
|
|
61
|
+
resolutionErrors: [], scope: 'direct',
|
|
62
|
+
vulnerabilities: 0, error: reason };
|
|
63
|
+
return {
|
|
64
|
+
engine: { id: DEPENDENCY_ADVISORY_ENGINE_ID, requested: true, required: true, status: 'failed', scope: 'parent-directory',
|
|
65
|
+
...(manifest ? { target: manifest } : {}), analyzedFiles: 0, ruleCoverage: 'unknown', errors: [reason], limitations: [] },
|
|
66
|
+
vulnerabilities: [],
|
|
67
|
+
report: { ...base, message: dependencyScanMessage(base) },
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/** Run the OSV dependency scan for a target and describe it as an engine receipt. */
|
|
71
|
+
export async function runDependencyAdvisoryScan(scanner, targetPath) {
|
|
72
|
+
const manifest = await findPackageJson(targetPath);
|
|
73
|
+
if (!manifest)
|
|
74
|
+
return notRun('No package.json found for the dependency advisory scan.');
|
|
75
|
+
let scan;
|
|
76
|
+
try {
|
|
77
|
+
scan = await scanner.scanPackageJson(manifest);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
return notRun(`Dependency advisory scan failed: ${error instanceof Error ? error.message : String(error)}`, manifest);
|
|
81
|
+
}
|
|
82
|
+
if (!scan.success)
|
|
83
|
+
return notRun(`Dependency advisory scan did not run: ${scan.error.message}`, manifest);
|
|
84
|
+
const value = scan.value;
|
|
85
|
+
const unchecked = value.uncheckedPackages.map((p) => `${p.name}@${p.version}: ${p.reason}`);
|
|
86
|
+
const base = {
|
|
87
|
+
status: value.status, measured: value.measured, manifest, lockfile: value.lockfile ?? null,
|
|
88
|
+
packagesRequested: value.packagesScanned, packagesChecked: value.packagesChecked,
|
|
89
|
+
uncheckedPackages: value.uncheckedPackages, localPackages: value.localPackages ?? [],
|
|
90
|
+
resolutionErrors: value.resolutionErrors ?? [], scope: 'direct',
|
|
91
|
+
vulnerabilities: value.vulnerabilities.length,
|
|
92
|
+
scanId: value.scanId, ...(value.error ? { error: value.error } : {}),
|
|
93
|
+
};
|
|
94
|
+
return {
|
|
95
|
+
engine: {
|
|
96
|
+
id: DEPENDENCY_ADVISORY_ENGINE_ID, requested: true, required: true,
|
|
97
|
+
status: value.status === 'complete' ? 'completed' : value.status === 'incomplete' ? 'partial' : 'failed',
|
|
98
|
+
scope: 'parent-directory', target: manifest, ruleCoverage: 'unknown',
|
|
99
|
+
errors: [...(value.error ? [value.error] : []), ...(value.resolutionErrors ?? []), ...unchecked.slice(0, 20),
|
|
100
|
+
...(unchecked.length > 20 ? [`... and ${unchecked.length - 20} more unchecked package(s)`] : [])],
|
|
101
|
+
limitations: [
|
|
102
|
+
value.lockfile
|
|
103
|
+
? `Direct dependencies are checked at the versions ${value.lockfile} resolves (when in sync with package.json); transitive dependencies are not checked.`
|
|
104
|
+
: 'No lockfile: only exact versions in package.json are checked; ranges are reported unchecked. Transitive dependencies are not checked.',
|
|
105
|
+
...((value.localPackages ?? []).length > 0
|
|
106
|
+
? [`${value.localPackages.length} local workspace/linked package(s) are not OSV subjects and were excluded.`] : []),
|
|
107
|
+
],
|
|
108
|
+
},
|
|
109
|
+
vulnerabilities: value.vulnerabilities,
|
|
110
|
+
report: { ...base, message: dependencyScanMessage(base) },
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=dependency-advisory-engine.js.map
|
|
@@ -214,6 +214,36 @@ export interface DependencyScanResult {
|
|
|
214
214
|
readonly vulnerabilities: Vulnerability[];
|
|
215
215
|
readonly outdatedPackages: OutdatedPackage[];
|
|
216
216
|
readonly summary: ScanSummary;
|
|
217
|
+
/**
|
|
218
|
+
* #1049: whether the advisory lookup covered every dependency. Only
|
|
219
|
+
* 'complete' is a measurement; 'incomplete' findings are real but partial,
|
|
220
|
+
* and 'failed' means no dependency was checked (never "0 vulnerabilities").
|
|
221
|
+
*/
|
|
222
|
+
readonly status: 'complete' | 'incomplete' | 'failed';
|
|
223
|
+
/** True only when status is 'complete'. */
|
|
224
|
+
readonly measured: boolean;
|
|
225
|
+
readonly packagesChecked: number;
|
|
226
|
+
readonly uncheckedPackages: UncheckedDependency[];
|
|
227
|
+
/** Why the scan is incomplete/failed; absent when complete. */
|
|
228
|
+
readonly error?: string;
|
|
229
|
+
}
|
|
230
|
+
/** A dependency whose advisories could not be checked, and why (#1049). */
|
|
231
|
+
export interface UncheckedDependency {
|
|
232
|
+
readonly name: string;
|
|
233
|
+
/** The spec as declared in the manifest. */
|
|
234
|
+
readonly version: string;
|
|
235
|
+
readonly reason: string;
|
|
236
|
+
/** Workspace member the dependency belongs to (absent for the scanned package itself). */
|
|
237
|
+
readonly member?: string;
|
|
238
|
+
/** The lockfile-resolved version, when the lockfile has one. */
|
|
239
|
+
readonly lockedVersion?: string;
|
|
240
|
+
}
|
|
241
|
+
/** A local (workspace / linked / file-directory) package: not an OSV subject (#1049). */
|
|
242
|
+
export interface LocalDependency {
|
|
243
|
+
readonly name: string;
|
|
244
|
+
readonly spec: string;
|
|
245
|
+
readonly reason: string;
|
|
246
|
+
readonly member?: string;
|
|
217
247
|
}
|
|
218
248
|
export interface PackageSecurityInfo {
|
|
219
249
|
readonly name: string;
|
|
@@ -8,7 +8,7 @@ import { BaseDomainPlugin, TaskHandler } from '../domain-interface.js';
|
|
|
8
8
|
import { FilePath } from '../../shared/value-objects/index.js';
|
|
9
9
|
import type { SecurityAuditOptions, SecurityAuditReport, SecurityPosture, ComplianceReport, ComplianceStandard, SASTResult, DASTResult, Vulnerability, GapAnalysis } from './interfaces.js';
|
|
10
10
|
import { type IExtendedSecurityComplianceCoordinator, type CoordinatorConfig } from './coordinator.js';
|
|
11
|
-
import { type ISecurityScannerService, type SecurityScannerConfig } from './services/security-scanner.js';
|
|
11
|
+
import { type ISecurityScannerService, type SecurityScannerConfig, type DependencyScanResult as OSVDependencyScanResult } from './services/security-scanner.js';
|
|
12
12
|
import { type ISecurityAuditorService, type SecurityAuditorConfig } from './services/security-auditor.js';
|
|
13
13
|
import type { HybridRouter } from '../../shared/llm/router/hybrid-router.js';
|
|
14
14
|
import { type IExtendedComplianceValidationService, type ComplianceValidatorConfig } from './services/compliance-validator.js';
|
|
@@ -26,6 +26,11 @@ export interface SecurityComplianceAPI {
|
|
|
26
26
|
getSecurityPosture(): Promise<Result<SecurityPosture>>;
|
|
27
27
|
runSASTScan(files: FilePath[]): Promise<Result<SASTResult>>;
|
|
28
28
|
runDASTScan(targetUrl: string): Promise<Result<DASTResult>>;
|
|
29
|
+
/**
|
|
30
|
+
* #1049: OSV advisory scan of a package.json. Check `status`: only 'complete'
|
|
31
|
+
* is a measurement; 'incomplete'/'failed' list the unchecked dependencies.
|
|
32
|
+
*/
|
|
33
|
+
runDependencyScan(packageJsonPath: string): Promise<Result<OSVDependencyScanResult>>;
|
|
29
34
|
triageVulnerabilities(vulnerabilities: Vulnerability[]): Promise<Result<{
|
|
30
35
|
immediate: Vulnerability[];
|
|
31
36
|
shortTerm: Vulnerability[];
|
|
@@ -66,6 +71,7 @@ export declare class SecurityCompliancePlugin extends BaseDomainPlugin {
|
|
|
66
71
|
protected onEvent(event: DomainEvent): Promise<void>;
|
|
67
72
|
private runSecurityAudit;
|
|
68
73
|
private getSecurityPosture;
|
|
74
|
+
private runDependencyScan;
|
|
69
75
|
private runSASTScan;
|
|
70
76
|
private runDASTScan;
|
|
71
77
|
private triageVulnerabilities;
|
|
@@ -49,6 +49,7 @@ export class SecurityCompliancePlugin extends BaseDomainPlugin {
|
|
|
49
49
|
getSecurityPosture: this.getSecurityPosture.bind(this),
|
|
50
50
|
runSASTScan: this.runSASTScan.bind(this),
|
|
51
51
|
runDASTScan: this.runDASTScan.bind(this),
|
|
52
|
+
runDependencyScan: this.runDependencyScan.bind(this),
|
|
52
53
|
triageVulnerabilities: this.triageVulnerabilities.bind(this),
|
|
53
54
|
runComplianceCheck: this.runComplianceCheck.bind(this),
|
|
54
55
|
getAvailableStandards: this.getAvailableStandards.bind(this),
|
|
@@ -209,6 +210,24 @@ export class SecurityCompliancePlugin extends BaseDomainPlugin {
|
|
|
209
210
|
return this.handleError(error);
|
|
210
211
|
}
|
|
211
212
|
}
|
|
213
|
+
async runDependencyScan(packageJsonPath) {
|
|
214
|
+
this.ensureInitialized();
|
|
215
|
+
try {
|
|
216
|
+
const result = await this.securityScanner.scanPackageJson(packageJsonPath);
|
|
217
|
+
if (result.success && result.value.status === 'complete') {
|
|
218
|
+
this.trackSuccessfulOperation('dependency-scan');
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
this.trackFailedOperation('dependency-scan', result.success
|
|
222
|
+
? new Error(result.value.error ?? 'Dependency advisory scan incomplete')
|
|
223
|
+
: result.error);
|
|
224
|
+
}
|
|
225
|
+
return result;
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
return this.handleError(error);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
212
231
|
async runSASTScan(files) {
|
|
213
232
|
this.ensureInitialized();
|
|
214
233
|
try {
|
|
@@ -6,6 +6,7 @@ import { LoggerFactory } from '../../../../logging/index.js';
|
|
|
6
6
|
import { v4 as uuidv4 } from 'uuid';
|
|
7
7
|
import { ok, err } from '../../../../shared/types/index.js';
|
|
8
8
|
import { toError } from '../../../../shared/error-utils.js';
|
|
9
|
+
import { fetchWithResponseDeadline } from '../../../../shared/llm/providers/response-deadline.js';
|
|
9
10
|
import { analyzeSecurityHeaders, analyzeCookieSecurity, analyzeServerHeaders, scanSensitiveFiles, analyzeCORS, extractAndCrawlLinks, testXSS, testSQLi, analyzeFormsForSecurityIssues, testAuthorizationBypass, testIDOR, validateCredentials, buildAuthHeaders, handleFetchError, calculateSummary, storeScanResults, } from './dast-helpers.js';
|
|
10
11
|
// ============================================================================
|
|
11
12
|
// DAST Scanner Service
|
|
@@ -144,20 +145,19 @@ export class DASTScanner {
|
|
|
144
145
|
}
|
|
145
146
|
const timeout = options.timeout ?? this.config.timeout;
|
|
146
147
|
const maxDepth = options.maxDepth ?? this.config.dastMaxDepth;
|
|
147
|
-
// Perform main page scan
|
|
148
|
-
|
|
149
|
-
|
|
148
|
+
// Perform main page scan. #980: the deadline must cover the body too —
|
|
149
|
+
// the target is untrusted and may send headers and then stall the body,
|
|
150
|
+
// so it stays armed until `response.clone().text()` below has finished.
|
|
151
|
+
const deadlineMs = Math.min(timeout, 30000);
|
|
150
152
|
try {
|
|
151
|
-
const response = await
|
|
153
|
+
const response = await fetchWithResponseDeadline(targetUrl, {
|
|
152
154
|
method: 'GET',
|
|
153
155
|
headers: {
|
|
154
156
|
'User-Agent': 'AgenticQE-DAST-Scanner/3.0',
|
|
155
157
|
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
156
158
|
},
|
|
157
|
-
signal: controller.signal,
|
|
158
159
|
redirect: 'follow',
|
|
159
|
-
});
|
|
160
|
-
clearTimeout(timeoutId);
|
|
160
|
+
}, deadlineMs, () => new Error(`DAST request timeout after ${deadlineMs}ms: ${targetUrl}`));
|
|
161
161
|
crawledUrls++;
|
|
162
162
|
// Security header analysis
|
|
163
163
|
analyzeSecurityHeaders(response.headers, targetUrl, vulnerabilities);
|
|
@@ -171,19 +171,25 @@ export class DASTScanner {
|
|
|
171
171
|
analyzeServerHeaders(response.headers, targetUrl, vulnerabilities);
|
|
172
172
|
// Active scanning features
|
|
173
173
|
if (options.activeScanning ?? this.config.dastActiveScanning) {
|
|
174
|
+
// Read the page body first, inside the request deadline (#980), so the
|
|
175
|
+
// slower probes below cannot use up the deadline of a healthy target.
|
|
176
|
+
const responseText = await response.text();
|
|
174
177
|
crawledUrls = await scanSensitiveFiles(parsedUrl, crawledUrls, maxDepth, vulnerabilities);
|
|
175
178
|
await analyzeCORS(targetUrl, vulnerabilities);
|
|
176
179
|
// Enhanced DAST: Link crawling, injection testing, form analysis
|
|
177
|
-
const responseText = await response.clone().text();
|
|
178
180
|
crawledUrls = await extractAndCrawlLinks(responseText, parsedUrl, crawledUrls, maxDepth, vulnerabilities);
|
|
179
181
|
if (parsedUrl.search) {
|
|
180
182
|
await this.testInjectionVulnerabilities(targetUrl, parsedUrl, vulnerabilities);
|
|
181
183
|
}
|
|
182
184
|
analyzeFormsForSecurityIssues(responseText, targetUrl, vulnerabilities);
|
|
183
185
|
}
|
|
186
|
+
else {
|
|
187
|
+
// Passive scan: headers only. Release the connection instead of
|
|
188
|
+
// leaving an unread body to the deadline timer.
|
|
189
|
+
await response.body?.cancel().catch(() => undefined);
|
|
190
|
+
}
|
|
184
191
|
}
|
|
185
192
|
catch (fetchError) {
|
|
186
|
-
clearTimeout(timeoutId);
|
|
187
193
|
handleFetchError(fetchError, targetUrl, vulnerabilities);
|
|
188
194
|
}
|
|
189
195
|
}
|
|
@@ -210,20 +216,21 @@ export class DASTScanner {
|
|
|
210
216
|
}
|
|
211
217
|
const timeout = options.timeout ?? this.config.timeout;
|
|
212
218
|
const maxDepth = options.maxDepth ?? this.config.dastMaxDepth;
|
|
213
|
-
|
|
214
|
-
|
|
219
|
+
// #980 review N8: same deadline treatment as the unauthenticated scan.
|
|
220
|
+
// This path reads headers only; the unread body is cancelled below so
|
|
221
|
+
// a target that stalls it cannot hold the connection open.
|
|
222
|
+
const deadlineMs = Math.min(timeout, 30000);
|
|
215
223
|
try {
|
|
216
|
-
const response = await
|
|
224
|
+
const response = await fetchWithResponseDeadline(targetUrl, {
|
|
217
225
|
method: 'GET',
|
|
218
226
|
headers: {
|
|
219
227
|
'User-Agent': 'AgenticQE-DAST-Scanner/3.0',
|
|
220
228
|
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
221
229
|
...authHeaders,
|
|
222
230
|
},
|
|
223
|
-
signal: controller.signal,
|
|
224
231
|
redirect: 'follow',
|
|
225
|
-
});
|
|
226
|
-
|
|
232
|
+
}, deadlineMs, () => new Error(`DAST request timeout after ${deadlineMs}ms: ${targetUrl}`));
|
|
233
|
+
await response.body?.cancel().catch(() => undefined);
|
|
227
234
|
crawledUrls++;
|
|
228
235
|
// Check if authentication was successful
|
|
229
236
|
if (response.status === 401 || response.status === 403) {
|
|
@@ -244,7 +251,6 @@ export class DASTScanner {
|
|
|
244
251
|
analyzeCookieSecurity(response.headers, targetUrl, vulnerabilities, true);
|
|
245
252
|
}
|
|
246
253
|
catch (fetchError) {
|
|
247
|
-
clearTimeout(timeoutId);
|
|
248
254
|
handleFetchError(fetchError, targetUrl, vulnerabilities);
|
|
249
255
|
}
|
|
250
256
|
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Dependency resolution for the OSV advisory scan (#1049)
|
|
3
|
+
*
|
|
4
|
+
* Decides, for every direct dependency of a package.json, what can be checked
|
|
5
|
+
* against OSV:
|
|
6
|
+
*
|
|
7
|
+
* - check: a registry package at a concrete version — the lockfile's
|
|
8
|
+
* resolved version when the lockfile is in sync with package.json,
|
|
9
|
+
* else an exact spec. `npm:` aliases resolve to the real package.
|
|
10
|
+
* - local: a workspace / linked / local-directory package. Not an OSV
|
|
11
|
+
* subject; listed separately and never makes a scan incomplete.
|
|
12
|
+
* - unchecked: anything that cannot be matched without guessing — a range
|
|
13
|
+
* with no (in-sync) lockfile resolution, a lockfile out of sync
|
|
14
|
+
* with package.json, git/URL/tarball sources.
|
|
15
|
+
*
|
|
16
|
+
* The lockfile is looked up from the package directory upwards (never above
|
|
17
|
+
* AQE_PROJECT_ROOT or the git root), so scanning a workspace member directly
|
|
18
|
+
* uses the workspace root's lockfile.
|
|
19
|
+
*
|
|
20
|
+
* Workspace member scanning is not part of 3.15.7 (#1057): at a workspace root
|
|
21
|
+
* only the root's own dependencies are checked and the scan is reported as not
|
|
22
|
+
* complete, with a reason; each member can be scanned directly.
|
|
23
|
+
*/
|
|
24
|
+
export interface ResolvedDependency {
|
|
25
|
+
/** Dependency name as declared (the alias name for `npm:` aliases). */
|
|
26
|
+
readonly name: string;
|
|
27
|
+
/** Spec as declared in package.json. */
|
|
28
|
+
readonly spec: string;
|
|
29
|
+
/** Lockfile importer the dependency belongs to ('' = the lockfile root). */
|
|
30
|
+
readonly member: string;
|
|
31
|
+
readonly kind: 'check' | 'local' | 'unchecked';
|
|
32
|
+
/** Registry package to check (differs from `name` for aliases). */
|
|
33
|
+
readonly packageName?: string;
|
|
34
|
+
/** Concrete version to check. */
|
|
35
|
+
readonly version?: string;
|
|
36
|
+
/** Lockfile-resolved version, also reported for unchecked packages when known. */
|
|
37
|
+
readonly lockedVersion?: string;
|
|
38
|
+
readonly reason?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface DependencyResolution {
|
|
41
|
+
readonly dependencies: ResolvedDependency[];
|
|
42
|
+
/** Lockfile used (relative to the scanned package.json directory), or null. */
|
|
43
|
+
readonly lockfile: string | null;
|
|
44
|
+
/** A lockfile that exists but could not be read or parsed. */
|
|
45
|
+
readonly error?: string;
|
|
46
|
+
/**
|
|
47
|
+
* Reasons the scan cannot be complete beyond individual packages — today: a
|
|
48
|
+
* workspace root, whose members' dependencies are not scanned (#1057).
|
|
49
|
+
*/
|
|
50
|
+
readonly memberErrors: string[];
|
|
51
|
+
}
|
|
52
|
+
/** The reason a workspace root's scan is not complete (#1057). */
|
|
53
|
+
export declare const WORKSPACE_NOT_SCANNED = "workspace member dependencies are not scanned yet (#1057); scan each member directory separately";
|
|
54
|
+
type Manifest = {
|
|
55
|
+
name?: unknown;
|
|
56
|
+
workspaces?: unknown;
|
|
57
|
+
} & Partial<Record<'dependencies' | 'devDependencies' | 'peerDependencies' | 'optionalDependencies', Record<string, unknown>>>;
|
|
58
|
+
/** All declared dependencies of a manifest (later fields win, as npm resolves them). */
|
|
59
|
+
export declare function declaredDependencies(manifest: Manifest): Record<string, string>;
|
|
60
|
+
/**
|
|
61
|
+
* Resolve a `name -> spec` record with caller-supplied resolved versions
|
|
62
|
+
* (programmatic use; no lockfile on disk). Same rules as `resolveDependencies`.
|
|
63
|
+
*/
|
|
64
|
+
export declare function resolveFromRecord(dependencies: Record<string, string>, lockedVersions?: Record<string, string>): ResolvedDependency[];
|
|
65
|
+
/**
|
|
66
|
+
* Resolve the dependencies to check for the package.json at `manifestPath`.
|
|
67
|
+
* @throws when package.json itself cannot be read or parsed.
|
|
68
|
+
*/
|
|
69
|
+
export declare function resolveDependencies(manifestPath: string): Promise<DependencyResolution>;
|
|
70
|
+
export {};
|
|
71
|
+
//# sourceMappingURL=dependency-resolver.d.ts.map
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Dependency resolution for the OSV advisory scan (#1049)
|
|
3
|
+
*
|
|
4
|
+
* Decides, for every direct dependency of a package.json, what can be checked
|
|
5
|
+
* against OSV:
|
|
6
|
+
*
|
|
7
|
+
* - check: a registry package at a concrete version — the lockfile's
|
|
8
|
+
* resolved version when the lockfile is in sync with package.json,
|
|
9
|
+
* else an exact spec. `npm:` aliases resolve to the real package.
|
|
10
|
+
* - local: a workspace / linked / local-directory package. Not an OSV
|
|
11
|
+
* subject; listed separately and never makes a scan incomplete.
|
|
12
|
+
* - unchecked: anything that cannot be matched without guessing — a range
|
|
13
|
+
* with no (in-sync) lockfile resolution, a lockfile out of sync
|
|
14
|
+
* with package.json, git/URL/tarball sources.
|
|
15
|
+
*
|
|
16
|
+
* The lockfile is looked up from the package directory upwards (never above
|
|
17
|
+
* AQE_PROJECT_ROOT or the git root), so scanning a workspace member directly
|
|
18
|
+
* uses the workspace root's lockfile.
|
|
19
|
+
*
|
|
20
|
+
* Workspace member scanning is not part of 3.15.7 (#1057): at a workspace root
|
|
21
|
+
* only the root's own dependencies are checked and the scan is reported as not
|
|
22
|
+
* complete, with a reason; each member can be scanned directly.
|
|
23
|
+
*/
|
|
24
|
+
import * as fs from 'fs/promises';
|
|
25
|
+
import * as path from 'path';
|
|
26
|
+
import semver from 'semver';
|
|
27
|
+
import { parse as parseYaml } from 'yaml';
|
|
28
|
+
import { safeJsonParse } from '../../../../shared/safe-json.js';
|
|
29
|
+
import { classifyNpmSpec, exactNpmVersion } from '../../../../shared/security/osv-lookup.js';
|
|
30
|
+
import { LOCKFILES, parseLockfile } from './lockfile-versions.js';
|
|
31
|
+
/** The reason a workspace root's scan is not complete (#1057). */
|
|
32
|
+
export const WORKSPACE_NOT_SCANNED = 'workspace member dependencies are not scanned yet (#1057); scan each member directory separately';
|
|
33
|
+
const OUT_OF_SYNC = 'lockfile out of sync with package.json';
|
|
34
|
+
/** All declared dependencies of a manifest (later fields win, as npm resolves them). */
|
|
35
|
+
export function declaredDependencies(manifest) {
|
|
36
|
+
const out = {};
|
|
37
|
+
for (const field of ['peerDependencies', 'optionalDependencies', 'devDependencies', 'dependencies']) {
|
|
38
|
+
for (const [name, spec] of Object.entries(manifest[field] ?? {})) {
|
|
39
|
+
if (typeof spec === 'string')
|
|
40
|
+
out[name] = spec;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
async function readManifest(file) {
|
|
46
|
+
return safeJsonParse(await fs.readFile(file, 'utf-8'));
|
|
47
|
+
}
|
|
48
|
+
async function exists(file) {
|
|
49
|
+
try {
|
|
50
|
+
await fs.access(file);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function realOrResolved(p) {
|
|
58
|
+
try {
|
|
59
|
+
return await fs.realpath(p);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return path.resolve(p);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Find the lockfile governing `dir`: walk up, but never above the project root
|
|
67
|
+
* (`AQE_PROJECT_ROOT` when `dir` is inside it) nor above the git root.
|
|
68
|
+
*/
|
|
69
|
+
async function findLockfile(dir, env = process.env) {
|
|
70
|
+
let current = await realOrResolved(dir);
|
|
71
|
+
const projectRoot = env.AQE_PROJECT_ROOT ? await realOrResolved(env.AQE_PROJECT_ROOT) : null;
|
|
72
|
+
const boundary = projectRoot && isInside(projectRoot, current) ? projectRoot : null;
|
|
73
|
+
for (;;) {
|
|
74
|
+
for (const file of LOCKFILES) {
|
|
75
|
+
if (await exists(path.join(current, file)))
|
|
76
|
+
return { dir: current, file };
|
|
77
|
+
}
|
|
78
|
+
if (current === boundary || await exists(path.join(current, '.git')))
|
|
79
|
+
return null;
|
|
80
|
+
const parent = path.dirname(current);
|
|
81
|
+
if (parent === current)
|
|
82
|
+
return null;
|
|
83
|
+
current = parent;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/** Whether `child` is `root` or inside it (both absolute, real paths). */
|
|
87
|
+
function isInside(root, child) {
|
|
88
|
+
const rel = path.relative(root, child);
|
|
89
|
+
return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));
|
|
90
|
+
}
|
|
91
|
+
/** Largest pnpm-workspace.yaml that is read; a larger one counts as a workspace root. */
|
|
92
|
+
const MAX_PNPM_WORKSPACE_BYTES = 1024 * 1024;
|
|
93
|
+
const nonEmptyArray = (v) => Array.isArray(v) && v.length > 0;
|
|
94
|
+
/**
|
|
95
|
+
* A workspace root, detected without expanding any glob: package.json
|
|
96
|
+
* `workspaces` is a non-empty array or an object with a non-empty `packages`,
|
|
97
|
+
* or a pnpm-workspace.yaml declares workspace packages.
|
|
98
|
+
*/
|
|
99
|
+
async function isWorkspaceRoot(dir, manifest) {
|
|
100
|
+
const ws = manifest.workspaces;
|
|
101
|
+
if (nonEmptyArray(ws))
|
|
102
|
+
return true;
|
|
103
|
+
if (ws !== null && typeof ws === 'object' && nonEmptyArray(ws.packages))
|
|
104
|
+
return true;
|
|
105
|
+
return pnpmDeclaresPackages(path.join(dir, 'pnpm-workspace.yaml'));
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* pnpm 10+ keeps project settings (nodeLinker, onlyBuiltDependencies, ...) in
|
|
109
|
+
* pnpm-workspace.yaml even for a single package, so only a file that declares
|
|
110
|
+
* `packages` is a workspace root. Fail closed: an unreadable, oversized,
|
|
111
|
+
* non-regular, dangling or unparsable file, or a `packages` that is not a list,
|
|
112
|
+
* counts as a root. No file, a map without `packages`, or `packages: []` does not.
|
|
113
|
+
*/
|
|
114
|
+
async function pnpmDeclaresPackages(file) {
|
|
115
|
+
try {
|
|
116
|
+
await fs.lstat(file);
|
|
117
|
+
}
|
|
118
|
+
catch (e) {
|
|
119
|
+
return e.code !== 'ENOENT';
|
|
120
|
+
}
|
|
121
|
+
let doc;
|
|
122
|
+
try {
|
|
123
|
+
const st = await fs.stat(file); // follows a link; a dangling one throws
|
|
124
|
+
if (!st.isFile() || st.size > MAX_PNPM_WORKSPACE_BYTES)
|
|
125
|
+
return true;
|
|
126
|
+
const text = await fs.readFile(file, 'utf-8');
|
|
127
|
+
doc = parseYaml(text, { uniqueKeys: false, merge: true, maxAliasCount: 100 });
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
if (doc === null || typeof doc !== 'object' || Array.isArray(doc))
|
|
133
|
+
return true;
|
|
134
|
+
if (!Object.prototype.hasOwnProperty.call(doc, 'packages'))
|
|
135
|
+
return false;
|
|
136
|
+
const packages = doc.packages;
|
|
137
|
+
return !Array.isArray(packages) || packages.length > 0;
|
|
138
|
+
}
|
|
139
|
+
/** Resolve one declared dependency of `member`. */
|
|
140
|
+
function resolveOne(name, spec, member, index, localNames) {
|
|
141
|
+
const base = { name, spec, member };
|
|
142
|
+
const kind = classifyNpmSpec(spec);
|
|
143
|
+
if (kind.kind === 'local')
|
|
144
|
+
return { ...base, kind: 'local', reason: 'local package (workspace/link/file directory)' };
|
|
145
|
+
if (kind.kind === 'remote') {
|
|
146
|
+
return { ...base, kind: 'unchecked', reason: `not a registry dependency ("${spec}": git/URL/tarball source); OSV advisories cannot be matched` };
|
|
147
|
+
}
|
|
148
|
+
const packageName = kind.kind === 'alias' ? kind.name : name;
|
|
149
|
+
const rangeSpec = kind.spec;
|
|
150
|
+
const locked = index?.resolve(member, name, spec);
|
|
151
|
+
if (locked?.local || (!locked && localNames.has(name))) {
|
|
152
|
+
return { ...base, kind: 'local', reason: 'workspace package (local source)' };
|
|
153
|
+
}
|
|
154
|
+
if (locked && index) {
|
|
155
|
+
const recorded = index.recordedSpec(member, name);
|
|
156
|
+
const lockedVersion = locked.version ? exactNpmVersion(locked.version) ?? undefined : undefined;
|
|
157
|
+
const specDiffers = recorded === undefined || (recorded !== null && recorded !== spec);
|
|
158
|
+
const unsatisfied = lockedVersion !== undefined && !!semver.validRange(rangeSpec)
|
|
159
|
+
&& !semver.satisfies(lockedVersion, rangeSpec, { includePrerelease: true });
|
|
160
|
+
if (specDiffers || unsatisfied) {
|
|
161
|
+
return {
|
|
162
|
+
...base, kind: 'unchecked', ...(lockedVersion ? { lockedVersion } : {}),
|
|
163
|
+
reason: `${OUT_OF_SYNC} (${index.file} has ${recorded ? `"${recorded}"` : 'no entry'}${lockedVersion ? ` -> ${lockedVersion}` : ''} for "${spec}")`,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
if (lockedVersion) {
|
|
167
|
+
return { ...base, kind: 'check', packageName: locked.realName ?? packageName, version: lockedVersion, lockedVersion };
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const exact = exactNpmVersion(rangeSpec);
|
|
171
|
+
if (exact)
|
|
172
|
+
return { ...base, kind: 'check', packageName, version: exact };
|
|
173
|
+
return { ...base, kind: 'unchecked', reason: `version range "${spec}", no lockfile resolution` };
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Resolve a `name -> spec` record with caller-supplied resolved versions
|
|
177
|
+
* (programmatic use; no lockfile on disk). Same rules as `resolveDependencies`.
|
|
178
|
+
*/
|
|
179
|
+
export function resolveFromRecord(dependencies, lockedVersions = {}) {
|
|
180
|
+
const index = {
|
|
181
|
+
file: 'package-lock.json',
|
|
182
|
+
members: () => [],
|
|
183
|
+
hasImporter: () => true,
|
|
184
|
+
recordedSpec: () => null,
|
|
185
|
+
resolve: (_importer, name) => (lockedVersions[name] !== undefined ? { version: lockedVersions[name] } : undefined),
|
|
186
|
+
};
|
|
187
|
+
return Object.entries(dependencies).map(([name, spec]) => resolveOne(name, spec, '', index, new Set()));
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Resolve the dependencies to check for the package.json at `manifestPath`.
|
|
191
|
+
* @throws when package.json itself cannot be read or parsed.
|
|
192
|
+
*/
|
|
193
|
+
export async function resolveDependencies(manifestPath) {
|
|
194
|
+
const manifestDir = path.dirname(path.resolve(manifestPath));
|
|
195
|
+
const manifest = await readManifest(manifestPath);
|
|
196
|
+
let index = null;
|
|
197
|
+
let lockDir = await realOrResolved(manifestDir);
|
|
198
|
+
const realManifestDir = lockDir;
|
|
199
|
+
let lockfile = null;
|
|
200
|
+
let error;
|
|
201
|
+
const found = await findLockfile(manifestDir);
|
|
202
|
+
if (found) {
|
|
203
|
+
const member = path.relative(found.dir, realManifestDir).split(path.sep).join('/');
|
|
204
|
+
try {
|
|
205
|
+
const parsed = parseLockfile(found.file, await fs.readFile(path.join(found.dir, found.file), 'utf-8'));
|
|
206
|
+
const rootManifest = member ? await readManifest(path.join(found.dir, 'package.json')).catch(() => ({})) : manifest;
|
|
207
|
+
// A member scanned directly: the root lockfile covers it if it lists the
|
|
208
|
+
// importer (npm/pnpm) or, for yarn, if the root declares workspaces.
|
|
209
|
+
const covers = member === '' || parsed.hasImporter(member) && (parsed.file !== 'yarn.lock'
|
|
210
|
+
|| await isWorkspaceRoot(found.dir, rootManifest));
|
|
211
|
+
if (covers) {
|
|
212
|
+
index = parsed;
|
|
213
|
+
lockDir = found.dir;
|
|
214
|
+
lockfile = path.relative(realManifestDir, path.join(found.dir, found.file)).split(path.sep).join('/');
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch (e) {
|
|
218
|
+
// #1049 round 4: a malformed lockfile is an error (the scan is not complete), not "no lockfile".
|
|
219
|
+
error = `${path.relative(realManifestDir, path.join(found.dir, found.file)).split(path.sep).join('/')} could not be read or parsed `
|
|
220
|
+
+ `(${e instanceof Error ? e.message.slice(0, 120) : 'error'}); versions were not resolved from it`;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const scannedMember = path.relative(lockDir, realManifestDir).split(path.sep).join('/');
|
|
224
|
+
// #1057: workspace members are not scanned in 3.15.7 — a workspace root is never complete.
|
|
225
|
+
const memberErrors = await isWorkspaceRoot(realManifestDir, manifest) ? [WORKSPACE_NOT_SCANNED] : [];
|
|
226
|
+
const dependencies = [];
|
|
227
|
+
for (const [name, spec] of Object.entries(declaredDependencies(manifest))) {
|
|
228
|
+
dependencies.push(resolveOne(name, spec, scannedMember, index, new Set()));
|
|
229
|
+
}
|
|
230
|
+
return { dependencies, lockfile, memberErrors, ...(error ? { error } : {}) };
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=dependency-resolver.js.map
|