agentic-qe 3.14.2 → 3.14.3

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 (372) hide show
  1. package/.claude/skills/skills-manifest.json +1 -1
  2. package/CHANGELOG.md +72 -0
  3. package/assets/skills/skills-manifest.json +1 -1
  4. package/dist/cli/bundle.js +5 -5
  5. package/dist/cli/chunks/adapter-AKQYU6UH.js +2 -0
  6. package/dist/cli/chunks/{agent-booster-wasm-SD5N32MX.js → agent-booster-wasm-TQOMLWWX.js} +2 -2
  7. package/dist/cli/chunks/{agent-handler-OZRSJM7F.js → agent-handler-Q3SEMMI2.js} +2 -2
  8. package/dist/cli/chunks/{agent-memory-branch-NYTRANRN.js → agent-memory-branch-SJXAQSZI.js} +2 -2
  9. package/dist/cli/chunks/aqe-learning-engine-MICRPL3N.js +2 -0
  10. package/dist/cli/chunks/{arena-EX3SC2DP.js → arena-7RC7TBGW.js} +4 -4
  11. package/dist/cli/chunks/{arena-FOTVSRK4.js → arena-UPB7TKUY.js} +2 -2
  12. package/dist/cli/chunks/{audit-Q5GHSUQY.js → audit-IXN5R4WB.js} +3 -3
  13. package/dist/cli/chunks/base-DZK36ITB.js +2 -0
  14. package/dist/cli/chunks/{better-sqlite3-S7M5R2HS.js → better-sqlite3-RP4DEGK3.js} +2 -2
  15. package/dist/cli/chunks/{brain-handler-5FSA46R5.js → brain-handler-H5OVZ22L.js} +3 -3
  16. package/dist/cli/chunks/{branch-enumerator-RWAXTGEU.js → branch-enumerator-VPRWDGFJ.js} +2 -2
  17. package/dist/cli/chunks/{browser-IGDESJGF.js → browser-B6E7JPPJ.js} +2 -2
  18. package/dist/cli/chunks/browser-workflow-ADK54DOE.js +2 -0
  19. package/dist/cli/chunks/{chunk-E3Q7WNJD.js → chunk-26GM5CWD.js} +3 -3
  20. package/dist/cli/chunks/{chunk-BWRHOIYC.js → chunk-2GNRW3OD.js} +2 -2
  21. package/dist/cli/chunks/{chunk-ZCDXJ27H.js → chunk-2IGT5WNQ.js} +1 -1
  22. package/dist/cli/chunks/{chunk-7SK6IMGZ.js → chunk-2WT7AKKK.js} +2 -2
  23. package/dist/cli/chunks/{chunk-DVHWLAEO.js → chunk-33VPWGCM.js} +3 -3
  24. package/dist/cli/chunks/{chunk-NAZVPZJS.js → chunk-37BASGWC.js} +2 -2
  25. package/dist/cli/chunks/{chunk-Q335R4MR.js → chunk-3ABRGG3C.js} +2 -2
  26. package/dist/cli/chunks/{chunk-IWFL6EFI.js → chunk-3P6NCFI2.js} +2 -2
  27. package/dist/cli/chunks/{chunk-4AKGBUYD.js → chunk-42VSQ2MX.js} +3 -3
  28. package/dist/cli/chunks/{chunk-2LKAMMMI.js → chunk-44WISFTU.js} +2 -2
  29. package/dist/cli/chunks/{chunk-RFNEHNJV.js → chunk-4C6UJIHB.js} +1 -1
  30. package/dist/cli/chunks/{chunk-CTCQOYBS.js → chunk-4JBFJTHJ.js} +1 -1
  31. package/dist/cli/chunks/{chunk-GJAWEUIN.js → chunk-4OUPCTBS.js} +2 -2
  32. package/dist/cli/chunks/{chunk-2EHFEMRU.js → chunk-4Q35TI6Z.js} +2 -2
  33. package/dist/cli/chunks/{chunk-N3RN4QTC.js → chunk-4RP5VUBI.js} +2 -2
  34. package/dist/cli/chunks/{chunk-ZYLSOBOR.js → chunk-4TXAP3YH.js} +1 -1
  35. package/dist/cli/chunks/{chunk-KZOBLLXW.js → chunk-4UDZLD42.js} +2 -2
  36. package/dist/cli/chunks/{chunk-UYTWDS2R.js → chunk-4W7QVUNO.js} +2 -2
  37. package/dist/cli/chunks/{chunk-4ZUZDFAA.js → chunk-4XPPMADQ.js} +2 -2
  38. package/dist/cli/chunks/{chunk-TENYL5TI.js → chunk-527HQAY7.js} +2 -2
  39. package/dist/cli/chunks/chunk-5BLFXQEB.js +96 -0
  40. package/dist/cli/chunks/{chunk-OX6T26CD.js → chunk-5DFHE4H5.js} +3 -3
  41. package/dist/cli/chunks/{chunk-T46LOLW3.js → chunk-5F6DWHQG.js} +2 -2
  42. package/dist/cli/chunks/{chunk-FVGTINVR.js → chunk-5FOZO7KM.js} +81 -65
  43. package/dist/cli/chunks/{chunk-T4C56HBW.js → chunk-5IAB5NRZ.js} +2 -2
  44. package/dist/cli/chunks/{chunk-4MH22236.js → chunk-5P3G6ZW4.js} +1 -1
  45. package/dist/cli/chunks/{chunk-7AFBNU6K.js → chunk-5Y5TC6BY.js} +2 -2
  46. package/dist/cli/chunks/{chunk-VSYBMNIR.js → chunk-6F2RM6X2.js} +1 -1
  47. package/dist/cli/chunks/{chunk-ICKLBATY.js → chunk-72UJXEKQ.js} +2 -2
  48. package/dist/cli/chunks/{chunk-A7N3YUDJ.js → chunk-74PK3NEW.js} +2 -2
  49. package/dist/cli/chunks/{chunk-PMUBG2RU.js → chunk-7BUERZYL.js} +2 -2
  50. package/dist/cli/chunks/{chunk-HZMLNM2T.js → chunk-7FYMDKQH.js} +174 -169
  51. package/dist/cli/chunks/{chunk-67A6PEZM.js → chunk-7G6UX2QN.js} +2 -2
  52. package/dist/cli/chunks/{chunk-G2CLZVYI.js → chunk-7JQHPANT.js} +3 -3
  53. package/dist/cli/chunks/{chunk-TLPL3EQY.js → chunk-7SLAZAVU.js} +2 -2
  54. package/dist/cli/chunks/{chunk-4UCMTYFQ.js → chunk-7Y2CEXRS.js} +4 -4
  55. package/dist/cli/chunks/{chunk-2H5YJ5ZK.js → chunk-AB4U6ZNI.js} +2 -2
  56. package/dist/cli/chunks/chunk-AWNYEAGB.js +2 -0
  57. package/dist/cli/chunks/chunk-B2ZONZPZ.js +5 -0
  58. package/dist/cli/chunks/{chunk-6F4WHN7D.js → chunk-B5XFDFBT.js} +1 -1
  59. package/dist/cli/chunks/{chunk-5EHLGOWW.js → chunk-B7SWW5A6.js} +2 -2
  60. package/dist/cli/chunks/{chunk-P64DMQ2C.js → chunk-BN7DKW5D.js} +1 -1
  61. package/dist/cli/chunks/{chunk-CIESXO73.js → chunk-C46DMCWF.js} +1 -1
  62. package/dist/cli/chunks/{chunk-HZ6NEJMO.js → chunk-CB5JPRIZ.js} +2 -2
  63. package/dist/cli/chunks/{chunk-SEHCX4NH.js → chunk-CBOPBYPU.js} +1 -1
  64. package/dist/cli/chunks/{chunk-LWUJQGCS.js → chunk-CR3QGHVN.js} +2 -2
  65. package/dist/cli/chunks/{chunk-NHHWLJQF.js → chunk-D4Z2N74A.js} +1 -1
  66. package/dist/cli/chunks/{chunk-4K27ESCA.js → chunk-DBA3N742.js} +1 -1
  67. package/dist/cli/chunks/{chunk-2TG24LYQ.js → chunk-DX3C5HPN.js} +1 -1
  68. package/dist/cli/chunks/{chunk-S4MR6RTE.js → chunk-E3FBW6G2.js} +1 -1
  69. package/dist/cli/chunks/{chunk-GHUPID5E.js → chunk-ELU4IC3I.js} +1 -1
  70. package/dist/cli/chunks/{chunk-C7AXRI7E.js → chunk-EY4OQHU3.js} +1 -1
  71. package/dist/cli/chunks/{chunk-6LMLN5R2.js → chunk-F67AV5P2.js} +2 -2
  72. package/dist/cli/chunks/chunk-FD2JFEQC.js +2 -0
  73. package/dist/cli/chunks/chunk-FKG5OQFT.js +2 -0
  74. package/dist/cli/chunks/{chunk-UIGEUEBT.js → chunk-FUE6LL72.js} +2 -2
  75. package/dist/cli/chunks/{chunk-4RT7I7PI.js → chunk-G5C2XVZC.js} +1 -1
  76. package/dist/cli/chunks/{chunk-WVY22NHZ.js → chunk-G6DCESPU.js} +2 -2
  77. package/dist/cli/chunks/{chunk-3DFFFXXO.js → chunk-G6ZHTF42.js} +2 -2
  78. package/dist/cli/chunks/{chunk-CH2TQCV5.js → chunk-GNTVFN7D.js} +1 -1
  79. package/dist/cli/chunks/{chunk-WMW47QMR.js → chunk-H5ZRV5K5.js} +2 -2
  80. package/dist/cli/chunks/{chunk-4M6A3PVJ.js → chunk-H6XBM2LY.js} +2 -2
  81. package/dist/cli/chunks/{chunk-4N44UJGI.js → chunk-HOQQCY2K.js} +2 -2
  82. package/dist/cli/chunks/{chunk-D4RCV4LY.js → chunk-HRUU7E3D.js} +2 -2
  83. package/dist/cli/chunks/{chunk-EAJK25IS.js → chunk-HXE5NBJG.js} +1 -1
  84. package/dist/cli/chunks/{chunk-IUNMW454.js → chunk-I4NDQGKP.js} +2 -2
  85. package/dist/cli/chunks/{chunk-CJHVOBJY.js → chunk-IFFZR6GY.js} +1 -1
  86. package/dist/cli/chunks/{chunk-YN6W2XIT.js → chunk-IKIITGU5.js} +3 -3
  87. package/dist/cli/chunks/{chunk-JIUF6NV6.js → chunk-IP7NSFQQ.js} +2 -2
  88. package/dist/cli/chunks/{chunk-3C2K4YMS.js → chunk-IQEJGZV6.js} +3 -3
  89. package/dist/cli/chunks/{chunk-RGH3WGWD.js → chunk-IU4EBTA2.js} +3 -3
  90. package/dist/cli/chunks/{chunk-QW4LN5NK.js → chunk-JBB7E26R.js} +2 -2
  91. package/dist/cli/chunks/{chunk-RYJHREYS.js → chunk-JRYZKBY2.js} +2 -2
  92. package/dist/cli/chunks/{chunk-6EHN7Q2Q.js → chunk-JV4FZUE7.js} +2 -2
  93. package/dist/cli/chunks/{chunk-PZKZY6PB.js → chunk-KF63AYXD.js} +2 -2
  94. package/dist/cli/chunks/{chunk-ZFGND4QK.js → chunk-KPMGTVB4.js} +1 -1
  95. package/dist/cli/chunks/chunk-L2GKMBDP.js +2 -0
  96. package/dist/cli/chunks/{chunk-7FWP7CZY.js → chunk-LHGNNZ76.js} +3 -3
  97. package/dist/cli/chunks/{chunk-HSJ5FQCF.js → chunk-LKN7JQTW.js} +2 -2
  98. package/dist/cli/chunks/{chunk-EH5OCHAJ.js → chunk-LLVGTEHU.js} +1 -1
  99. package/dist/cli/chunks/{chunk-TYVQNYXX.js → chunk-LS3EUMBP.js} +6 -6
  100. package/dist/cli/chunks/{chunk-F2KRT2II.js → chunk-LTBCAFTZ.js} +3 -3
  101. package/dist/cli/chunks/{chunk-PVHO6KLB.js → chunk-LVLBIKJD.js} +1 -1
  102. package/dist/cli/chunks/{chunk-5WJUNRTY.js → chunk-MDZ6RRLX.js} +2 -2
  103. package/dist/cli/chunks/{chunk-W4OQYLYO.js → chunk-MWWAMDHI.js} +1 -1
  104. package/dist/cli/chunks/{chunk-N5ZRUOMR.js → chunk-MXMFGSWR.js} +2 -2
  105. package/dist/cli/chunks/{chunk-L2F7FVIU.js → chunk-N4H2QOT5.js} +2 -2
  106. package/dist/cli/chunks/{chunk-R5RNOLHI.js → chunk-NBWQBQO5.js} +1 -1
  107. package/dist/cli/chunks/{chunk-IVGVOGIZ.js → chunk-NN76NTOX.js} +1 -1
  108. package/dist/cli/chunks/{chunk-OBCKP3G4.js → chunk-NTSXHZTC.js} +2 -2
  109. package/dist/cli/chunks/{chunk-YF5OP6CR.js → chunk-OV5EZO3U.js} +2 -2
  110. package/dist/cli/chunks/{chunk-JQ2ZD3WO.js → chunk-OVDKWCD7.js} +2 -2
  111. package/dist/cli/chunks/{chunk-WBH4C4BG.js → chunk-OVPJQWHW.js} +2 -2
  112. package/dist/cli/chunks/{chunk-6SZKLWZT.js → chunk-OY7MLMEX.js} +5 -5
  113. package/dist/cli/chunks/{chunk-NG2UVPTW.js → chunk-OYMLHX2B.js} +1 -1
  114. package/dist/cli/chunks/{chunk-RVCWSAXI.js → chunk-PI74GOE4.js} +2 -2
  115. package/dist/cli/chunks/{chunk-42WUDDUU.js → chunk-PZTVH2AS.js} +2 -2
  116. package/dist/cli/chunks/{chunk-4PH7O5ZH.js → chunk-QLWNXBRU.js} +2 -2
  117. package/dist/cli/chunks/{chunk-FPHPP5TQ.js → chunk-R2AFVFRF.js} +1 -1
  118. package/dist/cli/chunks/{chunk-MWQTACNA.js → chunk-RKJZWWB7.js} +2 -2
  119. package/dist/cli/chunks/{chunk-FREF6Y4L.js → chunk-ROX7NLS4.js} +2 -2
  120. package/dist/cli/chunks/{chunk-K574FLVB.js → chunk-RTJ2M6V6.js} +2 -2
  121. package/dist/cli/chunks/{chunk-NWFIJNEB.js → chunk-SG47AXJG.js} +1 -1
  122. package/dist/cli/chunks/{chunk-UHTAI4ZB.js → chunk-SGXSB7YO.js} +1 -1
  123. package/dist/cli/chunks/{chunk-PWEIDHT7.js → chunk-SHGKY3QB.js} +2 -2
  124. package/dist/cli/chunks/{chunk-MH73D5TN.js → chunk-SJPZSCZP.js} +2 -2
  125. package/dist/cli/chunks/{chunk-3WV4H33V.js → chunk-SQ3PPISY.js} +1 -1
  126. package/dist/cli/chunks/{chunk-RCI64RIJ.js → chunk-STRDSVH3.js} +2 -2
  127. package/dist/cli/chunks/{chunk-GHQ5PUOV.js → chunk-T35GZXTU.js} +2 -2
  128. package/dist/cli/chunks/{chunk-DRO5NJZA.js → chunk-T62DH4GG.js} +2 -2
  129. package/dist/cli/chunks/{chunk-W2FLULF4.js → chunk-TFHQE6NK.js} +2 -2
  130. package/dist/cli/chunks/{chunk-LML5VTFK.js → chunk-TGLAWI62.js} +1 -1
  131. package/dist/cli/chunks/{chunk-KFXZDQ5J.js → chunk-TISSZFHO.js} +1 -1
  132. package/dist/cli/chunks/{chunk-KPFG4OIM.js → chunk-TJEIOE7F.js} +1 -1
  133. package/dist/cli/chunks/{chunk-57TNBR2P.js → chunk-TTMHIOQ3.js} +2 -2
  134. package/dist/cli/chunks/{chunk-ARMZYHYL.js → chunk-UHQY3GK7.js} +2 -2
  135. package/dist/cli/chunks/{chunk-ADK7DF3G.js → chunk-UMENRGHK.js} +2 -2
  136. package/dist/cli/chunks/{chunk-ZWRQ5VAU.js → chunk-UMNYF5EZ.js} +2 -2
  137. package/dist/cli/chunks/{chunk-G6AV2HGY.js → chunk-UTVRQEZM.js} +3 -3
  138. package/dist/cli/chunks/{chunk-VOYJJ3KA.js → chunk-UYJHYMEQ.js} +2 -2
  139. package/dist/cli/chunks/{chunk-KEEBUVGV.js → chunk-V4AOVDCJ.js} +2 -2
  140. package/dist/cli/chunks/{chunk-HBTC4L53.js → chunk-VIDBBB6F.js} +2 -2
  141. package/dist/cli/chunks/{chunk-PFXX5Q32.js → chunk-VWNHKYK7.js} +2 -2
  142. package/dist/cli/chunks/{chunk-DW6ZMNMR.js → chunk-WYMGK5DX.js} +2 -2
  143. package/dist/cli/chunks/{chunk-CJCT452S.js → chunk-XA7CG3LH.js} +2 -2
  144. package/dist/cli/chunks/{chunk-QFUX7ELG.js → chunk-XX7HUSX2.js} +2 -2
  145. package/dist/cli/chunks/{chunk-WXMSRBQF.js → chunk-XXCYQXK3.js} +2 -2
  146. package/dist/cli/chunks/{chunk-6VKJAMZY.js → chunk-Y2DVFVGI.js} +1 -1
  147. package/dist/cli/chunks/{chunk-JDXLCNKV.js → chunk-Y5SQBI2F.js} +2 -2
  148. package/dist/cli/chunks/{chunk-QXTW7XCS.js → chunk-YAKS3CAB.js} +2 -2
  149. package/dist/cli/chunks/{chunk-Q3JHS3UD.js → chunk-YCBDE2N7.js} +2 -2
  150. package/dist/cli/chunks/{chunk-VNAKBHJI.js → chunk-YDNSLLBS.js} +2 -2
  151. package/dist/cli/chunks/{chunk-S7N4BKI3.js → chunk-YEXPFHV6.js} +2 -2
  152. package/dist/cli/chunks/{chunk-CG2MUD7U.js → chunk-YGB6R5DW.js} +1 -1
  153. package/dist/cli/chunks/{chunk-NNOMDM4N.js → chunk-YL7T3VV7.js} +2 -2
  154. package/dist/cli/chunks/{chunk-U54OOA24.js → chunk-ZHXWGNYM.js} +1 -1
  155. package/dist/cli/chunks/{chunk-NRR23SJV.js → chunk-ZK5JKHP4.js} +1 -1
  156. package/dist/cli/chunks/{chunk-XPLSLHRB.js → chunk-ZN3J6TZD.js} +1 -1
  157. package/dist/cli/chunks/{chunk-RHJVDCLV.js → chunk-ZUG5MOUB.js} +2 -2
  158. package/dist/cli/chunks/{ci-NTRH7PAW.js → ci-YVKDQWIX.js} +2 -2
  159. package/dist/cli/chunks/ci-output-LK3MBXLZ.js +2 -0
  160. package/dist/cli/chunks/{circuit-breaker-4WST3QSA.js → circuit-breaker-7AIXACR7.js} +2 -2
  161. package/dist/cli/chunks/{claude-flow-setup-KB4TKMYI.js → claude-flow-setup-UA7EO6VN.js} +2 -2
  162. package/dist/cli/chunks/client-M72GXFVQ.js +2 -0
  163. package/dist/cli/chunks/{cline-installer-W2ZHQ6WM.js → cline-installer-YDDCKKEV.js} +2 -2
  164. package/dist/cli/chunks/{code-TF2AVR5D.js → code-URB7UAKW.js} +2 -2
  165. package/dist/cli/chunks/{code-index-extractor-RMDRUVQJ.js → code-index-extractor-BL6HWH4Q.js} +2 -2
  166. package/dist/cli/chunks/{codex-installer-VSTRHJHV.js → codex-installer-2AVEO4EA.js} +2 -2
  167. package/dist/cli/chunks/{completions-3Q37QVFR.js → completions-RCKBSSSS.js} +2 -2
  168. package/dist/cli/chunks/{complexity-analyzer-3FNFLACD.js → complexity-analyzer-LEDG62YK.js} +2 -2
  169. package/dist/cli/chunks/{continuedev-installer-VTEXM455.js → continuedev-installer-VOTCEBFH.js} +2 -2
  170. package/dist/cli/chunks/{copilot-installer-AGY7DQUS.js → copilot-installer-NVTGLZX3.js} +2 -2
  171. package/dist/cli/chunks/core-handlers-C32RAMVI.js +2 -0
  172. package/dist/cli/chunks/{cost-tracker-LTZAQBX7.js → cost-tracker-GJIFB2BM.js} +2 -2
  173. package/dist/cli/chunks/{coverage-TT64IOS4.js → coverage-ZTPJWXWE.js} +3 -3
  174. package/dist/cli/chunks/cross-domain-router-UGFUCPKC.js +2 -0
  175. package/dist/cli/chunks/{cursor-installer-OVOJIOHN.js → cursor-installer-CMGJQMHX.js} +2 -2
  176. package/dist/cli/chunks/{daemon-DMFZMXKA.js → daemon-V456IWR3.js} +3 -3
  177. package/dist/cli/chunks/{daemon-XCULEHWY.js → daemon-Y2I3YVIU.js} +4 -4
  178. package/dist/cli/chunks/{dag-attention-scheduler-WW2RX4B5.js → dag-attention-scheduler-ZCBBOD3D.js} +2 -2
  179. package/dist/cli/chunks/{detect-QNWIM232.js → detect-2GHEA4A3.js} +2 -2
  180. package/dist/cli/chunks/{dist-node-6GQIY3CG.js → dist-node-44AGYJCH.js} +2 -2
  181. package/dist/cli/chunks/{domain-handler-6RJPDELX.js → domain-handler-IDLIEP6X.js} +2 -2
  182. package/dist/cli/chunks/{domain-transfer-WK524LBS.js → domain-transfer-KLEXGIRF.js} +2 -2
  183. package/dist/cli/chunks/dream-UFBBXY5W.js +2 -0
  184. package/dist/cli/chunks/{embed-and-insert-pattern-SO6GWJW7.js → embed-and-insert-pattern-DUW6K35A.js} +2 -2
  185. package/dist/cli/chunks/{eval-GL544IPO.js → eval-PR6YWDFM.js} +2 -2
  186. package/dist/cli/chunks/{experience-capture-middleware-BCCJ35OX.js → experience-capture-middleware-CJJJN7CF.js} +3 -3
  187. package/dist/cli/chunks/{fast-paths-CATDDBEU.js → fast-paths-LGLLKX6P.js} +2 -2
  188. package/dist/cli/chunks/{feature-flags-BUXNAORY.js → feature-flags-33D3I4DD.js} +2 -2
  189. package/dist/cli/chunks/{feature-flags-KNNWWP5G.js → feature-flags-QL4NCEGW.js} +2 -2
  190. package/dist/cli/chunks/{file-discovery-S4HF3O7D.js → file-discovery-GKCYJPFZ.js} +2 -2
  191. package/dist/cli/chunks/{fleet-DQVQQONW.js → fleet-QNT6X2YI.js} +3 -3
  192. package/dist/cli/chunks/{gnn-wrapper-G7ABZUG7.js → gnn-wrapper-ELSGT67Z.js} +2 -2
  193. package/dist/cli/chunks/{heartbeat-handler-UFMELIWT.js → heartbeat-handler-ZUI3DOOP.js} +4 -4
  194. package/dist/cli/chunks/heartbeat-scheduler-VQWHSGTY.js +2 -0
  195. package/dist/cli/chunks/hnsw-adapter-BS3NXWGU.js +2 -0
  196. package/dist/cli/chunks/hnsw-index-JP26B4HW.js +2 -0
  197. package/dist/cli/chunks/{hnsw-legacy-bridge-YIILSRXI.js → hnsw-legacy-bridge-EZMM5JWL.js} +2 -2
  198. package/dist/cli/chunks/{hnswlib-node-TSVRMXDH.js → hnswlib-node-G4CE3EOS.js} +2 -2
  199. package/dist/cli/chunks/{hooks-OHQPNK74.js → hooks-LCVXXA55.js} +10 -10
  200. package/dist/cli/chunks/{hypergraph-engine-LY7PJDSL.js → hypergraph-engine-6Z7RQ3HI.js} +2 -2
  201. package/dist/cli/chunks/{hypergraph-handler-YGDYZO6H.js → hypergraph-handler-PLI2GYPK.js} +3 -3
  202. package/dist/cli/chunks/impact-analyzer-WRE4CWPJ.js +2 -0
  203. package/dist/cli/chunks/{init-handler-MTK65LI3.js → init-handler-7VH3QJ5Y.js} +6 -6
  204. package/dist/cli/chunks/init-wizard-OFOEYB75.js +2 -0
  205. package/dist/cli/chunks/kernel-MXNFWNUD.js +2 -0
  206. package/dist/cli/chunks/{kilocode-installer-3IICU4RS.js → kilocode-installer-U3MW62DE.js} +2 -2
  207. package/dist/cli/chunks/{kiro-installer-MXOVQYQA.js → kiro-installer-PPEAC44T.js} +2 -2
  208. package/dist/cli/chunks/knowledge-graph-7JE2TVKJ.js +2 -0
  209. package/dist/cli/chunks/{learning-EV5LSOOM.js → learning-7B5NITDV.js} +3 -3
  210. package/dist/cli/chunks/{llm-router-7LYDJUOT.js → llm-router-BNEPT5OB.js} +4 -4
  211. package/dist/cli/chunks/llm-router-service-GTDVDKSU.js +2 -0
  212. package/dist/cli/chunks/{load-F4PVAMXQ.js → load-VO7ABNHV.js} +2 -2
  213. package/dist/cli/chunks/load-test-JZ4CLSBF.js +2 -0
  214. package/dist/cli/chunks/{mcp-DUYJUEME.js → mcp-THXEINCL.js} +2 -2
  215. package/dist/cli/chunks/{memory-XTTYORAS.js → memory-FZTT7ADM.js} +5 -5
  216. package/dist/cli/chunks/memory-backend-Q54CC5A5.js +2 -0
  217. package/dist/cli/chunks/memory-handlers-IIBJXKHZ.js +2 -0
  218. package/dist/cli/chunks/{multi-model-executor-R6XCTMCF.js → multi-model-executor-HEDVOZ6X.js} +2 -2
  219. package/dist/cli/chunks/{opencode-installer-33ULBU2F.js → opencode-installer-GQ7J5SBG.js} +2 -2
  220. package/dist/cli/chunks/{orchestrator-34ZJEKTJ.js → orchestrator-66JK2OS5.js} +5 -5
  221. package/dist/cli/chunks/pattern-null-store-W33O7FYO.js +2 -0
  222. package/dist/cli/chunks/{pattern-usage-recorder-GZ2M3F2E.js → pattern-usage-recorder-O6XHM2G5.js} +2 -2
  223. package/dist/cli/chunks/{pipeline-SR5OTY45.js → pipeline-UOG6UO6D.js} +2 -2
  224. package/dist/cli/chunks/{platform-VKJFJIAW.js → platform-Q7UH7FZQ.js} +2 -2
  225. package/dist/cli/chunks/{plugin-5C5UBQUQ.js → plugin-7OFLNGOS.js} +2 -2
  226. package/dist/cli/chunks/{prime-radiant-advanced-wasm-KO2PQI3D.js → prime-radiant-advanced-wasm-OSRDK2FW.js} +2 -2
  227. package/dist/cli/chunks/protocol-executor-VGN4M7XY.js +2 -0
  228. package/dist/cli/chunks/{protocol-handler-ZF74NIKA.js → protocol-handler-WLYTX6FS.js} +2 -2
  229. package/dist/cli/chunks/{prove-MO5TQQU4.js → prove-QVNE4V3J.js} +2 -2
  230. package/dist/cli/chunks/qe-reasoning-bank-7VB5LJGS.js +2 -0
  231. package/dist/cli/chunks/{quality-EYIN6AER.js → quality-DNE2RKE5.js} +2 -2
  232. package/dist/cli/chunks/{quality-gate-V6OQM57O.js → quality-gate-2K35GCSI.js} +3 -3
  233. package/dist/cli/chunks/queen-coordinator-HIDMJMMG.js +2 -0
  234. package/dist/cli/chunks/{real-embeddings-AR7TZX7U.js → real-embeddings-SF42ML7G.js} +2 -2
  235. package/dist/cli/chunks/{roocode-installer-46E626VZ.js → roocode-installer-NCEZPF5L.js} +2 -2
  236. package/dist/cli/chunks/router-CTIJS4D7.js +2 -0
  237. package/dist/cli/chunks/routing-feedback-LFYYZS5J.js +2 -0
  238. package/dist/cli/chunks/{routing-handler-ZNRVW6QW.js → routing-handler-4MXXZRYP.js} +2 -2
  239. package/dist/cli/chunks/{ruvector-commands-4L2CQMWS.js → ruvector-commands-WDFMMCMK.js} +2 -2
  240. package/dist/cli/chunks/rvf-dual-writer-MNPMIWVM.js +2 -0
  241. package/dist/cli/chunks/rvf-migration-adapter-DXOKSSNW.js +2 -0
  242. package/dist/cli/chunks/{rvf-migration-coordinator-H4RVGBIA.js → rvf-migration-coordinator-JT7ZCJY7.js} +2 -2
  243. package/dist/cli/chunks/rvf-native-adapter-PZKUKA7R.js +2 -0
  244. package/dist/cli/chunks/{rvf-store-integrity-OJGWWPLL.js → rvf-store-integrity-Q3FGYKFT.js} +2 -2
  245. package/dist/cli/chunks/safe-db-73BLFV2C.js +2 -0
  246. package/dist/cli/chunks/schedule-YVTGTTI4.js +2 -0
  247. package/dist/cli/chunks/scheduler-5DSAFIRQ.js +2 -0
  248. package/dist/cli/chunks/security-CJJ3WJSB.js +13 -0
  249. package/dist/cli/chunks/{shared-rvf-adapter-M6NNIZ5W.js → shared-rvf-adapter-6RGCTLHD.js} +2 -2
  250. package/dist/cli/chunks/{shared-rvf-dual-writer-LHMFCYVE.js → shared-rvf-dual-writer-KIA6Q6MT.js} +2 -2
  251. package/dist/cli/chunks/sqlite-persistence-LRG4IPCU.js +2 -0
  252. package/dist/cli/chunks/{status-handler-GMIOXQIE.js → status-handler-BADQV2KA.js} +2 -2
  253. package/dist/cli/chunks/{structural-health-YZXHVHM6.js → structural-health-VMYEYRZG.js} +2 -2
  254. package/dist/cli/chunks/{sync-GMPCPV5L.js → sync-PXLROLHB.js} +2 -2
  255. package/dist/cli/chunks/{sync-N56UQGCS.js → sync-ULY7T5II.js} +2 -2
  256. package/dist/cli/chunks/{task-handler-VTNRGAXP.js → task-handler-L7E2I267.js} +2 -2
  257. package/dist/cli/chunks/{task-handlers-FYSDH55N.js → task-handlers-6DPKE4AK.js} +3 -3
  258. package/dist/cli/chunks/{test-GQNCKRSP.js → test-WCLURQUT.js} +11 -11
  259. package/dist/cli/chunks/test-scheduling-4CNJA6TW.js +15 -0
  260. package/dist/cli/chunks/{token-bootstrap-76SRNXGG.js → token-bootstrap-GTI24JAL.js} +2 -2
  261. package/dist/cli/chunks/{token-usage-O7CZDP5Q.js → token-usage-DRVG6PKO.js} +2 -2
  262. package/dist/cli/chunks/{transformers-LTU4LSSC.js → transformers-IMDDAMYQ.js} +2 -2
  263. package/dist/cli/chunks/{tree-sitter-wasm-parser-NQSQCMBM.js → tree-sitter-wasm-parser-WBZIHVFA.js} +2 -2
  264. package/dist/cli/chunks/{types-OP6IWE6N.js → types-TXMY5M2K.js} +2 -2
  265. package/dist/cli/chunks/unified-memory-VBQ572X4.js +2 -0
  266. package/dist/cli/chunks/unified-memory-hnsw-J3L74ZRY.js +2 -0
  267. package/dist/cli/chunks/unified-persistence-EM2VYRTQ.js +2 -0
  268. package/dist/cli/chunks/{upgrade-OQWRBZ3R.js → upgrade-6ALSDWDD.js} +2 -2
  269. package/dist/cli/chunks/{validate-TH5SRP3E.js → validate-XF4ZG3LC.js} +2 -2
  270. package/dist/cli/chunks/{validate-swarm-UITL2JUS.js → validate-swarm-P5TAFRDA.js} +2 -2
  271. package/dist/cli/chunks/{vibium-O6PRAG4J.js → vibium-2XDXKNKZ.js} +2 -2
  272. package/dist/cli/chunks/visual-security-GX4S7K6O.js +2 -0
  273. package/dist/cli/chunks/{web-tree-sitter-XBFBY4OF.js → web-tree-sitter-4JVRQPX5.js} +2 -2
  274. package/dist/cli/chunks/{windsurf-installer-DVT5NRNY.js → windsurf-installer-WYJXVDO5.js} +2 -2
  275. package/dist/cli/chunks/witness-chain-QGKMHCNW.js +2 -0
  276. package/dist/cli/chunks/{witness-chain-VRSH2F36.js → witness-chain-RPZ2SE2V.js} +2 -2
  277. package/dist/cli/chunks/{witness-key-manager-GFHRDKQ4.js → witness-key-manager-LXG2VBQQ.js} +2 -2
  278. package/dist/cli/chunks/{workflow-HAZ6YKOG.js → workflow-2OYNO7UU.js} +4 -4
  279. package/dist/cli/chunks/workflow-orchestrator-KWHIJMFV.js +2 -0
  280. package/dist/cli/chunks/{wrappers-5LLLT7GM.js → wrappers-DIJNNFU6.js} +2 -2
  281. package/dist/cli/commands/security.js +167 -100
  282. package/dist/cli/commands/test.js +1 -0
  283. package/dist/cli/utils/ci-output.d.ts +17 -0
  284. package/dist/cli/utils/ci-output.js +34 -2
  285. package/dist/coordination/handlers/handler-types.d.ts +3 -0
  286. package/dist/coordination/handlers/quality-handlers.js +10 -0
  287. package/dist/coordination/handlers/security-handlers.js +168 -72
  288. package/dist/coordination/handlers/test-execution-handlers.js +37 -43
  289. package/dist/coordination/protocols/security-audit.d.ts +3 -0
  290. package/dist/coordination/protocols/security-audit.js +61 -39
  291. package/dist/coordination/result-saver.js +36 -5
  292. package/dist/coordination/task-executor.d.ts +3 -1
  293. package/dist/coordination/task-executor.js +4 -0
  294. package/dist/domains/security-compliance/interfaces.d.ts +5 -0
  295. package/dist/domains/security-compliance/interfaces.js +0 -6
  296. package/dist/domains/security-compliance/scan-discovery.d.ts +12 -0
  297. package/dist/domains/security-compliance/scan-discovery.js +105 -0
  298. package/dist/domains/security-compliance/scan-evidence.d.ts +57 -0
  299. package/dist/domains/security-compliance/scan-evidence.js +2 -0
  300. package/dist/domains/security-compliance/services/scanners/sast-scanner.d.ts +3 -2
  301. package/dist/domains/security-compliance/services/scanners/sast-scanner.js +109 -65
  302. package/dist/domains/security-compliance/services/semgrep-integration.d.ts +9 -2
  303. package/dist/domains/security-compliance/services/semgrep-integration.js +68 -20
  304. package/dist/domains/test-execution/services/flaky-detector.js +14 -3
  305. package/dist/domains/test-execution/services/retry-handler.js +18 -8
  306. package/dist/domains/test-execution/services/test-executor.js +46 -12
  307. package/dist/init/init-wizard-hooks.js +2 -2
  308. package/dist/integrations/agentic-flow/reasoning-bank/index.js +3 -20
  309. package/dist/integrations/coherence/engines/cohomology-adapter.js +100 -30
  310. package/dist/mcp/bundle.js +499 -478
  311. package/dist/mcp/handlers/domain-handler-configs.d.ts +22 -1
  312. package/dist/mcp/handlers/domain-handler-configs.js +50 -19
  313. package/dist/mcp/handlers/domain-handlers.d.ts +7 -5
  314. package/dist/mcp/handlers/domain-handlers.js +7 -5
  315. package/dist/mcp/protocol-server.js +9 -5
  316. package/dist/mcp/types.d.ts +5 -0
  317. package/dist/shared/llm/router/hybrid-router.d.ts +4 -0
  318. package/dist/shared/llm/router/hybrid-router.js +74 -26
  319. package/dist/shared/llm/router/types.d.ts +9 -2
  320. package/dist/shared/test-runner-verdict.d.ts +29 -0
  321. package/dist/shared/test-runner-verdict.js +43 -0
  322. package/dist/shared/vitest-json-report.d.ts +45 -0
  323. package/dist/shared/vitest-json-report.js +71 -0
  324. package/dist/test-scheduling/executors/vitest-executor.js +18 -6
  325. package/dist/validation/frontier-judge.d.ts +7 -4
  326. package/dist/validation/frontier-judge.js +11 -6
  327. package/package.json +6 -6
  328. package/dist/cli/chunks/adapter-OJF6LAJV.js +0 -2
  329. package/dist/cli/chunks/aqe-learning-engine-FGT474XB.js +0 -2
  330. package/dist/cli/chunks/base-HH765JFV.js +0 -2
  331. package/dist/cli/chunks/browser-workflow-NPM4FUPI.js +0 -2
  332. package/dist/cli/chunks/chunk-OC2CKU7I.js +0 -2
  333. package/dist/cli/chunks/chunk-PHHXHG2W.js +0 -2
  334. package/dist/cli/chunks/chunk-U2AY57XZ.js +0 -5
  335. package/dist/cli/chunks/chunk-WBMRADQP.js +0 -81
  336. package/dist/cli/chunks/ci-output-F57RSD35.js +0 -2
  337. package/dist/cli/chunks/client-GPZEC54E.js +0 -2
  338. package/dist/cli/chunks/core-handlers-YMGHYIBR.js +0 -2
  339. package/dist/cli/chunks/cross-domain-router-ECBNTGYJ.js +0 -2
  340. package/dist/cli/chunks/dream-EHGKCFWH.js +0 -2
  341. package/dist/cli/chunks/heartbeat-scheduler-UFEL2CBW.js +0 -2
  342. package/dist/cli/chunks/hnsw-adapter-BLSD45CX.js +0 -2
  343. package/dist/cli/chunks/hnsw-index-A3RZODEN.js +0 -2
  344. package/dist/cli/chunks/impact-analyzer-OXHD3FOH.js +0 -2
  345. package/dist/cli/chunks/init-wizard-PKZL7QBU.js +0 -2
  346. package/dist/cli/chunks/kernel-XWPM72UJ.js +0 -2
  347. package/dist/cli/chunks/knowledge-graph-FRKR5XWI.js +0 -2
  348. package/dist/cli/chunks/llm-router-service-R7A5HHDM.js +0 -2
  349. package/dist/cli/chunks/load-test-5IKDWSYL.js +0 -2
  350. package/dist/cli/chunks/memory-backend-7VW5QCMO.js +0 -2
  351. package/dist/cli/chunks/memory-handlers-VZH3R2TQ.js +0 -2
  352. package/dist/cli/chunks/pattern-null-store-BU6LCB2W.js +0 -2
  353. package/dist/cli/chunks/protocol-executor-BSP5LWJN.js +0 -2
  354. package/dist/cli/chunks/qe-reasoning-bank-J2RC7P25.js +0 -2
  355. package/dist/cli/chunks/queen-coordinator-XI5AJV2V.js +0 -2
  356. package/dist/cli/chunks/router-VXQYYA3D.js +0 -2
  357. package/dist/cli/chunks/routing-feedback-HZQTASFF.js +0 -2
  358. package/dist/cli/chunks/rvf-dual-writer-BDTLLJER.js +0 -2
  359. package/dist/cli/chunks/rvf-migration-adapter-IB343MDN.js +0 -2
  360. package/dist/cli/chunks/rvf-native-adapter-Y7SN7LHU.js +0 -2
  361. package/dist/cli/chunks/safe-db-2VTKKBJU.js +0 -2
  362. package/dist/cli/chunks/schedule-QJ4CFGJY.js +0 -2
  363. package/dist/cli/chunks/scheduler-2NHDQPC3.js +0 -2
  364. package/dist/cli/chunks/security-JF3BVNRO.js +0 -14
  365. package/dist/cli/chunks/sqlite-persistence-NVVAPZN3.js +0 -2
  366. package/dist/cli/chunks/test-scheduling-GPRXSIRP.js +0 -15
  367. package/dist/cli/chunks/unified-memory-DSTIEDSH.js +0 -2
  368. package/dist/cli/chunks/unified-memory-hnsw-KBV3P4OS.js +0 -2
  369. package/dist/cli/chunks/unified-persistence-XKCOUBKY.js +0 -2
  370. package/dist/cli/chunks/visual-security-TTWSPZTZ.js +0 -2
  371. package/dist/cli/chunks/witness-chain-2KY73HPN.js +0 -2
  372. package/dist/cli/chunks/workflow-orchestrator-UK56AVOT.js +0 -2
