@testmuai/kane-cli 0.8.5 → 0.8.6

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 (163) hide show
  1. package/dist/{ChatSurface-HAIVTS4J.js → ChatSurface-S2P7WMBI.js} +1 -1
  2. package/dist/{ChromeProfilePicker-5ILSVC2K.js → ChromeProfilePicker-7DTJK2QW.js} +1 -1
  3. package/dist/{CliFeedbackPrompt-LFKEYMKP.js → CliFeedbackPrompt-Y3OYZX54.js} +1 -1
  4. package/dist/{CliUploadProgress-Y7ITY2I7.js → CliUploadProgress-I3N5WDNJ.js} +1 -1
  5. package/dist/{ConfigView-OECNNCXC.js → ConfigView-EOYCKYJS.js} +1 -1
  6. package/dist/{EvidenceViewOffer-FODRAS6Z.js → EvidenceViewOffer-AQ3KB3EN.js} +1 -1
  7. package/dist/FolderPicker-RCHRYYC4.js +2 -0
  8. package/dist/{InfoBox-HWMHNWPM.js → InfoBox-QBXPPMM2.js} +1 -1
  9. package/dist/{LinksBox-TAGYCFFO.js → LinksBox-L24KON4U.js} +1 -1
  10. package/dist/{ProfilesView-QJBR3RCM.js → ProfilesView-H6XCTIXI.js} +1 -1
  11. package/dist/{ProjectPicker-PP75ILZU.js → ProjectPicker-F6JGF2B3.js} +1 -1
  12. package/dist/{SaveSessionPrompt-UCRET3II.js → SaveSessionPrompt-QGO65DZN.js} +1 -1
  13. package/dist/SingleShotApp-AY3XFEYT.js +2 -0
  14. package/dist/{SummaryBox-SLM3OFS2.js → SummaryBox-OZIZQY4B.js} +1 -1
  15. package/dist/TestMdRunView-RPW4MIJA.js +2 -0
  16. package/dist/{TestrunEvidenceTable-PTIBYAXO.js → TestrunEvidenceTable-A7WTTKTV.js} +1 -1
  17. package/dist/{WhoamiView-WPHMNYUV.js → WhoamiView-EB5AV27X.js} +1 -1
  18. package/dist/{app-download-GYQYLGT3.js → app-download-SQ4RDY3E.js} +1 -1
  19. package/dist/{auth-3DLNMZC2.js → auth-TW24FZQF.js} +1 -1
  20. package/dist/{binary-XJ3RF3VO.js → binary-5LMQJ3CZ.js} +1 -1
  21. package/dist/{bind-2N4Q6YKH.js → bind-SJ6DOVQ4.js} +2 -2
  22. package/dist/{bootstrap-5IHKW5SE.js → bootstrap-BTEXO6HX.js} +1 -1
  23. package/dist/bridge-GQJ35GTL.js +2 -0
  24. package/dist/{changelog-WCCTI47M.js → changelog-JLSLSA3Y.js} +1 -1
  25. package/dist/chunk-2DCNCH32.js +4 -0
  26. package/dist/{chunk-PEI2566X.js → chunk-2R7KL7YG.js} +1 -1
  27. package/dist/{chunk-T3XDMR5B.js → chunk-3LEVCW6R.js} +1 -1
  28. package/dist/{chunk-NLECZCMZ.js → chunk-3UUPP5W3.js} +1 -1
  29. package/dist/{chunk-PCOSE5SW.js → chunk-4NSP2NPT.js} +1 -1
  30. package/dist/{chunk-FTZPWXF7.js → chunk-4ONGF4NT.js} +1 -1
  31. package/dist/{chunk-ZFZ7YXEU.js → chunk-5COGCNED.js} +1 -1
  32. package/dist/{chunk-DCUT3GJA.js → chunk-7VZCXW74.js} +1 -1
  33. package/dist/{chunk-CGYSFLM2.js → chunk-A44G533S.js} +1 -1
  34. package/dist/{chunk-ZIRMSWKS.js → chunk-AO3PBE2V.js} +1 -1
  35. package/dist/{chunk-AJPLHW4T.js → chunk-ATWDQCDA.js} +1 -1
  36. package/dist/{chunk-UX3KPYTI.js → chunk-AWD56KGX.js} +1 -1
  37. package/dist/{chunk-YFLKS4UV.js → chunk-B4Q6FMIP.js} +3 -3
  38. package/dist/chunk-B5QGIUJA.js +26 -0
  39. package/dist/chunk-BN6AHQL7.js +17 -0
  40. package/dist/chunk-BRTARADN.js +4 -0
  41. package/dist/{chunk-BAL7E4OH.js → chunk-C4WTZSX4.js} +1 -1
  42. package/dist/{chunk-TCK3QMKY.js → chunk-CLLQQPBZ.js} +1 -1
  43. package/dist/{chunk-LA2EMSHE.js → chunk-CZUOGGUK.js} +1 -1
  44. package/dist/{chunk-FRSHEJUS.js → chunk-D4SRHIJ5.js} +1 -1
  45. package/dist/{chunk-Z2T7E5HM.js → chunk-DN3E6RT6.js} +2 -2
  46. package/dist/{chunk-PUFJEU46.js → chunk-DZCG7FFP.js} +1 -1
  47. package/dist/{chunk-CNNJ4U2L.js → chunk-E5S4BASB.js} +1 -1
  48. package/dist/{chunk-HQWLSA5M.js → chunk-ESC7AOCX.js} +1 -1
  49. package/dist/{chunk-W27F2NWA.js → chunk-EXERQHXV.js} +1 -1
  50. package/dist/{chunk-PWYEOBXV.js → chunk-FJYDEWOA.js} +1 -1
  51. package/dist/{chunk-35EUIBYJ.js → chunk-FMUCZWS3.js} +1 -1
  52. package/dist/{chunk-PB3GADUD.js → chunk-FUNKVREV.js} +1 -1
  53. package/dist/{chunk-GZ4X53ZA.js → chunk-FYS5VIOG.js} +2 -2
  54. package/dist/{chunk-HFCDUFV3.js → chunk-GC5U55MW.js} +1 -1
  55. package/dist/{chunk-RY6TFVAX.js → chunk-GELPKSLC.js} +1 -1
  56. package/dist/{chunk-5S46D5AJ.js → chunk-IGJIDN4U.js} +1 -1
  57. package/dist/{chunk-K2QV7FGP.js → chunk-INK66XQS.js} +1 -1
  58. package/dist/{chunk-EFRJNPBZ.js → chunk-IWM5EZC3.js} +2 -2
  59. package/dist/chunk-JCD6FP7A.js +5 -0
  60. package/dist/{chunk-M335FQYJ.js → chunk-JN44V63O.js} +2 -2
  61. package/dist/{chunk-GYF4CH62.js → chunk-KDXQNLVV.js} +2 -2
  62. package/dist/{chunk-O3AY6JHJ.js → chunk-KLTKEGDH.js} +1 -1
  63. package/dist/{chunk-MJ56GUKS.js → chunk-KQ2MYMOS.js} +1 -1
  64. package/dist/chunk-LN7233E2.js +20 -0
  65. package/dist/{chunk-KWKUMBHS.js → chunk-MKSTP2XN.js} +2 -2
  66. package/dist/{chunk-NHOHQBIF.js → chunk-NT3UETTV.js} +1 -1
  67. package/dist/{chunk-CCUGKBIH.js → chunk-OFW3ZVTP.js} +1 -1
  68. package/dist/{chunk-WLOGO44E.js → chunk-OYJBABRV.js} +1 -1
  69. package/dist/{chunk-JJWQUQJ2.js → chunk-P3RKXL3V.js} +1 -1
  70. package/dist/{chunk-MUGMUKSZ.js → chunk-PT7V5WDQ.js} +1 -1
  71. package/dist/chunk-Q4V2GK5U.js +2 -0
  72. package/dist/{chunk-3AJ3QSF5.js → chunk-QBG7XEGQ.js} +2 -2
  73. package/dist/{chunk-E3BXNQYE.js → chunk-QISE272H.js} +1 -1
  74. package/dist/{chunk-G4AFOZKU.js → chunk-QQAAPFIR.js} +1 -1
  75. package/dist/{chunk-PQUMOFT5.js → chunk-RDNKYRKY.js} +1 -1
  76. package/dist/{chunk-5NSYHRDN.js → chunk-RX5TZZNQ.js} +1 -1
  77. package/dist/{chunk-TJZMYU2W.js → chunk-RZLD7TPG.js} +1 -1
  78. package/dist/{chunk-66BSTNLD.js → chunk-S66MCU2Y.js} +1 -1
  79. package/dist/{chunk-WYST42WI.js → chunk-SORVX3KI.js} +1 -1
  80. package/dist/{chunk-KX2GOJ4C.js → chunk-SQC4P2Q7.js} +1 -1
  81. package/dist/{chunk-JRQKUQWL.js → chunk-SQGBFCFO.js} +1 -1
  82. package/dist/{chunk-T5LKD2OB.js → chunk-SS5TOK2J.js} +1 -1
  83. package/dist/{chunk-DJ7T7BMV.js → chunk-TDS6LG6T.js} +1 -1
  84. package/dist/{chunk-7JUUNZQP.js → chunk-TKYJTXWL.js} +1 -1
  85. package/dist/{chunk-JN2DP4R2.js → chunk-TQKIE7AX.js} +1 -1
  86. package/dist/{chunk-K7UYWAZH.js → chunk-TZFT7R7B.js} +1 -1
  87. package/dist/{chunk-AMULIFC5.js → chunk-USI2WMAK.js} +1 -1
  88. package/dist/{chunk-NYSMQ7UY.js → chunk-VMCSRLRC.js} +1 -1
  89. package/dist/{chunk-7PADFQ5S.js → chunk-VOBXYDJW.js} +2 -2
  90. package/dist/{chunk-R7OGNE3W.js → chunk-WMQJBEQP.js} +1 -1
  91. package/dist/{chunk-OWTEHU6B.js → chunk-XJILZ2WN.js} +1 -1
  92. package/dist/{chunk-2K2BX23I.js → chunk-XQFITNA3.js} +1 -1
  93. package/dist/{chunk-4D3DNCQY.js → chunk-XY325HDJ.js} +1 -1
  94. package/dist/{chunk-Q6JHBDW2.js → chunk-YEQVJWEF.js} +1 -1
  95. package/dist/{chunk-6BTZ2Q4P.js → chunk-YHTYPTDD.js} +1 -1
  96. package/dist/{chunk-2WSOPZJU.js → chunk-YZ45OEH3.js} +1 -1
  97. package/dist/{chunk-BJHII5SD.js → chunk-Z35BUPZT.js} +1 -1
  98. package/dist/{chunk-4UMQDH52.js → chunk-ZLSWHCWO.js} +1 -1
  99. package/dist/{chunk-FDWEL5HR.js → chunk-ZRKPZLLG.js} +1 -1
  100. package/dist/{config-OKTAPFOT.js → config-6TQIMTNB.js} +1 -1
  101. package/dist/{credentials-SO3DSQEM.js → credentials-ZSNM4BTD.js} +1 -1
  102. package/dist/{deps-bundle-FRM65BQO.js → deps-bundle-D2ZC2SPT.js} +1 -1
  103. package/dist/{deps-resolve-RPZORKUN.js → deps-resolve-VRBMFUTX.js} +1 -1
  104. package/dist/{dispatch-OZRMWY25.js → dispatch-2PBSJ7YW.js} +1 -1
  105. package/dist/doctor-OWRRDA4Z.js +2 -0
  106. package/dist/{evidence-5AUZMKE3.js → evidence-NDAKCCHQ.js} +1 -1
  107. package/dist/{evolve-cmd-TWYJL4EG.js → evolve-cmd-DIA5EWUT.js} +1 -1
  108. package/dist/{extract-bind-EW7XUDLQ.js → extract-bind-TJ2STXV5.js} +2 -2
  109. package/dist/{extract-cmd-HOVGMBGM.js → extract-cmd-FLOYO6HL.js} +1 -1
  110. package/dist/{generate-headless-FYTJULPG.js → generate-headless-DBT4MKQT.js} +2 -2
  111. package/dist/index.js +69 -69
  112. package/dist/{ingest-4447MYLF.js → ingest-JO5NJENZ.js} +1 -1
  113. package/dist/{ingest-cmd-RJLTFNMN.js → ingest-cmd-T6HM3AHK.js} +1 -1
  114. package/dist/install-NIVU4XVS.js +2 -0
  115. package/dist/{interactive-bind-PSEYAL54.js → interactive-bind-7UDJY4CF.js} +3 -3
  116. package/dist/{list-commands-2SVSEAP6.js → list-commands-DA4ZXOPJ.js} +1 -1
  117. package/dist/login-flow-NHBJVDW6.js +2 -0
  118. package/dist/{mobile-prompts-T6HZ2YLY.js → mobile-prompts-JS7GPVKS.js} +1 -1
  119. package/dist/{persist-recorded-session-O2NCYTSD.js → persist-recorded-session-LE3LGFOS.js} +1 -1
  120. package/dist/pipeline-MTAZDCZR.js +2 -0
  121. package/dist/prepare-target-YK2DLDWB.js +2 -0
  122. package/dist/{reconcile-cmd-FU3JIHTO.js → reconcile-cmd-CYRYVS5B.js} +1 -1
  123. package/dist/{reconcile-deps-SUKZA2FL.js → reconcile-deps-FYXRAMF2.js} +2 -2
  124. package/dist/{reconcile-engine-ILL4M3NW.js → reconcile-engine-6AT6EVGS.js} +1 -1
  125. package/dist/{recording-banner-5VXVKCV4.js → recording-banner-YMKWR3M3.js} +1 -1
  126. package/dist/{registry-BKV3EDTK.js → registry-V45ZQ6Q5.js} +1 -1
  127. package/dist/{require-project-folder-2IO6IX5W.js → require-project-folder-3KS7KTME.js} +1 -1
  128. package/dist/resolve-run-intent-W32G6WM6.js +2 -0
  129. package/dist/{resolver-CBTWTZZR.js → resolver-V5VP5FLT.js} +1 -1
  130. package/dist/{run-EXIYK6PU.js → run-26IR3CKX.js} +1 -1
  131. package/dist/{run-R7GND73C.js → run-5IYI2TJI.js} +1 -1
  132. package/dist/{run-test-md-664ASWRQ.js → run-test-md-FO2RNNOD.js} +2 -2
  133. package/dist/{skill-installer-QLQK4JJE.js → skill-installer-W4TT5MST.js} +1 -1
  134. package/dist/{spawner-ANLF7OX3.js → spawner-ZSYJQGQW.js} +1 -1
  135. package/dist/tcg-generate-ONLV5GXG.js +2 -0
  136. package/dist/{testmd-actions-QZD3N4EH.js → testmd-actions-NPILETCQ.js} +1 -1
  137. package/dist/token-refresh-G2CSTY4B.js +2 -0
  138. package/dist/{types-VYEOJ6U2.js → types-O23GN2YM.js} +1 -1
  139. package/dist/{validate-basic-D7IJUFUQ.js → validate-basic-727KRHX6.js} +1 -1
  140. package/dist/{verdicts-EO5TZ5BW.js → verdicts-TDJLJJ3F.js} +1 -1
  141. package/dist/{version-check-JRLPWQ6T.js → version-check-A2JQYRI2.js} +1 -1
  142. package/dist/{walk-session-IODOH7QU.js → walk-session-HB3OOWVR.js} +1 -1
  143. package/dist/{with-telemetry-ASNQQBGP.js → with-telemetry-HSD6CXDS.js} +1 -1
  144. package/package.json +11 -11
  145. package/dist/FolderPicker-5U3RHHBE.js +0 -2
  146. package/dist/SingleShotApp-XWOPGLKZ.js +0 -2
  147. package/dist/TestMdRunView-6BY3IUH5.js +0 -2
  148. package/dist/bridge-LOBTHY3P.js +0 -2
  149. package/dist/chunk-6DTWVLSJ.js +0 -4
  150. package/dist/chunk-BG66IAO6.js +0 -19
  151. package/dist/chunk-BVKDHHPK.js +0 -5
  152. package/dist/chunk-KBMQGNKO.js +0 -26
  153. package/dist/chunk-UOMRMCMI.js +0 -2
  154. package/dist/chunk-VT2XNEOD.js +0 -10
  155. package/dist/chunk-X2FM67OM.js +0 -4
  156. package/dist/doctor-VWGEQYBB.js +0 -2
  157. package/dist/install-46S4VOZ4.js +0 -2
  158. package/dist/login-flow-U43QVFPH.js +0 -2
  159. package/dist/pipeline-BHEA7ODT.js +0 -2
  160. package/dist/prepare-target-27UN4KNO.js +0 -2
  161. package/dist/resolve-run-intent-ZML3HKG7.js +0 -2
  162. package/dist/tcg-generate-VBC5ODDI.js +0 -2
  163. package/dist/token-refresh-PIUX5OFA.js +0 -2
package/dist/index.js CHANGED
@@ -1,62 +1,62 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
3
- import{c as rn}from"./chunk-BJHII5SD.js";import{a as eo,b as to,c as lo,d as fi,e as gi,f as bi}from"./chunk-KBMQGNKO.js";import"./chunk-3MSXQU2C.js";import"./chunk-G4AFOZKU.js";import"./chunk-6BTZ2Q4P.js";import"./chunk-T5LKD2OB.js";import{a as Ci,b as Ii}from"./chunk-ULGZPRKU.js";import{b as Ei}from"./chunk-R7OGNE3W.js";import{a as Si,b as Ti}from"./chunk-JN2DP4R2.js";import{b as Ri}from"./chunk-DJ7T7BMV.js";import{a as wi,b as yi,c as ki,d as xi,f as _i,h as on}from"./chunk-Q6JHBDW2.js";import{f as Ai,g as Pi,i as Oi}from"./chunk-GZ4X53ZA.js";import{a as Ln,b as vi}from"./chunk-V444REBC.js";import"./chunk-T3XDMR5B.js";import{a as Jo}from"./chunk-PCOSE5SW.js";import{A as jn,B as Nn,C as li,D as ci,E as di,F as ui,H as tn,I as pi,J as Fn,a as St,b as An,c as Pn,d as uo,e as mo,f as po,g as vo,h as No,i as Fo,j as Lo,k as Uo,l as Vo,m as Bo,n as en,o as Xo,p as Qo,q as Zo,r as ei,s as ti,t as ni,u as ri,v as oi,w as ii,x as si,y as ai,z as Mn}from"./chunk-7PADFQ5S.js";import{a as Ho,b as Wo}from"./chunk-KWKUMBHS.js";import{b as Ko,c as Yo}from"./chunk-GYF4CH62.js";import{a as It,b as je}from"./chunk-MUGMUKSZ.js";import"./chunk-RY6TFVAX.js";import"./chunk-TYI4MLFJ.js";import{b as Re,t as $n}from"./chunk-DEZ7CXGM.js";import{a as hi,d as nn}from"./chunk-FRSHEJUS.js";import{a as ge}from"./chunk-66BSTNLD.js";import"./chunk-PUFJEU46.js";import"./chunk-BAL7E4OH.js";import{d as zo}from"./chunk-EKCGZXZE.js";import"./chunk-S3DAAAE5.js";import"./chunk-WYST42WI.js";import"./chunk-BVKDHHPK.js";import"./chunk-2YQ6TW77.js";import{c as mi}from"./chunk-5DT7PIGB.js";import"./chunk-K2QV7FGP.js";import{F as Mo,G as jo,H as zt,I as Xt,J as pt,P as Qt,e as xe,g as So,k as Io,n as Eo,o as To,p as Ro,q as Ao,r as Jt,w as Po,x as Oo,y as Do}from"./chunk-3AJ3QSF5.js";import"./chunk-5DBK6QNS.js";import"./chunk-TJZMYU2W.js";import{b as Ie,c as mt,d as Co}from"./chunk-5GUD3CIH.js";import"./chunk-XWKUZJCP.js";import"./chunk-ZSXDZI56.js";import{a as dt,b as ut,d as Gt,e as Dn}from"./chunk-EHN5HTUD.js";import"./chunk-NVGBE2DR.js";import{a as Ve}from"./chunk-CH273NAE.js";import{a as qo}from"./chunk-HQWLSA5M.js";import"./chunk-PWYEOBXV.js";import"./chunk-TCK3QMKY.js";import{c as Ct}from"./chunk-CGYSFLM2.js";import{a as qt,b as ct,c as Rn}from"./chunk-VZ7KXRXB.js";import{a as Nr,b as Fr,c as Lr,d as On,e as Zt,f as Go}from"./chunk-JJWQUQJ2.js";import{a as wo,b as yo,c as ko,d as xo,e as _o}from"./chunk-OWTEHU6B.js";import{a as fo,c as go,d as ho,e as bo}from"./chunk-AMULIFC5.js";import"./chunk-P7YZ3PU3.js";import"./chunk-TDPWFYTJ.js";import{a as Ce}from"./chunk-6DTWVLSJ.js";import"./chunk-NLECZCMZ.js";import{a as jr}from"./chunk-5NSYHRDN.js";import"./chunk-5Y2G4NC7.js";import"./chunk-CNNJ4U2L.js";import"./chunk-R5T4RLF5.js";import"./chunk-KBM3XHAM.js";import{a as co}from"./chunk-2YEHV2CX.js";import"./chunk-IDX3TOPY.js";import"./chunk-BKM2LWU2.js";import"./chunk-JRQKUQWL.js";import{A as $o}from"./chunk-TH47OOBV.js";import"./chunk-VAYBKR76.js";import"./chunk-CUM23TLF.js";import"./chunk-DUAXZYAD.js";import"./chunk-DBIBROYW.js";import"./chunk-WXHQYYD5.js";import"./chunk-IAHKTEET.js";import"./chunk-UD7KKHPW.js";import{d as Qr,h as Zr}from"./chunk-2K2BX23I.js";import"./chunk-KX2GOJ4C.js";import"./chunk-K7UYWAZH.js";import"./chunk-E3BXNQYE.js";import"./chunk-YCCUBQY4.js";import"./chunk-LA2EMSHE.js";import{a as ro,b as oo,f as io,g as so,h as Yt}from"./chunk-FTZPWXF7.js";import{a as Wt}from"./chunk-BPMSNGXQ.js";import{a as Kt,b as et,c as no}from"./chunk-VE3SUJMA.js";import{a as ao}from"./chunk-FDWEL5HR.js";import"./chunk-RFHMDQXZ.js";import{a as Hr,b as Wr,d as qr}from"./chunk-35EUIBYJ.js";import{e as Vr}from"./chunk-BG66IAO6.js";import"./chunk-MMBBQ4OZ.js";import{j as Vt}from"./chunk-Z2T7E5HM.js";import"./chunk-MSGW4JDG.js";import{a as Br,b as Bt,c as Ht}from"./chunk-TZXXJWHA.js";import{i as Kr,j as Yr,m as lt,n as Gr,o as En,p as y,q as _t,r as Jr,s as Tn,t as zr}from"./chunk-56PAQAX5.js";import"./chunk-5EOX4MEY.js";import"./chunk-4D3DNCQY.js";import{h as Xr}from"./chunk-TAOHYWEO.js";import"./chunk-NYSMQ7UY.js";import"./chunk-MJ56GUKS.js";import"./chunk-ZIRMSWKS.js";import{a as Ur}from"./chunk-UOMRMCMI.js";import"./chunk-4JOD47QI.js";import"./chunk-ZFZ7YXEU.js";import"./chunk-PB3GADUD.js";import{a as se}from"./chunk-WLOGO44E.js";import{a as Ut}from"./chunk-DPUV6OSP.js";import{a as In}from"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import"./chunk-E47GFYXA.js";import{c as Ft}from"./chunk-EYOCNMUM.js";import{a as de}from"./chunk-4UMQDH52.js";import"./chunk-NHOHQBIF.js";import"./chunk-PQUMOFT5.js";import{a as Me,b as J,j as Cn,x as K}from"./chunk-CCUGKBIH.js";import{a as Ze,b as Lt}from"./chunk-DFS4RMVP.js";import{a as at}from"./chunk-HCBYKLMW.js";import{a as ne,b as q,c as Qe,i as Sn,j as Nt}from"./chunk-C44QQJR4.js";import{a as xt}from"./chunk-6YGTRKDT.js";import{a as kt,c as Xe,e as Se}from"./chunk-UR6MHSHU.js";var Et=Xe(Vn=>{"use strict";var sn=class extends Error{constructor(e,t,i){super(i),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=t,this.exitCode=e,this.nestedError=void 0}},Un=class extends sn{constructor(e){super(1,"commander.invalidArgument",e),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}};Vn.CommanderError=sn;Vn.InvalidArgumentError=Un});var an=Xe(Hn=>{"use strict";var{InvalidArgumentError:Ja}=Et(),Bn=class{constructor(e,t){switch(this.description=t||"",this.variadic=!1,this.parseArg=void 0,this.defaultValue=void 0,this.defaultValueDescription=void 0,this.argChoices=void 0,e[0]){case"<":this.required=!0,this._name=e.slice(1,-1);break;case"[":this.required=!1,this._name=e.slice(1,-1);break;default:this.required=!0,this._name=e;break}this._name.length>3&&this._name.slice(-3)==="..."&&(this.variadic=!0,this._name=this._name.slice(0,-3))}name(){return this._name}_concatValue(e,t){return t===this.defaultValue||!Array.isArray(t)?[e]:t.concat(e)}default(e,t){return this.defaultValue=e,this.defaultValueDescription=t,this}argParser(e){return this.parseArg=e,this}choices(e){return this.argChoices=e.slice(),this.parseArg=(t,i)=>{if(!this.argChoices.includes(t))throw new Ja(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._concatValue(t,i):t},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}};function za(n){let e=n.name()+(n.variadic===!0?"...":"");return n.required?"<"+e+">":"["+e+"]"}Hn.Argument=Bn;Hn.humanReadableArgName=za});var qn=Xe(ji=>{"use strict";var{humanReadableArgName:Xa}=an(),Wn=class{constructor(){this.helpWidth=void 0,this.sortSubcommands=!1,this.sortOptions=!1,this.showGlobalOptions=!1}visibleCommands(e){let t=e.commands.filter(o=>!o._hidden),i=e._getHelpCommand();return i&&!i._hidden&&t.push(i),this.sortSubcommands&&t.sort((o,r)=>o.name().localeCompare(r.name())),t}compareOptions(e,t){let i=o=>o.short?o.short.replace(/^-/,""):o.long.replace(/^--/,"");return i(e).localeCompare(i(t))}visibleOptions(e){let t=e.options.filter(o=>!o.hidden),i=e._getHelpOption();if(i&&!i.hidden){let o=i.short&&e._findOption(i.short),r=i.long&&e._findOption(i.long);!o&&!r?t.push(i):i.long&&!r?t.push(e.createOption(i.long,i.description)):i.short&&!o&&t.push(e.createOption(i.short,i.description))}return this.sortOptions&&t.sort(this.compareOptions),t}visibleGlobalOptions(e){if(!this.showGlobalOptions)return[];let t=[];for(let i=e.parent;i;i=i.parent){let o=i.options.filter(r=>!r.hidden);t.push(...o)}return this.sortOptions&&t.sort(this.compareOptions),t}visibleArguments(e){return e._argsDescription&&e.registeredArguments.forEach(t=>{t.description=t.description||e._argsDescription[t.name()]||""}),e.registeredArguments.find(t=>t.description)?e.registeredArguments:[]}subcommandTerm(e){let t=e.registeredArguments.map(i=>Xa(i)).join(" ");return e._name+(e._aliases[0]?"|"+e._aliases[0]:"")+(e.options.length?" [options]":"")+(t?" "+t:"")}optionTerm(e){return e.flags}argumentTerm(e){return e.name()}longestSubcommandTermLength(e,t){return t.visibleCommands(e).reduce((i,o)=>Math.max(i,t.subcommandTerm(o).length),0)}longestOptionTermLength(e,t){return t.visibleOptions(e).reduce((i,o)=>Math.max(i,t.optionTerm(o).length),0)}longestGlobalOptionTermLength(e,t){return t.visibleGlobalOptions(e).reduce((i,o)=>Math.max(i,t.optionTerm(o).length),0)}longestArgumentTermLength(e,t){return t.visibleArguments(e).reduce((i,o)=>Math.max(i,t.argumentTerm(o).length),0)}commandUsage(e){let t=e._name;e._aliases[0]&&(t=t+"|"+e._aliases[0]);let i="";for(let o=e.parent;o;o=o.parent)i=o.name()+" "+i;return i+t+" "+e.usage()}commandDescription(e){return e.description()}subcommandDescription(e){return e.summary()||e.description()}optionDescription(e){let t=[];return e.argChoices&&t.push(`choices: ${e.argChoices.map(i=>JSON.stringify(i)).join(", ")}`),e.defaultValue!==void 0&&(e.required||e.optional||e.isBoolean()&&typeof e.defaultValue=="boolean")&&t.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),e.presetArg!==void 0&&e.optional&&t.push(`preset: ${JSON.stringify(e.presetArg)}`),e.envVar!==void 0&&t.push(`env: ${e.envVar}`),t.length>0?`${e.description} (${t.join(", ")})`:e.description}argumentDescription(e){let t=[];if(e.argChoices&&t.push(`choices: ${e.argChoices.map(i=>JSON.stringify(i)).join(", ")}`),e.defaultValue!==void 0&&t.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),t.length>0){let i=`(${t.join(", ")})`;return e.description?`${e.description} ${i}`:i}return e.description}formatHelp(e,t){let i=t.padWidth(e,t),o=t.helpWidth||80,r=2,s=2;function a(d,w){if(w){let _=`${d.padEnd(i+s)}${w}`;return t.wrap(_,o-r,i+s)}return d}function l(d){return d.join(`
4
- `).replace(/^/gm," ".repeat(r))}let u=[`Usage: ${t.commandUsage(e)}`,""],c=t.commandDescription(e);c.length>0&&(u=u.concat([t.wrap(c,o,0),""]));let m=t.visibleArguments(e).map(d=>a(t.argumentTerm(d),t.argumentDescription(d)));m.length>0&&(u=u.concat(["Arguments:",l(m),""]));let p=t.visibleOptions(e).map(d=>a(t.optionTerm(d),t.optionDescription(d)));if(p.length>0&&(u=u.concat(["Options:",l(p),""])),this.showGlobalOptions){let d=t.visibleGlobalOptions(e).map(w=>a(t.optionTerm(w),t.optionDescription(w)));d.length>0&&(u=u.concat(["Global Options:",l(d),""]))}let g=t.visibleCommands(e).map(d=>a(t.subcommandTerm(d),t.subcommandDescription(d)));return g.length>0&&(u=u.concat(["Commands:",l(g),""])),u.join(`
5
- `)}padWidth(e,t){return Math.max(t.longestOptionTermLength(e,t),t.longestGlobalOptionTermLength(e,t),t.longestSubcommandTermLength(e,t),t.longestArgumentTermLength(e,t))}wrap(e,t,i,o=40){let r=" \\f\\t\\v\xA0\u1680\u2000-\u200A\u202F\u205F\u3000\uFEFF",s=new RegExp(`[\\n][${r}]+`);if(e.match(s))return e;let a=t-i;if(a<o)return e;let l=e.slice(0,i),u=e.slice(i).replace(`\r
3
+ import{c as rn}from"./chunk-Z35BUPZT.js";import{a as eo,b as to,c as lo,d as fi,e as gi,f as bi}from"./chunk-B5QGIUJA.js";import"./chunk-3MSXQU2C.js";import"./chunk-QQAAPFIR.js";import"./chunk-YHTYPTDD.js";import"./chunk-SS5TOK2J.js";import{a as Ci,b as Ii}from"./chunk-ULGZPRKU.js";import{b as Ei}from"./chunk-WMQJBEQP.js";import{a as Si,b as Ti}from"./chunk-TQKIE7AX.js";import{b as Ri}from"./chunk-TDS6LG6T.js";import{a as wi,b as yi,c as ki,d as xi,f as _i,h as on}from"./chunk-YEQVJWEF.js";import{f as Ai,g as Pi,i as $i}from"./chunk-FYS5VIOG.js";import{a as Ln,b as vi}from"./chunk-V444REBC.js";import"./chunk-3LEVCW6R.js";import{a as Jo}from"./chunk-4NSP2NPT.js";import{A as jn,B as Nn,C as li,D as ci,E as di,F as ui,H as tn,I as pi,J as Fn,a as St,b as An,c as Pn,d as uo,e as mo,f as po,g as vo,h as No,i as Fo,j as Lo,k as Uo,l as Vo,m as Bo,n as en,o as Xo,p as Qo,q as Zo,r as ei,s as ti,t as ni,u as ri,v as oi,w as ii,x as si,y as ai,z as Mn}from"./chunk-VOBXYDJW.js";import{a as Ho,b as Wo}from"./chunk-MKSTP2XN.js";import{b as Ko,c as Yo}from"./chunk-KDXQNLVV.js";import{a as It,b as je}from"./chunk-PT7V5WDQ.js";import"./chunk-GELPKSLC.js";import"./chunk-TYI4MLFJ.js";import{b as Re,t as Dn}from"./chunk-DEZ7CXGM.js";import{a as hi,d as nn}from"./chunk-D4SRHIJ5.js";import{a as ge}from"./chunk-S66MCU2Y.js";import"./chunk-DZCG7FFP.js";import"./chunk-C4WTZSX4.js";import{d as zo}from"./chunk-EKCGZXZE.js";import"./chunk-S3DAAAE5.js";import"./chunk-SORVX3KI.js";import"./chunk-JCD6FP7A.js";import"./chunk-2YQ6TW77.js";import{c as mi}from"./chunk-5DT7PIGB.js";import"./chunk-INK66XQS.js";import{F as Mo,G as jo,H as zt,I as Xt,J as pt,P as Qt,e as xe,g as So,k as Io,n as Eo,o as To,p as Ro,q as Ao,r as Jt,w as Po,x as $o,y as Oo}from"./chunk-QBG7XEGQ.js";import"./chunk-5DBK6QNS.js";import"./chunk-RZLD7TPG.js";import{b as Ie,c as mt,d as Co}from"./chunk-5GUD3CIH.js";import"./chunk-XWKUZJCP.js";import"./chunk-ZSXDZI56.js";import{a as dt,b as ut,d as Gt,e as On}from"./chunk-EHN5HTUD.js";import"./chunk-NVGBE2DR.js";import{a as Ve}from"./chunk-CH273NAE.js";import{a as qo}from"./chunk-ESC7AOCX.js";import"./chunk-FJYDEWOA.js";import"./chunk-CLLQQPBZ.js";import{c as Ct}from"./chunk-A44G533S.js";import{a as qt,b as ct,c as Rn}from"./chunk-VZ7KXRXB.js";import{a as Nr,b as Fr,c as Lr,d as $n,e as Zt,f as Go}from"./chunk-P3RKXL3V.js";import{a as wo,b as yo,c as ko,d as xo,e as _o}from"./chunk-XJILZ2WN.js";import{a as fo,c as go,d as ho,e as bo}from"./chunk-USI2WMAK.js";import"./chunk-P7YZ3PU3.js";import"./chunk-TDPWFYTJ.js";import{a as Ce}from"./chunk-BRTARADN.js";import"./chunk-3UUPP5W3.js";import{a as jr}from"./chunk-RX5TZZNQ.js";import"./chunk-5Y2G4NC7.js";import"./chunk-E5S4BASB.js";import"./chunk-R5T4RLF5.js";import"./chunk-KBM3XHAM.js";import{a as co}from"./chunk-2YEHV2CX.js";import"./chunk-IDX3TOPY.js";import"./chunk-BKM2LWU2.js";import"./chunk-SQGBFCFO.js";import{A as Do}from"./chunk-TH47OOBV.js";import"./chunk-VAYBKR76.js";import"./chunk-CUM23TLF.js";import"./chunk-DUAXZYAD.js";import"./chunk-DBIBROYW.js";import"./chunk-WXHQYYD5.js";import"./chunk-IAHKTEET.js";import"./chunk-UD7KKHPW.js";import{d as Qr,h as Zr}from"./chunk-XQFITNA3.js";import"./chunk-SQC4P2Q7.js";import"./chunk-TZFT7R7B.js";import"./chunk-QISE272H.js";import"./chunk-YCCUBQY4.js";import"./chunk-CZUOGGUK.js";import{a as ro,b as oo,f as io,g as so,h as Yt}from"./chunk-4ONGF4NT.js";import{a as Wt}from"./chunk-BPMSNGXQ.js";import{a as Kt,b as et,c as no}from"./chunk-VE3SUJMA.js";import{a as ao}from"./chunk-ZRKPZLLG.js";import"./chunk-RFHMDQXZ.js";import{a as Hr,b as Wr,d as qr}from"./chunk-FMUCZWS3.js";import{e as Vr}from"./chunk-LN7233E2.js";import"./chunk-MMBBQ4OZ.js";import{j as Vt}from"./chunk-DN3E6RT6.js";import"./chunk-MSGW4JDG.js";import{a as Br,b as Bt,c as Ht}from"./chunk-TZXXJWHA.js";import{i as Kr,j as Yr,m as lt,n as Gr,o as En,p as y,q as _t,r as Jr,s as Tn,t as zr}from"./chunk-56PAQAX5.js";import"./chunk-5EOX4MEY.js";import"./chunk-XY325HDJ.js";import{h as Xr}from"./chunk-TAOHYWEO.js";import"./chunk-VMCSRLRC.js";import"./chunk-KQ2MYMOS.js";import"./chunk-AO3PBE2V.js";import{a as Ur}from"./chunk-Q4V2GK5U.js";import"./chunk-4JOD47QI.js";import"./chunk-5COGCNED.js";import"./chunk-FUNKVREV.js";import{a as se}from"./chunk-OYJBABRV.js";import{a as Ut}from"./chunk-DPUV6OSP.js";import{a as In}from"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import"./chunk-E47GFYXA.js";import{c as Ft}from"./chunk-EYOCNMUM.js";import{a as de}from"./chunk-ZLSWHCWO.js";import"./chunk-NT3UETTV.js";import"./chunk-RDNKYRKY.js";import{a as Me,b as J,j as Cn,x as K}from"./chunk-OFW3ZVTP.js";import{a as Ze,b as Lt}from"./chunk-DFS4RMVP.js";import{a as at}from"./chunk-HCBYKLMW.js";import{a as ne,b as q,c as Qe,i as Sn,j as Nt}from"./chunk-C44QQJR4.js";import{a as xt}from"./chunk-6YGTRKDT.js";import{a as kt,c as Xe,e as Se}from"./chunk-UR6MHSHU.js";var Et=Xe(Vn=>{"use strict";var sn=class extends Error{constructor(e,t,i){super(i),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=t,this.exitCode=e,this.nestedError=void 0}},Un=class extends sn{constructor(e){super(1,"commander.invalidArgument",e),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}};Vn.CommanderError=sn;Vn.InvalidArgumentError=Un});var an=Xe(Hn=>{"use strict";var{InvalidArgumentError:Ja}=Et(),Bn=class{constructor(e,t){switch(this.description=t||"",this.variadic=!1,this.parseArg=void 0,this.defaultValue=void 0,this.defaultValueDescription=void 0,this.argChoices=void 0,e[0]){case"<":this.required=!0,this._name=e.slice(1,-1);break;case"[":this.required=!1,this._name=e.slice(1,-1);break;default:this.required=!0,this._name=e;break}this._name.length>3&&this._name.slice(-3)==="..."&&(this.variadic=!0,this._name=this._name.slice(0,-3))}name(){return this._name}_concatValue(e,t){return t===this.defaultValue||!Array.isArray(t)?[e]:t.concat(e)}default(e,t){return this.defaultValue=e,this.defaultValueDescription=t,this}argParser(e){return this.parseArg=e,this}choices(e){return this.argChoices=e.slice(),this.parseArg=(t,i)=>{if(!this.argChoices.includes(t))throw new Ja(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._concatValue(t,i):t},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}};function za(n){let e=n.name()+(n.variadic===!0?"...":"");return n.required?"<"+e+">":"["+e+"]"}Hn.Argument=Bn;Hn.humanReadableArgName=za});var qn=Xe(ji=>{"use strict";var{humanReadableArgName:Xa}=an(),Wn=class{constructor(){this.helpWidth=void 0,this.sortSubcommands=!1,this.sortOptions=!1,this.showGlobalOptions=!1}visibleCommands(e){let t=e.commands.filter(o=>!o._hidden),i=e._getHelpCommand();return i&&!i._hidden&&t.push(i),this.sortSubcommands&&t.sort((o,r)=>o.name().localeCompare(r.name())),t}compareOptions(e,t){let i=o=>o.short?o.short.replace(/^-/,""):o.long.replace(/^--/,"");return i(e).localeCompare(i(t))}visibleOptions(e){let t=e.options.filter(o=>!o.hidden),i=e._getHelpOption();if(i&&!i.hidden){let o=i.short&&e._findOption(i.short),r=i.long&&e._findOption(i.long);!o&&!r?t.push(i):i.long&&!r?t.push(e.createOption(i.long,i.description)):i.short&&!o&&t.push(e.createOption(i.short,i.description))}return this.sortOptions&&t.sort(this.compareOptions),t}visibleGlobalOptions(e){if(!this.showGlobalOptions)return[];let t=[];for(let i=e.parent;i;i=i.parent){let o=i.options.filter(r=>!r.hidden);t.push(...o)}return this.sortOptions&&t.sort(this.compareOptions),t}visibleArguments(e){return e._argsDescription&&e.registeredArguments.forEach(t=>{t.description=t.description||e._argsDescription[t.name()]||""}),e.registeredArguments.find(t=>t.description)?e.registeredArguments:[]}subcommandTerm(e){let t=e.registeredArguments.map(i=>Xa(i)).join(" ");return e._name+(e._aliases[0]?"|"+e._aliases[0]:"")+(e.options.length?" [options]":"")+(t?" "+t:"")}optionTerm(e){return e.flags}argumentTerm(e){return e.name()}longestSubcommandTermLength(e,t){return t.visibleCommands(e).reduce((i,o)=>Math.max(i,t.subcommandTerm(o).length),0)}longestOptionTermLength(e,t){return t.visibleOptions(e).reduce((i,o)=>Math.max(i,t.optionTerm(o).length),0)}longestGlobalOptionTermLength(e,t){return t.visibleGlobalOptions(e).reduce((i,o)=>Math.max(i,t.optionTerm(o).length),0)}longestArgumentTermLength(e,t){return t.visibleArguments(e).reduce((i,o)=>Math.max(i,t.argumentTerm(o).length),0)}commandUsage(e){let t=e._name;e._aliases[0]&&(t=t+"|"+e._aliases[0]);let i="";for(let o=e.parent;o;o=o.parent)i=o.name()+" "+i;return i+t+" "+e.usage()}commandDescription(e){return e.description()}subcommandDescription(e){return e.summary()||e.description()}optionDescription(e){let t=[];return e.argChoices&&t.push(`choices: ${e.argChoices.map(i=>JSON.stringify(i)).join(", ")}`),e.defaultValue!==void 0&&(e.required||e.optional||e.isBoolean()&&typeof e.defaultValue=="boolean")&&t.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),e.presetArg!==void 0&&e.optional&&t.push(`preset: ${JSON.stringify(e.presetArg)}`),e.envVar!==void 0&&t.push(`env: ${e.envVar}`),t.length>0?`${e.description} (${t.join(", ")})`:e.description}argumentDescription(e){let t=[];if(e.argChoices&&t.push(`choices: ${e.argChoices.map(i=>JSON.stringify(i)).join(", ")}`),e.defaultValue!==void 0&&t.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),t.length>0){let i=`(${t.join(", ")})`;return e.description?`${e.description} ${i}`:i}return e.description}formatHelp(e,t){let i=t.padWidth(e,t),o=t.helpWidth||80,r=2,a=2;function s(d,w){if(w){let _=`${d.padEnd(i+a)}${w}`;return t.wrap(_,o-r,i+a)}return d}function l(d){return d.join(`
4
+ `).replace(/^/gm," ".repeat(r))}let u=[`Usage: ${t.commandUsage(e)}`,""],c=t.commandDescription(e);c.length>0&&(u=u.concat([t.wrap(c,o,0),""]));let m=t.visibleArguments(e).map(d=>s(t.argumentTerm(d),t.argumentDescription(d)));m.length>0&&(u=u.concat(["Arguments:",l(m),""]));let p=t.visibleOptions(e).map(d=>s(t.optionTerm(d),t.optionDescription(d)));if(p.length>0&&(u=u.concat(["Options:",l(p),""])),this.showGlobalOptions){let d=t.visibleGlobalOptions(e).map(w=>s(t.optionTerm(w),t.optionDescription(w)));d.length>0&&(u=u.concat(["Global Options:",l(d),""]))}let g=t.visibleCommands(e).map(d=>s(t.subcommandTerm(d),t.subcommandDescription(d)));return g.length>0&&(u=u.concat(["Commands:",l(g),""])),u.join(`
5
+ `)}padWidth(e,t){return Math.max(t.longestOptionTermLength(e,t),t.longestGlobalOptionTermLength(e,t),t.longestSubcommandTermLength(e,t),t.longestArgumentTermLength(e,t))}wrap(e,t,i,o=40){let r=" \\f\\t\\v\xA0\u1680\u2000-\u200A\u202F\u205F\u3000\uFEFF",a=new RegExp(`[\\n][${r}]+`);if(e.match(a))return e;let s=t-i;if(s<o)return e;let l=e.slice(0,i),u=e.slice(i).replace(`\r
6
6
  `,`
7
7
  `),c=" ".repeat(i),p="\\s\u200B",g=new RegExp(`
8
- |.{1,${a-1}}([${p}]|$)|[^${p}]+?([${p}]|$)`,"g"),d=u.match(g)||[];return l+d.map((w,_)=>w===`
8
+ |.{1,${s-1}}([${p}]|$)|[^${p}]+?([${p}]|$)`,"g"),d=u.match(g)||[];return l+d.map((w,_)=>w===`
9
9
  `?"":(_>0?c:"")+w.trimEnd()).join(`
10
- `)}};ji.Help=Wn});var Jn=Xe(Gn=>{"use strict";var{InvalidArgumentError:Qa}=Et(),Kn=class{constructor(e,t){this.flags=e,this.description=t||"",this.required=e.includes("<"),this.optional=e.includes("["),this.variadic=/\w\.\.\.[>\]]$/.test(e),this.mandatory=!1;let i=el(e);this.short=i.shortFlag,this.long=i.longFlag,this.negate=!1,this.long&&(this.negate=this.long.startsWith("--no-")),this.defaultValue=void 0,this.defaultValueDescription=void 0,this.presetArg=void 0,this.envVar=void 0,this.parseArg=void 0,this.hidden=!1,this.argChoices=void 0,this.conflictsWith=[],this.implied=void 0}default(e,t){return this.defaultValue=e,this.defaultValueDescription=t,this}preset(e){return this.presetArg=e,this}conflicts(e){return this.conflictsWith=this.conflictsWith.concat(e),this}implies(e){let t=e;return typeof e=="string"&&(t={[e]:!0}),this.implied=Object.assign(this.implied||{},t),this}env(e){return this.envVar=e,this}argParser(e){return this.parseArg=e,this}makeOptionMandatory(e=!0){return this.mandatory=!!e,this}hideHelp(e=!0){return this.hidden=!!e,this}_concatValue(e,t){return t===this.defaultValue||!Array.isArray(t)?[e]:t.concat(e)}choices(e){return this.argChoices=e.slice(),this.parseArg=(t,i)=>{if(!this.argChoices.includes(t))throw new Qa(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._concatValue(t,i):t},this}name(){return this.long?this.long.replace(/^--/,""):this.short.replace(/^-/,"")}attributeName(){return Za(this.name().replace(/^no-/,""))}is(e){return this.short===e||this.long===e}isBoolean(){return!this.required&&!this.optional&&!this.negate}},Yn=class{constructor(e){this.positiveOptions=new Map,this.negativeOptions=new Map,this.dualOptions=new Set,e.forEach(t=>{t.negate?this.negativeOptions.set(t.attributeName(),t):this.positiveOptions.set(t.attributeName(),t)}),this.negativeOptions.forEach((t,i)=>{this.positiveOptions.has(i)&&this.dualOptions.add(i)})}valueFromOption(e,t){let i=t.attributeName();if(!this.dualOptions.has(i))return!0;let o=this.negativeOptions.get(i).presetArg,r=o!==void 0?o:!1;return t.negate===(r===e)}};function Za(n){return n.split("-").reduce((e,t)=>e+t[0].toUpperCase()+t.slice(1))}function el(n){let e,t,i=n.split(/[ |,]+/);return i.length>1&&!/^[[<]/.test(i[1])&&(e=i.shift()),t=i.shift(),!e&&/^-[^-]$/.test(t)&&(e=t,t=void 0),{shortFlag:e,longFlag:t}}Gn.Option=Kn;Gn.DualOptions=Yn});var Fi=Xe(Ni=>{"use strict";function tl(n,e){if(Math.abs(n.length-e.length)>3)return Math.max(n.length,e.length);let t=[];for(let i=0;i<=n.length;i++)t[i]=[i];for(let i=0;i<=e.length;i++)t[0][i]=i;for(let i=1;i<=e.length;i++)for(let o=1;o<=n.length;o++){let r=1;n[o-1]===e[i-1]?r=0:r=1,t[o][i]=Math.min(t[o-1][i]+1,t[o][i-1]+1,t[o-1][i-1]+r),o>1&&i>1&&n[o-1]===e[i-2]&&n[o-2]===e[i-1]&&(t[o][i]=Math.min(t[o][i],t[o-2][i-2]+1))}return t[n.length][e.length]}function nl(n,e){if(!e||e.length===0)return"";e=Array.from(new Set(e));let t=n.startsWith("--");t&&(n=n.slice(2),e=e.map(s=>s.slice(2)));let i=[],o=3,r=.4;return e.forEach(s=>{if(s.length<=1)return;let a=tl(n,s),l=Math.max(n.length,s.length);(l-a)/l>r&&(a<o?(o=a,i=[s]):a===o&&i.push(s))}),i.sort((s,a)=>s.localeCompare(a)),t&&(i=i.map(s=>`--${s}`)),i.length>1?`
10
+ `)}};ji.Help=Wn});var Jn=Xe(Gn=>{"use strict";var{InvalidArgumentError:Qa}=Et(),Kn=class{constructor(e,t){this.flags=e,this.description=t||"",this.required=e.includes("<"),this.optional=e.includes("["),this.variadic=/\w\.\.\.[>\]]$/.test(e),this.mandatory=!1;let i=el(e);this.short=i.shortFlag,this.long=i.longFlag,this.negate=!1,this.long&&(this.negate=this.long.startsWith("--no-")),this.defaultValue=void 0,this.defaultValueDescription=void 0,this.presetArg=void 0,this.envVar=void 0,this.parseArg=void 0,this.hidden=!1,this.argChoices=void 0,this.conflictsWith=[],this.implied=void 0}default(e,t){return this.defaultValue=e,this.defaultValueDescription=t,this}preset(e){return this.presetArg=e,this}conflicts(e){return this.conflictsWith=this.conflictsWith.concat(e),this}implies(e){let t=e;return typeof e=="string"&&(t={[e]:!0}),this.implied=Object.assign(this.implied||{},t),this}env(e){return this.envVar=e,this}argParser(e){return this.parseArg=e,this}makeOptionMandatory(e=!0){return this.mandatory=!!e,this}hideHelp(e=!0){return this.hidden=!!e,this}_concatValue(e,t){return t===this.defaultValue||!Array.isArray(t)?[e]:t.concat(e)}choices(e){return this.argChoices=e.slice(),this.parseArg=(t,i)=>{if(!this.argChoices.includes(t))throw new Qa(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._concatValue(t,i):t},this}name(){return this.long?this.long.replace(/^--/,""):this.short.replace(/^-/,"")}attributeName(){return Za(this.name().replace(/^no-/,""))}is(e){return this.short===e||this.long===e}isBoolean(){return!this.required&&!this.optional&&!this.negate}},Yn=class{constructor(e){this.positiveOptions=new Map,this.negativeOptions=new Map,this.dualOptions=new Set,e.forEach(t=>{t.negate?this.negativeOptions.set(t.attributeName(),t):this.positiveOptions.set(t.attributeName(),t)}),this.negativeOptions.forEach((t,i)=>{this.positiveOptions.has(i)&&this.dualOptions.add(i)})}valueFromOption(e,t){let i=t.attributeName();if(!this.dualOptions.has(i))return!0;let o=this.negativeOptions.get(i).presetArg,r=o!==void 0?o:!1;return t.negate===(r===e)}};function Za(n){return n.split("-").reduce((e,t)=>e+t[0].toUpperCase()+t.slice(1))}function el(n){let e,t,i=n.split(/[ |,]+/);return i.length>1&&!/^[[<]/.test(i[1])&&(e=i.shift()),t=i.shift(),!e&&/^-[^-]$/.test(t)&&(e=t,t=void 0),{shortFlag:e,longFlag:t}}Gn.Option=Kn;Gn.DualOptions=Yn});var Fi=Xe(Ni=>{"use strict";function tl(n,e){if(Math.abs(n.length-e.length)>3)return Math.max(n.length,e.length);let t=[];for(let i=0;i<=n.length;i++)t[i]=[i];for(let i=0;i<=e.length;i++)t[0][i]=i;for(let i=1;i<=e.length;i++)for(let o=1;o<=n.length;o++){let r=1;n[o-1]===e[i-1]?r=0:r=1,t[o][i]=Math.min(t[o-1][i]+1,t[o][i-1]+1,t[o-1][i-1]+r),o>1&&i>1&&n[o-1]===e[i-2]&&n[o-2]===e[i-1]&&(t[o][i]=Math.min(t[o][i],t[o-2][i-2]+1))}return t[n.length][e.length]}function nl(n,e){if(!e||e.length===0)return"";e=Array.from(new Set(e));let t=n.startsWith("--");t&&(n=n.slice(2),e=e.map(a=>a.slice(2)));let i=[],o=3,r=.4;return e.forEach(a=>{if(a.length<=1)return;let s=tl(n,a),l=Math.max(n.length,a.length);(l-s)/l>r&&(s<o?(o=s,i=[a]):s===o&&i.push(a))}),i.sort((a,s)=>a.localeCompare(s)),t&&(i=i.map(a=>`--${a}`)),i.length>1?`
11
11
  (Did you mean one of ${i.join(", ")}?)`:i.length===1?`
12
- (Did you mean ${i[0]}?)`:""}Ni.suggestSimilar=nl});var Hi=Xe(Bi=>{"use strict";var rl=kt("events").EventEmitter,zn=kt("child_process"),Be=kt("path"),Xn=kt("fs"),ee=kt("process"),{Argument:ol,humanReadableArgName:il}=an(),{CommanderError:Qn}=Et(),{Help:sl}=qn(),{Option:Li,DualOptions:al}=Jn(),{suggestSimilar:Ui}=Fi(),Zn=class n extends rl{constructor(e){super(),this.commands=[],this.options=[],this.parent=null,this._allowUnknownOption=!1,this._allowExcessArguments=!0,this.registeredArguments=[],this._args=this.registeredArguments,this.args=[],this.rawArgs=[],this.processedArgs=[],this._scriptPath=null,this._name=e||"",this._optionValues={},this._optionValueSources={},this._storeOptionsAsProperties=!1,this._actionHandler=null,this._executableHandler=!1,this._executableFile=null,this._executableDir=null,this._defaultCommandName=null,this._exitCallback=null,this._aliases=[],this._combineFlagAndOptionalValue=!0,this._description="",this._summary="",this._argsDescription=void 0,this._enablePositionalOptions=!1,this._passThroughOptions=!1,this._lifeCycleHooks={},this._showHelpAfterError=!1,this._showSuggestionAfterError=!0,this._outputConfiguration={writeOut:t=>ee.stdout.write(t),writeErr:t=>ee.stderr.write(t),getOutHelpWidth:()=>ee.stdout.isTTY?ee.stdout.columns:void 0,getErrHelpWidth:()=>ee.stderr.isTTY?ee.stderr.columns:void 0,outputError:(t,i)=>i(t)},this._hidden=!1,this._helpOption=void 0,this._addImplicitHelpCommand=void 0,this._helpCommand=void 0,this._helpConfiguration={}}copyInheritedSettings(e){return this._outputConfiguration=e._outputConfiguration,this._helpOption=e._helpOption,this._helpCommand=e._helpCommand,this._helpConfiguration=e._helpConfiguration,this._exitCallback=e._exitCallback,this._storeOptionsAsProperties=e._storeOptionsAsProperties,this._combineFlagAndOptionalValue=e._combineFlagAndOptionalValue,this._allowExcessArguments=e._allowExcessArguments,this._enablePositionalOptions=e._enablePositionalOptions,this._showHelpAfterError=e._showHelpAfterError,this._showSuggestionAfterError=e._showSuggestionAfterError,this}_getCommandAndAncestors(){let e=[];for(let t=this;t;t=t.parent)e.push(t);return e}command(e,t,i){let o=t,r=i;typeof o=="object"&&o!==null&&(r=o,o=null),r=r||{};let[,s,a]=e.match(/([^ ]+) *(.*)/),l=this.createCommand(s);return o&&(l.description(o),l._executableHandler=!0),r.isDefault&&(this._defaultCommandName=l._name),l._hidden=!!(r.noHelp||r.hidden),l._executableFile=r.executableFile||null,a&&l.arguments(a),this._registerCommand(l),l.parent=this,l.copyInheritedSettings(this),o?this:l}createCommand(e){return new n(e)}createHelp(){return Object.assign(new sl,this.configureHelp())}configureHelp(e){return e===void 0?this._helpConfiguration:(this._helpConfiguration=e,this)}configureOutput(e){return e===void 0?this._outputConfiguration:(Object.assign(this._outputConfiguration,e),this)}showHelpAfterError(e=!0){return typeof e!="string"&&(e=!!e),this._showHelpAfterError=e,this}showSuggestionAfterError(e=!0){return this._showSuggestionAfterError=!!e,this}addCommand(e,t){if(!e._name)throw new Error(`Command passed to .addCommand() must have a name
13
- - specify the name in Command constructor or using .name()`);return t=t||{},t.isDefault&&(this._defaultCommandName=e._name),(t.noHelp||t.hidden)&&(e._hidden=!0),this._registerCommand(e),e.parent=this,e._checkForBrokenPassThrough(),this}createArgument(e,t){return new ol(e,t)}argument(e,t,i,o){let r=this.createArgument(e,t);return typeof i=="function"?r.default(o).argParser(i):r.default(i),this.addArgument(r),this}arguments(e){return e.trim().split(/ +/).forEach(t=>{this.argument(t)}),this}addArgument(e){let t=this.registeredArguments.slice(-1)[0];if(t&&t.variadic)throw new Error(`only the last argument can be variadic '${t.name()}'`);if(e.required&&e.defaultValue!==void 0&&e.parseArg===void 0)throw new Error(`a default value for a required argument is never used: '${e.name()}'`);return this.registeredArguments.push(e),this}helpCommand(e,t){if(typeof e=="boolean")return this._addImplicitHelpCommand=e,this;e=e??"help [command]";let[,i,o]=e.match(/([^ ]+) *(.*)/),r=t??"display help for command",s=this.createCommand(i);return s.helpOption(!1),o&&s.arguments(o),r&&s.description(r),this._addImplicitHelpCommand=!0,this._helpCommand=s,this}addHelpCommand(e,t){return typeof e!="object"?(this.helpCommand(e,t),this):(this._addImplicitHelpCommand=!0,this._helpCommand=e,this)}_getHelpCommand(){return this._addImplicitHelpCommand??(this.commands.length&&!this._actionHandler&&!this._findCommand("help"))?(this._helpCommand===void 0&&this.helpCommand(void 0,void 0),this._helpCommand):null}hook(e,t){let i=["preSubcommand","preAction","postAction"];if(!i.includes(e))throw new Error(`Unexpected value for event passed to hook : '${e}'.
14
- Expecting one of '${i.join("', '")}'`);return this._lifeCycleHooks[e]?this._lifeCycleHooks[e].push(t):this._lifeCycleHooks[e]=[t],this}exitOverride(e){return e?this._exitCallback=e:this._exitCallback=t=>{if(t.code!=="commander.executeSubCommandAsync")throw t},this}_exit(e,t,i){this._exitCallback&&this._exitCallback(new Qn(e,t,i)),ee.exit(e)}action(e){let t=i=>{let o=this.registeredArguments.length,r=i.slice(0,o);return this._storeOptionsAsProperties?r[o]=this:r[o]=this.opts(),r.push(this),e.apply(this,r)};return this._actionHandler=t,this}createOption(e,t){return new Li(e,t)}_callParseArg(e,t,i,o){try{return e.parseArg(t,i)}catch(r){if(r.code==="commander.invalidArgument"){let s=`${o} ${r.message}`;this.error(s,{exitCode:r.exitCode,code:r.code})}throw r}}_registerOption(e){let t=e.short&&this._findOption(e.short)||e.long&&this._findOption(e.long);if(t){let i=e.long&&this._findOption(e.long)?e.long:e.short;throw new Error(`Cannot add option '${e.flags}'${this._name&&` to command '${this._name}'`} due to conflicting flag '${i}'
15
- - already used by option '${t.flags}'`)}this.options.push(e)}_registerCommand(e){let t=o=>[o.name()].concat(o.aliases()),i=t(e).find(o=>this._findCommand(o));if(i){let o=t(this._findCommand(i)).join("|"),r=t(e).join("|");throw new Error(`cannot add command '${r}' as already have command '${o}'`)}this.commands.push(e)}addOption(e){this._registerOption(e);let t=e.name(),i=e.attributeName();if(e.negate){let r=e.long.replace(/^--no-/,"--");this._findOption(r)||this.setOptionValueWithSource(i,e.defaultValue===void 0?!0:e.defaultValue,"default")}else e.defaultValue!==void 0&&this.setOptionValueWithSource(i,e.defaultValue,"default");let o=(r,s,a)=>{r==null&&e.presetArg!==void 0&&(r=e.presetArg);let l=this.getOptionValue(i);r!==null&&e.parseArg?r=this._callParseArg(e,r,l,s):r!==null&&e.variadic&&(r=e._concatValue(r,l)),r==null&&(e.negate?r=!1:e.isBoolean()||e.optional?r=!0:r=""),this.setOptionValueWithSource(i,r,a)};return this.on("option:"+t,r=>{let s=`error: option '${e.flags}' argument '${r}' is invalid.`;o(r,s,"cli")}),e.envVar&&this.on("optionEnv:"+t,r=>{let s=`error: option '${e.flags}' value '${r}' from env '${e.envVar}' is invalid.`;o(r,s,"env")}),this}_optionEx(e,t,i,o,r){if(typeof t=="object"&&t instanceof Li)throw new Error("To add an Option object use addOption() instead of option() or requiredOption()");let s=this.createOption(t,i);if(s.makeOptionMandatory(!!e.mandatory),typeof o=="function")s.default(r).argParser(o);else if(o instanceof RegExp){let a=o;o=(l,u)=>{let c=a.exec(l);return c?c[0]:u},s.default(r).argParser(o)}else s.default(o);return this.addOption(s)}option(e,t,i,o){return this._optionEx({},e,t,i,o)}requiredOption(e,t,i,o){return this._optionEx({mandatory:!0},e,t,i,o)}combineFlagAndOptionalValue(e=!0){return this._combineFlagAndOptionalValue=!!e,this}allowUnknownOption(e=!0){return this._allowUnknownOption=!!e,this}allowExcessArguments(e=!0){return this._allowExcessArguments=!!e,this}enablePositionalOptions(e=!0){return this._enablePositionalOptions=!!e,this}passThroughOptions(e=!0){return this._passThroughOptions=!!e,this._checkForBrokenPassThrough(),this}_checkForBrokenPassThrough(){if(this.parent&&this._passThroughOptions&&!this.parent._enablePositionalOptions)throw new Error(`passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`)}storeOptionsAsProperties(e=!0){if(this.options.length)throw new Error("call .storeOptionsAsProperties() before adding options");if(Object.keys(this._optionValues).length)throw new Error("call .storeOptionsAsProperties() before setting option values");return this._storeOptionsAsProperties=!!e,this}getOptionValue(e){return this._storeOptionsAsProperties?this[e]:this._optionValues[e]}setOptionValue(e,t){return this.setOptionValueWithSource(e,t,void 0)}setOptionValueWithSource(e,t,i){return this._storeOptionsAsProperties?this[e]=t:this._optionValues[e]=t,this._optionValueSources[e]=i,this}getOptionValueSource(e){return this._optionValueSources[e]}getOptionValueSourceWithGlobals(e){let t;return this._getCommandAndAncestors().forEach(i=>{i.getOptionValueSource(e)!==void 0&&(t=i.getOptionValueSource(e))}),t}_prepareUserArgs(e,t){if(e!==void 0&&!Array.isArray(e))throw new Error("first parameter to parse must be array or undefined");if(t=t||{},e===void 0&&t.from===void 0){ee.versions?.electron&&(t.from="electron");let o=ee.execArgv??[];(o.includes("-e")||o.includes("--eval")||o.includes("-p")||o.includes("--print"))&&(t.from="eval")}e===void 0&&(e=ee.argv),this.rawArgs=e.slice();let i;switch(t.from){case void 0:case"node":this._scriptPath=e[1],i=e.slice(2);break;case"electron":ee.defaultApp?(this._scriptPath=e[1],i=e.slice(2)):i=e.slice(1);break;case"user":i=e.slice(0);break;case"eval":i=e.slice(1);break;default:throw new Error(`unexpected parse option { from: '${t.from}' }`)}return!this._name&&this._scriptPath&&this.nameFromFilename(this._scriptPath),this._name=this._name||"program",i}parse(e,t){let i=this._prepareUserArgs(e,t);return this._parseCommand([],i),this}async parseAsync(e,t){let i=this._prepareUserArgs(e,t);return await this._parseCommand([],i),this}_executeSubCommand(e,t){t=t.slice();let i=!1,o=[".js",".ts",".tsx",".mjs",".cjs"];function r(c,m){let p=Be.resolve(c,m);if(Xn.existsSync(p))return p;if(o.includes(Be.extname(m)))return;let g=o.find(d=>Xn.existsSync(`${p}${d}`));if(g)return`${p}${g}`}this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let s=e._executableFile||`${this._name}-${e._name}`,a=this._executableDir||"";if(this._scriptPath){let c;try{c=Xn.realpathSync(this._scriptPath)}catch{c=this._scriptPath}a=Be.resolve(Be.dirname(c),a)}if(a){let c=r(a,s);if(!c&&!e._executableFile&&this._scriptPath){let m=Be.basename(this._scriptPath,Be.extname(this._scriptPath));m!==this._name&&(c=r(a,`${m}-${e._name}`))}s=c||s}i=o.includes(Be.extname(s));let l;ee.platform!=="win32"?i?(t.unshift(s),t=Vi(ee.execArgv).concat(t),l=zn.spawn(ee.argv[0],t,{stdio:"inherit"})):l=zn.spawn(s,t,{stdio:"inherit"}):(t.unshift(s),t=Vi(ee.execArgv).concat(t),l=zn.spawn(ee.execPath,t,{stdio:"inherit"})),l.killed||["SIGUSR1","SIGUSR2","SIGTERM","SIGINT","SIGHUP"].forEach(m=>{ee.on(m,()=>{l.killed===!1&&l.exitCode===null&&l.kill(m)})});let u=this._exitCallback;l.on("close",c=>{c=c??1,u?u(new Qn(c,"commander.executeSubCommandAsync","(close)")):ee.exit(c)}),l.on("error",c=>{if(c.code==="ENOENT"){let m=a?`searched for local subcommand relative to directory '${a}'`:"no directory for search for local subcommand, use .executableDir() to supply a custom directory",p=`'${s}' does not exist
12
+ (Did you mean ${i[0]}?)`:""}Ni.suggestSimilar=nl});var Hi=Xe(Bi=>{"use strict";var rl=kt("events").EventEmitter,zn=kt("child_process"),Be=kt("path"),Xn=kt("fs"),ee=kt("process"),{Argument:ol,humanReadableArgName:il}=an(),{CommanderError:Qn}=Et(),{Help:sl}=qn(),{Option:Li,DualOptions:al}=Jn(),{suggestSimilar:Ui}=Fi(),Zn=class n extends rl{constructor(e){super(),this.commands=[],this.options=[],this.parent=null,this._allowUnknownOption=!1,this._allowExcessArguments=!0,this.registeredArguments=[],this._args=this.registeredArguments,this.args=[],this.rawArgs=[],this.processedArgs=[],this._scriptPath=null,this._name=e||"",this._optionValues={},this._optionValueSources={},this._storeOptionsAsProperties=!1,this._actionHandler=null,this._executableHandler=!1,this._executableFile=null,this._executableDir=null,this._defaultCommandName=null,this._exitCallback=null,this._aliases=[],this._combineFlagAndOptionalValue=!0,this._description="",this._summary="",this._argsDescription=void 0,this._enablePositionalOptions=!1,this._passThroughOptions=!1,this._lifeCycleHooks={},this._showHelpAfterError=!1,this._showSuggestionAfterError=!0,this._outputConfiguration={writeOut:t=>ee.stdout.write(t),writeErr:t=>ee.stderr.write(t),getOutHelpWidth:()=>ee.stdout.isTTY?ee.stdout.columns:void 0,getErrHelpWidth:()=>ee.stderr.isTTY?ee.stderr.columns:void 0,outputError:(t,i)=>i(t)},this._hidden=!1,this._helpOption=void 0,this._addImplicitHelpCommand=void 0,this._helpCommand=void 0,this._helpConfiguration={}}copyInheritedSettings(e){return this._outputConfiguration=e._outputConfiguration,this._helpOption=e._helpOption,this._helpCommand=e._helpCommand,this._helpConfiguration=e._helpConfiguration,this._exitCallback=e._exitCallback,this._storeOptionsAsProperties=e._storeOptionsAsProperties,this._combineFlagAndOptionalValue=e._combineFlagAndOptionalValue,this._allowExcessArguments=e._allowExcessArguments,this._enablePositionalOptions=e._enablePositionalOptions,this._showHelpAfterError=e._showHelpAfterError,this._showSuggestionAfterError=e._showSuggestionAfterError,this}_getCommandAndAncestors(){let e=[];for(let t=this;t;t=t.parent)e.push(t);return e}command(e,t,i){let o=t,r=i;typeof o=="object"&&o!==null&&(r=o,o=null),r=r||{};let[,a,s]=e.match(/([^ ]+) *(.*)/),l=this.createCommand(a);return o&&(l.description(o),l._executableHandler=!0),r.isDefault&&(this._defaultCommandName=l._name),l._hidden=!!(r.noHelp||r.hidden),l._executableFile=r.executableFile||null,s&&l.arguments(s),this._registerCommand(l),l.parent=this,l.copyInheritedSettings(this),o?this:l}createCommand(e){return new n(e)}createHelp(){return Object.assign(new sl,this.configureHelp())}configureHelp(e){return e===void 0?this._helpConfiguration:(this._helpConfiguration=e,this)}configureOutput(e){return e===void 0?this._outputConfiguration:(Object.assign(this._outputConfiguration,e),this)}showHelpAfterError(e=!0){return typeof e!="string"&&(e=!!e),this._showHelpAfterError=e,this}showSuggestionAfterError(e=!0){return this._showSuggestionAfterError=!!e,this}addCommand(e,t){if(!e._name)throw new Error(`Command passed to .addCommand() must have a name
13
+ - specify the name in Command constructor or using .name()`);return t=t||{},t.isDefault&&(this._defaultCommandName=e._name),(t.noHelp||t.hidden)&&(e._hidden=!0),this._registerCommand(e),e.parent=this,e._checkForBrokenPassThrough(),this}createArgument(e,t){return new ol(e,t)}argument(e,t,i,o){let r=this.createArgument(e,t);return typeof i=="function"?r.default(o).argParser(i):r.default(i),this.addArgument(r),this}arguments(e){return e.trim().split(/ +/).forEach(t=>{this.argument(t)}),this}addArgument(e){let t=this.registeredArguments.slice(-1)[0];if(t&&t.variadic)throw new Error(`only the last argument can be variadic '${t.name()}'`);if(e.required&&e.defaultValue!==void 0&&e.parseArg===void 0)throw new Error(`a default value for a required argument is never used: '${e.name()}'`);return this.registeredArguments.push(e),this}helpCommand(e,t){if(typeof e=="boolean")return this._addImplicitHelpCommand=e,this;e=e??"help [command]";let[,i,o]=e.match(/([^ ]+) *(.*)/),r=t??"display help for command",a=this.createCommand(i);return a.helpOption(!1),o&&a.arguments(o),r&&a.description(r),this._addImplicitHelpCommand=!0,this._helpCommand=a,this}addHelpCommand(e,t){return typeof e!="object"?(this.helpCommand(e,t),this):(this._addImplicitHelpCommand=!0,this._helpCommand=e,this)}_getHelpCommand(){return this._addImplicitHelpCommand??(this.commands.length&&!this._actionHandler&&!this._findCommand("help"))?(this._helpCommand===void 0&&this.helpCommand(void 0,void 0),this._helpCommand):null}hook(e,t){let i=["preSubcommand","preAction","postAction"];if(!i.includes(e))throw new Error(`Unexpected value for event passed to hook : '${e}'.
14
+ Expecting one of '${i.join("', '")}'`);return this._lifeCycleHooks[e]?this._lifeCycleHooks[e].push(t):this._lifeCycleHooks[e]=[t],this}exitOverride(e){return e?this._exitCallback=e:this._exitCallback=t=>{if(t.code!=="commander.executeSubCommandAsync")throw t},this}_exit(e,t,i){this._exitCallback&&this._exitCallback(new Qn(e,t,i)),ee.exit(e)}action(e){let t=i=>{let o=this.registeredArguments.length,r=i.slice(0,o);return this._storeOptionsAsProperties?r[o]=this:r[o]=this.opts(),r.push(this),e.apply(this,r)};return this._actionHandler=t,this}createOption(e,t){return new Li(e,t)}_callParseArg(e,t,i,o){try{return e.parseArg(t,i)}catch(r){if(r.code==="commander.invalidArgument"){let a=`${o} ${r.message}`;this.error(a,{exitCode:r.exitCode,code:r.code})}throw r}}_registerOption(e){let t=e.short&&this._findOption(e.short)||e.long&&this._findOption(e.long);if(t){let i=e.long&&this._findOption(e.long)?e.long:e.short;throw new Error(`Cannot add option '${e.flags}'${this._name&&` to command '${this._name}'`} due to conflicting flag '${i}'
15
+ - already used by option '${t.flags}'`)}this.options.push(e)}_registerCommand(e){let t=o=>[o.name()].concat(o.aliases()),i=t(e).find(o=>this._findCommand(o));if(i){let o=t(this._findCommand(i)).join("|"),r=t(e).join("|");throw new Error(`cannot add command '${r}' as already have command '${o}'`)}this.commands.push(e)}addOption(e){this._registerOption(e);let t=e.name(),i=e.attributeName();if(e.negate){let r=e.long.replace(/^--no-/,"--");this._findOption(r)||this.setOptionValueWithSource(i,e.defaultValue===void 0?!0:e.defaultValue,"default")}else e.defaultValue!==void 0&&this.setOptionValueWithSource(i,e.defaultValue,"default");let o=(r,a,s)=>{r==null&&e.presetArg!==void 0&&(r=e.presetArg);let l=this.getOptionValue(i);r!==null&&e.parseArg?r=this._callParseArg(e,r,l,a):r!==null&&e.variadic&&(r=e._concatValue(r,l)),r==null&&(e.negate?r=!1:e.isBoolean()||e.optional?r=!0:r=""),this.setOptionValueWithSource(i,r,s)};return this.on("option:"+t,r=>{let a=`error: option '${e.flags}' argument '${r}' is invalid.`;o(r,a,"cli")}),e.envVar&&this.on("optionEnv:"+t,r=>{let a=`error: option '${e.flags}' value '${r}' from env '${e.envVar}' is invalid.`;o(r,a,"env")}),this}_optionEx(e,t,i,o,r){if(typeof t=="object"&&t instanceof Li)throw new Error("To add an Option object use addOption() instead of option() or requiredOption()");let a=this.createOption(t,i);if(a.makeOptionMandatory(!!e.mandatory),typeof o=="function")a.default(r).argParser(o);else if(o instanceof RegExp){let s=o;o=(l,u)=>{let c=s.exec(l);return c?c[0]:u},a.default(r).argParser(o)}else a.default(o);return this.addOption(a)}option(e,t,i,o){return this._optionEx({},e,t,i,o)}requiredOption(e,t,i,o){return this._optionEx({mandatory:!0},e,t,i,o)}combineFlagAndOptionalValue(e=!0){return this._combineFlagAndOptionalValue=!!e,this}allowUnknownOption(e=!0){return this._allowUnknownOption=!!e,this}allowExcessArguments(e=!0){return this._allowExcessArguments=!!e,this}enablePositionalOptions(e=!0){return this._enablePositionalOptions=!!e,this}passThroughOptions(e=!0){return this._passThroughOptions=!!e,this._checkForBrokenPassThrough(),this}_checkForBrokenPassThrough(){if(this.parent&&this._passThroughOptions&&!this.parent._enablePositionalOptions)throw new Error(`passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`)}storeOptionsAsProperties(e=!0){if(this.options.length)throw new Error("call .storeOptionsAsProperties() before adding options");if(Object.keys(this._optionValues).length)throw new Error("call .storeOptionsAsProperties() before setting option values");return this._storeOptionsAsProperties=!!e,this}getOptionValue(e){return this._storeOptionsAsProperties?this[e]:this._optionValues[e]}setOptionValue(e,t){return this.setOptionValueWithSource(e,t,void 0)}setOptionValueWithSource(e,t,i){return this._storeOptionsAsProperties?this[e]=t:this._optionValues[e]=t,this._optionValueSources[e]=i,this}getOptionValueSource(e){return this._optionValueSources[e]}getOptionValueSourceWithGlobals(e){let t;return this._getCommandAndAncestors().forEach(i=>{i.getOptionValueSource(e)!==void 0&&(t=i.getOptionValueSource(e))}),t}_prepareUserArgs(e,t){if(e!==void 0&&!Array.isArray(e))throw new Error("first parameter to parse must be array or undefined");if(t=t||{},e===void 0&&t.from===void 0){ee.versions?.electron&&(t.from="electron");let o=ee.execArgv??[];(o.includes("-e")||o.includes("--eval")||o.includes("-p")||o.includes("--print"))&&(t.from="eval")}e===void 0&&(e=ee.argv),this.rawArgs=e.slice();let i;switch(t.from){case void 0:case"node":this._scriptPath=e[1],i=e.slice(2);break;case"electron":ee.defaultApp?(this._scriptPath=e[1],i=e.slice(2)):i=e.slice(1);break;case"user":i=e.slice(0);break;case"eval":i=e.slice(1);break;default:throw new Error(`unexpected parse option { from: '${t.from}' }`)}return!this._name&&this._scriptPath&&this.nameFromFilename(this._scriptPath),this._name=this._name||"program",i}parse(e,t){let i=this._prepareUserArgs(e,t);return this._parseCommand([],i),this}async parseAsync(e,t){let i=this._prepareUserArgs(e,t);return await this._parseCommand([],i),this}_executeSubCommand(e,t){t=t.slice();let i=!1,o=[".js",".ts",".tsx",".mjs",".cjs"];function r(c,m){let p=Be.resolve(c,m);if(Xn.existsSync(p))return p;if(o.includes(Be.extname(m)))return;let g=o.find(d=>Xn.existsSync(`${p}${d}`));if(g)return`${p}${g}`}this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let a=e._executableFile||`${this._name}-${e._name}`,s=this._executableDir||"";if(this._scriptPath){let c;try{c=Xn.realpathSync(this._scriptPath)}catch{c=this._scriptPath}s=Be.resolve(Be.dirname(c),s)}if(s){let c=r(s,a);if(!c&&!e._executableFile&&this._scriptPath){let m=Be.basename(this._scriptPath,Be.extname(this._scriptPath));m!==this._name&&(c=r(s,`${m}-${e._name}`))}a=c||a}i=o.includes(Be.extname(a));let l;ee.platform!=="win32"?i?(t.unshift(a),t=Vi(ee.execArgv).concat(t),l=zn.spawn(ee.argv[0],t,{stdio:"inherit"})):l=zn.spawn(a,t,{stdio:"inherit"}):(t.unshift(a),t=Vi(ee.execArgv).concat(t),l=zn.spawn(ee.execPath,t,{stdio:"inherit"})),l.killed||["SIGUSR1","SIGUSR2","SIGTERM","SIGINT","SIGHUP"].forEach(m=>{ee.on(m,()=>{l.killed===!1&&l.exitCode===null&&l.kill(m)})});let u=this._exitCallback;l.on("close",c=>{c=c??1,u?u(new Qn(c,"commander.executeSubCommandAsync","(close)")):ee.exit(c)}),l.on("error",c=>{if(c.code==="ENOENT"){let m=s?`searched for local subcommand relative to directory '${s}'`:"no directory for search for local subcommand, use .executableDir() to supply a custom directory",p=`'${a}' does not exist
16
16
  - if '${e._name}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead
17
17
  - if the default executable name is not suitable, use the executableFile option to supply a custom name or path
18
- - ${m}`;throw new Error(p)}else if(c.code==="EACCES")throw new Error(`'${s}' not executable`);if(!u)ee.exit(1);else{let m=new Qn(1,"commander.executeSubCommandAsync","(error)");m.nestedError=c,u(m)}}),this.runningCommand=l}_dispatchSubcommand(e,t,i){let o=this._findCommand(e);o||this.help({error:!0});let r;return r=this._chainOrCallSubCommandHook(r,o,"preSubcommand"),r=this._chainOrCall(r,()=>{if(o._executableHandler)this._executeSubCommand(o,t.concat(i));else return o._parseCommand(t,i)}),r}_dispatchHelpCommand(e){e||this.help();let t=this._findCommand(e);return t&&!t._executableHandler&&t.help(),this._dispatchSubcommand(e,[],[this._getHelpOption()?.long??this._getHelpOption()?.short??"--help"])}_checkNumberOfArguments(){this.registeredArguments.forEach((e,t)=>{e.required&&this.args[t]==null&&this.missingArgument(e.name())}),!(this.registeredArguments.length>0&&this.registeredArguments[this.registeredArguments.length-1].variadic)&&this.args.length>this.registeredArguments.length&&this._excessArguments(this.args)}_processArguments(){let e=(i,o,r)=>{let s=o;if(o!==null&&i.parseArg){let a=`error: command-argument value '${o}' is invalid for argument '${i.name()}'.`;s=this._callParseArg(i,o,r,a)}return s};this._checkNumberOfArguments();let t=[];this.registeredArguments.forEach((i,o)=>{let r=i.defaultValue;i.variadic?o<this.args.length?(r=this.args.slice(o),i.parseArg&&(r=r.reduce((s,a)=>e(i,a,s),i.defaultValue))):r===void 0&&(r=[]):o<this.args.length&&(r=this.args[o],i.parseArg&&(r=e(i,r,i.defaultValue))),t[o]=r}),this.processedArgs=t}_chainOrCall(e,t){return e&&e.then&&typeof e.then=="function"?e.then(()=>t()):t()}_chainOrCallHooks(e,t){let i=e,o=[];return this._getCommandAndAncestors().reverse().filter(r=>r._lifeCycleHooks[t]!==void 0).forEach(r=>{r._lifeCycleHooks[t].forEach(s=>{o.push({hookedCommand:r,callback:s})})}),t==="postAction"&&o.reverse(),o.forEach(r=>{i=this._chainOrCall(i,()=>r.callback(r.hookedCommand,this))}),i}_chainOrCallSubCommandHook(e,t,i){let o=e;return this._lifeCycleHooks[i]!==void 0&&this._lifeCycleHooks[i].forEach(r=>{o=this._chainOrCall(o,()=>r(this,t))}),o}_parseCommand(e,t){let i=this.parseOptions(t);if(this._parseOptionsEnv(),this._parseOptionsImplied(),e=e.concat(i.operands),t=i.unknown,this.args=e.concat(t),e&&this._findCommand(e[0]))return this._dispatchSubcommand(e[0],e.slice(1),t);if(this._getHelpCommand()&&e[0]===this._getHelpCommand().name())return this._dispatchHelpCommand(e[1]);if(this._defaultCommandName)return this._outputHelpIfRequested(t),this._dispatchSubcommand(this._defaultCommandName,e,t);this.commands.length&&this.args.length===0&&!this._actionHandler&&!this._defaultCommandName&&this.help({error:!0}),this._outputHelpIfRequested(i.unknown),this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let o=()=>{i.unknown.length>0&&this.unknownOption(i.unknown[0])},r=`command:${this.name()}`;if(this._actionHandler){o(),this._processArguments();let s;return s=this._chainOrCallHooks(s,"preAction"),s=this._chainOrCall(s,()=>this._actionHandler(this.processedArgs)),this.parent&&(s=this._chainOrCall(s,()=>{this.parent.emit(r,e,t)})),s=this._chainOrCallHooks(s,"postAction"),s}if(this.parent&&this.parent.listenerCount(r))o(),this._processArguments(),this.parent.emit(r,e,t);else if(e.length){if(this._findCommand("*"))return this._dispatchSubcommand("*",e,t);this.listenerCount("command:*")?this.emit("command:*",e,t):this.commands.length?this.unknownCommand():(o(),this._processArguments())}else this.commands.length?(o(),this.help({error:!0})):(o(),this._processArguments())}_findCommand(e){if(e)return this.commands.find(t=>t._name===e||t._aliases.includes(e))}_findOption(e){return this.options.find(t=>t.is(e))}_checkForMissingMandatoryOptions(){this._getCommandAndAncestors().forEach(e=>{e.options.forEach(t=>{t.mandatory&&e.getOptionValue(t.attributeName())===void 0&&e.missingMandatoryOptionValue(t)})})}_checkForConflictingLocalOptions(){let e=this.options.filter(i=>{let o=i.attributeName();return this.getOptionValue(o)===void 0?!1:this.getOptionValueSource(o)!=="default"});e.filter(i=>i.conflictsWith.length>0).forEach(i=>{let o=e.find(r=>i.conflictsWith.includes(r.attributeName()));o&&this._conflictingOption(i,o)})}_checkForConflictingOptions(){this._getCommandAndAncestors().forEach(e=>{e._checkForConflictingLocalOptions()})}parseOptions(e){let t=[],i=[],o=t,r=e.slice();function s(l){return l.length>1&&l[0]==="-"}let a=null;for(;r.length;){let l=r.shift();if(l==="--"){o===i&&o.push(l),o.push(...r);break}if(a&&!s(l)){this.emit(`option:${a.name()}`,l);continue}if(a=null,s(l)){let u=this._findOption(l);if(u){if(u.required){let c=r.shift();c===void 0&&this.optionMissingArgument(u),this.emit(`option:${u.name()}`,c)}else if(u.optional){let c=null;r.length>0&&!s(r[0])&&(c=r.shift()),this.emit(`option:${u.name()}`,c)}else this.emit(`option:${u.name()}`);a=u.variadic?u:null;continue}}if(l.length>2&&l[0]==="-"&&l[1]!=="-"){let u=this._findOption(`-${l[1]}`);if(u){u.required||u.optional&&this._combineFlagAndOptionalValue?this.emit(`option:${u.name()}`,l.slice(2)):(this.emit(`option:${u.name()}`),r.unshift(`-${l.slice(2)}`));continue}}if(/^--[^=]+=/.test(l)){let u=l.indexOf("="),c=this._findOption(l.slice(0,u));if(c&&(c.required||c.optional)){this.emit(`option:${c.name()}`,l.slice(u+1));continue}}if(s(l)&&(o=i),(this._enablePositionalOptions||this._passThroughOptions)&&t.length===0&&i.length===0){if(this._findCommand(l)){t.push(l),r.length>0&&i.push(...r);break}else if(this._getHelpCommand()&&l===this._getHelpCommand().name()){t.push(l),r.length>0&&t.push(...r);break}else if(this._defaultCommandName){i.push(l),r.length>0&&i.push(...r);break}}if(this._passThroughOptions){o.push(l),r.length>0&&o.push(...r);break}o.push(l)}return{operands:t,unknown:i}}opts(){if(this._storeOptionsAsProperties){let e={},t=this.options.length;for(let i=0;i<t;i++){let o=this.options[i].attributeName();e[o]=o===this._versionOptionName?this._version:this[o]}return e}return this._optionValues}optsWithGlobals(){return this._getCommandAndAncestors().reduce((e,t)=>Object.assign(e,t.opts()),{})}error(e,t){this._outputConfiguration.outputError(`${e}
18
+ - ${m}`;throw new Error(p)}else if(c.code==="EACCES")throw new Error(`'${a}' not executable`);if(!u)ee.exit(1);else{let m=new Qn(1,"commander.executeSubCommandAsync","(error)");m.nestedError=c,u(m)}}),this.runningCommand=l}_dispatchSubcommand(e,t,i){let o=this._findCommand(e);o||this.help({error:!0});let r;return r=this._chainOrCallSubCommandHook(r,o,"preSubcommand"),r=this._chainOrCall(r,()=>{if(o._executableHandler)this._executeSubCommand(o,t.concat(i));else return o._parseCommand(t,i)}),r}_dispatchHelpCommand(e){e||this.help();let t=this._findCommand(e);return t&&!t._executableHandler&&t.help(),this._dispatchSubcommand(e,[],[this._getHelpOption()?.long??this._getHelpOption()?.short??"--help"])}_checkNumberOfArguments(){this.registeredArguments.forEach((e,t)=>{e.required&&this.args[t]==null&&this.missingArgument(e.name())}),!(this.registeredArguments.length>0&&this.registeredArguments[this.registeredArguments.length-1].variadic)&&this.args.length>this.registeredArguments.length&&this._excessArguments(this.args)}_processArguments(){let e=(i,o,r)=>{let a=o;if(o!==null&&i.parseArg){let s=`error: command-argument value '${o}' is invalid for argument '${i.name()}'.`;a=this._callParseArg(i,o,r,s)}return a};this._checkNumberOfArguments();let t=[];this.registeredArguments.forEach((i,o)=>{let r=i.defaultValue;i.variadic?o<this.args.length?(r=this.args.slice(o),i.parseArg&&(r=r.reduce((a,s)=>e(i,s,a),i.defaultValue))):r===void 0&&(r=[]):o<this.args.length&&(r=this.args[o],i.parseArg&&(r=e(i,r,i.defaultValue))),t[o]=r}),this.processedArgs=t}_chainOrCall(e,t){return e&&e.then&&typeof e.then=="function"?e.then(()=>t()):t()}_chainOrCallHooks(e,t){let i=e,o=[];return this._getCommandAndAncestors().reverse().filter(r=>r._lifeCycleHooks[t]!==void 0).forEach(r=>{r._lifeCycleHooks[t].forEach(a=>{o.push({hookedCommand:r,callback:a})})}),t==="postAction"&&o.reverse(),o.forEach(r=>{i=this._chainOrCall(i,()=>r.callback(r.hookedCommand,this))}),i}_chainOrCallSubCommandHook(e,t,i){let o=e;return this._lifeCycleHooks[i]!==void 0&&this._lifeCycleHooks[i].forEach(r=>{o=this._chainOrCall(o,()=>r(this,t))}),o}_parseCommand(e,t){let i=this.parseOptions(t);if(this._parseOptionsEnv(),this._parseOptionsImplied(),e=e.concat(i.operands),t=i.unknown,this.args=e.concat(t),e&&this._findCommand(e[0]))return this._dispatchSubcommand(e[0],e.slice(1),t);if(this._getHelpCommand()&&e[0]===this._getHelpCommand().name())return this._dispatchHelpCommand(e[1]);if(this._defaultCommandName)return this._outputHelpIfRequested(t),this._dispatchSubcommand(this._defaultCommandName,e,t);this.commands.length&&this.args.length===0&&!this._actionHandler&&!this._defaultCommandName&&this.help({error:!0}),this._outputHelpIfRequested(i.unknown),this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let o=()=>{i.unknown.length>0&&this.unknownOption(i.unknown[0])},r=`command:${this.name()}`;if(this._actionHandler){o(),this._processArguments();let a;return a=this._chainOrCallHooks(a,"preAction"),a=this._chainOrCall(a,()=>this._actionHandler(this.processedArgs)),this.parent&&(a=this._chainOrCall(a,()=>{this.parent.emit(r,e,t)})),a=this._chainOrCallHooks(a,"postAction"),a}if(this.parent&&this.parent.listenerCount(r))o(),this._processArguments(),this.parent.emit(r,e,t);else if(e.length){if(this._findCommand("*"))return this._dispatchSubcommand("*",e,t);this.listenerCount("command:*")?this.emit("command:*",e,t):this.commands.length?this.unknownCommand():(o(),this._processArguments())}else this.commands.length?(o(),this.help({error:!0})):(o(),this._processArguments())}_findCommand(e){if(e)return this.commands.find(t=>t._name===e||t._aliases.includes(e))}_findOption(e){return this.options.find(t=>t.is(e))}_checkForMissingMandatoryOptions(){this._getCommandAndAncestors().forEach(e=>{e.options.forEach(t=>{t.mandatory&&e.getOptionValue(t.attributeName())===void 0&&e.missingMandatoryOptionValue(t)})})}_checkForConflictingLocalOptions(){let e=this.options.filter(i=>{let o=i.attributeName();return this.getOptionValue(o)===void 0?!1:this.getOptionValueSource(o)!=="default"});e.filter(i=>i.conflictsWith.length>0).forEach(i=>{let o=e.find(r=>i.conflictsWith.includes(r.attributeName()));o&&this._conflictingOption(i,o)})}_checkForConflictingOptions(){this._getCommandAndAncestors().forEach(e=>{e._checkForConflictingLocalOptions()})}parseOptions(e){let t=[],i=[],o=t,r=e.slice();function a(l){return l.length>1&&l[0]==="-"}let s=null;for(;r.length;){let l=r.shift();if(l==="--"){o===i&&o.push(l),o.push(...r);break}if(s&&!a(l)){this.emit(`option:${s.name()}`,l);continue}if(s=null,a(l)){let u=this._findOption(l);if(u){if(u.required){let c=r.shift();c===void 0&&this.optionMissingArgument(u),this.emit(`option:${u.name()}`,c)}else if(u.optional){let c=null;r.length>0&&!a(r[0])&&(c=r.shift()),this.emit(`option:${u.name()}`,c)}else this.emit(`option:${u.name()}`);s=u.variadic?u:null;continue}}if(l.length>2&&l[0]==="-"&&l[1]!=="-"){let u=this._findOption(`-${l[1]}`);if(u){u.required||u.optional&&this._combineFlagAndOptionalValue?this.emit(`option:${u.name()}`,l.slice(2)):(this.emit(`option:${u.name()}`),r.unshift(`-${l.slice(2)}`));continue}}if(/^--[^=]+=/.test(l)){let u=l.indexOf("="),c=this._findOption(l.slice(0,u));if(c&&(c.required||c.optional)){this.emit(`option:${c.name()}`,l.slice(u+1));continue}}if(a(l)&&(o=i),(this._enablePositionalOptions||this._passThroughOptions)&&t.length===0&&i.length===0){if(this._findCommand(l)){t.push(l),r.length>0&&i.push(...r);break}else if(this._getHelpCommand()&&l===this._getHelpCommand().name()){t.push(l),r.length>0&&t.push(...r);break}else if(this._defaultCommandName){i.push(l),r.length>0&&i.push(...r);break}}if(this._passThroughOptions){o.push(l),r.length>0&&o.push(...r);break}o.push(l)}return{operands:t,unknown:i}}opts(){if(this._storeOptionsAsProperties){let e={},t=this.options.length;for(let i=0;i<t;i++){let o=this.options[i].attributeName();e[o]=o===this._versionOptionName?this._version:this[o]}return e}return this._optionValues}optsWithGlobals(){return this._getCommandAndAncestors().reduce((e,t)=>Object.assign(e,t.opts()),{})}error(e,t){this._outputConfiguration.outputError(`${e}
19
19
  `,this._outputConfiguration.writeErr),typeof this._showHelpAfterError=="string"?this._outputConfiguration.writeErr(`${this._showHelpAfterError}
20
20
  `):this._showHelpAfterError&&(this._outputConfiguration.writeErr(`
21
- `),this.outputHelp({error:!0}));let i=t||{},o=i.exitCode||1,r=i.code||"commander.error";this._exit(o,r,e)}_parseOptionsEnv(){this.options.forEach(e=>{if(e.envVar&&e.envVar in ee.env){let t=e.attributeName();(this.getOptionValue(t)===void 0||["default","config","env"].includes(this.getOptionValueSource(t)))&&(e.required||e.optional?this.emit(`optionEnv:${e.name()}`,ee.env[e.envVar]):this.emit(`optionEnv:${e.name()}`))}})}_parseOptionsImplied(){let e=new al(this.options),t=i=>this.getOptionValue(i)!==void 0&&!["default","implied"].includes(this.getOptionValueSource(i));this.options.filter(i=>i.implied!==void 0&&t(i.attributeName())&&e.valueFromOption(this.getOptionValue(i.attributeName()),i)).forEach(i=>{Object.keys(i.implied).filter(o=>!t(o)).forEach(o=>{this.setOptionValueWithSource(o,i.implied[o],"implied")})})}missingArgument(e){let t=`error: missing required argument '${e}'`;this.error(t,{code:"commander.missingArgument"})}optionMissingArgument(e){let t=`error: option '${e.flags}' argument missing`;this.error(t,{code:"commander.optionMissingArgument"})}missingMandatoryOptionValue(e){let t=`error: required option '${e.flags}' not specified`;this.error(t,{code:"commander.missingMandatoryOptionValue"})}_conflictingOption(e,t){let i=s=>{let a=s.attributeName(),l=this.getOptionValue(a),u=this.options.find(m=>m.negate&&a===m.attributeName()),c=this.options.find(m=>!m.negate&&a===m.attributeName());return u&&(u.presetArg===void 0&&l===!1||u.presetArg!==void 0&&l===u.presetArg)?u:c||s},o=s=>{let a=i(s),l=a.attributeName();return this.getOptionValueSource(l)==="env"?`environment variable '${a.envVar}'`:`option '${a.flags}'`},r=`error: ${o(e)} cannot be used with ${o(t)}`;this.error(r,{code:"commander.conflictingOption"})}unknownOption(e){if(this._allowUnknownOption)return;let t="";if(e.startsWith("--")&&this._showSuggestionAfterError){let o=[],r=this;do{let s=r.createHelp().visibleOptions(r).filter(a=>a.long).map(a=>a.long);o=o.concat(s),r=r.parent}while(r&&!r._enablePositionalOptions);t=Ui(e,o)}let i=`error: unknown option '${e}'${t}`;this.error(i,{code:"commander.unknownOption"})}_excessArguments(e){if(this._allowExcessArguments)return;let t=this.registeredArguments.length,i=t===1?"":"s",r=`error: too many arguments${this.parent?` for '${this.name()}'`:""}. Expected ${t} argument${i} but got ${e.length}.`;this.error(r,{code:"commander.excessArguments"})}unknownCommand(){let e=this.args[0],t="";if(this._showSuggestionAfterError){let o=[];this.createHelp().visibleCommands(this).forEach(r=>{o.push(r.name()),r.alias()&&o.push(r.alias())}),t=Ui(e,o)}let i=`error: unknown command '${e}'${t}`;this.error(i,{code:"commander.unknownCommand"})}version(e,t,i){if(e===void 0)return this._version;this._version=e,t=t||"-V, --version",i=i||"output the version number";let o=this.createOption(t,i);return this._versionOptionName=o.attributeName(),this._registerOption(o),this.on("option:"+o.name(),()=>{this._outputConfiguration.writeOut(`${e}
21
+ `),this.outputHelp({error:!0}));let i=t||{},o=i.exitCode||1,r=i.code||"commander.error";this._exit(o,r,e)}_parseOptionsEnv(){this.options.forEach(e=>{if(e.envVar&&e.envVar in ee.env){let t=e.attributeName();(this.getOptionValue(t)===void 0||["default","config","env"].includes(this.getOptionValueSource(t)))&&(e.required||e.optional?this.emit(`optionEnv:${e.name()}`,ee.env[e.envVar]):this.emit(`optionEnv:${e.name()}`))}})}_parseOptionsImplied(){let e=new al(this.options),t=i=>this.getOptionValue(i)!==void 0&&!["default","implied"].includes(this.getOptionValueSource(i));this.options.filter(i=>i.implied!==void 0&&t(i.attributeName())&&e.valueFromOption(this.getOptionValue(i.attributeName()),i)).forEach(i=>{Object.keys(i.implied).filter(o=>!t(o)).forEach(o=>{this.setOptionValueWithSource(o,i.implied[o],"implied")})})}missingArgument(e){let t=`error: missing required argument '${e}'`;this.error(t,{code:"commander.missingArgument"})}optionMissingArgument(e){let t=`error: option '${e.flags}' argument missing`;this.error(t,{code:"commander.optionMissingArgument"})}missingMandatoryOptionValue(e){let t=`error: required option '${e.flags}' not specified`;this.error(t,{code:"commander.missingMandatoryOptionValue"})}_conflictingOption(e,t){let i=a=>{let s=a.attributeName(),l=this.getOptionValue(s),u=this.options.find(m=>m.negate&&s===m.attributeName()),c=this.options.find(m=>!m.negate&&s===m.attributeName());return u&&(u.presetArg===void 0&&l===!1||u.presetArg!==void 0&&l===u.presetArg)?u:c||a},o=a=>{let s=i(a),l=s.attributeName();return this.getOptionValueSource(l)==="env"?`environment variable '${s.envVar}'`:`option '${s.flags}'`},r=`error: ${o(e)} cannot be used with ${o(t)}`;this.error(r,{code:"commander.conflictingOption"})}unknownOption(e){if(this._allowUnknownOption)return;let t="";if(e.startsWith("--")&&this._showSuggestionAfterError){let o=[],r=this;do{let a=r.createHelp().visibleOptions(r).filter(s=>s.long).map(s=>s.long);o=o.concat(a),r=r.parent}while(r&&!r._enablePositionalOptions);t=Ui(e,o)}let i=`error: unknown option '${e}'${t}`;this.error(i,{code:"commander.unknownOption"})}_excessArguments(e){if(this._allowExcessArguments)return;let t=this.registeredArguments.length,i=t===1?"":"s",r=`error: too many arguments${this.parent?` for '${this.name()}'`:""}. Expected ${t} argument${i} but got ${e.length}.`;this.error(r,{code:"commander.excessArguments"})}unknownCommand(){let e=this.args[0],t="";if(this._showSuggestionAfterError){let o=[];this.createHelp().visibleCommands(this).forEach(r=>{o.push(r.name()),r.alias()&&o.push(r.alias())}),t=Ui(e,o)}let i=`error: unknown command '${e}'${t}`;this.error(i,{code:"commander.unknownCommand"})}version(e,t,i){if(e===void 0)return this._version;this._version=e,t=t||"-V, --version",i=i||"output the version number";let o=this.createOption(t,i);return this._versionOptionName=o.attributeName(),this._registerOption(o),this.on("option:"+o.name(),()=>{this._outputConfiguration.writeOut(`${e}
22
22
  `),this._exit(0,"commander.version",e)}),this}description(e,t){return e===void 0&&t===void 0?this._description:(this._description=e,t&&(this._argsDescription=t),this)}summary(e){return e===void 0?this._summary:(this._summary=e,this)}alias(e){if(e===void 0)return this._aliases[0];let t=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler&&(t=this.commands[this.commands.length-1]),e===t._name)throw new Error("Command alias can't be the same as its name");let i=this.parent?._findCommand(e);if(i){let o=[i.name()].concat(i.aliases()).join("|");throw new Error(`cannot add alias '${e}' to command '${this.name()}' as already have command '${o}'`)}return t._aliases.push(e),this}aliases(e){return e===void 0?this._aliases:(e.forEach(t=>this.alias(t)),this)}usage(e){if(e===void 0){if(this._usage)return this._usage;let t=this.registeredArguments.map(i=>il(i));return[].concat(this.options.length||this._helpOption!==null?"[options]":[],this.commands.length?"[command]":[],this.registeredArguments.length?t:[]).join(" ")}return this._usage=e,this}name(e){return e===void 0?this._name:(this._name=e,this)}nameFromFilename(e){return this._name=Be.basename(e,Be.extname(e)),this}executableDir(e){return e===void 0?this._executableDir:(this._executableDir=e,this)}helpInformation(e){let t=this.createHelp();return t.helpWidth===void 0&&(t.helpWidth=e&&e.error?this._outputConfiguration.getErrHelpWidth():this._outputConfiguration.getOutHelpWidth()),t.formatHelp(this,t)}_getHelpContext(e){e=e||{};let t={error:!!e.error},i;return t.error?i=o=>this._outputConfiguration.writeErr(o):i=o=>this._outputConfiguration.writeOut(o),t.write=e.write||i,t.command=this,t}outputHelp(e){let t;typeof e=="function"&&(t=e,e=void 0);let i=this._getHelpContext(e);this._getCommandAndAncestors().reverse().forEach(r=>r.emit("beforeAllHelp",i)),this.emit("beforeHelp",i);let o=this.helpInformation(i);if(t&&(o=t(o),typeof o!="string"&&!Buffer.isBuffer(o)))throw new Error("outputHelp callback must return a string or a Buffer");i.write(o),this._getHelpOption()?.long&&this.emit(this._getHelpOption().long),this.emit("afterHelp",i),this._getCommandAndAncestors().forEach(r=>r.emit("afterAllHelp",i))}helpOption(e,t){return typeof e=="boolean"?(e?this._helpOption=this._helpOption??void 0:this._helpOption=null,this):(e=e??"-h, --help",t=t??"display help for command",this._helpOption=this.createOption(e,t),this)}_getHelpOption(){return this._helpOption===void 0&&this.helpOption(void 0,void 0),this._helpOption}addHelpOption(e){return this._helpOption=e,this}help(e){this.outputHelp(e);let t=ee.exitCode||0;t===0&&e&&typeof e!="function"&&e.error&&(t=1),this._exit(t,"commander.help","(outputHelp)")}addHelpText(e,t){let i=["beforeAll","before","after","afterAll"];if(!i.includes(e))throw new Error(`Unexpected value for position to addHelpText.
23
- Expecting one of '${i.join("', '")}'`);let o=`${e}Help`;return this.on(o,r=>{let s;typeof t=="function"?s=t({error:r.error,command:r.command}):s=t,s&&r.write(`${s}
24
- `)}),this}_outputHelpIfRequested(e){let t=this._getHelpOption();t&&e.find(o=>t.is(o))&&(this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)"))}};function Vi(n){return n.map(e=>{if(!e.startsWith("--inspect"))return e;let t,i="127.0.0.1",o="9229",r;return(r=e.match(/^(--inspect(-brk)?)$/))!==null?t=r[1]:(r=e.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null?(t=r[1],/^\d+$/.test(r[3])?o=r[3]:i=r[3]):(r=e.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(t=r[1],i=r[3],o=r[4]),t&&o!=="0"?`${t}=${i}:${parseInt(o)+1}`:e})}Bi.Command=Zn});var Yi=Xe(Ee=>{"use strict";var{Argument:Wi}=an(),{Command:er}=Hi(),{CommanderError:ll,InvalidArgumentError:qi}=Et(),{Help:cl}=qn(),{Option:Ki}=Jn();Ee.program=new er;Ee.createCommand=n=>new er(n);Ee.createOption=(n,e)=>new Ki(n,e);Ee.createArgument=(n,e)=>new Wi(n,e);Ee.Command=er;Ee.Option=Ki;Ee.Argument=Wi;Ee.Help=cl;Ee.CommanderError=ll;Ee.InvalidArgumentError=qi;Ee.InvalidOptionArgumentError=qi});var Dt=Se(xt(),1);import ae from"process";import*as Ga from"tls";function Di(){let n=Ga;if(!(typeof n.getCACertificates!="function"||typeof n.setDefaultCACertificates!="function"))try{let e=o=>typeof o=="string",t=n.getCACertificates("default").filter(e),i=n.getCACertificates("system").filter(e);n.setDefaultCACertificates([...new Set([...t,...i])])}catch{}}var $i=!1;function Mi(){if(!$i)try{if(typeof process.emitWarning!="function")return;let n=process.emitWarning.bind(process),e=((t,...i)=>{let o=typeof t=="string"?t:t?.message??"";if(!((typeof i[0]=="string"?i[0]:typeof t=="object"&&t?t.name:void 0)==="ExperimentalWarning"&&o.includes("buffer.File")))return n(t,...i)});process.emitWarning=e,$i=!0}catch{}}var Gi=Se(Yi(),1),{program:Rd,createCommand:Ad,createArgument:Pd,createOption:Od,CommanderError:Dd,InvalidArgumentError:Ji,InvalidOptionArgumentError:$d,Command:tt,Argument:Md,Option:G,Help:jd}=Gi.default;import{basename as ld,join as Pe,resolve as cd}from"path";var vr=Se(xt(),1);var be=Se(xt(),1);var Ge=Se(at(),1);function zi({steps:n,bifurcationInfo:e,perFlowMetadata:t}){return!e||e.isSingleFlow||!t||t.length<=1?null:(0,Ge.jsx)(ne,{flexDirection:"column",children:t.map((i,o)=>{let r=n[o],s=r?.children??[],a=s.filter(g=>g.status==="passed").length,l=s.filter(g=>g.status==="failed").length,u=a+l,c=s.reduce((g,d)=>g+(d.duration??0),0),m=r?.status==="failed"?"failed":"passed",p=e.flows[o]??r?.objective??`Flow ${o+1}`;return(0,Ge.jsxs)(ne,{flexDirection:"column",marginTop:o>0?1:0,children:[(0,Ge.jsxs)(ne,{marginLeft:1,children:[(0,Ge.jsx)(q,{color:K.purple,bold:!0,children:"Flow "+(o+1)+": "}),(0,Ge.jsx)(q,{color:K.purple,children:p})]}),(0,Ge.jsx)(Zt,{status:m,summary:i?.summary??"",duration:c,steps:u,stepsPassed:a,stepsFailed:l,reason:i?.error_message??void 0,creditsConsumed:i?.credits_consumed??void 0})]},`flow-summary-${o}`)})})}var re=Se(at(),1);function Xi({config:n,spawnOpts:e,cancelRef:t,banner:i,describeContext:o,onComplete:r,onStepEnd:s,onReasoning:a,onStepComplete:l}){let{exit:u}=Nt(),{append:c}=Lt(),{describe:m,onDescribe:p,creditsRef:g}=fi({resolve:()=>o??null,hostIsTTY:()=>!!process.stderr.isTTY}),d=_o(s,void 0,a,l,p),w=(0,be.useRef)(!1),_=(0,be.useRef)(!1),[h,v]=(0,be.useState)("");(0,be.useEffect)(()=>{w.current||(w.current=!0,d.startRun(n,e))},[n,e,d]),(0,be.useEffect)(()=>{t&&(t.current=()=>d.cancelRun())},[t,d]),(0,be.useEffect)(()=>{d.isRunning||m.stop()},[d.isRunning,m.stop]);let R=(0,be.useRef)(0);Sn((S,k)=>{k.ctrl&&S==="c"&&(d.isRunning?(R.current++,R.current>=2?u():d.cancelRun()):u())}),Sn((S,k)=>{d.askingUser&&(k.return?(d.sendAnswer(h),v("")):k.backspace||k.delete?v(E=>E.slice(0,-1)):S&&!k.ctrl&&!k.meta&&v(E=>E+S))},{isActive:!!d.askingUser}),(0,be.useEffect)(()=>{if(!d.isRunning&&d.lastRunEnd&&!_.current){_.current=!0;let{passed:S,failed:k,total:E}=On(d.steps),L=d.bifurcationInfo;r({lastRunEnd:d.lastRunEnd,stepsPassed:S,stepsFailed:k,stepsTotal:E,hadError:!1,bifurcationFlows:L&&!L.isSingleFlow?L.flows:null,describeCredits:g.current,evidence:d.getEvidenceState()}),d.shutdownRunner().finally(()=>u())}},[d.isRunning,d.lastRunEnd,d.steps,d.shutdownRunner,r,u]),(0,be.useEffect)(()=>{d.runError&&!d.isRunning&&!_.current&&(_.current=!0,r({lastRunEnd:null,stepsPassed:0,stepsFailed:0,stepsTotal:0,hadError:!0,bifurcationFlows:null,describeCredits:g.current,evidence:d.getEvidenceState()}),d.shutdownRunner().finally(()=>u()))},[d.runError,d.isRunning,d.shutdownRunner,r,u]);let I=d.lastRunEnd?(()=>{let{passed:S,failed:k,total:E}=On(d.steps);return{status:d.lastRunEnd.status,duration:d.lastRunEnd.duration??0,summary:d.lastRunEnd.summary??"",stepsPassed:S,stepsFailed:k,stepsTotal:E,reason:d.lastRunEnd.reason,finalState:d.lastRunEnd.final_state,creditsConsumed:(d.lastRunEnd.credits_consumed??0)+g.current}})():null,f=(0,be.useRef)(!1);return(0,be.useEffect)(()=>{f.current||!i||(f.current=!0,c((0,re.jsxs)(ne,{flexDirection:"column",marginBottom:1,children:[(0,re.jsxs)(ne,{borderStyle:"round",borderColor:"#dc4e08",paddingX:2,children:[(0,re.jsx)(q,{color:"#ff9500",bold:!0,children:"KaneAI CLI"}),(0,re.jsx)(q,{color:K.dim,children:" \u2502 "}),(0,re.jsx)(q,{color:K.orange,children:i.model}),(0,re.jsx)(q,{color:K.dim,children:" \u2502 "}),(0,re.jsx)(q,{color:K.dim,children:i.auth})]}),i.status?.map((S,k)=>(0,re.jsx)(q,{color:K.dim,children:S},k))]})))},[]),(0,re.jsxs)(ne,{flexDirection:"column",children:[(()=>{let S=Lr({isRunning:d.isRunning,bifurcationInfo:d.bifurcationInfo,steps:d.steps,cmInitCounts:d.cmInitCounts,replayInfo:d.replayInfo});return S?(0,re.jsx)(Fr,{label:S.label,hasBifurcation:S.hasBifurcation}):null})(),d.steps.length>0&&(0,re.jsx)(Nr,{steps:d.steps,bifurcated:!!d.bifurcationInfo&&!d.bifurcationInfo.isSingleFlow,flows:d.bifurcationInfo?.flows,cmInitCounts:d.cmInitCounts,staticSteps:!0,onStepCommit:c,describe:m.text,describeVisible:m.visible,describeRevealing:m.revealing}),d.askingUser&&(0,re.jsxs)(ne,{flexDirection:"column",marginTop:1,children:[(0,re.jsxs)(q,{color:K.orange,children:['Agent is asking: "',d.askingUser,'"']}),(0,re.jsxs)(q,{children:["> ",h,"\u2588"]})]}),d.runError&&(0,re.jsx)(Go,{message:d.runError,code:"RUNNER_ERROR"}),I&&d.lastRunEnd&&(0,re.jsx)(zi,{steps:d.steps,bifurcationInfo:d.bifurcationInfo,perFlowMetadata:d.lastRunEnd.per_flow_metadata??[]}),I&&(0,re.jsx)(Zt,{status:I.status==="passed"?"passed":"failed",summary:I.summary??"",duration:I.duration,steps:I.stepsTotal,stepsPassed:I.stepsPassed,stepsFailed:I.stepsFailed,reason:I.reason,creditsConsumed:I.creditsConsumed})]})}import{createInterface as dl}from"readline";function nt(n){process.stdout.write(JSON.stringify(n)+`
25
- `)}async function Qi(n,e,t){let i=fo();if(!i)throw new Error("v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available.");let o=ho({environment:e?.environment,mode:e?.mode,assertionMode:e?.assertionMode,finalValidation:e?.finalValidation,username:n.username,accessKey:n.access_key,sessionId:n.session_id});n.device?.platform&&await go(o,n.device);let r=new wo({env:o,runner:i,log:e?.log,sessionId:n.session_id}),s={...yo(n),headless:n.headless??!1},a={...n};delete a.run_id,bo(a,{environment:e?.environment});let l=`run-${n.run_index}`;nn().then(h=>{h&&nt({type:"update_available",current:h.current,latest:h.latest,severity:h.severity})}).catch(()=>{}),rn().then(h=>{h&&nt({type:"skill_update_available",current:h.current,latest:h.latestCompatible,install_cmd:"kane-cli install skill"})}).catch(()=>{});let u=dl({input:process.stdin});u.on("line",h=>{try{let v=JSON.parse(h);v.type==="user_response"?r.sendUserResponse(v.answer??""):v.type==="cancel"&&r.cancel(l)}catch{}}),await r.start(s);let c=null,m=!1,p=0,g=null,d=0,w=!1,_=ko();for await(let h of r.run(l,"author",a))switch(_=xo(_,h),h.type){case"run_start":w&&d++;break;case"step_start":{let v=h;t?.onStepLog?.("STEP_START",`Step ${v.index} started`,{index:v.index,objective:v.objective,child_id:v.child_id});let R={step:v.index+1,status:"running",remark:v.objective??`Step ${v.index+1}`};v.child_id&&(R.child_id=v.child_id),nt(R);break}case"step_event":h.event==="reasoning"&&h.detail&&h.detail!=="reasoning"&&t?.onReasoning?.(h.detail),t?.onStepLog?.("STEP_EVENT",`Step ${h.index} ${h.event}`,{index:h.index,phase:h.event,action_type:h.action_type,detail:h.detail,child_id:h.child_id});break;case"step_end":{let v=h;t?.onStepLog?.("STEP_END",`Step ${v.index} ${v.status}`,{index:v.index,status:v.status,duration:v.duration,summary:v.summary,child_id:v.child_id}),t?.onStepComplete?.(),p++;let R={step:v.index+1,status:v.status==="passed"?"done":"failed",remark:v.summary??""};v.child_id&&(R.child_id=v.child_id),nt(R);let I=w?Math.max(0,d-1):0,f=typeof v.ordinal=="number"&&v.id?{ordinal:v.ordinal,id:v.id}:void 0;t?.onStepEnd?.(v.index,I,v.child_id,f);break}case"bifurcation":{let v=h,R=v.flows??[],I=v.count??R.length;(v.is_single_flow??I<=1)||(g=R,w=!0,d=0),nt({type:"bifurcation",flows:R,count:I});break}case"ask_user":{let v=h;nt({type:"ask_user",question:v.question,step_index:v.step_index,...v.options?{options:v.options}:{}});break}case"run_end":{c=h;break}case"error":{m=!0,nt({type:"error",message:h.message});break}default:break}return u.close(),await r.shutdown(),{lastRunEnd:c,stepsTotal:p,hadError:m,bifurcationFlows:g,evidence:_}}function Zi(n){return!!(n.target||n.device||n.app||n.cdpEndpoint||n.wsEndpoint||n.cft||n.url)}function es(n){return n.kind!=="mismatch"?null:n.suggested==="mobile"?"classification: objective looks mobile; run stays on web \u2014 pass --target emulator|simulator to run on a device":"classification: objective looks web; run stays on the device \u2014 pass --target desktop to run on web"}var ts=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function ln(n=process.stderr){if(!n.isTTY)return{onProgress:i=>n.write(`${i}
23
+ Expecting one of '${i.join("', '")}'`);let o=`${e}Help`;return this.on(o,r=>{let a;typeof t=="function"?a=t({error:r.error,command:r.command}):a=t,a&&r.write(`${a}
24
+ `)}),this}_outputHelpIfRequested(e){let t=this._getHelpOption();t&&e.find(o=>t.is(o))&&(this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)"))}};function Vi(n){return n.map(e=>{if(!e.startsWith("--inspect"))return e;let t,i="127.0.0.1",o="9229",r;return(r=e.match(/^(--inspect(-brk)?)$/))!==null?t=r[1]:(r=e.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null?(t=r[1],/^\d+$/.test(r[3])?o=r[3]:i=r[3]):(r=e.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(t=r[1],i=r[3],o=r[4]),t&&o!=="0"?`${t}=${i}:${parseInt(o)+1}`:e})}Bi.Command=Zn});var Yi=Xe(Ee=>{"use strict";var{Argument:Wi}=an(),{Command:er}=Hi(),{CommanderError:ll,InvalidArgumentError:qi}=Et(),{Help:cl}=qn(),{Option:Ki}=Jn();Ee.program=new er;Ee.createCommand=n=>new er(n);Ee.createOption=(n,e)=>new Ki(n,e);Ee.createArgument=(n,e)=>new Wi(n,e);Ee.Command=er;Ee.Option=Ki;Ee.Argument=Wi;Ee.Help=cl;Ee.CommanderError=ll;Ee.InvalidArgumentError=qi;Ee.InvalidOptionArgumentError=qi});var Ot=Se(xt(),1);import ae from"process";import*as Ga from"tls";function Oi(){let n=Ga;if(!(typeof n.getCACertificates!="function"||typeof n.setDefaultCACertificates!="function"))try{let e=o=>typeof o=="string",t=n.getCACertificates("default").filter(e),i=n.getCACertificates("system").filter(e);n.setDefaultCACertificates([...new Set([...t,...i])])}catch{}}var Di=!1;function Mi(){if(!Di)try{if(typeof process.emitWarning!="function")return;let n=process.emitWarning.bind(process),e=((t,...i)=>{let o=typeof t=="string"?t:t?.message??"";if(!((typeof i[0]=="string"?i[0]:typeof t=="object"&&t?t.name:void 0)==="ExperimentalWarning"&&o.includes("buffer.File")))return n(t,...i)});process.emitWarning=e,Di=!0}catch{}}var Gi=Se(Yi(),1),{program:Rd,createCommand:Ad,createArgument:Pd,createOption:$d,CommanderError:Od,InvalidArgumentError:Ji,InvalidOptionArgumentError:Dd,Command:tt,Argument:Md,Option:G,Help:jd}=Gi.default;import{basename as ld,join as Pe,resolve as cd}from"path";var vr=Se(xt(),1);var be=Se(xt(),1);var Ge=Se(at(),1);function zi({steps:n,bifurcationInfo:e,perFlowMetadata:t}){return!e||e.isSingleFlow||!t||t.length<=1?null:(0,Ge.jsx)(ne,{flexDirection:"column",children:t.map((i,o)=>{let r=n[o],a=r?.children??[],s=a.filter(g=>g.status==="passed").length,l=a.filter(g=>g.status==="failed").length,u=s+l,c=a.reduce((g,d)=>g+(d.duration??0),0),m=r?.status==="failed"?"failed":"passed",p=e.flows[o]??r?.objective??`Flow ${o+1}`;return(0,Ge.jsxs)(ne,{flexDirection:"column",marginTop:o>0?1:0,children:[(0,Ge.jsxs)(ne,{marginLeft:1,children:[(0,Ge.jsx)(q,{color:K.purple,bold:!0,children:"Flow "+(o+1)+": "}),(0,Ge.jsx)(q,{color:K.purple,children:p})]}),(0,Ge.jsx)(Zt,{status:m,summary:i?.summary??"",duration:c,steps:u,stepsPassed:s,stepsFailed:l,reason:i?.error_message??void 0,creditsConsumed:i?.credits_consumed??void 0})]},`flow-summary-${o}`)})})}var re=Se(at(),1);function Xi({config:n,spawnOpts:e,cancelRef:t,banner:i,describeContext:o,onComplete:r,onStepEnd:a,onReasoning:s,onStepComplete:l}){let{exit:u}=Nt(),{append:c}=Lt(),{describe:m,onDescribe:p,creditsRef:g}=fi({resolve:()=>o??null,hostIsTTY:()=>!!process.stderr.isTTY}),d=_o(a,void 0,s,l,p),w=(0,be.useRef)(!1),_=(0,be.useRef)(!1),[h,v]=(0,be.useState)("");(0,be.useEffect)(()=>{w.current||(w.current=!0,d.startRun(n,e))},[n,e,d]),(0,be.useEffect)(()=>{t&&(t.current=()=>d.cancelRun())},[t,d]),(0,be.useEffect)(()=>{d.isRunning||m.stop()},[d.isRunning,m.stop]);let R=(0,be.useRef)(0);Sn((S,k)=>{k.ctrl&&S==="c"&&(d.isRunning?(R.current++,R.current>=2?u():d.cancelRun()):u())}),Sn((S,k)=>{d.askingUser&&(k.return?(d.sendAnswer(h),v("")):k.backspace||k.delete?v(E=>E.slice(0,-1)):S&&!k.ctrl&&!k.meta&&v(E=>E+S))},{isActive:!!d.askingUser}),(0,be.useEffect)(()=>{if(!d.isRunning&&d.lastRunEnd&&!_.current){_.current=!0;let{passed:S,failed:k,total:E}=$n(d.steps),L=d.bifurcationInfo;r({lastRunEnd:d.lastRunEnd,stepsPassed:S,stepsFailed:k,stepsTotal:E,hadError:!1,bifurcationFlows:L&&!L.isSingleFlow?L.flows:null,describeCredits:g.current,evidence:d.getEvidenceState()}),d.shutdownRunner().finally(()=>u())}},[d.isRunning,d.lastRunEnd,d.steps,d.shutdownRunner,r,u]),(0,be.useEffect)(()=>{d.runError&&!d.isRunning&&!_.current&&(_.current=!0,r({lastRunEnd:null,stepsPassed:0,stepsFailed:0,stepsTotal:0,hadError:!0,bifurcationFlows:null,describeCredits:g.current,evidence:d.getEvidenceState()}),d.shutdownRunner().finally(()=>u()))},[d.runError,d.isRunning,d.shutdownRunner,r,u]);let I=d.lastRunEnd?(()=>{let{passed:S,failed:k,total:E}=$n(d.steps);return{status:d.lastRunEnd.status,duration:d.lastRunEnd.duration??0,summary:d.lastRunEnd.summary??"",stepsPassed:S,stepsFailed:k,stepsTotal:E,reason:d.lastRunEnd.reason,finalState:d.lastRunEnd.final_state,creditsConsumed:(d.lastRunEnd.credits_consumed??0)+g.current}})():null,f=(0,be.useRef)(!1);return(0,be.useEffect)(()=>{f.current||!i||(f.current=!0,c((0,re.jsxs)(ne,{flexDirection:"column",marginBottom:1,children:[(0,re.jsxs)(ne,{borderStyle:"round",borderColor:"#dc4e08",paddingX:2,children:[(0,re.jsx)(q,{color:"#ff9500",bold:!0,children:"KaneAI CLI"}),(0,re.jsx)(q,{color:K.dim,children:" \u2502 "}),(0,re.jsx)(q,{color:K.orange,children:i.model}),(0,re.jsx)(q,{color:K.dim,children:" \u2502 "}),(0,re.jsx)(q,{color:K.dim,children:i.auth})]}),i.status?.map((S,k)=>(0,re.jsx)(q,{color:K.dim,children:S},k))]})))},[]),(0,re.jsxs)(ne,{flexDirection:"column",children:[(()=>{let S=Lr({isRunning:d.isRunning,bifurcationInfo:d.bifurcationInfo,steps:d.steps,cmInitCounts:d.cmInitCounts,replayInfo:d.replayInfo});return S?(0,re.jsx)(Fr,{label:S.label,hasBifurcation:S.hasBifurcation}):null})(),d.steps.length>0&&(0,re.jsx)(Nr,{steps:d.steps,bifurcated:!!d.bifurcationInfo&&!d.bifurcationInfo.isSingleFlow,flows:d.bifurcationInfo?.flows,cmInitCounts:d.cmInitCounts,staticSteps:!0,onStepCommit:c,describe:m.text,describeVisible:m.visible,describeRevealing:m.revealing}),d.askingUser&&(0,re.jsxs)(ne,{flexDirection:"column",marginTop:1,children:[(0,re.jsxs)(q,{color:K.orange,children:['Agent is asking: "',d.askingUser,'"']}),(0,re.jsxs)(q,{children:["> ",h,"\u2588"]})]}),d.runError&&(0,re.jsx)(Go,{message:d.runError,code:"RUNNER_ERROR"}),I&&d.lastRunEnd&&(0,re.jsx)(zi,{steps:d.steps,bifurcationInfo:d.bifurcationInfo,perFlowMetadata:d.lastRunEnd.per_flow_metadata??[]}),I&&(0,re.jsx)(Zt,{status:I.status==="passed"?"passed":"failed",summary:I.summary??"",duration:I.duration,steps:I.stepsTotal,stepsPassed:I.stepsPassed,stepsFailed:I.stepsFailed,reason:I.reason,creditsConsumed:I.creditsConsumed})]})}import{createInterface as dl}from"readline";function nt(n){process.stdout.write(JSON.stringify(n)+`
25
+ `)}async function Qi(n,e,t){let i=fo();if(!i)throw new Error("v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available.");let o=ho({environment:e?.environment,mode:e?.mode,assertionMode:e?.assertionMode,finalValidation:e?.finalValidation,username:n.username,accessKey:n.access_key,sessionId:n.session_id});n.device?.platform&&await go(o,n.device);let r=new wo({env:o,runner:i,log:e?.log,sessionId:n.session_id}),a={...yo(n),headless:n.headless??!1},s={...n};delete s.run_id,bo(s,{environment:e?.environment});let l=`run-${n.run_index}`;nn().then(h=>{h&&nt({type:"update_available",current:h.current,latest:h.latest,severity:h.severity})}).catch(()=>{}),rn().then(h=>{h&&nt({type:"skill_update_available",current:h.current,latest:h.latestCompatible,install_cmd:"kane-cli install skill"})}).catch(()=>{});let u=dl({input:process.stdin});u.on("line",h=>{try{let v=JSON.parse(h);v.type==="user_response"?r.sendUserResponse(v.answer??""):v.type==="cancel"&&r.cancel(l)}catch{}}),await r.start(a);let c=null,m=!1,p=0,g=null,d=0,w=!1,_=ko();for await(let h of r.run(l,"author",s))switch(_=xo(_,h),h.type){case"run_start":w&&d++;break;case"step_start":{let v=h;t?.onStepLog?.("STEP_START",`Step ${v.index} started`,{index:v.index,objective:v.objective,child_id:v.child_id});let R={step:v.index+1,status:"running",remark:v.objective??`Step ${v.index+1}`};v.child_id&&(R.child_id=v.child_id),nt(R);break}case"step_event":h.event==="reasoning"&&h.detail&&h.detail!=="reasoning"&&t?.onReasoning?.(h.detail),t?.onStepLog?.("STEP_EVENT",`Step ${h.index} ${h.event}`,{index:h.index,phase:h.event,action_type:h.action_type,detail:h.detail,child_id:h.child_id});break;case"step_end":{let v=h;t?.onStepLog?.("STEP_END",`Step ${v.index} ${v.status}`,{index:v.index,status:v.status,duration:v.duration,summary:v.summary,child_id:v.child_id}),t?.onStepComplete?.(),p++;let R={step:v.index+1,status:v.status==="passed"?"done":"failed",remark:v.summary??""};v.child_id&&(R.child_id=v.child_id),nt(R);let I=w?Math.max(0,d-1):0,f=typeof v.ordinal=="number"&&v.id?{ordinal:v.ordinal,id:v.id}:void 0;t?.onStepEnd?.(v.index,I,v.child_id,f);break}case"bifurcation":{let v=h,R=v.flows??[],I=v.count??R.length;(v.is_single_flow??I<=1)||(g=R,w=!0,d=0),nt({type:"bifurcation",flows:R,count:I});break}case"ask_user":{let v=h;nt({type:"ask_user",question:v.question,step_index:v.step_index,...v.options?{options:v.options}:{}});break}case"run_end":{c=h;break}case"error":{m=!0,nt({type:"error",message:h.message});break}default:break}return u.close(),await r.shutdown(),{lastRunEnd:c,stepsTotal:p,hadError:m,bifurcationFlows:g,evidence:_}}function Zi(n){return!!(n.target||n.device||n.app||n.cdpEndpoint||n.wsEndpoint||n.cft||n.url)}function es(n){return n.kind!=="mismatch"?null:n.suggested==="mobile"?"classification: objective looks mobile; run stays on web \u2014 pass --target emulator|simulator to run on a device":"classification: objective looks web; run stays on the device \u2014 pass --target desktop to run on web"}var ts=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function ln(n=process.stderr){if(!n.isTTY)return{onProgress:i=>n.write(`${i}
26
26
  `),done:()=>{}};let e=0,t=!1;return{onProgress:i=>{t=!0,e=(e+1)%ts.length,n.write(`\r\x1B[2K${ts[e]} ${i}`)},done:()=>{t&&n.write(`
27
27
  `),t=!1}}}var ns=["emulator","simulator"];function rs(n){n.command("doctor").description("Check the mobile tooling this machine needs for one target: emulator or simulator").option("--target <target>","Which toolchain to check: emulator | simulator (required)").option("--install","Download or repair the managed deps bundle for that target").action(async e=>{if(!e.target){process.stderr.write(["error: --target is required \u2014 say which toolchain to check."," kane-cli doctor --target emulator"," kane-cli doctor --target simulator"].join(`
28
28
  `)+`
29
29
  `),process.exitCode=2;return}let t=e.target.toLowerCase();if(!ns.includes(t)){process.stderr.write(`error: unknown target '${e.target}' \u2014 supported values: ${ns.join(", ")}
30
30
  `),process.exitCode=2;return}if(e.install){let o=ln();try{await Vt().ensure(t,{automatic:!(process.stdin.isTTY&&process.stdout.isTTY),approved:!0,onProgress:o.onProgress})}catch(r){o.done(),process.stderr.write(`error: ${r instanceof Error?r.message:String(r)}
31
31
  `),process.exitCode=2;return}o.done()}let i=await Hr(Ft(t));process.stdout.write(`${Wr(i)}
32
- `),process.exitCode=qr(i)})}var os=new Set(["apps","balance","changelog","config","context","cover","design","devices","doctor","evidence","feedback","folders","generate","help","install","login","logout","maintain","plugin","profiles","projects","run","testmd","testrun","whoami"]),is=new Set(["apps","devices","doctor"]);function tr(n){return n?os:new Set([...os].filter(e=>!is.has(e)))}function ul(n,e){if(n===e)return 0;if(n.length===0)return e.length;if(e.length===0)return n.length;let t=new Array(e.length+1),i=new Array(e.length+1);for(let o=0;o<=e.length;o++)t[o]=o;for(let o=1;o<=n.length;o++){i[0]=o;for(let r=1;r<=e.length;r++){let s=n[o-1]===e[r-1]?0:1;i[r]=Math.min(t[r]+1,i[r-1]+1,t[r-1]+s)}[t,i]=[i,t]}return t[e.length]}function ml(n,e){let t=n.toLowerCase(),i=[...e],o=[];for(let r of i){let s=r.toLowerCase();s!==t&&s.startsWith(t)&&o.push({name:r,distance:0})}if(o.length===0)for(let r of i){let s=r.toLowerCase();if(s===t)continue;let a=ul(t,s);a<=2&&o.push({name:r,distance:a})}return o.sort((r,s)=>r.distance-s.distance||r.name.localeCompare(s.name)),o.slice(0,3).map(r=>r.name)}function ss(n,e){if(!e.hostSupportsMobile&&is.has(n))return{message:`error: ${e.mobileMessage}
33
- `,exitCode:2};let t=tr(e.hostSupportsMobile);return{message:pl(n,ml(n,t)),exitCode:2}}var nr=new Set(["set-device","set-app"]);function as(n,e){return!e.hostSupportsMobile&&nr.has(n)?{message:`error: ${e.mobileMessage}
32
+ `),process.exitCode=qr(i)})}var os=new Set(["apps","balance","changelog","config","context","cover","design","devices","doctor","evidence","feedback","folders","generate","help","install","login","logout","maintain","plugin","profiles","projects","run","testmd","testrun","whoami"]),is=new Set(["apps","devices","doctor"]);function tr(n){return n?os:new Set([...os].filter(e=>!is.has(e)))}function ul(n,e){if(n===e)return 0;if(n.length===0)return e.length;if(e.length===0)return n.length;let t=new Array(e.length+1),i=new Array(e.length+1);for(let o=0;o<=e.length;o++)t[o]=o;for(let o=1;o<=n.length;o++){i[0]=o;for(let r=1;r<=e.length;r++){let a=n[o-1]===e[r-1]?0:1;i[r]=Math.min(t[r]+1,i[r-1]+1,t[r-1]+a)}[t,i]=[i,t]}return t[e.length]}function ml(n,e){let t=n.toLowerCase(),i=[...e],o=[];for(let r of i){let a=r.toLowerCase();a!==t&&a.startsWith(t)&&o.push({name:r,distance:0})}if(o.length===0)for(let r of i){let a=r.toLowerCase();if(a===t)continue;let s=ul(t,a);s<=2&&o.push({name:r,distance:s})}return o.sort((r,a)=>r.distance-a.distance||r.name.localeCompare(a.name)),o.slice(0,3).map(r=>r.name)}function ss(n,e){if(!e.hostSupportsMobile&&is.has(n))return{message:`error: ${e.mobileMessage}
33
+ `,exitCode:2};let t=tr(e.hostSupportsMobile);return{message:pl(n,ml(n,t)),exitCode:2}}var nr=new Set(["set-device","set-app","set-auto-grant-permissions","set-auto-accept-alerts"]);function as(n,e){return!e.hostSupportsMobile&&nr.has(n)?{message:`error: ${e.mobileMessage}
34
34
  `,exitCode:2}:null}function pl(n,e){let t=e.length>0?` \u2014 did you mean ${e.map(i=>`'${i}'`).join(" or ")}?`:"";return`error: unknown command '${n}'${t}
35
35
 
36
36
  Run an objective with: kane-cli run "<objective>"
37
37
  List all commands: kane-cli --help
38
38
  `}import{join as fl}from"path";function ls(n){let e=n.command("testmd").description("Manage test.md files (run, list, status, delete, export, sync)").action(async()=>{process.stdin.isTTY||(process.stderr.write(`error: testmd requires a sub-action in non-TTY mode (run | list | status | delete | export | sync)
39
- `),process.exit(2));let{runListTui:t,resolveCurrentOrgId:i}=await import("./testmd-actions-QZD3N4EH.js"),o=await i({});o.ok||process.exit(o.code),process.exit(await t(o.orgId))});hl(e),bl(e),vl(e),wl(e),yl(e),kl(e)}function gl(n,e){return e.concat(n)}function hl(n){n.command("run <path>").description("Run a test from a *_test.md file").option("--url <url>","Start URL for the first step (overrides frontmatter url: and config default_url)").option("--headless","Run Chrome in headless mode").option("--max-steps <n>","Max agent steps","50").option("--timeout <seconds>","Kill after N seconds").option("--cdp-endpoint <url>","Connect to existing Chrome via CDP").option("--ws-endpoint <url>","Playwright WebSocket endpoint").option("--global-context <file>",`Override global context (default: ${fl(J,"global-memory.md")})`).option("--local-context <file>","Override local context (default: .testmuai/context.md in cwd)").addOption(new G("--model <name>","Model override").hideHelp()).option("--variables <json>","Inline variables JSON").option("--variables-file <path>","Load variables from file").option("--session-context <json>","Session context JSON (prior runs)").addOption(new G("--cft","Use Playwright Chromium instead of managed Chrome").hideHelp()).option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key").option("--env <name>","Environment (prod or stage)").option("--mode <name>","Run mode: action | testing").option("--assertion-mode <mode>","Assertion mode: dom (default \u2014 DOM extraction & assertions, vision fallback) | visual (vision only)").option("--final-validation <on|off>","Final validation: append the system cp_final checkpoint. Overrides config (default: off)").option("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").addOption(new G("--local","Skip TMS integration (no uploads, no variables/secrets push)").hideHelp()).option("--allow-missing-url","Non-TTY only: proceed from the browser's current page instead of failing when the first step has no start URL (frontmatter url:/--url still used)").option("--code-export","Generate code export after upload").option("--code-language <lang>","Code-export language (python|javascript)").option("--name <name>","Persist session under this name").option("--target <name>","Where to run: desktop | emulator | simulator (default: the file's `target:`, else desktop)").option("--device <id>","Which device, when the target is mobile: name, serial, ip:port, or UDID").option("--app <path|APPid>","App under test, when the target is mobile: a build (.apk / .zip of the .app) or an APP\u2026 id from your uploads. Overrides the file's `app:`").option("--skip-code-validation","Skip post-codegen validation").option("--no-skip-code-validation","Force post-codegen validation").option("--on-lock-conflict <mode>","lock conflict policy: readonly|fail|wait",e=>{if(e!=="readonly"&&e!=="fail"&&e!=="wait")throw new Error(`--on-lock-conflict must be readonly|fail|wait, got: ${e}`);return e}).option("--push","always commit at end-of-run (no retry semantics)").option("--no-adaptive-heal","disable adaptive heal \u2014 a replay miss becomes terminal instead of re-authoring the failing tail (default: heal on, 3 attempts then a full re-author)").addOption(new G("--retry","(retired) adaptive heal is on by default").hideHelp()).addOption(new G("--retry-count <n>","(retired) heal budget is fixed at 3").argParser(e=>{let t=parseInt(e,10);if(Number.isNaN(t)||t<0)throw new Error(`--retry-count must be a non-negative integer, got: ${e}`);return e}).hideHelp()).option("--author","bypass walker; force fresh test+testcase in TMS; replace local output entirely").addOption(new G("--no-evidence-publish","skip the replay evidence publish (blob upload + TMS /evidence/ingest) \u2014 the run leaves no execution record in TMS").hideHelp()).option("--bug-detection <mode>","detect product bugs while authoring: off|stop|continue (stop halts the run on a confirmed bug; continue records it and keeps going). Overrides `config set-bug-detection`. Authoring steps only \u2014 replay failures always investigate.",e=>{if(e!=="off"&&e!=="stop"&&e!=="continue")throw new Error(`--bug-detection must be off, stop or continue, got: ${e}`);return e}).action(async(e,t)=>{let{retiredRetryFlagsNotice:i}=await import("./replay-policy-CVQ6OJX5.js"),o=i(t);o&&process.stderr.write(o+`
40
- `);let{runTestMdFile:r}=await import("./run-test-md-664ASWRQ.js"),s=await r(e,t);process.exit(s)})}function bl(n){n.command("list").description("List *_test.md files in the working directory (recursive)").option("--root <dir>","Root directory to scan (default: cwd)").option("--ignore <name>","Skip a directory by name (repeatable)",gl,[]).option("--json","Force NDJSON output even on TTY").action(async e=>{let{runListAction:t,resolveCurrentOrgId:i}=await import("./testmd-actions-QZD3N4EH.js"),o=await i({json:!!e.json});o.ok||process.exit(o.code),process.exit(await t(e,o.orgId))})}function vl(n){n.command("status <path>").description("Print local meta.json for a *_test.md (no live TMS check in v1)").action(async e=>{let{runStatusAction:t,resolveCurrentOrgId:i}=await import("./testmd-actions-QZD3N4EH.js"),o=await i({});o.ok||process.exit(o.code),process.exit(await t(e,o.orgId))})}function wl(n){n.command("delete <path>").description("Remove output-<stem>/ and the *_test.md source file (TMS untouched)").option("--yes","Skip confirmation prompt (required in non-TTY)").action(async(e,t)=>{let{runDeleteAction:i,resolveCurrentOrgId:o}=await import("./testmd-actions-QZD3N4EH.js"),r=await o({});r.ok||process.exit(r.code),process.exit(await i(e,!!t.yes,r.orgId))})}function yl(n){n.command("export <path>").description("Generate standalone test code (Playwright)").option("--language <lang>","python|javascript (falls back to tui-config)").option("--output <dir>","Override output dir (default: output-<stem>/playwright-<lang>-code/)").option("--force","Overwrite an existing local export").action(async(e,t)=>{let{runExportAction:i,resolveCurrentOrgId:o}=await import("./testmd-actions-QZD3N4EH.js"),r=await o({});r.ok||process.exit(r.code),process.exit(await i(e,t,r.orgId))})}function kl(n){n.command("sync <path>").description("Zip the testmd + imports + replay outputs and push {commit_id}-testmd.zip to cloud").option("--env <name>","Environment (prod or stage)").option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key").action(async(e,t)=>{let{runSyncAction:i,resolveSyncAuth:o}=await import("./testmd-actions-QZD3N4EH.js"),r=await o(t);r.ok||process.exit(r.code),process.exit(await i(e,r))})}function cs(n){let e=n.command("context").description("Assurance context graph (.context/): ingest sources, extract use-cases, list nodes").action((t,i)=>{i.args.length>0&&i.error(`error: unknown command '${i.args[0]}'`,{exitCode:2}),i.help()});e.command("ingest <src...>").description("Land source files into .context/ and extract them \u2014 the one-flow entry. On a TTY this continues into the interactive extract chat; --mode ci or piped stdin lands only").option("--as <id>","Ingest AS this existing source id \u2014 a new VERSION: moves its head, dependents go stale (single file only)").option("--mode <mode>","interactive | agent | ci | override \u2014 how the extraction runs. ci (and headless without --mode) lands only").option("--plan","Extraction stops after the proposal \u2014 print it, commit nothing").option("--force","Extract even if the landed snapshot was already extracted").option("--trust <dial>","Extraction trust dial: auto (default) | hold (headless only)").action(async(t,i)=>{let{ingestCommand:o}=await import("./ingest-cmd-RJLTFNMN.js");process.exit(await o(t,i))}),e.command("extract").description("Interactively extract use-cases from ingested sources via the context agent").option("--plan","Stop after the proposal \u2014 print it, commit nothing").option("--apply <path>","NOT IMPLEMENTED YET \u2014 will commit a saved --plan proposal (refuses loudly today)").option("--mode <mode>","Ask policy: interactive | agent | ci | override. TTY defaults to interactive chat; REQUIRED when headless").option("--force","Re-extract sources even if their current snapshot was already extracted").option("--resume <sid>","Resume a paused session (state under .context/sessions/)").option("--message <text>","With --resume: answer the pending questions (or steer) in plain words \u2014 the agent maps your statement itself").option("--source <id>","Extract exactly this ingested source \u2014 the explicit path for su-conv-* conversation sources, which the default sweep skips").option("--queued","(removed) the queue is gone \u2014 extract sweeps every pending source by default; this flag refuses with guidance for one release").option("--trust <dial>","Per-run trust dial: auto (new items commit derived into review \u2014 the default everywhere) | hold (everything new HELD; headless only \u2014 refused under interactive). ci refuses the flag entirely").option("--answer <pairs...>","With --resume --mode agent: answer a pending question/panel BY ID \u2014 <qid-or-panelId>=<option number (1-based) or free text>, repeatable").option("--with-source <ref>","With --resume: land this file/URL FIRST and set the pending questions aside \u2014 the agent reads the source, narrates what it settled, and re-asks what's still open").action(async t=>{let{extractCommand:i}=await import("./extract-cmd-HOVGMBGM.js");process.exit(await i(t))}),e.command("sessions [action] [sid]").description("List resumable sessions; `sessions show <sid>` prints pending questions + assumed defaults; `sessions clean [sid]` GCs expired/named ones").option("--all","clean: remove ALL sessions (incl. corrupt), not just expired").option("--json","JSON output").action(async(t,i,o)=>{let{sessionsCommand:r}=await import("./sessions-cmd-ZZIZN2VB.js");process.exit(await ge("sessions",()=>r(t,o,i)))}),e.command("fsck").description("Verify the full commit chain and check the derived projection for drift").option("--json","Print the full structured report as one JSON object (issues carry code + detail + ecids)").action(async t=>{let{fsckCommand:i}=await import("./maintenance-cmd-6XSVO6FO.js");process.exit(await ge("fsck",o=>i(o,t)))}),e.command("locks",{hidden:!0}).description("Show held context/UC locks and waiters (read-only)").option("--json","Machine output (plain array, no NDJSON envelope \u2014 not a room verb)").action(async t=>{let{runLocksCommand:i}=await import("./locks-cmd-CSVSWY2Y.js"),{contextDir:o}=await import("./paths-JCYX6UWL.js");process.exit(i(o(process.cwd()),t,r=>process.stdout.write(r+`
41
- `)))}),e.command("rebuild").description("Wipe .context/derived and rebuild it from the verified commit chain").option("--yes","Skip the confirmation prompt (required when headless)").action(async t=>{let{rebuildCommand:i}=await import("./maintenance-cmd-6XSVO6FO.js");process.exit(await ge("rebuild",()=>i(t),{write:!0}))}),e.command("list").description("List context graph nodes").option("--type <t>","Filter by node label (source | usecase)").option("--inferred","Only derived (unreviewed) nodes").option("--stale","Only stale/orphaned nodes").option("--all","Include superseded node versions").option("--json","JSON output").action(async t=>{let{listCommand:i}=await import("./list-cmd-N4KMA34H.js");process.exit(await ge("list",()=>i(t)))}),e.command("view").description("Render the context graph as an interactive HTML page and open it in the browser (snapshot)").option("--out <path>","Write the HTML to <path> instead of a temp file").option("--open","Force-open the browser even when non-TTY (piped)").option("--no-open","Write the file but do not open the browser").option("--json","Print the computed view payload as JSON and exit (no HTML)").action(async t=>{let{viewCommand:i}=await import("./view-cmd-KPJTP4DI.js");process.exit(await ge("view",()=>i(t)))}),e.command("retire <source_id>").description("Retire a source (head \u2192 null + tombstone record); reversible via revert").option("--reason <text>","Why this source is being retired").option("--yes","Skip the confirmation prompt (required when headless)").action(async(t,i)=>{let{retireCommand:o}=await import("./lifecycle-cmd-O2324GN6.js");process.exit(await ge("retire",()=>o(t,i),{write:!0}))}),e.command("name [ref] [slug]").description("Assign a stable kebab-case name to a node (ref = cid or existing slug); --backfill assigns logical ids to all unnamed live nodes").option("--backfill","assign label-prefixed logical ids (uc-/sc-/ac-/t-\u2026) to every live unnamed node").option("--yes","Skip the --backfill confirmation prompt (required when headless)").action(async(t,i,o)=>{let{nameCommand:r,nameBackfillCommand:s}=await import("./lifecycle-cmd-O2324GN6.js");o.backfill&&process.exit(await ge("namebackfill",()=>s(o))),(!t||!i)&&(process.stderr.write(`usage: kane-cli context name <ref> <slug> | kane-cli context name --backfill
42
- `),process.exit(2)),process.exit(await ge("name",()=>r(t,i),{write:!0}))}),e.command("revert <seq>").description("Invert a record's effects via a compensation record \u2014 history is never rewritten").option("--reason <text>","Why this record is being reverted").option("--yes","Skip the confirmation prompt (required when headless)").action(async(t,i)=>{let{revertCommand:o}=await import("./lifecycle-cmd-O2324GN6.js");process.exit(await ge("revert",()=>o(t,i),{write:!0}))}),e.command("review").description("Walk a review queue; verdicts land as ONE batched record").option("--queue <q>","derived (default) | skipped | archived | drift").option("--json","NDJSON output (drift listing + --verdicts outcomes)").option("--verdicts <file>",'headless verdict input: JSON array of {"ref", "resolution", ...} \u2014 atomic, works with or without a TTY').option("--allow-archive","Apply archives headlessly (requires --because; refused under --mode ci)").option("--because <reason>","audit reason stamped on headless archives (required with --allow-archive)").option("--mode <m>","agent | ci \u2014 ci refuses archives under ANY flag").option("--approve <refs...>","structured verdict: approve these refs (temp_ref/cid/logical id)").option("--skip <refs...>","structured verdict: skip these refs (no fact \u2014 stays queued)").option("--defer <refs...>","structured verdict: defer these refs (no fact \u2014 stays queued)").action(async t=>{let{reviewCommand:i}=await import("./review-cmd-DQRKQUMG.js");process.exit(await ge("review",()=>i(t)))}),e.command("explain <ref>").description("Replay the recorded reasoning + lineage for a node (no model call)").option("--json","JSON output").action(async(t,i)=>{let{explainCommand:o}=await import("./explain-cmd-EX24XKD6.js");process.exit(await ge("explain",()=>o(t,i)))})}function ds(n){let e=n.command("design").description("Test design engine: turn a committed use-case into ACs, scenarios, and 1:1 tests").action((t,i)=>{i.args.length>0&&i.error(`error: unknown command '${i.args[0]}'`,{exitCode:2}),i.help()});e.command("tests").description("Design the assurance for ONE committed use-case (conversational; chat is the default)").option("--use-case <ref>","The use-case to design \u2014 logical id (uc-\u2026) or cid (optional with --resume: the session remembers it)").option("--max <n>","Budget ceiling: max scenario+test pairs (NO ceiling when omitted \u2014 the agent estimates and asks)",t=>Number(t)).option("--strength <s>","Manual covering-array strength override: pairwise | 3-wise").option("--mode <mode>","Ask policy: interactive | agent | ci | override. TTY defaults to interactive chat; REQUIRED when headless").option("--force","Redesign a use-case that already has a live design (supersedes its scenario+test pairs)").option("--resume <sid>","Resume a paused design session (state under .context/sessions/)").option("--message <text>","With --resume: answer the pending questions (or steer) in plain words \u2014 the agent maps your statement itself").option("--plan","Transcription only \u2014 print each finalize payload, commit nothing").option("--allow-unreviewed","Design against an unreviewed use-case without approving it first").option("--phase <name>","Enter the design at this phase (grounding | acs | scenarios | wiring | tests), re-seeded from committed prior phases").option("--answer <pairs...>","With --resume --mode agent: answer a pending question/panel BY ID \u2014 <qid-or-panelId>=<option number (1-based) or free text>, repeatable").action(async t=>{let{designTestsCommand:i}=await import("./bind-2N4Q6YKH.js");process.exit(await i(t))}),e.command("explain <ref>").description("Replay WHY a designed item looks the way it does \u2014 sidecar + recorded judgements, zero fresh AI").action(async t=>{let{designExplainCommand:i}=await import("./explain-cmd-2TKO7GRW.js");process.exit(await i(t))})}function us(n){let e=n.command("maintain").description("Keep the assurance suite true as sources change: reconcile").action((t,i)=>{i.args.length>0&&i.error(`error: unknown command '${i.args[0]}'`,{exitCode:2}),i.help()});e.command("evolve [ref]").description("Re-design the parent use-case of a test/scenario/AC/use-case \u2014 unaffected items are preserved verbatim; reports the pair diff").option("--from-stale","Evolve every use-case with stale designed entities (deduped, per-UC confirm)").option("--because <reason>","Re-design a FRESH target anyway \u2014 the reason becomes the change delta and lands in provenance").action(async(t,i)=>{let{evolveCommand:o}=await import("./evolve-cmd-TWYJL4EG.js");process.exit(await o(t,i))}),e.command("reconcile").description("Reconcile a changed source: the head lands, extraction runs over the change, and every proposed change HOLDS as a review card \u2014 approve / reject / defer, nothing commits without your verdict (the in-chat review is the TTY default)").option("--from <file>","The NEW version of the source document (a file path)").option("--source-id <id>","The EXISTING source this file succeeds \u2014 its head moves; see `kane-cli context list --type source`").option("--plan","Preview: the head-move lands (the change fact), everything else is STAGED into the stored plan \u2014 nothing suite-side commits").option("--apply [path]","Walk a STORED plan (REMOVE stays plan-only). Bare = the latest plan behind an approval prompt; a path picks one; with --from it recomputes live").option("--mode <mode>","interactive | agent | ci | override \u2014 TTY defaults to the in-chat card review; headless requires one").action(async t=>{let{reconcileCommand:i}=await import("./reconcile-cmd-FU3JIHTO.js");process.exit(await i(t))})}function ms(n){n.command("cover").description("Two-axis coverage: depth proven by an evidence pack + completeness owed by the live graph").enablePositionalOptions().option("--from <pack>","Evidence pack to read (dir, sealed file, or execution id; default: newest in .testmuai/evidence)").option("--json","Machine-readable output").option("--mode <mode>","interactive | agent | ci \u2014 agent/ci ride the NDJSON envelope (done-last + next)").action(async(t,i)=>{i.args.length>0&&i.error(`error: unknown command '${i.args[0]}'`,{exitCode:2});let{coverCommand:o}=await import("./cover-cmd-7JILZJUK.js");process.exit(await ge("cover",()=>o(t)))}).command("gaps [uc]").description("Dual-axis coverage ribbon \u2014 designed \xD7 proven from the live graph; pass a use-case id for its full dossier").option("--stage <stage>","design | cover | all (default all)").option("--top <n>","Bound pending rows per use-case in the --json document (table output is never truncated)",t=>Number(t)).option("--rollup <rollup>","Proven-axis formula: lenient | strict (default lenient)").option("--json","Machine-readable nested document").option("--mode <mode>","interactive | agent | ci \u2014 agent/ci ride the NDJSON envelope (done-last + next)").action(async(t,i)=>{let{gapsCommand:o}=await import("./gaps-cmd-3ZX3PZF4.js");process.exit(await ge("gaps",()=>o(t,i)))})}var gr=Se(xt(),1);var Ae=Se(xt(),1);function fs(n){return{members:n.map(e=>({...e,status:"pending"})),summary:null,done:null}}function ps(n,e){return typeof e!="string"||e.length===0?!1:e===n.relPath||e.endsWith("/"+n.relPath)}function xl(n){return n==="passed"?"passed":"failed"}function gs(n,e){switch(e.type){case"testrun_member_start":case"testrun_authored_member_start":return{...n,members:n.members.map(t=>ps(t,e.path)?{...t,status:"running"}:t)};case"testrun_member_end":case"testrun_authored_member_end":return{...n,members:n.members.map(t=>ps(t,e.path)?{...t,status:xl(e.status),durationS:e.duration_s}:t)};case"testrun_summary":return{...n,summary:{execution:e.execution??null,authored:e.authored??[],totals:e.totals,durationS:e.duration_s,upload:e.upload,cancelled:!!e.cancelled}};case"testrun_done":return{...n,done:{executionId:e.execution_id,overallStatus:e.overall_status}};default:return n}}var V=Se(at(),1);function bs(n){return n<60?`${n.toFixed(1)}s`:`${Math.floor(n/60)}m ${Math.round(n%60)}s`}function hs({member:n}){let e=n.status==="running",t=n.status==="passed",i=n.status==="failed",o=n.durationS!=null?bs(n.durationS):"";return(0,V.jsxs)(ne,{children:[(0,V.jsx)(ne,{width:3,children:e?(0,V.jsx)(jr,{}):t?(0,V.jsx)(q,{color:K.green,bold:!0,children:"\u2713"}):i?(0,V.jsx)(q,{color:K.red,bold:!0,children:"\u2717"}):(0,V.jsx)(q,{color:K.muted,children:"\u25CB"})}),(0,V.jsxs)(ne,{flexGrow:1,children:[(0,V.jsx)(q,{color:i?K.red:K.dim,children:n.relPath}),n.memberClass==="author"&&(0,V.jsx)(q,{color:K.purple,children:" authoring"})]}),(0,V.jsx)(ne,{width:8,justifyContent:"flex-end",children:(0,V.jsx)(q,{color:K.dim,children:o})})]})}function _l({summary:n}){let e=n.totals,t=n.cancelled?"cancelled":e.failed>0||e.broken>0?"failed":"passed",i=t==="cancelled"?K.orange:t==="passed"?K.green:K.red,o=t==="cancelled"?"!":t==="passed"?"\u2713":"\u2717",r=t.toUpperCase(),s=`${e.passed} passed \xB7 ${e.failed} failed \xB7 ${e.broken} broken \xB7 ${e.skipped} skipped \xB7 ${e.authored} authored`;return(0,V.jsx)(ne,{flexDirection:"column",marginTop:1,children:(0,V.jsxs)(ne,{borderStyle:"round",borderColor:i,flexDirection:"column",paddingX:2,paddingY:1,children:[(0,V.jsxs)(q,{bold:!0,color:i,children:[o," ",r]}),(0,V.jsx)(q,{color:K.dim,children:s}),n.execution&&(0,V.jsxs)(q,{color:K.dim,children:["execution ",n.execution.id,": ",n.execution.status]}),n.authored.length>0&&(0,V.jsxs)(q,{color:K.dim,children:["authored: ",n.authored.length," test(s)"]}),(0,V.jsxs)(q,{color:K.dim,children:[bs(n.durationS)," \xB7 upload: ",n.upload]})]})})}function vs({members:n,title:e,env:t,dispatchRef:i,onDone:o}){let{exit:r}=Nt(),{append:s}=Lt(),[a,l]=(0,Ae.useState)(()=>fs(n)),[u,c]=(0,Ae.useState)(()=>new Set),m=(0,Ae.useRef)(!1),p=(0,Ae.useRef)(!1);(0,Ae.useEffect)(()=>(i.current=d=>l(w=>gs(w,d)),()=>{i.current=null}),[]),(0,Ae.useEffect)(()=>{p.current||(p.current=!0,s((0,V.jsxs)(ne,{borderStyle:"round",borderColor:"#dc4e08",paddingX:2,children:[(0,V.jsx)(q,{color:"#ff9500",bold:!0,children:"KaneAI CLI"}),(0,V.jsx)(q,{color:K.dim,children:" \u2502 "}),(0,V.jsx)(q,{color:K.dim,children:`testrun \xB7 ${e} \xB7 ${t}`})]})))},[]),(0,Ae.useEffect)(()=>{let d=a.members.filter(w=>(w.status==="passed"||w.status==="failed")&&!u.has(w.relPath));if(d.length!==0){for(let w of d)s((0,V.jsx)(hs,{member:w},w.relPath));c(w=>{let _=new Set(w);for(let h of d)_.add(h.relPath);return _})}},[a.members,u,s]),(0,Ae.useEffect)(()=>{a.done&&!m.current&&(m.current=!0,o?.(),r())},[a.done,r,o]);let g=a.members.filter(d=>!u.has(d.relPath));return(0,V.jsxs)(ne,{flexDirection:"column",children:[g.length>0&&(0,V.jsx)(ne,{flexDirection:"column",children:g.map(d=>(0,V.jsx)(hs,{member:d},d.relPath))}),a.summary&&(0,V.jsx)(_l,{summary:a.summary})]})}import{existsSync as Cl}from"fs";import{resolve as Il,relative as El}from"path";import{existsSync as Sl}from"fs";import{relative as ws}from"path";var ve=class extends Error{};function ys(n,e){let t=Ve(n);if(!Sl(t))throw new ve(`--from-context needs an assurance store at ${t} \u2014 run the design flow there first, or run from the project root that holds .context`);let i=$o(t),o=vi(Ln(n)),r=[];for(let s of e){let a=s.trim();if(!a)continue;let l=i.resolve(a);if(!l)throw new ve(`--from-context: unknown id '${a}' \u2014 it does not resolve in the assurance graph`);if(i.superseded.has(l.tip))throw new ve(`--from-context: '${a}' is tombstoned (retired with no live successor) \u2014 redesign the suite or select a live test id`);let u=i.getNode(l.tip);if(u?.label!=="test")throw new ve(`--from-context: '${a}' is a ${u?.label??"unknown"} node, not a test \u2014 only test ids select members`);let c=a.toLowerCase(),m=o.get(c)??o.get(a)??[];if(m.length===0)throw new ve(`--from-context: '${a}' has no minted test file under ${Ln(n)} \u2014 re-run the design for this suite, or restore the deleted file`);if(m.length>1)throw new ve(`--from-context: '${a}' is claimed by ${m.length} files (${m.map(p=>ws(n,p)).join(", ")}) \u2014 remove the duplicates`);r.push({path:m[0],relPath:ws(n,m[0]),contextId:c})}return r}async function ks(n){let e=n.cwd??process.cwd(),t=n.fromContext?.length?ys(e,n.fromContext):[],i;if(n.paths&&n.paths.length>0||t.length>0){let s=(n.paths??[]).map(a=>{let l=Il(e,a);if(!Cl(l)||!l.endsWith("_test.md"))throw new ve(`not a *_test.md file: ${a}`);return{path:l,relPath:El(e,l)}});i=[...t,...s]}else i=(await Ho({root:e})).results.map(a=>({path:a.path,relPath:a.relPath}));if(n.match){let s;try{s=new RegExp(n.match)}catch(a){throw new ve(`invalid --match regex: ${a instanceof Error?a.message:a}`)}i=i.filter(a=>s.test(a.relPath))}let o=new Set,r=[];for(let s of i){if(o.has(s.path))continue;o.add(s.path);let a=Wo(s.path);r.push({...s,tags:a.tags,...a.mobileTarget?{mobile:!0}:{}})}if(n.tags&&n.tags.length>0){let s=new Set(n.tags.map(a=>a.toLowerCase()));return r.filter(a=>a.tags.some(l=>s.has(l))).sort((a,l)=>a.relPath.localeCompare(l.relPath))}return r.sort((s,a)=>s.relPath.localeCompare(a.relPath))}import{readFileSync as Tl}from"fs";import{join as Rl}from"path";function xs(n){try{return JSON.parse(Tl(Rl(Re(n),".internal","meta.json"),"utf8"))}catch{return null}}var ft=n=>typeof n=="string"&&n?n:void 0;function _s(n){let e=[],t,i;for(let r of n){if(r.mobile){e.push({...r,memberClass:ft(xs(r.path)?.test_id)?"replay":"author",failure:"mobile_unsupported"});continue}let s=xs(r.path);if(!s){e.push({...r,memberClass:"author"});continue}let a={testcaseId:ft(s.testcase_id),folderId:ft(s.folder_id),commitId:ft(s.commit_id),sessionName:ft(s.session_name)},l=ft(s.test_id),u=typeof s.org_id=="string"?s.org_id:void 0,c=typeof s.project_id=="string"?s.project_id:void 0,m=l?"replay":"author";if(t===void 0&&u&&(t=u),i===void 0&&c&&(i=c),u&&t&&u!==t){e.push({...r,...a,testId:l,orgId:u,projectId:c,memberClass:m,failure:"org_mismatch"});continue}if(c&&i&&c!==i){e.push({...r,...a,testId:l,orgId:u,projectId:c,memberClass:m,failure:"project_mismatch"});continue}e.push({...r,...a,testId:l,orgId:u,projectId:c,memberClass:m})}let o=e.length>0&&e.every(r=>!r.failure);return{checks:e,valid:o,orgId:t,projectId:i}}function Al(n){return n.tags?.length?`testrun --tags ${n.tags.join(",")}`:n.match?`testrun --match ${n.match}`:n.paths?.length?`testrun ${n.paths.length} paths`:"testrun"}async function Ss(n){let e=await ks(n),t=_s(e),i=Number(n.parallel??1),o=Number.isFinite(i)&&i>=1?Math.floor(i):1;return{...t,parallel:o,parallelClamped:!1,onFailure:n.onFailure??"continue",title:n.name??Al(n)}}import{basename as Pl,join as Ds}from"path";import{readFileSync as Ms,existsSync as Ol}from"fs";import{promises as Tt}from"fs";import{existsSync as Rt}from"fs";import{join as Je}from"path";async function rr(n){let e=n.status??"skipped",t=Je(n.packDir,"tests",n.testId),i=Je(t,"steps"),o=Je(t,"logs");await Tt.mkdir(i,{recursive:!0});let r=Je(i,".keep");Rt(r)||await Tt.writeFile(r,""),await Tt.mkdir(o,{recursive:!0});let s=Je(o,"testrun.log");Rt(s)||await Tt.writeFile(s,n.reason+`
43
- `);let a=Je(t,n.definition.path);Rt(a)||await Tt.writeFile(a,n.definition.content);let l=Je(o,"meta.yaml");if(!Rt(l)){let c=await Po(o);await Ao(n.packDir,n.testId,To(c))}let u=Je(t,"result.yaml");Rt(u)||await Ro(n.packDir,n.testId,Eo({testId:n.testId,status:e,definitionPath:n.definition.path,externalId:So(n.externalIdInput),tags:n.tags,environment:{},steps:[]}))}async function cn(n,e,t){let i=[],o=new Array(n.length).fill(!1),r=0,s=!1,a,l=!1,u=()=>{i.length<n.length&&(l=!0)};t.signal&&(t.signal.aborted?u():t.signal.addEventListener("abort",u,{once:!0}));async function c(){for(;;){if(s||t.signal?.aborted||r>=n.length)return;let p=r++,g=n[p];o[p]=!0;try{t.onStart?.(g);let d=await e(g);i.push({item:g,result:d}),t.onEnd?.(g,d),t.failFast&&t.isFailure(d)&&(s=!0)}catch(d){a=a??d,s=!0}}}let m=Math.max(1,Math.min(t.parallel,n.length));try{await Promise.all(Array.from({length:m},()=>c()))}finally{t.signal?.removeEventListener("abort",u)}if(a)throw a;return{done:i,skipped:n.filter((p,g)=>!o[g]),cancelled:l}}function Cs(n){return{type:"testrun_plan",members:n.checks.map(e=>({path:e.path,test_id:e.testId,tags:e.tags,...e.contextId?{context_id:e.contextId}:{},...e.failure?{failure:e.failure}:{}})),valid:n.valid,parallel:n.parallel,...n.parallelClamped?{parallel_clamped:!0}:{}}}function Is(n,e){return{type:"testrun_start",execution_id:n,members:e.checks.map(t=>t.relPath),parallel:e.parallel}}function Es(n){return{type:"testrun_member_start",path:n.path,test_id:n.testId,...n.contextId?{context_id:n.contextId}:{}}}function Ts(n,e){return{type:"testrun_member_end",path:n.path,test_id:n.testId,status:e.overallStatus,duration_s:e.durationS,...n.contextId?{context_id:n.contextId}:{}}}function Rs(n){return{type:"testrun_authored_member_start",path:n.path}}function As(n){return{type:"testrun_authored_member_end",path:n.relPath,...n.testId?{test_id:n.testId}:{},status:n.overallStatus,duration_s:n.durationS}}function gt(n,e){return{type:"testrun_evidence_ingest",status:n.ok?"ok":"failed",evidence_id:e,...n.stage?{stage:n.stage}:{}}}function dn(n){return{type:"testrun_summary",execution:n.execution,authored:n.authored,totals:n.totals,duration_s:n.durationS,upload:n.upload,cancelled:n.cancelled,...n.remote?{remote:n.remote}:{}}}function ht(n,e){return{type:"testrun_done",execution_id:n,overall_status:e}}function Ps(n){return{type:"remote_start",backend:n.backend,env:n.env}}function Os(n){return{type:"remote_dispatched",job_id:n.jobId,job_url:n.jobUrl}}function ze(n){return{type:"reconcile_merge_degraded",code:"RECONCILE_MERGE_DEGRADED",reason:n.reason,...n.detail?{detail:n.detail}:{},...n.excludedPack?{excluded_pack:n.excludedPack}:{},...n.standaloneIds?{standalone_execution_ids:n.standaloneIds}:{}}}function rt(n){return{type:"remote_exec_sync",code:{skipped:"REMOTE_EXEC_SYNC_SKIPPED",warning:"REMOTE_EXEC_SYNC_WARNING",failed:"REMOTE_EXEC_SYNC_FAILED"}[n.status],status:n.status,reason:n.reason,...n.detail?{detail:n.detail}:{},...n.executionId?{execution_id:n.executionId}:{}}}function or(n){return{type:"remote_coverage",code:{skipped:"REMOTE_COVERAGE_SKIPPED",failed:"REMOTE_COVERAGE_FAILED"}[n.status],status:n.status,reason:n.reason,...n.detail?{detail:n.detail}:{}}}function un(n){return{type:"remote_error",code:n.code,detail:n.detail}}function At(n){return{type:"remote_done",status:n.status,exit:n.exit,job_id:n.jobId,sessions_path:n.sessionsPath}}var bt=n=>n.overallStatus==="failed"||n.overallStatus==="broken"||n.overallStatus==="interrupted";function $s(n){try{return Ms(n,"utf8")}catch{return""}}async function js(n,e){let t=e.cwd??process.cwd(),i=Date.now(),o=mt();e.onExecutionId?.(o);let r=f=>({execution_id:o,test_id:f.testId,testcase_id:f.testcaseId,project_id:f.projectId,folder_id:f.folderId,org_id:f.orgId,commit_id:f.commitId,session_name:f.sessionName,user_name:e.operator?.userName,user_email:e.operator?.userEmail}),s=await Io({execution_id:o,title:n.title,started:new Date().toISOString(),producerVersion:Me,run_kind:"author",origin:"testrun",pid:process.pid},t);e.emit(Is(o,n));let a=[...new Set(n.checks.flatMap(f=>f.tags))];e.log?.("info","TESTRUN_START","Testrun started",{execution_id:o,member_count:n.checks.length,parallel:n.parallel,on_failure:n.onFailure,tags:a});let l=0,u=n.checks.map(f=>({key:f.path,value:f})),c=await cn(u,f=>e.executeMember(f.value,l++),{parallel:n.parallel,failFast:n.onFailure==="fail-fast",isFailure:bt,signal:e.signal,onStart:f=>e.emit(Es(f.value)),onEnd:(f,S)=>{e.emit(Ts(f.value,S)),e.log?.("info","TESTRUN_MEMBER_END","Testrun member ended",{execution_id:o,member_test_id:f.value.testId??xe(f.value.relPath),status:S.overallStatus,result_code:S.resultCode??null,duration_s:S.durationS,run_kind:S.runKind})}}),m=c.done.find(f=>bt(f.result));for(let f of c.skipped)await rr({packDir:s,testId:xe(f.value.relPath),definition:{path:"test.md",content:$s(f.value.path)},externalIdInput:r(f.value),tags:f.value.tags,reason:c.cancelled?"skipped: testrun cancelled":`skipped: fail-fast after ${m?Pl(m.item.value.path):"failure"}`});let p=new Map(c.done.map(f=>[f.item.value.relPath,f.result]));for(let f of n.checks){let S=xe(f.relPath);if(Ol(Ds(s,"tests",S,"result.yaml")))continue;let k=p.get(f.relPath);await rr({packDir:s,testId:S,definition:{path:"test.md",content:$s(f.path)},externalIdInput:r(f),tags:f.tags,reason:`member ended '${k?.overallStatus??"broken"}' before writing its result (chrome-slot failure or pre-run crash \u2014 see member session logs)`,status:"broken"}),k&&!bt(k)&&(k.overallStatus="broken",k.exitCode=2)}let g=c.done.flatMap(f=>f.result.pendingInvestigations??[]);if(g.length>0){e.emit({type:"testrun_investigations_wait",count:g.length});let f=g.map(E=>E.exited),S,k=!1;try{await Promise.race([Promise.allSettled(f),new Promise(E=>{S=setTimeout(()=>{k=!0,E()},e.investigationTimeoutMs??12e4)})])}finally{clearTimeout(S)}if(k){for(let L of g)try{L.cancel()}catch{}let E;try{await Promise.race([Promise.allSettled(f),new Promise(L=>{E=setTimeout(L,15e3)})])}finally{clearTimeout(E)}}}try{let f=E=>E==="passed"||E==="failed"||E==="skipped"?E:"broken",S=E=>{try{let L=ct(Ms(Ds(s,"tests",E,"result.yaml"),"utf8"));return zt(L.steps??[])}catch{return[]}},k=Xt({cwd:t,members:c.done.map(E=>({path:E.item.value.path,verdict:f(E.result.overallStatus),acs:S(E.result.testId),executionId:o,startedAt:new Date().toISOString(),durationMs:Math.round(E.result.durationS*1e3),mode:"testrun",local:!e.shouldPublish}))});for(let E of k.warnings)e.log?.("warn","TESTRUN_EXEC_SYNC_WARNING",E,{execution_id:o})}catch(f){e.log?.("warn","TESTRUN_EXEC_SYNC_FAILED","Testrun exec-sync failed",{execution_id:o,error:String(f)})}try{let f=(e.coverageWriter??pt)(s,Ve(t));f.status==="skipped"&&e.log?.("warn","TESTRUN_COVERAGE_SKIPPED",`Testrun coverage/usecases.yaml not written: ${f.reason}`,{execution_id:o,reason:f.reason})}catch(f){e.log?.("warn","TESTRUN_COVERAGE_WRITER_THREW","Testrun coverage writer threw",{execution_id:o,error:String(f)})}let d=await ut(s,new Date().toISOString()),w;try{let f=await dt(Ie(o,t),"L1");w=f.valid,f.valid||e.log?.("warn","EVIDENCE_INVALID","Sealed testrun pack failed L1 validation",{execution_id:o,first_code:String(f.diagnostics?.[0]?.code??""),surface:"testrun"})}catch(f){e.log?.("warn","TESTRUN_VALIDATION_ERROR","Testrun pack validation threw",{execution_id:o,error:String(f)})}let _="skipped";if(e.shouldPublish&&!c.cancelled&&e.publish){let f=n.checks[0],S=await e.publish({testId:f.testId,sessionId:o,executionId:o,sealedPackPath:Ie(o,t),projectId:n.projectId});_=S.ok?"ok":"failed",e.emit(gt(S,o))}else e.shouldPublish&&c.cancelled&&e.log?.("info","PUBLISH_SKIPPED","Testrun evidence publish skipped",{surface:"testrun",reason:"cancel"});let h=new Map(c.done.map(f=>[f.item.value.path,f.result]));for(let f of n.checks){let S=h.get(f.path);await Jt(Re(f.path),{execution_id:o,run_kind:S?.runKind??"author",status:S?bt(S)?S.overallStatus==="failed"?"failed":"broken":"passed":"skipped",valid:w,uploaded:_==="ok",at:new Date().toISOString()})}let v={tests:n.checks.length,passed:c.done.filter(f=>!bt(f.result)).length,failed:c.done.filter(f=>f.result.overallStatus==="failed").length,broken:c.done.filter(f=>["broken","interrupted"].includes(f.result.overallStatus)).length,skipped:c.skipped.length};e.log?.("info","TESTRUN_SUMMARY","Testrun summary",{execution_id:o,totals:{passed:v.passed,failed:v.failed,broken:v.broken,skipped:v.skipped},upload:_});let R=c.done.some(f=>bt(f.result)),I=c.cancelled?3:R?1:0;return e.log?.("info","TESTRUN_DONE","Testrun done",{execution_id:o,exit_code:I}),{exitCode:I,executionId:o,totals:v,upload:_}}import{readFileSync as Dl}from"fs";function $l(n,e){return{testId:n,overallStatus:e.overallStatus,exitCode:e.exitCode,durationS:e.durationS??0,runKind:pi(!!e.anyAuthorStepRan),resultCode:e.resultCode??null,...e.pendingInvestigations?.length?{pendingInvestigations:e.pendingInvestigations}:{}}}function Ns(n){let e={...n.passThroughOpts,cdpEndpoint:n.cdpEndpoint};return{path:n.abs,cwd:n.cwd,opts:e,isAgent:!0,disableAskUser:!0,resolved:{...n.resolved,chrome:{...n.resolved.chrome,cdp_endpoint:n.cdpEndpoint}},resolvedAuth:n.resolvedAuth,cliOverrides:{},environment:n.environment,envConfig:n.envConfig,profile:n.profile,model:n.model,creds:n.creds,configStore:n.configStore,session:n.session,skipGlobalRemoteLogger:!0,evidenceAttach:n.attach,suppressEvidenceOffer:!0,onFatalExit:t=>{throw new Error(`project/folder gate failed: ${t.split(`
44
- `)[0]}`)},signal:n.signal}}async function Fs(n,e,t,i,o=Fn){let r=xe(n.relPath),s=Date.now();try{let a=await Mo.attach({packDir:t.packDir,testId:r,definition:{path:"test.md",content:Dl(n.path,"utf8")},cwd:t.cwd}),l=Ns({abs:n.path,cwd:t.cwd,resolved:$n(n.path),resolvedAuth:t.resolvedAuth,environment:t.environment,envConfig:t.envConfig,profile:t.profile,model:t.model,creds:t.creds,configStore:t.configStore,session:new Ct,passThroughOpts:t.passThroughOpts,cdpEndpoint:e.cdpEndpoint,attach:a,signal:t.signal}),{host:u,lifecycle:c}=i(n),m=()=>{try{c.cleanup("runner","testrun cancelled")}catch{}};t.signal?.addEventListener("abort",m);try{let p=await o(l,u,c);return $l(r,p)}finally{t.signal?.removeEventListener("abort",m)}}catch(a){return process.stderr.write(`member ${n.relPath} broken: ${a.message}
45
- `),{testId:r,overallStatus:"broken",exitCode:2,durationS:(Date.now()-s)/1e3,runKind:"replay"}}finally{e.release()}}async function Ls(n,e,t,i,o=Fn){let r=Date.now();try{let s=Ns({abs:n.path,cwd:t.cwd,resolved:$n(n.path),resolvedAuth:t.resolvedAuth,environment:t.environment,envConfig:t.envConfig,profile:t.profile,model:t.model,creds:t.creds,configStore:t.configStore,session:new Ct,passThroughOpts:t.passThroughOpts,cdpEndpoint:e.cdpEndpoint,attach:void 0,signal:t.signal}),{host:a,lifecycle:l}=i(n),u=()=>{try{l.cleanup("runner","testrun cancelled")}catch{}};t.signal?.addEventListener("abort",u);try{let c=await o(s,a,l);return{relPath:n.relPath,testId:c.ownPack?.testId,testcaseId:c.ownPack?.testcaseId,commitId:c.ownPack?.commitId,executionId:c.ownPack?.executionId,overallStatus:c.overallStatus,exitCode:c.exitCode,durationS:c.durationS??0,published:c.ownPack?c.ownPack.published?"yes":"no":"unknown"}}finally{t.signal?.removeEventListener("abort",u)}}catch(s){return process.stderr.write(`author member ${n.relPath} broken: ${s.message}
46
- `),{relPath:n.relPath,overallStatus:"broken",exitCode:2,durationS:(Date.now()-r)/1e3,published:"no"}}finally{e.release()}}var Ml=n=>n.overallStatus==="failed"||n.overallStatus==="broken"||n.overallStatus==="interrupted";async function Us(n,e){if(n.length===0)return{results:[],cancelled:!1,skipped:[]};let t=0,i=n.map(r=>({key:r.path,value:r})),o=await cn(i,r=>e.executeAuthorMember(r.value,t++),{parallel:e.parallel,failFast:!1,isFailure:Ml,signal:e.signal,onStart:r=>e.emit(Rs(r.value)),onEnd:(r,s)=>e.emit(As(s))});return{results:o.done.map(r=>r.result),cancelled:o.cancelled,skipped:o.skipped.map(r=>r.value)}}import{mkdtempSync as jl,rmSync as Nl}from"fs";import{tmpdir as Fl}from"os";import{join as Ll}from"path";function Vs(n){let e=Promise.resolve(),t=new Map,i=r=>{try{Nl(r,{recursive:!0,force:!0})}catch{}};function o(r){let s=e.then(async()=>{if(t.has(r))throw new Error(`chrome slot ${r} already acquired (one acquire per worker index)`);let a=jl(Ll(Fl(),"kane-testrun-chrome-")),l;try{l=await n.launch({userDataDir:a,width:n.width,height:n.height,headless:n.headless})}catch(u){throw i(a),u}return t.set(r,{chrome:l,dataDir:a}),{cdpEndpoint:l.cdpEndpoint,release(){let u=t.get(r);if(u){t.delete(r);try{u.chrome.kill()}catch{}i(u.dataDir)}}}});return e=s.catch(()=>{}),s}return{acquire:o,killAll(){for(let[,r]of t){try{r.chrome.kill()}catch{}i(r.dataDir)}t.clear()}}}function Bs(){let n=new Map;return{register(e,t){n.set(e,t)},deregister(e){n.delete(e)},cleanup(e,t){let i=n.get(e);if(i){n.delete(e);try{i()}catch{}}},remoteLogger:null}}import{EventEmitter as Ul}from"events";import{Writable as Vl}from"stream";function Bl(){return new Vl({write(n,e,t){t()}})}function Hl(){let n=new Ul;return Object.assign(n,{isTTY:!0,setEncoding(){},setRawMode(e){return n},ref(){return n},unref(){return n},read(){return null}}),n}function Hs(){let n=process.env.KANE_TESTRUN_MEMBER_DEBUG;return n==="1"||n==="true"}function Ws(){return{...Jo({isAgent:!0,log:()=>{},stdout:Hs()?process.stderr:Bl(),stdin:Hl()}),onAgentEvent:Hs()?e=>{process.stderr.write(`[member] ${JSON.stringify(e)}
39
+ `),process.exit(2));let{runListTui:t,resolveCurrentOrgId:i}=await import("./testmd-actions-NPILETCQ.js"),o=await i({});o.ok||process.exit(o.code),process.exit(await t(o.orgId))});hl(e),bl(e),vl(e),wl(e),yl(e),kl(e)}function gl(n,e){return e.concat(n)}function hl(n){n.command("run <path>").description("Run a test from a *_test.md file").option("--url <url>","Start URL for the first step (overrides frontmatter url: and config default_url)").option("--headless","Run Chrome in headless mode").option("--max-steps <n>","Max agent steps","50").option("--timeout <seconds>","Kill after N seconds").option("--cdp-endpoint <url>","Connect to existing Chrome via CDP").option("--ws-endpoint <url>","Playwright WebSocket endpoint").option("--global-context <file>",`Override global context (default: ${fl(J,"global-memory.md")})`).option("--local-context <file>","Override local context (default: .testmuai/context.md in cwd)").addOption(new G("--model <name>","Model override").hideHelp()).option("--variables <json>","Inline variables JSON").option("--variables-file <path>","Load variables from file").option("--session-context <json>","Session context JSON (prior runs)").addOption(new G("--cft","Use Playwright Chromium instead of managed Chrome").hideHelp()).option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key").option("--env <name>","Environment (prod or stage)").option("--mode <name>","Run mode: action | testing").option("--assertion-mode <mode>","Assertion mode: dom (default \u2014 DOM extraction & assertions, vision fallback) | visual (vision only)").option("--final-validation <on|off>","Final validation: append the system cp_final checkpoint. Overrides config (default: off)").option("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").addOption(new G("--local","Skip TMS integration (no uploads, no variables/secrets push)").hideHelp()).option("--allow-missing-url","Non-TTY only: proceed from the browser's current page instead of failing when the first step has no start URL (frontmatter url:/--url still used)").option("--code-export","Generate code export after upload").option("--code-language <lang>","Code-export language (python|javascript)").option("--name <name>","Persist session under this name").option("--target <name>","Where to run: desktop | emulator | simulator (default: the file's `target:`, else desktop)").option("--device <id>","Which device, when the target is mobile: name, serial, ip:port, or UDID").option("--app <path|APPid>","App under test, when the target is mobile: a build (.apk / .zip of the .app) or an APP\u2026 id from your uploads. Overrides the file's `app:`").option("--skip-code-validation","Skip post-codegen validation").option("--no-skip-code-validation","Force post-codegen validation").option("--on-lock-conflict <mode>","lock conflict policy: readonly|fail|wait",e=>{if(e!=="readonly"&&e!=="fail"&&e!=="wait")throw new Error(`--on-lock-conflict must be readonly|fail|wait, got: ${e}`);return e}).option("--push","always commit at end-of-run (no retry semantics)").option("--no-adaptive-heal","disable adaptive heal \u2014 a replay miss becomes terminal instead of re-authoring the failing tail (default: heal on, 3 attempts then a full re-author)").addOption(new G("--retry","(retired) adaptive heal is on by default").hideHelp()).addOption(new G("--retry-count <n>","(retired) heal budget is fixed at 3").argParser(e=>{let t=parseInt(e,10);if(Number.isNaN(t)||t<0)throw new Error(`--retry-count must be a non-negative integer, got: ${e}`);return e}).hideHelp()).option("--author","bypass walker; force fresh test+testcase in TMS; replace local output entirely").addOption(new G("--no-evidence-publish","skip the replay evidence publish (blob upload + TMS /evidence/ingest) \u2014 the run leaves no execution record in TMS").hideHelp()).option("--bug-detection <mode>","detect product bugs while authoring: off|stop|continue (stop halts the run on a confirmed bug; continue records it and keeps going). Overrides `config set-bug-detection`. Authoring steps only \u2014 replay failures always investigate.",e=>{if(e!=="off"&&e!=="stop"&&e!=="continue")throw new Error(`--bug-detection must be off, stop or continue, got: ${e}`);return e}).action(async(e,t)=>{let{retiredRetryFlagsNotice:i}=await import("./replay-policy-CVQ6OJX5.js"),o=i(t);o&&process.stderr.write(o+`
40
+ `);let{runTestMdFile:r}=await import("./run-test-md-FO2RNNOD.js"),a=await r(e,t);process.exit(a)})}function bl(n){n.command("list").description("List *_test.md files in the working directory (recursive)").option("--root <dir>","Root directory to scan (default: cwd)").option("--ignore <name>","Skip a directory by name (repeatable)",gl,[]).option("--json","Force NDJSON output even on TTY").action(async e=>{let{runListAction:t,resolveCurrentOrgId:i}=await import("./testmd-actions-NPILETCQ.js"),o=await i({json:!!e.json});o.ok||process.exit(o.code),process.exit(await t(e,o.orgId))})}function vl(n){n.command("status <path>").description("Print local meta.json for a *_test.md (no live TMS check in v1)").action(async e=>{let{runStatusAction:t,resolveCurrentOrgId:i}=await import("./testmd-actions-NPILETCQ.js"),o=await i({});o.ok||process.exit(o.code),process.exit(await t(e,o.orgId))})}function wl(n){n.command("delete <path>").description("Remove output-<stem>/ and the *_test.md source file (TMS untouched)").option("--yes","Skip confirmation prompt (required in non-TTY)").action(async(e,t)=>{let{runDeleteAction:i,resolveCurrentOrgId:o}=await import("./testmd-actions-NPILETCQ.js"),r=await o({});r.ok||process.exit(r.code),process.exit(await i(e,!!t.yes,r.orgId))})}function yl(n){n.command("export <path>").description("Generate standalone test code (Playwright)").option("--language <lang>","python|javascript (falls back to tui-config)").option("--output <dir>","Override output dir (default: output-<stem>/playwright-<lang>-code/)").option("--force","Overwrite an existing local export").action(async(e,t)=>{let{runExportAction:i,resolveCurrentOrgId:o}=await import("./testmd-actions-NPILETCQ.js"),r=await o({});r.ok||process.exit(r.code),process.exit(await i(e,t,r.orgId))})}function kl(n){n.command("sync <path>").description("Zip the testmd + imports + replay outputs and push {commit_id}-testmd.zip to cloud").option("--env <name>","Environment (prod or stage)").option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key").action(async(e,t)=>{let{runSyncAction:i,resolveSyncAuth:o}=await import("./testmd-actions-NPILETCQ.js"),r=await o(t);r.ok||process.exit(r.code),process.exit(await i(e,r))})}function cs(n){let e=n.command("context").description("Assurance context graph (.context/): ingest sources, extract use-cases, list nodes").action((t,i)=>{i.args.length>0&&i.error(`error: unknown command '${i.args[0]}'`,{exitCode:2}),i.help()});e.command("ingest <src...>").description("Land source files into .context/ and extract them \u2014 the one-flow entry. On a TTY this continues into the interactive extract chat; --mode ci or piped stdin lands only").option("--as <id>","Ingest AS this existing source id \u2014 a new VERSION: moves its head, dependents go stale (single file only)").option("--mode <mode>","interactive | agent | ci | override \u2014 how the extraction runs. ci (and headless without --mode) lands only").option("--plan","Extraction stops after the proposal \u2014 print it, commit nothing").option("--force","Extract even if the landed snapshot was already extracted").option("--trust <dial>","Extraction trust dial: auto (default) | hold (headless only)").action(async(t,i)=>{let{ingestCommand:o}=await import("./ingest-cmd-T6HM3AHK.js");process.exit(await o(t,i))}),e.command("extract").description("Interactively extract use-cases from ingested sources via the context agent").option("--plan","Stop after the proposal \u2014 print it, commit nothing").option("--apply <path>","NOT IMPLEMENTED YET \u2014 will commit a saved --plan proposal (refuses loudly today)").option("--mode <mode>","Ask policy: interactive | agent | ci | override. TTY defaults to interactive chat; REQUIRED when headless").option("--force","Re-extract sources even if their current snapshot was already extracted").option("--resume <sid>","Resume a paused session (state under .context/sessions/)").option("--message <text>","With --resume: answer the pending questions (or steer) in plain words \u2014 the agent maps your statement itself").option("--source <id>","Extract exactly this ingested source \u2014 the explicit path for su-conv-* conversation sources, which the default sweep skips").option("--queued","(removed) the queue is gone \u2014 extract sweeps every pending source by default; this flag refuses with guidance for one release").option("--trust <dial>","Per-run trust dial: auto (new items commit derived into review \u2014 the default everywhere) | hold (everything new HELD; headless only \u2014 refused under interactive). ci refuses the flag entirely").option("--answer <pairs...>","With --resume --mode agent: answer a pending question/panel BY ID \u2014 <qid-or-panelId>=<option number (1-based) or free text>, repeatable").option("--with-source <ref>","With --resume: land this file/URL FIRST and set the pending questions aside \u2014 the agent reads the source, narrates what it settled, and re-asks what's still open").action(async t=>{let{extractCommand:i}=await import("./extract-cmd-FLOYO6HL.js");process.exit(await i(t))}),e.command("sessions [action] [sid]").description("List resumable sessions; `sessions show <sid>` prints pending questions + assumed defaults; `sessions clean [sid]` GCs expired/named ones").option("--all","clean: remove ALL sessions (incl. corrupt), not just expired").option("--json","JSON output").action(async(t,i,o)=>{let{sessionsCommand:r}=await import("./sessions-cmd-ZZIZN2VB.js");process.exit(await ge("sessions",()=>r(t,o,i)))}),e.command("fsck").description("Verify the full commit chain and check the derived projection for drift").option("--json","Print the full structured report as one JSON object (issues carry code + detail + ecids)").action(async t=>{let{fsckCommand:i}=await import("./maintenance-cmd-6XSVO6FO.js");process.exit(await ge("fsck",o=>i(o,t)))}),e.command("locks",{hidden:!0}).description("Show held context/UC locks and waiters (read-only)").option("--json","Machine output (plain array, no NDJSON envelope \u2014 not a room verb)").action(async t=>{let{runLocksCommand:i}=await import("./locks-cmd-CSVSWY2Y.js"),{contextDir:o}=await import("./paths-JCYX6UWL.js");process.exit(i(o(process.cwd()),t,r=>process.stdout.write(r+`
41
+ `)))}),e.command("rebuild").description("Wipe .context/derived and rebuild it from the verified commit chain").option("--yes","Skip the confirmation prompt (required when headless)").action(async t=>{let{rebuildCommand:i}=await import("./maintenance-cmd-6XSVO6FO.js");process.exit(await ge("rebuild",()=>i(t),{write:!0}))}),e.command("list").description("List context graph nodes").option("--type <t>","Filter by node label (source | usecase)").option("--inferred","Only derived (unreviewed) nodes").option("--stale","Only stale/orphaned nodes").option("--all","Include superseded node versions").option("--json","JSON output").action(async t=>{let{listCommand:i}=await import("./list-cmd-N4KMA34H.js");process.exit(await ge("list",()=>i(t)))}),e.command("view").description("Render the context graph as an interactive HTML page and open it in the browser (snapshot)").option("--out <path>","Write the HTML to <path> instead of a temp file").option("--open","Force-open the browser even when non-TTY (piped)").option("--no-open","Write the file but do not open the browser").option("--json","Print the computed view payload as JSON and exit (no HTML)").action(async t=>{let{viewCommand:i}=await import("./view-cmd-KPJTP4DI.js");process.exit(await ge("view",()=>i(t)))}),e.command("retire <source_id>").description("Retire a source (head \u2192 null + tombstone record); reversible via revert").option("--reason <text>","Why this source is being retired").option("--yes","Skip the confirmation prompt (required when headless)").action(async(t,i)=>{let{retireCommand:o}=await import("./lifecycle-cmd-O2324GN6.js");process.exit(await ge("retire",()=>o(t,i),{write:!0}))}),e.command("name [ref] [slug]").description("Assign a stable kebab-case name to a node (ref = cid or existing slug); --backfill assigns logical ids to all unnamed live nodes").option("--backfill","assign label-prefixed logical ids (uc-/sc-/ac-/t-\u2026) to every live unnamed node").option("--yes","Skip the --backfill confirmation prompt (required when headless)").action(async(t,i,o)=>{let{nameCommand:r,nameBackfillCommand:a}=await import("./lifecycle-cmd-O2324GN6.js");o.backfill&&process.exit(await ge("namebackfill",()=>a(o))),(!t||!i)&&(process.stderr.write(`usage: kane-cli context name <ref> <slug> | kane-cli context name --backfill
42
+ `),process.exit(2)),process.exit(await ge("name",()=>r(t,i),{write:!0}))}),e.command("revert <seq>").description("Invert a record's effects via a compensation record \u2014 history is never rewritten").option("--reason <text>","Why this record is being reverted").option("--yes","Skip the confirmation prompt (required when headless)").action(async(t,i)=>{let{revertCommand:o}=await import("./lifecycle-cmd-O2324GN6.js");process.exit(await ge("revert",()=>o(t,i),{write:!0}))}),e.command("review").description("Walk a review queue; verdicts land as ONE batched record").option("--queue <q>","derived (default) | skipped | archived | drift").option("--json","NDJSON output (drift listing + --verdicts outcomes)").option("--verdicts <file>",'headless verdict input: JSON array of {"ref", "resolution", ...} \u2014 atomic, works with or without a TTY').option("--allow-archive","Apply archives headlessly (requires --because; refused under --mode ci)").option("--because <reason>","audit reason stamped on headless archives (required with --allow-archive)").option("--mode <m>","agent | ci \u2014 ci refuses archives under ANY flag").option("--approve <refs...>","structured verdict: approve these refs (temp_ref/cid/logical id)").option("--skip <refs...>","structured verdict: skip these refs (no fact \u2014 stays queued)").option("--defer <refs...>","structured verdict: defer these refs (no fact \u2014 stays queued)").action(async t=>{let{reviewCommand:i}=await import("./review-cmd-DQRKQUMG.js");process.exit(await ge("review",()=>i(t)))}),e.command("explain <ref>").description("Replay the recorded reasoning + lineage for a node (no model call)").option("--json","JSON output").action(async(t,i)=>{let{explainCommand:o}=await import("./explain-cmd-EX24XKD6.js");process.exit(await ge("explain",()=>o(t,i)))})}function ds(n){let e=n.command("design").description("Test design engine: turn a committed use-case into ACs, scenarios, and 1:1 tests").action((t,i)=>{i.args.length>0&&i.error(`error: unknown command '${i.args[0]}'`,{exitCode:2}),i.help()});e.command("tests").description("Design the assurance for ONE committed use-case (conversational; chat is the default)").option("--use-case <ref>","The use-case to design \u2014 logical id (uc-\u2026) or cid (optional with --resume: the session remembers it)").option("--max <n>","Budget ceiling: max scenario+test pairs (NO ceiling when omitted \u2014 the agent estimates and asks)",t=>Number(t)).option("--strength <s>","Manual covering-array strength override: pairwise | 3-wise").option("--mode <mode>","Ask policy: interactive | agent | ci | override. TTY defaults to interactive chat; REQUIRED when headless").option("--force","Redesign a use-case that already has a live design (supersedes its scenario+test pairs)").option("--resume <sid>","Resume a paused design session (state under .context/sessions/)").option("--message <text>","With --resume: answer the pending questions (or steer) in plain words \u2014 the agent maps your statement itself").option("--plan","Transcription only \u2014 print each finalize payload, commit nothing").option("--allow-unreviewed","Design against an unreviewed use-case without approving it first").option("--phase <name>","Enter the design at this phase (grounding | acs | scenarios | wiring | tests), re-seeded from committed prior phases").option("--answer <pairs...>","With --resume --mode agent: answer a pending question/panel BY ID \u2014 <qid-or-panelId>=<option number (1-based) or free text>, repeatable").action(async t=>{let{designTestsCommand:i}=await import("./bind-SJ6DOVQ4.js");process.exit(await i(t))}),e.command("explain <ref>").description("Replay WHY a designed item looks the way it does \u2014 sidecar + recorded judgements, zero fresh AI").action(async t=>{let{designExplainCommand:i}=await import("./explain-cmd-2TKO7GRW.js");process.exit(await i(t))})}function us(n){let e=n.command("maintain").description("Keep the assurance suite true as sources change: reconcile").action((t,i)=>{i.args.length>0&&i.error(`error: unknown command '${i.args[0]}'`,{exitCode:2}),i.help()});e.command("evolve [ref]").description("Re-design the parent use-case of a test/scenario/AC/use-case \u2014 unaffected items are preserved verbatim; reports the pair diff").option("--from-stale","Evolve every use-case with stale designed entities (deduped, per-UC confirm)").option("--because <reason>","Re-design a FRESH target anyway \u2014 the reason becomes the change delta and lands in provenance").action(async(t,i)=>{let{evolveCommand:o}=await import("./evolve-cmd-DIA5EWUT.js");process.exit(await o(t,i))}),e.command("reconcile").description("Reconcile a changed source: the head lands, extraction runs over the change, and every proposed change HOLDS as a review card \u2014 approve / reject / defer, nothing commits without your verdict (the in-chat review is the TTY default)").option("--from <file>","The NEW version of the source document (a file path)").option("--source-id <id>","The EXISTING source this file succeeds \u2014 its head moves; see `kane-cli context list --type source`").option("--plan","Preview: the head-move lands (the change fact), everything else is STAGED into the stored plan \u2014 nothing suite-side commits").option("--apply [path]","Walk a STORED plan (REMOVE stays plan-only). Bare = the latest plan behind an approval prompt; a path picks one; with --from it recomputes live").option("--mode <mode>","interactive | agent | ci | override \u2014 TTY defaults to the in-chat card review; headless requires one").action(async t=>{let{reconcileCommand:i}=await import("./reconcile-cmd-CYRYVS5B.js");process.exit(await i(t))})}function ms(n){n.command("cover").description("Two-axis coverage: depth proven by an evidence pack + completeness owed by the live graph").enablePositionalOptions().option("--from <pack>","Evidence pack to read (dir, sealed file, or execution id; default: newest in .testmuai/evidence)").option("--json","Machine-readable output").option("--mode <mode>","interactive | agent | ci \u2014 agent/ci ride the NDJSON envelope (done-last + next)").action(async(t,i)=>{i.args.length>0&&i.error(`error: unknown command '${i.args[0]}'`,{exitCode:2});let{coverCommand:o}=await import("./cover-cmd-7JILZJUK.js");process.exit(await ge("cover",()=>o(t)))}).command("gaps [uc]").description("Dual-axis coverage ribbon \u2014 designed \xD7 proven from the live graph; pass a use-case id for its full dossier").option("--stage <stage>","design | cover | all (default all)").option("--top <n>","Bound pending rows per use-case in the --json document (table output is never truncated)",t=>Number(t)).option("--rollup <rollup>","Proven-axis formula: lenient | strict (default lenient)").option("--json","Machine-readable nested document").option("--mode <mode>","interactive | agent | ci \u2014 agent/ci ride the NDJSON envelope (done-last + next)").action(async(t,i)=>{let{gapsCommand:o}=await import("./gaps-cmd-3ZX3PZF4.js");process.exit(await ge("gaps",()=>o(t,i)))})}var gr=Se(xt(),1);var Ae=Se(xt(),1);function fs(n){return{members:n.map(e=>({...e,status:"pending"})),summary:null,done:null}}function ps(n,e){return typeof e!="string"||e.length===0?!1:e===n.relPath||e.endsWith("/"+n.relPath)}function xl(n){return n==="passed"?"passed":"failed"}function gs(n,e){switch(e.type){case"testrun_member_start":case"testrun_authored_member_start":return{...n,members:n.members.map(t=>ps(t,e.path)?{...t,status:"running"}:t)};case"testrun_member_end":case"testrun_authored_member_end":return{...n,members:n.members.map(t=>ps(t,e.path)?{...t,status:xl(e.status),durationS:e.duration_s}:t)};case"testrun_summary":return{...n,summary:{execution:e.execution??null,authored:e.authored??[],totals:e.totals,durationS:e.duration_s,upload:e.upload,cancelled:!!e.cancelled}};case"testrun_done":return{...n,done:{executionId:e.execution_id,overallStatus:e.overall_status}};default:return n}}var V=Se(at(),1);function bs(n){return n<60?`${n.toFixed(1)}s`:`${Math.floor(n/60)}m ${Math.round(n%60)}s`}function hs({member:n}){let e=n.status==="running",t=n.status==="passed",i=n.status==="failed",o=n.durationS!=null?bs(n.durationS):"";return(0,V.jsxs)(ne,{children:[(0,V.jsx)(ne,{width:3,children:e?(0,V.jsx)(jr,{}):t?(0,V.jsx)(q,{color:K.green,bold:!0,children:"\u2713"}):i?(0,V.jsx)(q,{color:K.red,bold:!0,children:"\u2717"}):(0,V.jsx)(q,{color:K.muted,children:"\u25CB"})}),(0,V.jsxs)(ne,{flexGrow:1,children:[(0,V.jsx)(q,{color:i?K.red:K.dim,children:n.relPath}),n.memberClass==="author"&&(0,V.jsx)(q,{color:K.purple,children:" authoring"})]}),(0,V.jsx)(ne,{width:8,justifyContent:"flex-end",children:(0,V.jsx)(q,{color:K.dim,children:o})})]})}function _l({summary:n}){let e=n.totals,t=n.cancelled?"cancelled":e.failed>0||e.broken>0?"failed":"passed",i=t==="cancelled"?K.orange:t==="passed"?K.green:K.red,o=t==="cancelled"?"!":t==="passed"?"\u2713":"\u2717",r=t.toUpperCase(),a=`${e.passed} passed \xB7 ${e.failed} failed \xB7 ${e.broken} broken \xB7 ${e.skipped} skipped \xB7 ${e.authored} authored`;return(0,V.jsx)(ne,{flexDirection:"column",marginTop:1,children:(0,V.jsxs)(ne,{borderStyle:"round",borderColor:i,flexDirection:"column",paddingX:2,paddingY:1,children:[(0,V.jsxs)(q,{bold:!0,color:i,children:[o," ",r]}),(0,V.jsx)(q,{color:K.dim,children:a}),n.execution&&(0,V.jsxs)(q,{color:K.dim,children:["execution ",n.execution.id,": ",n.execution.status]}),n.authored.length>0&&(0,V.jsxs)(q,{color:K.dim,children:["authored: ",n.authored.length," test(s)"]}),(0,V.jsxs)(q,{color:K.dim,children:[bs(n.durationS)," \xB7 upload: ",n.upload]})]})})}function vs({members:n,title:e,env:t,dispatchRef:i,onDone:o}){let{exit:r}=Nt(),{append:a}=Lt(),[s,l]=(0,Ae.useState)(()=>fs(n)),[u,c]=(0,Ae.useState)(()=>new Set),m=(0,Ae.useRef)(!1),p=(0,Ae.useRef)(!1);(0,Ae.useEffect)(()=>(i.current=d=>l(w=>gs(w,d)),()=>{i.current=null}),[]),(0,Ae.useEffect)(()=>{p.current||(p.current=!0,a((0,V.jsxs)(ne,{borderStyle:"round",borderColor:"#dc4e08",paddingX:2,children:[(0,V.jsx)(q,{color:"#ff9500",bold:!0,children:"KaneAI CLI"}),(0,V.jsx)(q,{color:K.dim,children:" \u2502 "}),(0,V.jsx)(q,{color:K.dim,children:`testrun \xB7 ${e} \xB7 ${t}`})]})))},[]),(0,Ae.useEffect)(()=>{let d=s.members.filter(w=>(w.status==="passed"||w.status==="failed")&&!u.has(w.relPath));if(d.length!==0){for(let w of d)a((0,V.jsx)(hs,{member:w},w.relPath));c(w=>{let _=new Set(w);for(let h of d)_.add(h.relPath);return _})}},[s.members,u,a]),(0,Ae.useEffect)(()=>{s.done&&!m.current&&(m.current=!0,o?.(),r())},[s.done,r,o]);let g=s.members.filter(d=>!u.has(d.relPath));return(0,V.jsxs)(ne,{flexDirection:"column",children:[g.length>0&&(0,V.jsx)(ne,{flexDirection:"column",children:g.map(d=>(0,V.jsx)(hs,{member:d},d.relPath))}),s.summary&&(0,V.jsx)(_l,{summary:s.summary})]})}import{existsSync as Cl}from"fs";import{resolve as Il,relative as El}from"path";import{existsSync as Sl}from"fs";import{relative as ws}from"path";var ve=class extends Error{};function ys(n,e){let t=Ve(n);if(!Sl(t))throw new ve(`--from-context needs an assurance store at ${t} \u2014 run the design flow there first, or run from the project root that holds .context`);let i=Do(t),o=vi(Ln(n)),r=[];for(let a of e){let s=a.trim();if(!s)continue;let l=i.resolve(s);if(!l)throw new ve(`--from-context: unknown id '${s}' \u2014 it does not resolve in the assurance graph`);if(i.superseded.has(l.tip))throw new ve(`--from-context: '${s}' is tombstoned (retired with no live successor) \u2014 redesign the suite or select a live test id`);let u=i.getNode(l.tip);if(u?.label!=="test")throw new ve(`--from-context: '${s}' is a ${u?.label??"unknown"} node, not a test \u2014 only test ids select members`);let c=s.toLowerCase(),m=o.get(c)??o.get(s)??[];if(m.length===0)throw new ve(`--from-context: '${s}' has no minted test file under ${Ln(n)} \u2014 re-run the design for this suite, or restore the deleted file`);if(m.length>1)throw new ve(`--from-context: '${s}' is claimed by ${m.length} files (${m.map(p=>ws(n,p)).join(", ")}) \u2014 remove the duplicates`);r.push({path:m[0],relPath:ws(n,m[0]),contextId:c})}return r}async function ks(n){let e=n.cwd??process.cwd(),t=n.fromContext?.length?ys(e,n.fromContext):[],i;if(n.paths&&n.paths.length>0||t.length>0){let a=(n.paths??[]).map(s=>{let l=Il(e,s);if(!Cl(l)||!l.endsWith("_test.md"))throw new ve(`not a *_test.md file: ${s}`);return{path:l,relPath:El(e,l)}});i=[...t,...a]}else i=(await Ho({root:e})).results.map(s=>({path:s.path,relPath:s.relPath}));if(n.match){let a;try{a=new RegExp(n.match)}catch(s){throw new ve(`invalid --match regex: ${s instanceof Error?s.message:s}`)}i=i.filter(s=>a.test(s.relPath))}let o=new Set,r=[];for(let a of i){if(o.has(a.path))continue;o.add(a.path);let s=Wo(a.path);r.push({...a,tags:s.tags,...s.mobileTarget?{mobile:!0}:{}})}if(n.tags&&n.tags.length>0){let a=new Set(n.tags.map(s=>s.toLowerCase()));return r.filter(s=>s.tags.some(l=>a.has(l))).sort((s,l)=>s.relPath.localeCompare(l.relPath))}return r.sort((a,s)=>a.relPath.localeCompare(s.relPath))}import{readFileSync as Tl}from"fs";import{join as Rl}from"path";function xs(n){try{return JSON.parse(Tl(Rl(Re(n),".internal","meta.json"),"utf8"))}catch{return null}}var ft=n=>typeof n=="string"&&n?n:void 0;function _s(n){let e=[],t,i;for(let r of n){if(r.mobile){e.push({...r,memberClass:ft(xs(r.path)?.test_id)?"replay":"author",failure:"mobile_unsupported"});continue}let a=xs(r.path);if(!a){e.push({...r,memberClass:"author"});continue}let s={testcaseId:ft(a.testcase_id),folderId:ft(a.folder_id),commitId:ft(a.commit_id),sessionName:ft(a.session_name)},l=ft(a.test_id),u=typeof a.org_id=="string"?a.org_id:void 0,c=typeof a.project_id=="string"?a.project_id:void 0,m=l?"replay":"author";if(t===void 0&&u&&(t=u),i===void 0&&c&&(i=c),u&&t&&u!==t){e.push({...r,...s,testId:l,orgId:u,projectId:c,memberClass:m,failure:"org_mismatch"});continue}if(c&&i&&c!==i){e.push({...r,...s,testId:l,orgId:u,projectId:c,memberClass:m,failure:"project_mismatch"});continue}e.push({...r,...s,testId:l,orgId:u,projectId:c,memberClass:m})}let o=e.length>0&&e.every(r=>!r.failure);return{checks:e,valid:o,orgId:t,projectId:i}}function Al(n){return n.tags?.length?`testrun --tags ${n.tags.join(",")}`:n.match?`testrun --match ${n.match}`:n.paths?.length?`testrun ${n.paths.length} paths`:"testrun"}async function Ss(n){let e=await ks(n),t=_s(e),i=Number(n.parallel??1),o=Number.isFinite(i)&&i>=1?Math.floor(i):1;return{...t,parallel:o,parallelClamped:!1,onFailure:n.onFailure??"continue",title:n.name??Al(n)}}import{basename as Pl,join as Os}from"path";import{readFileSync as Ms,existsSync as $l}from"fs";import{promises as Tt}from"fs";import{existsSync as Rt}from"fs";import{join as Je}from"path";async function rr(n){let e=n.status??"skipped",t=Je(n.packDir,"tests",n.testId),i=Je(t,"steps"),o=Je(t,"logs");await Tt.mkdir(i,{recursive:!0});let r=Je(i,".keep");Rt(r)||await Tt.writeFile(r,""),await Tt.mkdir(o,{recursive:!0});let a=Je(o,"testrun.log");Rt(a)||await Tt.writeFile(a,n.reason+`
43
+ `);let s=Je(t,n.definition.path);Rt(s)||await Tt.writeFile(s,n.definition.content);let l=Je(o,"meta.yaml");if(!Rt(l)){let c=await Po(o);await Ao(n.packDir,n.testId,To(c))}let u=Je(t,"result.yaml");Rt(u)||await Ro(n.packDir,n.testId,Eo({testId:n.testId,status:e,definitionPath:n.definition.path,externalId:So(n.externalIdInput),tags:n.tags,environment:{},steps:[]}))}async function cn(n,e,t){let i=[],o=new Array(n.length).fill(!1),r=0,a=!1,s,l=!1,u=()=>{i.length<n.length&&(l=!0)};t.signal&&(t.signal.aborted?u():t.signal.addEventListener("abort",u,{once:!0}));async function c(){for(;;){if(a||t.signal?.aborted||r>=n.length)return;let p=r++,g=n[p];o[p]=!0;try{t.onStart?.(g);let d=await e(g);i.push({item:g,result:d}),t.onEnd?.(g,d),t.failFast&&t.isFailure(d)&&(a=!0)}catch(d){s=s??d,a=!0}}}let m=Math.max(1,Math.min(t.parallel,n.length));try{await Promise.all(Array.from({length:m},()=>c()))}finally{t.signal?.removeEventListener("abort",u)}if(s)throw s;return{done:i,skipped:n.filter((p,g)=>!o[g]),cancelled:l}}function Cs(n){return{type:"testrun_plan",members:n.checks.map(e=>({path:e.path,test_id:e.testId,tags:e.tags,...e.contextId?{context_id:e.contextId}:{},...e.failure?{failure:e.failure}:{}})),valid:n.valid,parallel:n.parallel,...n.parallelClamped?{parallel_clamped:!0}:{}}}function Is(n,e){return{type:"testrun_start",execution_id:n,members:e.checks.map(t=>t.relPath),parallel:e.parallel}}function Es(n){return{type:"testrun_member_start",path:n.path,test_id:n.testId,...n.contextId?{context_id:n.contextId}:{}}}function Ts(n,e){return{type:"testrun_member_end",path:n.path,test_id:n.testId,status:e.overallStatus,duration_s:e.durationS,...n.contextId?{context_id:n.contextId}:{}}}function Rs(n){return{type:"testrun_authored_member_start",path:n.path}}function As(n){return{type:"testrun_authored_member_end",path:n.relPath,...n.testId?{test_id:n.testId}:{},status:n.overallStatus,duration_s:n.durationS}}function gt(n,e){return{type:"testrun_evidence_ingest",status:n.ok?"ok":"failed",evidence_id:e,...n.stage?{stage:n.stage}:{}}}function dn(n){return{type:"testrun_summary",execution:n.execution,authored:n.authored,totals:n.totals,duration_s:n.durationS,upload:n.upload,cancelled:n.cancelled,...n.remote?{remote:n.remote}:{}}}function ht(n,e){return{type:"testrun_done",execution_id:n,overall_status:e}}function Ps(n){return{type:"remote_start",backend:n.backend,env:n.env}}function $s(n){return{type:"remote_dispatched",job_id:n.jobId,job_url:n.jobUrl}}function ze(n){return{type:"reconcile_merge_degraded",code:"RECONCILE_MERGE_DEGRADED",reason:n.reason,...n.detail?{detail:n.detail}:{},...n.excludedPack?{excluded_pack:n.excludedPack}:{},...n.standaloneIds?{standalone_execution_ids:n.standaloneIds}:{}}}function rt(n){return{type:"remote_exec_sync",code:{skipped:"REMOTE_EXEC_SYNC_SKIPPED",warning:"REMOTE_EXEC_SYNC_WARNING",failed:"REMOTE_EXEC_SYNC_FAILED"}[n.status],status:n.status,reason:n.reason,...n.detail?{detail:n.detail}:{},...n.executionId?{execution_id:n.executionId}:{}}}function or(n){return{type:"remote_coverage",code:{skipped:"REMOTE_COVERAGE_SKIPPED",failed:"REMOTE_COVERAGE_FAILED"}[n.status],status:n.status,reason:n.reason,...n.detail?{detail:n.detail}:{}}}function un(n){return{type:"remote_error",code:n.code,detail:n.detail}}function At(n){return{type:"remote_done",status:n.status,exit:n.exit,job_id:n.jobId,sessions_path:n.sessionsPath}}var bt=n=>n.overallStatus==="failed"||n.overallStatus==="broken"||n.overallStatus==="interrupted";function Ds(n){try{return Ms(n,"utf8")}catch{return""}}async function js(n,e){let t=e.cwd??process.cwd(),i=Date.now(),o=mt();e.onExecutionId?.(o);let r=f=>({execution_id:o,test_id:f.testId,testcase_id:f.testcaseId,project_id:f.projectId,folder_id:f.folderId,org_id:f.orgId,commit_id:f.commitId,session_name:f.sessionName,user_name:e.operator?.userName,user_email:e.operator?.userEmail}),a=await Io({execution_id:o,title:n.title,started:new Date().toISOString(),producerVersion:Me,run_kind:"author",origin:"testrun",pid:process.pid},t);e.emit(Is(o,n));let s=[...new Set(n.checks.flatMap(f=>f.tags))];e.log?.("info","TESTRUN_START","Testrun started",{execution_id:o,member_count:n.checks.length,parallel:n.parallel,on_failure:n.onFailure,tags:s});let l=0,u=n.checks.map(f=>({key:f.path,value:f})),c=await cn(u,f=>e.executeMember(f.value,l++),{parallel:n.parallel,failFast:n.onFailure==="fail-fast",isFailure:bt,signal:e.signal,onStart:f=>e.emit(Es(f.value)),onEnd:(f,S)=>{e.emit(Ts(f.value,S)),e.log?.("info","TESTRUN_MEMBER_END","Testrun member ended",{execution_id:o,member_test_id:f.value.testId??xe(f.value.relPath),status:S.overallStatus,result_code:S.resultCode??null,duration_s:S.durationS,run_kind:S.runKind})}}),m=c.done.find(f=>bt(f.result));for(let f of c.skipped)await rr({packDir:a,testId:xe(f.value.relPath),definition:{path:"test.md",content:Ds(f.value.path)},externalIdInput:r(f.value),tags:f.value.tags,reason:c.cancelled?"skipped: testrun cancelled":`skipped: fail-fast after ${m?Pl(m.item.value.path):"failure"}`});let p=new Map(c.done.map(f=>[f.item.value.relPath,f.result]));for(let f of n.checks){let S=xe(f.relPath);if($l(Os(a,"tests",S,"result.yaml")))continue;let k=p.get(f.relPath);await rr({packDir:a,testId:S,definition:{path:"test.md",content:Ds(f.path)},externalIdInput:r(f),tags:f.tags,reason:`member ended '${k?.overallStatus??"broken"}' before writing its result (chrome-slot failure or pre-run crash \u2014 see member session logs)`,status:"broken"}),k&&!bt(k)&&(k.overallStatus="broken",k.exitCode=2)}let g=c.done.flatMap(f=>f.result.pendingInvestigations??[]);if(g.length>0){e.emit({type:"testrun_investigations_wait",count:g.length});let f=g.map(E=>E.exited),S,k=!1;try{await Promise.race([Promise.allSettled(f),new Promise(E=>{S=setTimeout(()=>{k=!0,E()},e.investigationTimeoutMs??12e4)})])}finally{clearTimeout(S)}if(k){for(let L of g)try{L.cancel()}catch{}let E;try{await Promise.race([Promise.allSettled(f),new Promise(L=>{E=setTimeout(L,15e3)})])}finally{clearTimeout(E)}}}try{let f=E=>E==="passed"||E==="failed"||E==="skipped"?E:"broken",S=E=>{try{let L=ct(Ms(Os(a,"tests",E,"result.yaml"),"utf8"));return zt(L.steps??[])}catch{return[]}},k=Xt({cwd:t,members:c.done.map(E=>({path:E.item.value.path,verdict:f(E.result.overallStatus),acs:S(E.result.testId),executionId:o,startedAt:new Date().toISOString(),durationMs:Math.round(E.result.durationS*1e3),mode:"testrun",local:!e.shouldPublish}))});for(let E of k.warnings)e.log?.("warn","TESTRUN_EXEC_SYNC_WARNING",E,{execution_id:o})}catch(f){e.log?.("warn","TESTRUN_EXEC_SYNC_FAILED","Testrun exec-sync failed",{execution_id:o,error:String(f)})}try{let f=(e.coverageWriter??pt)(a,Ve(t));f.status==="skipped"&&e.log?.("warn","TESTRUN_COVERAGE_SKIPPED",`Testrun coverage/usecases.yaml not written: ${f.reason}`,{execution_id:o,reason:f.reason})}catch(f){e.log?.("warn","TESTRUN_COVERAGE_WRITER_THREW","Testrun coverage writer threw",{execution_id:o,error:String(f)})}let d=await ut(a,new Date().toISOString()),w;try{let f=await dt(Ie(o,t),"L1");w=f.valid,f.valid||e.log?.("warn","EVIDENCE_INVALID","Sealed testrun pack failed L1 validation",{execution_id:o,first_code:String(f.diagnostics?.[0]?.code??""),surface:"testrun"})}catch(f){e.log?.("warn","TESTRUN_VALIDATION_ERROR","Testrun pack validation threw",{execution_id:o,error:String(f)})}let _="skipped";if(e.shouldPublish&&!c.cancelled&&e.publish){let f=n.checks[0],S=await e.publish({testId:f.testId,sessionId:o,executionId:o,sealedPackPath:Ie(o,t),projectId:n.projectId});_=S.ok?"ok":"failed",e.emit(gt(S,o))}else e.shouldPublish&&c.cancelled&&e.log?.("info","PUBLISH_SKIPPED","Testrun evidence publish skipped",{surface:"testrun",reason:"cancel"});let h=new Map(c.done.map(f=>[f.item.value.path,f.result]));for(let f of n.checks){let S=h.get(f.path);await Jt(Re(f.path),{execution_id:o,run_kind:S?.runKind??"author",status:S?bt(S)?S.overallStatus==="failed"?"failed":"broken":"passed":"skipped",valid:w,uploaded:_==="ok",at:new Date().toISOString()})}let v={tests:n.checks.length,passed:c.done.filter(f=>!bt(f.result)).length,failed:c.done.filter(f=>f.result.overallStatus==="failed").length,broken:c.done.filter(f=>["broken","interrupted"].includes(f.result.overallStatus)).length,skipped:c.skipped.length};e.log?.("info","TESTRUN_SUMMARY","Testrun summary",{execution_id:o,totals:{passed:v.passed,failed:v.failed,broken:v.broken,skipped:v.skipped},upload:_});let R=c.done.some(f=>bt(f.result)),I=c.cancelled?3:R?1:0;return e.log?.("info","TESTRUN_DONE","Testrun done",{execution_id:o,exit_code:I}),{exitCode:I,executionId:o,totals:v,upload:_}}import{readFileSync as Ol}from"fs";function Dl(n,e){return{testId:n,overallStatus:e.overallStatus,exitCode:e.exitCode,durationS:e.durationS??0,runKind:pi(!!e.anyAuthorStepRan),resultCode:e.resultCode??null,...e.pendingInvestigations?.length?{pendingInvestigations:e.pendingInvestigations}:{}}}function Ns(n){let e={...n.passThroughOpts,cdpEndpoint:n.cdpEndpoint};return{path:n.abs,cwd:n.cwd,opts:e,isAgent:!0,disableAskUser:!0,resolved:{...n.resolved,chrome:{...n.resolved.chrome,cdp_endpoint:n.cdpEndpoint}},resolvedAuth:n.resolvedAuth,cliOverrides:{},environment:n.environment,envConfig:n.envConfig,profile:n.profile,model:n.model,creds:n.creds,configStore:n.configStore,session:n.session,skipGlobalRemoteLogger:!0,evidenceAttach:n.attach,suppressEvidenceOffer:!0,onFatalExit:t=>{throw new Error(`project/folder gate failed: ${t.split(`
44
+ `)[0]}`)},signal:n.signal}}async function Fs(n,e,t,i,o=Fn){let r=xe(n.relPath),a=Date.now();try{let s=await Mo.attach({packDir:t.packDir,testId:r,definition:{path:"test.md",content:Ol(n.path,"utf8")},cwd:t.cwd}),l=Ns({abs:n.path,cwd:t.cwd,resolved:Dn(n.path),resolvedAuth:t.resolvedAuth,environment:t.environment,envConfig:t.envConfig,profile:t.profile,model:t.model,creds:t.creds,configStore:t.configStore,session:new Ct,passThroughOpts:t.passThroughOpts,cdpEndpoint:e.cdpEndpoint,attach:s,signal:t.signal}),{host:u,lifecycle:c}=i(n),m=()=>{try{c.cleanup("runner","testrun cancelled")}catch{}};t.signal?.addEventListener("abort",m);try{let p=await o(l,u,c);return Dl(r,p)}finally{t.signal?.removeEventListener("abort",m)}}catch(s){return process.stderr.write(`member ${n.relPath} broken: ${s.message}
45
+ `),{testId:r,overallStatus:"broken",exitCode:2,durationS:(Date.now()-a)/1e3,runKind:"replay"}}finally{e.release()}}async function Ls(n,e,t,i,o=Fn){let r=Date.now();try{let a=Ns({abs:n.path,cwd:t.cwd,resolved:Dn(n.path),resolvedAuth:t.resolvedAuth,environment:t.environment,envConfig:t.envConfig,profile:t.profile,model:t.model,creds:t.creds,configStore:t.configStore,session:new Ct,passThroughOpts:t.passThroughOpts,cdpEndpoint:e.cdpEndpoint,attach:void 0,signal:t.signal}),{host:s,lifecycle:l}=i(n),u=()=>{try{l.cleanup("runner","testrun cancelled")}catch{}};t.signal?.addEventListener("abort",u);try{let c=await o(a,s,l);return{relPath:n.relPath,testId:c.ownPack?.testId,testcaseId:c.ownPack?.testcaseId,commitId:c.ownPack?.commitId,executionId:c.ownPack?.executionId,overallStatus:c.overallStatus,exitCode:c.exitCode,durationS:c.durationS??0,published:c.ownPack?c.ownPack.published?"yes":"no":"unknown"}}finally{t.signal?.removeEventListener("abort",u)}}catch(a){return process.stderr.write(`author member ${n.relPath} broken: ${a.message}
46
+ `),{relPath:n.relPath,overallStatus:"broken",exitCode:2,durationS:(Date.now()-r)/1e3,published:"no"}}finally{e.release()}}var Ml=n=>n.overallStatus==="failed"||n.overallStatus==="broken"||n.overallStatus==="interrupted";async function Us(n,e){if(n.length===0)return{results:[],cancelled:!1,skipped:[]};let t=0,i=n.map(r=>({key:r.path,value:r})),o=await cn(i,r=>e.executeAuthorMember(r.value,t++),{parallel:e.parallel,failFast:!1,isFailure:Ml,signal:e.signal,onStart:r=>e.emit(Rs(r.value)),onEnd:(r,a)=>e.emit(As(a))});return{results:o.done.map(r=>r.result),cancelled:o.cancelled,skipped:o.skipped.map(r=>r.value)}}import{mkdtempSync as jl,rmSync as Nl}from"fs";import{tmpdir as Fl}from"os";import{join as Ll}from"path";function Vs(n){let e=Promise.resolve(),t=new Map,i=r=>{try{Nl(r,{recursive:!0,force:!0})}catch{}};function o(r){let a=e.then(async()=>{if(t.has(r))throw new Error(`chrome slot ${r} already acquired (one acquire per worker index)`);let s=jl(Ll(Fl(),"kane-testrun-chrome-")),l;try{l=await n.launch({userDataDir:s,width:n.width,height:n.height,headless:n.headless})}catch(u){throw i(s),u}return t.set(r,{chrome:l,dataDir:s}),{cdpEndpoint:l.cdpEndpoint,release(){let u=t.get(r);if(u){t.delete(r);try{u.chrome.kill()}catch{}i(u.dataDir)}}}});return e=a.catch(()=>{}),a}return{acquire:o,killAll(){for(let[,r]of t){try{r.chrome.kill()}catch{}i(r.dataDir)}t.clear()}}}function Bs(){let n=new Map;return{register(e,t){n.set(e,t)},deregister(e){n.delete(e)},cleanup(e,t){let i=n.get(e);if(i){n.delete(e);try{i()}catch{}}},remoteLogger:null}}import{EventEmitter as Ul}from"events";import{Writable as Vl}from"stream";function Bl(){return new Vl({write(n,e,t){t()}})}function Hl(){let n=new Ul;return Object.assign(n,{isTTY:!0,setEncoding(){},setRawMode(e){return n},ref(){return n},unref(){return n},read(){return null}}),n}function Hs(){let n=process.env.KANE_TESTRUN_MEMBER_DEBUG;return n==="1"||n==="true"}function Ws(){return{...Jo({isAgent:!0,log:()=>{},stdout:Hs()?process.stderr:Bl(),stdin:Hl()}),onAgentEvent:Hs()?e=>{process.stderr.write(`[member] ${JSON.stringify(e)}
47
47
  `)}:()=>{},onLockState:()=>{},onAdaptiveHeal:()=>{}}}import{randomUUID as Ec}from"crypto";import{appendFileSync as Tc}from"fs";import{join as Rc}from"path";import{execFileSync as Wl}from"child_process";function ir(n,e){return`project conflict: this profile is configured for project ${n}, but the selected members were authored in project ${e}.
48
48
  Dispatching would mint authored tests into ${n} while their evidence publishes to ${e}.
49
- Fix: \`kane-cli config project ${e}\`, or select only members belonging to ${n}.`}function ql(n,e){return n.filter(t=>e.checkIgnore(t))}function Kl(n,e){try{return Wl("git",["check-ignore","-q",n],{cwd:e,stdio:"ignore"}),!0}catch{return!1}}function qs(n,e={}){let t=e.env??process.env,i=e.collectBundleFn??Yo,o=e.checkIgnore??Kl,r=[];t.KANE_CLI_MODE==="hyperexecute"&&r.push({code:"on_grid",detail:"already running on a HyperExecute grid \u2014 --remote cannot re-dispatch"}),n.plan.valid||r.push({code:"invalid_plan",detail:"members do not share one org/project, or the plan is otherwise invalid"}),n.plan.checks.some(u=>u.memberClass==="author")&&n.projectId&&n.plan.projectId&&n.projectId!==n.plan.projectId&&r.push({code:"project_authority_conflict",detail:ir(n.projectId,n.plan.projectId)});let a=[];for(let u of n.plan.checks)if(u.memberClass==="replay")try{let c=i(u.path);for(let m of c.files)a.push(m.abs)}catch(c){r.push({code:"bundle_error",detail:`${u.relPath}: ${c instanceof Error?c.message:String(c)}`})}else a.push(u.path);let l=ql(a,{checkIgnore:u=>o(u,n.cwd)});return l.length&&r.push({code:"gitignored_inputs",detail:`${l.length} required input(s) are gitignored and won't reach the grid:
49
+ Fix: \`kane-cli config project ${e}\`, or select only members belonging to ${n}.`}function ql(n,e){return n.filter(t=>e.checkIgnore(t))}function Kl(n,e){try{return Wl("git",["check-ignore","-q",n],{cwd:e,stdio:"ignore"}),!0}catch{return!1}}function qs(n,e={}){let t=e.env??process.env,i=e.collectBundleFn??Yo,o=e.checkIgnore??Kl,r=[];t.KANE_CLI_MODE==="hyperexecute"&&r.push({code:"on_grid",detail:"already running on a HyperExecute grid \u2014 --remote cannot re-dispatch"}),n.plan.valid||r.push({code:"invalid_plan",detail:"members do not share one org/project, or the plan is otherwise invalid"}),n.plan.checks.some(u=>u.memberClass==="author")&&n.projectId&&n.plan.projectId&&n.projectId!==n.plan.projectId&&r.push({code:"project_authority_conflict",detail:ir(n.projectId,n.plan.projectId)});let s=[];for(let u of n.plan.checks)if(u.memberClass==="replay")try{let c=i(u.path);for(let m of c.files)s.push(m.abs)}catch(c){r.push({code:"bundle_error",detail:`${u.relPath}: ${c instanceof Error?c.message:String(c)}`})}else s.push(u.path);let l=ql(s,{checkIgnore:u=>o(u,n.cwd)});return l.length&&r.push({code:"gitignored_inputs",detail:`${l.length} required input(s) are gitignored and won't reach the grid:
50
50
  `+l.map(u=>` ${u}`).join(`
51
- `)+"\n Fix: un-ignore them (e.g. `!output-*/`) or commit them, then re-run."}),{ok:r.length===0,errors:r,requiredInputs:a}}import{mkdirSync as Yl,writeFileSync as Gl}from"fs";import{join as Ks,relative as Jl}from"path";function zl(n,e){let t=n;for(let[i,o]of Object.entries(e))t=t.split(`{{${i}}}`).join(o);return t}function Xl(n){let e=n.map(o=>({relPath:o.relPath,absPath:o.path,memberClass:o.memberClass,testId:o.testId,commitId:o.commitId}));return{discoveryCommand:`printf '%s\\n' ${e.map(o=>`'${o.relPath}'`).join(" ")}`,members:e}}function Ql(n,e){return[...n.map(i=>` - "${Jl(e,Re(i.absPath))}/**"`)," - .testmuai/evidence/**"," - artifacts/session/**"].join(`
52
- `)}function Zl(n){return n.projectId?` --project-id ${n.projectId}${n.folderId?` --folder-id ${n.folderId}`:""}`:""}async function ec(n){let e=new oi(se(n.env).secretsBaseUrl),t={username:n.auth.username,accessKey:n.auth.access_key,orgId:n.orgId};await e.pushSecret({secretKey:"LT_USERNAME",secretValue:n.auth.username,...t}),await e.pushSecret({secretKey:"LT_ACCESS_KEY",secretValue:n.auth.access_key,...t})}async function Ys(n,e={}){let t=e.base??J,i=Ks(_i("remote-execution",t),n.jobId);Yl(i,{recursive:!0});let{discoveryCommand:o,members:r}=Xl(n.plan.checks);await(e.pushSecrets??ec)(n);let s=zl(Si,{runson:e.runson??"mac",concurrency:String(n.parallel),env:n.env,kaneVersion:e.kaneVersion??"latest",discoveryCommand:o,uploadPaths:Ql(r,n.cwd),projectFolderFlags:Zl(n)}),a=Ks(i,".hyperexecute.yaml");return Gl(a,s),{job:n,jobDir:i,yamlPath:a,members:r}}import{spawn as tc,execFileSync as nc}from"child_process";import{join as rc}from"path";function oc(n){let e=n.match(/Job Link:\s*(https?:\/\/\S*?[?&]jobId=([0-9a-fA-F-]{36}))/);return e?{url:e[1],jobId:e[2]}:null}function ic(){try{return nc("hyperexecute",["--version"],{stdio:"ignore",timeout:2e3}),!0}catch{return!1}}function sc(n){return n.binaryPath?n.binaryPath:(n.onPath??ic)()?"hyperexecute":on()}function Gs(n,e){if(!n)return;let t="";n.on("data",i=>{t+=String(i);let o;for(;(o=t.indexOf(`
53
- `))>=0;)e(t.slice(0,o)),t=t.slice(o+1)}),n.on("end",()=>{t.length&&e(t)})}async function Js(n,e={}){let t=n.job,i=sc(e),o=rc(n.jobDir,"dl"),r=["--user",t.auth.username,"--key",t.auth.access_key,"--env",t.env,"--config",n.yamlPath,"--concurrency",String(t.parallel),"--download-artifacts","--download-artifacts-path",o],a=(e.spawnImpl??((d,w,_)=>tc(d,w,{cwd:_.cwd})))(i,r,{cwd:t.cwd}),l="",u="",c=d=>{if(e.onLine?.(d),!l){let w=oc(d);w&&(l=w.jobId,u=w.url)}};Gs(a.stdout,c),Gs(a.stderr,c);let m=!1,p=()=>{m=!0;try{a.kill("SIGTERM")}catch{}};e.signal&&(e.signal.aborted?p():e.signal.addEventListener("abort",p,{once:!0}));let g=await new Promise(d=>{a.on("close",w=>d(m?3:typeof w=="number"?w:1)),a.on("error",()=>d(1))});return e.signal?.removeEventListener?.("abort",p),{job:t,prepared:n,hxJobId:l,jobUrl:u,downloadDir:o,exitCode:g,cancelled:m}}import{existsSync as He,readdirSync as pn,statSync as Zs,mkdirSync as ac,cpSync as sr,readFileSync as ea,writeFileSync as cr,rmSync as ar,mkdtempSync as lc}from"fs";import{tmpdir as cc}from"os";import{join as z,basename as Ne,relative as dc}from"path";function uc(n,e){if(He(n)){for(let t of pn(n).sort())if(t.endsWith(e))return z(n,t)}}function ta(n){return He(n)?pn(n).map(e=>z(n,e)).filter(e=>Zs(e).isDirectory()):[]}function mc(n){let e=z(n,"kane-testrun");return ta(e)}function Pt(n){try{return JSON.parse(ea(n,"utf8"))}catch{return}}async function na(n){let e=n.prepared.members,t=n.job.cwd,i=mc(n.downloadDir),o=e.map(s=>{let a=dc(t,Re(s.absPath));for(let l of i){let u=z(l,a);if(He(u))return{member:s,tapeDir:u}}return{member:s}}),r=new Map;for(let s of i)for(let a of ta(z(s,"artifacts","session")))r.has(Ne(a))||r.set(Ne(a),a);return{result:n,perMember:o,sessionDirs:[...r.values()]}}function pc(n){let e=Pt(z(n,"execution.json")),t=Pt(z(n,"session.json")),i=Date.parse(String(e?.start_timestamp??"")),o=Date.parse(String(e?.end_timestamp??"")),r=Number.isFinite(i)&&Number.isFinite(o)&&o>=i?(o-i)/1e3:void 0;return{testId:e?.test_id,status:e?.status,packPath:uc(z(n,"evidence"),".evidence"),uploadStatus:t?.upload_status,...r!==void 0?{durationS:r}:{}}}function zs(n){return n?.uploadStatus==="uploaded"?"yes":n?.uploadStatus==="failed"?"no":"unknown"}function fc(n){if(n.member.memberClass==="replay"&&n.member.testId)return n.member.testId;if(n.tapeDir){let t=Pt(z(n.tapeDir,".internal","meta.json"))?.test_id;if(t)return t;let o=Pt(z(n.tapeDir,".internal","execution.json"))?.test_id;if(o)return o}return n.member.testId}function gc(n){if(!n.tapeDir)return;let t=Pt(z(n.tapeDir,".internal","meta.json"))?.commit_id;return typeof t=="string"&&t?t:void 0}function dr(n){try{let e=ct(n,{schema:qt});return e&&typeof e=="object"?e:void 0}catch{return}}function mn(n){try{return dr(ea(n,"utf8"))}catch{return}}function we(n){return n instanceof Error?n.message:String(n)}function hc(n,e=3){let t=n.slice(0,e).join("; ");return n.length>e?`${t} (+${n.length-e} more)`:t}function bc(n){let e=[],t=[],i=o=>{if(!He(o))return;let r;try{r=pn(o).sort()}catch(s){t.push(`readdir ${o}: ${we(s)}`);return}for(let s of r){let a=z(o,s);try{if(Zs(a).isDirectory()){i(a);continue}}catch(l){t.push(`stat ${a}: ${we(l)}`);continue}s==="result.yaml"&&e.push(a)}};return i(n),{files:e,errors:t}}function ur(n,e){let t=[],i=z(n,"run.yaml"),o=mn(i),r=o?.environment,s=typeof r?.run_kind=="string"?r.run_kind:void 0;if(o&&r&&s!==void 0){let p={...r};delete p.run_kind,p.run_kind_observed=s,o.environment=p;try{cr(i,Rn(o,{lineWidth:-1,schema:qt}))}catch(g){t.push(`write ${i}: ${we(g)}`)}}let a=new Map,l=new Map;for(let p of e)p.gridTestId&&a.set(p.gridTestId,p.memberClass),l.set(xe(p.relPath),p.memberClass);let u=new Set(e.map(p=>p.memberClass)),c=u.size===1?[...u][0]:void 0,m=bc(z(n,"tests"));t.push(...m.errors);for(let p of m.files){let g=mn(p);if(!g)continue;let d={...g.environment??{}},w=typeof d.run_kind=="string"?d.run_kind:s,_=g.external_id,h=typeof _?.test_id=="string"?_.test_id:void 0,v=typeof g.test=="string"?g.test:void 0,R=(h?a.get(h):void 0)??(v?l.get(v)??l.get(v.replace(/-\d+$/,"")):void 0)??c;if(R){d.run_kind=R,w&&w!==R&&(d.run_kind_observed=w),g.environment=d;try{cr(p,Rn(g,{lineWidth:-1,schema:qt}))}catch(I){t.push(`write ${p}: ${we(I)}`)}}}return{errors:t}}function vc(n,e){let t=new Map,i=new Map,o=new Map;for(let a of e)a.gridTestId&&i.set(a.gridTestId,a.relPath),o.set(xe(a.relPath),a.relPath);let r=z(n,"tests");if(!He(r))return t;let s;try{s=pn(r).sort()}catch{return t}for(let a of s){let l=mn(z(r,a,"result.yaml"));if(!l)continue;let u=l.external_id,c=typeof u?.test_id=="string"?u.test_id:void 0,m=typeof l.test=="string"?l.test:a,p=(c?i.get(c):void 0)??o.get(m)??o.get(m.replace(/-\d+$/,""));if(!p||t.has(p))continue;let g=Array.isArray(l.steps)?l.steps:[],d=l.duration_ms;t.set(p,{acs:zt(g),...typeof d=="number"?{durationMs:d}:{}})}return t}function wc(n){let e=mn(z(n,"run.yaml"));return typeof e?.started=="string"?e.started:void 0}function Xs(n){if(n.members.length===0)return;let e=[],t=Ve(n.cwd);if(!He(t))return n.emit(rt({status:"skipped",reason:"no_context_store",detail:t})),{status:"skipped",reason:"no_context_store",detail:t,synced:0,warnings:e};for(let o of n.members){if(!o.drift)continue;let r=`sync: ${o.relPath} ran a healed definition on the grid (tape commit ${o.drift.tape} \u2260 local ${o.drift.local}) \u2014 the verdict is attached to the local, pre-heal definition`;e.push(r),n.emit(rt({status:"warning",reason:"heal_drift",detail:r}))}let i=n.members.map(o=>{let r=n.packFacts.get(o.relPath);return{path:o.absPath,verdict:o.verdict,...r?.acs.length?{acs:r.acs}:{},executionId:o.executionId,...r?.durationMs!==void 0?{durationMs:r.durationMs}:{},startedAt:n.startedAt,mode:"testrun",local:n.local,...o.drift?{driftFlag:!0}:{}}});try{let o=n.syncFn({cwd:n.cwd,members:i});e.push(...o.warnings);for(let r of o.warnings)n.emit(rt({status:"warning",reason:"sync_warning",detail:r}));return o.skipped?(n.emit(rt({status:"skipped",reason:o.skipped})),{status:"skipped",reason:o.skipped,synced:0,warnings:e}):{status:"synced",synced:o.synced,warnings:e}}catch(o){let r=we(o);return n.emit(rt({status:"failed",reason:"sync_error",detail:r})),{status:"failed",reason:"sync_error",detail:r,synced:0,warnings:e}}}function Qs(n,e){try{return e()}catch(t){let i=we(t);try{n(rt({status:"failed",reason:"sync_error",detail:i}))}catch{}return{status:"failed",reason:"sync_error",detail:i,synced:0,warnings:[]}}}function yc(n,e,t,i){try{let o=i(n,Ve(e));o.status==="skipped"&&t(or({status:"skipped",reason:o.reason}))}catch(o){let r=we(o);try{t(or({status:"failed",reason:"coverage_error",detail:r}))}catch{}}}async function mr(n){let e,t=-1/0;for(let i of n){let o;try{let a=await Dn(i.path,"run.yaml");a&&(o=dr(a))}catch{}let r=typeof o?.ended=="string"?o.ended:typeof o?.started=="string"?o.started:void 0;if(!r)continue;let s=Date.parse(r);!Number.isNaN(s)&&s>t&&(t=s,e=r)}return e}function kc(n){let e=/collides between packs "([^"]+)" and "([^"]+)"/.exec(n);if(e)return[e[2],e[1]];let t=/^pack "([^"]+)"/.exec(n);return t?[t[1]]:[]}async function xc(n,e){let t=kc(n);if(t.length)for(let i of t){let o=e.find(r=>Ne(r.path,".evidence")===i);if(o)return o;for(let r of e)try{let s=await Dn(r.path,"run.yaml");if(s&&dr(s)?.run_id===i)return r}catch{}}}async function lr(n,e){let t=[];for(let i of n){let o=Ne(i.path,".evidence");try{await Co(i.path,o,e),t.push(o)}catch{}}return t}async function _c(n,e,t){let i=t.emit??(()=>{}),o=t.mergeFn??Gt,r,s;try{r=lc(z(cc(),"kane-remote-merge-rules-")),s=z(r,"merge-rules.yaml"),cr(s,Qt())}catch(u){r&&ar(r,{recursive:!0,force:!0});let c=we(u),m=await lr(n,e);return i(ze({reason:"merge_rules_standalone",detail:c,standaloneIds:m})),{kind:"standalone",degraded:{reason:"merge_rules_standalone",detail:c,standaloneIds:m}}}let a=async u=>{let c=mt(),m=Ie(c,e);try{return await o(u.map(p=>p.path),{runId:c,out:m,rulesPath:s,finalize:!1}),{ok:!0,execId:c,out:m}}catch(p){return ar(m,{recursive:!0,force:!0}),{ok:!1,error:p}}},l=u=>u?.code==="ABORT";try{let u=await a(n);if(u.ok)return{kind:"merged",execId:u.execId,out:u.out,used:n};let c=l(u.error)?await xc(we(u.error),n):void 0;if(c&&n.length>1){let d=Ne(c.path,".evidence"),w=we(u.error);i(ze({reason:"merge_abort_excluded_pack",detail:w,excludedPack:d}));let _=n.filter(I=>I!==c),h=await a(_);if(h.ok)return{kind:"merged",execId:h.execId,out:h.out,used:_,degraded:{reason:"merge_abort_excluded_pack",detail:w}};let v=await lr(n,e),R=we(h.error);return i(ze({reason:"merge_abort_standalone",detail:R,standaloneIds:v})),{kind:"standalone",degraded:{reason:"merge_abort_standalone",detail:R,standaloneIds:v}}}let m=await lr(n,e),p=l(u.error)?"merge_abort_standalone":"merge_error_standalone",g=we(u.error);return i(ze({reason:p,detail:g,standaloneIds:m})),{kind:"standalone",degraded:{reason:p,detail:g,standaloneIds:m}}}finally{r&&ar(r,{recursive:!0,force:!0})}}async function ra(n,e={}){let t=n.result,i=t.job.cwd,o=e.sessionsRoot??z(J,"sessions","remote"),r=z(o,t.hxJobId||"unknown-job");ac(r,{recursive:!0});let s=new Map;for(let x of n.sessionDirs){He(x)&&sr(x,z(r,Ne(x)),{recursive:!0});let D=pc(x);D.testId&&!s.has(D.testId)&&s.set(D.testId,D)}let a=[],l=[],u=[],c=[],m=0,p=0,g=0,d=0,w,_;for(let x of n.perMember){let D=gc(x),U=x.member.commitId;x.tapeDir&&He(x.tapeDir)&&sr(x.tapeDir,Re(x.member.absPath),{recursive:!0});let oe=fc(x),A=oe?s.get(oe):void 0;A&&d++;let B=A?.status==="success"||A?.status==="passed";A?B?m++:p++:g++;let te=A?.packPath,Le=x.member.memberClass;if(te){let Oe={path:te,memberClass:Le,gridTestId:oe,relPath:x.member.relPath};(Le==="author"?u:l).push(Oe),Le==="replay"?w??=oe:_??=oe}if(c.push({absPath:x.member.absPath,relPath:x.member.relPath,verdict:B?"passed":"failed",...te?{packId:Ne(te,".evidence")}:{},...oe?{gridTestId:oe}:{},...U&&D&&U!==D?{drift:{tape:D,local:U}}:{}}),Le==="author"){let Oe=A?B?"passed":"failed":"broken",We=A?B?0:1:2,ot=A?.durationS??0;te?a.push({relPath:x.member.relPath,testId:oe??x.member.testId,commitId:x.member.commitId,sourceExecutionId:Ne(te,".evidence"),overallStatus:Oe,exitCode:We,durationS:ot,published:zs(A)}):a.push({relPath:x.member.relPath,overallStatus:Oe,exitCode:We,durationS:ot,published:zs(A)})}}let h=[...l,...u],v=null,R="skipped",I,f,S=e.emit??(()=>{}),k=e.syncFn??Xt,E=!e.publishFn;if(h.length){let x=await _c(h,i,e);if(I=x.degraded,x.kind==="merged"){try{let A=ur(x.out,x.used);if(A.errors.length){let B=hc(A.errors);S(ze({reason:"stamp_incomplete",detail:B})),I=I??{reason:"stamp_incomplete",detail:B}}}catch(A){let B=we(A);S(ze({reason:"stamp_failed",detail:B})),I=I??{reason:"stamp_failed",detail:B}}let D=new Set(x.used.map(A=>Ne(A.path,".evidence")));f=Qs(S,()=>Xs({cwd:i,members:c.filter(A=>A.packId&&D.has(A.packId)).map(A=>({...A,executionId:x.execId})),packFacts:vc(x.out,x.used),startedAt:wc(x.out)??new Date().toISOString(),local:E,emit:S,syncFn:k})),yc(x.out,i,S,e.coverageWriter??pt);let U=!0;try{let A=await mr(x.used)??new Date().toISOString();await(e.sealFn??ut)(x.out,A)}catch(A){let B=we(A);S(ze({reason:"seal_failed",detail:B})),I={reason:"seal_failed",detail:B},U=!1}v={id:x.execId,status:p>0?"failed":"passed",evidenceId:x.execId};let oe=new Set(x.used.map(A=>Ne(A.path,".evidence")));for(let A of a)A.sourceExecutionId&&oe.has(A.sourceExecutionId)&&(A.executionId=x.execId);try{He(x.out)&&sr(x.out,z(r,`execution-${x.execId}.evidence`),{recursive:!0})}catch{}if(e.publishFn&&U&&!t.cancelled){try{let te=await(e.validateFn??dt)(x.out,"L1");te.valid||e.log?.("warn","EVIDENCE_INVALID","Sealed remote testrun pack failed L1 validation",{execution_id:x.execId,first_code:String(te.diagnostics?.[0]?.code??""),surface:"testrun_remote"})}catch(te){e.log?.("warn","TESTRUN_VALIDATION_ERROR","Remote testrun pack validation threw",{execution_id:x.execId,error:String(te)})}let A=w??_,B=t.job.plan.projectId??t.job.projectId;if(A&&B){let te=await e.publishFn({testId:A,sessionId:x.execId,executionId:x.execId,sealedPackPath:x.out,projectId:B});R=te.ok?"ok":"failed",S(gt(te,x.execId))}}}else{let D=new Set(x.degraded.standaloneIds??[]);for(let U of a)U.sourceExecutionId&&D.has(U.sourceExecutionId)&&(U.executionId=U.sourceExecutionId);f=Qs(S,()=>Xs({cwd:i,members:c.filter(U=>U.packId&&D.has(U.packId)).map(U=>({...U,executionId:U.packId})),packFacts:new Map,startedAt:new Date().toISOString(),local:E,emit:S,syncFn:k}))}}let L={tests:n.perMember.length,passed:m,failed:p,broken:g,skipped:0,authored:a.length};return{execution:v,authored:a,totals:L,upload:R,hxJobId:t.hxJobId,jobUrl:t.jobUrl,sessionsPath:r,cancelled:t.cancelled,...n.perMember.length>0&&d===0?{artifactless:!0}:{},...I?{degraded:I}:{},...f?{execSync:f}:{}}}var oa={id:"hyper",preflight:qs,prepare:Ys,dispatch:Js,collect:na,reconcile:ra};var Sc={hyper:oa};function ia(n){return Sc[n]}import{existsSync as la,readFileSync as ca}from"fs";import{join as Ic}from"path";var Cc=["name","version","backendId","kaneCompat"];function sa(n){if(typeof n!="object"||n===null)throw new Error("manifest must be an object");let e=n;for(let i of Cc)if(typeof e[i]!="string"||e[i].length===0)throw new Error(`manifest missing required string field '${i}'`);let t={name:e.name,version:e.version,backendId:e.backendId,kaneCompat:e.kaneCompat};return e.defaults&&typeof e.defaults=="object"&&(t.defaults=e.defaults),t}function aa(n,e){let t=r=>{let s=r.replace(/^[v=]+/,"").split(".").map(a=>parseInt(a,10));return[s[0]||0,s[1]||0,s[2]||0]},i=(r,s)=>r[0]-s[0]||r[1]-s[1]||r[2]-s[2],o=t(n);return e.startsWith(">=")?i(o,t(e.slice(2)))>=0:i(o,t(e))===0}function vt(n,e=J){let t=xi(n,e);if(!la(t))return{ok:!1,reason:"not_installed"};let i=ca(t,"utf8").trim();if(!i)return{ok:!1,reason:"corrupt",detail:"empty current pointer"};let o=ki(n,i,e),r=Ic(o,"plugin.json");if(!la(r))return{ok:!1,reason:"corrupt",detail:`current points at ${i} but ${r} is missing`};let s;try{s=sa(JSON.parse(ca(r,"utf8")))}catch(a){return{ok:!1,reason:"corrupt",detail:a.message}}return aa(Me,s.kaneCompat)?{ok:!0,plugin:{name:n,version:i,dir:o,manifest:s}}:{ok:!1,reason:"incompatible",detail:`plugin needs kane-cli ${s.kaneCompat}, have ${Me}`}}async function da(n,e={}){let t=e.creds??new de,i=n.envFlag??t.getDefaultEnv()??"prod",o=vt("remote-execution",n.base);if(!o.ok)return{ok:!1,code:o.reason==="incompatible"?"plugin_incompatible":"plugin_missing",detail:o.reason==="incompatible"?`remote-execution plugin is incompatible${o.detail?`: ${o.detail}`:""}`:"remote-execution plugin is not installed \u2014 run `kane-cli plugin install remote-execution`"};let r=await je({creds:t,env:i,usernameFlag:n.usernameFlag,accessKeyFlag:n.accessKeyFlag,log:n.log});if(!r.basicAuth)return{ok:!1,code:"no_basic_auth",detail:"HyperExecute needs a LambdaTest username + access key \u2014 log in with basic auth or pass --user/--key"};let s=r.resolvedCreds?.org_id!=null?String(r.resolvedCreds.org_id):"",a=t.getActiveProfile()??"default",l=(n.memberClasses??[]).includes("author"),u=oo(t,a,i);if(l&&u.projectId&&n.planProjectId&&u.projectId!==n.planProjectId)return{ok:!1,code:"project_authority_conflict",detail:ir(u.projectId,n.planProjectId)};let c=u.projectId??void 0,m=u.folderId??void 0,p;if(l&&!n.dryRun){let g,d=await Yt({creds:t,config:e.config??new Ce,profile:a,env:i,tmsCreds:r.basicAuth,isLocal:!!n.local,log:n.log,onFatalExit:w=>{g=w}});if(d.status==="ok")c=d.projectId,m=d.folderId,p=d.autoDefaulted;else if(d.status!=="skip")return{ok:!1,code:"project_folder",detail:g?.trim()||"could not resolve a TMS project/folder for the grid login"}}return{ok:!0,ctx:{env:i,auth:r.basicAuth,orgId:s,plugin:o.plugin,projectId:c,folderId:m,resolvedCreds:r.resolvedCreds??null,...p?{autoDefaulted:p}:{}}}}var ua="\x1B[2m",ma="\x1B[0m";function Ac(n){return n.local?{shouldPublish:!1,reason:"local"}:n.hasAuth?n.projectId==null?{shouldPublish:!1,reason:"no_project"}:n.evidencePublish===!1?{shouldPublish:!1,reason:"flag"}:{shouldPublish:!0}:{shouldPublish:!1,reason:"no_auth"}}function Pc(n,e){if(n.cancelled)return{status:"cancelled",exit:3};if(n.artifactless)return e!==0?{status:"failed",exit:e}:{status:"broken",exit:1};let t=o=>Number(n.totals?.[o]??0);return t("failed")>0||t("broken")>0?{status:"failed",exit:1}:{status:n.execution?.status??(n.authored.length?"authored":"passed"),exit:0}}async function pa(n,e,t,i){let o=x=>{for(let D of x)i.emit(un(D));if(!i.isAgent)for(let D of x)process.stderr.write(`error: [${D.code}] ${D.detail}
54
- `);i.emit(ht("","failed")),i.emit(At({status:"failed",exit:2,jobId:"",sessionsPath:""})),process.exitCode=2},r=typeof e.remote=="string"&&e.remote?e.remote:"hyper",a=(i.findBackendFn??ia)(r);if(!a){o([{code:"unknown_backend",detail:`unknown remote backend '${r}'`}]);return}let l=i.log??(()=>{}),c=await(i.resolveContext??da)({envFlag:e.env,usernameFlag:e.username,accessKeyFlag:e.accessKey,memberClasses:n.checks.map(x=>x.memberClass),planProjectId:n.projectId,dryRun:!!e.dryRun,local:!!e.local,log:l},{});if(!c.ok){o([{code:c.code,detail:c.detail}]);return}i.isAgent&&c.ctx.autoDefaulted&&i.emit(so(c.ctx.autoDefaulted));let m={command:"testrun",plan:n,cwd:t,jobId:Ec(),parallel:Number(e.parallel??1),env:c.ctx.env,auth:c.ctx.auth,orgId:c.ctx.orgId,plugin:c.ctx.plugin,projectId:c.ctx.projectId,folderId:c.ctx.folderId},p=a.preflight(m);if(!p.ok){o(p.errors);return}if(e.dryRun){i.isAgent||process.stderr.write(`\u2713 remote preflight passed \u2014 ${m.plan.checks.length} member(s), backend '${r}', env '${m.env}'
51
+ `)+"\n Fix: un-ignore them (e.g. `!output-*/`) or commit them, then re-run."}),{ok:r.length===0,errors:r,requiredInputs:s}}import{mkdirSync as Yl,writeFileSync as Gl}from"fs";import{join as Ks,relative as Jl}from"path";function zl(n,e){let t=n;for(let[i,o]of Object.entries(e))t=t.split(`{{${i}}}`).join(o);return t}function Xl(n){let e=n.map(o=>({relPath:o.relPath,absPath:o.path,memberClass:o.memberClass,testId:o.testId,commitId:o.commitId}));return{discoveryCommand:`printf '%s\\n' ${e.map(o=>`'${o.relPath}'`).join(" ")}`,members:e}}function Ql(n,e){return[...n.map(i=>` - "${Jl(e,Re(i.absPath))}/**"`)," - .testmuai/evidence/**"," - artifacts/session/**"].join(`
52
+ `)}function Zl(n){return n.projectId?` --project-id ${n.projectId}${n.folderId?` --folder-id ${n.folderId}`:""}`:""}async function ec(n){let e=new oi(se(n.env).secretsBaseUrl),t={username:n.auth.username,accessKey:n.auth.access_key,orgId:n.orgId};await e.pushSecret({secretKey:"LT_USERNAME",secretValue:n.auth.username,...t}),await e.pushSecret({secretKey:"LT_ACCESS_KEY",secretValue:n.auth.access_key,...t})}async function Ys(n,e={}){let t=e.base??J,i=Ks(_i("remote-execution",t),n.jobId);Yl(i,{recursive:!0});let{discoveryCommand:o,members:r}=Xl(n.plan.checks);await(e.pushSecrets??ec)(n);let a=zl(Si,{runson:e.runson??"mac",concurrency:String(n.parallel),env:n.env,kaneVersion:e.kaneVersion??"latest",discoveryCommand:o,uploadPaths:Ql(r,n.cwd),projectFolderFlags:Zl(n)}),s=Ks(i,".hyperexecute.yaml");return Gl(s,a),{job:n,jobDir:i,yamlPath:s,members:r}}import{spawn as tc,execFileSync as nc}from"child_process";import{join as rc}from"path";function oc(n){let e=n.match(/Job Link:\s*(https?:\/\/\S*?[?&]jobId=([0-9a-fA-F-]{36}))/);return e?{url:e[1],jobId:e[2]}:null}function ic(){try{return nc("hyperexecute",["--version"],{stdio:"ignore",timeout:2e3}),!0}catch{return!1}}function sc(n){return n.binaryPath?n.binaryPath:(n.onPath??ic)()?"hyperexecute":on()}function Gs(n,e){if(!n)return;let t="";n.on("data",i=>{t+=String(i);let o;for(;(o=t.indexOf(`
53
+ `))>=0;)e(t.slice(0,o)),t=t.slice(o+1)}),n.on("end",()=>{t.length&&e(t)})}async function Js(n,e={}){let t=n.job,i=sc(e),o=rc(n.jobDir,"dl"),r=["--user",t.auth.username,"--key",t.auth.access_key,"--env",t.env,"--config",n.yamlPath,"--concurrency",String(t.parallel),"--download-artifacts","--download-artifacts-path",o],s=(e.spawnImpl??((d,w,_)=>tc(d,w,{cwd:_.cwd})))(i,r,{cwd:t.cwd}),l="",u="",c=d=>{if(e.onLine?.(d),!l){let w=oc(d);w&&(l=w.jobId,u=w.url)}};Gs(s.stdout,c),Gs(s.stderr,c);let m=!1,p=()=>{m=!0;try{s.kill("SIGTERM")}catch{}};e.signal&&(e.signal.aborted?p():e.signal.addEventListener("abort",p,{once:!0}));let g=await new Promise(d=>{s.on("close",w=>d(m?3:typeof w=="number"?w:1)),s.on("error",()=>d(1))});return e.signal?.removeEventListener?.("abort",p),{job:t,prepared:n,hxJobId:l,jobUrl:u,downloadDir:o,exitCode:g,cancelled:m}}import{existsSync as He,readdirSync as pn,statSync as Zs,mkdirSync as ac,cpSync as sr,readFileSync as ea,writeFileSync as cr,rmSync as ar,mkdtempSync as lc}from"fs";import{tmpdir as cc}from"os";import{join as z,basename as Ne,relative as dc}from"path";function uc(n,e){if(He(n)){for(let t of pn(n).sort())if(t.endsWith(e))return z(n,t)}}function ta(n){return He(n)?pn(n).map(e=>z(n,e)).filter(e=>Zs(e).isDirectory()):[]}function mc(n){let e=z(n,"kane-testrun");return ta(e)}function Pt(n){try{return JSON.parse(ea(n,"utf8"))}catch{return}}async function na(n){let e=n.prepared.members,t=n.job.cwd,i=mc(n.downloadDir),o=e.map(a=>{let s=dc(t,Re(a.absPath));for(let l of i){let u=z(l,s);if(He(u))return{member:a,tapeDir:u}}return{member:a}}),r=new Map;for(let a of i)for(let s of ta(z(a,"artifacts","session")))r.has(Ne(s))||r.set(Ne(s),s);return{result:n,perMember:o,sessionDirs:[...r.values()]}}function pc(n){let e=Pt(z(n,"execution.json")),t=Pt(z(n,"session.json")),i=Date.parse(String(e?.start_timestamp??"")),o=Date.parse(String(e?.end_timestamp??"")),r=Number.isFinite(i)&&Number.isFinite(o)&&o>=i?(o-i)/1e3:void 0;return{testId:e?.test_id,status:e?.status,packPath:uc(z(n,"evidence"),".evidence"),uploadStatus:t?.upload_status,...r!==void 0?{durationS:r}:{}}}function zs(n){return n?.uploadStatus==="uploaded"?"yes":n?.uploadStatus==="failed"?"no":"unknown"}function fc(n){if(n.member.memberClass==="replay"&&n.member.testId)return n.member.testId;if(n.tapeDir){let t=Pt(z(n.tapeDir,".internal","meta.json"))?.test_id;if(t)return t;let o=Pt(z(n.tapeDir,".internal","execution.json"))?.test_id;if(o)return o}return n.member.testId}function gc(n){if(!n.tapeDir)return;let t=Pt(z(n.tapeDir,".internal","meta.json"))?.commit_id;return typeof t=="string"&&t?t:void 0}function dr(n){try{let e=ct(n,{schema:qt});return e&&typeof e=="object"?e:void 0}catch{return}}function mn(n){try{return dr(ea(n,"utf8"))}catch{return}}function we(n){return n instanceof Error?n.message:String(n)}function hc(n,e=3){let t=n.slice(0,e).join("; ");return n.length>e?`${t} (+${n.length-e} more)`:t}function bc(n){let e=[],t=[],i=o=>{if(!He(o))return;let r;try{r=pn(o).sort()}catch(a){t.push(`readdir ${o}: ${we(a)}`);return}for(let a of r){let s=z(o,a);try{if(Zs(s).isDirectory()){i(s);continue}}catch(l){t.push(`stat ${s}: ${we(l)}`);continue}a==="result.yaml"&&e.push(s)}};return i(n),{files:e,errors:t}}function ur(n,e){let t=[],i=z(n,"run.yaml"),o=mn(i),r=o?.environment,a=typeof r?.run_kind=="string"?r.run_kind:void 0;if(o&&r&&a!==void 0){let p={...r};delete p.run_kind,p.run_kind_observed=a,o.environment=p;try{cr(i,Rn(o,{lineWidth:-1,schema:qt}))}catch(g){t.push(`write ${i}: ${we(g)}`)}}let s=new Map,l=new Map;for(let p of e)p.gridTestId&&s.set(p.gridTestId,p.memberClass),l.set(xe(p.relPath),p.memberClass);let u=new Set(e.map(p=>p.memberClass)),c=u.size===1?[...u][0]:void 0,m=bc(z(n,"tests"));t.push(...m.errors);for(let p of m.files){let g=mn(p);if(!g)continue;let d={...g.environment??{}},w=typeof d.run_kind=="string"?d.run_kind:a,_=g.external_id,h=typeof _?.test_id=="string"?_.test_id:void 0,v=typeof g.test=="string"?g.test:void 0,R=(h?s.get(h):void 0)??(v?l.get(v)??l.get(v.replace(/-\d+$/,"")):void 0)??c;if(R){d.run_kind=R,w&&w!==R&&(d.run_kind_observed=w),g.environment=d;try{cr(p,Rn(g,{lineWidth:-1,schema:qt}))}catch(I){t.push(`write ${p}: ${we(I)}`)}}}return{errors:t}}function vc(n,e){let t=new Map,i=new Map,o=new Map;for(let s of e)s.gridTestId&&i.set(s.gridTestId,s.relPath),o.set(xe(s.relPath),s.relPath);let r=z(n,"tests");if(!He(r))return t;let a;try{a=pn(r).sort()}catch{return t}for(let s of a){let l=mn(z(r,s,"result.yaml"));if(!l)continue;let u=l.external_id,c=typeof u?.test_id=="string"?u.test_id:void 0,m=typeof l.test=="string"?l.test:s,p=(c?i.get(c):void 0)??o.get(m)??o.get(m.replace(/-\d+$/,""));if(!p||t.has(p))continue;let g=Array.isArray(l.steps)?l.steps:[],d=l.duration_ms;t.set(p,{acs:zt(g),...typeof d=="number"?{durationMs:d}:{}})}return t}function wc(n){let e=mn(z(n,"run.yaml"));return typeof e?.started=="string"?e.started:void 0}function Xs(n){if(n.members.length===0)return;let e=[],t=Ve(n.cwd);if(!He(t))return n.emit(rt({status:"skipped",reason:"no_context_store",detail:t})),{status:"skipped",reason:"no_context_store",detail:t,synced:0,warnings:e};for(let o of n.members){if(!o.drift)continue;let r=`sync: ${o.relPath} ran a healed definition on the grid (tape commit ${o.drift.tape} \u2260 local ${o.drift.local}) \u2014 the verdict is attached to the local, pre-heal definition`;e.push(r),n.emit(rt({status:"warning",reason:"heal_drift",detail:r}))}let i=n.members.map(o=>{let r=n.packFacts.get(o.relPath);return{path:o.absPath,verdict:o.verdict,...r?.acs.length?{acs:r.acs}:{},executionId:o.executionId,...r?.durationMs!==void 0?{durationMs:r.durationMs}:{},startedAt:n.startedAt,mode:"testrun",local:n.local,...o.drift?{driftFlag:!0}:{}}});try{let o=n.syncFn({cwd:n.cwd,members:i});e.push(...o.warnings);for(let r of o.warnings)n.emit(rt({status:"warning",reason:"sync_warning",detail:r}));return o.skipped?(n.emit(rt({status:"skipped",reason:o.skipped})),{status:"skipped",reason:o.skipped,synced:0,warnings:e}):{status:"synced",synced:o.synced,warnings:e}}catch(o){let r=we(o);return n.emit(rt({status:"failed",reason:"sync_error",detail:r})),{status:"failed",reason:"sync_error",detail:r,synced:0,warnings:e}}}function Qs(n,e){try{return e()}catch(t){let i=we(t);try{n(rt({status:"failed",reason:"sync_error",detail:i}))}catch{}return{status:"failed",reason:"sync_error",detail:i,synced:0,warnings:[]}}}function yc(n,e,t,i){try{let o=i(n,Ve(e));o.status==="skipped"&&t(or({status:"skipped",reason:o.reason}))}catch(o){let r=we(o);try{t(or({status:"failed",reason:"coverage_error",detail:r}))}catch{}}}async function mr(n){let e,t=-1/0;for(let i of n){let o;try{let s=await On(i.path,"run.yaml");s&&(o=dr(s))}catch{}let r=typeof o?.ended=="string"?o.ended:typeof o?.started=="string"?o.started:void 0;if(!r)continue;let a=Date.parse(r);!Number.isNaN(a)&&a>t&&(t=a,e=r)}return e}function kc(n){let e=/collides between packs "([^"]+)" and "([^"]+)"/.exec(n);if(e)return[e[2],e[1]];let t=/^pack "([^"]+)"/.exec(n);return t?[t[1]]:[]}async function xc(n,e){let t=kc(n);if(t.length)for(let i of t){let o=e.find(r=>Ne(r.path,".evidence")===i);if(o)return o;for(let r of e)try{let a=await On(r.path,"run.yaml");if(a&&dr(a)?.run_id===i)return r}catch{}}}async function lr(n,e){let t=[];for(let i of n){let o=Ne(i.path,".evidence");try{await Co(i.path,o,e),t.push(o)}catch{}}return t}async function _c(n,e,t){let i=t.emit??(()=>{}),o=t.mergeFn??Gt,r,a;try{r=lc(z(cc(),"kane-remote-merge-rules-")),a=z(r,"merge-rules.yaml"),cr(a,Qt())}catch(u){r&&ar(r,{recursive:!0,force:!0});let c=we(u),m=await lr(n,e);return i(ze({reason:"merge_rules_standalone",detail:c,standaloneIds:m})),{kind:"standalone",degraded:{reason:"merge_rules_standalone",detail:c,standaloneIds:m}}}let s=async u=>{let c=mt(),m=Ie(c,e);try{return await o(u.map(p=>p.path),{runId:c,out:m,rulesPath:a,finalize:!1}),{ok:!0,execId:c,out:m}}catch(p){return ar(m,{recursive:!0,force:!0}),{ok:!1,error:p}}},l=u=>u?.code==="ABORT";try{let u=await s(n);if(u.ok)return{kind:"merged",execId:u.execId,out:u.out,used:n};let c=l(u.error)?await xc(we(u.error),n):void 0;if(c&&n.length>1){let d=Ne(c.path,".evidence"),w=we(u.error);i(ze({reason:"merge_abort_excluded_pack",detail:w,excludedPack:d}));let _=n.filter(I=>I!==c),h=await s(_);if(h.ok)return{kind:"merged",execId:h.execId,out:h.out,used:_,degraded:{reason:"merge_abort_excluded_pack",detail:w}};let v=await lr(n,e),R=we(h.error);return i(ze({reason:"merge_abort_standalone",detail:R,standaloneIds:v})),{kind:"standalone",degraded:{reason:"merge_abort_standalone",detail:R,standaloneIds:v}}}let m=await lr(n,e),p=l(u.error)?"merge_abort_standalone":"merge_error_standalone",g=we(u.error);return i(ze({reason:p,detail:g,standaloneIds:m})),{kind:"standalone",degraded:{reason:p,detail:g,standaloneIds:m}}}finally{r&&ar(r,{recursive:!0,force:!0})}}async function ra(n,e={}){let t=n.result,i=t.job.cwd,o=e.sessionsRoot??z(J,"sessions","remote"),r=z(o,t.hxJobId||"unknown-job");ac(r,{recursive:!0});let a=new Map;for(let x of n.sessionDirs){He(x)&&sr(x,z(r,Ne(x)),{recursive:!0});let O=pc(x);O.testId&&!a.has(O.testId)&&a.set(O.testId,O)}let s=[],l=[],u=[],c=[],m=0,p=0,g=0,d=0,w,_;for(let x of n.perMember){let O=gc(x),U=x.member.commitId;x.tapeDir&&He(x.tapeDir)&&sr(x.tapeDir,Re(x.member.absPath),{recursive:!0});let oe=fc(x),A=oe?a.get(oe):void 0;A&&d++;let B=A?.status==="success"||A?.status==="passed";A?B?m++:p++:g++;let te=A?.packPath,Le=x.member.memberClass;if(te){let $e={path:te,memberClass:Le,gridTestId:oe,relPath:x.member.relPath};(Le==="author"?u:l).push($e),Le==="replay"?w??=oe:_??=oe}if(c.push({absPath:x.member.absPath,relPath:x.member.relPath,verdict:B?"passed":"failed",...te?{packId:Ne(te,".evidence")}:{},...oe?{gridTestId:oe}:{},...U&&O&&U!==O?{drift:{tape:O,local:U}}:{}}),Le==="author"){let $e=A?B?"passed":"failed":"broken",We=A?B?0:1:2,ot=A?.durationS??0;te?s.push({relPath:x.member.relPath,testId:oe??x.member.testId,commitId:x.member.commitId,sourceExecutionId:Ne(te,".evidence"),overallStatus:$e,exitCode:We,durationS:ot,published:zs(A)}):s.push({relPath:x.member.relPath,overallStatus:$e,exitCode:We,durationS:ot,published:zs(A)})}}let h=[...l,...u],v=null,R="skipped",I,f,S=e.emit??(()=>{}),k=e.syncFn??Xt,E=!e.publishFn;if(h.length){let x=await _c(h,i,e);if(I=x.degraded,x.kind==="merged"){try{let A=ur(x.out,x.used);if(A.errors.length){let B=hc(A.errors);S(ze({reason:"stamp_incomplete",detail:B})),I=I??{reason:"stamp_incomplete",detail:B}}}catch(A){let B=we(A);S(ze({reason:"stamp_failed",detail:B})),I=I??{reason:"stamp_failed",detail:B}}let O=new Set(x.used.map(A=>Ne(A.path,".evidence")));f=Qs(S,()=>Xs({cwd:i,members:c.filter(A=>A.packId&&O.has(A.packId)).map(A=>({...A,executionId:x.execId})),packFacts:vc(x.out,x.used),startedAt:wc(x.out)??new Date().toISOString(),local:E,emit:S,syncFn:k})),yc(x.out,i,S,e.coverageWriter??pt);let U=!0;try{let A=await mr(x.used)??new Date().toISOString();await(e.sealFn??ut)(x.out,A)}catch(A){let B=we(A);S(ze({reason:"seal_failed",detail:B})),I={reason:"seal_failed",detail:B},U=!1}v={id:x.execId,status:p>0?"failed":"passed",evidenceId:x.execId};let oe=new Set(x.used.map(A=>Ne(A.path,".evidence")));for(let A of s)A.sourceExecutionId&&oe.has(A.sourceExecutionId)&&(A.executionId=x.execId);try{He(x.out)&&sr(x.out,z(r,`execution-${x.execId}.evidence`),{recursive:!0})}catch{}if(e.publishFn&&U&&!t.cancelled){try{let te=await(e.validateFn??dt)(x.out,"L1");te.valid||e.log?.("warn","EVIDENCE_INVALID","Sealed remote testrun pack failed L1 validation",{execution_id:x.execId,first_code:String(te.diagnostics?.[0]?.code??""),surface:"testrun_remote"})}catch(te){e.log?.("warn","TESTRUN_VALIDATION_ERROR","Remote testrun pack validation threw",{execution_id:x.execId,error:String(te)})}let A=w??_,B=t.job.plan.projectId??t.job.projectId;if(A&&B){let te=await e.publishFn({testId:A,sessionId:x.execId,executionId:x.execId,sealedPackPath:x.out,projectId:B});R=te.ok?"ok":"failed",S(gt(te,x.execId))}}}else{let O=new Set(x.degraded.standaloneIds??[]);for(let U of s)U.sourceExecutionId&&O.has(U.sourceExecutionId)&&(U.executionId=U.sourceExecutionId);f=Qs(S,()=>Xs({cwd:i,members:c.filter(U=>U.packId&&O.has(U.packId)).map(U=>({...U,executionId:U.packId})),packFacts:new Map,startedAt:new Date().toISOString(),local:E,emit:S,syncFn:k}))}}let L={tests:n.perMember.length,passed:m,failed:p,broken:g,skipped:0,authored:s.length};return{execution:v,authored:s,totals:L,upload:R,hxJobId:t.hxJobId,jobUrl:t.jobUrl,sessionsPath:r,cancelled:t.cancelled,...n.perMember.length>0&&d===0?{artifactless:!0}:{},...I?{degraded:I}:{},...f?{execSync:f}:{}}}var oa={id:"hyper",preflight:qs,prepare:Ys,dispatch:Js,collect:na,reconcile:ra};var Sc={hyper:oa};function ia(n){return Sc[n]}import{existsSync as la,readFileSync as ca}from"fs";import{join as Ic}from"path";var Cc=["name","version","backendId","kaneCompat"];function sa(n){if(typeof n!="object"||n===null)throw new Error("manifest must be an object");let e=n;for(let i of Cc)if(typeof e[i]!="string"||e[i].length===0)throw new Error(`manifest missing required string field '${i}'`);let t={name:e.name,version:e.version,backendId:e.backendId,kaneCompat:e.kaneCompat};return e.defaults&&typeof e.defaults=="object"&&(t.defaults=e.defaults),t}function aa(n,e){let t=r=>{let a=r.replace(/^[v=]+/,"").split(".").map(s=>parseInt(s,10));return[a[0]||0,a[1]||0,a[2]||0]},i=(r,a)=>r[0]-a[0]||r[1]-a[1]||r[2]-a[2],o=t(n);return e.startsWith(">=")?i(o,t(e.slice(2)))>=0:i(o,t(e))===0}function vt(n,e=J){let t=xi(n,e);if(!la(t))return{ok:!1,reason:"not_installed"};let i=ca(t,"utf8").trim();if(!i)return{ok:!1,reason:"corrupt",detail:"empty current pointer"};let o=ki(n,i,e),r=Ic(o,"plugin.json");if(!la(r))return{ok:!1,reason:"corrupt",detail:`current points at ${i} but ${r} is missing`};let a;try{a=sa(JSON.parse(ca(r,"utf8")))}catch(s){return{ok:!1,reason:"corrupt",detail:s.message}}return aa(Me,a.kaneCompat)?{ok:!0,plugin:{name:n,version:i,dir:o,manifest:a}}:{ok:!1,reason:"incompatible",detail:`plugin needs kane-cli ${a.kaneCompat}, have ${Me}`}}async function da(n,e={}){let t=e.creds??new de,i=n.envFlag??t.getDefaultEnv()??"prod",o=vt("remote-execution",n.base);if(!o.ok)return{ok:!1,code:o.reason==="incompatible"?"plugin_incompatible":"plugin_missing",detail:o.reason==="incompatible"?`remote-execution plugin is incompatible${o.detail?`: ${o.detail}`:""}`:"remote-execution plugin is not installed \u2014 run `kane-cli plugin install remote-execution`"};let r=await je({creds:t,env:i,usernameFlag:n.usernameFlag,accessKeyFlag:n.accessKeyFlag,log:n.log});if(!r.basicAuth)return{ok:!1,code:"no_basic_auth",detail:"HyperExecute needs a LambdaTest username + access key \u2014 log in with basic auth or pass --user/--key"};let a=r.resolvedCreds?.org_id!=null?String(r.resolvedCreds.org_id):"",s=t.getActiveProfile()??"default",l=(n.memberClasses??[]).includes("author"),u=oo(t,s,i);if(l&&u.projectId&&n.planProjectId&&u.projectId!==n.planProjectId)return{ok:!1,code:"project_authority_conflict",detail:ir(u.projectId,n.planProjectId)};let c=u.projectId??void 0,m=u.folderId??void 0,p;if(l&&!n.dryRun){let g,d=await Yt({creds:t,config:e.config??new Ce,profile:s,env:i,tmsCreds:r.basicAuth,isLocal:!!n.local,log:n.log,onFatalExit:w=>{g=w}});if(d.status==="ok")c=d.projectId,m=d.folderId,p=d.autoDefaulted;else if(d.status!=="skip")return{ok:!1,code:"project_folder",detail:g?.trim()||"could not resolve a TMS project/folder for the grid login"}}return{ok:!0,ctx:{env:i,auth:r.basicAuth,orgId:a,plugin:o.plugin,projectId:c,folderId:m,resolvedCreds:r.resolvedCreds??null,...p?{autoDefaulted:p}:{}}}}var ua="\x1B[2m",ma="\x1B[0m";function Ac(n){return n.local?{shouldPublish:!1,reason:"local"}:n.hasAuth?n.projectId==null?{shouldPublish:!1,reason:"no_project"}:n.evidencePublish===!1?{shouldPublish:!1,reason:"flag"}:{shouldPublish:!0}:{shouldPublish:!1,reason:"no_auth"}}function Pc(n,e){if(n.cancelled)return{status:"cancelled",exit:3};if(n.artifactless)return e!==0?{status:"failed",exit:e}:{status:"broken",exit:1};let t=o=>Number(n.totals?.[o]??0);return t("failed")>0||t("broken")>0?{status:"failed",exit:1}:{status:n.execution?.status??(n.authored.length?"authored":"passed"),exit:0}}async function pa(n,e,t,i){let o=x=>{for(let O of x)i.emit(un(O));if(!i.isAgent)for(let O of x)process.stderr.write(`error: [${O.code}] ${O.detail}
54
+ `);i.emit(ht("","failed")),i.emit(At({status:"failed",exit:2,jobId:"",sessionsPath:""})),process.exitCode=2},r=typeof e.remote=="string"&&e.remote?e.remote:"hyper",s=(i.findBackendFn??ia)(r);if(!s){o([{code:"unknown_backend",detail:`unknown remote backend '${r}'`}]);return}let l=i.log??(()=>{}),c=await(i.resolveContext??da)({envFlag:e.env,usernameFlag:e.username,accessKeyFlag:e.accessKey,memberClasses:n.checks.map(x=>x.memberClass),planProjectId:n.projectId,dryRun:!!e.dryRun,local:!!e.local,log:l},{});if(!c.ok){o([{code:c.code,detail:c.detail}]);return}i.isAgent&&c.ctx.autoDefaulted&&i.emit(so(c.ctx.autoDefaulted));let m={command:"testrun",plan:n,cwd:t,jobId:Ec(),parallel:Number(e.parallel??1),env:c.ctx.env,auth:c.ctx.auth,orgId:c.ctx.orgId,plugin:c.ctx.plugin,projectId:c.ctx.projectId,folderId:c.ctx.folderId},p=s.preflight(m);if(!p.ok){o(p.errors);return}if(e.dryRun){i.isAgent||process.stderr.write(`\u2713 remote preflight passed \u2014 ${m.plan.checks.length} member(s), backend '${r}', env '${m.env}'
55
55
  `),process.exitCode=0;return}i.emit(Ps({backend:r,env:m.env})),i.isTTYView&&process.stderr.write(`
56
56
  ${ua}remote testrun \xB7 ${r} \xB7 env ${m.env} \xB7 dispatching\u2026${ma}
57
- `);let g=await a.prepare(m),d=Rc(g.jobDir,"hyper.log"),w=Date.now(),_=await a.dispatch(g,{signal:i.signal,onLine:x=>{try{Tc(d,x+`
57
+ `);let g=await s.prepare(m),d=Rc(g.jobDir,"hyper.log"),w=Date.now(),_=await s.dispatch(g,{signal:i.signal,onLine:x=>{try{Tc(d,x+`
58
58
  `)}catch{}i.isTTYView&&/Job Link:|ERR::|error|failed|✔|✗|scenario|completed/i.test(x)&&process.stderr.write(`${ua}${x}${ma}
59
- `)}});i.emit(Os({jobId:_.hxJobId,jobUrl:_.jobUrl}));let h=await a.collect(_),v=n.projectId??m.projectId,R=Ac({local:!!e.local,hasAuth:!!(m.auth?.username&&m.auth?.access_key),projectId:v,evidencePublish:e.evidencePublish});R.shouldPublish||l("info","PUBLISH_SKIPPED","Remote testrun evidence publish skipped",{surface:"testrun_remote",reason:R.reason});let I=se(m.env),f=c.ctx.resolvedCreds,S=R.shouldPublish?async x=>{let D=await tn({controller:new Ut(I.controllerBaseUrl,{username:m.auth.username,accessKey:m.auth.access_key}),tms:new Wt(I.tmsBaseUrl,f?.username??m.auth.username,f?.access_key??m.auth.access_key),...x});if(D.ok)return l("info","EVIDENCE_PUBLISH_OK","Remote testrun evidence published",{surface:"testrun_remote",execution_id:x.executionId}),{ok:!0};let U=/\b(\d{3})\b/.exec(D.error)?.[1]??null;return l("error","EVIDENCE_PUBLISH_FAILED","Remote testrun evidence publish failed",{surface:"testrun_remote",stage:D.stage,http_status:U?Number(U):null,error:D.error}),{ok:!1,stage:D.stage}}:void 0,k=await a.reconcile(h,{emit:i.emit,publishFn:S,log:l});R.shouldPublish&&k.cancelled&&l("info","PUBLISH_SKIPPED","Remote testrun evidence publish skipped",{surface:"testrun_remote",reason:"cancel"}),k.degraded&&!i.isAgent&&(process.stderr.write(`
59
+ `)}});i.emit($s({jobId:_.hxJobId,jobUrl:_.jobUrl}));let h=await s.collect(_),v=n.projectId??m.projectId,R=Ac({local:!!e.local,hasAuth:!!(m.auth?.username&&m.auth?.access_key),projectId:v,evidencePublish:e.evidencePublish});R.shouldPublish||l("info","PUBLISH_SKIPPED","Remote testrun evidence publish skipped",{surface:"testrun_remote",reason:R.reason});let I=se(m.env),f=c.ctx.resolvedCreds,S=R.shouldPublish?async x=>{let O=await tn({controller:new Ut(I.controllerBaseUrl,{username:m.auth.username,accessKey:m.auth.access_key}),tms:new Wt(I.tmsBaseUrl,f?.username??m.auth.username,f?.access_key??m.auth.access_key),...x});if(O.ok)return l("info","EVIDENCE_PUBLISH_OK","Remote testrun evidence published",{surface:"testrun_remote",execution_id:x.executionId}),{ok:!0};let U=/\b(\d{3})\b/.exec(O.error)?.[1]??null;return l("error","EVIDENCE_PUBLISH_FAILED","Remote testrun evidence publish failed",{surface:"testrun_remote",stage:O.stage,http_status:U?Number(U):null,error:O.error}),{ok:!1,stage:O.stage}}:void 0,k=await s.reconcile(h,{emit:i.emit,publishFn:S,log:l});R.shouldPublish&&k.cancelled&&l("info","PUBLISH_SKIPPED","Remote testrun evidence publish skipped",{surface:"testrun_remote",reason:"cancel"}),k.degraded&&!i.isAgent&&(process.stderr.write(`
60
60
  warning: evidence merge degraded (${k.degraded.reason})${k.degraded.detail?` \u2014 ${k.degraded.detail}`:""}
61
61
  `),k.degraded.standaloneIds?.length&&process.stderr.write(` packs kept standalone: ${k.degraded.standaloneIds.join(", ")}
62
62
  `));let E=k.execSync;if(E&&!i.isAgent){E.status==="failed"&&process.stderr.write(`
@@ -68,31 +68,31 @@ Remote job: ${k.jobUrl||"(job id not captured)"}
68
68
  `),x.length&&await Ei({rows:x,env:m.env});else if(!i.isAgent){process.stderr.write(`
69
69
  Remote job: ${k.jobUrl||"(job id not captured)"}
70
70
  `),process.stderr.write(`Sessions: ${k.sessionsPath}
71
- `);let D=Ii(x);if(D.length){process.stderr.write(`
71
+ `);let O=Ii(x);if(O.length){process.stderr.write(`
72
72
  Evidence \u2014 view locally:
73
- `);for(let U of D)process.stderr.write(` ${U}
73
+ `);for(let U of O)process.stderr.write(` ${U}
74
74
  `)}}}catch(x){i.isAgent||process.stderr.write(`warning: evidence presentation failed: ${x.message}
75
75
  `)}let L=Pc(k,_.exitCode);k.artifactless&&_.exitCode===0&&!i.isAgent&&process.stderr.write(`
76
76
  error: the grid job exited 0 but no session artifacts came home \u2014 nothing to reconcile. Check the job's dashboard artifacts (${k.jobUrl||k.hxJobId}).
77
- `),i.emit(ht(k.execution?.id??"",L.status==="cancelled"?"cancelled":L.status==="failed"||L.status==="broken"?"failed":"passed")),i.emit(At({status:L.status,exit:L.exit,jobId:k.hxJobId,sessionsPath:k.sessionsPath})),process.exitCode=L.exit}import{randomUUID as jc}from"crypto";import{existsSync as fa,mkdtempSync as Oc,readFileSync as Dc,rmSync as fn,writeFileSync as $c}from"fs";import{tmpdir as Mc}from"os";import{join as pr}from"path";function ha(n){let e=n.checks.some(t=>t.memberClass==="author");return{willConsolidate:e,interimShouldPublish:n.shouldPublish&&!e}}function ba(n,e){for(let t of n)t.executionId&&(t.sourceExecutionId=t.executionId,t.executionId=e)}var wt=n=>n instanceof Error?n.message:String(n);async function ga(n,e){if(!n.shouldPublish||!n.publish)return"skipped";let t=n.checks.find(o=>o.memberClass==="replay"&&o.testId)?.testId??n.authored.find(o=>o.testId)?.testId;if(!t||n.projectId==null)return"skipped";let i=await n.publish({testId:t,sessionId:e,executionId:e,sealedPackPath:Ie(e,n.cwd),projectId:n.projectId});return n.emit(gt(i,e)),i.ok?"ok":"failed"}async function va(n){let e=n.mergeFn??Gt,t=n.sealFn??ut,i=n.authored.filter(d=>d.executionId).map(d=>({id:d.executionId,path:Ie(d.executionId,n.cwd)})).filter(d=>fa(d.path)),o=n.interim?Ie(n.interim.executionId,n.cwd):null,r=async d=>(n.log("warn","TESTRUN_CONSOLIDATION_DEGRADED","Local consolidation fell back to split evidence",{reason:d}),{kind:"split",upload:n.interim?await ga(n,n.interim.executionId):"skipped",reason:d});if(i.length===0)return r("no authored packs to fold in");let s,a;try{s=Oc(pr(Mc(),"kane-local-merge-rules-")),a=pr(s,"merge-rules.yaml"),$c(a,Qt())}catch(d){return s&&fn(s,{recursive:!0,force:!0}),r(`merge rules unavailable: ${wt(d)}`)}let l=mt(),u=Ie(l,n.cwd),c=[...o&&fa(o)?[o]:[],...i.map(d=>d.path)];try{await e(c,{runId:l,out:u,rulesPath:a,finalize:!1})}catch(d){return fn(u,{recursive:!0,force:!0}),r(`merge failed: ${wt(d)}`)}finally{s&&fn(s,{recursive:!0,force:!0})}let m=n.checks.map(d=>({path:"",memberClass:d.memberClass,relPath:d.relPath}));try{let d=ur(u,m);d.errors.length&&n.log("warn","TESTRUN_CONSOLIDATION_STAMP_INCOMPLETE","Some merged tests missed their run_kind stamp",{execution_id:l,errors:d.errors.slice(0,5)})}catch(d){n.log("warn","TESTRUN_CONSOLIDATION_STAMP_FAILED","run_kind stamping threw",{execution_id:l,error:wt(d)})}try{(n.coverageWriter??pt)(u,Ve(n.cwd))}catch(d){n.log("warn","TESTRUN_COVERAGE_WRITER_THREW","Coverage writer threw on the consolidated pack",{execution_id:l,error:wt(d)})}let p=new Map;for(let d of n.checks)try{let w=ct(Dc(pr(u,"tests",xe(d.relPath),"result.yaml"),"utf8"));typeof w?.status=="string"&&p.set(d.relPath,w.status)}catch{}try{let d=c.map(_=>({path:_,memberClass:"replay",relPath:""})),w=await mr(d)??new Date().toISOString();await t(u,w)}catch(d){return fn(u,{recursive:!0,force:!0}),r(`seal failed: ${wt(d)}`)}try{let d=await(n.validateFn??dt)(u,"L1");d.valid||n.log("warn","EVIDENCE_INVALID","Sealed consolidated pack failed L1 validation",{execution_id:l,first_code:String(d.diagnostics?.[0]?.code??""),surface:"testrun"})}catch(d){n.log("warn","TESTRUN_VALIDATION_ERROR","Consolidated pack validation threw",{execution_id:l,error:wt(d)})}let g=await ga(n,l);for(let d of n.checks){let w=p.get(d.relPath);if(w)try{await Jt(Re(d.path),{execution_id:l,run_kind:d.memberClass==="author"?"author":"replay",status:w,at:new Date().toISOString(),...g==="ok"?{uploaded:!0}:{}})}catch{}}return{kind:"merged",executionId:l,upload:g}}function wa(n,e){return e.concat(n.split(",").map(t=>t.trim()).filter(t=>t.length>0))}function hr(n){return n===1?"failed":n===3?"cancelled":"passed"}function Nc(n){let e=Number(n);if(!Number.isInteger(e)||e<1)throw new Ji(`--parallel must be a positive integer, got: ${n}`);return n}function ka(){let n=new tt("testrun").description("Run M authored *_test.md files as one execution (one sealed evidence pack)");return n.command("run [paths...]").description("Select + preflight + execute *_test.md members").option("--match <regex>","Filter candidates by project-relative path regex").option("--tags <list>","ANY-match on frontmatter tags (repeatable or comma-separated)",wa,[]).option("--from-context <ids>","Select members by assurance-graph test ids, e.g. T-1,T-2 (repeatable or comma-separated; unions with explicit paths)",wa,[]).option("--parallel <n>","Worker count",Nc,"1").option("--on-failure <mode>","continue | fail-fast",e=>{if(e!=="continue"&&e!=="fail-fast")throw new Error(`--on-failure must be continue|fail-fast, got: ${e}`);return e},"continue").option("--name <label>","run.yaml title (default: derived from the selection query)").option("--dry-run","Plan + validate only, execute nothing").option("--remote [backend]","Dispatch to a remote grid instead of local Chrome (default backend: hyper). Requires `kane-cli plugin install remote-execution`.").option("--no-adaptive-heal","disable adaptive heal for every member \u2014 a replay miss becomes terminal instead of re-authoring the failing tail (default: heal on, 3 attempts then a full re-author)").option("--bug-detection <mode>","detect product bugs while authoring member steps: off|stop|continue. Overrides `config set-bug-detection`.",e=>{if(e!=="off"&&e!=="stop"&&e!=="continue")throw new Error(`--bug-detection must be off, stop or continue, got: ${e}`);return e}).addOption(new G("--retry","(retired) adaptive heal is on by default").hideHelp()).addOption(new G("--retry-count <n>","(retired) heal budget is fixed at 3").argParser(e=>{let t=parseInt(e,10);if(Number.isNaN(t)||t<0)throw new Error(`--retry-count must be a non-negative integer, got: ${e}`);return e}).hideHelp()).option("--headless","Run Chrome in headless mode").option("--env <name>","Environment (prod or stage)").addOption(new G("--local","Skip TMS integration (no uploads, no evidence publish)").hideHelp()).addOption(new G("--no-evidence-publish","skip the sealed pack's evidence publish (blob upload + TMS /evidence/ingest) \u2014 the run leaves no execution record in TMS").hideHelp()).option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key").action(async(e,t)=>{await Fc(e,t)}),n}async function Fc(n,e){let t=zo(e);t&&process.stderr.write(t+`
78
- `);let i=e.cwd??process.cwd(),o=!process.stdin.isTTY,r=!o&&!!process.stderr.isTTY,s={current:null},a;try{a=await Ss({paths:n.length>0?n:void 0,match:e.match,tags:e.tags?.length?e.tags:void 0,fromContext:e.fromContext?.length?e.fromContext:void 0,parallel:e.parallel!==void 0?Number(e.parallel):void 0,onFailure:e.onFailure,name:e.name,cwd:i})}catch(P){if(P instanceof ve){process.stderr.write(`error: ${P.message}
79
- `),process.exitCode=2;return}throw P}let l=r&&a.valid&&!e.dryRun&&!e.remote,u=Hc(o,l?P=>s.current?.(P):void 0);if(o?u(Cs(a)):l||ya(a),e.remote){if(!a.valid){o||fr(a),process.exitCode=2;return}let P=e.__runRemote??pa;try{await P(a,e,i,{emit:u,isAgent:o,isTTYView:r})}catch(me){let M=me.message;u(un({code:"internal_error",detail:M})),u(ht("","failed")),u(At({status:"failed",exit:1,jobId:"",sessionsPath:""})),o||process.stderr.write(`error: remote run crashed: ${M}
80
- `),process.exitCode=1}return}if(e.dryRun){!a.valid&&!o&&fr(a),process.exitCode=a.valid?0:2;return}if(!a.valid){o||fr(a),process.exitCode=2;return}let c=new de,m=new Ce,p=c.getActiveProfile()??"default",g=e.env??c.getDefaultEnv()??"prod",d=se(g),w="v16-alpha",_;try{_=await je({creds:c,env:g,usernameFlag:e.username,accessKeyFlag:e.accessKey,log:()=>{}})}catch(P){l&&ya(a),P instanceof It&&P.code==="not_authenticated"?process.stderr.write(`error: Not authenticated. Choose one:
77
+ `),i.emit(ht(k.execution?.id??"",L.status==="cancelled"?"cancelled":L.status==="failed"||L.status==="broken"?"failed":"passed")),i.emit(At({status:L.status,exit:L.exit,jobId:k.hxJobId,sessionsPath:k.sessionsPath})),process.exitCode=L.exit}import{randomUUID as jc}from"crypto";import{existsSync as fa,mkdtempSync as $c,readFileSync as Oc,rmSync as fn,writeFileSync as Dc}from"fs";import{tmpdir as Mc}from"os";import{join as pr}from"path";function ha(n){let e=n.checks.some(t=>t.memberClass==="author");return{willConsolidate:e,interimShouldPublish:n.shouldPublish&&!e}}function ba(n,e){for(let t of n)t.executionId&&(t.sourceExecutionId=t.executionId,t.executionId=e)}var wt=n=>n instanceof Error?n.message:String(n);async function ga(n,e){if(!n.shouldPublish||!n.publish)return"skipped";let t=n.checks.find(o=>o.memberClass==="replay"&&o.testId)?.testId??n.authored.find(o=>o.testId)?.testId;if(!t||n.projectId==null)return"skipped";let i=await n.publish({testId:t,sessionId:e,executionId:e,sealedPackPath:Ie(e,n.cwd),projectId:n.projectId});return n.emit(gt(i,e)),i.ok?"ok":"failed"}async function va(n){let e=n.mergeFn??Gt,t=n.sealFn??ut,i=n.authored.filter(d=>d.executionId).map(d=>({id:d.executionId,path:Ie(d.executionId,n.cwd)})).filter(d=>fa(d.path)),o=n.interim?Ie(n.interim.executionId,n.cwd):null,r=async d=>(n.log("warn","TESTRUN_CONSOLIDATION_DEGRADED","Local consolidation fell back to split evidence",{reason:d}),{kind:"split",upload:n.interim?await ga(n,n.interim.executionId):"skipped",reason:d});if(i.length===0)return r("no authored packs to fold in");let a,s;try{a=$c(pr(Mc(),"kane-local-merge-rules-")),s=pr(a,"merge-rules.yaml"),Dc(s,Qt())}catch(d){return a&&fn(a,{recursive:!0,force:!0}),r(`merge rules unavailable: ${wt(d)}`)}let l=mt(),u=Ie(l,n.cwd),c=[...o&&fa(o)?[o]:[],...i.map(d=>d.path)];try{await e(c,{runId:l,out:u,rulesPath:s,finalize:!1})}catch(d){return fn(u,{recursive:!0,force:!0}),r(`merge failed: ${wt(d)}`)}finally{a&&fn(a,{recursive:!0,force:!0})}let m=n.checks.map(d=>({path:"",memberClass:d.memberClass,relPath:d.relPath}));try{let d=ur(u,m);d.errors.length&&n.log("warn","TESTRUN_CONSOLIDATION_STAMP_INCOMPLETE","Some merged tests missed their run_kind stamp",{execution_id:l,errors:d.errors.slice(0,5)})}catch(d){n.log("warn","TESTRUN_CONSOLIDATION_STAMP_FAILED","run_kind stamping threw",{execution_id:l,error:wt(d)})}try{(n.coverageWriter??pt)(u,Ve(n.cwd))}catch(d){n.log("warn","TESTRUN_COVERAGE_WRITER_THREW","Coverage writer threw on the consolidated pack",{execution_id:l,error:wt(d)})}let p=new Map;for(let d of n.checks)try{let w=ct(Oc(pr(u,"tests",xe(d.relPath),"result.yaml"),"utf8"));typeof w?.status=="string"&&p.set(d.relPath,w.status)}catch{}try{let d=c.map(_=>({path:_,memberClass:"replay",relPath:""})),w=await mr(d)??new Date().toISOString();await t(u,w)}catch(d){return fn(u,{recursive:!0,force:!0}),r(`seal failed: ${wt(d)}`)}try{let d=await(n.validateFn??dt)(u,"L1");d.valid||n.log("warn","EVIDENCE_INVALID","Sealed consolidated pack failed L1 validation",{execution_id:l,first_code:String(d.diagnostics?.[0]?.code??""),surface:"testrun"})}catch(d){n.log("warn","TESTRUN_VALIDATION_ERROR","Consolidated pack validation threw",{execution_id:l,error:wt(d)})}let g=await ga(n,l);for(let d of n.checks){let w=p.get(d.relPath);if(w)try{await Jt(Re(d.path),{execution_id:l,run_kind:d.memberClass==="author"?"author":"replay",status:w,at:new Date().toISOString(),...g==="ok"?{uploaded:!0}:{}})}catch{}}return{kind:"merged",executionId:l,upload:g}}function wa(n,e){return e.concat(n.split(",").map(t=>t.trim()).filter(t=>t.length>0))}function hr(n){return n===1?"failed":n===3?"cancelled":"passed"}function Nc(n){let e=Number(n);if(!Number.isInteger(e)||e<1)throw new Ji(`--parallel must be a positive integer, got: ${n}`);return n}function ka(){let n=new tt("testrun").description("Run M authored *_test.md files as one execution (one sealed evidence pack)");return n.command("run [paths...]").description("Select + preflight + execute *_test.md members").option("--match <regex>","Filter candidates by project-relative path regex").option("--tags <list>","ANY-match on frontmatter tags (repeatable or comma-separated)",wa,[]).option("--from-context <ids>","Select members by assurance-graph test ids, e.g. T-1,T-2 (repeatable or comma-separated; unions with explicit paths)",wa,[]).option("--parallel <n>","Worker count",Nc,"1").option("--on-failure <mode>","continue | fail-fast",e=>{if(e!=="continue"&&e!=="fail-fast")throw new Error(`--on-failure must be continue|fail-fast, got: ${e}`);return e},"continue").option("--name <label>","run.yaml title (default: derived from the selection query)").option("--dry-run","Plan + validate only, execute nothing").option("--remote [backend]","Dispatch to a remote grid instead of local Chrome (default backend: hyper). Requires `kane-cli plugin install remote-execution`.").option("--no-adaptive-heal","disable adaptive heal for every member \u2014 a replay miss becomes terminal instead of re-authoring the failing tail (default: heal on, 3 attempts then a full re-author)").option("--bug-detection <mode>","detect product bugs while authoring member steps: off|stop|continue. Overrides `config set-bug-detection`.",e=>{if(e!=="off"&&e!=="stop"&&e!=="continue")throw new Error(`--bug-detection must be off, stop or continue, got: ${e}`);return e}).addOption(new G("--retry","(retired) adaptive heal is on by default").hideHelp()).addOption(new G("--retry-count <n>","(retired) heal budget is fixed at 3").argParser(e=>{let t=parseInt(e,10);if(Number.isNaN(t)||t<0)throw new Error(`--retry-count must be a non-negative integer, got: ${e}`);return e}).hideHelp()).option("--headless","Run Chrome in headless mode").option("--env <name>","Environment (prod or stage)").addOption(new G("--local","Skip TMS integration (no uploads, no evidence publish)").hideHelp()).addOption(new G("--no-evidence-publish","skip the sealed pack's evidence publish (blob upload + TMS /evidence/ingest) \u2014 the run leaves no execution record in TMS").hideHelp()).option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key").action(async(e,t)=>{await Fc(e,t)}),n}async function Fc(n,e){let t=zo(e);t&&process.stderr.write(t+`
78
+ `);let i=e.cwd??process.cwd(),o=!process.stdin.isTTY,r=!o&&!!process.stderr.isTTY,a={current:null},s;try{s=await Ss({paths:n.length>0?n:void 0,match:e.match,tags:e.tags?.length?e.tags:void 0,fromContext:e.fromContext?.length?e.fromContext:void 0,parallel:e.parallel!==void 0?Number(e.parallel):void 0,onFailure:e.onFailure,name:e.name,cwd:i})}catch(P){if(P instanceof ve){process.stderr.write(`error: ${P.message}
79
+ `),process.exitCode=2;return}throw P}let l=r&&s.valid&&!e.dryRun&&!e.remote,u=Hc(o,l?P=>a.current?.(P):void 0);if(o?u(Cs(s)):l||ya(s),e.remote){if(!s.valid){o||fr(s),process.exitCode=2;return}let P=e.__runRemote??pa;try{await P(s,e,i,{emit:u,isAgent:o,isTTYView:r})}catch(me){let M=me.message;u(un({code:"internal_error",detail:M})),u(ht("","failed")),u(At({status:"failed",exit:1,jobId:"",sessionsPath:""})),o||process.stderr.write(`error: remote run crashed: ${M}
80
+ `),process.exitCode=1}return}if(e.dryRun){!s.valid&&!o&&fr(s),process.exitCode=s.valid?0:2;return}if(!s.valid){o||fr(s),process.exitCode=2;return}let c=new de,m=new Ce,p=c.getActiveProfile()??"default",g=e.env??c.getDefaultEnv()??"prod",d=se(g),w="v16-alpha",_;try{_=await je({creds:c,env:g,usernameFlag:e.username,accessKeyFlag:e.accessKey,log:()=>{}})}catch(P){l&&ya(s),P instanceof It&&P.code==="not_authenticated"?process.stderr.write(`error: Not authenticated. Choose one:
81
81
  \u2022 Pass credentials inline: --username <user> --access-key <key>
82
82
  \u2022 Run 'kane-cli login --oauth' (browser-based)
83
83
  \u2022 Run 'kane-cli login --username <user> --access-key <key>'
84
84
  `):P instanceof It&&P.code==="refresh_failed"?process.stderr.write(`error: Token refresh failed. Run 'kane-cli login' to re-authenticate.
85
85
  `):process.stderr.write(`error: auth resolution failed: ${P.message}
86
- `),process.exitCode=2;return}let h=null;l&&(h=Qe(gr.default.createElement(Ze,null,gr.default.createElement(vs,{members:a.checks.map(P=>({relPath:P.relPath,memberClass:P.memberClass,tags:P.tags})),title:a.title,env:g,dispatchRef:s})),{stdout:process.stderr,exitOnCtrlC:!1}));let v=e.log?{log:e.log,shutdown:async()=>{}}:Bc({environment:g,resolvedAuth:_,isAgent:o}),R=v.log,I={adaptiveHeal:e.adaptiveHeal,headless:e.headless,env:e.env,local:e.local,username:e.username,accessKey:e.accessKey,bugDetection:e.bugDetection},f=m.load(),S=Vs({launch:po,width:f.window_size.width,height:f.window_size.height,headless:!!e.headless});lt("testrun-slots",()=>S.killAll());let k={packDir:"",resolvedAuth:_,environment:g,envConfig:d,creds:c,configStore:m,profile:p,model:w,passThroughOpts:I,cwd:i},E=P=>({host:Ws(),lifecycle:Bs()}),L="",x=async(P,me)=>{let M;try{M=await S.acquire(me)}catch(X){let it=X.message;process.stderr.write(`member ${P.relPath}: chrome slot failed: ${it}
87
- `);let st=xe(P.relPath),De=P.testId??st;return Do(Oo(k.packDir,st),"warn","TESTRUN_SLOT_FAILURE",{execution_id:L,slot_index:me,member_test_id:De,phase:"launch",error:it},R),{testId:P.testId??"",overallStatus:"broken",exitCode:2,durationS:0,runKind:"replay"}}return Fs(P,M,k,E)},D=!e.local&&!!_.basicAuth&&a.projectId!=null&&e.evidencePublish!==!1,{willConsolidate:U,interimShouldPublish:oe}=ha({checks:a.checks,shouldPublish:D});if(D&&U&&R("info","PUBLISH_SKIPPED","Interim testrun evidence publish deferred to the consolidated pack",{surface:"testrun",reason:"consolidation"}),!D){let P=e.local?"local":_.basicAuth?a.projectId==null?"no_project":"flag":"no_auth";R("info","PUBLISH_SKIPPED","Testrun evidence publish skipped",{surface:"testrun",reason:P})}let A=_.basicAuth?async P=>{let me=_.basicAuth,M=await tn({controller:new Ut(d.controllerBaseUrl,{username:me.username,accessKey:me.access_key}),tms:new Wt(d.tmsBaseUrl,_.resolvedCreds?.username??me.username,_.resolvedCreds?.access_key??me.access_key),...P});if(M.ok)return R("info","EVIDENCE_PUBLISH_OK","Testrun evidence published",{surface:"testrun",execution_id:P.executionId}),{ok:!0};let X=/\b(\d{3})\b/.exec(M.error)?.[1]??null;return R("error","EVIDENCE_PUBLISH_FAILED","Testrun evidence publish failed",{surface:"testrun",stage:M.stage,http_status:X?Number(X):null,error:M.error}),{ok:!1,stage:M.stage}}:void 0,B=new AbortController;k.signal=B.signal;let te=Vc(B),Le={executeMember:x,publish:A,emit:u,log:R,shouldPublish:oe,operator:{userName:_.resolvedCreds?.username??void 0,userEmail:_.resolvedCreds?.email??void 0},signal:B.signal,cwd:i,onExecutionId:P=>{L=P,k.packDir=Ie(P,i)}},Oe=a.checks.filter(P=>P.memberClass==="replay"),We=a.checks.filter(P=>P.memberClass==="author"),ot=async(P,me)=>{let M;try{M=await S.acquire(me)}catch(X){return process.stderr.write(`author member ${P.relPath}: chrome slot failed: ${X.message}
88
- `),{relPath:P.relPath,overallStatus:"broken",exitCode:2,durationS:0,published:"no"}}return Ls(P,M,k,E)},$t=Date.now(),ue=null,ie=[],ye=[],qe=!1,ke=!1;try{if(Oe.length>0&&(ue=await js({...a,checks:Oe},Le),ue.exitCode===3&&(ke=!0)),We.length>0&&!ke)try{let $=await Us(We,{executeAuthorMember:ot,emit:u,parallel:a.parallel,signal:B.signal});ie=$.results,ye=$.skipped,ke=ke||$.cancelled}catch($){process.stderr.write(`error: author pass failed: ${$.message}
89
- `),ie=[],ye=We,qe=!0}let P=ue?ue.exitCode===1:!1,me=qe||ie.some($=>$.overallStatus==="failed"||$.overallStatus==="broken"||$.overallStatus==="interrupted"),M=ke?3:P||me?1:0;process.exitCode=M;let X=null;if(U&&!ke){try{X=await va({interim:ue?{executionId:ue.executionId}:null,authored:ie,checks:a.checks,cwd:i,projectId:a.projectId,shouldPublish:D,publish:A,emit:u,log:R})}catch($){o||process.stderr.write(`warning: evidence consolidation failed: ${$.message}
90
- `)}X?.kind==="merged"&&ba(ie,X.executionId)}let it=X?.kind==="merged"?X.executionId:ue?.executionId,st=X?X.upload:ue?.upload??"skipped",De=ue?.totals??{tests:0,passed:0,failed:0,broken:0,skipped:0},Mt=ie.filter($=>$.overallStatus==="passed").length;u(dn({execution:X?.kind==="merged"?{id:X.executionId,status:hr(M),evidence_id:X.executionId}:ue?{id:ue.executionId,status:hr(ue.exitCode),evidence_id:ue.executionId}:null,authored:ie.map($=>({path:$.relPath,test_id:$.testId,commit_id:$.commitId,execution_id:$.executionId,...$.sourceExecutionId?{source_execution_id:$.sourceExecutionId}:{},status:$.overallStatus,published:$.published})),totals:{tests:(De.tests??0)+ie.length+ye.length,passed:(De.passed??0)+Mt,failed:(De.failed??0)+ie.filter($=>$.overallStatus==="failed").length,broken:(De.broken??0)+ie.filter($=>$.overallStatus==="broken"||$.overallStatus==="interrupted").length,skipped:(De.skipped??0)+ye.length,authored:ie.length},durationS:(Date.now()-$t)/1e3,upload:st,cancelled:ke})),u(ht(it??"",M===0?"passed":M===3?"cancelled":"failed")),h&&await h.waitUntilExit(),await Lc({executionResult:X?.kind==="merged"?{executionId:X.executionId,exitCode:M}:ue,authored:ie,cwd:i,environment:g,isAgent:o,cancelled:ke})}catch(P){h?.unmount(),process.stderr.write(`error: testrun failed: ${P.message}
86
+ `),process.exitCode=2;return}let h=null;l&&(h=Qe(gr.default.createElement(Ze,null,gr.default.createElement(vs,{members:s.checks.map(P=>({relPath:P.relPath,memberClass:P.memberClass,tags:P.tags})),title:s.title,env:g,dispatchRef:a})),{stdout:process.stderr,exitOnCtrlC:!1}));let v=e.log?{log:e.log,shutdown:async()=>{}}:Bc({environment:g,resolvedAuth:_,isAgent:o}),R=v.log,I={adaptiveHeal:e.adaptiveHeal,headless:e.headless,env:e.env,local:e.local,username:e.username,accessKey:e.accessKey,bugDetection:e.bugDetection},f=m.load(),S=Vs({launch:po,width:f.window_size.width,height:f.window_size.height,headless:!!e.headless});lt("testrun-slots",()=>S.killAll());let k={packDir:"",resolvedAuth:_,environment:g,envConfig:d,creds:c,configStore:m,profile:p,model:w,passThroughOpts:I,cwd:i},E=P=>({host:Ws(),lifecycle:Bs()}),L="",x=async(P,me)=>{let M;try{M=await S.acquire(me)}catch(X){let it=X.message;process.stderr.write(`member ${P.relPath}: chrome slot failed: ${it}
87
+ `);let st=xe(P.relPath),Oe=P.testId??st;return Oo($o(k.packDir,st),"warn","TESTRUN_SLOT_FAILURE",{execution_id:L,slot_index:me,member_test_id:Oe,phase:"launch",error:it},R),{testId:P.testId??"",overallStatus:"broken",exitCode:2,durationS:0,runKind:"replay"}}return Fs(P,M,k,E)},O=!e.local&&!!_.basicAuth&&s.projectId!=null&&e.evidencePublish!==!1,{willConsolidate:U,interimShouldPublish:oe}=ha({checks:s.checks,shouldPublish:O});if(O&&U&&R("info","PUBLISH_SKIPPED","Interim testrun evidence publish deferred to the consolidated pack",{surface:"testrun",reason:"consolidation"}),!O){let P=e.local?"local":_.basicAuth?s.projectId==null?"no_project":"flag":"no_auth";R("info","PUBLISH_SKIPPED","Testrun evidence publish skipped",{surface:"testrun",reason:P})}let A=_.basicAuth?async P=>{let me=_.basicAuth,M=await tn({controller:new Ut(d.controllerBaseUrl,{username:me.username,accessKey:me.access_key}),tms:new Wt(d.tmsBaseUrl,_.resolvedCreds?.username??me.username,_.resolvedCreds?.access_key??me.access_key),...P});if(M.ok)return R("info","EVIDENCE_PUBLISH_OK","Testrun evidence published",{surface:"testrun",execution_id:P.executionId}),{ok:!0};let X=/\b(\d{3})\b/.exec(M.error)?.[1]??null;return R("error","EVIDENCE_PUBLISH_FAILED","Testrun evidence publish failed",{surface:"testrun",stage:M.stage,http_status:X?Number(X):null,error:M.error}),{ok:!1,stage:M.stage}}:void 0,B=new AbortController;k.signal=B.signal;let te=Vc(B),Le={executeMember:x,publish:A,emit:u,log:R,shouldPublish:oe,operator:{userName:_.resolvedCreds?.username??void 0,userEmail:_.resolvedCreds?.email??void 0},signal:B.signal,cwd:i,onExecutionId:P=>{L=P,k.packDir=Ie(P,i)}},$e=s.checks.filter(P=>P.memberClass==="replay"),We=s.checks.filter(P=>P.memberClass==="author"),ot=async(P,me)=>{let M;try{M=await S.acquire(me)}catch(X){return process.stderr.write(`author member ${P.relPath}: chrome slot failed: ${X.message}
88
+ `),{relPath:P.relPath,overallStatus:"broken",exitCode:2,durationS:0,published:"no"}}return Ls(P,M,k,E)},Dt=Date.now(),ue=null,ie=[],ye=[],qe=!1,ke=!1;try{if($e.length>0&&(ue=await js({...s,checks:$e},Le),ue.exitCode===3&&(ke=!0)),We.length>0&&!ke)try{let D=await Us(We,{executeAuthorMember:ot,emit:u,parallel:s.parallel,signal:B.signal});ie=D.results,ye=D.skipped,ke=ke||D.cancelled}catch(D){process.stderr.write(`error: author pass failed: ${D.message}
89
+ `),ie=[],ye=We,qe=!0}let P=ue?ue.exitCode===1:!1,me=qe||ie.some(D=>D.overallStatus==="failed"||D.overallStatus==="broken"||D.overallStatus==="interrupted"),M=ke?3:P||me?1:0;process.exitCode=M;let X=null;if(U&&!ke){try{X=await va({interim:ue?{executionId:ue.executionId}:null,authored:ie,checks:s.checks,cwd:i,projectId:s.projectId,shouldPublish:O,publish:A,emit:u,log:R})}catch(D){o||process.stderr.write(`warning: evidence consolidation failed: ${D.message}
90
+ `)}X?.kind==="merged"&&ba(ie,X.executionId)}let it=X?.kind==="merged"?X.executionId:ue?.executionId,st=X?X.upload:ue?.upload??"skipped",Oe=ue?.totals??{tests:0,passed:0,failed:0,broken:0,skipped:0},Mt=ie.filter(D=>D.overallStatus==="passed").length;u(dn({execution:X?.kind==="merged"?{id:X.executionId,status:hr(M),evidence_id:X.executionId}:ue?{id:ue.executionId,status:hr(ue.exitCode),evidence_id:ue.executionId}:null,authored:ie.map(D=>({path:D.relPath,test_id:D.testId,commit_id:D.commitId,execution_id:D.executionId,...D.sourceExecutionId?{source_execution_id:D.sourceExecutionId}:{},status:D.overallStatus,published:D.published})),totals:{tests:(Oe.tests??0)+ie.length+ye.length,passed:(Oe.passed??0)+Mt,failed:(Oe.failed??0)+ie.filter(D=>D.overallStatus==="failed").length,broken:(Oe.broken??0)+ie.filter(D=>D.overallStatus==="broken"||D.overallStatus==="interrupted").length,skipped:(Oe.skipped??0)+ye.length,authored:ie.length},durationS:(Date.now()-Dt)/1e3,upload:st,cancelled:ke})),u(ht(it??"",M===0?"passed":M===3?"cancelled":"failed")),h&&await h.waitUntilExit(),await Lc({executionResult:X?.kind==="merged"?{executionId:X.executionId,exitCode:M}:ue,authored:ie,cwd:i,environment:g,isAgent:o,cancelled:ke})}catch(P){h?.unmount(),process.stderr.write(`error: testrun failed: ${P.message}
91
91
  `),process.exitCode=1}finally{te(),S.killAll(),Gr("testrun-slots"),await v.shutdown()}}async function Lc(n,e=Uc){try{await e(n)}catch(t){n.isAgent||process.stderr.write(`warning: evidence presentation failed: ${t.message}
92
92
  `)}}async function Uc(n){let{collectEvidenceRows:e,serveCommands:t}=await import("./evidence-presentation-XF23B7F2.js"),i=e({executionId:n.executionResult?.executionId,executionStatus:n.executionResult?hr(n.executionResult.exitCode):void 0,authored:n.authored,cwd:n.cwd});if(i.length===0)return;if(!(!n.isAgent&&!n.cancelled&&!!process.stdin.isTTY&&!!process.stderr.isTTY)){process.stderr.write(`
93
93
  Evidence \u2014 view locally:
94
- `);for(let s of t(i))process.stderr.write(` ${s}
95
- `);return}let{renderTestrunEvidenceTable:r}=await import("./TestrunEvidenceTable-PTIBYAXO.js");await r({rows:i,env:n.environment})}function Vc(n){let e=process.listeners("SIGINT");process.removeAllListeners("SIGINT");let t=()=>n.abort();return process.on("SIGINT",t),()=>{process.removeListener("SIGINT",t);for(let i of e)process.on("SIGINT",i)}}function Bc(n){let e=null;try{let o=n.resolvedAuth.resolvedCreds;o&&(e=di({sessionId:jc(),identity:{org_id:String(o.org_id??""),user_id:String(o.user_id??""),machine_id:co(),email:o.email??null,email_domain:o.email_domain??"unknown",user_type:o.user_type??"unknown",env:n.environment,plan:o.plan??"unknown"},invocationMode:n.isAgent?"agent":"cli",getToken:async()=>n.resolvedAuth.token??null}),e.start())}catch{e=null}return{log:(o,r,s,a)=>{try{e?.log(o,r,s,a)}catch{}},shutdown:async()=>{try{await e?.shutdown()}catch{}}}}function Hc(n,e){return n?t=>process.stdout.write(JSON.stringify(t)+`
94
+ `);for(let a of t(i))process.stderr.write(` ${a}
95
+ `);return}let{renderTestrunEvidenceTable:r}=await import("./TestrunEvidenceTable-A7WTTKTV.js");await r({rows:i,env:n.environment})}function Vc(n){let e=process.listeners("SIGINT");process.removeAllListeners("SIGINT");let t=()=>n.abort();return process.on("SIGINT",t),()=>{process.removeListener("SIGINT",t);for(let i of e)process.on("SIGINT",i)}}function Bc(n){let e=null;try{let o=n.resolvedAuth.resolvedCreds;o&&(e=di({sessionId:jc(),identity:{org_id:String(o.org_id??""),user_id:String(o.user_id??""),machine_id:co(),email:o.email??null,email_domain:o.email_domain??"unknown",user_type:o.user_type??"unknown",env:n.environment,plan:o.plan??"unknown"},invocationMode:n.isAgent?"agent":"cli",getToken:async()=>n.resolvedAuth.token??null}),e.start())}catch{e=null}return{log:(o,r,a,s)=>{try{e?.log(o,r,a,s)}catch{}},shutdown:async()=>{try{await e?.shutdown()}catch{}}}}function Hc(n,e){return n?t=>process.stdout.write(JSON.stringify(t)+`
96
96
  `):e||(t=>Wc(t))}function Wc(n){switch(n.type){case"testrun_start":process.stdout.write(`
97
97
  running ${n.members.length} test(s) (parallel=${n.parallel})
98
98
  `);break;case"testrun_member_start":process.stdout.write(` -> ${n.path}
@@ -116,12 +116,12 @@ ${n.checks.length} test(s) selected \u2014 plan ${n.valid?"valid":"INVALID"}
116
116
  `);return}process.stderr.write(`
117
117
  error: plan invalid \u2014 ${e.length} offending test(s):
118
118
  `);for(let t of e)process.stderr.write(` ${t.relPath}: ${t.failure}
119
- `);e.some(t=>t.failure==="mobile_unsupported")&&process.stderr.write("\ntestrun does not yet support mobile members \u2014 run them via `kane-cli testmd run <path>`.\n")}import{existsSync as qc,readdirSync as Kc}from"fs";function xa(n=J){let e=wi(n);if(!qc(e))return[];let t=[];for(let i of Kc(e,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name)){let o=vt(i,n);o.ok&&t.push({name:i,version:o.plugin.version,backendId:o.plugin.manifest.backendId})}return t.sort((i,o)=>i.name.localeCompare(o.name))}import{existsSync as Yc,rmSync as Gc}from"fs";function _a(n,e=J){let t=yi(n,e);return Yc(t)?(Gc(t,{recursive:!0,force:!0}),{removed:!0}):{removed:!1}}import{existsSync as Jc}from"fs";import{execFileSync as zc}from"child_process";function Xc(){try{return!!new de().getActiveProfile()}catch{return!1}}function Qc(n){try{return zc("hyperexecute",["--version"],{stdio:"ignore",timeout:2e3}),"hyperexecute"}catch{}let e=on(n);return Jc(e)?e:null}function Sa(n,e={}){let t=e.base??J,i=e.isLoggedIn??Xc,o=e.findBinary??(()=>Qc(t)),r=[],s=vt(n,t);if(!s.ok)return r.push({id:"installed",ok:!1,level:"error",message:s.reason==="not_installed"?`plugin '${n}' is not installed \u2014 run \`kane-cli plugin install ${n}\``:`plugin '${n}' is ${s.reason}${s.detail?`: ${s.detail}`:""}`}),r;r.push({id:"installed",ok:!0,level:"ok",message:`plugin '${n}' v${s.plugin.version} installed`});let a=o();r.push({id:"binary-present",ok:!!a,level:a?"ok":"error",message:a?`hyperexecute binary found (${a})`:`hyperexecute binary not found \u2014 run \`kane-cli plugin install ${n}\` to download it`});let l=i();return r.push({id:"logged-in",ok:l,level:l?"ok":"warn",message:l?"authenticated":"not logged in \u2014 run `kane-cli login`"}),r}function Ca(n,e){let t=o=>o.level==="ok"?"\u2713":o.level==="warn"?"\u26A0":"\u2717",i=[`plugin doctor \u2014 ${n}`];for(let o of e)i.push(` ${t(o)} ${o.message}`);return i.join(`
119
+ `);e.some(t=>t.failure==="mobile_unsupported")&&process.stderr.write("\ntestrun does not yet support mobile members \u2014 run them via `kane-cli testmd run <path>`.\n")}import{existsSync as qc,readdirSync as Kc}from"fs";function xa(n=J){let e=wi(n);if(!qc(e))return[];let t=[];for(let i of Kc(e,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name)){let o=vt(i,n);o.ok&&t.push({name:i,version:o.plugin.version,backendId:o.plugin.manifest.backendId})}return t.sort((i,o)=>i.name.localeCompare(o.name))}import{existsSync as Yc,rmSync as Gc}from"fs";function _a(n,e=J){let t=yi(n,e);return Yc(t)?(Gc(t,{recursive:!0,force:!0}),{removed:!0}):{removed:!1}}import{existsSync as Jc}from"fs";import{execFileSync as zc}from"child_process";function Xc(){try{return!!new de().getActiveProfile()}catch{return!1}}function Qc(n){try{return zc("hyperexecute",["--version"],{stdio:"ignore",timeout:2e3}),"hyperexecute"}catch{}let e=on(n);return Jc(e)?e:null}function Sa(n,e={}){let t=e.base??J,i=e.isLoggedIn??Xc,o=e.findBinary??(()=>Qc(t)),r=[],a=vt(n,t);if(!a.ok)return r.push({id:"installed",ok:!1,level:"error",message:a.reason==="not_installed"?`plugin '${n}' is not installed \u2014 run \`kane-cli plugin install ${n}\``:`plugin '${n}' is ${a.reason}${a.detail?`: ${a.detail}`:""}`}),r;r.push({id:"installed",ok:!0,level:"ok",message:`plugin '${n}' v${a.plugin.version} installed`});let s=o();r.push({id:"binary-present",ok:!!s,level:s?"ok":"error",message:s?`hyperexecute binary found (${s})`:`hyperexecute binary not found \u2014 run \`kane-cli plugin install ${n}\` to download it`});let l=i();return r.push({id:"logged-in",ok:l,level:l?"ok":"warn",message:l?"authenticated":"not logged in \u2014 run `kane-cli login`"}),r}function Ca(n,e){let t=o=>o.level==="ok"?"\u2713":o.level==="warn"?"\u26A0":"\u2717",i=[`plugin doctor \u2014 ${n}`];for(let o of e)i.push(` ${t(o)} ${o.message}`);return i.join(`
120
120
  `)}function Ia(){let n=new tt("plugin").description("Manage kane-cli plugins (install, list, remove, doctor)"),e=i=>i.base??J,t=()=>!process.stdin.isTTY;return n.command("install").argument("<name>","plugin name (e.g. remote-execution)").option("--version <v>","specific version (defaults to the bundled version)").addOption(new G("--base <dir>","override base dir (test seam)").hideHelp()).action(async(i,o)=>{let r=Ti(i,{version:o.version,base:e(o)});if(r.status==="failed"){process.stderr.write(`error: ${r.error}
121
- `),process.exitCode=/unknown plugin/i.test(r.error??"")?2:1;return}let s=i==="remote-execution"?await Ri(e(o)):void 0;t()?process.stdout.write(JSON.stringify({type:"plugin_install_result",status:r.status,name:r.name,version:r.version,dir:r.dir,binary:s})+`
121
+ `),process.exitCode=/unknown plugin/i.test(r.error??"")?2:1;return}let a=i==="remote-execution"?await Ri(e(o)):void 0;t()?process.stdout.write(JSON.stringify({type:"plugin_install_result",status:r.status,name:r.name,version:r.version,dir:r.dir,binary:a})+`
122
122
  `):(process.stderr.write(`${r.status==="already-installed"?"already installed":"installed"} ${r.name}@${r.version} \u2192 ${r.dir}
123
- `),s&&(s.status==="failed"?process.stderr.write(`\u26A0 hyperexecute binary download failed (${s.error}) \u2014 re-run \`kane-cli plugin install ${r.name}\`
124
- `):process.stderr.write(`\u2713 hyperexecute binary ${s.status} \u2192 ${s.path}
123
+ `),a&&(a.status==="failed"?process.stderr.write(`\u26A0 hyperexecute binary download failed (${a.error}) \u2014 re-run \`kane-cli plugin install ${r.name}\`
124
+ `):process.stderr.write(`\u2713 hyperexecute binary ${a.status} \u2192 ${a.path}
125
125
  `)),process.stderr.write(`run \`kane-cli plugin doctor ${r.name}\` to check readiness for --remote
126
126
  `)),process.exitCode=0}),n.command("list").addOption(new G("--base <dir>","override base dir (test seam)").hideHelp()).action(i=>{let o=xa(e(i));if(t())process.stdout.write(JSON.stringify({type:"plugin_list",plugins:o})+`
127
127
  `);else if(o.length===0)process.stderr.write(`no plugins installed
@@ -131,14 +131,14 @@ error: plan invalid \u2014 ${e.length} offending test(s):
131
131
  `:`not installed: ${i}
132
132
  `),process.exitCode=0}),n.command("doctor").argument("[name]","plugin name","remote-execution").addOption(new G("--base <dir>","override base dir (test seam)").hideHelp()).action((i,o)=>{let r=Sa(i,{base:e(o)});t()?process.stdout.write(JSON.stringify({type:"plugin_doctor",name:i,checks:r})+`
133
133
  `):process.stdout.write(Ca(i,r)+`
134
- `),process.exitCode=r.some(s=>s.id==="installed"&&!s.ok)?2:0}),n}var br="pass --target emulator|simulator";function Ea(n){return n===void 0||n===""?{error:br}:n==="emulator"||n==="simulator"?{ok:n}:n==="desktop"?{error:`desktop has no devices or uploads to list \u2014 ${br}`}:{error:`unknown target "${n}" \u2014 ${br}`}}function Zc(n){let e=n.osVersion??(n.androidApiLevel!==void 0?`API ${n.androidApiLevel}`:void 0);return{name:n.displayName,state:n.state,id:Ur(n),platform:n.platform,kind:n.kind,...e?{os_version:e}:{}}}function ed(n,e=t=>process.stdout.write(`${t}
134
+ `),process.exitCode=r.some(a=>a.id==="installed"&&!a.ok)?2:0}),n}var br="pass --target emulator|simulator";function Ea(n){return n===void 0||n===""?{error:br}:n==="emulator"||n==="simulator"?{ok:n}:n==="desktop"?{error:`desktop has no devices or uploads to list \u2014 ${br}`}:{error:`unknown target "${n}" \u2014 ${br}`}}function Zc(n){let e=n.osVersion??(n.androidApiLevel!==void 0?`API ${n.androidApiLevel}`:void 0);return{name:n.displayName,state:n.state,id:Ur(n),platform:n.platform,kind:n.kind,...e?{os_version:e}:{}}}function ed(n,e=t=>process.stdout.write(`${t}
135
135
  `)){if(n.length===0){e("(no devices found)");return}let t=Math.max(6,...n.map(o=>o.name.length)),i=Math.max(5,...n.map(o=>o.state.length));e(`${"DEVICE".padEnd(t)} ${"STATE".padEnd(i)} ID`);for(let o of n)e(`${o.name.padEnd(t)} ${o.state.padEnd(i)} ${o.id}`)}function td(){return{host:Br,depsInstalled:async n=>(await Vt().status(n)).installed,discover:n=>Vr(n),isAgent:()=>!process.stdin.isTTY||!process.stdout.isTTY,out:n=>process.stdout.write(`${n}
136
136
  `),err:n=>process.stderr.write(`${n}
137
137
  `),exit:(n,e)=>y(n,e)}}async function nd(n,e=td()){let t=Ea(n.target);if("error"in t){e.err(`error: ${t.error}`),e.exit(2,`devices list: ${t.error}`);return}let i=e.host();if(!i.supported){e.err(`error: ${i.reason}`),e.exit(2,"devices list: unsupported host");return}if(t.ok==="emulator"&&!await e.depsInstalled("emulator")){e.err(`error: the managed Android dependencies are not installed, so emulators cannot be discovered.
138
- Install them: kane-cli doctor --target emulator --install`),e.exit(2,"devices list: emulator deps missing");return}let o=Ft(t.ok),r=(await e.discover(o)).filter(s=>s.kind===t.ok).map(Zc);if(n.agent||e.isAgent()){for(let s of r)e.out(JSON.stringify(s));e.out(JSON.stringify({total:r.length}))}else ed(r,e.out);e.exit(0,"devices list complete")}function rd(n){return{app_id:n.appId,name:n.name,...n.packageName?{package:n.packageName}:{},...n.updatedAt?{updated_at:n.updatedAt}:{}}}function od(n,e,t=i=>process.stdout.write(`${i}
139
- `)){if(n.length===0){t("(no uploads found)");return}let i=Math.max(4,...n.map(r=>r.name.length)),o=Math.max(6,...n.map(r=>r.app_id.length));t(`${"NAME".padEnd(i)} ${"APP ID".padEnd(o)} UPDATED`);for(let r of n){let s=r.updated_at?r.updated_at.slice(0,10):"";t(`${r.name.padEnd(i)} ${r.app_id.padEnd(o)} ${s}`)}e>n.length&&t(""),e>n.length&&t(`${n.length} of ${e}`)}var id=50;function sd(n){return{resolveAuth:async()=>{let e=new de,t=n.profile??e.getActiveProfile()??"default",i=n.env??e.getDefaultEnv(),o=await Ai(t,i,n);if(!o.ok){let{message:r,exitCode:s}=Pi(t,i,o);return process.stderr.write(r),y(s,`${o.reason} for "${t}" [${i}]`),{ok:!1}}return{ok:!0,username:o.creds.username,accessKey:o.creds.access_key,env:i}},list:async({baseUrl:e,auth:t,type:i})=>new Xr(e,t).list({type:i,limit:id}),isAgent:()=>!process.stdin.isTTY||!process.stdout.isTTY,out:e=>process.stdout.write(`${e}
138
+ Install them: kane-cli doctor --target emulator --install`),e.exit(2,"devices list: emulator deps missing");return}let o=Ft(t.ok),r=(await e.discover(o)).filter(a=>a.kind===t.ok).map(Zc);if(n.agent||e.isAgent()){for(let a of r)e.out(JSON.stringify(a));e.out(JSON.stringify({total:r.length}))}else ed(r,e.out);e.exit(0,"devices list complete")}function rd(n){return{app_id:n.appId,name:n.name,...n.packageName?{package:n.packageName}:{},...n.updatedAt?{updated_at:n.updatedAt}:{}}}function od(n,e,t=i=>process.stdout.write(`${i}
139
+ `)){if(n.length===0){t("(no uploads found)");return}let i=Math.max(4,...n.map(r=>r.name.length)),o=Math.max(6,...n.map(r=>r.app_id.length));t(`${"NAME".padEnd(i)} ${"APP ID".padEnd(o)} UPDATED`);for(let r of n){let a=r.updated_at?r.updated_at.slice(0,10):"";t(`${r.name.padEnd(i)} ${r.app_id.padEnd(o)} ${a}`)}e>n.length&&t(""),e>n.length&&t(`${n.length} of ${e}`)}var id=50;function sd(n){return{resolveAuth:async()=>{let e=new de,t=n.profile??e.getActiveProfile()??"default",i=n.env??e.getDefaultEnv(),o=await Ai(t,i,n);if(!o.ok){let{message:r,exitCode:a}=Pi(t,i,o);return process.stderr.write(r),y(a,`${o.reason} for "${t}" [${i}]`),{ok:!1}}return{ok:!0,username:o.creds.username,accessKey:o.creds.access_key,env:i}},list:async({baseUrl:e,auth:t,type:i})=>new Xr(e,t).list({type:i,limit:id}),isAgent:()=>!process.stdin.isTTY||!process.stdout.isTTY,out:e=>process.stdout.write(`${e}
140
140
  `),err:e=>process.stderr.write(`${e}
141
- `),exit:(e,t)=>y(e,t)}}async function ad(n,e=sd(n)){let t=Ea(n.target);if("error"in t){e.err(`error: ${t.error}`),e.exit(2,`apps list: ${t.error}`);return}let i=await e.resolveAuth();if(i.ok)try{let o=await e.list({baseUrl:St(i.env),auth:{username:i.username,accessKey:i.accessKey},type:t.ok}),r=o.apps.map(rd);if(n.agent||e.isAgent()){for(let s of r)e.out(JSON.stringify(s));e.out(JSON.stringify({total:o.total}))}else od(r,o.total,e.out);e.exit(0,"apps list complete")}catch(o){e.err(`error: ${o instanceof Error?o.message:String(o)}`),e.exit(1,"apps list failed")}}function Ta(n){n.command("devices").description("List the emulators or simulators on this machine (TTY = table; non-TTY / --agent = NDJSON). The ID column is what --device and `config set-device` accept.").argument("<action>","'list'").option("--target <kind>","emulator | simulator (required)").option("--agent","Force NDJSON output (auto-on when stdin is not a TTY)").action(async(e,t)=>{if(e!=="list"){process.stderr.write(`error: unknown action "${e}" (try: list)
141
+ `),exit:(e,t)=>y(e,t)}}async function ad(n,e=sd(n)){let t=Ea(n.target);if("error"in t){e.err(`error: ${t.error}`),e.exit(2,`apps list: ${t.error}`);return}let i=await e.resolveAuth();if(i.ok)try{let o=await e.list({baseUrl:St(i.env),auth:{username:i.username,accessKey:i.accessKey},type:t.ok}),r=o.apps.map(rd);if(n.agent||e.isAgent()){for(let a of r)e.out(JSON.stringify(a));e.out(JSON.stringify({total:o.total}))}else od(r,o.total,e.out);e.exit(0,"apps list complete")}catch(o){e.err(`error: ${o instanceof Error?o.message:String(o)}`),e.exit(1,"apps list failed")}}function Ta(n){n.command("devices").description("List the emulators or simulators on this machine (TTY = table; non-TTY / --agent = NDJSON). The ID column is what --device and `config set-device` accept.").argument("<action>","'list'").option("--target <kind>","emulator | simulator (required)").option("--agent","Force NDJSON output (auto-on when stdin is not a TTY)").action(async(e,t)=>{if(e!=="list"){process.stderr.write(`error: unknown action "${e}" (try: list)
142
142
  `),y(2,`devices: unknown action "${e}"`);return}await nd(t)}),n.command("apps").description("List this account's uploaded builds for a device class (TTY = table; non-TTY / --agent = NDJSON). The APP ID column is what --app and `config set-app` accept.").argument("<action>","'list'").option("--target <kind>","emulator | simulator (required)").option("--profile <name>","Profile name (default: active)").option("--env <name>","Environment (prod or stage)").option("--username <user>","Basic auth username (skip stored creds)").option("--access-key <key>","Basic auth access key").option("--agent","Force NDJSON output (auto-on when stdin is not a TTY)").action(async(e,t)=>{if(e!=="list"){process.stderr.write(`error: unknown action "${e}" (try: list)
143
143
  `),y(2,`apps: unknown action "${e}"`);return}await ad(t)})}function dd(n={}){let e=n.hostSupportsMobile??Bt(),t=new tt;t.name("kane-cli").description("Kane-CLI \u2014 the validation layer for AI coding agents. Natural-language web and mobile-app automation, plus requirements-to-coverage assurance, called from your CLI or IDE.").version(Me).enablePositionalOptions().configureHelp({sortSubcommands:!0}).showHelpAfterError("(run `kane-cli --help` to see all commands; `-h` and `help` also work)").addHelpText("after",`
144
144
  Examples:
@@ -154,8 +154,8 @@ Test files:
154
154
 
155
155
  Docs https://www.testmuai.com/support/docs/kane-cli-introduction
156
156
  Bugs https://github.com/LambdaTest/kane-cli/issues
157
- `),t.on("command:*",o=>{t.error(`error: unknown command '${o[0]}'`,{exitCode:2,code:"commander.unknownCommand"})}),t.command("login").description("Authenticate (interactive; --oauth opens the browser, or --username/--access-key for basic auth)").option("--oauth","Login via OAuth (opens browser)").option("--username <user>","Basic auth username").option("--access-key <key>","Basic auth access key").addOption(new G("--env <name>","Environment (prod or stage)").default("prod").hideHelp()).option("--profile <name>","Profile name","default").option("--project-id <id>","Project ID (skip picker)").option("--folder-id <id>","Folder ID (skip picker)").addOption(new G("--model <name>","Model").default("v16-alpha").hideHelp()).option("--chrome-profile <path>","Chrome profile path").action(async o=>{let r=new de,s=new Ce,a=o.env,l=o.profile;if(!process.stdin.isTTY||o.oauth||o.username){if(r.setDefaultEnv(a),o.oauth)await new ao(l,a,r).login(),console.log(`Logged in as ${l} [${a}] via OAuth`);else if(o.username&&o.accessKey){try{let{validateBasicAuth:v}=await import("./validate-basic-D7IJUFUQ.js");await v(a,o.username,o.accessKey)}catch{console.error("Credentials not valid. Please use valid credentials."),y(1,"Invalid basic-auth credentials");return}r.saveBasicAuth(l,a,{username:o.username,access_key:o.accessKey}),console.log(`Logged in as ${l} [${a}] via basic auth`)}else console.error("Provide --oauth, or --username and --access-key"),y(1,"Missing --oauth or credentials for login");r.setActiveProfile(l),s.set("model",o.model),o.chromeProfile&&s.set("chrome_profile_path",o.chromeProfile);let h=null;if(o.username&&o.accessKey)h={username:o.username,access_key:o.accessKey};else try{let R=await je({creds:r,env:a,log:()=>{}});R.resolvedCreds&&(h={username:R.resolvedCreds.username,access_key:R.resolvedCreds.access_key})}catch{}if(o.projectId&&(et(r,s,l,a,{projectId:o.projectId}),console.log(`Project set to ${o.projectId}`)),o.folderId&&(et(r,s,l,a,{folderId:o.folderId}),console.log(`Folder set to ${o.folderId}`)),h&&(!o.projectId||!o.folderId))try{let v=await ro({creds:r,config:s,profile:l,env:a,tmsCreds:h,log:()=>{}});o.projectId||console.log(`Auto-selected project: ${v.projectName} (${v.projectId})`),o.folderId||console.log(`Auto-selected folder: ${v.folderName} (${v.folderId})`)}catch(v){console.warn(`Could not auto-select project/folder: ${v instanceof Error?v.message:v}`)}Kt(r,s,l,a),console.log("Setup complete."),y(0,"Setup complete")}let{SingleShotApp:u}=await import("./SingleShotApp-XWOPGLKZ.js"),{ScrollbackProvider:c}=await import("./scrollback-JLPJR25X.js"),{render:m}=await import("./build-JIKYOZUH.js"),p=await import("./react-QWOAB3TB.js"),g={current:null},d={current:!1},{waitUntilExit:w,unmount:_}=m(p.default.createElement(c,null,p.default.createElement(u,{resultRef:g,mode:"login",loginCompleteRef:d})),{exitOnCtrlC:!1});_t(()=>_()),await w();try{process.stdin.setRawMode?.(!1)}catch{}process.stdout.write("\x1B[?25h"),d.current&&console.log("Login setup complete."),process.exit(0)}),t.command("logout").description("Revoke tokens and delete the stored profile credentials").action(async()=>{let o=new de,r=o.getActiveProfile();if(!r){console.log("No active profile to logout");return}let s=o.getDefaultEnv(),a=await lo(o,r,s),l=new Ce;a.switchedTo?(Kt(o,l,a.switchedTo.profile,a.switchedTo.env),console.log(`Logged out ${a.profile} [${a.env}]. Switched to ${a.switchedTo.profile} [${a.switchedTo.env}]`)):(l.save({project_id:null,project_name:null,folder_id:null,folder_name:null}),console.log(`Logged out ${a.profile} [${a.env}]. No profiles remaining.`))}),t.command("whoami").description("Show the authenticated identity, active profile, and environment").option("--profile <name>","Profile name").action(async o=>{let r=new de,s=o.profile??r.getActiveProfile()??"default",a=r.getDefaultEnv(),l=r.loadCredentials(s,a),u=r.loadBasicAuth(s,a),c="none",m=u?.username,p,g,d,w;if(u?c="basic":l&&(c="oauth",g=new Date(l.expires_at*1e3).toISOString().slice(0,10)),c==="none")p="missing";else try{let I=await je({creds:r,env:a,log:()=>{}});if(I.resolvedCreds)d="verified",p="valid",m=I.resolvedCreds.username??m;else{let{classifyAuthFailure:f}=await import("./resolver-CBTWTZZR.js");f(I.resolver.lastError)==="auth"?(d="rejected",p="expired",w="Credentials rejected by the server \u2014 re-login or rotate your access key"):(d="unreachable",w=I.resolver.lastError?.message)}}catch(I){let f=I;f.code==="refresh_failed"?(d="rejected",p="expired",w="OAuth token refresh failed \u2014 run 'kane-cli login'"):f.code==="not_authenticated"?(c="none",p="missing"):(d="unreachable",w=f.message)}let{WhoamiView:_}=await import("./WhoamiView-WPHMNYUV.js"),{render:h}=await import("./build-JIKYOZUH.js"),v=await import("./react-QWOAB3TB.js"),{waitUntilExit:R}=h(v.default.createElement(_,{profile:s,env:a,authenticated:d==="verified",authMethod:c,username:m,tokenStatus:p,expiresAt:g,serverStatus:d,detail:w}));await R(),c==="none"?y(1,"whoami: not-authenticated"):d&&d!=="verified"&&y(d==="unreachable"?3:1,`whoami: ${d}`)}),t.command("config <action> [value]").description("Show or change settings ("+["show","set-target",...e?[...nr]:[],"set-mode","set-assertion-mode","set-network-ws","set-network-sse","set-bug-detection","set-final-validation","set-url","set-window","chrome-profile","project","folder","reset"].join(", ")+")").option("--agent","Force JSON output for `show` (auto-on when stdin is not a TTY)").action(async(o,r,s)=>{let a=new Ce,l=new de,u=as(o,{hostSupportsMobile:e,mobileMessage:Ht()});if(u){process.stderr.write(u.message),y(u.exitCode,`config ${o} unavailable off a mobile host`);return}if(o==="show"){let c=a.load(),m=l.getActiveProfile()??"default",p=l.getDefaultEnv(),g=l.loadProfileConfig(m,p)??{},d=g.project_id??c.project_id??null,w=g.project_name??c.project_name??null,_=g.folder_id??c.folder_id??null,h=g.folder_name??c.folder_name??null,v=l.loadBasicAuth(m,p),R=l.loadCredentials(m,p),I=v?`basic (${v.username})`:R?"oauth":"not configured",{resolveSessionTarget:f}=await import("./session-target-UWROGOCY.js"),S=f(c.mobile?.tui_target,c.mobile?.default_target?.kind),k=S.kind==="unset"?"desktop":S.kind==="choose-mobile"?"mobile (legacy \u2014 run `kane-cli config set-target emulator|simulator`)":S.kind;if(!!s?.agent||!process.stdin.isTTY||!process.stdout.isTTY){let oe=se(p);process.stdout.write(`${JSON.stringify({profile:m,env:p,auth:I,project_id:d,project_name:w,folder_id:_,folder_name:h,model:c.model,mode:c.mode,assertion_mode:c.assertion_mode,network_ws:c.network_ws,network_sse:c.network_sse,bug_detection:c.bug_detection,final_validation:c.final_validation,window_size:`${c.window_size.width}x${c.window_size.height}`,chrome_profile:c.chrome_profile_path,default_url:c.default_url??Cn,target:k,device:c.mobile?.default_target?.id??null,app:c.mobile?.default_app??null,controller_base_url:oe.controllerBaseUrl,tms_base_url:oe.tmsBaseUrl})}
158
- `),y(0,"config show complete");return}let{ConfigView:L}=await import("./ConfigView-OECNNCXC.js"),{render:x}=await import("./build-JIKYOZUH.js"),D=await import("./react-QWOAB3TB.js"),{waitUntilExit:U}=x(D.default.createElement(L,{model:c.model,authLabel:I,profile:m,env:p,defaultUrl:c.default_url??Cn,projectId:d,projectName:w,folderId:_,folderName:h,windowSize:`${c.window_size.width}x${c.window_size.height}`,chromeProfile:c.chrome_profile_path,target:k,deviceLabel:c.mobile?.default_target?.id??null,appLabel:c.mobile?.default_app??null}));await U()}else if(o==="set-window"&&r){let c=r.split("x").map(Number),[m,p]=c;!m||!p||!Number.isInteger(m)||!Number.isInteger(p)?console.error("Invalid format. Use: kane-cli config set-window WIDTHxHEIGHT"):m<800||m>3840?console.error(`Width must be between 800 and 3840 (got ${m})`):p<600||p>2160?console.error(`Height must be between 600 and 2160 (got ${p})`):(a.set("window_size",{width:m,height:p}),console.log(`Window size set to ${m}x${p}`))}else if(o==="set-mode"){if(r!=="action"&&r!=="testing"){console.error("Mode must be 'action' or 'testing'."),y(1,"Invalid mode");return}a.set("mode",r),console.log(`Mode set to ${r}`)}else if(o==="set-assertion-mode"){if(r!=="visual"&&r!=="dom"){console.error("Assertion mode must be 'visual' or 'dom'."),y(1,"Invalid assertion-mode");return}a.set("assertion_mode",r),console.log(`Assertion mode set to ${r}`)}else if(o==="set-network-ws"){if(r!=="on"&&r!=="off"){console.error("WebSocket capture must be 'on' or 'off'."),y(1,"Invalid network-ws value");return}a.set("network_ws",r==="on"),console.log(`WebSocket capture set to ${r}`)}else if(o==="set-network-sse"){if(r!=="on"&&r!=="off"){console.error("SSE capture must be 'on' or 'off'."),y(1,"Invalid network-sse value");return}a.set("network_sse",r==="on"),console.log(`SSE capture set to ${r}`)}else if(o==="set-bug-detection"){if(r!=="off"&&r!=="stop"&&r!=="continue"){console.error("Bug detection must be 'off', 'stop' or 'continue'."),y(1,"Invalid bug-detection value");return}a.set("bug_detection",r),console.log(`Bug detection set to ${r}`)}else if(o==="set-final-validation"){if(r!=="on"&&r!=="off"){console.error("Final validation must be 'on' or 'off'."),y(1,"Invalid final-validation value");return}a.set("final_validation",r==="on"),console.log(`Final validation set to ${r}`)}else if(o==="set-target"){if(r!=="desktop"&&r!=="emulator"&&r!=="simulator"){console.error("Target must be 'desktop', 'emulator' or 'simulator'."),y(1,"Invalid target");return}if(r!=="desktop"){let{mobileHostSupport:c}=await import("./host-7GZPBA74.js"),m=c();if(!m.supported){console.error(m.reason),y(1,"unsupported host for mobile target");return}}a.setMobile(r==="desktop"?{tui_target:r,default_target:void 0,default_app:void 0}:{tui_target:r}),console.log(`Target set to ${r}`)}else if(o==="set-device"){if(!r){console.error('Usage: kane-cli config set-device "<name | serial | udid>"'),y(1,"Missing device");return}let{resolveSessionTarget:c,platformOf:m}=await import("./session-target-UWROGOCY.js"),p=a.load().mobile,g=c(p?.tui_target,p?.default_target?.kind),d=g.kind==="emulator"||g.kind==="simulator"?g.kind:null;if(!d){console.error("Set a mobile target first: kane-cli config set-target emulator|simulator"),y(1,"no mobile target for set-device");return}let{resolveTarget:w}=await import("./registry-BKV3EDTK.js"),_;try{_=await w({device:r,platform:m(d),interactive:!1})}catch(E){console.error(E instanceof Error?E.message:String(E)),console.error(`Run \`kane-cli doctor --target ${d}\` to check the mobile toolchain.`),y(1,"device discovery failed");return}if(!_.ok){console.error(_.message),y(1,"device not found");return}let h=_.target;if(h.kind!==d){console.error(`${h.displayName} is a ${h.kind}, but the session target is ${d}.`),y(1,"device kind mismatch");return}let{toAppSpec:v}=await import("./prepare-target-27UN4KNO.js"),{appSuitsTarget:R}=await import("./resolve-run-intent-ZML3HKG7.js"),I=p?.default_app,f=I?v(I):null,S=!!I&&(!f||!R(f,d)),{stableTargetId:k}=await import("./types-VYEOJ6U2.js");a.setMobile({default_target:{platform:h.platform,kind:h.kind,id:k(h)},...S?{default_app:void 0}:{}}),console.log(`Device set to ${h.displayName} (${h.platform} \xB7 ${h.kind})`),S&&console.log(`Saved app ${I} does not suit a ${d} \u2014 cleared. Set one: kane-cli config set-app`)}else if(o==="set-app"){if(!r){console.error("Usage: kane-cli config set-app </path/to/build | APPid>"),y(1,"Missing app");return}let{resolveSessionTarget:c}=await import("./session-target-UWROGOCY.js"),m=a.load().mobile,p=c(m?.tui_target,m?.default_target?.kind),g=p.kind==="emulator"||p.kind==="simulator"?p.kind:null;if(!g){console.error("Set a mobile target first: kane-cli config set-target emulator|simulator"),y(1,"no mobile target for set-app");return}if(m?.default_target?.kind!==g){console.error('Set a device first: kane-cli config set-device "<name>"'),y(1,"no device for set-app");return}let{toAppSpec:d,PACKAGE_ID_REJECTED:w}=await import("./prepare-target-27UN4KNO.js"),{appSuitsTarget:_}=await import("./resolve-run-intent-ZML3HKG7.js"),h=d(r);if(!h){console.error(`${r}: ${w}`),y(1,"not an installable app");return}if(!_(h,g)){console.error(g==="emulator"?`${r} cannot run on an emulator (needs an .apk, or an APP\u2026 id).`:`${r} cannot run on a simulator (needs a .zip of the .app bundle, or an APP\u2026 id).`),y(1,"app does not suit target");return}if(h.kind!=="app_id"){let{access:v}=await import("fs/promises");if(!await v(h.value).then(()=>!0,()=>!1)){console.error(`${h.value} is not there.`),y(1,"app build missing");return}}a.setMobile({default_app:h.value}),console.log(`App set to ${h.value}`)}else if(o==="set-url"){if(!r){console.error("Usage: kane-cli config set-url <url>"),y(1,"Missing URL");return}let c=Uo(r);if(!c){console.error(`Invalid URL: ${r}`),y(1,"Invalid URL");return}a.set("default_url",c),console.log(`Default URL set to ${c}`)}else if(o==="chrome-profile"){if(r||!process.stdin.isTTY){r||(console.error("Usage: kane-cli config chrome-profile <path>"),y(1,"Missing chrome-profile path")),a.set("chrome_profile_path",r),console.log(`Chrome profile set to ${r}`);return}let{ChromeProfilePicker:c}=await import("./ChromeProfilePicker-5ILSVC2K.js"),{render:m}=await import("./build-JIKYOZUH.js"),p=await import("./react-QWOAB3TB.js");await new Promise(g=>{let{unmount:d}=m(p.default.createElement(c,{currentPath:a.load().chrome_profile_path,onSelect:w=>{a.set("chrome_profile_path",w),console.log(`Chrome profile set to ${w}`),d(),g()},onCancel:()=>{d(),g()}}))})}else if(o==="project"){if(r||!process.stdin.isTTY){r||(console.error("Usage: kane-cli config project <project-id>"),y(1,"Missing project ID"));let f=l.getActiveProfile()??"default",S=l.getDefaultEnv();et(l,a,f,S,{projectId:r}),console.log(`Project set to ${r}`);return}let c=l.getDefaultEnv(),m=se(c),p=l.getActiveProfile()??"default",{resolveTmsBasicAuth:g,formatAuthResolutionError:d}=await import("./list-commands-2SVSEAP6.js"),w=await g(p,c,{});if(!w.ok){let{message:f}=d(p,c,w);process.stderr.write(f),y(2,`${w.reason} for "${p}" [${c}]`);return}let{ProjectPicker:_}=await import("./ProjectPicker-PP75ILZU.js"),{AuthResolver:h}=await import("./resolver-CBTWTZZR.js"),{render:v}=await import("./build-JIKYOZUH.js"),R=await import("./react-QWOAB3TB.js"),I=new h(m.controllerBaseUrl,async()=>null,{username:w.creds.username,access_key:w.creds.access_key});await I.resolve(),await new Promise(f=>{let{unmount:S}=v(R.default.createElement(_,{resolver:I,currentProjectId:a.load().project_id,env:c,onSelect:(k,E)=>{let L=l.getActiveProfile()??"default",x=l.getDefaultEnv();et(l,a,L,x,{projectId:k,projectName:E}),console.log(`Project set to ${E} (${k})`),S(),f()},onCancel:()=>{S(),f()}}))})}else if(o==="folder"){if(r||!process.stdin.isTTY){if(r||(console.error("Usage: kane-cli config folder <folder-id>"),y(1,"Missing folder ID")),!a.load().project_id){console.log("Select a project first: kane-cli config project <id>");return}let k=l.getActiveProfile()??"default",E=l.getDefaultEnv();et(l,a,k,E,{folderId:r}),console.log(`Folder set to ${r}`);return}let c=a.load();if(!c.project_id){console.log("Select a project first: kane-cli config project");return}let m=l.getDefaultEnv(),p=se(m),g=l.getActiveProfile()??"default",{resolveTmsBasicAuth:d,formatAuthResolutionError:w}=await import("./list-commands-2SVSEAP6.js"),_=await d(g,m,{});if(!_.ok){let{message:S}=w(g,m,_);process.stderr.write(S),y(2,`${_.reason} for "${g}" [${m}]`);return}let{FolderPicker:h}=await import("./FolderPicker-5U3RHHBE.js"),{AuthResolver:v}=await import("./resolver-CBTWTZZR.js"),{render:R}=await import("./build-JIKYOZUH.js"),I=await import("./react-QWOAB3TB.js"),f=new v(p.controllerBaseUrl,async()=>null,{username:_.creds.username,access_key:_.creds.access_key});await f.resolve(),await new Promise(S=>{let{unmount:k}=R(I.default.createElement(h,{resolver:f,projectId:c.project_id,currentFolderId:c.folder_id,env:m,onSelect:(E,L)=>{let x=l.getActiveProfile()??"default",D=l.getDefaultEnv();et(l,a,x,D,{folderId:E,folderName:L}),console.log(`Folder set to ${L} (${E})`),k(),S()},onCancel:()=>{k(),S()}}))})}else console.log(`Usage: kane-cli config show|set-target|${e?"set-device|set-app|":""}set-url|set-window|set-mode|set-assertion-mode|set-network-ws|set-network-sse|set-bug-detection|set-final-validation|chrome-profile|project|folder`)});let i=t.command("run").description("Run a browser or mobile objective (inline natural-language string)").argument("<objective>","Test objective (use {{var}} to reference variables)").option("--headless","Run Chrome in headless mode").option("--max-steps <n>","Maximum agent steps","50").option("--timeout <seconds>","Kill run after N seconds").option("--url <url>","Start URL for the run").option("--cdp-endpoint <url>","Connect to existing Chrome CDP endpoint").option("--ws-endpoint <url>","Connect via Playwright WebSocket (e.g. LambdaTest wss:// URL)").option("--global-context <file>",`Override global context markdown (default: ${Pe(J,"global-memory.md")})`).option("--local-context <file>","Override local context markdown (default: .testmuai/context.md in cwd)").addOption(new G("--model <name>","Model override").hideHelp()).option("--variables <json>",`Inline variables JSON, e.g. '{"user": {"value": "alice"}}'`).option("--variables-file <path>","Load variables from a JSON file").option("--session-context <json>","Session context JSON (prior runs)").addOption(new G("--cft","Use Playwright Chromium instead of managed Chrome").hideHelp()).option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key (skip OAuth)").option("--env <name>","Environment (prod or stage)").option("--mode <name>","Run mode: 'action' (strict \u2014 hard-stop on auth/blocked/error) or 'testing' (lenient \u2014 fall through). Overrides config; default: testing.").option("--assertion-mode <mode>","Assertion mode: 'dom' (default \u2014 DOM-based extraction & assertions, vision fallback) or 'visual' (vision model only). Overrides config.").option("--final-validation <on|off>","Final validation: append the system cp_final checkpoint verifying the objective as a whole. Overrides config (default: off).").option("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").option("--network-ws","Capture WebSocket frames for assertions/extraction (experimental)").option("--network-sse","Capture Server-Sent Events messages (Chromium-only) for assertions/extraction (experimental)").option("--bug-detection <mode>","Detect product bugs while authoring: off|stop|continue (stop halts the run on a confirmed bug; continue records it and keeps going). Overrides `config set-bug-detection`.",o=>{if(o!=="off"&&o!=="stop"&&o!=="continue")throw new Error("--bug-detection must be off, stop or continue");return o}).addOption(new G("--local","Skip TMS integration (no uploads, no variables/secrets push)").hideHelp()).option("--allow-missing-url","Non-TTY only: proceed from the browser's current page instead of failing when no start URL resolves (a provided --url is still used)").option("--code-export","Generate code export after upload").option("--code-language <lang>","Code export language: python (default) | javascript").option("--name <name>","Persist the session under this name (validated [a-zA-Z0-9_-]+)").option("--chrome-profile <path>","Chrome user-data-dir for this run (overrides stored config)").option("--target <name>","Where to run: desktop | emulator | simulator (default: the saved session target)");return e&&i.option("--device <id>","Which device, when the target is mobile: name, serial, ip:port, or UDID").option("--app <path|APPid>","App under test, when the target is mobile: a build (.apk / .zip of the .app) or an APP\u2026 id from your uploads"),i.addOption(new G("--appium-url <url>","Appium server URL override (default: runner-managed local server)").hideHelp()).option("--skip-code-validation","Skip post-codegen worker-side validation").option("--no-skip-code-validation","Force post-codegen worker-side validation").addHelpText("after",`
157
+ `),t.on("command:*",o=>{t.error(`error: unknown command '${o[0]}'`,{exitCode:2,code:"commander.unknownCommand"})}),t.command("login").description("Authenticate (interactive; --oauth opens the browser, or --username/--access-key for basic auth)").option("--oauth","Login via OAuth (opens browser)").option("--username <user>","Basic auth username").option("--access-key <key>","Basic auth access key").addOption(new G("--env <name>","Environment (prod or stage)").default("prod").hideHelp()).option("--profile <name>","Profile name","default").option("--project-id <id>","Project ID (skip picker)").option("--folder-id <id>","Folder ID (skip picker)").addOption(new G("--model <name>","Model").default("v16-alpha").hideHelp()).option("--chrome-profile <path>","Chrome profile path").action(async o=>{let r=new de,a=new Ce,s=o.env,l=o.profile;if(!process.stdin.isTTY||o.oauth||o.username){if(r.setDefaultEnv(s),o.oauth)await new ao(l,s,r).login(),console.log(`Logged in as ${l} [${s}] via OAuth`);else if(o.username&&o.accessKey){try{let{validateBasicAuth:v}=await import("./validate-basic-727KRHX6.js");await v(s,o.username,o.accessKey)}catch{console.error("Credentials not valid. Please use valid credentials."),y(1,"Invalid basic-auth credentials");return}r.saveBasicAuth(l,s,{username:o.username,access_key:o.accessKey}),console.log(`Logged in as ${l} [${s}] via basic auth`)}else console.error("Provide --oauth, or --username and --access-key"),y(1,"Missing --oauth or credentials for login");r.setActiveProfile(l),a.set("model",o.model),o.chromeProfile&&a.set("chrome_profile_path",o.chromeProfile);let h=null;if(o.username&&o.accessKey)h={username:o.username,access_key:o.accessKey};else try{let R=await je({creds:r,env:s,log:()=>{}});R.resolvedCreds&&(h={username:R.resolvedCreds.username,access_key:R.resolvedCreds.access_key})}catch{}if(o.projectId&&(et(r,a,l,s,{projectId:o.projectId}),console.log(`Project set to ${o.projectId}`)),o.folderId&&(et(r,a,l,s,{folderId:o.folderId}),console.log(`Folder set to ${o.folderId}`)),h&&(!o.projectId||!o.folderId))try{let v=await ro({creds:r,config:a,profile:l,env:s,tmsCreds:h,log:()=>{}});o.projectId||console.log(`Auto-selected project: ${v.projectName} (${v.projectId})`),o.folderId||console.log(`Auto-selected folder: ${v.folderName} (${v.folderId})`)}catch(v){console.warn(`Could not auto-select project/folder: ${v instanceof Error?v.message:v}`)}Kt(r,a,l,s),console.log("Setup complete."),y(0,"Setup complete")}let{SingleShotApp:u}=await import("./SingleShotApp-AY3XFEYT.js"),{ScrollbackProvider:c}=await import("./scrollback-JLPJR25X.js"),{render:m}=await import("./build-JIKYOZUH.js"),p=await import("./react-QWOAB3TB.js"),g={current:null},d={current:!1},{waitUntilExit:w,unmount:_}=m(p.default.createElement(c,null,p.default.createElement(u,{resultRef:g,mode:"login",loginCompleteRef:d})),{exitOnCtrlC:!1});_t(()=>_()),await w();try{process.stdin.setRawMode?.(!1)}catch{}process.stdout.write("\x1B[?25h"),d.current&&console.log("Login setup complete."),process.exit(0)}),t.command("logout").description("Revoke tokens and delete the stored profile credentials").action(async()=>{let o=new de,r=o.getActiveProfile();if(!r){console.log("No active profile to logout");return}let a=o.getDefaultEnv(),s=await lo(o,r,a),l=new Ce;s.switchedTo?(Kt(o,l,s.switchedTo.profile,s.switchedTo.env),console.log(`Logged out ${s.profile} [${s.env}]. Switched to ${s.switchedTo.profile} [${s.switchedTo.env}]`)):(l.save({project_id:null,project_name:null,folder_id:null,folder_name:null}),console.log(`Logged out ${s.profile} [${s.env}]. No profiles remaining.`))}),t.command("whoami").description("Show the authenticated identity, active profile, and environment").option("--profile <name>","Profile name").action(async o=>{let r=new de,a=o.profile??r.getActiveProfile()??"default",s=r.getDefaultEnv(),l=r.loadCredentials(a,s),u=r.loadBasicAuth(a,s),c="none",m=u?.username,p,g,d,w;if(u?c="basic":l&&(c="oauth",g=new Date(l.expires_at*1e3).toISOString().slice(0,10)),c==="none")p="missing";else try{let I=await je({creds:r,env:s,log:()=>{}});if(I.resolvedCreds)d="verified",p="valid",m=I.resolvedCreds.username??m;else{let{classifyAuthFailure:f}=await import("./resolver-V5VP5FLT.js");f(I.resolver.lastError)==="auth"?(d="rejected",p="expired",w="Credentials rejected by the server \u2014 re-login or rotate your access key"):(d="unreachable",w=I.resolver.lastError?.message)}}catch(I){let f=I;f.code==="refresh_failed"?(d="rejected",p="expired",w="OAuth token refresh failed \u2014 run 'kane-cli login'"):f.code==="not_authenticated"?(c="none",p="missing"):(d="unreachable",w=f.message)}let{WhoamiView:_}=await import("./WhoamiView-EB5AV27X.js"),{render:h}=await import("./build-JIKYOZUH.js"),v=await import("./react-QWOAB3TB.js"),{waitUntilExit:R}=h(v.default.createElement(_,{profile:a,env:s,authenticated:d==="verified",authMethod:c,username:m,tokenStatus:p,expiresAt:g,serverStatus:d,detail:w}));await R(),c==="none"?y(1,"whoami: not-authenticated"):d&&d!=="verified"&&y(d==="unreachable"?3:1,`whoami: ${d}`)}),t.command("config <action> [value]").description("Show or change settings ("+["show","set-target",...e?[...nr]:[],"set-mode","set-assertion-mode","set-network-ws","set-network-sse","set-bug-detection","set-final-validation","set-url","set-window","chrome-profile","project","folder","reset"].join(", ")+")").option("--agent","Force JSON output for `show` (auto-on when stdin is not a TTY)").action(async(o,r,a)=>{let s=new Ce,l=new de,u=as(o,{hostSupportsMobile:e,mobileMessage:Ht()});if(u){process.stderr.write(u.message),y(u.exitCode,`config ${o} unavailable off a mobile host`);return}if(o==="show"){let c=s.load(),m=l.getActiveProfile()??"default",p=l.getDefaultEnv(),g=l.loadProfileConfig(m,p)??{},d=g.project_id??c.project_id??null,w=g.project_name??c.project_name??null,_=g.folder_id??c.folder_id??null,h=g.folder_name??c.folder_name??null,v=l.loadBasicAuth(m,p),R=l.loadCredentials(m,p),I=v?`basic (${v.username})`:R?"oauth":"not configured",{resolveSessionTarget:f}=await import("./session-target-UWROGOCY.js"),S=f(c.mobile?.tui_target,c.mobile?.default_target?.kind),k=S.kind==="unset"?"desktop":S.kind==="choose-mobile"?"mobile (legacy \u2014 run `kane-cli config set-target emulator|simulator`)":S.kind;if(!!a?.agent||!process.stdin.isTTY||!process.stdout.isTTY){let oe=se(p);process.stdout.write(`${JSON.stringify({profile:m,env:p,auth:I,project_id:d,project_name:w,folder_id:_,folder_name:h,model:c.model,mode:c.mode,assertion_mode:c.assertion_mode,network_ws:c.network_ws,network_sse:c.network_sse,bug_detection:c.bug_detection,final_validation:c.final_validation,window_size:`${c.window_size.width}x${c.window_size.height}`,chrome_profile:c.chrome_profile_path,default_url:c.default_url??Cn,target:k,device:c.mobile?.default_target?.id??null,app:c.mobile?.default_app??null,auto_grant_permissions:c.mobile?.auto_grant_permissions??!0,auto_accept_alerts:c.mobile?.auto_accept_alerts??!0,controller_base_url:oe.controllerBaseUrl,tms_base_url:oe.tmsBaseUrl})}
158
+ `),y(0,"config show complete");return}let{ConfigView:L}=await import("./ConfigView-EOYCKYJS.js"),{render:x}=await import("./build-JIKYOZUH.js"),O=await import("./react-QWOAB3TB.js"),{waitUntilExit:U}=x(O.default.createElement(L,{model:c.model,authLabel:I,profile:m,env:p,defaultUrl:c.default_url??Cn,projectId:d,projectName:w,folderId:_,folderName:h,windowSize:`${c.window_size.width}x${c.window_size.height}`,chromeProfile:c.chrome_profile_path,target:k,deviceLabel:c.mobile?.default_target?.id??null,appLabel:c.mobile?.default_app??null}));await U()}else if(o==="set-window"&&r){let c=r.split("x").map(Number),[m,p]=c;!m||!p||!Number.isInteger(m)||!Number.isInteger(p)?console.error("Invalid format. Use: kane-cli config set-window WIDTHxHEIGHT"):m<800||m>3840?console.error(`Width must be between 800 and 3840 (got ${m})`):p<600||p>2160?console.error(`Height must be between 600 and 2160 (got ${p})`):(s.set("window_size",{width:m,height:p}),console.log(`Window size set to ${m}x${p}`))}else if(o==="set-mode"){if(r!=="action"&&r!=="testing"){console.error("Mode must be 'action' or 'testing'."),y(1,"Invalid mode");return}s.set("mode",r),console.log(`Mode set to ${r}`)}else if(o==="set-assertion-mode"){if(r!=="visual"&&r!=="dom"){console.error("Assertion mode must be 'visual' or 'dom'."),y(1,"Invalid assertion-mode");return}s.set("assertion_mode",r),console.log(`Assertion mode set to ${r}`)}else if(o==="set-network-ws"){if(r!=="on"&&r!=="off"){console.error("WebSocket capture must be 'on' or 'off'."),y(1,"Invalid network-ws value");return}s.set("network_ws",r==="on"),console.log(`WebSocket capture set to ${r}`)}else if(o==="set-network-sse"){if(r!=="on"&&r!=="off"){console.error("SSE capture must be 'on' or 'off'."),y(1,"Invalid network-sse value");return}s.set("network_sse",r==="on"),console.log(`SSE capture set to ${r}`)}else if(o==="set-bug-detection"){if(r!=="off"&&r!=="stop"&&r!=="continue"){console.error("Bug detection must be 'off', 'stop' or 'continue'."),y(1,"Invalid bug-detection value");return}s.set("bug_detection",r),console.log(`Bug detection set to ${r}`)}else if(o==="set-final-validation"){if(r!=="on"&&r!=="off"){console.error("Final validation must be 'on' or 'off'."),y(1,"Invalid final-validation value");return}s.set("final_validation",r==="on"),console.log(`Final validation set to ${r}`)}else if(o==="set-target"){if(r!=="desktop"&&r!=="emulator"&&r!=="simulator"){console.error("Target must be 'desktop', 'emulator' or 'simulator'."),y(1,"Invalid target");return}if(r!=="desktop"){let{mobileHostSupport:c}=await import("./host-7GZPBA74.js"),m=c();if(!m.supported){console.error(m.reason),y(1,"unsupported host for mobile target");return}}s.setMobile(r==="desktop"?{tui_target:r,default_target:void 0,default_app:void 0}:{tui_target:r}),console.log(`Target set to ${r}`)}else if(o==="set-device"){if(!r){console.error('Usage: kane-cli config set-device "<name | serial | udid>"'),y(1,"Missing device");return}let{resolveSessionTarget:c,platformOf:m}=await import("./session-target-UWROGOCY.js"),p=s.load().mobile,g=c(p?.tui_target,p?.default_target?.kind),d=g.kind==="emulator"||g.kind==="simulator"?g.kind:null;if(!d){console.error("Set a mobile target first: kane-cli config set-target emulator|simulator"),y(1,"no mobile target for set-device");return}let{resolveTarget:w}=await import("./registry-V45ZQ6Q5.js"),_;try{_=await w({device:r,platform:m(d),interactive:!1})}catch(E){console.error(E instanceof Error?E.message:String(E)),console.error(`Run \`kane-cli doctor --target ${d}\` to check the mobile toolchain.`),y(1,"device discovery failed");return}if(!_.ok){console.error(_.message),y(1,"device not found");return}let h=_.target;if(h.kind!==d){console.error(`${h.displayName} is a ${h.kind}, but the session target is ${d}.`),y(1,"device kind mismatch");return}let{toAppSpec:v}=await import("./prepare-target-YK2DLDWB.js"),{appSuitsTarget:R}=await import("./resolve-run-intent-W32G6WM6.js"),I=p?.default_app,f=I?v(I):null,S=!!I&&(!f||!R(f,d)),{stableTargetId:k}=await import("./types-O23GN2YM.js");s.setMobile({default_target:{platform:h.platform,kind:h.kind,id:k(h)},...S?{default_app:void 0}:{}}),console.log(`Device set to ${h.displayName} (${h.platform} \xB7 ${h.kind})`),S&&console.log(`Saved app ${I} does not suit a ${d} \u2014 cleared. Set one: kane-cli config set-app`)}else if(o==="set-app"){if(!r){console.error("Usage: kane-cli config set-app </path/to/build | APPid>"),y(1,"Missing app");return}let{resolveSessionTarget:c}=await import("./session-target-UWROGOCY.js"),m=s.load().mobile,p=c(m?.tui_target,m?.default_target?.kind),g=p.kind==="emulator"||p.kind==="simulator"?p.kind:null;if(!g){console.error("Set a mobile target first: kane-cli config set-target emulator|simulator"),y(1,"no mobile target for set-app");return}if(m?.default_target?.kind!==g){console.error('Set a device first: kane-cli config set-device "<name>"'),y(1,"no device for set-app");return}let{toAppSpec:d,PACKAGE_ID_REJECTED:w}=await import("./prepare-target-YK2DLDWB.js"),{appSuitsTarget:_}=await import("./resolve-run-intent-W32G6WM6.js"),h=d(r);if(!h){console.error(`${r}: ${w}`),y(1,"not an installable app");return}if(!_(h,g)){console.error(g==="emulator"?`${r} cannot run on an emulator (needs an .apk, or an APP\u2026 id).`:`${r} cannot run on a simulator (needs a .zip of the .app bundle, or an APP\u2026 id).`),y(1,"app does not suit target");return}if(h.kind!=="app_id"){let{access:v}=await import("fs/promises");if(!await v(h.value).then(()=>!0,()=>!1)){console.error(`${h.value} is not there.`),y(1,"app build missing");return}}s.setMobile({default_app:h.value}),console.log(`App set to ${h.value}`)}else if(o==="set-auto-grant-permissions"||o==="set-auto-accept-alerts"){let c=o==="set-auto-grant-permissions"?{label:"Auto grant permissions",kind:"emulator",key:"auto_grant_permissions"}:{label:"Auto accept alerts",kind:"simulator",key:"auto_accept_alerts"};if(r!=="on"&&r!=="off"){console.error(`Usage: kane-cli config ${o} on|off`),y(1,`Invalid ${o} value`);return}let{resolveSessionTarget:m}=await import("./session-target-UWROGOCY.js"),p=s.load().mobile,g=m(p?.tui_target,p?.default_target?.kind);if(g.kind!=="emulator"&&g.kind!=="simulator"){console.error(`Set a mobile target first: kane-cli config set-target ${c.kind}`),y(1,`no mobile target for ${o}`);return}if(g.kind!==c.kind){console.error(`${c.label} applies to ${c.kind} sessions only \u2014 your target is ${g.kind}. Switch with: kane-cli config set-target ${c.kind}`),y(1,`${o} does not apply to ${g.kind}`);return}s.setMobile({[c.key]:r==="on"}),console.log(`${c.label} set to ${r}`)}else if(o==="set-url"){if(!r){console.error("Usage: kane-cli config set-url <url>"),y(1,"Missing URL");return}let c=Uo(r);if(!c){console.error(`Invalid URL: ${r}`),y(1,"Invalid URL");return}s.set("default_url",c),console.log(`Default URL set to ${c}`)}else if(o==="chrome-profile"){if(r||!process.stdin.isTTY){r||(console.error("Usage: kane-cli config chrome-profile <path>"),y(1,"Missing chrome-profile path")),s.set("chrome_profile_path",r),console.log(`Chrome profile set to ${r}`);return}let{ChromeProfilePicker:c}=await import("./ChromeProfilePicker-7DTJK2QW.js"),{render:m}=await import("./build-JIKYOZUH.js"),p=await import("./react-QWOAB3TB.js");await new Promise(g=>{let{unmount:d}=m(p.default.createElement(c,{currentPath:s.load().chrome_profile_path,onSelect:w=>{s.set("chrome_profile_path",w),console.log(`Chrome profile set to ${w}`),d(),g()},onCancel:()=>{d(),g()}}))})}else if(o==="project"){if(r||!process.stdin.isTTY){r||(console.error("Usage: kane-cli config project <project-id>"),y(1,"Missing project ID"));let f=l.getActiveProfile()??"default",S=l.getDefaultEnv();et(l,s,f,S,{projectId:r}),console.log(`Project set to ${r}`);return}let c=l.getDefaultEnv(),m=se(c),p=l.getActiveProfile()??"default",{resolveTmsBasicAuth:g,formatAuthResolutionError:d}=await import("./list-commands-DA4ZXOPJ.js"),w=await g(p,c,{});if(!w.ok){let{message:f}=d(p,c,w);process.stderr.write(f),y(2,`${w.reason} for "${p}" [${c}]`);return}let{ProjectPicker:_}=await import("./ProjectPicker-F6JGF2B3.js"),{AuthResolver:h}=await import("./resolver-V5VP5FLT.js"),{render:v}=await import("./build-JIKYOZUH.js"),R=await import("./react-QWOAB3TB.js"),I=new h(m.controllerBaseUrl,async()=>null,{username:w.creds.username,access_key:w.creds.access_key});await I.resolve(),await new Promise(f=>{let{unmount:S}=v(R.default.createElement(_,{resolver:I,currentProjectId:s.load().project_id,env:c,onSelect:(k,E)=>{let L=l.getActiveProfile()??"default",x=l.getDefaultEnv();et(l,s,L,x,{projectId:k,projectName:E}),console.log(`Project set to ${E} (${k})`),S(),f()},onCancel:()=>{S(),f()}}))})}else if(o==="folder"){if(r||!process.stdin.isTTY){if(r||(console.error("Usage: kane-cli config folder <folder-id>"),y(1,"Missing folder ID")),!s.load().project_id){console.log("Select a project first: kane-cli config project <id>");return}let k=l.getActiveProfile()??"default",E=l.getDefaultEnv();et(l,s,k,E,{folderId:r}),console.log(`Folder set to ${r}`);return}let c=s.load();if(!c.project_id){console.log("Select a project first: kane-cli config project");return}let m=l.getDefaultEnv(),p=se(m),g=l.getActiveProfile()??"default",{resolveTmsBasicAuth:d,formatAuthResolutionError:w}=await import("./list-commands-DA4ZXOPJ.js"),_=await d(g,m,{});if(!_.ok){let{message:S}=w(g,m,_);process.stderr.write(S),y(2,`${_.reason} for "${g}" [${m}]`);return}let{FolderPicker:h}=await import("./FolderPicker-RCHRYYC4.js"),{AuthResolver:v}=await import("./resolver-V5VP5FLT.js"),{render:R}=await import("./build-JIKYOZUH.js"),I=await import("./react-QWOAB3TB.js"),f=new v(p.controllerBaseUrl,async()=>null,{username:_.creds.username,access_key:_.creds.access_key});await f.resolve(),await new Promise(S=>{let{unmount:k}=R(I.default.createElement(h,{resolver:f,projectId:c.project_id,currentFolderId:c.folder_id,env:m,onSelect:(E,L)=>{let x=l.getActiveProfile()??"default",O=l.getDefaultEnv();et(l,s,x,O,{folderId:E,folderName:L}),console.log(`Folder set to ${L} (${E})`),k(),S()},onCancel:()=>{k(),S()}}))})}else console.log(`Usage: kane-cli config show|set-target|${e?"set-device|set-app|":""}set-url|set-window|set-mode|set-assertion-mode|set-network-ws|set-network-sse|set-bug-detection|set-final-validation|chrome-profile|project|folder`)});let i=t.command("run").description("Run a browser or mobile objective (inline natural-language string)").argument("<objective>","Test objective (use {{var}} to reference variables)").option("--headless","Run Chrome in headless mode").option("--max-steps <n>","Maximum agent steps","50").option("--timeout <seconds>","Kill run after N seconds").option("--url <url>","Start URL for the run").option("--cdp-endpoint <url>","Connect to existing Chrome CDP endpoint").option("--ws-endpoint <url>","Connect via Playwright WebSocket (e.g. LambdaTest wss:// URL)").option("--global-context <file>",`Override global context markdown (default: ${Pe(J,"global-memory.md")})`).option("--local-context <file>","Override local context markdown (default: .testmuai/context.md in cwd)").addOption(new G("--model <name>","Model override").hideHelp()).option("--variables <json>",`Inline variables JSON, e.g. '{"user": {"value": "alice"}}'`).option("--variables-file <path>","Load variables from a JSON file").option("--session-context <json>","Session context JSON (prior runs)").addOption(new G("--cft","Use Playwright Chromium instead of managed Chrome").hideHelp()).option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key (skip OAuth)").option("--env <name>","Environment (prod or stage)").option("--mode <name>","Run mode: 'action' (strict \u2014 hard-stop on auth/blocked/error) or 'testing' (lenient \u2014 fall through). Overrides config; default: testing.").option("--assertion-mode <mode>","Assertion mode: 'dom' (default \u2014 DOM-based extraction & assertions, vision fallback) or 'visual' (vision model only). Overrides config.").option("--final-validation <on|off>","Final validation: append the system cp_final checkpoint verifying the objective as a whole. Overrides config (default: off).").option("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").option("--network-ws","Capture WebSocket frames for assertions/extraction (experimental)").option("--network-sse","Capture Server-Sent Events messages (Chromium-only) for assertions/extraction (experimental)").option("--bug-detection <mode>","Detect product bugs while authoring: off|stop|continue (stop halts the run on a confirmed bug; continue records it and keeps going). Overrides `config set-bug-detection`.",o=>{if(o!=="off"&&o!=="stop"&&o!=="continue")throw new Error("--bug-detection must be off, stop or continue");return o}).addOption(new G("--local","Skip TMS integration (no uploads, no variables/secrets push)").hideHelp()).option("--allow-missing-url","Non-TTY only: proceed from the browser's current page instead of failing when no start URL resolves (a provided --url is still used)").option("--code-export","Generate code export after upload").option("--code-language <lang>","Code export language: python (default) | javascript").option("--name <name>","Persist the session under this name (validated [a-zA-Z0-9_-]+)").option("--chrome-profile <path>","Chrome user-data-dir for this run (overrides stored config)").option("--target <name>","Where to run: desktop | emulator | simulator (default: the saved session target)");return e&&i.option("--device <id>","Which device, when the target is mobile: name, serial, ip:port, or UDID").option("--app <path|APPid>","App under test, when the target is mobile: a build (.apk / .zip of the .app) or an APP\u2026 id from your uploads"),i.addOption(new G("--appium-url <url>","Appium server URL override (default: runner-managed local server)").hideHelp()).option("--skip-code-validation","Skip post-codegen worker-side validation").option("--no-skip-code-validation","Force post-codegen worker-side validation").addHelpText("after",`
159
159
  Variables:
160
160
  Variables are loaded in order (later wins):
161
161
  1. Global: ${Pe(J,"variables")}/*.json
@@ -179,31 +179,31 @@ Context Files:
179
179
  Override with --global-context / --local-context flags.
180
180
  `).action(async(o,r)=>{try{if(r.name){let{validateNameOrThrow:b}=await import("./name-validator-5YGJXLZ7.js");try{b(r.name)}catch(T){console.error(`error: ${T.message}`),y(2,"Invalid --name");return}}if(o&&o.endsWith(".md")&&!o.startsWith("-")){process.stderr.write(`error: '.md' files are no longer accepted by 'kane-cli run'.
181
181
  Use 'kane-cli testmd run <path>' instead.
182
- `),process.exit(2);return}let s=new de,a=new Ce,l=a.load();r.chromeProfile&&(l.chrome_profile_path=r.chromeProfile);let u;if(r.mode===void 0)u=l.mode==="action"?"action":"testing";else if(r.mode==="action"||r.mode==="testing")u=r.mode;else{console.error("Invalid --mode. Must be 'action' or 'testing'."),y(2,"Invalid --mode");return}let c;if(r.assertionMode===void 0)c=l.assertion_mode==="dom"?"dom":"visual";else if(r.assertionMode==="visual"||r.assertionMode==="dom")c=r.assertionMode;else{console.error("Invalid --assertion-mode. Must be 'visual' or 'dom'."),y(2,"Invalid --assertion-mode");return}let m;if(r.finalValidation!==void 0){if(r.finalValidation!=="on"&&r.finalValidation!=="off"){console.error("Invalid --final-validation. Must be 'on' or 'off'."),y(2,"Invalid --final-validation");return}m=r.finalValidation==="on"}let p=new Ct,{printRecordingBanner:g}=await import("./recording-banner-5VXVKCV4.js");await g({isAgent:!!r.agent||!process.stdin.isTTY,sessionId:p.sessionId,sessionName:r.name??null,testPath:r.name?Pe(process.cwd(),".testmuai","tests",`${r.name}_test.md`):null,outputPath:r.name?Pe(process.cwd(),".testmuai","tests",`output-${r.name}`):null});let d=!!(r.username&&r.accessKey);if(await Ko({isInteractive:!!process.stdin.isTTY&&!r.agent&&!d,creds:s,config:a}),!d){let b=s.getActiveProfile(),T=s.getDefaultEnv();b&&(s.loadBasicAuth(b,T)||s.loadCredentials(b,T))||(console.error("Not authenticated. Run: kane-cli login --oauth, or kane-cli login --username <user> --access-key <key>"),y(1,"Not authenticated"))}let w=`${s.getActiveProfile()??"no profile"}/${s.getDefaultEnv()}`,_=[],h=r.env??s.getDefaultEnv(),v=null,R=[],I=(b,T,O,j)=>{v?v(b,T,O,j):R.push([b,T,O,j])},f;try{f=await je({creds:s,env:h,usernameFlag:r.username,accessKeyFlag:r.accessKey,log:I})}catch(b){throw b instanceof It&&(console.error(b.code==="not_authenticated"?"Not authenticated. Run: kane-cli login":"Token refresh failed. Run: kane-cli login"),y(2,b.code==="not_authenticated"?"Not authenticated":"Token refresh failed")),b}let S=!!f.basicAuth,k=f.basicAuth?.username,E=f.basicAuth?.access_key,L=f.token,x=f.resolver,D=f.resolvedCreds;f.basicAuth&&_.push(`Auth: ${f.basicAuth.username}`);let U=s.getActiveProfile()??"default",oe=s.getDefaultEnv();no(s,a,U,oe);let A=a.load(),B=f.basicAuth??(f.resolvedCreds?{username:f.resolvedCreds.username,access_key:f.resolvedCreds.access_key}:null);if(B){let b=!!r.agent||!process.stdin.isTTY,T=await Yt({creds:s,config:a,profile:U,env:oe,tmsCreds:B,isLocal:!!r.local,log:I});T.status==="cancelled"&&(console.error("error: project/folder configuration failed. See remediation above, or use --local."),y(2,"project/folder gate failed")),T.status==="ok"&&T.autoDefaulted&&b&&process.stdout.write(io(T.autoDefaulted)),A=a.load()}else r.local||(console.error("Project and folder must be configured. Run `kane-cli login` to set up auth, or pass --username/--access-key, then `kane-cli config project <id>` / `kane-cli config folder <id>`."),y(2,"no TMS credentials for project/folder gate"));let{resolveRunIntent:te,formatRunningOn:Le,missingPieceMessage:Oe,staleAppMessage:We,CHOOSE_MOBILE_KIND_MESSAGE:ot}=await import("./resolve-run-intent-ZML3HKG7.js"),{mobileHostSupport:$t}=await import("./host-7GZPBA74.js"),{platformOf:ue}=await import("./session-target-UWROGOCY.js"),ie=mi()&&!r.agent,ye=te({flags:{target:r.target,device:r.device,app:r.app},saved:l.mobile,host:$t()});if(ye.kind==="choose-mobile-kind")if(ie){let{promptMobileKind:b}=await import("./mobile-prompts-T6HZ2YLY.js"),T=await b();if(!T){y(2,"target selection cancelled");return}a.setMobile({tui_target:T}),ye=te({flags:{target:T,device:r.device,app:r.app},saved:a.load().mobile,host:$t()})}else{console.error(`error: ${ot}`),y(2,"ambiguous legacy session target");return}if(ye.kind==="invalid"){console.error(`error: ${ye.message}`),y(2,"invalid run target");return}if(ye.kind==="choose-mobile-kind"){y(2,"ambiguous legacy session target");return}for(let b of ye.warnings)console.error(`warning: ${b}`);let qe=ye.kind==="mobile"?ye:null,ke=qe?"device":"web";if(qe||console.error(Le({target:"desktop"})),!Zi({target:r.target,device:r.device,app:r.app,cdpEndpoint:r.cdpEndpoint,wsEndpoint:r.wsEndpoint,cft:r.cft,url:r.url})){let b=ke==="device"?"mobile":"web",T=await eo({objective:o,sessionTarget:b,controllerBaseUrl:se(h).controllerBaseUrl,authHeader:f.basicAuth?In(f.basicAuth.username,f.basicAuth.access_key):`Bearer ${f.token}`}),O=es(to(T,b));O&&console.error(O),I("info","CLASSIFY_VERDICT","Objective classified",{session_target:b,target:T?.target??null,confidence:T?.confidence??null,warned:!!O})}let P=ke==="device"?null:Vo({flag:r.url,configDefault:l.default_url}),me=ke==="device"?!1:Bo({resolvedUrl:P,local:r.local,allowMissingUrl:r.allowMissingUrl,isTTY:!!process.stdin.isTTY}),M=si({objective:o,globalDir:Pe(J,"variables"),localDir:Pe(process.cwd(),".testmuai","variables"),file:r.variablesFile,inline:r.variables,onLoadError:b=>console.error(b)}),X;if(r.sessionContext)try{X=JSON.parse(r.sessionContext)}catch{console.error("Invalid --session-context JSON"),y(2,"Invalid --session-context JSON")}let it=r.globalContext??Pe(J,"global-memory.md"),st=r.localContext??Pe(process.cwd(),".testmuai","context.md"),De=Mn(it),Mt=Mn(st),$={},le=await ei(ke,{prepareDevice:async()=>{let b=qe,{isAppId:T}=await import("./app-download-GYQYLGT3.js"),{access:O}=await import("fs/promises"),j=b.app?.value,Z=!1,_e=!1,Y=b.app?.source==="saved"&&!T(b.app.value)?await O(b.app.value).then(()=>!1,()=>!0):!1;if(ie){if(b.missing.includes("app")||Y){Y&&console.error(`${b.app.value} is no longer there \u2014 choose the app under test.`);let{promptApp:W}=await import("./mobile-prompts-T6HZ2YLY.js"),{AppClient:fe}=await import("./app-client-ZCCNE3RV.js"),Ye=k&&E?Ue=>new fe(St(h),{username:k,accessKey:E}).list({type:b.target,...Ue}):void 0,he=await W({kind:b.target,...Ye?{listApps:Ye}:{}});if(!he)throw y(2,"app selection cancelled"),new Error("app selection cancelled");j=he,Z=!0}}else{let W=b.missing.map(fe=>Oe(b.target,fe));if(Y&&W.push(We(b.app.value,b.target)),W.length>0){for(let fe of W)console.error(`error: ${fe}`);y(2,"mobile run not fully specified")}}let N,pe=ln();try{N=await Zr({device:b.device?.source==="flag"?b.device.value:void 0,platform:ue(b.target),app:j,defaults:l.mobile,interactive:ie,agent:!!r.agent,appiumUrl:r.appiumUrl,...ie?{pickTarget:async W=>{let{promptDevice:fe}=await import("./mobile-prompts-T6HZ2YLY.js"),Ye=W.filter(Ue=>Ue.kind===b.target),he=await fe(Ye.length>0?Ye:W,b.target,l.mobile?.default_target);return he&&(_e=!0),he}}:{},...!r.local&&k&&E&&D?.org_id?{cloudUpload:{env:h,orgId:String(D.org_id),userId:String(D.user_id??""),baseUrl:St(h),auth:{username:k,accessKey:E}}}:{},onProgress:pe.onProgress})}catch(W){pe.done(),W instanceof Qr?(console.error(W.doctorText),console.error(`
183
- ${W.message}`)):console.error(W instanceof Error?W.message:String(W)),y(2,"mobile target preparation failed")}pe.done(),N.device.app_package||(console.error(`error: ${Oe(b.target,"app")}`),y(2,"mobile run missing app binding"));let F=b.device?.source==="flag";if(Z||_e||!F){let{stableTargetId:W}=await import("./types-VYEOJ6U2.js");a.setMobile({...r.target===void 0?{tui_target:b.target}:{},...F?{}:{default_target:{platform:N.target.platform,kind:N.target.kind,id:W(N.target)}},...Z&&j?{default_app:j}:{}})}$.current=N;let H=j??N.appRef??N.device.app_package??"";return $.appLabel=T(H)?H:ld(H),{device:N.device,...N.appRef?{appRef:N.appRef}:{},...N.appId?{appId:N.appId}:{}}},prepareWeb:async()=>{try{return await Zo({config:l,startUrl:P??void 0,headless:r.headless,cft:r.cft,wsEndpoint:r.wsEndpoint,cdpEndpoint:r.cdpEndpoint})}catch(b){console.error(mo(b));let T=b instanceof uo?"Chrome not found at standard paths":`Chrome failed: ${b instanceof Error?b.message:b}`;y(2,T)}}}),Ke=le.kind==="web"?le.chrome:{instance:null,tempDir:null};Ke.instance&&lt("chrome",()=>{Ke.instance.kill()});let Te=null,Ir=Ke.cdpEndpoint??r.cdpEndpoint;if(Ir&&!r.cft&&!r.wsEndpoint&&(Te=vo({headless:r.headless,cdpEndpoint:Ir,chromePid:Ke.instance?.process.pid}),Te&&lt("marker-overlay",()=>Te.kill())),le.kind==="device"&&$.current&&qe){let b=Le({target:qe.target,deviceLabel:$.current.target.displayName,appLabel:$.appLabel??""});ie||console.error(b),_.push(b)}else r.cft?_.push("CfT mode: Playwright will manage its own browser"):r.wsEndpoint?_.push(`Playwright WS endpoint (${r.wsEndpoint.slice(0,60)}...)`):r.cdpEndpoint?_.push(`CDP connected (${r.cdpEndpoint})`):Ke.cdpEndpoint&&_.push(`Chrome ready (${Ke.cdpEndpoint})`);let C=p;C.start({model:r.model??l.model,environment:h,profile:s.getActiveProfile()}),r.name&&C.setSessionName(r.name),f.resolvedCreds?.org_id!==void 0&&C.setOrgId(String(f.resolvedCreds.org_id)),f.resolvedCreds?.plan!==void 0&&C.setPlan(f.resolvedCreds.plan??null),C.setUserIdentity(f.resolvedCreds?.username??null,f.resolvedCreds?.email??null),v=(b,T,O,j)=>C.log(b,T,O,j);for(let b of R)C.log(...b);R.length=0;let Er=S&&k&&E?{username:k,accessKey:E}:L??null,$e=null;if(Er!==null){let b=await ui({env:h,tmsCreds:f.resolvedCreds??null,resolver:f.resolver,auth:Er,getToken:async()=>f.token??null,session:C,log:(T,O,j,Z)=>C.log(T,O,j,Z),skipScreenshotQueue:r.local||le.kind==="device",invocationMode:r.agent||!process.stdin.isTTY?"agent":"cli"});$e=b.screenshotQueue,b.remoteLogger&&(lt("remote-logger",()=>b.remoteLogger.shutdownSync()),Kr(b.remoteLogger))}let Tr=f.basicAuth&&!r.local?await ai({variables:M,auth:f.basicAuth,orgId:String(f.resolvedCreds?.org_id??""),env:h,localMode:!!r.local,log:(b,T,O,j)=>C.log(b,T,O,j)}):{};C.setAuteurVariables(M.auteur),C.setFirstRun(M.auteurObjective,P??"");let{startInlineEvidence:Fa,noteInlineSpawn:Rr,inlineEvidenceBlock:La,finalizeInlineEvidence:Ua,createCdpBrowserCapture:Va}=await import("./evidence-5AUZMKE3.js"),wn=Va(Ke.cdpEndpoint),Q=await Fa({objectiveOrName:r.name??o,sessionId:C.sessionId,title:r.name??o,producerVersion:Me,pid:process.pid,surfaces:P?[P]:void 0,packRootDir:Pe(C.sessionDir,"evidence")}),jt=async(b={})=>(C.flushRecorder(),await Ua(Q,{saved:!!C.sessionName,local:!!r.local,deviceName:$.current?.target.displayName,deviceModel:$.current?.target.modelIdentifier,recordedTestPath:C.recorder?.lastWrittenPath??null,externalIdInput:{session_id:C.sessionId,commit_id:C.sessionId,test_id:C.testId??void 0,testcase_id:b.testcaseId??C.testcaseId??void 0,project_id:A.project_id??void 0,folder_id:A.folder_id??void 0,org_id:C.orgId??void 0,session_name:C.sessionName??void 0,user_name:C.userName??void 0,user_email:C.userEmail??void 0,sharable_link:Xo(se(h).testManagerUiUrl,A.project_id,b.testcaseId??C.testcaseId,b.shareId)},cdpBrowserCapture:wn,model:r.model??l.model,tuiLogPath:Pe(C.sessionDir,"tui.log"),log:(T,O,j,Z)=>C.log(T,O,j,Z)}));if(!r.local&&f.basicAuth&&A.project_id){let b=se(h),T=await ci({tmsBaseUrl:b.tmsBaseUrl,auth:f.basicAuth,objective:M.auteurObjective,url:P??"",projectId:A.project_id,folderId:A.folder_id??"",hasCustomProfile:!!l.chrome_profile_path,...le.kind==="device"?{mobile:li({platform:le.device.platform,appId:le.appId,deviceName:$.current?.target.displayName,osVersion:$.current?.target.osVersion,udid:le.device.udid})}:{},log:(O,j,Z,_e)=>C.log(O,j,Z,_e)});T&&C.setTestId(T)}C.setResolvedGlobal({mode:u,max_steps:parseInt(r.maxSteps,10),timeout:r.timeout?parseInt(r.timeout,10):void 0,target:ti(le,{cdpEndpoint:r.cdpEndpoint,wsEndpoint:r.wsEndpoint}),app:ni(le),os_version:le.kind==="device"?$.current?.target.osVersion:void 0,chrome_profile:l.chrome_profile_path||void 0,cdp_endpoint:r.cdpEndpoint||void 0,ws_endpoint:r.wsEndpoint||void 0,headless:r.headless,global_context:De??void 0,local_context:Mt??void 0,variables:Object.keys(M.auteur).length>0?M.auteur:void 0});let Ar=ii(M.auteur,M.auteurObjective),Pr=ri({objective:M.auteurObjective,url:P??void 0,requireStartUrl:me,model:r.model??l.model,chrome:Ke,auth:f,sessionId:C.sessionId,runIndex:0,windowSize:l.window_size,maxSteps:parseInt(r.maxSteps,10),headless:r.headless,disableAskUser:!process.stdin.isTTY,enableTaskSkills:r.taskSkills,networkWs:r.networkWs,networkSse:r.networkSse,bugDetection:r.bugDetection??l.bug_detection,variables:Object.keys(Ar).length>0?Ar:void 0,globalContext:De??void 0,localContext:Mt??void 0,sessionContext:X,device:le.kind==="device"?le.device:void 0,evidence:La(Q)}),yn=No(),Or=$e?(b,T,O,j)=>{if(Q&&j){yn.track(Fo(Q.packTestDir,j,$e,(Z,_e,Y,N)=>C.log(Z,_e,Y,N)));return}Lo(C.sessionDir,T,b,$e,(Z,_e,Y,N)=>C.log(Z,_e,Y,N),O)}:void 0;if(!process.stdin.isTTY&&!r.agent&&(r.agent=!0),r.agent){let b=F=>{process.stdout.write(JSON.stringify(F)+`
184
- `)};Te?.setRunActive(!0);let T;try{T=await Qi(Pr,{environment:h,mode:u,assertionMode:c,finalValidation:m,log:(F,H,W,fe)=>C.log(F,H,W,fe)},{onStepEnd:Or,onStepLog:(F,H,W)=>C.logStep(F,H,W),onReasoning:F=>Te?.setStepText(F),onStepComplete:()=>Te?.setStepComplete()})}finally{Te?.setRunActive(!1)}let{lastRunEnd:O,stepsTotal:j,hadError:Z,bifurcationFlows:_e}=T;if(Rr(Q,T.evidence,O),Z&&C.escalateRun(0),O){let F=An(O,0,_e);C.addRunResult(Pn(O,M.auteurObjective,0,F),O.total_runs);let H=O.status==="passed"?"passed":Z?"error":"failed";C.addFlow({runIndex:0,objective:M.auteurObjective,status:H,summary:O.summary??"",duration:O.duration??0,steps:j,stepsPassed:H==="passed"?j:0,stepsFailed:H==="passed"?0:j,reason:O.reason,creditsConsumed:O.credits_consumed})}Q&&await wn(),En("chrome","Agent run completed");let Y;if(C.log("info","DIRECT_UPLOAD_START","Starting direct upload (agent mode)",{agent_mode:!0,last_run_end:!!O,local:!!r.local,mobile:le.kind==="device"}),O&&!r.local)try{let F=se(h),H=A.project_id;if(f.basicAuth){let{UploadPipeline:W}=await import("./pipeline-BHEA7ODT.js");$e&&(await yn.settle(),await $e.drain());let fe=jn({mobile:le.kind==="device",session:C,env:h,auth:f,variables:M,variableIds:Tr,projectId:H,folderId:A.folder_id,totalSteps:j,totalDuration:O.duration??0,screenshotExtMap:$e?.getExtMap(),codeExport:Nn({codeExport:r.codeExport,codeLanguage:r.codeLanguage,skipCodeValidation:r.skipCodeValidation},l.code_export),onProgress:()=>{},log:(Ue,qa,Ka,Ya)=>C.log(Ue,qa,Ka,Ya),shouldUploadArtifacts:!r.local,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0,evidence:Q?{executionId:Q.executionId,packTestDir:Q.packTestDir,sealedPackPath:Q.packDir,sealFn:jt}:void 0}),he=await new W(fe).execute();he.success&&(he.testcaseId&&C.setTestcaseId(he.testcaseId),he.testcaseId&&he.shareId&&H&&(Y=en(F.testManagerUiUrl,H,he.testcaseId,he.shareId)));try{let{persistRecordedSession:Ue}=await import("./persist-recorded-session-O2NCYTSD.js");await Ue(C,{testcaseId:C.testcaseId??void 0,projectId:A.project_id??void 0,folderId:A.folder_id??void 0,codeExportDir:he.codeExportDir,packTestDir:Q?.packTestDir})}catch(Ue){C.log("error","DIRECT_PERSIST_ERROR","Persist failed in agent mode",{error:String(Ue)})}}}catch(F){C.log("error","DIRECT_UPLOAD_ERROR","Upload failed in agent mode",{error:F instanceof Error?F.message:String(F)})}let N=await jt({});if(Q&&N?.sealed){let{offerEvidenceView:F}=await import("./evidence-5AUZMKE3.js");await F({packPath:Q.packDir,env:h,isTTY:!1,log:H=>process.stderr.write(H+`
185
- `)})}if(O){let F={...O};Y&&(F.test_url=Y),b(F)}await C.finish("complete"),O||y(Z?2:1,"Agent run ended with no result");let pe=O.reason??"";(pe.includes("Cancel")||pe.includes("Timeout"))&&y(3,`Agent run: ${pe}`),O.status==="passed"&&y(0,"Agent run passed"),y(1,"Agent run failed")}let ce=null,yt=0,kn=!1,Dr=null,$r=0,Mr={current:null},Ba=B?{authHeader:In(B.username,B.access_key),sessionId:C.sessionId,controllerBaseUrl:se(h).controllerBaseUrl}:null,{waitUntilExit:Ha}=Qe(vr.default.createElement(Ze,null,vr.default.createElement(Xi,{config:Pr,describeContext:Ba,spawnOpts:{environment:h,mode:u,assertionMode:c,finalValidation:m,log:(b,T,O,j)=>C.log(b,T,O,j)},cancelRef:Mr,banner:{model:r.model??l.model,auth:w,status:_},onComplete:b=>{ce=b.lastRunEnd,yt=b.stepsTotal,kn=b.hadError,Dr=b.bifurcationFlows,$r=b.describeCredits,Rr(Q,b.evidence,b.lastRunEnd)},onStepEnd:Or,onReasoning:b=>Te?.setStepText(b),onStepComplete:()=>Te?.setStepComplete()})),{stdout:process.stderr,exitOnCtrlC:!1}),xn;if(r.timeout){let b=parseInt(r.timeout,10)*1e3;xn=setTimeout(()=>{console.error(`
186
- Timeout: ${r.timeout}s exceeded \u2014 cancelling...`),Mr.current?.()},b)}Te?.setRunActive(!0);try{await Ha()}finally{Te?.setRunActive(!1)}if(xn&&clearTimeout(xn),ce){let b=An(ce,0,Dr);C.addRunResult(Pn(ce,M.auteurObjective,0,b),ce.total_runs);let T=ce.status==="passed"?"passed":kn?"error":"failed";C.addFlow({runIndex:0,objective:M.auteurObjective,status:T,summary:ce.summary??"",duration:ce.duration??0,steps:yt,stepsPassed:T==="passed"?yt:0,stepsFailed:T==="passed"?0:yt,reason:ce.reason,creditsConsumed:(ce.credits_consumed??0)+$r})}Q&&await wn(),En("chrome","Ink run completed");{let b=u==="testing",T=C.nextRunIndex()>0;if(b&&!r.name&&T&&process.stdin.isTTY)try{let{renderSavePrompt:O,defaultSessionTimestamp:j}=await import("./SaveSessionPrompt-UCRET3II.js"),Z=await O(j());Z&&C.setSessionName(Z)}catch(O){C.log("warn","DIRECT_SAVE_PROMPT_FAILED","Save prompt failed",{error:String(O)})}}if(C.log("info","DIRECT_UPLOAD_START","Starting direct upload (ink mode)",{ink_mode:!0,last_event:!!ce,local:!!r.local,mobile:le.kind==="device"}),ce&&!r.local)try{let b=se(h),T=A.project_id;if(f.basicAuth){let{UploadPipeline:O}=await import("./pipeline-BHEA7ODT.js");$e&&(C.log("info","SCREENSHOT_UPLOAD_DRAIN","Draining screenshot upload queue before pipeline"),await yn.settle(),await $e.drain(),C.log("info","SCREENSHOT_UPLOAD_DRAINED","Screenshot upload queue drained"));let j=jn({mobile:le.kind==="device",session:C,env:h,auth:f,variables:M,variableIds:Tr,projectId:A.project_id,folderId:A.folder_id,totalSteps:yt,totalDuration:ce.duration??0,screenshotExtMap:$e?.getExtMap(),codeExport:Nn({codeExport:r.codeExport,codeLanguage:r.codeLanguage,skipCodeValidation:r.skipCodeValidation},l.code_export),onProgress:()=>{},log:(N,pe,F,H)=>C.log(N,pe,F,H),shouldUploadArtifacts:!r.local,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0,evidence:Q?{executionId:Q.executionId,packTestDir:Q.packTestDir,sealedPackPath:Q.packDir,sealFn:jt}:void 0}),Z=new O(j),{renderUploadProgress:_e}=await import("./CliUploadProgress-Y7ITY2I7.js"),Y=await _e(Z,N=>{if(N.testcaseId&&N.shareId&&T)return en(b.testManagerUiUrl,T,N.testcaseId,N.shareId)});if(Y.success){Y.testcaseId&&C.setTestcaseId(Y.testcaseId);let N=null;try{let{persistRecordedSession:H}=await import("./persist-recorded-session-O2NCYTSD.js");N=await H(C,{testcaseId:C.testcaseId??void 0,projectId:A.project_id??void 0,folderId:A.folder_id??void 0,codeExportDir:Y.codeExportDir,packTestDir:Q?.packTestDir})}catch(H){C.log("error","DIRECT_PERSIST_ERROR","Persist failed in ink mode",{error:String(H)})}let pe=Y.testcaseId&&Y.shareId&&T?en(b.testManagerUiUrl,T,Y.testcaseId,Y.shareId):void 0,F=Y.testcaseId&&T?Qo(b.testManagerUiUrl,T,Y.testcaseId):void 0;if(pe||F||Y.codeExportDir||N){let{LinksBox:H}=await import("./LinksBox-TAGYCFFO.js"),{render:W}=await import("./build-JIKYOZUH.js"),fe=await import("./react-QWOAB3TB.js"),{waitUntilExit:Ye}=W(fe.default.createElement(H,{recordedTestPath:N?.recordedTestPath,outputDir:N?.outputDir,shareableLink:pe,testCaseLink:F,codeExportDir:Y.codeExportDir}),{stdout:process.stderr});await Ye()}}if(C.testId){let{renderFeedbackPrompt:N}=await import("./CliFeedbackPrompt-LFKEYMKP.js"),pe=await N();if(pe)try{await gi({tmsBaseUrl:b.tmsBaseUrl,username:f.basicAuth.username,accessKey:f.basicAuth.access_key,testId:C.testId,feedbackType:pe,log:(F,H,W,fe)=>C.log(F,H,W,fe)})}catch(F){C.log("warn","FEEDBACK_FAILED","Feedback submission failed",{error:String(F)})}}}}catch(b){C.log("error","DIRECT_UPLOAD_FAILED","Direct upload failed (ink mode)",{error:b instanceof Error?b.stack??b.message:String(b)}),console.error(`Upload failed: ${b}`)}let Wa=await jt({});if(Q&&Wa?.sealed){let{offerEvidenceView:b}=await import("./evidence-5AUZMKE3.js"),T=ce?.reason??"",O=T.includes("Cancel")||T.includes("Timeout");await b({packPath:Q.packDir,env:h,isTTY:!!process.stdin.isTTY&&!!process.stderr.isTTY&&!O,log:j=>process.stderr.write(j+`
187
- `)})}await C.finish("complete"),ce||y(kn?2:1,"Run ended with no result");let _n=ce.reason??"";(_n.includes("Cancel")||_n.includes("Timeout"))&&y(3,`Run: ${_n}`),ce.status==="passed"&&y(0,"Run passed"),y(1,"Run failed")}catch(s){y(2,`CLI error: ${s instanceof Error?s.message:String(s)}`)}}),ls(t),cs(t),ds(t),us(t),ms(t),t.addCommand(ka()),t.addCommand(Ia()),Oi(t),e&&(rs(t),Ta(t)),t.command("install <target> [version]").description("Install kane-cli agent skill into Claude Code / Codex CLI / Gemini CLI (version defaults to latest compatible)").action(async(o,r)=>{if(o==="plugin"){let c=r;if(!c){console.error("error: usage: kane-cli install plugin <name>"),y(2,"install plugin: missing name");return}let{installPlugin:m}=await import("./install-46S4VOZ4.js"),p=m(c,{});if(p.status==="failed"){console.error(`error: ${p.error}`),y(/unknown plugin/i.test(p.error??"")?2:1,`install plugin: ${p.status}`);return}let{ensureHyperexecuteBinary:g}=await import("./binary-XJ3RF3VO.js"),d=c==="remote-execution"?await g(J):void 0;process.stdin.isTTY?(process.stderr.write(`${p.status==="already-installed"?"already installed":"installed"} ${p.name}@${p.version} \u2192 ${p.dir}
182
+ `),process.exit(2);return}let a=new de,s=new Ce,l=s.load();r.chromeProfile&&(l.chrome_profile_path=r.chromeProfile);let u;if(r.mode===void 0)u=l.mode==="action"?"action":"testing";else if(r.mode==="action"||r.mode==="testing")u=r.mode;else{console.error("Invalid --mode. Must be 'action' or 'testing'."),y(2,"Invalid --mode");return}let c;if(r.assertionMode===void 0)c=l.assertion_mode==="dom"?"dom":"visual";else if(r.assertionMode==="visual"||r.assertionMode==="dom")c=r.assertionMode;else{console.error("Invalid --assertion-mode. Must be 'visual' or 'dom'."),y(2,"Invalid --assertion-mode");return}let m;if(r.finalValidation!==void 0){if(r.finalValidation!=="on"&&r.finalValidation!=="off"){console.error("Invalid --final-validation. Must be 'on' or 'off'."),y(2,"Invalid --final-validation");return}m=r.finalValidation==="on"}let p=new Ct,{printRecordingBanner:g}=await import("./recording-banner-YMKWR3M3.js");await g({isAgent:!!r.agent||!process.stdin.isTTY,sessionId:p.sessionId,sessionName:r.name??null,testPath:r.name?Pe(process.cwd(),".testmuai","tests",`${r.name}_test.md`):null,outputPath:r.name?Pe(process.cwd(),".testmuai","tests",`output-${r.name}`):null});let d=!!(r.username&&r.accessKey);if(await Ko({isInteractive:!!process.stdin.isTTY&&!r.agent&&!d,creds:a,config:s}),!d){let b=a.getActiveProfile(),T=a.getDefaultEnv();b&&(a.loadBasicAuth(b,T)||a.loadCredentials(b,T))||(console.error("Not authenticated. Run: kane-cli login --oauth, or kane-cli login --username <user> --access-key <key>"),y(1,"Not authenticated"))}let w=`${a.getActiveProfile()??"no profile"}/${a.getDefaultEnv()}`,_=[],h=r.env??a.getDefaultEnv(),v=null,R=[],I=(b,T,$,j)=>{v?v(b,T,$,j):R.push([b,T,$,j])},f;try{f=await je({creds:a,env:h,usernameFlag:r.username,accessKeyFlag:r.accessKey,log:I})}catch(b){throw b instanceof It&&(console.error(b.code==="not_authenticated"?"Not authenticated. Run: kane-cli login":"Token refresh failed. Run: kane-cli login"),y(2,b.code==="not_authenticated"?"Not authenticated":"Token refresh failed")),b}let S=!!f.basicAuth,k=f.basicAuth?.username,E=f.basicAuth?.access_key,L=f.token,x=f.resolver,O=f.resolvedCreds;f.basicAuth&&_.push(`Auth: ${f.basicAuth.username}`);let U=a.getActiveProfile()??"default",oe=a.getDefaultEnv();no(a,s,U,oe);let A=s.load(),B=f.basicAuth??(f.resolvedCreds?{username:f.resolvedCreds.username,access_key:f.resolvedCreds.access_key}:null);if(B){let b=!!r.agent||!process.stdin.isTTY,T=await Yt({creds:a,config:s,profile:U,env:oe,tmsCreds:B,isLocal:!!r.local,log:I});T.status==="cancelled"&&(console.error("error: project/folder configuration failed. See remediation above, or use --local."),y(2,"project/folder gate failed")),T.status==="ok"&&T.autoDefaulted&&b&&process.stdout.write(io(T.autoDefaulted)),A=s.load()}else r.local||(console.error("Project and folder must be configured. Run `kane-cli login` to set up auth, or pass --username/--access-key, then `kane-cli config project <id>` / `kane-cli config folder <id>`."),y(2,"no TMS credentials for project/folder gate"));let{resolveRunIntent:te,formatRunningOn:Le,missingPieceMessage:$e,staleAppMessage:We,CHOOSE_MOBILE_KIND_MESSAGE:ot}=await import("./resolve-run-intent-W32G6WM6.js"),{mobileHostSupport:Dt}=await import("./host-7GZPBA74.js"),{platformOf:ue}=await import("./session-target-UWROGOCY.js"),ie=mi()&&!r.agent,ye=te({flags:{target:r.target,device:r.device,app:r.app},saved:l.mobile,host:Dt()});if(ye.kind==="choose-mobile-kind")if(ie){let{promptMobileKind:b}=await import("./mobile-prompts-JS7GPVKS.js"),T=await b();if(!T){y(2,"target selection cancelled");return}s.setMobile({tui_target:T}),ye=te({flags:{target:T,device:r.device,app:r.app},saved:s.load().mobile,host:Dt()})}else{console.error(`error: ${ot}`),y(2,"ambiguous legacy session target");return}if(ye.kind==="invalid"){console.error(`error: ${ye.message}`),y(2,"invalid run target");return}if(ye.kind==="choose-mobile-kind"){y(2,"ambiguous legacy session target");return}for(let b of ye.warnings)console.error(`warning: ${b}`);let qe=ye.kind==="mobile"?ye:null,ke=qe?"device":"web";if(qe||console.error(Le({target:"desktop"})),!Zi({target:r.target,device:r.device,app:r.app,cdpEndpoint:r.cdpEndpoint,wsEndpoint:r.wsEndpoint,cft:r.cft,url:r.url})){let b=ke==="device"?"mobile":"web",T=await eo({objective:o,sessionTarget:b,controllerBaseUrl:se(h).controllerBaseUrl,authHeader:f.basicAuth?In(f.basicAuth.username,f.basicAuth.access_key):`Bearer ${f.token}`}),$=es(to(T,b));$&&console.error($),I("info","CLASSIFY_VERDICT","Objective classified",{session_target:b,target:T?.target??null,confidence:T?.confidence??null,warned:!!$})}let P=ke==="device"?null:Vo({flag:r.url,configDefault:l.default_url}),me=ke==="device"?!1:Bo({resolvedUrl:P,local:r.local,allowMissingUrl:r.allowMissingUrl,isTTY:!!process.stdin.isTTY}),M=si({objective:o,globalDir:Pe(J,"variables"),localDir:Pe(process.cwd(),".testmuai","variables"),file:r.variablesFile,inline:r.variables,onLoadError:b=>console.error(b)}),X;if(r.sessionContext)try{X=JSON.parse(r.sessionContext)}catch{console.error("Invalid --session-context JSON"),y(2,"Invalid --session-context JSON")}let it=r.globalContext??Pe(J,"global-memory.md"),st=r.localContext??Pe(process.cwd(),".testmuai","context.md"),Oe=Mn(it),Mt=Mn(st),D={},le=await ei(ke,{prepareDevice:async()=>{let b=qe,{isAppId:T}=await import("./app-download-SQ4RDY3E.js"),{access:$}=await import("fs/promises"),j=b.app?.value,Z=!1,_e=!1,Y=b.app?.source==="saved"&&!T(b.app.value)?await $(b.app.value).then(()=>!1,()=>!0):!1;if(ie){if(b.missing.includes("app")||Y){Y&&console.error(`${b.app.value} is no longer there \u2014 choose the app under test.`);let{promptApp:W}=await import("./mobile-prompts-JS7GPVKS.js"),{AppClient:fe}=await import("./app-client-ZCCNE3RV.js"),Ye=k&&E?Ue=>new fe(St(h),{username:k,accessKey:E}).list({type:b.target,...Ue}):void 0,he=await W({kind:b.target,...Ye?{listApps:Ye}:{}});if(!he)throw y(2,"app selection cancelled"),new Error("app selection cancelled");j=he,Z=!0}}else{let W=b.missing.map(fe=>$e(b.target,fe));if(Y&&W.push(We(b.app.value,b.target)),W.length>0){for(let fe of W)console.error(`error: ${fe}`);y(2,"mobile run not fully specified")}}let N,pe=ln();try{N=await Zr({device:b.device?.source==="flag"?b.device.value:void 0,platform:ue(b.target),app:j,defaults:l.mobile,interactive:ie,agent:!!r.agent,appiumUrl:r.appiumUrl,...ie?{pickTarget:async W=>{let{promptDevice:fe}=await import("./mobile-prompts-JS7GPVKS.js"),Ye=W.filter(Ue=>Ue.kind===b.target),he=await fe(Ye.length>0?Ye:W,b.target,l.mobile?.default_target);return he&&(_e=!0),he}}:{},...!r.local&&k&&E&&O?.org_id?{cloudUpload:{env:h,orgId:String(O.org_id),userId:String(O.user_id??""),baseUrl:St(h),auth:{username:k,accessKey:E}}}:{},onProgress:pe.onProgress})}catch(W){pe.done(),W instanceof Qr?(console.error(W.doctorText),console.error(`
183
+ ${W.message}`)):console.error(W instanceof Error?W.message:String(W)),y(2,"mobile target preparation failed")}pe.done(),N.device.app_package||(console.error(`error: ${$e(b.target,"app")}`),y(2,"mobile run missing app binding"));let F=b.device?.source==="flag";if(Z||_e||!F){let{stableTargetId:W}=await import("./types-O23GN2YM.js");s.setMobile({...r.target===void 0?{tui_target:b.target}:{},...F?{}:{default_target:{platform:N.target.platform,kind:N.target.kind,id:W(N.target)}},...Z&&j?{default_app:j}:{}})}D.current=N;let H=j??N.appRef??N.device.app_package??"";return D.appLabel=T(H)?H:ld(H),{device:N.device,...N.appRef?{appRef:N.appRef}:{},...N.appId?{appId:N.appId}:{}}},prepareWeb:async()=>{try{return await Zo({config:l,startUrl:P??void 0,headless:r.headless,cft:r.cft,wsEndpoint:r.wsEndpoint,cdpEndpoint:r.cdpEndpoint})}catch(b){console.error(mo(b));let T=b instanceof uo?"Chrome not found at standard paths":`Chrome failed: ${b instanceof Error?b.message:b}`;y(2,T)}}}),Ke=le.kind==="web"?le.chrome:{instance:null,tempDir:null};Ke.instance&&lt("chrome",()=>{Ke.instance.kill()});let Te=null,Ir=Ke.cdpEndpoint??r.cdpEndpoint;if(Ir&&!r.cft&&!r.wsEndpoint&&(Te=vo({headless:r.headless,cdpEndpoint:Ir,chromePid:Ke.instance?.process.pid}),Te&&lt("marker-overlay",()=>Te.kill())),le.kind==="device"&&D.current&&qe){let b=Le({target:qe.target,deviceLabel:D.current.target.displayName,appLabel:D.appLabel??""});ie||console.error(b),_.push(b)}else r.cft?_.push("CfT mode: Playwright will manage its own browser"):r.wsEndpoint?_.push(`Playwright WS endpoint (${r.wsEndpoint.slice(0,60)}...)`):r.cdpEndpoint?_.push(`CDP connected (${r.cdpEndpoint})`):Ke.cdpEndpoint&&_.push(`Chrome ready (${Ke.cdpEndpoint})`);let C=p;C.start({model:r.model??l.model,environment:h,profile:a.getActiveProfile()}),r.name&&C.setSessionName(r.name),f.resolvedCreds?.org_id!==void 0&&C.setOrgId(String(f.resolvedCreds.org_id)),f.resolvedCreds?.plan!==void 0&&C.setPlan(f.resolvedCreds.plan??null),C.setUserIdentity(f.resolvedCreds?.username??null,f.resolvedCreds?.email??null),v=(b,T,$,j)=>C.log(b,T,$,j);for(let b of R)C.log(...b);R.length=0;let Er=S&&k&&E?{username:k,accessKey:E}:L??null,De=null;if(Er!==null){let b=await ui({env:h,tmsCreds:f.resolvedCreds??null,resolver:f.resolver,auth:Er,getToken:async()=>f.token??null,session:C,log:(T,$,j,Z)=>C.log(T,$,j,Z),skipScreenshotQueue:r.local||le.kind==="device",invocationMode:r.agent||!process.stdin.isTTY?"agent":"cli"});De=b.screenshotQueue,b.remoteLogger&&(lt("remote-logger",()=>b.remoteLogger.shutdownSync()),Kr(b.remoteLogger))}let Tr=f.basicAuth&&!r.local?await ai({variables:M,auth:f.basicAuth,orgId:String(f.resolvedCreds?.org_id??""),env:h,localMode:!!r.local,log:(b,T,$,j)=>C.log(b,T,$,j)}):{};C.setAuteurVariables(M.auteur),C.setFirstRun(M.auteurObjective,P??"");let{startInlineEvidence:Fa,noteInlineSpawn:Rr,inlineEvidenceBlock:La,finalizeInlineEvidence:Ua,createCdpBrowserCapture:Va}=await import("./evidence-NDAKCCHQ.js"),wn=Va(Ke.cdpEndpoint),Q=await Fa({objectiveOrName:r.name??o,sessionId:C.sessionId,title:r.name??o,producerVersion:Me,pid:process.pid,surfaces:P?[P]:void 0,packRootDir:Pe(C.sessionDir,"evidence")}),jt=async(b={})=>(C.flushRecorder(),await Ua(Q,{saved:!!C.sessionName,local:!!r.local,deviceName:D.current?.target.displayName,deviceModel:D.current?.target.modelIdentifier,recordedTestPath:C.recorder?.lastWrittenPath??null,externalIdInput:{session_id:C.sessionId,commit_id:C.sessionId,test_id:C.testId??void 0,testcase_id:b.testcaseId??C.testcaseId??void 0,project_id:A.project_id??void 0,folder_id:A.folder_id??void 0,org_id:C.orgId??void 0,session_name:C.sessionName??void 0,user_name:C.userName??void 0,user_email:C.userEmail??void 0,sharable_link:Xo(se(h).testManagerUiUrl,A.project_id,b.testcaseId??C.testcaseId,b.shareId)},cdpBrowserCapture:wn,model:r.model??l.model,tuiLogPath:Pe(C.sessionDir,"tui.log"),log:(T,$,j,Z)=>C.log(T,$,j,Z)}));if(!r.local&&f.basicAuth&&A.project_id){let b=se(h),T=await ci({tmsBaseUrl:b.tmsBaseUrl,auth:f.basicAuth,objective:M.auteurObjective,url:P??"",projectId:A.project_id,folderId:A.folder_id??"",hasCustomProfile:!!l.chrome_profile_path,...le.kind==="device"?{mobile:li({platform:le.device.platform,appId:le.appId,deviceName:D.current?.target.displayName,osVersion:D.current?.target.osVersion,udid:le.device.udid})}:{},log:($,j,Z,_e)=>C.log($,j,Z,_e)});T&&C.setTestId(T)}C.setResolvedGlobal({mode:u,max_steps:parseInt(r.maxSteps,10),timeout:r.timeout?parseInt(r.timeout,10):void 0,target:ti(le,{cdpEndpoint:r.cdpEndpoint,wsEndpoint:r.wsEndpoint}),app:ni(le),os_version:le.kind==="device"?D.current?.target.osVersion:void 0,chrome_profile:l.chrome_profile_path||void 0,cdp_endpoint:r.cdpEndpoint||void 0,ws_endpoint:r.wsEndpoint||void 0,headless:r.headless,global_context:Oe??void 0,local_context:Mt??void 0,variables:Object.keys(M.auteur).length>0?M.auteur:void 0});let Ar=ii(M.auteur,M.auteurObjective),Pr=ri({objective:M.auteurObjective,url:P??void 0,requireStartUrl:me,model:r.model??l.model,chrome:Ke,auth:f,sessionId:C.sessionId,runIndex:0,windowSize:l.window_size,maxSteps:parseInt(r.maxSteps,10),headless:r.headless,disableAskUser:!process.stdin.isTTY,enableTaskSkills:r.taskSkills,networkWs:r.networkWs,networkSse:r.networkSse,bugDetection:r.bugDetection??l.bug_detection,variables:Object.keys(Ar).length>0?Ar:void 0,globalContext:Oe??void 0,localContext:Mt??void 0,sessionContext:X,device:le.kind==="device"?le.device:void 0,evidence:La(Q)}),yn=No(),$r=De?(b,T,$,j)=>{if(Q&&j){yn.track(Fo(Q.packTestDir,j,De,(Z,_e,Y,N)=>C.log(Z,_e,Y,N)));return}Lo(C.sessionDir,T,b,De,(Z,_e,Y,N)=>C.log(Z,_e,Y,N),$)}:void 0;if(!process.stdin.isTTY&&!r.agent&&(r.agent=!0),r.agent){let b=F=>{process.stdout.write(JSON.stringify(F)+`
184
+ `)};Te?.setRunActive(!0);let T;try{T=await Qi(Pr,{environment:h,mode:u,assertionMode:c,finalValidation:m,log:(F,H,W,fe)=>C.log(F,H,W,fe)},{onStepEnd:$r,onStepLog:(F,H,W)=>C.logStep(F,H,W),onReasoning:F=>Te?.setStepText(F),onStepComplete:()=>Te?.setStepComplete()})}finally{Te?.setRunActive(!1)}let{lastRunEnd:$,stepsTotal:j,hadError:Z,bifurcationFlows:_e}=T;if(Rr(Q,T.evidence,$),Z&&C.escalateRun(0),$){let F=An($,0,_e);C.addRunResult(Pn($,M.auteurObjective,0,F),$.total_runs);let H=$.status==="passed"?"passed":Z?"error":"failed";C.addFlow({runIndex:0,objective:M.auteurObjective,status:H,summary:$.summary??"",duration:$.duration??0,steps:j,stepsPassed:H==="passed"?j:0,stepsFailed:H==="passed"?0:j,reason:$.reason,creditsConsumed:$.credits_consumed})}Q&&await wn(),En("chrome","Agent run completed");let Y;if(C.log("info","DIRECT_UPLOAD_START","Starting direct upload (agent mode)",{agent_mode:!0,last_run_end:!!$,local:!!r.local,mobile:le.kind==="device"}),$&&!r.local)try{let F=se(h),H=A.project_id;if(f.basicAuth){let{UploadPipeline:W}=await import("./pipeline-MTAZDCZR.js");De&&(await yn.settle(),await De.drain());let fe=jn({mobile:le.kind==="device",session:C,env:h,auth:f,variables:M,variableIds:Tr,projectId:H,folderId:A.folder_id,totalSteps:j,totalDuration:$.duration??0,screenshotExtMap:De?.getExtMap(),codeExport:Nn({codeExport:r.codeExport,codeLanguage:r.codeLanguage,skipCodeValidation:r.skipCodeValidation},l.code_export),onProgress:()=>{},log:(Ue,qa,Ka,Ya)=>C.log(Ue,qa,Ka,Ya),shouldUploadArtifacts:!r.local,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0,evidence:Q?{executionId:Q.executionId,packTestDir:Q.packTestDir,sealedPackPath:Q.packDir,sealFn:jt}:void 0}),he=await new W(fe).execute();he.success&&(he.testcaseId&&C.setTestcaseId(he.testcaseId),he.testcaseId&&he.shareId&&H&&(Y=en(F.testManagerUiUrl,H,he.testcaseId,he.shareId)));try{let{persistRecordedSession:Ue}=await import("./persist-recorded-session-LE3LGFOS.js");await Ue(C,{testcaseId:C.testcaseId??void 0,projectId:A.project_id??void 0,folderId:A.folder_id??void 0,codeExportDir:he.codeExportDir,packTestDir:Q?.packTestDir})}catch(Ue){C.log("error","DIRECT_PERSIST_ERROR","Persist failed in agent mode",{error:String(Ue)})}}}catch(F){C.log("error","DIRECT_UPLOAD_ERROR","Upload failed in agent mode",{error:F instanceof Error?F.message:String(F)})}let N=await jt({});if(Q&&N?.sealed){let{offerEvidenceView:F}=await import("./evidence-NDAKCCHQ.js");await F({packPath:Q.packDir,env:h,isTTY:!1,log:H=>process.stderr.write(H+`
185
+ `)})}if($){let F={...$};Y&&(F.test_url=Y),b(F)}await C.finish("complete"),$||y(Z?2:1,"Agent run ended with no result");let pe=$.reason??"";(pe.includes("Cancel")||pe.includes("Timeout"))&&y(3,`Agent run: ${pe}`),$.status==="passed"&&y(0,"Agent run passed"),y(1,"Agent run failed")}let ce=null,yt=0,kn=!1,Or=null,Dr=0,Mr={current:null},Ba=B?{authHeader:In(B.username,B.access_key),sessionId:C.sessionId,controllerBaseUrl:se(h).controllerBaseUrl}:null,{waitUntilExit:Ha}=Qe(vr.default.createElement(Ze,null,vr.default.createElement(Xi,{config:Pr,describeContext:Ba,spawnOpts:{environment:h,mode:u,assertionMode:c,finalValidation:m,log:(b,T,$,j)=>C.log(b,T,$,j)},cancelRef:Mr,banner:{model:r.model??l.model,auth:w,status:_},onComplete:b=>{ce=b.lastRunEnd,yt=b.stepsTotal,kn=b.hadError,Or=b.bifurcationFlows,Dr=b.describeCredits,Rr(Q,b.evidence,b.lastRunEnd)},onStepEnd:$r,onReasoning:b=>Te?.setStepText(b),onStepComplete:()=>Te?.setStepComplete()})),{stdout:process.stderr,exitOnCtrlC:!1}),xn;if(r.timeout){let b=parseInt(r.timeout,10)*1e3;xn=setTimeout(()=>{console.error(`
186
+ Timeout: ${r.timeout}s exceeded \u2014 cancelling...`),Mr.current?.()},b)}Te?.setRunActive(!0);try{await Ha()}finally{Te?.setRunActive(!1)}if(xn&&clearTimeout(xn),ce){let b=An(ce,0,Or);C.addRunResult(Pn(ce,M.auteurObjective,0,b),ce.total_runs);let T=ce.status==="passed"?"passed":kn?"error":"failed";C.addFlow({runIndex:0,objective:M.auteurObjective,status:T,summary:ce.summary??"",duration:ce.duration??0,steps:yt,stepsPassed:T==="passed"?yt:0,stepsFailed:T==="passed"?0:yt,reason:ce.reason,creditsConsumed:(ce.credits_consumed??0)+Dr})}Q&&await wn(),En("chrome","Ink run completed");{let b=u==="testing",T=C.nextRunIndex()>0;if(b&&!r.name&&T&&process.stdin.isTTY)try{let{renderSavePrompt:$,defaultSessionTimestamp:j}=await import("./SaveSessionPrompt-QGO65DZN.js"),Z=await $(j());Z&&C.setSessionName(Z)}catch($){C.log("warn","DIRECT_SAVE_PROMPT_FAILED","Save prompt failed",{error:String($)})}}if(C.log("info","DIRECT_UPLOAD_START","Starting direct upload (ink mode)",{ink_mode:!0,last_event:!!ce,local:!!r.local,mobile:le.kind==="device"}),ce&&!r.local)try{let b=se(h),T=A.project_id;if(f.basicAuth){let{UploadPipeline:$}=await import("./pipeline-MTAZDCZR.js");De&&(C.log("info","SCREENSHOT_UPLOAD_DRAIN","Draining screenshot upload queue before pipeline"),await yn.settle(),await De.drain(),C.log("info","SCREENSHOT_UPLOAD_DRAINED","Screenshot upload queue drained"));let j=jn({mobile:le.kind==="device",session:C,env:h,auth:f,variables:M,variableIds:Tr,projectId:A.project_id,folderId:A.folder_id,totalSteps:yt,totalDuration:ce.duration??0,screenshotExtMap:De?.getExtMap(),codeExport:Nn({codeExport:r.codeExport,codeLanguage:r.codeLanguage,skipCodeValidation:r.skipCodeValidation},l.code_export),onProgress:()=>{},log:(N,pe,F,H)=>C.log(N,pe,F,H),shouldUploadArtifacts:!r.local,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0,evidence:Q?{executionId:Q.executionId,packTestDir:Q.packTestDir,sealedPackPath:Q.packDir,sealFn:jt}:void 0}),Z=new $(j),{renderUploadProgress:_e}=await import("./CliUploadProgress-I3N5WDNJ.js"),Y=await _e(Z,N=>{if(N.testcaseId&&N.shareId&&T)return en(b.testManagerUiUrl,T,N.testcaseId,N.shareId)});if(Y.success){Y.testcaseId&&C.setTestcaseId(Y.testcaseId);let N=null;try{let{persistRecordedSession:H}=await import("./persist-recorded-session-LE3LGFOS.js");N=await H(C,{testcaseId:C.testcaseId??void 0,projectId:A.project_id??void 0,folderId:A.folder_id??void 0,codeExportDir:Y.codeExportDir,packTestDir:Q?.packTestDir})}catch(H){C.log("error","DIRECT_PERSIST_ERROR","Persist failed in ink mode",{error:String(H)})}let pe=Y.testcaseId&&Y.shareId&&T?en(b.testManagerUiUrl,T,Y.testcaseId,Y.shareId):void 0,F=Y.testcaseId&&T?Qo(b.testManagerUiUrl,T,Y.testcaseId):void 0;if(pe||F||Y.codeExportDir||N){let{LinksBox:H}=await import("./LinksBox-L24KON4U.js"),{render:W}=await import("./build-JIKYOZUH.js"),fe=await import("./react-QWOAB3TB.js"),{waitUntilExit:Ye}=W(fe.default.createElement(H,{recordedTestPath:N?.recordedTestPath,outputDir:N?.outputDir,shareableLink:pe,testCaseLink:F,codeExportDir:Y.codeExportDir}),{stdout:process.stderr});await Ye()}}if(C.testId){let{renderFeedbackPrompt:N}=await import("./CliFeedbackPrompt-Y3OYZX54.js"),pe=await N();if(pe)try{await gi({tmsBaseUrl:b.tmsBaseUrl,username:f.basicAuth.username,accessKey:f.basicAuth.access_key,testId:C.testId,feedbackType:pe,log:(F,H,W,fe)=>C.log(F,H,W,fe)})}catch(F){C.log("warn","FEEDBACK_FAILED","Feedback submission failed",{error:String(F)})}}}}catch(b){C.log("error","DIRECT_UPLOAD_FAILED","Direct upload failed (ink mode)",{error:b instanceof Error?b.stack??b.message:String(b)}),console.error(`Upload failed: ${b}`)}let Wa=await jt({});if(Q&&Wa?.sealed){let{offerEvidenceView:b}=await import("./evidence-NDAKCCHQ.js"),T=ce?.reason??"",$=T.includes("Cancel")||T.includes("Timeout");await b({packPath:Q.packDir,env:h,isTTY:!!process.stdin.isTTY&&!!process.stderr.isTTY&&!$,log:j=>process.stderr.write(j+`
187
+ `)})}await C.finish("complete"),ce||y(kn?2:1,"Run ended with no result");let _n=ce.reason??"";(_n.includes("Cancel")||_n.includes("Timeout"))&&y(3,`Run: ${_n}`),ce.status==="passed"&&y(0,"Run passed"),y(1,"Run failed")}catch(a){y(2,`CLI error: ${a instanceof Error?a.message:String(a)}`)}}),ls(t),cs(t),ds(t),us(t),ms(t),t.addCommand(ka()),t.addCommand(Ia()),$i(t),e&&(rs(t),Ta(t)),t.command("install <target> [version]").description("Install kane-cli agent skill into Claude Code / Codex CLI / Gemini CLI (version defaults to latest compatible)").action(async(o,r)=>{if(o==="plugin"){let c=r;if(!c){console.error("error: usage: kane-cli install plugin <name>"),y(2,"install plugin: missing name");return}let{installPlugin:m}=await import("./install-NIVU4XVS.js"),p=m(c,{});if(p.status==="failed"){console.error(`error: ${p.error}`),y(/unknown plugin/i.test(p.error??"")?2:1,`install plugin: ${p.status}`);return}let{ensureHyperexecuteBinary:g}=await import("./binary-5LMQJ3CZ.js"),d=c==="remote-execution"?await g(J):void 0;process.stdin.isTTY?(process.stderr.write(`${p.status==="already-installed"?"already installed":"installed"} ${p.name}@${p.version} \u2192 ${p.dir}
188
188
  `),d&&(d.status==="failed"?process.stderr.write(`\u26A0 hyperexecute binary download failed (${d.error}) \u2014 re-run \`kane-cli install plugin ${p.name}\`
189
189
  `):process.stderr.write(`\u2713 hyperexecute binary ${d.status} \u2192 ${d.path}
190
190
  `)),process.stderr.write(`run \`kane-cli plugin doctor ${p.name}\` to check readiness for --remote
191
191
  `)):process.stdout.write(JSON.stringify({type:"plugin_install_result",status:p.status,name:p.name,version:p.version,dir:p.dir,error:p.error,binary:d})+`
192
- `),y(0,`install plugin: ${p.status}`);return}if(o!=="skill"){console.error(`error: unknown install target '${o}'. Supported: skill, plugin`),y(2,`unknown install target '${o}'`);return}let{installSkill:s,formatInstallResult:a}=await import("./skill-installer-QLQK4JJE.js"),l=await s(r);!process.stdin.isTTY?process.stdout.write(JSON.stringify({type:"skill_install_result",status:l.status,version:l.version,installed_targets:l.installedTargets,error:l.error})+`
193
- `):process.stderr.write(a(l)+`
194
- `),y(l.status==="failed"?1:0,`install skill: ${l.status}`)}),t.command("profiles [action] [name]").description("Manage auth profiles (list | switch | delete)").option("--env <name>","Environment for switch/delete").action(async(o,r,s)=>{let a=new de;if(o==="list"||!o&&!process.stdin.isTTY){let m=a.listProfiles();if(m.length===0){console.log("No profiles configured. Run: kane-cli login");return}let p=a.getActiveProfile(),g=a.getDefaultEnv();for(let d of m){let w=d.profile===p&&d.env===g?" (active)":"";console.log(`${d.profile} [${d.env}]${w}`)}return}if(o==="switch"&&r){let m=s?.env??a.getDefaultEnv();a.setActiveProfile(r),a.setDefaultEnv(m),Kt(a,new Ce,r,m),console.log(`Switched to ${r} [${m}]`);return}if(o==="delete"&&r){let m=s?.env??a.getDefaultEnv();a.deleteProfileFull(r,m),console.log(`Deleted profile ${r} [${m}]`);return}process.stdin.isTTY||(console.error("Usage: kane-cli profiles list|switch|delete <name> [--env <env>]"),y(1,"Invalid profiles usage"));let{ProfilesView:l}=await import("./ProfilesView-QJBR3RCM.js"),{render:u}=await import("./build-JIKYOZUH.js"),c=await import("./react-QWOAB3TB.js");await new Promise(m=>{let{unmount:p}=u(c.default.createElement(l,{creds:a,onSwitch:(g,d)=>{a.setActiveProfile(g),a.setDefaultEnv(d),console.log(`Switched to ${g} [${d}]`)},onCancel:()=>{p(),m()}}))})}),t.command("feedback").description("Send thumbs-up/down feedback for a completed test run").requiredOption("--test-id <id>","Test ID").requiredOption("--feedback-type <type>","Feedback type: positive or negative").option("--details <text>","Feedback details (max 500 characters)").option("--username <user>","Basic auth username").option("--access-key <key>","Basic auth access key").option("--env <name>","Environment (prod or stage)").action(async o=>{o.feedbackType!=="positive"&&o.feedbackType!=="negative"&&(console.error('Error: --feedback-type must be "positive" or "negative"'),y(1,'Invalid --feedback-type (must be "positive" or "negative")')),o.details&&o.details.length>500&&(console.error("Error: --details must be 500 characters or fewer"),y(1,"--details exceeds 500 character limit"));let r=new de,s=o.env??r.getDefaultEnv(),a=se(s),l,u;try{let c=await je({creds:r,env:s,usernameFlag:o.username,accessKeyFlag:o.accessKey,log:()=>{}});l=c.resolvedCreds?.username??c.basicAuth?.username,u=c.resolvedCreds?.access_key??c.basicAuth?.access_key}catch{console.error("Not authenticated. Run: kane-cli login"),y(2,"Not authenticated for feedback")}(!l||!u)&&(console.error(JSON.stringify({error:"Could not resolve TMS credentials"})),y(1,"Could not resolve TMS credentials for feedback"));try{let{TmsClient:c}=await import("./tms-client-V3TR4QW3.js"),p=await new c(a.tmsBaseUrl,l,u).submitFeedback({instruction_id:"",test_id:o.testId,feedback_type:o.feedbackType,details:o.details,mode:"agent"});console.log(JSON.stringify(p)),y(0,"Feedback submitted")}catch(c){console.error(JSON.stringify({error:c instanceof Error?c.message:String(c)})),y(1,`Feedback failed: ${c instanceof Error?c.message:String(c)}`)}}),t.command("balance").description("Check credit balance").option("--profile <name>","Profile name").option("--username <user>","Basic auth username").option("--access-key <key>","Basic auth access key").option("--env <name>","Environment (prod or stage)").action(async o=>{let r=new de,s=o.env??r.getDefaultEnv(),a=se(s),l=null;try{let u=await je({creds:r,env:s,usernameFlag:o.username,accessKeyFlag:o.accessKey,log:()=>{}}),c=u.resolvedCreds??(u.basicAuth?{username:u.basicAuth.username,access_key:u.basicAuth.access_key}:null);c&&(l={username:c.username,accessKey:c.access_key})}catch{console.error(`Not authenticated [${s}]. Run "kane-cli login" first.`),y(2,`Not authenticated for balance [${s}]`)}l||(console.error(`Could not resolve credentials [${s}]. Run "kane-cli login" again.`),y(2,`Could not resolve credentials for balance [${s}]`));try{let{ControllerClient:u}=await import("./controller-client-OB4WD2C4.js"),m=await new u(a.controllerBaseUrl,l).getCreditBalance();console.log(`Available credits: ${m.available_credits}`),console.log(`Total credits: ${m.total_credits}`),y(0,"Balance retrieved")}catch(u){console.error(`Error: ${u instanceof Error?u.message:String(u)}`),y(1,`Balance check failed: ${u instanceof Error?u.message:String(u)}`)}}),t.command("generate").description("Generate TCG test cases (TUI when interactive; NDJSON/plain when piped, --agent, --refine, or --save)").argument("[objective]",'Generation prompt (e.g. "checkout flow on staging"). Required for new + --refine; omit for --save.').option("--refine","Refine an existing request with <objective>. Requires --req.").option("--save","Save an existing request to disk. Requires --req; --out optional (defaults to <cwd>/.testmuai/tests). Takes no objective.").option("--req <id>","The request id to --refine or --save.").option("--out <dir>","Save target dir (only with --save; default <cwd>/.testmuai/tests).").option("--agent","Emit typed NDJSON on stdout (auto-on when stdin is not a TTY)").option("--name <name>","Name for this generation: sets the session name (like run/testmd) AND the --save suite folder (overrides the auto-derived name)").option("--scenario-limit <n>","Max number of scenarios to generate (1-20)").option("--per-scenario-limit <n>","Max test cases per scenario (1-20)").option("--memory","Enable memory enhancement for generation").option("--project <id>","TMS project id (default: org/config default)").option("--folder <id>","TMS folder id").option("--env <name>","Environment (prod or stage)").option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key").option("--files <paths>","Comma-separated local files to attach (allowlisted types, \u226450MB each, \u226410; new/refine only)").action(async(o,r)=>{let s=r.scenarioLimit?parseInt(r.scenarioLimit,10):void 0,a=r.perScenarioLimit?parseInt(r.perScenarioLimit,10):void 0,{decideGenerateMode:l,resolveGenerateOp:u,defaultOutDir:c,buildHeadlessDeps:m,runGenerateHeadless:p,parseFilesFlag:g}=await import("./generate-headless-FYTJULPG.js"),d=u({objective:o,refine:r.refine,save:r.save,req:r.req,out:r.out});if("error"in d){process.stderr.write(`error: ${d.error}
192
+ `),y(0,`install plugin: ${p.status}`);return}if(o!=="skill"){console.error(`error: unknown install target '${o}'. Supported: skill, plugin`),y(2,`unknown install target '${o}'`);return}let{installSkill:a,formatInstallResult:s}=await import("./skill-installer-W4TT5MST.js"),l=await a(r);!process.stdin.isTTY?process.stdout.write(JSON.stringify({type:"skill_install_result",status:l.status,version:l.version,installed_targets:l.installedTargets,error:l.error})+`
193
+ `):process.stderr.write(s(l)+`
194
+ `),y(l.status==="failed"?1:0,`install skill: ${l.status}`)}),t.command("profiles [action] [name]").description("Manage auth profiles (list | switch | delete)").option("--env <name>","Environment for switch/delete").action(async(o,r,a)=>{let s=new de;if(o==="list"||!o&&!process.stdin.isTTY){let m=s.listProfiles();if(m.length===0){console.log("No profiles configured. Run: kane-cli login");return}let p=s.getActiveProfile(),g=s.getDefaultEnv();for(let d of m){let w=d.profile===p&&d.env===g?" (active)":"";console.log(`${d.profile} [${d.env}]${w}`)}return}if(o==="switch"&&r){let m=a?.env??s.getDefaultEnv();s.setActiveProfile(r),s.setDefaultEnv(m),Kt(s,new Ce,r,m),console.log(`Switched to ${r} [${m}]`);return}if(o==="delete"&&r){let m=a?.env??s.getDefaultEnv();s.deleteProfileFull(r,m),console.log(`Deleted profile ${r} [${m}]`);return}process.stdin.isTTY||(console.error("Usage: kane-cli profiles list|switch|delete <name> [--env <env>]"),y(1,"Invalid profiles usage"));let{ProfilesView:l}=await import("./ProfilesView-H6XCTIXI.js"),{render:u}=await import("./build-JIKYOZUH.js"),c=await import("./react-QWOAB3TB.js");await new Promise(m=>{let{unmount:p}=u(c.default.createElement(l,{creds:s,onSwitch:(g,d)=>{s.setActiveProfile(g),s.setDefaultEnv(d),console.log(`Switched to ${g} [${d}]`)},onCancel:()=>{p(),m()}}))})}),t.command("feedback").description("Send thumbs-up/down feedback for a completed test run").requiredOption("--test-id <id>","Test ID").requiredOption("--feedback-type <type>","Feedback type: positive or negative").option("--details <text>","Feedback details (max 500 characters)").option("--username <user>","Basic auth username").option("--access-key <key>","Basic auth access key").option("--env <name>","Environment (prod or stage)").action(async o=>{o.feedbackType!=="positive"&&o.feedbackType!=="negative"&&(console.error('Error: --feedback-type must be "positive" or "negative"'),y(1,'Invalid --feedback-type (must be "positive" or "negative")')),o.details&&o.details.length>500&&(console.error("Error: --details must be 500 characters or fewer"),y(1,"--details exceeds 500 character limit"));let r=new de,a=o.env??r.getDefaultEnv(),s=se(a),l,u;try{let c=await je({creds:r,env:a,usernameFlag:o.username,accessKeyFlag:o.accessKey,log:()=>{}});l=c.resolvedCreds?.username??c.basicAuth?.username,u=c.resolvedCreds?.access_key??c.basicAuth?.access_key}catch{console.error("Not authenticated. Run: kane-cli login"),y(2,"Not authenticated for feedback")}(!l||!u)&&(console.error(JSON.stringify({error:"Could not resolve TMS credentials"})),y(1,"Could not resolve TMS credentials for feedback"));try{let{TmsClient:c}=await import("./tms-client-V3TR4QW3.js"),p=await new c(s.tmsBaseUrl,l,u).submitFeedback({instruction_id:"",test_id:o.testId,feedback_type:o.feedbackType,details:o.details,mode:"agent"});console.log(JSON.stringify(p)),y(0,"Feedback submitted")}catch(c){console.error(JSON.stringify({error:c instanceof Error?c.message:String(c)})),y(1,`Feedback failed: ${c instanceof Error?c.message:String(c)}`)}}),t.command("balance").description("Check credit balance").option("--profile <name>","Profile name").option("--username <user>","Basic auth username").option("--access-key <key>","Basic auth access key").option("--env <name>","Environment (prod or stage)").action(async o=>{let r=new de,a=o.env??r.getDefaultEnv(),s=se(a),l=null;try{let u=await je({creds:r,env:a,usernameFlag:o.username,accessKeyFlag:o.accessKey,log:()=>{}}),c=u.resolvedCreds??(u.basicAuth?{username:u.basicAuth.username,access_key:u.basicAuth.access_key}:null);c&&(l={username:c.username,accessKey:c.access_key})}catch{console.error(`Not authenticated [${a}]. Run "kane-cli login" first.`),y(2,`Not authenticated for balance [${a}]`)}l||(console.error(`Could not resolve credentials [${a}]. Run "kane-cli login" again.`),y(2,`Could not resolve credentials for balance [${a}]`));try{let{ControllerClient:u}=await import("./controller-client-OB4WD2C4.js"),m=await new u(s.controllerBaseUrl,l).getCreditBalance();console.log(`Available credits: ${m.available_credits}`),console.log(`Total credits: ${m.total_credits}`),y(0,"Balance retrieved")}catch(u){console.error(`Error: ${u instanceof Error?u.message:String(u)}`),y(1,`Balance check failed: ${u instanceof Error?u.message:String(u)}`)}}),t.command("generate").description("Generate TCG test cases (TUI when interactive; NDJSON/plain when piped, --agent, --refine, or --save)").argument("[objective]",'Generation prompt (e.g. "checkout flow on staging"). Required for new + --refine; omit for --save.').option("--refine","Refine an existing request with <objective>. Requires --req.").option("--save","Save an existing request to disk. Requires --req; --out optional (defaults to <cwd>/.testmuai/tests). Takes no objective.").option("--req <id>","The request id to --refine or --save.").option("--out <dir>","Save target dir (only with --save; default <cwd>/.testmuai/tests).").option("--agent","Emit typed NDJSON on stdout (auto-on when stdin is not a TTY)").option("--name <name>","Name for this generation: sets the session name (like run/testmd) AND the --save suite folder (overrides the auto-derived name)").option("--scenario-limit <n>","Max number of scenarios to generate (1-20)").option("--per-scenario-limit <n>","Max test cases per scenario (1-20)").option("--memory","Enable memory enhancement for generation").option("--project <id>","TMS project id (default: org/config default)").option("--folder <id>","TMS folder id").option("--env <name>","Environment (prod or stage)").option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key").option("--files <paths>","Comma-separated local files to attach (allowlisted types, \u226450MB each, \u226410; new/refine only)").action(async(o,r)=>{let a=r.scenarioLimit?parseInt(r.scenarioLimit,10):void 0,s=r.perScenarioLimit?parseInt(r.perScenarioLimit,10):void 0,{decideGenerateMode:l,resolveGenerateOp:u,defaultOutDir:c,buildHeadlessDeps:m,runGenerateHeadless:p,parseFilesFlag:g}=await import("./generate-headless-DBT4MKQT.js"),d=u({objective:o,refine:r.refine,save:r.save,req:r.req,out:r.out});if("error"in d){process.stderr.write(`error: ${d.error}
195
195
  `),y(2,`generate: ${d.error}`);return}let w=d.op,_=g(r.files);if(w==="save"&&_){process.stderr.write(`error: --files is not valid with --save
196
- `),y(2,"generate: --files not valid with --save");return}let{headless:h,mode:v}=l(r,!!process.stdin.isTTY);if(!h){let{runGenerate:f}=await import("./tcg-generate-VBC5ODDI.js");await f({objective:o,scenarioLimit:s,perScenarioLimit:a});return}let R=await m({mode:v,env:r.env,projectId:r.project,folderId:r.folder,username:r.username,accessKey:r.accessKey,name:r.name}),I=await p({op:w,objective:o,reqId:r.req,outDir:w==="save"?r.out?cd(process.cwd(),r.out):c():void 0,suiteName:r.name,scenarioLimit:s,perScenarioLimit:a,memory:r.memory,files:_},R);y(I,"generate complete")}),t.command("changelog").description("Show recent release notes").option("--all","Show all releases instead of latest 5").action(async o=>{let{fetchChangelog:r,formatChangelog:s}=await import("./changelog-WCCTI47M.js"),a=await r({all:o.all});console.log(s(a))}),t.addCommand(ud()),t}function Ot(n){dd().parse(["node","kane-cli",...n])}function ud(){let n=new tt("evidence").description("Evidence pack operations");return n.command("validate").argument("<target>","execution id, pack dir, or sealed .evidence").option("--profile <profile>","L0 | L1","L1").option("--json","machine-readable",!1).action(async(e,t)=>{let{runEvidenceValidate:i}=await import("./evidence-5AUZMKE3.js");process.exitCode=await i(e,{profile:t.profile,json:t.json})}),n.command("serve").argument("<paths...>","sealed .evidence file(s) to serve to the hosted viewer").option("--port <n>","pin the local port (default: ephemeral)",e=>parseInt(e,10)).option("--viewer-url <base>","override the hosted viewer base URL").option("--env <name>","environment (prod or stage)").action(async(e,t)=>{let{runEvidenceServe:i}=await import("./evidence-5AUZMKE3.js"),{CredentialsManager:o}=await import("./credentials-SO3DSQEM.js"),r=t.env??new o().getDefaultEnv()??"prod";process.exitCode=await i(e,{port:t.port,viewerUrl:t.viewerUrl,env:r})}),n.command("merge").argument("<targets...>","execution ids or pack paths (order-significant)").option("--run-id <id>","run_id for the merged pack (required \u2014 identity is the caller's fact)").option("-o, --out <path>","output path (default: .testmuai/evidence/<run-id>.evidence)").option("--rules <path>","merge-rules.yaml (replaces the kane defaults wholesale)").option("--on-collision <action>","error | prefer-first | prefer-latest | discard").option("--title <title>","merged run title (default: first eligible pack's)").option("--no-finalize","keep the merged pack live instead of sealing it").option("--json","machine-readable MergeReport",!1).option("--env <name>","environment (prod or stage)").action(async(e,t)=>{let{runEvidenceMerge:i}=await import("./evidence-5AUZMKE3.js"),{CredentialsManager:o}=await import("./credentials-SO3DSQEM.js"),r=t.env??new o().getDefaultEnv()??"prod";process.exitCode=await i(e,{runId:t.runId,out:t.out,rules:t.rules,onCollision:t.onCollision,title:t.title,finalize:t.finalize,json:t.json,env:r})}),n}function Ra(n){let e=n.indexOf("--mode");return e>=0&&n[e+1]==="agent"||n.includes("--mode=agent")}function Aa(n,e,t=50){let i=!1,o=(r,s)=>{if(!s)return;let a=r.line(s);a!=null&&e(a)};return{eager(){for(let r of n)r.promise.then(s=>{i||o(r,s)}).catch(()=>{})},async bounded(){if(i)return;let r=new Promise(a=>{setTimeout(()=>a(null),t).unref?.()}),s=await Promise.all(n.map(a=>Promise.race([a.promise.catch(()=>null),r])));i=!0,s.forEach((a,l)=>o(n[l],a))},silence(){i=!0}}}function Pa(n){let e,t,i,o=[];for(let r=0;r<n.length;r++){let s=n[r];if(s==="--code-export")e=!0;else if(s==="--skip-code-validation"){let a=n[r+1]?.toLowerCase();a==="true"||a==="false"?(i=a==="true",r++):i=!0}else if(s==="--skip-code-validation=true"||s==="--skip-code-validation=false")i=s.endsWith("=true");else if(s==="--no-skip-code-validation")i=!1;else if(s==="--code-language"){let a=n[r+1];a!==void 0&&(t=a,r++)}else s.startsWith("--code-language=")?t=s.slice(16):o.push(s)}return{codeExport:e,codeLanguage:t,skipCodeValidation:i,filteredArgs:o}}function Oa(n){return n[0]==="run"?!0:(n[0]==="testmd"||n[0]==="testrun")&&n[1]==="run"}function wr(n,e){let t=n[0];if(t!=="run"&&!(t==="testmd"&&n[1]==="run"))return n;let i=[...n];return e.codeExport&&i.push("--code-export"),e.codeLanguage&&i.push("--code-language",e.codeLanguage),e.skipCodeValidation===!0&&i.push("--skip-code-validation"),e.skipCodeValidation===!1&&i.push("--no-skip-code-validation"),i}function gn(n,e){let t=n.split(".").map(o=>Number(o)||0),i=e.split(".").map(o=>Number(o)||0);for(let o=0;o<3;o++){let r=t[o]??0,s=i[o]??0;if(r<s)return-1;if(r>s)return 1}return 0}var md=[{version:"0.2.11",description:"Code export is now enabled by default (Python remains the default language; JavaScript is also available). Default run mode is now 'testing'.",apply:n=>{let e=[];return n.code_export.enabled===!1&&e.push({field:"code_export.enabled",from:!1,to:!0,description:"Code export is now enabled by default."}),n.mode==="action"&&e.push({field:"mode",from:"action",to:"testing",description:"Default run mode is now 'testing'."}),{cfg:{...n,code_export:{...n.code_export,enabled:!0},mode:"testing"},changes:e}}},{version:"0.5.1",description:"Assertions now read the DOM first (falling back to vision when the value isn't in the DOM). Default assertion mode is now 'dom'.",apply:n=>{let e=[];return n.assertion_mode==="visual"&&e.push({field:"assertion_mode",from:"visual",to:"dom",description:"Default assertion mode is now 'dom' (DOM-first, vision fallback)."}),{cfg:{...n,assertion_mode:"dom"},changes:e}}}];function Da(n,e=Me,t=md){let i=n.exists(),o=n.load();if(!i)return n.set("last_seen_version",e),{changes:[],fromVersion:e,toVersion:e,appliedVersions:[]};let r=o.last_seen_version||"0.0.0";if(gn(r,e)>=0)return{changes:[],fromVersion:r,toVersion:r,appliedVersions:[]};let s=t.filter(m=>gn(r,m.version)<0&&gn(m.version,e)<=0).sort((m,p)=>gn(m.version,p.version)),a=o,l=[],u=[];for(let m of s){let{cfg:p,changes:g}=m.apply(a);a=p,l.push(...g),u.push(m.version)}let c={...a,last_seen_version:e};return n.writeRaw(c),{changes:l,fromVersion:r,toVersion:e,appliedVersions:u}}function $a(n){return n.changes.length===0?"":[`kane-cli updated to ${n.toVersion}. Default settings changed:`,...n.changes.map(t=>` \u2022 ${t.description} (${t.field}: ${JSON.stringify(t.from)} \u2192 ${JSON.stringify(t.to)})`),"","Use /config to review or revert any of these."].join(`
197
- `)}zr();Mi();Di();var Na=nn().catch(()=>null),pd=rn().catch(()=>null);jo(void 0,Yr);var hn=null,Sr=()=>hn||(hn=Da(new Ce),hn),bn=ae.argv.slice(2),fd=bn.includes("--dev"),yr=bn.includes("--local"),gd=bn.includes("--tui");fd&&(ae.env.KANE_DEV_MODE="1");var hd=bn.filter(n=>!["--dev","--local","--tui"].includes(n));function bd(n){let e=[],t;for(let i=0;i<n.length;i++){let o=n[i];if(o==="--name"&&i+1<n.length){t=n[i+1],i++;continue}if(o.startsWith("--name=")){t=o.slice(7);continue}e.push(o)}return{name:t,rest:e}}var vn=Pa(hd),Fe=vn.filteredArgs,kr=vn.codeExport,xr=vn.codeLanguage,_r=vn.skipCodeValidation,Cr=Aa([{promise:Na,line:n=>{let e=n;return`
196
+ `),y(2,"generate: --files not valid with --save");return}let{headless:h,mode:v}=l(r,!!process.stdin.isTTY);if(!h){let{runGenerate:f}=await import("./tcg-generate-ONLV5GXG.js");await f({objective:o,scenarioLimit:a,perScenarioLimit:s});return}let R=await m({mode:v,env:r.env,projectId:r.project,folderId:r.folder,username:r.username,accessKey:r.accessKey,name:r.name}),I=await p({op:w,objective:o,reqId:r.req,outDir:w==="save"?r.out?cd(process.cwd(),r.out):c():void 0,suiteName:r.name,scenarioLimit:a,perScenarioLimit:s,memory:r.memory,files:_},R);y(I,"generate complete")}),t.command("changelog").description("Show recent release notes").option("--all","Show all releases instead of latest 5").action(async o=>{let{fetchChangelog:r,formatChangelog:a}=await import("./changelog-JLSLSA3Y.js"),s=await r({all:o.all});console.log(a(s))}),t.addCommand(ud()),t}function $t(n){dd().parse(["node","kane-cli",...n])}function ud(){let n=new tt("evidence").description("Evidence pack operations");return n.command("validate").argument("<target>","execution id, pack dir, or sealed .evidence").option("--profile <profile>","L0 | L1","L1").option("--json","machine-readable",!1).action(async(e,t)=>{let{runEvidenceValidate:i}=await import("./evidence-NDAKCCHQ.js");process.exitCode=await i(e,{profile:t.profile,json:t.json})}),n.command("serve").argument("<paths...>","sealed .evidence file(s) to serve to the hosted viewer").option("--port <n>","pin the local port (default: ephemeral)",e=>parseInt(e,10)).option("--viewer-url <base>","override the hosted viewer base URL").option("--env <name>","environment (prod or stage)").action(async(e,t)=>{let{runEvidenceServe:i}=await import("./evidence-NDAKCCHQ.js"),{CredentialsManager:o}=await import("./credentials-ZSNM4BTD.js"),r=t.env??new o().getDefaultEnv()??"prod";process.exitCode=await i(e,{port:t.port,viewerUrl:t.viewerUrl,env:r})}),n.command("merge").argument("<targets...>","execution ids or pack paths (order-significant)").option("--run-id <id>","run_id for the merged pack (required \u2014 identity is the caller's fact)").option("-o, --out <path>","output path (default: .testmuai/evidence/<run-id>.evidence)").option("--rules <path>","merge-rules.yaml (replaces the kane defaults wholesale)").option("--on-collision <action>","error | prefer-first | prefer-latest | discard").option("--title <title>","merged run title (default: first eligible pack's)").option("--no-finalize","keep the merged pack live instead of sealing it").option("--json","machine-readable MergeReport",!1).option("--env <name>","environment (prod or stage)").action(async(e,t)=>{let{runEvidenceMerge:i}=await import("./evidence-NDAKCCHQ.js"),{CredentialsManager:o}=await import("./credentials-ZSNM4BTD.js"),r=t.env??new o().getDefaultEnv()??"prod";process.exitCode=await i(e,{runId:t.runId,out:t.out,rules:t.rules,onCollision:t.onCollision,title:t.title,finalize:t.finalize,json:t.json,env:r})}),n}function Ra(n){let e=n.indexOf("--mode");return e>=0&&n[e+1]==="agent"||n.includes("--mode=agent")}function Aa(n,e,t=50){let i=!1,o=(r,a)=>{if(!a)return;let s=r.line(a);s!=null&&e(s)};return{eager(){for(let r of n)r.promise.then(a=>{i||o(r,a)}).catch(()=>{})},async bounded(){if(i)return;let r=new Promise(s=>{setTimeout(()=>s(null),t).unref?.()}),a=await Promise.all(n.map(s=>Promise.race([s.promise.catch(()=>null),r])));i=!0,a.forEach((s,l)=>o(n[l],s))},silence(){i=!0}}}function Pa(n){let e,t,i,o=[];for(let r=0;r<n.length;r++){let a=n[r];if(a==="--code-export")e=!0;else if(a==="--skip-code-validation"){let s=n[r+1]?.toLowerCase();s==="true"||s==="false"?(i=s==="true",r++):i=!0}else if(a==="--skip-code-validation=true"||a==="--skip-code-validation=false")i=a.endsWith("=true");else if(a==="--no-skip-code-validation")i=!1;else if(a==="--code-language"){let s=n[r+1];s!==void 0&&(t=s,r++)}else a.startsWith("--code-language=")?t=a.slice(16):o.push(a)}return{codeExport:e,codeLanguage:t,skipCodeValidation:i,filteredArgs:o}}function $a(n){return n[0]==="run"?!0:(n[0]==="testmd"||n[0]==="testrun")&&n[1]==="run"}function wr(n,e){let t=n[0];if(t!=="run"&&!(t==="testmd"&&n[1]==="run"))return n;let i=[...n];return e.codeExport&&i.push("--code-export"),e.codeLanguage&&i.push("--code-language",e.codeLanguage),e.skipCodeValidation===!0&&i.push("--skip-code-validation"),e.skipCodeValidation===!1&&i.push("--no-skip-code-validation"),i}function gn(n,e){let t=n.split(".").map(o=>Number(o)||0),i=e.split(".").map(o=>Number(o)||0);for(let o=0;o<3;o++){let r=t[o]??0,a=i[o]??0;if(r<a)return-1;if(r>a)return 1}return 0}var md=[{version:"0.2.11",description:"Code export is now enabled by default (Python remains the default language; JavaScript is also available). Default run mode is now 'testing'.",apply:n=>{let e=[];return n.code_export.enabled===!1&&e.push({field:"code_export.enabled",from:!1,to:!0,description:"Code export is now enabled by default."}),n.mode==="action"&&e.push({field:"mode",from:"action",to:"testing",description:"Default run mode is now 'testing'."}),{cfg:{...n,code_export:{...n.code_export,enabled:!0},mode:"testing"},changes:e}}},{version:"0.5.1",description:"Assertions now read the DOM first (falling back to vision when the value isn't in the DOM). Default assertion mode is now 'dom'.",apply:n=>{let e=[];return n.assertion_mode==="visual"&&e.push({field:"assertion_mode",from:"visual",to:"dom",description:"Default assertion mode is now 'dom' (DOM-first, vision fallback)."}),{cfg:{...n,assertion_mode:"dom"},changes:e}}}];function Oa(n,e=Me,t=md){let i=n.exists(),o=n.load();if(!i)return n.set("last_seen_version",e),{changes:[],fromVersion:e,toVersion:e,appliedVersions:[]};let r=o.last_seen_version||"0.0.0";if(gn(r,e)>=0)return{changes:[],fromVersion:r,toVersion:r,appliedVersions:[]};let a=t.filter(m=>gn(r,m.version)<0&&gn(m.version,e)<=0).sort((m,p)=>gn(m.version,p.version)),s=o,l=[],u=[];for(let m of a){let{cfg:p,changes:g}=m.apply(s);s=p,l.push(...g),u.push(m.version)}let c={...s,last_seen_version:e};return n.writeRaw(c),{changes:l,fromVersion:r,toVersion:e,appliedVersions:u}}function Da(n){return n.changes.length===0?"":[`kane-cli updated to ${n.toVersion}. Default settings changed:`,...n.changes.map(t=>` \u2022 ${t.description} (${t.field}: ${JSON.stringify(t.from)} \u2192 ${JSON.stringify(t.to)})`),"","Use /config to review or revert any of these."].join(`
197
+ `)}zr();Mi();Oi();var Na=nn().catch(()=>null),pd=rn().catch(()=>null);jo(void 0,Yr);var hn=null,Sr=()=>hn||(hn=Oa(new Ce),hn),bn=ae.argv.slice(2),fd=bn.includes("--dev"),yr=bn.includes("--local"),gd=bn.includes("--tui");fd&&(ae.env.KANE_DEV_MODE="1");var hd=bn.filter(n=>!["--dev","--local","--tui"].includes(n));function bd(n){let e=[],t;for(let i=0;i<n.length;i++){let o=n[i];if(o==="--name"&&i+1<n.length){t=n[i+1],i++;continue}if(o.startsWith("--name=")){t=o.slice(7);continue}e.push(o)}return{name:t,rest:e}}var vn=Pa(hd),Fe=vn.filteredArgs,kr=vn.codeExport,xr=vn.codeLanguage,_r=vn.skipCodeValidation,Cr=Aa([{promise:Na,line:n=>{let e=n;return`
198
198
  Update available: ${e.current} \u2192 ${e.latest} \u2014 run \`${hi()}\` to update
199
199
 
200
200
  `}},{promise:pd,line:n=>{let e=n;return`Skill update available: ${e.current??"not installed"} \u2192 ${e.latestCompatible} \u2014 run \`kane-cli install skill\`
201
201
 
202
- `}}],n=>ae.stderr.write(n)),Ma=()=>Cr.eager(),ja=()=>{let n=$a(Sr());n&&ae.stderr.write(`
202
+ `}}],n=>ae.stderr.write(n)),Ma=()=>Cr.eager(),ja=()=>{let n=Da(Sr());n&&ae.stderr.write(`
203
203
  ${n}
204
204
 
205
- `)},vd=new Set(["--help","-h","--version","-V"]),wd=Fe[0]==="help"||Fe.some(n=>vd.has(n));if(wd)Ot(Fe);else if(gd){ae.stdin.isTTY||(ae.stderr.write(`Error: --tui mode requires an interactive terminal (TTY).
205
+ `)},vd=new Set(["--help","-h","--version","-V"]),wd=Fe[0]==="help"||Fe.some(n=>vd.has(n));if(wd)$t(Fe);else if(gd){ae.stdin.isTTY||(ae.stderr.write(`Error: --tui mode requires an interactive terminal (TTY).
206
206
  `),ae.exit(1)),Ma();let{name:n}=bd(Fe);if(n){let{validateNameOrThrow:i}=await import("./name-validator-5YGJXLZ7.js");try{i(n)}catch(o){ae.stderr.write(`error: ${o.message}
207
- `),ae.exit(2)}}let{waitUntilExit:e,unmount:t}=Qe(Dt.default.createElement(Ze,null,Dt.default.createElement(bi,{localMode:yr,codeExport:kr,codeLanguage:xr,skipCodeValidation:_r,updatePromise:Na,migrationResult:Sr(),sessionName:n})),{exitOnCtrlC:!1});_t(()=>t()),Tn(()=>{try{ae.stdin.setRawMode?.(!1)}catch{}ae.stdout.write("\x1B[?25h")}),e().then(()=>{y(0,"TUI session ended")})}else if(Fe.length>0){let n=Fe[0],e=Bt(),t=tr(e).has(n),i=n.startsWith("-");if(!t&&!i){let{message:l,exitCode:u}=ss(n,{hostSupportsMobile:e,mobileMessage:Ht()});ae.stderr.write(l),ae.exit(u)}Ra(Fe)?(Cr.silence(),Sr()):(n==="context"||n==="design"?await Cr.bounded():Ma(),ja());let s=yr&&Oa(Fe)?[...Fe,"--local"]:Fe,a=wr(s,{codeExport:kr,codeLanguage:xr,skipCodeValidation:_r});Ot(a)}else{ae.stdin.isTTY||(ae.stderr.write(`Error: kane-cli requires an interactive terminal (TTY) when run without arguments.
207
+ `),ae.exit(2)}}let{waitUntilExit:e,unmount:t}=Qe(Ot.default.createElement(Ze,null,Ot.default.createElement(bi,{localMode:yr,codeExport:kr,codeLanguage:xr,skipCodeValidation:_r,updatePromise:Na,migrationResult:Sr(),sessionName:n})),{exitOnCtrlC:!1});_t(()=>t()),Tn(()=>{try{ae.stdin.setRawMode?.(!1)}catch{}ae.stdout.write("\x1B[?25h")}),e().then(()=>{y(0,"TUI session ended")})}else if(Fe.length>0){let n=Fe[0],e=Bt(),t=tr(e).has(n),i=n.startsWith("-");if(!t&&!i){let{message:l,exitCode:u}=ss(n,{hostSupportsMobile:e,mobileMessage:Ht()});ae.stderr.write(l),ae.exit(u)}Ra(Fe)?(Cr.silence(),Sr()):(n==="context"||n==="design"?await Cr.bounded():Ma(),ja());let a=yr&&$a(Fe)?[...Fe,"--local"]:Fe,s=wr(a,{codeExport:kr,codeLanguage:xr,skipCodeValidation:_r});$t(s)}else{ae.stdin.isTTY||(ae.stderr.write(`Error: kane-cli requires an interactive terminal (TTY) when run without arguments.
208
208
  Usage: kane-cli "objective" for non-interactive mode.
209
- `),ae.exit(1));let n={current:null},{waitUntilExit:e,unmount:t}=Qe(Dt.default.createElement(Ze,null,Dt.default.createElement(qo,{resultRef:n})),{exitOnCtrlC:!1});_t(()=>t()),Tn(()=>{try{ae.stdin.setRawMode?.(!1)}catch{}ae.stdout.write("\x1B[?25h")}),e().then(()=>{Jr();let i=n.current;if(!i){y(0,"Single-shot session ended (no objective)");return}let o=i.objective.trim();if(o==="--help"||o==="-h"||o==="help"){Ot(["--help"]);return}ja();let r=["run",i.objective];yr&&r.push("--local"),Ot(wr(r,{codeExport:kr,codeLanguage:xr,skipCodeValidation:_r}))})}
209
+ `),ae.exit(1));let n={current:null},{waitUntilExit:e,unmount:t}=Qe(Ot.default.createElement(Ze,null,Ot.default.createElement(qo,{resultRef:n})),{exitOnCtrlC:!1});_t(()=>t()),Tn(()=>{try{ae.stdin.setRawMode?.(!1)}catch{}ae.stdout.write("\x1B[?25h")}),e().then(()=>{Jr();let i=n.current;if(!i){y(0,"Single-shot session ended (no objective)");return}let o=i.objective.trim();if(o==="--help"||o==="-h"||o==="help"){$t(["--help"]);return}ja();let r=["run",i.objective];yr&&r.push("--local"),$t(wr(r,{codeExport:kr,codeLanguage:xr,skipCodeValidation:_r}))})}