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
package/dist/plugins/cache.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
import * as fs from 'fs';
|
|
9
9
|
import * as path from 'path';
|
|
10
10
|
import { validVersion, newestVersionFirst } from './version-policy.js';
|
|
11
|
+
import { getProjectStorePath } from '../kernel/project-root.js';
|
|
11
12
|
// ============================================================================
|
|
12
13
|
// PluginCache
|
|
13
14
|
// ============================================================================
|
|
@@ -16,7 +17,7 @@ export class PluginCache {
|
|
|
16
17
|
keepVersions;
|
|
17
18
|
constructor(options = {}) {
|
|
18
19
|
this.cacheDir = options.cacheDir
|
|
19
|
-
??
|
|
20
|
+
?? getProjectStorePath('plugins');
|
|
20
21
|
this.keepVersions = options.keepVersions ?? 2;
|
|
21
22
|
}
|
|
22
23
|
/** Check if a specific version is cached. */
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import * as path from 'path';
|
|
8
8
|
import { execFileSync } from 'child_process';
|
|
9
9
|
import { parseManifest } from '../manifest.js';
|
|
10
|
+
import { getProjectStorePath } from '../../kernel/project-root.js';
|
|
10
11
|
// ============================================================================
|
|
11
12
|
// Input Validation
|
|
12
13
|
// ============================================================================
|
|
@@ -28,7 +29,7 @@ export class GitHubPluginSource {
|
|
|
28
29
|
type = 'github';
|
|
29
30
|
cacheDir;
|
|
30
31
|
constructor(cacheDir) {
|
|
31
|
-
this.cacheDir = cacheDir ??
|
|
32
|
+
this.cacheDir = cacheDir ?? getProjectStorePath('plugins-cache');
|
|
32
33
|
}
|
|
33
34
|
async resolve(location) {
|
|
34
35
|
const pluginPath = await this.getPluginPath(location);
|
|
@@ -9,6 +9,7 @@ import * as path from 'path';
|
|
|
9
9
|
import * as fs from 'fs';
|
|
10
10
|
import { execFileSync } from 'child_process';
|
|
11
11
|
import { parseManifest } from '../manifest.js';
|
|
12
|
+
import { getProjectStorePath } from '../../kernel/project-root.js';
|
|
12
13
|
// ============================================================================
|
|
13
14
|
// Input Validation
|
|
14
15
|
// ============================================================================
|
|
@@ -30,7 +31,7 @@ export class NpmPluginSource {
|
|
|
30
31
|
type = 'npm';
|
|
31
32
|
cacheDir;
|
|
32
33
|
constructor(cacheDir) {
|
|
33
|
-
this.cacheDir = cacheDir ??
|
|
34
|
+
this.cacheDir = cacheDir ?? getProjectStorePath('plugins-cache', 'npm');
|
|
34
35
|
}
|
|
35
36
|
async resolve(location) {
|
|
36
37
|
const pluginPath = await this.getPluginPath(location);
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AQE-managed directories that source walkers must not treat as project code
|
|
3
|
+
* (#999, review N4 / round 2b).
|
|
4
|
+
*
|
|
5
|
+
* - `.agentic-qe/` is AQE runtime state (workers, results, DBs) at ANY depth;
|
|
6
|
+
* it is never source.
|
|
7
|
+
* - `.claude/` holds the assets `aqe init` writes (helpers, skills, agents).
|
|
8
|
+
* It is AQE-managed at the walk root, and nested only when it sits next to
|
|
9
|
+
* a `.agentic-qe/` (a nested `aqe init` in a monorepo package). A nested
|
|
10
|
+
* `.claude/` with no AQE install beside it (e.g. a Claude Code plugin's own
|
|
11
|
+
* `.claude/hooks/*.ts`) is the package's source and is walked.
|
|
12
|
+
*/
|
|
13
|
+
export declare const AQE_STATE_DIR = ".agentic-qe";
|
|
14
|
+
export declare const AQE_CLAUDE_DIR = ".claude";
|
|
15
|
+
/** True when directory `name` inside `parentDir` is AQE-managed (never project source). */
|
|
16
|
+
export declare function isAqeManagedDir(parentDir: string, name: string, isWalkRoot: boolean): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Root-relative ('/'-separated) paths of the AQE-managed `.claude` directories
|
|
19
|
+
* under `projectRoot`: the root one (if present) and every `.claude` that has a
|
|
20
|
+
* sibling `.agentic-qe`. Used to anchor cloc/tokei excludes. Bounded walk that
|
|
21
|
+
* skips `skipDirs` and dot-directories.
|
|
22
|
+
*/
|
|
23
|
+
export declare function findAqeClaudeDirs(projectRoot: string, skipDirs?: readonly string[], maxDepth?: number): string[];
|
|
24
|
+
//# sourceMappingURL=aqe-managed-dirs.d.ts.map
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AQE-managed directories that source walkers must not treat as project code
|
|
3
|
+
* (#999, review N4 / round 2b).
|
|
4
|
+
*
|
|
5
|
+
* - `.agentic-qe/` is AQE runtime state (workers, results, DBs) at ANY depth;
|
|
6
|
+
* it is never source.
|
|
7
|
+
* - `.claude/` holds the assets `aqe init` writes (helpers, skills, agents).
|
|
8
|
+
* It is AQE-managed at the walk root, and nested only when it sits next to
|
|
9
|
+
* a `.agentic-qe/` (a nested `aqe init` in a monorepo package). A nested
|
|
10
|
+
* `.claude/` with no AQE install beside it (e.g. a Claude Code plugin's own
|
|
11
|
+
* `.claude/hooks/*.ts`) is the package's source and is walked.
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, readdirSync } from 'fs';
|
|
14
|
+
import { join } from 'path';
|
|
15
|
+
export const AQE_STATE_DIR = '.agentic-qe';
|
|
16
|
+
export const AQE_CLAUDE_DIR = '.claude';
|
|
17
|
+
/** True when directory `name` inside `parentDir` is AQE-managed (never project source). */
|
|
18
|
+
export function isAqeManagedDir(parentDir, name, isWalkRoot) {
|
|
19
|
+
if (name === AQE_STATE_DIR)
|
|
20
|
+
return true;
|
|
21
|
+
if (name === AQE_CLAUDE_DIR)
|
|
22
|
+
return isWalkRoot || existsSync(join(parentDir, AQE_STATE_DIR));
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Root-relative ('/'-separated) paths of the AQE-managed `.claude` directories
|
|
27
|
+
* under `projectRoot`: the root one (if present) and every `.claude` that has a
|
|
28
|
+
* sibling `.agentic-qe`. Used to anchor cloc/tokei excludes. Bounded walk that
|
|
29
|
+
* skips `skipDirs` and dot-directories.
|
|
30
|
+
*/
|
|
31
|
+
export function findAqeClaudeDirs(projectRoot, skipDirs = [], maxDepth = 12) {
|
|
32
|
+
const skip = new Set(skipDirs);
|
|
33
|
+
const found = [];
|
|
34
|
+
const walk = (dir, rel, depth) => {
|
|
35
|
+
if (existsSync(join(dir, AQE_CLAUDE_DIR)) && (depth === 0 || existsSync(join(dir, AQE_STATE_DIR)))) {
|
|
36
|
+
found.push(rel ? `${rel}/${AQE_CLAUDE_DIR}` : AQE_CLAUDE_DIR);
|
|
37
|
+
}
|
|
38
|
+
if (depth >= maxDepth)
|
|
39
|
+
return;
|
|
40
|
+
let entries;
|
|
41
|
+
try {
|
|
42
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
for (const entry of entries) {
|
|
48
|
+
if (!entry.isDirectory() || entry.name.startsWith('.') || skip.has(entry.name))
|
|
49
|
+
continue;
|
|
50
|
+
walk(join(dir, entry.name), rel ? `${rel}/${entry.name}` : entry.name, depth + 1);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
walk(projectRoot, '', 0);
|
|
54
|
+
return found;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=aqe-managed-dirs.js.map
|
|
@@ -54,10 +54,15 @@ export declare const TestExecutionEvents: {
|
|
|
54
54
|
export interface CoverageReportPayload {
|
|
55
55
|
reportId: string;
|
|
56
56
|
line: number;
|
|
57
|
-
branch
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
/** `null` = the report collected no branch data (not 0%, #1027). */
|
|
58
|
+
branch: number | null;
|
|
59
|
+
/** `null` = the report collected no function data (not 0%, #1027). */
|
|
60
|
+
function: number | null;
|
|
61
|
+
/** `null` = the report collected no statement data (lcov, Cobertura). */
|
|
62
|
+
statement: number | null;
|
|
60
63
|
files: number;
|
|
64
|
+
/** Outcome of the test run behind the report, when known (#1027 N4). */
|
|
65
|
+
runStatus?: 'passed' | 'failed';
|
|
61
66
|
/** False for a static estimate; consumers must not store it as coverage (#1008). */
|
|
62
67
|
measured?: boolean;
|
|
63
68
|
}
|
|
@@ -67,7 +72,17 @@ export interface CoverageGapPayload {
|
|
|
67
72
|
uncoveredLines: number[];
|
|
68
73
|
uncoveredBranches: number[];
|
|
69
74
|
riskScore: number;
|
|
75
|
+
/**
|
|
76
|
+
* Provenance (#1014): true only for a gap found in MEASURED coverage. Gaps
|
|
77
|
+
* from a static estimate are never published; consumers must ignore any
|
|
78
|
+
* event without `measured: true` (legacy or foreign publishers).
|
|
79
|
+
*/
|
|
80
|
+
measured: boolean;
|
|
81
|
+
/** How the underlying coverage was obtained, e.g. 'instrumented-report'. */
|
|
82
|
+
coverageMethod?: string;
|
|
70
83
|
}
|
|
84
|
+
/** Is this CoverageGapDetected payload a gap in measured coverage? (#1014, fail-closed) */
|
|
85
|
+
export declare function isMeasuredGapPayload(payload: unknown): boolean;
|
|
71
86
|
export declare const CoverageAnalysisEvents: {
|
|
72
87
|
readonly CoverageReportCreated: "coverage-analysis.CoverageReportCreated";
|
|
73
88
|
readonly CoverageGapDetected: "coverage-analysis.CoverageGapDetected";
|
|
@@ -28,6 +28,10 @@ export const TestExecutionEvents = {
|
|
|
28
28
|
FlakyTestDetected: 'test-execution.FlakyTestDetected',
|
|
29
29
|
RetryTriggered: 'test-execution.RetryTriggered',
|
|
30
30
|
};
|
|
31
|
+
/** Is this CoverageGapDetected payload a gap in measured coverage? (#1014, fail-closed) */
|
|
32
|
+
export function isMeasuredGapPayload(payload) {
|
|
33
|
+
return !!payload && typeof payload === 'object' && payload.measured === true;
|
|
34
|
+
}
|
|
31
35
|
export const CoverageAnalysisEvents = {
|
|
32
36
|
CoverageReportCreated: 'coverage-analysis.CoverageReportCreated',
|
|
33
37
|
CoverageGapDetected: 'coverage-analysis.CoverageGapDetected',
|
|
@@ -5,6 +5,12 @@
|
|
|
5
5
|
import { Result } from '../types';
|
|
6
6
|
export interface RequestOptions {
|
|
7
7
|
timeout?: number;
|
|
8
|
+
/**
|
|
9
|
+
* Absolute cap on the whole request including the body read (#980 review N6).
|
|
10
|
+
* `timeout` is an idle deadline for the body, so this bounds a peer that trickles
|
|
11
|
+
* bytes just often enough to reset it. Default: MAX_DURATION_TIMEOUT_MULTIPLE × timeout.
|
|
12
|
+
*/
|
|
13
|
+
maxDurationMs?: number;
|
|
8
14
|
retries?: number;
|
|
9
15
|
retryDelay?: number;
|
|
10
16
|
headers?: Record<string, string>;
|
|
@@ -4,10 +4,13 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { ok, err } from '../types/index.js';
|
|
6
6
|
import { toError } from '../error-utils.js';
|
|
7
|
+
import { fetchWithResponseDeadline } from '../llm/providers/response-deadline.js';
|
|
7
8
|
// ============================================================================
|
|
8
9
|
// Constants
|
|
9
10
|
// ============================================================================
|
|
10
11
|
const DEFAULT_TIMEOUT = 30000;
|
|
12
|
+
/** Default absolute request cap as a multiple of the idle timeout (#980 review N6). */
|
|
13
|
+
const MAX_DURATION_TIMEOUT_MULTIPLE = 4;
|
|
11
14
|
const DEFAULT_RETRIES = 3;
|
|
12
15
|
const DEFAULT_RETRY_DELAY = 1000;
|
|
13
16
|
const CIRCUIT_BREAKER_THRESHOLD = 5;
|
|
@@ -170,6 +173,7 @@ export class HttpClient {
|
|
|
170
173
|
*/
|
|
171
174
|
async request(url, fetchOptions, options) {
|
|
172
175
|
const timeout = options?.timeout ?? DEFAULT_TIMEOUT;
|
|
176
|
+
const maxDurationMs = options?.maxDurationMs ?? timeout * MAX_DURATION_TIMEOUT_MULTIPLE;
|
|
173
177
|
const maxRetries = options?.retries ?? DEFAULT_RETRIES;
|
|
174
178
|
const baseRetryDelay = options?.retryDelay ?? DEFAULT_RETRY_DELAY;
|
|
175
179
|
const useCircuitBreaker = options?.circuitBreaker ?? true;
|
|
@@ -198,7 +202,7 @@ export class HttpClient {
|
|
|
198
202
|
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
199
203
|
timing.retryCount = attempt;
|
|
200
204
|
try {
|
|
201
|
-
const response = await this.fetchWithTimeout(url, { ...fetchOptions, headers }, timeout);
|
|
205
|
+
const response = await this.fetchWithTimeout(url, { ...fetchOptions, headers }, timeout, maxDurationMs);
|
|
202
206
|
timing.endTime = Date.now();
|
|
203
207
|
timing.duration = timing.endTime - timing.startTime;
|
|
204
208
|
// Record success for circuit breaker
|
|
@@ -233,19 +237,13 @@ export class HttpClient {
|
|
|
233
237
|
/**
|
|
234
238
|
* Fetch with timeout using AbortController
|
|
235
239
|
*/
|
|
236
|
-
async fetchWithTimeout(url, options, timeout) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
});
|
|
244
|
-
return response;
|
|
245
|
-
}
|
|
246
|
-
finally {
|
|
247
|
-
clearTimeout(timeoutId);
|
|
248
|
-
}
|
|
240
|
+
async fetchWithTimeout(url, options, timeout, maxDurationMs) {
|
|
241
|
+
// #980 bug class: the timer used to be cleared as soon as headers arrived,
|
|
242
|
+
// so callers reading the body of a peer that stalls mid-body hung forever.
|
|
243
|
+
// The deadline now also covers the body, as an idle deadline (reset on
|
|
244
|
+
// every chunk) so slow but progressing downloads keep working, plus an
|
|
245
|
+
// absolute cap (maxDurationMs) so a trickling peer cannot hold it forever.
|
|
246
|
+
return fetchWithResponseDeadline(url, options, timeout, () => Object.assign(new Error(`Request timeout (idle ${timeout}ms, cap ${maxDurationMs}ms): ${url}`), { name: 'TimeoutError' }), 'idle', maxDurationMs);
|
|
249
247
|
}
|
|
250
248
|
/**
|
|
251
249
|
* Determine error code from error type
|
|
@@ -261,7 +259,7 @@ export class HttpClient {
|
|
|
261
259
|
while (typeof current === 'object' && current !== null && !visited.has(current)) {
|
|
262
260
|
visited.add(current);
|
|
263
261
|
const detail = current;
|
|
264
|
-
if (detail.name === 'AbortError')
|
|
262
|
+
if (detail.name === 'AbortError' || detail.name === 'TimeoutError')
|
|
265
263
|
return 'TIMEOUT';
|
|
266
264
|
const message = typeof detail.message === 'string' ? detail.message : '';
|
|
267
265
|
if (detail.code === 'ECONNREFUSED' || message.includes('ECONNREFUSED'))
|
|
@@ -12,6 +12,15 @@ export interface FileReaderOptions {
|
|
|
12
12
|
cacheTtlMs?: number;
|
|
13
13
|
/** Whether to enable caching (default: true) */
|
|
14
14
|
enableCache?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Opt-in in-root containment for `readFile` (#1021). A path that resolves
|
|
17
|
+
* inside this directory is accepted when its realpath stays inside the
|
|
18
|
+
* root's realpath (a symlink escaping the root is rejected); the legacy
|
|
19
|
+
* name-pattern validator is not applied to it, so names such as
|
|
20
|
+
* `[...slug].tsx`, in-root dot-dirs and deep paths are readable. Paths
|
|
21
|
+
* outside the root keep every legacy check. Omit to keep legacy behaviour.
|
|
22
|
+
*/
|
|
23
|
+
projectRoot?: string;
|
|
15
24
|
}
|
|
16
25
|
export interface CacheEntry<T> {
|
|
17
26
|
value: T;
|
|
@@ -49,6 +58,8 @@ export declare class FileReader {
|
|
|
49
58
|
private readonly basePath;
|
|
50
59
|
private readonly cache;
|
|
51
60
|
private readonly enableCache;
|
|
61
|
+
private readonly projectRoot?;
|
|
62
|
+
private projectRootReal?;
|
|
52
63
|
private stats;
|
|
53
64
|
constructor(options?: FileReaderOptions);
|
|
54
65
|
/**
|
|
@@ -56,6 +67,21 @@ export declare class FileReader {
|
|
|
56
67
|
* SEC-004 FIX: Validates path to prevent directory traversal attacks
|
|
57
68
|
*/
|
|
58
69
|
private resolvePath;
|
|
70
|
+
/**
|
|
71
|
+
* #1021: decide whether a path is handled by in-root containment. Returns
|
|
72
|
+
* undefined when the path is not lexically inside the root (or no root is
|
|
73
|
+
* configured), so the caller applies the legacy checks.
|
|
74
|
+
*/
|
|
75
|
+
private inProjectRoot;
|
|
76
|
+
/**
|
|
77
|
+
* #1021 round 2b: read an in-root path without a check-then-use race.
|
|
78
|
+
* The file is OPENED first and the open descriptor is verified — its real
|
|
79
|
+
* location (/proc/self/fd/N on Linux; otherwise the re-resolved realpath,
|
|
80
|
+
* which must be the same inode) must lie inside the root — and the content
|
|
81
|
+
* is read from that same descriptor. Swapping a symlink (file or directory
|
|
82
|
+
* component) between the check and the read can no longer redirect it.
|
|
83
|
+
*/
|
|
84
|
+
private readContained;
|
|
59
85
|
/**
|
|
60
86
|
* Read file contents as a string
|
|
61
87
|
* SEC-004: Now handles PathTraversalError from path validation
|
|
@@ -7,6 +7,8 @@ import * as path from 'node:path';
|
|
|
7
7
|
import { ok, err } from '../types/index.js';
|
|
8
8
|
import { validatePath } from '../security/path-traversal-validator.js';
|
|
9
9
|
import { safeJsonParse } from '../safe-json.js';
|
|
10
|
+
/** Extensions never read, inside or outside the project root. */
|
|
11
|
+
const DENIED_EXTENSIONS = ['.exe', '.bat', '.cmd', '.ps1', '.dll', '.so'];
|
|
10
12
|
export class FileReadError extends Error {
|
|
11
13
|
filePath;
|
|
12
14
|
code;
|
|
@@ -44,6 +46,49 @@ export class PathTraversalError extends Error {
|
|
|
44
46
|
this.name = 'PathTraversalError';
|
|
45
47
|
}
|
|
46
48
|
}
|
|
49
|
+
/** Map a filesystem error to the reader's FileReadError. */
|
|
50
|
+
function readError(error, absolutePath) {
|
|
51
|
+
const nodeError = error;
|
|
52
|
+
let message;
|
|
53
|
+
switch (nodeError.code) {
|
|
54
|
+
case 'ENOENT':
|
|
55
|
+
message = 'File not found: ' + absolutePath;
|
|
56
|
+
break;
|
|
57
|
+
case 'EACCES':
|
|
58
|
+
message = 'Permission denied: ' + absolutePath;
|
|
59
|
+
break;
|
|
60
|
+
case 'EISDIR':
|
|
61
|
+
message = 'Path is a directory: ' + absolutePath;
|
|
62
|
+
break;
|
|
63
|
+
default:
|
|
64
|
+
message = 'Failed to read file: ' + absolutePath;
|
|
65
|
+
}
|
|
66
|
+
return new FileReadError(message, absolutePath, nodeError.code, nodeError);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* #1021 round 2b: where an OPEN descriptor really points. On Linux,
|
|
70
|
+
* /proc/self/fd/N resolves to the opened file itself. Elsewhere, re-resolve
|
|
71
|
+
* the path and accept it only if it is the same inode as the descriptor, so
|
|
72
|
+
* a swap after the open is detected. Returns null when it cannot be proven.
|
|
73
|
+
*/
|
|
74
|
+
async function openedLocation(fd, lexical, opened) {
|
|
75
|
+
const sameFile = async (candidate) => {
|
|
76
|
+
const st = await fs.stat(candidate).catch(() => null);
|
|
77
|
+
return st !== null && st.dev === opened.dev && st.ino === opened.ino;
|
|
78
|
+
};
|
|
79
|
+
const viaProc = await fs.realpath(`/proc/self/fd/${fd}`).catch(() => null);
|
|
80
|
+
if (viaProc && path.isAbsolute(viaProc) && await sameFile(viaProc))
|
|
81
|
+
return viaProc;
|
|
82
|
+
const real = await fs.realpath(lexical).catch(() => null);
|
|
83
|
+
if (real && await sameFile(real))
|
|
84
|
+
return real;
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
/** True when `candidate` is `root` or lies beneath it (both absolute). */
|
|
88
|
+
function isWithin(root, candidate) {
|
|
89
|
+
const relative = path.relative(root, candidate);
|
|
90
|
+
return relative === '' || (!relative.startsWith(`..${path.sep}`) && relative !== '..' && !path.isAbsolute(relative));
|
|
91
|
+
}
|
|
47
92
|
// ============================================================================
|
|
48
93
|
// LRU Cache Implementation
|
|
49
94
|
// ============================================================================
|
|
@@ -215,6 +260,8 @@ export class FileReader {
|
|
|
215
260
|
basePath;
|
|
216
261
|
cache;
|
|
217
262
|
enableCache;
|
|
263
|
+
projectRoot;
|
|
264
|
+
projectRootReal;
|
|
218
265
|
stats = {
|
|
219
266
|
cacheHits: 0,
|
|
220
267
|
cacheMisses: 0,
|
|
@@ -225,6 +272,7 @@ export class FileReader {
|
|
|
225
272
|
constructor(options = {}) {
|
|
226
273
|
this.basePath = options.basePath ?? process.cwd();
|
|
227
274
|
this.enableCache = options.enableCache ?? true;
|
|
275
|
+
this.projectRoot = options.projectRoot ? path.resolve(options.projectRoot) : undefined;
|
|
228
276
|
this.cache = new LRUCache(options.maxCacheSize ?? 100, options.cacheTtlMs ?? 5 * 60 * 1000 // 5 minutes default
|
|
229
277
|
);
|
|
230
278
|
}
|
|
@@ -252,7 +300,7 @@ export class FileReader {
|
|
|
252
300
|
allowAbsolute: true,
|
|
253
301
|
maxDepth: 10 + (isAbsolutePath ? baseDepth : 0),
|
|
254
302
|
// Allow common development file extensions
|
|
255
|
-
deniedExtensions:
|
|
303
|
+
deniedExtensions: DENIED_EXTENSIONS,
|
|
256
304
|
});
|
|
257
305
|
if (!validation.valid) {
|
|
258
306
|
throw new PathTraversalError(filePath, [validation.error || 'Path validation failed'], validation.riskLevel);
|
|
@@ -269,6 +317,64 @@ export class FileReader {
|
|
|
269
317
|
}
|
|
270
318
|
return path.resolve(this.basePath, filePath);
|
|
271
319
|
}
|
|
320
|
+
/**
|
|
321
|
+
* #1021: decide whether a path is handled by in-root containment. Returns
|
|
322
|
+
* undefined when the path is not lexically inside the root (or no root is
|
|
323
|
+
* configured), so the caller applies the legacy checks.
|
|
324
|
+
*/
|
|
325
|
+
async inProjectRoot(filePath) {
|
|
326
|
+
if (!this.projectRoot)
|
|
327
|
+
return undefined;
|
|
328
|
+
if (filePath.includes('\0')) {
|
|
329
|
+
throw new PathTraversalError(filePath, ['Null byte in path'], 'critical');
|
|
330
|
+
}
|
|
331
|
+
const lexical = path.resolve(this.basePath, filePath);
|
|
332
|
+
if (!isWithin(this.projectRoot, lexical))
|
|
333
|
+
return undefined;
|
|
334
|
+
if (DENIED_EXTENSIONS.includes(path.extname(lexical).toLowerCase())) {
|
|
335
|
+
throw new PathTraversalError(filePath, [`File extension '${path.extname(lexical)}' is not allowed`], 'high');
|
|
336
|
+
}
|
|
337
|
+
this.projectRootReal ??= fs.realpath(this.projectRoot).catch(() => null);
|
|
338
|
+
const rootReal = await this.projectRootReal;
|
|
339
|
+
if (!rootReal)
|
|
340
|
+
return undefined;
|
|
341
|
+
return { lexical, rootReal };
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* #1021 round 2b: read an in-root path without a check-then-use race.
|
|
345
|
+
* The file is OPENED first and the open descriptor is verified — its real
|
|
346
|
+
* location (/proc/self/fd/N on Linux; otherwise the re-resolved realpath,
|
|
347
|
+
* which must be the same inode) must lie inside the root — and the content
|
|
348
|
+
* is read from that same descriptor. Swapping a symlink (file or directory
|
|
349
|
+
* component) between the check and the read can no longer redirect it.
|
|
350
|
+
*/
|
|
351
|
+
async readContained(filePath, lexical, rootReal) {
|
|
352
|
+
this.stats.totalReads++;
|
|
353
|
+
let handle;
|
|
354
|
+
try {
|
|
355
|
+
handle = await fs.open(lexical, 'r');
|
|
356
|
+
}
|
|
357
|
+
catch (error) {
|
|
358
|
+
return err(readError(error, lexical));
|
|
359
|
+
}
|
|
360
|
+
try {
|
|
361
|
+
const opened = await handle.stat();
|
|
362
|
+
const location = await openedLocation(handle.fd, lexical, opened);
|
|
363
|
+
if (!location || !isWithin(rootReal, location)) {
|
|
364
|
+
return err(new PathTraversalError(filePath, ['Path resolves outside the project root'], 'critical'));
|
|
365
|
+
}
|
|
366
|
+
if (!opened.isFile()) {
|
|
367
|
+
return err(new FileReadError('Path is a directory: ' + lexical, lexical, 'EISDIR'));
|
|
368
|
+
}
|
|
369
|
+
return ok(await handle.readFile('utf-8'));
|
|
370
|
+
}
|
|
371
|
+
catch (error) {
|
|
372
|
+
return err(readError(error, lexical));
|
|
373
|
+
}
|
|
374
|
+
finally {
|
|
375
|
+
await handle.close().catch(() => undefined);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
272
378
|
/**
|
|
273
379
|
* Read file contents as a string
|
|
274
380
|
* SEC-004: Now handles PathTraversalError from path validation
|
|
@@ -277,6 +383,9 @@ export class FileReader {
|
|
|
277
383
|
let absolutePath;
|
|
278
384
|
// SEC-004: Handle path traversal errors from resolvePath
|
|
279
385
|
try {
|
|
386
|
+
const contained = await this.inProjectRoot(filePath);
|
|
387
|
+
if (contained)
|
|
388
|
+
return this.readContained(filePath, contained.lexical, contained.rootReal);
|
|
280
389
|
absolutePath = this.resolvePath(filePath);
|
|
281
390
|
}
|
|
282
391
|
catch (error) {
|
|
@@ -306,22 +415,7 @@ export class FileReader {
|
|
|
306
415
|
return ok(content);
|
|
307
416
|
}
|
|
308
417
|
catch (error) {
|
|
309
|
-
|
|
310
|
-
let message;
|
|
311
|
-
switch (nodeError.code) {
|
|
312
|
-
case 'ENOENT':
|
|
313
|
-
message = 'File not found: ' + absolutePath;
|
|
314
|
-
break;
|
|
315
|
-
case 'EACCES':
|
|
316
|
-
message = 'Permission denied: ' + absolutePath;
|
|
317
|
-
break;
|
|
318
|
-
case 'EISDIR':
|
|
319
|
-
message = 'Path is a directory: ' + absolutePath;
|
|
320
|
-
break;
|
|
321
|
-
default:
|
|
322
|
-
message = 'Failed to read file: ' + absolutePath;
|
|
323
|
-
}
|
|
324
|
-
return err(new FileReadError(message, absolutePath, nodeError.code, nodeError));
|
|
418
|
+
return err(readError(error, absolutePath));
|
|
325
419
|
}
|
|
326
420
|
}
|
|
327
421
|
/**
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Bound headers and bodies; streaming callers may use an idle body deadline.
|
|
3
|
+
* `maxDurationMs` adds an absolute cap from the start of the request, so an
|
|
4
|
+
* idle deadline cannot be held open forever by a peer that trickles bytes
|
|
5
|
+
* just often enough to reset it (#980 review N6).
|
|
6
|
+
*/
|
|
7
|
+
export declare function fetchWithResponseDeadline(url: string, options: RequestInit, timeoutMs: number, timeoutError: () => Error, bodyDeadline?: 'absolute' | 'idle', maxDurationMs?: number): Promise<Response>;
|
|
3
8
|
//# sourceMappingURL=response-deadline.d.ts.map
|
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Bound headers and bodies; streaming callers may use an idle body deadline.
|
|
3
|
+
* `maxDurationMs` adds an absolute cap from the start of the request, so an
|
|
4
|
+
* idle deadline cannot be held open forever by a peer that trickles bytes
|
|
5
|
+
* just often enough to reset it (#980 review N6).
|
|
6
|
+
*/
|
|
7
|
+
export async function fetchWithResponseDeadline(url, options, timeoutMs, timeoutError, bodyDeadline = 'absolute', maxDurationMs) {
|
|
3
8
|
const abort = new AbortController();
|
|
4
9
|
let expired = false;
|
|
5
10
|
let expireBody;
|
|
@@ -10,6 +15,13 @@ export async function fetchWithResponseDeadline(url, options, timeoutMs, timeout
|
|
|
10
15
|
abort.abort(error);
|
|
11
16
|
};
|
|
12
17
|
let timer = setTimeout(expire, timeoutMs);
|
|
18
|
+
const capTimer = maxDurationMs !== undefined && maxDurationMs > 0 ? setTimeout(expire, maxDurationMs) : undefined;
|
|
19
|
+
capTimer?.unref?.();
|
|
20
|
+
const clearTimers = () => {
|
|
21
|
+
clearTimeout(timer);
|
|
22
|
+
if (capTimer)
|
|
23
|
+
clearTimeout(capTimer);
|
|
24
|
+
};
|
|
13
25
|
const resetIdleDeadline = () => {
|
|
14
26
|
if (bodyDeadline !== 'idle')
|
|
15
27
|
return;
|
|
@@ -22,7 +34,7 @@ export async function fetchWithResponseDeadline(url, options, timeoutMs, timeout
|
|
|
22
34
|
try {
|
|
23
35
|
const response = await fetch(url, { ...options, signal: abort.signal });
|
|
24
36
|
if (!response.body) {
|
|
25
|
-
|
|
37
|
+
clearTimers();
|
|
26
38
|
return response;
|
|
27
39
|
}
|
|
28
40
|
resetIdleDeadline();
|
|
@@ -30,7 +42,7 @@ export async function fetchWithResponseDeadline(url, options, timeoutMs, timeout
|
|
|
30
42
|
let finished = false;
|
|
31
43
|
const finish = () => {
|
|
32
44
|
finished = true;
|
|
33
|
-
|
|
45
|
+
clearTimers();
|
|
34
46
|
};
|
|
35
47
|
const body = new ReadableStream({
|
|
36
48
|
start(controller) {
|
|
@@ -90,7 +102,7 @@ export async function fetchWithResponseDeadline(url, options, timeoutMs, timeout
|
|
|
90
102
|
return bounded;
|
|
91
103
|
}
|
|
92
104
|
catch (error) {
|
|
93
|
-
|
|
105
|
+
clearTimers();
|
|
94
106
|
if (expired || (error instanceof Error && error.name === 'AbortError')) {
|
|
95
107
|
throw timeoutError();
|
|
96
108
|
}
|
|
@@ -36,6 +36,21 @@ export interface DuplicationResult {
|
|
|
36
36
|
percentage: number;
|
|
37
37
|
duplicates: DuplicateBlock[];
|
|
38
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* #1011 / #1021: how one file's analysis counts as evidence.
|
|
41
|
+
* - `measured`: real metrics.
|
|
42
|
+
* - `excluded`: not source to judge (binary, generated, minified, type
|
|
43
|
+
* declarations, or refused by the reader's path policy) — leave it out.
|
|
44
|
+
* - `failed`: source that could not be read or parsed — a gap in the scope.
|
|
45
|
+
*/
|
|
46
|
+
export type FileAnalysisStatus = 'measured' | 'excluded' | 'failed';
|
|
47
|
+
export interface FileAnalysisOutcome {
|
|
48
|
+
status: FileAnalysisStatus;
|
|
49
|
+
/** Metrics computed from the file; null when excluded or unreadable. */
|
|
50
|
+
metrics: FileMetrics | null;
|
|
51
|
+
/** Why the file is excluded or failed. */
|
|
52
|
+
reason?: string;
|
|
53
|
+
}
|
|
39
54
|
export interface DuplicateBlock {
|
|
40
55
|
lines: number;
|
|
41
56
|
occurrences: number;
|
|
@@ -53,6 +68,15 @@ export declare class CodeMetricsAnalyzer {
|
|
|
53
68
|
* Analyze a single file for all metrics
|
|
54
69
|
*/
|
|
55
70
|
analyzeFile(filePath: string): Promise<FileMetrics | null>;
|
|
71
|
+
/**
|
|
72
|
+
* #1011 / #1021: analyse a file and say whether its metrics are evidence.
|
|
73
|
+
* Binary, generated, minified and declaration files — and files the reader
|
|
74
|
+
* refuses by policy — are `excluded`; unreadable or unparseable source is
|
|
75
|
+
* `failed`. Callers must not treat either as a measurement.
|
|
76
|
+
*/
|
|
77
|
+
analyzeFileDetailed(filePath: string): Promise<FileAnalysisOutcome>;
|
|
78
|
+
/** Compute metrics, reporting read errors and parse failures separately. */
|
|
79
|
+
private analyzeWithDiagnostics;
|
|
56
80
|
/**
|
|
57
81
|
* Analyze function-level metrics
|
|
58
82
|
*/
|