agentic-qe 3.15.15 → 3.15.17

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 (526) hide show
  1. package/.claude/skills/skills-manifest.json +1 -1
  2. package/CHANGELOG.md +168 -0
  3. package/assets/skills/skills-manifest.json +1 -1
  4. package/dist/audit/witness-chain.d.ts +7 -0
  5. package/dist/audit/witness-chain.js +10 -0
  6. package/dist/cli/bundle.js +6 -6
  7. package/dist/cli/chunks/adapter-OMILP6KH.js +2 -0
  8. package/dist/cli/chunks/{agent-booster-wasm-EUF4XVUC.js → agent-booster-wasm-6BUOFQZA.js} +2 -2
  9. package/dist/cli/chunks/{agent-handler-MOX6PSIQ.js → agent-handler-HPDK3JI3.js} +2 -2
  10. package/dist/cli/chunks/{agent-memory-branch-AEXKIGDG.js → agent-memory-branch-5QKUTWK5.js} +2 -2
  11. package/dist/cli/chunks/aqe-learning-engine-OXH5CCOS.js +2 -0
  12. package/dist/cli/chunks/{arena-IQ5ZZDRF.js → arena-7OKPMNHD.js} +2 -2
  13. package/dist/cli/chunks/{arena-M7GA3CVG.js → arena-HZ35LESR.js} +4 -4
  14. package/dist/cli/chunks/{audit-4IPBMKWB.js → audit-XI575SVK.js} +3 -3
  15. package/dist/cli/chunks/base-MAK2BLTG.js +2 -0
  16. package/dist/cli/chunks/{better-sqlite3-IKDKJ2IE.js → better-sqlite3-YO5X7ZJS.js} +2 -2
  17. package/dist/cli/chunks/{brain-handler-5NQUDH4W.js → brain-handler-GCQZFZGQ.js} +3 -3
  18. package/dist/cli/chunks/{branch-enumerator-KSXELWRC.js → branch-enumerator-N6G44UU2.js} +2 -2
  19. package/dist/cli/chunks/{browser-6LACARWE.js → browser-EVKPTLOI.js} +2 -2
  20. package/dist/cli/chunks/browser-workflow-IR3VF2TL.js +2 -0
  21. package/dist/cli/chunks/{chunk-DKX4GNRU.js → chunk-2EQK7B5L.js} +2 -2
  22. package/dist/cli/chunks/chunk-2PCEMDIX.js +757 -0
  23. package/dist/cli/chunks/{chunk-JCQGJGGZ.js → chunk-2UUZCQSD.js} +7 -7
  24. package/dist/cli/chunks/chunk-2YWYW7NU.js +21 -0
  25. package/dist/cli/chunks/{chunk-PFQCV6YS.js → chunk-45223KK6.js} +6 -6
  26. package/dist/cli/chunks/chunk-4EJLHNER.js +12 -0
  27. package/dist/cli/chunks/{chunk-E5G4WZ2T.js → chunk-4L6WX5KC.js} +1 -1
  28. package/dist/cli/chunks/{chunk-UQPA33UK.js → chunk-4NKZU2JZ.js} +2 -2
  29. package/dist/cli/chunks/{chunk-OBDONJQM.js → chunk-4UKTIQDT.js} +2 -2
  30. package/dist/cli/chunks/{chunk-7BLZHFKD.js → chunk-4YM45Z5B.js} +1 -1
  31. package/dist/cli/chunks/{chunk-ZWBGYJ7K.js → chunk-5FSPELOG.js} +2 -2
  32. package/dist/cli/chunks/{chunk-NWIIYHT6.js → chunk-5WATBVU6.js} +2 -2
  33. package/dist/cli/chunks/{chunk-7ACCBHRB.js → chunk-5WYZVSL2.js} +1 -1
  34. package/dist/cli/chunks/{chunk-ZYJB6FML.js → chunk-6LSZCEW2.js} +1 -1
  35. package/dist/cli/chunks/{chunk-U62OUXBF.js → chunk-6V6BD6PH.js} +1 -1
  36. package/dist/cli/chunks/{chunk-MIA447GY.js → chunk-74MDUIAZ.js} +1 -1
  37. package/dist/cli/chunks/{chunk-AJPROCDW.js → chunk-776K4ZLE.js} +2 -2
  38. package/dist/cli/chunks/{chunk-CBK5CT6T.js → chunk-7BSOO3CY.js} +2 -2
  39. package/dist/cli/chunks/{chunk-ERN56H6S.js → chunk-7SNSI4VY.js} +1 -1
  40. package/dist/cli/chunks/{chunk-JKJOB65O.js → chunk-A4BVDYIL.js} +1 -1
  41. package/dist/cli/chunks/{chunk-MV55NXTD.js → chunk-AGCS5GSO.js} +2 -2
  42. package/dist/cli/chunks/{chunk-XIVVTYM2.js → chunk-AVHYJ3XP.js} +2 -2
  43. package/dist/cli/chunks/{chunk-KJBPB7P5.js → chunk-BE7ZHM34.js} +2 -2
  44. package/dist/cli/chunks/{chunk-GKSMRBHU.js → chunk-BHQ2DLJU.js} +1 -1
  45. package/dist/cli/chunks/{chunk-7XB3FCKM.js → chunk-BKHEQIRZ.js} +2 -2
  46. package/dist/cli/chunks/{chunk-G242G224.js → chunk-BSIWI4ES.js} +2 -2
  47. package/dist/cli/chunks/{chunk-NQS3BWS6.js → chunk-C7QLLMYI.js} +1 -1
  48. package/dist/cli/chunks/{chunk-XWIAZG3C.js → chunk-CMN7PU2H.js} +2 -2
  49. package/dist/cli/chunks/{chunk-4X3SWKBA.js → chunk-COTQ44YO.js} +2 -2
  50. package/dist/cli/chunks/{chunk-3J3RNJNX.js → chunk-CQER6IJ5.js} +1 -1
  51. package/dist/cli/chunks/{chunk-6KCSKGVY.js → chunk-CVPXHDQU.js} +1 -1
  52. package/dist/cli/chunks/{chunk-R6LHJ7ME.js → chunk-CVYPMGUM.js} +2 -2
  53. package/dist/cli/chunks/chunk-CXCMATZ6.js +3 -0
  54. package/dist/cli/chunks/{chunk-PYPS65P7.js → chunk-D75GLKEL.js} +2 -2
  55. package/dist/cli/chunks/chunk-DCDSN67A.js +2 -0
  56. package/dist/cli/chunks/{chunk-6RBTS3NF.js → chunk-DHKSPOUQ.js} +2 -2
  57. package/dist/cli/chunks/{chunk-JW74KRBC.js → chunk-DJDVD6RM.js} +2 -2
  58. package/dist/cli/chunks/{chunk-X33CWRDF.js → chunk-DNVRTJKB.js} +2 -2
  59. package/dist/cli/chunks/{chunk-BQ47GQPK.js → chunk-DS5IFRY6.js} +2 -2
  60. package/dist/cli/chunks/{chunk-AHMWD6JG.js → chunk-E7XIMOKW.js} +2 -2
  61. package/dist/cli/chunks/{chunk-SON6ZRH3.js → chunk-ECKHDHR2.js} +2 -2
  62. package/dist/cli/chunks/chunk-EPVPXHL7.js +2 -0
  63. package/dist/cli/chunks/{chunk-BP5T3OEV.js → chunk-ERYADKMZ.js} +4 -4
  64. package/dist/cli/chunks/{chunk-DUKE27HC.js → chunk-EUWG2JG4.js} +2 -2
  65. package/dist/cli/chunks/chunk-FAQ24UHB.js +29 -0
  66. package/dist/cli/chunks/{chunk-XG4F4XH4.js → chunk-FBBPRVNF.js} +2 -2
  67. package/dist/cli/chunks/{chunk-5PTAFGJT.js → chunk-FBSBXCZS.js} +2 -2
  68. package/dist/cli/chunks/chunk-G2X3OLMN.js +153 -0
  69. package/dist/cli/chunks/{chunk-IXL5ZHWJ.js → chunk-GG7PMTHD.js} +1 -1
  70. package/dist/cli/chunks/{chunk-6BRQPHMZ.js → chunk-GN6OE3JT.js} +1 -1
  71. package/dist/cli/chunks/{chunk-SZAZQZWI.js → chunk-GPPTRKEM.js} +2 -2
  72. package/dist/cli/chunks/{chunk-LTQVUAPH.js → chunk-H2LHWZRE.js} +2 -2
  73. package/dist/cli/chunks/{chunk-WVXJ2QIG.js → chunk-HAQJFUAQ.js} +2 -2
  74. package/dist/cli/chunks/{chunk-C5CXL3JP.js → chunk-HD6W6PHV.js} +2 -2
  75. package/dist/cli/chunks/{chunk-K3WZICFA.js → chunk-HFZD5KLR.js} +1 -1
  76. package/dist/cli/chunks/{chunk-VCXI4XC4.js → chunk-HRUHHHVR.js} +2 -2
  77. package/dist/cli/chunks/{chunk-GV2QE5TO.js → chunk-HVT7RMGV.js} +1 -1
  78. package/dist/cli/chunks/chunk-HWQPMUSN.js +2 -0
  79. package/dist/cli/chunks/{chunk-4ATQP3PR.js → chunk-HZ5O7G2P.js} +1 -1
  80. package/dist/cli/chunks/{chunk-XHHWABJV.js → chunk-IHQGNDMX.js} +2 -2
  81. package/dist/cli/chunks/{chunk-UUBIQR6A.js → chunk-IJSROBM6.js} +18 -18
  82. package/dist/cli/chunks/{chunk-PS6UMZVK.js → chunk-IJZFJPHS.js} +2 -2
  83. package/dist/cli/chunks/{chunk-C4KLXFJP.js → chunk-IKB3M7OF.js} +1 -1
  84. package/dist/cli/chunks/{chunk-SJCKCSN3.js → chunk-INI3Q4CN.js} +1 -1
  85. package/dist/cli/chunks/{chunk-LYJHUNBK.js → chunk-IOWEBPXJ.js} +2 -2
  86. package/dist/cli/chunks/{chunk-HTZSRMHW.js → chunk-IQL6XRF5.js} +2 -2
  87. package/dist/cli/chunks/{chunk-DEKR3CTS.js → chunk-IRHXGCQR.js} +2 -2
  88. package/dist/cli/chunks/{chunk-TODNOP7C.js → chunk-J3QFJI2Y.js} +6 -6
  89. package/dist/cli/chunks/{chunk-OLZH5LRT.js → chunk-J6QRNQJF.js} +11 -11
  90. package/dist/cli/chunks/{chunk-HL2ANKN3.js → chunk-J7Q5TXFZ.js} +2 -2
  91. package/dist/cli/chunks/{chunk-6YVMX2TC.js → chunk-JHKKIJT2.js} +2 -2
  92. package/dist/cli/chunks/{chunk-K3XBQC3R.js → chunk-JI33PMPZ.js} +1 -1
  93. package/dist/cli/chunks/{chunk-74YG72NQ.js → chunk-JRIJM4LE.js} +3 -3
  94. package/dist/cli/chunks/{chunk-TDQWTSBS.js → chunk-JVWZAE2H.js} +2 -2
  95. package/dist/cli/chunks/{chunk-RDMRY7CT.js → chunk-K7WAI662.js} +1 -1
  96. package/dist/cli/chunks/{chunk-C4RTAVC6.js → chunk-KB34MTFZ.js} +2 -2
  97. package/dist/cli/chunks/{chunk-2CKERSMB.js → chunk-KPIPVSIP.js} +2 -2
  98. package/dist/cli/chunks/{chunk-LNX74WHQ.js → chunk-KR2TAAF6.js} +1 -1
  99. package/dist/cli/chunks/{chunk-73PBAWAF.js → chunk-KT2QCXO6.js} +2 -2
  100. package/dist/cli/chunks/{chunk-BBRROA3Z.js → chunk-KTORRIX3.js} +2 -2
  101. package/dist/cli/chunks/{chunk-GCHYOPRZ.js → chunk-LCWEQRZI.js} +2 -2
  102. package/dist/cli/chunks/{chunk-M4WMSCAE.js → chunk-LG5PPJT7.js} +1 -1
  103. package/dist/cli/chunks/{chunk-UAQZI6N4.js → chunk-LIF6UWHV.js} +2 -2
  104. package/dist/cli/chunks/chunk-LN7NKE3N.js +27 -0
  105. package/dist/cli/chunks/chunk-LOLSZG5J.js +2 -0
  106. package/dist/cli/chunks/{chunk-BLL2XU7A.js → chunk-LOMT4UC2.js} +2 -2
  107. package/dist/cli/chunks/chunk-LRKLATSH.js +2 -0
  108. package/dist/cli/chunks/{chunk-EKP2SC77.js → chunk-LRY6UIRI.js} +2 -2
  109. package/dist/cli/chunks/{chunk-JCZCJE6X.js → chunk-LV7UIK4Q.js} +2 -2
  110. package/dist/cli/chunks/{chunk-LVABQNRF.js → chunk-M2YI5YUR.js} +2 -2
  111. package/dist/cli/chunks/{chunk-RIRZHOS2.js → chunk-MCXW3DKE.js} +2 -2
  112. package/dist/cli/chunks/{chunk-ZSOMUTNL.js → chunk-MGZ6XZHU.js} +1 -1
  113. package/dist/cli/chunks/{chunk-H5DER3JY.js → chunk-MLMD3I75.js} +1 -1
  114. package/dist/cli/chunks/{chunk-UXIY4IAI.js → chunk-MVVVGQJ6.js} +2 -2
  115. package/dist/cli/chunks/{chunk-WUOOX7UG.js → chunk-ND72UDVH.js} +2 -2
  116. package/dist/cli/chunks/{chunk-AKZO6GGG.js → chunk-NE3LRUNC.js} +4 -4
  117. package/dist/cli/chunks/{chunk-O6EWL5DQ.js → chunk-NKUHMA4T.js} +2 -2
  118. package/dist/cli/chunks/{chunk-L32JNNKL.js → chunk-NQFDJ6BT.js} +1 -1
  119. package/dist/cli/chunks/{chunk-T66PPF4D.js → chunk-NZJVDOUN.js} +31 -31
  120. package/dist/cli/chunks/{chunk-EBTNMQSS.js → chunk-O7VJ3VKD.js} +2 -2
  121. package/dist/cli/chunks/{chunk-76P32JVU.js → chunk-OJIUIEI4.js} +1 -1
  122. package/dist/cli/chunks/chunk-OO2M2QUV.js +12 -0
  123. package/dist/cli/chunks/{chunk-CAOUV5GZ.js → chunk-ORQ2YBRR.js} +2 -2
  124. package/dist/cli/chunks/chunk-OWIQR6N2.js +4 -0
  125. package/dist/cli/chunks/chunk-OWIZBZLN.js +14 -0
  126. package/dist/cli/chunks/{chunk-J3FP5UGL.js → chunk-P3D7SEHW.js} +1 -1
  127. package/dist/cli/chunks/{chunk-3CYNZFKH.js → chunk-P4OB6WDJ.js} +1 -1
  128. package/dist/cli/chunks/{chunk-LHMQIZ6B.js → chunk-PCL5JRKN.js} +2 -2
  129. package/dist/cli/chunks/{chunk-KLTMOXIK.js → chunk-PIWGKGWP.js} +2 -2
  130. package/dist/cli/chunks/{chunk-VMAM46HQ.js → chunk-PK34KJH7.js} +2 -2
  131. package/dist/cli/chunks/chunk-POPSZDI2.js +65 -0
  132. package/dist/cli/chunks/{chunk-JUDUBQHA.js → chunk-Q6F3DYZN.js} +2 -2
  133. package/dist/cli/chunks/{chunk-Y2OX6KGN.js → chunk-QJSSUBO3.js} +2 -2
  134. package/dist/cli/chunks/{chunk-XM6ZVFM5.js → chunk-QN7HP2UW.js} +235 -173
  135. package/dist/cli/chunks/{chunk-T4GE7MPI.js → chunk-QSQNXBD2.js} +2 -2
  136. package/dist/cli/chunks/{chunk-5C62XMJR.js → chunk-QTQDX4TZ.js} +33 -33
  137. package/dist/cli/chunks/{chunk-DURD37JZ.js → chunk-R3KBOQ3O.js} +2 -2
  138. package/dist/cli/chunks/{chunk-LJMYRTJ7.js → chunk-REY52O7J.js} +1 -1
  139. package/dist/cli/chunks/{chunk-W5ZJG2OU.js → chunk-RKCN4B26.js} +2 -2
  140. package/dist/cli/chunks/chunk-S3DT5TPR.js +14 -0
  141. package/dist/cli/chunks/{chunk-4HKAD25N.js → chunk-S3TBOKAZ.js} +22 -22
  142. package/dist/cli/chunks/{chunk-2IIXCEMS.js → chunk-SAEECT23.js} +2 -2
  143. package/dist/cli/chunks/{chunk-LB2LGEDP.js → chunk-SAZ4PJBR.js} +2 -2
  144. package/dist/cli/chunks/{chunk-FOOW4JVS.js → chunk-SFITYZLV.js} +2 -2
  145. package/dist/cli/chunks/{chunk-2ZFLULL4.js → chunk-SRBCBVSI.js} +2 -2
  146. package/dist/cli/chunks/chunk-SUAZ5Z47.js +63 -0
  147. package/dist/cli/chunks/{chunk-RBKUU7WF.js → chunk-TDZ6N43D.js} +2 -2
  148. package/dist/cli/chunks/chunk-TIVKDIF7.js +2 -0
  149. package/dist/cli/chunks/{chunk-MPFPWJTH.js → chunk-TM75GAXG.js} +2 -2
  150. package/dist/cli/chunks/{chunk-UJABDXST.js → chunk-TWBZONKT.js} +2 -2
  151. package/dist/cli/chunks/{chunk-AOKKUB5F.js → chunk-U4S74IIZ.js} +1 -1
  152. package/dist/cli/chunks/{chunk-W62OOK7A.js → chunk-U5SMBJ6F.js} +2 -2
  153. package/dist/cli/chunks/{chunk-6LE362LZ.js → chunk-UHJVZEQA.js} +2 -2
  154. package/dist/cli/chunks/{chunk-T67R2MUN.js → chunk-UOVCTK5L.js} +2 -2
  155. package/dist/cli/chunks/{chunk-FTRSS64D.js → chunk-VDEKVIP5.js} +2 -2
  156. package/dist/cli/chunks/{chunk-BDKEAGQ2.js → chunk-VITV7AEC.js} +2 -2
  157. package/dist/cli/chunks/{chunk-BU4UQR36.js → chunk-VKREKVFI.js} +2 -2
  158. package/dist/cli/chunks/{chunk-BZULJMGH.js → chunk-VLTDW7XJ.js} +2 -2
  159. package/dist/cli/chunks/{chunk-UE2J6MA5.js → chunk-VQFV2IPV.js} +1 -1
  160. package/dist/cli/chunks/{chunk-TZIHDJZD.js → chunk-VYPVU3JF.js} +2 -2
  161. package/dist/cli/chunks/{chunk-UORB2QDU.js → chunk-WAOEQA3W.js} +2 -2
  162. package/dist/cli/chunks/{chunk-GQABPCQE.js → chunk-WBDWHHKP.js} +2 -2
  163. package/dist/cli/chunks/{chunk-GGQGCT4Y.js → chunk-WX4PO65Q.js} +2 -2
  164. package/dist/cli/chunks/chunk-X2DWHGCC.js +6 -0
  165. package/dist/cli/chunks/{chunk-337Z52QM.js → chunk-X5QD76IU.js} +2 -2
  166. package/dist/cli/chunks/{chunk-E56PVVWC.js → chunk-XBTGEYED.js} +2 -2
  167. package/dist/cli/chunks/{chunk-5AFVEWMT.js → chunk-XEMCHGAJ.js} +2 -2
  168. package/dist/cli/chunks/{chunk-E3MRDIZF.js → chunk-XEYFZLIT.js} +1 -1
  169. package/dist/cli/chunks/{chunk-KCQNFBBR.js → chunk-XFTX3KLE.js} +1 -1
  170. package/dist/cli/chunks/{chunk-QFGYH6HD.js → chunk-XPTCQKVE.js} +1 -1
  171. package/dist/cli/chunks/{chunk-PXATBHWN.js → chunk-YAJOBZE5.js} +2 -2
  172. package/dist/cli/chunks/{chunk-27HE2BHC.js → chunk-YCVLKU6H.js} +2 -2
  173. package/dist/cli/chunks/{chunk-ZIPAB5J6.js → chunk-YD2C6EPN.js} +2 -2
  174. package/dist/cli/chunks/{chunk-5G4UFTV4.js → chunk-YKRLUTK7.js} +2 -2
  175. package/dist/cli/chunks/{chunk-YUS6TWAL.js → chunk-YMUY3TES.js} +6 -6
  176. package/dist/cli/chunks/chunk-YR5QBUHZ.js +6 -0
  177. package/dist/cli/chunks/{chunk-XH4JMX5O.js → chunk-Z7SKUC6P.js} +1 -1
  178. package/dist/cli/chunks/{chunk-EFUJDMNC.js → chunk-ZAQMRFBB.js} +2 -2
  179. package/dist/cli/chunks/{chunk-22UKJGGN.js → chunk-ZC3KDNJW.js} +3 -3
  180. package/dist/cli/chunks/{chunk-AP2W7Z3A.js → chunk-ZGV7L4MW.js} +1 -1
  181. package/dist/cli/chunks/{chunk-W27AJ5B4.js → chunk-ZN35XSKF.js} +2 -2
  182. package/dist/cli/chunks/{chunk-M4CJCPCQ.js → chunk-ZNXM6WVL.js} +2 -2
  183. package/dist/cli/chunks/{chunk-5I7357KS.js → chunk-ZP5AWQRO.js} +2 -2
  184. package/dist/cli/chunks/{chunk-OQG3UQQ7.js → chunk-ZTP3DQ5M.js} +1 -1
  185. package/dist/cli/chunks/{chunk-BFQTLF5X.js → chunk-ZVMSSCTH.js} +2 -2
  186. package/dist/cli/chunks/chunk-ZWUF27P4.js +2 -0
  187. package/dist/cli/chunks/{ci-UCUJOSBW.js → ci-3RTTTS2D.js} +2 -2
  188. package/dist/cli/chunks/{ci-config-2XILD3XG.js → ci-config-XRUR3I4K.js} +2 -2
  189. package/dist/cli/chunks/{ci-output-BL6KWOHW.js → ci-output-E5IAMU2U.js} +2 -2
  190. package/dist/cli/chunks/{circuit-breaker-5XLIOXE5.js → circuit-breaker-SHR2P44P.js} +2 -2
  191. package/dist/cli/chunks/{claude-flow-setup-4IMP6ACS.js → claude-flow-setup-ZDDILFMF.js} +2 -2
  192. package/dist/cli/chunks/client-NO5FOWT4.js +2 -0
  193. package/dist/cli/chunks/{cline-installer-RYLHCDK7.js → cline-installer-BGYVUM6G.js} +2 -2
  194. package/dist/cli/chunks/{code-WY3GJXHX.js → code-PJ4MC3MC.js} +4 -3
  195. package/dist/cli/chunks/{code-index-extractor-Y4MZBZCW.js → code-index-extractor-IW2P22YG.js} +2 -2
  196. package/dist/cli/chunks/{codex-installer-SCJ3T3DX.js → codex-installer-A7WZ6OGL.js} +2 -2
  197. package/dist/cli/chunks/{completions-CN2DXQFU.js → completions-KS23WD5J.js} +2 -2
  198. package/dist/cli/chunks/{complexity-analyzer-7MDPPIBH.js → complexity-analyzer-Q7GLSR2E.js} +2 -2
  199. package/dist/cli/chunks/{continuedev-installer-GCEJRK34.js → continuedev-installer-SK55BFW2.js} +2 -2
  200. package/dist/cli/chunks/copilot-installer-3N5J3WTM.js +3 -0
  201. package/dist/cli/chunks/core-handlers-JNAZPXE2.js +2 -0
  202. package/dist/cli/chunks/{cost-tracker-VO5MFWR6.js → cost-tracker-NENVSO4A.js} +2 -2
  203. package/dist/cli/chunks/{coverage-LYFQYNH6.js → coverage-5L7UQWDH.js} +3 -3
  204. package/dist/cli/chunks/cross-domain-router-HEBM767Z.js +2 -0
  205. package/dist/cli/chunks/{cursor-installer-KP4HA7TV.js → cursor-installer-XXBO2ZE6.js} +2 -2
  206. package/dist/cli/chunks/{daemon-7RC7TS57.js → daemon-CDCQU3LR.js} +3 -3
  207. package/dist/cli/chunks/daemon-JEBJGEUK.js +18 -0
  208. package/dist/cli/chunks/{dag-attention-scheduler-NKA44RSR.js → dag-attention-scheduler-HOMMF7FA.js} +2 -2
  209. package/dist/cli/chunks/{detect-CMYAJWYF.js → detect-FXCOUG6X.js} +2 -2
  210. package/dist/cli/chunks/{dist-node-EN3PYEGW.js → dist-node-GXQ7FMTY.js} +2 -2
  211. package/dist/cli/chunks/{domain-handler-EXSZCX7A.js → domain-handler-TI3JBAPC.js} +2 -2
  212. package/dist/cli/chunks/{domain-plugins-HCQFSNL7.js → domain-plugins-R7LTUM32.js} +2 -2
  213. package/dist/cli/chunks/{domain-transfer-3LGSNTPO.js → domain-transfer-LBIAFHIQ.js} +2 -2
  214. package/dist/cli/chunks/dream-GQDCEJMS.js +2 -0
  215. package/dist/cli/chunks/embed-and-insert-pattern-33KLHDD5.js +3 -0
  216. package/dist/cli/chunks/embedding-space-HHLWTBF5.js +2 -0
  217. package/dist/cli/chunks/{eval-OQELIWJK.js → eval-KDOZMAXJ.js} +2 -2
  218. package/dist/cli/chunks/experience-capture-middleware-X45PECQN.js +40 -0
  219. package/dist/cli/chunks/{fast-paths-UV4NDEWM.js → fast-paths-462V6UUB.js} +2 -2
  220. package/dist/cli/chunks/{feature-flags-H7H33B6C.js → feature-flags-G66OT3AS.js} +2 -2
  221. package/dist/cli/chunks/{feature-flags-CKTYX67J.js → feature-flags-NIRQ4YDM.js} +2 -2
  222. package/dist/cli/chunks/file-discovery-33USPLB5.js +2 -0
  223. package/dist/cli/chunks/{fleet-ZJBCAKRG.js → fleet-PXWGB7CU.js} +3 -3
  224. package/dist/cli/chunks/{gnn-wrapper-RUE2QZRG.js → gnn-wrapper-7MUW3M5M.js} +2 -2
  225. package/dist/cli/chunks/{heartbeat-handler-XRV327M7.js → heartbeat-handler-5237PB35.js} +4 -4
  226. package/dist/cli/chunks/heartbeat-scheduler-LIXLC5IH.js +2 -0
  227. package/dist/cli/chunks/hnsw-adapter-62D5UH27.js +2 -0
  228. package/dist/cli/chunks/hnsw-index-GSGUMQQC.js +2 -0
  229. package/dist/cli/chunks/{hnsw-legacy-bridge-UJID6ZZ4.js → hnsw-legacy-bridge-OSQPW7JP.js} +2 -2
  230. package/dist/cli/chunks/{hnswlib-node-WS43R4AX.js → hnswlib-node-GX6WG2GB.js} +2 -2
  231. package/dist/cli/chunks/{hooks-YZNJKXAJ.js → hooks-GUWHL7VC.js} +23 -22
  232. package/dist/cli/chunks/hybrid-backend-FRWP4BOY.js +2 -0
  233. package/dist/cli/chunks/{hypergraph-engine-XQJSIMTS.js → hypergraph-engine-SRWLLCU3.js} +2 -2
  234. package/dist/cli/chunks/{hypergraph-handler-ZD2NYXMR.js → hypergraph-handler-AVOPRHHO.js} +3 -3
  235. package/dist/cli/chunks/impact-analyzer-7KF3AQXV.js +2 -0
  236. package/dist/cli/chunks/{init-guard-DSRUAVRT.js → init-guard-P4N6EVZS.js} +2 -2
  237. package/dist/cli/chunks/{init-handler-RJU5QMAP.js → init-handler-LRGWOJMD.js} +6 -6
  238. package/dist/cli/chunks/init-wizard-XWWAXY25.js +2 -0
  239. package/dist/cli/chunks/kernel-ZEJPNDBW.js +2 -0
  240. package/dist/cli/chunks/{kilocode-installer-BCPOCVMC.js → kilocode-installer-7R2EPOQ6.js} +2 -2
  241. package/dist/cli/chunks/{kiro-installer-GFCWCB2S.js → kiro-installer-QNM7DPOB.js} +2 -2
  242. package/dist/cli/chunks/knowledge-graph-RRZQS7KY.js +2 -0
  243. package/dist/cli/chunks/{learning-FZTD72CF.js → learning-7OIZBPXZ.js} +3 -3
  244. package/dist/cli/chunks/{llm-router-GJVKGRJL.js → llm-router-SIDXES23.js} +4 -4
  245. package/dist/cli/chunks/llm-router-service-3OSW67LC.js +2 -0
  246. package/dist/cli/chunks/{load-YKTPOYBE.js → load-EI2E2C3S.js} +2 -2
  247. package/dist/cli/chunks/load-test-7TRIH2WJ.js +2 -0
  248. package/dist/cli/chunks/{mcp-LT6R2IKS.js → mcp-IOE5WOCS.js} +2 -2
  249. package/dist/cli/chunks/{memory-4HKKOLRY.js → memory-DLYGJAP7.js} +5 -5
  250. package/dist/cli/chunks/memory-backend-G7ZW6Q2B.js +2 -0
  251. package/dist/cli/chunks/memory-handlers-TPF3KCO5.js +2 -0
  252. package/dist/cli/chunks/{multi-model-executor-2YPM2WTK.js → multi-model-executor-WHH4YCHM.js} +2 -2
  253. package/dist/cli/chunks/{opencode-installer-WBAJMH5K.js → opencode-installer-63FDZAMS.js} +2 -2
  254. package/dist/cli/chunks/{orchestrator-5W5WVMVJ.js → orchestrator-3LA776KK.js} +5 -5
  255. package/dist/cli/chunks/pattern-null-store-OU3ZC3NR.js +2 -0
  256. package/dist/cli/chunks/{pattern-usage-recorder-GXRMNPAZ.js → pattern-usage-recorder-NW54QUGI.js} +2 -2
  257. package/dist/cli/chunks/{pipeline-2NA4DRDA.js → pipeline-P3TYX6J6.js} +2 -2
  258. package/dist/cli/chunks/{platform-BGERNQ5V.js → platform-FNA2WLI6.js} +2 -2
  259. package/dist/cli/chunks/{plugin-L4EPVENR.js → plugin-NJS7BC2S.js} +2 -2
  260. package/dist/cli/chunks/{prime-radiant-advanced-wasm-RTQRTPTM.js → prime-radiant-advanced-wasm-NIAVL2OT.js} +2 -2
  261. package/dist/cli/chunks/project-root-GMOFJEKD.js +2 -0
  262. package/dist/cli/chunks/protocol-executor-AD345XRO.js +2 -0
  263. package/dist/cli/chunks/{protocol-handler-SYQXM6JK.js → protocol-handler-JU5C4JHY.js} +2 -2
  264. package/dist/cli/chunks/{prove-5O7GPJCU.js → prove-35VOSLYP.js} +2 -2
  265. package/dist/cli/chunks/qe-reasoning-bank-NLTP26RC.js +2 -0
  266. package/dist/cli/chunks/{quality-KIIDHGNF.js → quality-ET74X7HN.js} +2 -2
  267. package/dist/cli/chunks/{quality-gate-H65VECD3.js → quality-gate-FEDQISNB.js} +3 -3
  268. package/dist/cli/chunks/queen-coordinator-2TB4FWS6.js +2 -0
  269. package/dist/cli/chunks/real-embeddings-II6CXTCI.js +2 -0
  270. package/dist/cli/chunks/{ref-validation-CSBJOMZM.js → ref-validation-DTBPYCEB.js} +2 -2
  271. package/dist/cli/chunks/{roocode-installer-G7OVYXEN.js → roocode-installer-LYQEMR4J.js} +2 -2
  272. package/dist/cli/chunks/router-PLM3MWME.js +2 -0
  273. package/dist/cli/chunks/routing-feedback-I7VOX2HU.js +2 -0
  274. package/dist/cli/chunks/{routing-handler-ZNZPPI5Y.js → routing-handler-DJOJFPII.js} +2 -2
  275. package/dist/cli/chunks/{ruvector-commands-C6IG3OY3.js → ruvector-commands-VXYGJDPW.js} +2 -2
  276. package/dist/cli/chunks/rvf-dual-writer-GQZHFWO2.js +2 -0
  277. package/dist/cli/chunks/rvf-migration-adapter-3TVKBCAM.js +2 -0
  278. package/dist/cli/chunks/rvf-migration-coordinator-XUHKLMT6.js +2 -0
  279. package/dist/cli/chunks/rvf-native-adapter-5GUTYOWS.js +2 -0
  280. package/dist/cli/chunks/{rvf-store-integrity-3G6LFLT3.js → rvf-store-integrity-GA2ZYOEG.js} +2 -2
  281. package/dist/cli/chunks/safe-db-RZPQGLGQ.js +2 -0
  282. package/dist/cli/chunks/schedule-G7JMQDUX.js +2 -0
  283. package/dist/cli/chunks/scheduler-4SEGPCKD.js +2 -0
  284. package/dist/cli/chunks/{security-A3IMVLFM.js → security-MM6YOECX.js} +3 -3
  285. package/dist/cli/chunks/{shared-rvf-adapter-VHWQ6US5.js → shared-rvf-adapter-6AHPA3V5.js} +2 -2
  286. package/dist/cli/chunks/{shared-rvf-dual-writer-JB3QS7IG.js → shared-rvf-dual-writer-EYAVY2GZ.js} +2 -2
  287. package/dist/cli/chunks/sqlite-persistence-IVE4SQXR.js +2 -0
  288. package/dist/cli/chunks/{standalone-memory-DDNXCSBD.js → standalone-memory-A3PLB4CZ.js} +2 -2
  289. package/dist/cli/chunks/{status-handler-2HK7XPEK.js → status-handler-OSSFAP4Z.js} +2 -2
  290. package/dist/cli/chunks/{structural-health-DSJVLEPV.js → structural-health-PGY5XUNO.js} +2 -2
  291. package/dist/cli/chunks/{sync-NTUR53PI.js → sync-CWEHYGNN.js} +2 -2
  292. package/dist/cli/chunks/sync-PM6D7EQF.js +2 -0
  293. package/dist/cli/chunks/task-handler-LHMQ75W4.js +64 -0
  294. package/dist/cli/chunks/{task-handlers-VJR6EHRZ.js → task-handlers-S2TX5FTR.js} +4 -4
  295. package/dist/cli/chunks/test-4EGZZ6NJ.js +34 -0
  296. package/dist/cli/chunks/test-runner-process-72YACW6M.js +2 -0
  297. package/dist/cli/chunks/{test-scheduling-Q6QEEOS6.js → test-scheduling-YJQHH3XE.js} +3 -3
  298. package/dist/cli/chunks/token-bootstrap-DJNETMVW.js +2 -0
  299. package/dist/cli/chunks/{token-usage-YEEFWSSI.js → token-usage-WPNOJR6H.js} +2 -2
  300. package/dist/cli/chunks/{transformers-BZCHJJJT.js → transformers-4MRPXCPU.js} +2 -2
  301. package/dist/cli/chunks/tree-sitter-wasm-parser-UVWSDXFR.js +2 -0
  302. package/dist/cli/chunks/{types-4AOKZYOX.js → types-6P5FB4EB.js} +2 -2
  303. package/dist/cli/chunks/unified-memory-2VMGSGQL.js +2 -0
  304. package/dist/cli/chunks/unified-memory-hnsw-3KULVD3N.js +2 -0
  305. package/dist/cli/chunks/unified-persistence-QCSLU2SV.js +2 -0
  306. package/dist/cli/chunks/{upgrade-2MWW6BT2.js → upgrade-4ICTN63Y.js} +2 -2
  307. package/dist/cli/chunks/{validate-PAEV3GT5.js → validate-HQF5GZ7L.js} +2 -2
  308. package/dist/cli/chunks/{validate-swarm-ZIXACK5K.js → validate-swarm-45JYG7VW.js} +2 -2
  309. package/dist/cli/chunks/visual-security-ZYP2KPH7.js +2 -0
  310. package/dist/cli/chunks/{web-tree-sitter-VLTXZFAB.js → web-tree-sitter-UOTWZLNH.js} +2 -2
  311. package/dist/cli/chunks/{windsurf-installer-VELMLOZF.js → windsurf-installer-WDWSBXGN.js} +2 -2
  312. package/dist/cli/chunks/witness-chain-5QRT7EMX.js +2 -0
  313. package/dist/cli/chunks/witness-chain-DOYMNPC7.js +2 -0
  314. package/dist/cli/chunks/witness-chain-repair-CUF2AFQB.js +2 -0
  315. package/dist/cli/chunks/{witness-chain-verifier-MIDWD4JS.js → witness-chain-verifier-JB42X62J.js} +2 -2
  316. package/dist/cli/chunks/{witness-key-manager-OSVCWOB2.js → witness-key-manager-LXXO6L2G.js} +2 -2
  317. package/dist/cli/chunks/{workflow-MK7A7QCX.js → workflow-6ARK47NF.js} +4 -4
  318. package/dist/cli/chunks/workflow-orchestrator-RYDDWIXN.js +2 -0
  319. package/dist/cli/chunks/wrappers-CYQBOMPL.js +2 -0
  320. package/dist/cli/commands/code.js +4 -0
  321. package/dist/cli/commands/hooks-handlers/hooks-dream-learning.js +10 -2
  322. package/dist/cli/commands/test.js +26 -4
  323. package/dist/cli/handlers/task-handler.d.ts +5 -0
  324. package/dist/cli/handlers/task-handler.js +21 -1
  325. package/dist/cli/utils/task-result.d.ts +11 -0
  326. package/dist/cli/utils/task-result.js +39 -0
  327. package/dist/coordination/handlers/test-execution-handlers.js +137 -59
  328. package/dist/coordination/mincut/mincut-persistence.js +29 -25
  329. package/dist/domains/code-intelligence/coordinator.d.ts +4 -0
  330. package/dist/domains/code-intelligence/coordinator.js +46 -13
  331. package/dist/domains/code-intelligence/interfaces.d.ts +10 -1
  332. package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +37 -7
  333. package/dist/domains/code-intelligence/services/semantic-analyzer.js +135 -62
  334. package/dist/domains/code-intelligence/services/text-relevance.d.ts +32 -0
  335. package/dist/domains/code-intelligence/services/text-relevance.js +63 -0
  336. package/dist/domains/learning-optimization/services/learning-coordinator.js +1 -1
  337. package/dist/domains/quality-assessment/coordinator.js +2 -1
  338. package/dist/domains/test-execution/coordinator.d.ts +3 -1
  339. package/dist/domains/test-execution/coordinator.js +21 -7
  340. package/dist/domains/test-execution/interfaces.d.ts +17 -0
  341. package/dist/domains/test-execution/plugin.js +8 -2
  342. package/dist/domains/test-execution/services/flaky-detector.d.ts +9 -1
  343. package/dist/domains/test-execution/services/flaky-detector.js +26 -8
  344. package/dist/domains/test-execution/services/retry-handler.d.ts +9 -1
  345. package/dist/domains/test-execution/services/retry-handler.js +56 -12
  346. package/dist/domains/test-execution/services/runner-test-cases.d.ts +2 -0
  347. package/dist/domains/test-execution/services/runner-test-cases.js +7 -3
  348. package/dist/domains/test-execution/services/test-executor.d.ts +6 -1
  349. package/dist/domains/test-execution/services/test-executor.js +97 -14
  350. package/dist/domains/visual-accessibility/coordinator.d.ts +15 -7
  351. package/dist/domains/visual-accessibility/coordinator.js +15 -7
  352. package/dist/domains/visual-accessibility/interfaces.d.ts +27 -3
  353. package/dist/domains/visual-accessibility/services/accessibility-contrast.d.ts +39 -0
  354. package/dist/domains/visual-accessibility/services/accessibility-contrast.js +93 -0
  355. package/dist/domains/visual-accessibility/services/accessibility-tester-browser.d.ts +18 -3
  356. package/dist/domains/visual-accessibility/services/accessibility-tester-browser.js +50 -40
  357. package/dist/domains/visual-accessibility/services/accessibility-tester-checks.d.ts +27 -0
  358. package/dist/domains/visual-accessibility/services/accessibility-tester-checks.js +137 -0
  359. package/dist/domains/visual-accessibility/services/accessibility-tester.d.ts +5 -0
  360. package/dist/domains/visual-accessibility/services/accessibility-tester.js +43 -24
  361. package/dist/domains/visual-accessibility/services/browser-swarm-coordinator.d.ts +2 -3
  362. package/dist/domains/visual-accessibility/services/browser-swarm-coordinator.js +8 -14
  363. package/dist/feedback/coverage-learner.js +13 -9
  364. package/dist/feedback/test-outcome-tracker.js +13 -9
  365. package/dist/governance/witness-chain.d.ts +5 -0
  366. package/dist/governance/witness-chain.js +22 -6
  367. package/dist/init/copilot-installer.d.ts +6 -0
  368. package/dist/init/copilot-installer.js +37 -17
  369. package/dist/init/platform-config-generator.d.ts +10 -0
  370. package/dist/init/platform-config-generator.js +26 -1
  371. package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts +22 -0
  372. package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +115 -45
  373. package/dist/integrations/agentic-flow/reasoning-bank/pattern-evolution.d.ts +6 -0
  374. package/dist/integrations/agentic-flow/reasoning-bank/pattern-evolution.js +51 -33
  375. package/dist/integrations/agentic-flow/reasoning-bank/trajectory-tracker.js +17 -9
  376. package/dist/integrations/embeddings/cache/EmbeddingCache.d.ts +8 -0
  377. package/dist/integrations/embeddings/cache/EmbeddingCache.js +24 -10
  378. package/dist/integrations/ruvector/delta-tracker.d.ts +11 -0
  379. package/dist/integrations/ruvector/delta-tracker.js +16 -0
  380. package/dist/integrations/ruvector/sona-persistence.d.ts +10 -0
  381. package/dist/integrations/ruvector/sona-persistence.js +49 -24
  382. package/dist/kernel/unified-memory.d.ts +32 -0
  383. package/dist/kernel/unified-memory.js +76 -8
  384. package/dist/learning/aqe-learning-engine.js +1 -1
  385. package/dist/learning/embed-and-insert-pattern.js +4 -2
  386. package/dist/learning/embedder-endpoint-client.d.ts +76 -0
  387. package/dist/learning/embedder-endpoint-client.js +201 -13
  388. package/dist/learning/embedding-space-registry.d.ts +75 -0
  389. package/dist/learning/embedding-space-registry.js +142 -0
  390. package/dist/learning/embedding-space.d.ts +12 -0
  391. package/dist/learning/embedding-space.js +17 -0
  392. package/dist/learning/experience-capture-middleware.js +25 -13
  393. package/dist/learning/experience-capture.js +1 -1
  394. package/dist/learning/experience-consolidation.d.ts +18 -0
  395. package/dist/learning/experience-consolidation.js +55 -8
  396. package/dist/learning/experience-space-verification.d.ts +71 -0
  397. package/dist/learning/experience-space-verification.js +147 -0
  398. package/dist/learning/pattern-lifecycle.d.ts +40 -4
  399. package/dist/learning/pattern-lifecycle.js +153 -76
  400. package/dist/learning/pattern-null-store.d.ts +5 -0
  401. package/dist/learning/pattern-null-store.js +8 -0
  402. package/dist/learning/pattern-promotion.js +6 -3
  403. package/dist/learning/pattern-store.d.ts +6 -0
  404. package/dist/learning/pattern-store.js +19 -6
  405. package/dist/learning/qe-reasoning-bank.js +2 -2
  406. package/dist/learning/real-embeddings.d.ts +3 -0
  407. package/dist/learning/real-embeddings.js +52 -12
  408. package/dist/learning/real-qe-reasoning-bank.d.ts +5 -0
  409. package/dist/learning/real-qe-reasoning-bank.js +77 -47
  410. package/dist/learning/rvf-pattern-store.js +6 -2
  411. package/dist/learning/sqlite-persistence.d.ts +6 -0
  412. package/dist/learning/sqlite-persistence.js +10 -0
  413. package/dist/mcp/bundle.js +699 -619
  414. package/dist/mcp/entry.js +4 -0
  415. package/dist/mcp/handlers/domain-handler-configs.js +2 -0
  416. package/dist/mcp/handlers/trajectory-judge.js +1 -1
  417. package/dist/mcp/protocol-server.js +1 -0
  418. package/dist/mcp/tools/visual-accessibility/index.js +8 -2
  419. package/dist/mcp/types.d.ts +6 -0
  420. package/dist/optimization/session-cache.d.ts +17 -1
  421. package/dist/optimization/session-cache.js +40 -36
  422. package/dist/planning/goap-planner.d.ts +6 -0
  423. package/dist/planning/goap-planner.js +35 -19
  424. package/dist/planning/plan-executor.js +24 -15
  425. package/dist/routing/co-execution-repository.js +12 -9
  426. package/dist/routing/routing-feedback.d.ts +8 -0
  427. package/dist/routing/routing-feedback.js +46 -24
  428. package/dist/routing/routing-outcomes-migration.js +7 -2
  429. package/dist/shared/embeddings/index.d.ts +2 -2
  430. package/dist/shared/embeddings/index.js +1 -1
  431. package/dist/shared/embeddings/nomic-embedder.d.ts +8 -2
  432. package/dist/shared/embeddings/nomic-embedder.js +19 -11
  433. package/dist/shared/embeddings/ollama-client.d.ts +28 -2
  434. package/dist/shared/embeddings/ollama-client.js +84 -22
  435. package/dist/shared/embeddings/types.d.ts +15 -0
  436. package/dist/shared/embeddings/types.js +4 -0
  437. package/dist/shared/llm/spend-ledger.d.ts +9 -0
  438. package/dist/shared/llm/spend-ledger.js +64 -39
  439. package/dist/shared/pytest-junit-report.d.ts +93 -0
  440. package/dist/shared/pytest-junit-report.js +241 -0
  441. package/dist/shared/sqlite-lock-wait.d.ts +27 -0
  442. package/dist/shared/sqlite-lock-wait.js +37 -0
  443. package/dist/shared/sqlite-write-queue.d.ts +28 -0
  444. package/dist/shared/sqlite-write-queue.js +38 -0
  445. package/dist/shared/test-runner-project.d.ts +119 -0
  446. package/dist/shared/test-runner-project.js +301 -0
  447. package/dist/skills/security-visual-testing/index.d.ts +3 -1
  448. package/dist/skills/security-visual-testing/index.js +49 -35
  449. package/dist/skills/security-visual-testing/types.d.ts +19 -3
  450. package/dist/workers/workers/heartbeat-scheduler.js +5 -5
  451. package/dist/workers/workers/learning-consolidation.js +8 -7
  452. package/package.json +1 -1
  453. package/dist/cli/chunks/adapter-QU6INSKP.js +0 -2
  454. package/dist/cli/chunks/aqe-learning-engine-PAJPENJD.js +0 -2
  455. package/dist/cli/chunks/base-OTGSN6IC.js +0 -2
  456. package/dist/cli/chunks/browser-workflow-WLZGR6SB.js +0 -2
  457. package/dist/cli/chunks/chunk-2LUTPMBO.js +0 -21
  458. package/dist/cli/chunks/chunk-3HVFIITW.js +0 -2
  459. package/dist/cli/chunks/chunk-4D4CWP72.js +0 -2
  460. package/dist/cli/chunks/chunk-5KA5TVPR.js +0 -6
  461. package/dist/cli/chunks/chunk-6NBRMD25.js +0 -13
  462. package/dist/cli/chunks/chunk-7O45RQHF.js +0 -153
  463. package/dist/cli/chunks/chunk-EMSZVUYA.js +0 -29
  464. package/dist/cli/chunks/chunk-G6RDCCFV.js +0 -4
  465. package/dist/cli/chunks/chunk-HH4ED4F7.js +0 -744
  466. package/dist/cli/chunks/chunk-Q6I4SIUU.js +0 -65
  467. package/dist/cli/chunks/chunk-QGBGSQ2E.js +0 -14
  468. package/dist/cli/chunks/chunk-QRKTBSZT.js +0 -27
  469. package/dist/cli/chunks/chunk-SHRI7TKJ.js +0 -62
  470. package/dist/cli/chunks/chunk-TX2CHQD7.js +0 -2
  471. package/dist/cli/chunks/chunk-UGYM4U44.js +0 -2
  472. package/dist/cli/chunks/chunk-VY4U6DPO.js +0 -12
  473. package/dist/cli/chunks/chunk-WNTA4YKE.js +0 -14
  474. package/dist/cli/chunks/chunk-XHLYGXYE.js +0 -2
  475. package/dist/cli/chunks/client-KKRNPX4F.js +0 -2
  476. package/dist/cli/chunks/copilot-installer-BHPDSELY.js +0 -3
  477. package/dist/cli/chunks/core-handlers-47MPMED7.js +0 -2
  478. package/dist/cli/chunks/cross-domain-router-U6MBFHEC.js +0 -2
  479. package/dist/cli/chunks/daemon-AXLVPKVO.js +0 -18
  480. package/dist/cli/chunks/dream-76L6EEN7.js +0 -2
  481. package/dist/cli/chunks/embed-and-insert-pattern-B6MNHICW.js +0 -3
  482. package/dist/cli/chunks/experience-capture-middleware-SUFILYPW.js +0 -40
  483. package/dist/cli/chunks/file-discovery-VSFKZ3LJ.js +0 -2
  484. package/dist/cli/chunks/heartbeat-scheduler-NIK3KKEH.js +0 -2
  485. package/dist/cli/chunks/hnsw-adapter-WJG7LUJJ.js +0 -2
  486. package/dist/cli/chunks/hnsw-index-D6PRI5HC.js +0 -2
  487. package/dist/cli/chunks/hybrid-backend-RIUR3I7F.js +0 -2
  488. package/dist/cli/chunks/impact-analyzer-C36YYTJ5.js +0 -2
  489. package/dist/cli/chunks/init-wizard-JCKNGIGT.js +0 -2
  490. package/dist/cli/chunks/kernel-F7ILJTYD.js +0 -2
  491. package/dist/cli/chunks/knowledge-graph-VTXDBHB2.js +0 -2
  492. package/dist/cli/chunks/llm-router-service-TNOWQINA.js +0 -2
  493. package/dist/cli/chunks/load-test-FPVBK2EV.js +0 -2
  494. package/dist/cli/chunks/memory-backend-2QE7O67A.js +0 -2
  495. package/dist/cli/chunks/memory-handlers-X4CMVBXB.js +0 -2
  496. package/dist/cli/chunks/pattern-null-store-UI35ORHW.js +0 -2
  497. package/dist/cli/chunks/project-root-S7WDFTMU.js +0 -2
  498. package/dist/cli/chunks/protocol-executor-OPANXQVB.js +0 -2
  499. package/dist/cli/chunks/qe-reasoning-bank-3OTF4DYQ.js +0 -2
  500. package/dist/cli/chunks/queen-coordinator-WTYH4TAN.js +0 -2
  501. package/dist/cli/chunks/real-embeddings-DYIOLKQ3.js +0 -2
  502. package/dist/cli/chunks/router-DBBW4NC2.js +0 -2
  503. package/dist/cli/chunks/routing-feedback-W35QHCL4.js +0 -2
  504. package/dist/cli/chunks/rvf-dual-writer-X3NSL25Z.js +0 -2
  505. package/dist/cli/chunks/rvf-migration-adapter-TZR7GDOK.js +0 -2
  506. package/dist/cli/chunks/rvf-migration-coordinator-4ATTHGHD.js +0 -2
  507. package/dist/cli/chunks/rvf-native-adapter-HD25ZYV5.js +0 -2
  508. package/dist/cli/chunks/safe-db-ZS2QKANY.js +0 -2
  509. package/dist/cli/chunks/schedule-ZH6VNA32.js +0 -2
  510. package/dist/cli/chunks/scheduler-T6CD74B6.js +0 -2
  511. package/dist/cli/chunks/sqlite-persistence-47WU5EKZ.js +0 -2
  512. package/dist/cli/chunks/sync-3MUV6S5E.js +0 -2
  513. package/dist/cli/chunks/task-handler-74MZN2EO.js +0 -62
  514. package/dist/cli/chunks/test-O6FK3FVF.js +0 -34
  515. package/dist/cli/chunks/test-runner-process-2NPW3UDQ.js +0 -2
  516. package/dist/cli/chunks/token-bootstrap-TTRCECLP.js +0 -2
  517. package/dist/cli/chunks/tree-sitter-wasm-parser-RZAND65G.js +0 -2
  518. package/dist/cli/chunks/unified-memory-FZ5K2C7W.js +0 -2
  519. package/dist/cli/chunks/unified-memory-hnsw-VREWX56M.js +0 -2
  520. package/dist/cli/chunks/unified-persistence-YZGMKX6B.js +0 -2
  521. package/dist/cli/chunks/visual-security-GXGSFBVA.js +0 -2
  522. package/dist/cli/chunks/witness-chain-MRJKVCOW.js +0 -2
  523. package/dist/cli/chunks/witness-chain-WWHJKITG.js +0 -2
  524. package/dist/cli/chunks/witness-chain-repair-5SAXPETG.js +0 -2
  525. package/dist/cli/chunks/workflow-orchestrator-SG7DV72E.js +0 -2
  526. package/dist/cli/chunks/wrappers-5QFMCKXL.js +0 -2
