@testmuai/kane-cli 0.6.0 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/{ChatSurface-I6PFL3OE.js → ChatSurface-HGP5EHZM.js} +1 -1
  2. package/dist/{ChromeProfilePicker-YG7TKHM5.js → ChromeProfilePicker-XXNZLSCC.js} +1 -1
  3. package/dist/{CliFeedbackPrompt-5RUIP4KA.js → CliFeedbackPrompt-FJF5INQO.js} +1 -1
  4. package/dist/{CliUploadProgress-YQYPZNEV.js → CliUploadProgress-5E3CCYPZ.js} +1 -1
  5. package/dist/{ConfigView-HZ7MFCAJ.js → ConfigView-TGVOKOUZ.js} +1 -1
  6. package/dist/EvidenceViewOffer-7O3RNBEE.js +2 -0
  7. package/dist/FolderPicker-T4JB4NNW.js +2 -0
  8. package/dist/{HelpView-BLWTCQ6T.js → HelpView-PSHKI7DD.js} +1 -1
  9. package/dist/{InfoBox-7ZZGMYHY.js → InfoBox-PXWJ6BIX.js} +1 -1
  10. package/dist/{LinksBox-63Q5YS5X.js → LinksBox-IUOYRXYO.js} +1 -1
  11. package/dist/{ProfilesView-AVYB43ES.js → ProfilesView-UK5XX5WP.js} +1 -1
  12. package/dist/{ProjectPicker-EINNALUG.js → ProjectPicker-3FE7UFXL.js} +1 -1
  13. package/dist/{SaveSessionPrompt-C3LCI2KZ.js → SaveSessionPrompt-P7NF5FDA.js} +1 -1
  14. package/dist/SingleShotApp-UIDA54GB.js +2 -0
  15. package/dist/{SummaryBox-NRPQ2AMW.js → SummaryBox-WVR4U3NN.js} +1 -1
  16. package/dist/TestMdRunView-OH4Y6YD6.js +2 -0
  17. package/dist/{WhoamiView-YLMIEJQN.js → WhoamiView-QVXJAVTC.js} +1 -1
  18. package/dist/{bind-QYQ5IT4S.js → bind-SRZYTS4Q.js} +2 -2
  19. package/dist/{bridge-QENVIWWC.js → bridge-I6N3YPXI.js} +1 -1
  20. package/dist/{changelog-4RSI7UIO.js → changelog-HPSX3L7T.js} +1 -1
  21. package/dist/{chat-committer-RTJCKQMM.js → chat-committer-GHDZY5XF.js} +1 -1
  22. package/dist/{chat-controller-OTBYHB4Y.js → chat-controller-VKGECDTU.js} +1 -1
  23. package/dist/{chunk-BV3EARZO.js → chunk-2U5DZUC7.js} +1 -1
  24. package/dist/{chunk-QI6WZ56Y.js → chunk-35SRW4KA.js} +1 -1
  25. package/dist/{chunk-XQDDUVD3.js → chunk-44QUA6GV.js} +1 -1
  26. package/dist/{chunk-D5SHVZGD.js → chunk-4G4HPMR2.js} +1 -1
  27. package/dist/{chunk-NTJDMMLC.js → chunk-4PIMEZJW.js} +2 -2
  28. package/dist/{chunk-CBIW5DTU.js → chunk-52VLJKIN.js} +1 -1
  29. package/dist/{chunk-LKXVYWKG.js → chunk-5ON7QQZO.js} +6 -6
  30. package/dist/{chunk-6BQD2BXI.js → chunk-6UNTIXFW.js} +1 -1
  31. package/dist/{chunk-IPCC3P6T.js → chunk-6XKJH5ZE.js} +2 -2
  32. package/dist/{chunk-HYW5VDEC.js → chunk-B2CIHKXG.js} +1 -1
  33. package/dist/{chunk-WFAMF4SG.js → chunk-BKGJGPDN.js} +1 -1
  34. package/dist/{chunk-WG3BBXJF.js → chunk-D5DEWIAU.js} +2 -2
  35. package/dist/{chunk-WUNN5OCH.js → chunk-DCYTRYR2.js} +1 -1
  36. package/dist/{chunk-Y2S3PW7N.js → chunk-DEYHK6ZC.js} +1 -1
  37. package/dist/{chunk-RTWWPEQ7.js → chunk-EK2B2LZK.js} +1 -1
  38. package/dist/{chunk-3SK5GXQM.js → chunk-FOZVXYVG.js} +1 -1
  39. package/dist/chunk-FTD3B7QA.js +2 -0
  40. package/dist/{chunk-VXS23M67.js → chunk-FU3OQXFH.js} +1 -1
  41. package/dist/{chunk-LBBPMEO2.js → chunk-GN3SZXZ5.js} +1 -1
  42. package/dist/{chunk-FPGOV4AQ.js → chunk-HR7AGYV2.js} +1 -1
  43. package/dist/{chunk-IF2R3AR4.js → chunk-HUD7SPUF.js} +3 -3
  44. package/dist/{chunk-B2OAEEKI.js → chunk-HW7Z5S2M.js} +2 -2
  45. package/dist/{chunk-5U3GOEGG.js → chunk-IDDVO4UV.js} +1 -1
  46. package/dist/{chunk-ME3GYVBV.js → chunk-K2MKBBI4.js} +1 -1
  47. package/dist/{chunk-FAXRERS6.js → chunk-KGFISJFM.js} +1 -1
  48. package/dist/{chunk-N2BUF6YU.js → chunk-KRFGAVYU.js} +1 -1
  49. package/dist/{chunk-OXARXMMD.js → chunk-L4AUCQVO.js} +1 -1
  50. package/dist/{chunk-WFSQZG26.js → chunk-LV5VRSPI.js} +1 -1
  51. package/dist/{chunk-ZO7ROBPR.js → chunk-LZKUF23A.js} +1 -1
  52. package/dist/{chunk-5Q46BEG7.js → chunk-M6DX4ENH.js} +1 -1
  53. package/dist/{chunk-25YSMNUP.js → chunk-MHQ6A2QZ.js} +1 -1
  54. package/dist/{chunk-H7ZQ4AWL.js → chunk-N62EM6JX.js} +1 -1
  55. package/dist/chunk-NEZ4G7XR.js +2 -0
  56. package/dist/{chunk-C5NNT7Y3.js → chunk-OZM4UU5F.js} +1 -1
  57. package/dist/{chunk-GNGGFK7C.js → chunk-OZODSY6H.js} +1 -1
  58. package/dist/{chunk-QK6KZMYG.js → chunk-PJSCM6JX.js} +1 -1
  59. package/dist/{chunk-MQ7DJ2XC.js → chunk-Q6TVDG3X.js} +1 -1
  60. package/dist/{chunk-MKD3KZPM.js → chunk-QIE62H3J.js} +1 -1
  61. package/dist/{chunk-PGEMGGBS.js → chunk-S6GRW5ZA.js} +2 -2
  62. package/dist/{chunk-ZZOSDBYN.js → chunk-TJRBV2V2.js} +3 -3
  63. package/dist/{chunk-YWWKKKXY.js → chunk-U3JB76QP.js} +1 -1
  64. package/dist/{chunk-ZXDA4K6G.js → chunk-VL2UA23Z.js} +1 -1
  65. package/dist/{chunk-NWZTYAJB.js → chunk-WM5QHLAP.js} +1 -1
  66. package/dist/{chunk-TZVURR5H.js → chunk-X4QL2DAD.js} +1 -1
  67. package/dist/{chunk-MESFNOY3.js → chunk-XN7PPLFS.js} +1 -1
  68. package/dist/{chunk-INP7FG6V.js → chunk-YIOWO6WS.js} +1 -1
  69. package/dist/chunk-YKTYVJBN.js +3 -0
  70. package/dist/{chunk-ABSEKYIB.js → chunk-YSK535OI.js} +3 -3
  71. package/dist/{chunk-NOOHQBUD.js → chunk-Z4K4AYEI.js} +1 -1
  72. package/dist/{chunk-VK7RF53I.js → chunk-ZGH7T32S.js} +1 -1
  73. package/dist/config-KD62VH3R.js +2 -0
  74. package/dist/{credentials-WUEKK7FI.js → credentials-NQNJR4E4.js} +1 -1
  75. package/dist/{evidence-4BSNTVND.js → evidence-FFOI2H3N.js} +1 -1
  76. package/dist/{evolve-cmd-VUWLH3CO.js → evolve-cmd-PHQ6FHRI.js} +1 -1
  77. package/dist/{extract-bind-T7SUAID6.js → extract-bind-6UMILP4U.js} +2 -2
  78. package/dist/{extract-cmd-LZW7CRT3.js → extract-cmd-MZR7PHGA.js} +1 -1
  79. package/dist/{generate-headless-C55T3GGR.js → generate-headless-XOBQS6RU.js} +2 -2
  80. package/dist/index.js +12 -12
  81. package/dist/{ingest-cmd-FJ3SLTT4.js → ingest-cmd-X7BWGIN7.js} +1 -1
  82. package/dist/{interactive-bind-P6AGLUMM.js → interactive-bind-5FWW3S53.js} +2 -2
  83. package/dist/{lifecycle-cmd-56OZT4LY.js → lifecycle-cmd-55NZL3UO.js} +1 -1
  84. package/dist/{list-commands-M34USUNO.js → list-commands-PDTISP6T.js} +1 -1
  85. package/dist/{logical-ids-QRRUXV5E.js → logical-ids-ATVR6PF2.js} +1 -1
  86. package/dist/login-flow-IXPJHTL2.js +2 -0
  87. package/dist/{persist-recorded-session-L2KAY37H.js → persist-recorded-session-5UNUINWF.js} +1 -1
  88. package/dist/{pipeline-FJXQIFW7.js → pipeline-F4WTOZ3Y.js} +1 -1
  89. package/dist/{reconcile-cmd-KTCH4KZQ.js → reconcile-cmd-MNMWAZF3.js} +2 -2
  90. package/dist/{recording-banner-2KIVZAXY.js → recording-banner-IWY3GS6N.js} +1 -1
  91. package/dist/{require-project-folder-NOGEHZTS.js → require-project-folder-PFIDA5ZH.js} +1 -1
  92. package/dist/{review-cmd-SL52N4TM.js → review-cmd-RXPPC5GK.js} +1 -1
  93. package/dist/run-V2WMNHFK.js +2 -0
  94. package/dist/{run-test-md-ICLG4OPX.js → run-test-md-7GONSVAM.js} +2 -2
  95. package/dist/{skill-installer-KGPXQRCE.js → skill-installer-YZP5DWWZ.js} +1 -1
  96. package/dist/{spawner-DDD3ICOX.js → spawner-YDYCSTZD.js} +1 -1
  97. package/dist/tcg-generate-ZRKSX2KC.js +2 -0
  98. package/dist/testmd-actions-7RNW76DN.js +2 -0
  99. package/dist/token-refresh-DH2L2IPP.js +2 -0
  100. package/dist/{turn-preflight-I5SM4UIZ.js → turn-preflight-JGYT7LXP.js} +1 -1
  101. package/dist/{validate-basic-QCD4VN37.js → validate-basic-IQY5CRLP.js} +1 -1
  102. package/dist/{version-check-55YZMQUI.js → version-check-U5UBPVX4.js} +1 -1
  103. package/package.json +6 -6
  104. package/dist/EvidenceViewOffer-N4UED7VY.js +0 -2
  105. package/dist/FolderPicker-NAFYP7ES.js +0 -2
  106. package/dist/SingleShotApp-PS42WWT7.js +0 -2
  107. package/dist/TestMdRunView-5FVCEQZI.js +0 -2
  108. package/dist/chunk-5446YVGQ.js +0 -4
  109. package/dist/chunk-5ILXUQIX.js +0 -2
  110. package/dist/chunk-WUMNIGPR.js +0 -2
  111. package/dist/login-flow-GMLHK6JT.js +0 -2
  112. package/dist/run-P4CHG2VH.js +0 -2
  113. package/dist/tcg-generate-KBXZIIHB.js +0 -2
  114. package/dist/testmd-actions-45BY3YFO.js +0 -2
  115. package/dist/token-refresh-OCFALJ7U.js +0 -2
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a}from"./chunk-DEYHK6ZC.js";import"./chunk-4G4HPMR2.js";import"./chunk-RFHMDQXZ.js";import"./chunk-RZ4F3BHX.js";import"./chunk-YIOWO6WS.js";import"./chunk-L4AUCQVO.js";import"./chunk-QIE62H3J.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-RTWWPEQ7.js";import"./chunk-NFOBDHZK.js";import"./chunk-L5LI2JF4.js";import"./chunk-MKD3KZPM.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}
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-EK2B2LZK.js";import"./chunk-NFOBDHZK.js";import"./chunk-L5LI2JF4.js";import"./chunk-QIE62H3J.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-ABSEKYIB.js";import"./chunk-FYOCF7DY.js";import"./chunk-RGEAEAZB.js";import"./chunk-BC7UVJJB.js";import"./chunk-NFOBDHZK.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-2WVKOZ6W.js";import"./chunk-NLCCBXXV.js";import"./chunk-INP7FG6V.js";import"./chunk-RZ4F3BHX.js";import"./chunk-MKD3KZPM.js";import"./chunk-UR6MHSHU.js";export{c as UploadPipeline,b as packPresignEntry,a as readPackForUpload};
2
+ import{a,b,c}from"./chunk-GIGD4M7V.js";import"./chunk-2YQ6TW77.js";import"./chunk-WAOCHXJ5.js";import"./chunk-YSK535OI.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-YIOWO6WS.js";import"./chunk-QIE62H3J.js";import"./chunk-UR6MHSHU.js";export{c as UploadPipeline,b as packPresignEntry,a as readPackForUpload};
@@ -1,6 +1,6 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as re}from"./chunk-CE664P73.js";import{a as te,b as j,d as B}from"./chunk-TZVURR5H.js";import"./chunk-NNZV5RCE.js";import{a as R,b as ee,d as ne}from"./chunk-AD46OCZ4.js";import{a as Z}from"./chunk-JFAFKHDX.js";import{a as Q}from"./chunk-QPZRHAYK.js";import"./chunk-ZKYYZ5NO.js";import{a as X,b as M}from"./chunk-YANCBRER.js";import"./chunk-BC7UVJJB.js";import{d as z}from"./chunk-KHDUQ33H.js";import{a as E}from"./chunk-D5T4ARTB.js";import"./chunk-AE6SS34N.js";import"./chunk-GIRXJOJI.js";import{e as G}from"./chunk-B2PZAB7J.js";import{d as v,e as P,g as H}from"./chunk-IACKIGPX.js";import"./chunk-UR6MHSHU.js";import{existsSync as Ae,lstatSync as Le,readdirSync as Te,statSync as Ie}from"fs";import{basename as J,join as Ne,relative as Fe,resolve as ye}from"path";var oe="this release plans changes only \u2014 blast-radius impact and drift meaning-checks are not measured, and REMOVE rows are never executed automatically",Re="suite untouched; graph updated";function W(e,t){return!e.superseded.has(t)&&e.trust.get(t)!=="archived"}function O(e,t){return e.nameOf.get(t)??t}function A(e){return String(e).slice(0,19)}function C(e,t,r){let n=e.edgesFrom(t).find(o=>o.type===r);return n?e.tipOf(n.dst):null}function se(e,t){let r=e.nodeLabel.get(t);if(r===v.USECASE)return t;if(r===v.SCENARIO)return C(e,t,P.BELONGS_TO);if(r===v.AC){let n=C(e,t,P.SCOPED_TO);return n?e.nodeLabel.get(n)===v.USECASE?n:C(e,n,P.BELONGS_TO):null}if(r===v.TEST){let n=C(e,t,P.AUTOMATES);return n?C(e,n,P.BELONGS_TO):null}return null}function ie(e,t){let r=[],n=new Map;for(let o of e.derivesInto(t))n.set(String(o.props.source_id),o);for(let[o,c]of n){let s=e.heads.get(o);if(s==null){r.push(`DERIVES pin ${o} @ ${A(c.props.source_cid)} \u2014 source retired`);continue}if(s!==c.props.source_cid){let d=e.convChains.get(o)?.chain;if(d&&d.includes(String(c.props.source_cid)))continue;r.push(`DERIVES pin ${o} @ ${A(c.props.source_cid)} \u2014 source head moved to ${A(s)}`)}}for(let o of e.edgesFrom(t))H(o.type)?.pin?.comparesTo==="dst_tip"&&e.superseded.has(o.dst)&&r.push(`${o.type} pin \u2192 ${O(e,o.dst)} \u2014 target superseded`);return r.join("; ")||"structural pin broken"}var ke=new Set([v.USECASE,v.SCENARIO,v.AC,v.TEST]);function F(e,t){return e.ref<t.ref?-1:e.ref>t.ref?1:0}function ae(e,t,r){let n=t.getNode(r)?.content.blob;if(typeof n!="string")return null;let o=z(e,n);return o===null?null:o.toString("utf8")}function Se(e,t,r,n,o){let c=r.props.quote;if(typeof c=="string"&&c.length>0)return n.includes(c);let s=String(r.props.source_cid);o.has(s)||o.set(s,ae(e,t,s));let d=o.get(s);if(d===null)return!1;let i=Q(d,String(r.props.anchor));return i===null?!1:i.split(`
3
- `).some(g=>g.trim().length>0&&n.includes(g.trim()))}function Ee(e,t,r){let n=e.getNode(t)?.content??{},o=e.getNode(r)?.content??{},s=[...new Set([...Object.keys(n),...Object.keys(o)])].sort().filter(d=>JSON.stringify(n[d])!==JSON.stringify(o[d]));return s.length>0?`updated: ${s.join(", ")}`:"updated"}function be(e,t,r,n,o,c){let s=[];for(let[p,u]of r.superseded)u===null||p===u||t.superseded.has(p)||r.nodeLabel.get(p)===v.USECASE&&s.push({kind:"MODIFIED",ref:O(r,p),old_cid:p,new_cid:u,summary:Ee(r,p,u)});let d=c.map(p=>({kind:"ADDED",ref:O(r,p),cid:p})),i=[],g=ae(e,r,o),f=new Map;for(let{cid:p}of r.byLabel(v.USECASE)){if(!W(r,p))continue;let u=r.derivesInto(p),m=u.filter(a=>String(a.props.source_id)===n);m.length===0||m.some(a=>a.props.source_cid===o)||g!==null&&m.some(a=>String(a.props.anchor)!=="img#whole"&&Se(e,r,a,g,f))||u.some(a=>{let l=String(a.props.source_id);if(l===n)return!1;let $=r.heads.get(l);return $!=null})||i.push({kind:"DROPPED",ref:O(r,p),cid:p,why:`evidence decayed: no quote from ${n} relocates into @${A(o)}, no other live source, no fresh evidence this run`})}let h=(p,u)=>p.ref<u.ref?-1:p.ref>u.ref?1:0;return[...s.sort(h),...d.sort(h),...i.sort(h)]}async function ce(e,t,r){let n=E(e),o=n.heads.get(t)??null,c=new Set(n.staleList().filter(a=>a.state==="stale").map(a=>a.cid)),s=await r.reingest(t);if(s.status==="unchanged")return{source_id:t,changed:!1,head:{status:s.status,before:o,after:s.cid},note:`nothing to reconcile \u2014 ${t} is unchanged`,skipped_arms:oe,changeset:[],rows:[]};let d=await r.reextract(t),i=E(e),g=d.minted.map(a=>{let l=O(i,a);return{kind:"ADD",ref:l,reason:`new use-case extracted from ${t}`,provenance:`extraction commit \u2014 DERIVES ${t} @ ${A(s.cid)}`,action:`kane-cli design tests --use-case ${l}`}}),f=i.staleList().filter(a=>a.state==="stale"&&!c.has(a.cid)&&W(i,a.cid)).map(a=>a.cid),h=f.map(a=>{let l=O(i,a),$=ke.has(i.nodeLabel.get(a)??"");return{kind:"ENHANCE",ref:l,reason:"stale (structural)",provenance:ie(i,a),action:$?`kane-cli maintain evolve ${l}`:`kane-cli design explain ${l}`}}),p=new Set;for(let a of[...d.minted,...d.matched])p.add(i.tipOf(a));for(let a of f){let l=se(i,i.tipOf(a));l&&i.nodeLabel.get(l)===v.USECASE&&p.add(i.tipOf(l))}let u=[];for(let a of await re(i,"design")){if(a.kind!=="no-verifies")continue;let l=i.resolve(a.ref);if(!l)continue;let $=se(i,l.tip);!$||!p.has(i.tipOf($))||u.push({kind:"ADD",ref:a.ref,reason:a.why,provenance:`gaps engine (design) \u2014 uncovered AC of touched use-case ${O(i,$)}`,action:a.ready_command})}let m=[];for(let{cid:a}of i.byLabel(v.USECASE))W(i,a)&&i.stale(a)==="orphaned"&&m.push({kind:"REMOVE",ref:O(i,a),reason:"orphaned \u2014 no live source evidences this use-case",provenance:ie(i,a),action:"plan-only \u2014 REMOVE is not executed in this release"});let w=new Set,b=[...g.sort(F),...u.sort(F),...h.sort(F),...m.sort(F)].filter(a=>{let l=`${a.kind}\0${a.ref}`;return w.has(l)?!1:(w.add(l),!0)});return{source_id:t,changed:!0,head:{status:s.status,before:o,after:s.cid},note:Re,skipped_arms:oe,changeset:be(e,n,i,t,s.cid,d.minted),rows:b}}function de(e,t){return async r=>{let{ingestFile:n}=await import("./ingest-4CGBXC2L.js"),o=await n({contextDir:e,filePath:t,asId:r});return{status:o.status,cid:o.cid}}}function le(e){return async t=>{let[{runExtract:r},{resolveAgentAuthEnv:n},{runAgent:o},{preflightTurn:c}]=await Promise.all([import("./run-P4CHG2VH.js"),import("./spawner-DDD3ICOX.js"),import("./bridge-QENVIWWC.js"),import("./turn-preflight-I5SM4UIZ.js")]),s=await n(),d=new Set(E(e).byLabel(v.USECASE).map(m=>m.cid)),i=0,g=await r({mode:"override"},{contextDir:e,agent:o,preflightTurn:()=>c(s),ask:async()=>[],review:async m=>new Map(m.map(w=>[w.temp_ref,{resolution:w.matches_existing&&w.changed?"edited":"skipped"}])),confirmStale:async()=>!1,out:m=>process.stderr.write(m+`
2
+ import{a as re}from"./chunk-CE664P73.js";import{a as te,b as j,d as B}from"./chunk-X4QL2DAD.js";import"./chunk-NNZV5RCE.js";import{a as R,b as ee,d as ne}from"./chunk-AD46OCZ4.js";import{a as X,b as M}from"./chunk-YANCBRER.js";import{a as Z}from"./chunk-JFAFKHDX.js";import{a as Q}from"./chunk-QPZRHAYK.js";import"./chunk-ZKYYZ5NO.js";import"./chunk-BC7UVJJB.js";import{d as z}from"./chunk-KHDUQ33H.js";import{a as E}from"./chunk-D5T4ARTB.js";import"./chunk-AE6SS34N.js";import"./chunk-GIRXJOJI.js";import{e as G}from"./chunk-B2PZAB7J.js";import{d as v,e as P,g as H}from"./chunk-IACKIGPX.js";import"./chunk-UR6MHSHU.js";import{existsSync as Ae,lstatSync as Le,readdirSync as Te,statSync as Ie}from"fs";import{basename as J,join as Ne,relative as Fe,resolve as ye}from"path";var oe="this release plans changes only \u2014 blast-radius impact and drift meaning-checks are not measured, and REMOVE rows are never executed automatically",Re="suite untouched; graph updated";function W(e,t){return!e.superseded.has(t)&&e.trust.get(t)!=="archived"}function O(e,t){return e.nameOf.get(t)??t}function A(e){return String(e).slice(0,19)}function C(e,t,r){let n=e.edgesFrom(t).find(o=>o.type===r);return n?e.tipOf(n.dst):null}function se(e,t){let r=e.nodeLabel.get(t);if(r===v.USECASE)return t;if(r===v.SCENARIO)return C(e,t,P.BELONGS_TO);if(r===v.AC){let n=C(e,t,P.SCOPED_TO);return n?e.nodeLabel.get(n)===v.USECASE?n:C(e,n,P.BELONGS_TO):null}if(r===v.TEST){let n=C(e,t,P.AUTOMATES);return n?C(e,n,P.BELONGS_TO):null}return null}function ie(e,t){let r=[],n=new Map;for(let o of e.derivesInto(t))n.set(String(o.props.source_id),o);for(let[o,c]of n){let s=e.heads.get(o);if(s==null){r.push(`DERIVES pin ${o} @ ${A(c.props.source_cid)} \u2014 source retired`);continue}if(s!==c.props.source_cid){let d=e.convChains.get(o)?.chain;if(d&&d.includes(String(c.props.source_cid)))continue;r.push(`DERIVES pin ${o} @ ${A(c.props.source_cid)} \u2014 source head moved to ${A(s)}`)}}for(let o of e.edgesFrom(t))H(o.type)?.pin?.comparesTo==="dst_tip"&&e.superseded.has(o.dst)&&r.push(`${o.type} pin \u2192 ${O(e,o.dst)} \u2014 target superseded`);return r.join("; ")||"structural pin broken"}var ke=new Set([v.USECASE,v.SCENARIO,v.AC,v.TEST]);function F(e,t){return e.ref<t.ref?-1:e.ref>t.ref?1:0}function ae(e,t,r){let n=t.getNode(r)?.content.blob;if(typeof n!="string")return null;let o=z(e,n);return o===null?null:o.toString("utf8")}function Se(e,t,r,n,o){let c=r.props.quote;if(typeof c=="string"&&c.length>0)return n.includes(c);let s=String(r.props.source_cid);o.has(s)||o.set(s,ae(e,t,s));let d=o.get(s);if(d===null)return!1;let i=Q(d,String(r.props.anchor));return i===null?!1:i.split(`
3
+ `).some(g=>g.trim().length>0&&n.includes(g.trim()))}function Ee(e,t,r){let n=e.getNode(t)?.content??{},o=e.getNode(r)?.content??{},s=[...new Set([...Object.keys(n),...Object.keys(o)])].sort().filter(d=>JSON.stringify(n[d])!==JSON.stringify(o[d]));return s.length>0?`updated: ${s.join(", ")}`:"updated"}function be(e,t,r,n,o,c){let s=[];for(let[p,u]of r.superseded)u===null||p===u||t.superseded.has(p)||r.nodeLabel.get(p)===v.USECASE&&s.push({kind:"MODIFIED",ref:O(r,p),old_cid:p,new_cid:u,summary:Ee(r,p,u)});let d=c.map(p=>({kind:"ADDED",ref:O(r,p),cid:p})),i=[],g=ae(e,r,o),f=new Map;for(let{cid:p}of r.byLabel(v.USECASE)){if(!W(r,p))continue;let u=r.derivesInto(p),m=u.filter(a=>String(a.props.source_id)===n);m.length===0||m.some(a=>a.props.source_cid===o)||g!==null&&m.some(a=>String(a.props.anchor)!=="img#whole"&&Se(e,r,a,g,f))||u.some(a=>{let l=String(a.props.source_id);if(l===n)return!1;let $=r.heads.get(l);return $!=null})||i.push({kind:"DROPPED",ref:O(r,p),cid:p,why:`evidence decayed: no quote from ${n} relocates into @${A(o)}, no other live source, no fresh evidence this run`})}let h=(p,u)=>p.ref<u.ref?-1:p.ref>u.ref?1:0;return[...s.sort(h),...d.sort(h),...i.sort(h)]}async function ce(e,t,r){let n=E(e),o=n.heads.get(t)??null,c=new Set(n.staleList().filter(a=>a.state==="stale").map(a=>a.cid)),s=await r.reingest(t);if(s.status==="unchanged")return{source_id:t,changed:!1,head:{status:s.status,before:o,after:s.cid},note:`nothing to reconcile \u2014 ${t} is unchanged`,skipped_arms:oe,changeset:[],rows:[]};let d=await r.reextract(t),i=E(e),g=d.minted.map(a=>{let l=O(i,a);return{kind:"ADD",ref:l,reason:`new use-case extracted from ${t}`,provenance:`extraction commit \u2014 DERIVES ${t} @ ${A(s.cid)}`,action:`kane-cli design tests --use-case ${l}`}}),f=i.staleList().filter(a=>a.state==="stale"&&!c.has(a.cid)&&W(i,a.cid)).map(a=>a.cid),h=f.map(a=>{let l=O(i,a),$=ke.has(i.nodeLabel.get(a)??"");return{kind:"ENHANCE",ref:l,reason:"stale (structural)",provenance:ie(i,a),action:$?`kane-cli maintain evolve ${l}`:`kane-cli design explain ${l}`}}),p=new Set;for(let a of[...d.minted,...d.matched])p.add(i.tipOf(a));for(let a of f){let l=se(i,i.tipOf(a));l&&i.nodeLabel.get(l)===v.USECASE&&p.add(i.tipOf(l))}let u=[];for(let a of await re(i,"design")){if(a.kind!=="no-verifies")continue;let l=i.resolve(a.ref);if(!l)continue;let $=se(i,l.tip);!$||!p.has(i.tipOf($))||u.push({kind:"ADD",ref:a.ref,reason:a.why,provenance:`gaps engine (design) \u2014 uncovered AC of touched use-case ${O(i,$)}`,action:a.ready_command})}let m=[];for(let{cid:a}of i.byLabel(v.USECASE))W(i,a)&&i.stale(a)==="orphaned"&&m.push({kind:"REMOVE",ref:O(i,a),reason:"orphaned \u2014 no live source evidences this use-case",provenance:ie(i,a),action:"plan-only \u2014 REMOVE is not executed in this release"});let w=new Set,b=[...g.sort(F),...u.sort(F),...h.sort(F),...m.sort(F)].filter(a=>{let l=`${a.kind}\0${a.ref}`;return w.has(l)?!1:(w.add(l),!0)});return{source_id:t,changed:!0,head:{status:s.status,before:o,after:s.cid},note:Re,skipped_arms:oe,changeset:be(e,n,i,t,s.cid,d.minted),rows:b}}function de(e,t){return async r=>{let{ingestFile:n}=await import("./ingest-4CGBXC2L.js"),o=await n({contextDir:e,filePath:t,asId:r});return{status:o.status,cid:o.cid}}}function le(e){return async t=>{let[{runExtract:r},{resolveAgentAuthEnv:n},{runAgent:o},{preflightTurn:c}]=await Promise.all([import("./run-V2WMNHFK.js"),import("./spawner-YDYCSTZD.js"),import("./bridge-I6N3YPXI.js"),import("./turn-preflight-JGYT7LXP.js")]),s=await n(),d=new Set(E(e).byLabel(v.USECASE).map(m=>m.cid)),i=0,g=await r({mode:"override"},{contextDir:e,agent:o,preflightTurn:()=>c(s),ask:async()=>[],review:async m=>new Map(m.map(w=>[w.temp_ref,{resolution:w.matches_existing&&w.changed?"edited":"skipped"}])),confirmStale:async()=>!1,out:m=>process.stderr.write(m+`
4
4
  `),progress:m=>process.stderr.write(m+`
5
5
  `),emit:m=>{m.type==="commit"&&typeof m.assumed=="number"&&(i+=m.assumed)},isTTY:!1,auth:s});if(g!==0)throw new Error(`reconcile: re-extract of ${t} failed (exit ${g})`);let f=E(e),h=f.heads.get(t),p=[],u=[];if(typeof h=="string"){let m=new Set;for(let w of f.edgesFrom(h))w.type!==P.DERIVES||f.nodeLabel.get(w.dst)!==v.USECASE||m.has(w.dst)||(m.add(w.dst),(d.has(w.dst)?u:p).push(w.dst))}return{minted:p,matched:u,defaultsTaken:i}}}import{closeSync as Oe,existsSync as Pe,mkdirSync as pe,openSync as De,readFileSync as V,readdirSync as _e,renameSync as xe,rmSync as ue,writeFileSync as fe}from"fs";import{join as L}from"path";var D=class extends Error{constructor(r,n){super(`${r}: ${n}`);this.code=r}},K=e=>L(e,"reconcile","plans");function ge(e,t){let r=`${e}.tmp-${process.pid}`;fe(r,t,{mode:384}),xe(r,e)}function me(e,t){let r=K(e);pe(r,{recursive:!0});let n=L(r,`${t.created}-${t.source_id}.json`);return ge(n,JSON.stringify(t,null,2)+`
6
6
  `),n}function Y(e,t){let r=t;if(r===void 0){let s=K(e),d=[];try{d=_e(s).filter(i=>i.endsWith(".json")).sort()}catch{}if(d.length===0)return{error:`no stored plans under ${s} \u2014 run reconcile --plan first`};r=L(s,d[d.length-1])}if(!Pe(r))return{error:`no such plan file: ${r}`};let n;try{n=V(r,"utf8")}catch(s){return{error:`cannot read plan ${r}: ${s instanceof Error?s.message:String(s)}`}}let o;try{o=JSON.parse(n)}catch(s){return{error:`corrupted plan ${r}: ${s instanceof Error?s.message:String(s)}`}}let c=o?.version;return c!==1?{error:`unsupported plan version ${String(c)} in ${r} (expected 1)`}:Array.isArray(o.rows)?{plan:o,path:r}:{error:`not a reconcile plan \u2014 ${r} has no rows[] (hand-edited?)`}}function q(e,t,r){let n;try{n=JSON.parse(V(e,"utf8"))}catch(c){throw new D("PLAN_UNREADABLE",`${e}: ${c instanceof Error?c.message:String(c)}`)}let o=n.rows?.[t];if(!o)throw new D("ROW_MISSING",`${e} has no row ${t}`);if(o.applied)throw new D("ROW_ALREADY_APPLIED",`row ${t} of ${e} was already applied (${o.applied.outcome} at ${o.applied.at})`);o.applied={at:new Date().toISOString(),outcome:r},ge(e,JSON.stringify(n,null,2)+`
@@ -1,3 +1,3 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
2
  import{a as n}from"./chunk-3MSXQU2C.js";import"./chunk-UR6MHSHU.js";function p(t){let s=t.sessionName!==null,e={type:"recording_state",enabled:!0,session_id:t.sessionId,persist:s};return t.sessionName&&(e.session_name=t.sessionName),t.testPath&&(e.test_path=t.testPath),t.outputPath&&(e.output_path=t.outputPath),e}async function g(t){if(t.isAgent){process.stdout.write(JSON.stringify(p(t))+`
3
- `);return}let s=(await import("./react-QWOAB3TB.js")).default,{render:e,useApp:a}=await import("./build-JIKYOZUH.js"),{useEffect:o}=s,{InfoBox:r}=await import("./InfoBox-7ZZGMYHY.js"),u=t.sessionName?[{label:"session",value:t.sessionName},{label:"test",value:n(t.testPath??"")},{label:"output",value:n(t.outputPath??"")}]:[{label:"session",value:"ephemeral"},{label:"note",value:"use /name <name> to persist this session"}];function l(){let{exit:i}=a();return o(()=>{let c=setTimeout(()=>i(),50);return()=>clearTimeout(c)},[i]),s.createElement(r,{title:"Recording",titleColor:"#ff9500",rows:u})}await e(s.createElement(l),{stdout:process.stderr}).waitUntilExit()}export{p as buildRecordingStateEvent,g as printRecordingBanner};
3
+ `);return}let s=(await import("./react-QWOAB3TB.js")).default,{render:e,useApp:a}=await import("./build-JIKYOZUH.js"),{useEffect:o}=s,{InfoBox:r}=await import("./InfoBox-PXWJ6BIX.js"),u=t.sessionName?[{label:"session",value:t.sessionName},{label:"test",value:n(t.testPath??"")},{label:"output",value:n(t.outputPath??"")}]:[{label:"session",value:"ephemeral"},{label:"note",value:"use /name <name> to persist this session"}];function l(){let{exit:i}=a();return o(()=>{let c=setTimeout(()=>i(),50);return()=>clearTimeout(c)},[i]),s.createElement(r,{title:"Recording",titleColor:"#ff9500",rows:u})}await e(s.createElement(l),{stdout:process.stderr}).waitUntilExit()}export{p as buildRecordingStateEvent,g as printRecordingBanner};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as a,c as b,d as c,e as d,f as e,g as f,h as g}from"./chunk-FPGOV4AQ.js";import"./chunk-2WVKOZ6W.js";import"./chunk-NLCCBXXV.js";import"./chunk-VE3SUJMA.js";import"./chunk-INP7FG6V.js";import"./chunk-RZ4F3BHX.js";import"./chunk-MKD3KZPM.js";import"./chunk-UR6MHSHU.js";export{d as buildAutoDefaultAnnouncement,f as buildAutoDefaultedEvent,e as buildAutoDefaultedNdjson,c as buildRemediationMessage,b as decideGateAction,a as loadCachedIds,g as requireProjectFolder};
2
+ import{b as a,c as b,d as c,e as d,f as e,g as f,h as g}from"./chunk-HR7AGYV2.js";import"./chunk-2WVKOZ6W.js";import"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import"./chunk-YIOWO6WS.js";import"./chunk-VE3SUJMA.js";import"./chunk-QIE62H3J.js";import"./chunk-UR6MHSHU.js";export{d as buildAutoDefaultAnnouncement,f as buildAutoDefaultedEvent,e as buildAutoDefaultedNdjson,c as buildRemediationMessage,b as decideGateAction,a as loadCachedIds,g as requireProjectFolder};
@@ -1,4 +1,4 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as j}from"./chunk-AD46OCZ4.js";import{g as b}from"./chunk-5ILXUQIX.js";import"./chunk-QPZRHAYK.js";import"./chunk-ZKYYZ5NO.js";import"./chunk-BC7UVJJB.js";import{a as _}from"./chunk-D5T4ARTB.js";import"./chunk-AE6SS34N.js";import"./chunk-GIRXJOJI.js";import{d as V}from"./chunk-B2PZAB7J.js";import"./chunk-IACKIGPX.js";import"./chunk-UR6MHSHU.js";import{readFileSync as E}from"fs";var O=new Set(["derived","skipped","archived","drift"]),q={kind:"human",id:process.env.USER??"operator"};function R(d,r){return d.nameOf.get(r)??r.slice(0,19)}function N(d,r){let n=d.getNode(r)?.content??{},a=d.derivesInto(r)[0]?.props.anchor;return{cid:r,uc:{temp_ref:r,title:String(n.title??n.text??""),summary:n.summary!==void 0?String(n.summary):void 0,risk:String(n.risk??"med"),cite:{anchor:typeof a=="string"?a:"\u2014",quote:""},depends_on_hint:[],matches_existing:null}}}function T(d,r){let n=new Set,{records:a}=V(d);for(let s of a){if(s.proposal_id==null)continue;let u=new Set(s.review.map(e=>e.id));for(let e of s.nodes)u.has(e.cid)||n.add(e.cid)}for(let s of[...n])(r.trust.get(s)!=="derived"||r.superseded.has(s))&&n.delete(s);return n}var x=new Set(["approved","edited","rejected","skipped","supersede"]);function C(d){let r;try{r=JSON.parse(d)}catch(s){return{errors:[`not valid JSON: ${s instanceof Error?s.message:String(s)}`]}}if(!Array.isArray(r))return{errors:['expected a top-level array of {"ref", "resolution", ...} entries']};let n=[],a=[];return r.forEach((s,u)=>{if(s==null||typeof s!="object"||Array.isArray(s)){n.push(`[${u}]: not an object`);return}let e=s;(typeof e.ref!="string"||!e.ref.trim())&&n.push(`[${u}]: "ref" (slug or cid) is required`),(typeof e.resolution!="string"||!x.has(e.resolution))&&n.push(`[${u}]: "resolution" must be one of approved | edited | rejected | skipped | supersede`),e.resolution==="supersede"&&(typeof e.supersede_target!="string"||!e.supersede_target.trim())&&n.push(`[${u}]: resolution "supersede" requires "supersede_target" (slug or cid)`),e.edit!==void 0&&(e.edit==null||typeof e.edit!="object"||Array.isArray(e.edit))&&n.push(`[${u}]: "edit" must be an object ({title?, summary?, risk?})`),n.length===0&&a.push(e)}),n.length>0?{errors:n}:{entries:a}}async function I(d,r,n,a=process.cwd()){let s=d.queue??"derived";if(!O.has(s))return r.out(`unknown queue ${s} \u2014 one of: derived | skipped | archived | drift`),2;let u=j(a,r);if(!u)return 2;let e=_(u);if(d.verdicts){let i=t=>(r.err??r.out)(t),o;try{o=E(d.verdicts,"utf8")}catch{return i(`error: cannot read verdicts file ${d.verdicts}`),2}let l=C(o);if("errors"in l){for(let t of l.errors)i(`error: --verdicts ${d.verdicts}: ${t}`);return 2}let c=new Set([...e.trust.entries()].filter(([t,p])=>(p==="derived"||p==="archived")&&!e.superseded.has(t)).map(([t])=>t)),f=new Map,y=[];for(let t of l.entries){let p=e.resolve(t.ref),m=p&&!e.superseded.has(p.tip)?p.tip:null;if(!m){y.push(`${t.ref}: names nothing in the graph`);continue}if(!c.has(m)){y.push(`${t.ref}: not in a review queue (trust: ${e.trust.get(m)??"?"})`);continue}if(f.has(m)){y.push(`${t.ref}: duplicate \u2014 an earlier entry already resolves to this node (${R(e,m)})`);continue}f.set(m,{resolution:t.resolution,...t.reason?{reason:t.reason}:{},...t.edit?{edit:t.edit}:{},...t.supersede_target?{supersedeTarget:t.supersede_target}:{}})}if(y.length>0){for(let t of y)i(`error: --verdicts: ${t}`);return i("error: nothing committed (the verdicts file is atomic \u2014 fix every offender and re-run)"),2}let k=b({contextDir:u,graph:e,verdicts:f,by:q});if(k.errors){if(k.errors[0]?.code==="NO_VERDICTS")return i("nothing changed \u2014 every item was skipped"),0;for(let t of k.errors)i(`${t.code}: ${t.detail}`);return 1}let S=new Map;for(let t of f.values())S.set(t.resolution,(S.get(t.resolution)??0)+1);if(d.json)for(let[t,p]of f.entries())r.out(JSON.stringify({ref:R(e,t),cid:t,resolution:p.resolution}));else{let t=[...S.entries()].map(([p,m])=>`${m} ${p}`).join(", ");r.out(`review: committed record ${k.record.seq} \u2014 ${t}`)}return 0}if(s==="drift"){let i=e.staleList().filter(({state:o})=>o!=="superseded").map(({cid:o,state:l})=>({ref:R(e,o),cid:o,state:l,title:String(e.getNode(o)?.content.title??e.getNode(o)?.content.source_id??""),pinned_sources:[...new Set(e.derivesInto(o).map(c=>String(c.props.source_id)))]}));if(d.json){for(let o of i)r.out(JSON.stringify(o));return 0}if(i.length===0)return r.out("drift queue is empty \u2014 every node's evidence matches the current source snapshots"),0;r.out(`${i.length} node(s) with drifting evidence (re-extract the source to re-bless):`);for(let o of i)r.out(` [${o.state}] ${o.ref} \xB7 ${o.title} \xB7 sources: ${o.pinned_sources.join(", ")||"\u2014"}`);return 0}if(!r.isTTY)return r.out("review: verdict queues need a TTY (drift listing works anywhere, or pass --verdicts <file.json>)"),2;let g,h;if(s==="archived")g=[...e.trust.entries()].filter(([i,o])=>o==="archived"&&!e.superseded.has(i)).map(([i])=>N(e,i)),h="skipped";else{let i=T(u,e),o=[...e.trust.entries()].filter(([c,f])=>f==="derived"&&!e.superseded.has(c)).map(([c])=>c),l=s==="skipped"?o.filter(c=>i.has(c)):o;l.sort((c,f)=>Number(i.has(f))-Number(i.has(c))),g=l.map(c=>N(e,c)),h="skipped"}if(g.length===0)return r.out(`${s} queue is empty`),0;r.out(`${g.length} node(s) in the ${s} queue \u2014 approve promotes, reject ${s==="archived"?"re-archives":"archives"}, edit mints a new version, skip leaves it for later`);let v=await n(g,e,h),w=b({contextDir:u,graph:e,verdicts:v,by:q});if(w.errors){if(w.errors[0]?.code==="NO_VERDICTS")return r.out("nothing changed \u2014 every item was skipped"),0;for(let i of w.errors)r.out(`${i.code}: ${i.detail}`);return 1}let $=w.record;return r.out(`committed record ${$.seq}: ${$.review.length} review fact(s), ${$.supersessions.length} supersession(s), ${$.nodes.length} new version(s)`),0}async function P(d,r,n){let[{render:a},s,{ReviewChecklist:u}]=await Promise.all([import("./build-JIKYOZUH.js"),import("./react-QWOAB3TB.js"),import("./ui-JEJGTURD.js")]),e=s.default??s;return new Promise(g=>{let h=a(e.createElement(u,{items:d.map(v=>({uc:v.uc})),defaultResolution:n,onSubmit:v=>{h.unmount(),g(v)}}))})}async function D(d){let{bothTTY:r}=await import("./headless-io-GXHKDPHB.js");return I(d,{out:n=>process.stdout.write(n+`
2
+ import{b as j}from"./chunk-AD46OCZ4.js";import{g as b}from"./chunk-FTD3B7QA.js";import"./chunk-QPZRHAYK.js";import"./chunk-ZKYYZ5NO.js";import"./chunk-BC7UVJJB.js";import{a as _}from"./chunk-D5T4ARTB.js";import"./chunk-AE6SS34N.js";import"./chunk-GIRXJOJI.js";import{d as V}from"./chunk-B2PZAB7J.js";import"./chunk-IACKIGPX.js";import"./chunk-UR6MHSHU.js";import{readFileSync as E}from"fs";var O=new Set(["derived","skipped","archived","drift"]),q={kind:"human",id:process.env.USER??"operator"};function R(d,r){return d.nameOf.get(r)??r.slice(0,19)}function N(d,r){let n=d.getNode(r)?.content??{},a=d.derivesInto(r)[0]?.props.anchor;return{cid:r,uc:{temp_ref:r,title:String(n.title??n.text??""),summary:n.summary!==void 0?String(n.summary):void 0,risk:String(n.risk??"med"),cite:{anchor:typeof a=="string"?a:"\u2014",quote:""},depends_on_hint:[],matches_existing:null}}}function T(d,r){let n=new Set,{records:a}=V(d);for(let s of a){if(s.proposal_id==null)continue;let u=new Set(s.review.map(e=>e.id));for(let e of s.nodes)u.has(e.cid)||n.add(e.cid)}for(let s of[...n])(r.trust.get(s)!=="derived"||r.superseded.has(s))&&n.delete(s);return n}var x=new Set(["approved","edited","rejected","skipped","supersede"]);function C(d){let r;try{r=JSON.parse(d)}catch(s){return{errors:[`not valid JSON: ${s instanceof Error?s.message:String(s)}`]}}if(!Array.isArray(r))return{errors:['expected a top-level array of {"ref", "resolution", ...} entries']};let n=[],a=[];return r.forEach((s,u)=>{if(s==null||typeof s!="object"||Array.isArray(s)){n.push(`[${u}]: not an object`);return}let e=s;(typeof e.ref!="string"||!e.ref.trim())&&n.push(`[${u}]: "ref" (slug or cid) is required`),(typeof e.resolution!="string"||!x.has(e.resolution))&&n.push(`[${u}]: "resolution" must be one of approved | edited | rejected | skipped | supersede`),e.resolution==="supersede"&&(typeof e.supersede_target!="string"||!e.supersede_target.trim())&&n.push(`[${u}]: resolution "supersede" requires "supersede_target" (slug or cid)`),e.edit!==void 0&&(e.edit==null||typeof e.edit!="object"||Array.isArray(e.edit))&&n.push(`[${u}]: "edit" must be an object ({title?, summary?, risk?})`),n.length===0&&a.push(e)}),n.length>0?{errors:n}:{entries:a}}async function I(d,r,n,a=process.cwd()){let s=d.queue??"derived";if(!O.has(s))return r.out(`unknown queue ${s} \u2014 one of: derived | skipped | archived | drift`),2;let u=j(a,r);if(!u)return 2;let e=_(u);if(d.verdicts){let i=t=>(r.err??r.out)(t),o;try{o=E(d.verdicts,"utf8")}catch{return i(`error: cannot read verdicts file ${d.verdicts}`),2}let l=C(o);if("errors"in l){for(let t of l.errors)i(`error: --verdicts ${d.verdicts}: ${t}`);return 2}let c=new Set([...e.trust.entries()].filter(([t,p])=>(p==="derived"||p==="archived")&&!e.superseded.has(t)).map(([t])=>t)),f=new Map,y=[];for(let t of l.entries){let p=e.resolve(t.ref),m=p&&!e.superseded.has(p.tip)?p.tip:null;if(!m){y.push(`${t.ref}: names nothing in the graph`);continue}if(!c.has(m)){y.push(`${t.ref}: not in a review queue (trust: ${e.trust.get(m)??"?"})`);continue}if(f.has(m)){y.push(`${t.ref}: duplicate \u2014 an earlier entry already resolves to this node (${R(e,m)})`);continue}f.set(m,{resolution:t.resolution,...t.reason?{reason:t.reason}:{},...t.edit?{edit:t.edit}:{},...t.supersede_target?{supersedeTarget:t.supersede_target}:{}})}if(y.length>0){for(let t of y)i(`error: --verdicts: ${t}`);return i("error: nothing committed (the verdicts file is atomic \u2014 fix every offender and re-run)"),2}let k=b({contextDir:u,graph:e,verdicts:f,by:q});if(k.errors){if(k.errors[0]?.code==="NO_VERDICTS")return i("nothing changed \u2014 every item was skipped"),0;for(let t of k.errors)i(`${t.code}: ${t.detail}`);return 1}let S=new Map;for(let t of f.values())S.set(t.resolution,(S.get(t.resolution)??0)+1);if(d.json)for(let[t,p]of f.entries())r.out(JSON.stringify({ref:R(e,t),cid:t,resolution:p.resolution}));else{let t=[...S.entries()].map(([p,m])=>`${m} ${p}`).join(", ");r.out(`review: committed record ${k.record.seq} \u2014 ${t}`)}return 0}if(s==="drift"){let i=e.staleList().filter(({state:o})=>o!=="superseded").map(({cid:o,state:l})=>({ref:R(e,o),cid:o,state:l,title:String(e.getNode(o)?.content.title??e.getNode(o)?.content.source_id??""),pinned_sources:[...new Set(e.derivesInto(o).map(c=>String(c.props.source_id)))]}));if(d.json){for(let o of i)r.out(JSON.stringify(o));return 0}if(i.length===0)return r.out("drift queue is empty \u2014 every node's evidence matches the current source snapshots"),0;r.out(`${i.length} node(s) with drifting evidence (re-extract the source to re-bless):`);for(let o of i)r.out(` [${o.state}] ${o.ref} \xB7 ${o.title} \xB7 sources: ${o.pinned_sources.join(", ")||"\u2014"}`);return 0}if(!r.isTTY)return r.out("review: verdict queues need a TTY (drift listing works anywhere, or pass --verdicts <file.json>)"),2;let g,h;if(s==="archived")g=[...e.trust.entries()].filter(([i,o])=>o==="archived"&&!e.superseded.has(i)).map(([i])=>N(e,i)),h="skipped";else{let i=T(u,e),o=[...e.trust.entries()].filter(([c,f])=>f==="derived"&&!e.superseded.has(c)).map(([c])=>c),l=s==="skipped"?o.filter(c=>i.has(c)):o;l.sort((c,f)=>Number(i.has(f))-Number(i.has(c))),g=l.map(c=>N(e,c)),h="skipped"}if(g.length===0)return r.out(`${s} queue is empty`),0;r.out(`${g.length} node(s) in the ${s} queue \u2014 approve promotes, reject ${s==="archived"?"re-archives":"archives"}, edit mints a new version, skip leaves it for later`);let v=await n(g,e,h),w=b({contextDir:u,graph:e,verdicts:v,by:q});if(w.errors){if(w.errors[0]?.code==="NO_VERDICTS")return r.out("nothing changed \u2014 every item was skipped"),0;for(let i of w.errors)r.out(`${i.code}: ${i.detail}`);return 1}let $=w.record;return r.out(`committed record ${$.seq}: ${$.review.length} review fact(s), ${$.supersessions.length} supersession(s), ${$.nodes.length} new version(s)`),0}async function P(d,r,n){let[{render:a},s,{ReviewChecklist:u}]=await Promise.all([import("./build-JIKYOZUH.js"),import("./react-QWOAB3TB.js"),import("./ui-JEJGTURD.js")]),e=s.default??s;return new Promise(g=>{let h=a(e.createElement(u,{items:d.map(v=>({uc:v.uc})),defaultResolution:n,onSubmit:v=>{h.unmount(),g(v)}}))})}async function D(d){let{bothTTY:r}=await import("./headless-io-GXHKDPHB.js");return I(d,{out:n=>process.stdout.write(n+`
3
3
  `),err:n=>process.stderr.write(n+`
4
4
  `),confirm:async()=>!1,isTTY:r()},P)}export{C as parseVerdictsFile,D as reviewCommand,I as runReviewCommand};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as b,b as c,c as d}from"./chunk-HW7Z5S2M.js";import{e as a}from"./chunk-WM5QHLAP.js";import"./chunk-I2S6KNZW.js";import"./chunk-FXPPQL4D.js";import"./chunk-DM2GL24Z.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"./chunk-KHDUQ33H.js";import"./chunk-D5T4ARTB.js";import"./chunk-AE6SS34N.js";import"./chunk-GIRXJOJI.js";import"./chunk-B2PZAB7J.js";import"./chunk-IACKIGPX.js";import"./chunk-QIE62H3J.js";import"./chunk-UR6MHSHU.js";export{c as dedupPreFlags,a as resolveAnswers,d as runExtract,b as sessionSourceRef};
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as A}from"./chunk-6BQD2BXI.js";import{E as M,F as P,G as K,H,I as U}from"./chunk-NTJDMMLC.js";import{a as _,b as E}from"./chunk-WG3BBXJF.js";import{a as h,b as k}from"./chunk-GNGGFK7C.js";import"./chunk-LMJTY32X.js";import{s as L}from"./chunk-RKWJG3WW.js";import{c as R}from"./chunk-BV3EARZO.js";import"./chunk-XQDDUVD3.js";import"./chunk-5U3GOEGG.js";import{a as x}from"./chunk-RTWWPEQ7.js";import"./chunk-C5UNZ6ZY.js";import"./chunk-S3DAAAE5.js";import"./chunk-GIGD4M7V.js";import"./chunk-2YQ6TW77.js";import"./chunk-FPFOW6BS.js";import"./chunk-WAOCHXJ5.js";import"./chunk-ABSEKYIB.js";import"./chunk-FYOCF7DY.js";import"./chunk-RGEAEAZB.js";import"./chunk-BC7UVJJB.js";import"./chunk-NFOBDHZK.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{e as b,f as S,g as T}from"./chunk-M5JQXOCE.js";import"./chunk-FPGOV4AQ.js";import"./chunk-2WVKOZ6W.js";import"./chunk-NLCCBXXV.js";import"./chunk-VE3SUJMA.js";import"./chunk-QI6WZ56Y.js";import"./chunk-D5SHVZGD.js";import{a as C}from"./chunk-INP7FG6V.js";import"./chunk-RZ4F3BHX.js";import"./chunk-E47GFYXA.js";import{a as v}from"./chunk-OXARXMMD.js";import"./chunk-MKD3KZPM.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";import{resolve as Y}from"path";import{existsSync as D}from"fs";function O(){return{register:(n,r)=>b(n,r),deregister:n=>S(n),cleanup:(n,r)=>T(n,r),remoteLogger:null}}async function le(n,r){let t=Y(n);if(!D(t))return process.stderr.write(`error: file not found: ${t}
2
+ import{a as A}from"./chunk-6UNTIXFW.js";import{E as M,F as P,G as K,H,I as U}from"./chunk-4PIMEZJW.js";import"./chunk-GIGD4M7V.js";import{a as _,b as E}from"./chunk-D5DEWIAU.js";import{a as h,b as k}from"./chunk-OZODSY6H.js";import"./chunk-2YQ6TW77.js";import"./chunk-LMJTY32X.js";import{s as L}from"./chunk-RKWJG3WW.js";import{c as R}from"./chunk-2U5DZUC7.js";import"./chunk-44QUA6GV.js";import"./chunk-IDDVO4UV.js";import{a as x}from"./chunk-EK2B2LZK.js";import"./chunk-C5UNZ6ZY.js";import"./chunk-S3DAAAE5.js";import"./chunk-35SRW4KA.js";import"./chunk-4G4HPMR2.js";import"./chunk-FPFOW6BS.js";import"./chunk-WAOCHXJ5.js";import"./chunk-YSK535OI.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{e as b,f as S,g as T}from"./chunk-M5JQXOCE.js";import"./chunk-HR7AGYV2.js";import"./chunk-2WVKOZ6W.js";import"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import{a as C}from"./chunk-YIOWO6WS.js";import"./chunk-VE3SUJMA.js";import"./chunk-E47GFYXA.js";import{a as v}from"./chunk-L4AUCQVO.js";import"./chunk-QIE62H3J.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";import{resolve as Y}from"path";import{existsSync as D}from"fs";function O(){return{register:(n,r)=>b(n,r),deregister:n=>S(n),cleanup:(n,r)=>T(n,r),remoteLogger:null}}async function le(n,r){let t=Y(n);if(!D(t))return process.stderr.write(`error: file not found: ${t}
3
3
  `),2;if(r.finalValidation!==void 0&&r.finalValidation!=="on"&&r.finalValidation!=="off")return process.stderr.write(`error: --final-validation must be 'on' or 'off'
4
4
  `),2;if(!t.endsWith("_test.md"))return process.stderr.write(`error: not a *_test.md file: ${t}
5
5
  helpers are import-only \u2014 run a test that @imports it.
@@ -12,6 +12,6 @@ import{a as A}from"./chunk-6BQD2BXI.js";import{E as M,F as P,G as K,H,I as U}fro
12
12
  \u2022 Run 'kane-cli login --username <user> --access-key <key>'
13
13
  `):e instanceof h&&e.code==="refresh_failed"?process.stderr.write(`error: Token refresh failed. Run 'kane-cli login' to re-authenticate.
14
14
  `):process.stderr.write(`error: auth resolution failed: ${e.message}
15
- `),2}let y=String(p.resolvedCreds?.org_id??"");if(!y)return process.stderr.write("error: TMS did not return an org_id. Run `kane-cli login` again.\n"),2;{let{readMetaIfExists:e,assertOrgMatchOrExit:g}=await import("./testmd-actions-45BY3YFO.js"),d=g(e(t),y);if(d!==null)return d}let w=new R,j=A({isAgent:a,log:(e,g,d,V)=>w.log(e,g,d,V)}),F={path:t,cwd:process.cwd(),opts:r,isAgent:a,disableAskUser:!0,resolved:s,resolvedAuth:p,cliOverrides:i,environment:f,envConfig:N,profile:I,model:$,creds:o,configStore:l,session:w};try{return(await M(F,j,c)).exitCode}catch(e){return process.stderr.write(`error: ${e.message}
15
+ `),2}let y=String(p.resolvedCreds?.org_id??"");if(!y)return process.stderr.write("error: TMS did not return an org_id. Run `kane-cli login` again.\n"),2;{let{readMetaIfExists:e,assertOrgMatchOrExit:g}=await import("./testmd-actions-7RNW76DN.js"),d=g(e(t),y);if(d!==null)return d}let w=new R,j=A({isAgent:a,log:(e,g,d,V)=>w.log(e,g,d,V)}),F={path:t,cwd:process.cwd(),opts:r,isAgent:a,disableAskUser:!0,resolved:s,resolvedAuth:p,cliOverrides:i,environment:f,envConfig:N,profile:I,model:$,creds:o,configStore:l,session:w};try{return(await M(F,j,c)).exitCode}catch(e){return process.stderr.write(`error: ${e.message}
16
16
  `),2}}var m=class extends Error{constructor(t,a){super(t);this.exitCode=a;this.name="CliArgError"}};function G(n){let r={mode:"mode",assertionMode:"assertion_mode",finalValidation:"final_validation",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"},t=new Set(["max_steps","timeout"]),a={};for(let[c,s]of Object.entries(r)){let i=n[c];if(i===void 0||i==="")continue;let o=i;if(t.has(s)&&(o=Number(i),Number.isNaN(o))){let l="--"+c.replace(/[A-Z]/g,u=>"-"+u.toLowerCase());throw new m(`error: ${l} must be a number
17
17
  `,2)}a[s]=o}return a}export{U as applyCliStepConfig,K as buildStepRunVariables,P as buildTestLevelVariables,G as optsToOverrides,H as replayVariablesForStep,le as runTestMdFile};
@@ -1,3 +1,3 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as p,b as g}from"./chunk-3SK5GXQM.js";import{b as m}from"./chunk-HYW5VDEC.js";import"./chunk-INP7FG6V.js";import{a as d}from"./chunk-RZ4F3BHX.js";import"./chunk-OXARXMMD.js";import{a as f,g as a,h as u}from"./chunk-MKD3KZPM.js";import"./chunk-UR6MHSHU.js";import{mkdirSync as y,writeFileSync as w,readFileSync as S,rmSync as c,cpSync as v,createWriteStream as T,existsSync as b}from"fs";import{join as s}from"path";import{tmpdir as k}from"os";import{spawn as h}from"child_process";import{Readable as I}from"stream";import{pipeline as $}from"stream/promises";function E(t){try{return S(s(t,"VERSION"),"utf-8").trim()||null}catch{return null}}function L(t,r,l){return l?t!==r:t===null||m(t,r)>0}function C(t){let r=a.split("/").pop()??a;return`https://registry.npmjs.org/${a}/-/${r}-${t}.tgz`}var R=5e3,A=6e4;async function x(){let t=new AbortController,r=setTimeout(()=>t.abort(),R);try{let l=await d(p(),{headers:{Accept:"application/json"},signal:t.signal});if(!l.ok)throw new Error(`Controller returned ${l.status} fetching skill version map`);let i=await l.json(),n=g(i,f);if(!n)throw new Error("No compatible skill version found for this kane-cli build");return n}finally{clearTimeout(r)}}async function _(t){let r=C(t),l=new AbortController,i=setTimeout(()=>l.abort(),A);try{let n=await d(r,{headers:{Accept:"application/octet-stream"},signal:l.signal});if(!n.ok||!n.body)throw new Error(`Failed to download skill tarball (${n.status})`);let e=s(k(),`kane-cli-skill-${t}-${process.pid}.tgz`);return await $(I.fromWeb(n.body),T(e)),e}finally{clearTimeout(i)}}function M(t,r){return new Promise((l,i)=>{y(r,{recursive:!0});let n=h("tar",["-xzf",t,"-C",r,"--strip-components=2","package/skills"],{stdio:["ignore","ignore","pipe"]}),e="";n.stderr?.on("data",o=>{e+=o.toString()}),n.on("error",o=>i(o)),n.on("close",o=>{o===0?l():i(new Error(`tar exited ${o}${e?`: ${e.trim()}`:""}`))})})}async function W(t){let r;try{r=t??await x()}catch(e){return{status:"failed",version:t??"unknown",installedTargets:0,error:e instanceof Error?e.message:String(e)}}let l=u.filter(({dir:e})=>L(E(e),r,!!t));if(l.length===0)return{status:"already-installed",version:r,installedTargets:0};let i=null,n=null;try{if(n=await _(r),i=s(k(),`kane-cli-skill-${r}-stage-${process.pid}`),c(i,{recursive:!0,force:!0}),await M(n,i),!b(s(i,"SKILL.md")))throw new Error(`Unexpected skill tarball layout for v${r}: SKILL.md not at package/skills/ root`);let e=0;for(let{dir:o}of l)try{c(o,{recursive:!0,force:!0}),y(o,{recursive:!0}),v(i,o,{recursive:!0,force:!0}),w(s(o,"VERSION"),r+`
2
+ import{a as p,b as g}from"./chunk-FOZVXYVG.js";import{b as m}from"./chunk-B2CIHKXG.js";import{a as d}from"./chunk-RZ4F3BHX.js";import"./chunk-YIOWO6WS.js";import"./chunk-L4AUCQVO.js";import{a as f,g as a,h as u}from"./chunk-QIE62H3J.js";import"./chunk-UR6MHSHU.js";import{mkdirSync as y,writeFileSync as w,readFileSync as S,rmSync as c,cpSync as v,createWriteStream as T,existsSync as b}from"fs";import{join as s}from"path";import{tmpdir as k}from"os";import{spawn as h}from"child_process";import{Readable as I}from"stream";import{pipeline as $}from"stream/promises";function E(t){try{return S(s(t,"VERSION"),"utf-8").trim()||null}catch{return null}}function L(t,r,l){return l?t!==r:t===null||m(t,r)>0}function C(t){let r=a.split("/").pop()??a;return`https://registry.npmjs.org/${a}/-/${r}-${t}.tgz`}var R=5e3,A=6e4;async function x(){let t=new AbortController,r=setTimeout(()=>t.abort(),R);try{let l=await d(p(),{headers:{Accept:"application/json"},signal:t.signal});if(!l.ok)throw new Error(`Controller returned ${l.status} fetching skill version map`);let i=await l.json(),n=g(i,f);if(!n)throw new Error("No compatible skill version found for this kane-cli build");return n}finally{clearTimeout(r)}}async function _(t){let r=C(t),l=new AbortController,i=setTimeout(()=>l.abort(),A);try{let n=await d(r,{headers:{Accept:"application/octet-stream"},signal:l.signal});if(!n.ok||!n.body)throw new Error(`Failed to download skill tarball (${n.status})`);let e=s(k(),`kane-cli-skill-${t}-${process.pid}.tgz`);return await $(I.fromWeb(n.body),T(e)),e}finally{clearTimeout(i)}}function M(t,r){return new Promise((l,i)=>{y(r,{recursive:!0});let n=h("tar",["-xzf",t,"-C",r,"--strip-components=2","package/skills"],{stdio:["ignore","ignore","pipe"]}),e="";n.stderr?.on("data",o=>{e+=o.toString()}),n.on("error",o=>i(o)),n.on("close",o=>{o===0?l():i(new Error(`tar exited ${o}${e?`: ${e.trim()}`:""}`))})})}async function W(t){let r;try{r=t??await x()}catch(e){return{status:"failed",version:t??"unknown",installedTargets:0,error:e instanceof Error?e.message:String(e)}}let l=u.filter(({dir:e})=>L(E(e),r,!!t));if(l.length===0)return{status:"already-installed",version:r,installedTargets:0};let i=null,n=null;try{if(n=await _(r),i=s(k(),`kane-cli-skill-${r}-stage-${process.pid}`),c(i,{recursive:!0,force:!0}),await M(n,i),!b(s(i,"SKILL.md")))throw new Error(`Unexpected skill tarball layout for v${r}: SKILL.md not at package/skills/ root`);let e=0;for(let{dir:o}of l)try{c(o,{recursive:!0,force:!0}),y(o,{recursive:!0}),v(i,o,{recursive:!0,force:!0}),w(s(o,"VERSION"),r+`
3
3
  `),e++}catch{}return e===0?{status:"failed",version:r,installedTargets:0,error:"Could not write to any agent skill directory"}:{status:"installed",version:r,installedTargets:e}}catch(e){return{status:"failed",version:r,installedTargets:0,error:e instanceof Error?e.message:String(e)}}finally{if(n)try{c(n,{force:!0})}catch{}if(i)try{c(i,{recursive:!0,force:!0})}catch{}}}function D(t){switch(t.status){case"installed":return`Installed kane-cli skill v${t.version} (${t.installedTargets}/${u.length} agent dirs). Restart your AI agent (Claude Code / Codex CLI / Gemini CLI) to load it.`;case"already-installed":return`kane-cli skill v${t.version} already installed.`;case"failed":return`Failed to install kane-cli skill: ${t.error??"unknown error"}`}}export{D as formatInstallResult,W as installSkill,L as targetNeedsInstall};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a,b,c,d}from"./chunk-WUMNIGPR.js";import"./chunk-UR6MHSHU.js";export{c as buildAgentEnv,b as findAssuranceAgent,a as platformPackageName,d as resolveAgentAuthEnv};
2
+ import{a,b,c,d}from"./chunk-NEZ4G7XR.js";import"./chunk-UR6MHSHU.js";export{c as buildAgentEnv,b as findAssuranceAgent,a as platformPackageName,d as resolveAgentAuthEnv};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{d as a}from"./chunk-TJRBV2V2.js";import"./chunk-3MSXQU2C.js";import"./chunk-LZKUF23A.js";import"./chunk-XN7PPLFS.js";import"./chunk-KGFISJFM.js";import"./chunk-4PIMEZJW.js";import"./chunk-GIGD4M7V.js";import"./chunk-S6GRW5ZA.js";import"./chunk-D5DEWIAU.js";import"./chunk-OZODSY6H.js";import"./chunk-2YQ6TW77.js";import"./chunk-Q6TVDG3X.js";import"./chunk-LMJTY32X.js";import"./chunk-RKWJG3WW.js";import"./chunk-VL2UA23Z.js";import"./chunk-LV5VRSPI.js";import"./chunk-2U5DZUC7.js";import"./chunk-DCYTRYR2.js";import"./chunk-44QUA6GV.js";import"./chunk-IDDVO4UV.js";import"./chunk-EK2B2LZK.js";import"./chunk-N62EM6JX.js";import"./chunk-M6DX4ENH.js";import"./chunk-5Y2G4NC7.js";import"./chunk-GN3SZXZ5.js";import"./chunk-52VLJKIN.js";import"./chunk-C5UNZ6ZY.js";import"./chunk-S3DAAAE5.js";import"./chunk-35SRW4KA.js";import"./chunk-DEYHK6ZC.js";import"./chunk-4G4HPMR2.js";import"./chunk-FPFOW6BS.js";import"./chunk-WAOCHXJ5.js";import"./chunk-K2MKBBI4.js";import"./chunk-RFHMDQXZ.js";import"./chunk-YSK535OI.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-BKGJGPDN.js";import"./chunk-MHQ6A2QZ.js";import"./chunk-FU3OQXFH.js";import"./chunk-YCCUBQY4.js";import"./chunk-U3JB76QP.js";import"./chunk-M5JQXOCE.js";import"./chunk-HR7AGYV2.js";import"./chunk-2WVKOZ6W.js";import"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import"./chunk-YIOWO6WS.js";import"./chunk-VE3SUJMA.js";import"./chunk-E47GFYXA.js";import"./chunk-L4AUCQVO.js";import"./chunk-PJSCM6JX.js";import"./chunk-OZM4UU5F.js";import{a as o}from"./chunk-DFS4RMVP.js";import"./chunk-Z4K4AYEI.js";import"./chunk-KRFGAVYU.js";import"./chunk-QIE62H3J.js";import{a as t}from"./chunk-HCBYKLMW.js";import{c as n}from"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import{e as r}from"./chunk-UR6MHSHU.js";var e=r(t(),1);async function p(i){let c=i.scenarioLimit!==void 0||i.perScenarioLimit!==void 0?{scenarioLimit:i.scenarioLimit,perScenarioLimit:i.perScenarioLimit}:void 0,{waitUntilExit:m}=n((0,e.jsx)(o,{children:(0,e.jsx)(a,{initialChatMode:"generate",initialObjective:i.objective,initialGenerateLimits:c})}),{exitOnCtrlC:!1});await m()}export{p as runGenerate};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{e as a,f as b,g as c,h as d,i as e,j as f,k as g,l as h,m as i,n as j,o as k,p as l,q as m}from"./chunk-S6GRW5ZA.js";import"./chunk-D5DEWIAU.js";import"./chunk-OZODSY6H.js";import"./chunk-2YQ6TW77.js";import"./chunk-RKWJG3WW.js";import"./chunk-EK2B2LZK.js";import"./chunk-35SRW4KA.js";import"./chunk-4G4HPMR2.js";import"./chunk-FPFOW6BS.js";import"./chunk-WAOCHXJ5.js";import"./chunk-L5LI2JF4.js";import"./chunk-U3JB76QP.js";import"./chunk-M5JQXOCE.js";import"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import"./chunk-YIOWO6WS.js";import"./chunk-L4AUCQVO.js";import"./chunk-KRFGAVYU.js";import"./chunk-QIE62H3J.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{i as ExportError,c as assertOrgMatchOrExit,j as exportTestmd,b as metaMatchesOrg,a as readMetaIfExists,d as resolveCurrentOrgId,l as resolveSyncAuth,h as runDeleteAction,k as runExportAction,e as runListAction,f as runListTui,g as runStatusAction,m as runSyncAction};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a}from"./chunk-35SRW4KA.js";import"./chunk-4G4HPMR2.js";import"./chunk-RZ4F3BHX.js";import"./chunk-YIOWO6WS.js";import"./chunk-QIE62H3J.js";import"./chunk-UR6MHSHU.js";export{a as refreshOAuthToken};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a,b,c}from"./chunk-5446YVGQ.js";import"./chunk-UR6MHSHU.js";export{b as baseUrlAdvisory,c as preflightTurn,a as resolveTurnBase};
2
+ import{a,b,c}from"./chunk-YKTYVJBN.js";import"./chunk-UR6MHSHU.js";export{b as baseUrlAdvisory,c as preflightTurn,a as resolveTurnBase};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as t}from"./chunk-INP7FG6V.js";import"./chunk-MKD3KZPM.js";import"./chunk-UR6MHSHU.js";async function l(n,o,r){let{ControllerClient:e}=await import("./controller-client-RD2YEMAH.js");await new e(t(n).controllerBaseUrl,{username:o,accessKey:r}).getTmsCredentials()}export{l as validateBasicAuth};
2
+ import{a as t}from"./chunk-YIOWO6WS.js";import"./chunk-QIE62H3J.js";import"./chunk-UR6MHSHU.js";async function l(n,o,r){let{ControllerClient:e}=await import("./controller-client-RD2YEMAH.js");await new e(t(n).controllerBaseUrl,{username:o,accessKey:r}).getTmsCredentials()}export{l 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-HYW5VDEC.js";import"./chunk-RZ4F3BHX.js";import"./chunk-MKD3KZPM.js";import"./chunk-UR6MHSHU.js";export{d as checkForUpdate,b as compareVersions,c as getSeverity,a as getUpdateCommand};
2
+ import{a,b,c,d}from"./chunk-B2CIHKXG.js";import"./chunk-RZ4F3BHX.js";import"./chunk-QIE62H3J.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.6.0",
3
+ "version": "0.6.2",
4
4
  "description": "KaneAI Terminal UI — browser automation testing agent",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -26,11 +26,11 @@
26
26
  "ws": "^8.20.0"
27
27
  },
