@testmuai/kane-cli 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ChromeProfilePicker-U2SEKNEQ.js → ChromeProfilePicker-HGRJNQDM.js} +1 -1
- package/dist/{CliFeedbackPrompt-EADRWA76.js → CliFeedbackPrompt-JXEPBJ63.js} +1 -1
- package/dist/{CliUploadProgress-DV34KLES.js → CliUploadProgress-L5VJUXUC.js} +1 -1
- package/dist/{ConfigView-32U22T7S.js → ConfigView-LOEAT3HQ.js} +1 -1
- package/dist/FolderPicker-I6JTRNAU.js +2 -0
- package/dist/{HelpView-PUE5XHCB.js → HelpView-UEUKYHFR.js} +1 -1
- package/dist/{InfoBox-QNOWEKMD.js → InfoBox-MK7EEGCH.js} +1 -1
- package/dist/{LinksBox-UCNEPFJD.js → LinksBox-RSWQWL6G.js} +1 -1
- package/dist/{ProfilesView-P6JL2BTH.js → ProfilesView-KCOMTDR5.js} +1 -1
- package/dist/ProjectPicker-AX6H5MX3.js +2 -0
- package/dist/{SaveSessionPrompt-DIZX3M6X.js → SaveSessionPrompt-RGL3LAEB.js} +1 -1
- package/dist/SingleShotApp-YTFAGVZD.js +2 -0
- package/dist/{SummaryBox-72NGQYS7.js → SummaryBox-5YPKUIHB.js} +1 -1
- package/dist/{TestMdRunView-DD6YI7CY.js → TestMdRunView-QS7IUANM.js} +1 -1
- package/dist/{WhoamiView-LSMM65UI.js → WhoamiView-GL3HZQ4Q.js} +1 -1
- package/dist/{changelog-P7XOVZ6M.js → changelog-CLQ7HCB3.js} +1 -1
- package/dist/{chunk-CFFWCE27.js → chunk-34DK2AUH.js} +1 -1
- package/dist/{chunk-JYQO6G7F.js → chunk-3ELBJPHQ.js} +1 -1
- package/dist/{chunk-75SVKFKD.js → chunk-3QD3LA72.js} +1 -1
- package/dist/{chunk-66CVM7JL.js → chunk-BM4COXQU.js} +1 -1
- package/dist/{chunk-OU2XDMNW.js → chunk-BQKDPI6L.js} +1 -1
- package/dist/{chunk-Y5RLPELZ.js → chunk-BR2S57O2.js} +1 -1
- package/dist/{chunk-7VX5H5MK.js → chunk-DUR6AFYA.js} +1 -1
- package/dist/{chunk-YV5KDJLP.js → chunk-F6HEB4PA.js} +1 -1
- package/dist/{chunk-BSQVYLV7.js → chunk-HJ3CHMEM.js} +1 -1
- package/dist/{chunk-QV2VR72Q.js → chunk-K7MSPKEM.js} +1 -1
- package/dist/{chunk-BAKBO5YA.js → chunk-KULEBWMB.js} +1 -1
- package/dist/{chunk-FJ6L63SP.js → chunk-KVDOQY2Q.js} +1 -1
- package/dist/{chunk-MBQIYYLD.js → chunk-L4GAZTAQ.js} +1 -1
- package/dist/{chunk-XW32PCGX.js → chunk-L4OZRHUT.js} +1 -1
- package/dist/{chunk-445V6RTR.js → chunk-MEB2KLWF.js} +1 -1
- package/dist/{chunk-5KH7U63E.js → chunk-NOH6RERF.js} +1 -1
- package/dist/{chunk-PINXGH2T.js → chunk-NZSHFIZX.js} +2 -2
- package/dist/{chunk-Q6INY5JA.js → chunk-QO6VFDI4.js} +1 -1
- package/dist/{chunk-MH26PIS4.js → chunk-RXMOIIQD.js} +1 -1
- package/dist/{chunk-XJ7OYQ7M.js → chunk-THNGNS36.js} +1 -1
- package/dist/{chunk-NLYBR5FP.js → chunk-TK7ZJ7YX.js} +1 -1
- package/dist/{chunk-OMYNAZW4.js → chunk-VUBZQUP4.js} +1 -1
- package/dist/{chunk-MNAVXLW4.js → chunk-WAFO4MT4.js} +1 -1
- package/dist/{chunk-JPKW7SRP.js → chunk-XMK4GYI7.js} +1 -1
- package/dist/{chunk-I4AD2L5R.js → chunk-XP5SMOND.js} +1 -1
- package/dist/{chunk-G7I7EAV6.js → chunk-ZLQ7YLXO.js} +1 -1
- package/dist/{chunk-4SNZTVJB.js → chunk-ZX3PMRMO.js} +1 -1
- package/dist/index.js +7 -7
- package/dist/{logging-NPMKABVV.js → logging-GG23EW5G.js} +1 -1
- package/dist/{login-flow-QCYF5347.js → login-flow-ZUZUZIXD.js} +1 -1
- package/dist/{persist-recorded-session-53YCJK7U.js → persist-recorded-session-ZXKA4H7E.js} +1 -1
- package/dist/{recording-banner-ABFX6FI4.js → recording-banner-IDLY2FM6.js} +1 -1
- package/dist/{run-test-md-C63UB65T.js → run-test-md-UPAR3DQY.js} +6 -6
- package/dist/{testmd-actions-GPYFEL7F.js → testmd-actions-YYFFNNIH.js} +2 -2
- package/dist/{validate-basic-TW5CQAL3.js → validate-basic-27BIMJ2F.js} +1 -1
- package/dist/{version-check-6XDFGFCG.js → version-check-6DXFF6IN.js} +1 -1
- package/package.json +5 -5
- package/dist/FolderPicker-C4ANRIT7.js +0 -2
- package/dist/ProjectPicker-XEZIFGJ6.js +0 -2
- package/dist/SingleShotApp-RLZN2PVQ.js +0 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as ce,b as zt}from"./chunk-C5UNZ6ZY.js";import{a as Ht}from"./chunk-
|
|
2
|
+
import{a as ce,b as zt}from"./chunk-C5UNZ6ZY.js";import{a as Ht}from"./chunk-NOH6RERF.js";import{a as Ge}from"./chunk-GTFULP6B.js";import{A as Mt,B as Bt,C as qt,a as pt,b as ft,f as bt,g as Me,h as $e,i as yt,j as St,k as vt,l as Re,m as kt,n as It,o as Ct,p as _t,q as Et,r as At,s as Tt,t as He,u as jt,v as Ke,w as Dt,x as Lt,y as Ut,z as Nt}from"./chunk-WAFO4MT4.js";import{b as Ne}from"./chunk-DUR6AFYA.js";import{d as Ye,e as $t,f as Vt}from"./chunk-F6HEB4PA.js";import{a as Rt}from"./chunk-L2HVRWIT.js";import"./chunk-MDBXYXSC.js";import{c as wt}from"./chunk-S3DAAAE5.js";import{a as Ve,b as qe,c as ze}from"./chunk-FFO5XXKV.js";import{a as ye,b as xt,c as Pt,e as Ot,f as Be,i as Ft}from"./chunk-SLA75N5B.js";import{b as ut}from"./chunk-BM4COXQU.js";import{a as gt,c as Ue,d as Z,e as W}from"./chunk-G7VF5SDK.js";import{a as mt}from"./chunk-KVDOQY2Q.js";import"./chunk-VE3SUJMA.js";import{a as dt}from"./chunk-K7MSPKEM.js";import{a as Q}from"./chunk-TK7ZJ7YX.js";import"./chunk-PWGEMRBD.js";import{a as ht}from"./chunk-L5Y2GUO6.js";import"./chunk-E47GFYXA.js";import{c as Le,h as re}from"./chunk-3ELBJPHQ.js";import"./chunk-YUUZDFT7.js";import"./chunk-DXKKUGFG.js";import"./chunk-UR6MHSHU.js";import{resolve as Ur,join as ke,basename as Nr}from"path";import{existsSync as Xe,readFileSync as Mr}from"fs";import{readFileSync as Er,existsSync as Ar}from"fs";import{basename as Kt,dirname as xr,isAbsolute as Pr,resolve as Gt}from"path";var Yt=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"],ne=class extends Error{constructor(t){super(t),this.name="TestMdResolveError"}};function Zt(e){let t=Gt(e),r=Wt(t),i=Or(r.global),o=[];return Jt(r,[],o,[],t),o.forEach((n,R)=>n.flatIndex=R+1),{rootPath:t,rootTitle:r.title,rootGlobal:r.global,rootSteps:r.steps,chrome:i,steps:o}}function Wt(e){if(!Ar(e))throw new ne(`@import path not found: ${e}`);let t=Er(e,"utf8");return jt(e,t)}function Jt(e,t,r,i,o){if(t.includes(e.path)){let n=[...t,e.path].map(R=>Kt(R)).join(" \u2192 ");throw new ne(`cyclic reference: ${n}`)}t.push(e.path);let p=i.length===0;for(let n of e.steps){let R=n.body.kind!=="objective";if(n.optional&&R&&!p)throw new ne(`intermediate-ref 'optional' is not supported in v1: ${e.path}:${n.headingLine}`);let l={file:e.path,stepIndex:n.index,heading:n.heading,optional:n.optional??!1};if(n.body.kind==="objective"){let O=Fr(e.global,n.config);r.push({flatIndex:0,objective:n.body.text,sourceFile:e.path,trace:[...i,l],config:O,parsedConfig:n.config,optional:n.optional??!1});continue}let y=xr(e.path),v=Pr(n.body.path)?n.body.path:Gt(y,n.body.path);if(Kt(v).endsWith("_test.md"))throw new ne(`cannot @import a test file: only helpers may be imported (got ${v})`);let k=Wt(v);Jt(k,t,r,[...i,l],o)}t.pop()}function Or(e){let t={};for(let r of Yt)e[r]!==void 0&&(t[r]=e[r]);return t}function Fr(e,t){let r={};for(let[i,o]of Object.entries(e))Yt.includes(i)||(r[i]=o);return{...r,...t??{}}}import{existsSync as Ze}from"fs";import{join as Se,basename as Qt}from"path";function Xt(e,t){if(!t||!Ze(t))return e.steps.map(()=>({kind:"author",reason:"no-result-md"}));let r=qe(t),i=[],o=new Set,p=new Map;function n(l){let y=He(l),v=Se(y,"Result.md");if(p.has(v))return p.get(v);let k=Ze(v)?qe(v):null;return p.set(v,k),k}function R(l){for(let y=1;y<l.trace.length;y++){let k=l.trace[y-1].file===e.rootPath?r:n(l.trace.slice(0,y));if(!k)return{kind:"author",reason:"no-result-md"};let O=l.trace[y-1].stepIndex,f=k.steps[O-1];if(!f)return{kind:"author",reason:"no-result-md"};if(f.kind!=="import")return{kind:"author",reason:"structure-mismatch"};let C=Qt(f.importPath),w=Qt(l.trace[y].file);if(C!==w)return{kind:"author",reason:"structure-mismatch"};if(f.status!=="passed")return{kind:"author",reason:"recorded-failed"}}return null}for(let l of e.steps){let y=l.trace[l.trace.length-1].file,v=l.trace[l.trace.length-1].stepIndex,k=o.has(y);for(let w=0;w<l.trace.length-1&&!k;w++)o.has(l.trace[w].file)&&(k=!0);if(k){i.push({kind:"author",reason:"downstream-of-divergence"});continue}let O=R(l);if(O){i.push(O);for(let w=0;w<l.trace.length;w++)o.add(l.trace[w].file);continue}let f=y===e.rootPath?r:n(l.trace),C=Tr(l,f,v);if(i.push(C),C.kind==="author"){o.add(y);for(let w=0;w<l.trace.length-1;w++)o.add(l.trace[w].file)}}return i}function Tr(e,t,r){if(!t)return{kind:"author",reason:"no-result-md"};let i=t.steps[r-1];if(!i)return{kind:"author",reason:"no-result-md"};if(i.kind!=="objective")return{kind:"author",reason:"structure-mismatch"};if(i.status!=="passed")return{kind:"author",reason:"recorded-failed"};let o=Tt(e);if(o!==i.md5)return{kind:"author",reason:"md5-mismatch"};let p=e.trace.length===1?Ft(e.trace[0].file,r,o.slice(0,8)):Se(He(e.trace),".internal","steps",`${r}-${o.slice(0,8)}`),n=Se(p,"flows","0","actions.ndjson");return Ze(n)?{kind:"replay",recordingDir:p}:{kind:"author",reason:"missing-recording"}}function er(e){return e.some(t=>t.kind==="author")}function we(e){for(let t=0;t<e.length;t++)if(e[t].kind==="author")return t;return e.length}function tr(e){return Se(e.recordingDir,"flows","0","actions.ndjson")}function rr(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let i=e.steps[r],o=t[r],p=" ".repeat(i.trace.length-1),n=`step ${i.flatIndex}`;o.kind==="replay"?process.stderr.write(`[replay-trace] ${p}${n}: REPLAY (would skip; v1 always authors)
|
|
3
3
|
`):process.stderr.write(`[replay-trace] ${p}${n}: AUTHOR (${o.reason})
|
|
4
4
|
`)}}function oe(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function nr(e,t){let r=e===0?"(none)":`0..${e-1}`,i=e>=t?"(none)":`${e}..${t-1}`;oe(`[replay-trace] phase: replay ${r}, author ${i}
|
|
5
5
|
`)}function or(e,t){oe(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
|
|
@@ -19,9 +19,9 @@ import{a as ce,b as zt}from"./chunk-C5UNZ6ZY.js";import{a as Ht}from"./chunk-5KH
|
|
|
19
19
|
\u2022 Run 'kane-cli login --username <user> --access-key <key>'
|
|
20
20
|
`):s instanceof Ye&&s.code==="refresh_failed"?process.stderr.write(`error: Token refresh failed. Run 'kane-cli login' to re-authenticate.
|
|
21
21
|
`):process.stderr.write(`error: auth resolution failed: ${s.message}
|
|
22
|
-
`),2}let J=String(u.resolvedCreds?.org_id??"");if(!J)return process.stderr.write("error: TMS did not return an org_id. Run `kane-cli login` again.\n"),2;{let{readMetaIfExists:s,assertOrgMatchOrExit:c}=await import("./testmd-actions-
|
|
22
|
+
`),2}let J=String(u.resolvedCreds?.org_id??"");if(!J)return process.stderr.write("error: TMS did not return an org_id. Run `kane-cli login` again.\n"),2;{let{readMetaIfExists:s,assertOrgMatchOrExit:c}=await import("./testmd-actions-YYFFNNIH.js"),d=c(s(r),J);if(d!==null)return d}let a=new ut,h=await qr(r,n,t,{resolvedAuth:u,tmsBaseUrl:C.tmsBaseUrl},a.sessionId);if(h.abort)return h.abort.exitCode;let F=h.lockAcquired,$=!1,q=!1,ue=!1;if(F&&p({type:"test_md_lock_state",phase:"acquired",scope:"preemptive"}),a.start({model:w,environment:f,profile:k}),a.setRecordingEnabled(!1),t.name){try{wt(t.name)}catch(s){return process.stderr.write(`error: ${s.message}
|
|
23
23
|
`),2}a.setSessionName(t.name)}let Ee={};for(let[s,c]of Object.entries(n.rootGlobal))Ie.includes(s)||(Ee[s]=c);for(let[s,c]of Object.entries(R))Ie.includes(s)||c!==void 0&&(Ee[s]=c);let B={...n.chrome};for(let s of Ie){let c=R[s];c!==void 0&&(B[s]=c)}let mr={...Ee,...B};a.setResolvedGlobal(mr);let K;try{K=await Bt({config:{chrome_profile_path:B.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:re,headless:B.headless??!1,wsEndpoint:B.ws_endpoint,cdpEndpoint:B.cdp_endpoint})}catch(s){return process.stderr.write(`error: Chrome launch failed: ${s.message}
|
|
24
|
-
`),await a.finish("complete"),2}let pe=K.instance;pe&&Z("chrome",()=>{try{pe.kill()}catch{}});let j=null,et=K.cdpEndpoint??B.cdp_endpoint;if(et&&!B.ws_endpoint&&!B.headless)try{j=bt({headless:B.headless??!1,cdpEndpoint:et,chromePid:pe?.process.pid}),j&&Z("marker-overlay",()=>j.kill())}catch(s){a.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(s)})}if(u.resolvedCreds?.org_id!==void 0&&a.setOrgId(String(u.resolvedCreds.org_id)),u.resolvedCreds)try{let{createRemoteLogger:s}=await import("./logging-
|
|
24
|
+
`),await a.finish("complete"),2}let pe=K.instance;pe&&Z("chrome",()=>{try{pe.kill()}catch{}});let j=null,et=K.cdpEndpoint??B.cdp_endpoint;if(et&&!B.ws_endpoint&&!B.headless)try{j=bt({headless:B.headless??!1,cdpEndpoint:et,chromePid:pe?.process.pid}),j&&Z("marker-overlay",()=>j.kill())}catch(s){a.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(s)})}if(u.resolvedCreds?.org_id!==void 0&&a.setOrgId(String(u.resolvedCreds.org_id)),u.resolvedCreds)try{let{createRemoteLogger:s}=await import("./logging-GG23EW5G.js"),{getMachineId:c}=await import("./machine-id-DZN4MYOO.js"),d=s({sessionId:a.sessionId,identity:{org_id:String(u.resolvedCreds.org_id??""),user_id:String(u.resolvedCreds.user_id??""),machine_id:c(),email:u.resolvedCreds.email??null,email_domain:u.resolvedCreds.email_domain??"unknown",user_type:u.resolvedCreds.user_type??"unknown",env:f},getToken:async()=>u.token});a.setRemoteLogger(d),d.start(),Z("remote-logger",()=>d.shutdownSync()),gt(d)}catch(s){process.stderr.write(`warn: remote logger init failed: ${s.message}
|
|
25
25
|
`)}let X=_t({objective:"",globalDir:ke(Le,"variables"),localDir:ke(process.cwd(),".testmuai","variables"),file:t.variablesFile,inline:t.variables}),hr=n.rootGlobal.variables??{},L=Br(X.raw,hr);a.setAuteurVariables(L.auteur);let tt=Me(ke(Le,"global-memory.md"))??void 0,rt=Me(ke(process.cwd(),".testmuai","context.md"))??void 0,nt=l.getActiveProfile()??"default",ot=l.getDefaultEnv(),{rehydrateIfStale:gr}=await import("./profile-sync-DTTRRIVP.js");gr(l,y,nt,ot);let U=y.load(),N=U.project_id??null,fe=U.folder_id??null;if(!t.local&&!N&&u.basicAuth)try{let s=await qt({creds:l,config:y,profile:nt,env:ot,tmsCreds:u.basicAuth,log:(c,d,m,b)=>a.log(c,d,m,b)});N=s.projectId,fe=s.folderId,U=y.load(),process.stderr.write(`info: using project '${s.projectName}' / folder '${s.folderName}' (auto-configured)
|
|
26
26
|
`)}catch(s){process.stderr.write(`warn: could not auto-configure project/folder: ${s.message}
|
|
27
27
|
KaneAI upload will be skipped for this run.
|
|
@@ -36,9 +36,9 @@ import{a as ce,b as zt}from"./chunk-C5UNZ6ZY.js";import{a as Ht}from"./chunk-5KH
|
|
|
36
36
|
`),S.type==="step_event"&&S.event==="reasoning"?j?.setStepText(S.detail):S.type==="step_end"&&(S.status==="passed"&&j?.setStepComplete(),ae&&ae(S.index,0,S.child_id)),S.type==="run_end"){E=S;break}if(S.type==="error"){P=S.message??"runner error";break}}try{M.cancel()}catch{}if(!E&&!P){let{code:S}=await M.exited;S!==0&&(P=`runner exited with code ${S}`)}}finally{j?.setRunActive(!1),W("runner","Replay step complete")}}catch(M){P=M.message}if(o)return{failedAt:c,cancelled:!0};let H=Math.round((Date.now()-T)/1e3),z=Te(c,b,E,null,P,H);a.recordStepRun({testmdStepIndex:n.steps[c].flatIndex,runIndex:b,totalRunDirs:1});let V=!!P||E?.status==="failed";if(or(c,V?"failed":"ok"),V||!z)return{failedAt:c,cancelled:!1}}return{failedAt:null,cancelled:!1}}let lt=async()=>{if(F)return!0;if(!h.testId||!h.fromCommitId||!u.basicAuth)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
|
|
37
37
|
`),!1;let s=a.sessionId,c=t.onLockConflict??n.rootGlobal.on_lock_conflict??"readonly",d=await fr({tmsBaseUrl:C.tmsBaseUrl,testId:h.testId,fromCommitId:h.fromCommitId,newCommitId:s,basicAuth:u.basicAuth,onLockConflict:c});return d==="ok"?(F=!0,h.newCommitId=s,a.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:h.testId}),i&&p({type:"test_md_lock_state",phase:"acquired",scope:"mid_run"}),Je({baseUrl:Ce(C.tmsBaseUrl),testId:h.testId,auth:_e(u.basicAuth)}),!0):(a.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:d}),i&&p({type:"test_md_lock_state",phase:"conflict",scope:"mid_run",reason:d}),process.stderr.write(`error: mid-run lock acquisition failed (${d})
|
|
38
38
|
`),!1)};if(i){let{authorBoundary:s,cancelledInPhase:c,shrinkCount:d}=await cr({decisions:h.decisions,hasRetry:t.retry===!0||t.retryCount!==void 0,maxShrinks:t.retryCount!==void 0?parseInt(t.retryCount,10):ce.maxShrinks,runReplayPhase:Sr,session:a,accumulator:Y,acquireLockIfNeeded:lt});if(ue=d>0,d>0&&(a.log("info","RETRY_TRIGGERED","Retry loop triggered",{shrink_count:d,final_author_boundary:s}),p({type:"test_md_retry_attempt",shrink_count:d,final_author_boundary:s,complete_reauthor:s===0})),s===0&&d>0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:d}),!c&&s>=0)for(let m=s;m<n.steps.length;m++){let b=n.steps[m];if(!Y.shouldRunFlatStep(b))continue;at(m),$=!0;let g=a.nextRunIndex();he=g,await Pe(de(X.raw,b.config.variables,b.objective).variables);let _=it(m,g),I=Date.now(),T=null,E=null,P=null,H=!1,z=0;try{let S=Ne(_,{environment:f});Z("runner",()=>{Ue()&&(o=!0);try{S.cancel()}catch{}}),j?.setRunActive(!0);try{for await(let A of S.events){if(process.stdout.write(JSON.stringify(A)+`
|
|
39
|
-
`),A.type==="bifurcation"){let le=A.count??A.flows?.length??0;(A.is_single_flow??le<=1)||(P=A.flows??null,H=!0,z=0)}else if(A.type==="run_start"&&H)z++;else if(A.type==="step_event"&&A.event==="reasoning")j?.setStepText(A.detail);else if(A.type==="step_end"&&(A.status==="passed"&&j?.setStepComplete(),ae)){let le=H?Math.max(0,z-1):0;ae(A.index,le,A.child_id)}if(A.type==="run_end"){T=A;break}if(A.type==="error"){E=A.message??"runner error";break}}try{S.cancel()}catch{}}finally{j?.setRunActive(!1),W("runner","Step complete")}}catch(S){E=S.message}let V=Math.round((Date.now()-I)/1e3),M=Te(m,g,T,P,E,V);if(a.recordStepRun({testmdStepIndex:n.steps[m].flatIndex,runIndex:g,totalRunDirs:T?.total_runs??1}),!M||o)break}}else{let{default:s}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{TestMdRunView:d}=await import("./TestMdRunView-
|
|
39
|
+
`),A.type==="bifurcation"){let le=A.count??A.flows?.length??0;(A.is_single_flow??le<=1)||(P=A.flows??null,H=!0,z=0)}else if(A.type==="run_start"&&H)z++;else if(A.type==="step_event"&&A.event==="reasoning")j?.setStepText(A.detail);else if(A.type==="step_end"&&(A.status==="passed"&&j?.setStepComplete(),ae)){let le=H?Math.max(0,z-1):0;ae(A.index,le,A.child_id)}if(A.type==="run_end"){T=A;break}if(A.type==="error"){E=A.message??"runner error";break}}try{S.cancel()}catch{}}finally{j?.setRunActive(!1),W("runner","Step complete")}}catch(S){E=S.message}let V=Math.round((Date.now()-I)/1e3),M=Te(m,g,T,P,E,V);if(a.recordStepRun({testmdStepIndex:n.steps[m].flatIndex,runIndex:g,totalRunDirs:T?.total_runs??1}),!M||o)break}}else{let{default:s}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{TestMdRunView:d}=await import("./TestMdRunView-QS7IUANM.js"),{effectiveDecisions:m}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:b}=await import("./replay-policy-6USQBT3E.js"),g=t.retry===!0||t.retryCount!==void 0,_=t.retryCount!==void 0?parseInt(t.retryCount,10):ce.maxShrinks,I=t.author===!0;I&&(ar(),a.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let T=I?0:we(h.decisions),E=0,P=null,H=h.decisions.filter(S=>S.kind==="replay").length,z=h.decisions.length-H,V=[];t.push&&V.push("--push"),g&&V.push("--retry"),t.retryCount!==void 0&&V.push(`--retry-count=${t.retryCount}`),I&&V.push("--author");let M={source:r,steps:{total:h.decisions.length,replay:H,author:z},model:w,viewport:{width:U.window_size.width,height:U.window_size.height},chrome:K.cdpEndpoint??K.wsEndpoint??"managed",session:a.sessionName??"ephemeral",variables:{count:Object.keys(L.raw).length,secrets:Object.values(L.raw).filter(S=>S.secret).length,names:Object.keys(L.raw)},flags:V,mode:R.mode??"testing"};for(;;){let S=a.snapshot(),A=Y.snapshot(),le=m(h.decisions,T,I);if(E>=1){let x=T===0?`\u21BB Complete re-author \u2014 retry budget exhausted (${E}/${_})`:`\u21BB Retry ${E}/${_} \u2014 replay 0..${T-1}, author ${T}..${h.decisions.length-1}
|
|
40
40
|
reason: replay miss at step ${(P??0)+1}`;process.stderr.write(x+`
|
|
41
|
-
`)}let kr=E>=1&&T>0&&P!==null?{startIdx:0,endIdx:P,count:P}:void 0;j?.setRunActive(!0);let ge=await Kr({decisions:le,resolved:n,session:a,accumulator:Y,tuiConfig:U,globalConfig:M,buildStepConfigAt:it,buildReplayConfig:x=>{let G=h.decisions[x];if(G.kind!=="replay")throw new Error("expected replay decision at index "+x);return We({step:n.steps[x],decision:G,chrome:K,auth:u,sessionId:a.sessionId,runIndex:a.nextRunIndex(),sessionDir:a.sessionDir,windowSize:{width:U.window_size.width,height:U.window_size.height},forceNavigateUrl:x===0?re:void 0,sessionContext:a.getContext()})},onAnyAuthorStep:()=>{$=!0},onCancel:()=>{q=!0},topBannerModel:w,topBannerAuth:`${l.getActiveProfile()??"no profile"}/${f}`,spawnOpts:{environment:f,mode:R.mode??"testing",log:(x,G,be,De)=>a.log(x,G,be,De)},priorAttemptRollup:kr,pushStepLevelDelta:(x,G)=>Pe(de(X.raw,x,G).variables),onSequencerStepEnd:(x,G,be,De)=>{let Ir=Math.round((Date.now()-De)/1e3),Cr=x.hadError?x.reason??"runner error":null,_r=Te(G,be,x.runEnd,x.bifurcationFlows??null,Cr,Ir);return a.recordStepRun({testmdStepIndex:n.steps[G].flatIndex,runIndex:be,totalRunDirs:x.runEnd?.total_runs??x.bifurcationFlows?.length??1}),_r},screenshotDispatcher:ae,onReasoning:x=>j?.setStepText(x),onStepComplete:()=>j?.setStepComplete(),onSpawnStart:x=>{he=x}});if(j?.setRunActive(!1),ge.cancelled){W("marker-overlay","user cancelled run"),W("chrome","user cancelled run");break}if(ge.failedAt===null)break;let je=b({failedAt:ge.failedAt,shrinkCount:E,hasRetry:g,maxShrinks:_});if(je.kind==="fail"||!F&&!await lt())break;a.rollback(S),Y.rollback(A),je.kind==="complete-reauthor"?T=0:T=je.newAuthorBoundary,E++,ue=!0,a.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:E,failed_at:P}),T===0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:E}),P=ge.failedAt}}let D=Y.finalize(),ee=Math.round((Date.now()-Rr)/1e3),wr={session:a,resolvedAuth:u,chromeResult:K,chromeInstance:pe??null,testId:a.testId??null,preparedVariables:L,variableIds:me,globalContext:tt,localContext:rt,tuiConfig:U,env:f,localMode:!!t.local},te=await ur(wr,{performUpload:async()=>{if(!u.basicAuth)return null;let s=Q(f),c=($||t.push===!0)&&!q,d=(F||h.isFirstRun)&&!q&&D.overallStatus==="passed",m=ie&&(F||h.isFirstRun);a.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:ie,shouldUploadPipeline:m,shouldReplaceLocalOutput:c,shouldCommit:d,lockHeld:F,anyAuthorStepRan:$,cancelled:q,overallStatus:D.overallStatus});let b=Ut({session:a,env:f,auth:u,variables:L,variableIds:me,projectId:N,folderId:fe,totalSteps:D.outcomes.length,totalDuration:ee,codeExport:Nt({codeExport:t.codeExport,codeLanguage:t.codeLanguage,skipCodeValidation:t.skipCodeValidation},U.code_export),onProgress:()=>{},log:(I,T,E,P)=>a.log(I,T,E,P),shouldUploadArtifacts:m,shouldReplaceLocalOutput:c,shouldCommit:d,isFirstRun:h.isFirstRun,resolvedTest:n,sourcePath:r,stepRunRecords:a.getStepRunRecords(),outcomes:D.outcomes,overallStatus:D.overallStatus,fromCommitId:h.fromCommitId,startedISO:Fe,durationS:ee,tmsIds:{testId:h.testId??a.testId??void 0,testcaseId:h.testcaseId??a.testcaseId??void 0,projectId:N??void 0,folderId:fe??void 0,orgId:a.orgId??void 0,sessionName:a.sessionName??ye(r)},tmsBaseUrl:C.tmsBaseUrl,testId:h.testId??void 0,newCommitId:h.newCommitId??void 0,basicAuth:u.basicAuth??void 0,decisions:h.decisions,wantsPush:t.push===!0,retryTriggered:ue,forceAuthor:t.author===!0});h.newCommitId!=null&&(b.skipTmsFinalize=!0);let g=new Rt(b);if(i)return await g.execute();let{renderUploadProgress:_}=await import("./CliUploadProgress-
|
|
41
|
+
`)}let kr=E>=1&&T>0&&P!==null?{startIdx:0,endIdx:P,count:P}:void 0;j?.setRunActive(!0);let ge=await Kr({decisions:le,resolved:n,session:a,accumulator:Y,tuiConfig:U,globalConfig:M,buildStepConfigAt:it,buildReplayConfig:x=>{let G=h.decisions[x];if(G.kind!=="replay")throw new Error("expected replay decision at index "+x);return We({step:n.steps[x],decision:G,chrome:K,auth:u,sessionId:a.sessionId,runIndex:a.nextRunIndex(),sessionDir:a.sessionDir,windowSize:{width:U.window_size.width,height:U.window_size.height},forceNavigateUrl:x===0?re:void 0,sessionContext:a.getContext()})},onAnyAuthorStep:()=>{$=!0},onCancel:()=>{q=!0},topBannerModel:w,topBannerAuth:`${l.getActiveProfile()??"no profile"}/${f}`,spawnOpts:{environment:f,mode:R.mode??"testing",log:(x,G,be,De)=>a.log(x,G,be,De)},priorAttemptRollup:kr,pushStepLevelDelta:(x,G)=>Pe(de(X.raw,x,G).variables),onSequencerStepEnd:(x,G,be,De)=>{let Ir=Math.round((Date.now()-De)/1e3),Cr=x.hadError?x.reason??"runner error":null,_r=Te(G,be,x.runEnd,x.bifurcationFlows??null,Cr,Ir);return a.recordStepRun({testmdStepIndex:n.steps[G].flatIndex,runIndex:be,totalRunDirs:x.runEnd?.total_runs??x.bifurcationFlows?.length??1}),_r},screenshotDispatcher:ae,onReasoning:x=>j?.setStepText(x),onStepComplete:()=>j?.setStepComplete(),onSpawnStart:x=>{he=x}});if(j?.setRunActive(!1),ge.cancelled){W("marker-overlay","user cancelled run"),W("chrome","user cancelled run");break}if(ge.failedAt===null)break;let je=b({failedAt:ge.failedAt,shrinkCount:E,hasRetry:g,maxShrinks:_});if(je.kind==="fail"||!F&&!await lt())break;a.rollback(S),Y.rollback(A),je.kind==="complete-reauthor"?T=0:T=je.newAuthorBoundary,E++,ue=!0,a.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:E,failed_at:P}),T===0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:E}),P=ge.failedAt}}let D=Y.finalize(),ee=Math.round((Date.now()-Rr)/1e3),wr={session:a,resolvedAuth:u,chromeResult:K,chromeInstance:pe??null,testId:a.testId??null,preparedVariables:L,variableIds:me,globalContext:tt,localContext:rt,tuiConfig:U,env:f,localMode:!!t.local},te=await ur(wr,{performUpload:async()=>{if(!u.basicAuth)return null;let s=Q(f),c=($||t.push===!0)&&!q,d=(F||h.isFirstRun)&&!q&&D.overallStatus==="passed",m=ie&&(F||h.isFirstRun);a.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:ie,shouldUploadPipeline:m,shouldReplaceLocalOutput:c,shouldCommit:d,lockHeld:F,anyAuthorStepRan:$,cancelled:q,overallStatus:D.overallStatus});let b=Ut({session:a,env:f,auth:u,variables:L,variableIds:me,projectId:N,folderId:fe,totalSteps:D.outcomes.length,totalDuration:ee,codeExport:Nt({codeExport:t.codeExport,codeLanguage:t.codeLanguage,skipCodeValidation:t.skipCodeValidation},U.code_export),onProgress:()=>{},log:(I,T,E,P)=>a.log(I,T,E,P),shouldUploadArtifacts:m,shouldReplaceLocalOutput:c,shouldCommit:d,isFirstRun:h.isFirstRun,resolvedTest:n,sourcePath:r,stepRunRecords:a.getStepRunRecords(),outcomes:D.outcomes,overallStatus:D.overallStatus,fromCommitId:h.fromCommitId,startedISO:Fe,durationS:ee,tmsIds:{testId:h.testId??a.testId??void 0,testcaseId:h.testcaseId??a.testcaseId??void 0,projectId:N??void 0,folderId:fe??void 0,orgId:a.orgId??void 0,sessionName:a.sessionName??ye(r)},tmsBaseUrl:C.tmsBaseUrl,testId:h.testId??void 0,newCommitId:h.newCommitId??void 0,basicAuth:u.basicAuth??void 0,decisions:h.decisions,wantsPush:t.push===!0,retryTriggered:ue,forceAuthor:t.author===!0});h.newCommitId!=null&&(b.skipTmsFinalize=!0);let g=new Rt(b);if(i)return await g.execute();let{renderUploadProgress:_}=await import("./CliUploadProgress-L5VJUXUC.js");return await _(g,I=>{if(I.testcaseId&&I.shareId&&N)return $e(s.testManagerUiUrl,N,I.testcaseId,I.shareId)})},runCleanup:()=>{W("chrome","test.md run complete")},log:(s,c,d,m)=>a.log(s,c,d,m)},{overallStatus:D.overallStatus,outcomes:D.outcomes,sourcePath:r,title:n.rootTitle,rootSteps:n.rootSteps,startedISO:Fe,durationS:ee,localMode:!!t.local,skipLocalWrites:!0});await Hr(r,h,a,D.outcomes,D.overallStatus,Fe,ee,te.uploadResult,U,t,{resolvedAuth:u,tmsBaseUrl:C.tmsBaseUrl},F);let ct={overallStatus:D.overallStatus,durationS:ee,decisions:h.decisions,outcomes:D.outcomes,cancelled:q,retryTriggered:ue,lockHeld:F,anyAuthorStepRan:$,isFirstRun:h.isFirstRun,wantsPush:t.push===!0,uploadResult:te.uploadResult,shouldUploadArtifacts:ie,shouldReplaceLocalOutput:$&&!q,shouldCommit:(F||h.isFirstRun)&&!q&&D.overallStatus==="passed"},{buildSummaryEvent:vr}=await import("./SummaryBox-5YPKUIHB.js");if(i)p(vr(ct));else try{let{default:s}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{AutoExitSummaryBox:d}=await import("./SummaryBox-5YPKUIHB.js"),{waitUntilExit:m}=c(s.createElement(d,{data:ct}),{stdout:process.stderr});await m()}catch(s){a.log("warn","TEST_MD_SUMMARY_RENDER_FAILED","Summary box render failed",{error:String(s)})}if(!i)try{let{default:s}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{LinksBox:d}=await import("./LinksBox-RSWQWL6G.js"),m=Q(f),b=te.uploadResult?.testcaseId,g=b&&te.uploadResult?.shareId&&N?$e(m.testManagerUiUrl,N,b,te.uploadResult.shareId):void 0,_=b&&N?yt(m.testManagerUiUrl,N,b):void 0,{waitUntilExit:I}=c(s.createElement(d,{recordedTestPath:r,outputDir:xt(r),shareableLink:g,testCaseLink:_,codeExportDir:te.uploadResult?.codeExportDir}),{stdout:process.stderr});await I()}catch(s){a.log("warn","TEST_MD_LINKS_RENDER_FAILED","LinksBox render failed",{error:String(s)})}return p({type:"test_md_done",overall_status:D.overallStatus,duration_s:ee,session_id:a.sessionId}),D.overallStatus==="passed"?0:1}function $r(e){let t={mode:"mode",maxSteps:"max_steps",timeout:"timeout",globalContext:"global_context",localContext:"local_context",codeExport:"code_export",codeLanguage:"code_language",headless:"headless",cdpEndpoint:"cdp_endpoint",wsEndpoint:"ws_endpoint"},r=new Set(["max_steps","timeout"]),i={};for(let[o,p]of Object.entries(t)){let n=e[o];if(n===void 0||n==="")continue;let R=n;if(r.has(p)&&(R=Number(n),Number.isNaN(R))){let l="--"+o.replace(/[A-Z]/g,y=>"-"+y.toLowerCase());process.stderr.write(`error: ${l} must be a number
|
|
42
42
|
`),process.exit(2)}i[p]=R}return i}function Br(e,t){let r={...e,...t},i=Object.keys(r).length>0?Re(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:i.variables,auteurObjective:"",secretEntries:Object.entries(r).filter(([,o])=>o.secret),nonSecretEntries:Object.entries(r).filter(([,o])=>!o.secret)}}function de(e,t,r){let i={...e,...t??{}};if(Object.keys(i).length===0)return{variables:{},objective:r};let o=Re(i,r);return{variables:Ct(o.variables,o.objective),objective:o.objective}}function pr(e,t){let r=new Set(Ie),i={...e};for(let[o,p]of Object.entries(t))r.has(o)||o!=="variables"&&p!==void 0&&e[o]===void 0&&(i[o]=p);return i}function Vr(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function qr(e,t,r,i,o){let p=Pt(e),n=Xt(t,Xe(p)?p:null);rr(t,n);let R=Ot(e),l=Xe(R)?JSON.parse(Mr(R,"utf8")):null,y=l?.testcase_id,v=l?.test_id,k=l?.commit_id,O=r.push===!0,f=r.retry===!0||r.retryCount!==void 0,C=r.author===!0;O&&!y&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
|
|
43
43
|
`),C&&(y=void 0,v=void 0,k=void 0);let w=!!i.resolvedAuth.basicAuth,u=!r.local&&w&&v!=null&&k!=null&&y!=null,J=u&&(er(n)||O);if(O&&!u)return process.stderr.write(`error: --push requires basic auth credentials for the lock API. Run 'kane-cli config set-username/set-access-key' or pass --username/--access-key inline.
|
|
44
44
|
`),{resolved:t,decisions:n,testId:v,testcaseId:y,fromCommitId:k,newCommitId:null,isFirstRun:!1,hasBasic:w,canLock:u,lockAcquired:!1,abort:{exitCode:2}};if(f&&!u)return process.stderr.write(`error: --retry requires basic auth credentials for the lock API. Run 'kane-cli config set-username/set-access-key' or pass --username/--access-key inline.
|
|
@@ -51,4 +51,4 @@ import{a as ce,b as zt}from"./chunk-C5UNZ6ZY.js";import{a as Ht}from"./chunk-5KH
|
|
|
51
51
|
`),"abort"}}return process.stderr.write(`[lock] ${n} \u2014 running in readonly mode (no commit)
|
|
52
52
|
`),"readonly"}async function Hr(e,t,r,i,o,p,n,R,l,y,v,k){let{decisions:O,testId:f,testcaseId:C,fromCommitId:w,newCommitId:u}=t;if(!(o==="passed")&&k&&f&&w&&u){process.stderr.write(`[lock] run failed (${o}); discarding new commit
|
|
53
53
|
`),await zr(v,f,w,u),Qe();return}Qe()}async function zr(e,t,r,i){if(!e.resolvedAuth.basicAuth)return;let o=await Lt({baseUrl:Ce(e.tmsBaseUrl),testId:t,body:{commitId:i,fromCommitId:r},auth:_e(e.resolvedAuth.basicAuth)});o.ok||process.stderr.write(`warn: discardLock failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
|
|
54
|
-
`)}async function Kr(e){let{default:t}=await import("./react-QWOAB3TB.js"),{render:r}=await import("./build-JIKYOZUH.js"),{TestMdRunView:i}=await import("./TestMdRunView-
|
|
54
|
+
`)}async function Kr(e){let{default:t}=await import("./react-QWOAB3TB.js"),{render:r}=await import("./build-JIKYOZUH.js"),{TestMdRunView:i}=await import("./TestMdRunView-QS7IUANM.js"),o=null,p=!1,n=0,R=-1,l=-1,y=0,v=async O=>{if(O&&O.status==="failed")return n>0&&e.decisions[n-1].kind==="replay"&&(o=n-1),null;for(;n<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[n]);)n++;if(n>=e.decisions.length)return null;let f=e.decisions[n],C=e.resolved.steps[n],w=n;n++;let u=e.session.nextRunIndex();R=w,l=u,y=Date.now(),e.onSpawnStart?.(u),f.kind==="author"&&e.onAnyAuthorStep(),await e.pushStepLevelDelta(C.config.variables,C.objective);let J=f.kind==="replay"?e.buildReplayConfig(w):e.buildStepConfigAt(w,u),a=f.kind==="replay"?"md5-match":f.reason,h=C.config??{},F={};for(let[$,q]of Object.entries(h))q!=null&&$!=="variables"&&(F[$]=q);return{config:J,banner:{stepLabel:`Step ${w+1}/${e.decisions.length}`,objective:Vr(C.objective,100)},mode:f.kind,modeReason:a,perStepOverrides:Object.keys(F).length>0?F:void 0}},{waitUntilExit:k}=r(t.createElement(i,{topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:v,onStepEnd:O=>e.onSequencerStepEnd(O,R,l,y),onAllComplete:()=>{},onCancel:()=>{p=!0,e.onCancel()},spawnOpts:e.spawnOpts,priorAttemptRollup:e.priorAttemptRollup,screenshotDispatcher:e.screenshotDispatcher,onReasoning:e.onReasoning,onStepComplete:e.onStepComplete}),{stdout:process.stderr,exitOnCtrlC:!1});return await k(),{failedAt:o,cancelled:p}}export{pr as applyCliStepConfig,de as buildStepRunVariables,Br as buildTestLevelVariables,mo as runTestMdFile};
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as O}from"./chunk-
|
|
2
|
+
import{a as O}from"./chunk-NOH6RERF.js";import{d as W,e as J,f as Z}from"./chunk-F6HEB4PA.js";import{a as z,b as K}from"./chunk-MDBXYXSC.js";import{a as C,b as N,e as S,f as Q}from"./chunk-SLA75N5B.js";import"./chunk-G7VF5SDK.js";import{a as B}from"./chunk-KVDOQY2Q.js";import{a as G}from"./chunk-THNGNS36.js";import{a as A}from"./chunk-K7MSPKEM.js";import{a as q}from"./chunk-TK7ZJ7YX.js";import"./chunk-PWGEMRBD.js";import"./chunk-L5Y2GUO6.js";import"./chunk-HJ3CHMEM.js";import{a as F}from"./chunk-HCBYKLMW.js";import{t as _}from"./chunk-3ELBJPHQ.js";import{a as y,b as g,i as H}from"./chunk-C44QQJR4.js";import{a as j}from"./chunk-6YGTRKDT.js";import"./chunk-DXKKUGFG.js";import{e as T}from"./chunk-UR6MHSHU.js";var P=T(j(),1);import{existsSync as v,readFileSync as It,rmSync as ct,unlinkSync as Lt}from"fs";import{resolve as X}from"path";import{promises as tt,realpathSync as mt}from"fs";import{homedir as gt}from"os";import{join as U,parse as pt,relative as et,resolve as rt}from"path";var ht=new Set(["node_modules",".git","dist","build",".next",".venv","venv","target","__pycache__"]),R=class extends Error{constructor(i){super(`refusing to scan '${i}'. Run from your project root, or pass --root <dir>.`);this.cwd=i;this.name="HomeRefusedError"}};function nt(t){try{return mt(rt(t))}catch{return rt(t)}}function _t(t){let r=nt(t),i=nt(gt()),n=pt(r).root;if(process.platform==="win32"){let e=o=>o.toLowerCase();return e(r)===e(i)||e(r)===e(n)}return r===i||r===n}async function $(t){if(_t(t.root))throw new R(t.root);let r=t.maxEntries??5e4,i=t.maxResults??5e3,n=new Set(t.ignore??[]),e=[],o=0,c=0,a=!1,l,s=[t.root];for(;s.length>0&&!a;){let u=s.shift(),w;try{w=await tt.readdir(u,{withFileTypes:!0})}catch{continue}c++;for(let h of w){if(o++,o>r){a=!0,l="max_entries";break}let f=h.name,b=U(u,f);if(h.isDirectory()){if(ht.has(f)||f.startsWith(".")||f.startsWith("output-")||n.has(f))continue;s.push(b)}else if(h.isFile()&&f.endsWith("_test.md")&&(e.push({path:b,relPath:et(t.root,b),source:"cwd"}),e.length>=i)){a=!0,l="max_results";break}}t.onProgress?.(c,e.length)}if(!a){let u=U(t.root,".testmuai","tests");try{let w=await tt.readdir(u,{withFileTypes:!0});c++;for(let h of w){if(!h.isFile()||!h.name.endsWith("_test.md"))continue;let f=U(u,h.name);if(e.push({path:f,relPath:et(t.root,f),source:"tests-dir"}),e.length>=i){a=!0,l="max_results";break}}}catch{}}return{results:e,aborted:a,abortReason:l,dirsScanned:c}}import{mkdirSync as xt,writeFileSync as wt}from"fs";import{join as yt}from"path";function ot(t,r){return`Basic ${Buffer.from(`${t}:${r}`).toString("base64")}`}async function kt(t){let r=z({tmsBaseUrl:t.tmsBaseUrl,testcaseId:t.testcaseId,codeExport:{enabled:!0,language:t.language,skipValidation:t.skipValidation}}),i=await fetch(r.url,{method:"POST",headers:{"content-type":"application/json",authorization:ot(t.auth.username,t.auth.access_key)},body:JSON.stringify(r.body)});if(!i.ok)throw new Error(`code-export trigger failed: ${i.status} ${await i.text()}`);t.log("info","CODE_EXPORT_TRIGGERED","Code export triggered",{testcase_id:t.testcaseId})}async function bt(t){let r=K({tmsBaseUrl:t.tmsBaseUrl,testcaseId:t.testcaseId}),i=t.pollIntervalMs??5e3,n=t.timeoutMs??3e5,e=Date.now()+n;for(;Date.now()<e;){let o=await fetch(r,{headers:{authorization:ot(t.auth.username,t.auth.access_key),accept:"application/json"}});if(!o.ok){await new Promise(s=>setTimeout(s,i));continue}let a=(await o.json()).data?.find(s=>s.code_name==="kane-cli-trigger");if(!a){await new Promise(s=>setTimeout(s,i));continue}let l=(a.status??"").toLowerCase();if(l==="in progress"||l==="in_progress"||l==="pending"){await new Promise(s=>setTimeout(s,i));continue}if(!a.url||a.url.length===0)throw new Error(`code-export status=${a.status} but no files returned`);xt(t.outDir,{recursive:!0});for(let s of a.url){let u=yt(t.outDir,s.file_name),w=await fetch(s.file_url);if(!w.ok){t.log("warn","CODE_EXPORT_FILE_FAILED","Failed to download file",{file_name:s.file_name,status:w.status});continue}let h=await w.text();wt(u,h,"utf-8")}return t.log("info","CODE_EXPORT_DOWNLOADED","Code export saved",{out_dir:t.outDir,file_count:a.url.length}),t.outDir}throw new Error("code-export polling timed out")}async function it(t){return await kt(t),await bt(t)}var k=T(j(),1);import{existsSync as Et,readFileSync as Tt}from"fs";var p=T(F(),1);function Rt(t){O(t);let r=S(t);if(!Et(r))return null;try{return JSON.parse(Tt(r,"utf8"))}catch{return{}}}function St(t){return t===null?"never_run":t.testcase_id?"synced":"local_only"}function Pt(t){return t==="synced"?"\u2601":t==="local_only"?"\u25A3":"\u25CB"}function vt(t){return t==="tests-dir"?"\u2726":" "}function Mt(t,r){return r==="all"?!0:r==="synced"?t.status==="synced":r==="local"?t.status==="local_only":r==="never_run"?t.status==="never_run":r==="cli"?t.source==="tests-dir":r==="hand"?t.source==="cwd":!0}var V=["all","synced","local","never_run","cli","hand"];function Ct(t){let r=V.indexOf(t);return V[(r+1)%V.length]}function st({root:t,currentOrgId:r,onSelect:i,onCancel:n}){let[e,o]=(0,k.useState)([]),[c,a]=(0,k.useState)(null),[l,s]=(0,k.useState)(!0),[u,w]=(0,k.useState)("all");(0,k.useEffect)(()=>{(async()=>{try{let m=await $({root:t}),M=[];for(let E of m.results){let L=Rt(E.path);L?.org_id!==void 0&&L.org_id!==r||M.push({path:E.path,relPath:E.relPath,name:C(E.path),status:St(L),source:E.source})}o(M),s(!1)}catch(m){m instanceof R,a(m.message),s(!1)}})()},[t,r]);let h=(0,k.useMemo)(()=>e.filter(m=>Mt(m,u)).map(m=>({id:m.path,label:`${Pt(m.status)} ${vt(m.source)} ${m.relPath}`})),[e,u]),f=(0,k.useMemo)(()=>Ft(u,e),[u,e]);if(c)return(0,p.jsxs)(y,{flexDirection:"column",borderStyle:"round",borderColor:_.statusFail,paddingX:2,paddingY:1,children:[(0,p.jsx)(g,{color:_.statusFail,bold:!0,children:"testmd"}),(0,p.jsx)(y,{marginTop:1,children:(0,p.jsx)(g,{color:_.statusFail,children:c})})]});let b=u==="all"?"all":Dt(u);return(0,p.jsx)(G,{title:`testmd \xB7 filter: ${b}`,items:h,loading:l,itemNoun:"tests",onSelect:m=>{let M=e.find(E=>E.path===m.id);M&&i(M)},onCancel:n,onTab:()=>w(m=>Ct(m)),extraHint:"cycle filter",footer:f})}function Dt(t){return t==="synced"?"synced (\u2601)":t==="local"?"local (\u25A3)":t==="never_run"?"never run (\u25CB)":t==="cli"?"cli-generated (\u2726)":t==="hand"?"hand-written":"all"}function Ft(t,r){let i={synced:r.filter(e=>e.status==="synced").length,local:r.filter(e=>e.status==="local_only").length,never:r.filter(e=>e.status==="never_run").length,cli:r.filter(e=>e.source==="tests-dir").length,hand:r.filter(e=>e.source==="cwd").length},n=e=>e?_.primary:_.dim;return(0,p.jsxs)(y,{flexDirection:"column",children:[(0,p.jsx)(g,{color:_.dim,children:"legend:"}),(0,p.jsxs)(y,{children:[(0,p.jsx)(g,{color:n(t==="synced"),children:` \u2601 synced (${i.synced}) `}),(0,p.jsx)(g,{color:n(t==="local"),children:`\u25A3 local (${i.local}) `}),(0,p.jsx)(g,{color:n(t==="never_run"),children:`\u25CB never run (${i.never})`})]}),(0,p.jsxs)(y,{children:[(0,p.jsx)(g,{color:n(t==="cli"),children:` \u2726 cli-generated (${i.cli}) `}),(0,p.jsx)(g,{color:n(t==="hand"),children:` hand-written (${i.hand})`})]})]})}var D=T(j(),1);import{existsSync as Ot,readFileSync as $t}from"fs";var d=T(F(),1);function at({path:t,relPath:r,onAction:i,onBack:n}){let[e,o]=(0,D.useState)(null),[c,a]=(0,D.useState)(!1);(0,D.useEffect)(()=>{let s=S(t);if(Ot(s))try{o(JSON.parse($t(s,"utf8")))}catch{o(null)}},[t]),H((s,u)=>{if(u.escape){if(c){a(!1);return}n();return}if(c){s==="y"||s==="Y"?(a(!1),i("delete")):(s==="n"||s==="N")&&a(!1);return}s==="r"&&i("run"),s==="e"&&e?.testcase_id&&i("export"),s==="d"&&a(!0)});let l=({k:s,v:u})=>u?(0,d.jsxs)(g,{children:[(0,d.jsx)(g,{color:_.dim,children:s.padEnd(14)}),u]}):null;return(0,d.jsxs)(y,{flexDirection:"column",borderStyle:"round",borderColor:_.primary,paddingX:2,paddingY:1,children:[(0,d.jsx)(g,{color:_.primary,bold:!0,children:r}),(0,d.jsx)(y,{marginTop:1,flexDirection:"column",children:e?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(l,{k:"test_id",v:e.test_id}),(0,d.jsx)(l,{k:"testcase_id",v:e.testcase_id}),(0,d.jsx)(l,{k:"project_id",v:e.project_id}),(0,d.jsx)(l,{k:"folder_id",v:e.folder_id}),(0,d.jsx)(l,{k:"org_id",v:e.org_id}),(0,d.jsx)(l,{k:"session_name",v:e.session_name}),(0,d.jsx)(l,{k:"commit_id",v:e.commit_id})]}):(0,d.jsx)(g,{color:_.dim,children:"(never run \u2014 no meta.json)"})}),c?(0,d.jsx)(y,{marginTop:1,children:(0,d.jsxs)(g,{color:_.statusFail,bold:!0,children:["Delete ",r," and its output dir? [y/n]"]})}):(0,d.jsx)(y,{marginTop:1,children:(0,d.jsxs)(g,{color:_.dim,children:["[r] run [e] export",e?.testcase_id?"":" (need testcase_id)"," [d] delete [Esc] back"]})})]})}function I(t){O(t);let r=S(t);if(!v(r))return null;try{return JSON.parse(It(r,"utf8"))}catch{return null}}function lt(t,r){return!t||t.org_id===void 0?!0:t.org_id===r}function Y(t,r){return lt(t,r)?null:(process.stderr.write(`error: this test belongs to org ${t.org_id}; you are logged in as org ${r}.
|
|
3
3
|
Switch profiles with \`kane-cli profiles switch\` to act on it.
|
|
4
4
|
`),2)}async function Re(t={}){let r=!!process.stdin.isTTY&&!t.json,i=new A,n=new B;await Z({isInteractive:r,creds:i,config:n});let e=i.getDefaultEnv()??"prod";try{let o=await J({creds:i,env:e,log:()=>{}});return o.resolvedCreds?.org_id===void 0?(process.stderr.write("error: TMS did not return an org_id. Run `kane-cli login` again.\n"),{ok:!1,code:2}):{ok:!0,orgId:String(o.resolvedCreds.org_id)}}catch(o){if(o instanceof W)return process.stderr.write("error: not authenticated. Run `kane-cli login` first.\n"),{ok:!1,code:2};throw o}}async function Se(t,r){if(process.stdin.isTTY&&!t.json)return await Bt(r,t.root);let i=t.root??process.cwd(),n;try{n=await $({root:i,ignore:t.ignore})}catch(e){if(e instanceof R)return process.stderr.write(`error: ${e.message}
|
|
5
5
|
`),2;throw e}for(let e of n.results){let o=I(e.path);if(!lt(o,r))continue;let c={path:e.relPath.startsWith(".")?e.relPath:`./${e.relPath}`,name:C(e.path),has_meta:o!==null,source:e.source,synced:!!o?.testcase_id};o&&(o.test_id&&(c.test_id=o.test_id),o.testcase_id&&(c.testcase_id=o.testcase_id),o.org_id&&(c.org_id=o.org_id),o.project_id&&(c.project_id=o.project_id),o.folder_id&&(c.folder_id=o.folder_id)),process.stdout.write(JSON.stringify(c)+`
|
|
6
6
|
`)}return n.aborted&&process.stderr.write(`warn: walk aborted (${n.abortReason}). Pass --root or --ignore to narrow.
|
|
7
|
-
`),0}var ut=-1001,dt=-1002,ft=-1003,x={action:null,path:null};function jt(t,r){return x.action=t,x.path=r,t==="run"?ut:t==="export"?dt:ft}function At({root:t,currentOrgId:r,onComplete:i}){let[n,e]=P.default.useState({kind:"list"});return P.default.useEffect(()=>{n.kind==="exiting"&&i(n.code)},[n,i]),n.kind==="list"?P.default.createElement(st,{root:t,currentOrgId:r,onSelect:o=>e({kind:"inspect",path:o.path,relPath:o.relPath}),onCancel:()=>e({kind:"exiting",code:0})}):n.kind==="inspect"?P.default.createElement(at,{path:n.path,relPath:n.relPath,onAction:async o=>{e({kind:"exiting",code:jt(o,n.path)})},onBack:()=>e({kind:"list"})}):null}async function Bt(t,r){let i=r??process.cwd(),{render:n}=await import("./build-JIKYOZUH.js"),e=await new Promise(o=>{let{unmount:c,waitUntilExit:a}=n(P.default.createElement(At,{root:i,currentOrgId:t,onComplete:l=>{c(),o(l)}}),{stdout:process.stderr,exitOnCtrlC:!0});a().then(()=>o(0)).catch(()=>o(0))});if(e===ut&&x.path){let{runTestMdFile:o}=await import("./run-test-md-
|
|
7
|
+
`),0}var ut=-1001,dt=-1002,ft=-1003,x={action:null,path:null};function jt(t,r){return x.action=t,x.path=r,t==="run"?ut:t==="export"?dt:ft}function At({root:t,currentOrgId:r,onComplete:i}){let[n,e]=P.default.useState({kind:"list"});return P.default.useEffect(()=>{n.kind==="exiting"&&i(n.code)},[n,i]),n.kind==="list"?P.default.createElement(st,{root:t,currentOrgId:r,onSelect:o=>e({kind:"inspect",path:o.path,relPath:o.relPath}),onCancel:()=>e({kind:"exiting",code:0})}):n.kind==="inspect"?P.default.createElement(at,{path:n.path,relPath:n.relPath,onAction:async o=>{e({kind:"exiting",code:jt(o,n.path)})},onBack:()=>e({kind:"list"})}):null}async function Bt(t,r){let i=r??process.cwd(),{render:n}=await import("./build-JIKYOZUH.js"),e=await new Promise(o=>{let{unmount:c,waitUntilExit:a}=n(P.default.createElement(At,{root:i,currentOrgId:t,onComplete:l=>{c(),o(l)}}),{stdout:process.stderr,exitOnCtrlC:!0});a().then(()=>o(0)).catch(()=>o(0))});if(e===ut&&x.path){let{runTestMdFile:o}=await import("./run-test-md-UPAR3DQY.js"),c=await o(x.path,{});return x.action=null,x.path=null,c}if(e===dt&&x.path){let o=await Wt(x.path,{},t);return x.action=null,x.path=null,o}if(e===ft&&x.path){let o=await Nt(x.path,!0,t);return x.action=null,x.path=null,o}return e}async function Pe(t,r){let i=X(t);if(!v(i))return process.stderr.write(`error: file not found: ${i}
|
|
8
8
|
`),2;let n=I(i),e=Y(n,r);if(e!==null)return e;let o={path:i,name:C(i),has_meta:n!==null};return n&&(n.commit_id&&(o.commit_id=n.commit_id),n.test_id&&(o.test_id=n.test_id),n.testcase_id&&(o.testcase_id=n.testcase_id),n.project_id&&(o.project_id=n.project_id),n.folder_id&&(o.folder_id=n.folder_id),n.org_id&&(o.org_id=n.org_id),n.session_name&&(o.session_name=n.session_name)),process.stdout.write(JSON.stringify(o)+`
|
|
9
9
|
`),0}async function Nt(t,r,i){let n=X(t);if(!v(n))return process.stderr.write(`error: file not found: ${n}
|
|
10
10
|
`),2;let e=I(n),o=Y(e,i);if(o!==null)return o;if(!r)return process.stderr.write(`error: refusing to delete without --yes.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as t}from"./chunk-
|
|
2
|
+
import{a as t}from"./chunk-TK7ZJ7YX.js";import"./chunk-3ELBJPHQ.js";import"./chunk-UR6MHSHU.js";async function a(n,e,o){let{TmsClient:r}=await import("./tms-client-CTH4NVFM.js"),i=new r(t(n).tmsBaseUrl,e,o);for await(let m of i.listProjectsStream({perPage:1,maxPages:1}))return}export{a as validateBasicAuth};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a,b,c,d}from"./chunk-
|
|
2
|
+
import{a,b,c,d}from"./chunk-KULEBWMB.js";import"./chunk-3ELBJPHQ.js";import"./chunk-UR6MHSHU.js";export{d as checkForUpdate,b as compareVersions,c as getSeverity,a as getUpdateCommand};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@testmuai/kane-cli",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "KaneAI Terminal UI — browser automation testing agent",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -23,10 +23,10 @@
|
|
|
23
23
|
"sharp": "^0.34.5"
|
|
24
24
|
},
|
|
25
25
|
"optionalDependencies": {
|
|
26
|
-
"@testmuai/kane-cli-darwin-arm64": "0.3.
|
|
27
|
-
"@testmuai/kane-cli-darwin-x64": "0.3.
|
|
28
|
-
"@testmuai/kane-cli-linux-x64": "0.3.
|
|
29
|
-
"@testmuai/kane-cli-win-x64": "0.3.
|
|
26
|
+
"@testmuai/kane-cli-darwin-arm64": "0.3.1",
|
|
27
|
+
"@testmuai/kane-cli-darwin-x64": "0.3.1",
|
|
28
|
+
"@testmuai/kane-cli-linux-x64": "0.3.1",
|
|
29
|
+
"@testmuai/kane-cli-win-x64": "0.3.1"
|
|
30
30
|
},
|
|
31
31
|
"publishConfig": {
|
|
32
32
|
"registry": "https://registry.npmjs.org",
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a,b}from"./chunk-75SVKFKD.js";import"./chunk-YCCUBQY4.js";import"./chunk-XJ7OYQ7M.js";import"./chunk-NLYBR5FP.js";import"./chunk-BSQVYLV7.js";import"./chunk-HCBYKLMW.js";import"./chunk-JYQO6G7F.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-YUUZDFT7.js";import"./chunk-DXKKUGFG.js";import"./chunk-UR6MHSHU.js";export{b as FolderPicker,a as formatFolderLine};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a,b}from"./chunk-G7I7EAV6.js";import"./chunk-YCCUBQY4.js";import"./chunk-XJ7OYQ7M.js";import"./chunk-NLYBR5FP.js";import"./chunk-BSQVYLV7.js";import"./chunk-HCBYKLMW.js";import"./chunk-JYQO6G7F.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-YUUZDFT7.js";import"./chunk-DXKKUGFG.js";import"./chunk-UR6MHSHU.js";export{b as ProjectPicker,a as formatProjectLine};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{f as a}from"./chunk-PINXGH2T.js";import"./chunk-66CVM7JL.js";import"./chunk-G7VF5SDK.js";import"./chunk-FJ6L63SP.js";import"./chunk-G7I7EAV6.js";import"./chunk-75SVKFKD.js";import"./chunk-YCCUBQY4.js";import"./chunk-XJ7OYQ7M.js";import"./chunk-VE3SUJMA.js";import"./chunk-QV2VR72Q.js";import"./chunk-NLYBR5FP.js";import"./chunk-PWGEMRBD.js";import"./chunk-L5Y2GUO6.js";import"./chunk-BSQVYLV7.js";import"./chunk-HCBYKLMW.js";import"./chunk-JYQO6G7F.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-YUUZDFT7.js";import"./chunk-DXKKUGFG.js";import"./chunk-UR6MHSHU.js";export{a as SingleShotApp};
|