@@ -0,0 +1,119 @@
1
+ /**
2
+ * #1247: the runner project a test file belongs to.
3
+ *
4
+ * Vitest and Jest load their configuration (setup files, aliases, include
5
+ * patterns, environment) from the directory they are started in. In a
6
+ * monorepo whose packages have their own config (`apps/webapp/vitest.config.ts`)
7
+ * a run started at the repository root never loads that package's setup, so
8
+ * the package's tests fail or produce no report. Each test file is therefore
9
+ * run from the nearest directory, at or above it, with runner configuration,
10
+ * but never from above the project root. Only real configuration counts, so a
11
+ * workspace package without its own config runs from the root that defines
12
+ * its project.
13
+ *
14
+ * A run from the current working directory is kept whenever that directory is
15
+ * already inside the file's runner project (a single-project repository, or a
16
+ * server started inside the package), so those runs behave as before.
17
+ *
18
+ * #1272: a package with its own config runs from that package, even when the
19
+ * root config also lists it in `test.projects` (or a `vitest.workspace.*`).
20
+ * Settings that only the root config adds to that project (its setup files,
21
+ * aliases or environment) are then not applied; the package's own config is
22
+ * what runs. A package without its own config still runs from the root.
23
+ *
24
+ * #1272: `vite.config.*` counts only when its text contains `test:`. The
25
+ * config is code, and reading what it exports would mean running it, so a
26
+ * `test` block built some other way (spread from another module, say) is not
27
+ * seen and a `test:` that only appears in a comment is. Name the runner config
28
+ * `vitest.config.*` for an exact match.
29
+ *
30
+ * #1248: a Python test file belongs to the nearest directory with pytest
31
+ * configuration instead (`pytest.ini`, `pyproject.toml` with
32
+ * `[tool.pytest.ini_options]`, `setup.cfg` with `[tool:pytest]`, `tox.ini`
33
+ * with `[pytest]`), and JavaScript files ignore that configuration. A
34
+ * `conftest.py` marks a pytest project for detection but is not a directory
35
+ * to run from: it is often in `tests/`, and pytest started there would not
36
+ * have the project root on `sys.path`.
37
+ */
38
+ import { Result } from './types';
39
+ /**
40
+ * Files whose presence makes a directory a Vitest or Jest project. A root
41
+ * workspace file (`vitest.workspace.*`) counts too: its packages run from it.
42
+ */
43
+ export declare const RUNNER_CONFIG_FILES: readonly string[];
44
+ export interface RunnerProjectOptions {
45
+ /** Directory runs start in today; defaults to process.cwd(). */
46
+ cwd?: string;
47
+ /** Highest directory the search may reach; defaults to findProjectRoot(). */
48
+ boundary?: string;
49
+ /** Directories already checked, so files that share a directory check it once. */
50
+ checked?: Map<string, boolean>;
51
+ }
52
+ /** A set of test files that run together from one directory. */
53
+ export interface RunnerProjectGroup {
54
+ cwd: string;
55
+ files: string[];
56
+ }
57
+ /** A runner whose project configuration can be recognised from its files. */
58
+ export type RunnerFramework = 'vitest' | 'jest';
59
+ /** True when `dir` holds a Vitest or Jest configuration. */
60
+ export declare function isRunnerProjectDir(dir: string): boolean;
61
+ /**
62
+ * #1248: true when `dir` holds pytest configuration; with `conftest`, a
63
+ * `conftest.py` counts too (see the header note).
64
+ */
65
+ export declare function isPytestProjectDir(dir: string, conftest?: boolean): boolean;
66
+ /**
67
+ * #1248: true when `dir`, or a directory above it no higher than `boundary`,
68
+ * is configured for pytest (including a `conftest.py`).
69
+ */
70
+ export declare function isPytestProject(dir: string, boundary?: string): boolean;
71
+ /**
72
+ * #1272: the runner configured by the runner project that `dir` belongs to:
73
+ * the nearest directory at or above `dir`, no higher than `boundary`, with
74
+ * runner configuration. Jest config (`jest.config.*`, or a `jest` key in
75
+ * package.json) means jest; Vitest config (`vitest.config.*`,
76
+ * `vitest.workspace.*`, a `vite.config.*` with `test`, or a `vitest` key)
77
+ * means vitest. Undefined when no project is found or it configures both, so
78
+ * the caller keeps its own choice.
79
+ */
80
+ export declare function runnerFrameworkFor(dir: string, boundary?: string): RunnerFramework | undefined;
81
+ /**
82
+ * The nearest directory at or above `file` with runner configuration, searching no
83
+ * higher than `boundary`. Undefined when the file lies outside the boundary or
84
+ * no directory on the way has runner configuration.
85
+ */
86
+ export declare function findRunnerProjectDir(file: string, boundary: string, cwd?: string, checked?: Map<string, boolean>): string | undefined;
87
+ /**
88
+ * Directory to start the runner in for `file`: its runner project, unless the
89
+ * current directory is already inside that project (or none is found), in
90
+ * which case the current directory is kept.
91
+ */
92
+ export declare function runnerCwdFor(file: string, options?: RunnerProjectOptions): string;
93
+ /**
94
+ * Group `files` by the directory each must run from, in first-seen order.
95
+ * Files keep the spelling they were given. #1248: Python files never share a
96
+ * group with other files, since only pytest runs them.
97
+ */
98
+ export declare function groupByRunnerProject(files: readonly string[], options?: RunnerProjectOptions): RunnerProjectGroup[];
99
+ /** Test files to run, and the directory to run them from when the caller named one. */
100
+ export interface TestRunTargets {
101
+ testFiles: string[];
102
+ projectRoot?: string;
103
+ }
104
+ /**
105
+ * Handler-side check for an execute-tests payload. `testFiles` must name
106
+ * files or directories inside the project (#1126). An explicit `projectRoot`
107
+ * must be a directory inside the project, checked by realpath so `..`, an
108
+ * outside absolute path or a symlink pointing out is refused; relative test
109
+ * files are then read from it, and every path is returned absolute.
110
+ */
111
+ export declare function requireTestRunTargets(taskType: string, testFiles: unknown, projectRoot: unknown): Promise<Result<TestRunTargets, Error>>;
112
+ /**
113
+ * An explicit `projectRoot` (MCP `test_execute_parallel`, CLI
114
+ * `aqe test execute --project-root`): a directory inside the project, checked
115
+ * by realpath so `..`, an outside absolute path or a symlink pointing out is
116
+ * refused. Returns the absolute directory.
117
+ */
118
+ export declare function requireRunProjectRoot(taskType: string, projectRoot: unknown): Promise<Result<string, Error>>;
119
+ //# sourceMappingURL=test-runner-project.d.ts.map
@@ -0,0 +1,301 @@
1
+ /**
2
+ * #1247: the runner project a test file belongs to.
3
+ *
4
+ * Vitest and Jest load their configuration (setup files, aliases, include
5
+ * patterns, environment) from the directory they are started in. In a
6
+ * monorepo whose packages have their own config (`apps/webapp/vitest.config.ts`)
7
+ * a run started at the repository root never loads that package's setup, so
8
+ * the package's tests fail or produce no report. Each test file is therefore
9
+ * run from the nearest directory, at or above it, with runner configuration,
10
+ * but never from above the project root. Only real configuration counts, so a
11
+ * workspace package without its own config runs from the root that defines
12
+ * its project.
13
+ *
14
+ * A run from the current working directory is kept whenever that directory is
15
+ * already inside the file's runner project (a single-project repository, or a
16
+ * server started inside the package), so those runs behave as before.
17
+ *
18
+ * #1272: a package with its own config runs from that package, even when the
19
+ * root config also lists it in `test.projects` (or a `vitest.workspace.*`).
20
+ * Settings that only the root config adds to that project (its setup files,
21
+ * aliases or environment) are then not applied; the package's own config is
22
+ * what runs. A package without its own config still runs from the root.
23
+ *
24
+ * #1272: `vite.config.*` counts only when its text contains `test:`. The
25
+ * config is code, and reading what it exports would mean running it, so a
26
+ * `test` block built some other way (spread from another module, say) is not
27
+ * seen and a `test:` that only appears in a comment is. Name the runner config
28
+ * `vitest.config.*` for an exact match.
29
+ *
30
+ * #1248: a Python test file belongs to the nearest directory with pytest
31
+ * configuration instead (`pytest.ini`, `pyproject.toml` with
32
+ * `[tool.pytest.ini_options]`, `setup.cfg` with `[tool:pytest]`, `tox.ini`
33
+ * with `[pytest]`), and JavaScript files ignore that configuration. A
34
+ * `conftest.py` marks a pytest project for detection but is not a directory
35
+ * to run from: it is often in `tests/`, and pytest started there would not
36
+ * have the project root on `sys.path`.
37
+ */
38
+ import { existsSync, readFileSync, realpathSync, statSync } from 'node:fs';
39
+ import * as path from 'node:path';
40
+ import { findProjectRoot } from '../kernel/project-root.js';
41
+ import { CallerInputError } from './error-utils.js';
42
+ import { requirePayloadFiles, requirePayloadPath } from './io/payload-path-guard.js';
43
+ import { isPythonTestFile } from './pytest-junit-report.js';
44
+ import { safeJsonParse } from './safe-json.js';
45
+ import { runnerFilePath } from './test-runner-args.js';
46
+ import { ok, err } from './types/index.js';
47
+ const CONFIG_EXTENSIONS = ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs'];
48
+ /**
49
+ * Files whose presence makes a directory a Vitest or Jest project. A root
50
+ * workspace file (`vitest.workspace.*`) counts too: its packages run from it.
51
+ */
52
+ export const RUNNER_CONFIG_FILES = [
53
+ ...CONFIG_EXTENSIONS.map(ext => `vitest.config.${ext}`),
54
+ ...[...CONFIG_EXTENSIONS, 'json'].map(ext => `vitest.workspace.${ext}`),
55
+ ...CONFIG_EXTENSIONS.map(ext => `jest.config.${ext}`),
56
+ 'jest.config.json',
57
+ ];
58
+ /** Vite configs: a runner project only when they configure `test`. */
59
+ const VITE_CONFIG_FILES = CONFIG_EXTENSIONS.map(ext => `vite.config.${ext}`);
60
+ /** Largest config or package.json read while looking for a runner setup. */
61
+ const MAX_MARKER_BYTES = 1024 * 1024;
62
+ function realDir(dir) {
63
+ try {
64
+ return realpathSync(dir);
65
+ }
66
+ catch {
67
+ return path.resolve(dir);
68
+ }
69
+ }
70
+ /** True when `candidate` is `root` or lies beneath it (both absolute). */
71
+ function isWithin(root, candidate) {
72
+ const relative = path.relative(root, candidate);
73
+ return relative === '' || (relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));
74
+ }
75
+ function readSmallFile(file) {
76
+ try {
77
+ const stat = statSync(file);
78
+ if (!stat.isFile() || stat.size > MAX_MARKER_BYTES)
79
+ return undefined;
80
+ return readFileSync(file, 'utf-8');
81
+ }
82
+ catch {
83
+ return undefined;
84
+ }
85
+ }
86
+ /**
87
+ * Runners a package.json in `dir` configures (a top-level `jest` or `vitest`
88
+ * key). Listing a runner as a dependency or in `scripts.test` does not count:
89
+ * in a workspace the packages do that while the root config defines their
90
+ * projects and setup.
91
+ */
92
+ function packageRunnerKeys(dir) {
93
+ const text = readSmallFile(path.join(dir, 'package.json'));
94
+ if (text === undefined)
95
+ return [];
96
+ let pkg;
97
+ try {
98
+ pkg = safeJsonParse(text);
99
+ }
100
+ catch {
101
+ return [];
102
+ }
103
+ if (!pkg || typeof pkg !== 'object')
104
+ return [];
105
+ return ['vitest', 'jest'].filter(key => pkg[key] !== undefined);
106
+ }
107
+ /** True when a `vite.config.*` in `dir` mentions `test:` (see the header note). */
108
+ function viteConfiguresTest(dir) {
109
+ return VITE_CONFIG_FILES.some(name => {
110
+ const text = readSmallFile(path.join(dir, name));
111
+ return text !== undefined && /\btest\s*:/.test(text);
112
+ });
113
+ }
114
+ /** The runners whose configuration `dir` holds. */
115
+ function configuredRunners(dir) {
116
+ const runners = new Set(packageRunnerKeys(dir));
117
+ for (const name of RUNNER_CONFIG_FILES) {
118
+ if (existsSync(path.join(dir, name)))
119
+ runners.add(name.startsWith('jest.') ? 'jest' : 'vitest');
120
+ }
121
+ if (!runners.has('vitest') && viteConfiguresTest(dir))
122
+ runners.add('vitest');
123
+ return runners;
124
+ }
125
+ /** True when `dir` holds a Vitest or Jest configuration. */
126
+ export function isRunnerProjectDir(dir) {
127
+ return configuredRunners(dir).size > 0;
128
+ }
129
+ /** pytest configuration files, and the section each must contain (none: always). */
130
+ const PYTEST_CONFIG_SECTIONS = [
131
+ ['pytest.ini', undefined],
132
+ ['pyproject.toml', /^\s*\[tool\.pytest(?:\.ini_options)?\]/m],
133
+ ['tox.ini', /^\s*\[pytest\]/m],
134
+ ['setup.cfg', /^\s*\[tool:pytest\]/m],
135
+ ];
136
+ /**
137
+ * #1248: true when `dir` holds pytest configuration; with `conftest`, a
138
+ * `conftest.py` counts too (see the header note).
139
+ */
140
+ export function isPytestProjectDir(dir, conftest = false) {
141
+ if (conftest && existsSync(path.join(dir, 'conftest.py')))
142
+ return true;
143
+ return PYTEST_CONFIG_SECTIONS.some(([name, section]) => {
144
+ if (!section)
145
+ return existsSync(path.join(dir, name));
146
+ const text = readSmallFile(path.join(dir, name));
147
+ return text !== undefined && section.test(text);
148
+ });
149
+ }
150
+ /**
151
+ * #1248: true when `dir`, or a directory above it no higher than `boundary`,
152
+ * is configured for pytest (including a `conftest.py`).
153
+ */
154
+ export function isPytestProject(dir, boundary = findProjectRoot()) {
155
+ const root = realDir(boundary);
156
+ let current = realDir(dir);
157
+ const bounded = isWithin(root, current);
158
+ for (;;) {
159
+ if (isPytestProjectDir(current, true))
160
+ return true;
161
+ if (!bounded || current === root)
162
+ return false;
163
+ const parent = path.dirname(current);
164
+ if (parent === current)
165
+ return false;
166
+ current = parent;
167
+ }
168
+ }
169
+ /**
170
+ * #1272: the runner configured by the runner project that `dir` belongs to:
171
+ * the nearest directory at or above `dir`, no higher than `boundary`, with
172
+ * runner configuration. Jest config (`jest.config.*`, or a `jest` key in
173
+ * package.json) means jest; Vitest config (`vitest.config.*`,
174
+ * `vitest.workspace.*`, a `vite.config.*` with `test`, or a `vitest` key)
175
+ * means vitest. Undefined when no project is found or it configures both, so
176
+ * the caller keeps its own choice.
177
+ */
178
+ export function runnerFrameworkFor(dir, boundary = findProjectRoot()) {
179
+ const root = realDir(boundary);
180
+ let current = realDir(dir);
181
+ const bounded = isWithin(root, current);
182
+ for (;;) {
183
+ const runners = configuredRunners(current);
184
+ if (runners.size > 0)
185
+ return runners.size === 1 ? [...runners][0] : undefined;
186
+ if (!bounded || current === root)
187
+ return undefined;
188
+ const parent = path.dirname(current);
189
+ if (parent === current)
190
+ return undefined;
191
+ current = parent;
192
+ }
193
+ }
194
+ /**
195
+ * The nearest directory at or above `file` with runner configuration, searching no
196
+ * higher than `boundary`. Undefined when the file lies outside the boundary or
197
+ * no directory on the way has runner configuration.
198
+ */
199
+ export function findRunnerProjectDir(file, boundary, cwd = process.cwd(), checked = new Map()) {
200
+ const root = realDir(boundary);
201
+ let dir = path.dirname(runnerFilePath(file, cwd));
202
+ if (!isWithin(root, dir))
203
+ return undefined;
204
+ // #1248: Python files run from pytest config, other files from Vitest/Jest config.
205
+ const python = isPythonTestFile(file);
206
+ for (;;) {
207
+ const key = python ? `pytest:${dir}` : dir;
208
+ let isProject = checked.get(key);
209
+ if (isProject === undefined) {
210
+ isProject = python ? isPytestProjectDir(dir) : isRunnerProjectDir(dir);
211
+ checked.set(key, isProject);
212
+ }
213
+ if (isProject)
214
+ return dir;
215
+ if (dir === root)
216
+ return undefined;
217
+ const parent = path.dirname(dir);
218
+ if (parent === dir)
219
+ return undefined;
220
+ dir = parent;
221
+ }
222
+ }
223
+ /**
224
+ * Directory to start the runner in for `file`: its runner project, unless the
225
+ * current directory is already inside that project (or none is found), in
226
+ * which case the current directory is kept.
227
+ */
228
+ export function runnerCwdFor(file, options = {}) {
229
+ const cwd = options.cwd ?? process.cwd();
230
+ const project = findRunnerProjectDir(file, options.boundary ?? findProjectRoot(), cwd, options.checked);
231
+ if (!project || isWithin(project, realDir(cwd)))
232
+ return cwd;
233
+ return project;
234
+ }
235
+ /**
236
+ * Group `files` by the directory each must run from, in first-seen order.
237
+ * Files keep the spelling they were given. #1248: Python files never share a
238
+ * group with other files, since only pytest runs them.
239
+ */
240
+ export function groupByRunnerProject(files, options = {}) {
241
+ const resolved = {
242
+ cwd: options.cwd ?? process.cwd(),
243
+ boundary: options.boundary ?? findProjectRoot(),
244
+ checked: options.checked ?? new Map(),
245
+ };
246
+ const groups = new Map();
247
+ for (const file of files) {
248
+ const cwd = runnerCwdFor(file, resolved);
249
+ const key = `${isPythonTestFile(file) ? 'py' : 'js'}\0${cwd}`;
250
+ const group = groups.get(key);
251
+ if (group)
252
+ group.files.push(file);
253
+ else
254
+ groups.set(key, { cwd, files: [file] });
255
+ }
256
+ return [...groups.values()];
257
+ }
258
+ /**
259
+ * Handler-side check for an execute-tests payload. `testFiles` must name
260
+ * files or directories inside the project (#1126). An explicit `projectRoot`
261
+ * must be a directory inside the project, checked by realpath so `..`, an
262
+ * outside absolute path or a symlink pointing out is refused; relative test
263
+ * files are then read from it, and every path is returned absolute.
264
+ */
265
+ export async function requireTestRunTargets(taskType, testFiles, projectRoot) {
266
+ const fileOptions = { allowMissing: true, allowDirectory: true };
267
+ if (projectRoot === undefined) {
268
+ const confined = await requirePayloadFiles(taskType, 'testFiles', testFiles, fileOptions);
269
+ return confined.success ? ok({ testFiles: confined.value }) : confined;
270
+ }
271
+ const checked = await requireRunProjectRoot(taskType, projectRoot);
272
+ if (!checked.success)
273
+ return checked;
274
+ const root = checked.value;
275
+ const confined = await requirePayloadFiles(taskType, 'testFiles', testFiles, { ...fileOptions, basePath: root });
276
+ if (!confined.success)
277
+ return confined;
278
+ return ok({ testFiles: confined.value.map(file => path.resolve(root, file)), projectRoot: root });
279
+ }
280
+ /**
281
+ * An explicit `projectRoot` (MCP `test_execute_parallel`, CLI
282
+ * `aqe test execute --project-root`): a directory inside the project, checked
283
+ * by realpath so `..`, an outside absolute path or a symlink pointing out is
284
+ * refused. Returns the absolute directory.
285
+ */
286
+ export async function requireRunProjectRoot(taskType, projectRoot) {
287
+ const checked = await requirePayloadPath(taskType, 'projectRoot', projectRoot, { allowDirectory: true });
288
+ if (!checked.success)
289
+ return checked;
290
+ const root = path.resolve(realDir(process.cwd()), checked.value);
291
+ let isDirectory = false;
292
+ try {
293
+ isDirectory = statSync(root).isDirectory();
294
+ }
295
+ catch { /* reported below */ }
296
+ if (!isDirectory) {
297
+ return err(new CallerInputError(`Invalid ${taskType} payload: 'projectRoot' must be a directory inside the project.`));
298
+ }
299
+ return ok(root);
300
+ }
301
+ //# sourceMappingURL=test-runner-project.js.map
@@ -84,7 +84,9 @@ export declare class SecurityVisualTestingSkill implements ISecurityVisualTestin
84
84
  */