28
28
  "optionalDependencies": {
29
- "@testmuai/kane-cli-darwin-arm64": "0.6.0",
30
- "@testmuai/kane-cli-darwin-x64": "0.6.0",
31
- "@testmuai/kane-cli-linux-x64": "0.6.0",
32
- "@testmuai/kane-cli-linux-arm64": "0.6.0",
33
- "@testmuai/kane-cli-win-x64": "0.6.0",
29
+ "@testmuai/kane-cli-darwin-arm64": "0.6.2",
30
+ "@testmuai/kane-cli-darwin-x64": "0.6.2",
31
+ "@testmuai/kane-cli-linux-x64": "0.6.2",
32
+ "@testmuai/kane-cli-linux-arm64": "0.6.2",
33
+ "@testmuai/kane-cli-win-x64": "0.6.2",
34
34
  "sharp": "^0.34.5"
35
35
  },
36
36
  "publishConfig": {
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a}from"./chunk-ME3GYVBV.js";import"./chunk-RFHMDQXZ.js";import"./chunk-ABSEKYIB.js";import"./chunk-FYOCF7DY.js";import"./chunk-RGEAEAZB.js";import"./chunk-BC7UVJJB.js";import"./chunk-NFOBDHZK.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-M5JQXOCE.js";import"./chunk-INP7FG6V.js";import"./chunk-MKD3KZPM.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{a as EvidenceViewOffer};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a,b}from"./chunk-VXS23M67.js";import"./chunk-YCCUBQY4.js";import"./chunk-YWWKKKXY.js";import"./chunk-2WVKOZ6W.js";import"./chunk-NLCCBXXV.js";import"./chunk-INP7FG6V.js";import"./chunk-RZ4F3BHX.js";import"./chunk-N2BUF6YU.js";import"./chunk-MKD3KZPM.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.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}from"./chunk-VK7RF53I.js";import"./chunk-ZXDA4K6G.js";import"./chunk-WFSQZG26.js";import"./chunk-BV3EARZO.js";import"./chunk-RTWWPEQ7.js";import"./chunk-FPFOW6BS.js";import"./chunk-WAOCHXJ5.js";import"./chunk-L5LI2JF4.js";import"./chunk-25YSMNUP.js";import"./chunk-VXS23M67.js";import"./chunk-YCCUBQY4.js";import"./chunk-YWWKKKXY.js";import"./chunk-M5JQXOCE.js";import"./chunk-2WVKOZ6W.js";import"./chunk-NLCCBXXV.js";import"./chunk-VE3SUJMA.js";import"./chunk-D5SHVZGD.js";import"./chunk-INP7FG6V.js";import"./chunk-RZ4F3BHX.js";import"./chunk-OXARXMMD.js";import"./chunk-N2BUF6YU.js";import"./chunk-MKD3KZPM.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{a as SingleShotApp};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{g as a}from"./chunk-WUNN5OCH.js";import"./chunk-XQDDUVD3.js";import"./chunk-5U3GOEGG.js";import"./chunk-RTWWPEQ7.js";import"./chunk-5Q46BEG7.js";import"./chunk-5Y2G4NC7.js";import"./chunk-M5JQXOCE.js";import"./chunk-INP7FG6V.js";import"./chunk-QK6KZMYG.js";import"./chunk-C5NNT7Y3.js";import"./chunk-DFS4RMVP.js";import"./chunk-MKD3KZPM.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{a as TestMdRunView};
@@ -1,4 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- var u={prod:"https://kaneai-api.lambdatest.com/v16-controller/v1",stage:"https://auteur-stage-automind.lambdatestinternal.com/v16-controller/v1"};function T(e=process.env){return e.TESTMUAI_BASE_URL||u[e.TESTMUAI_ENV==="stage"?"stage":"prod"]}function E(e=process.env){return e.TESTMUAI_BASE_URL&&e.TESTMUAI_ENV!=="stage"?"note: TESTMUAI_BASE_URL is honored by context/design, but run/testmd ignore it unless TESTMUAI_ENV=stage":null}async function g(e,t=process.env,c=fetch){let o=T(t),a=`${o}/assurance/turn`,n={"Content-Type":"application/json"},i=e.TESTMUAI_BASIC_AUTH??t.TESTMUAI_BASIC_AUTH,l=e.TESTMUAI_API_KEY??t.TESTMUAI_API_KEY;i?n.Authorization=`Basic ${i}`:l&&(n.Authorization=`Bearer ${l}`);let s;try{s=(await c(a,{method:"POST",headers:n,body:"{}",signal:AbortSignal.timeout(8e3)})).status}catch(r){return{ok:!1,message:`error: cannot reach the controller at ${o} (${r instanceof Error?r.message:String(r)})
3
- hint: for a local run, start the controller and export TESTMUAI_BASE_URL=http://localhost:8000/v1`}}return s===404?{ok:!1,message:`error: ${a} does not exist (404) \u2014 this controller does not serve the turn endpoint yet
4
- hint: the endpoint is currently local-only. Run a local controller and export TESTMUAI_BASE_URL=http://localhost:8000/v1`}:s===401?{ok:!1,message:`error: the controller at ${o} rejected your credentials (401) \u2014 check your login/profile for TESTMUAI_ENV=${t.TESTMUAI_ENV??"prod"}`}:{ok:!0}}export{T as a,E as b,g as c};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as K}from"./chunk-QPZRHAYK.js";import{a as L,b,d as B}from"./chunk-GIRXJOJI.js";import{e as W,g as A}from"./chunk-B2PZAB7J.js";import{d as O,e as R,f as P,g as j,h as q}from"./chunk-IACKIGPX.js";var V=/^[a-z0-9][a-z0-9-]{1,63}$/;function z(p,d,e,t){if(!d)return{error:{code:"SUPERSEDE_TARGET_MISSING",detail:"supersede verdict needs a target (slug or cid)"}};let n=p.resolve(d);return n?n.superseded||t.has(n.cid)?{error:{code:"ALREADY_SUPERSEDED",detail:`${d} is already superseded (tip: ${n.tip})`}}:n.cid===e?{error:{code:"SELF_SUPERSEDE",detail:"a node cannot supersede itself"}}:{targetCid:n.cid}:{error:{code:"UNKNOWN_SUPERSEDE_TARGET",detail:`${d} names nothing in the graph`}}}function X(p,d,e,t,n=[]){if(!j(d)?.acyclic)return null;if(e===t)return{code:"EDGE_CYCLE",detail:`${d} ${e} \u2192 itself`};let i=_=>[...p.edgesFrom(_).filter(h=>h.type===d).map(h=>h.dst),...n.filter(h=>h.type===d&&h.src===_).map(h=>h.dst)],a=new Set,g=[t];for(;g.length>0;){let _=g.pop();if(_===e)return{code:"EDGE_CYCLE",detail:`${d} ${e} \u2192 ${t} closes a cycle`};a.has(_)||(a.add(_),g.push(...i(_)))}return null}function de(p,d,e,t){let m=j(d)?.cardinality;if(m!=="one-live-per-src"&&m!=="one-live-per-src-and-dst")return null;let i=p.edgesFrom(e).filter(a=>a.type===d&&!p.superseded.has(a.dst));if(i.length>0)return{code:"CARDINALITY_VIOLATION",detail:`${d} from ${e} already has a live edge (${i[0].ecid}) \u2014 supersede it first`};if(m==="one-live-per-src-and-dst"&&t!==void 0){let a=p.edgesInto(t).filter(g=>g.type===d&&!p.superseded.has(g.src));if(a.length>0)return{code:"CARDINALITY_VIOLATION",detail:`${d} onto ${t} already has a live edge (${a[0].ecid}) \u2014 strict 1:1, supersede it first`}}return null}var Y=new Set(["high","med","low"]);function ce(p,d,e){let t=[],n=e.mediaOf(p.source.source_cid),m=new Set;for(let i of p.use_cases){if(m.has(i.temp_ref)&&t.push({code:"DUP_TEMP_REF",detail:`duplicate temp_ref ${i.temp_ref}`}),m.add(i.temp_ref),(!i.title||!i.title.trim())&&t.push({code:"EMPTY_TITLE",detail:`${i.temp_ref}: title is empty`}),Y.has(i.risk)||t.push({code:"BAD_RISK",detail:`${i.temp_ref}: risk ${JSON.stringify(i.risk)} not in high|med|low`}),!i.cite||!i.cite.anchor)t.push({code:"MISSING_CITE",detail:`${i.temp_ref}: every derived use-case must carry a cite`});else for(let a of K(n,i.cite,d))t.push({code:a.code,detail:`${i.temp_ref}: ${a.detail}`});i.matches_existing&&!e.hasNode(i.matches_existing.cid)&&t.push({code:"UNKNOWN_MATCH",detail:`${i.temp_ref}: matches_existing ${i.matches_existing.cid} is not in the graph`});for(let[a,g]of(i.criteria??[]).entries())if((!g.text||!g.text.trim())&&t.push({code:"EMPTY_CRITERION",detail:`${i.temp_ref}.criteria[${a}]: text is empty`}),!g.cite||!g.cite.anchor)t.push({code:"MISSING_CITE",detail:`${i.temp_ref}.criteria[${a}]: every criterion carries its own cite (D3)`});else for(let _ of K(n,g.cite,d))t.push({code:_.code,detail:`${i.temp_ref}.criteria[${a}]: ${_.detail}`})}return t}function ae(p){let{contextDir:d,graph:e,proposal:t,proposalId:n,verdicts:m,by:i,allowStaleBasis:a,extractorVersion:g,autoName:_}=p,h=W(d);if(!a&&t.read_basis!==h)return{record:null,errors:[{code:"STALE_BASIS",detail:`proposal read_basis ${String(t.read_basis)} != latest ${String(h)}`}]};if(!e.hasNode(t.source.source_cid))return{record:null,errors:[{code:"MISSING_SOURCE_NODE",detail:`source ${t.source.source_id} (${t.source.source_cid}) is not a committed node \u2014 ingest it first`}]};let l=[],f=e.mediaOf(t.source.source_cid),k=new Set,v=[],E=[],C=[],I=[],w=[],x=[],U=new Set,H=new Set,F=(r,s,T)=>{let c=z(e,s.supersedeTarget,T,U);if("error"in c){l.push({code:c.error.code,detail:`${r}: ${c.error.detail}`});return}U.add(c.targetCid),w.push({kind:"node",old:c.targetCid,new:T,reason:s.reason??`superseded via review by ${i.id}`,by:i})};for(let r of t.use_cases){let s=m.get(r.temp_ref)??{resolution:"skipped"};if(k.has(r.temp_ref)&&l.push({code:"DUP_TEMP_REF",detail:`duplicate temp_ref ${r.temp_ref}`}),k.add(r.temp_ref),(!r.title||!r.title.trim())&&l.push({code:"EMPTY_TITLE",detail:`${r.temp_ref}: title is empty`}),Y.has(r.risk)||l.push({code:"BAD_RISK",detail:`${r.temp_ref}: risk ${JSON.stringify(r.risk)} not in high|med|low`}),f.format==="image"){if(r.cite?.anchor!=="img#whole"){l.push({code:r.cite?.anchor?"CITE_ANCHOR_INVALID":"MISSING_CITE",detail:`${r.temp_ref}: image cites are anchor-only (img#whole)`});continue}}else if(!r.cite||!r.cite.anchor||!r.cite.quote){l.push({code:"MISSING_CITE",detail:`${r.temp_ref}: every derived use-case must cite anchor+quote`});continue}s.resolution==="edited"&&s.edit&&(s.edit.title!==void 0&&!s.edit.title.trim()&&l.push({code:"EMPTY_TITLE",detail:`${r.temp_ref}: edited title is empty`}),s.edit.risk!==void 0&&!Y.has(s.edit.risk)&&l.push({code:"BAD_RISK",detail:`${r.temp_ref}: edited risk ${JSON.stringify(s.edit.risk)} invalid`}));let T=B({title:s.edit?.title??r.title,description:r.description,summary:s.edit?.summary??r.summary,actors:r.actors,value:r.value,risk:s.edit?.risk??r.risk,...r.criteria&&r.criteria.length>0?{criteria:r.criteria.map(o=>o.text)}:{}}),c=L("usecase",T),$={source_id:t.source.source_id,source_cid:t.source.source_cid,anchor:r.cite.anchor,...r.cite.quote?{quote:r.cite.quote}:{}};if(r.matches_existing&&!e.hasNode(r.matches_existing.cid)){l.push({code:"UNKNOWN_MATCH",detail:`${r.temp_ref}: matches_existing ${r.matches_existing.cid} is not in the graph`});continue}let N=r.matches_existing?.cid??(e.hasNode(c)?c:null);if(N&&e.superseded.has(N)){let o=e.tipOf(N);N=e.superseded.has(o)?null:o}if(N){if(r.changed&&(s.resolution==="approved"||s.resolution==="edited")){let o=r.updated;if(!o||Object.keys(o).length===0){l.push({code:"CHANGED_NEEDS_PAYLOAD",detail:`${r.temp_ref}: changed:true needs an updated{...} payload naming the moved fields`});continue}let u=e.getNode(N)?.content??{},S=B({title:s.edit?.title??o.title??String(u.title??r.title),...o.description??u.description?{description:o.description??u.description}:{},...s.edit?.summary??o.summary??u.summary?{summary:s.edit?.summary??o.summary??u.summary}:{},...o.actors??u.actors?{actors:o.actors??u.actors}:{},...o.value??u.value?{value:o.value??u.value}:{},risk:s.edit?.risk??o.risk??String(u.risk??r.risk),...o.criteria??u.criteria?{criteria:o.criteria??u.criteria}:{}}),y=L("usecase",S);if(y!==N){for(let M of P("usecase",S))l.push({code:M.code,detail:`${r.temp_ref}: ${M.detail}`});v.push({cid:y,label:O.USECASE,content:S}),E.push({ecid:b("DERIVES",$.source_cid,y,$),type:R.DERIVES,src:$.source_cid,dst:y,props:$}),F(r.temp_ref,{resolution:"supersede",supersedeTarget:N,reason:s.reason??`matches-but-changed: ${t.source.source_id} moved (${Object.keys(o).join(", ")})`},y),I.push({id:y,kind:"review-item",resolution:s.resolution,edit:s.resolution==="edited"?{...s.edit}:null,reason:null,by:i});continue}}s.resolution!=="rejected"&&(E.push({ecid:b("DERIVES",$.source_cid,N,$),type:R.DERIVES,src:$.source_cid,dst:N,props:$}),(s.resolution==="approved"||s.resolution==="edited"||s.resolution==="supersede")&&I.push({id:N,kind:"review-item",resolution:"approved",edit:null,reason:null,by:i}),s.resolution==="supersede"&&F(r.temp_ref,s,N));continue}for(let o of P("usecase",T))l.push({code:o.code,detail:`${r.temp_ref}: ${o.detail}`});for(let o of q(R.DERIVES,"source","usecase",$))l.push({code:o.code,detail:`${r.temp_ref}: ${o.detail}`});v.push({cid:c,label:O.USECASE,content:T}),E.push({ecid:b("DERIVES",$.source_cid,c,$),type:R.DERIVES,src:$.source_cid,dst:c,props:$});for(let o of r.criteria??[]){let u={source_id:t.source.source_id,source_cid:t.source.source_cid,anchor:o.cite.anchor,...o.cite.quote?{quote:o.cite.quote}:{}};u.anchor!==$.anchor&&E.push({ecid:b("DERIVES",u.source_cid,c,u),type:R.DERIVES,src:u.source_cid,dst:c,props:u})}for(let o of r.depends_on_hint??[]){let u=D=>D.toLowerCase().trim().replace(/\s+/g," "),S=null,y=e.resolve(o);if(y&&!y.superseded&&e.nodeLabel.get(y.cid)===O.USECASE&&(S=y.cid),!S){for(let{cid:D,content:G}of e.byLabel(O.USECASE))if(!e.superseded.has(D)&&u(String(G.title??""))===u(o)){S=D;break}}if(!S){let D=v.find(G=>G.label===O.USECASE&&u(String(G.content.title??""))===u(o));D&&(S=D.cid)}!S||S===c||X(e,R.DEPENDS_ON,c,S,C)||C.some(D=>D.src===c&&D.dst===S)||(E.push({ecid:b(R.DEPENDS_ON,c,S,{reason:"extract hint"}),type:R.DEPENDS_ON,src:c,dst:S,props:{reason:"extract hint"}}),C.push({src:c,dst:S,type:R.DEPENDS_ON}))}if((s.resolution==="approved"||s.resolution==="edited"||s.resolution==="supersede")&&e.superseded.get(c)===null&&!U.has(c)&&w.push({kind:"node",old:c,new:c,reason:`re-minted after tombstone via review by ${i.id}`,by:i}),_){let o=J("usecase",s.edit?.title??r.title,u=>H.has(u)||e.names.has(u)&&!e.superseded.has(e.names.get(u)));o!==null&&!e.nameOf.has(c)&&(H.add(o),x.push({cid:c,slug:o,by:i}))}s.resolution==="approved"?I.push({id:c,kind:"review-item",resolution:"approved",edit:null,reason:null,by:i}):s.resolution==="edited"?I.push({id:c,kind:"review-item",resolution:"edited",edit:{...s.edit},reason:null,by:i}):s.resolution==="rejected"?I.push({id:c,kind:"review-item",resolution:"rejected",edit:null,reason:s.reason??null,by:i}):s.resolution==="supersede"&&(I.push({id:c,kind:"review-item",resolution:"approved",edit:null,reason:s.reason??null,by:i}),F(r.temp_ref,s,c))}return l.length?{record:null,errors:l}:{record:A(d,{ts:new Date().toISOString(),proposal_id:n,...n!=null?{extraction_of:t.source.source_cid}:{},...n!=null&&g?{extractor_version:g}:{},nodes:v,edges:E,review:I,supersessions:w,...x.length>0?{names:x}:{},...p.judgements&&p.judgements.length>0?{judgements:p.judgements}:{},source_head_moves:{}},{expectPrev:h}).record,errors:null}}function le(p){let{contextDir:d,graph:e,verdicts:t,by:n}=p,m=[],i=[],a=[],g=[],_=new Set;for(let[l,f]of t){if(f.resolution==="skipped")continue;let k=e.resolve(l);if(!k){m.push({code:"UNKNOWN_NODE",detail:`${l} names nothing in the graph`});continue}if(k.superseded){m.push({code:"SUPERSEDED_TARGET",detail:`${l} is superseded \u2014 review the tip (${k.tip})`});continue}let v=k.cid;if(f.resolution==="approved")a.push({id:v,kind:"review-item",resolution:"approved",edit:null,reason:null,by:n});else if(f.resolution==="rejected")a.push({id:v,kind:"review-item",resolution:"rejected",edit:null,reason:f.reason??null,by:n});else if(f.resolution==="edited"){let E=e.getNode(v);if(!E){m.push({code:"UNKNOWN_NODE",detail:`${l}: node file unreadable`});continue}let C={...E.content,...f.edit?.title!==void 0?{title:f.edit.title}:{},...f.edit?.summary!==void 0?{summary:f.edit.summary}:{},...f.edit?.risk!==void 0?{risk:f.edit.risk}:{}},I=P(E.label,C);if(I.length>0){for(let x of I)m.push({code:x.code,detail:`${l}: ${x.detail}`});continue}let w=L(E.label,C);if(w===v){a.push({id:v,kind:"review-item",resolution:"approved",edit:null,reason:null,by:n});continue}i.push({cid:w,label:E.label,content:C}),_.add(v),g.push({kind:"node",old:v,new:w,reason:f.reason??"edited in review",by:n}),a.push({id:w,kind:"review-item",resolution:"edited",edit:{...f.edit},reason:null,by:n})}else if(f.resolution==="supersede"){let E=z(e,f.supersedeTarget,v,_);if("error"in E){m.push({code:E.error.code,detail:`${l}: ${E.error.detail}`});continue}_.add(E.targetCid),g.push({kind:"node",old:E.targetCid,new:v,reason:f.reason??`superseded via review by ${n.id}`,by:n}),a.push({id:v,kind:"review-item",resolution:"approved",edit:null,reason:f.reason??null,by:n})}}return m.length?{record:null,errors:m}:a.length===0&&g.length===0?{record:null,errors:[{code:"NO_VERDICTS",detail:"every item was skipped \u2014 nothing to commit"}]}:{record:A(d,{ts:new Date().toISOString(),proposal_id:null,nodes:i,edges:[],review:a,supersessions:g,source_head_moves:{}},{expectPrev:e.latestHash}).record,errors:null}}function ue(p){let{contextDir:d,graph:e,assignments:t,by:n}=p,m=[],i=[],a=new Set;for(let{ref:_,slug:h}of t){if(!V.test(h)){m.push({code:"BAD_SLUG",detail:`${JSON.stringify(h)} \u2014 slugs are kebab-case ${String(V)}`});continue}let l=e.resolve(_);if(!l){m.push({code:"UNKNOWN_REF",detail:`${_} names nothing in the graph`});continue}if(l.superseded){m.push({code:"SUPERSEDED_TARGET",detail:`${_} is superseded \u2014 name the tip instead (${l.tip})`});continue}let f=e.names.get(h);if(f!==void 0&&!e.superseded.has(f)&&f!==l.cid||a.has(h)){m.push({code:"SLUG_TAKEN",detail:`${h} already names ${f??"another node in this record"}`});continue}a.add(h),i.push({cid:l.cid,slug:h,by:n})}return m.length?{record:null,errors:m}:i.length===0?{record:null,errors:[{code:"NO_ASSIGNMENTS",detail:"nothing to name"}]}:{record:A(d,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[],names:i,source_head_moves:{}},{expectPrev:e.latestHash}).record,errors:null}}function pe(p){let{contextDir:d,graph:e,sourceId:t,reason:n,by:m}=p,i=e.heads.get(t);return i===void 0?{record:null,errors:[{code:"UNKNOWN_SOURCE",detail:`no source ${t} in the graph`}]}:i===null?{record:null,errors:[{code:"ALREADY_RETIRED",detail:`source ${t} is already retired`}]}:{record:A(d,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[{kind:"node",old:i,new:null,reason:n??`retired source ${t}`,by:m}],source_head_moves:{[t]:null},names:[]},{expectPrev:e.latestHash}).record,errors:null}}function Q(p,d){let e=p.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(e.length>60){let n=e.lastIndexOf("-",60);e=(n>0?e.slice(0,n):e.slice(0,60)).replace(/-+$/g,"")}if(!V.test(e))return null;let t=e;for(let n=2;d(t);n++)t=`${e}-${n}`;return V.test(t)?t:null}var Z={source:"src",usecase:"uc",scenario:"sc",ac:"ac",test:"t",gap:"gap",stylenote:"sty"};function J(p,d,e){let t=Z[p];return Q(t?`${t} ${d}`:d,e)}export{Z as a,J as b,X as c,de as d,ce as e,ae as f,le as g,ue as h,pe as i};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{existsSync as c}from"fs";import{dirname as m,resolve as i}from"path";import{fileURLToPath as d}from"url";var g=m(d(import.meta.url));function f(){return[i(g,".."),i(g,"../../..")]}function p(r){return{"darwin-arm64":"kane-cli-darwin-arm64","darwin-x64":"kane-cli-darwin-x64","linux-x64":"kane-cli-linux-x64","linux-arm64":"kane-cli-linux-arm64","win32-x64":"kane-cli-win-x64"}[r]??null}function S(){let r=p(`${process.platform}-${process.arch}`),n=process.platform==="win32"?"assurance-agent.exe":"assurance-agent";for(let e of f()){for(let t of r?["@testmuai","@lambdatestincprivate"]:[]){let a=i(e,"node_modules",t,r,"bin",n);if(c(a))return{cmd:a,args:[]}}let s=i(e,"../assurance-agent/dist",n);if(c(s))return{cmd:s,args:[]};let o=i(e,"../assurance-agent/main.py");if(c(o)){let t=i(e,"../assurance-agent/.venv/bin/python");return{cmd:c(t)?t:"python3",args:[o]}}}return null}function T(r,n={}){return{...process.env,...n,TESTMUAI_SOURCE:"kane-cli",TESTMUAI_SESSION_ID:r,ASSURANCE_LOG_LEVEL:process.env.ASSURANCE_LOG_LEVEL??"info"}}async function v(){if(process.env.TESTMUAI_API_KEY||process.env.TESTMUAI_BASIC_AUTH)return{};try{let{CredentialsManager:r}=await import("./credentials-WUEKK7FI.js"),n=process.env.TESTMUAI_ENV==="stage"?"stage":"prod",e=new r,s=e.getActiveProfile()??"default",o={TESTMUAI_ENV:n},t=e.loadBasicAuth(s,n);if(t)return o.TESTMUAI_BASIC_AUTH=Buffer.from(`${t.username}:${t.access_key}`,"utf8").toString("base64"),o;let a=e.loadCredentials(s,n);if(a){try{let{refreshOAuthToken:l}=await import("./token-refresh-OCFALJ7U.js");await l({creds:e,profile:s,env:n,credentials:a})}catch{}let u=e.loadCredentials(s,n)??a;if(typeof u.access_token=="string")return o.TESTMUAI_API_KEY=u.access_token,o}return{}}catch{return{}}}export{p as a,S as b,T as c,v as d};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a}from"./chunk-Y2S3PW7N.js";import"./chunk-RFHMDQXZ.js";import"./chunk-D5SHVZGD.js";import"./chunk-INP7FG6V.js";import"./chunk-RZ4F3BHX.js";import"./chunk-OXARXMMD.js";import"./chunk-MKD3KZPM.js";import"./chunk-UR6MHSHU.js";export{a as LoginFlow};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as b,b as c,c as d}from"./chunk-B2OAEEKI.js";import{e as a}from"./chunk-NWZTYAJB.js";import"./chunk-I2S6KNZW.js";import"./chunk-DM2GL24Z.js";import"./chunk-JFAFKHDX.js";import"./chunk-5ILXUQIX.js";import"./chunk-QPZRHAYK.js";import"./chunk-VJUIW2ES.js";import"./chunk-FXPPQL4D.js";import"./chunk-5446YVGQ.js";import"./chunk-Z56AWGVY.js";import"./chunk-427OQS2N.js";import"./chunk-6PS65QFF.js";import"./chunk-KHDUQ33H.js";import"./chunk-D5T4ARTB.js";import"./chunk-AE6SS34N.js";import"./chunk-GIRXJOJI.js";import"./chunk-B2PZAB7J.js";import"./chunk-IACKIGPX.js";import"./chunk-MKD3KZPM.js";import"./chunk-UR6MHSHU.js";export{c as dedupPreFlags,a as resolveAnswers,d as runExtract,b as sessionSourceRef};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{d as a}from"./chunk-ZZOSDBYN.js";import"./chunk-ZO7ROBPR.js";import"./chunk-MESFNOY3.js";import"./chunk-3MSXQU2C.js";import"./chunk-FAXRERS6.js";import"./chunk-NTJDMMLC.js";import"./chunk-PGEMGGBS.js";import"./chunk-WG3BBXJF.js";import"./chunk-GNGGFK7C.js";import"./chunk-MQ7DJ2XC.js";import"./chunk-LMJTY32X.js";import"./chunk-RKWJG3WW.js";import"./chunk-ZXDA4K6G.js";import"./chunk-WFSQZG26.js";import"./chunk-BV3EARZO.js";import"./chunk-WUNN5OCH.js";import"./chunk-XQDDUVD3.js";import"./chunk-5U3GOEGG.js";import"./chunk-RTWWPEQ7.js";import"./chunk-H7ZQ4AWL.js";import"./chunk-5Q46BEG7.js";import"./chunk-5Y2G4NC7.js";import"./chunk-LBBPMEO2.js";import"./chunk-CBIW5DTU.js";import"./chunk-C5UNZ6ZY.js";import"./chunk-S3DAAAE5.js";import"./chunk-GIGD4M7V.js";import"./chunk-2YQ6TW77.js";import"./chunk-Y2S3PW7N.js";import"./chunk-FPFOW6BS.js";import"./chunk-WAOCHXJ5.js";import"./chunk-ME3GYVBV.js";import"./chunk-RFHMDQXZ.js";import"./chunk-ABSEKYIB.js";import"./chunk-FYOCF7DY.js";import"./chunk-RGEAEAZB.js";import"./chunk-BC7UVJJB.js";import"./chunk-NFOBDHZK.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-WFAMF4SG.js";import"./chunk-25YSMNUP.js";import"./chunk-VXS23M67.js";import"./chunk-YCCUBQY4.js";import"./chunk-YWWKKKXY.js";import"./chunk-M5JQXOCE.js";import"./chunk-FPGOV4AQ.js";import"./chunk-2WVKOZ6W.js";import"./chunk-NLCCBXXV.js";import"./chunk-VE3SUJMA.js";import"./chunk-QI6WZ56Y.js";import"./chunk-D5SHVZGD.js";import"./chunk-INP7FG6V.js";import"./chunk-RZ4F3BHX.js";import"./chunk-E47GFYXA.js";import"./chunk-OXARXMMD.js";import"./chunk-QK6KZMYG.js";import"./chunk-C5NNT7Y3.js";import{a as o}from"./chunk-DFS4RMVP.js";import"./chunk-NOOHQBUD.js";import"./chunk-N2BUF6YU.js";import"./chunk-MKD3KZPM.js";import{a as t}from"./chunk-HCBYKLMW.js";import{c as n}from"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import{e as r}from"./chunk-UR6MHSHU.js";var e=r(t(),1);async function p(i){let c=i.scenarioLimit!==void 0||i.perScenarioLimit!==void 0?{scenarioLimit:i.scenarioLimit,perScenarioLimit:i.perScenarioLimit}:void 0,{waitUntilExit:m}=n((0,e.jsx)(o,{children:(0,e.jsx)(a,{initialChatMode:"generate",initialObjective:i.objective,initialGenerateLimits:c})}),{exitOnCtrlC:!1});await m()}export{p as runGenerate};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{e as a,f as b,g as c,h as d,i as e,j as f,k as g,l as h,m as i,n as j,o as k,p as l,q as m}from"./chunk-PGEMGGBS.js";import"./chunk-WG3BBXJF.js";import"./chunk-GNGGFK7C.js";import"./chunk-RKWJG3WW.js";import"./chunk-RTWWPEQ7.js";import"./chunk-2YQ6TW77.js";import"./chunk-FPFOW6BS.js";import"./chunk-WAOCHXJ5.js";import"./chunk-L5LI2JF4.js";import"./chunk-YWWKKKXY.js";import"./chunk-M5JQXOCE.js";import"./chunk-NLCCBXXV.js";import"./chunk-QI6WZ56Y.js";import"./chunk-D5SHVZGD.js";import"./chunk-INP7FG6V.js";import"./chunk-RZ4F3BHX.js";import"./chunk-OXARXMMD.js";import"./chunk-N2BUF6YU.js";import"./chunk-MKD3KZPM.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{i as ExportError,c as assertOrgMatchOrExit,j as exportTestmd,b as metaMatchesOrg,a as readMetaIfExists,d as resolveCurrentOrgId,l as resolveSyncAuth,h as runDeleteAction,k as runExportAction,e as runListAction,f as runListTui,g as runStatusAction,m as runSyncAction};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a}from"./chunk-QI6WZ56Y.js";import"./chunk-D5SHVZGD.js";import"./chunk-INP7FG6V.js";import"./chunk-RZ4F3BHX.js";import"./chunk-MKD3KZPM.js";import"./chunk-UR6MHSHU.js";export{a as refreshOAuthToken};