agentic-qe 3.15.12 → 3.15.14

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 (506) hide show
  1. package/.claude/helpers/brain-checkpoint.cjs +124 -5
  2. package/.claude/skills/skills-manifest.json +1 -1
  3. package/CHANGELOG.md +196 -0
  4. package/assets/skills/skills-manifest.json +1 -1
  5. package/dist/cli/bundle.js +6 -6
  6. package/dist/cli/chunks/adapter-23KA2YW7.js +2 -0
  7. package/dist/cli/chunks/{agent-booster-wasm-5VZCKTIJ.js → agent-booster-wasm-2DLAEZK6.js} +2 -2
  8. package/dist/cli/chunks/{agent-handler-K3C6CQCD.js → agent-handler-P3IY7XEE.js} +2 -2
  9. package/dist/cli/chunks/{agent-memory-branch-NVFQ25WS.js → agent-memory-branch-WWKC2H3G.js} +2 -2
  10. package/dist/cli/chunks/aqe-learning-engine-MUICAXW5.js +2 -0
  11. package/dist/cli/chunks/{arena-TSZVDSXS.js → arena-4BMFF6BS.js} +4 -4
  12. package/dist/cli/chunks/{arena-QGWIJADQ.js → arena-EIV5OALF.js} +2 -2
  13. package/dist/cli/chunks/{audit-KIEE2SHJ.js → audit-DNTI453H.js} +3 -3
  14. package/dist/cli/chunks/base-XPWGYDKD.js +2 -0
  15. package/dist/cli/chunks/{better-sqlite3-BNB32NW3.js → better-sqlite3-TQBQGNC6.js} +2 -2
  16. package/dist/cli/chunks/brain-handler-HY57CNAO.js +95 -0
  17. package/dist/cli/chunks/{branch-enumerator-LZ7UXKAY.js → branch-enumerator-THPMZPHQ.js} +2 -2
  18. package/dist/cli/chunks/{browser-VDHAW4RK.js → browser-O6JJOZCK.js} +2 -2
  19. package/dist/cli/chunks/browser-workflow-UMQVBVGK.js +2 -0
  20. package/dist/cli/chunks/{chunk-4PU5GTZW.js → chunk-2HPNGK7A.js} +2 -2
  21. package/dist/cli/chunks/{chunk-MCPXNUDK.js → chunk-2IJO3657.js} +2 -2
  22. package/dist/cli/chunks/{chunk-4Y6OEBJZ.js → chunk-2QLE6NDW.js} +1 -1
  23. package/dist/cli/chunks/{chunk-DZGPUGUG.js → chunk-2UZBLC5H.js} +2 -2
  24. package/dist/cli/chunks/{chunk-5A66EGEW.js → chunk-2W5MQDHM.js} +2 -2
  25. package/dist/cli/chunks/{chunk-JRYWLOBD.js → chunk-3FITMWWJ.js} +2 -2
  26. package/dist/cli/chunks/{chunk-RCOLPF3B.js → chunk-3TF27MG5.js} +2 -2
  27. package/dist/cli/chunks/{chunk-KGA7VAI4.js → chunk-3XACRXBY.js} +2 -2
  28. package/dist/cli/chunks/{chunk-SQVZ3TRU.js → chunk-43XHGWYH.js} +2 -2
  29. package/dist/cli/chunks/{chunk-JR6CUKAI.js → chunk-4RPBODN5.js} +2 -2
  30. package/dist/cli/chunks/{chunk-C3YOVASQ.js → chunk-4T7XV5KQ.js} +1 -1
  31. package/dist/cli/chunks/{chunk-N7O3PF6Y.js → chunk-4WLIOPHX.js} +2 -2
  32. package/dist/cli/chunks/{chunk-PGSJBXTD.js → chunk-52KOPIMI.js} +2 -2
  33. package/dist/cli/chunks/{chunk-4KUOYDY2.js → chunk-56NSE3LJ.js} +2 -2
  34. package/dist/cli/chunks/{chunk-3IU4LDZR.js → chunk-57DRT6UA.js} +2 -2
  35. package/dist/cli/chunks/{chunk-2JYUA27M.js → chunk-57FX3GP6.js} +1 -1
  36. package/dist/cli/chunks/{chunk-7QEUHNKO.js → chunk-5PLBQZ5J.js} +1 -1
  37. package/dist/cli/chunks/{chunk-VF7FTD64.js → chunk-5Y7UFHJD.js} +1 -1
  38. package/dist/cli/chunks/{chunk-7JFDLL2F.js → chunk-5Z4MO2F3.js} +1 -1
  39. package/dist/cli/chunks/chunk-65EE2EST.js +8 -0
  40. package/dist/cli/chunks/{chunk-66PXR3NI.js → chunk-6NIGSY5L.js} +2 -2
  41. package/dist/cli/chunks/chunk-6O63ZTVX.js +3 -0
  42. package/dist/cli/chunks/{chunk-ZYOYR3UR.js → chunk-6OI5SK7M.js} +1 -1
  43. package/dist/cli/chunks/{chunk-5TAEW5OV.js → chunk-6P4Q4RTC.js} +1 -1
  44. package/dist/cli/chunks/{chunk-W5HQIYQU.js → chunk-7724KXM2.js} +3 -3
  45. package/dist/cli/chunks/{chunk-A2JCRXTK.js → chunk-7MISCSL5.js} +2 -2
  46. package/dist/cli/chunks/{chunk-OHVYINGM.js → chunk-7MUO4DEH.js} +3 -3
  47. package/dist/cli/chunks/{chunk-QCPVUNN3.js → chunk-7QUSNBAA.js} +2 -2
  48. package/dist/cli/chunks/{chunk-YUA6ZKKY.js → chunk-7SQTLUEN.js} +2 -2
  49. package/dist/cli/chunks/{chunk-CA5UNWQF.js → chunk-7T6L3LFN.js} +2 -2
  50. package/dist/cli/chunks/{chunk-UREDS662.js → chunk-7TH4PJSU.js} +2 -2
  51. package/dist/cli/chunks/{chunk-TVA5GRIU.js → chunk-7Y3LXH57.js} +2 -2
  52. package/dist/cli/chunks/{chunk-A5Y7DAVQ.js → chunk-A2T56XVL.js} +2 -2
  53. package/dist/cli/chunks/{chunk-ZROAMFX2.js → chunk-AJVLVF7V.js} +2 -2
  54. package/dist/cli/chunks/{chunk-26672ISV.js → chunk-ARRBXCII.js} +2 -2
  55. package/dist/cli/chunks/{chunk-5S4UIDFK.js → chunk-AYLEH2UF.js} +1 -1
  56. package/dist/cli/chunks/{chunk-DRCBRUGN.js → chunk-BBYJBZHG.js} +2 -2
  57. package/dist/cli/chunks/{chunk-BMG2JLSQ.js → chunk-BM3EJLMV.js} +2 -2
  58. package/dist/cli/chunks/{chunk-6QRI3JVE.js → chunk-BNG4J3CE.js} +2 -2
  59. package/dist/cli/chunks/{chunk-EN7GRVEQ.js → chunk-BPDAQB3F.js} +2 -2
  60. package/dist/cli/chunks/{chunk-J7Y7ZBIT.js → chunk-BQJ7CV53.js} +9 -9
  61. package/dist/cli/chunks/{chunk-ADUAJIAU.js → chunk-C3OIBFAA.js} +2 -2
  62. package/dist/cli/chunks/{chunk-4LWMAAWK.js → chunk-CAZM63TP.js} +2 -2
  63. package/dist/cli/chunks/{chunk-UZED4YZ5.js → chunk-CIINJHOX.js} +1 -1
  64. package/dist/cli/chunks/{chunk-C74M4WUI.js → chunk-CPPYZYXC.js} +2 -2
  65. package/dist/cli/chunks/chunk-D3ZZ2NLL.js +62 -0
  66. package/dist/cli/chunks/{chunk-U7ZHDGXG.js → chunk-D5GB5PUU.js} +1 -1
  67. package/dist/cli/chunks/{chunk-HZBXJFGN.js → chunk-DLTB5KCR.js} +2 -2
  68. package/dist/cli/chunks/{chunk-NNBQZR73.js → chunk-DRLSJJIC.js} +2 -2
  69. package/dist/cli/chunks/{chunk-HLGFHHWV.js → chunk-DSQESXL4.js} +2 -2
  70. package/dist/cli/chunks/{chunk-LFBA735S.js → chunk-E2JLAW3U.js} +3 -3
  71. package/dist/cli/chunks/{chunk-PT2NXS43.js → chunk-E3QIQMMN.js} +1 -1
  72. package/dist/cli/chunks/{chunk-35MIUSXQ.js → chunk-E7OR6V3V.js} +2 -2
  73. package/dist/cli/chunks/{chunk-G24SWTAX.js → chunk-E7QTWGPI.js} +413 -413
  74. package/dist/cli/chunks/{chunk-PX5OPXY6.js → chunk-EC65UZ77.js} +1 -1
  75. package/dist/cli/chunks/{chunk-JNXK47OL.js → chunk-EIEEST4T.js} +2 -2
  76. package/dist/cli/chunks/{chunk-2PPSS4JD.js → chunk-FHPNWHY7.js} +2 -2
  77. package/dist/cli/chunks/{chunk-PTBOLBM4.js → chunk-FJOIBZUB.js} +2 -2
  78. package/dist/cli/chunks/{chunk-TXEUVUMO.js → chunk-FTYRPEJS.js} +1 -1
  79. package/dist/cli/chunks/{chunk-ZPVGX4DI.js → chunk-G7HGUQAE.js} +2 -2
  80. package/dist/cli/chunks/{chunk-EF6OERRR.js → chunk-GY4P7KAI.js} +1 -1
  81. package/dist/cli/chunks/{chunk-UUZZXHUF.js → chunk-H3C5FJRH.js} +2 -2
  82. package/dist/cli/chunks/{chunk-L3PV7VXK.js → chunk-H4LYXLAT.js} +1 -1
  83. package/dist/cli/chunks/{chunk-5Z23ZMXZ.js → chunk-HAYKLXCT.js} +63 -61
  84. package/dist/cli/chunks/{chunk-IPA7K556.js → chunk-HEDGFKC5.js} +2 -2
  85. package/dist/cli/chunks/{chunk-BC4T6SCV.js → chunk-HHBF2BZC.js} +4 -4
  86. package/dist/cli/chunks/{chunk-IVTQF55W.js → chunk-HSDWPQQY.js} +3 -3
  87. package/dist/cli/chunks/{chunk-SG2TX72G.js → chunk-HTVGHHX2.js} +2 -2
  88. package/dist/cli/chunks/{chunk-FZJCBSN4.js → chunk-HV43NX4A.js} +2 -2
  89. package/dist/cli/chunks/{chunk-MMEALJ4D.js → chunk-IDBA5GK2.js} +2 -2
  90. package/dist/cli/chunks/{chunk-IA55PFLG.js → chunk-INGXD5IX.js} +2 -2
  91. package/dist/cli/chunks/{chunk-RYHG3I7J.js → chunk-IQRPR4KB.js} +2 -2
  92. package/dist/cli/chunks/{chunk-7OEFBWAG.js → chunk-IRPNEXOU.js} +2 -2
  93. package/dist/cli/chunks/{chunk-P7UFJ6DO.js → chunk-J35JWDJE.js} +1 -1
  94. package/dist/cli/chunks/chunk-J6ASX536.js +2 -0
  95. package/dist/cli/chunks/{chunk-2ASQRBK2.js → chunk-JAOCHPYX.js} +2 -2
  96. package/dist/cli/chunks/{chunk-G3AABG4Q.js → chunk-JB7R77SH.js} +2 -2
  97. package/dist/cli/chunks/{chunk-HSA5IGGW.js → chunk-JI67T6Q2.js} +2 -2
  98. package/dist/cli/chunks/{chunk-ZGROHCOW.js → chunk-JJHLGGPP.js} +1 -1
  99. package/dist/cli/chunks/{chunk-L7NGKANW.js → chunk-JK6PMLQQ.js} +2 -2
  100. package/dist/cli/chunks/{chunk-IL7GQNNE.js → chunk-JO26SG47.js} +2 -2
  101. package/dist/cli/chunks/{chunk-3EWQN37E.js → chunk-JSSU4RIK.js} +2 -2
  102. package/dist/cli/chunks/{chunk-TOWOJGEI.js → chunk-K2SMP4OD.js} +1 -1
  103. package/dist/cli/chunks/{chunk-YVJEUX3I.js → chunk-K7GFYFBO.js} +2 -2
  104. package/dist/cli/chunks/{chunk-DAUEK66C.js → chunk-K7RT6ITZ.js} +1 -1
  105. package/dist/cli/chunks/{chunk-33I2ZP6E.js → chunk-KJ5A54ZH.js} +2 -2
  106. package/dist/cli/chunks/{chunk-W4II6SIH.js → chunk-L5VSLPMW.js} +2 -2
  107. package/dist/cli/chunks/{chunk-NVRYELCY.js → chunk-L752CNG3.js} +3 -3
  108. package/dist/cli/chunks/{chunk-MAJXZYGK.js → chunk-L7PC675Y.js} +1 -1
  109. package/dist/cli/chunks/{chunk-YWWMNTBF.js → chunk-LTGQJYYO.js} +2 -2
  110. package/dist/cli/chunks/{chunk-7DNR4KKR.js → chunk-M2TG7VDK.js} +1 -1
  111. package/dist/cli/chunks/{chunk-2E2QO44T.js → chunk-M5JEA6ZY.js} +2 -2
  112. package/dist/cli/chunks/{chunk-IETBWYHW.js → chunk-MB4UKUBV.js} +2 -2
  113. package/dist/cli/chunks/{chunk-W7H55PY4.js → chunk-MKYOE7NE.js} +1 -1
  114. package/dist/cli/chunks/{chunk-FNUFTWEO.js → chunk-MQXWG55U.js} +3 -3
  115. package/dist/cli/chunks/{chunk-O4QJMANM.js → chunk-MR2OPUSA.js} +1 -1
  116. package/dist/cli/chunks/{chunk-KA5SHLMW.js → chunk-N736GLWZ.js} +2 -2
  117. package/dist/cli/chunks/{chunk-NV74SICL.js → chunk-NHEG2DLN.js} +2 -2
  118. package/dist/cli/chunks/chunk-NKOLILT7.js +86 -0
  119. package/dist/cli/chunks/{chunk-KJDI5CHX.js → chunk-NPCXGX7N.js} +2 -2
  120. package/dist/cli/chunks/{chunk-2IVE5AR3.js → chunk-NZQYJCO6.js} +1 -1
  121. package/dist/cli/chunks/{chunk-4SA7M34P.js → chunk-O2AAYJUV.js} +1 -1
  122. package/dist/cli/chunks/{chunk-ULCW6IVQ.js → chunk-O32BFQV4.js} +2 -2
  123. package/dist/cli/chunks/{chunk-JOWUS2X5.js → chunk-O3ERGUXH.js} +1 -1
  124. package/dist/cli/chunks/{chunk-BYRCB5JT.js → chunk-O5CEL447.js} +2 -2
  125. package/dist/cli/chunks/{chunk-CPIBIR3X.js → chunk-O756AOUX.js} +2 -2
  126. package/dist/cli/chunks/{chunk-TSOQ2QLT.js → chunk-OCN53CCK.js} +2 -2
  127. package/dist/cli/chunks/{chunk-YLKIXEPP.js → chunk-OGEIHS76.js} +1 -1
  128. package/dist/cli/chunks/{chunk-ICKUINKD.js → chunk-OLUOVNUF.js} +2 -2
  129. package/dist/cli/chunks/{chunk-5ADXFUMO.js → chunk-P2TPH3TC.js} +2 -2
  130. package/dist/cli/chunks/{chunk-SBHM5X2S.js → chunk-PCQZIAXB.js} +2 -2
  131. package/dist/cli/chunks/{chunk-CDA5Z74H.js → chunk-PGN4TARY.js} +2 -2
  132. package/dist/cli/chunks/{chunk-P5E26N2X.js → chunk-PNRPVQGI.js} +2 -2
  133. package/dist/cli/chunks/{chunk-23PQF7NN.js → chunk-PWQWKYBG.js} +1 -1
  134. package/dist/cli/chunks/{chunk-T4EN5VVK.js → chunk-QNQE3EOH.js} +2 -2
  135. package/dist/cli/chunks/chunk-QP2HLKTS.js +2 -0
  136. package/dist/cli/chunks/{chunk-7TA5MUPW.js → chunk-QP6GL3O5.js} +1 -1
  137. package/dist/cli/chunks/{chunk-GKFV6CUD.js → chunk-QUZ745UQ.js} +2 -2
  138. package/dist/cli/chunks/{chunk-INZARYUD.js → chunk-R5RRWLRI.js} +2 -2
  139. package/dist/cli/chunks/{chunk-VZBC6DP7.js → chunk-RE6JTSDM.js} +1 -1
  140. package/dist/cli/chunks/{chunk-JGIJPDGD.js → chunk-TOJF3ZG4.js} +2 -2
  141. package/dist/cli/chunks/{chunk-WLRU6ESI.js → chunk-TSP6SU5V.js} +2 -2
  142. package/dist/cli/chunks/{chunk-6E6HB4N4.js → chunk-TW6Z6W4X.js} +4 -4
  143. package/dist/cli/chunks/{chunk-ENGL7FIJ.js → chunk-TWOV3I3A.js} +1 -1
  144. package/dist/cli/chunks/chunk-U4TML2VD.js +3 -0
  145. package/dist/cli/chunks/{chunk-O3IM4WRZ.js → chunk-U6IOQKCT.js} +2 -2
  146. package/dist/cli/chunks/{chunk-SPC4RBLF.js → chunk-UDSB3XCG.js} +2 -2
  147. package/dist/cli/chunks/{chunk-URSTP3WI.js → chunk-UFP7SN5V.js} +2 -2
  148. package/dist/cli/chunks/{chunk-MYF5CNGV.js → chunk-UMHFTQTR.js} +2 -2
  149. package/dist/cli/chunks/{chunk-65TH6RPD.js → chunk-UNYTHZDZ.js} +1 -1
  150. package/dist/cli/chunks/{chunk-FAGKBOX2.js → chunk-UPWLMIDY.js} +2 -2
  151. package/dist/cli/chunks/{chunk-4CB3QPZM.js → chunk-USAKCGHC.js} +2 -2
  152. package/dist/cli/chunks/{chunk-QUJJYTJH.js → chunk-V3MGY76S.js} +2 -2
  153. package/dist/cli/chunks/{chunk-WDEXOLK2.js → chunk-V6SE2ZU2.js} +1 -1
  154. package/dist/cli/chunks/{chunk-JW5PDJ5O.js → chunk-VCVRZD4Y.js} +3 -3
  155. package/dist/cli/chunks/{chunk-TGMXUZZC.js → chunk-VG32EEUG.js} +2 -2
  156. package/dist/cli/chunks/{chunk-MYUMJ2ZI.js → chunk-VGZOPQQY.js} +1 -1
  157. package/dist/cli/chunks/{chunk-BOSMELJX.js → chunk-VJBJRFUO.js} +2 -2
  158. package/dist/cli/chunks/{chunk-K3A3NWT3.js → chunk-WBC6WB32.js} +2 -2
  159. package/dist/cli/chunks/{chunk-QWG3SILX.js → chunk-WCM6WE7G.js} +5 -5
  160. package/dist/cli/chunks/{chunk-GJKZ7UQO.js → chunk-WCPSR4MJ.js} +2 -2
  161. package/dist/cli/chunks/{chunk-U6IXYQO4.js → chunk-WKI46WWN.js} +2 -2
  162. package/dist/cli/chunks/{chunk-NX4BCSOZ.js → chunk-WM2QRIRD.js} +2 -2
  163. package/dist/cli/chunks/{chunk-32UTHIY5.js → chunk-WRC3HLUY.js} +3 -3
  164. package/dist/cli/chunks/{chunk-AJEXPFAB.js → chunk-WUGXXNK4.js} +1 -1
  165. package/dist/cli/chunks/{chunk-NA3F6FEO.js → chunk-WZQADC5R.js} +2 -2
  166. package/dist/cli/chunks/{chunk-SDRJJUPO.js → chunk-X6NJOT3V.js} +1 -1
  167. package/dist/cli/chunks/{chunk-CU36D7TN.js → chunk-X6Q2N5S5.js} +2 -2
  168. package/dist/cli/chunks/{chunk-UIKQPO4Y.js → chunk-X7CUI7KH.js} +2 -2
  169. package/dist/cli/chunks/{chunk-MCPEC6OO.js → chunk-XMCSKYDE.js} +1 -1
  170. package/dist/cli/chunks/{chunk-WTAUF6O4.js → chunk-XN3KCKAM.js} +2 -2
  171. package/dist/cli/chunks/{chunk-TLRHAMX5.js → chunk-XSPMLJCQ.js} +1 -1
  172. package/dist/cli/chunks/{chunk-VUR5THML.js → chunk-XTZGAG6P.js} +2 -2
  173. package/dist/cli/chunks/{chunk-47RMGDG4.js → chunk-YE54T2NQ.js} +2 -2
  174. package/dist/cli/chunks/{chunk-HM3LSFTY.js → chunk-YEFTK4HD.js} +2 -2
  175. package/dist/cli/chunks/{chunk-4HWUECVD.js → chunk-YGC5QKQ4.js} +2 -2
  176. package/dist/cli/chunks/{chunk-SUX5XB2Z.js → chunk-YGOSSVY5.js} +2 -2
  177. package/dist/cli/chunks/{chunk-UJNGGFGX.js → chunk-YKQWIXUY.js} +2 -2
  178. package/dist/cli/chunks/{chunk-SITL5YZV.js → chunk-Z2S7DNFP.js} +2 -2
  179. package/dist/cli/chunks/{chunk-WGTEZT7G.js → chunk-Z54G2YOL.js} +2 -2
  180. package/dist/cli/chunks/{chunk-YNVEDFPQ.js → chunk-ZJGFQK27.js} +1 -1
  181. package/dist/cli/chunks/{chunk-35NW676P.js → chunk-ZUE524JL.js} +2 -2
  182. package/dist/cli/chunks/{ci-BZNWW3I3.js → ci-UMA2SMNW.js} +2 -2
  183. package/dist/cli/chunks/{ci-config-LOHNXOKV.js → ci-config-UQSILJFQ.js} +2 -2
  184. package/dist/cli/chunks/{ci-output-LCOQBSJL.js → ci-output-U6YZLLKH.js} +2 -2
  185. package/dist/cli/chunks/{circuit-breaker-7LRXTLFE.js → circuit-breaker-ATYQP6X2.js} +2 -2
  186. package/dist/cli/chunks/{claude-flow-setup-HBU4VWC3.js → claude-flow-setup-6YHFD7AN.js} +2 -2
  187. package/dist/cli/chunks/client-E43GWLQH.js +2 -0
  188. package/dist/cli/chunks/{cline-installer-CO6MLH6X.js → cline-installer-EPE7IOZE.js} +2 -2
  189. package/dist/cli/chunks/{code-SIXBS6JM.js → code-NUEJ4XYO.js} +19 -18
  190. package/dist/cli/chunks/{code-index-extractor-GWJKZ2IQ.js → code-index-extractor-D4DBT6OL.js} +2 -2
  191. package/dist/cli/chunks/{codex-installer-6NINVWXJ.js → codex-installer-633SM4LR.js} +2 -2
  192. package/dist/cli/chunks/{completions-7VIX3GML.js → completions-WUKVIW3L.js} +2 -2
  193. package/dist/cli/chunks/{complexity-analyzer-FBQR6ZP2.js → complexity-analyzer-F73ACR5H.js} +2 -2
  194. package/dist/cli/chunks/{continuedev-installer-VA7RIXW5.js → continuedev-installer-QH42TKMS.js} +2 -2
  195. package/dist/cli/chunks/{copilot-installer-4QEBC4MU.js → copilot-installer-Y3XC7BTT.js} +2 -2
  196. package/dist/cli/chunks/core-handlers-R5A3SQDY.js +2 -0
  197. package/dist/cli/chunks/{cost-tracker-GRYKHPWL.js → cost-tracker-57QPV7E3.js} +2 -2
  198. package/dist/cli/chunks/coverage-IBCHMBCR.js +51 -0
  199. package/dist/cli/chunks/cross-domain-router-LLYVPZF6.js +2 -0
  200. package/dist/cli/chunks/{cursor-installer-ZXIPSZVH.js → cursor-installer-F4UYQHIN.js} +2 -2
  201. package/dist/cli/chunks/{daemon-N2VRHPSJ.js → daemon-BYYPIJ7G.js} +4 -4
  202. package/dist/cli/chunks/{daemon-D7F3RGI5.js → daemon-XR4Q6YZF.js} +3 -3
  203. package/dist/cli/chunks/{dag-attention-scheduler-NL6BA7BY.js → dag-attention-scheduler-ZR5ZD3TW.js} +2 -2
  204. package/dist/cli/chunks/{detect-XC2HCIIT.js → detect-GEGYURLL.js} +2 -2
  205. package/dist/cli/chunks/{dist-node-A3Y26MEI.js → dist-node-JU3KT2JO.js} +2 -2
  206. package/dist/cli/chunks/{domain-handler-WV6SFXRB.js → domain-handler-7QI3FJGE.js} +2 -2
  207. package/dist/cli/chunks/{domain-plugins-KJIF6Z2B.js → domain-plugins-O2YRM2PD.js} +2 -2
  208. package/dist/cli/chunks/domain-transfer-7J3S2OS6.js +2 -0
  209. package/dist/cli/chunks/dream-6C4NURSE.js +2 -0
  210. package/dist/cli/chunks/{embed-and-insert-pattern-PA3Y4KGO.js → embed-and-insert-pattern-URES5Q6J.js} +2 -2
  211. package/dist/cli/chunks/{eval-YGEZNUVE.js → eval-RVMCIUOR.js} +2 -2
  212. package/dist/cli/chunks/{experience-capture-middleware-D4T7NW6B.js → experience-capture-middleware-SYJQSBKE.js} +3 -3
  213. package/dist/cli/chunks/{fast-paths-6JYK7RYQ.js → fast-paths-QUKPKWKZ.js} +2 -2
  214. package/dist/cli/chunks/{feature-flags-DKXMDVPE.js → feature-flags-5JCSKL2P.js} +2 -2
  215. package/dist/cli/chunks/{feature-flags-RBH2GDSR.js → feature-flags-K7JXNKJI.js} +2 -2
  216. package/dist/cli/chunks/file-discovery-J5IE5KP7.js +2 -0
  217. package/dist/cli/chunks/fleet-II4Q6HXK.js +44 -0
  218. package/dist/cli/chunks/{gnn-wrapper-MV54UC4C.js → gnn-wrapper-M7VO2EMS.js} +2 -2
  219. package/dist/cli/chunks/{heartbeat-handler-7DKMVQQH.js → heartbeat-handler-ND5CY26N.js} +4 -4
  220. package/dist/cli/chunks/heartbeat-scheduler-FC5PBTMN.js +2 -0
  221. package/dist/cli/chunks/hnsw-adapter-47UIVOBG.js +2 -0
  222. package/dist/cli/chunks/hnsw-index-3AKVLOZQ.js +2 -0
  223. package/dist/cli/chunks/{hnsw-legacy-bridge-6IWREDQC.js → hnsw-legacy-bridge-N3AUUUU7.js} +2 -2
  224. package/dist/cli/chunks/{hnswlib-node-5BIESSCK.js → hnswlib-node-NZY3E5EN.js} +2 -2
  225. package/dist/cli/chunks/{hooks-3EETRM62.js → hooks-QVJDTII5.js} +10 -10
  226. package/dist/cli/chunks/hybrid-backend-YAOSNX47.js +2 -0
  227. package/dist/cli/chunks/{hypergraph-engine-RSWCB2D3.js → hypergraph-engine-ZRY6MTDV.js} +2 -2
  228. package/dist/cli/chunks/{hypergraph-handler-552LXKL3.js → hypergraph-handler-56DO4XZQ.js} +3 -3
  229. package/dist/cli/chunks/impact-analyzer-4FMJXM4M.js +2 -0
  230. package/dist/cli/chunks/{init-guard-OTDBJ5HD.js → init-guard-DTF4EVUY.js} +2 -2
  231. package/dist/cli/chunks/{init-handler-3FK3TKEA.js → init-handler-M6CNQHMX.js} +6 -6
  232. package/dist/cli/chunks/init-wizard-RTLCRWDT.js +2 -0
  233. package/dist/cli/chunks/kernel-2OWIGGGT.js +2 -0
  234. package/dist/cli/chunks/{kilocode-installer-KZ2O4LF3.js → kilocode-installer-IJN7XKBH.js} +2 -2
  235. package/dist/cli/chunks/{kiro-installer-MLCCXRF7.js → kiro-installer-UKKPGPDC.js} +2 -2
  236. package/dist/cli/chunks/knowledge-graph-25XXKDJN.js +2 -0
  237. package/dist/cli/chunks/learning-W2HETWQ4.js +131 -0
  238. package/dist/cli/chunks/{llm-router-PDEV3UP2.js → llm-router-Y546K4VX.js} +4 -4
  239. package/dist/cli/chunks/llm-router-service-G3EIN4UB.js +2 -0
  240. package/dist/cli/chunks/{load-XFVVLO7E.js → load-MKAB2AXE.js} +2 -2
  241. package/dist/cli/chunks/load-test-D6QYNIVT.js +2 -0
  242. package/dist/cli/chunks/{mcp-74G3CL2S.js → mcp-AZKUS6K3.js} +2 -2
  243. package/dist/cli/chunks/{memory-XIFM6JNX.js → memory-ZDOQN2KU.js} +5 -5
  244. package/dist/cli/chunks/memory-backend-LDFFZMEQ.js +2 -0
  245. package/dist/cli/chunks/{memory-handlers-ZCKURV6S.js → memory-handlers-3SQVY7FE.js} +2 -2
  246. package/dist/cli/chunks/{multi-model-executor-7L4W3O2Q.js → multi-model-executor-WWVXDHG4.js} +2 -2
  247. package/dist/cli/chunks/{opencode-installer-BPG422LF.js → opencode-installer-YUJNXXWS.js} +2 -2
  248. package/dist/cli/chunks/{orchestrator-OEAFLAEV.js → orchestrator-Z6PWPLRE.js} +109 -25
  249. package/dist/cli/chunks/pattern-null-store-KDVRM7PW.js +2 -0
  250. package/dist/cli/chunks/{pattern-usage-recorder-LOPNCULT.js → pattern-usage-recorder-TPWPX32U.js} +2 -2
  251. package/dist/cli/chunks/{pipeline-VWTYUZB7.js → pipeline-4BBGTE4M.js} +2 -2
  252. package/dist/cli/chunks/{platform-WFJJ3X2E.js → platform-5GSHXCV5.js} +2 -2
  253. package/dist/cli/chunks/{plugin-744TPUSG.js → plugin-OFDVF5HS.js} +2 -2
  254. package/dist/cli/chunks/{prime-radiant-advanced-wasm-BD5BLNDR.js → prime-radiant-advanced-wasm-NC6MUYGJ.js} +2 -2
  255. package/dist/cli/chunks/project-root-DDGBWDP6.js +2 -0
  256. package/dist/cli/chunks/protocol-executor-KBOLLCWA.js +2 -0
  257. package/dist/cli/chunks/{protocol-handler-JIBILI74.js → protocol-handler-MPOAAEPA.js} +2 -2
  258. package/dist/cli/chunks/{prove-MNOL5FYW.js → prove-CDKMAIVM.js} +2 -2
  259. package/dist/cli/chunks/qe-reasoning-bank-GRXBT7FC.js +2 -0
  260. package/dist/cli/chunks/{quality-JEGBDGGX.js → quality-ZH4F7R7R.js} +2 -2
  261. package/dist/cli/chunks/{quality-gate-SYJ6ROMI.js → quality-gate-IDRMW6OE.js} +3 -3
  262. package/dist/cli/chunks/queen-coordinator-L2QWMJ5Q.js +2 -0
  263. package/dist/cli/chunks/{real-embeddings-ZWXS5ZFV.js → real-embeddings-I2UVNNB3.js} +2 -2
  264. package/dist/cli/chunks/{ref-validation-RRHUFW2N.js → ref-validation-Z5GCGVXK.js} +2 -2
  265. package/dist/cli/chunks/{roocode-installer-XFO6JSVN.js → roocode-installer-IZ2S7PH2.js} +2 -2
  266. package/dist/cli/chunks/router-FT5WJPUH.js +2 -0
  267. package/dist/cli/chunks/routing-feedback-EO2MKOUX.js +2 -0
  268. package/dist/cli/chunks/{routing-handler-L2K3JASE.js → routing-handler-NAX35VUW.js} +2 -2
  269. package/dist/cli/chunks/{ruvector-commands-A6CINHGM.js → ruvector-commands-5YW2SOFF.js} +2 -2
  270. package/dist/cli/chunks/rvf-dual-writer-WHBFQJVU.js +2 -0
  271. package/dist/cli/chunks/rvf-migration-adapter-YT3APF2I.js +2 -0
  272. package/dist/cli/chunks/{rvf-migration-coordinator-T4RY7L53.js → rvf-migration-coordinator-VUIZHTVG.js} +2 -2
  273. package/dist/cli/chunks/rvf-native-adapter-37PUFKQD.js +2 -0
  274. package/dist/cli/chunks/{rvf-store-integrity-IR33TGQS.js → rvf-store-integrity-IPGCAT6C.js} +2 -2
  275. package/dist/cli/chunks/safe-db-TDZKUOZJ.js +2 -0
  276. package/dist/cli/chunks/schedule-CRKTRY2A.js +2 -0
  277. package/dist/cli/chunks/scheduler-6ZBDVQWN.js +2 -0
  278. package/dist/cli/chunks/{security-Z5GDE2IH.js → security-3IH4BO5Z.js} +3 -3
  279. package/dist/cli/chunks/{shared-rvf-adapter-SIZMEHPM.js → shared-rvf-adapter-ABY7PAY2.js} +2 -2
  280. package/dist/cli/chunks/{shared-rvf-dual-writer-HLM65RDS.js → shared-rvf-dual-writer-6KENLN2W.js} +2 -2
  281. package/dist/cli/chunks/sqlite-persistence-FFJQAIKW.js +2 -0
  282. package/dist/cli/chunks/{standalone-memory-SKSZG7P5.js → standalone-memory-RLFAUGOW.js} +2 -2
  283. package/dist/cli/chunks/{status-handler-766YOOMJ.js → status-handler-FCOZBPE5.js} +2 -2
  284. package/dist/cli/chunks/{structural-health-M45FNOLT.js → structural-health-4RDA5UUM.js} +2 -2
  285. package/dist/cli/chunks/{sync-B2U366I3.js → sync-54LUAUTK.js} +2 -2
  286. package/dist/cli/chunks/{sync-6CJ24B5T.js → sync-KGEEXXCC.js} +2 -2
  287. package/dist/cli/chunks/task-handler-K3OXHYKU.js +62 -0
  288. package/dist/cli/chunks/task-handlers-6H7L2UT4.js +9 -0
  289. package/dist/cli/chunks/{test-TODH7KRF.js → test-S7IG6EIX.js} +4 -4
  290. package/dist/cli/chunks/test-runner-process-OTQDAJLN.js +2 -0
  291. package/dist/cli/chunks/{test-scheduling-VMVMVRHT.js → test-scheduling-7XYXI4L2.js} +3 -3
  292. package/dist/cli/chunks/{token-bootstrap-XQW7BMCK.js → token-bootstrap-3QMABE45.js} +2 -2
  293. package/dist/cli/chunks/{token-usage-JCZEIRKO.js → token-usage-Y2YTPOFE.js} +2 -2
  294. package/dist/cli/chunks/{transformers-U2ML3OHE.js → transformers-UCJ3HHHC.js} +2 -2
  295. package/dist/cli/chunks/tree-sitter-wasm-parser-D6JTTHTP.js +2 -0
  296. package/dist/cli/chunks/{types-GGEPCHP6.js → types-6CMFPETH.js} +2 -2
  297. package/dist/cli/chunks/unified-memory-QARWQKJ2.js +2 -0
  298. package/dist/cli/chunks/unified-memory-hnsw-LHY3DXCP.js +2 -0
  299. package/dist/cli/chunks/unified-persistence-WEYYGLHM.js +2 -0
  300. package/dist/cli/chunks/{upgrade-T5GRM7HS.js → upgrade-K25DN6WU.js} +2 -2
  301. package/dist/cli/chunks/{validate-XMUJPLP3.js → validate-T4V3TBY3.js} +2 -2
  302. package/dist/cli/chunks/{validate-swarm-KJLF7JEH.js → validate-swarm-XSRC576T.js} +2 -2
  303. package/dist/cli/chunks/visual-security-O4ALMCXQ.js +2 -0
  304. package/dist/cli/chunks/{web-tree-sitter-LOHVZ7G5.js → web-tree-sitter-YOZXHRTN.js} +2 -2
  305. package/dist/cli/chunks/{windsurf-installer-33FBTXJU.js → windsurf-installer-ITPU2IYL.js} +2 -2
  306. package/dist/cli/chunks/witness-chain-B3YW5NMS.js +2 -0
  307. package/dist/cli/chunks/witness-chain-PIYR72HJ.js +2 -0
  308. package/dist/cli/chunks/{witness-chain-repair-VWBO4NXE.js → witness-chain-repair-YUG7E3UX.js} +2 -2
  309. package/dist/cli/chunks/{witness-chain-verifier-BHJ3ZAEK.js → witness-chain-verifier-DTDSVKOG.js} +2 -2
  310. package/dist/cli/chunks/{witness-key-manager-WNVPH2Z3.js → witness-key-manager-EWACWGAW.js} +2 -2
  311. package/dist/cli/chunks/{workflow-6QR5MQTO.js → workflow-ZIQ4FV42.js} +4 -4
  312. package/dist/cli/chunks/workflow-orchestrator-3ZN2BCGY.js +2 -0
  313. package/dist/cli/chunks/{wrappers-EHOL62TS.js → wrappers-PW2O27LL.js} +2 -2
  314. package/dist/cli/commands/code.js +6 -0
  315. package/dist/cli/commands/coverage.js +6 -0
  316. package/dist/cli/commands/fleet-run.d.ts +12 -0
  317. package/dist/cli/commands/fleet-run.js +175 -0
  318. package/dist/cli/commands/fleet.js +2 -117
  319. package/dist/cli/commands/learning-prune.d.ts +14 -0
  320. package/dist/cli/commands/learning-prune.js +105 -0
  321. package/dist/cli/commands/learning.js +9 -0
  322. package/dist/cli/handlers/brain-handler.js +12 -1
  323. package/dist/cli/handlers/task-handler.d.ts +5 -0
  324. package/dist/cli/handlers/task-handler.js +20 -0
  325. package/dist/cli/utils/coverage-verdict.js +14 -3
  326. package/dist/cli/utils/fleet-operation.d.ts +5 -2
  327. package/dist/cli/utils/fleet-operation.js +13 -2
  328. package/dist/cli/utils/fleet-result.d.ts +16 -2
  329. package/dist/cli/utils/fleet-result.js +26 -21
  330. package/dist/cli/utils/fleet-shard.d.ts +36 -0
  331. package/dist/cli/utils/fleet-shard.js +110 -0
  332. package/dist/context/compaction/index.d.ts +7 -0
  333. package/dist/context/compaction/index.js +30 -6
  334. package/dist/coordination/handlers/code-intelligence-handlers.js +21 -1
  335. package/dist/coordination/handlers/coverage-evidence.d.ts +19 -0
  336. package/dist/coordination/handlers/coverage-evidence.js +31 -2
  337. package/dist/coordination/handlers/coverage-handlers.js +5 -1
  338. package/dist/coordination/handlers/coverage-target.js +8 -1
  339. package/dist/coordination/handlers/handler-types.d.ts +2 -2
  340. package/dist/coordination/handlers/handler-utils.d.ts +6 -0
  341. package/dist/coordination/handlers/handler-utils.js +14 -4
  342. package/dist/coordination/handlers/misc-handlers.js +5 -2
  343. package/dist/coordination/handlers/quality-handlers.js +11 -3
  344. package/dist/coordination/handlers/security-handlers.js +12 -2
  345. package/dist/coordination/protocols/security-audit.js +11 -1
  346. package/dist/coordination/result-saver-adapters.js +1 -0
  347. package/dist/coordination/result-saver.js +9 -5
  348. package/dist/coordination/task-executor.js +7 -2
  349. package/dist/domains/chaos-resilience/services/chaos-engineer.d.ts +1 -0
  350. package/dist/domains/chaos-resilience/services/chaos-engineer.js +23 -45
  351. package/dist/domains/code-intelligence/coordinator-gnn.d.ts +2 -16
  352. package/dist/domains/code-intelligence/coordinator-gnn.js +1 -62
  353. package/dist/domains/code-intelligence/coordinator.d.ts +12 -6
  354. package/dist/domains/code-intelligence/coordinator.js +24 -27
  355. package/dist/domains/code-intelligence/interfaces.d.ts +9 -0
  356. package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +43 -5
  357. package/dist/domains/code-intelligence/services/semantic-analyzer.js +134 -71
  358. package/dist/domains/coverage-analysis/collected-metrics.d.ts +26 -0
  359. package/dist/domains/coverage-analysis/collected-metrics.js +54 -0
  360. package/dist/domains/coverage-analysis/services/coverage-analyzer.js +13 -3
  361. package/dist/domains/coverage-analysis/services/coverage-parser.d.ts +2 -0
  362. package/dist/domains/coverage-analysis/services/coverage-parser.js +18 -2
  363. package/dist/domains/defect-intelligence/services/defect-predictor.js +3 -6
  364. package/dist/domains/quality-assessment/coherence/gate-controller.js +16 -4
  365. package/dist/domains/quality-assessment/coherence/lambda-calculator.d.ts +8 -0
  366. package/dist/domains/quality-assessment/coherence/lambda-calculator.js +57 -14
  367. package/dist/domains/quality-assessment/coherence/types.d.ts +12 -7
  368. package/dist/domains/quality-assessment/coordinator-gate-evaluation.js +3 -1
  369. package/dist/domains/quality-assessment/coordinator-reports.d.ts +30 -10
  370. package/dist/domains/quality-assessment/coordinator-reports.js +93 -57
  371. package/dist/domains/quality-assessment/coordinator.d.ts +14 -40
  372. package/dist/domains/quality-assessment/coordinator.js +10 -4
  373. package/dist/domains/quality-assessment/coverage-report-event.d.ts +8 -0
  374. package/dist/domains/quality-assessment/coverage-report-event.js +22 -1
  375. package/dist/domains/quality-assessment/interfaces.d.ts +8 -0
  376. package/dist/domains/quality-assessment/services/coherence-gate.js +15 -2
  377. package/dist/domains/quality-assessment/services/quality-analyzer.d.ts +4 -0
  378. package/dist/domains/quality-assessment/services/quality-analyzer.js +63 -17
  379. package/dist/domains/quality-assessment/services/quality-gate.js +6 -4
  380. package/dist/domains/security-compliance/index.d.ts +1 -1
  381. package/dist/domains/security-compliance/interfaces.d.ts +46 -5
  382. package/dist/domains/security-compliance/services/scanners/dast-auth-testing.d.ts +3 -3
  383. package/dist/domains/security-compliance/services/scanners/dast-auth-testing.js +15 -14
  384. package/dist/domains/security-compliance/services/scanners/dast-helpers.d.ts +8 -9
  385. package/dist/domains/security-compliance/services/scanners/dast-helpers.js +19 -44
  386. package/dist/domains/security-compliance/services/scanners/dast-injection-testing.d.ts +3 -3
  387. package/dist/domains/security-compliance/services/scanners/dast-injection-testing.js +13 -9
  388. package/dist/domains/security-compliance/services/scanners/dast-requests.d.ts +54 -0
  389. package/dist/domains/security-compliance/services/scanners/dast-requests.js +125 -0
  390. package/dist/domains/security-compliance/services/scanners/dast-scanner.d.ts +5 -1
  391. package/dist/domains/security-compliance/services/scanners/dast-scanner.js +125 -155
  392. package/dist/domains/security-compliance/services/scanners/index.d.ts +1 -1
  393. package/dist/domains/security-compliance/services/scanners/index.js +1 -1
  394. package/dist/domains/security-compliance/services/scanners/scanner-types.d.ts +2 -2
  395. package/dist/domains/security-compliance/services/security-auditor-dast.js +183 -212
  396. package/dist/domains/security-compliance/services/security-auditor-reports.js +5 -1
  397. package/dist/domains/security-compliance/services/security-auditor.d.ts +11 -3
  398. package/dist/domains/security-compliance/services/security-auditor.js +106 -65
  399. package/dist/domains/test-execution/coordinator.d.ts +2 -1
  400. package/dist/domains/test-execution/coordinator.js +33 -27
  401. package/dist/domains/test-execution/interfaces.d.ts +10 -0
  402. package/dist/domains/test-execution/services/test-executor.d.ts +6 -0
  403. package/dist/domains/test-execution/services/test-executor.js +22 -4
  404. package/dist/domains/visual-accessibility/coordinator.js +34 -9
  405. package/dist/domains/visual-accessibility/interfaces.d.ts +27 -0
  406. package/dist/domains/visual-accessibility/plugin.js +5 -0
  407. package/dist/domains/visual-accessibility/services/accessibility-tester-heuristics.d.ts +13 -21
  408. package/dist/domains/visual-accessibility/services/accessibility-tester-heuristics.js +13 -297
  409. package/dist/domains/visual-accessibility/services/accessibility-tester.d.ts +13 -5
  410. package/dist/domains/visual-accessibility/services/accessibility-tester.js +96 -73
  411. package/dist/init/phases/07-hooks.js +90 -6
  412. package/dist/integrations/embeddings/index/HNSWIndex.js +8 -4
  413. package/dist/integrations/ruvector/brain-rvf-exporter.d.ts +25 -0
  414. package/dist/integrations/ruvector/brain-rvf-exporter.js +154 -61
  415. package/dist/integrations/ruvector/transfer-coherence-stub.js +5 -10
  416. package/dist/learning/dream/dream-engine.d.ts +24 -1
  417. package/dist/learning/dream/dream-engine.js +57 -6
  418. package/dist/learning/learning-retention.d.ts +103 -0
  419. package/dist/learning/learning-retention.js +213 -0
  420. package/dist/mcp/bundle.js +508 -503
  421. package/dist/mcp/handlers/domain-handler-configs.d.ts +17 -1
  422. package/dist/mcp/handlers/domain-handler-configs.js +33 -16
  423. package/dist/mcp/handlers/handler-factory.js +3 -0
  424. package/dist/mcp/handlers/model-route-handlers.d.ts +107 -0
  425. package/dist/mcp/handlers/model-route-handlers.js +139 -0
  426. package/dist/mcp/handlers/orchestrate-routes.js +41 -3
  427. package/dist/mcp/handlers/task-handlers.d.ts +3 -251
  428. package/dist/mcp/handlers/task-handlers.js +6 -828
  429. package/dist/mcp/handlers/task-inference.d.ts +26 -0
  430. package/dist/mcp/handlers/task-inference.js +156 -0
  431. package/dist/mcp/handlers/task-learning-handlers.d.ts +92 -0
  432. package/dist/mcp/handlers/task-learning-handlers.js +230 -0
  433. package/dist/mcp/handlers/task-orchestrate-handler.d.ts +73 -0
  434. package/dist/mcp/handlers/task-orchestrate-handler.js +361 -0
  435. package/dist/mcp/protocol-server.js +13 -3
  436. package/dist/mcp/tools/chaos-resilience/inject.d.ts +3 -4
  437. package/dist/mcp/tools/chaos-resilience/inject.js +11 -81
  438. package/dist/mcp/tools/code-intelligence/analyze.js +3 -6
  439. package/dist/mcp/tools/coverage-analysis/index.d.ts +4 -0
  440. package/dist/mcp/tools/coverage-analysis/index.js +8 -2
  441. package/dist/mcp/tools/learning-optimization/dream.d.ts +8 -0
  442. package/dist/mcp/tools/learning-optimization/dream.js +4 -0
  443. package/dist/mcp/tools/visual-accessibility/index.d.ts +7 -0
  444. package/dist/mcp/tools/visual-accessibility/index.js +29 -13
  445. package/dist/shared/events/domain-events.d.ts +2 -0
  446. package/dist/shared/metrics/code-metrics.js +21 -3
  447. package/dist/shared/parsers/typescript-parser.d.ts +6 -0
  448. package/dist/shared/parsers/typescript-parser.js +13 -1
  449. package/package.json +1 -1
  450. package/dist/cli/chunks/adapter-HL7MOCQN.js +0 -2
  451. package/dist/cli/chunks/aqe-learning-engine-OZ2DXB4G.js +0 -2
  452. package/dist/cli/chunks/base-WIM7G3HC.js +0 -2
  453. package/dist/cli/chunks/brain-handler-MPC5SPYI.js +0 -94
  454. package/dist/cli/chunks/browser-workflow-QRKCFVR3.js +0 -2
  455. package/dist/cli/chunks/chunk-4A76VPU4.js +0 -3
  456. package/dist/cli/chunks/chunk-QSGEBCDB.js +0 -62
  457. package/dist/cli/chunks/chunk-UCSK2RMI.js +0 -2
  458. package/dist/cli/chunks/chunk-VXVTFKRA.js +0 -2
  459. package/dist/cli/chunks/chunk-XCNSGSKV.js +0 -3
  460. package/dist/cli/chunks/chunk-XZOYKB22.js +0 -79
  461. package/dist/cli/chunks/chunk-YIDAXOUX.js +0 -8
  462. package/dist/cli/chunks/client-4PNYDFYS.js +0 -2
  463. package/dist/cli/chunks/core-handlers-ODO6LUWQ.js +0 -2
  464. package/dist/cli/chunks/coverage-USPMNKOU.js +0 -50
  465. package/dist/cli/chunks/cross-domain-router-DT4MHJKK.js +0 -2
  466. package/dist/cli/chunks/domain-transfer-L3F6AES2.js +0 -2
  467. package/dist/cli/chunks/dream-QOB3JCOM.js +0 -2
  468. package/dist/cli/chunks/file-discovery-BN76S2PR.js +0 -2
  469. package/dist/cli/chunks/fleet-43YMXACN.js +0 -46
  470. package/dist/cli/chunks/heartbeat-scheduler-3NNP4WCP.js +0 -2
  471. package/dist/cli/chunks/hnsw-adapter-MZR7Y4WF.js +0 -2
  472. package/dist/cli/chunks/hnsw-index-HE4AX22U.js +0 -2
  473. package/dist/cli/chunks/hybrid-backend-IHUHB3Y2.js +0 -2
  474. package/dist/cli/chunks/impact-analyzer-FI6GI6PD.js +0 -2
  475. package/dist/cli/chunks/init-wizard-WLQKH5Y5.js +0 -2
  476. package/dist/cli/chunks/kernel-2WZOQEZS.js +0 -2
  477. package/dist/cli/chunks/knowledge-graph-G3LVKK6P.js +0 -2
  478. package/dist/cli/chunks/learning-QUCMBD77.js +0 -122
  479. package/dist/cli/chunks/llm-router-service-MM75HKWJ.js +0 -2
  480. package/dist/cli/chunks/load-test-BEWEE44J.js +0 -2
  481. package/dist/cli/chunks/memory-backend-NYKBBKZR.js +0 -2
  482. package/dist/cli/chunks/pattern-null-store-QGPUIV6M.js +0 -2
  483. package/dist/cli/chunks/project-root-C7ELXZRK.js +0 -2
  484. package/dist/cli/chunks/protocol-executor-SUVE33BM.js +0 -2
  485. package/dist/cli/chunks/qe-reasoning-bank-YWZMMGJB.js +0 -2
  486. package/dist/cli/chunks/queen-coordinator-ZFAKXRN7.js +0 -2
  487. package/dist/cli/chunks/router-4FTAVYLJ.js +0 -2
  488. package/dist/cli/chunks/routing-feedback-IO2KOWMJ.js +0 -2
  489. package/dist/cli/chunks/rvf-dual-writer-KCIRNE7C.js +0 -2
  490. package/dist/cli/chunks/rvf-migration-adapter-MFC5WTJU.js +0 -2
  491. package/dist/cli/chunks/rvf-native-adapter-I3KWHE7X.js +0 -2
  492. package/dist/cli/chunks/safe-db-QXDZ6QY3.js +0 -2
  493. package/dist/cli/chunks/schedule-CZKD6RIY.js +0 -2
  494. package/dist/cli/chunks/scheduler-BLA3Q4CH.js +0 -2
  495. package/dist/cli/chunks/sqlite-persistence-XIUYDJC4.js +0 -2
  496. package/dist/cli/chunks/task-handler-P6IFLCKP.js +0 -62
  497. package/dist/cli/chunks/task-handlers-DPWMUKFC.js +0 -9
  498. package/dist/cli/chunks/test-runner-process-46IPK3GH.js +0 -2
  499. package/dist/cli/chunks/tree-sitter-wasm-parser-MOI2WWNJ.js +0 -2
  500. package/dist/cli/chunks/unified-memory-FL26RTV3.js +0 -2
  501. package/dist/cli/chunks/unified-memory-hnsw-E2BPTH3U.js +0 -2
  502. package/dist/cli/chunks/unified-persistence-5ZOUPKHF.js +0 -2
  503. package/dist/cli/chunks/visual-security-IJVPO5FA.js +0 -2
  504. package/dist/cli/chunks/witness-chain-5FAFCQKP.js +0 -2
  505. package/dist/cli/chunks/witness-chain-V2M32W5D.js +0 -2
  506. package/dist/cli/chunks/workflow-orchestrator-3JLF3IX7.js +0 -2