85
85
  validateURLSecurity(url: string): Promise<Result<URLSecurityValidation, Error>>;
86
86
  /**
87
- * Detect PII in screenshot
87
+ * Detect PII in screenshot.
88
+ * No OCR scanner is available, so the result says the screenshot was not
89
+ * scanned (#1228): detected is null and confidence -1, never "no PII found".
88
90
  */
89
91
  detectPII(screenshotPath: string): Promise<Result<PIIDetectionResult, Error>>;
90
92
  private ensureInitialized;
@@ -142,20 +142,17 @@ export class SecurityVisualTestingSkill {
142
142
  accessibilityReport = accessibilityResult.value;
143
143
  }
144
144
  }
145
- // Step 4: Detect PII in screenshots if enabled
145
+ // Step 4: Detect PII in screenshots if enabled. #1228: no scanner exists,
146
+ // so each screenshot is reported as not scanned, never as free of PII.
146
147
  if (this.config.pii.enabled && options.detectPII !== false) {
147
- // In a real implementation, this would scan all captured screenshots
148
- // For now, we'll generate a placeholder result
149
148
  for (const url of secureUrls) {
150
- piiDetections.push({
151
- detected: false,
152
- types: [],
153
- locations: [],
154
- screenshot: { original: `${url}-screenshot.png` },
155
- confidence: 0.95,
156
- });
149
+ const screenshot = visualReport.results.find((r) => r.url === url)?.screenshot.path.value ?? '';
150
+ const detection = await this.detectPII(screenshot);
151
+ if (detection.success)
152
+ piiDetections.push(detection.value);
157
153
  }
158
154
  }
