agentic-qe 3.15.6 → 3.15.8

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.
Files changed (441) hide show
  1. package/.claude/skills/skills-manifest.json +1 -1
  2. package/CHANGELOG.md +263 -0
  3. package/README.md +2 -0
  4. package/assets/skills/skills-manifest.json +1 -1
  5. package/dist/cli/bundle.js +8 -6
  6. package/dist/cli/chunks/adapter-FC4EY447.js +2 -0
  7. package/dist/cli/chunks/{agent-booster-wasm-SY7UCLBL.js → agent-booster-wasm-W3V5P7LE.js} +2 -2
  8. package/dist/cli/chunks/{agent-handler-KAMYBU3S.js → agent-handler-2NQFHAWE.js} +2 -2
  9. package/dist/cli/chunks/{agent-memory-branch-2CAW3KUM.js → agent-memory-branch-457ECHHK.js} +2 -2
  10. package/dist/cli/chunks/aqe-learning-engine-AUAL6UBL.js +2 -0
  11. package/dist/cli/chunks/{arena-QCCVIOAH.js → arena-IYBQ3GPY.js} +4 -4
  12. package/dist/cli/chunks/{arena-4OFLJ3R2.js → arena-JV3WSEHU.js} +2 -2
  13. package/dist/cli/chunks/{audit-RBDQJQJB.js → audit-5OS3T3K6.js} +3 -3
  14. package/dist/cli/chunks/base-2XML4WH7.js +2 -0
  15. package/dist/cli/chunks/{better-sqlite3-5JRACCDQ.js → better-sqlite3-IQKBFVAO.js} +2 -2
  16. package/dist/cli/chunks/{brain-handler-W4QIIRT4.js → brain-handler-KA3SGAFM.js} +3 -3
  17. package/dist/cli/chunks/{branch-enumerator-IBNGI572.js → branch-enumerator-QZDU2VOQ.js} +2 -2
  18. package/dist/cli/chunks/{browser-GMSCVAOI.js → browser-ZL7OLKJQ.js} +2 -2
  19. package/dist/cli/chunks/browser-workflow-2IFEUAAK.js +2 -0
  20. package/dist/cli/chunks/{chunk-6HWARQWV.js → chunk-22DOS3PM.js} +2 -2
  21. package/dist/cli/chunks/{chunk-VCONCVSY.js → chunk-2DPHFCMW.js} +2 -2
  22. package/dist/cli/chunks/{chunk-ALCIUWFC.js → chunk-2GSAAUW3.js} +1 -1
  23. package/dist/cli/chunks/{chunk-AX26QJ6T.js → chunk-2JCLACCS.js} +2 -2
  24. package/dist/cli/chunks/{chunk-7XTANLTN.js → chunk-2QRGIEQV.js} +1 -1
  25. package/dist/cli/chunks/{chunk-MP3FSUNB.js → chunk-2UN4JOTN.js} +2 -2
  26. package/dist/cli/chunks/{chunk-CR66HNAE.js → chunk-2ZRNXEVI.js} +1 -1
  27. package/dist/cli/chunks/{chunk-WKDWRRDT.js → chunk-3LFLO2WK.js} +2 -2
  28. package/dist/cli/chunks/{chunk-QLYO3H7E.js → chunk-3N627QRU.js} +2 -2
  29. package/dist/cli/chunks/{chunk-VVF337SV.js → chunk-4C3RYBTT.js} +2 -2
  30. package/dist/cli/chunks/{chunk-MQCTLTGE.js → chunk-4C7KE2EL.js} +2 -2
  31. package/dist/cli/chunks/{chunk-AUN4FG7V.js → chunk-4GUVVGJX.js} +1 -1
  32. package/dist/cli/chunks/{chunk-ZOUEQ6DL.js → chunk-4GYFONJB.js} +1 -1
  33. package/dist/cli/chunks/{chunk-24ZSGYC6.js → chunk-4I35ARWW.js} +1 -1
  34. package/dist/cli/chunks/{chunk-6MXAJBEA.js → chunk-4NTLGGXO.js} +1 -1
  35. package/dist/cli/chunks/{chunk-EF5UHDCG.js → chunk-4TZLZRZ4.js} +1 -1
  36. package/dist/cli/chunks/{chunk-RD5BYLN7.js → chunk-4YUBWU3E.js} +1 -1
  37. package/dist/cli/chunks/{chunk-7TVIX4WL.js → chunk-52YRSWPS.js} +2 -2
  38. package/dist/cli/chunks/{chunk-LAY7NCQK.js → chunk-5DZDLOY6.js} +3 -3
  39. package/dist/cli/chunks/{chunk-34MDMFET.js → chunk-5MBNRTT5.js} +2 -2
  40. package/dist/cli/chunks/{chunk-VAYZ5QIE.js → chunk-5ONJ7AV6.js} +1 -1
  41. package/dist/cli/chunks/{chunk-RV6HSMKJ.js → chunk-5YOO5QSE.js} +1 -1
  42. package/dist/cli/chunks/{chunk-BUTGIVKW.js → chunk-62T7U25U.js} +1 -1
  43. package/dist/cli/chunks/{chunk-66NW3ZB4.js → chunk-6CKTLVYV.js} +2 -2
  44. package/dist/cli/chunks/{chunk-TUDENMAE.js → chunk-6E7EOHMN.js} +2 -2
  45. package/dist/cli/chunks/{chunk-GVRFSXY6.js → chunk-6GIC2263.js} +2 -2
  46. package/dist/cli/chunks/{chunk-KIDOBLUO.js → chunk-767SR7WH.js} +2 -2
  47. package/dist/cli/chunks/{chunk-NBUXM5X6.js → chunk-7C6FMLQR.js} +2 -2
  48. package/dist/cli/chunks/{chunk-4POOJYXA.js → chunk-7CVMT64N.js} +1 -1
  49. package/dist/cli/chunks/{chunk-R363XXGH.js → chunk-7DHSHD5B.js} +2 -2
  50. package/dist/cli/chunks/{chunk-IEPWO4XP.js → chunk-7H3GNRNA.js} +2 -2
  51. package/dist/cli/chunks/{chunk-DQNUPEY5.js → chunk-7SLEUVPZ.js} +2 -2
  52. package/dist/cli/chunks/{chunk-YNG7E26C.js → chunk-7XGM7Q2N.js} +2 -2
  53. package/dist/cli/chunks/{chunk-5MT7DMD7.js → chunk-A2UGPKCS.js} +2 -2
  54. package/dist/cli/chunks/{chunk-2CIDFR2H.js → chunk-A6GCO6ZU.js} +2 -2
  55. package/dist/cli/chunks/{chunk-XFPQIWEH.js → chunk-BEVWCF3Q.js} +3 -3
  56. package/dist/cli/chunks/{chunk-LCCTJ2PC.js → chunk-BLZEOGQE.js} +2 -2
  57. package/dist/cli/chunks/{chunk-6R3FBFCJ.js → chunk-BQUIZ5QT.js} +2 -2
  58. package/dist/cli/chunks/{chunk-ZUTFHGEO.js → chunk-BTMEOZYY.js} +1 -1
  59. package/dist/cli/chunks/{chunk-FU7LNUD7.js → chunk-CDLG3Q2O.js} +2 -2
  60. package/dist/cli/chunks/{chunk-NYS2GUNO.js → chunk-CQ3SBRDP.js} +2 -2
  61. package/dist/cli/chunks/chunk-CQ5G64EA.js +3 -0
  62. package/dist/cli/chunks/{chunk-JCE76MPP.js → chunk-CRUQ6RXU.js} +2 -2
  63. package/dist/cli/chunks/{chunk-XBFQJZWX.js → chunk-D4IBIMWI.js} +2 -2
  64. package/dist/cli/chunks/{chunk-LZWJ5BMP.js → chunk-D4O3TJI7.js} +2 -2
  65. package/dist/cli/chunks/{chunk-AUOSHM63.js → chunk-DAFMHM64.js} +2 -2
  66. package/dist/cli/chunks/{chunk-V3OLS2NG.js → chunk-DCYUHCPK.js} +2 -2
  67. package/dist/cli/chunks/{chunk-F7A2UBZO.js → chunk-DKFSCJEF.js} +2 -2
  68. package/dist/cli/chunks/{chunk-5LST62QR.js → chunk-DN3AKAPY.js} +2 -2
  69. package/dist/cli/chunks/{chunk-OQ4S6B7P.js → chunk-DY37YMMQ.js} +1 -1
  70. package/dist/cli/chunks/{chunk-XQ53PZEF.js → chunk-EUVSSIGR.js} +3 -3
  71. package/dist/cli/chunks/{chunk-6WOZUSSN.js → chunk-FAYXES7R.js} +2 -2
  72. package/dist/cli/chunks/{chunk-GNYOHZVV.js → chunk-FEN2DHFM.js} +1 -1
  73. package/dist/cli/chunks/{chunk-BAYGQRNP.js → chunk-FEPFXXI7.js} +2 -2
  74. package/dist/cli/chunks/{chunk-DLSFT6PO.js → chunk-FJAO4UX2.js} +2 -2
  75. package/dist/cli/chunks/{chunk-22OZIJAD.js → chunk-FWXNFPLS.js} +2 -2
  76. package/dist/cli/chunks/{chunk-X33F7NXH.js → chunk-G6CLO74Q.js} +3 -3
  77. package/dist/cli/chunks/{chunk-HAN4MS5T.js → chunk-G77Q22EN.js} +2 -2
  78. package/dist/cli/chunks/{chunk-5DH5QI7G.js → chunk-GENNJRNK.js} +3 -3
  79. package/dist/cli/chunks/{chunk-LMAEMVPA.js → chunk-GGSTLKY5.js} +1 -1
  80. package/dist/cli/chunks/{chunk-EJ4KZFZN.js → chunk-GSOK4M6V.js} +1 -1
  81. package/dist/cli/chunks/{chunk-DA7DGDTI.js → chunk-HI6OBDDY.js} +2 -2
  82. package/dist/cli/chunks/{chunk-XZ46CI35.js → chunk-HNGNRIZZ.js} +2 -2
  83. package/dist/cli/chunks/{chunk-CLAMMGY3.js → chunk-HXCGV5UJ.js} +2 -2
  84. package/dist/cli/chunks/{chunk-5UPIL62W.js → chunk-I4U7YCXG.js} +3 -3
  85. package/dist/cli/chunks/{chunk-RFDFET3O.js → chunk-I77D65X5.js} +2 -2
  86. package/dist/cli/chunks/{chunk-HEGGV2PT.js → chunk-IJSFZO7P.js} +2 -2
  87. package/dist/cli/chunks/{chunk-GWM4M5NF.js → chunk-IMSRWNWF.js} +1 -1
  88. package/dist/cli/chunks/{chunk-B7RHBKHL.js → chunk-J6LL25QJ.js} +2 -2
  89. package/dist/cli/chunks/{chunk-KYVIOC3C.js → chunk-J7FLNP5L.js} +2 -2
  90. package/dist/cli/chunks/{chunk-YLNYPQDR.js → chunk-J7RCI25Q.js} +1 -1
  91. package/dist/cli/chunks/{chunk-72MQCZSM.js → chunk-JFWQFB3S.js} +2 -2
  92. package/dist/cli/chunks/{chunk-SV5BUYHH.js → chunk-JLTGO5BB.js} +2 -2
  93. package/dist/cli/chunks/{chunk-CCL436IU.js → chunk-JWPYMRIX.js} +14 -6
  94. package/dist/cli/chunks/{chunk-ONPPBLRB.js → chunk-K4N2MBCE.js} +2 -2
  95. package/dist/cli/chunks/{chunk-7SAMMQVS.js → chunk-K5R3WUJP.js} +1 -1
  96. package/dist/cli/chunks/{chunk-GI5HWS4H.js → chunk-KITKQUBX.js} +1 -1
  97. package/dist/cli/chunks/{chunk-7TJZDRDU.js → chunk-KJNUETCB.js} +1 -1
  98. package/dist/cli/chunks/{chunk-JYKQVYX2.js → chunk-KMVFBYJO.js} +2 -2
  99. package/dist/cli/chunks/{chunk-ZSBD4FUX.js → chunk-KMZW2P3R.js} +2 -2
  100. package/dist/cli/chunks/{chunk-PEMSXSP2.js → chunk-KNHLOANK.js} +2 -2
  101. package/dist/cli/chunks/{chunk-47Q7JL3V.js → chunk-KNQUHGNY.js} +2 -2
  102. package/dist/cli/chunks/{chunk-A7ANPS4E.js → chunk-KVMKYUOE.js} +2 -2
  103. package/dist/cli/chunks/{chunk-XBEI2JBA.js → chunk-LHRVSK44.js} +2 -2
  104. package/dist/cli/chunks/{chunk-AJT3XDRD.js → chunk-LPSMVBB3.js} +2 -2
  105. package/dist/cli/chunks/{chunk-ORBODZSO.js → chunk-LVHZK7GW.js} +2 -2
  106. package/dist/cli/chunks/{chunk-ZTB32K5N.js → chunk-LZWBUVCK.js} +3 -3
  107. package/dist/cli/chunks/{chunk-OPDZBRIL.js → chunk-MMY52Y6R.js} +2 -2
  108. package/dist/cli/chunks/{chunk-MQTA6KIO.js → chunk-MUDBF2JC.js} +1 -1
  109. package/dist/cli/chunks/{chunk-GFB6BZWU.js → chunk-MV4S3TEC.js} +2 -2
  110. package/dist/cli/chunks/{chunk-UB6DQGWM.js → chunk-NF63NHJH.js} +2 -2
  111. package/dist/cli/chunks/{chunk-D5N2O5EH.js → chunk-NHOMVBCI.js} +2 -2
  112. package/dist/cli/chunks/{chunk-3NJ7O3OH.js → chunk-NLYUC63R.js} +2 -2
  113. package/dist/cli/chunks/{chunk-4CLDYT36.js → chunk-NQDYOF35.js} +2 -2
  114. package/dist/cli/chunks/{chunk-ORFL3YXB.js → chunk-NW7HTOSN.js} +2 -2
  115. package/dist/cli/chunks/{chunk-FQ5N666N.js → chunk-NWFBF3KT.js} +1 -1
  116. package/dist/cli/chunks/{chunk-P7DXVL2S.js → chunk-NZATJ2C6.js} +2 -2
  117. package/dist/cli/chunks/{chunk-HOEWMEF2.js → chunk-O4RRVTXN.js} +2 -2
  118. package/dist/cli/chunks/{chunk-4KOVHQXK.js → chunk-OCLAMZJG.js} +2 -2
  119. package/dist/cli/chunks/{chunk-TLUIO37P.js → chunk-OJWEZYLR.js} +2 -2
  120. package/dist/cli/chunks/{chunk-A74J23QB.js → chunk-OWBFVAEH.js} +2 -2
  121. package/dist/cli/chunks/{chunk-6T6AHVLF.js → chunk-P2EA62YS.js} +1 -1
  122. package/dist/cli/chunks/{chunk-TL5GV3PR.js → chunk-P4UT4LBE.js} +3 -3
  123. package/dist/cli/chunks/{chunk-IVJIHZSM.js → chunk-PICEGWGB.js} +1 -1
  124. package/dist/cli/chunks/{chunk-ITIJ23K2.js → chunk-PIEKGKW6.js} +2 -2
  125. package/dist/cli/chunks/{chunk-2ZTWPMTK.js → chunk-PJGQ2TKN.js} +2 -2
  126. package/dist/cli/chunks/{chunk-KCB6P463.js → chunk-PPIM7B5G.js} +2 -2
  127. package/dist/cli/chunks/{chunk-L2TDHJR3.js → chunk-PUYQ6EKC.js} +2 -2
  128. package/dist/cli/chunks/{chunk-2IWPJUVV.js → chunk-PWA6XBW4.js} +8 -8
  129. package/dist/cli/chunks/{chunk-XPB5BVU6.js → chunk-PZ7FJ4UG.js} +2 -2
  130. package/dist/cli/chunks/{chunk-SOSJWM3E.js → chunk-QFYUZYRA.js} +4 -4
  131. package/dist/cli/chunks/{chunk-RUTO67PT.js → chunk-R2NHGESM.js} +2 -2
  132. package/dist/cli/chunks/{chunk-K55EAWZ5.js → chunk-RG42LDOB.js} +2 -2
  133. package/dist/cli/chunks/{chunk-JAPBSSFY.js → chunk-RSMPJWQH.js} +1 -1
  134. package/dist/cli/chunks/{chunk-46HBVDMU.js → chunk-SFPGLUXS.js} +1 -1
  135. package/dist/cli/chunks/{chunk-TVLOED6O.js → chunk-SHEVM5PF.js} +2 -2
  136. package/dist/cli/chunks/{chunk-6RDVY26I.js → chunk-SJMZZMHP.js} +2 -2
  137. package/dist/cli/chunks/{chunk-3DJNKNBR.js → chunk-ST7ASEJO.js} +57 -57
  138. package/dist/cli/chunks/{chunk-QS5KZYUZ.js → chunk-SWY6KGMF.js} +2 -2
  139. package/dist/cli/chunks/{chunk-UHHMAKPE.js → chunk-T2TDTBFV.js} +1 -1
  140. package/dist/cli/chunks/{chunk-5HAPS6VD.js → chunk-TC52M542.js} +2 -2
  141. package/dist/cli/chunks/chunk-TMNEK7TP.js +2 -0
  142. package/dist/cli/chunks/{chunk-ELI4GDQO.js → chunk-U3BWBP6B.js} +2 -2
  143. package/dist/cli/chunks/{chunk-CZBIREL5.js → chunk-U7CIY3YR.js} +2 -2
  144. package/dist/cli/chunks/{chunk-X2DR27AY.js → chunk-UDCYQLTD.js} +2 -2
  145. package/dist/cli/chunks/{chunk-CEXNW5TR.js → chunk-UKKFZJME.js} +1 -1
  146. package/dist/cli/chunks/{chunk-5NC7QEJ6.js → chunk-UQLAN5TX.js} +4 -4
  147. package/dist/cli/chunks/{chunk-BIXRTOH3.js → chunk-UTFMMZ57.js} +3 -3
  148. package/dist/cli/chunks/{chunk-YXU35GGD.js → chunk-UTNKMPTC.js} +1 -1
  149. package/dist/cli/chunks/{chunk-HZFK2Z2Z.js → chunk-V4QJ3MMT.js} +1 -1
  150. package/dist/cli/chunks/{chunk-LJCEDTUM.js → chunk-V7VZSNDK.js} +3 -3
  151. package/dist/cli/chunks/{chunk-RLB7K7QP.js → chunk-VKFVJCIH.js} +1 -1
  152. package/dist/cli/chunks/{chunk-5GIJU2ZY.js → chunk-VQRBBR27.js} +2 -2
  153. package/dist/cli/chunks/{chunk-Q2RBOC7V.js → chunk-VVK4ECVJ.js} +2 -2
  154. package/dist/cli/chunks/{chunk-624QRKQX.js → chunk-VWRNG3UK.js} +1 -1
  155. package/dist/cli/chunks/{chunk-F3KS3TAB.js → chunk-VWSGWYRB.js} +2 -2
  156. package/dist/cli/chunks/{chunk-I7WAW7TM.js → chunk-W5A36V3Z.js} +2 -2
  157. package/dist/cli/chunks/chunk-WAWKAYPY.js +2 -0
  158. package/dist/cli/chunks/{chunk-NMY4KTWA.js → chunk-WLXGUQOZ.js} +2 -2
  159. package/dist/cli/chunks/{chunk-7VTKR44N.js → chunk-X3HM7SV4.js} +2 -2
  160. package/dist/cli/chunks/chunk-X6VYQVUM.js +2 -0
  161. package/dist/cli/chunks/{chunk-ZL5LJT7D.js → chunk-X7ZQIFES.js} +2 -2
  162. package/dist/cli/chunks/{chunk-5VUIXDY2.js → chunk-XOOBLZXR.js} +2 -2
  163. package/dist/cli/chunks/{chunk-L4D3TPFP.js → chunk-XZQVC3GD.js} +1 -1
  164. package/dist/cli/chunks/{chunk-BO7UFNYV.js → chunk-Y5ZBF7MA.js} +2 -2
  165. package/dist/cli/chunks/{chunk-ULCHPPW2.js → chunk-YNQPHRUZ.js} +1 -1
  166. package/dist/cli/chunks/{chunk-ZCP4P6O2.js → chunk-YRH7KMTU.js} +2 -2
  167. package/dist/cli/chunks/{chunk-QLKUCMZC.js → chunk-YTYS2XSY.js} +1 -1
  168. package/dist/cli/chunks/{chunk-JPJEAK4G.js → chunk-YUP3APSN.js} +1 -1
  169. package/dist/cli/chunks/{chunk-BXATKI5S.js → chunk-YVWMJZ6O.js} +2 -2
  170. package/dist/cli/chunks/{chunk-PS6WFCA4.js → chunk-Z3LDUPLQ.js} +2 -2
  171. package/dist/cli/chunks/{chunk-FOJRPEIP.js → chunk-ZBI7PJFX.js} +2 -2
  172. package/dist/cli/chunks/{chunk-NHRF3V4B.js → chunk-ZG7UKWBB.js} +2 -2
  173. package/dist/cli/chunks/{chunk-7XUB7U6Z.js → chunk-ZOHS32SI.js} +2 -2
  174. package/dist/cli/chunks/{chunk-RHIQ6QO5.js → chunk-ZOVAZTXE.js} +430 -430
  175. package/dist/cli/chunks/{chunk-7QVPMH25.js → chunk-ZWMFKZEQ.js} +2 -2
  176. package/dist/cli/chunks/{ci-GEJCXMBK.js → ci-7NUCRGWO.js} +2 -2
  177. package/dist/cli/chunks/{ci-config-2ZVV4OXL.js → ci-config-VQVECCFI.js} +2 -2
  178. package/dist/cli/chunks/{ci-output-E45OGVPR.js → ci-output-P7GQ6TKF.js} +2 -2
  179. package/dist/cli/chunks/{circuit-breaker-X73ITYZC.js → circuit-breaker-5YP6N6HE.js} +2 -2
  180. package/dist/cli/chunks/{claude-flow-setup-W4PPH46C.js → claude-flow-setup-W5H7CMU6.js} +2 -2
  181. package/dist/cli/chunks/client-RFUSQRUZ.js +2 -0
  182. package/dist/cli/chunks/{cline-installer-NUEPMWDE.js → cline-installer-OYANSZ54.js} +2 -2
  183. package/dist/cli/chunks/{code-6WQHBS7G.js → code-OMT4UEZI.js} +3 -3
  184. package/dist/cli/chunks/{code-index-extractor-BXQIFIFT.js → code-index-extractor-M2JEWKNF.js} +2 -2
  185. package/dist/cli/chunks/{codex-installer-Z337R2KH.js → codex-installer-YBS6N5O3.js} +2 -2
  186. package/dist/cli/chunks/{completions-F5DMYFHV.js → completions-U7GS5RG6.js} +2 -2
  187. package/dist/cli/chunks/{complexity-analyzer-W2SYPZDI.js → complexity-analyzer-QSXPIUIU.js} +2 -2
  188. package/dist/cli/chunks/{continuedev-installer-ZCHUIFTN.js → continuedev-installer-W5TTT743.js} +2 -2
  189. package/dist/cli/chunks/{copilot-installer-M5JNODXF.js → copilot-installer-KC2RT24C.js} +2 -2
  190. package/dist/cli/chunks/core-handlers-ZC7QB432.js +2 -0
  191. package/dist/cli/chunks/{cost-tracker-LSYTHBHV.js → cost-tracker-OQPVR6V4.js} +2 -2
  192. package/dist/cli/chunks/{coverage-PGMRS5SS.js → coverage-TCO2A2NX.js} +3 -3
  193. package/dist/cli/chunks/cross-domain-router-GRBK7YFZ.js +2 -0
  194. package/dist/cli/chunks/{cursor-installer-XPUA73UW.js → cursor-installer-MH7GWD4L.js} +2 -2
  195. package/dist/cli/chunks/daemon-JER6HE2J.js +12 -0
  196. package/dist/cli/chunks/{daemon-ITKDIYMW.js → daemon-UJEARJZ2.js} +3 -3
  197. package/dist/cli/chunks/{dag-attention-scheduler-T55AXLD6.js → dag-attention-scheduler-F3SUJU5O.js} +2 -2
  198. package/dist/cli/chunks/{detect-DR7J6K4O.js → detect-5QTCRB32.js} +2 -2
  199. package/dist/cli/chunks/{dist-node-LAJJBOUT.js → dist-node-XKZPHDBO.js} +2 -2
  200. package/dist/cli/chunks/{domain-handler-OMSHCRMK.js → domain-handler-V3UEADKW.js} +2 -2
  201. package/dist/cli/chunks/{domain-plugins-EQXSKC5K.js → domain-plugins-7PES4UHZ.js} +2 -2
  202. package/dist/cli/chunks/{domain-transfer-FKRAGVSW.js → domain-transfer-NF7UJW7B.js} +2 -2
  203. package/dist/cli/chunks/dream-VALD726W.js +2 -0
  204. package/dist/cli/chunks/{embed-and-insert-pattern-JZFPCNL3.js → embed-and-insert-pattern-D2HWORHF.js} +2 -2
  205. package/dist/cli/chunks/{eval-JSNNASBW.js → eval-UF2UBAUC.js} +2 -2
  206. package/dist/cli/chunks/{experience-capture-middleware-UPD3IZBK.js → experience-capture-middleware-2OUCEHHM.js} +3 -3
  207. package/dist/cli/chunks/{fast-paths-YNMIBS2E.js → fast-paths-KV5DKKHC.js} +2 -2
  208. package/dist/cli/chunks/{feature-flags-SRLXDKBI.js → feature-flags-6YWMTNO5.js} +2 -2
  209. package/dist/cli/chunks/{feature-flags-VIR7O4L7.js → feature-flags-MTW6NMR3.js} +2 -2
  210. package/dist/cli/chunks/file-discovery-VL73ASNI.js +2 -0
  211. package/dist/cli/chunks/{fleet-K2ED46EL.js → fleet-GJ66QFXK.js} +3 -3
  212. package/dist/cli/chunks/{gnn-wrapper-QCU4ZRYW.js → gnn-wrapper-52V6ANOY.js} +2 -2
  213. package/dist/cli/chunks/{heartbeat-handler-YYQI4WZM.js → heartbeat-handler-X7NHNRC7.js} +4 -4
  214. package/dist/cli/chunks/heartbeat-scheduler-FSX7A3ZA.js +2 -0
  215. package/dist/cli/chunks/hnsw-adapter-UX2QT6RL.js +2 -0
  216. package/dist/cli/chunks/hnsw-index-WRDDAMXH.js +2 -0
  217. package/dist/cli/chunks/{hnsw-legacy-bridge-C5TJSWTZ.js → hnsw-legacy-bridge-DZBE3KMK.js} +2 -2
  218. package/dist/cli/chunks/{hnswlib-node-SE3MJJYS.js → hnswlib-node-2AWWUJAZ.js} +2 -2
  219. package/dist/cli/chunks/{hooks-C572SRDH.js → hooks-XLPVROL3.js} +10 -10
  220. package/dist/cli/chunks/hybrid-backend-O67NGIB5.js +2 -0
  221. package/dist/cli/chunks/{hypergraph-engine-35A6G3M5.js → hypergraph-engine-6TI7YP6P.js} +2 -2
  222. package/dist/cli/chunks/{hypergraph-handler-U2756CWI.js → hypergraph-handler-DBIBBOXS.js} +3 -3
  223. package/dist/cli/chunks/impact-analyzer-6VXWWYWM.js +2 -0
  224. package/dist/cli/chunks/init-guard-OSO6MIDD.js +2 -0
  225. package/dist/cli/chunks/init-handler-7S7IHMUF.js +88 -0
  226. package/dist/cli/chunks/init-wizard-VH34J4TL.js +2 -0
  227. package/dist/cli/chunks/kernel-KJD24NO7.js +2 -0
  228. package/dist/cli/chunks/{kilocode-installer-32PX5YH7.js → kilocode-installer-2KBRFXMA.js} +2 -2
  229. package/dist/cli/chunks/{kiro-installer-C4ROMMUS.js → kiro-installer-5VFR4OQZ.js} +2 -2
  230. package/dist/cli/chunks/knowledge-graph-343O2HEZ.js +2 -0
  231. package/dist/cli/chunks/{learning-GEPVZGJQ.js → learning-G5NHL3DV.js} +20 -20
  232. package/dist/cli/chunks/{llm-router-XRKTTJTX.js → llm-router-4EAPPMHS.js} +4 -4
  233. package/dist/cli/chunks/llm-router-service-2M4BT2AO.js +2 -0
  234. package/dist/cli/chunks/{load-XVH6HW7E.js → load-UYMZPEY6.js} +2 -2
  235. package/dist/cli/chunks/load-test-OTQ2JQ5F.js +2 -0
  236. package/dist/cli/chunks/{mcp-IULSTM4Z.js → mcp-NOTDZBW5.js} +2 -2
  237. package/dist/cli/chunks/{memory-6K7IAU4T.js → memory-QL53YIHP.js} +5 -5
  238. package/dist/cli/chunks/memory-backend-4QSNRRV6.js +2 -0
  239. package/dist/cli/chunks/{memory-handlers-CG6DRLAW.js → memory-handlers-YFFYRSM6.js} +2 -2
  240. package/dist/cli/chunks/{multi-model-executor-VZDUYPLX.js → multi-model-executor-PDDDXF2B.js} +2 -2
  241. package/dist/cli/chunks/{opencode-installer-QUTXKNH4.js → opencode-installer-75D2SKOT.js} +2 -2
  242. package/dist/cli/chunks/{orchestrator-PCKKUWOP.js → orchestrator-3WIZBV4T.js} +5 -5
  243. package/dist/cli/chunks/pattern-null-store-5USH5MNR.js +2 -0
  244. package/dist/cli/chunks/{pattern-usage-recorder-PX5HQVRL.js → pattern-usage-recorder-TEX2JGHA.js} +2 -2
  245. package/dist/cli/chunks/{pipeline-O562GTOG.js → pipeline-7ATPA6LU.js} +2 -2
  246. package/dist/cli/chunks/{platform-PM7Q2AZS.js → platform-WPSKRJE7.js} +2 -2
  247. package/dist/cli/chunks/{plugin-OTYTFGPY.js → plugin-UUFOVVMU.js} +2 -2
  248. package/dist/cli/chunks/{prime-radiant-advanced-wasm-6CFXTHC2.js → prime-radiant-advanced-wasm-PDFSYWKZ.js} +2 -2
  249. package/dist/cli/chunks/project-root-SRTA6TBL.js +2 -0
  250. package/dist/cli/chunks/protocol-executor-4WYPCNBS.js +2 -0
  251. package/dist/cli/chunks/{protocol-handler-PPGNSAOS.js → protocol-handler-3VRYRIQB.js} +2 -2
  252. package/dist/cli/chunks/{prove-WQ3BKRZG.js → prove-2NAUROGF.js} +2 -2
  253. package/dist/cli/chunks/qe-reasoning-bank-I4D6SFS4.js +2 -0
  254. package/dist/cli/chunks/{quality-C5WUU3AA.js → quality-ZIEI2WGA.js} +2 -2
  255. package/dist/cli/chunks/{quality-gate-WSSRKD5U.js → quality-gate-KWJO4SWQ.js} +3 -3
  256. package/dist/cli/chunks/queen-coordinator-24UMTZTE.js +2 -0
  257. package/dist/cli/chunks/{real-embeddings-CFQE7IRQ.js → real-embeddings-TSZ4UIAE.js} +2 -2
  258. package/dist/cli/chunks/{ref-validation-DHKHXVZT.js → ref-validation-DWFFRETJ.js} +2 -2
  259. package/dist/cli/chunks/{roocode-installer-3PPODABV.js → roocode-installer-XTZHLUBO.js} +2 -2
  260. package/dist/cli/chunks/router-AUD4GATI.js +2 -0
  261. package/dist/cli/chunks/routing-feedback-2FE6SIKQ.js +2 -0
  262. package/dist/cli/chunks/{routing-handler-JNXTGT6T.js → routing-handler-GG525TDM.js} +2 -2
  263. package/dist/cli/chunks/{ruvector-commands-6YLROPVP.js → ruvector-commands-QKRJDM7Z.js} +2 -2
  264. package/dist/cli/chunks/rvf-dual-writer-P5LEUF25.js +2 -0
  265. package/dist/cli/chunks/rvf-migration-adapter-ZCYD5YJS.js +2 -0
  266. package/dist/cli/chunks/{rvf-migration-coordinator-4DWB4WRK.js → rvf-migration-coordinator-FF52OS6Q.js} +2 -2
  267. package/dist/cli/chunks/rvf-native-adapter-QGV6BW2W.js +2 -0
  268. package/dist/cli/chunks/{rvf-store-integrity-YKR2ZNBF.js → rvf-store-integrity-M6DXTAZ4.js} +2 -2
  269. package/dist/cli/chunks/safe-db-Q6JUKG2A.js +2 -0
  270. package/dist/cli/chunks/schedule-44OSMGE5.js +2 -0
  271. package/dist/cli/chunks/scheduler-V3HO2QQT.js +2 -0
  272. package/dist/cli/chunks/security-EHXSW22U.js +18 -0
  273. package/dist/cli/chunks/{shared-rvf-adapter-LNRLFP5I.js → shared-rvf-adapter-6EH7UVJL.js} +2 -2
  274. package/dist/cli/chunks/{shared-rvf-dual-writer-GWU6YQNS.js → shared-rvf-dual-writer-WML274E7.js} +2 -2
  275. package/dist/cli/chunks/sqlite-persistence-N5T7DWMR.js +2 -0
  276. package/dist/cli/chunks/{standalone-memory-46KKBSSV.js → standalone-memory-C7QKAXS4.js} +2 -2
  277. package/dist/cli/chunks/{status-handler-35T5FTDQ.js → status-handler-VLI7MRLM.js} +2 -2
  278. package/dist/cli/chunks/{structural-health-P7QPQWLO.js → structural-health-3LPG6MQN.js} +2 -2
  279. package/dist/cli/chunks/{sync-Y43EWBSY.js → sync-4IMMQEPT.js} +2 -2
  280. package/dist/cli/chunks/{sync-W6Z4R4PL.js → sync-JFJEJBVK.js} +2 -2
  281. package/dist/cli/chunks/{task-handler-5CX3ZYT7.js → task-handler-IED3K6E4.js} +2 -2
  282. package/dist/cli/chunks/{task-handlers-DQZGOJNE.js → task-handlers-FH6DNTHW.js} +3 -3
  283. package/dist/cli/chunks/{test-TPP53VVV.js → test-GPKT3CKZ.js} +4 -4
  284. package/dist/cli/chunks/{test-scheduling-WBV4UMQH.js → test-scheduling-Z42XXZP6.js} +3 -3
  285. package/dist/cli/chunks/{token-bootstrap-GIIDXHLC.js → token-bootstrap-HMM3AHXM.js} +2 -2
  286. package/dist/cli/chunks/{token-usage-AKK37RB7.js → token-usage-6Y2ERYIY.js} +2 -2
  287. package/dist/cli/chunks/{transformers-7MASPELS.js → transformers-MB63T2XO.js} +2 -2
  288. package/dist/cli/chunks/{tree-sitter-wasm-parser-YZKD6UGB.js → tree-sitter-wasm-parser-56GDQCMR.js} +2 -2
  289. package/dist/cli/chunks/{types-AZ3BTXDP.js → types-J4J6QV3I.js} +2 -2
  290. package/dist/cli/chunks/unified-memory-RQ3Q4CU3.js +2 -0
  291. package/dist/cli/chunks/unified-memory-hnsw-ZOP5FEYX.js +2 -0
  292. package/dist/cli/chunks/unified-persistence-72OCJJKK.js +2 -0
  293. package/dist/cli/chunks/{upgrade-L7OTDKEK.js → upgrade-U4XU7LFM.js} +2 -2
  294. package/dist/cli/chunks/{validate-O3QVFIGP.js → validate-B57HA4YK.js} +2 -2
  295. package/dist/cli/chunks/{validate-swarm-2UGBGLTX.js → validate-swarm-UPPA4M6T.js} +2 -2
  296. package/dist/cli/chunks/visual-security-7F5UV23J.js +2 -0
  297. package/dist/cli/chunks/{web-tree-sitter-J75IYPRO.js → web-tree-sitter-GDZMUKOZ.js} +2 -2
  298. package/dist/cli/chunks/{windsurf-installer-FQ5DBFCG.js → windsurf-installer-VJRWCHXP.js} +2 -2
  299. package/dist/cli/chunks/witness-chain-KZ57QUFE.js +2 -0
  300. package/dist/cli/chunks/{witness-chain-I7TN4MXZ.js → witness-chain-LFASSMZK.js} +2 -2
  301. package/dist/cli/chunks/{witness-chain-repair-D3NE3NQK.js → witness-chain-repair-TPHN4DXN.js} +2 -2
  302. package/dist/cli/chunks/{witness-chain-verifier-RU2WOP5M.js → witness-chain-verifier-Z23FVABW.js} +2 -2
  303. package/dist/cli/chunks/{witness-key-manager-IHQB2FR5.js → witness-key-manager-745MJ7WO.js} +2 -2
  304. package/dist/cli/chunks/{workflow-6BWTNVV6.js → workflow-T245QNQM.js} +4 -4
  305. package/dist/cli/chunks/workflow-orchestrator-ZNWEUYBN.js +2 -0
  306. package/dist/cli/chunks/{wrappers-URVP25VU.js → wrappers-WCAYIQUX.js} +2 -2
  307. package/dist/cli/commands/learning.js +3 -2
  308. package/dist/cli/commands/security.d.ts +16 -0
  309. package/dist/cli/commands/security.js +76 -9
  310. package/dist/cli/handlers/init-guard.d.ts +21 -1
  311. package/dist/cli/handlers/init-guard.js +51 -8
  312. package/dist/cli/handlers/init-handler.js +57 -56
  313. package/dist/cli/index.js +11 -0
  314. package/dist/cli/utils/ci-output.d.ts +5 -0
  315. package/dist/cli/utils/ci-output.js +8 -0
  316. package/dist/coordination/handlers/security-handlers.js +22 -6
  317. package/dist/coordination/protocols/defect-investigation.js +7 -1
  318. package/dist/coordination/protocols/learning-consolidation.js +6 -12
  319. package/dist/coordination/protocols/security-audit.js +11 -0
  320. package/dist/coordination/result-saver.d.ts +9 -0
  321. package/dist/coordination/result-saver.js +34 -4
  322. package/dist/domains/coverage-analysis/collected-metrics.d.ts +2 -0
  323. package/dist/domains/coverage-analysis/collected-metrics.js +8 -1
  324. package/dist/domains/defect-intelligence/services/defect-predictor.js +9 -6
  325. package/dist/domains/learning-optimization/active-patterns.d.ts +55 -0
  326. package/dist/domains/learning-optimization/active-patterns.js +77 -0
  327. package/dist/domains/learning-optimization/coordinator.js +12 -9
  328. package/dist/domains/learning-optimization/services/learning-coordinator.js +15 -17
  329. package/dist/domains/quality-assessment/interfaces.d.ts +4 -0
  330. package/dist/domains/quality-assessment/quality-evidence.d.ts +1 -1
  331. package/dist/domains/quality-assessment/services/quality-analyzer.js +7 -5
  332. package/dist/domains/quality-assessment/services/quality-gate.js +12 -3
  333. package/dist/domains/security-compliance/dependency-advisory-engine.d.ts +52 -0
  334. package/dist/domains/security-compliance/dependency-advisory-engine.js +113 -0
  335. package/dist/domains/security-compliance/interfaces.d.ts +30 -0
  336. package/dist/domains/security-compliance/plugin.d.ts +7 -1
  337. package/dist/domains/security-compliance/plugin.js +19 -0
  338. package/dist/domains/security-compliance/services/scanners/dependency-resolver.d.ts +71 -0
  339. package/dist/domains/security-compliance/services/scanners/dependency-resolver.js +232 -0
  340. package/dist/domains/security-compliance/services/scanners/dependency-scanner.d.ts +21 -6
  341. package/dist/domains/security-compliance/services/scanners/dependency-scanner.js +142 -64
  342. package/dist/domains/security-compliance/services/scanners/lockfile-versions.d.ts +43 -0
  343. package/dist/domains/security-compliance/services/scanners/lockfile-versions.js +248 -0
  344. package/dist/domains/security-compliance/services/scanners/scanner-types.d.ts +30 -2
  345. package/dist/domains/security-compliance/services/security-auditor.d.ts +19 -6
  346. package/dist/domains/security-compliance/services/security-auditor.js +133 -92
  347. package/dist/domains/test-execution/services/retry-handler.js +34 -7
  348. package/dist/domains/test-execution/services/test-executor.d.ts +1 -0
  349. package/dist/domains/test-execution/services/test-executor.js +87 -7
  350. package/dist/kernel/shared-dirs.js +17 -5
  351. package/dist/learning/dream/dream-engine.d.ts +27 -1
  352. package/dist/learning/dream/dream-engine.js +56 -2
  353. package/dist/learning/dream/rvcow-branch-manager.d.ts +8 -0
  354. package/dist/learning/dream/rvcow-branch-manager.js +8 -0
  355. package/dist/learning/dream/speculative-dreamer.d.ts +8 -0
  356. package/dist/learning/dream/speculative-dreamer.js +8 -0
  357. package/dist/mcp/background-workers.d.ts +15 -0
  358. package/dist/mcp/background-workers.js +71 -0
  359. package/dist/mcp/bundle.js +881 -878
  360. package/dist/mcp/entry.js +4 -49
  361. package/dist/mcp/handlers/domain-handler-configs.d.ts +4 -0
  362. package/dist/mcp/handlers/domain-handler-configs.js +5 -1
  363. package/dist/mcp/protocol-server.js +2 -1
  364. package/dist/mcp/types.d.ts +6 -0
  365. package/dist/shared/security/index.d.ts +2 -2
  366. package/dist/shared/security/index.js +1 -1
  367. package/dist/shared/security/osv-client.d.ts +79 -132
  368. package/dist/shared/security/osv-client.js +344 -167
  369. package/dist/shared/security/osv-lookup.d.ts +124 -0
  370. package/dist/shared/security/osv-lookup.js +246 -0
  371. package/dist/shared/security/osv-types.d.ts +119 -0
  372. package/dist/shared/security/osv-types.js +6 -0
  373. package/dist/workers/daemon.d.ts +5 -0
  374. package/dist/workers/daemon.js +16 -2
  375. package/dist/workers/interfaces.d.ts +6 -1
  376. package/dist/workers/namespaced-keys.d.ts +16 -0
  377. package/dist/workers/namespaced-keys.js +24 -0
  378. package/dist/workers/quality-daemon/persistent-memory.d.ts +1 -1
  379. package/dist/workers/quality-daemon/persistent-memory.js +2 -2
  380. package/dist/workers/worker-env.d.ts +45 -0
  381. package/dist/workers/worker-env.js +76 -0
  382. package/dist/workers/worker-manager.js +5 -2
  383. package/dist/workers/workers/defect-predictor.d.ts +25 -8
  384. package/dist/workers/workers/defect-predictor.js +223 -216
  385. package/dist/workers/workers/learning-consolidation.d.ts +20 -0
  386. package/dist/workers/workers/learning-consolidation.js +53 -22
  387. package/dist/workers/workers/performance-baseline.d.ts +24 -9
  388. package/dist/workers/workers/performance-baseline.js +187 -230
  389. package/dist/workers/workers/quality-gate.d.ts +11 -9
  390. package/dist/workers/workers/quality-gate.js +125 -267
  391. package/dist/workers/workers/security-scan-records.d.ts +111 -0
  392. package/dist/workers/workers/security-scan-records.js +128 -0
  393. package/dist/workers/workers/security-scan.d.ts +25 -7
  394. package/dist/workers/workers/security-scan.js +187 -164
  395. package/package.json +2 -2
  396. package/dist/cli/chunks/adapter-PP3XIXDV.js +0 -2
  397. package/dist/cli/chunks/aqe-learning-engine-VDUQJKKY.js +0 -2
  398. package/dist/cli/chunks/base-QSYWWPCE.js +0 -2
  399. package/dist/cli/chunks/browser-workflow-WXXPBSCM.js +0 -2
  400. package/dist/cli/chunks/chunk-45MVRQG4.js +0 -2
  401. package/dist/cli/chunks/chunk-5VZVMO7B.js +0 -3
  402. package/dist/cli/chunks/chunk-EECF4CMA.js +0 -2
  403. package/dist/cli/chunks/client-6XKSQ4JT.js +0 -2
  404. package/dist/cli/chunks/core-handlers-OJYW4Y6M.js +0 -2
  405. package/dist/cli/chunks/cross-domain-router-QVUPQ2SC.js +0 -2
  406. package/dist/cli/chunks/daemon-QBYTCIMH.js +0 -10
  407. package/dist/cli/chunks/dream-3UABDRZJ.js +0 -2
  408. package/dist/cli/chunks/file-discovery-ZFGZTKZ4.js +0 -2
  409. package/dist/cli/chunks/heartbeat-scheduler-MJ6MTPDF.js +0 -2
  410. package/dist/cli/chunks/hnsw-adapter-FQWJCFVW.js +0 -2
  411. package/dist/cli/chunks/hnsw-index-NJYKJUHC.js +0 -2
  412. package/dist/cli/chunks/hybrid-backend-SL7RFID7.js +0 -2
  413. package/dist/cli/chunks/impact-analyzer-5ZJTXPVC.js +0 -2
  414. package/dist/cli/chunks/init-handler-PCLYQUSB.js +0 -88
  415. package/dist/cli/chunks/init-wizard-MQMDSIOF.js +0 -2
  416. package/dist/cli/chunks/kernel-MEJ5GMRH.js +0 -2
  417. package/dist/cli/chunks/knowledge-graph-XUBZSEZE.js +0 -2
  418. package/dist/cli/chunks/llm-router-service-QZAPAEPX.js +0 -2
  419. package/dist/cli/chunks/load-test-OVXIQ3AF.js +0 -2
  420. package/dist/cli/chunks/memory-backend-TRPOMPK4.js +0 -2
  421. package/dist/cli/chunks/pattern-null-store-JWYBRBZG.js +0 -2
  422. package/dist/cli/chunks/project-root-VVSTHIP4.js +0 -2
  423. package/dist/cli/chunks/protocol-executor-PXZCLZD3.js +0 -2
  424. package/dist/cli/chunks/qe-reasoning-bank-42FRS5V3.js +0 -2
  425. package/dist/cli/chunks/queen-coordinator-UI3B7DI6.js +0 -2
  426. package/dist/cli/chunks/router-HYRPWLAY.js +0 -2
  427. package/dist/cli/chunks/routing-feedback-BPZ5R6F3.js +0 -2
  428. package/dist/cli/chunks/rvf-dual-writer-DEKDQ6KO.js +0 -2
  429. package/dist/cli/chunks/rvf-migration-adapter-L53VBS7I.js +0 -2
  430. package/dist/cli/chunks/rvf-native-adapter-I6RUGD2D.js +0 -2
  431. package/dist/cli/chunks/safe-db-KS65XDCP.js +0 -2
  432. package/dist/cli/chunks/schedule-KD2VN6GB.js +0 -2
  433. package/dist/cli/chunks/scheduler-ZH3RMUHY.js +0 -2
  434. package/dist/cli/chunks/security-PWQTGDRU.js +0 -13
  435. package/dist/cli/chunks/sqlite-persistence-6DTVME5D.js +0 -2
  436. package/dist/cli/chunks/unified-memory-FCX7NLFZ.js +0 -2
  437. package/dist/cli/chunks/unified-memory-hnsw-VU5QJK37.js +0 -2
  438. package/dist/cli/chunks/unified-persistence-FM376LGE.js +0 -2
  439. package/dist/cli/chunks/visual-security-EU7Y3X46.js +0 -2
  440. package/dist/cli/chunks/witness-chain-CSEBT52D.js +0 -2
  441. package/dist/cli/chunks/workflow-orchestrator-ALNKOM3N.js +0 -2
