@testmuai/kane-cli 0.6.2 → 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ChatSurface-J777M5WC.js +8 -0
- package/dist/{ChromeProfilePicker-XXNZLSCC.js → ChromeProfilePicker-UUGUMJPI.js} +1 -1
- package/dist/{CliFeedbackPrompt-FJF5INQO.js → CliFeedbackPrompt-JZWESL7Z.js} +1 -1
- package/dist/{CliUploadProgress-5E3CCYPZ.js → CliUploadProgress-62U3LAUU.js} +1 -1
- package/dist/{ConfigView-TGVOKOUZ.js → ConfigView-WHEFCVHR.js} +1 -1
- package/dist/{EvidenceViewOffer-7O3RNBEE.js → EvidenceViewOffer-JQDEAE2T.js} +1 -1
- package/dist/{FolderPicker-T4JB4NNW.js → FolderPicker-HJUUHQEI.js} +1 -1
- package/dist/{HelpView-PSHKI7DD.js → HelpView-EWHP7LSJ.js} +1 -1
- package/dist/{InfoBox-PXWJ6BIX.js → InfoBox-GQQJVTI5.js} +1 -1
- package/dist/{LinksBox-IUOYRXYO.js → LinksBox-EWCPAZFN.js} +1 -1
- package/dist/{ProfilesView-UK5XX5WP.js → ProfilesView-5FJNQMUW.js} +1 -1
- package/dist/{ProjectPicker-3FE7UFXL.js → ProjectPicker-IN7GFN7I.js} +1 -1
- package/dist/{SaveSessionPrompt-P7NF5FDA.js → SaveSessionPrompt-ISODGFP7.js} +1 -1
- package/dist/SingleShotApp-QANGFAPO.js +2 -0
- package/dist/{SummaryBox-WVR4U3NN.js → SummaryBox-R6WHU7VD.js} +1 -1
- package/dist/TestMdRunView-74A3LCNE.js +2 -0
- package/dist/{WhoamiView-QVXJAVTC.js → WhoamiView-YRQNOSOH.js} +1 -1
- package/dist/{bind-SRZYTS4Q.js → bind-FZ4X4SOK.js} +2 -2
- package/dist/{bridge-I6N3YPXI.js → bridge-7UMWMIJJ.js} +1 -1
- package/dist/{changelog-HPSX3L7T.js → changelog-YQC2QDCO.js} +1 -1
- package/dist/chat-controller-QXFAB2DK.js +3 -0
- package/dist/{chunk-HUD7SPUF.js → chunk-2S4S2XJC.js} +1 -1
- package/dist/{chunk-DEYHK6ZC.js → chunk-2TVRHXRK.js} +1 -1
- package/dist/{chunk-6XKJH5ZE.js → chunk-326XAPMW.js} +2 -2
- package/dist/{chunk-TJRBV2V2.js → chunk-53VDR5DN.js} +3 -3
- package/dist/{chunk-X4QL2DAD.js → chunk-6RQAUK5F.js} +1 -1
- package/dist/{chunk-5ON7QQZO.js → chunk-7LFCSSPX.js} +10 -10
- package/dist/{chunk-2U5DZUC7.js → chunk-7MV5UF6O.js} +1 -1
- package/dist/{chunk-VL2UA23Z.js → chunk-7YQW4TFI.js} +1 -1
- package/dist/{chunk-KGFISJFM.js → chunk-ARS72637.js} +1 -1
- package/dist/{chunk-KRFGAVYU.js → chunk-AV5SUGRY.js} +1 -1
- package/dist/{chunk-K2MKBBI4.js → chunk-B5LJCGAY.js} +1 -1
- package/dist/{chunk-Z4K4AYEI.js → chunk-BFFCGEUH.js} +1 -1
- package/dist/{chunk-FU3OQXFH.js → chunk-BGGNBWAJ.js} +1 -1
- package/dist/{chunk-4PIMEZJW.js → chunk-BO3JA2GS.js} +3 -3
- package/dist/{chunk-D5DEWIAU.js → chunk-C5POEXSX.js} +2 -2
- package/dist/{chunk-HR7AGYV2.js → chunk-CIW2KP4C.js} +1 -1
- package/dist/{chunk-XN7PPLFS.js → chunk-DEEBPSJN.js} +1 -1
- package/dist/{chunk-QIE62H3J.js → chunk-E4OYR32M.js} +1 -1
- package/dist/{chunk-Q6TVDG3X.js → chunk-EEO4XWY6.js} +1 -1
- package/dist/{chunk-PJSCM6JX.js → chunk-EWFFJBAM.js} +1 -1
- package/dist/{chunk-S6GRW5ZA.js → chunk-F2K3XFFH.js} +2 -2
- package/dist/{chunk-M6DX4ENH.js → chunk-F66SSA4C.js} +1 -1
- package/dist/{chunk-44QUA6GV.js → chunk-FFL2TQEJ.js} +1 -1
- package/dist/{chunk-FOZVXYVG.js → chunk-G6AF2JUA.js} +1 -1
- package/dist/{chunk-GN3SZXZ5.js → chunk-ME5QSYWX.js} +1 -1
- package/dist/{chunk-52VLJKIN.js → chunk-NFGG5DA2.js} +1 -1
- package/dist/{chunk-YSK535OI.js → chunk-OE7TVGNB.js} +2 -2
- package/dist/{chunk-6UNTIXFW.js → chunk-OGVIHL5G.js} +1 -1
- package/dist/{chunk-35SRW4KA.js → chunk-P46TIMGQ.js} +1 -1
- package/dist/{chunk-N62EM6JX.js → chunk-PJDOXRLB.js} +1 -1
- package/dist/{chunk-IDDVO4UV.js → chunk-Q4HLQOJI.js} +1 -1
- package/dist/chunk-RE3BZVGE.js +3 -0
- package/dist/{chunk-YIOWO6WS.js → chunk-RLG5NUTE.js} +1 -1
- package/dist/{chunk-ZGH7T32S.js → chunk-RZFINU7J.js} +1 -1
- package/dist/{chunk-WM5QHLAP.js → chunk-SGU72YLH.js} +4 -4
- package/dist/{chunk-OZM4UU5F.js → chunk-SHSV64GX.js} +1 -1
- package/dist/{chunk-4G4HPMR2.js → chunk-SL7AJ7JQ.js} +1 -1
- package/dist/{chunk-LZKUF23A.js → chunk-SQFNMZJ2.js} +1 -1
- package/dist/{chunk-B2CIHKXG.js → chunk-TTSYHJLX.js} +1 -1
- package/dist/chunk-TY5LWU6I.js +14 -0
- package/dist/{chunk-L4AUCQVO.js → chunk-TZZYRDCF.js} +1 -1
- package/dist/{chunk-DCYTRYR2.js → chunk-UXJPCWGW.js} +1 -1
- package/dist/{chunk-MHQ6A2QZ.js → chunk-VXGOWBET.js} +1 -1
- package/dist/{chunk-BKGJGPDN.js → chunk-WFRL54GK.js} +1 -1
- package/dist/{chunk-EK2B2LZK.js → chunk-XBE7PGVY.js} +1 -1
- package/dist/{chunk-OZODSY6H.js → chunk-Y6LMHBLE.js} +1 -1
- package/dist/{chunk-LV5VRSPI.js → chunk-Y7KW5AEN.js} +1 -1
- package/dist/{chunk-U3JB76QP.js → chunk-YZKPZXHY.js} +1 -1
- package/dist/{chunk-NEZ4G7XR.js → chunk-YZSYXNMB.js} +1 -1
- package/dist/{config-KD62VH3R.js → config-5OOP2BO3.js} +1 -1
- package/dist/{credentials-NQNJR4E4.js → credentials-XCP6DJZZ.js} +1 -1
- package/dist/{evidence-FFOI2H3N.js → evidence-AX67Q6RN.js} +1 -1
- package/dist/{evolve-cmd-PHQ6FHRI.js → evolve-cmd-HR25DRTC.js} +1 -1
- package/dist/{extract-bind-6UMILP4U.js → extract-bind-ZDAXRQUS.js} +2 -2
- package/dist/{extract-cmd-MZR7PHGA.js → extract-cmd-5GGI6LAM.js} +1 -1
- package/dist/{generate-headless-XOBQS6RU.js → generate-headless-DRDE46ON.js} +2 -2
- package/dist/index.js +12 -12
- package/dist/{interactive-bind-5FWW3S53.js → interactive-bind-T6OBLZCT.js} +2 -2
- package/dist/{list-commands-PDTISP6T.js → list-commands-UDAL3SBY.js} +1 -1
- package/dist/login-flow-LJ4BH3OS.js +2 -0
- package/dist/{persist-recorded-session-5UNUINWF.js → persist-recorded-session-BW3YSFMP.js} +1 -1
- package/dist/{pipeline-F4WTOZ3Y.js → pipeline-TZJ652NT.js} +1 -1
- package/dist/{reconcile-cmd-MNMWAZF3.js → reconcile-cmd-242S7XNO.js} +2 -2
- package/dist/{recording-banner-IWY3GS6N.js → recording-banner-6FVTCUWQ.js} +1 -1
- package/dist/{require-project-folder-PFIDA5ZH.js → require-project-folder-AQUVEEJB.js} +1 -1
- package/dist/run-UGAOGR3B.js +2 -0
- package/dist/{run-test-md-7GONSVAM.js → run-test-md-AUK7NGLL.js} +2 -2
- package/dist/{skill-installer-YZP5DWWZ.js → skill-installer-2MNPCPRD.js} +1 -1
- package/dist/{spawner-YDYCSTZD.js → spawner-XCOMTJJC.js} +1 -1
- package/dist/tcg-generate-E5X23RVP.js +2 -0
- package/dist/{testmd-actions-7RNW76DN.js → testmd-actions-TU4KTO32.js} +1 -1
- package/dist/token-refresh-GGLARJV4.js +2 -0
- package/dist/{validate-basic-IQY5CRLP.js → validate-basic-IYMPP7C7.js} +1 -1
- package/dist/{version-check-U5UBPVX4.js → version-check-MUPSKONS.js} +1 -1
- package/package.json +6 -6
- package/dist/ChatSurface-HGP5EHZM.js +0 -9
- package/dist/SingleShotApp-UIDA54GB.js +0 -2
- package/dist/TestMdRunView-OH4Y6YD6.js +0 -2
- package/dist/chat-controller-VKGECDTU.js +0 -3
- package/dist/chunk-DM2GL24Z.js +0 -3
- package/dist/chunk-HW7Z5S2M.js +0 -14
- package/dist/login-flow-IXPJHTL2.js +0 -2
- package/dist/run-V2WMNHFK.js +0 -2
- package/dist/tcg-generate-ZRKSX2KC.js +0 -2
- package/dist/token-refresh-DH2L2IPP.js +0 -2
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
3
|
-
import{c as Qe}from"./chunk-
|
|
3
|
+
import{c as Qe}from"./chunk-G6AF2JUA.js";import{a as yn,b as Co,c as xo,d as Eo}from"./chunk-53VDR5DN.js";import"./chunk-3MSXQU2C.js";import"./chunk-SQFNMZJ2.js";import"./chunk-DEEBPSJN.js";import{i as Ao}from"./chunk-326XAPMW.js";import"./chunk-ARS72637.js";import{a as ao}from"./chunk-OGVIHL5G.js";import{A as bo,C as yo,D as _o,E as ko,a as mt,b as pt,c as kn,d as Cn,e as xn,f as En,g as Jn,h as zn,i as Qn,j as Xn,k as Zn,l as eo,m as Je,n as lo,o as co,p as uo,q as mo,r as po,s as fo,t as ho,u as wt,v as vt,w as bt,x as go,y as wo,z as vo}from"./chunk-BO3JA2GS.js";import"./chunk-GIGD4M7V.js";import{a as to,b as no}from"./chunk-F2K3XFFH.js";import{b as ro}from"./chunk-C5POEXSX.js";import{a as De,b as ge}from"./chunk-Y6LMHBLE.js";import"./chunk-2YQ6TW77.js";import"./chunk-EEO4XWY6.js";import"./chunk-LMJTY32X.js";import{b as Ke,s as io}from"./chunk-RKWJG3WW.js";import{a as So,d as ze}from"./chunk-TTSYHJLX.js";import{a as oo}from"./chunk-RZFINU7J.js";import"./chunk-7YQW4TFI.js";import"./chunk-Y7KW5AEN.js";import{c as We}from"./chunk-7MV5UF6O.js";import{a as rn,b as sn,c as an,d as gt,e as Ye,f as so}from"./chunk-UXJPCWGW.js";import{a as An,b as In,c as Tn}from"./chunk-FFL2TQEJ.js";import{b as Sn}from"./chunk-Q4HLQOJI.js";import{a as se}from"./chunk-XBE7PGVY.js";import"./chunk-PJDOXRLB.js";import"./chunk-F66SSA4C.js";import"./chunk-5Y2G4NC7.js";import"./chunk-ME5QSYWX.js";import"./chunk-NFGG5DA2.js";import"./chunk-C5UNZ6ZY.js";import"./chunk-S3DAAAE5.js";import"./chunk-P46TIMGQ.js";import{a as bn}from"./chunk-2TVRHXRK.js";import"./chunk-SL7AJ7JQ.js";import"./chunk-FPFOW6BS.js";import{a as _n}from"./chunk-WAOCHXJ5.js";import"./chunk-B5LJCGAY.js";import"./chunk-RFHMDQXZ.js";import{A as Hn,G as Bn,H as qn,I as Gn,J as Yn,K as Kn,e as he,g as Rn,m as Dn,p as Mn,q as jn,r as Nn,s as Fn,t as Ln,y as Un,z as Vn}from"./chunk-OE7TVGNB.js";import{b as $e,c as $n}from"./chunk-FYOCF7DY.js";import"./chunk-RGEAEAZB.js";import{a as Wn}from"./chunk-BC7UVJJB.js";import"./chunk-KHDUQ33H.js";import{a as On,b as Pn}from"./chunk-NFOBDHZK.js";import{a as dn}from"./chunk-L5LI2JF4.js";import"./chunk-D5T4ARTB.js";import"./chunk-AE6SS34N.js";import"./chunk-GIRXJOJI.js";import"./chunk-B2PZAB7J.js";import"./chunk-IACKIGPX.js";import"./chunk-WFRL54GK.js";import"./chunk-VXGOWBET.js";import"./chunk-BGGNBWAJ.js";import"./chunk-YCCUBQY4.js";import"./chunk-YZKPZXHY.js";import{a as pn,b as fn,e as Se,f as hn,g as ft,h as b,i as Pe,j as ht,k as gn}from"./chunk-M5JQXOCE.js";import{a as mn,f as wn,h as vn}from"./chunk-CIW2KP4C.js";import{a as cn}from"./chunk-2WVKOZ6W.js";import{a as ln}from"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import{a as Y}from"./chunk-RLG5NUTE.js";import{a as Ge,b as ke,c as un}from"./chunk-VE3SUJMA.js";import"./chunk-E47GFYXA.js";import{a as Z}from"./chunk-TZZYRDCF.js";import"./chunk-EWFFJBAM.js";import"./chunk-SHSV64GX.js";import{a as Oe,b as on}from"./chunk-DFS4RMVP.js";import"./chunk-BFFCGEUH.js";import"./chunk-AV5SUGRY.js";import{a as _e,c as fe,j as ut,x as ie}from"./chunk-E4OYR32M.js";import{a as qe}from"./chunk-HCBYKLMW.js";import{a as ce,b as J,c as Re,i as dt,j as nn}from"./chunk-C44QQJR4.js";import{a as ct}from"./chunk-6YGTRKDT.js";import{a as Te,c as ye,e as pe}from"./chunk-UR6MHSHU.js";var Me=ye(_t=>{"use strict";var Xe=class extends Error{constructor(e,t,o){super(o),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=t,this.exitCode=e,this.nestedError=void 0}},yt=class extends Xe{constructor(e){super(1,"commander.invalidArgument",e),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}};_t.CommanderError=Xe;_t.InvalidArgumentError=yt});var Ze=ye(Ct=>{"use strict";var{InvalidArgumentError:Yr}=Me(),kt=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,o)=>{if(!this.argChoices.includes(t))throw new Yr(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._concatValue(t,o):t},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}};function Kr(i){let e=i.name()+(i.variadic===!0?"...":"");return i.required?"<"+e+">":"["+e+"]"}Ct.Argument=kt;Ct.humanReadableArgName=Kr});var St=ye(Oo=>{"use strict";var{humanReadableArgName:Jr}=Ze(),xt=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),o=e._getHelpCommand();return o&&!o._hidden&&t.push(o),this.sortSubcommands&&t.sort((n,r)=>n.name().localeCompare(r.name())),t}compareOptions(e,t){let o=n=>n.short?n.short.replace(/^-/,""):n.long.replace(/^--/,"");return o(e).localeCompare(o(t))}visibleOptions(e){let t=e.options.filter(n=>!n.hidden),o=e._getHelpOption();if(o&&!o.hidden){let n=o.short&&e._findOption(o.short),r=o.long&&e._findOption(o.long);!n&&!r?t.push(o):o.long&&!r?t.push(e.createOption(o.long,o.description)):o.short&&!n&&t.push(e.createOption(o.short,o.description))}return this.sortOptions&&t.sort(this.compareOptions),t}visibleGlobalOptions(e){if(!this.showGlobalOptions)return[];let t=[];for(let o=e.parent;o;o=o.parent){let n=o.options.filter(r=>!r.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(o=>Jr(o)).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((o,n)=>Math.max(o,t.subcommandTerm(n).length),0)}longestOptionTermLength(e,t){return t.visibleOptions(e).reduce((o,n)=>Math.max(o,t.optionTerm(n).length),0)}longestGlobalOptionTermLength(e,t){return t.visibleGlobalOptions(e).reduce((o,n)=>Math.max(o,t.optionTerm(n).length),0)}longestArgumentTermLength(e,t){return t.visibleArguments(e).reduce((o,n)=>Math.max(o,t.argumentTerm(n).length),0)}commandUsage(e){let t=e._name;e._aliases[0]&&(t=t+"|"+e._aliases[0]);let o="";for(let n=e.parent;n;n=n.parent)o=n.name()+" "+o;return o+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(o=>JSON.stringify(o)).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(o=>JSON.stringify(o)).join(", ")}`),e.defaultValue!==void 0&&t.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),t.length>0){let o=`(${t.join(", ")})`;return e.description?`${e.description} ${o}`:o}return e.description}formatHelp(e,t){let o=t.padWidth(e,t),n=t.helpWidth||80,r=2,s=2;function a(u,x){if(x){let _=`${u.padEnd(o+s)}${x}`;return t.wrap(_,n-r,o+s)}return u}function l(u){return u.join(`
|
|
4
4
|
`).replace(/^/gm," ".repeat(r))}let c=[`Usage: ${t.commandUsage(e)}`,""],d=t.commandDescription(e);d.length>0&&(c=c.concat([t.wrap(d,n,0),""]));let h=t.visibleArguments(e).map(u=>a(t.argumentTerm(u),t.argumentDescription(u)));h.length>0&&(c=c.concat(["Arguments:",l(h),""]));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(x=>a(t.optionTerm(x),t.optionDescription(x)));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
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,o,n=40){let r=" \\f\\t\\v\xA0\u1680\u2000-\u200A\u202F\u205F\u3000\uFEFF",s=new RegExp(`[\\n][${r}]+`);if(e.match(s))return e;let a=t-o;if(a<n)return e;let l=e.slice(0,o),c=e.slice(o).replace(`\r
|
|
6
6
|
`,`
|
|
@@ -23,8 +23,8 @@ Expecting one of '${o.join("', '")}'`);return this._lifeCycleHooks[e]?this._life
|
|
|
23
23
|
Expecting one of '${o.join("', '")}'`);let n=`${e}Help`;return this.on(n,r=>{let s;typeof t=="function"?s=t({error:r.error,command:r.command}):s=t,s&&r.write(`${s}
|
|
24
24
|
`)}),this}_outputHelpIfRequested(e){let t=this._getHelpOption();t&&e.find(n=>t.is(n))&&(this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)"))}};function jo(i){return i.map(e=>{if(!e.startsWith("--inspect"))return e;let t,o="127.0.0.1",n="9229",r;return(r=e.match(/^(--inspect(-brk)?)$/))!==null?t=r[1]:(r=e.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null?(t=r[1],/^\d+$/.test(r[3])?n=r[3]:o=r[3]):(r=e.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(t=r[1],o=r[3],n=r[4]),t&&n!=="0"?`${t}=${o}:${parseInt(n)+1}`:e})}No.Command=$t});var Ho=ye(z=>{"use strict";var{Argument:Lo}=Ze(),{Command:Dt}=Fo(),{CommanderError:si,InvalidArgumentError:Uo}=Me(),{Help:ai}=St(),{Option:Vo}=Tt();z.program=new Dt;z.createCommand=i=>new Dt(i);z.createOption=(i,e)=>new Vo(i,e);z.createArgument=(i,e)=>new Lo(i,e);z.Command=Dt;z.Option=Vo;z.Argument=Lo;z.Help=ai;z.CommanderError=si;z.InvalidArgumentError=Uo;z.InvalidOptionArgumentError=Uo});var Ve=pe(ct(),1);import V from"process";import*as Gr from"tls";function Io(){let i=Gr;if(!(typeof i.getCACertificates!="function"||typeof i.setDefaultCACertificates!="function"))try{let e=n=>typeof n=="string",t=i.getCACertificates("default").filter(e),o=i.getCACertificates("system").filter(e);i.setDefaultCACertificates([...new Set([...t,...o])])}catch{}}var To=!1;function Ro(){if(!To)try{if(typeof process.emitWarning!="function")return;let i=process.emitWarning.bind(process),e=((t,...o)=>{let n=typeof t=="string"?t:t?.message??"";if(!((typeof o[0]=="string"?o[0]:typeof t=="object"&&t?t.name:void 0)==="ExperimentalWarning"&&n.includes("buffer.File")))return i(t,...o)});process.emitWarning=e,To=!0}catch{}}var Bo=pe(Ho(),1),{program:ms,createCommand:ps,createArgument:fs,createOption:hs,CommanderError:gs,InvalidArgumentError:qo,InvalidOptionArgumentError:ws,Command:je,Argument:vs,Option:W,Help:bs}=Bo.default;import{join as ee,resolve as Gi}from"path";var jt=pe(ct(),1);var G=pe(ct(),1);var we=pe(qe(),1);function Wo({steps:i,bifurcationInfo:e,perFlowMetadata:t}){return!e||e.isSingleFlow||!t||t.length<=1?null:(0,we.jsx)(ce,{flexDirection:"column",children:t.map((o,n)=>{let r=i[n],s=r?.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),h=r?.status==="failed"?"failed":"passed",p=e.flows[n]??r?.objective??`Flow ${n+1}`;return(0,we.jsxs)(ce,{flexDirection:"column",marginTop:n>0?1:0,children:[(0,we.jsxs)(ce,{marginLeft:1,children:[(0,we.jsx)(J,{color:ie.purple,bold:!0,children:"Flow "+(n+1)+": "}),(0,we.jsx)(J,{color:ie.purple,children:p})]}),(0,we.jsx)(Ye,{status:h,summary:o?.summary??"",duration:d,steps:c,stepsPassed:a,stepsFailed:l,reason:o?.error_message??void 0,creditsConsumed:o?.credits_consumed??void 0})]},`flow-summary-${n}`)})})}var L=pe(qe(),1);function Go({config:i,spawnOpts:e,cancelRef:t,banner:o,describeContext:n,onComplete:r,onStepEnd:s,onReasoning:a,onStepComplete:l}){let{exit:c}=nn(),{append:d}=on(),{describe:h,onDescribe:p,creditsRef:m}=Co({resolve:()=>n??null,hostIsTTY:()=>!!process.stderr.isTTY}),u=Tn(s,void 0,a,l,p),x=(0,G.useRef)(!1),_=(0,G.useRef)(!1),[I,E]=(0,G.useState)("");(0,G.useEffect)(()=>{x.current||(x.current=!0,u.startRun(i,e))},[i,e,u]),(0,G.useEffect)(()=>{t&&(t.current=()=>u.cancelRun())},[t,u]),(0,G.useEffect)(()=>{u.isRunning||h.stop()},[u.isRunning,h.stop]);let R=(0,G.useRef)(0);dt((y,A)=>{A.ctrl&&y==="c"&&(u.isRunning?(R.current++,R.current>=2?c():u.cancelRun()):c())}),dt((y,A)=>{u.askingUser&&(A.return?(u.sendAnswer(I),E("")):A.backspace||A.delete?E(S=>S.slice(0,-1)):y&&!A.ctrl&&!A.meta&&E(S=>S+y))},{isActive:!!u.askingUser}),(0,G.useEffect)(()=>{if(!u.isRunning&&u.lastRunEnd&&!_.current){_.current=!0;let{passed:y,failed:A,total:S}=gt(u.steps),q=u.bifurcationInfo;r({lastRunEnd:u.lastRunEnd,stepsPassed:y,stepsFailed:A,stepsTotal:S,hadError:!1,bifurcationFlows:q&&!q.isSingleFlow?q.flows:null,describeCredits:m.current,evidence:u.getEvidenceState()}),c()}},[u.isRunning,u.lastRunEnd,u.steps,r,c]),(0,G.useEffect)(()=>{u.runError&&!u.isRunning&&!_.current&&(_.current=!0,r({lastRunEnd:null,stepsPassed:0,stepsFailed:0,stepsTotal:0,hadError:!0,bifurcationFlows:null,describeCredits:m.current,evidence:u.getEvidenceState()}),c())},[u.runError,u.isRunning,r,c]);let w=u.lastRunEnd?(()=>{let{passed:y,failed:A,total:S}=gt(u.steps);return{status:u.lastRunEnd.status,duration:u.lastRunEnd.duration??0,summary:u.lastRunEnd.summary??"",stepsPassed:y,stepsFailed:A,stepsTotal:S,reason:u.lastRunEnd.reason,finalState:u.lastRunEnd.final_state,creditsConsumed:(u.lastRunEnd.credits_consumed??0)+m.current}})():null,f=(0,G.useRef)(!1);return(0,G.useEffect)(()=>{f.current||!o||(f.current=!0,d((0,L.jsxs)(ce,{flexDirection:"column",marginBottom:1,children:[(0,L.jsxs)(ce,{borderStyle:"round",borderColor:"#dc4e08",paddingX:2,children:[(0,L.jsx)(J,{color:"#ff9500",bold:!0,children:"KaneAI CLI"}),(0,L.jsx)(J,{color:ie.dim,children:" \u2502 "}),(0,L.jsx)(J,{color:ie.orange,children:o.model}),(0,L.jsx)(J,{color:ie.dim,children:" \u2502 "}),(0,L.jsx)(J,{color:ie.dim,children:o.auth})]}),o.status?.map((y,A)=>(0,L.jsx)(J,{color:ie.dim,children:y},A))]})))},[]),(0,L.jsxs)(ce,{flexDirection:"column",children:[(()=>{let y=an({isRunning:u.isRunning,bifurcationInfo:u.bifurcationInfo,steps:u.steps,cmInitCounts:u.cmInitCounts,replayInfo:u.replayInfo});return y?(0,L.jsx)(sn,{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:h.text,describeVisible:h.visible,describeRevealing:h.revealing}),u.askingUser&&(0,L.jsxs)(ce,{flexDirection:"column",marginTop:1,children:[(0,L.jsxs)(J,{color:ie.orange,children:['Agent is asking: "',u.askingUser,'"']}),(0,L.jsxs)(J,{children:["> ",I,"\u2588"]})]}),u.runError&&(0,L.jsx)(so,{message:u.runError,code:"RUNNER_ERROR"}),w&&u.lastRunEnd&&(0,L.jsx)(Wo,{steps:u.steps,bifurcationInfo:u.bifurcationInfo,perFlowMetadata:u.lastRunEnd.per_flow_metadata??[]}),w&&(0,L.jsx)(Ye,{status:w.status==="passed"?"passed":"failed",summary:w.summary??"",duration:w.duration,steps:w.stepsTotal,stepsPassed:w.stepsPassed,stepsFailed:w.stepsFailed,reason:w.reason,creditsConsumed:w.creditsConsumed})]})}import{createInterface as li}from"readline";function Ce(i){process.stdout.write(JSON.stringify(i)+`
|
|
25
25
|
`)}async function Yo(i,e,t){let o=Sn(i,e);ze().then(p=>{p&&Ce({type:"update_available",current:p.current,latest:p.latest,severity:p.severity})}).catch(()=>{}),Qe().then(p=>{p&&Ce({type:"skill_update_available",current:p.current,latest:p.latestCompatible,install_cmd:"kane-cli install skill"})}).catch(()=>{});let n=li({input:process.stdin});n.on("line",p=>{try{let m=JSON.parse(p);m.type==="user_response"?o.sendUserResponse(m.answer??""):m.type==="cancel"&&o.sendCancel(m.reason??"")}catch{}});let r=null,s=!1,a=0,l=null,c=0,d=!1,h=An();for await(let p of o.events)switch(h=In(h,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),Ce(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),Ce(u);let x=d?Math.max(0,c-1):0,_=typeof m.ordinal=="number"&&m.id?{ordinal:m.ordinal,id:m.id}:void 0;t?.onStepEnd?.(m.index,x,m.child_id,_);break}case"bifurcation":{let m=p,u=m.flows??[],x=m.count??u.length;(m.is_single_flow??x<=1)||(l=u,d=!0,c=0),Ce({type:"bifurcation",flows:u,count:x});break}case"ask_user":{let m=p;Ce({type:"ask_user",question:m.question,step_index:m.step_index,...m.options?{options:m.options}:{}});break}case"run_end":{r=p;break}case"error":{s=!0,Ce({type:"error",message:p.message});break}default:break}return n.close(),await o.exited,{lastRunEnd:r,stepsTotal:a,hadError:s,bifurcationFlows:l,evidence:h}}import{join as ci}from"path";function Ko(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:o}=await import("./testmd-actions-7RNW76DN.js"),n=await o({});n.ok||process.exit(n.code),process.exit(await t(n.orgId))});ui(e),mi(e),pi(e),fi(e),hi(e),gi(e)}function di(i,e){return e.concat(i)}function ui(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: ${ci(fe,"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: dom (default \u2014 DOM extraction & assertions, vision fallback) | visual (vision only)").option("--final-validation <on|off>","Final validation: append the system cp_final checkpoint. Overrides config (default: off)").option("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").addOption(new 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:o}=await import("./run-test-md-7GONSVAM.js"),n=await o(e,t);process.exit(n)})}function mi(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)",di,[]).option("--json","Force NDJSON output even on TTY").action(async e=>{let{runListAction:t,resolveCurrentOrgId:o}=await import("./testmd-actions-7RNW76DN.js"),n=await o({json:!!e.json});n.ok||process.exit(n.code),process.exit(await t(e,n.orgId))})}function pi(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:o}=await import("./testmd-actions-7RNW76DN.js"),n=await o({});n.ok||process.exit(n.code),process.exit(await t(e,n.orgId))})}function fi(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:o,resolveCurrentOrgId:n}=await import("./testmd-actions-7RNW76DN.js"),r=await n({});r.ok||process.exit(r.code),process.exit(await o(e,!!t.yes,r.orgId))})}function hi(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:o,resolveCurrentOrgId:n}=await import("./testmd-actions-7RNW76DN.js"),r=await n({});r.ok||process.exit(r.code),process.exit(await o(e,t,r.orgId))})}function gi(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:o,resolveSyncAuth:n}=await import("./testmd-actions-7RNW76DN.js"),r=await n(t);r.ok||process.exit(r.code),process.exit(await o(e,r))})}function Jo(i){let e=i.command("context").description("Assurance context graph (.context/): ingest sources, extract use-cases, list nodes").action((t,o)=>{o.args.length>0&&o.error(`error: unknown command '${o.args[0]}'`,{exitCode:2}),o.help()});e.command("ingest <src...>").description("Ingest source files into .context/ (content-addressed)").option("--as <id>","Explicit source id (default: filename slug)").action(async(t,o)=>{let{ingestCommand:n}=await import("./ingest-cmd-X7BWGIN7.js");process.exit(await n(t,o))}),e.command("extract").description("Interactively extract use-cases from ingested sources via the context agent").option("--plan","Stop after the proposal \u2014 print it, commit nothing").option("--apply <path>","NOT IMPLEMENTED YET \u2014 will commit a saved --plan proposal (refuses loudly today)").option("--mode <mode>","Ask policy: interactive | agent | ci | override. TTY defaults to interactive chat; REQUIRED when headless").option("--force","Re-extract sources even if their current snapshot was already extracted").option("--resume <sid>","Resume a paused session (state under .context/sessions/)").option("--message <text>","With --resume: answer the pending questions (or steer) in plain words \u2014 the agent maps your statement itself").option("--source <id>","Extract exactly this ingested source \u2014 the explicit path for su-conv-* conversation sources, which the default sweep skips").action(async t=>{let{extractCommand:o}=await import("./extract-cmd-MZR7PHGA.js");process.exit(await o(t))}),e.command("sessions [action] [sid]").description("List resumable sessions; `sessions show <sid>` prints pending questions + assumed defaults; `sessions clean [sid]` GCs expired/named ones").option("--all","clean: remove ALL sessions (incl. corrupt), not just expired").option("--json","JSON output").action(async(t,o,n)=>{let{sessionsCommand:r}=await import("./sessions-cmd-STHKGDX4.js");process.exit(await r(t,n,o))}),e.command("fsck").description("Verify the full commit chain and check the derived projection for drift").action(async()=>{let{fsckCommand:t}=await import("./maintenance-cmd-E3HEEVQW.js");process.exit(await t())}),e.command("rebuild").description("Wipe .context/derived and rebuild it from the verified commit chain").option("--yes","Skip the confirmation prompt (required when headless)").action(async t=>{let{rebuildCommand:o}=await import("./maintenance-cmd-E3HEEVQW.js");process.exit(await o(t))}),e.command("list").description("List context graph nodes").option("--type <t>","Filter by node label (source | usecase)").option("--inferred","Only derived (unreviewed) nodes").option("--stale","Only stale/orphaned nodes").option("--all","Include superseded node versions").option("--json","JSON output").action(async t=>{let{listCommand:o}=await import("./list-cmd-JB2ABACD.js");process.exit(await o(t))}),e.command("view").description("Render the context graph as an interactive HTML page and open it in the browser (snapshot)").option("--out <path>","Write the HTML to <path> instead of a temp file").option("--open","Force-open the browser even when non-TTY (piped)").option("--no-open","Write the file but do not open the browser").option("--json","Print the computed view payload as JSON and exit (no HTML)").action(async t=>{let{viewCommand:o}=await import("./view-cmd-QE2FS3GB.js");process.exit(await o(t))}),e.command("retire <source_id>").description("Retire a source (head \u2192 null + tombstone record); reversible via revert").option("--reason <text>","Why this source is being retired").option("--yes","Skip the confirmation prompt (required when headless)").action(async(t,o)=>{let{retireCommand:n}=await import("./lifecycle-cmd-55NZL3UO.js");process.exit(await n(t,o))}),e.command("name [ref] [slug]").description("Assign a stable kebab-case name to a node (ref = cid or existing slug); --backfill assigns logical ids to all unnamed live nodes").option("--backfill","assign label-prefixed logical ids (uc-/sc-/ac-/t-\u2026) to every live unnamed node").option("--yes","Skip the --backfill confirmation prompt (required when headless)").action(async(t,o,n)=>{let{nameCommand:r,nameBackfillCommand:s}=await import("./lifecycle-cmd-55NZL3UO.js");n.backfill&&process.exit(await s(n)),(!t||!o)&&(process.stderr.write(`usage: kane-cli context name <ref> <slug> | kane-cli context name --backfill
|
|
27
|
-
`),process.exit(2)),process.exit(await r(t,o))}),e.command("revert <seq>").description("Invert a record's effects via a compensation record \u2014 history is never rewritten").option("--reason <text>","Why this record is being reverted").option("--yes","Skip the confirmation prompt (required when headless)").action(async(t,o)=>{let{revertCommand:n}=await import("./lifecycle-cmd-55NZL3UO.js");process.exit(await n(t,o))}),e.command("review").description("Walk a review queue; verdicts land as ONE batched record").option("--queue <q>","derived (default) | skipped | archived | drift").option("--json","NDJSON output (drift listing + --verdicts outcomes)").option("--verdicts <file>",'headless verdict input: JSON array of {"ref", "resolution", ...} \u2014 atomic, works with or without a TTY').action(async t=>{let{reviewCommand:o}=await import("./review-cmd-RXPPC5GK.js");process.exit(await o(t))}),e.command("explain <ref>").description("Replay the recorded reasoning + lineage for a node (no model call)").option("--json","JSON output").action(async(t,o)=>{let{explainCommand:n}=await import("./explain-cmd-55WRDIMW.js");process.exit(await n(t,o))})}function zo(i){let e=i.command("design").description("Test design engine: turn a committed use-case into ACs, scenarios, and 1:1 tests").action((t,o)=>{o.args.length>0&&o.error(`error: unknown command '${o.args[0]}'`,{exitCode:2}),o.help()});e.command("tests").description("Design the assurance for ONE committed use-case (conversational; chat is the default)").option("--use-case <ref>","The use-case to design \u2014 logical id (uc-\u2026) or cid (optional with --resume: the session remembers it)").option("--max <n>","Budget ceiling: max scenario+test pairs (NO ceiling when omitted \u2014 the agent estimates and asks)",t=>Number(t)).option("--strength <s>","Manual covering-array strength override: pairwise | 3-wise").option("--mode <mode>","Ask policy: interactive | agent | ci | override. TTY defaults to interactive chat; REQUIRED when headless").option("--force","Redesign a use-case that already has a live design (supersedes its scenario+test pairs)").option("--resume <sid>","Resume a paused design session (state under .context/sessions/)").option("--message <text>","With --resume: answer the pending questions (or steer) in plain words \u2014 the agent maps your statement itself").option("--plan","Transcription only \u2014 print each finalize payload, commit nothing").action(async t=>{let{designTestsCommand:o}=await import("./bind-
|
|
26
|
+
`),process.exit(2));let{runListTui:t,resolveCurrentOrgId:o}=await import("./testmd-actions-TU4KTO32.js"),n=await o({});n.ok||process.exit(n.code),process.exit(await t(n.orgId))});ui(e),mi(e),pi(e),fi(e),hi(e),gi(e)}function di(i,e){return e.concat(i)}function ui(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: ${ci(fe,"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: dom (default \u2014 DOM extraction & assertions, vision fallback) | visual (vision only)").option("--final-validation <on|off>","Final validation: append the system cp_final checkpoint. Overrides config (default: off)").option("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").addOption(new 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:o}=await import("./run-test-md-AUK7NGLL.js"),n=await o(e,t);process.exit(n)})}function mi(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)",di,[]).option("--json","Force NDJSON output even on TTY").action(async e=>{let{runListAction:t,resolveCurrentOrgId:o}=await import("./testmd-actions-TU4KTO32.js"),n=await o({json:!!e.json});n.ok||process.exit(n.code),process.exit(await t(e,n.orgId))})}function pi(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:o}=await import("./testmd-actions-TU4KTO32.js"),n=await o({});n.ok||process.exit(n.code),process.exit(await t(e,n.orgId))})}function fi(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:o,resolveCurrentOrgId:n}=await import("./testmd-actions-TU4KTO32.js"),r=await n({});r.ok||process.exit(r.code),process.exit(await o(e,!!t.yes,r.orgId))})}function hi(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:o,resolveCurrentOrgId:n}=await import("./testmd-actions-TU4KTO32.js"),r=await n({});r.ok||process.exit(r.code),process.exit(await o(e,t,r.orgId))})}function gi(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:o,resolveSyncAuth:n}=await import("./testmd-actions-TU4KTO32.js"),r=await n(t);r.ok||process.exit(r.code),process.exit(await o(e,r))})}function Jo(i){let e=i.command("context").description("Assurance context graph (.context/): ingest sources, extract use-cases, list nodes").action((t,o)=>{o.args.length>0&&o.error(`error: unknown command '${o.args[0]}'`,{exitCode:2}),o.help()});e.command("ingest <src...>").description("Ingest source files into .context/ (content-addressed)").option("--as <id>","Explicit source id (default: filename slug)").action(async(t,o)=>{let{ingestCommand:n}=await import("./ingest-cmd-X7BWGIN7.js");process.exit(await n(t,o))}),e.command("extract").description("Interactively extract use-cases from ingested sources via the context agent").option("--plan","Stop after the proposal \u2014 print it, commit nothing").option("--apply <path>","NOT IMPLEMENTED YET \u2014 will commit a saved --plan proposal (refuses loudly today)").option("--mode <mode>","Ask policy: interactive | agent | ci | override. TTY defaults to interactive chat; REQUIRED when headless").option("--force","Re-extract sources even if their current snapshot was already extracted").option("--resume <sid>","Resume a paused session (state under .context/sessions/)").option("--message <text>","With --resume: answer the pending questions (or steer) in plain words \u2014 the agent maps your statement itself").option("--source <id>","Extract exactly this ingested source \u2014 the explicit path for su-conv-* conversation sources, which the default sweep skips").action(async t=>{let{extractCommand:o}=await import("./extract-cmd-5GGI6LAM.js");process.exit(await o(t))}),e.command("sessions [action] [sid]").description("List resumable sessions; `sessions show <sid>` prints pending questions + assumed defaults; `sessions clean [sid]` GCs expired/named ones").option("--all","clean: remove ALL sessions (incl. corrupt), not just expired").option("--json","JSON output").action(async(t,o,n)=>{let{sessionsCommand:r}=await import("./sessions-cmd-STHKGDX4.js");process.exit(await r(t,n,o))}),e.command("fsck").description("Verify the full commit chain and check the derived projection for drift").action(async()=>{let{fsckCommand:t}=await import("./maintenance-cmd-E3HEEVQW.js");process.exit(await t())}),e.command("rebuild").description("Wipe .context/derived and rebuild it from the verified commit chain").option("--yes","Skip the confirmation prompt (required when headless)").action(async t=>{let{rebuildCommand:o}=await import("./maintenance-cmd-E3HEEVQW.js");process.exit(await o(t))}),e.command("list").description("List context graph nodes").option("--type <t>","Filter by node label (source | usecase)").option("--inferred","Only derived (unreviewed) nodes").option("--stale","Only stale/orphaned nodes").option("--all","Include superseded node versions").option("--json","JSON output").action(async t=>{let{listCommand:o}=await import("./list-cmd-JB2ABACD.js");process.exit(await o(t))}),e.command("view").description("Render the context graph as an interactive HTML page and open it in the browser (snapshot)").option("--out <path>","Write the HTML to <path> instead of a temp file").option("--open","Force-open the browser even when non-TTY (piped)").option("--no-open","Write the file but do not open the browser").option("--json","Print the computed view payload as JSON and exit (no HTML)").action(async t=>{let{viewCommand:o}=await import("./view-cmd-QE2FS3GB.js");process.exit(await o(t))}),e.command("retire <source_id>").description("Retire a source (head \u2192 null + tombstone record); reversible via revert").option("--reason <text>","Why this source is being retired").option("--yes","Skip the confirmation prompt (required when headless)").action(async(t,o)=>{let{retireCommand:n}=await import("./lifecycle-cmd-55NZL3UO.js");process.exit(await n(t,o))}),e.command("name [ref] [slug]").description("Assign a stable kebab-case name to a node (ref = cid or existing slug); --backfill assigns logical ids to all unnamed live nodes").option("--backfill","assign label-prefixed logical ids (uc-/sc-/ac-/t-\u2026) to every live unnamed node").option("--yes","Skip the --backfill confirmation prompt (required when headless)").action(async(t,o,n)=>{let{nameCommand:r,nameBackfillCommand:s}=await import("./lifecycle-cmd-55NZL3UO.js");n.backfill&&process.exit(await s(n)),(!t||!o)&&(process.stderr.write(`usage: kane-cli context name <ref> <slug> | kane-cli context name --backfill
|
|
27
|
+
`),process.exit(2)),process.exit(await r(t,o))}),e.command("revert <seq>").description("Invert a record's effects via a compensation record \u2014 history is never rewritten").option("--reason <text>","Why this record is being reverted").option("--yes","Skip the confirmation prompt (required when headless)").action(async(t,o)=>{let{revertCommand:n}=await import("./lifecycle-cmd-55NZL3UO.js");process.exit(await n(t,o))}),e.command("review").description("Walk a review queue; verdicts land as ONE batched record").option("--queue <q>","derived (default) | skipped | archived | drift").option("--json","NDJSON output (drift listing + --verdicts outcomes)").option("--verdicts <file>",'headless verdict input: JSON array of {"ref", "resolution", ...} \u2014 atomic, works with or without a TTY').action(async t=>{let{reviewCommand:o}=await import("./review-cmd-RXPPC5GK.js");process.exit(await o(t))}),e.command("explain <ref>").description("Replay the recorded reasoning + lineage for a node (no model call)").option("--json","JSON output").action(async(t,o)=>{let{explainCommand:n}=await import("./explain-cmd-55WRDIMW.js");process.exit(await n(t,o))})}function zo(i){let e=i.command("design").description("Test design engine: turn a committed use-case into ACs, scenarios, and 1:1 tests").action((t,o)=>{o.args.length>0&&o.error(`error: unknown command '${o.args[0]}'`,{exitCode:2}),o.help()});e.command("tests").description("Design the assurance for ONE committed use-case (conversational; chat is the default)").option("--use-case <ref>","The use-case to design \u2014 logical id (uc-\u2026) or cid (optional with --resume: the session remembers it)").option("--max <n>","Budget ceiling: max scenario+test pairs (NO ceiling when omitted \u2014 the agent estimates and asks)",t=>Number(t)).option("--strength <s>","Manual covering-array strength override: pairwise | 3-wise").option("--mode <mode>","Ask policy: interactive | agent | ci | override. TTY defaults to interactive chat; REQUIRED when headless").option("--force","Redesign a use-case that already has a live design (supersedes its scenario+test pairs)").option("--resume <sid>","Resume a paused design session (state under .context/sessions/)").option("--message <text>","With --resume: answer the pending questions (or steer) in plain words \u2014 the agent maps your statement itself").option("--plan","Transcription only \u2014 print each finalize payload, commit nothing").action(async t=>{let{designTestsCommand:o}=await import("./bind-FZ4X4SOK.js");process.exit(await o(t))}),e.command("explain <ref>").description("Replay WHY a designed item looks the way it does \u2014 sidecar + recorded judgements, zero fresh AI").action(async t=>{let{designExplainCommand:o}=await import("./explain-cmd-RIDEMDMY.js");process.exit(await o(t))})}function Qo(i){let e=i.command("maintain").description("Keep the assurance suite true as sources change: learn signals, evolve, reconcile").action((o,n)=>{n.args.length>0&&n.error(`error: unknown command '${n.args[0]}'`,{exitCode:2}),n.help()}),t=e.command("learn").description("Inspect what the review loop has learned (review signals, distilled style notes)").action((o,n)=>{n.args.length>0&&n.error(`error: unknown command '${n.args[0]}'`,{exitCode:2}),n.help()});t.command("signals").description("List recorded review signals \u2014 read-only").option("--kind <kind>","Filter by polarity: preference | mistake | correction").option("--show <idx>","Print one full record by table index").option("--json","Emit the raw (possibly --kind-filtered) signal array").action(async o=>{let{signalsCommand:n}=await import("./signals-cmd-LXHZQLXZ.js");process.exit(await n(o))}),t.command("distill").description("Rebuild StyleNotes from the signal ledger (full pass, idempotent)").action(async()=>{let{distillCommand:o}=await import("./distill-cmd-EYCCCFL3.js");process.exit(await o())}),e.command("evolve [ref]").description("Re-design the parent use-case of a test/scenario/AC/use-case and report the pair diff").option("--from-stale","Evolve every use-case with stale designed entities (deduped, per-UC confirm)").option("--yes","Skip the blast-radius confirm; the design run goes headless (override mode)").option("--because <reason>","Re-design a FRESH target anyway \u2014 the reason becomes the change delta and lands in provenance").action(async(o,n)=>{let{evolveCommand:r}=await import("./evolve-cmd-HR25DRTC.js");process.exit(await r(o,n))}),e.command("reconcile").description("Reconcile a changed source: re-ingest + re-extract, then triage the changeset item by item (the interactive walk is the TTY default)").option("--from <source-id|path>","The changed source \u2014 a known source-id or a file path. Bare --from in a TTY stores the plan and walks it: [a]pprove / [e]dit / [s]kip / [d]efer per item").option("--plan","Preview only: render + store the plan, print its path, exit (graph updates land, the suite is untouched)").option("--apply [path]","Walk a STORED plan (REMOVE stays plan-only). Bare = the latest plan behind an approval prompt; a path picks one; with --from it recomputes live").option("--yes","Auto-approve ADD/ENHANCE rows only (defers nothing, never retires); design runs go headless (override mode)").action(async o=>{let{reconcileCommand:n}=await import("./reconcile-cmd-242S7XNO.js");process.exit(await n(o))})}function Xo(i){i.command("cover").description("Two-axis coverage: depth proven by an evidence pack + completeness owed by the live graph").option("--from <pack>","Evidence pack to read (dir, sealed file, or execution id; default: newest in .testmuai/evidence)").option("--json","Machine-readable output").action(async(t,o)=>{o.args.length>0&&o.error(`error: unknown command '${o.args[0]}'`,{exitCode:2});let{coverCommand:n}=await import("./cover-cmd-Y5L4O4Q3.js");process.exit(await n(t))}).command("gaps").description("Ranked list of what to design or redesign next (design-stage live; cover-stage needs a pack)").option("--stage <stage>","design | cover | all (default design)").option("--top <n>","Show only the top N rows",t=>Number(t)).option("--from <pack>","Evidence pack for the cover stage (default: newest)").option("--json","Machine-readable output").action(async t=>{let{gapsCommand:o}=await import("./gaps-cmd-P2DRK6FW.js");process.exit(await o(t))})}import{existsSync as wi}from"fs";import{resolve as vi,relative as bi}from"path";var xe=class extends Error{};async function Zo(i){let e=i.cwd??process.cwd(),t;if(i.paths&&i.paths.length>0?t=i.paths.map(r=>{let s=vi(e,r);if(!wi(s)||!s.endsWith("_test.md"))throw new xe(`not a *_test.md file: ${r}`);return{path:s,relPath:bi(e,s)}}):t=(await to({root:e})).results.map(s=>({path:s.path,relPath:s.relPath})),i.match){let r;try{r=new RegExp(i.match)}catch(s){throw new xe(`invalid --match regex: ${s instanceof Error?s.message:s}`)}t=t.filter(s=>r.test(s.relPath))}let o=new Set,n=[];for(let r of t)o.has(r.path)||(o.add(r.path),n.push({...r,tags:no(r.path)}));if(i.tags&&i.tags.length>0){let r=new Set(i.tags.map(s=>s.toLowerCase()));return n.filter(s=>s.tags.some(a=>r.has(a))).sort((s,a)=>s.relPath.localeCompare(a.relPath))}return n.sort((r,s)=>r.relPath.localeCompare(s.relPath))}import{readFileSync as yi}from"fs";import{join as _i}from"path";function ki(i){try{return JSON.parse(yi(_i(Ke(i),".internal","meta.json"),"utf8"))}catch{return null}}var Ne=i=>typeof i=="string"&&i?i:void 0;function er(i){let e=[],t,o;for(let r of i){let s=ki(r.path);if(!s){e.push({...r,failure:"missing_meta"});continue}let a={testcaseId:Ne(s.testcase_id),folderId:Ne(s.folder_id),commitId:Ne(s.commit_id),sessionName:Ne(s.session_name)},l=Ne(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({...r,...a,orgId:c,projectId:d,failure:"not_authored"});continue}if(t===void 0&&c&&(t=c),o===void 0&&d&&(o=d),c&&t&&c!==t){e.push({...r,...a,testId:l,orgId:c,projectId:d,failure:"org_mismatch"});continue}if(d&&o&&d!==o){e.push({...r,...a,testId:l,orgId:c,projectId:d,failure:"project_mismatch"});continue}e.push({...r,...a,testId:l,orgId:c,projectId:d})}let n=e.length>0&&e.every(r=>!r.failure);return{checks:e,valid:n,orgId:t,projectId:o}}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 tr(i){let e=await Zo(i),t=er(e),o=Number(i.parallel??1),n=Number.isFinite(o)&&o>=1?Math.floor(o):1;return{...t,parallel:n,parallelClamped:!1,onFailure:i.onFailure??"continue",title:i.name??Ci(i)}}import{basename as xi,join as dr}from"path";import{readFileSync as mr,existsSync as Si}from"fs";import{promises as Fe}from"fs";import{existsSync as Le}from"fs";import{join as ve}from"path";async function Mt(i){let e=i.status??"skipped",t=ve(i.packDir,"tests",i.testId),o=ve(t,"steps"),n=ve(t,"logs");await Fe.mkdir(o,{recursive:!0});let r=ve(o,".keep");Le(r)||await Fe.writeFile(r,""),await Fe.mkdir(n,{recursive:!0});let s=ve(n,"testrun.log");Le(s)||await Fe.writeFile(s,i.reason+`
|
|
28
28
|
`);let a=ve(t,i.definition.path);Le(a)||await Fe.writeFile(a,i.definition.content);let l=ve(n,"meta.yaml");if(!Le(l)){let d=await Un(n);await Fn(i.packDir,i.testId,jn(d))}let c=ve(t,"result.yaml");Le(c)||await Nn(i.packDir,i.testId,Mn({testId:i.testId,status:e,definitionPath:i.definition.path,externalId:Rn(i.externalIdInput),tags:i.tags,environment:{},steps:[]}))}async function nr(i,e,t){let o=[],n=new Array(i.length).fill(!1),r=0,s=!1,a,l=!1,c=()=>{o.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||r>=i.length)return;let p=r++,m=i[p];n[p]=!0;try{t.onStart?.(m);let u=await e(m);o.push({item:m,result:u}),t.onEnd?.(m,u),t.failFast&&t.isFailure(u)&&(s=!0)}catch(u){a=a??u,s=!0}}}let h=Math.max(1,Math.min(t.parallel,i.length));try{await Promise.all(Array.from({length:h},()=>d()))}finally{t.signal?.removeEventListener("abort",c)}if(a)throw a;return{done:o,skipped:i.filter((p,m)=>!n[m]),cancelled:l}}function or(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 rr(i,e){return{type:"testrun_start",execution_id:i,members:e.checks.map(t=>t.relPath),parallel:e.parallel}}function ir(i){return{type:"testrun_member_start",path:i.path,test_id:i.testId}}function sr(i,e){return{type:"testrun_member_end",path:i.path,test_id:i.testId,status:e.overallStatus,duration_s:e.durationS}}function ar(i,e){return{type:"testrun_evidence_ingest",status:i.ok?"ok":"failed",evidence_id:e,...i.stage?{stage:i.stage}:{}}}function lr(i){return{type:"testrun_summary",totals:i.totals,duration_s:i.durationS,upload:i.upload,cancelled:i.cancelled}}function cr(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 ur(i){try{return mr(i,"utf8")}catch{return""}}async function pr(i,e){let t=e.cwd??process.cwd(),o=Date.now(),n=$n();e.onExecutionId?.(n);let r=f=>({execution_id:n,test_id:f.testId,testcase_id:f.testcaseId,project_id:f.projectId,folder_id:f.folderId,org_id:f.orgId,commit_id:f.commitId,session_name:f.sessionName,user_name:e.operator?.userName,user_email:e.operator?.userEmail}),s=await Dn({execution_id:n,title:i.title,started:new Date().toISOString(),producerVersion:_e,run_kind:"author",origin:"testrun",pid:process.pid},t);e.emit(rr(n,i));let a=[...new Set(i.checks.flatMap(f=>f.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(f=>({key:f.path,value:f})),d=await nr(c,f=>e.executeMember(f.value,l++),{parallel:i.parallel,failFast:i.onFailure==="fail-fast",isFailure:Ee,signal:e.signal,onStart:f=>e.emit(ir(f.value)),onEnd:(f,y)=>{e.emit(sr(f.value,y)),e.log?.("info","TESTRUN_MEMBER_END","Testrun member ended",{execution_id:n,member_test_id:f.value.testId??he(f.value.relPath),status:y.overallStatus,result_code:y.resultCode??null,duration_s:y.durationS,run_kind:y.runKind})}}),h=d.done.find(f=>Ee(f.result));for(let f of d.skipped)await Mt({packDir:s,testId:he(f.value.relPath),definition:{path:"test.md",content:ur(f.value.path)},externalIdInput:r(f.value),tags:f.value.tags,reason:d.cancelled?"skipped: testrun cancelled":`skipped: fail-fast after ${h?xi(h.item.value.path):"failure"}`});let p=new Map(d.done.map(f=>[f.item.value.relPath,f.result]));for(let f of i.checks){let y=he(f.relPath);if(Si(dr(s,"tests",y,"result.yaml")))continue;let A=p.get(f.relPath);await Mt({packDir:s,testId:y,definition:{path:"test.md",content:ur(f.path)},externalIdInput:r(f),tags:f.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(f=>f.result.pendingInvestigations??[]);if(m.length>0){e.emit({type:"testrun_investigations_wait",count:m.length});let f=m.map(S=>S.exited),y,A=!1;try{await Promise.race([Promise.allSettled(f),new Promise(S=>{y=setTimeout(()=>{A=!0,S()},e.investigationTimeoutMs??12e4)})])}finally{clearTimeout(y)}if(A){for(let q of m)try{q.cancel()}catch{}let S;try{await Promise.race([Promise.allSettled(f),new Promise(q=>{S=setTimeout(q,15e3)})])}finally{clearTimeout(S)}}}try{let f=S=>S==="passed"||S==="failed"||S==="skipped"?S:"broken",y=S=>{try{let q=dn(mr(dr(s,"tests",S,"result.yaml"),"utf8"));return Gn(q.steps??[])}catch{return[]}},A=Yn({cwd:t,members:d.done.map(S=>({path:S.item.value.path,verdict:f(S.result.overallStatus),acs:y(S.result.testId),executionId:n,startedAt:new Date().toISOString(),durationMs:Math.round(S.result.durationS*1e3),mode:"testrun",local:!e.shouldPublish}))});for(let S of A.warnings)console.warn(`testrun: ${S}`)}catch(f){console.warn("testrun: exec-sync failed",f)}try{let f=(e.coverageWriter??Kn)(s,Wn(t));f.status==="skipped"&&console.warn(`testrun: coverage/usecases.yaml not written: ${f.reason}`)}catch(f){console.warn("testrun: coverage writer threw",f)}let u=await Pn(s,new Date().toISOString()),x;try{let f=await On($e(n,t),"L1");x=f.valid,f.valid||(console.warn("testrun: sealed pack failed L1 validation",f.diagnostics),e.log?.("warn","EVIDENCE_INVALID","Sealed testrun pack failed L1 validation",{execution_id:n,first_code:String(f.diagnostics?.[0]?.code??""),surface:"testrun"}))}catch(f){console.warn("testrun: validation error",f)}let _="skipped";if(e.shouldPublish&&!d.cancelled&&e.publish){let f=i.checks[0],y=await e.publish({testId:f.testId,sessionId:n,executionId:n,sealedPackPath:$e(n,t),projectId:i.projectId});_=y.ok?"ok":"failed",e.emit(ar(y,n))}else e.shouldPublish&&d.cancelled&&e.log?.("info","PUBLISH_SKIPPED","Testrun evidence publish skipped",{surface:"testrun",reason:"cancel"});let I=new Map(d.done.map(f=>[f.item.value.path,f.result]));for(let f of i.checks){let y=I.get(f.path);await Ln(Ke(f.path),{execution_id:n,run_kind:y?.runKind??"author",status:y?Ee(y)?y.overallStatus==="failed"?"failed":"broken":"passed":"skipped",valid:x,uploaded:_==="ok",at:new Date().toISOString()})}let E={tests:i.checks.length,passed:d.done.filter(f=>!Ee(f.result)).length,failed:d.done.filter(f=>f.result.overallStatus==="failed").length,broken:d.done.filter(f=>["broken","interrupted"].includes(f.result.overallStatus)).length,skipped:d.skipped.length};e.emit(lr({totals:E,durationS:(Date.now()-o)/1e3,upload:_,cancelled:d.cancelled})),e.log?.("info","TESTRUN_SUMMARY","Testrun summary",{execution_id:n,totals:{passed:E.passed,failed:E.failed,broken:E.broken,skipped:E.skipped},upload:_});let R=d.done.some(f=>Ee(f.result)),w=d.cancelled?3:R?1:0;return e.emit(cr(n,w===0?"passed":w===3?"cancelled":"failed")),e.log?.("info","TESTRUN_DONE","Testrun done",{execution_id:n,exit_code:w}),{exitCode:w,executionId:n}}import{readFileSync as Ei}from"fs";function Ai(i,e){return{testId:i,overallStatus:e.overallStatus,exitCode:e.exitCode,durationS:e.durationS??0,runKind:_o(!!e.anyAuthorStepRan),resultCode:e.resultCode??null,...e.pendingInvestigations?.length?{pendingInvestigations:e.pendingInvestigations}:{}}}function Ii(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(`
|
|
29
29
|
`)[0]}`)},signal:i.signal}}async function fr(i,e,t,o,n=ko){let r=he(i.relPath),s=Date.now();try{let a=await Bn.attach({packDir:t.packDir,testId:r,definition:{path:"test.md",content:Ei(i.path,"utf8")},cwd:t.cwd}),l=Ii({abs:i.path,cwd:t.cwd,resolved:io(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 We,passThroughOpts:t.passThroughOpts,cdpEndpoint:e.cdpEndpoint,attach:a,signal:t.signal}),{host:c,lifecycle:d}=o(i),h=()=>{try{d.cleanup("runner","testrun cancelled")}catch{}};t.signal?.addEventListener("abort",h);try{let p=await n(l,c,d);return Ai(r,p)}finally{t.signal?.removeEventListener("abort",h)}}catch(a){return process.stderr.write(`member ${i.relPath} broken: ${a.message}
|
|
30
30
|
`),{testId:r,overallStatus:"broken",exitCode:2,durationS:(Date.now()-s)/1e3,runKind:"replay"}}finally{e.release()}}import{mkdtempSync as Ti,rmSync as Ri}from"fs";import{tmpdir as Oi}from"os";import{join as Pi}from"path";function hr(i){let e=Promise.resolve(),t=new Map,o=r=>{try{Ri(r,{recursive:!0,force:!0})}catch{}};function n(r){let s=e.then(async()=>{if(t.has(r))throw new Error(`chrome slot ${r} already acquired (one acquire per worker index)`);let a=Ti(Pi(Oi(),"kane-testrun-chrome-")),l;try{l=await i.launch({userDataDir:a,width:i.width,height:i.height,headless:i.headless})}catch(c){throw o(a),c}return t.set(r,{chrome:l,dataDir:a}),{cdpEndpoint:l.cdpEndpoint,release(){let c=t.get(r);if(c){t.delete(r);try{c.chrome.kill()}catch{}o(c.dataDir)}}}});return e=s.catch(()=>{}),s}return{acquire:n,killAll(){for(let[,r]of t){try{r.chrome.kill()}catch{}o(r.dataDir)}t.clear()}}}function gr(){let i=new Map;return{register(e,t){i.set(e,t)},deregister(e){i.delete(e)},cleanup(e,t){let o=i.get(e);if(o){i.delete(e);try{o()}catch{}}},remoteLogger:null}}import{EventEmitter as $i}from"events";import{Writable as Di}from"stream";function Mi(){return new Di({write(i,e,t){t()}})}function ji(){let i=new $i;return Object.assign(i,{isTTY:!0,setEncoding(){},setRawMode(e){return i},ref(){return i},unref(){return i},read(){return null}}),i}function wr(){let i=process.env.KANE_TESTRUN_MEMBER_DEBUG;return i==="1"||i==="true"}function vr(){return{...ao({isAgent:!0,log:()=>{},stdout:wr()?process.stderr:Mi(),stdin:ji()}),onAgentEvent:wr()?e=>{process.stderr.write(`[member] ${JSON.stringify(e)}
|
|
@@ -36,7 +36,7 @@ Expecting one of '${o.join("', '")}'`);let n=`${e}Help`;return this.on(n,r=>{let
|
|
|
36
36
|
`):T instanceof De&&T.code==="refresh_failed"?process.stderr.write(`error: Token refresh failed. Run 'kane-cli login' to re-authenticate.
|
|
37
37
|
`):process.stderr.write(`error: auth resolution failed: ${T.message}
|
|
38
38
|
`),process.exitCode=2;return}let m=e.log?{log:e.log,shutdown:async()=>{}}:Hi({environment:c,resolvedAuth:p,isAgent:o}),u=m.log,x={retry:e.retry,retryCount:e.retryCount,headless:e.headless,env:e.env,local:e.local,username:e.username,accessKey:e.accessKey,bugDetection:e.bugDetection},_=a.load(),I=hr({launch:xn,width:_.window_size.width,height:_.window_size.height,headless:!!e.headless});Se("testrun-slots",()=>I.killAll());let E={packDir:"",resolvedAuth:p,environment:c,envConfig:d,creds:s,configStore:a,profile:l,model:h,passThroughOpts:x,cwd:t},R=T=>({host:vr(),lifecycle:gr()}),w="",f=async(T,K)=>{let $;try{$=await I.acquire(K)}catch(te){let ne=te.message;process.stderr.write(`member ${T.relPath}: chrome slot failed: ${ne}
|
|
39
|
-
`);let He=he(T.relPath),H=T.testId??He;return Hn(Vn(E.packDir,He),"warn","TESTRUN_SLOT_FAILURE",{execution_id:w,slot_index:K,member_test_id:H,phase:"launch",error:ne},u),{testId:T.testId??"",overallStatus:"broken",exitCode:2,durationS:0,runKind:"replay"}}return fr(T,$,E,R)},y=!e.local&&!!p.basicAuth&&r.projectId!=null&&e.evidencePublish!==!1;if(!y){let T=e.local?"local":p.basicAuth?r.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 K=p.basicAuth,$=await yo({controller:new _n(d.controllerBaseUrl,{username:K.username,accessKey:K.access_key}),tms:new cn(d.tmsBaseUrl,p.resolvedCreds?.username??K.username,p.resolvedCreds?.access_key??K.access_key),...T});if($.ok)return u("info","EVIDENCE_PUBLISH_OK","Testrun evidence published",{surface:"testrun",execution_id:T.executionId}),{ok:!0};let te=/\b(\d{3})\b/.exec($.error)?.[1]??null;return u("error","EVIDENCE_PUBLISH_FAILED","Testrun evidence publish failed",{surface:"testrun",stage:$.stage,http_status:te?Number(te):null,error:$.error}),{ok:!1,stage:$.stage}}:void 0,S=new AbortController;E.signal=S.signal;let q=Vi(S),Vt={executeMember:f,publish:A,emit:n,log:u,shouldPublish:y,operator:{userName:p.resolvedCreds?.username??void 0,userEmail:p.resolvedCreds?.email??void 0},signal:S.signal,cwd:t,onExecutionId:T=>{w=T,E.packDir=$e(T,t)}};try{let{exitCode:T}=await pr(r,Vt);if(process.exitCode=T,E.packDir){let{offerEvidenceView:K}=await import("./evidence-
|
|
39
|
+
`);let He=he(T.relPath),H=T.testId??He;return Hn(Vn(E.packDir,He),"warn","TESTRUN_SLOT_FAILURE",{execution_id:w,slot_index:K,member_test_id:H,phase:"launch",error:ne},u),{testId:T.testId??"",overallStatus:"broken",exitCode:2,durationS:0,runKind:"replay"}}return fr(T,$,E,R)},y=!e.local&&!!p.basicAuth&&r.projectId!=null&&e.evidencePublish!==!1;if(!y){let T=e.local?"local":p.basicAuth?r.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 K=p.basicAuth,$=await yo({controller:new _n(d.controllerBaseUrl,{username:K.username,accessKey:K.access_key}),tms:new cn(d.tmsBaseUrl,p.resolvedCreds?.username??K.username,p.resolvedCreds?.access_key??K.access_key),...T});if($.ok)return u("info","EVIDENCE_PUBLISH_OK","Testrun evidence published",{surface:"testrun",execution_id:T.executionId}),{ok:!0};let te=/\b(\d{3})\b/.exec($.error)?.[1]??null;return u("error","EVIDENCE_PUBLISH_FAILED","Testrun evidence publish failed",{surface:"testrun",stage:$.stage,http_status:te?Number(te):null,error:$.error}),{ok:!1,stage:$.stage}}:void 0,S=new AbortController;E.signal=S.signal;let q=Vi(S),Vt={executeMember:f,publish:A,emit:n,log:u,shouldPublish:y,operator:{userName:p.resolvedCreds?.username??void 0,userEmail:p.resolvedCreds?.email??void 0},signal:S.signal,cwd:t,onExecutionId:T=>{w=T,E.packDir=$e(T,t)}};try{let{exitCode:T}=await pr(r,Vt);if(process.exitCode=T,E.packDir){let{offerEvidenceView:K}=await import("./evidence-AX67Q6RN.js");await K({packPath:E.packDir,env:c,isTTY:!o&&T!==3&&!!process.stdin.isTTY&&!!process.stderr.isTTY,log:$=>process.stderr.write($+`
|
|
40
40
|
`)})}}catch(T){process.stderr.write(`error: testrun failed: ${T.message}
|
|
41
41
|
`),process.exitCode=1}finally{q(),I.killAll(),hn("testrun-slots"),await m.shutdown()}}function Vi(i){let e=process.listeners("SIGINT");process.removeAllListeners("SIGINT");let t=()=>i.abort();return process.on("SIGINT",t),()=>{process.removeListener("SIGINT",t);for(let o of e)process.on("SIGINT",o)}}function Hi(i){let e=null;try{let n=i.resolvedAuth.resolvedCreds;n&&(e=wo({sessionId:Ni(),identity:{org_id:String(n.org_id??""),user_id:String(n.user_id??""),machine_id:vo(),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,r,s,a)=>{try{e?.log(n,r,s,a)}catch{}},shutdown:async()=>{try{await e?.shutdown()}catch{}}}}function Bi(i){return i?e=>process.stdout.write(JSON.stringify(e)+`
|
|
42
42
|
`):e=>qi(e)}function qi(i){switch(i.type){case"testrun_start":process.stdout.write(`
|
|
@@ -58,8 +58,8 @@ ${i.checks.length} test(s) selected \u2014 plan ${i.valid?"valid":"INVALID"}
|
|
|
58
58
|
`);return}process.stderr.write(`
|
|
59
59
|
error: plan invalid \u2014 ${e.length} offending test(s):
|
|
60
60
|
`);for(let t of e)process.stderr.write(` ${t.relPath}: ${t.failure}
|
|
61
|
-
`)}function Ue(i){let e=new je;if(e.name("kane-cli").version(_e).showHelpAfterError("(run `kane-cli --help` to see all commands; `-h` and `help` also work)"),e.on("command:*",o=>{e.error(`error: unknown command '${o[0]}'`,{exitCode:2,code:"commander.unknownCommand"})}),i[0]==="--help"||i[0]==="-h"||i[0]==="help"){(async()=>{let{HelpView:o}=await import("./HelpView-
|
|
62
|
-
`),b(0,"config show complete");return}let{ConfigView:w}=await import("./ConfigView-
|
|
61
|
+
`)}function Ue(i){let e=new je;if(e.name("kane-cli").version(_e).showHelpAfterError("(run `kane-cli --help` to see all commands; `-h` and `help` also work)"),e.on("command:*",o=>{e.error(`error: unknown command '${o[0]}'`,{exitCode:2,code:"commander.unknownCommand"})}),i[0]==="--help"||i[0]==="-h"||i[0]==="help"){(async()=>{let{HelpView:o}=await import("./HelpView-EWHP7LSJ.js"),{render:n}=await import("./build-JIKYOZUH.js"),r=await import("./react-QWOAB3TB.js"),{waitUntilExit:s}=n(r.default.createElement(o));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 o=>{let n=new Z,r=new se,s=o.env,a=o.profile;if(!process.stdin.isTTY||o.oauth||o.username){if(n.setDefaultEnv(s),o.oauth)await new bn(a,s,n).login(),console.log(`Logged in as ${a} [${s}] via OAuth`);else if(o.username&&o.accessKey){try{let{validateBasicAuth:I}=await import("./validate-basic-IYMPP7C7.js");await I(s,o.username,o.accessKey)}catch{console.error("Credentials not valid. Please use valid credentials."),b(1,"Invalid basic-auth credentials");return}n.saveBasicAuth(a,s,{username:o.username,access_key:o.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),r.set("model",o.model),o.chromeProfile&&r.set("chrome_profile_path",o.chromeProfile);let _=null;if(o.username&&o.accessKey)_={username:o.username,access_key:o.accessKey};else try{let E=await ge({creds:n,env:s,log:()=>{}});E.resolvedCreds&&(_={username:E.resolvedCreds.username,access_key:E.resolvedCreds.access_key})}catch{}if(o.projectId&&(ke(n,r,a,s,{projectId:o.projectId}),console.log(`Project set to ${o.projectId}`)),o.folderId&&(ke(n,r,a,s,{folderId:o.folderId}),console.log(`Folder set to ${o.folderId}`)),_&&(!o.projectId||!o.folderId))try{let I=await mn({creds:n,config:r,profile:a,env:s,tmsCreds:_,log:()=>{}});o.projectId||console.log(`Auto-selected project: ${I.projectName} (${I.projectId})`),o.folderId||console.log(`Auto-selected folder: ${I.folderName} (${I.folderId})`)}catch(I){console.warn(`Could not auto-select project/folder: ${I instanceof Error?I.message:I}`)}Ge(n,r,a,s),console.log("Setup complete."),b(0,"Setup complete")}let{SingleShotApp:l}=await import("./SingleShotApp-QANGFAPO.js"),{ScrollbackProvider:c}=await import("./scrollback-JLPJR25X.js"),{render:d}=await import("./build-JIKYOZUH.js"),h=await import("./react-QWOAB3TB.js"),p={current:null},m={current:!1},{waitUntilExit:u,unmount:x}=d(h.default.createElement(c,null,h.default.createElement(l,{resultRef:p,mode:"login",loginCompleteRef:m})),{exitOnCtrlC:!1});Pe(()=>x()),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 o=new Z,n=o.getActiveProfile();if(!n){console.log("No active profile to logout");return}let r=o.getDefaultEnv(),s=await yn(o,n,r),a=new se;s.switchedTo?(Ge(o,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 o=>{let n=new Z,r=o.profile??n.getActiveProfile()??"default",s=n.getDefaultEnv(),a=n.loadCredentials(r,s),l=n.loadBasicAuth(r,s),c="none",d=l?.username,h,p,m,u;if(l?c="basic":a&&(c="oauth",p=new Date(a.expires_at*1e3).toISOString().slice(0,10)),c==="none")h="missing";else try{let R=await ge({creds:n,env:s,log:()=>{}});if(R.resolvedCreds)m="verified",h="valid",d=R.resolvedCreds.username??d;else{let{classifyAuthFailure:w}=await import("./resolver-IDCGRPFJ.js");w(R.resolver.lastError)==="auth"?(m="rejected",h="expired",u="Credentials rejected by the server \u2014 re-login or rotate your access key"):(m="unreachable",u=R.resolver.lastError?.message)}}catch(R){let w=R;w.code==="refresh_failed"?(m="rejected",h="expired",u="OAuth token refresh failed \u2014 run 'kane-cli login'"):w.code==="not_authenticated"?(c="none",h="missing"):(m="unreachable",u=w.message)}let{WhoamiView:x}=await import("./WhoamiView-YRQNOSOH.js"),{render:_}=await import("./build-JIKYOZUH.js"),I=await import("./react-QWOAB3TB.js"),{waitUntilExit:E}=_(I.default.createElement(x,{profile:r,env:s,authenticated:m==="verified",authMethod:c,username:d,tokenStatus:h,expiresAt:p,serverStatus:m,detail:u}));await E(),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-final-validation, 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(o,n,r)=>{let s=new se,a=new Z;if(o==="show"){let l=s.load(),c=a.getActiveProfile()??"default",d=a.getDefaultEnv(),h=a.loadProfileConfig(c,d)??{},p=h.project_id??l.project_id??null,m=h.project_name??l.project_name??null,u=h.folder_id??l.folder_id??null,x=h.folder_name??l.folder_name??null,_=a.loadBasicAuth(c,d),I=a.loadCredentials(c,d),E=_?`basic (${_.username})`:I?"oauth":"not configured";if(!!r?.agent||!process.stdin.isTTY||!process.stdout.isTTY){let S=Y(d);process.stdout.write(`${JSON.stringify({profile:c,env:d,auth:E,project_id:p,project_name:m,folder_id:u,folder_name:x,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,final_validation:l.final_validation,window_size:`${l.window_size.width}x${l.window_size.height}`,chrome_profile:l.chrome_profile_path,default_url:l.default_url??ut,controller_base_url:S.controllerBaseUrl,tms_base_url:S.tmsBaseUrl})}
|
|
62
|
+
`),b(0,"config show complete");return}let{ConfigView:w}=await import("./ConfigView-WHEFCVHR.js"),{render:f}=await import("./build-JIKYOZUH.js"),y=await import("./react-QWOAB3TB.js"),{waitUntilExit:A}=f(y.default.createElement(w,{model:l.model,authLabel:E,profile:c,env:d,defaultUrl:l.default_url??ut,projectId:p,projectName:m,folderId:u,folderName:x,windowSize:`${l.window_size.width}x${l.window_size.height}`,chromeProfile:l.chrome_profile_path}));await A()}else if(o==="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(o==="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(o==="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(o==="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(o==="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(o==="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(o==="set-final-validation"){if(n!=="on"&&n!=="off"){console.error("Final validation must be 'on' or 'off'."),b(1,"Invalid final-validation value");return}s.set("final_validation",n==="on"),console.log(`Final validation set to ${n}`)}else if(o==="set-url"){if(!n){console.error("Usage: kane-cli config set-url <url>"),b(1,"Missing URL");return}let l=Xn(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(o==="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-UUGUMJPI.js"),{render:c}=await import("./build-JIKYOZUH.js"),d=await import("./react-QWOAB3TB.js");await new Promise(h=>{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(),h()},onCancel:()=>{p(),h()}}))})}else if(o==="project"){if(n||!process.stdin.isTTY){n||(console.error("Usage: kane-cli config project <project-id>"),b(1,"Missing project ID"));let R=a.getActiveProfile()??"default",w=a.getDefaultEnv();ke(a,s,R,w,{projectId:n}),console.log(`Project set to ${n}`);return}let l=a.getDefaultEnv(),c=Y(l),d=a.getActiveProfile()??"default",{resolveTmsBasicAuth:h,formatAuthResolutionError:p}=await import("./list-commands-UDAL3SBY.js"),m=await h(d,l,{});if(!m.ok){let{message:R}=p(d,l,m);process.stderr.write(R),b(2,`${m.reason} for "${d}" [${l}]`);return}let{ProjectPicker:u}=await import("./ProjectPicker-IN7GFN7I.js"),{AuthResolver:x}=await import("./resolver-IDCGRPFJ.js"),{render:_}=await import("./build-JIKYOZUH.js"),I=await import("./react-QWOAB3TB.js"),E=new x(c.controllerBaseUrl,async()=>null,{username:m.creds.username,access_key:m.creds.access_key});await E.resolve(),await new Promise(R=>{let{unmount:w}=_(I.default.createElement(u,{resolver:E,currentProjectId:s.load().project_id,env:l,onSelect:(f,y)=>{let A=a.getActiveProfile()??"default",S=a.getDefaultEnv();ke(a,s,A,S,{projectId:f,projectName:y}),console.log(`Project set to ${y} (${f})`),w(),R()},onCancel:()=>{w(),R()}}))})}else if(o==="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 f=a.getActiveProfile()??"default",y=a.getDefaultEnv();ke(a,s,f,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=Y(c),h=a.getActiveProfile()??"default",{resolveTmsBasicAuth:p,formatAuthResolutionError:m}=await import("./list-commands-UDAL3SBY.js"),u=await p(h,c,{});if(!u.ok){let{message:w}=m(h,c,u);process.stderr.write(w),b(2,`${u.reason} for "${h}" [${c}]`);return}let{FolderPicker:x}=await import("./FolderPicker-HJUUHQEI.js"),{AuthResolver:_}=await import("./resolver-IDCGRPFJ.js"),{render:I}=await import("./build-JIKYOZUH.js"),E=await import("./react-QWOAB3TB.js"),R=new _(d.controllerBaseUrl,async()=>null,{username:u.creds.username,access_key:u.creds.access_key});await R.resolve(),await new Promise(w=>{let{unmount:f}=I(E.default.createElement(x,{resolver:R,projectId:l.project_id,currentFolderId:l.folder_id,env:c,onSelect:(y,A)=>{let S=a.getActiveProfile()??"default",q=a.getDefaultEnv();ke(a,s,S,q,{folderId:y,folderName:A}),console.log(`Folder set to ${A} (${y})`),f(),w()},onCancel:()=>{f(),w()}}))})}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|set-final-validation|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: ${ee(fe,"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: 'dom' (default \u2014 DOM-based extraction & assertions, vision fallback) or 'visual' (vision model only). Overrides config.").option("--final-validation <on|off>","Final validation: append the system cp_final checkpoint verifying the objective as a whole. Overrides config (default: off).").option("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").option("--network-ws","Capture WebSocket frames for assertions/extraction (experimental)").option("--network-sse","Capture Server-Sent Events messages (Chromium-only) for assertions/extraction (experimental)").option("--bug-detection <mode>","Detect product bugs while authoring: off|stop|continue (stop halts the run on a confirmed bug; continue records it and keeps going). Overrides `config set-bug-detection`.",o=>{if(o!=="off"&&o!=="stop"&&o!=="continue")throw new Error("--bug-detection must be off, stop or continue");return o}).addOption(new 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",`
|
|
63
63
|
Variables:
|
|
64
64
|
Variables are loaded in order (later wins):
|
|
65
65
|
1. Global: ${ee(fe,"variables")}/*.json
|
|
@@ -83,15 +83,15 @@ Context Files:
|
|
|
83
83
|
Override with --global-context / --local-context flags.
|
|
84
84
|
`).action(async(o,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(o&&o.endsWith(".md")&&!o.startsWith("-")){process.stderr.write(`error: '.md' files are no longer accepted by 'kane-cli run'.
|
|
85
85
|
Use 'kane-cli testmd run <path>' instead.
|
|
86
|
-
`),process.exit(2);return}let r=new Z,s=new se,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;if(n.finalValidation!==void 0){if(n.finalValidation!=="on"&&n.finalValidation!=="off"){console.error("Invalid --final-validation. Must be 'on' or 'off'."),b(2,"Invalid --final-validation");return}d=n.finalValidation==="on"}let h=new We,{printRecordingBanner:p}=await import("./recording-banner-
|
|
87
|
-
`)};Q?.setRunActive(!0);let k;try{k=await Yo(zt,{environment:_,mode:l,assertionMode:c,finalValidation:d,log:(O,D,le,be)=>v.log(O,D,le,be)},{onStepEnd:Qt,onStepLog:(O,D,le)=>v.logStep(O,D,le),onReasoning:O=>Q?.setStepText(O),onStepComplete:()=>Q?.setStepComplete()})}finally{Q?.setRunActive(!1)}let{lastRunEnd:C,stepsTotal:P,hadError:U,bifurcationFlows:ae}=k;if(Kt(M,k.evidence,C),U&&v.escalateRun(0),C){let O=mt(C,0,ae);v.addRunResult(pt(C,H.auteurObjective,0,O),C.total_runs);let D=C.status==="passed"?"passed":U?"error":"failed";v.addFlow({runIndex:0,objective:H.auteurObjective,status:D,summary:C.summary??"",duration:C.duration??0,steps:P,stepsPassed:D==="passed"?P:0,stepsFailed:D==="passed"?0:P,reason:C.reason,creditsConsumed:C.credits_consumed})}M&&await rt(),ft("chrome","Agent run completed");let N;if(v.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 O=Y(_),D=$.project_id;if(w.basicAuth){let{UploadPipeline:le}=await import("./pipeline-
|
|
86
|
+
`),process.exit(2);return}let r=new Z,s=new se,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;if(n.finalValidation!==void 0){if(n.finalValidation!=="on"&&n.finalValidation!=="off"){console.error("Invalid --final-validation. Must be 'on' or 'off'."),b(2,"Invalid --final-validation");return}d=n.finalValidation==="on"}let h=new We,{printRecordingBanner:p}=await import("./recording-banner-6FVTCUWQ.js");await p({isAgent:!!n.agent||!process.stdin.isTTY,sessionId:h.sessionId,sessionName:n.name??null,testPath:n.name?ee(process.cwd(),".testmuai","tests",`${n.name}_test.md`):null,outputPath:n.name?ee(process.cwd(),".testmuai","tests",`output-${n.name}`):null});let m=!!(n.username&&n.accessKey);if(await ro({isInteractive:!!process.stdin.isTTY&&!n.agent&&!m,creds:r,config:s}),!m){let g=r.getActiveProfile(),k=r.getDefaultEnv();g&&(r.loadBasicAuth(g,k)||r.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 u=`${r.getActiveProfile()??"no profile"}/${r.getDefaultEnv()}`,x=[],_=n.env??r.getDefaultEnv(),I=null,E=[],R=(g,k,C,P)=>{I?I(g,k,C,P):E.push([g,k,C,P])},w;try{w=await ge({creds:r,env:_,usernameFlag:n.username,accessKeyFlag:n.accessKey,log:R})}catch(g){throw g instanceof De&&(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 f=!!w.basicAuth,y=w.basicAuth?.username,A=w.basicAuth?.access_key,S=w.token,q=w.resolver,Vt=w.resolvedCreds;w.basicAuth&&x.push(`Auth: ${w.basicAuth.username}`);let T=r.getActiveProfile()??"default",K=r.getDefaultEnv();un(r,s,T,K);let $=s.load(),te=w.basicAuth??(w.resolvedCreds?{username:w.resolvedCreds.username,access_key:w.resolvedCreds.access_key}:null);if(te){let g=!!n.agent||!process.stdin.isTTY,k=await vn({creds:r,config:s,profile:T,env:K,tmsCreds:te,isLocal:!!n.local,log:R});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(wn(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 ne=Zn({flag:n.url,configDefault:a.default_url}),He=eo({resolvedUrl:ne,local:n.local,allowMissingUrl:n.allowMissingUrl,isTTY:!!process.stdin.isTTY}),H=fo({objective:o,globalDir:ee(fe,"variables"),localDir:ee(process.cwd(),".testmuai","variables"),file:n.variablesFile,inline:n.variables,onLoadError:g=>console.error(g)}),Ht;if(n.sessionContext)try{Ht=JSON.parse(n.sessionContext)}catch{console.error("Invalid --session-context JSON"),b(2,"Invalid --session-context JSON")}let Dr=n.globalContext??ee(fe,"global-memory.md"),Mr=n.localContext??ee(process.cwd(),".testmuai","context.md"),Bt=wt(Dr),qt=wt(Mr),oe;try{oe=await uo({config:a,startUrl:ne??void 0,headless:n.headless,cft:n.cft,wsEndpoint:n.wsEndpoint,cdpEndpoint:n.cdpEndpoint})}catch(g){console.error(Cn(g));let k=g instanceof kn?"Chrome not found at standard paths":`Chrome failed: ${g instanceof Error?g.message:g}`;b(2,k)}oe.instance&&Se("chrome",()=>{oe.instance.kill()});let Q=null,Wt=oe.cdpEndpoint??n.cdpEndpoint;Wt&&!n.cft&&!n.wsEndpoint&&(Q=En({headless:n.headless,cdpEndpoint:Wt,chromePid:oe.instance?.process.pid}),Q&&Se("marker-overlay",()=>Q.kill())),n.cft?x.push("CfT mode: Playwright will manage its own browser"):n.wsEndpoint?x.push(`Playwright WS endpoint (${n.wsEndpoint.slice(0,60)}...)`):n.cdpEndpoint?x.push(`CDP connected (${n.cdpEndpoint})`):oe.cdpEndpoint&&x.push(`Chrome ready (${oe.cdpEndpoint})`);let v=h;v.start({model:n.model??a.model,environment:_,profile:r.getActiveProfile()}),n.name&&v.setSessionName(n.name),w.resolvedCreds?.org_id!==void 0&&v.setOrgId(String(w.resolvedCreds.org_id)),w.resolvedCreds?.plan!==void 0&&v.setPlan(w.resolvedCreds.plan??null),v.setUserIdentity(w.resolvedCreds?.username??null,w.resolvedCreds?.email??null),I=(g,k,C,P)=>v.log(g,k,C,P);for(let g of E)v.log(...g);E.length=0;let Gt=f&&y&&A?{username:y,accessKey:A}:S??null,re=null;if(Gt!==null){let g=await bo({env:_,tmsCreds:w.resolvedCreds??null,resolver:w.resolver,auth:Gt,getToken:async()=>w.token??null,session:v,log:(k,C,P,U)=>v.log(k,C,P,U),skipScreenshotQueue:n.local,invocationMode:n.agent||!process.stdin.isTTY?"agent":"cli"});re=g.screenshotQueue,g.remoteLogger&&(Se("remote-logger",()=>g.remoteLogger.shutdownSync()),pn(g.remoteLogger))}let Yt=w.basicAuth&&!n.local?await ho({variables:H,auth:w.basicAuth,orgId:String(w.resolvedCreds?.org_id??""),env:_,localMode:!!n.local,log:(g,k,C,P)=>v.log(g,k,C,P)}):{};v.setAuteurVariables(H.auteur),v.setFirstRun(H.auteurObjective,ne??"");let{startInlineEvidence:jr,noteInlineSpawn:Kt,inlineEvidenceBlock:Nr,finalizeInlineEvidence:Fr,createCdpBrowserCapture:Lr}=await import("./evidence-AX67Q6RN.js"),rt=Lr(oe.cdpEndpoint),M=await jr({objectiveOrName:n.name??o,sessionId:v.sessionId,title:n.name??o,producerVersion:_e,pid:process.pid,surfaces:ne?[ne]:void 0,packRootDir:ee(v.sessionDir,"evidence")}),Be=async(g={})=>(v.flushRecorder(),await Fr(M,{saved:!!v.sessionName,local:!!n.local,recordedTestPath:v.recorder?.lastWrittenPath??null,externalIdInput:{session_id:v.sessionId,commit_id:v.sessionId,test_id:v.testId??void 0,testcase_id:g.testcaseId??v.testcaseId??void 0,project_id:$.project_id??void 0,folder_id:$.folder_id??void 0,org_id:v.orgId??void 0,session_name:v.sessionName??void 0,user_name:v.userName??void 0,user_email:v.userEmail??void 0,sharable_link:lo(Y(_).testManagerUiUrl,$.project_id,g.testcaseId??v.testcaseId,g.shareId)},cdpBrowserCapture:rt,model:n.model??a.model,tuiLogPath:ee(v.sessionDir,"tui.log"),log:(k,C,P,U)=>v.log(k,C,P,U)}));if(!n.local&&w.basicAuth&&$.project_id){let g=Y(_),k=await go({tmsBaseUrl:g.tmsBaseUrl,auth:w.basicAuth,objective:H.auteurObjective,url:ne??"",projectId:$.project_id,folderId:$.folder_id??"",hasCustomProfile:!!a.chrome_profile_path,log:(C,P,U,ae)=>v.log(C,P,U,ae)});k&&v.setTestId(k)}v.setResolvedGlobal({mode:l,max_steps:parseInt(n.maxSteps,10),timeout:n.timeout?parseInt(n.timeout,10):void 0,target:oe.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:Bt??void 0,local_context:qt??void 0,variables:Object.keys(H.auteur).length>0?H.auteur:void 0});let Jt=po(H.auteur,H.auteurObjective),zt=mo({objective:H.auteurObjective,url:ne??void 0,requireStartUrl:He,model:n.model??a.model,chrome:oe,auth:w,sessionId:v.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(Jt).length>0?Jt:void 0,globalContext:Bt??void 0,localContext:qt??void 0,sessionContext:Ht,evidence:Nr(M)}),it=Jn(),Qt=re?(g,k,C,P)=>{if(M&&P){it.track(zn(M.packTestDir,P,re,(U,ae,N,F)=>v.log(U,ae,N,F)));return}Qn(v.sessionDir,k,g,re,(U,ae,N,F)=>v.log(U,ae,N,F),C)}:void 0;if(!process.stdin.isTTY&&!n.agent&&(n.agent=!0),n.agent){let g=O=>{process.stdout.write(JSON.stringify(O)+`
|
|
87
|
+
`)};Q?.setRunActive(!0);let k;try{k=await Yo(zt,{environment:_,mode:l,assertionMode:c,finalValidation:d,log:(O,D,le,be)=>v.log(O,D,le,be)},{onStepEnd:Qt,onStepLog:(O,D,le)=>v.logStep(O,D,le),onReasoning:O=>Q?.setStepText(O),onStepComplete:()=>Q?.setStepComplete()})}finally{Q?.setRunActive(!1)}let{lastRunEnd:C,stepsTotal:P,hadError:U,bifurcationFlows:ae}=k;if(Kt(M,k.evidence,C),U&&v.escalateRun(0),C){let O=mt(C,0,ae);v.addRunResult(pt(C,H.auteurObjective,0,O),C.total_runs);let D=C.status==="passed"?"passed":U?"error":"failed";v.addFlow({runIndex:0,objective:H.auteurObjective,status:D,summary:C.summary??"",duration:C.duration??0,steps:P,stepsPassed:D==="passed"?P:0,stepsFailed:D==="passed"?0:P,reason:C.reason,creditsConsumed:C.credits_consumed})}M&&await rt(),ft("chrome","Agent run completed");let N;if(v.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 O=Y(_),D=$.project_id;if(w.basicAuth){let{UploadPipeline:le}=await import("./pipeline-TZJ652NT.js");re&&(await it.settle(),await re.drain());let be=vt({session:v,env:_,auth:w,variables:H,variableIds:Yt,projectId:D,folderId:$.folder_id,totalSteps:P,totalDuration:C.duration??0,screenshotExtMap:re?.getExtMap(),codeExport:bt({codeExport:n.codeExport,codeLanguage:n.codeLanguage,skipCodeValidation:n.skipCodeValidation},a.code_export),onProgress:()=>{},log:(Ie,Br,qr,Wr)=>v.log(Ie,Br,qr,Wr),shouldUploadArtifacts:!n.local,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0,evidence:M?{executionId:M.executionId,packTestDir:M.packTestDir,sealedPackPath:M.packDir,sealFn:Be}:void 0}),me=await new le(be).execute();me.success&&(me.testcaseId&&v.setTestcaseId(me.testcaseId),me.testcaseId&&me.shareId&&D&&(N=Je(O.testManagerUiUrl,D,me.testcaseId,me.shareId)));try{let{persistRecordedSession:Ie}=await import("./persist-recorded-session-BW3YSFMP.js");await Ie(v,{testcaseId:v.testcaseId??void 0,projectId:$.project_id??void 0,folderId:$.folder_id??void 0,codeExportDir:me.codeExportDir,packTestDir:M?.packTestDir})}catch(Ie){v.log("error","DIRECT_PERSIST_ERROR","Persist failed in agent mode",{error:String(Ie)})}}}catch(O){v.log("error","DIRECT_UPLOAD_ERROR","Upload failed in agent mode",{error:O instanceof Error?O.message:String(O)})}let F=await Be({});if(M&&F?.sealed){let{offerEvidenceView:O}=await import("./evidence-AX67Q6RN.js");await O({packPath:M.packDir,env:_,isTTY:!1,log:D=>process.stderr.write(D+`
|
|
88
88
|
`)})}if(C){let O={...C};N&&(O.test_url=N),g(O)}await v.finish("complete"),C||b(U?2:1,"Agent run ended with no result");let X=C.reason??"";(X.includes("Cancel")||X.includes("Timeout"))&&b(3,`Agent run: ${X}`),C.status==="passed"&&b(0,"Agent run passed"),b(1,"Agent run failed")}let B=null,Ae=0,st=!1,Xt=null,Zt=0,en={current:null},Ur=te?{authHeader:ln(te.username,te.access_key),sessionId:v.sessionId,controllerBaseUrl:Y(_).controllerBaseUrl}:null,{waitUntilExit:Vr}=Re(jt.default.createElement(Oe,null,jt.default.createElement(Go,{config:zt,describeContext:Ur,spawnOpts:{environment:_,mode:l,assertionMode:c,finalValidation:d,log:(g,k,C,P)=>v.log(g,k,C,P)},cancelRef:en,banner:{model:n.model??a.model,auth:u,status:x},onComplete:g=>{B=g.lastRunEnd,Ae=g.stepsTotal,st=g.hadError,Xt=g.bifurcationFlows,Zt=g.describeCredits,Kt(M,g.evidence,g.lastRunEnd)},onStepEnd:Qt,onReasoning:g=>Q?.setStepText(g),onStepComplete:()=>Q?.setStepComplete()})),{stdout:process.stderr,exitOnCtrlC:!1}),at;if(n.timeout){let g=parseInt(n.timeout,10)*1e3;at=setTimeout(()=>{console.error(`
|
|
89
|
-
Timeout: ${n.timeout}s exceeded \u2014 cancelling...`),en.current?.()},g)}Q?.setRunActive(!0);try{await Vr()}finally{Q?.setRunActive(!1)}if(at&&clearTimeout(at),B){let g=mt(B,0,Xt);v.addRunResult(pt(B,H.auteurObjective,0,g),B.total_runs);let k=B.status==="passed"?"passed":st?"error":"failed";v.addFlow({runIndex:0,objective:H.auteurObjective,status:k,summary:B.summary??"",duration:B.duration??0,steps:Ae,stepsPassed:k==="passed"?Ae:0,stepsFailed:k==="passed"?0:Ae,reason:B.reason,creditsConsumed:(B.credits_consumed??0)+Zt})}M&&await rt(),ft("chrome","Ink run completed");{let g=l==="testing",k=v.nextRunIndex()>0;if(g&&!n.name&&k&&process.stdin.isTTY)try{let{renderSavePrompt:C,defaultSessionTimestamp:P}=await import("./SaveSessionPrompt-
|
|
90
|
-
`)})}await v.finish("complete"),B||b(st?2:1,"Run ended with no result");let lt=B.reason??"";(lt.includes("Cancel")||lt.includes("Timeout"))&&b(3,`Run: ${lt}`),B.status==="passed"&&b(0,"Run passed"),b(1,"Run failed")}catch(r){b(2,`CLI error: ${r instanceof Error?r.message:String(r)}`)}}),Ko(e),Jo(e),zo(e),Qo(e),Xo(e),e.addCommand(yr()),Ao(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(o,n)=>{if(o!=="skill"){console.error(`error: unknown install target '${o}'. Supported: skill`),b(2,`unknown install target '${o}'`);return}let{installSkill:r,formatInstallResult:s}=await import("./skill-installer-
|
|
89
|
+
Timeout: ${n.timeout}s exceeded \u2014 cancelling...`),en.current?.()},g)}Q?.setRunActive(!0);try{await Vr()}finally{Q?.setRunActive(!1)}if(at&&clearTimeout(at),B){let g=mt(B,0,Xt);v.addRunResult(pt(B,H.auteurObjective,0,g),B.total_runs);let k=B.status==="passed"?"passed":st?"error":"failed";v.addFlow({runIndex:0,objective:H.auteurObjective,status:k,summary:B.summary??"",duration:B.duration??0,steps:Ae,stepsPassed:k==="passed"?Ae:0,stepsFailed:k==="passed"?0:Ae,reason:B.reason,creditsConsumed:(B.credits_consumed??0)+Zt})}M&&await rt(),ft("chrome","Ink run completed");{let g=l==="testing",k=v.nextRunIndex()>0;if(g&&!n.name&&k&&process.stdin.isTTY)try{let{renderSavePrompt:C,defaultSessionTimestamp:P}=await import("./SaveSessionPrompt-ISODGFP7.js"),U=await C(P());U&&v.setSessionName(U)}catch(C){v.log("warn","DIRECT_SAVE_PROMPT_FAILED","Save prompt failed",{error:String(C)})}}if(v.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=Y(_),k=$.project_id;if(w.basicAuth){let{UploadPipeline:C}=await import("./pipeline-TZJ652NT.js");re&&(v.log("info","SCREENSHOT_UPLOAD_DRAIN","Draining screenshot upload queue before pipeline"),await it.settle(),await re.drain(),v.log("info","SCREENSHOT_UPLOAD_DRAINED","Screenshot upload queue drained"));let P=vt({session:v,env:_,auth:w,variables:H,variableIds:Yt,projectId:$.project_id,folderId:$.folder_id,totalSteps:Ae,totalDuration:B.duration??0,screenshotExtMap:re?.getExtMap(),codeExport:bt({codeExport:n.codeExport,codeLanguage:n.codeLanguage,skipCodeValidation:n.skipCodeValidation},a.code_export),onProgress:()=>{},log:(F,X,O,D)=>v.log(F,X,O,D),shouldUploadArtifacts:!n.local,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0,evidence:M?{executionId:M.executionId,packTestDir:M.packTestDir,sealedPackPath:M.packDir,sealFn:Be}:void 0}),U=new C(P),{renderUploadProgress:ae}=await import("./CliUploadProgress-62U3LAUU.js"),N=await ae(U,F=>{if(F.testcaseId&&F.shareId&&k)return Je(g.testManagerUiUrl,k,F.testcaseId,F.shareId)});if(N.success){N.testcaseId&&v.setTestcaseId(N.testcaseId);let F=null;try{let{persistRecordedSession:D}=await import("./persist-recorded-session-BW3YSFMP.js");F=await D(v,{testcaseId:v.testcaseId??void 0,projectId:$.project_id??void 0,folderId:$.folder_id??void 0,codeExportDir:N.codeExportDir,packTestDir:M?.packTestDir})}catch(D){v.log("error","DIRECT_PERSIST_ERROR","Persist failed in ink mode",{error:String(D)})}let X=N.testcaseId&&N.shareId&&k?Je(g.testManagerUiUrl,k,N.testcaseId,N.shareId):void 0,O=N.testcaseId&&k?co(g.testManagerUiUrl,k,N.testcaseId):void 0;if(X||O||N.codeExportDir||F){let{LinksBox:D}=await import("./LinksBox-EWCPAZFN.js"),{render:le}=await import("./build-JIKYOZUH.js"),be=await import("./react-QWOAB3TB.js"),{waitUntilExit:tn}=le(be.default.createElement(D,{recordedTestPath:F?.recordedTestPath,outputDir:F?.outputDir,shareableLink:X,testCaseLink:O,codeExportDir:N.codeExportDir}),{stdout:process.stderr});await tn()}}if(v.testId){let{renderFeedbackPrompt:F}=await import("./CliFeedbackPrompt-JZWESL7Z.js"),X=await F();if(X)try{await xo({tmsBaseUrl:g.tmsBaseUrl,username:w.basicAuth.username,accessKey:w.basicAuth.access_key,testId:v.testId,feedbackType:X,log:(O,D,le,be)=>v.log(O,D,le,be)})}catch(O){v.log("warn","FEEDBACK_FAILED","Feedback submission failed",{error:String(O)})}}}}catch(g){v.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 Hr=await Be({});if(M&&Hr?.sealed){let{offerEvidenceView:g}=await import("./evidence-AX67Q6RN.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:P=>process.stderr.write(P+`
|
|
90
|
+
`)})}await v.finish("complete"),B||b(st?2:1,"Run ended with no result");let lt=B.reason??"";(lt.includes("Cancel")||lt.includes("Timeout"))&&b(3,`Run: ${lt}`),B.status==="passed"&&b(0,"Run passed"),b(1,"Run failed")}catch(r){b(2,`CLI error: ${r instanceof Error?r.message:String(r)}`)}}),Ko(e),Jo(e),zo(e),Qo(e),Xo(e),e.addCommand(yr()),Ao(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(o,n)=>{if(o!=="skill"){console.error(`error: unknown install target '${o}'. Supported: skill`),b(2,`unknown install target '${o}'`);return}let{installSkill:r,formatInstallResult:s}=await import("./skill-installer-2MNPCPRD.js"),a=await r(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})+`
|
|
91
91
|
`):process.stderr.write(s(a)+`
|
|
92
|
-
`),b(a.status==="failed"?1:0,`install skill: ${a.status}`)}),e.command("profiles [action] [name]").option("--env <name>","Environment for switch/delete").action(async(o,n,r)=>{let s=new Z;if(o==="list"||!o&&!process.stdin.isTTY){let d=s.listProfiles();if(d.length===0){console.log("No profiles configured. Run: kane-cli login");return}let h=s.getActiveProfile(),p=s.getDefaultEnv();for(let m of d){let u=m.profile===h&&m.env===p?" (active)":"";console.log(`${m.profile} [${m.env}]${u}`)}return}if(o==="switch"&&n){let d=r?.env??s.getDefaultEnv();s.setActiveProfile(n),s.setDefaultEnv(d),Ge(s,new se,n,d),console.log(`Switched to ${n} [${d}]`);return}if(o==="delete"&&n){let d=r?.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-
|
|
92
|
+
`),b(a.status==="failed"?1:0,`install skill: ${a.status}`)}),e.command("profiles [action] [name]").option("--env <name>","Environment for switch/delete").action(async(o,n,r)=>{let s=new Z;if(o==="list"||!o&&!process.stdin.isTTY){let d=s.listProfiles();if(d.length===0){console.log("No profiles configured. Run: kane-cli login");return}let h=s.getActiveProfile(),p=s.getDefaultEnv();for(let m of d){let u=m.profile===h&&m.env===p?" (active)":"";console.log(`${m.profile} [${m.env}]${u}`)}return}if(o==="switch"&&n){let d=r?.env??s.getDefaultEnv();s.setActiveProfile(n),s.setDefaultEnv(d),Ge(s,new se,n,d),console.log(`Switched to ${n} [${d}]`);return}if(o==="delete"&&n){let d=r?.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-5FJNQMUW.js"),{render:l}=await import("./build-JIKYOZUH.js"),c=await import("./react-QWOAB3TB.js");await new Promise(d=>{let{unmount:h}=l(c.default.createElement(a,{creds:s,onSwitch:(p,m)=>{s.setActiveProfile(p),s.setDefaultEnv(m),console.log(`Switched to ${p} [${m}]`)},onCancel:()=>{h(),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 o=>{o.feedbackType!=="positive"&&o.feedbackType!=="negative"&&(console.error('Error: --feedback-type must be "positive" or "negative"'),b(1,'Invalid --feedback-type (must be "positive" or "negative")')),o.details&&o.details.length>500&&(console.error("Error: --details must be 500 characters or fewer"),b(1,"--details exceeds 500 character limit"));let n=new Z,r=o.env??n.getDefaultEnv(),s=Y(r),a,l;try{let c=await ge({creds:n,env:r,usernameFlag:o.username,accessKeyFlag:o.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"),h=await new c(s.tmsBaseUrl,a,l).submitFeedback({instruction_id:"",test_id:o.testId,feedback_type:o.feedbackType,details:o.details,mode:"agent"});console.log(JSON.stringify(h)),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 o=>{let n=new Z,r=o.env??n.getDefaultEnv(),s=Y(r),a=null;try{let l=await ge({creds:n,env:r,usernameFlag:o.username,accessKeyFlag:o.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 [${r}]. Run "kane-cli login" first.`),b(2,`Not authenticated for balance [${r}]`)}a||(console.error(`Could not resolve credentials [${r}]. Run "kane-cli login" again.`),b(2,`Could not resolve credentials for balance [${r}]`));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(o,n)=>{let r=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:h,parseFilesFlag:p}=await import("./generate-headless-DRDE46ON.js"),m=l({objective:o,refine:n.refine,save:n.save,req:n.req,out:n.out});if("error"in m){process.stderr.write(`error: ${m.error}
|
|
93
93
|
`),b(2,`generate: ${m.error}`);return}let u=m.op,x=p(n.files);if(u==="save"&&x){process.stderr.write(`error: --files is not valid with --save
|
|
94
|
-
`),b(2,"generate: --files not valid with --save");return}let{headless:_,mode:I}=a(n,!!process.stdin.isTTY);if(!_){let{runGenerate:w}=await import("./tcg-generate-
|
|
94
|
+
`),b(2,"generate: --files not valid with --save");return}let{headless:_,mode:I}=a(n,!!process.stdin.isTTY);if(!_){let{runGenerate:w}=await import("./tcg-generate-E5X23RVP.js");await w({objective:o,scenarioLimit:r,perScenarioLimit:s});return}let E=await d({mode:I,env:n.env,projectId:n.project,folderId:n.folder,username:n.username,accessKey:n.accessKey,name:n.name}),R=await h({op:u,objective:o,reqId:n.req,outDir:u==="save"?n.out?Gi(process.cwd(),n.out):c():void 0,suiteName:n.name,scenarioLimit:r,perScenarioLimit:s,memory:n.memory,files:x},E);b(R,"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 o=>{let{fetchChangelog:n,formatChangelog:r}=await import("./changelog-YQC2QDCO.js"),s=await n({all:o.all});console.log(r(s))}),e.addCommand(Yi()),e.parse(["node","kane-cli",...i])}function Yi(){let i=new je("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:o}=await import("./evidence-AX67Q6RN.js");process.exitCode=await o(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:o}=await import("./evidence-AX67Q6RN.js"),{CredentialsManager:n}=await import("./credentials-XCP6DJZZ.js"),r=t.env??new n().getDefaultEnv()??"prod";process.exitCode=await o(e,{port:t.port,viewerUrl:t.viewerUrl,env:r})}),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:o}=await import("./evidence-AX67Q6RN.js"),{CredentialsManager:n}=await import("./credentials-XCP6DJZZ.js"),r=t.env??new n().getDefaultEnv()??"prod";process.exitCode=await o(e,{runId:t.runId,out:t.out,rules:t.rules,onCollision:t.onCollision,title:t.title,finalize:t.finalize,json:t.json,env:r})}),i}function _r(i,e,t=50){let o=!1,n=(r,s)=>{if(!s)return;let a=r.line(s);a!=null&&e(a)};return{eager(){for(let r of i)r.promise.then(s=>{o||n(r,s)}).catch(()=>{})},async bounded(){let r=new Promise(a=>{setTimeout(()=>a(null),t).unref?.()}),s=await Promise.all(i.map(a=>Promise.race([a.promise.catch(()=>null),r])));o=!0,s.forEach((a,l)=>n(i[l],a))}}}function kr(i){let e,t,o,n=[];for(let r=0;r<i.length;r++){let s=i[r];if(s==="--code-export")e=!0;else if(s==="--skip-code-validation")o=!0;else if(s==="--no-skip-code-validation")o=!1;else if(s==="--code-language"){let a=i[r+1];a!==void 0&&(t=a,r++)}else s.startsWith("--code-language=")?t=s.slice(16):n.push(s)}return{codeExport:e,codeLanguage:t,skipCodeValidation:o,filteredArgs:n}}function Cr(i){return i[0]==="run"?!0:(i[0]==="testmd"||i[0]==="testrun")&&i[1]==="run"}function et(i,e){let t=i.split(".").map(n=>Number(n)||0),o=e.split(".").map(n=>Number(n)||0);for(let n=0;n<3;n++){let r=t[n]??0,s=o[n]??0;if(r<s)return-1;if(r>s)return 1}return 0}var Ki=[{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}}},{version:"0.5.1",description:"Assertions now read the DOM first (falling back to vision when the value isn't in the DOM). Default assertion mode is now 'dom'.",apply:i=>{let e=[];return i.assertion_mode==="visual"&&e.push({field:"assertion_mode",from:"visual",to:"dom",description:"Default assertion mode is now 'dom' (DOM-first, vision fallback)."}),{cfg:{...i,assertion_mode:"dom"},changes:e}}}];function xr(i,e=_e,t=Ki){let o=i.exists(),n=i.load();if(!o)return i.set("last_seen_version",e),{changes:[],fromVersion:e,toVersion:e,appliedVersions:[]};let r=n.last_seen_version||"0.0.0";if(et(r,e)>=0)return{changes:[],fromVersion:r,toVersion:r,appliedVersions:[]};let s=t.filter(h=>et(r,h.version)<0&&et(h.version,e)<=0).sort((h,p)=>et(h.version,p.version)),a=n,l=[],c=[];for(let h of s){let{cfg:p,changes:m}=h.apply(a);a=p,l.push(...m),c.push(h.version)}let d={...a,last_seen_version:e};return i.writeRaw(d),{changes:l,fromVersion:r,toVersion:e,appliedVersions:c}}function Sr(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(`
|
|
95
95
|
`)}var Nt=new Set(["balance","changelog","config","context","cover","design","evidence","feedback","folders","generate","help","install","login","logout","maintain","profiles","projects","run","sessions","setup","testmd","testrun","update","whoami"]);function Ji(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),o=new Array(e.length+1);for(let n=0;n<=e.length;n++)t[n]=n;for(let n=1;n<=i.length;n++){o[0]=n;for(let r=1;r<=e.length;r++){let s=i[n-1]===e[r-1]?0:1;o[r]=Math.min(t[r]+1,o[r-1]+1,t[r-1]+s)}[t,o]=[o,t]}return t[e.length]}function Er(i,e){let t=i.toLowerCase(),o=[...e],n=[];for(let r of o){let s=r.toLowerCase();s!==t&&s.startsWith(t)&&n.push({name:r,distance:0})}if(n.length===0)for(let r of o){let s=r.toLowerCase();if(s===t)continue;let a=Ji(t,s);a<=2&&n.push({name:r,distance:a})}return n.sort((r,s)=>r.distance-s.distance||r.name.localeCompare(s.name)),n.slice(0,3).map(r=>r.name)}function Ar(i,e){let t=e.length>0?` \u2014 did you mean ${e.map(o=>`'${o}'`).join(" or ")}?`:"";return`error: unknown command '${i}'${t}
|
|
96
96
|
|
|
97
97
|
Run an objective with: kane-cli run "<objective>"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as y}from"./chunk-
|
|
2
|
+
import{a as y}from"./chunk-7LFCSSPX.js";import"./chunk-KHU7C6EE.js";import"./chunk-NNZV5RCE.js";import"./chunk-SGU72YLH.js";import"./chunk-I2S6KNZW.js";import"./chunk-FXPPQL4D.js";import"./chunk-RE3BZVGE.js";import"./chunk-6PS65QFF.js";import"./chunk-JFAFKHDX.js";import"./chunk-FTD3B7QA.js";import"./chunk-QPZRHAYK.js";import"./chunk-VJUIW2ES.js";import"./chunk-YKTYVJBN.js";import"./chunk-Z56AWGVY.js";import"./chunk-427OQS2N.js";import{c as k}from"./chunk-ZKYYZ5NO.js";import"./chunk-RGEAEAZB.js";import{a as v}from"./chunk-BC7UVJJB.js";import"./chunk-KHDUQ33H.js";import"./chunk-L5LI2JF4.js";import"./chunk-D5T4ARTB.js";import"./chunk-AE6SS34N.js";import"./chunk-GIRXJOJI.js";import"./chunk-B2PZAB7J.js";import"./chunk-IACKIGPX.js";import"./chunk-E4OYR32M.js";import"./chunk-UR6MHSHU.js";async function j(t){let[{render:u},o,{QuestionBatchPrompt:p}]=await Promise.all([import("./build-JIKYOZUH.js"),import("./react-QWOAB3TB.js"),import("./ui-JEJGTURD.js")]),i=o.default??o;return new Promise(e=>{let m=u(i.createElement(p,{questions:t,onSubmit:a=>{m.unmount(),e(a)}}))})}async function q(t){let[{resolveAgentAuthEnv:u},{runAgent:o},{preflightTurn:p}]=await Promise.all([import("./spawner-XCOMTJJC.js"),import("./bridge-7UMWMIJJ.js"),import("./turn-preflight-JGYT7LXP.js")]),i=await u(),e=v(process.cwd()),{baseUrlAdvisory:m}=await import("./turn-preflight-JGYT7LXP.js"),a=m();a&&process.stderr.write(a+`
|
|
3
3
|
`);let d=await p(i);if(!d.ok)return process.stderr.write((d.message??"error: turn-endpoint preflight failed")+`
|
|
4
4
|
`),2;let T=async()=>d;if(t.plan)return y(t,{contextDir:e,agent:o,preflightTurn:T,ask:j,out:r=>process.stdout.write(r+`
|
|
5
5
|
`),progress:r=>process.stderr.write(r+`
|
|
6
6
|
`),isTTY:k(),auth:i});if(!t.resume){let[{openGraph:r},{designGate:s}]=await Promise.all([import("./readmodel-MPTENJ2R.js"),import("./gate-FACZRGOC.js")]),w=s(r(e),t.useCase,!!t.force);if(!w.ok)return process.stderr.write(`design: ${w.message}
|
|
7
|
-
`),w.code}let[{render:C},b,{ScrollbackProvider:A},{ChatSurface:D},{ScrollbackTap:E},{makeChatController:R},{setInkExit:S},G]=await Promise.all([import("./build-JIKYOZUH.js"),import("./react-QWOAB3TB.js"),import("./scrollback-JLPJR25X.js"),import("./ChatSurface-
|
|
7
|
+
`),w.code}let[{render:C},b,{ScrollbackProvider:A},{ChatSurface:D},{ScrollbackTap:E},{makeChatController:R},{setInkExit:S},G]=await Promise.all([import("./build-JIKYOZUH.js"),import("./react-QWOAB3TB.js"),import("./scrollback-JLPJR25X.js"),import("./ChatSurface-J777M5WC.js"),import("./ScrollbackTap-Q3IOKNMS.js"),import("./chat-controller-QXFAB2DK.js"),import("./exit-manager-VCSIUYBR.js"),Promise.all([import("./chat-committer-GHDZY5XF.js"),import("./descriptor-SL5A7RQE.js"),import("./explain-JIXUWEFJ.js"),import("./readmodel-MPTENJ2R.js")])]),[{commitChatTurn:I},{topologyDescriptor:O},{explain:Q},{openGraph:x}]=G,f=b.default??b,n=R({commitChatTurn:I,descriptor:O("design"),contextDir:e,refreshGraph:()=>x(e),graph:x(e),explain:Q,by:{kind:"human",id:"owner"}}),g={current:null},P=0,h=null,c=!1,Y=()=>{if(P+=1,P>=2){try{l.unmount()}catch{}process.exit(130)}n.requestPause(),h=setTimeout(()=>{c||(c=!0,(async()=>{n.ledger({kind:"interrupted",detail:"the agent did not confirm the pause within 5s"}),await g.current?.flush();try{l.unmount()}catch{}process.exit(130)})())},5e3)},l=C(f.createElement(A,null,f.createElement(E,{into:g}),f.createElement(D,{controller:n,verb:"design",onCtrlC:Y})),{exitOnCtrlC:!1});S(()=>l.unmount()),n.ledger({kind:"banner",text:`kane-cli design \xB7 ${t.useCase??t.resume??""}`});try{let r=y(t,{contextDir:e,agent:o,preflightTurn:T,ask:s=>n.ask(s),out:s=>n.note(s),progress:()=>{},isTTY:k(),auth:i,chat:n});return r.finally(()=>{c=!0}),await r}finally{c=!0,h&&clearTimeout(h),await g.current?.flush();try{l.unmount()}catch{}}}export{q as bindDesignInteractive};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a,b,c,d,e,f,g,h,i}from"./chunk-
|
|
2
|
+
import{a,b,c,d,e,f,g,h,i}from"./chunk-326XAPMW.js";import"./chunk-FPFOW6BS.js";import"./chunk-WAOCHXJ5.js";import"./chunk-M5JQXOCE.js";import"./chunk-2WVKOZ6W.js";import"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import"./chunk-RLG5NUTE.js";import"./chunk-TZZYRDCF.js";import"./chunk-E4OYR32M.js";import"./chunk-UR6MHSHU.js";export{d as emitNdjson,b as filterByName,g as formatAuthResolutionError,c as paginate,a as parsePagination,i as registerListCommands,e as renderTable,f as resolveTmsBasicAuth,h as validateCreateName};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a}from"./chunk-2TVRHXRK.js";import"./chunk-SL7AJ7JQ.js";import"./chunk-RFHMDQXZ.js";import"./chunk-RZ4F3BHX.js";import"./chunk-RLG5NUTE.js";import"./chunk-TZZYRDCF.js";import"./chunk-E4OYR32M.js";import"./chunk-UR6MHSHU.js";export{a as LoginFlow};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{g as h}from"./chunk-LMJTY32X.js";import{a as m,b as I,k as S,s as _}from"./chunk-RKWJG3WW.js";import{a as f}from"./chunk-
|
|
2
|
+
import{g as h}from"./chunk-LMJTY32X.js";import{a as m,b as I,k as S,s as _}from"./chunk-RKWJG3WW.js";import{a as f}from"./chunk-XBE7PGVY.js";import"./chunk-NFOBDHZK.js";import"./chunk-L5LI2JF4.js";import"./chunk-E4OYR32M.js";import"./chunk-UR6MHSHU.js";async function v(e,s={}){e.flushRecorder();let o=e.recorder?.lastWrittenPath??null;if(!o)return e.log("info","PERSIST_SKIPPED","No recorded path \u2014 recorder.flush no-op",{reason:e.sessionName?"recorder_flush_failed":"no_session_name",session_name:e.sessionName}),null;let p;try{p=_(o)}catch(t){throw e.log("error","PERSIST_RESOLVE_FAILED","resolveTestMd threw",{error:t.message,recorded_path:o}),t}let i=e.getRunsAsStepRecords(),u=e.getFlows(),a=[],c=0;for(let t=0;t<i.length;t++){let r=i[t],l=u.slice(c,c+r.totalRunDirs);c+=r.totalRunDirs;let g=l.find(n=>n.status==="failed"||n.status==="error"),T=g?"failed":l.length===0?"skipped":"passed";a.push({rootStepIndex:t+1,status:T,duration_s:l.reduce((n,E)=>n+(E.duration??0),0),reason:g?.reason})}let P=a.some(t=>t.status==="failed")?"failed":"passed",D=new f().load().code_export?.language==="javascript"?"javascript":"python",d=I(o);e.log("info","PERSIST_START","Building staging dir",{recorded_path:o,output_dir:d,session_dir:e.sessionDir,step_count:i.length,flow_count:u.length});try{await h({resolvedTest:p,sessionDir:e.sessionDir,stepRunRecords:i,outcomes:a,overallStatus:P,startedISO:e.startedAt,durationS:a.reduce((t,r)=>t+(r.duration_s??0),0),sessionId:e.sessionId,commitId:e.sessionId,tmsIds:{testId:e.testId??void 0,testcaseId:s.testcaseId,projectId:s.projectId,folderId:s.folderId,orgId:s.orgId??e.orgId??void 0,sessionName:e.sessionName??m(o)},codeExportDir:s.codeExportDir,codeExportLanguage:D,packTestDir:s.packTestDir}),e.log("info","PERSIST_STAGING_OK","Staging dir built",{output_dir:d}),S(d),e.log("info","PERSIST_OK","Persist complete",{output_dir:d})}catch(t){let r=t;e.log("error","PERSIST_FAILED","staging build / atomic replace failed",{error:r.message,stack:r.stack,output_dir:d}),process.stderr.write(`[persist] staging build / atomic replace failed: ${r.message}
|
|
3
3
|
`)}return{recordedTestPath:o,outputDir:d}}export{v as persistRecordedSession};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a,b,c}from"./chunk-GIGD4M7V.js";import"./chunk-2YQ6TW77.js";import"./chunk-WAOCHXJ5.js";import"./chunk-
|
|
2
|
+
import{a,b,c}from"./chunk-GIGD4M7V.js";import"./chunk-2YQ6TW77.js";import"./chunk-WAOCHXJ5.js";import"./chunk-OE7TVGNB.js";import"./chunk-FYOCF7DY.js";import"./chunk-RGEAEAZB.js";import"./chunk-BC7UVJJB.js";import"./chunk-KHDUQ33H.js";import"./chunk-NFOBDHZK.js";import"./chunk-L5LI2JF4.js";import"./chunk-D5T4ARTB.js";import"./chunk-AE6SS34N.js";import"./chunk-GIRXJOJI.js";import"./chunk-B2PZAB7J.js";import"./chunk-IACKIGPX.js";import"./chunk-2WVKOZ6W.js";import"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import"./chunk-RLG5NUTE.js";import"./chunk-E4OYR32M.js";import"./chunk-UR6MHSHU.js";export{c as UploadPipeline,b as packPresignEntry,a as readPackForUpload};
|