155
+ const piiScanned = piiDetections.filter((p) => p.measured);
159
156
  // Step 5: Generate recommendations
160
157
  const recommendations = this.generateRecommendations(urlValidations, visualReport, accessibilityReport, piiDetections);
161
158
  // Build report
@@ -166,7 +163,7 @@ export class SecurityVisualTestingSkill {
166
163
  visualTestsPassed: visualReport.passed,
167
164
  visualTestsFailed: visualReport.failed,
168
165
  accessibilityIssues: accessibilityReport?.totalViolations ?? 0,
169
- piiDetections: piiDetections.filter((p) => p.detected).length,
166
+ piiDetections: piiScanned.length > 0 ? piiScanned.filter((p) => p.detected === true).length : -1,
170
167
  duration: Date.now() - startTime,
171
168
  },
172
169
  urlValidations,
@@ -216,14 +213,22 @@ export class SecurityVisualTestingSkill {
216
213
  return err(new Error(`Screenshot capture failed: ${screenshotResult.error.message}`));
217
214
  }
218
215
  const screenshot = screenshotResult.value;
219
- // Step 5: Detect PII if enabled
220
- let piiDetected = false;
216
+ // Step 5: Detect PII if enabled. #1228: unscanned is null, not false.
217
+ let piiDetected = null;
218
+ let piiNotMeasuredReason = 'PII NOT MEASURED: no PII scan was requested';
221
219
  let piiTypes = [];