@@ -8,17 +8,57 @@ import chalk from 'chalk';
8
8
  import { discoverSecurityFiles } from '../../domains/security-compliance/scan-discovery.js';
9
9
  import { FilePath } from '../../shared/value-objects/index.js';
10
10
  import { writeOutput, toJSON, toSARIF, securityToMarkdown } from '../utils/ci-output.js';
11
+ import { runDependencyAdvisoryScan } from '../../domains/security-compliance/dependency-advisory-engine.js';
12
+ import { resolve as resolvePath } from 'node:path';
13
+ /** Name of the CLI check for the OSV dependency advisory scan (#1049). */
14
+ export const DEPENDENCY_CHECK = 'Dependency advisories';
15
+ /** #1049: dependency advisories could not be checked; the dependency result is UNMEASURED (same code as coverage/quality). */
16
+ export const EXIT_DEPENDENCIES_UNMEASURED = 3;
17
+ /**
18
+ * `aqe security` exit contract:
19
+ * 0 = every requested check completed, no medium+ findings
20
+ * 1 = high/critical findings, non-compliance, or a non-dependency check incomplete/failed
21
+ * 2 = medium findings only, every requested check complete
22
+ * 3 = dependency advisories could not be checked (failed or partial OSV lookup) and
23
+ * there are no high/critical findings, non-compliance or other incomplete checks:
24
+ * UNMEASURED, never a clean exit (#1049). Medium findings plus an incomplete
25
+ * dependency scan also exit 3: the result is unmeasured, not a medium-only verdict.
26
+ */
27
+ export function securityExitCode(result) {
28
+ const checks = result.checks ?? [];
29
+ const highOrCritical = result.vulnerabilities.some(v => v.severity === 'high' || v.severity === 'critical');
30
+ const nonCompliant = result.compliance?.compliant === false;
31
+ if (result.status !== 'complete' || nonCompliant) {
32
+ const dependencyUnmeasured = checks.some(check => check.name === DEPENDENCY_CHECK && check.status !== 'complete');
33
+ const otherIncomplete = checks.some(check => check.name !== DEPENDENCY_CHECK && check.status !== 'complete');
34
+ if (dependencyUnmeasured && !otherIncomplete && !nonCompliant && !highOrCritical)
35
+ return EXIT_DEPENDENCIES_UNMEASURED;
36
+ return 1;
37
+ }
38
+ if (highOrCritical)
39
+ return 1;
40
+ if (result.vulnerabilities.some(v => v.severity === 'medium'))
41
+ return 2;
42
+ return 0;
43
+ }
11
44
  export function createSecurityCommand(context, cleanupAndExit, ensureInitialized) {
12
45
  const securityCmd = new Command('security')
13
46
  .description('Security scanning and URL validation')
14
47
  .option('--sast', 'Run SAST scan')
15
48
  .option('--dast', 'Run DAST scan')
49
+ .option('--dependencies', 'Check package.json dependencies against OSV advisories (sends package names and versions to the OSV API)')
16
50
  .option('--compliance <frameworks>', 'Check compliance (gdpr,hipaa,soc2)', '')
17
51
  .option('--url-validate <url>', 'Validate a URL for security threats and PII exposure')
18
52
  .option('--no-pii', 'Disable PII scanning when using --url-validate')
19
53
  .option('-t, --target <path>', 'Target directory to scan', '.')
20
54
  .option('-F, --format <format>', 'Output format (text|json|sarif|markdown)', 'text')
21
55
  .option('-o, --output <path>', 'Write output to file')
56
+ .addHelpText('after', `
57
+ Exit codes:
58
+ 0 every requested check completed; no medium or higher findings
59
+ 1 high/critical findings, non-compliance, or a check failed / is incomplete
60
+ 2 medium findings only
61
+ ${EXIT_DEPENDENCIES_UNMEASURED} UNMEASURED: dependency advisories could not be checked (OSV unreachable, rate limited, or partial)`)
22
62
  .action(async (options) => {
23
63
  if (!await ensureInitialized())
24
64
  return;
@@ -86,13 +126,13 @@ export function createSecurityCommand(context, cleanupAndExit, ensureInitialized
86
126
  return; // Don't fall through to SAST/DAST path
87
127
  }
88
128
  const format = options.format;
89
- const runSAST = options.sast || (!options.dast && !options.compliance);
129
+ const runSAST = options.sast || (!options.dast && !options.compliance && !options.dependencies);
90
130
  const frameworks = options.compliance
91
131
  ? options.compliance.split(',').map((value) => value.trim()).filter(Boolean)
92
132
  : [];
93
133
  const scanResult = {
94
134
  vulnerabilities: [], target: options.target,
95
- scanType: [runSAST && 'SAST', options.dast && 'DAST', frameworks.length > 0 && 'Compliance'].filter(Boolean).join('+'),
135
+ scanType: [runSAST && 'SAST', options.dast && 'DAST', options.dependencies && 'Dependencies', frameworks.length > 0 && 'Compliance'].filter(Boolean).join('+'),
96
136
  checks: [], status: 'not-run',
97
137
  };
98
138
  const checks = scanResult.checks;
@@ -133,6 +173,18 @@ export function createSecurityCommand(context, cleanupAndExit, ensureInitialized
133
173
  checks.push({ name: 'Source discovery', status: discovery.status, reason: 'Requested source discovery did not complete; inspect discovery issues.' });
134
174
  }
135
175
  }
176
+ if (options.dependencies) {
177
+ // #1049: a failed or partial OSV lookup is reported, never a clean dependency scan.
178
+ const outcome = await runDependencyAdvisoryScan({ scanPackageJson: (manifest) => securityAPI.runDependencyScan(manifest) }, resolvePath(options.target));
179
+ scanResult.dependencyScan = outcome.report;
180
+ scanResult.vulnerabilities.push(...outcome.vulnerabilities.map(formatVulnerability));
181
+ const status = outcome.report.status;
182
+ checks.push({
183
+ name: DEPENDENCY_CHECK,
184
+ status: status === 'complete' ? 'complete' : status === 'incomplete' ? 'partial' : status === 'failed' ? 'failed' : 'not-run',
185
+ ...(status !== 'complete' ? { reason: outcome.report.message } : {}),
186
+ });
187
+ }
136
188
  if (frameworks.length > 0) {
137
189
  const issues = [];
138
190
  let compliant = true;
@@ -189,13 +241,7 @@ export function createSecurityCommand(context, cleanupAndExit, ensureInitialized
189
241
  return cleanupAndExit(1);
190
242
  }
191
243
  // Incomplete execution never has a clean exit, even if it found no vulnerabilities.
192
- if (scanResult.status !== 'complete' || scanResult.compliance?.compliant === false)
193
- return cleanupAndExit(1);
194
- if (scanResult.vulnerabilities.some(v => v.severity === 'high' || v.severity === 'critical'))
195
- return cleanupAndExit(1);
196
- if (scanResult.vulnerabilities.some(v => v.severity === 'medium'))
197
- return cleanupAndExit(2);
198
- return cleanupAndExit(0);
244
+ return cleanupAndExit(securityExitCode(scanResult));
199
245
  });
200
246
  return securityCmd;
201
247
  }
