@testmuai/kane-cli 0.4.10 → 0.5.0
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.
- package/dist/{ChromeProfilePicker-EFEVOCWS.js → ChromeProfilePicker-PIWZY4WH.js} +1 -1
- package/dist/{CliFeedbackPrompt-PPGJMKHQ.js → CliFeedbackPrompt-URXCHBZ5.js} +1 -1
- package/dist/{CliUploadProgress-3GGOTLPQ.js → CliUploadProgress-DMH3C3UZ.js} +1 -1
- package/dist/{ConfigView-Y7E4Q647.js → ConfigView-NWNDNTKW.js} +1 -1
- package/dist/EvidenceViewOffer-HEBQ7C4H.js +2 -0
- package/dist/FolderPicker-5S23OTSY.js +2 -0
- package/dist/HelpView-YYKTP4JH.js +2 -0
- package/dist/{InfoBox-BQ2QOIUP.js → InfoBox-FPAWQZGQ.js} +1 -1
- package/dist/{LinksBox-DX6BJAX5.js → LinksBox-O5ZFYSK2.js} +1 -1
- package/dist/{ProfilesView-X35WWM4L.js → ProfilesView-SPECXHZE.js} +1 -1
- package/dist/{ProjectPicker-Y4A4UVHA.js → ProjectPicker-ANJ6NGNY.js} +1 -1
- package/dist/{SaveSessionPrompt-IS6HZSF4.js → SaveSessionPrompt-W2GWELOP.js} +1 -1
- package/dist/SingleShotApp-5TYM356H.js +2 -0
- package/dist/{SummaryBox-47MHU37V.js → SummaryBox-DJUDYML7.js} +1 -1
- package/dist/TestMdRunView-BIVXQE54.js +2 -0
- package/dist/{WhoamiView-KVIQCGRC.js → WhoamiView-DH25ZD4C.js} +1 -1
- package/dist/{changelog-S4ZLEQLC.js → changelog-RCKUVBFL.js} +1 -1
- package/dist/{chunk-LPUQ4HWQ.js → chunk-2WVKOZ6W.js} +1 -1
- package/dist/chunk-2YQ6TW77.js +82 -0
- package/dist/chunk-3FN66LTP.js +3 -0
- package/dist/{chunk-JKLKZCJS.js → chunk-4IOOBSNB.js} +1 -1
- package/dist/chunk-54TKNWXF.js +5 -0
- package/dist/{chunk-HPZREZKG.js → chunk-5MTRNUAK.js} +1 -1
- package/dist/{chunk-OHT5RY5E.js → chunk-6E5UYAEB.js} +1 -1
- package/dist/{chunk-QC73LMAN.js → chunk-7AEC572G.js} +1 -1
- package/dist/{chunk-QSXYNJOW.js → chunk-7IBNOVML.js} +1 -1
- package/dist/chunk-7KDNH6JP.js +10 -0
- package/dist/{chunk-G2GQ67DP.js → chunk-7YRNLGUT.js} +1 -1
- package/dist/chunk-AFCEFOIK.js +4 -0
- package/dist/{chunk-YAOWO2GE.js → chunk-AM5WZPPY.js} +1 -1
- package/dist/{chunk-G3PWEKD7.js → chunk-C4LYBQT3.js} +2 -2
- package/dist/chunk-DJL47DYJ.js +8 -0
- package/dist/chunk-DTM4ZMMJ.js +102 -0
- package/dist/chunk-ELBPBHTE.js +26 -0
- package/dist/{chunk-IGZPQQFP.js → chunk-GEAWRRR7.js} +1 -1
- package/dist/{chunk-UBN6J3ZA.js → chunk-H6QJ4YU7.js} +1 -1
- package/dist/chunk-HFXQU7UZ.js +2 -0
- package/dist/{chunk-GF44B552.js → chunk-HZ46P2GR.js} +1 -1
- package/dist/chunk-I4B2KY4X.js +3 -0
- package/dist/{chunk-RB2YKN77.js → chunk-IECUFWIZ.js} +1 -1
- package/dist/{chunk-KJLOYIWT.js → chunk-IU53F4ZV.js} +1 -1
- package/dist/chunk-J75KVNX5.js +18 -0
- package/dist/{chunk-NUGGT2XH.js → chunk-LOQV5GME.js} +1 -1
- package/dist/chunk-MUPHP5W6.js +27 -0
- package/dist/chunk-NAYAVVTP.js +6 -0
- package/dist/chunk-NFOBDHZK.js +147 -0
- package/dist/{chunk-GSKA5DKJ.js → chunk-NLIOFVMP.js} +1 -1
- package/dist/chunk-P5XBCJYQ.js +7 -0
- package/dist/chunk-PISZLYS5.js +4 -0
- package/dist/{chunk-EQC7WE2O.js → chunk-PTP3WS3N.js} +1 -1
- package/dist/chunk-Q2I65L2W.js +6 -0
- package/dist/chunk-QCEWUUE6.js +55 -0
- package/dist/chunk-QO6PAA7Q.js +17 -0
- package/dist/{chunk-FKAXPYV7.js → chunk-R5RHRG65.js} +1 -1
- package/dist/chunk-T4PKTWZ6.js +17 -0
- package/dist/{chunk-RQZCGHG7.js → chunk-THEZSXZM.js} +1 -1
- package/dist/{chunk-HUAOH2JK.js → chunk-TJWU7DOO.js} +1 -1
- package/dist/{chunk-AKLIPQVR.js → chunk-TPG2T5GH.js} +1 -1
- package/dist/{chunk-KKIFXAJY.js → chunk-UOGJUJCF.js} +1 -1
- package/dist/{chunk-DMG5QABA.js → chunk-V2GYBVSM.js} +1 -1
- package/dist/{chunk-VLWWDXBN.js → chunk-XDERMCAU.js} +1 -1
- package/dist/chunk-Y44AETOW.js +2 -0
- package/dist/{chunk-53O3GMZR.js → chunk-YCNCW4O4.js} +1 -1
- package/dist/{chunk-IT66S24L.js → chunk-YSIYPC4R.js} +1 -1
- package/dist/{chunk-6ATKQYAL.js → chunk-ZWAZ4QU4.js} +1 -1
- package/dist/credentials-52QRPGET.js +2 -0
- package/dist/evidence-O4AON5FU.js +2 -0
- package/dist/exit-manager-IUHAXFJ6.js +2 -0
- package/dist/{generate-headless-ODYT3HT7.js → generate-headless-WG6ZPINI.js} +2 -2
- package/dist/index.js +75 -39
- package/dist/list-commands-VJAL4J3O.js +2 -0
- package/dist/login-flow-VZ2MITFA.js +2 -0
- package/dist/persist-recorded-session-XKPZX7HW.js +3 -0
- package/dist/pipeline-CADTHPDV.js +2 -0
- package/dist/{recording-banner-3XTXU2VL.js → recording-banner-2TNKQHP2.js} +1 -1
- package/dist/require-project-folder-SJG5FQY6.js +2 -0
- package/dist/run-test-md-INJKPE2I.js +13 -0
- package/dist/{skill-installer-GYYMVNE4.js → skill-installer-M6AREQQW.js} +1 -1
- package/dist/tcg-generate-VKFXR5JT.js +2 -0
- package/dist/testmd-actions-4QLHD74A.js +2 -0
- package/dist/{tms-client-NNYXLXZK.js → tms-client-VD3B3SMU.js} +1 -1
- package/dist/token-refresh-2HKIYD4Y.js +2 -0
- package/dist/{validate-basic-4YMRWYLS.js → validate-basic-FO7C2URG.js} +1 -1
- package/dist/{version-check-GU2LS6NM.js → version-check-PHZX5WS7.js} +1 -1
- package/package.json +8 -6
- package/dist/FolderPicker-LI5JKG2S.js +0 -2
- package/dist/HelpView-KHQYGSD2.js +0 -2
- package/dist/SingleShotApp-RO25ZX2E.js +0 -2
- package/dist/TestMdRunView-OXVWHOV3.js +0 -2
- package/dist/chunk-7GOX44H7.js +0 -103
- package/dist/chunk-AH4AXJML.js +0 -2
- package/dist/chunk-AT45XB6X.js +0 -60
- package/dist/chunk-BH6EP2LD.js +0 -85
- package/dist/chunk-BQACGLXW.js +0 -5
- package/dist/chunk-IS62CNJW.js +0 -20
- package/dist/chunk-LOIRZFV3.js +0 -10
- package/dist/chunk-LRKWPAGK.js +0 -2
- package/dist/chunk-MDBXYXSC.js +0 -2
- package/dist/chunk-NAAPNSZD.js +0 -17
- package/dist/chunk-PUU7A26K.js +0 -11
- package/dist/chunk-SQOIKS77.js +0 -6
- package/dist/chunk-UAYCLUUZ.js +0 -27
- package/dist/chunk-XCOU6AYD.js +0 -6
- package/dist/chunk-XCYCX4TU.js +0 -17
- package/dist/exit-manager-V2NW7A7U.js +0 -2
- package/dist/list-commands-PNYMVI6X.js +0 -2
- package/dist/login-flow-FIYH6K4A.js +0 -2
- package/dist/persist-recorded-session-OJPXI4HP.js +0 -3
- package/dist/pipeline-34CX3UBO.js +0 -2
- package/dist/require-project-folder-CFX6U6BZ.js +0 -2
- package/dist/run-test-md-YWKVMQDJ.js +0 -14
- package/dist/tcg-generate-KLY7QZY2.js +0 -2
- package/dist/testmd-actions-OUY5BOAV.js +0 -2
- package/dist/token-refresh-QCHKMPCM.js +0 -2
package/dist/index.js
CHANGED
|
@@ -1,33 +1,67 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
3
|
-
import{a as
|
|
4
|
-
`).replace(/^/gm," ".repeat(o))}let c=[`Usage: ${
|
|
5
|
-
`)}padWidth(e,
|
|
3
|
+
import{c as Xe}from"./chunk-R5RHRG65.js";import{a as vn,b as gr,c as wr,d as br}from"./chunk-MUPHP5W6.js";import"./chunk-3MSXQU2C.js";import"./chunk-PTP3WS3N.js";import"./chunk-7AEC572G.js";import{a as Jn,b as zn}from"./chunk-ELBPBHTE.js";import"./chunk-LOQV5GME.js";import{a as vr,d as Qe}from"./chunk-TJWU7DOO.js";import{i as _r}from"./chunk-C4LYBQT3.js";import"./chunk-THEZSXZM.js";import"./chunk-H6QJ4YU7.js";import"./chunk-NLIOFVMP.js";import{a as tr}from"./chunk-I4B2KY4X.js";import{A as mr,C as pr,D as fr,E as hr,a as pt,b as ft,c as _n,d as yn,e as kn,f as Sn,g as Bn,h as qn,i as Wn,j as Kn,k as Gn,l as Yn,m as ze,n as nr,o as rr,p as or,q as ir,r as sr,s as ar,t as lr,u as vt,v as bt,w as _t,x as cr,y as dr,z as ur}from"./chunk-QCEWUUE6.js";import{b as Xn}from"./chunk-J75KVNX5.js";import{a as $e,b as he}from"./chunk-TPG2T5GH.js";import"./chunk-P5XBCJYQ.js";import{b as Je,o as Zn}from"./chunk-Q2I65L2W.js";import"./chunk-C5UNZ6ZY.js";import"./chunk-S3DAAAE5.js";import"./chunk-54TKNWXF.js";import"./chunk-2YQ6TW77.js";import{a as wn}from"./chunk-DTM4ZMMJ.js";import"./chunk-Y44AETOW.js";import"./chunk-3FN66LTP.js";import{E as Fn,F as Ln,G as Un,M as Vn,N as Hn,e as fe,g as An,l as Pe,m as On,s as Pn,v as $n,w as Dn,x as Mn,y as jn,z as Nn}from"./chunk-DJL47DYJ.js";import{a as Tn,b as Rn}from"./chunk-NFOBDHZK.js";import{a as Qn}from"./chunk-5MTRNUAK.js";import"./chunk-7YRNLGUT.js";import{c as Ke}from"./chunk-T4PKTWZ6.js";import{a as ie}from"./chunk-YCNCW4O4.js";import"./chunk-FPFOW6BS.js";import{a as bn}from"./chunk-WAOCHXJ5.js";import"./chunk-L5LI2JF4.js";import{a as rn,b as on,c as sn,d as wt,e as Ye,f as er}from"./chunk-AFCEFOIK.js";import"./chunk-V2GYBVSM.js";import{a as En,b as xn,c as In}from"./chunk-PISZLYS5.js";import{b as Cn}from"./chunk-NAYAVVTP.js";import"./chunk-IU53F4ZV.js";import"./chunk-6E5UYAEB.js";import"./chunk-XDERMCAU.js";import"./chunk-YCCUBQY4.js";import"./chunk-AM5WZPPY.js";import{a as un,b as mn,e as Se,f as pn,g as ht,h as b,i as Oe,j as gt,k as fn}from"./chunk-7KDNH6JP.js";import{a as dn,f as hn,h as gn}from"./chunk-QO6PAA7Q.js";import{a as ln}from"./chunk-2WVKOZ6W.js";import{a as an}from"./chunk-NLCCBXXV.js";import{a as Ge,b as ye,c as cn}from"./chunk-VE3SUJMA.js";import"./chunk-4IOOBSNB.js";import"./chunk-GEAWRRR7.js";import{a as G}from"./chunk-UOGJUJCF.js";import"./chunk-RZ4F3BHX.js";import"./chunk-E47GFYXA.js";import{a as ee}from"./chunk-IECUFWIZ.js";import"./chunk-ZWAZ4QU4.js";import"./chunk-7IBNOVML.js";import{a as Re,b as nn}from"./chunk-C6S4IEBC.js";import"./chunk-HZ46P2GR.js";import"./chunk-YSIYPC4R.js";import{a as _e,c as pe,j as mt,x as oe}from"./chunk-HFXQU7UZ.js";import{a as We}from"./chunk-HCBYKLMW.js";import{a as le,b as z,c as Te,i as ut,j as tn}from"./chunk-C44QQJR4.js";import{a as dt}from"./chunk-6YGTRKDT.js";import{a as Ae,c as be,e as me}from"./chunk-UR6MHSHU.js";var De=be(kt=>{"use strict";var Ze=class extends Error{constructor(e,t,r){super(r),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=t,this.exitCode=e,this.nestedError=void 0}},yt=class extends Ze{constructor(e){super(1,"commander.invalidArgument",e),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}};kt.CommanderError=Ze;kt.InvalidArgumentError=yt});var et=be(St=>{"use strict";var{InvalidArgumentError:$o}=De(),Ct=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,r)=>{if(!this.argChoices.includes(t))throw new $o(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._concatValue(t,r):t},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}};function Do(i){let e=i.name()+(i.variadic===!0?"...":"");return i.required?"<"+e+">":"["+e+"]"}St.Argument=Ct;St.humanReadableArgName=Do});var xt=be(Sr=>{"use strict";var{humanReadableArgName:Mo}=et(),Et=class{constructor(){this.helpWidth=void 0,this.sortSubcommands=!1,this.sortOptions=!1,this.showGlobalOptions=!1}visibleCommands(e){let t=e.commands.filter(n=>!n._hidden),r=e._getHelpCommand();return r&&!r._hidden&&t.push(r),this.sortSubcommands&&t.sort((n,o)=>n.name().localeCompare(o.name())),t}compareOptions(e,t){let r=n=>n.short?n.short.replace(/^-/,""):n.long.replace(/^--/,"");return r(e).localeCompare(r(t))}visibleOptions(e){let t=e.options.filter(n=>!n.hidden),r=e._getHelpOption();if(r&&!r.hidden){let n=r.short&&e._findOption(r.short),o=r.long&&e._findOption(r.long);!n&&!o?t.push(r):r.long&&!o?t.push(e.createOption(r.long,r.description)):r.short&&!n&&t.push(e.createOption(r.short,r.description))}return this.sortOptions&&t.sort(this.compareOptions),t}visibleGlobalOptions(e){if(!this.showGlobalOptions)return[];let t=[];for(let r=e.parent;r;r=r.parent){let n=r.options.filter(o=>!o.hidden);t.push(...n)}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(r=>Mo(r)).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((r,n)=>Math.max(r,t.subcommandTerm(n).length),0)}longestOptionTermLength(e,t){return t.visibleOptions(e).reduce((r,n)=>Math.max(r,t.optionTerm(n).length),0)}longestGlobalOptionTermLength(e,t){return t.visibleGlobalOptions(e).reduce((r,n)=>Math.max(r,t.optionTerm(n).length),0)}longestArgumentTermLength(e,t){return t.visibleArguments(e).reduce((r,n)=>Math.max(r,t.argumentTerm(n).length),0)}commandUsage(e){let t=e._name;e._aliases[0]&&(t=t+"|"+e._aliases[0]);let r="";for(let n=e.parent;n;n=n.parent)r=n.name()+" "+r;return r+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(r=>JSON.stringify(r)).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(r=>JSON.stringify(r)).join(", ")}`),e.defaultValue!==void 0&&t.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),t.length>0){let r=`(${t.join(", ")})`;return e.description?`${e.description} ${r}`:r}return e.description}formatHelp(e,t){let r=t.padWidth(e,t),n=t.helpWidth||80,o=2,s=2;function a(u,_){if(_){let E=`${u.padEnd(r+s)}${_}`;return t.wrap(E,n-o,r+s)}return u}function l(u){return u.join(`
|
|
4
|
+
`).replace(/^/gm," ".repeat(o))}let c=[`Usage: ${t.commandUsage(e)}`,""],d=t.commandDescription(e);d.length>0&&(c=c.concat([t.wrap(d,n,0),""]));let f=t.visibleArguments(e).map(u=>a(t.argumentTerm(u),t.argumentDescription(u)));f.length>0&&(c=c.concat(["Arguments:",l(f),""]));let p=t.visibleOptions(e).map(u=>a(t.optionTerm(u),t.optionDescription(u)));if(p.length>0&&(c=c.concat(["Options:",l(p),""])),this.showGlobalOptions){let u=t.visibleGlobalOptions(e).map(_=>a(t.optionTerm(_),t.optionDescription(_)));u.length>0&&(c=c.concat(["Global Options:",l(u),""]))}let m=t.visibleCommands(e).map(u=>a(t.subcommandTerm(u),t.subcommandDescription(u)));return m.length>0&&(c=c.concat(["Commands:",l(m),""])),c.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,r,n=40){let o=" \\f\\t\\v\xA0\u1680\u2000-\u200A\u202F\u205F\u3000\uFEFF",s=new RegExp(`[\\n][${o}]+`);if(e.match(s))return e;let a=t-r;if(a<n)return e;let l=e.slice(0,r),c=e.slice(r).replace(`\r
|
|
6
6
|
`,`
|
|
7
|
-
`),
|
|
8
|
-
|.{1,${a-1}}([${
|
|
9
|
-
`?"":(
|
|
10
|
-
`)}};
|
|
11
|
-
(Did you mean one of ${
|
|
12
|
-
(Did you mean ${
|
|
13
|
-
- specify the name in Command constructor or using .name()`);return
|
|
14
|
-
Expecting one of '${
|
|
15
|
-
- already used by option '${
|
|
7
|
+
`),d=" ".repeat(r),p="\\s\u200B",m=new RegExp(`
|
|
8
|
+
|.{1,${a-1}}([${p}]|$)|[^${p}]+?([${p}]|$)`,"g"),u=c.match(m)||[];return l+u.map((_,E)=>_===`
|
|
9
|
+
`?"":(E>0?d:"")+_.trimEnd()).join(`
|
|
10
|
+
`)}};Sr.Help=Et});var Rt=be(Tt=>{"use strict";var{InvalidArgumentError:jo}=De(),It=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 r=Fo(e);this.short=r.shortFlag,this.long=r.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,r)=>{if(!this.argChoices.includes(t))throw new jo(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._concatValue(t,r):t},this}name(){return this.long?this.long.replace(/^--/,""):this.short.replace(/^-/,"")}attributeName(){return No(this.name().replace(/^no-/,""))}is(e){return this.short===e||this.long===e}isBoolean(){return!this.required&&!this.optional&&!this.negate}},At=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,r)=>{this.positiveOptions.has(r)&&this.dualOptions.add(r)})}valueFromOption(e,t){let r=t.attributeName();if(!this.dualOptions.has(r))return!0;let n=this.negativeOptions.get(r).presetArg,o=n!==void 0?n:!1;return t.negate===(o===e)}};function No(i){return i.split("-").reduce((e,t)=>e+t[0].toUpperCase()+t.slice(1))}function Fo(i){let e,t,r=i.split(/[ |,]+/);return r.length>1&&!/^[[<]/.test(r[1])&&(e=r.shift()),t=r.shift(),!e&&/^-[^-]$/.test(t)&&(e=t,t=void 0),{shortFlag:e,longFlag:t}}Tt.Option=It;Tt.DualOptions=At});var xr=be(Er=>{"use strict";function Lo(i,e){if(Math.abs(i.length-e.length)>3)return Math.max(i.length,e.length);let t=[];for(let r=0;r<=i.length;r++)t[r]=[r];for(let r=0;r<=e.length;r++)t[0][r]=r;for(let r=1;r<=e.length;r++)for(let n=1;n<=i.length;n++){let o=1;i[n-1]===e[r-1]?o=0:o=1,t[n][r]=Math.min(t[n-1][r]+1,t[n][r-1]+1,t[n-1][r-1]+o),n>1&&r>1&&i[n-1]===e[r-2]&&i[n-2]===e[r-1]&&(t[n][r]=Math.min(t[n][r],t[n-2][r-2]+1))}return t[i.length][e.length]}function Uo(i,e){if(!e||e.length===0)return"";e=Array.from(new Set(e));let t=i.startsWith("--");t&&(i=i.slice(2),e=e.map(s=>s.slice(2)));let r=[],n=3,o=.4;return e.forEach(s=>{if(s.length<=1)return;let a=Lo(i,s),l=Math.max(i.length,s.length);(l-a)/l>o&&(a<n?(n=a,r=[s]):a===n&&r.push(s))}),r.sort((s,a)=>s.localeCompare(a)),t&&(r=r.map(s=>`--${s}`)),r.length>1?`
|
|
11
|
+
(Did you mean one of ${r.join(", ")}?)`:r.length===1?`
|
|
12
|
+
(Did you mean ${r[0]}?)`:""}Er.suggestSimilar=Uo});var Or=be(Rr=>{"use strict";var Vo=Ae("events").EventEmitter,Ot=Ae("child_process"),ce=Ae("path"),Pt=Ae("fs"),j=Ae("process"),{Argument:Ho,humanReadableArgName:Bo}=et(),{CommanderError:$t}=De(),{Help:qo}=xt(),{Option:Ir,DualOptions:Wo}=Rt(),{suggestSimilar:Ar}=xr(),Dt=class i extends Vo{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=>j.stdout.write(t),writeErr:t=>j.stderr.write(t),getOutHelpWidth:()=>j.stdout.isTTY?j.stdout.columns:void 0,getErrHelpWidth:()=>j.stderr.isTTY?j.stderr.columns:void 0,outputError:(t,r)=>r(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,r){let n=t,o=r;typeof n=="object"&&n!==null&&(o=n,n=null),o=o||{};let[,s,a]=e.match(/([^ ]+) *(.*)/),l=this.createCommand(s);return n&&(l.description(n),l._executableHandler=!0),o.isDefault&&(this._defaultCommandName=l._name),l._hidden=!!(o.noHelp||o.hidden),l._executableFile=o.executableFile||null,a&&l.arguments(a),this._registerCommand(l),l.parent=this,l.copyInheritedSettings(this),n?this:l}createCommand(e){return new i(e)}createHelp(){return Object.assign(new qo,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 Ho(e,t)}argument(e,t,r,n){let o=this.createArgument(e,t);return typeof r=="function"?o.default(n).argParser(r):o.default(r),this.addArgument(o),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[,r,n]=e.match(/([^ ]+) *(.*)/),o=t??"display help for command",s=this.createCommand(r);return s.helpOption(!1),n&&s.arguments(n),o&&s.description(o),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 r=["preSubcommand","preAction","postAction"];if(!r.includes(e))throw new Error(`Unexpected value for event passed to hook : '${e}'.
|
|
14
|
+
Expecting one of '${r.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,r){this._exitCallback&&this._exitCallback(new $t(e,t,r)),j.exit(e)}action(e){let t=r=>{let n=this.registeredArguments.length,o=r.slice(0,n);return this._storeOptionsAsProperties?o[n]=this:o[n]=this.opts(),o.push(this),e.apply(this,o)};return this._actionHandler=t,this}createOption(e,t){return new Ir(e,t)}_callParseArg(e,t,r,n){try{return e.parseArg(t,r)}catch(o){if(o.code==="commander.invalidArgument"){let s=`${n} ${o.message}`;this.error(s,{exitCode:o.exitCode,code:o.code})}throw o}}_registerOption(e){let t=e.short&&this._findOption(e.short)||e.long&&this._findOption(e.long);if(t){let r=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 '${r}'
|
|
15
|
+
- already used by option '${t.flags}'`)}this.options.push(e)}_registerCommand(e){let t=n=>[n.name()].concat(n.aliases()),r=t(e).find(n=>this._findCommand(n));if(r){let n=t(this._findCommand(r)).join("|"),o=t(e).join("|");throw new Error(`cannot add command '${o}' as already have command '${n}'`)}this.commands.push(e)}addOption(e){this._registerOption(e);let t=e.name(),r=e.attributeName();if(e.negate){let o=e.long.replace(/^--no-/,"--");this._findOption(o)||this.setOptionValueWithSource(r,e.defaultValue===void 0?!0:e.defaultValue,"default")}else e.defaultValue!==void 0&&this.setOptionValueWithSource(r,e.defaultValue,"default");let n=(o,s,a)=>{o==null&&e.presetArg!==void 0&&(o=e.presetArg);let l=this.getOptionValue(r);o!==null&&e.parseArg?o=this._callParseArg(e,o,l,s):o!==null&&e.variadic&&(o=e._concatValue(o,l)),o==null&&(e.negate?o=!1:e.isBoolean()||e.optional?o=!0:o=""),this.setOptionValueWithSource(r,o,a)};return this.on("option:"+t,o=>{let s=`error: option '${e.flags}' argument '${o}' is invalid.`;n(o,s,"cli")}),e.envVar&&this.on("optionEnv:"+t,o=>{let s=`error: option '${e.flags}' value '${o}' from env '${e.envVar}' is invalid.`;n(o,s,"env")}),this}_optionEx(e,t,r,n,o){if(typeof t=="object"&&t instanceof Ir)throw new Error("To add an Option object use addOption() instead of option() or requiredOption()");let s=this.createOption(t,r);if(s.makeOptionMandatory(!!e.mandatory),typeof n=="function")s.default(o).argParser(n);else if(n instanceof RegExp){let a=n;n=(l,c)=>{let d=a.exec(l);return d?d[0]:c},s.default(o).argParser(n)}else s.default(n);return this.addOption(s)}option(e,t,r,n){return this._optionEx({},e,t,r,n)}requiredOption(e,t,r,n){return this._optionEx({mandatory:!0},e,t,r,n)}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,r){return this._storeOptionsAsProperties?this[e]=t:this._optionValues[e]=t,this._optionValueSources[e]=r,this}getOptionValueSource(e){return this._optionValueSources[e]}getOptionValueSourceWithGlobals(e){let t;return this._getCommandAndAncestors().forEach(r=>{r.getOptionValueSource(e)!==void 0&&(t=r.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){j.versions?.electron&&(t.from="electron");let n=j.execArgv??[];(n.includes("-e")||n.includes("--eval")||n.includes("-p")||n.includes("--print"))&&(t.from="eval")}e===void 0&&(e=j.argv),this.rawArgs=e.slice();let r;switch(t.from){case void 0:case"node":this._scriptPath=e[1],r=e.slice(2);break;case"electron":j.defaultApp?(this._scriptPath=e[1],r=e.slice(2)):r=e.slice(1);break;case"user":r=e.slice(0);break;case"eval":r=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",r}parse(e,t){let r=this._prepareUserArgs(e,t);return this._parseCommand([],r),this}async parseAsync(e,t){let r=this._prepareUserArgs(e,t);return await this._parseCommand([],r),this}_executeSubCommand(e,t){t=t.slice();let r=!1,n=[".js",".ts",".tsx",".mjs",".cjs"];function o(d,f){let p=ce.resolve(d,f);if(Pt.existsSync(p))return p;if(n.includes(ce.extname(f)))return;let m=n.find(u=>Pt.existsSync(`${p}${u}`));if(m)return`${p}${m}`}this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let s=e._executableFile||`${this._name}-${e._name}`,a=this._executableDir||"";if(this._scriptPath){let d;try{d=Pt.realpathSync(this._scriptPath)}catch{d=this._scriptPath}a=ce.resolve(ce.dirname(d),a)}if(a){let d=o(a,s);if(!d&&!e._executableFile&&this._scriptPath){let f=ce.basename(this._scriptPath,ce.extname(this._scriptPath));f!==this._name&&(d=o(a,`${f}-${e._name}`))}s=d||s}r=n.includes(ce.extname(s));let l;j.platform!=="win32"?r?(t.unshift(s),t=Tr(j.execArgv).concat(t),l=Ot.spawn(j.argv[0],t,{stdio:"inherit"})):l=Ot.spawn(s,t,{stdio:"inherit"}):(t.unshift(s),t=Tr(j.execArgv).concat(t),l=Ot.spawn(j.execPath,t,{stdio:"inherit"})),l.killed||["SIGUSR1","SIGUSR2","SIGTERM","SIGINT","SIGHUP"].forEach(f=>{j.on(f,()=>{l.killed===!1&&l.exitCode===null&&l.kill(f)})});let c=this._exitCallback;l.on("close",d=>{d=d??1,c?c(new $t(d,"commander.executeSubCommandAsync","(close)")):j.exit(d)}),l.on("error",d=>{if(d.code==="ENOENT"){let f=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
|
|
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
|
-
- ${
|
|
18
|
+
- ${f}`;throw new Error(p)}else if(d.code==="EACCES")throw new Error(`'${s}' not executable`);if(!c)j.exit(1);else{let f=new $t(1,"commander.executeSubCommandAsync","(error)");f.nestedError=d,c(f)}}),this.runningCommand=l}_dispatchSubcommand(e,t,r){let n=this._findCommand(e);n||this.help({error:!0});let o;return o=this._chainOrCallSubCommandHook(o,n,"preSubcommand"),o=this._chainOrCall(o,()=>{if(n._executableHandler)this._executeSubCommand(n,t.concat(r));else return n._parseCommand(t,r)}),o}_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=(r,n,o)=>{let s=n;if(n!==null&&r.parseArg){let a=`error: command-argument value '${n}' is invalid for argument '${r.name()}'.`;s=this._callParseArg(r,n,o,a)}return s};this._checkNumberOfArguments();let t=[];this.registeredArguments.forEach((r,n)=>{let o=r.defaultValue;r.variadic?n<this.args.length?(o=this.args.slice(n),r.parseArg&&(o=o.reduce((s,a)=>e(r,a,s),r.defaultValue))):o===void 0&&(o=[]):n<this.args.length&&(o=this.args[n],r.parseArg&&(o=e(r,o,r.defaultValue))),t[n]=o}),this.processedArgs=t}_chainOrCall(e,t){return e&&e.then&&typeof e.then=="function"?e.then(()=>t()):t()}_chainOrCallHooks(e,t){let r=e,n=[];return this._getCommandAndAncestors().reverse().filter(o=>o._lifeCycleHooks[t]!==void 0).forEach(o=>{o._lifeCycleHooks[t].forEach(s=>{n.push({hookedCommand:o,callback:s})})}),t==="postAction"&&n.reverse(),n.forEach(o=>{r=this._chainOrCall(r,()=>o.callback(o.hookedCommand,this))}),r}_chainOrCallSubCommandHook(e,t,r){let n=e;return this._lifeCycleHooks[r]!==void 0&&this._lifeCycleHooks[r].forEach(o=>{n=this._chainOrCall(n,()=>o(this,t))}),n}_parseCommand(e,t){let r=this.parseOptions(t);if(this._parseOptionsEnv(),this._parseOptionsImplied(),e=e.concat(r.operands),t=r.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(r.unknown),this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let n=()=>{r.unknown.length>0&&this.unknownOption(r.unknown[0])},o=`command:${this.name()}`;if(this._actionHandler){n(),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(o,e,t)})),s=this._chainOrCallHooks(s,"postAction"),s}if(this.parent&&this.parent.listenerCount(o))n(),this._processArguments(),this.parent.emit(o,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():(n(),this._processArguments())}else this.commands.length?(n(),this.help({error:!0})):(n(),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(r=>{let n=r.attributeName();return this.getOptionValue(n)===void 0?!1:this.getOptionValueSource(n)!=="default"});e.filter(r=>r.conflictsWith.length>0).forEach(r=>{let n=e.find(o=>r.conflictsWith.includes(o.attributeName()));n&&this._conflictingOption(r,n)})}_checkForConflictingOptions(){this._getCommandAndAncestors().forEach(e=>{e._checkForConflictingLocalOptions()})}parseOptions(e){let t=[],r=[],n=t,o=e.slice();function s(l){return l.length>1&&l[0]==="-"}let a=null;for(;o.length;){let l=o.shift();if(l==="--"){n===r&&n.push(l),n.push(...o);break}if(a&&!s(l)){this.emit(`option:${a.name()}`,l);continue}if(a=null,s(l)){let c=this._findOption(l);if(c){if(c.required){let d=o.shift();d===void 0&&this.optionMissingArgument(c),this.emit(`option:${c.name()}`,d)}else if(c.optional){let d=null;o.length>0&&!s(o[0])&&(d=o.shift()),this.emit(`option:${c.name()}`,d)}else this.emit(`option:${c.name()}`);a=c.variadic?c:null;continue}}if(l.length>2&&l[0]==="-"&&l[1]!=="-"){let c=this._findOption(`-${l[1]}`);if(c){c.required||c.optional&&this._combineFlagAndOptionalValue?this.emit(`option:${c.name()}`,l.slice(2)):(this.emit(`option:${c.name()}`),o.unshift(`-${l.slice(2)}`));continue}}if(/^--[^=]+=/.test(l)){let c=l.indexOf("="),d=this._findOption(l.slice(0,c));if(d&&(d.required||d.optional)){this.emit(`option:${d.name()}`,l.slice(c+1));continue}}if(s(l)&&(n=r),(this._enablePositionalOptions||this._passThroughOptions)&&t.length===0&&r.length===0){if(this._findCommand(l)){t.push(l),o.length>0&&r.push(...o);break}else if(this._getHelpCommand()&&l===this._getHelpCommand().name()){t.push(l),o.length>0&&t.push(...o);break}else if(this._defaultCommandName){r.push(l),o.length>0&&r.push(...o);break}}if(this._passThroughOptions){n.push(l),o.length>0&&n.push(...o);break}n.push(l)}return{operands:t,unknown:r}}opts(){if(this._storeOptionsAsProperties){let e={},t=this.options.length;for(let r=0;r<t;r++){let n=this.options[r].attributeName();e[n]=n===this._versionOptionName?this._version:this[n]}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
|
|
22
|
-
`),this._exit(0,"commander.version",e)}),this}description(e,
|
|
23
|
-
Expecting one of '${
|
|
24
|
-
`)}),this}_outputHelpIfRequested(e){let
|
|
25
|
-
`)}async function
|
|
26
|
-
`),process.exit(2));let{runListTui:n,resolveCurrentOrgId:i}=await import("./testmd-actions-OUY5BOAV.js"),t=await i({});t.ok||process.exit(t.code),process.exit(await n(t.orgId))});Ai(e),Oi(e),Ri(e),Ti(e),Ii(e)}function xi(l,e){return e.concat(l)}function Ai(l){l.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","30").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: ${Si(ae,"global-memory.md")})`).option("--local-context <file>","Override local context (default: .testmuai/context.md in cwd)").addOption(new X("--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 X("--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: visual (default) | dom (DOM extraction & assertions)").option("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").addOption(new X("--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("--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("--retry","on replay failure, full-restart with shrinking replay window; falls back to complete re-author after --retry-count attempts").option("--retry-count <n>","max replay restart attempts before falling back to complete re-author (default: 3)",e=>{let n=parseInt(e,10);if(Number.isNaN(n)||n<0)throw new Error(`--retry-count must be a non-negative integer, got: ${e}`);return e}).option("--author","bypass walker; force fresh test+testcase in TMS; replace local output entirely").action(async(e,n)=>{let{runTestMdFile:i}=await import("./run-test-md-YWKVMQDJ.js"),t=await i(e,n);process.exit(t)})}function Oi(l){l.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)",xi,[]).option("--json","Force NDJSON output even on TTY").action(async e=>{let{runListAction:n,resolveCurrentOrgId:i}=await import("./testmd-actions-OUY5BOAV.js"),t=await i({json:!!e.json});t.ok||process.exit(t.code),process.exit(await n(e,t.orgId))})}function Ri(l){l.command("status <path>").description("Print local meta.json for a *_test.md (no live TMS check in v1)").action(async e=>{let{runStatusAction:n,resolveCurrentOrgId:i}=await import("./testmd-actions-OUY5BOAV.js"),t=await i({});t.ok||process.exit(t.code),process.exit(await n(e,t.orgId))})}function Ti(l){l.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,n)=>{let{runDeleteAction:i,resolveCurrentOrgId:t}=await import("./testmd-actions-OUY5BOAV.js"),o=await t({});o.ok||process.exit(o.code),process.exit(await i(e,!!n.yes,o.orgId))})}function Ii(l){l.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,n)=>{let{runExportAction:i,resolveCurrentOrgId:t}=await import("./testmd-actions-OUY5BOAV.js"),o=await t({});o.ok||process.exit(o.code),process.exit(await i(e,n,o.orgId))})}function Se(l){let e=new Vn;if(e.name("kane-cli").version(Ae).showHelpAfterError("(run `kane-cli --help` to see all commands; `-h` and `help` also work)"),e.on("command:*",i=>{e.error(`error: unknown command '${i[0]}'`,{exitCode:2,code:"commander.unknownCommand"})}),l[0]==="--help"||l[0]==="-h"||l[0]==="help"){(async()=>{let{HelpView:i}=await import("./HelpView-KHQYGSD2.js"),{render:t}=await import("./build-JIKYOZUH.js"),o=await import("./react-QWOAB3TB.js"),{waitUntilExit:s}=t(o.default.createElement(i));await s(),g(0,"Help displayed")})();return}e.command("login").option("--oauth","Login via OAuth (opens browser)").option("--username <user>","Basic auth username").option("--access-key <key>","Basic auth access key").addOption(new X("--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 X("--model <name>","Model").default("v16-alpha").hideHelp()).option("--chrome-profile <path>","Chrome profile path").action(async i=>{let t=new ne,o=new le,s=i.env,a=i.profile;if(!process.stdin.isTTY||i.oauth||i.username){if(t.setDefaultEnv(s),i.oauth)await new Jt(a,s,t).login(),console.log(`Logged in as ${a} [${s}] via OAuth`);else if(i.username&&i.accessKey){try{let{validateBasicAuth:E}=await import("./validate-basic-4YMRWYLS.js");await E(s,i.username,i.accessKey)}catch{console.error("Credentials not valid. Please use valid credentials."),g(1,"Invalid basic-auth credentials");return}t.saveBasicAuth(a,s,{username:i.username,access_key:i.accessKey}),console.log(`Logged in as ${a} [${s}] via basic auth`)}else console.error("Provide --oauth, or --username and --access-key"),g(1,"Missing --oauth or credentials for login");t.setActiveProfile(a),o.set("model",i.model),i.chromeProfile&&o.set("chrome_profile_path",i.chromeProfile);let k=null;if(i.username&&i.accessKey)k={username:i.username,access_key:i.accessKey};else try{let A=await ge({creds:t,env:s,log:()=>{}});A.resolvedCreds&&(k={username:A.resolvedCreds.username,access_key:A.resolvedCreds.access_key})}catch{}if(i.projectId&&(fe(t,o,a,s,{projectId:i.projectId}),console.log(`Project set to ${i.projectId}`)),i.folderId&&(fe(t,o,a,s,{folderId:i.folderId}),console.log(`Folder set to ${i.folderId}`)),k&&(!i.projectId||!i.folderId))try{let E=await qt({creds:t,config:o,profile:a,env:s,tmsCreds:k,log:()=>{}});i.projectId||console.log(`Auto-selected project: ${E.projectName} (${E.projectId})`),i.folderId||console.log(`Auto-selected folder: ${E.folderName} (${E.folderId})`)}catch(E){console.warn(`Could not auto-select project/folder: ${E instanceof Error?E.message:E}`)}Re(t,o,a,s),console.log("Setup complete."),g(0,"Setup complete")}let{SingleShotApp:r}=await import("./SingleShotApp-RO25ZX2E.js"),{ScrollbackProvider:c}=await import("./scrollback-6GINSTL2.js"),{render:m}=await import("./build-JIKYOZUH.js"),u=await import("./react-QWOAB3TB.js"),f={current:null},p={current:!1},{waitUntilExit:d,unmount:b}=m(u.default.createElement(c,null,u.default.createElement(r,{resultRef:f,mode:"login",loginCompleteRef:p})),{exitOnCtrlC:!1});Ee(()=>b()),await d();try{process.stdin.setRawMode?.(!1)}catch{}process.stdout.write("\x1B[?25h"),p.current&&console.log("Login setup complete."),process.exit(0)}),e.command("logout").action(async()=>{let i=new ne,t=i.getActiveProfile();if(!t){console.log("No active profile to logout");return}let o=i.getDefaultEnv(),s=await zt(i,t,o),a=new le;s.switchedTo?(Re(i,a,s.switchedTo.profile,s.switchedTo.env),console.log(`Logged out ${s.profile} [${s.env}]. Switched to ${s.switchedTo.profile} [${s.switchedTo.env}]`)):(a.save({project_id:null,project_name:null,folder_id:null,folder_name:null}),console.log(`Logged out ${s.profile} [${s.env}]. No profiles remaining.`))}),e.command("whoami").option("--profile <name>","Profile name").action(async i=>{let t=new ne,o=i.profile??t.getActiveProfile()??"default",s=t.getDefaultEnv(),a=t.loadCredentials(o,s),r=t.loadBasicAuth(o,s),c="none",m=r?.username,u,f,p,d;if(r?c="basic":a&&(c="oauth",f=new Date(a.expires_at*1e3).toISOString().slice(0,10)),c==="none")u="missing";else try{let w=await ge({creds:t,env:s,log:()=>{}});if(w.resolvedCreds)p="verified",u="valid",m=w.resolvedCreds.username??m;else{let{classifyAuthFailure:y}=await import("./resolver-IDCGRPFJ.js");y(w.resolver.lastError)==="auth"?(p="rejected",u="expired",d="Credentials rejected by the server \u2014 re-login or rotate your access key"):(p="unreachable",d=w.resolver.lastError?.message)}}catch(w){let y=w;y.code==="refresh_failed"?(p="rejected",u="expired",d="OAuth token refresh failed \u2014 run 'kane-cli login'"):y.code==="not_authenticated"?(c="none",u="missing"):(p="unreachable",d=y.message)}let{WhoamiView:b}=await import("./WhoamiView-KVIQCGRC.js"),{render:k}=await import("./build-JIKYOZUH.js"),E=await import("./react-QWOAB3TB.js"),{waitUntilExit:A}=k(E.default.createElement(b,{profile:o,env:s,authenticated:p==="verified",authMethod:c,username:m,tokenStatus:u,expiresAt:f,serverStatus:p,detail:d}));await A(),c==="none"?g(1,"whoami: not-authenticated"):p&&p!=="verified"&&g(p==="unreachable"?3:1,`whoami: ${p}`)}),e.command("config <action> [value]").description("Show or change settings (show, set-mode, set-assertion-mode, set-network-ws, set-network-sse, set-url, set-window, chrome-profile, project, folder, reset)").option("--agent","Force JSON output for `show` (auto-on when stdin is not a TTY)").action(async(i,t,o)=>{let s=new le,a=new ne;if(i==="show"){let r=s.load(),c=a.getActiveProfile()??"default",m=a.getDefaultEnv(),u=a.loadProfileConfig(c,m)??{},f=u.project_id??r.project_id??null,p=u.project_name??r.project_name??null,d=u.folder_id??r.folder_id??null,b=u.folder_name??r.folder_name??null,k=a.loadBasicAuth(c,m),E=a.loadCredentials(c,m),A=k?`basic (${k.username})`:E?"oauth":"not configured";if(!!o?.agent||!process.stdin.isTTY||!process.stdout.isTTY){let M=Q(m);process.stdout.write(`${JSON.stringify({profile:c,env:m,auth:A,project_id:f,project_name:p,folder_id:d,folder_name:b,model:r.model,mode:r.mode,assertion_mode:r.assertion_mode,network_ws:r.network_ws,network_sse:r.network_sse,window_size:`${r.window_size.width}x${r.window_size.height}`,chrome_profile:r.chrome_profile_path,default_url:r.default_url??Ke,controller_base_url:M.controllerBaseUrl,tms_base_url:M.tmsBaseUrl})}
|
|
27
|
-
`),
|
|
21
|
+
`),this.outputHelp({error:!0}));let r=t||{},n=r.exitCode||1,o=r.code||"commander.error";this._exit(n,o,e)}_parseOptionsEnv(){this.options.forEach(e=>{if(e.envVar&&e.envVar in j.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()}`,j.env[e.envVar]):this.emit(`optionEnv:${e.name()}`))}})}_parseOptionsImplied(){let e=new Wo(this.options),t=r=>this.getOptionValue(r)!==void 0&&!["default","implied"].includes(this.getOptionValueSource(r));this.options.filter(r=>r.implied!==void 0&&t(r.attributeName())&&e.valueFromOption(this.getOptionValue(r.attributeName()),r)).forEach(r=>{Object.keys(r.implied).filter(n=>!t(n)).forEach(n=>{this.setOptionValueWithSource(n,r.implied[n],"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 r=s=>{let a=s.attributeName(),l=this.getOptionValue(a),c=this.options.find(f=>f.negate&&a===f.attributeName()),d=this.options.find(f=>!f.negate&&a===f.attributeName());return c&&(c.presetArg===void 0&&l===!1||c.presetArg!==void 0&&l===c.presetArg)?c:d||s},n=s=>{let a=r(s),l=a.attributeName();return this.getOptionValueSource(l)==="env"?`environment variable '${a.envVar}'`:`option '${a.flags}'`},o=`error: ${n(e)} cannot be used with ${n(t)}`;this.error(o,{code:"commander.conflictingOption"})}unknownOption(e){if(this._allowUnknownOption)return;let t="";if(e.startsWith("--")&&this._showSuggestionAfterError){let n=[],o=this;do{let s=o.createHelp().visibleOptions(o).filter(a=>a.long).map(a=>a.long);n=n.concat(s),o=o.parent}while(o&&!o._enablePositionalOptions);t=Ar(e,n)}let r=`error: unknown option '${e}'${t}`;this.error(r,{code:"commander.unknownOption"})}_excessArguments(e){if(this._allowExcessArguments)return;let t=this.registeredArguments.length,r=t===1?"":"s",o=`error: too many arguments${this.parent?` for '${this.name()}'`:""}. Expected ${t} argument${r} but got ${e.length}.`;this.error(o,{code:"commander.excessArguments"})}unknownCommand(){let e=this.args[0],t="";if(this._showSuggestionAfterError){let n=[];this.createHelp().visibleCommands(this).forEach(o=>{n.push(o.name()),o.alias()&&n.push(o.alias())}),t=Ar(e,n)}let r=`error: unknown command '${e}'${t}`;this.error(r,{code:"commander.unknownCommand"})}version(e,t,r){if(e===void 0)return this._version;this._version=e,t=t||"-V, --version",r=r||"output the version number";let n=this.createOption(t,r);return this._versionOptionName=n.attributeName(),this._registerOption(n),this.on("option:"+n.name(),()=>{this._outputConfiguration.writeOut(`${e}
|
|
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 r=this.parent?._findCommand(e);if(r){let n=[r.name()].concat(r.aliases()).join("|");throw new Error(`cannot add alias '${e}' to command '${this.name()}' as already have command '${n}'`)}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(r=>Bo(r));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=ce.basename(e,ce.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},r;return t.error?r=n=>this._outputConfiguration.writeErr(n):r=n=>this._outputConfiguration.writeOut(n),t.write=e.write||r,t.command=this,t}outputHelp(e){let t;typeof e=="function"&&(t=e,e=void 0);let r=this._getHelpContext(e);this._getCommandAndAncestors().reverse().forEach(o=>o.emit("beforeAllHelp",r)),this.emit("beforeHelp",r);let n=this.helpInformation(r);if(t&&(n=t(n),typeof n!="string"&&!Buffer.isBuffer(n)))throw new Error("outputHelp callback must return a string or a Buffer");r.write(n),this._getHelpOption()?.long&&this.emit(this._getHelpOption().long),this.emit("afterHelp",r),this._getCommandAndAncestors().forEach(o=>o.emit("afterAllHelp",r))}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=j.exitCode||0;t===0&&e&&typeof e!="function"&&e.error&&(t=1),this._exit(t,"commander.help","(outputHelp)")}addHelpText(e,t){let r=["beforeAll","before","after","afterAll"];if(!r.includes(e))throw new Error(`Unexpected value for position to addHelpText.
|
|
23
|
+
Expecting one of '${r.join("', '")}'`);let n=`${e}Help`;return this.on(n,o=>{let s;typeof t=="function"?s=t({error:o.error,command:o.command}):s=t,s&&o.write(`${s}
|
|
24
|
+
`)}),this}_outputHelpIfRequested(e){let t=this._getHelpOption();t&&e.find(n=>t.is(n))&&(this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)"))}};function Tr(i){return i.map(e=>{if(!e.startsWith("--inspect"))return e;let t,r="127.0.0.1",n="9229",o;return(o=e.match(/^(--inspect(-brk)?)$/))!==null?t=o[1]:(o=e.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null?(t=o[1],/^\d+$/.test(o[3])?n=o[3]:r=o[3]):(o=e.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(t=o[1],r=o[3],n=o[4]),t&&n!=="0"?`${t}=${r}:${parseInt(n)+1}`:e})}Rr.Command=Dt});var Mr=be(Q=>{"use strict";var{Argument:Pr}=et(),{Command:Mt}=Or(),{CommanderError:Ko,InvalidArgumentError:$r}=De(),{Help:Go}=xt(),{Option:Dr}=Rt();Q.program=new Mt;Q.createCommand=i=>new Mt(i);Q.createOption=(i,e)=>new Dr(i,e);Q.createArgument=(i,e)=>new Pr(i,e);Q.Command=Mt;Q.Option=Dr;Q.Argument=Pr;Q.Help=Go;Q.CommanderError=Ko;Q.InvalidArgumentError=$r;Q.InvalidOptionArgumentError=$r});var Ue=me(dt(),1);import U from"process";import*as Po from"tls";function yr(){let i=Po;if(!(typeof i.getCACertificates!="function"||typeof i.setDefaultCACertificates!="function"))try{let e=n=>typeof n=="string",t=i.getCACertificates("default").filter(e),r=i.getCACertificates("system").filter(e);i.setDefaultCACertificates([...new Set([...t,...r])])}catch{}}var kr=!1;function Cr(){if(!kr)try{if(typeof process.emitWarning!="function")return;let i=process.emitWarning.bind(process),e=((t,...r)=>{let n=typeof t=="string"?t:t?.message??"";if(!((typeof r[0]=="string"?r[0]:typeof t=="object"&&t?t.name:void 0)==="ExperimentalWarning"&&n.includes("buffer.File")))return i(t,...r)});process.emitWarning=e,kr=!0}catch{}}var jr=me(Mr(),1),{program:es,createCommand:ts,createArgument:ns,createOption:rs,CommanderError:os,InvalidArgumentError:Nr,InvalidOptionArgumentError:is,Command:Me,Argument:ss,Option:W,Help:as}=jr.default;import{join as te,resolve as Di}from"path";var Nt=me(dt(),1);var K=me(dt(),1);var ge=me(We(),1);function Fr({steps:i,bifurcationInfo:e,perFlowMetadata:t}){return!e||e.isSingleFlow||!t||t.length<=1?null:(0,ge.jsx)(le,{flexDirection:"column",children:t.map((r,n)=>{let o=i[n],s=o?.children??[],a=s.filter(m=>m.status==="passed").length,l=s.filter(m=>m.status==="failed").length,c=a+l,d=s.reduce((m,u)=>m+(u.duration??0),0),f=o?.status==="failed"?"failed":"passed",p=e.flows[n]??o?.objective??`Flow ${n+1}`;return(0,ge.jsxs)(le,{flexDirection:"column",marginTop:n>0?1:0,children:[(0,ge.jsxs)(le,{marginLeft:1,children:[(0,ge.jsx)(z,{color:oe.purple,bold:!0,children:"Flow "+(n+1)+": "}),(0,ge.jsx)(z,{color:oe.purple,children:p})]}),(0,ge.jsx)(Ye,{status:f,summary:r?.summary??"",duration:d,steps:c,stepsPassed:a,stepsFailed:l,reason:r?.error_message??void 0,creditsConsumed:r?.credits_consumed??void 0})]},`flow-summary-${n}`)})})}var L=me(We(),1);function Lr({config:i,spawnOpts:e,cancelRef:t,banner:r,describeContext:n,onComplete:o,onStepEnd:s,onReasoning:a,onStepComplete:l}){let{exit:c}=tn(),{append:d}=nn(),{describe:f,onDescribe:p,creditsRef:m}=gr({resolve:()=>n??null,hostIsTTY:()=>!!process.stderr.isTTY}),u=In(s,void 0,a,l,p),_=(0,K.useRef)(!1),E=(0,K.useRef)(!1),[x,I]=(0,K.useState)("");(0,K.useEffect)(()=>{_.current||(_.current=!0,u.startRun(i,e))},[i,e,u]),(0,K.useEffect)(()=>{t&&(t.current=()=>u.cancelRun())},[t,u]),(0,K.useEffect)(()=>{u.isRunning||f.stop()},[u.isRunning,f.stop]);let v=(0,K.useRef)(0);ut((y,A)=>{A.ctrl&&y==="c"&&(u.isRunning?(v.current++,v.current>=2?c():u.cancelRun()):c())}),ut((y,A)=>{u.askingUser&&(A.return?(u.sendAnswer(x),I("")):A.backspace||A.delete?I(P=>P.slice(0,-1)):y&&!A.ctrl&&!A.meta&&I(P=>P+y))},{isActive:!!u.askingUser}),(0,K.useEffect)(()=>{if(!u.isRunning&&u.lastRunEnd&&!E.current){E.current=!0;let{passed:y,failed:A,total:P}=wt(u.steps),Y=u.bifurcationInfo;o({lastRunEnd:u.lastRunEnd,stepsPassed:y,stepsFailed:A,stepsTotal:P,hadError:!1,bifurcationFlows:Y&&!Y.isSingleFlow?Y.flows:null,describeCredits:m.current,evidence:u.getEvidenceState()}),c()}},[u.isRunning,u.lastRunEnd,u.steps,o,c]),(0,K.useEffect)(()=>{u.runError&&!u.isRunning&&!E.current&&(E.current=!0,o({lastRunEnd:null,stepsPassed:0,stepsFailed:0,stepsTotal:0,hadError:!0,bifurcationFlows:null,describeCredits:m.current,evidence:u.getEvidenceState()}),c())},[u.runError,u.isRunning,o,c]);let S=u.lastRunEnd?(()=>{let{passed:y,failed:A,total:P}=wt(u.steps);return{status:u.lastRunEnd.status,duration:u.lastRunEnd.duration??0,summary:u.lastRunEnd.summary??"",stepsPassed:y,stepsFailed:A,stepsTotal:P,reason:u.lastRunEnd.reason,finalState:u.lastRunEnd.final_state,creditsConsumed:(u.lastRunEnd.credits_consumed??0)+m.current}})():null,h=(0,K.useRef)(!1);return(0,K.useEffect)(()=>{h.current||!r||(h.current=!0,d((0,L.jsxs)(le,{flexDirection:"column",marginBottom:1,children:[(0,L.jsxs)(le,{borderStyle:"round",borderColor:"#dc4e08",paddingX:2,children:[(0,L.jsx)(z,{color:"#ff9500",bold:!0,children:"KaneAI CLI"}),(0,L.jsx)(z,{color:oe.dim,children:" \u2502 "}),(0,L.jsx)(z,{color:oe.orange,children:r.model}),(0,L.jsx)(z,{color:oe.dim,children:" \u2502 "}),(0,L.jsx)(z,{color:oe.dim,children:r.auth})]}),r.status?.map((y,A)=>(0,L.jsx)(z,{color:oe.dim,children:y},A))]})))},[]),(0,L.jsxs)(le,{flexDirection:"column",children:[(()=>{let y=sn({isRunning:u.isRunning,bifurcationInfo:u.bifurcationInfo,steps:u.steps,cmInitCounts:u.cmInitCounts,replayInfo:u.replayInfo});return y?(0,L.jsx)(on,{label:y.label,hasBifurcation:y.hasBifurcation}):null})(),u.steps.length>0&&(0,L.jsx)(rn,{steps:u.steps,bifurcated:!!u.bifurcationInfo&&!u.bifurcationInfo.isSingleFlow,flows:u.bifurcationInfo?.flows,cmInitCounts:u.cmInitCounts,staticSteps:!0,onStepCommit:d,describe:f.text,describeVisible:f.visible,describeRevealing:f.revealing}),u.askingUser&&(0,L.jsxs)(le,{flexDirection:"column",marginTop:1,children:[(0,L.jsxs)(z,{color:oe.orange,children:['Agent is asking: "',u.askingUser,'"']}),(0,L.jsxs)(z,{children:["> ",x,"\u2588"]})]}),u.runError&&(0,L.jsx)(er,{message:u.runError,code:"RUNNER_ERROR"}),S&&u.lastRunEnd&&(0,L.jsx)(Fr,{steps:u.steps,bifurcationInfo:u.bifurcationInfo,perFlowMetadata:u.lastRunEnd.per_flow_metadata??[]}),S&&(0,L.jsx)(Ye,{status:S.status==="passed"?"passed":"failed",summary:S.summary??"",duration:S.duration,steps:S.stepsTotal,stepsPassed:S.stepsPassed,stepsFailed:S.stepsFailed,reason:S.reason,creditsConsumed:S.creditsConsumed})]})}import{createInterface as Yo}from"readline";function ke(i){process.stdout.write(JSON.stringify(i)+`
|
|
25
|
+
`)}async function Ur(i,e,t){let r=Cn(i,e);Qe().then(p=>{p&&ke({type:"update_available",current:p.current,latest:p.latest,severity:p.severity})}).catch(()=>{}),Xe().then(p=>{p&&ke({type:"skill_update_available",current:p.current,latest:p.latestCompatible,install_cmd:"kane-cli install skill"})}).catch(()=>{});let n=Yo({input:process.stdin});n.on("line",p=>{try{let m=JSON.parse(p);m.type==="user_response"?r.sendUserResponse(m.answer??""):m.type==="cancel"&&r.sendCancel(m.reason??"")}catch{}});let o=null,s=!1,a=0,l=null,c=0,d=!1,f=En();for await(let p of r.events)switch(f=xn(f,p),p.type){case"run_start":d&&c++;break;case"step_start":{let m=p;t?.onStepLog?.("STEP_START",`Step ${m.index} started`,{index:m.index,objective:m.objective,child_id:m.child_id});let u={step:m.index+1,status:"running",remark:m.objective??`Step ${m.index+1}`};m.child_id&&(u.child_id=m.child_id),ke(u);break}case"step_event":p.event==="reasoning"&&p.detail&&p.detail!=="reasoning"&&t?.onReasoning?.(p.detail),t?.onStepLog?.("STEP_EVENT",`Step ${p.index} ${p.event}`,{index:p.index,phase:p.event,action_type:p.action_type,detail:p.detail,child_id:p.child_id});break;case"step_end":{let m=p;t?.onStepLog?.("STEP_END",`Step ${m.index} ${m.status}`,{index:m.index,status:m.status,duration:m.duration,summary:m.summary,child_id:m.child_id}),t?.onStepComplete?.(),a++;let u={step:m.index+1,status:m.status==="passed"?"done":"failed",remark:m.summary??""};m.child_id&&(u.child_id=m.child_id),ke(u);let _=d?Math.max(0,c-1):0,E=typeof m.ordinal=="number"&&m.id?{ordinal:m.ordinal,id:m.id}:void 0;t?.onStepEnd?.(m.index,_,m.child_id,E);break}case"bifurcation":{let m=p,u=m.flows??[],_=m.count??u.length;(m.is_single_flow??_<=1)||(l=u,d=!0,c=0),ke({type:"bifurcation",flows:u,count:_});break}case"ask_user":{let m=p;ke({type:"ask_user",question:m.question,step_index:m.step_index,...m.options?{options:m.options}:{}});break}case"run_end":{o=p;break}case"error":{s=!0,ke({type:"error",message:p.message});break}default:break}return n.close(),await r.exited,{lastRunEnd:o,stepsTotal:a,hadError:s,bifurcationFlows:l,evidence:f}}import{join as Jo}from"path";function Vr(i){let e=i.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)
|
|
26
|
+
`),process.exit(2));let{runListTui:t,resolveCurrentOrgId:r}=await import("./testmd-actions-4QLHD74A.js"),n=await r({});n.ok||process.exit(n.code),process.exit(await t(n.orgId))});Qo(e),Xo(e),Zo(e),ei(e),ti(e),ni(e)}function zo(i,e){return e.concat(i)}function Qo(i){i.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","30").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: ${Jo(pe,"global-memory.md")})`).option("--local-context <file>","Override local context (default: .testmuai/context.md in cwd)").addOption(new W("--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 W("--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: visual (default) | dom (DOM extraction & assertions)").option("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").addOption(new W("--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("--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("--retry","on replay failure, full-restart with shrinking replay window; falls back to complete re-author after --retry-count attempts").option("--retry-count <n>","max replay restart attempts before falling back to complete re-author (default: 3)",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}).option("--author","bypass walker; force fresh test+testcase in TMS; replace local output entirely").addOption(new W("--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{runTestMdFile:r}=await import("./run-test-md-INJKPE2I.js"),n=await r(e,t);process.exit(n)})}function Xo(i){i.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)",zo,[]).option("--json","Force NDJSON output even on TTY").action(async e=>{let{runListAction:t,resolveCurrentOrgId:r}=await import("./testmd-actions-4QLHD74A.js"),n=await r({json:!!e.json});n.ok||process.exit(n.code),process.exit(await t(e,n.orgId))})}function Zo(i){i.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:r}=await import("./testmd-actions-4QLHD74A.js"),n=await r({});n.ok||process.exit(n.code),process.exit(await t(e,n.orgId))})}function ei(i){i.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:r,resolveCurrentOrgId:n}=await import("./testmd-actions-4QLHD74A.js"),o=await n({});o.ok||process.exit(o.code),process.exit(await r(e,!!t.yes,o.orgId))})}function ti(i){i.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:r,resolveCurrentOrgId:n}=await import("./testmd-actions-4QLHD74A.js"),o=await n({});o.ok||process.exit(o.code),process.exit(await r(e,t,o.orgId))})}function ni(i){i.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:r,resolveSyncAuth:n}=await import("./testmd-actions-4QLHD74A.js"),o=await n(t);o.ok||process.exit(o.code),process.exit(await r(e,o))})}import{existsSync as ri}from"fs";import{resolve as oi,relative as ii}from"path";var Ce=class extends Error{};async function Hr(i){let e=i.cwd??process.cwd(),t;if(i.paths&&i.paths.length>0?t=i.paths.map(o=>{let s=oi(e,o);if(!ri(s)||!s.endsWith("_test.md"))throw new Ce(`not a *_test.md file: ${o}`);return{path:s,relPath:ii(e,s)}}):t=(await Jn({root:e})).results.map(s=>({path:s.path,relPath:s.relPath})),i.match){let o;try{o=new RegExp(i.match)}catch(s){throw new Ce(`invalid --match regex: ${s instanceof Error?s.message:s}`)}t=t.filter(s=>o.test(s.relPath))}let r=new Set,n=[];for(let o of t)r.has(o.path)||(r.add(o.path),n.push({...o,tags:zn(o.path)}));if(i.tags&&i.tags.length>0){let o=new Set(i.tags.map(s=>s.toLowerCase()));return n.filter(s=>s.tags.some(a=>o.has(a))).sort((s,a)=>s.relPath.localeCompare(a.relPath))}return n.sort((o,s)=>o.relPath.localeCompare(s.relPath))}import{readFileSync as si}from"fs";import{join as ai}from"path";function li(i){try{return JSON.parse(si(ai(Je(i),".internal","meta.json"),"utf8"))}catch{return null}}var je=i=>typeof i=="string"&&i?i:void 0;function Br(i){let e=[],t,r;for(let o of i){let s=li(o.path);if(!s){e.push({...o,failure:"missing_meta"});continue}let a={testcaseId:je(s.testcase_id),folderId:je(s.folder_id),commitId:je(s.commit_id),sessionName:je(s.session_name)},l=je(s.test_id),c=typeof s.org_id=="string"?s.org_id:void 0,d=typeof s.project_id=="string"?s.project_id:void 0;if(!l){e.push({...o,...a,orgId:c,projectId:d,failure:"not_authored"});continue}if(t===void 0&&c&&(t=c),r===void 0&&d&&(r=d),c&&t&&c!==t){e.push({...o,...a,testId:l,orgId:c,projectId:d,failure:"org_mismatch"});continue}if(d&&r&&d!==r){e.push({...o,...a,testId:l,orgId:c,projectId:d,failure:"project_mismatch"});continue}e.push({...o,...a,testId:l,orgId:c,projectId:d})}let n=e.length>0&&e.every(o=>!o.failure);return{checks:e,valid:n,orgId:t,projectId:r}}function ci(i){return i.tags?.length?`testrun --tags ${i.tags.join(",")}`:i.match?`testrun --match ${i.match}`:i.paths?.length?`testrun ${i.paths.length} paths`:"testrun"}async function qr(i){let e=await Hr(i),t=Br(e),r=Number(i.parallel??1),n=Number.isFinite(r)&&r>=1?Math.floor(r):1;return{...t,parallel:n,parallelClamped:!1,onFailure:i.onFailure??"continue",title:i.name??ci(i)}}import{basename as di,join as ui}from"path";import{readFileSync as mi,existsSync as pi}from"fs";import{promises as Ne}from"fs";import{existsSync as Fe}from"fs";import{join as we}from"path";async function jt(i){let e=i.status??"skipped",t=we(i.packDir,"tests",i.testId),r=we(t,"steps"),n=we(t,"logs");await Ne.mkdir(r,{recursive:!0});let o=we(r,".keep");Fe(o)||await Ne.writeFile(o,""),await Ne.mkdir(n,{recursive:!0});let s=we(n,"testrun.log");Fe(s)||await Ne.writeFile(s,i.reason+`
|
|
27
|
+
`);let a=we(t,i.definition.path);Fe(a)||await Ne.writeFile(a,i.definition.content);let l=we(n,"meta.yaml");if(!Fe(l)){let d=await Fn(n);await jn(i.packDir,i.testId,Dn(d))}let c=we(t,"result.yaml");Fe(c)||await Mn(i.packDir,i.testId,$n({testId:i.testId,status:e,definitionPath:i.definition.path,externalId:An(i.externalIdInput),tags:i.tags,environment:{},steps:[]}))}async function Wr(i,e,t){let r=[],n=new Array(i.length).fill(!1),o=0,s=!1,a,l=!1,c=()=>{r.length<i.length&&(l=!0)};t.signal&&(t.signal.aborted?c():t.signal.addEventListener("abort",c,{once:!0}));async function d(){for(;;){if(s||t.signal?.aborted||o>=i.length)return;let p=o++,m=i[p];n[p]=!0;try{t.onStart?.(m);let u=await e(m);r.push({item:m,result:u}),t.onEnd?.(m,u),t.failFast&&t.isFailure(u)&&(s=!0)}catch(u){a=a??u,s=!0}}}let f=Math.max(1,Math.min(t.parallel,i.length));try{await Promise.all(Array.from({length:f},()=>d()))}finally{t.signal?.removeEventListener("abort",c)}if(a)throw a;return{done:r,skipped:i.filter((p,m)=>!n[m]),cancelled:l}}function Kr(i){return{type:"testrun_plan",members:i.checks.map(e=>({path:e.path,test_id:e.testId,tags:e.tags,...e.failure?{failure:e.failure}:{}})),valid:i.valid,parallel:i.parallel,...i.parallelClamped?{parallel_clamped:!0}:{}}}function Gr(i,e){return{type:"testrun_start",execution_id:i,members:e.checks.map(t=>t.relPath),parallel:e.parallel}}function Yr(i){return{type:"testrun_member_start",path:i.path,test_id:i.testId}}function Jr(i,e){return{type:"testrun_member_end",path:i.path,test_id:i.testId,status:e.overallStatus,duration_s:e.durationS}}function zr(i,e){return{type:"testrun_evidence_ingest",status:i.ok?"ok":"failed",evidence_id:e,...i.stage?{stage:i.stage}:{}}}function Qr(i){return{type:"testrun_summary",totals:i.totals,duration_s:i.durationS,upload:i.upload,cancelled:i.cancelled}}function Xr(i,e){return{type:"testrun_done",execution_id:i,overall_status:e}}var Ee=i=>i.overallStatus==="failed"||i.overallStatus==="broken"||i.overallStatus==="interrupted";function Zr(i){try{return mi(i,"utf8")}catch{return""}}async function eo(i,e){let t=e.cwd??process.cwd(),r=Date.now(),n=On();e.onExecutionId?.(n);let o=h=>({execution_id:n,test_id:h.testId,testcase_id:h.testcaseId,project_id:h.projectId,folder_id:h.folderId,org_id:h.orgId,commit_id:h.commitId,session_name:h.sessionName,user_name:e.operator?.userName,user_email:e.operator?.userEmail}),s=await Pn({execution_id:n,title:i.title,started:new Date().toISOString(),producerVersion:_e,run_kind:"author",origin:"testrun",pid:process.pid},t);e.emit(Gr(n,i));let a=[...new Set(i.checks.flatMap(h=>h.tags))];e.log?.("info","TESTRUN_START","Testrun started",{execution_id:n,member_count:i.checks.length,parallel:i.parallel,on_failure:i.onFailure,tags:a});let l=0,c=i.checks.map(h=>({key:h.path,value:h})),d=await Wr(c,h=>e.executeMember(h.value,l++),{parallel:i.parallel,failFast:i.onFailure==="fail-fast",isFailure:Ee,signal:e.signal,onStart:h=>e.emit(Yr(h.value)),onEnd:(h,y)=>{e.emit(Jr(h.value,y)),e.log?.("info","TESTRUN_MEMBER_END","Testrun member ended",{execution_id:n,member_test_id:h.value.testId??fe(h.value.relPath),status:y.overallStatus,result_code:y.resultCode??null,duration_s:y.durationS,run_kind:y.runKind})}}),f=d.done.find(h=>Ee(h.result));for(let h of d.skipped)await jt({packDir:s,testId:fe(h.value.relPath),definition:{path:"test.md",content:Zr(h.value.path)},externalIdInput:o(h.value),tags:h.value.tags,reason:d.cancelled?"skipped: testrun cancelled":`skipped: fail-fast after ${f?di(f.item.value.path):"failure"}`});let p=new Map(d.done.map(h=>[h.item.value.relPath,h.result]));for(let h of i.checks){let y=fe(h.relPath);if(pi(ui(s,"tests",y,"result.yaml")))continue;let A=p.get(h.relPath);await jt({packDir:s,testId:y,definition:{path:"test.md",content:Zr(h.path)},externalIdInput:o(h),tags:h.tags,reason:`member ended '${A?.overallStatus??"broken"}' before writing its result (chrome-slot failure or pre-run crash \u2014 see member session logs)`,status:"broken"}),A&&!Ee(A)&&(A.overallStatus="broken",A.exitCode=2)}let m=d.done.flatMap(h=>h.result.pendingInvestigations??[]);if(m.length>0){e.emit({type:"testrun_investigations_wait",count:m.length});let h=m.map(P=>P.exited),y,A=!1;try{await Promise.race([Promise.allSettled(h),new Promise(P=>{y=setTimeout(()=>{A=!0,P()},e.investigationTimeoutMs??12e4)})])}finally{clearTimeout(y)}if(A){for(let Y of m)try{Y.cancel()}catch{}let P;try{await Promise.race([Promise.allSettled(h),new Promise(Y=>{P=setTimeout(Y,15e3)})])}finally{clearTimeout(P)}}}let u=await Rn(s,new Date().toISOString()),_;try{let h=await Tn(Pe(n,t),"L1");_=h.valid,h.valid||(console.warn("testrun: sealed pack failed L1 validation",h.diagnostics),e.log?.("warn","EVIDENCE_INVALID","Sealed testrun pack failed L1 validation",{execution_id:n,first_code:String(h.diagnostics?.[0]?.code??""),surface:"testrun"}))}catch(h){console.warn("testrun: validation error",h)}let E="skipped";if(e.shouldPublish&&!d.cancelled&&e.publish){let h=i.checks[0],y=await e.publish({testId:h.testId,sessionId:n,executionId:n,sealedPackPath:Pe(n,t),projectId:i.projectId});E=y.ok?"ok":"failed",e.emit(zr(y,n))}else e.shouldPublish&&d.cancelled&&e.log?.("info","PUBLISH_SKIPPED","Testrun evidence publish skipped",{surface:"testrun",reason:"cancel"});let x=new Map(d.done.map(h=>[h.item.value.path,h.result]));for(let h of i.checks){let y=x.get(h.path);await Nn(Je(h.path),{execution_id:n,run_kind:y?.runKind??"author",status:y?Ee(y)?y.overallStatus==="failed"?"failed":"broken":"passed":"skipped",valid:_,uploaded:E==="ok",at:new Date().toISOString()})}let I={tests:i.checks.length,passed:d.done.filter(h=>!Ee(h.result)).length,failed:d.done.filter(h=>h.result.overallStatus==="failed").length,broken:d.done.filter(h=>["broken","interrupted"].includes(h.result.overallStatus)).length,skipped:d.skipped.length};e.emit(Qr({totals:I,durationS:(Date.now()-r)/1e3,upload:E,cancelled:d.cancelled})),e.log?.("info","TESTRUN_SUMMARY","Testrun summary",{execution_id:n,totals:{passed:I.passed,failed:I.failed,broken:I.broken,skipped:I.skipped},upload:E});let v=d.done.some(h=>Ee(h.result)),S=d.cancelled?3:v?1:0;return e.emit(Xr(n,S===0?"passed":S===3?"cancelled":"failed")),e.log?.("info","TESTRUN_DONE","Testrun done",{execution_id:n,exit_code:S}),{exitCode:S,executionId:n}}import{readFileSync as fi}from"fs";function hi(i,e){return{testId:i,overallStatus:e.overallStatus,exitCode:e.exitCode,durationS:e.durationS??0,runKind:fr(!!e.anyAuthorStepRan),resultCode:e.resultCode??null,...e.pendingInvestigations?.length?{pendingInvestigations:e.pendingInvestigations}:{}}}function gi(i){let e={...i.passThroughOpts,cdpEndpoint:i.cdpEndpoint};return{path:i.abs,cwd:i.cwd,opts:e,isAgent:!0,disableAskUser:!0,resolved:{...i.resolved,chrome:{...i.resolved.chrome,cdp_endpoint:i.cdpEndpoint}},resolvedAuth:i.resolvedAuth,cliOverrides:{},environment:i.environment,envConfig:i.envConfig,profile:i.profile,model:i.model,creds:i.creds,configStore:i.configStore,session:i.session,skipGlobalRemoteLogger:!0,evidenceAttach:i.attach,onFatalExit:t=>{throw new Error(`project/folder gate failed: ${t.split(`
|
|
28
|
+
`)[0]}`)},signal:i.signal}}async function to(i,e,t,r,n=hr){let o=fe(i.relPath),s=Date.now();try{let a=await Vn.attach({packDir:t.packDir,testId:o,definition:{path:"test.md",content:fi(i.path,"utf8")},cwd:t.cwd}),l=gi({abs:i.path,cwd:t.cwd,resolved:Zn(i.path),resolvedAuth:t.resolvedAuth,environment:t.environment,envConfig:t.envConfig,profile:t.profile,model:t.model,creds:t.creds,configStore:t.configStore,session:new Ke,passThroughOpts:t.passThroughOpts,cdpEndpoint:e.cdpEndpoint,attach:a,signal:t.signal}),{host:c,lifecycle:d}=r(i),f=()=>{try{d.cleanup("runner","testrun cancelled")}catch{}};t.signal?.addEventListener("abort",f);try{let p=await n(l,c,d);return hi(o,p)}finally{t.signal?.removeEventListener("abort",f)}}catch(a){return process.stderr.write(`member ${i.relPath} broken: ${a.message}
|
|
29
|
+
`),{testId:o,overallStatus:"broken",exitCode:2,durationS:(Date.now()-s)/1e3,runKind:"replay"}}finally{e.release()}}import{mkdtempSync as wi,rmSync as vi}from"fs";import{tmpdir as bi}from"os";import{join as _i}from"path";function no(i){let e=Promise.resolve(),t=new Map,r=o=>{try{vi(o,{recursive:!0,force:!0})}catch{}};function n(o){let s=e.then(async()=>{if(t.has(o))throw new Error(`chrome slot ${o} already acquired (one acquire per worker index)`);let a=wi(_i(bi(),"kane-testrun-chrome-")),l;try{l=await i.launch({userDataDir:a,width:i.width,height:i.height,headless:i.headless})}catch(c){throw r(a),c}return t.set(o,{chrome:l,dataDir:a}),{cdpEndpoint:l.cdpEndpoint,release(){let c=t.get(o);if(c){t.delete(o);try{c.chrome.kill()}catch{}r(c.dataDir)}}}});return e=s.catch(()=>{}),s}return{acquire:n,killAll(){for(let[,o]of t){try{o.chrome.kill()}catch{}r(o.dataDir)}t.clear()}}}function ro(){let i=new Map;return{register(e,t){i.set(e,t)},deregister(e){i.delete(e)},cleanup(e,t){let r=i.get(e);if(r){i.delete(e);try{r()}catch{}}},remoteLogger:null}}import{EventEmitter as yi}from"events";import{Writable as ki}from"stream";function Ci(){return new ki({write(i,e,t){t()}})}function Si(){let i=new yi;return Object.assign(i,{isTTY:!0,setEncoding(){},setRawMode(e){return i},ref(){return i},unref(){return i},read(){return null}}),i}function oo(){let i=process.env.KANE_TESTRUN_MEMBER_DEBUG;return i==="1"||i==="true"}function io(){return{...tr({isAgent:!0,log:()=>{},stdout:oo()?process.stderr:Ci(),stdin:Si()}),onAgentEvent:oo()?e=>{process.stderr.write(`[member] ${JSON.stringify(e)}
|
|
30
|
+
`)}:()=>{},onLockState:()=>{},onRetryAttempt:()=>{}}}import{randomUUID as Ei}from"crypto";function xi(i,e){return e.concat(i.split(",").map(t=>t.trim()).filter(t=>t.length>0))}function Ii(i){let e=Number(i);if(!Number.isInteger(e)||e<1)throw new Nr(`--parallel must be a positive integer, got: ${i}`);return i}function ao(){let i=new Me("testrun").description("Run M authored *_test.md files as one execution (one sealed evidence pack)");return i.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)",xi,[]).option("--parallel <n>","Worker count",Ii,"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("--retry","on replay failure, full-restart with shrinking replay window").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}).option("--retry-count <n>","max replay restart attempts before falling back to complete re-author (default: 3)",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}).option("--headless","Run Chrome in headless mode").option("--env <name>","Environment (prod or stage)").addOption(new W("--local","Skip TMS integration (no uploads, no evidence publish)").hideHelp()).addOption(new W("--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 Ai(e,t)}),i}async function Ai(i,e){let t=e.cwd??process.cwd(),r=!process.stdin.isTTY,n=Oi(r),o;try{o=await qr({paths:i.length>0?i:void 0,match:e.match,tags:e.tags?.length?e.tags:void 0,parallel:e.parallel!==void 0?Number(e.parallel):void 0,onFailure:e.onFailure,name:e.name,cwd:t})}catch(T){if(T instanceof Ce){process.stderr.write(`error: ${T.message}
|
|
31
|
+
`),process.exitCode=2;return}throw T}if(r?n(Kr(o)):$i(o),e.dryRun){!o.valid&&!r&&so(o),process.exitCode=o.valid?0:2;return}if(!o.valid){r||so(o),process.exitCode=2;return}let s=new ee,a=new ie,l=s.getActiveProfile()??"default",c=e.env??s.getDefaultEnv()??"prod",d=G(c),f="v16-alpha",p;try{p=await he({creds:s,env:c,usernameFlag:e.username,accessKeyFlag:e.accessKey,log:()=>{}})}catch(T){T instanceof $e&&T.code==="not_authenticated"?process.stderr.write(`error: Not authenticated. Choose one:
|
|
32
|
+
\u2022 Pass credentials inline: --username <user> --access-key <key>
|
|
33
|
+
\u2022 Run 'kane-cli login --oauth' (browser-based)
|
|
34
|
+
\u2022 Run 'kane-cli login --username <user> --access-key <key>'
|
|
35
|
+
`):T instanceof $e&&T.code==="refresh_failed"?process.stderr.write(`error: Token refresh failed. Run 'kane-cli login' to re-authenticate.
|
|
36
|
+
`):process.stderr.write(`error: auth resolution failed: ${T.message}
|
|
37
|
+
`),process.exitCode=2;return}let m=e.log?{log:e.log,shutdown:async()=>{}}:Ri({environment:c,resolvedAuth:p,isAgent:r}),u=m.log,_={retry:e.retry,retryCount:e.retryCount,headless:e.headless,env:e.env,local:e.local,username:e.username,accessKey:e.accessKey,bugDetection:e.bugDetection},E=a.load(),x=no({launch:kn,width:E.window_size.width,height:E.window_size.height,headless:!!e.headless});Se("testrun-slots",()=>x.killAll());let I={packDir:"",resolvedAuth:p,environment:c,envConfig:d,creds:s,configStore:a,profile:l,model:f,passThroughOpts:_,cwd:t},v=T=>({host:io(),lifecycle:ro()}),S="",h=async(T,$)=>{let q;try{q=await x.acquire($)}catch(J){let He=J.message;process.stderr.write(`member ${T.relPath}: chrome slot failed: ${He}
|
|
38
|
+
`);let V=fe(T.relPath),Be=T.testId??V;return Un(Ln(I.packDir,V),"warn","TESTRUN_SLOT_FAILURE",{execution_id:S,slot_index:$,member_test_id:Be,phase:"launch",error:He},u),{testId:T.testId??"",overallStatus:"broken",exitCode:2,durationS:0,runKind:"replay"}}return to(T,q,I,v)},y=!e.local&&!!p.basicAuth&&o.projectId!=null&&e.evidencePublish!==!1;if(!y){let T=e.local?"local":p.basicAuth?o.projectId==null?"no_project":"flag":"no_auth";u("info","PUBLISH_SKIPPED","Testrun evidence publish skipped",{surface:"testrun",reason:T})}let A=p.basicAuth?async T=>{let $=p.basicAuth,q=await pr({controller:new bn(d.controllerBaseUrl,{username:$.username,accessKey:$.access_key}),tms:new ln(d.tmsBaseUrl,p.resolvedCreds?.username??$.username,p.resolvedCreds?.access_key??$.access_key),...T});if(q.ok)return u("info","EVIDENCE_PUBLISH_OK","Testrun evidence published",{surface:"testrun",execution_id:T.executionId}),{ok:!0};let J=/\b(\d{3})\b/.exec(q.error)?.[1]??null;return u("error","EVIDENCE_PUBLISH_FAILED","Testrun evidence publish failed",{surface:"testrun",stage:q.stage,http_status:J?Number(J):null,error:q.error}),{ok:!1,stage:q.stage}}:void 0,P=new AbortController;I.signal=P.signal;let Y=Ti(P),Ve={executeMember:h,publish:A,emit:n,log:u,shouldPublish:y,operator:{userName:p.resolvedCreds?.username??void 0,userEmail:p.resolvedCreds?.email??void 0},signal:P.signal,cwd:t,onExecutionId:T=>{S=T,I.packDir=Pe(T,t)}};try{let{exitCode:T}=await eo(o,Ve);if(process.exitCode=T,I.packDir){let{offerEvidenceView:$}=await import("./evidence-O4AON5FU.js");await $({packPath:I.packDir,env:c,isTTY:!r&&T!==3&&!!process.stdin.isTTY&&!!process.stderr.isTTY,log:q=>process.stderr.write(q+`
|
|
39
|
+
`)})}}catch(T){process.stderr.write(`error: testrun failed: ${T.message}
|
|
40
|
+
`),process.exitCode=1}finally{Y(),x.killAll(),pn("testrun-slots"),await m.shutdown()}}function Ti(i){let e=process.listeners("SIGINT");process.removeAllListeners("SIGINT");let t=()=>i.abort();return process.on("SIGINT",t),()=>{process.removeListener("SIGINT",t);for(let r of e)process.on("SIGINT",r)}}function Ri(i){let e=null;try{let n=i.resolvedAuth.resolvedCreds;n&&(e=dr({sessionId:Ei(),identity:{org_id:String(n.org_id??""),user_id:String(n.user_id??""),machine_id:ur(),email:n.email??null,email_domain:n.email_domain??"unknown",user_type:n.user_type??"unknown",env:i.environment,plan:n.plan??"unknown"},invocationMode:i.isAgent?"agent":"cli",getToken:async()=>i.resolvedAuth.token??null}),e.start())}catch{e=null}return{log:(n,o,s,a)=>{try{e?.log(n,o,s,a)}catch{}},shutdown:async()=>{try{await e?.shutdown()}catch{}}}}function Oi(i){return i?e=>process.stdout.write(JSON.stringify(e)+`
|
|
41
|
+
`):e=>Pi(e)}function Pi(i){switch(i.type){case"testrun_start":process.stdout.write(`
|
|
42
|
+
running ${i.members.length} test(s) (parallel=${i.parallel})
|
|
43
|
+
`);break;case"testrun_member_start":process.stdout.write(` -> ${i.path}
|
|
44
|
+
`);break;case"testrun_member_end":process.stdout.write(` ${i.status==="passed"?"PASS":"FAIL"} ${i.path} (${i.status}, ${i.duration_s}s)
|
|
45
|
+
`);break;case"testrun_evidence_ingest":process.stdout.write(` evidence: ${i.status}
|
|
46
|
+
`);break;case"testrun_summary":{let e=i.totals;process.stdout.write(`
|
|
47
|
+
${e.passed} passed, ${e.failed} failed, ${e.broken} broken, ${e.skipped} skipped (${i.duration_s}s, upload: ${i.upload})
|
|
48
|
+
`);break}case"testrun_done":process.stdout.write(`testrun ${i.execution_id}: ${i.overall_status}
|
|
49
|
+
`);break;default:break}}function $i(i){process.stdout.write(`
|
|
50
|
+
testrun: ${i.title}
|
|
51
|
+
`),process.stdout.write(` parallel=${i.parallel} on-failure=${i.onFailure}
|
|
52
|
+
|
|
53
|
+
`);for(let e of i.checks){let t=e.failure?"x":"+",r=e.tags.length>0?` [${e.tags.join(", ")}]`:"";process.stdout.write(` ${t} ${e.relPath}${r}
|
|
54
|
+
`)}process.stdout.write(`
|
|
55
|
+
${i.checks.length} test(s) selected \u2014 plan ${i.valid?"valid":"INVALID"}
|
|
56
|
+
`)}function so(i){let e=i.checks.filter(t=>t.failure);if(e.length===0){process.stderr.write(`error: no *_test.md files selected.
|
|
57
|
+
`);return}process.stderr.write(`
|
|
58
|
+
error: plan invalid \u2014 ${e.length} offending test(s):
|
|
59
|
+
`);for(let t of e)process.stderr.write(` ${t.relPath}: ${t.failure}
|
|
60
|
+
`)}function Le(i){let e=new Me;if(e.name("kane-cli").version(_e).showHelpAfterError("(run `kane-cli --help` to see all commands; `-h` and `help` also work)"),e.on("command:*",r=>{e.error(`error: unknown command '${r[0]}'`,{exitCode:2,code:"commander.unknownCommand"})}),i[0]==="--help"||i[0]==="-h"||i[0]==="help"){(async()=>{let{HelpView:r}=await import("./HelpView-YYKTP4JH.js"),{render:n}=await import("./build-JIKYOZUH.js"),o=await import("./react-QWOAB3TB.js"),{waitUntilExit:s}=n(o.default.createElement(r));await s(),b(0,"Help displayed")})();return}e.command("login").option("--oauth","Login via OAuth (opens browser)").option("--username <user>","Basic auth username").option("--access-key <key>","Basic auth access key").addOption(new W("--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 W("--model <name>","Model").default("v16-alpha").hideHelp()).option("--chrome-profile <path>","Chrome profile path").action(async r=>{let n=new ee,o=new ie,s=r.env,a=r.profile;if(!process.stdin.isTTY||r.oauth||r.username){if(n.setDefaultEnv(s),r.oauth)await new wn(a,s,n).login(),console.log(`Logged in as ${a} [${s}] via OAuth`);else if(r.username&&r.accessKey){try{let{validateBasicAuth:x}=await import("./validate-basic-FO7C2URG.js");await x(s,r.username,r.accessKey)}catch{console.error("Credentials not valid. Please use valid credentials."),b(1,"Invalid basic-auth credentials");return}n.saveBasicAuth(a,s,{username:r.username,access_key:r.accessKey}),console.log(`Logged in as ${a} [${s}] via basic auth`)}else console.error("Provide --oauth, or --username and --access-key"),b(1,"Missing --oauth or credentials for login");n.setActiveProfile(a),o.set("model",r.model),r.chromeProfile&&o.set("chrome_profile_path",r.chromeProfile);let E=null;if(r.username&&r.accessKey)E={username:r.username,access_key:r.accessKey};else try{let I=await he({creds:n,env:s,log:()=>{}});I.resolvedCreds&&(E={username:I.resolvedCreds.username,access_key:I.resolvedCreds.access_key})}catch{}if(r.projectId&&(ye(n,o,a,s,{projectId:r.projectId}),console.log(`Project set to ${r.projectId}`)),r.folderId&&(ye(n,o,a,s,{folderId:r.folderId}),console.log(`Folder set to ${r.folderId}`)),E&&(!r.projectId||!r.folderId))try{let x=await dn({creds:n,config:o,profile:a,env:s,tmsCreds:E,log:()=>{}});r.projectId||console.log(`Auto-selected project: ${x.projectName} (${x.projectId})`),r.folderId||console.log(`Auto-selected folder: ${x.folderName} (${x.folderId})`)}catch(x){console.warn(`Could not auto-select project/folder: ${x instanceof Error?x.message:x}`)}Ge(n,o,a,s),console.log("Setup complete."),b(0,"Setup complete")}let{SingleShotApp:l}=await import("./SingleShotApp-5TYM356H.js"),{ScrollbackProvider:c}=await import("./scrollback-6GINSTL2.js"),{render:d}=await import("./build-JIKYOZUH.js"),f=await import("./react-QWOAB3TB.js"),p={current:null},m={current:!1},{waitUntilExit:u,unmount:_}=d(f.default.createElement(c,null,f.default.createElement(l,{resultRef:p,mode:"login",loginCompleteRef:m})),{exitOnCtrlC:!1});Oe(()=>_()),await u();try{process.stdin.setRawMode?.(!1)}catch{}process.stdout.write("\x1B[?25h"),m.current&&console.log("Login setup complete."),process.exit(0)}),e.command("logout").action(async()=>{let r=new ee,n=r.getActiveProfile();if(!n){console.log("No active profile to logout");return}let o=r.getDefaultEnv(),s=await vn(r,n,o),a=new ie;s.switchedTo?(Ge(r,a,s.switchedTo.profile,s.switchedTo.env),console.log(`Logged out ${s.profile} [${s.env}]. Switched to ${s.switchedTo.profile} [${s.switchedTo.env}]`)):(a.save({project_id:null,project_name:null,folder_id:null,folder_name:null}),console.log(`Logged out ${s.profile} [${s.env}]. No profiles remaining.`))}),e.command("whoami").option("--profile <name>","Profile name").action(async r=>{let n=new ee,o=r.profile??n.getActiveProfile()??"default",s=n.getDefaultEnv(),a=n.loadCredentials(o,s),l=n.loadBasicAuth(o,s),c="none",d=l?.username,f,p,m,u;if(l?c="basic":a&&(c="oauth",p=new Date(a.expires_at*1e3).toISOString().slice(0,10)),c==="none")f="missing";else try{let v=await he({creds:n,env:s,log:()=>{}});if(v.resolvedCreds)m="verified",f="valid",d=v.resolvedCreds.username??d;else{let{classifyAuthFailure:S}=await import("./resolver-IDCGRPFJ.js");S(v.resolver.lastError)==="auth"?(m="rejected",f="expired",u="Credentials rejected by the server \u2014 re-login or rotate your access key"):(m="unreachable",u=v.resolver.lastError?.message)}}catch(v){let S=v;S.code==="refresh_failed"?(m="rejected",f="expired",u="OAuth token refresh failed \u2014 run 'kane-cli login'"):S.code==="not_authenticated"?(c="none",f="missing"):(m="unreachable",u=S.message)}let{WhoamiView:_}=await import("./WhoamiView-DH25ZD4C.js"),{render:E}=await import("./build-JIKYOZUH.js"),x=await import("./react-QWOAB3TB.js"),{waitUntilExit:I}=E(x.default.createElement(_,{profile:o,env:s,authenticated:m==="verified",authMethod:c,username:d,tokenStatus:f,expiresAt:p,serverStatus:m,detail:u}));await I(),c==="none"?b(1,"whoami: not-authenticated"):m&&m!=="verified"&&b(m==="unreachable"?3:1,`whoami: ${m}`)}),e.command("config <action> [value]").description("Show or change settings (show, set-mode, set-assertion-mode, set-network-ws, set-network-sse, set-bug-detection, set-url, set-window, chrome-profile, project, folder, reset)").option("--agent","Force JSON output for `show` (auto-on when stdin is not a TTY)").action(async(r,n,o)=>{let s=new ie,a=new ee;if(r==="show"){let l=s.load(),c=a.getActiveProfile()??"default",d=a.getDefaultEnv(),f=a.loadProfileConfig(c,d)??{},p=f.project_id??l.project_id??null,m=f.project_name??l.project_name??null,u=f.folder_id??l.folder_id??null,_=f.folder_name??l.folder_name??null,E=a.loadBasicAuth(c,d),x=a.loadCredentials(c,d),I=E?`basic (${E.username})`:x?"oauth":"not configured";if(!!o?.agent||!process.stdin.isTTY||!process.stdout.isTTY){let P=G(d);process.stdout.write(`${JSON.stringify({profile:c,env:d,auth:I,project_id:p,project_name:m,folder_id:u,folder_name:_,model:l.model,mode:l.mode,assertion_mode:l.assertion_mode,network_ws:l.network_ws,network_sse:l.network_sse,bug_detection:l.bug_detection,window_size:`${l.window_size.width}x${l.window_size.height}`,chrome_profile:l.chrome_profile_path,default_url:l.default_url??mt,controller_base_url:P.controllerBaseUrl,tms_base_url:P.tmsBaseUrl})}
|
|
61
|
+
`),b(0,"config show complete");return}let{ConfigView:S}=await import("./ConfigView-NWNDNTKW.js"),{render:h}=await import("./build-JIKYOZUH.js"),y=await import("./react-QWOAB3TB.js"),{waitUntilExit:A}=h(y.default.createElement(S,{model:l.model,authLabel:I,profile:c,env:d,defaultUrl:l.default_url??mt,projectId:p,projectName:m,folderId:u,folderName:_,windowSize:`${l.window_size.width}x${l.window_size.height}`,chromeProfile:l.chrome_profile_path}));await A()}else if(r==="set-window"&&n){let l=n.split("x").map(Number),[c,d]=l;!c||!d||!Number.isInteger(c)||!Number.isInteger(d)?console.error("Invalid format. Use: kane-cli config set-window WIDTHxHEIGHT"):c<800||c>3840?console.error(`Width must be between 800 and 3840 (got ${c})`):d<600||d>2160?console.error(`Height must be between 600 and 2160 (got ${d})`):(s.set("window_size",{width:c,height:d}),console.log(`Window size set to ${c}x${d}`))}else if(r==="set-mode"){if(n!=="action"&&n!=="testing"){console.error("Mode must be 'action' or 'testing'."),b(1,"Invalid mode");return}s.set("mode",n),console.log(`Mode set to ${n}`)}else if(r==="set-assertion-mode"){if(n!=="visual"&&n!=="dom"){console.error("Assertion mode must be 'visual' or 'dom'."),b(1,"Invalid assertion-mode");return}s.set("assertion_mode",n),console.log(`Assertion mode set to ${n}`)}else if(r==="set-network-ws"){if(n!=="on"&&n!=="off"){console.error("WebSocket capture must be 'on' or 'off'."),b(1,"Invalid network-ws value");return}s.set("network_ws",n==="on"),console.log(`WebSocket capture set to ${n}`)}else if(r==="set-network-sse"){if(n!=="on"&&n!=="off"){console.error("SSE capture must be 'on' or 'off'."),b(1,"Invalid network-sse value");return}s.set("network_sse",n==="on"),console.log(`SSE capture set to ${n}`)}else if(r==="set-bug-detection"){if(n!=="off"&&n!=="stop"&&n!=="continue"){console.error("Bug detection must be 'off', 'stop' or 'continue'."),b(1,"Invalid bug-detection value");return}s.set("bug_detection",n),console.log(`Bug detection set to ${n}`)}else if(r==="set-url"){if(!n){console.error("Usage: kane-cli config set-url <url>"),b(1,"Missing URL");return}let l=Kn(n);if(!l){console.error(`Invalid URL: ${n}`),b(1,"Invalid URL");return}s.set("default_url",l),console.log(`Default URL set to ${l}`)}else if(r==="chrome-profile"){if(n||!process.stdin.isTTY){n||(console.error("Usage: kane-cli config chrome-profile <path>"),b(1,"Missing chrome-profile path")),s.set("chrome_profile_path",n),console.log(`Chrome profile set to ${n}`);return}let{ChromeProfilePicker:l}=await import("./ChromeProfilePicker-PIWZY4WH.js"),{render:c}=await import("./build-JIKYOZUH.js"),d=await import("./react-QWOAB3TB.js");await new Promise(f=>{let{unmount:p}=c(d.default.createElement(l,{currentPath:s.load().chrome_profile_path,onSelect:m=>{s.set("chrome_profile_path",m),console.log(`Chrome profile set to ${m}`),p(),f()},onCancel:()=>{p(),f()}}))})}else if(r==="project"){if(n||!process.stdin.isTTY){n||(console.error("Usage: kane-cli config project <project-id>"),b(1,"Missing project ID"));let v=a.getActiveProfile()??"default",S=a.getDefaultEnv();ye(a,s,v,S,{projectId:n}),console.log(`Project set to ${n}`);return}let l=a.getDefaultEnv(),c=G(l),d=a.getActiveProfile()??"default",{resolveTmsBasicAuth:f,formatAuthResolutionError:p}=await import("./list-commands-VJAL4J3O.js"),m=await f(d,l,{});if(!m.ok){let{message:v}=p(d,l,m);process.stderr.write(v),b(2,`${m.reason} for "${d}" [${l}]`);return}let{ProjectPicker:u}=await import("./ProjectPicker-ANJ6NGNY.js"),{AuthResolver:_}=await import("./resolver-IDCGRPFJ.js"),{render:E}=await import("./build-JIKYOZUH.js"),x=await import("./react-QWOAB3TB.js"),I=new _(c.controllerBaseUrl,async()=>null,{username:m.creds.username,access_key:m.creds.access_key});await I.resolve(),await new Promise(v=>{let{unmount:S}=E(x.default.createElement(u,{resolver:I,currentProjectId:s.load().project_id,env:l,onSelect:(h,y)=>{let A=a.getActiveProfile()??"default",P=a.getDefaultEnv();ye(a,s,A,P,{projectId:h,projectName:y}),console.log(`Project set to ${y} (${h})`),S(),v()},onCancel:()=>{S(),v()}}))})}else if(r==="folder"){if(n||!process.stdin.isTTY){if(n||(console.error("Usage: kane-cli config folder <folder-id>"),b(1,"Missing folder ID")),!s.load().project_id){console.log("Select a project first: kane-cli config project <id>");return}let h=a.getActiveProfile()??"default",y=a.getDefaultEnv();ye(a,s,h,y,{folderId:n}),console.log(`Folder set to ${n}`);return}let l=s.load();if(!l.project_id){console.log("Select a project first: kane-cli config project");return}let c=a.getDefaultEnv(),d=G(c),f=a.getActiveProfile()??"default",{resolveTmsBasicAuth:p,formatAuthResolutionError:m}=await import("./list-commands-VJAL4J3O.js"),u=await p(f,c,{});if(!u.ok){let{message:S}=m(f,c,u);process.stderr.write(S),b(2,`${u.reason} for "${f}" [${c}]`);return}let{FolderPicker:_}=await import("./FolderPicker-5S23OTSY.js"),{AuthResolver:E}=await import("./resolver-IDCGRPFJ.js"),{render:x}=await import("./build-JIKYOZUH.js"),I=await import("./react-QWOAB3TB.js"),v=new E(d.controllerBaseUrl,async()=>null,{username:u.creds.username,access_key:u.creds.access_key});await v.resolve(),await new Promise(S=>{let{unmount:h}=x(I.default.createElement(_,{resolver:v,projectId:l.project_id,currentFolderId:l.folder_id,env:c,onSelect:(y,A)=>{let P=a.getActiveProfile()??"default",Y=a.getDefaultEnv();ye(a,s,P,Y,{folderId:y,folderName:A}),console.log(`Folder set to ${A} (${y})`),h(),S()},onCancel:()=>{h(),S()}}))})}else console.log("Usage: kane-cli config show|set-url|set-window|set-mode|set-assertion-mode|set-network-ws|set-network-sse|set-bug-detection|chrome-profile|project|folder")}),e.command("run").argument("<objective>","Test objective (use {{var}} to reference variables)").option("--headless","Run Chrome in headless mode").option("--max-steps <n>","Maximum agent steps","30").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: ${te(pe,"global-memory.md")})`).option("--local-context <file>","Override local context markdown (default: .testmuai/context.md in cwd)").addOption(new W("--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 W("--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: 'visual' (default, vision model) or 'dom' (DOM-based extraction & assertions). Overrides config.").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`.",r=>{if(r!=="off"&&r!=="stop"&&r!=="continue")throw new Error("--bug-detection must be off, stop or continue");return r}).addOption(new W("--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("--skip-code-validation","Skip post-codegen worker-side validation").option("--no-skip-code-validation","Force post-codegen worker-side validation").addHelpText("after",`
|
|
28
62
|
Variables:
|
|
29
63
|
Variables are loaded in order (later wins):
|
|
30
|
-
1. Global: ${
|
|
64
|
+
1. Global: ${te(pe,"variables")}/*.json
|
|
31
65
|
2. Local: {cwd}/.testmuai/variables/*.json
|
|
32
66
|
3. File: --variables-file <path>
|
|
33
67
|
4. Inline: --variables '{"key": {"value": "...", "secret": false}}'
|
|
@@ -42,33 +76,35 @@ Variables:
|
|
|
42
76
|
|
|
43
77
|
Context Files:
|
|
44
78
|
Context files provide additional instructions to the agent.
|
|
45
|
-
Global: ${
|
|
79
|
+
Global: ${te(pe,"global-memory.md")}
|
|
46
80
|
Local: {cwd}/.testmuai/context.md
|
|
47
81
|
|
|
48
82
|
Override with --global-context / --local-context flags.
|
|
49
|
-
`).action(async(
|
|
83
|
+
`).action(async(r,n)=>{try{if(n.name){let{validateNameOrThrow:g}=await import("./name-validator-5YGJXLZ7.js");try{g(n.name)}catch(k){console.error(`error: ${k.message}`),b(2,"Invalid --name");return}}if(r&&r.endsWith(".md")&&!r.startsWith("-")){process.stderr.write(`error: '.md' files are no longer accepted by 'kane run'.
|
|
50
84
|
Use 'kane-cli testmd run <path>' instead.
|
|
51
|
-
`),process.exit(2);return}let o=new
|
|
52
|
-
`)};
|
|
53
|
-
|
|
85
|
+
`),process.exit(2);return}let o=new ee,s=new ie,a=s.load();n.chromeProfile&&(a.chrome_profile_path=n.chromeProfile);let l;if(n.mode===void 0)l=a.mode==="action"?"action":"testing";else if(n.mode==="action"||n.mode==="testing")l=n.mode;else{console.error("Invalid --mode. Must be 'action' or 'testing'."),b(2,"Invalid --mode");return}let c;if(n.assertionMode===void 0)c=a.assertion_mode==="dom"?"dom":"visual";else if(n.assertionMode==="visual"||n.assertionMode==="dom")c=n.assertionMode;else{console.error("Invalid --assertion-mode. Must be 'visual' or 'dom'."),b(2,"Invalid --assertion-mode");return}let d=new Ke,{printRecordingBanner:f}=await import("./recording-banner-2TNKQHP2.js");await f({isAgent:!!n.agent||!process.stdin.isTTY,sessionId:d.sessionId,sessionName:n.name??null,testPath:n.name?te(process.cwd(),".testmuai","tests",`${n.name}_test.md`):null,outputPath:n.name?te(process.cwd(),".testmuai","tests",`output-${n.name}`):null});let p=!!(n.username&&n.accessKey);if(await Xn({isInteractive:!!process.stdin.isTTY&&!n.agent&&!p,creds:o,config:s}),!p){let g=o.getActiveProfile(),k=o.getDefaultEnv();g&&(o.loadBasicAuth(g,k)||o.loadCredentials(g,k))||(console.error("Not authenticated. Run: kane-cli login --oauth, or kane-cli login --username <user> --access-key <key>"),b(1,"Not authenticated"))}let m=`${o.getActiveProfile()??"no profile"}/${o.getDefaultEnv()}`,u=[],_=n.env??o.getDefaultEnv(),E=null,x=[],I=(g,k,C,O)=>{E?E(g,k,C,O):x.push([g,k,C,O])},v;try{v=await he({creds:o,env:_,usernameFlag:n.username,accessKeyFlag:n.accessKey,log:I})}catch(g){throw g instanceof $e&&(console.error(g.code==="not_authenticated"?"Not authenticated. Run: kane-cli login":"Token refresh failed. Run: kane-cli login"),b(2,g.code==="not_authenticated"?"Not authenticated":"Token refresh failed")),g}let S=!!v.basicAuth,h=v.basicAuth?.username,y=v.basicAuth?.access_key,A=v.token,P=v.resolver,Y=v.resolvedCreds;v.basicAuth&&u.push(`Auth: ${v.basicAuth.username}`);let Ve=o.getActiveProfile()??"default",T=o.getDefaultEnv();cn(o,s,Ve,T);let $=s.load(),q=v.basicAuth??(v.resolvedCreds?{username:v.resolvedCreds.username,access_key:v.resolvedCreds.access_key}:null);if(q){let g=!!n.agent||!process.stdin.isTTY,k=await gn({creds:o,config:s,profile:Ve,env:T,tmsCreds:q,isLocal:!!n.local,log:I});k.status==="cancelled"&&(console.error("error: project/folder configuration failed. See remediation above, or use --local."),b(2,"project/folder gate failed")),k.status==="ok"&&k.autoDefaulted&&g&&process.stdout.write(hn(k.autoDefaulted)),$=s.load()}else n.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>`."),b(2,"no TMS credentials for project/folder gate"));let J=Gn({flag:n.url,configDefault:a.default_url}),He=Yn({resolvedUrl:J,local:n.local,allowMissingUrl:n.allowMissingUrl,isTTY:!!process.stdin.isTTY}),V=ar({objective:r,globalDir:te(pe,"variables"),localDir:te(process.cwd(),".testmuai","variables"),file:n.variablesFile,inline:n.variables,onLoadError:g=>console.error(g)}),Be;if(n.sessionContext)try{Be=JSON.parse(n.sessionContext)}catch{console.error("Invalid --session-context JSON"),b(2,"Invalid --session-context JSON")}let _o=n.globalContext??te(pe,"global-memory.md"),yo=n.localContext??te(process.cwd(),".testmuai","context.md"),Ht=vt(_o),Bt=vt(yo),ne;try{ne=await or({config:a,startUrl:J??void 0,headless:n.headless,cft:n.cft,wsEndpoint:n.wsEndpoint,cdpEndpoint:n.cdpEndpoint})}catch(g){console.error(yn(g));let k=g instanceof _n?"Chrome not found at standard paths":`Chrome failed: ${g instanceof Error?g.message:g}`;b(2,k)}ne.instance&&Se("chrome",()=>{ne.instance.kill()});let X=null,qt=ne.cdpEndpoint??n.cdpEndpoint;qt&&!n.cft&&!n.wsEndpoint&&(X=Sn({headless:n.headless,cdpEndpoint:qt,chromePid:ne.instance?.process.pid}),X&&Se("marker-overlay",()=>X.kill())),n.cft?u.push("CfT mode: Playwright will manage its own browser"):n.wsEndpoint?u.push(`Playwright WS endpoint (${n.wsEndpoint.slice(0,60)}...)`):n.cdpEndpoint?u.push(`CDP connected (${n.cdpEndpoint})`):ne.cdpEndpoint&&u.push(`Chrome ready (${ne.cdpEndpoint})`);let w=d;w.start({model:n.model??a.model,environment:_,profile:o.getActiveProfile()}),n.name&&w.setSessionName(n.name),v.resolvedCreds?.org_id!==void 0&&w.setOrgId(String(v.resolvedCreds.org_id)),v.resolvedCreds?.plan!==void 0&&w.setPlan(v.resolvedCreds.plan??null),w.setUserIdentity(v.resolvedCreds?.username??null,v.resolvedCreds?.email??null),E=(g,k,C,O)=>w.log(g,k,C,O);for(let g of x)w.log(...g);x.length=0;let Wt=S&&h&&y?{username:h,accessKey:y}:A??null,re=null;if(Wt!==null){let g=await mr({env:_,tmsCreds:v.resolvedCreds??null,resolver:v.resolver,auth:Wt,getToken:async()=>v.token??null,session:w,log:(k,C,O,H)=>w.log(k,C,O,H),skipScreenshotQueue:n.local,invocationMode:n.agent||!process.stdin.isTTY?"agent":"cli"});re=g.screenshotQueue,g.remoteLogger&&(Se("remote-logger",()=>g.remoteLogger.shutdownSync()),un(g.remoteLogger))}let Kt=v.basicAuth&&!n.local?await lr({variables:V,auth:v.basicAuth,orgId:String(v.resolvedCreds?.org_id??""),env:_,localMode:!!n.local,log:(g,k,C,O)=>w.log(g,k,C,O)}):{};w.setAuteurVariables(V.auteur),w.setFirstRun(V.auteurObjective,J??"");let{startInlineEvidence:ko,noteInlineSpawn:Gt,inlineEvidenceBlock:Co,finalizeInlineEvidence:So,createCdpBrowserCapture:Eo}=await import("./evidence-O4AON5FU.js"),it=Eo(ne.cdpEndpoint),M=await ko({objectiveOrName:n.name??r,sessionId:w.sessionId,title:n.name??r,producerVersion:_e,pid:process.pid,surfaces:J?[J]:void 0,packRootDir:te(w.sessionDir,"evidence")}),qe=async(g={})=>(w.flushRecorder(),await So(M,{saved:!!w.sessionName,recordedTestPath:w.recorder?.lastWrittenPath??null,externalIdInput:{session_id:w.sessionId,commit_id:w.sessionId,test_id:w.testId??void 0,testcase_id:g.testcaseId??w.testcaseId??void 0,project_id:$.project_id??void 0,folder_id:$.folder_id??void 0,org_id:w.orgId??void 0,session_name:w.sessionName??void 0,user_name:w.userName??void 0,user_email:w.userEmail??void 0,sharable_link:nr(G(_).testManagerUiUrl,$.project_id,g.testcaseId??w.testcaseId,g.shareId)},cdpBrowserCapture:it,model:n.model??a.model,tuiLogPath:te(w.sessionDir,"tui.log"),log:(k,C,O,H)=>w.log(k,C,O,H)}));if(!n.local&&v.basicAuth&&$.project_id){let g=G(_),k=await cr({tmsBaseUrl:g.tmsBaseUrl,auth:v.basicAuth,objective:V.auteurObjective,url:J??"",projectId:$.project_id,folderId:$.folder_id??"",hasCustomProfile:!!a.chrome_profile_path,log:(C,O,H,se)=>w.log(C,O,H,se)});k&&w.setTestId(k)}w.setResolvedGlobal({mode:l,max_steps:parseInt(n.maxSteps,10),timeout:n.timeout?parseInt(n.timeout,10):void 0,target:ne.instance?"chrome":n.cdpEndpoint?"cdp":n.wsEndpoint?"ws":void 0,chrome_profile:a.chrome_profile_path||void 0,cdp_endpoint:n.cdpEndpoint||void 0,ws_endpoint:n.wsEndpoint||void 0,headless:n.headless,global_context:Ht??void 0,local_context:Bt??void 0,variables:Object.keys(V.auteur).length>0?V.auteur:void 0});let Yt=sr(V.auteur,V.auteurObjective),Jt=ir({objective:V.auteurObjective,url:J??void 0,requireStartUrl:He,model:n.model??a.model,chrome:ne,auth:v,sessionId:w.sessionId,runIndex:0,windowSize:a.window_size,maxSteps:parseInt(n.maxSteps,10),headless:n.headless,disableAskUser:!process.stdin.isTTY,enableTaskSkills:n.taskSkills,networkWs:n.networkWs,networkSse:n.networkSse,bugDetection:n.bugDetection??a.bug_detection,variables:Object.keys(Yt).length>0?Yt:void 0,globalContext:Ht??void 0,localContext:Bt??void 0,sessionContext:Be,evidence:Co(M)}),st=Bn(),zt=re?(g,k,C,O)=>{if(M&&O){st.track(qn(M.packTestDir,O,re,(H,se,N,F)=>w.log(H,se,N,F)));return}Wn(w.sessionDir,k,g,re,(H,se,N,F)=>w.log(H,se,N,F),C)}:void 0;if(!process.stdin.isTTY&&!n.agent&&(n.agent=!0),n.agent){let g=R=>{process.stdout.write(JSON.stringify(R)+`
|
|
86
|
+
`)};X?.setRunActive(!0);let k;try{k=await Ur(Jt,{environment:_,mode:l,assertionMode:c,log:(R,D,ae,ve)=>w.log(R,D,ae,ve)},{onStepEnd:zt,onStepLog:(R,D,ae)=>w.logStep(R,D,ae),onReasoning:R=>X?.setStepText(R),onStepComplete:()=>X?.setStepComplete()})}finally{X?.setRunActive(!1)}let{lastRunEnd:C,stepsTotal:O,hadError:H,bifurcationFlows:se}=k;if(Gt(M,k.evidence,C),H&&w.escalateRun(0),C){let R=pt(C,0,se);w.addRunResult(ft(C,V.auteurObjective,0,R),C.total_runs);let D=C.status==="passed"?"passed":H?"error":"failed";w.addFlow({runIndex:0,objective:V.auteurObjective,status:D,summary:C.summary??"",duration:C.duration??0,steps:O,stepsPassed:D==="passed"?O:0,stepsFailed:D==="passed"?0:O,reason:C.reason,creditsConsumed:C.credits_consumed})}M&&await it(),ht("chrome","Agent run completed");let N;if(w.log("info","DIRECT_UPLOAD_START","Starting direct upload (agent mode)",{agent_mode:!0,last_run_end:!!C,local:!!n.local}),C&&!n.local)try{let R=G(_),D=$.project_id;if(v.basicAuth){let{UploadPipeline:ae}=await import("./pipeline-CADTHPDV.js");re&&(await st.settle(),await re.drain());let ve=bt({session:w,env:_,auth:v,variables:V,variableIds:Kt,projectId:D,folderId:$.folder_id,totalSteps:O,totalDuration:C.duration??0,screenshotExtMap:re?.getExtMap(),codeExport:_t({codeExport:n.codeExport,codeLanguage:n.codeLanguage,skipCodeValidation:n.skipCodeValidation},a.code_export),onProgress:()=>{},log:(Ie,To,Ro,Oo)=>w.log(Ie,To,Ro,Oo),shouldUploadArtifacts:!n.local,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0,evidence:M?{executionId:M.executionId,packTestDir:M.packTestDir,sealedPackPath:M.packDir,sealFn:qe}:void 0}),ue=await new ae(ve).execute();ue.success&&(ue.testcaseId&&w.setTestcaseId(ue.testcaseId),ue.testcaseId&&ue.shareId&&D&&(N=ze(R.testManagerUiUrl,D,ue.testcaseId,ue.shareId)));try{let{persistRecordedSession:Ie}=await import("./persist-recorded-session-XKPZX7HW.js");await Ie(w,{testcaseId:w.testcaseId??void 0,projectId:$.project_id??void 0,folderId:$.folder_id??void 0,codeExportDir:ue.codeExportDir,packTestDir:M?.packTestDir})}catch(Ie){w.log("error","DIRECT_PERSIST_ERROR","Persist failed in agent mode",{error:String(Ie)})}}}catch(R){w.log("error","DIRECT_UPLOAD_ERROR","Upload failed in agent mode",{error:R instanceof Error?R.message:String(R)})}let F=await qe({});if(M&&F?.sealed){let{offerEvidenceView:R}=await import("./evidence-O4AON5FU.js");await R({packPath:M.packDir,env:_,isTTY:!1,log:D=>process.stderr.write(D+`
|
|
87
|
+
`)})}if(C){let R={...C};N&&(R.test_url=N),g(R)}await w.finish("complete"),C||b(H?2:1,"Agent run ended with no result");let Z=C.reason??"";(Z.includes("Cancel")||Z.includes("Timeout"))&&b(3,`Agent run: ${Z}`),C.status==="passed"&&b(0,"Agent run passed"),b(1,"Agent run failed")}let B=null,xe=0,at=!1,Qt=null,Xt=0,Zt={current:null},xo=q?{authHeader:an(q.username,q.access_key),sessionId:w.sessionId,controllerBaseUrl:G(_).controllerBaseUrl}:null,{waitUntilExit:Io}=Te(Nt.default.createElement(Re,null,Nt.default.createElement(Lr,{config:Jt,describeContext:xo,spawnOpts:{environment:_,mode:l,assertionMode:c,log:(g,k,C,O)=>w.log(g,k,C,O)},cancelRef:Zt,banner:{model:n.model??a.model,auth:m,status:u},onComplete:g=>{B=g.lastRunEnd,xe=g.stepsTotal,at=g.hadError,Qt=g.bifurcationFlows,Xt=g.describeCredits,Gt(M,g.evidence,g.lastRunEnd)},onStepEnd:zt,onReasoning:g=>X?.setStepText(g),onStepComplete:()=>X?.setStepComplete()})),{stdout:process.stderr,exitOnCtrlC:!1}),lt;if(n.timeout){let g=parseInt(n.timeout,10)*1e3;lt=setTimeout(()=>{console.error(`
|
|
88
|
+
Timeout: ${n.timeout}s exceeded \u2014 cancelling...`),Zt.current?.()},g)}X?.setRunActive(!0);try{await Io()}finally{X?.setRunActive(!1)}if(lt&&clearTimeout(lt),B){let g=pt(B,0,Qt);w.addRunResult(ft(B,V.auteurObjective,0,g),B.total_runs);let k=B.status==="passed"?"passed":at?"error":"failed";w.addFlow({runIndex:0,objective:V.auteurObjective,status:k,summary:B.summary??"",duration:B.duration??0,steps:xe,stepsPassed:k==="passed"?xe:0,stepsFailed:k==="passed"?0:xe,reason:B.reason,creditsConsumed:(B.credits_consumed??0)+Xt})}M&&await it(),ht("chrome","Ink run completed");{let g=l==="testing",k=w.nextRunIndex()>0;if(g&&!n.name&&k&&process.stdin.isTTY)try{let{renderSavePrompt:C,defaultSessionTimestamp:O}=await import("./SaveSessionPrompt-W2GWELOP.js"),H=await C(O());H&&w.setSessionName(H)}catch(C){w.log("warn","DIRECT_SAVE_PROMPT_FAILED","Save prompt failed",{error:String(C)})}}if(w.log("info","DIRECT_UPLOAD_START","Starting direct upload (ink mode)",{ink_mode:!0,last_event:!!B,local:!!n.local}),B&&!n.local)try{let g=G(_),k=$.project_id;if(v.basicAuth){let{UploadPipeline:C}=await import("./pipeline-CADTHPDV.js");re&&(w.log("info","SCREENSHOT_UPLOAD_DRAIN","Draining screenshot upload queue before pipeline"),await st.settle(),await re.drain(),w.log("info","SCREENSHOT_UPLOAD_DRAINED","Screenshot upload queue drained"));let O=bt({session:w,env:_,auth:v,variables:V,variableIds:Kt,projectId:$.project_id,folderId:$.folder_id,totalSteps:xe,totalDuration:B.duration??0,screenshotExtMap:re?.getExtMap(),codeExport:_t({codeExport:n.codeExport,codeLanguage:n.codeLanguage,skipCodeValidation:n.skipCodeValidation},a.code_export),onProgress:()=>{},log:(F,Z,R,D)=>w.log(F,Z,R,D),shouldUploadArtifacts:!n.local,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0,evidence:M?{executionId:M.executionId,packTestDir:M.packTestDir,sealedPackPath:M.packDir,sealFn:qe}:void 0}),H=new C(O),{renderUploadProgress:se}=await import("./CliUploadProgress-DMH3C3UZ.js"),N=await se(H,F=>{if(F.testcaseId&&F.shareId&&k)return ze(g.testManagerUiUrl,k,F.testcaseId,F.shareId)});if(N.success){N.testcaseId&&w.setTestcaseId(N.testcaseId);let F=null;try{let{persistRecordedSession:D}=await import("./persist-recorded-session-XKPZX7HW.js");F=await D(w,{testcaseId:w.testcaseId??void 0,projectId:$.project_id??void 0,folderId:$.folder_id??void 0,codeExportDir:N.codeExportDir,packTestDir:M?.packTestDir})}catch(D){w.log("error","DIRECT_PERSIST_ERROR","Persist failed in ink mode",{error:String(D)})}let Z=N.testcaseId&&N.shareId&&k?ze(g.testManagerUiUrl,k,N.testcaseId,N.shareId):void 0,R=N.testcaseId&&k?rr(g.testManagerUiUrl,k,N.testcaseId):void 0;if(Z||R||N.codeExportDir||F){let{LinksBox:D}=await import("./LinksBox-O5ZFYSK2.js"),{render:ae}=await import("./build-JIKYOZUH.js"),ve=await import("./react-QWOAB3TB.js"),{waitUntilExit:en}=ae(ve.default.createElement(D,{recordedTestPath:F?.recordedTestPath,outputDir:F?.outputDir,shareableLink:Z,testCaseLink:R,codeExportDir:N.codeExportDir}),{stdout:process.stderr});await en()}}if(w.testId){let{renderFeedbackPrompt:F}=await import("./CliFeedbackPrompt-URXCHBZ5.js"),Z=await F();if(Z)try{await wr({tmsBaseUrl:g.tmsBaseUrl,username:v.basicAuth.username,accessKey:v.basicAuth.access_key,testId:w.testId,feedbackType:Z,log:(R,D,ae,ve)=>w.log(R,D,ae,ve)})}catch(R){w.log("warn","FEEDBACK_FAILED","Feedback submission failed",{error:String(R)})}}}}catch(g){w.log("error","DIRECT_UPLOAD_FAILED","Direct upload failed (ink mode)",{error:g instanceof Error?g.stack??g.message:String(g)}),console.error(`Upload failed: ${g}`)}let Ao=await qe({});if(M&&Ao?.sealed){let{offerEvidenceView:g}=await import("./evidence-O4AON5FU.js"),k=B?.reason??"",C=k.includes("Cancel")||k.includes("Timeout");await g({packPath:M.packDir,env:_,isTTY:!!process.stdin.isTTY&&!!process.stderr.isTTY&&!C,log:O=>process.stderr.write(O+`
|
|
89
|
+
`)})}await w.finish("complete"),B||b(at?2:1,"Run ended with no result");let ct=B.reason??"";(ct.includes("Cancel")||ct.includes("Timeout"))&&b(3,`Run: ${ct}`),B.status==="passed"&&b(0,"Run passed"),b(1,"Run failed")}catch(o){b(2,`CLI error: ${o instanceof Error?o.message:String(o)}`)}}),Vr(e),e.addCommand(ao()),_r(e),e.command("install <target> [version]").description("Install kane-cli agent skill into Claude Code / Codex CLI / Gemini CLI (version defaults to latest compatible)").action(async(r,n)=>{if(r!=="skill"){console.error(`error: unknown install target '${r}'. Supported: skill`),b(2,`unknown install target '${r}'`);return}let{installSkill:o,formatInstallResult:s}=await import("./skill-installer-M6AREQQW.js"),a=await o(n);!process.stdin.isTTY?process.stdout.write(JSON.stringify({type:"skill_install_result",status:a.status,version:a.version,installed_targets:a.installedTargets,error:a.error})+`
|
|
54
90
|
`):process.stderr.write(s(a)+`
|
|
55
|
-
`),
|
|
56
|
-
`),
|
|
57
|
-
`),
|
|
58
|
-
`)}var
|
|
91
|
+
`),b(a.status==="failed"?1:0,`install skill: ${a.status}`)}),e.command("profiles [action] [name]").option("--env <name>","Environment for switch/delete").action(async(r,n,o)=>{let s=new ee;if(r==="list"||!r&&!process.stdin.isTTY){let d=s.listProfiles();if(d.length===0){console.log("No profiles configured. Run: kane-cli login");return}let f=s.getActiveProfile(),p=s.getDefaultEnv();for(let m of d){let u=m.profile===f&&m.env===p?" (active)":"";console.log(`${m.profile} [${m.env}]${u}`)}return}if(r==="switch"&&n){let d=o?.env??s.getDefaultEnv();s.setActiveProfile(n),s.setDefaultEnv(d),Ge(s,new ie,n,d),console.log(`Switched to ${n} [${d}]`);return}if(r==="delete"&&n){let d=o?.env??s.getDefaultEnv();s.deleteProfileFull(n,d),console.log(`Deleted profile ${n} [${d}]`);return}process.stdin.isTTY||(console.error("Usage: kane-cli profiles list|switch|delete <name> [--env <env>]"),b(1,"Invalid profiles usage"));let{ProfilesView:a}=await import("./ProfilesView-SPECXHZE.js"),{render:l}=await import("./build-JIKYOZUH.js"),c=await import("./react-QWOAB3TB.js");await new Promise(d=>{let{unmount:f}=l(c.default.createElement(a,{creds:s,onSwitch:(p,m)=>{s.setActiveProfile(p),s.setDefaultEnv(m),console.log(`Switched to ${p} [${m}]`)},onCancel:()=>{f(),d()}}))})}),e.command("feedback").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 r=>{r.feedbackType!=="positive"&&r.feedbackType!=="negative"&&(console.error('Error: --feedback-type must be "positive" or "negative"'),b(1,'Invalid --feedback-type (must be "positive" or "negative")')),r.details&&r.details.length>500&&(console.error("Error: --details must be 500 characters or fewer"),b(1,"--details exceeds 500 character limit"));let n=new ee,o=r.env??n.getDefaultEnv(),s=G(o),a,l;try{let c=await he({creds:n,env:o,usernameFlag:r.username,accessKeyFlag:r.accessKey,log:()=>{}});a=c.resolvedCreds?.username??c.basicAuth?.username,l=c.resolvedCreds?.access_key??c.basicAuth?.access_key}catch{console.error("Not authenticated. Run: kane-cli login"),b(2,"Not authenticated for feedback")}(!a||!l)&&(console.error(JSON.stringify({error:"Could not resolve TMS credentials"})),b(1,"Could not resolve TMS credentials for feedback"));try{let{TmsClient:c}=await import("./tms-client-VD3B3SMU.js"),f=await new c(s.tmsBaseUrl,a,l).submitFeedback({instruction_id:"",test_id:r.testId,feedback_type:r.feedbackType,details:r.details,mode:"agent"});console.log(JSON.stringify(f)),b(0,"Feedback submitted")}catch(c){console.error(JSON.stringify({error:c instanceof Error?c.message:String(c)})),b(1,`Feedback failed: ${c instanceof Error?c.message:String(c)}`)}}),e.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 r=>{let n=new ee,o=r.env??n.getDefaultEnv(),s=G(o),a=null;try{let l=await he({creds:n,env:o,usernameFlag:r.username,accessKeyFlag:r.accessKey,log:()=>{}}),c=l.resolvedCreds??(l.basicAuth?{username:l.basicAuth.username,access_key:l.basicAuth.access_key}:null);c&&(a={username:c.username,accessKey:c.access_key})}catch{console.error(`Not authenticated [${o}]. Run "kane-cli login" first.`),b(2,`Not authenticated for balance [${o}]`)}a||(console.error(`Could not resolve credentials [${o}]. Run "kane-cli login" again.`),b(2,`Could not resolve credentials for balance [${o}]`));try{let{ControllerClient:l}=await import("./controller-client-RD2YEMAH.js"),d=await new l(s.controllerBaseUrl,a).getCreditBalance();console.log(`Available credits: ${d.available_credits}`),console.log(`Total credits: ${d.total_credits}`),b(0,"Balance retrieved")}catch(l){console.error(`Error: ${l instanceof Error?l.message:String(l)}`),b(1,`Balance check failed: ${l instanceof Error?l.message:String(l)}`)}}),e.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(r,n)=>{let o=n.scenarioLimit?parseInt(n.scenarioLimit,10):void 0,s=n.perScenarioLimit?parseInt(n.perScenarioLimit,10):void 0,{decideGenerateMode:a,resolveGenerateOp:l,defaultOutDir:c,buildHeadlessDeps:d,runGenerateHeadless:f,parseFilesFlag:p}=await import("./generate-headless-WG6ZPINI.js"),m=l({objective:r,refine:n.refine,save:n.save,req:n.req,out:n.out});if("error"in m){process.stderr.write(`error: ${m.error}
|
|
92
|
+
`),b(2,`generate: ${m.error}`);return}let u=m.op,_=p(n.files);if(u==="save"&&_){process.stderr.write(`error: --files is not valid with --save
|
|
93
|
+
`),b(2,"generate: --files not valid with --save");return}let{headless:E,mode:x}=a(n,!!process.stdin.isTTY);if(!E){let{runGenerate:S}=await import("./tcg-generate-VKFXR5JT.js");await S({objective:r,scenarioLimit:o,perScenarioLimit:s});return}let I=await d({mode:x,env:n.env,projectId:n.project,folderId:n.folder,username:n.username,accessKey:n.accessKey,name:n.name}),v=await f({op:u,objective:r,reqId:n.req,outDir:u==="save"?n.out?Di(process.cwd(),n.out):c():void 0,suiteName:n.name,scenarioLimit:o,perScenarioLimit:s,memory:n.memory,files:_},I);b(v,"generate complete")}),e.command("help").action(()=>{e.help()}),e.command("changelog").description("Show recent release notes").option("--all","Show all releases instead of latest 5").action(async r=>{let{fetchChangelog:n,formatChangelog:o}=await import("./changelog-RCKUVBFL.js"),s=await n({all:r.all});console.log(o(s))}),e.addCommand(Mi()),e.parse(["node","kane-cli",...i])}function Mi(){let i=new Me("evidence").description("Evidence pack operations");return i.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:r}=await import("./evidence-O4AON5FU.js");process.exitCode=await r(e,{profile:t.profile,json:t.json})}),i.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:r}=await import("./evidence-O4AON5FU.js"),{CredentialsManager:n}=await import("./credentials-52QRPGET.js"),o=t.env??new n().getDefaultEnv()??"prod";process.exitCode=await r(e,{port:t.port,viewerUrl:t.viewerUrl,env:o})}),i.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:r}=await import("./evidence-O4AON5FU.js"),{CredentialsManager:n}=await import("./credentials-52QRPGET.js"),o=t.env??new n().getDefaultEnv()??"prod";process.exitCode=await r(e,{runId:t.runId,out:t.out,rules:t.rules,onCollision:t.onCollision,title:t.title,finalize:t.finalize,json:t.json,env:o})}),i}function lo(i){let e,t,r,n=[];for(let o=0;o<i.length;o++){let s=i[o];if(s==="--code-export")e=!0;else if(s==="--skip-code-validation")r=!0;else if(s==="--no-skip-code-validation")r=!1;else if(s==="--code-language"){let a=i[o+1];a!==void 0&&(t=a,o++)}else s.startsWith("--code-language=")?t=s.slice(16):n.push(s)}return{codeExport:e,codeLanguage:t,skipCodeValidation:r,filteredArgs:n}}function co(i){return i[0]==="run"?!0:(i[0]==="testmd"||i[0]==="testrun")&&i[1]==="run"}function tt(i,e){let t=i.split(".").map(n=>Number(n)||0),r=e.split(".").map(n=>Number(n)||0);for(let n=0;n<3;n++){let o=t[n]??0,s=r[n]??0;if(o<s)return-1;if(o>s)return 1}return 0}var ji=[{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:i=>{let e=[];return i.code_export.enabled===!1&&e.push({field:"code_export.enabled",from:!1,to:!0,description:"Code export is now enabled by default."}),i.mode==="action"&&e.push({field:"mode",from:"action",to:"testing",description:"Default run mode is now 'testing'."}),{cfg:{...i,code_export:{...i.code_export,enabled:!0},mode:"testing"},changes:e}}}];function uo(i,e=_e,t=ji){let r=i.exists(),n=i.load();if(!r)return i.set("last_seen_version",e),{changes:[],fromVersion:e,toVersion:e,appliedVersions:[]};let o=n.last_seen_version||"0.0.0";if(tt(o,e)>=0)return{changes:[],fromVersion:o,toVersion:o,appliedVersions:[]};let s=t.filter(f=>tt(o,f.version)<0&&tt(f.version,e)<=0).sort((f,p)=>tt(f.version,p.version)),a=n,l=[],c=[];for(let f of s){let{cfg:p,changes:m}=f.apply(a);a=p,l.push(...m),c.push(f.version)}let d={...a,last_seen_version:e};return i.writeRaw(d),{changes:l,fromVersion:o,toVersion:e,appliedVersions:c}}function mo(i){return i.changes.length===0?"":[`kane-cli updated to ${i.toVersion}. Default settings changed:`,...i.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(`
|
|
94
|
+
`)}var Ft=new Set(["balance","changelog","config","evidence","feedback","folders","generate","help","install","login","logout","profiles","projects","run","sessions","setup","testmd","testrun","update","whoami"]);function Ni(i,e){if(i===e)return 0;if(i.length===0)return e.length;if(e.length===0)return i.length;let t=new Array(e.length+1),r=new Array(e.length+1);for(let n=0;n<=e.length;n++)t[n]=n;for(let n=1;n<=i.length;n++){r[0]=n;for(let o=1;o<=e.length;o++){let s=i[n-1]===e[o-1]?0:1;r[o]=Math.min(t[o]+1,r[o-1]+1,t[o-1]+s)}[t,r]=[r,t]}return t[e.length]}function po(i,e){let t=i.toLowerCase(),r=[...e],n=[];for(let o of r){let s=o.toLowerCase();s!==t&&s.startsWith(t)&&n.push({name:o,distance:0})}if(n.length===0)for(let o of r){let s=o.toLowerCase();if(s===t)continue;let a=Ni(t,s);a<=2&&n.push({name:o,distance:a})}return n.sort((o,s)=>o.distance-s.distance||o.name.localeCompare(s.name)),n.slice(0,3).map(o=>o.name)}function fo(i,e){let t=e.length>0?` \u2014 did you mean ${e.map(r=>`'${r}'`).join(" or ")}?`:"";return`error: unknown command '${i}'${t}
|
|
59
95
|
|
|
60
96
|
Run an objective with: kane-cli run "<objective>"
|
|
61
97
|
List all commands: kane-cli --help
|
|
62
|
-
`}
|
|
63
|
-
Update available: ${
|
|
98
|
+
`}fn();Cr();yr();var vo=Qe().catch(()=>null),Fi=Xe().catch(()=>null);Hn(void 0,mn);var nt=null,bo=()=>nt||(nt=uo(new ie),nt),rt=U.argv.slice(2),Li=rt.includes("--dev"),Lt=rt.includes("--local"),Ui=rt.includes("--tui");Li&&(U.env.KANE_DEV_MODE="1");var Vi=rt.filter(i=>!["--dev","--local","--tui"].includes(i));function Hi(i){let e=[],t;for(let r=0;r<i.length;r++){let n=i[r];if(n==="--name"&&r+1<i.length){t=i[r+1],r++;continue}if(n.startsWith("--name=")){t=n.slice(7);continue}e.push(n)}return{name:t,rest:e}}var ot=lo(Vi),de=ot.filteredArgs,ho=ot.codeExport,Ut=ot.codeLanguage,Vt=ot.skipCodeValidation,go=()=>{vo.then(i=>{i&&U.stderr.write(`
|
|
99
|
+
Update available: ${i.current} \u2192 ${i.latest} \u2014 run \`${vr()}\` to update
|
|
64
100
|
|
|
65
|
-
`)}),
|
|
101
|
+
`)}),Fi.then(i=>{if(!i)return;let e=i.current??"not installed";U.stderr.write(`Skill update available: ${e} \u2192 ${i.latestCompatible} \u2014 run \`kane-cli install skill\`
|
|
66
102
|
|
|
67
|
-
`)})},
|
|
68
|
-
${
|
|
103
|
+
`)})},wo=()=>{let i=mo(bo());i&&U.stderr.write(`
|
|
104
|
+
${i}
|
|
69
105
|
|
|
70
|
-
`)},
|
|
71
|
-
`),
|
|
72
|
-
`),
|
|
106
|
+
`)},Bi=new Set(["--help","-h","--version","-V"]),qi=de[0]==="help"||de.some(i=>Bi.has(i));if(qi)Le(de);else if(Ui){U.stdin.isTTY||(U.stderr.write(`Error: --tui mode requires an interactive terminal (TTY).
|
|
107
|
+
`),U.exit(1)),go();let{name:i}=Hi(de);if(i){let{validateNameOrThrow:r}=await import("./name-validator-5YGJXLZ7.js");try{r(i)}catch(n){U.stderr.write(`error: ${n.message}
|
|
108
|
+
`),U.exit(2)}}let{waitUntilExit:e,unmount:t}=Te(Ue.default.createElement(Re,null,Ue.default.createElement(br,{localMode:Lt,codeExport:ho,codeLanguage:Ut,skipCodeValidation:Vt,updatePromise:vo,migrationResult:bo(),sessionName:i})),{exitOnCtrlC:!1});Oe(()=>t()),gt(()=>{try{U.stdin.setRawMode?.(!1)}catch{}U.stdout.write("\x1B[?25h")}),e().then(()=>{b(0,"TUI session ended")})}else if(de.length>0){let i=de[0],e=Ft.has(i),t=i.startsWith("-");!e&&!t&&(U.stderr.write(fo(i,po(i,Ft))),U.exit(2)),go(),wo();let n=Lt&&co(de)?[...de,"--local"]:de;Le(n)}else{U.stdin.isTTY||(U.stderr.write(`Error: kane-cli requires an interactive terminal (TTY) when run without arguments.
|
|
73
109
|
Usage: kane-cli "objective" for non-interactive mode.
|
|
74
|
-
`),
|
|
110
|
+
`),U.exit(1));let i={current:null},{waitUntilExit:e,unmount:t}=Te(Ue.default.createElement(Re,null,Ue.default.createElement(Qn,{resultRef:i})),{exitOnCtrlC:!1});Oe(()=>t()),gt(()=>{try{U.stdin.setRawMode?.(!1)}catch{}U.stdout.write("\x1B[?25h")}),e().then(()=>{let r=i.current;if(!r){b(0,"Single-shot session ended (no objective)");return}let n=r.objective.trim();if(n==="--help"||n==="-h"||n==="help"){Le(["--help"]);return}wo();let o=["run",r.objective];Lt&&o.push("--local"),ho&&o.push("--code-export"),Ut&&o.push("--code-language",Ut),Vt===!0&&o.push("--skip-code-validation"),Vt===!1&&o.push("--no-skip-code-validation"),Le(o)})}
|