222
220
  let maskedPath;
223
221
  if (this.config.pii.enabled && (options.maskPII ?? this.config.pii.autoMask)) {
224
- const piiResult = await this.detectPII(screenshot.path || 'screenshot.png');
225
- if (piiResult.success && piiResult.value.detected) {
226
- piiDetected = true;
222
+ const piiResult = await this.detectPII(screenshot.path || '');
223
+ if (!piiResult.success) {
224
+ piiNotMeasuredReason = `PII NOT MEASURED: ${piiResult.error.message}`;
225
+ }
226
+ else if (!piiResult.value.measured) {
227
+ piiNotMeasuredReason = piiResult.value.notMeasuredReason;
228
+ }
229
+ else {
230
+ piiDetected = piiResult.value.detected;
231
+ piiNotMeasuredReason = undefined;
227
232
  piiTypes = piiResult.value.types;
228
233
  maskedPath = piiResult.value.screenshot.masked;
229
234
  }
@@ -242,6 +247,7 @@ export class SecurityVisualTestingSkill {
242
247
  masked: maskedPath,
243
248
  },
244
249
  piiDetected,
250
+ ...(piiNotMeasuredReason ? { piiNotMeasuredReason } : {}),
245
251
  piiTypes,
246
252
  securityValidation: validation,
247
253
  timestamp: new Date(),
@@ -270,24 +276,18 @@ export class SecurityVisualTestingSkill {
270
276
  path: result.screenshot.path.value,
271
277
  timestamp: result.screenshot.timestamp,
272
278
  }));