@@ -227,6 +273,7 @@ function formatVulnerability(value) {
227
273
  severity: value.severity, type: value.title || value.category,
228
274
  file: value.location.file, line: value.location.line ?? 1,
229
275
  message: value.description,
276
+ ...(value.cveId ? { cveId: value.cveId } : {}),
230
277
  };
231
278
  }
232
279
  return value;
@@ -265,6 +312,26 @@ function printSecurityResult(result) {
265
312
  ...(result.evidence?.files.filter(file => file.status !== 'analyzed' && file.status !== 'excluded').map(file => `${file.path}: ${file.status}${file.reason ? ` (${file.reason})` : ''}`) ?? []),
266
313
  ...(result.discovery?.issues.map(issue => `${issue.path}: ${issue.reason}`) ?? []),
267
314
  ];
315
+ if (result.dependencyScan && result.dependencyScan.status !== 'complete') {
316
+ const unchecked = result.dependencyScan.uncheckedPackages;
317
+ console.log(chalk.yellow(` ${result.dependencyScan.message}`));
318
+ for (const pkg of unchecked.slice(0, 10)) {
319
+ const where = `${pkg.member ? `${pkg.member}: ` : ''}${pkg.name}@${pkg.version}${pkg.lockedVersion ? ` (lockfile ${pkg.lockedVersion})` : ''}`;
320
+ console.log(chalk.yellow(` not checked: ${where} (${pkg.reason})`));
321
+ }
322
+ if (unchecked.length > 10)
323
+ console.log(chalk.yellow(` ... and ${unchecked.length - 10} more unchecked package(s)`));
324
+ }
325
+ else if (result.dependencyScan) {
326
+ console.log(` ${result.dependencyScan.message}`);
327
+ }
328
+ if (result.dependencyScan?.localPackages.length) {
329
+ const local = result.dependencyScan.localPackages;
330
+ console.log(` Local packages (not OSV subjects, excluded): ${local.slice(0, 10).map(p => `${p.member ? `${p.member}: ` : ''}${p.name}`).join(', ')}${local.length > 10 ? ` ... and ${local.length - 10} more` : ''}`);
331
+ }
332
+ for (const problem of result.dependencyScan?.resolutionErrors ?? []) {
333
+ console.log(chalk.yellow(` incomplete: ${problem}`));
334
+ }
268
335
  for (const limitation of limitations.slice(0, 10))