@@ -7,48 +7,47 @@
7
7
  import * as fs from 'fs/promises';
8
8
  import * as path from 'path';
9
9
  import { ok, err } from '../../shared/types/index.js';
10
+ import { createHash } from 'node:crypto';
10
11
  import { toError } from '../../shared/error-utils.js';
11
12
  import { FilePath } from '../../shared/value-objects/index.js';
12
- import { discoverSourceFiles, generateSecurityRecommendations } from './handler-utils.js';
13
+ import { generateSecurityRecommendations } from './handler-utils.js';
14
+ import { discoverSecurityFiles, isSecuritySourceFile } from '../../domains/security-compliance/scan-discovery.js';
13
15
  export function registerSecurityHandlers(ctx) {
14
16
  // Register security scan handler - REAL IMPLEMENTATION
15
17
  ctx.registerHandler('scan-security', async (task) => {
16
18
  const payload = task.payload;
17
19
  try {
18
- const scanner = ctx.getSecurityScanner();
19
- const targetPath = payload.target || process.cwd();
20
- // Discover files to scan
21
- const filesToScan = await discoverSourceFiles(targetPath);
22
- if (filesToScan.length === 0) {
23
- return ok({
24
- vulnerabilities: 0,
25
- critical: 0,
26
- high: 0,
27
- medium: 0,
28
- low: 0,
29
- informational: 0,
30
- topVulnerabilities: [],
31
- recommendations: ['No source files found to scan'],
32
- scanTypes: {
33
- sast: payload.sast !== false,
34
- dast: payload.dast || false,
35
- },
36
- warning: `No source files found in ${targetPath}`,
37
- });
38
- }
20
+ const targetPath = path.resolve(payload.target || process.cwd());
21
+ const sastRequested = payload.sast !== false;
22
+ const discoveryResult = sastRequested ? await discoverSecurityFiles(targetPath) : undefined;
23
+ const filesToScan = discoveryResult?.files ?? [];
24
+ const fileEvidence = [];
25
+ const engines = [];
26
+ const genericRules = new Map();
27
+ const genericErrors = [];
28
+ const manifestErrors = [];
29
+ const manifestRules = new Map();
30
+ const limitations = [];
39
31
  // Separate files by language capability
40
- const jstsFiles = filesToScan.filter(f => /\.(ts|tsx|js|jsx|mjs|cjs)$/.test(f));
41
- const otherFiles = filesToScan.filter(f => !/\.(ts|tsx|js|jsx|mjs|cjs)$/.test(f));
32
+ const jstsFiles = filesToScan.filter(f => /\.(ts|tsx|js|jsx|mjs|cjs)$/i.test(f));
33
+ const otherFiles = filesToScan.filter(f => !/\.(ts|tsx|js|jsx|mjs|cjs)$/i.test(f));
42
34
  // Run basic cross-language security patterns on non-JS/TS files
43
35
  const crossLangVulns = [];
44
36
  // Run secret/CORS patterns on ALL files (not just otherFiles) to catch JS/TS secrets too
45
37
  for (const filePath of filesToScan) {
38
+ if (!isSecuritySourceFile(filePath)) {
39
+ fileEvidence.push({ path: filePath, engineId: 'generic-patterns', status: 'unsupported',
40
+ readLines: 0, analyzedLines: 0, reason: 'Outside the declared source-language policy.' });
41
+ continue;
42
+ }
46
43
  try {
47
- const content = await fs.readFile(filePath, 'utf-8');
44
+ const source = await fs.readFile(filePath);
45
+ const content = source.toString('utf-8');
48
46
  const lines = content.split('\n');
49
- const relPath = filePath.startsWith(targetPath)
50
- ? filePath.slice(targetPath.length).replace(/^\//, '')
51
- : filePath;
47
+ fileEvidence.push({ path: filePath, engineId: 'generic-patterns', status: 'analyzed',
48
+ sourceDigest: createHash('sha256').update(source).digest('hex'),
49
+ readLines: lines.length, analyzedLines: lines.length });
50
+ const relPath = path.relative(targetPath, filePath) || path.basename(filePath);
52
51
  // Pattern: Hardcoded secrets/keys
53
52
  // Fix #287: Use \w* around keywords to match SECRET_KEY, JWT_SECRET, API_TOKEN, etc.
54
53
  const secretPatterns = [
@@ -56,7 +55,8 @@ export function registerSecurityHandlers(ctx) {
56
55
  { regex: /\w*(?:token|auth_token|access_key|secret_key)\w*\s*[=:]\s*['"][^'"]{8,}['"]/gi, title: 'Hardcoded credential', severity: 'critical' },
57
56
  { regex: /(?:AWS_SECRET|GITHUB_TOKEN|SLACK_TOKEN|OPENAI_API_KEY)\s*[=:]\s*['"][^'"]+['"]/gi, title: 'Hardcoded cloud credential', severity: 'critical' },
58
57
  ];
59
- for (const pattern of secretPatterns) {
58
+ for (const [index, pattern] of secretPatterns.entries()) {
59
+ genericRules.set(`secret-${index}`, pattern.regex.toString());
60
60
  for (let i = 0; i < lines.length; i++) {
61
61
  // Use matchAll to find ALL secrets on a single line (not just first)
62
62
  const matches = [...lines[i].matchAll(pattern.regex)];
@@ -73,6 +73,7 @@ export function registerSecurityHandlers(ctx) {
73
73
  }
74
74
  // Pattern: SQL injection risks
75
75
  const sqlPatterns = /(?:execute|query|cursor\.execute)\s*\(\s*(?:f['"]|['"].*%s|['"].*\+\s*\w)/gi;
76
+ genericRules.set('sql-interpolation', sqlPatterns.toString());
76
77
  for (let i = 0; i < lines.length; i++) {
77
78
  if (sqlPatterns.test(lines[i])) {
78
79
  crossLangVulns.push({
@@ -93,7 +94,8 @@ export function registerSecurityHandlers(ctx) {
93
94
  /@CrossOrigin\(\s*origins?\s*=\s*["']\*["']/i, // Spring Boot
94
95
  /\.Header\(\)\.Set\(["']Access-Control-Allow-Origin["'],\s*["']\*["']/i, // Go
95
96
  ];
96
- for (const corsPattern of corsPatterns) {
97
+ for (const [index, corsPattern] of corsPatterns.entries()) {
98
+ genericRules.set(`cors-${index}`, corsPattern.toString());
97
99
  if (corsPattern.test(content)) {
98
100
  crossLangVulns.push({
99
101
  title: 'CORS wildcard origin',
@@ -106,6 +108,7 @@ export function registerSecurityHandlers(ctx) {
106
108
  }
107
109
  }
108
110
  // Pattern: Debug/development mode enabled
111
+ genericRules.set('debug-mode', /(?:DEBUG|debug)\s*[=:]\s*(?:True|true|1)/i.toString());
109
112
  if (/(?:DEBUG|debug)\s*[=:]\s*(?:True|true|1)/i.test(content)) {
110
113
  crossLangVulns.push({
111
114
  title: 'Debug mode enabled',
@@ -116,6 +119,7 @@ export function registerSecurityHandlers(ctx) {
116
119
  });
117
120
  }
118
121
  // Pattern: Eval/exec usage
122
+ genericRules.set('eval-exec', /\b(?:eval|exec)\s*\(/i.toString());
119
123
  if (/\b(?:eval|exec)\s*\(/i.test(content)) {
120
124
  crossLangVulns.push({
121
125
  title: 'Dangerous eval/exec usage',
@@ -126,16 +130,24 @@ export function registerSecurityHandlers(ctx) {
126
130
  });
127
131
  }
128
132
  }
129
- catch {
130
- // Skip unreadable files
133
+ catch (error) {
134
+ const reason = `Source read failed: ${safeErrorCode(error)}`;
135
+ genericErrors.push(`${filePath}: ${reason}`);
136
+ fileEvidence.push({ path: filePath, engineId: 'generic-patterns', status: 'unreadable',
137
+ readLines: 0, analyzedLines: 0, reason });
131
138
  }
132
139
  }
133
140
  // Also check dependency manifests for known vulnerable packages
134
141
  const depManifests = ['requirements.txt', 'pyproject.toml', 'Gemfile', 'go.mod', 'Cargo.toml'];
135
- for (const manifest of depManifests) {
142
+ for (const manifest of sastRequested ? depManifests : []) {
136
143
  const manifestPath = path.join(targetPath, manifest);
137
144
  try {
138
- const manifestContent = await fs.readFile(manifestPath, 'utf-8');
145
+ const manifestSource = await fs.readFile(manifestPath);
146
+ const manifestContent = manifestSource.toString('utf-8');
147
+ const manifestLines = manifestContent.split('\n').length;
148
+ fileEvidence.push({ path: manifestPath, engineId: 'dependency-manifest-patterns', status: 'analyzed',
149
+ sourceDigest: createHash('sha256').update(manifestSource).digest('hex'), readLines: manifestLines, analyzedLines: manifestLines });
150
+ manifestRules.set('dependency-audit-advisory', 'Presence of a supported dependency manifest');
139
151
  crossLangVulns.push({
140
152
  title: 'Dependency audit recommended',
141
153
  severity: 'informational',
@@ -151,6 +163,7 @@ export function registerSecurityHandlers(ctx) {
151
163
  { pkg: 'python-multipart', pattern: /python-multipart/i, cve: 'CVE-2026-24486', severity: 'critical', title: 'python-multipart DoS (CVE-2026-24486)', description: 'python-multipart denial of service via crafted multipart data — upgrade to >=0.0.18' },
152
164
  ];
153
165
  for (const known of knownCVEs) {
166
+ manifestRules.set(known.cve, known.pattern.toString());
154
167
  if (known.pattern.test(manifestContent)) {
155
168
  crossLangVulns.push({
156
169
  title: known.title,
@@ -163,32 +176,108 @@ export function registerSecurityHandlers(ctx) {
163
176
  }
164
177
  }
165
178
  }
166
- catch {
167
- // Manifest doesn't exist
179
+ catch (error) {
180
+ const code = error.code;
181
+ if (code !== 'ENOENT' && code !== 'ENOTDIR') {
182
+ const reason = `Manifest read failed: ${safeErrorCode(error)}`;
183
+ manifestErrors.push(`${manifestPath}: ${reason}`);
184
+ fileEvidence.push({ path: manifestPath, engineId: 'dependency-manifest-patterns', status: 'unreadable',
185
+ readLines: 0, analyzedLines: 0, reason });
186
+ }
168
187
  }
169
188
  }
189
+ const genericAnalyzed = fileEvidence.filter(file => file.engineId === 'generic-patterns' && file.status === 'analyzed').length;
190
+ const manifestsAnalyzed = fileEvidence.filter(file => file.engineId === 'dependency-manifest-patterns' && file.status === 'analyzed').length;
191
+ engines.push({ id: 'dependency-manifest-patterns', requested: sastRequested, required: false,
192
+ status: !sastRequested ? 'disabled' : manifestErrors.length > 0 ? (manifestsAnalyzed > 0 ? 'partial' : 'failed') : manifestsAnalyzed > 0 ? 'completed' : 'not-run',
193
+ scope: 'parent-directory', target: targetPath, analyzedFiles: manifestsAnalyzed,
194
+ ruleIds: [...manifestRules.keys()].sort(), rulesetDigest: createHash('sha256').update(JSON.stringify([...manifestRules.entries()].sort())).digest('hex'),
195
+ ruleCoverage: 'known', errors: manifestErrors, limitations: ['Manifest name patterns are advisories, not a resolved dependency or version audit.'] });
196
+ const genericLimitations = ['Generic text patterns do not establish language-specific or dependency vulnerability coverage.'];
197
+ engines.push({ id: 'generic-patterns', requested: sastRequested, required: sastRequested,
198
+ status: !sastRequested ? 'disabled' : genericErrors.length > 0 ? (genericAnalyzed > 0 ? 'partial' : 'failed')
199
+ : genericAnalyzed === filesToScan.length && genericAnalyzed > 0 ? 'completed'
200
+ : genericAnalyzed > 0 ? 'partial' : filesToScan.length > 0 ? 'unavailable' : 'not-run',
201
+ scope: 'requested-files', analyzedFiles: genericAnalyzed,
202
+ ruleIds: [...genericRules.keys()].sort(),
203
+ rulesetDigest: createHash('sha256').update(JSON.stringify([...genericRules.entries()].sort())).digest('hex'),
204
+ ruleCoverage: 'known', errors: genericErrors, limitations: genericLimitations });
170
205
  // Convert JS/TS file paths to FilePath value objects for the SAST scanner
171
206
  const filePathObjects = jstsFiles.map(filePath => FilePath.create(filePath));
172
- // Run SAST scan on JS/TS files if requested and files exist
207
+ // Only returned execution receipts can establish SAST coverage.
173
208
  let sastResult = null;
174
- if (payload.sast !== false && filePathObjects.length > 0) {
175
- const result = await scanner.scanFiles(filePathObjects);
176
- if (result.success) {
177
- sastResult = result.value;
209
+ if (sastRequested && filePathObjects.length > 0) {
210
+ try {
211
+ const result = await ctx.getSecurityScanner().scanFiles(filePathObjects);
212
+ if (result.success) {
213
+ sastResult = result.value;
214
+ if (sastResult.evidence) {
215
+ fileEvidence.push(...sastResult.evidence.files);
216
+ engines.push(...sastResult.evidence.engines);
217
+ limitations.push(...sastResult.evidence.limitations);
218
+ }
219
+ else {
220
+ engines.push(unverifiedEngine('sast', 'requested-files'));
221
+ }
222
+ }
223
+ else {
224
+ engines.push(failedEngine('sast', 'requested-files', result.error));
225
+ }
226
+ }
227
+ catch (error) {
228
+ engines.push(failedEngine('sast', 'requested-files', error));
178
229
  }
179
230
  }
180
- // Run DAST scan if URL provided and dast is enabled
231
+ else {
232
+ engines.push({ id: 'sast', requested: sastRequested, required: false,
233
+ status: sastRequested ? 'not-run' : 'disabled', scope: 'requested-files', analyzedFiles: 0,
234
+ ruleCoverage: 'unknown', errors: [], limitations: sastRequested ? ['No JS/TS files were available for language-specific SAST.'] : [] });
235
+ }
181
236
  let dastResult = null;
182
237
  if (payload.dast && payload.targetUrl) {
183
- const result = await scanner.scanUrl(payload.targetUrl, {
184
- activeScanning: true,
185
- maxDepth: 3,
186
- timeout: 30000,
187
- });
188
- if (result.success) {
189
- dastResult = result.value;
238
+ try {
239
+ const result = await ctx.getSecurityScanner().scanUrl(payload.targetUrl, {
240
+ activeScanning: true, maxDepth: 3, timeout: 30000,
241
+ });
242
+ if (result.success) {
243
+ dastResult = result.value;
244
+ // Legacy DAST results contain findings, but no execution coverage receipt.
245
+ engines.push({ ...unverifiedEngine('dast', 'url'), target: payload.targetUrl });
246
+ }
247
+ else {
248
+ engines.push({ ...failedEngine('dast', 'url', result.error), target: payload.targetUrl });
249
+ }
190
250
  }
251
+ catch (error) {
252
+ engines.push({ ...failedEngine('dast', 'url', error), target: payload.targetUrl });
253
+ }
254
+ }
255
+ else {
256
+ engines.push({ id: 'dast', requested: payload.dast === true, required: payload.dast === true,
257
+ status: payload.dast ? 'not-run' : 'disabled', scope: 'url', ruleCoverage: 'unknown',
258
+ errors: payload.dast ? ['DAST was requested without targetUrl.'] : [], limitations: [] });
191
259
  }
260
+ if (payload.compliance?.length) {
261
+ engines.push({ id: 'compliance', requested: true, required: true, status: 'not-run',
262
+ scope: 'requested-files', ruleCoverage: 'unknown', errors: [],
263
+ limitations: ['Requested compliance checks are not executed by this task handler.'] });
264
+ }
265
+ const requestedPaths = new Set(filesToScan);
266
+ const analyzedPaths = new Set(fileEvidence.filter(file => file.status === 'analyzed' && requestedPaths.has(file.path)).map(file => file.path));
267
+ const requiredEngines = engines.filter(engine => engine.requested && engine.required);
268
+ const hasExecuted = analyzedPaths.size > 0;
269
+ const complete = hasExecuted && requiredEngines.every(engine => engine.status === 'completed') &&
270
+ (!discoveryResult || discoveryResult.discovery.status === 'complete');
271
+ const evidence = {
272
+ schemaVersion: 1, completeness: complete ? 'complete' : hasExecuted ? 'partial' : 'none',
273
+ requestedFiles: filesToScan.length, requestedPaths: filesToScan, duplicateInputs: 0,
274
+ files: fileEvidence, engines,
275
+ limitations: [...new Set([...limitations, ...engines.flatMap(engine => [...engine.limitations, ...engine.errors]),
276
+ ...(discoveryResult?.discovery.issues.map(issue => `${issue.path}: ${issue.reason}`) ?? [])])],
277
+ ...(discoveryResult ? { discovery: discoveryResult.discovery } : {}),
278
+ };
279
+ const deepAnalysisPerformed = Boolean(sastResult?.evidence?.engines.some(engine => engine.id === 'patterns' && (engine.status === 'completed' || engine.status === 'partial') &&
280
+ (engine.analyzedFiles ?? 0) > 0));
192
281
  // Combine results from all scan sources - SAST, DAST, and cross-language patterns
193
282
  const crossLangSeverityCounts = {
194
283
  critical: crossLangVulns.filter(v => v.severity === 'critical').length,
@@ -224,7 +313,9 @@ export function registerSecurityHandlers(ctx) {
224
313
  description: v.description,
225
314
  }));
226
315
  // Generate recommendations based on findings
227
- const recommendations = generateSecurityRecommendations(allVulns);
316
+ const recommendations = allVulns.length === 0 && evidence.completeness !== 'complete'
317
+ ? ['No findings reported; requested analysis is incomplete or unverified. Inspect execution receipts.']
318
+ : generateSecurityRecommendations(allVulns);
228
319
  return ok({
229
320
  vulnerabilities: allVulns.length,
230
321
  critical: summary.critical,
@@ -233,33 +324,24 @@ export function registerSecurityHandlers(ctx) {
233
324
  low: summary.low,
234
325
  informational: summary.informational,
235
326
  topVulnerabilities,
327
+ findings: allVulns,
236
328
  recommendations,
237
329
  scanTypes: {
238
330
  sast: payload.sast !== false,
239
331
  dast: payload.dast || false,
240
332
  },
241
- filesScanned: filesToScan.length,
242
- jstsFilesScanned: jstsFiles.length,
243
- otherFilesScanned: otherFiles.length,
244
- coverage: sastResult?.coverage,
245
- // #569 (companion note): "zero findings" from a scan that ran no
246
- // language-specific analysis is not evidence of absence, and combined
247
- // with a coverage number it reads as "this code is clean and covered".
248
- // Say plainly which depth of analysis actually ran.
249
- deepAnalysisPerformed: jstsFiles.length > 0,
250
- analysisDepth: jstsFiles.length > 0
251
- ? (otherFiles.length > 0 ? 'full-sast-on-js-ts; pattern-matching-on-other-languages' : 'full-sast')
252
- : 'pattern-matching-only',
253
- ...(jstsFiles.length === 0 ? {
254
- note: otherFiles.length > 0
255
- ? 'NO LANGUAGE-SPECIFIC ANALYSIS RAN. Only cross-language pattern matching ' +
256
- '(secrets, CORS, eval/exec) was applied to these files — full SAST is ' +
257
- 'implemented for JS/TS only. A zero-finding result here means "nothing ' +
258
- 'matched a generic pattern", NOT "no vulnerabilities". Run a ' +
259
- 'language-specific tool (cargo audit / clippy, bandit, gosec, semgrep) ' +
260
- 'for real coverage of this codebase.'
261
- : 'No source files were analyzed.',
262
- } : {}),
333
+ status: evidence.completeness === 'complete' ? 'completed' : evidence.completeness === 'partial' ? 'partial' : 'unavailable',
334
+ evidence,
335
+ limitations: evidence.limitations,
336
+ filesScanned: analyzedPaths.size,
337
+ jstsFilesScanned: jstsFiles.filter(file => analyzedPaths.has(file)).length,
338
+ otherFilesScanned: otherFiles.filter(file => analyzedPaths.has(file)).length,
339
+ ...(sastResult?.evidence ? { coverage: sastResult.coverage } : {}),
340
+ deepAnalysisPerformed,
341
+ analysisDepth: deepAnalysisPerformed
342
+ ? (otherFiles.length > 0 ? 'sast-patterns-on-js-ts; generic-patterns-on-other-languages' : 'sast-patterns')
343
+ : genericAnalyzed > 0 ? 'pattern-matching-only' : 'none',
344
+ ...(!deepAnalysisPerformed ? { note: 'No verified language-specific SAST ran. Generic pattern matches and partial findings do not establish that the target is free of vulnerabilities.' } : {}),
263
345
  });
264
346
  }
265
347
  catch (error) {
@@ -267,4 +349,18 @@ export function registerSecurityHandlers(ctx) {
267
349
  }
268
350
  });
269
351
  }
352
+ function failedEngine(id, scope, error) {
353
+ const reason = id === 'sast' && error instanceof Error && error.message.startsWith('No valid rule sets found:')
354
+ ? 'No valid rule sets configured.' : `${id} execution failed (${safeErrorCode(error)}).`;
355
+ return { id, requested: true, required: true, status: 'failed', scope,
356
+ ruleCoverage: 'unknown', errors: [reason], limitations: [] };
357
+ }
358
+ function safeErrorCode(error) {
359
+ const code = error?.code;
360
+ return typeof code === 'string' && /^[A-Z0-9_]{1,32}$/.test(code) ? code : 'UNKNOWN';
361
+ }
362
+ function unverifiedEngine(id, scope) {
363
+ return { id, requested: true, required: true, status: 'unverified', scope,
364
+ ruleCoverage: 'unknown', errors: [], limitations: [`${id} returned no execution receipt; coverage is unverified.`] };
365
+ }
270
366
  //# sourceMappingURL=security-handlers.js.map
@@ -8,6 +8,8 @@ import { v4 as uuidv4 } from 'uuid';
8
8
  import * as fs from 'fs/promises';
9
9
  import { ok, err } from '../../shared/types/index.js';
10
10
  import { toError } from '../../shared/error-utils.js';
11
+ import { getTestRunnerExecutionError, TestRunnerExecutionError } from '../../shared/test-runner-verdict.js';
12
+ import { createVitestJsonReport } from '../../shared/vitest-json-report.js';
11
13
  function escapeRegExp(s) {
12
14
  return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
13
15
  }
@@ -160,73 +162,65 @@ export function registerTestExecutionHandlers(ctx) {
160
162
  return err(toError(error));
161
163
  }
162
164
  });
165
+ // execute-tests accepts a nonempty list of concrete paths; callers expand globs.
163
166
  // Register test execution handler - runs real tests via child process
164
167
  ctx.registerHandler('execute-tests', async (task) => {
165
168
  const payload = task.payload;
166
169
  try {
167
170
  const testFiles = payload.testFiles || [];
168
171
  if (testFiles.length === 0) {
169
- return ok({
170
- total: 0, passed: 0, failed: 0, skipped: 0,
171
- duration: 0, coverage: 0, failedTests: [],
172
- warning: 'No test files specified. Provide testFiles array with paths to test files.',
173
- });
172
+ return err(new TestRunnerExecutionError('No test files specified. Provide testFiles array with paths to test files.'));
174
173
  }
175
- // Attempt to run tests using common test runners
176
- const cwd = process.cwd();
177
- let output;
178
- // Validate test file paths to prevent command injection
179
- const safePathPattern = /^[a-zA-Z0-9_.\/\-@]+$/;
180
- const safeFiles = testFiles.filter(f => safePathPattern.test(f));
181
- if (safeFiles.length !== testFiles.length) {
182
- return ok({
183
- total: 0, passed: 0, failed: 0, skipped: 0,
184
- duration: 0, coverage: 0, failedTests: [],
185
- warning: 'Some test file paths contain invalid characters and were rejected.',
186
- });
174
+ // Validate test file paths before invoking a runner.
175
+ const safePathPattern = /^[a-zA-Z0-9_./@-]+$/;
176
+ if (testFiles.some(file => !safePathPattern.test(file))) {
177
+ return err(new TestRunnerExecutionError('Some test file paths contain invalid characters and were rejected. Provide concrete paths; expand glob patterns before calling.'));
187
178
  }
179
+ const { spawnSync } = await import('child_process');
180
+ const options = { cwd: process.cwd(), timeout: 120000, encoding: 'utf-8' };
181
+ let runner = 'vitest';
182
+ // Vitest 5 writes the JSON report to a file rather than stdout; an explicit
183
+ // --outputFile gives Vitest 4 and 5 the same contract.
184
+ const report = createVitestJsonReport();
185
+ let execution;
186
+ let output;
188
187
  try {
189
- // Use spawnSync with argument arrays to prevent command injection
190
- const { spawnSync } = await import('child_process');
191
- const vitestResult = spawnSync('npx', ['vitest', 'run', ...safeFiles, '--reporter=json'], {
192
- cwd, timeout: 120000, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],
193
- });
194
- output = vitestResult.stdout || '';
195
- // If vitest failed (not just test failures), try jest
196
- if (!output.includes('{') && vitestResult.status !== 0) {
197
- const jestResult = spawnSync('npx', ['jest', ...safeFiles, '--json'], {
198
- cwd, timeout: 120000, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],
199
- });
200
- output = jestResult.stdout || '';
201
- }
188
+ execution = spawnSync('npx', ['vitest', 'run', ...testFiles, '--reporter=json', ...report.args], options);
189
+ output = report.read(execution.stdout || '');
190
+ }
191
+ finally {
192
+ report.cleanup();
202
193
  }
203
- catch (execError) {
204
- // Test runner may exit non-zero when tests fail — that's expected
205
- output = execError.stdout || '';
194
+ // Preserve the existing Jest fallback when Vitest cannot produce a report.
195
+ if (!output.includes('{') && execution.status !== 0) {
196
+ runner = 'jest';
197
+ execution = spawnSync('npx', ['jest', ...testFiles, '--json'], options);
198
+ output = execution.stdout || '';
199
+ }
200
+ const diagnostics = [execution.error?.message, execution.stderr, output].filter(Boolean).join('\n');
201
+ if (execution.error) {
202
+ return err(new TestRunnerExecutionError(`${runner} could not complete: ${diagnostics.slice(0, 4000)}`));
206
203
  }
207
- // Try to parse JSON output from test runner
208
204
  try {
209
205
  const jsonStart = output.indexOf('{');
210
206
  if (jsonStart >= 0) {
211
207
  const json = JSON.parse(output.slice(jsonStart));
212
- // vitest format
213
208
  if (json.testResults) {
214
209
  const total = json.numTotalTests || 0;
215
210
  const passed = json.numPassedTests || 0;
216
211
  const failed = json.numFailedTests || 0;
217
- return ok({ total, passed, failed, skipped: total - passed - failed, duration: 0, coverage: 0, failedTests: [] });
212
+ const skipped = total - passed - failed;
213
+ const executionError = getTestRunnerExecutionError(runner, testFiles.join(', '), execution.status, { passed, failed, skipped }, diagnostics, json);
214
+ if (executionError)
215
+ return err(executionError);
216
+ return ok({ total, passed, failed, skipped, duration: 0, coverage: 0, failedTests: [] });
218
217
  }
219
218
  }
220
219
  }
221
220
  catch {
222
- // JSON parsing failed — return raw info
221
+ // A malformed report cannot establish that the requested tests completed.
223
222
  }
224
- return ok({
225
- total: testFiles.length, passed: 0, failed: 0, skipped: 0,
226
- duration: 0, coverage: 0, failedTests: [],
227
- warning: 'Could not parse test runner output. Check that vitest or jest is installed.',
228
- rawOutput: output.slice(0, 500),
229
- });
223
+ return err(new TestRunnerExecutionError(`Could not parse ${runner} results (exit code ${execution.status ?? 'unknown'}):\n${diagnostics.slice(0, 4000)}`));
230
224
  }
231
225
  catch (error) {
232
226
  return err(toError(error));
@@ -61,6 +61,8 @@ export interface SecurityAuditResult {
61
61
  readonly overallRiskScore: RiskScore;
62
62
  readonly recommendations: string[];
63
63
  readonly deploymentDecision: DeploymentDecision;
64
+ /** Requested checks without complete execution evidence; findings remain usable. */
65
+ readonly incompleteChecks?: readonly string[];
64
66
  }
65
67
  /**
66
68
  * Triaged vulnerability findings
@@ -219,6 +221,7 @@ export declare class SecurityAuditProtocol {
219
221
  private cleanupAgents;
220
222
  private getAuditOptionsForTrigger;
221
223
  private updatePhase;
224
+ private recordIncompleteCheck;
222
225
  private createEmptyTriagedFindings;
223
226
  private calculateSummary;
224
227
  private calculateRiskValue;