279
+ // #1228: a missing diff is -1 and a new baseline is `new`, not a 0% pass or a failure
273
280
  const visualRegressions = visualReport.results.map((result) => ({
274
281
  viewport: result.viewport,
275
- diffPercentage: result.diff?.diffPercentage ?? 0,
276
- status: result.status === 'passed' ? 'passed' : 'failed',
282
+ diffPercentage: result.diff?.diffPercentage ?? -1,
283
+ status: result.status,
277
284
  }));
278
- // Detect layout shifts if enabled
285
+ // #1228: element positions are not compared across viewports, so layout
286
+ // shifts are reported as not measured instead of "no shifts detected".
279
287
  const layoutShifts = [];
280
- if (options.detectLayoutShifts) {
281
- // In a real implementation, this would analyze element positions across viewports
282
- // For now, we'll generate placeholder data
283
- layoutShifts.push({
284
- viewport: options.viewports[0],
285
- affectedElements: [],
286
- score: 0,
287
- severity: 'low',
288
- description: 'No significant layout shifts detected',
289
- });
290
- }
288
+ const layoutShiftsNotMeasured = options.detectLayoutShifts
289
+ ? { layoutShiftsMeasured: false, layoutShiftsNotMeasuredReason: 'layout shift detection is not implemented: element positions were not compared across viewports' }
290
+ : {};
291
291
  // Generate recommendations