269
336
  console.log(chalk.yellow(` ${limitation}`));
270
337
  if (limitations.length > 10)
@@ -8,6 +8,26 @@
8
8
  *
9
9
  * @module cli/handlers/init-guard
10
10
  */
11
- /** Error message when `cwd` must not be initialized, otherwise null. */
11
+ /** The explicit root is also the destination for all init-generated files. */
12
+ export declare function initProjectRoot(cwd?: string, env?: NodeJS.ProcessEnv): string;
13
+ /**
14
+ * Error message when `projectRoot` must not be initialized, otherwise null.
15
+ *
16
+ * An explicit root (`AQE_PROJECT_ROOT`) is refused only when it is a hard-stop
17
+ * directory (OS temp dir, `/`, `/home`, ...), or a sticky world-writable
18
+ * directory WITHOUT `.git`. This mirrors `findProjectRoot`, which keeps a
19
+ * sticky (mode 1777) directory that is itself a repo root as its own root, so
20
+ * the explicit root stays the escape hatch for such a repository. A derived
21
+ * root (the cwd) keeps the stricter rule: any shared directory is refused.
22
+ */
23
+ export declare function sharedRootInitError(projectRoot: string, explicit: boolean): string | null;
24
+ /** Error message when the selected root must not be initialized, otherwise null. */
12
25
  export declare function sharedDirInitError(cwd: string, env?: NodeJS.ProcessEnv): string | null;