@@ -6,9 +6,18 @@ import { createHash } from 'node:crypto';
6
6
  import { ok, err } from '../../../shared/types/index.js';
7
7
  import { NomicEmbedder, EMBEDDING_CONFIG, } from '../../../shared/embeddings/index.js';
8
8
  import { toError } from '../../../shared/error-utils.js';
9
+ /**
10
+ * #1224: the message for a search over an empty index. "No results" is only
11
+ * reported after searching an index that holds code.
12
+ */
13
+ export const NOTHING_INDEXED_FOR_SEARCH = 'No code is indexed for search yet, so the search was not run. ' +
14
+ 'Index the project first (MCP code_index, or `aqe code index <path>`), then search again.';
15
+ /** Upper bound on indexed files one exact/fuzzy search reads. */
16
+ const MAX_INDEXED_FILES_SCANNED = 100_000;
9
17
  const DEFAULT_CONFIG = {
10
18
  embeddingDimension: EMBEDDING_CONFIG.DIMENSIONS, // 384 for all-MiniLM-L6-v2
11
19
  minScore: 0.5,
20
+ minVectorScore: 0.3,
12
21
  maxResults: 100,
13
22
  namespace: 'code-intelligence:semantic',
14
23
  enableCaching: true,
@@ -26,6 +35,8 @@ export class SemanticAnalyzerService {
26
35
  analysisCache = new Map();
27
36
  embedder = null;
28
37
  embedderInitialized = false;
38
+ /** #1224: why no embedder is in use, once initialization has run. */
39
+ embedderUnavailableReason = null;
29
40
  constructor(memory, config = {}) {
30
41
  this.memory = memory;
31
42
  this.config = { ...DEFAULT_CONFIG, ...config };
@@ -43,9 +54,11 @@ export class SemanticAnalyzerService {
43
54
  return;
44
55
  }
45
56
  if (this.config.useNomicEmbeddings) {
57
+ // #1224: no pseudo-embedding fallback. A failed embed throws, and the
58
+ // search reports itself as lexical-only instead.
46
59
  const nomicEmbedder = new NomicEmbedder({
47
- enableFallback: true,
48
60
  ...this.config.nomicConfig,
61
+ enableFallback: false,
49
62
  });
50
63
  // Check if Ollama is available
51
64
  const isAvailable = await nomicEmbedder.healthCheck();
@@ -55,6 +68,13 @@ export class SemanticAnalyzerService {
55
68
  this.config.embeddingDimension =
56
69
  EMBEDDING_CONFIG.DIMENSIONS;
57
70
  }
71
+ else {
72
+ this.embedderUnavailableReason =
73
+ `no embedding model available (Ollama model '${EMBEDDING_CONFIG.MODEL}' is not reachable)`;
74
+ }
75
+ }
76
+ else {
77
+ this.embedderUnavailableReason = 'embeddings are disabled for code search';
58
78
  }
59
79
  this.embedderInitialized = true;
60
80
  }
@@ -65,11 +85,23 @@ export class SemanticAnalyzerService {
65
85
  const startTime = Date.now();
66
86
  try {
67
87
  const { query, type, scope, limit = this.config.maxResults, filters } = request;
88
+ if (type !== 'semantic' && type !== 'exact' && type !== 'fuzzy') {
89
+ return err(new Error(`Unknown search type: ${type}`));
90
+ }
91
+ // #1224: an empty answer from an empty index is not "no results".
92
+ const indexed = await this.memory.search(this.contentKeyPattern(), 1);
93
+ if (indexed.length === 0) {
94
+ return err(new Error(NOTHING_INDEXED_FOR_SEARCH));
95
+ }
68
96
  let results;
97
+ let lexicalOnlyReason;
69
98
  switch (type) {
70
- case 'semantic':
71
- results = await this.semanticSearch(query, limit, scope, filters);
99
+ case 'semantic': {
100
+ const semantic = await this.semanticSearch(query, limit, scope, filters);
101
+ results = semantic.results;
102
+ lexicalOnlyReason = semantic.lexicalOnlyReason;
72
103
  break;
104
+ }
73
105
  case 'exact':
74
106
  results = await this.exactSearch(query, limit, scope, filters);
75
107
  break;
@@ -84,6 +116,11 @@ export class SemanticAnalyzerService {
84
116
  results,
85
117
  total: results.length,
86
118
  searchTime,
119
+ ...(type === 'semantic'
120
+ ? lexicalOnlyReason === undefined
121
+ ? { mode: 'vector' }
122
+ : { mode: 'lexical-only', reason: lexicalOnlyReason }
123
+ : {}),
87
124
  });
88
125
  }
89
126
  catch (error) {
@@ -95,17 +132,20 @@ export class SemanticAnalyzerService {
95
132
  */
96
133
  async indexCode(file, content) {
97
134
  try {
98
- // Generate embedding for the code
99
- const embedding = await this.getEmbedding(content);
100
135
  // Extract code metadata
101
136
  const metadata = this.extractCodeMetadata(file, content);
102
- // Store in vector index
103
- const key = `${this.config.namespace}:code:${this.fileToKey(file)}`;
104
- await this.memory.storeVector(key, embedding, {
105
- file,
106
- ...metadata,
107
- indexedAt: new Date().toISOString(),
108
- });
137
+ // #1224: store a vector only when a real embedding model produced one;
138
+ // without it the file is still searchable by text.
139
+ const embedded = await this.tryEmbed(content);
140
+ if (embedded.vector) {
141
+ const key = `${this.vectorKeyPrefix()}${this.fileToKey(file)}`;
142
+ await this.memory.storeVector(key, embedded.vector, {
143
+ file,
144
+ ...metadata,
145
+ embeddingModel: this.embeddingModelId(),
146
+ indexedAt: new Date().toISOString(),
147
+ });
148
+ }
109
149
  // Store content for retrieval.
110
150
  // The key is already fully namespace-qualified, so do NOT also pass a
111
151
  // {namespace} store option: every read path (semanticSearch/findSimilar/
@@ -126,13 +166,13 @@ export class SemanticAnalyzerService {
126
166
  async findSimilar(code, limit = 10) {
127
167
  try {
128
168
  const embedding = await this.getEmbedding(code);
129
- const vectorResults = await this.memory.vectorSearch(embedding, limit);
169
+ const vectorResults = await this.memory.vectorSearch(embedding, limit, this.vectorKeyPrefix());
130
170
  const results = [];
131
171
  for (const vr of vectorResults) {
132
- if (vr.score < this.config.minScore)
172
+ if (vr.score < this.config.minVectorScore)
133
173
  continue;
134
174
  const metadata = vr.metadata;
135
- if (!metadata?.file)
175
+ if (!metadata?.file || !this.isCurrentModelVector(metadata))
136
176
  continue;
137
177
  const contentKey = `${this.config.namespace}:content:${this.fileToKey(metadata.file)}`;
138
178
  const stored = await this.memory.get(contentKey);
@@ -190,8 +230,9 @@ export class SemanticAnalyzerService {
190
230
  }
191
231
  }
192
232
  /**
193
- * Get embedding vector for code
194
- * Uses Nomic embeddings via Ollama when available, falls back to pseudo-embeddings
233
+ * Get embedding vector for code.
234
+ * Uses Nomic embeddings via Ollama (or the injected provider). Throws when
235
+ * neither is available: no pseudo-embedding is substituted (#1224, ADR-097).
195
236
  */
196
237
  async getEmbedding(code) {
197
238
  // Check cache
@@ -201,15 +242,10 @@ export class SemanticAnalyzerService {
201
242
  }
202
243
  // Initialize embedder lazily
203
244
  await this.initializeEmbedder();
204
- // Generate embedding using Nomic or fallback
205
- let embedding;
206
- if (this.embedder) {
207
- embedding = await this.embedder.embed(code);
208
- }
209
- else {
210
- // Fallback to pseudo-embedding when Ollama is not available
211
- embedding = this.generateCodeEmbedding(code);
245
+ if (!this.embedder) {
246
+ throw new Error(`Code embeddings unavailable: ${this.embedderUnavailableReason ?? 'no embedding model'}`);
212
247
  }
248
+ const embedding = await this.embedder.embed(code);
213
249
  // Cache result
214
250
  if (this.config.enableCaching) {
215
251
  this.cacheEmbedding(cacheKey, embedding);
@@ -222,22 +258,67 @@ export class SemanticAnalyzerService {
222
258
  isUsingNomicEmbeddings() {
223
259
  return this.embedder !== null && this.embedder instanceof NomicEmbedder;
224
260
  }
261
+ /** #1224: embed `text`, or say why no real embedding is available. */
262
+ async tryEmbed(text) {
263
+ await this.initializeEmbedder();
264
+ if (!this.embedder) {
265
+ return { reason: this.embedderUnavailableReason ?? 'no embedding model available' };
266
+ }
267
+ try {
268
+ return { vector: await this.getEmbedding(text) };
269
+ }
270
+ catch (error) {
271
+ return { reason: `the embedding model failed: ${toError(error).message}` };
272
+ }
273
+ }
274
+ /** Identifies the model behind stored vectors, so vectors from another model are not compared. */
275
+ embeddingModelId() {
276
+ return this.embedder instanceof NomicEmbedder ? EMBEDDING_CONFIG.MODEL : 'injected-provider';
277
+ }
278
+ isCurrentModelVector(metadata) {
279
+ return metadata.embeddingModel === this.embeddingModelId();
280
+ }
281
+ vectorKeyPrefix() {
282
+ return `${this.config.namespace}:code:`;
283
+ }
284
+ contentKeyPattern() {
285
+ return `${this.config.namespace}:content:*`;
286
+ }
225
287
  // ============================================================================
226
288
  // Private Search Methods
227
289
  // ============================================================================
290
+ /**
291
+ * #1224: vector search when an embedding model is available. Otherwise (or
292
+ * when no indexed file has a vector from that model) it matches query words
293
+ * against the indexed text and says so through `lexicalOnlyReason`; no
294
+ * similarity is invented for those hits.
295
+ */
228
296
  async semanticSearch(query, limit, scope, filters) {
229
- // Generate query embedding
230
- const queryEmbedding = await this.getEmbedding(query);
231
- // Perform vector search
232
- const vectorResults = await this.memory.vectorSearch(queryEmbedding, limit * 2);
297
+ const embedded = await this.tryEmbed(query);
298
+ if (!embedded.vector) {
299
+ return {
300
+ results: await this.lexicalSearch(query, limit, scope, filters),
301
+ lexicalOnlyReason: embedded.reason,
302
+ };
303
+ }
304
+ // Only this namespace's vectors, from the model that embedded the query.
305
+ const vectorResults = (await this.memory.vectorSearch(embedded.vector, limit * 2, this.vectorKeyPrefix()))
306
+ .filter((vr) => {
307
+ const metadata = vr.metadata;
308
+ return !!metadata?.file && this.isCurrentModelVector(metadata);
309
+ });
310
+ if (vectorResults.length === 0) {
311
+ return {
312
+ results: await this.lexicalSearch(query, limit, scope, filters),
313
+ lexicalOnlyReason: `no indexed file has an embedding from ${this.embeddingModelId()}; re-index to enable vector search`,
314
+ };
315
+ }
233
316
  // Convert to search results with filtering
234
317
  const results = [];
235
318
  for (const vr of vectorResults) {
236
- if (vr.score < this.config.minScore)
319
+ if (vr.score < this.config.minVectorScore)
237
320
  continue;
238
321
  const metadata = vr.metadata;
239
- if (!metadata?.file)
240
- continue;
241
322
  // Apply scope filter
242
323
  if (scope && scope.length > 0) {
243
324
  const matchesScope = scope.some((s) => metadata.file.includes(s));
@@ -258,17 +339,23 @@ export class SemanticAnalyzerService {
258
339
  score: vr.score,
259
340
  highlights: this.findSemanticHighlights(stored.content, query),
260
341
  metadata: stored.metadata,
342
+ matchType: 'vector',
261
343
  });
262
344
  if (results.length >= limit)
263
345
  break;
264
346
  }
265
347
  }
266
- return results;
348
+ return { results };
349
+ }
350
+ /** Word-overlap matching for a semantic query when no vectors can be used. */
351
+ async lexicalSearch(query, limit, scope, filters) {
352
+ const hits = await this.fuzzySearch(query, limit, scope, filters);
353
+ return hits.map((hit) => ({ ...hit, matchType: 'lexical' }));
267
354
  }
268
355
  async exactSearch(query, limit, scope, filters) {
269
356
  const results = [];
270
- const pattern = `${this.config.namespace}:content:*`;
271
- const keys = await this.memory.search(pattern, limit * 3);
357
+ // #1224: scan every indexed file; a cap here hid matches in later files.
358
+ const keys = await this.memory.search(this.contentKeyPattern(), MAX_INDEXED_FILES_SCANNED);
272
359
  for (const key of keys) {
273
360
  const stored = await this.memory.get(key);
274
361
  if (!stored)
@@ -303,8 +390,7 @@ export class SemanticAnalyzerService {
303
390
  }
304
391
  async fuzzySearch(query, limit, scope, filters) {
305
392
  const results = [];
306
- const pattern = `${this.config.namespace}:content:*`;
307
- const keys = await this.memory.search(pattern, limit * 5);
393
+ const keys = await this.memory.search(this.contentKeyPattern(), MAX_INDEXED_FILES_SCANNED);
308
394
  const queryTokens = this.tokenize(query.toLowerCase());
309
395
  for (const key of keys) {
310
396
  const stored = await this.memory.get(key);
@@ -324,7 +410,7 @@ export class SemanticAnalyzerService {
324
410
  const contentTokens = this.tokenize(stored.content.toLowerCase());
325
411
  const score = this.calculateFuzzyScore(queryTokens, contentTokens);
326
412
  if (score >= this.config.minScore) {
327
- const matchedTokens = queryTokens.filter((t) => contentTokens.some((ct) => ct.includes(t) || t.includes(ct)));
413
+ const matchedTokens = queryTokens.filter((t) => contentTokens.some((ct) => this.tokensMatch(t, ct)));
328
414
  results.push({
329
415
  file: stored.file,
330
416
  snippet: this.extractSnippet(stored.content, 200),
@@ -500,38 +586,6 @@ export class SemanticAnalyzerService {
500
586
  // ============================================================================
501
587
  // Private Helper Methods
502
588
  // ============================================================================
503
- generateCodeEmbedding(code) {
504
- // Fallback: Generate a pseudo-embedding based on code features
505
- // Used when Ollama/Nomic is not available
506
- const embedding = new Array(this.config.embeddingDimension).fill(0);
507
- // Extract tokens and features
508
- const tokens = this.tokenize(code);
509
- const concepts = this.extractConcepts(code);
510
- // Combine token-based and concept-based features
511
- for (let i = 0; i < tokens.length; i++) {
512
- const token = tokens[i];
513
- for (let j = 0; j < token.length && j < embedding.length; j++) {
514
- embedding[(i + j) % embedding.length] += token.charCodeAt(j) / 1000;
515
- }
516
- }
517
- // Add concept signals
518
- const conceptIndex = new Map([
519
- ['object-oriented', 0],
520
- ['asynchronous', 1],
521
- ['functional', 2],
522
- ['type-safe', 3],
523
- ['modular', 4],
524
- ]);
525
- for (const concept of concepts) {
526
- const idx = conceptIndex.get(concept);
527
- if (idx !== undefined) {
528
- embedding[idx] += 0.5;
529
- }
530
- }
531
- // Normalize
532
- const magnitude = Math.sqrt(embedding.reduce((sum, v) => sum + v * v, 0)) || 1;
533
- return embedding.map((v) => v / magnitude);
534
- }
535
589
  extractCodeMetadata(file, content) {
536
590
  return {
537
591
  language: this.detectLanguage(file),
@@ -564,12 +618,21 @@ export class SemanticAnalyzerService {
564
618
  return 0;
565
619
  let matches = 0;
566
620
  for (const qt of queryTokens) {
567
- if (contentTokens.some((ct) => ct.includes(qt) || qt.includes(ct))) {
621
+ if (contentTokens.some((ct) => this.tokensMatch(qt, ct))) {
568
622
  matches++;
569
623
  }
570
624
  }
571
625
  return matches / queryTokens.length;
572
626
  }
627
+ /**
628
+ * A content token matches a query token it contains, or that contains it.
629
+ * #1224: the second direction needs a content token of 3+ characters, so a
630
+ * one-letter variable such as `i` does not match the query "login".
631
+ */
632
+ tokensMatch(queryToken, contentToken) {
633
+ return contentToken.includes(queryToken) ||
634
+ (contentToken.length >= 3 && queryToken.includes(contentToken));
635
+ }
573
636
  matchesFilters(metadata, filters) {
574
637
  for (const filter of filters) {
575
638
  const value = metadata[filter.field];
@@ -14,6 +14,32 @@ import type { CoverageSummary, FileCoverage } from './interfaces';
14
14
  * (or the cwd when none is known), so one file never has two records.
15
15
  */
16
16
  export declare function fileCoverageKey(filePath: string, projectRoot?: string): string;
17
+ /** Why a report entry is not a measurement of a project file (#1030, #1219). */
18
+ export type ExcludedCoverageReason = 'outside-project' | 'windows-path' | 'duplicate-spelling';
19
+ /** A report entry left out of per-file records and of the report's summary. */
20
+ export interface ExcludedCoverageEntry {
21
+ /** The path as the report wrote it. */
22
+ path: string;
23
+ reason: ExcludedCoverageReason;
24
+ /** For `duplicate-spelling`: the project file both spellings name. */
25
+ file?: string;
26
+ }
27
+ /**
28
+ * #1030, #1219: sort the paths of ONE report into project files (with their
29
+ * per-file record key, keyed by the path as the report wrote it) and entries
30
+ * that are not a measurement of a project file: a path that resolves outside
31
+ * the project root (lcov `SF:../../outside.ts`), a Windows absolute path read
32
+ * on POSIX (it would resolve to a junk key), or a file the report lists under
33
+ * two spellings (`./src/a.ts` and `src/a.ts`), so which entry is right is
34
+ * unknown. A path under the root's realpath (macOS `/private/var` for
35
+ * `/var`) is inside.
36
+ */
37
+ export declare function classifyProjectCoveragePaths(paths: readonly string[], projectRoot?: string): {
38
+ keys: Map<string, string>;
39
+ excluded: ExcludedCoverageEntry[];
40
+ };
41
+ /** #1030: the per-file record key of each project file in ONE report (see `classifyProjectCoveragePaths`). */
42
+ export declare function projectFileCoverageKeys(paths: readonly string[], projectRoot?: string): Map<string, string>;
17
43
  /** Read the canonical key first, then a measured legacy relative key if present. */
18
44
  export declare function fileCoverageLookupKeys(filePath: string, projectRoot?: string): string[];
19
45
  export interface CollectedMetrics {
@@ -6,6 +6,7 @@
6
6
  * summary figure is 0 by construction, and must be reported AND persisted as
7
7
  * null — never as 0% (a fake low figure) nor as istanbul's 0/0 = 100%.
8
8
  */
9
+ import * as fs from 'fs';
9
10
  import * as path from 'path';
10
11
  import { findProjectRoot } from '../../kernel/project-root.js';
11
12
  /**
@@ -17,6 +18,59 @@ import { findProjectRoot } from '../../kernel/project-root.js';
17
18
  export function fileCoverageKey(filePath, projectRoot) {
18
19
  return path.isAbsolute(filePath) ? path.normalize(filePath) : path.resolve(projectRoot ?? findProjectRoot(), filePath);
19
20
  }
21
+ function isInside(root, key) {
22
+ const relative = path.relative(root, key);
23
+ return relative !== '' && relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);
24
+ }
25
+ function realRoot(root) {
26
+ try {
27
+ return fs.realpathSync(root);
28
+ }
29
+ catch {
30
+ return root;
31
+ }
32
+ }
33
+ /**
34
+ * #1030, #1219: sort the paths of ONE report into project files (with their
35
+ * per-file record key, keyed by the path as the report wrote it) and entries
36
+ * that are not a measurement of a project file: a path that resolves outside
37
+ * the project root (lcov `SF:../../outside.ts`), a Windows absolute path read
38
+ * on POSIX (it would resolve to a junk key), or a file the report lists under
39
+ * two spellings (`./src/a.ts` and `src/a.ts`), so which entry is right is
40
+ * unknown. A path under the root's realpath (macOS `/private/var` for
41
+ * `/var`) is inside.
42
+ */
43
+ export function classifyProjectCoveragePaths(paths, projectRoot) {
44
+ const root = path.resolve(projectRoot ?? findProjectRoot());
45
+ const canonicalRoot = realRoot(root);
46
+ const keys = new Map();
47
+ const excluded = [];
48
+ const spellings = new Map();
49
+ for (const filePath of paths) {
50
+ if (!path.isAbsolute(filePath) && path.win32.isAbsolute(filePath)) {
51
+ excluded.push({ path: filePath, reason: 'windows-path' });
52
+ continue;
53
+ }
54
+ const key = fileCoverageKey(filePath, root);
55
+ if (!isInside(root, key) && !isInside(canonicalRoot, key)) {
56
+ excluded.push({ path: filePath, reason: 'outside-project' });
57
+ continue;
58
+ }
59
+ keys.set(filePath, key);
60
+ spellings.set(key, (spellings.get(key) ?? 0) + 1);
61
+ }
62
+ for (const [filePath, key] of keys) {
63
+ if ((spellings.get(key) ?? 0) > 1) {
64
+ keys.delete(filePath);
65
+ excluded.push({ path: filePath, reason: 'duplicate-spelling', file: key });
66
+ }
67
+ }
68
+ return { keys, excluded };
69
+ }
70
+ /** #1030: the per-file record key of each project file in ONE report (see `classifyProjectCoveragePaths`). */
71
+ export function projectFileCoverageKeys(paths, projectRoot) {
72
+ return classifyProjectCoveragePaths(paths, projectRoot).keys;
73
+ }
20
74
  /** Read the canonical key first, then a measured legacy relative key if present. */
21
75
  export function fileCoverageLookupKeys(filePath, projectRoot) {
22
76
  const canonical = `coverage:file:${fileCoverageKey(filePath, projectRoot)}`;
@@ -11,7 +11,7 @@ import { safeJsonParse } from '../../../shared/safe-json.js';
11
11
  import { writeQualityEvidence, writeTestRunEvidence } from '../../quality-assessment/quality-evidence.js';
12
12
  import { measuredCoverageSummary } from '../../quality-assessment/coverage-report-event.js';
13
13
  import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
14
- import { collectedMetrics, collectedSummary, fileCoverageKey } from '../collected-metrics.js';
14
+ import { collectedMetrics, collectedSummary, projectFileCoverageKeys } from '../collected-metrics.js';
15
15
  /**
16
16
  * Whether an analyze request carries instrumented (measured) coverage (#1008).
17
17
  * Fail-closed: an explicit `request.measured` wins; otherwise only data a
@@ -510,7 +510,11 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
510
510
  * (The vector index via storeVector is kept for similarity search.)
511
511
  */
512
512
  async storeFileCoverageKV(files, projectRoot, runStatus) {
513
+ const keys = projectFileCoverageKeys(files.map(file => file.path), projectRoot);
513
514
  for (const file of files) {
515
+ const key = keys.get(file.path);
516
+ if (!key)
517
+ continue;
514
518
  try {
515
519
  // #1014: a metric with no data is null (not collected), never 0%.
516
520
  const pct = (m) => m.total > 0 ? Math.round((m.covered / m.total) * 10000) / 100 : null;
@@ -518,12 +522,14 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
518
522
  continue;
519
523
  // #1014: stamped, so readers can tell it from legacy unstamped
520
524
  // estimate records written by <= 3.15.4.
521
- await this.memory.set(`coverage:file:${fileCoverageKey(file.path, projectRoot)}`, {
525
+ await this.memory.set(`coverage:file:${key}`, {
522
526
  line: pct(file.lines),
523
527
  branch: pct(file.branches),
524
528
  function: pct(file.functions),
525
529
  statement: pct(file.statements),
526
530
  measured: true,
531
+ // #1219: the counts behind `line`, so several files can be line-weighted.
532
+ lines: { covered: file.lines.covered, total: file.lines.total },
527
533
  ...(runStatus ? { runStatus } : {}),
528
534
  }, { persist: true });
529
535
  }
@@ -533,11 +539,15 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
533
539
  }
534
540
  }
535
541
  async indexFileCoverageVectors(files, projectRoot) {
542
+ const keys = projectFileCoverageKeys(files.map(file => file.path), projectRoot);
536
543
  for (const file of files) {
544
+ const key = keys.get(file.path);
545
+ if (!key)
546
+ continue;
537
547
  try {
538
548
  // Create a vector representation of the file coverage
539
549
  const embedding = this.createCoverageEmbedding(file);
540
- await this.memory.storeVector(`coverage:file:${fileCoverageKey(file.path, projectRoot)}`, embedding, {
550
+ await this.memory.storeVector(`coverage:file:${key}`, embedding, {
541
551
  path: file.path,
542
552
  lineCoverage: file.lines.covered / (file.lines.total || 1),
543
553
  branchCoverage: file.branches.covered / (file.branches.total || 1),
@@ -129,6 +129,8 @@ export interface CoverageReport {
129
129
  files: Map<string, FileCoverageData>;
130
130
  /** Summary statistics */
131
131
  summary: CoverageSummary;
132
+ /** Parts of the report that could not be attributed and are not in `files` (#1232). */
133
+ warnings?: string[];
132
134
  }
133
135
  /**
134
136
  * Summary statistics for entire coverage report
@@ -461,12 +461,20 @@ export function parseDotcoverContent(content, projectRoot) {
461
461
  // Parse <Statement> elements to build per-file coverage
462
462
  const stmtPattern = /<Statement\s+FileIndex="(\d+)"\s+Line="(\d+)"\s+Column="\d+"\s+EndLine="\d+"\s+EndColumn="\d+"\s+Covered="(\w+)"\s*\/>/g;
463
463
  const fileData = new Map();
464
+ // #1232: statements whose FileIndex is not in the file table, by index; never named after a made-up file.
465
+ const unknownIndices = new Map();
466
+ let statementCount = 0;
464
467
  let sm;
465
468
  while ((sm = stmtPattern.exec(content)) !== null) {
469
+ statementCount++;
466
470
  const fileIdx = sm[1];
467
471
  const lineNum = parseInt(sm[2], 10);
468
472
  const isCovered = sm[3] === 'True';
469
- const filePath = fileIndex.get(fileIdx) || `file-${fileIdx}`;
473
+ const filePath = fileIndex.get(fileIdx);
474
+ if (!filePath) {
475
+ unknownIndices.set(fileIdx, (unknownIndices.get(fileIdx) ?? 0) + 1);
476
+ continue;
477
+ }
470
478
  if (!fileData.has(filePath)) {
471
479
  fileData.set(filePath, { lineDetails: new Map(), total: 0, covered: 0 });
472
480
  }
@@ -476,14 +484,21 @@ export function parseDotcoverContent(content, projectRoot) {
476
484
  if (isCovered)
477
485
  data.covered++;
478
486
  }
487
+ const warnings = [];
488
+ if (unknownIndices.size > 0) {
489
+ const skipped = [...unknownIndices.values()].reduce((sum, n) => sum + n, 0);
490
+ warnings.push(`dotCover report references FileIndex ${[...unknownIndices.keys()].join(', ')} missing from its file table; ` +
491
+ `${skipped} statement(s) skipped and their coverage is not reported`);
492
+ }
479
493
  // If no Statement elements found, parse from CoveredStatements/TotalStatements attributes
480
- if (fileData.size === 0) {
494
+ if (statementCount === 0) {
481
495
  const rootPattern = /CoveredStatements="(\d+)"\s+TotalStatements="(\d+)"/;
482
496
  const rootMatch = rootPattern.exec(content);
483
497
  if (rootMatch) {
484
498
  const covered = parseInt(rootMatch[1], 10);
485
499
  const total = parseInt(rootMatch[2], 10);
486
500
  const filePath = path.join(projectRoot, 'aggregate');
501
+ warnings.push("dotCover report has no per-file statements; report totals are listed under 'aggregate', which is not a project file");
487
502
  files.set(filePath, {
488
503
  path: filePath,
489
504
  relativePath: 'aggregate',
@@ -526,6 +541,7 @@ export function parseDotcoverContent(content, projectRoot) {
526
541
  language: 'csharp',
527
542
  files,
528
543
  summary: calculateSummary(files),
544
+ ...(warnings.length > 0 ? { warnings } : {}),
529
545
  };
530
546
  }
531
547
  // ============================================================================
@@ -16,7 +16,7 @@ import { TypeScriptParser } from '../../../shared/parsers/index.js';
16
16
  import { toError } from '../../../shared/error-utils.js';
17
17
  import { safeJsonParse } from '../../../shared/safe-json.js';
18
18
  import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
19
- import { measuredCoverageSummary, measuredFileCoverage } from '../../quality-assessment/coverage-report-event.js';
19
+ import { measuredFileCoverage } from '../../quality-assessment/coverage-report-event.js';
20
20
  import { fileCoverageLookupKeys } from '../../coverage-analysis/collected-metrics.js';
21
21
  // LLMDefectAnalysis is imported from ../interfaces
22
22
  const DEFAULT_CONFIG = {
@@ -616,11 +616,8 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
616
616
  return 1 - fileCoverage.line / 100;
617
617
  }
618
618
  }
619
- // Fall back to project-wide coverage
620
- const summary = measuredCoverageSummary(await this.memory.get('coverage:latest'));
621
- if (summary) {
622
- return 1 - summary.line / 100;
623
- }
619
+ // #1219: no fallback to the project-wide summary — it is not this
620
+ // file's coverage. A file with no record of its own gets the prior below.
624
621
  }
625
622
  catch {
626
623
  // Non-critical lookup
@@ -78,6 +78,11 @@ export class CoherenceGateController {
78
78
  if (criticalFailure) {
79
79
  reasons.push(criticalFailure);
80
80
  }
81
+ // Check 7 (#1020): an unmeasured input is never read as passing, so no
82
+ // decision can allow. Measured failures above stay the primary reason.
83
+ if ((lambda.unmeasured?.length ?? 0) > 0) {
84
+ reasons.push('insufficientEvidence');
85
+ }
81
86
  // Determine tier based on reasons
82
87
  return this.determineDecision(lambda, reasons);
83
88
  }
@@ -92,6 +97,9 @@ export class CoherenceGateController {
92
97
  */
93
98
  canDeploy(lambda) {
94
99
  const decision = this.evaluate(lambda);
100
+ // #1020: allowDeployWhenUnstable never covers missing evidence.
101
+ if ((lambda.unmeasured?.length ?? 0) > 0)
102
+ return false;
95
103
  return decision.decision === 'allow' ||
96
104
  (decision.decision === 'reduceScope' && this.config.policy.allowDeployWhenUnstable);
97
105
  }
@@ -144,16 +152,16 @@ export class CoherenceGateController {
144
152
  * Check critical dimensions for failures
145
153
  */
146
154
  checkCriticalDimensions(dimensions) {
147
- // Security is critical
148
- if (dimensions.security < 0.5) {
155
+ // Security is critical (an absent dimension is unmeasured, see #1020)
156
+ if (dimensions.security !== undefined && dimensions.security < 0.5) {
149
157
  return 'securityCritical';
150
158
  }
151
159
  // Test pass rate is critical
152
- if (dimensions.passRate < 0.8) {
160
+ if (dimensions.passRate !== undefined && dimensions.passRate < 0.8) {
153
161
  return 'testFailureSpike';
154
162
  }
155
163
  // Coverage drop is concerning (if previously high)
156
- if (dimensions.coverage < 0.5) {
164
+ if (dimensions.coverage !== undefined && dimensions.coverage < 0.5) {
157
165
  return 'coverageDrop';
158
166
  }
159
167
  return null;
@@ -328,6 +336,9 @@ export class CoherenceGateController {
328
336
  const additionalStr = additionalReasons.map(r => this.reasonToString(r)).join(', ');
329
337
  parts.push(`Additional concerns: ${additionalStr}.`);
330
338
  }
339
+ if (lambda.unmeasured && lambda.unmeasured.length > 0) {
340
+ parts.push(`Not measured: ${lambda.unmeasured.join(', ')}.`);
341
+ }
331
342
  // Dimension summary
332
343
  const summary = this.getDimensionSummary(lambda.dimensions);
333
344
  parts.push(`Quality dimensions: ${summary.healthy} healthy, ${summary.warning} warning, ${summary.critical} critical.`);
@@ -363,6 +374,7 @@ export class CoherenceGateController {
363
374
  'securityCritical': 'critical security vulnerability detected',
364
375
  'coverageDrop': 'significant test coverage decrease',
365
376
  'testFailureSpike': 'sudden increase in test failures',
377
+ 'insufficientEvidence': 'one or more quality inputs were not measured',
366
378
  };
367
379
  return reasonStrings[reason] || reason;
368
380
  }