292
292
  const recommendations = [];
293
293
  if (visualReport.failed > 0) {
@@ -301,6 +301,7 @@ export class SecurityVisualTestingSkill {
301
301
  viewports: options.viewports,
302
302
  screenshots,
303
303
  layoutShifts,
304
+ ...layoutShiftsNotMeasured,
304
305
  visualRegressions,
305
306
  recommendations,
306
307
  };
@@ -367,20 +368,22 @@ export class SecurityVisualTestingSkill {
367
368
  }
368
369
  }
369
370
  /**
370
- * Detect PII in screenshot
371
+ * Detect PII in screenshot.
372
+ * No OCR scanner is available, so the result says the screenshot was not
373
+ * scanned (#1228): detected is null and confidence -1, never "no PII found".
371
374
  */
372
375
  async detectPII(screenshotPath) {
373
376
  try {
374
- // In a real implementation, this would use OCR and pattern matching
375
- // For now, we'll return a placeholder result
376
377
  const result = {
377
- detected: false,
378
+ detected: null,
378
379
  types: [],
379
380
  locations: [],
380
381
  screenshot: {
381
382
  original: screenshotPath,
382
383
  },
383
- confidence: 0.95,
384
+ confidence: -1,
385
+ measured: false,
386
+ notMeasuredReason: 'PII NOT MEASURED: no screenshot PII scanner (OCR) is available, so the screenshot was not scanned',
384
387
  };
385
388
  return ok(result);
386
389
  }
@@ -454,6 +457,17 @@ export class SecurityVisualTestingSkill {
454
457
  affectedUrls: [], // Would need to track which URLs had PII
455
458
  });