26
+ /**
27
+ * Error message when an explicit `AQE_PROJECT_ROOT` is not an existing
28
+ * directory, otherwise null. A typo must not silently create and initialize a
29
+ * new project somewhere else. Must run before anything creates the root (the
30
+ * CLI's token bootstrap does `mkdir -p <root>/.agentic-qe` at startup).
31
+ */
32
+ export declare function explicitRootError(cwd?: string, env?: NodeJS.ProcessEnv): string | null;
13
33
  //# sourceMappingURL=init-guard.d.ts.map
@@ -8,16 +8,59 @@
8
8
  *
9
9
  * @module cli/handlers/init-guard
10
10
  */
11
- import { isSharedSystemDir } from '../../kernel/shared-dirs.js';
12
- /** Error message when `cwd` must not be initialized, otherwise null. */
13
- export function sharedDirInitError(cwd, env = process.env) {
14
- if (env.AQE_PROJECT_ROOT)
15
- return null;
16
- if (!isSharedSystemDir(cwd))
11
+ import { isHardStopDir, isSharedSystemDir, isStickyWorldWritable } from '../../kernel/shared-dirs.js';
12
+ import { existsSync, statSync } from 'node:fs';
13
+ import { join, resolve } from 'node:path';
14
+ /** The explicit root is also the destination for all init-generated files. */
15
+ export function initProjectRoot(cwd = process.cwd(), env = process.env) {
16
+ return resolve(cwd, env.AQE_PROJECT_ROOT || '.');
17
+ }
18
+ /**
19
+ * Error message when `projectRoot` must not be initialized, otherwise null.
20
+ *
21
+ * An explicit root (`AQE_PROJECT_ROOT`) is refused only when it is a hard-stop
22
+ * directory (OS temp dir, `/`, `/home`, ...), or a sticky world-writable
23
+ * directory WITHOUT `.git`. This mirrors `findProjectRoot`, which keeps a
24
+ * sticky (mode 1777) directory that is itself a repo root as its own root, so
25
+ * the explicit root stays the escape hatch for such a repository. A derived
26
+ * root (the cwd) keeps the stricter rule: any shared directory is refused.
27
+ */
28
+ export function sharedRootInitError(projectRoot, explicit) {
29
+ const shared = explicit
30
+ ? isHardStopDir(projectRoot)
31
+ || (isStickyWorldWritable(projectRoot) && !existsSync(join(projectRoot, '.git')))
32
+ : isSharedSystemDir(projectRoot);
33
+ if (!shared)
17
34
  return null;
18
- return (`Refusing to initialize in "${cwd}": it is a shared temp/system directory, ` +
35
+ return (`Refusing to initialize in "${projectRoot}": it is a shared temp/system directory, ` +
19
36
  'so a store here would be shared by every unrelated project below it and ' +
20
37
  'later commands would not use it. Create a project directory first ' +
21
- '(mkdir my-project && cd my-project) or set AQE_PROJECT_ROOT to choose a root.');
38
+ '(mkdir my-project && cd my-project) or set AQE_PROJECT_ROOT to a project directory.');
39
+ }
40
+ /** Error message when the selected root must not be initialized, otherwise null. */
41
+ export function sharedDirInitError(cwd, env = process.env) {
42
+ return sharedRootInitError(initProjectRoot(cwd, env), Boolean(env.AQE_PROJECT_ROOT));
43
+ }
44
+ /**
45
+ * Error message when an explicit `AQE_PROJECT_ROOT` is not an existing
46
+ * directory, otherwise null. A typo must not silently create and initialize a
47
+ * new project somewhere else. Must run before anything creates the root (the
48
+ * CLI's token bootstrap does `mkdir -p <root>/.agentic-qe` at startup).
49
+ */
50
+ export function explicitRootError(cwd = process.cwd(), env = process.env) {
51
+ if (!env.AQE_PROJECT_ROOT)
52
+ return null;
53
+ const root = initProjectRoot(cwd, env);
54
+ let isDir = false;
55
+ try {
56
+ isDir = statSync(root).isDirectory();
57
+ }
58
+ catch {
59
+ isDir = false;
60
+ }
61
+ if (isDir)
62
+ return null;
63
+ return (`AQE_PROJECT_ROOT "${root}" is not an existing directory. ` +
64
+ 'Create it first (mkdir -p) or correct the path; aqe init does not create the project root.');
22
65
  }
23
66
  //# sourceMappingURL=init-guard.js.map
@@ -9,7 +9,7 @@ import { createRequire } from 'node:module';
9
9
  import { ALL_DOMAINS } from '../../shared/types/index.js';
10
10
  import { toErrorMessage } from '../../shared/error-utils.js';
11
11
  import { resolveInitFlags } from './init-flags.js';
12
- import { sharedDirInitError } from './init-guard.js';
12
+ import { initProjectRoot, sharedRootInitError } from './init-guard.js';
13
13
  // ============================================================================
14
14
  // Init Handler
15
15
  // ============================================================================
@@ -89,9 +89,10 @@ export class InitHandler {
89
89
  });
90
90
  }
91
91
  try {
92
+ const projectRoot = initProjectRoot();
92
93
  // #1006 (review of #1026 N3): never initialize a store in a shared
93
94
  // temp/system dir; later commands would resolve elsewhere and ignore it.
94
- const sharedDirError = sharedDirInitError(process.cwd());
95
+ const sharedDirError = sharedRootInitError(projectRoot, Boolean(process.env.AQE_PROJECT_ROOT));
95
96
  if (sharedDirError) {
96
97
  console.error(chalk.red(`\n ${sharedDirError}\n`));
97
98
  await this.cleanupAndExit(1);
@@ -117,11 +118,11 @@ export class InitHandler {
117
118
  console.log(chalk.blue('\n Agentic QE v3 Initialization\n'));
118
119
  // Use modular orchestrator for --auto or --modular
119
120
  if (options.auto || options.modular || options.browserEngine) {
120
- await this.runModularInit(options, context);
121
+ await this.runModularInit(options, context, projectRoot);
121
122
  return;
122
123
  }
123
124
  // Legacy wizard mode using InitOrchestrator
124
- await this.runLegacyWizard(options, context);
125
+ await this.runLegacyWizard(options, context, projectRoot);
125
126
  return;
126
127
  }
127
128
  // Platform provisioning (--with-opencode, --with-n8n, --with-<editor>, ...)
@@ -144,7 +145,7 @@ export class InitHandler {
144
145
  const noStatusLineRequested = flags.noStatusLine;
145
146
  if (options.browserEngine || options.modular || platformRequested || databaseFree || noClaudeRequested || noStatusLineRequested) {
146
147
  console.log(chalk.blue('\n Agentic QE v3 Initialization\n'));
147
- await this.runModularInit(options, context);
148
+ await this.runModularInit(options, context, projectRoot);
148
149
  return;
149
150
  }
150
151
  // Standard init without wizard
@@ -155,7 +156,7 @@ export class InitHandler {
155
156
  await this.cleanupAndExit(1);
156
157
  }
157
158
  }
158
- async runModularInit(options, _context) {
159
+ async runModularInit(options, _context, projectRoot) {
159
160
  const isJsonMode = options.json === true;
160
161
  // #931/#935: commander maps --no-<name> to options.<name> === false.
161
162
  const flags = resolveInitFlags(options);
@@ -185,7 +186,7 @@ export class InitHandler {
185
186
  }
186
187
  const { createModularInitOrchestrator } = await import('../../init/orchestrator.js');
187
188
  const orchestrator = createModularInitOrchestrator({
188
- projectRoot: process.cwd(),
189
+ projectRoot,
189
190
  autoMode: options.auto,
190
191
  upgrade: options.upgrade,
191
192
  minimal: options.minimal,
@@ -256,7 +257,7 @@ export class InitHandler {
256
257
  try {
257
258
  const { setupClaudeFlowIntegration } = await import('../commands/claude-flow-setup.js');
258
259
  cfResult = await setupClaudeFlowIntegration({
259
- projectRoot: process.cwd(),
260
+ projectRoot,
260
261
  force: options.withClaudeFlow,
261
262
  });
262
263
  if (cfResult.available) {
@@ -313,11 +314,11 @@ export class InitHandler {
313
314
  }
314
315
  await this.cleanupAndExit(0);
315
316
  }
316
- async runLegacyWizard(options, _context) {
317
+ async runLegacyWizard(options, _context, projectRoot) {
317
318
  const flags = resolveInitFlags(options);
318
319
  const { InitOrchestrator } = await import('../../init/init-wizard.js');
319
320
  const orchestratorOptions = {
320
- projectRoot: process.cwd(),
321
+ projectRoot,
321
322
  autoMode: options.auto,
322
323
  minimal: options.minimal,
323
324
  browserEngine: options.browserEngine,
@@ -455,62 +456,62 @@ export class InitHandler {
455
456
  }
456
457
  }
457
458
  getHelp() {
458
- return `
459
- Initialize the AQE v3 system with various configuration options.
460
-
461
- Usage:
462
- aqe init [options]
463
-
464
- Options:
465
- -d, --domains <domains> Comma-separated list of domains to enable (default: all)
466
- -m, --max-agents <number> Maximum concurrent agents (default: 15)
467
- --memory <backend> Memory backend: sqlite, agentdb, or hybrid (default: hybrid)
468
- --lazy Enable lazy loading of domains
469
- --wizard Run interactive setup wizard
470
- --auto Auto-configure based on project analysis
471
- -u, --upgrade Upgrade existing installation (overwrite skills, agents, validation)
472
- --minimal Minimal configuration (skip optional features)
473
- --skip-patterns Skip loading pre-trained patterns
459
+ return `
460
+ Initialize the AQE v3 system with various configuration options.
461
+
462
+ Usage:
463
+ aqe init [options]
464
+
465
+ Options:
466
+ -d, --domains <domains> Comma-separated list of domains to enable (default: all)
467
+ -m, --max-agents <number> Maximum concurrent agents (default: 15)
468
+ --memory <backend> Memory backend: sqlite, agentdb, or hybrid (default: hybrid)
469
+ --lazy Enable lazy loading of domains
470
+ --wizard Run interactive setup wizard
471
+ --auto Auto-configure based on project analysis
472
+ -u, --upgrade Upgrade existing installation (overwrite skills, agents, validation)
473
+ --minimal Minimal configuration (skip optional features)
474
+ --skip-patterns Skip loading pre-trained patterns
474
475
  --browser-engine Install optional Vibium and browser payload
475
476
  --no-browser-engine Skip browser setup (default)
476
- --with-n8n Install n8n workflow testing agents and skills
477
+ --with-n8n Install n8n workflow testing agents and skills
477
478
  --with-opencode Include OpenCode agent/skill provisioning
478
479
  --with-codex Include OpenAI Codex hooks, instructions, skills, and MCP
479
480
  --codex-guidance <mode> Codex AGENTS.md guidance: full, compact, or none
480
481
  --with-ruflo Opt into Ruflo guidance and lifecycle hooks for Codex
481
- --auto-migrate Automatically migrate from v2 if detected
482
- --with-claude-flow Force Claude Flow integration setup
483
- --skip-claude-flow Skip Claude Flow integration
484
- --no-mcp Skip MCP server config (MCP is enabled by default)
485
- --with-mcp Add the .mcp.json entry even if the agentic-qe-fleet plugin is enabled
486
- (--no-mcp and --with-mcp cannot be combined)
487
- --no-governance Skip governance configuration (ADR-058)
488
- --modular Use new modular init system
489
-
490
- MCP Server:
491
- MCP server configuration is ENABLED BY DEFAULT. It writes .mcp.json
492
- at the project root so Claude Code auto-discovers the AQE MCP server.
493
- Use --no-mcp to skip if you only want CLI commands.
494
- If the agentic-qe-fleet Claude Code plugin is enabled (user, project or
495
- local settings), init skips the entry because the plugin already provides
496
- the AQE MCP server. Use --with-mcp to add the project entry anyway.
497
-
498
- Governance:
499
- Governance is ENABLED BY DEFAULT. It installs .claude/guidance/ with:
500
- - constitution.md: 7 unbreakable QE invariants
501
- - shards/*.shard.md: 12 domain-specific governance rules
502
-
503
- Use --no-governance to skip, or set GOVERNANCE_*=false env vars for
504
- fine-grained control over individual gates (ContinueGate, MemoryWriteGate, etc.)
505
-
482
+ --auto-migrate Automatically migrate from v2 if detected
483
+ --with-claude-flow Force Claude Flow integration setup
484
+ --skip-claude-flow Skip Claude Flow integration
485
+ --no-mcp Skip MCP server config (MCP is enabled by default)
486
+ --with-mcp Add the .mcp.json entry even if the agentic-qe-fleet plugin is enabled
487
+ (--no-mcp and --with-mcp cannot be combined)
488
+ --no-governance Skip governance configuration (ADR-058)
489
+ --modular Use new modular init system
490
+
491
+ MCP Server:
492
+ MCP server configuration is ENABLED BY DEFAULT. It writes .mcp.json
493
+ at the project root so Claude Code auto-discovers the AQE MCP server.
494
+ Use --no-mcp to skip if you only want CLI commands.
495
+ If the agentic-qe-fleet Claude Code plugin is enabled (user, project or
496
+ local settings), init skips the entry because the plugin already provides
497
+ the AQE MCP server. Use --with-mcp to add the project entry anyway.
498
+
499
+ Governance:
500
+ Governance is ENABLED BY DEFAULT. It installs .claude/guidance/ with:
501
+ - constitution.md: 7 unbreakable QE invariants
502
+ - shards/*.shard.md: 12 domain-specific governance rules
503
+
504
+ Use --no-governance to skip, or set GOVERNANCE_*=false env vars for
505
+ fine-grained control over individual gates (ContinueGate, MemoryWriteGate, etc.)
506
+
506
507
  Examples:
507
508
  aqe init --auto # Auto-configure based on project (keeps existing skills)
508
509
  aqe init --auto --with-codex --with-ruflo
509
510
  # Codex plus optional Ruflo coordination
510
- aqe init --auto --upgrade # Auto-configure AND update all skills/agents
511
- aqe init --upgrade # Upgrade existing installation
512
- aqe init --wizard # Run interactive wizard
513
- aqe init --domains test-generation,coverage-analysis
511
+ aqe init --auto --upgrade # Auto-configure AND update all skills/agents
512
+ aqe init --upgrade # Upgrade existing installation
513
+ aqe init --wizard # Run interactive wizard
514
+ aqe init --domains test-generation,coverage-analysis
514
515
  `;
515
516
  }
516
517
  }
package/dist/cli/index.js CHANGED
@@ -417,6 +417,17 @@ async function main() {
417
417
  const commandArgs = process.argv.slice(2).filter(arg => arg !== '--');
418
418
  const learningSnapshot = commandArgs[0] === 'learning'
419
419
  && (commandArgs[1] === 'backup' || commandArgs[1] === 'restore');
420
+ // `aqe init` must not create a mistyped AQE_PROJECT_ROOT: the token bootstrap
421
+ // below does `mkdir -p <root>/.agentic-qe`, so the check has to run first.
422
+ if (commandArgs[0] === 'init') {
423
+ const { explicitRootError } = await import('./handlers/init-guard.js');
424
+ const rootError = explicitRootError();
425
+ if (rootError) {
426
+ console.error(chalk.red(`\n ${rootError}\n`));
427
+ await cleanupAndExit(1);
428
+ return;
429
+ }
430
+ }
420
431
  if (!learningSnapshot) {
421
432
  const { bootstrapTokenTracking } = await import('../init/token-bootstrap.js');
422
433
  await bootstrapTokenTracking({
@@ -7,6 +7,7 @@
7
7
  import type { SecurityCoverage } from '../../domains/security-compliance/interfaces.js';
8
8
  import type { SecurityScanEvidence } from '../../domains/security-compliance/scan-evidence.js';
9
9
  import type { discoverSecurityFiles } from '../../domains/security-compliance/scan-discovery.js';
10
+ import type { DependencyScanReport } from '../../domains/security-compliance/dependency-advisory-engine.js';
10
11
  export type OutputFormat = 'text' | 'json' | 'sarif' | 'junit' | 'markdown';
11
12
  export interface CIOutputOptions {
12
13
  format: OutputFormat;
@@ -20,6 +21,8 @@ export interface SecurityVulnerability {
20
21
  message: string;
21
22
  ruleId?: string;
22
23
  cweId?: string;
24
+ /** CVE id of a dependency advisory, when the advisory has one (#1049). */
25
+ cveId?: string;
23
26
  }
24
27
  export interface SecurityScanResult {
25
28
  vulnerabilities: SecurityVulnerability[];
@@ -38,6 +41,8 @@ export interface SecurityScanResult {
38
41
  coverage?: SecurityCoverage;
39
42
  evidence?: SecurityScanEvidence;
40
43
  discovery?: Awaited<ReturnType<typeof discoverSecurityFiles>>['discovery'];
44
+ /** #1049: OSV dependency advisory scan; any status but 'complete' is not a clean result. */
45
+ dependencyScan?: DependencyScanReport;
41
46
  }
42
47
  export type SecurityExecutionStatus = 'complete' | 'partial' | 'none' | 'failed' | 'not-run' | 'unverified';
43
48
  export interface SecurityCheckResult {
@@ -297,6 +297,14 @@ export function securityToMarkdown(result) {
297
297
  if (result.evidence || result.discovery) {
298
298
  md += `## Execution receipts\n\n\`\`\`json\n${toJSON({ evidence: result.evidence, discovery: result.discovery })}\n\`\`\`\n\n`;
299
299
  }
300
+ if (result.dependencyScan) {
301
+ md += `## Dependency advisories (OSV)\n\n**Status:** ${result.dependencyScan.status}\n\n${result.dependencyScan.message}\n\n`;
302
+ for (const pkg of result.dependencyScan.uncheckedPackages) {
303
+ md += `- not checked: ${pkg.name}@${pkg.version} (${pkg.reason})\n`;
304
+ }
305
+ if (result.dependencyScan.uncheckedPackages.length > 0)
306
+ md += '\n';
307
+ }
300
308
  if (result.vulnerabilities.length > 0) {
301
309
  md += `## Vulnerabilities\n\n`;
302
310
  md += `| Severity | Type | File | Line | Message |\n`;
@@ -12,6 +12,7 @@ import { toError } from '../../shared/error-utils.js';
12
12
  import { FilePath } from '../../shared/value-objects/index.js';
13
13
  import { generateSecurityRecommendations } from './handler-utils.js';
14
14
  import { discoverSecurityFiles, isSecuritySourceFile } from '../../domains/security-compliance/scan-discovery.js';
15
+ import { runDependencyAdvisoryScan } from '../../domains/security-compliance/dependency-advisory-engine.js';
15
16
  export function registerSecurityHandlers(ctx) {
16
17
  // Register security scan handler - REAL IMPLEMENTATION
17
18
  ctx.registerHandler('scan-security', async (task) => {
@@ -257,6 +258,13 @@ export function registerSecurityHandlers(ctx) {
257
258
  status: payload.dast ? 'not-run' : 'disabled', scope: 'url', ruleCoverage: 'unknown',
258
259
  errors: payload.dast ? ['DAST was requested without targetUrl.'] : [], limitations: [] });
259
260
  }
261
+ // #1049: OSV dependency advisories. A failed or partial lookup is a
262
+ // failed/partial required engine, never a completed scan with no findings.
263
+ let dependencyScan = null;
264
+ if (payload.dependencies === true) {
265
+ dependencyScan = await runDependencyAdvisoryScan(ctx.getSecurityScanner(), targetPath);
266
+ engines.push(dependencyScan.engine);
267
+ }
260
268
  if (payload.compliance?.length) {
261
269
  engines.push({ id: 'compliance', requested: true, required: true, status: 'not-run',
262
270
  scope: 'requested-files', ruleCoverage: 'unknown', errors: [],
@@ -265,7 +273,7 @@ export function registerSecurityHandlers(ctx) {
265
273
  const requestedPaths = new Set(filesToScan);
266
274
  const analyzedPaths = new Set(fileEvidence.filter(file => file.status === 'analyzed' && requestedPaths.has(file.path)).map(file => file.path));
267
275
  const requiredEngines = engines.filter(engine => engine.requested && engine.required);
268
- const hasExecuted = analyzedPaths.size > 0;
276
+ const hasExecuted = analyzedPaths.size > 0 || (dependencyScan?.report.packagesChecked ?? 0) > 0;
269
277
  const complete = hasExecuted && requiredEngines.every(engine => engine.status === 'completed') &&
270
278
  (!discoveryResult || discoveryResult.discovery.status === 'complete');
271
279
  const evidence = {
@@ -286,18 +294,21 @@ export function registerSecurityHandlers(ctx) {
286
294
  low: crossLangVulns.filter(v => v.severity === 'low').length,
287
295
  informational: crossLangVulns.filter(v => v.severity === 'informational').length,
288
296
  };
297
+ const depVulns = dependencyScan?.vulnerabilities ?? [];
298
+ const depCount = (severity) => depVulns.filter(v => v.severity === severity).length;
289
299
  const summary = {
290
- critical: (sastResult?.summary?.critical || 0) + (dastResult?.summary?.critical || 0) + crossLangSeverityCounts.critical,
291
- high: (sastResult?.summary?.high || 0) + (dastResult?.summary?.high || 0) + crossLangSeverityCounts.high,
292
- medium: (sastResult?.summary?.medium || 0) + (dastResult?.summary?.medium || 0) + crossLangSeverityCounts.medium,
293
- low: (sastResult?.summary?.low || 0) + (dastResult?.summary?.low || 0) + crossLangSeverityCounts.low,
294
- informational: (sastResult?.summary?.informational || 0) + (dastResult?.summary?.informational || 0) + crossLangSeverityCounts.informational,
300
+ critical: (sastResult?.summary?.critical || 0) + (dastResult?.summary?.critical || 0) + crossLangSeverityCounts.critical + depCount('critical'),
301
+ high: (sastResult?.summary?.high || 0) + (dastResult?.summary?.high || 0) + crossLangSeverityCounts.high + depCount('high'),
302
+ medium: (sastResult?.summary?.medium || 0) + (dastResult?.summary?.medium || 0) + crossLangSeverityCounts.medium + depCount('medium'),
303
+ low: (sastResult?.summary?.low || 0) + (dastResult?.summary?.low || 0) + crossLangSeverityCounts.low + depCount('low'),
304
+ informational: (sastResult?.summary?.informational || 0) + (dastResult?.summary?.informational || 0) + crossLangSeverityCounts.informational + depCount('informational'),
295
305
  };
296
306
  // Extract top vulnerabilities from all sources
297
307
  const allVulns = [
298
308
  ...(sastResult?.vulnerabilities || []),
299
309
  ...(dastResult?.vulnerabilities || []),
300
310
  ...crossLangVulns,
311
+ ...depVulns,
301
312
  ];
302
313
  const topVulnerabilities = allVulns
303
314
  .sort((a, b) => {
@@ -316,6 +327,9 @@ export function registerSecurityHandlers(ctx) {
316
327
  const recommendations = allVulns.length === 0 && evidence.completeness !== 'complete'
317
328
  ? ['No findings reported; requested analysis is incomplete or unverified. Inspect execution receipts.']
318
329
  : generateSecurityRecommendations(allVulns);
330
+ if (dependencyScan && dependencyScan.report.status !== 'complete') {
331
+ recommendations.unshift(dependencyScan.report.message);
332
+ }
319
333
  return ok({
320
334
  vulnerabilities: allVulns.length,
321
335
  critical: summary.critical,
@@ -329,7 +343,9 @@ export function registerSecurityHandlers(ctx) {
329
343
  scanTypes: {
330
344
  sast: payload.sast !== false,
331
345
  dast: payload.dast || false,
346
+ dependencies: payload.dependencies === true,
332
347
  },
348
+ ...(dependencyScan ? { dependencyScan: dependencyScan.report } : {}),
333
349
  status: evidence.completeness === 'complete' ? 'completed' : evidence.completeness === 'partial' ? 'partial' : 'unavailable',
334
350
  evidence,
335
351
  limitations: evidence.limitations,
@@ -13,6 +13,7 @@ import { toError } from '../../shared/error-utils.js';
13
13
  import { LoggerFactory } from '../../logging/index.js';
14
14
  import { addToCount } from '../../shared/utils/safe-record.js';
15
15
  import { measuredFileCoverage } from '../../domains/quality-assessment/coverage-report-event.js';
16
+ import { fileCoverageLookupKeys } from '../../domains/coverage-analysis/collected-metrics.js';
16
17
  const logger = LoggerFactory.create('defect-investigation');
17
18
  export const DefectInvestigationEvents = {
18
19
  DefectInvestigationStarted: 'coordination.DefectInvestigationStarted',
@@ -607,7 +608,12 @@ export class DefectInvestigationProtocol {
607
608
  try {
608
609
  // Try per-file coverage (written by coverage-analyzer and test-executor)
609
610
  // #1014: only measured records; legacy unstamped estimates are ignored.
610
- const coverage = measuredFileCoverage(await this.memory.get(`coverage:file:${file}`));
611
+ let coverage = null;
612
+ for (const key of fileCoverageLookupKeys(file)) {
613
+ coverage = measuredFileCoverage(await this.memory.get(key));
614
+ if (coverage)
615
+ break;
616
+ }
611
617
  if (!coverage) {
612
618
  return null;
613
619
  }
@@ -9,6 +9,7 @@ import { v4 as uuidv4 } from 'uuid';
9
9
  import { ok, err, ALL_DOMAINS, } from '../../shared/types/index.js';
10
10
  import { TimeRange } from '../../shared/value-objects/index.js';
11
11
  import { toError } from '../../shared/error-utils.js';
12
+ import { readActivePatterns } from '../../domains/learning-optimization/active-patterns.js';
12
13
  const DEFAULT_CONFIG = {
13
14
  minPatternsForConsolidation: 5,
14
15
  similarityThreshold: 0.85,
@@ -139,18 +140,11 @@ export class LearningConsolidationProtocol {
139
140
  * Get patterns for a specific domain
140
141
  */
141
142
  async getPatternsForDomain(domain, timeRange) {
142
- const keys = await this.memory.search(`learning:pattern:*`, 500);
143
- const patterns = [];
144
- for (const key of keys) {
145
- const pattern = await this.memory.get(key);
146
- if (pattern &&
147
- pattern.domain === domain &&
148
- !key.includes(':archived:') &&
149
- (timeRange.contains(pattern.createdAt) || timeRange.contains(pattern.lastUsedAt))) {
150
- patterns.push(pattern);
151
- }
152
- }
153
- return patterns;
143
+ // #1055: active patterns only — excludes `:creation:` provenance as well
144
+ // as `:archived:` records, before get() and before the scan cap applies.
145
+ const patterns = await readActivePatterns(this.memory);
146
+ return patterns.filter((pattern) => pattern.domain === domain &&
147
+ (timeRange.contains(pattern.createdAt) || timeRange.contains(pattern.lastUsedAt)));
154
148
  }
155
149
  /**
156
150
  * Calculate statistics for a domain's patterns