456
459
  }
460
+ // #1228: an unscanned screenshot needs a manual check, it is not clean
461
+ const piiUnscanned = piiDetections.filter((p) => !p.measured);
462
+ if (piiUnscanned.length > 0) {
463
+ recommendations.push({
464
+ type: 'pii',
465
+ severity: 'medium',
466
+ description: `PII NOT MEASURED for ${piiUnscanned.length} screenshot(s): ${piiUnscanned[0].notMeasuredReason ?? 'not scanned'}`,
467
+ action: 'Review the screenshots for PII manually before sharing them',
468
+ affectedUrls: [],
469
+ });
470
+ }
457
471
  return recommendations;
458
472
  }
459
473
  }
@@ -27,14 +27,19 @@ export interface SecurityIssue {
27
27
  * PII detection result in screenshot
28
28
  */
29
29
  export interface PIIDetectionResult {
30
- detected: boolean;
30
+ /** null when no scan ran: not scanned is not "no PII found" (#1228). */
31
+ detected: boolean | null;
31
32
  types: PIIType[];
32
33
  locations: PIILocation[];
33
34
  screenshot: {
34
35
  original: string;
35
36
  masked?: string;
36
37
  };
38
+ /** -1 when no scan ran (#1228). */
37
39
  confidence: number;
40
+ /** false when the screenshot was not scanned; see notMeasuredReason (#1228). */
41
+ measured: boolean;
42
+ notMeasuredReason?: string;
38
43
  }
39
44
  /**
40
45
  * Types of PII that can be detected
@@ -77,6 +82,7 @@ export interface SecurityVisualAuditReport {
77
82
  visualTestsPassed: number;
78
83
  visualTestsFailed: number;
79
84
  accessibilityIssues: number;
85
+ /** Screenshots with PII found; -1 when no screenshot was scanned (#1228). */
80
86
  piiDetections: number;
81
87
  duration: number;
82
88
  };
@@ -126,7 +132,9 @@ export interface PIISafeScreenshot {
126
132
  original: string;
127
133
  masked?: string;
128
134
  };
129
- piiDetected: boolean;
135
+ /** null when the screenshot was not scanned for PII (#1228). */
136
+ piiDetected: boolean | null;
137
+ piiNotMeasuredReason?: string;
130
138
  piiTypes: PIIType[];
131
139
  securityValidation: URLSecurityValidation;
132
140
  timestamp: Date;
@@ -163,10 +171,18 @@ export interface ResponsiveVisualAuditReport {
163
171
  timestamp: Date;
164
172
  }>;
165
173
  layoutShifts: LayoutShift[];
174
+ /**
175
+ * false when layout shifts were requested but not measured: an empty
176
+ * `layoutShifts` list is then not a clean result (#1228).
177
+ */
178
+ layoutShiftsMeasured?: boolean;
179
+ layoutShiftsNotMeasuredReason?: string;
166
180
  visualRegressions: Array<{
167
181
  viewport: Viewport;
182
+ /** -1 when no diff was computed, e.g. a new baseline (#1228). */
168
183
  diffPercentage: number;
169
- status: 'passed' | 'failed';
184
+ /** `new`: no baseline existed, so nothing was compared. */
185
+ status: 'passed' | 'failed' | 'new';
170
186
  }>;
171
187
  recommendations: string[];
172
188
  }