epiq 0.2.27 → 0.2.29
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/cli.js +41 -35
- package/package.json +5 -3
package/dist/cli.js
CHANGED
|
@@ -1,40 +1,46 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{render as Md}from"ink";import Rd from"meow";import Ri from"react";import xd from"chalk";import{Box as ue,Text as Ue}from"ink";import D from"react";import it from"chalk";import{monotonicFactory as fa,ulid as be}from"ulid";import{useSyncExternalStore as ua}from"react";var L={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function He(e){return e.context==="TICKET"}var lr=e=>e.context==="SWIMLANE";var g={INIT:"init",HELP:"help",NEW:"new",TAG:"tag",FILTER:"filter",MOVE:"move",ASSIGN:"assign",DELETE:"delete",RENAME:"rename",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",SET_DESCRIPTION:"edit",SET_EDITOR:"set:editor",SET_VIEW:"set:view",SET_USERNAME:"set:username",SYNC:"sync",NONE:""},ve={None:"none",Invalid:"invalid",Valid:"valid"},he={None:"none",Success:"success",Fail:"fail"},s=e=>({result:he.Fail,message:e,data:null}),m=(e,t)=>({result:he.Success,message:e,data:t}),mr=()=>({result:he.None,message:"No result",data:null}),l=e=>e.result==="fail",je=e=>e.result==="success";var p={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};function It(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var St=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",ur=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var pr=e=>{let t=new Map;for(let n of e)for(let r=1;r<=n.length;r++){let o=n.slice(0,r),i=t.get(o);i?i.push(n):t.set(o,[n])}return t},gr=(e,t)=>t?e.get(t)??[]:[];var fr=new WeakMap,ki=e=>{let t=fr.get(e);return t||(t=pr(e),fr.set(e,t)),t};var yr=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return gr(ki(e),r).filter(i=>It(r,i)>=n)};var xr=({inputToMatch:e,lastWord:t},n)=>{if(t.endsWith(" "))return{hint:"",hints:[],overlap:0,remainder:""};let r=yr({wordList:n,inputToMatch:e,overlapThreshold:1});return Bi(t,r)},Bi=(e,t)=>{let n=t[0]??"",r=It(e.toLowerCase(),n.toLowerCase()),o=n?n+" ":"",i=o.slice(r);return{hint:o,hints:t,overlap:r,remainder:i}};var vr=["vi","vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var ze=24n,Oi=ze*4n,At=(1n<<Oi)-1n,Ui=/^[0-9a-f]+$/;function hr(e){if(!e||!Ui.test(e))throw new Error(`Invalid hex rank: ${e}`);return BigInt("0x"+e)}function wt(e,t=ze){if(e<0n)throw new Error("Negative rank not allowed");return e.toString(16).padStart(Number(t),"0")}function lt(e,t){if(!e&&!t)return wt(At/2n,ze);let n=e?hr(e):0n,r=t?hr(t):At;if(r<=n)return wt(At/2n,ze);let o=(n+r)/2n;return o===n||o===r?"":wt(o,ze)}function de(){return wt(At/2n,ze)}var X={workspace:(e,t)=>({id:e,title:t,rank:de(),isDeleted:!1,props:{},context:L.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r=!1)=>({id:e,title:t,rank:de(),isDeleted:!1,props:{},context:L.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:r,log:[]}),swimlane:(e,t,n)=>({id:e,title:t,rank:de(),isDeleted:!1,props:{},context:L.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:(e,t,n,r={},o="horizontal")=>({id:e,title:t,rank:de(),isDeleted:!1,props:r,context:L.FIELD,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[]}),ticket:(e,t,n)=>({id:e,title:t,rank:de(),isDeleted:!1,props:{},context:L.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,props:r={},readonly:o=!0})=>({id:e,title:t,rank:de(),isDeleted:!1,props:r,context:L.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:o,log:[]})};var W=e=>Object.values(h().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),Cr=(e,t)=>e.findIndex(n=>n.id===t),xn=(e,t={at:"end"})=>{if(e.length===0)return m("Resolved rank",de());switch(t.at){case"start":{let n=e[0];return n?m("Resolved rank",lt(void 0,n.rank)):s("Unable to resolve first sibling")}case"end":{let n=e[e.length-1];return n?m("Resolved rank",lt(n.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let n=Cr(e,t.sibling);if(n<0)return s("Sibling not found");let r=n>0?e[n-1]:void 0,o=e[n];return o?m("Resolved rank",lt(r?.rank,o.rank)):s("Sibling not found")}case"after":{let n=Cr(e,t.sibling);if(n<0)return s("Sibling not found");let r=e[n],o=n<e.length-1?e[n+1]:void 0;return r?m("Resolved rank",lt(r.rank,o?.rank)):s("Sibling not found")}}};var qe=(e,t)=>{let{nodes:n}=h(),r=n[e];if(!r)return s("Node not found");if(r.context===t)return m("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return m("Resolved ancestor node",o);o=o.parentNodeId?n[o.parentNodeId]:void 0}return s(`No ancestor found for context: ${t}`)},hn=(e,t)=>{let{nodes:n}=h(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},vn=(e,t)=>e?e.readonly?s({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node"}[t]):null:s("Node not found"),C={deleteNode(e){ce(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},editValue(e,t){let{nodes:n}=h(),r=n[e];if(!r)return s("Edit target node not found");let o=vn(r,"edit");if(o)return o;let i={...r,props:{...r.props,value:t}};return C.updateNode(i),m("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return s("Rename target node not found");let r=vn(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),m("Renamed node",o)},getExistingTags(){let{tags:e}=h();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=h();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return W(e).find(n=>n.title===t)},moveNode({id:e,parentId:t,position:n={at:"end"}}){let{rootNodeId:r}=h(),o=this.getNode(e),i=this.getNode(t);if(!o)return s("Node not found");if(!i)return s("Target parent not found");if(r===e)return s("Cannot move root node");if(e===t)return s("Cannot move node into itself");let a=vn(o,"move");if(a)return a;if(hn(t,e))return s("Cannot move node into its own descendant");let d=W(t).filter(f=>f.id!==e),c=xn(d,n);if(l(c))return c;let u={...o,parentNodeId:t,rank:c.data};return this.updateNode(u),m("Moved node successfully",u)},tombstoneNode(e){let{nodes:t,currentNodeId:n,rootNodeId:r}=h(),o=this.getNode(e);if(!o)return s("Node not found");if(r===e)return s("Cannot delete root node");let i=new Set,a=c=>{let u=t[c];if(!(!u||i.has(c))){i.add(c);for(let f of W(u.id))a(f.id)}};a(e);let d={...structuredClone(t)};for(let c of i){if(!d[c])return s("Unable to locate node to delete");d[c]={...d[c],isDeleted:!0}}return n?(w({nodes:d}),m("Successfully tomb stoned",o)):s("Unable to delete undefined")},createContributor(e){let t=ce(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return l(t)?s("Unable to create contributor"):m("Created contributor",e)},assign(e,t,n){let r=C.getContributor(t),o=C.getNode(e);if(!o||!r)return s("Unable assign contributor to issue");let i=this.getFieldByTitle(o.id,"Assignees");if(!i)return s("Unable to locate assignees field");if(W(i.id).some(c=>c.props?.value===t))return s("Contributor already assigned");let d=this.createNodeAtPosition(X.field(n,r.name,i.id,{value:t}));return l(d)?d:m("Assigned contributor",d.data)},createTag(e){let t=ce(n=>({...n,tags:{...n.tags,[e.id]:e}}));return l(t)?s("Could not create tag"):m("Tag created",e)},tag(e,t,n){let r=C.getTag(t),o=C.getNode(e);if(!r)return s("Unable to add tag, missing tag");if(!o)return s("Unable to add tag, missing target");let i=this.getFieldByTitle(o.id,"Tags");if(!i)return s("Unable to locate tags field");if(W(i.id).some(c=>c.props?.value===t))return s("Tag already assigned");let d=this.createNodeAtPosition(X.field(n,r.name,i.id,{value:t}));return l(d)?d:m("Tag added",d.data)},createNodeAtPosition(e,t={at:"end"}){if(!e.parentNodeId){let i={...e,rank:de()};return this.createNode(i),m("Created node",i)}let n=W(e.parentNodeId),r=xn(n,t);if(l(r))return r;let o={...e,rank:r.data};return this.createNode(o),m("Created node",o)},createNode(e){let t=ce(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return l(t)?s("Unable to create node"):m("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return s("Failed to locate node");let n={...t,readonly:!0},r=ce(o=>({...o,nodes:{...o.nodes,[e]:n}}));return l(r)?s(r.message):m("Locked node",n)},updateNode(e){let t=ce(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return l(t)?t:m("Updated node",e)},getContributor(e){return h().contributors[e]},getTag(e){return h().tags[e]},getNode(e){return h().nodes[e]},getSiblings:e=>Object.values(h().nodes).filter(t=>!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank))};var Tt={preferredEditor:null,userName:null,userId:null},le=()=>Tt,mt=e=>(Tt={...Tt,...e},Tt);var Mt=()=>{let e=le(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim();return{isSetup:n&&t,hasPreferredEditor:n,hasUserName:t,userName:e.userName,preferredEditor:e.preferredEditor}},Nr=()=>!Rt();var K={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#2a2f45",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},v={accent:K.cyan,accent2:K.magenta,primary:K.white,secondary:K.grayDark,secondary2:K.grayLight,gray:K.gray,green:K.green,yellow:K.yellow,red:K.red};var y={red:K.red,yellow:K.yellow,green:K.green,blue:K.blue,magenta:K.magenta,cyan:K.cyan},Ge={urgent:y.red,critical:y.red,important:y.red,blocker:y.red,asap:y.red,immediate:y.red,fail:y.red,failure:y.red,broken:y.red,bug:y.red,error:y.red,incident:y.red,outage:y.red,production:y.red,crash:y.red,security:y.red,warning:y.yellow,warn:y.yellow,risky:y.yellow,risk:y.yellow,attention:y.yellow,pending:y.yellow,review:y.yellow,"needs-review":y.yellow,qa:y.yellow,testing:y.yellow,test:y.yellow,validate:y.yellow,verification:y.yellow,staging:y.yellow,check:y.yellow,"follow-up":y.yellow,followup:y.yellow,waiting:y.yellow,blocked:y.yellow,hold:y.yellow,done:y.green,complete:y.green,completed:y.green,success:y.green,ok:y.green,stable:y.green,resolved:y.green,fixed:y.green,closed:y.green,merged:y.green,released:y.green,deployed:y.green,approved:y.green,verified:y.green,working:y.green,healthy:y.green,pass:y.green,passing:y.green,info:y.blue,information:y.blue,note:y.blue,docs:y.blue,documentation:y.blue,doc:y.blue,guide:y.blue,help:y.blue,explanation:y.blue,detail:y.blue,details:y.blue,context:y.blue,design:y.blue,discussion:y.blue,proposal:y.blue,idea:y.blue,feature:y.magenta,enhancement:y.magenta,improvement:y.magenta,refactor:y.magenta,refactoring:y.magenta,cleanup:y.magenta,optimize:y.magenta,optimization:y.magenta,perf:y.magenta,performance:y.magenta,upgrade:y.magenta,migration:y.magenta,modernize:y.magenta,debt:y.magenta,todo:y.cyan,next:y.cyan,planned:y.cyan,plan:y.cyan,future:y.cyan,backlog:y.cyan,investigate:y.cyan,explore:y.cyan,prototype:y.cyan};var V=e=>{let{currentNode:t}=h(),n=Mt().isSetup,r=t.context,o=[g.SYNC,g.HELP,g.SET_VIEW,g.SET_EDITOR,g.SET_USERNAME],i=[g.NEW,g.RENAME,g.DELETE],a=[g.TAG,g.ASSIGN,g.CLOSE_ISSUE,g.RE_OPEN_ISSUE,g.SET_DESCRIPTION],c=[...{WORKSPACE:[...o,...i],BOARD:[g.FILTER,...o,...i],SWIMLANE:[g.FILTER,...o,...i],TICKET:[...o,...i,...a],FIELD:[...o,...a],FIELD_LIST:[...o,...a],TEXT:[...o]}[r||"WORKSPACE"]],u={[g.SYNC]:[],[g.INIT]:[],[g.SET_USERNAME]:[],[g.SET_DESCRIPTION]:["confirm"],[g.DELETE]:["confirm"],[g.RE_OPEN_ISSUE]:["confirm"],[g.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[g.CLOSE_ISSUE]:["confirm"],[g.FILTER]:["tag","assignee","description","title","clear"],[g.SET_VIEW]:["dense","wide"],[g.SET_EDITOR]:[...vr,"vim"],[g.TAG]:[...new Set([...Object.keys(Ge),...C.getExistingTags()])],[g.ASSIGN]:C.getExistingAssignees(),[g.HELP]:[],[g.RENAME]:[],[g.NEW]:r==="TICKET"||r==="FIELD"||r==="FIELD_LIST"?["issue","swimlane","board"]:r==="SWIMLANE"?["issue","swimlane","board"]:r==="BOARD"?["issue","swimlane","board"]:["board"],[g.NONE]:c};return n?Nr()||(u={[g.NONE]:[g.HELP,g.INIT],[g.HELP]:u[g.HELP],[g.INIT]:u[g.INIT]}):u={[g.NONE]:[g.HELP,g.SET_EDITOR,g.SET_USERNAME],[g.SYNC]:u[g.SYNC],[g.HELP]:u[g.HELP],[g.SET_EDITOR]:u[g.SET_EDITOR],[g.SET_USERNAME]:u[g.SET_USERNAME]},u[e]??[]};import In from"chalk";import Xe from"chalk";var Nn={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Wi=(e,t,n)=>Math.max(t,Math.min(n,e)),Cn=(e,t,n)=>e+(t-e)*n,br=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Hi=(e,t,n)=>{let r=t/100,o=n/100,i=(1-Math.abs(2*o-1))*r,a=e/60,d=i*(1-Math.abs(a%2-1)),c=0,u=0,f=0;a>=0&&a<1?(c=i,u=d):a>=1&&a<2?(c=d,u=i):a>=2&&a<3?(u=i,f=d):a>=3&&a<4?(u=d,f=i):a>=4&&a<5?(c=d,f=i):(c=i,f=d);let x=o-i/2;return[Math.round((c+x)*255),Math.round((u+x)*255),Math.round((f+x)*255)]},_i=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,$i=(e,t,n)=>[Math.round(Cn(e[0],t[0],n)),Math.round(Cn(e[1],t[1],n)),Math.round(Cn(e[2],t[2],n))],ut=e=>{let n=br(e)%360,r=Hi(n,Nn.stringColor.saturation,Nn.stringColor.lightness);return _i(r)},Vi=e=>{let t=Nn.gradient.stops,n=Wi(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let r=t.length-1,o=n*r,i=Math.min(Math.floor(o),r-1),a=o-i;return $i(t[i],t[i+1],a)},Lt=e=>br(e.toLowerCase().trim())/4294967295,Er=e=>{let t=Lt(e);return Vi(t)},Ki=e=>{let[t,n,r]=Er(e);return{normal:o=>Xe.bgRgb(t,n,r).black(o),cursor:o=>Xe.bgRgb(t,n,r).white.bold(o)}},bn=e=>{let[t,n,r]=Er(e);return{fg:o=>Xe.rgb(t,n,r)(o),fgCursor:o=>Xe.rgb(t,n,r).inverse(o),bg:o=>Xe.bgRgb(t,n,r).black(o),bgCursor:o=>Xe.bgRgb(t,n,r).white.bold(o)}},En=e=>Ki(e).normal(` ${e} `),ae=(e,t=Ge)=>{let r=(o=>o.toLowerCase().trim())(e);return r&&t[r]?t[r]:ut(r)};var Ce="<ENTER> to confirm",Y=(e="",t=[])=>({message:e,validity:ve.Valid,completionWordList:t}),me=({message:e,completionWordList:t})=>({validity:ve.Invalid,message:e,completionWordList:t}),pt=e=>e.length===0,Le=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=2,inputString:o,minLengthForHints:i=1})=>{let c=[...t.filter(Boolean).filter(f=>f.startsWith(o.trim()))].sort((f,x)=>Lt(f)-Lt(x)).slice(0,r).map(En),u=c.length>i?c.join(" "):"";return u?`${e}${u}${n}`:""},Sn=({modifier:e})=>{let t="confirm";return e===t?Y(Ce):me({message:pt(e)?`if you are certain, enter ${En(t)}`:"",completionWordList:[t]})},ji=({list:e,hint:t})=>({modifier:n})=>e.includes(n)?Y(Ce):me({message:pt(n)?t:"",completionWordList:[]}),zi=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?me({message:n,completionWordList:[]}):Y():me({message:pt(r)?t:"",completionWordList:[]}),An=({hint:e})=>({modifier:t,inputString:n})=>pt(t)&&pt(n)?me({message:e,completionWordList:[]}):Y(Ce),qi={[g.INIT]:()=>Y(Ce),[g.FILTER]:e=>{if(e.modifier==="clear")return Y();let t=a=>V(g.FILTER).includes(a);if(!e.modifier||!t(e.modifier??""))return me({message:Le({wordList:V(g.FILTER),noOfHints:100,inputString:e.inputString}),completionWordList:V(g.FILTER)});let r=Object.values(h().tags).map(a=>a.name),o=Object.values(h().contributors).map(a=>a.name),i=e.modifier==="tag"?r:e.modifier==="assignee"?o:[];return e.inputString?i.length&&!i.includes(e.inputString.trim()??"")?me({message:Le({prefix:`existing ${e.modifier}s... `,wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i}):Y():me({message:Le({prefix:"one of... ",wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i})},[g.NONE]:e=>e.command?Y():me({message:Le({prefix:"commands... ",wordList:V(g.NONE),noOfHints:100,inputString:e.inputString,minLengthForHints:0}),completionWordList:[]}),[g.NEW]:e=>zi({list:V(g.NEW),hint:Le({wordList:V(g.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[g.SET_DESCRIPTION]:()=>Y(Ce),[g.HELP]:()=>Y(Ce),[g.RENAME]:()=>Y(Ce),[g.DELETE]:e=>Sn(e),[g.CLOSE_ISSUE]:e=>Sn(e),[g.RE_OPEN_ISSUE]:e=>Sn(e),[g.MOVE]:e=>An({hint:Le({prefix:"hey hacker! These commands are blocked for you... ",wordList:V(g.MOVE),noOfHints:10,inputString:e.inputString})})(e),[g.TAG]:e=>{let t=C.getExistingTags().map(n=>` ${In.bgHex(ae(n))(" "+n+" ")} `).slice(0,10);return An({hint:"tag name like... "+t.join("")})(e)},[g.ASSIGN]:e=>{let t=C.getExistingAssignees().map(n=>` ${In.bgHex(ae(n))(" "+n+" ")} `).slice(0,10);return An({hint:"assign to... "+t.join("")})(e)},[g.SET_EDITOR]:e=>{logger.debug(`Validating command: ${e.command} ${e.modifier} ${e.inputString}`);let t=V(g.SET_EDITOR);return e.modifier?Y(Ce):me({message:Le({wordList:t,noOfHints:100,inputString:e.inputString}),completionWordList:[]})},[g.SET_USERNAME]:e=>e.inputString?Y():me({message:`Enter a username. Saved in ${In.bgBlack("~/.epiq/")}`,completionWordList:[]}),[g.SET_VIEW]:e=>ji({list:V(g.SET_VIEW),hint:Le({wordList:V(g.SET_VIEW),noOfHints:3,inputString:e.inputString})})(e),[g.SYNC]:()=>Y(Ce)},Ir=Object.fromEntries(Object.entries(qi).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var Sr=["frontend","backend","infrastructure","architecture","integration","configuration","implementation","application","deployment","environment","framework","platform","service","component","module","gateway","pipeline","containerization","orchestrator","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","reproducibility","reproduction","investigation","triage","workaround","mitigation","remediation","optimization","stabilization","refinement","failure","outage","blocking","criticality","severity","escalation","diagnostics","analysis","resolution","corruption","inconsistency","validation","verification","authorization","authentication","confidentiality","availability","accessibility","reliability","compliance","governance","encryption","decryption","integrity","auditing","traceability","accountability","protection","privileges","permissions","dependency","orchestration","provisioning","synchronization","compatibility","incompatibility","interoperability","observability","instrumentation","telemetry","loadbalancing","discovery","registration","scheduling","coordination","distribution","isolation","virtualization","serialization","deserialization","initialization","instantiation","propagation","aggregation","consolidation","normalization","standardization","transformation","reconciliation","correlation","processing","indexing","partitioning","enrichment","validation","filtering","streaming","batching","concurrency","parallelism","contention","deadlock","throttling","ratelimiting","backpressure","fragmentation","saturation","exhaustion","partitioning","replication","redundancy","failover","deprecation","obsolescence","starvation","overload","underutilization","latency","throughput","refactoring","modularization","encapsulation","abstraction","extensibility","configurability","maintainability","recoverability","sustainability","readability","testability","debuggability","reusability","simplicity","consistency","performance","functionality","requirement","recommendation","improvement","enhancement","clarification","documentation","description","acceptance","criteria","estimation","prioritization","dependency","deliverable","milestone","iteration"];var R={Init:"init",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",SetView:"set-view",SetEditor:"set-editor",SetUserName:"set-user-name",NewItem:"add-new-item",TagTicket:"ticket-tag",AssignUserToTicket:"ticket-assign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Sync:"sync"};var Ar=e=>Object.values(g).includes(e),wr=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:a,validity:d,completionWordList:c}=Ir[n].validate(n,r,i),u=o==="command"?Object.values(g):n&&e.target==="modifier"?V(n):Sr;return{validity:d,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:a??"",autoCompletion:t?xr(e,[...c,...u]):{hint:"",hints:[],remainder:"",overlap:0}}};var Tr=e=>{let t=e.trimStart(),n=Xi(t),r=(n[0]??"").trimStart().trimEnd(),o=(n[1]??"").trimStart().trimEnd(),i=Yi(e),a=Ar(r)?r:null,d=a!==null,c=r!=="",u=e.endsWith(" "),f=a?V(a)??[]:[],x=a&&f.includes(o)?o:"",N="word";n.length<=1?N="command":n.length===2&&(N="modifier");let A=Gi(t,a,x);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:i,hasCommand:c,command:a,isCommandKeyword:d,isLastWordCompleted:u,modifier:x,target:N,inputToMatch:i,inputString:A}},Gi=(e,t,n)=>{let r=e;return t&&r.startsWith(t)&&(r=r.slice(t.length)),r=r.replace(/^\s+/,""),n&&r.startsWith(n)&&(r=r.slice(n.length),r=r.replace(/^\s+/,"")),r},Xi=e=>e?e.split(/\s+/):[],Yi=e=>e.trimEnd().split(/\s+/).at(-1)??"";var Mr=" ",j={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:ve.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},wn=new Set,Rr=()=>{for(let e of wn)e()},Lr=e=>(wn.add(e),()=>wn.delete(e)),Ne=e=>{let n=e(j),r=Tr(n.value),o=n.cursorPosition===n.value.length;j={...n,commandMeta:wr(r,o)},Rr()},Pt=({message:e,result:t})=>{let n=structuredClone(j);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,j=n,Rr(),m(e,null)},Tn=e=>{Ne(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},Mn=e=>{Ne(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&n[o-1]===" ";)o--;for(;o>0&&n[o-1]!==" ";)o--}else{for(;o<n.length&&n[o]!==" ";)o++;for(;o<n.length&&n[o]===" ";)o++}return{...t,cursorPosition:o}})},Pr=()=>{Ne(e=>{let t=e.value.slice(e.cursorPosition),n=Math.max(0,e.cursorPosition-1);return{...e,value:e.value.slice(0,n)+t,cursorPosition:n,commandIsPending:!1}})},Dr=()=>{Ne(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&t[r-1]===" ";)r--;for(;r>0&&t[r-1]!==" ";)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},H=e=>{Ne(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),i=e(r,t.commandMeta.autoCompletion),a=i+o,d=Math.max(0,Math.min(i.length,a.length));return{...t,value:a,cursorPosition:d,commandIsPending:!1}})},Fr=()=>{Ne(e=>({...e,commandIsPending:!0}))},kr=({addToHistory:e=!0})=>{Ne(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),Ji()},Br=()=>{Ne(e=>{let t=Math.min(e.commandHistoryIndex+1,e.commandHistory.length-1),n=e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},Or=()=>{Ne(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},Ji=()=>H(()=>""),pe=()=>j,Dt=()=>{let[e,...t]=j.value.split(Mr);return t.join(Mr).trim()};var Qi=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",Zi=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",es=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",Ur=(e,t)=>{if(Zi(e,e.sequence))return"MoveCursorLeftOfWord";if(es(e,e.sequence))return"MoveCursorRightOfWord";if(Qi(e,e.sequence))return"EraseInputWord";switch(e.name){case"tab":return"autoCompleteCommand";case"up":return"getLastCommandFromHistory";case"down":return"getNextCommandFromHistory";case"left":return"MoveCursorLeft";case"right":return"MoveCursorRight";case"return":return"confirm";case"backspace":return t?"eraseInput":"exitCommandLine";case"escape":return"exitCommandLine";default:return"captureInput"}};function ts(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function ns(e,t,n){let r=h().currentNode.childNavigationAcrossParents;switch(t){case"up":return e==="vertical"?n.prevItem:r?n.prevContainer:null;case"down":return e==="vertical"?n.nextItem:r?n.nextContainer:null;case"left":return e==="horizontal"?n.prevItem:r?n.prevContainer:null;case"right":return e==="horizontal"?n.nextItem:r?n.nextContainer:null}}function Wr(e,t){let n=pe();if(e.sequence===":"&&n.value==="")return"initCommandLine";if(t===p.MOVE)switch(e.name){case"m":case"return":return"confirmMove"}if(t===p.COMMAND_LINE)return Ur(e,n.value);let r=ts(e);if(r){let o=t===p.MOVE?{prevItem:"movePreviousItem",nextItem:"moveNextItem",prevContainer:"moveToPreviousContainer",nextContainer:"moveToNextContainer"}:{prevItem:"navPreviousItem",nextItem:"navNextItem",prevContainer:"navToPreviousContainer",nextContainer:"navToNextContainer"};return ns(h().currentNode.childRenderAxis,r,o)}if(e.ctrl&&e.name==="c")return"exit";switch(e.name){case"e":return"edit";case"n":return"addItem";case"m":return"initMove";case"d":return"Delete";case"return":return"confirm";case"space":return"confirm";case"v":return h().viewMode==="wide"?"SetViewDense":"SetViewWide";case"q":case"escape":return"exit";case"s":return"sync";default:return null}}var Hr=e=>{let{context:t}=h()?.currentNode;if(!t)return R.None;switch(e){case g.INIT:return R.Init;case g.DELETE:return R.Delete;case g.SET_DESCRIPTION:return R.Edit;case g.HELP:return R.ViewHelp;case g.RE_OPEN_ISSUE:return R.ReopenIssue;case g.CLOSE_ISSUE:return R.CloseIssue;case g.TAG:return R.TagTicket;case g.ASSIGN:return R.AssignUserToTicket;case g.RENAME:return R.Rename;case g.NEW:return R.NewItem;case g.FILTER:return R.Filter;case g.MOVE:return R.Move;case g.SET_USERNAME:return R.SetUserName;case g.SET_EDITOR:return R.SetEditor;case g.SET_VIEW:return R.SetView;case g.SYNC:return R.Sync;default:return R.None}};import{ulid as _}from"ulid";import{spawnSync as ls}from"node:child_process";import ms from"node:os";import Kr from"node:path";import{ulid as us}from"ulid";import{accessSync as rs,copyFileSync as os,existsSync as Ft,mkdirSync as _r,readdirSync as $r,readFileSync as is,renameSync as ss,rmSync as as,statSync as Vr,unlinkSync as ds,writeFileSync as cs}from"node:fs";import Ye from"node:path";var re={writeToFile:(e,t)=>{try{let n=Ye.dirname(e);Ft(n)||_r(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);cs(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return is(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=re.readFile(e);return t===null?null:JSON.parse(t)}catch(t){return logger.error(`Failed to read JSON at ${e}:`,t),null}},dirExists:e=>{try{return Ft(e)&&Vr(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await rs(e),!0}catch{return!1}},mkDir:e=>_r(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=Ye.parse(t);for(;;){let r=Ye.join(t,e);try{if(Ft(r)&&Vr(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=Ye.dirname(t)}return null},readFirstJSON(e){try{if(!re.dirExists(e))return null;let t=$r(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=Ye.join(e,t);return re.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return re.dirExists(e)?$r(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{ds(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{as(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(Ye.dirname(t)),!n?.overwrite&&Ft(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{ss(e,t)}catch(r){if(r?.code==="EXDEV"){os(e,t),this.rmFile(e);return}throw r}}};function ps(){let{preferredEditor:e}=le(),t=[e,process.env.VISUAL,process.env.EDITOR,"vim","vi","nano"].filter(n=>!!n?.trim());return[...new Set(t)]}function gs(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function jr(e){let t=Kr.join(ms.tmpdir(),"epiq");re.mkDir(t);let n=Kr.join(t,us());re.writeToFile(n,e??"");let r=ps();for(let o of r){let i=gs(o,n),a=ls(i,{stdio:"inherit",shell:!0});if(!a.error&&a.status===0){let d=re.readFile(n);if(d==null)return s("Unable to read edited file");let c=d.replace(/\r?\n$/,"");return m("Successfully edited",c)}}return s("Unable to open editor")}import{monotonicFactory as fs,ulid as kt}from"ulid";var Bt=fs(),zr=({name:e,parent:t,userId:n})=>{let r=Bt(),o=Bt(),i=Bt(),a=Bt();return[{id:kt(),userId:n,action:"add.issue",payload:{id:r,parent:t,name:e}},{id:kt(),userId:n,action:"add.field",payload:{id:o,parent:r,name:"Description",val:""}},{id:kt(),userId:n,action:"add.field",payload:{id:i,parent:r,name:"Assignees"}},{id:kt(),userId:n,action:"add.field",payload:{id:a,parent:r,name:"Tags"}}]};var qr=e=>{let t=e.log??[];for(let n=t.length-1;n>=0;n--){let r=t[n];if(r&&r.action==="close.issue"&&r.payload.id===e.id)return r.payload.parent}return null};var ys=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[Je,Ot]=ys;var P=(e,t)=>s(`${t.split(".").join(" ")+" failed, "+e.toLowerCase()}`),xs={"init.workspace":({action:e,payload:t})=>{let{id:n,name:r}=t,o=X.workspace(n,r);Gr(o);let i=C.createNodeAtPosition(o);return l(i)?P(i.message??"Failed to initialize workspace",e):m("Workspace initialized",{action:e,result:i.data})},"add.workspace":({action:e,payload:t})=>{let{id:n,name:r}=t,o=X.workspace(n,r),i=C.createNodeAtPosition(o);return l(i)?P(i.message??"Failed to add workspace",e):m("Added workspace",{action:e,result:i.data})},"add.board":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=C.createNodeAtPosition(X.board(n,r,o));return l(i)?P(i.message??"Unable to create board",e):m("Added board",{action:e,result:i.data})},"add.swimlane":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=C.createNodeAtPosition(X.swimlane(n,r,o));return l(i)?P(i.message??"Unable to create swimlane",e):m("Added swimlane",{action:e,result:i.data})},"add.issue":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=C.createNodeAtPosition(X.ticket(n,r,o));return l(i)?P(i.message??"Unable to create issue",e):m("Added issue",{action:e,result:i.data})},"add.field":({action:e,payload:t})=>{let{id:n,name:r,parent:o,val:i}=t,a=C.createNodeAtPosition(X.field(n,r,o,{value:i},r.includes("Description")?"vertical":"horizontal"));return l(a)?P(a.message??`Unable to create field: ${r}`,e):m("Added field",{action:e,result:a.data})},"edit.title":({action:e,payload:t})=>{let{id:n,name:r}=t;if(!C.getNode(n))return P("Unable to locate node",e);let i=C.renameNode(n,r);return l(i)?P(i.message??"Unable to edit title",e):m("Edited title",{action:e,result:i.data})},"delete.node":({action:e,payload:t})=>{let{id:n}=t,r=C.tombstoneNode(n);return l(r)?P(r.message??"Unable to delete node",e):m("Deleted node",{action:e,result:r.data})},"create.tag":({action:e,payload:t})=>{let{id:n,name:r}=t,o=C.createTag({id:n,name:r});return l(o)?P(o.message??"Unable to create tag",e):m("Tag added",{action:e,result:o.data})},"create.contributor":({action:e,payload:t})=>{let{id:n,name:r}=t,o=C.createContributor({id:n,name:r});return l(o)?P(o.message??"Unable to create contributor",e):m("Contributor created",{action:e,result:o.data})},"tag.issue":({action:e,payload:t})=>{let{id:n,target:r,tagId:o}=t,i=C.tag(r,o,n);return l(i)?P(i.message??"Unable to tag issue",e):m("Issue tagged",{action:e,result:i.data})},"assign.issue":({action:e,payload:t})=>{let{id:n,contributor:r,target:o}=t,i=C.assign(o,r,n);return l(i)?P(i.message??"Unable to assign issue",e):m("Assigned successfully",{action:e,result:i.data})},"move.node":({action:e,payload:t})=>{let{id:n,parent:r,pos:o}=t,i=C.moveNode({id:n,parentId:r,position:o});return l(i)?P(i.message??"Failed to move node",e):m("Moved node",{action:e,result:i.data})},"edit.description":({action:e,payload:t})=>{let{id:n,md:r}=t,o=C.editValue(n,r);return l(o)?P(o.message??"Unable to edit description",e):m("Set node value",{action:e,result:o.data})},"close.issue":({action:e,payload:t})=>{let{id:n}=t,r=C.getNode(n);if(!r)return P("Unable to locate issue",e);if(!He(r))return P("Can only close issues",e);let o=C.getNode(Je);if(!o)return P("Unable to locate target swimlane",e);if(o.id===r.parentNodeId)return P("Cannot close closed issue",e);let a=C.moveNode({id:n,parentId:o.id});return l(a)?P(a.message??"Unable to close issue",e):m("Issue closed",{action:e,result:a.data})},"reopen.issue":({action:e,payload:t})=>{let{id:n}=t,r=C.getNode(n);if(!r)return P("Unable to locate issue",e);if(!He(r))return P("Can only reopen issues",e);let o=C.getNode(Je);if(!o)return P("Unable to locate closed swimlane",e);if(!(r.parentNodeId===o.id))return P("Issue is not closed",e);let a=qr(r);if(!a)return P("Unable to resolve previous parent from issue history",e);if(a===o.id)return P("Previous parent resolves to closed swimlane",e);if(!C.getNode(a))return P("Previous parent no longer exists",e);let c=C.moveNode({id:n,parentId:a});return l(c)?P(c.message??"Unable to reopen issue",e):m("Issue reopened",{action:e,result:c.data})},"lock.node":({action:e,payload:t})=>{let{id:n}=t,r=C.lockNode(n);return l(r)?P(r.message??"Unable to lock node",e):m("Node locked",{action:e,result:r.data})}},vs=(e,t)=>{let n=C.getNode(e);n&&C.updateNode({...n,log:[...n.log??[],t]})},hs=e=>{switch(e.action){case"init.workspace":case"add.workspace":case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"edit.title":case"lock.node":case"delete.node":case"move.node":case"close.issue":case"reopen.issue":return[e.payload.id];case"edit.description":let t=[e.payload.id],n=h().nodes[e.payload.id]?.parentNodeId;return n&&t.push(n),t;case"tag.issue":case"assign.issue":return[e.payload.id,e.payload.target];case"create.tag":case"create.contributor":default:return[]}};function Qe(e,t=!1){let n=xs[e.action],r=n(e);if(l(r))return r;if(!t){let a=[...new Set(hs(e))];for(let d of a)vs(d,e)}let[o,i]=e.userId.split(".");return!o?.length||!i?.length?P("Invalid user ID format",e.action):(C.createContributor({name:i,id:o}),r)}var gt=e=>e.map(t=>Qe(t));import Ht from"node:fs";import _e from"node:path";import{decodeTime as As,monotonicFactory as ws}from"ulid";var Ut=process.env.IS_LOCAL==="true",ge=()=>".epiq";import Ln from"node:fs";import Pn from"node:path";var Cs=ge(),Ns="events",bs=(e=process.cwd())=>Pn.join(Ze(e),Cs,Ns),Es=e=>{let t=Object.keys(e).filter(n=>n!=="id");return t.length!==2?s(`Invalid persisted event: expected exactly 2 keys, got ${t.length}`):!t[0]||!(t[0]in e)?s("Invalid persisted event: action key is missing or invalid"):m("Resolved persisted action",t[0])},Is=e=>{let{userId:t,...n}=e,r=Es(n);if(l(r))return s(r.message);let o=r.data;if(!o)return s("Action key is undefined");let i=e.id?.[0];if(!i)return s("Persisted event is missing id");let a=n[o];return m("Decoded persisted event",{id:i,action:o,payload:a,userId:t})};function Xr(e=process.cwd()){let t=bs(e);if(!Ln.existsSync(t))return s("No events found");let n=Ln.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>Pn.join(t,o)),r=[];for(let o of n){let i=Ln.readFileSync(o,"utf8"),a=Pn.basename(o,".jsonl")||"unknown";for(let d of i.split(`
|
|
3
|
-
`)){let
|
|
4
|
-
`,"utf8"),
|
|
5
|
-
`),
|
|
6
|
-
`);if(
|
|
2
|
+
import{render as ac}from"ink";import dc from"meow";import Gi from"react";import Jd from"chalk";import{Box as me,Text as Oe}from"ink";import k from"react";import st from"chalk";import{monotonicFactory as qa,ulid as Ee}from"ulid";import{useSyncExternalStore as Va}from"react";var L={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function We(e){return e.context==="TICKET"}var Mn=e=>e.context==="SWIMLANE";var f={INIT:"init",HELP:"help",NEW:"new",TAG:"tag",FILTER:"filter",MOVE:"move",ASSIGN:"assign",DELETE:"delete",RENAME:"rename",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",SET_DESCRIPTION:"edit",SET_EDITOR:"set:editor",SET_VIEW:"set:view",SET_USERNAME:"set:username",SYNC:"sync",NONE:""},ve={None:"none",Invalid:"invalid",Valid:"valid"},he={None:"none",Success:"success",Fail:"fail"},s=e=>({result:he.Fail,message:e,data:null}),c=(e,t)=>({result:he.Success,message:e,data:t}),Rn=()=>({result:he.None,message:"No result",data:null}),d=e=>e.result==="fail",ze=e=>e.result==="success";var g={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};function Tt(e,t){let r=Math.min(e.length,t.length),n=0;for(;n<r&&e[n]===t[n];)n++;return n}var Mt=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",Ln=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var Pn=e=>{let t=new Map;for(let r of e)for(let n=1;n<=r.length;n++){let o=r.slice(0,n),i=t.get(o);i?i.push(r):t.set(o,[r])}return t},Dn=(e,t)=>t?e.get(t)??[]:[];var Fn=new WeakMap,Zi=e=>{let t=Fn.get(e);return t||(t=Pn(e),Fn.set(e,t)),t};var kn=({wordList:e,inputToMatch:t,overlapThreshold:r=1})=>{let n=t.toLowerCase();return Dn(Zi(e),n).filter(i=>Tt(n,i)>=r)};var Bn=({inputToMatch:e,lastWord:t},r)=>{if(t.endsWith(" "))return{hint:"",hints:[],overlap:0,remainder:""};let n=kn({wordList:r,inputToMatch:e,overlapThreshold:1});return es(t,n)},es=(e,t)=>{let r=t[0]??"",n=Tt(e.toLowerCase(),r.toLowerCase()),o=r?r+" ":"",i=o.slice(n);return{hint:o,hints:t,overlap:n,remainder:i}};var On=["vi","vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var qe=24n,ts=qe*4n,Rt=(1n<<ts)-1n,rs=/^[0-9a-f]+$/;function Un(e){if(!e||!rs.test(e))throw new Error(`Invalid hex rank: ${e}`);return BigInt("0x"+e)}function Lt(e,t=qe){if(e<0n)throw new Error("Negative rank not allowed");return e.toString(16).padStart(Number(t),"0")}function mt(e,t){if(!e&&!t)return Lt(Rt/2n,qe);let r=e?Un(e):0n,n=t?Un(t):Rt;if(n<=r)return Lt(Rt/2n,qe);let o=(r+n)/2n;return o===r||o===n?"":Lt(o,qe)}function ae(){return Lt(Rt/2n,qe)}var X={workspace:(e,t)=>({id:e,title:t,rank:ae(),isDeleted:!1,props:{},context:L.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,r,n=!1)=>({id:e,title:t,rank:ae(),isDeleted:!1,props:{},context:L.BOARD,childRenderAxis:"horizontal",parentNodeId:r,readonly:n,log:[]}),swimlane:(e,t,r)=>({id:e,title:t,rank:ae(),isDeleted:!1,props:{},context:L.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:r,readonly:!1,log:[]}),field:(e,t,r,n={},o="horizontal")=>({id:e,title:t,rank:ae(),isDeleted:!1,props:n,context:L.FIELD,childRenderAxis:o,parentNodeId:r,readonly:!1,log:[]}),ticket:(e,t,r)=>({id:e,title:t,rank:ae(),isDeleted:!1,props:{},context:L.TICKET,childRenderAxis:"vertical",parentNodeId:r,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:r,props:n={},readonly:o=!0})=>({id:e,title:t,rank:ae(),isDeleted:!1,props:n,context:L.TEXT,childRenderAxis:"vertical",parentNodeId:r,readonly:o,log:[]})};var W=e=>Object.values(C().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,r)=>t.rank.localeCompare(r.rank)),Wn=(e,t)=>e.findIndex(r=>r.id===t),Sr=(e,t={at:"end"})=>{if(e.length===0)return c("Resolved rank",ae());switch(t.at){case"start":{let r=e[0];return r?c("Resolved rank",mt(void 0,r.rank)):s("Unable to resolve first sibling")}case"end":{let r=e[e.length-1];return r?c("Resolved rank",mt(r.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let r=Wn(e,t.sibling);if(r<0)return s("Sibling not found");let n=r>0?e[r-1]:void 0,o=e[r];return o?c("Resolved rank",mt(n?.rank,o.rank)):s("Sibling not found")}case"after":{let r=Wn(e,t.sibling);if(r<0)return s("Sibling not found");let n=e[r],o=r<e.length-1?e[r+1]:void 0;return n?c("Resolved rank",mt(n.rank,o?.rank)):s("Sibling not found")}}};var Ge=(e,t)=>{let{nodes:r}=C(),n=r[e];if(!n)return s("Node not found");if(n.context===t)return c("Resolved ancestor node",n);let o=n.parentNodeId?r[n.parentNodeId]:void 0;for(;o;){if(o.context===t)return c("Resolved ancestor node",o);o=o.parentNodeId?r[o.parentNodeId]:void 0}return s(`No ancestor found for context: ${t}`)},wr=(e,t)=>{let{nodes:r}=C(),n=r[e];for(;n?.parentNodeId;){if(n.parentNodeId===t)return!0;n=r[n.parentNodeId]}return!1},Ar=(e,t)=>e?e.readonly?s({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node"}[t]):null:s("Node not found"),E={deleteNode(e){de(t=>{let r={...t.nodes};return delete r[e],{...t,nodes:r}})},editValue(e,t){let{nodes:r}=C(),n=r[e];if(!n)return s("Edit target node not found");let o=Ar(n,"edit");if(o)return o;let i={...n,props:{...n.props,value:t}};return E.updateNode(i),c("Issue description updated",{md:t})},renameNode(e,t){let r=this.getNode(e);if(!r)return s("Rename target node not found");let n=Ar(r,"rename");if(n)return n;let o={...r,title:t};return this.updateNode(o),c("Renamed node",o)},getExistingTags(){let{tags:e}=C();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=C();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return W(e).find(r=>r.title===t)},moveNode({id:e,parentId:t,position:r={at:"end"}}){let{rootNodeId:n}=C(),o=this.getNode(e),i=this.getNode(t);if(!o)return s("Node not found");if(!i)return s("Target parent not found");if(n===e)return s("Cannot move root node");if(e===t)return s("Cannot move node into itself");let a=Ar(o,"move");if(a)return a;if(wr(t,e))return s("Cannot move node into its own descendant");let l=W(t).filter(p=>p.id!==e),m=Sr(l,r);if(d(m))return m;let u={...o,parentNodeId:t,rank:m.data};return this.updateNode(u),c("Moved node successfully",u)},tombstoneNode(e){let{nodes:t,currentNodeId:r,rootNodeId:n}=C(),o=this.getNode(e);if(!o)return s("Node not found");if(n===e)return s("Cannot delete root node");let i=new Set,a=m=>{let u=t[m];if(!(!u||i.has(m))){i.add(m);for(let p of W(u.id))a(p.id)}};a(e);let l={...structuredClone(t)};for(let m of i){if(!l[m])return s("Unable to locate node to delete");l[m]={...l[m],isDeleted:!0}}return r?(w({nodes:l}),c("Successfully tomb stoned",o)):s("Unable to delete undefined")},createContributor(e){let t=de(r=>({...r,contributors:{...r.contributors,[e.id]:e}}));return d(t)?s("Unable to create contributor"):c("Created contributor",e)},assign(e,t,r){let n=E.getContributor(t),o=E.getNode(e);if(!o||!n)return s("Unable assign contributor to issue");let i=this.getFieldByTitle(o.id,"Assignees");if(!i)return s("Unable to locate assignees field");if(W(i.id).some(m=>m.props?.value===t))return s("Contributor already assigned");let l=this.createNodeAtPosition(X.field(r,n.name,i.id,{value:t}));return d(l)?l:c("Assigned contributor",l.data)},createTag(e){let t=de(r=>({...r,tags:{...r.tags,[e.id]:e}}));return d(t)?s("Could not create tag"):c("Tag created",e)},tag(e,t,r){let n=E.getTag(t),o=E.getNode(e);if(!n)return s("Unable to add tag, missing tag");if(!o)return s("Unable to add tag, missing target");let i=this.getFieldByTitle(o.id,"Tags");if(!i)return s("Unable to locate tags field");if(W(i.id).some(m=>m.props?.value===t))return s("Tag already assigned");let l=this.createNodeAtPosition(X.field(r,n.name,i.id,{value:t}));return d(l)?l:c("Tag added",l.data)},createNodeAtPosition(e,t={at:"end"}){if(!e.parentNodeId){let i={...e,rank:ae()};return this.createNode(i),c("Created node",i)}let r=W(e.parentNodeId),n=Sr(r,t);if(d(n))return n;let o={...e,rank:n.data};return this.createNode(o),c("Created node",o)},createNode(e){let t=de(r=>({...r,nodes:{...r.nodes,[e.id]:e}}));return d(t)?s("Unable to create node"):c("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return s("Failed to locate node");let r={...t,readonly:!0},n=de(o=>({...o,nodes:{...o.nodes,[e]:r}}));return d(n)?s(n.message):c("Locked node",r)},updateNode(e){let t=de(r=>({...r,nodes:{...r.nodes,[e.id]:e}}));return d(t)?t:c("Updated node",e)},getContributor(e){return C().contributors[e]},getTag(e){return C().tags[e]},getNode(e){return C().nodes[e]},getSiblings:e=>Object.values(C().nodes).filter(t=>!t.isDeleted&&t.parentNodeId===e).sort((t,r)=>t.rank.localeCompare(r.rank))};var Pt={preferredEditor:null,userName:null,userId:null},ce=()=>Pt,ut=e=>(Pt={...Pt,...e},Pt);var Dt=()=>{let e=ce(),t=!!e.userName?.trim(),r=!!e.preferredEditor?.trim();return{isSetup:r&&t,hasPreferredEditor:r,hasUserName:t,userName:e.userName,preferredEditor:e.preferredEditor}},Hn=()=>!He();var j={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#2a2f45",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},h={accent:j.cyan,accent2:j.magenta,primary:j.white,secondary:j.grayDark,secondary2:j.grayLight,gray:j.gray,green:j.green,yellow:j.yellow,red:j.red};var x={red:j.red,yellow:j.yellow,green:j.green,blue:j.blue,magenta:j.magenta,cyan:j.cyan},Je={urgent:x.red,critical:x.red,important:x.red,blocker:x.red,asap:x.red,immediate:x.red,fail:x.red,failure:x.red,broken:x.red,bug:x.red,error:x.red,incident:x.red,outage:x.red,production:x.red,crash:x.red,security:x.red,warning:x.yellow,warn:x.yellow,risky:x.yellow,risk:x.yellow,attention:x.yellow,pending:x.yellow,review:x.yellow,"needs-review":x.yellow,qa:x.yellow,testing:x.yellow,test:x.yellow,validate:x.yellow,verification:x.yellow,staging:x.yellow,check:x.yellow,"follow-up":x.yellow,followup:x.yellow,waiting:x.yellow,blocked:x.yellow,hold:x.yellow,done:x.green,complete:x.green,completed:x.green,success:x.green,ok:x.green,stable:x.green,resolved:x.green,fixed:x.green,closed:x.green,merged:x.green,released:x.green,deployed:x.green,approved:x.green,verified:x.green,working:x.green,healthy:x.green,pass:x.green,passing:x.green,info:x.blue,information:x.blue,note:x.blue,docs:x.blue,documentation:x.blue,doc:x.blue,guide:x.blue,help:x.blue,explanation:x.blue,detail:x.blue,details:x.blue,context:x.blue,design:x.blue,discussion:x.blue,proposal:x.blue,idea:x.blue,feature:x.magenta,enhancement:x.magenta,improvement:x.magenta,refactor:x.magenta,refactoring:x.magenta,cleanup:x.magenta,optimize:x.magenta,optimization:x.magenta,perf:x.magenta,performance:x.magenta,upgrade:x.magenta,migration:x.magenta,modernize:x.magenta,debt:x.magenta,todo:x.cyan,next:x.cyan,planned:x.cyan,plan:x.cyan,future:x.cyan,backlog:x.cyan,investigate:x.cyan,explore:x.cyan,prototype:x.cyan};var K=e=>{let{currentNode:t}=C(),r=Dt().isSetup,n=t.context,o=[f.SYNC,f.HELP,f.SET_VIEW,f.SET_EDITOR,f.SET_USERNAME],i=[f.NEW,f.RENAME,f.DELETE],a=[f.TAG,f.ASSIGN,f.CLOSE_ISSUE,f.RE_OPEN_ISSUE,f.SET_DESCRIPTION],m=[...{WORKSPACE:[...o,...i],BOARD:[f.FILTER,...o,...i],SWIMLANE:[f.FILTER,...o,...i],TICKET:[...o,...i,...a],FIELD:[...o,...a],FIELD_LIST:[...o,...a],TEXT:[...o]}[n||"WORKSPACE"]],u={[f.SYNC]:[],[f.INIT]:[],[f.SET_USERNAME]:[],[f.SET_DESCRIPTION]:["confirm"],[f.DELETE]:["confirm"],[f.RE_OPEN_ISSUE]:["confirm"],[f.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[f.CLOSE_ISSUE]:["confirm"],[f.FILTER]:["tag","assignee","description","title","clear"],[f.SET_VIEW]:["dense","wide"],[f.SET_EDITOR]:[...On,"vim"],[f.TAG]:[...new Set([...Object.keys(Je),...E.getExistingTags()])],[f.ASSIGN]:E.getExistingAssignees(),[f.HELP]:[],[f.RENAME]:[],[f.NEW]:n==="TICKET"||n==="FIELD"||n==="FIELD_LIST"?["issue","swimlane","board"]:n==="SWIMLANE"?["issue","swimlane","board"]:n==="BOARD"?["issue","swimlane","board"]:["board"],[f.NONE]:m};return r?Hn()||(u={[f.NONE]:[f.HELP,f.INIT],[f.HELP]:u[f.HELP],[f.INIT]:u[f.INIT]}):u={[f.NONE]:[f.HELP,f.SET_EDITOR,f.SET_USERNAME],[f.HELP]:u[f.HELP],[f.SET_EDITOR]:u[f.SET_EDITOR],[f.SET_USERNAME]:u[f.SET_USERNAME]},u[e]??[]};import Pr from"chalk";import Xe from"chalk";var Mr={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},ns=(e,t,r)=>Math.max(t,Math.min(r,e)),Tr=(e,t,r)=>e+(t-e)*r,$n=e=>{let t=0;for(let r=0;r<e.length;r++)t=t*31+e.charCodeAt(r)>>>0;return t},os=(e,t,r)=>{let n=t/100,o=r/100,i=(1-Math.abs(2*o-1))*n,a=e/60,l=i*(1-Math.abs(a%2-1)),m=0,u=0,p=0;a>=0&&a<1?(m=i,u=l):a>=1&&a<2?(m=l,u=i):a>=2&&a<3?(u=i,p=l):a>=3&&a<4?(u=l,p=i):a>=4&&a<5?(m=l,p=i):(m=i,p=l);let y=o-i/2;return[Math.round((m+y)*255),Math.round((u+y)*255),Math.round((p+y)*255)]},is=([e,t,r])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${r.toString(16).padStart(2,"0")}`,ss=(e,t,r)=>[Math.round(Tr(e[0],t[0],r)),Math.round(Tr(e[1],t[1],r)),Math.round(Tr(e[2],t[2],r))],pt=e=>{let r=$n(e)%360,n=os(r,Mr.stringColor.saturation,Mr.stringColor.lightness);return is(n)},as=e=>{let t=Mr.gradient.stops,r=ns(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let n=t.length-1,o=r*n,i=Math.min(Math.floor(o),n-1),a=o-i;return ss(t[i],t[i+1],a)},Ft=e=>$n(e.toLowerCase().trim())/4294967295,_n=e=>{let t=Ft(e);return as(t)},ds=e=>{let[t,r,n]=_n(e);return{normal:o=>Xe.bgRgb(t,r,n).black(o),cursor:o=>Xe.bgRgb(t,r,n).white.bold(o)}},Rr=e=>{let[t,r,n]=_n(e);return{fg:o=>Xe.rgb(t,r,n)(o),fgCursor:o=>Xe.rgb(t,r,n).inverse(o),bg:o=>Xe.bgRgb(t,r,n).black(o),bgCursor:o=>Xe.bgRgb(t,r,n).white.bold(o)}},Lr=e=>ds(e).normal(` ${e} `),se=(e,t=Je)=>{let n=(o=>o.toLowerCase().trim())(e);return n&&t[n]?t[n]:pt(n)};var Ce="<ENTER> to confirm",Y=(e="",t=[])=>({message:e,validity:ve.Valid,completionWordList:t}),le=({message:e,completionWordList:t})=>({validity:ve.Invalid,message:e,completionWordList:t}),gt=e=>e.length===0,Le=({prefix:e="",wordList:t,postfix:r="",noOfHints:n=2,inputString:o,minLengthForHints:i=1})=>{let m=[...t.filter(Boolean).filter(p=>p.startsWith(o.trim()))].sort((p,y)=>Ft(p)-Ft(y)).slice(0,n).map(Lr),u=m.length>i?m.join(" "):"";return u?`${e}${u}${r}`:""},Dr=({modifier:e})=>{let t="confirm";return e===t?Y(Ce):le({message:gt(e)?`if you are certain, enter ${Lr(t)}`:"",completionWordList:[t]})},cs=({list:e,hint:t})=>({modifier:r})=>e.includes(r)?Y(Ce):le({message:gt(r)?t:"",completionWordList:[]}),ls=({list:e,hint:t,onValue:r})=>({modifier:n,inputString:o})=>e.includes(n)?o.trim().length<1?le({message:r,completionWordList:[]}):Y():le({message:gt(n)?t:"",completionWordList:[]}),Fr=({hint:e})=>({modifier:t,inputString:r})=>gt(t)&>(r)?le({message:e,completionWordList:[]}):Y(Ce),ms={[f.INIT]:()=>Y(Ce),[f.FILTER]:e=>{if(e.modifier==="clear")return Y();let t=a=>K(f.FILTER).includes(a);if(!e.modifier||!t(e.modifier??""))return le({message:Le({wordList:K(f.FILTER),noOfHints:100,inputString:e.inputString}),completionWordList:K(f.FILTER)});let n=Object.values(C().tags).map(a=>a.name),o=Object.values(C().contributors).map(a=>a.name),i=e.modifier==="tag"?n:e.modifier==="assignee"?o:[];return e.inputString?i.length&&!i.includes(e.inputString.trim()??"")?le({message:Le({prefix:`existing ${e.modifier}s... `,wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i}):Y():le({message:Le({prefix:"one of... ",wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i})},[f.NONE]:e=>e.command?Y():le({message:Le({prefix:"commands... ",wordList:K(f.NONE),noOfHints:100,inputString:e.inputString,minLengthForHints:0}),completionWordList:[]}),[f.NEW]:e=>ls({list:K(f.NEW),hint:Le({wordList:K(f.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[f.SET_DESCRIPTION]:()=>Y(Ce),[f.HELP]:()=>Y(Ce),[f.RENAME]:()=>Y(Ce),[f.DELETE]:e=>Dr(e),[f.CLOSE_ISSUE]:e=>Dr(e),[f.RE_OPEN_ISSUE]:e=>Dr(e),[f.MOVE]:e=>Fr({hint:Le({prefix:"hey hacker! These commands are blocked for you... ",wordList:K(f.MOVE),noOfHints:10,inputString:e.inputString})})(e),[f.TAG]:e=>{let t=E.getExistingTags().map(r=>` ${Pr.bgHex(se(r))(" "+r+" ")} `).slice(0,10);return Fr({hint:"tag name like... "+t.join("")})(e)},[f.ASSIGN]:e=>{let t=E.getExistingAssignees().map(r=>` ${Pr.bgHex(se(r))(" "+r+" ")} `).slice(0,10);return Fr({hint:"assign to... "+t.join("")})(e)},[f.SET_EDITOR]:e=>{logger.debug(`Validating command: ${e.command} ${e.modifier} ${e.inputString}`);let t=K(f.SET_EDITOR);return e.modifier?Y(Ce):le({message:Le({wordList:t,noOfHints:100,inputString:e.inputString}),completionWordList:[]})},[f.SET_USERNAME]:e=>e.inputString?Y():le({message:`Enter a username. Saved in ${Pr.bgBlack("~/.epiq/")}`,completionWordList:[]}),[f.SET_VIEW]:e=>cs({list:K(f.SET_VIEW),hint:Le({wordList:K(f.SET_VIEW),noOfHints:3,inputString:e.inputString})})(e),[f.SYNC]:()=>Y(Ce)},Kn=Object.fromEntries(Object.entries(ms).map(([e,t])=>[e,{validate:(r,n,o)=>t({modifier:n,command:r,inputString:o})}]));var Vn=["frontend","backend","infrastructure","architecture","integration","configuration","implementation","application","deployment","environment","framework","platform","service","component","module","gateway","pipeline","containerization","orchestrator","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","reproducibility","reproduction","investigation","triage","workaround","mitigation","remediation","optimization","stabilization","refinement","failure","outage","blocking","criticality","severity","escalation","diagnostics","analysis","resolution","corruption","inconsistency","validation","verification","authorization","authentication","confidentiality","availability","accessibility","reliability","compliance","governance","encryption","decryption","integrity","auditing","traceability","accountability","protection","privileges","permissions","dependency","orchestration","provisioning","synchronization","compatibility","incompatibility","interoperability","observability","instrumentation","telemetry","loadbalancing","discovery","registration","scheduling","coordination","distribution","isolation","virtualization","serialization","deserialization","initialization","instantiation","propagation","aggregation","consolidation","normalization","standardization","transformation","reconciliation","correlation","processing","indexing","partitioning","enrichment","validation","filtering","streaming","batching","concurrency","parallelism","contention","deadlock","throttling","ratelimiting","backpressure","fragmentation","saturation","exhaustion","partitioning","replication","redundancy","failover","deprecation","obsolescence","starvation","overload","underutilization","latency","throughput","refactoring","modularization","encapsulation","abstraction","extensibility","configurability","maintainability","recoverability","sustainability","readability","testability","debuggability","reusability","simplicity","consistency","performance","functionality","requirement","recommendation","improvement","enhancement","clarification","documentation","description","acceptance","criteria","estimation","prioritization","dependency","deliverable","milestone","iteration"];var R={Init:"init",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",SetView:"set-view",SetEditor:"set-editor",SetUserName:"set-user-name",NewItem:"add-new-item",TagTicket:"ticket-tag",AssignUserToTicket:"ticket-assign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Sync:"sync"};var jn=e=>Object.values(f).includes(e),zn=(e,t)=>{let r=e.command??"",{modifier:n,target:o,inputString:i}=e,{message:a,validity:l,completionWordList:m}=Kn[r].validate(r,n,i),u=o==="command"?Object.values(f):r&&e.target==="modifier"?K(r):Vn;return{validity:l,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:a??"",autoCompletion:t?Bn(e,[...m,...u]):{hint:"",hints:[],remainder:"",overlap:0}}};var qn=e=>{let t=e.trimStart(),r=ps(t),n=(r[0]??"").trimStart().trimEnd(),o=(r[1]??"").trimStart().trimEnd(),i=gs(e),a=jn(n)?n:null,l=a!==null,m=n!=="",u=e.endsWith(" "),p=a?K(a)??[]:[],y=a&&p.includes(o)?o:"",v="word";r.length<=1?v="command":r.length===2&&(v="modifier");let I=us(t,a,y);return{raw:e,trimmedStart:t,words:r,firstWord:n,lastWord:i,hasCommand:m,command:a,isCommandKeyword:l,isLastWordCompleted:u,modifier:y,target:v,inputToMatch:i,inputString:I}},us=(e,t,r)=>{let n=e;return t&&n.startsWith(t)&&(n=n.slice(t.length)),n=n.replace(/^\s+/,""),r&&n.startsWith(r)&&(n=n.slice(r.length),n=n.replace(/^\s+/,"")),n},ps=e=>e?e.split(/\s+/):[],gs=e=>e.trimEnd().split(/\s+/).at(-1)??"";var Gn=" ",z={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:ve.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},kr=new Set,Jn=()=>{for(let e of kr)e()},Xn=e=>(kr.add(e),()=>kr.delete(e)),Ne=e=>{let r=e(z),n=qn(r.value),o=r.cursorPosition===r.value.length;z={...r,commandMeta:zn(n,o)},Jn()},kt=({message:e,result:t})=>{let r=structuredClone(z);return r.commandMeta={...r.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},r.commandIsPending=!0,z=r,Jn(),c(e,null)},Br=e=>{Ne(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},Or=e=>{Ne(t=>{let{value:r,cursorPosition:n}=t,o=n;if(e==="left"){for(;o>0&&r[o-1]===" ";)o--;for(;o>0&&r[o-1]!==" ";)o--}else{for(;o<r.length&&r[o]!==" ";)o++;for(;o<r.length&&r[o]===" ";)o++}return{...t,cursorPosition:o}})},Yn=()=>{Ne(e=>{let t=e.value.slice(e.cursorPosition),r=Math.max(0,e.cursorPosition-1);return{...e,value:e.value.slice(0,r)+t,cursorPosition:r,commandIsPending:!1}})},Qn=()=>{Ne(e=>{let{value:t,cursorPosition:r}=e,n=r;for(;n>0&&t[n-1]===" ";)n--;for(;n>0&&t[n-1]!==" ";)n--;let o=t.slice(r);return{...e,value:t.slice(0,n)+o,cursorPosition:n,commandIsPending:!1}})},H=e=>{Ne(t=>{let r=Math.max(0,Math.min(t.cursorPosition,t.value.length)),n=t.value.slice(0,r),o=t.value.slice(r),i=e(n,t.commandMeta.autoCompletion),a=i+o,l=Math.max(0,Math.min(i.length,a.length));return{...t,value:a,cursorPosition:l,commandIsPending:!1}})},Zn=()=>{Ne(e=>({...e,commandIsPending:!0}))},eo=({addToHistory:e=!0})=>{Ne(r=>({...r,commandHistory:e?[r.value,...r.commandHistory].slice(0,40):r.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),fs()},to=()=>{Ne(e=>{let t=Math.min(e.commandHistoryIndex+1,e.commandHistory.length-1),r=e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:r,cursorPosition:r.length}})},ro=()=>{Ne(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),r=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:r,cursorPosition:r.length}})},fs=()=>H(()=>""),ue=()=>z,Bt=()=>{let[e,...t]=z.value.split(Gn);return t.join(Gn).trim()};var ys=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",xs=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",vs=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",no=(e,t)=>{if(xs(e,e.sequence))return"MoveCursorLeftOfWord";if(vs(e,e.sequence))return"MoveCursorRightOfWord";if(ys(e,e.sequence))return"EraseInputWord";switch(e.name){case"tab":return"autoCompleteCommand";case"up":return"getLastCommandFromHistory";case"down":return"getNextCommandFromHistory";case"left":return"MoveCursorLeft";case"right":return"MoveCursorRight";case"return":return"confirm";case"backspace":return t?"eraseInput":"exitCommandLine";case"escape":return"exitCommandLine";default:return"captureInput"}};function hs(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function Cs(e,t,r){let n=C().currentNode.childNavigationAcrossParents;switch(t){case"up":return e==="vertical"?r.prevItem:n?r.prevContainer:null;case"down":return e==="vertical"?r.nextItem:n?r.nextContainer:null;case"left":return e==="horizontal"?r.prevItem:n?r.prevContainer:null;case"right":return e==="horizontal"?r.nextItem:n?r.nextContainer:null}}function oo(e,t){let r=ue();if(e.sequence===":"&&r.value==="")return"initCommandLine";if(t===g.MOVE)switch(e.name){case"m":case"return":return"confirmMove"}if(t===g.COMMAND_LINE)return no(e,r.value);let n=hs(e);if(n){let o=t===g.MOVE?{prevItem:"movePreviousItem",nextItem:"moveNextItem",prevContainer:"moveToPreviousContainer",nextContainer:"moveToNextContainer"}:{prevItem:"navPreviousItem",nextItem:"navNextItem",prevContainer:"navToPreviousContainer",nextContainer:"navToNextContainer"};return Cs(C().currentNode.childRenderAxis,n,o)}if(e.ctrl&&e.name==="c")return"exit";switch(e.name){case"e":return"edit";case"n":return"addItem";case"m":return"initMove";case"d":return"Delete";case"return":return"confirm";case"space":return"confirm";case"v":return C().viewMode==="wide"?"SetViewDense":"SetViewWide";case"q":case"escape":return"exit";case"s":return"sync";default:return null}}var io=e=>{let{context:t}=C()?.currentNode;if(!t)return R.None;switch(e){case f.INIT:return R.Init;case f.DELETE:return R.Delete;case f.SET_DESCRIPTION:return R.Edit;case f.HELP:return R.ViewHelp;case f.RE_OPEN_ISSUE:return R.ReopenIssue;case f.CLOSE_ISSUE:return R.CloseIssue;case f.TAG:return R.TagTicket;case f.ASSIGN:return R.AssignUserToTicket;case f.RENAME:return R.Rename;case f.NEW:return R.NewItem;case f.FILTER:return R.Filter;case f.MOVE:return R.Move;case f.SET_USERNAME:return R.SetUserName;case f.SET_EDITOR:return R.SetEditor;case f.SET_VIEW:return R.SetView;case f.SYNC:return R.Sync;default:return R.None}};import sn from"fs";import{ulid as $}from"ulid";import{spawnSync as Ts}from"node:child_process";import Ms from"node:os";import lo from"node:path";import{ulid as Rs}from"ulid";import{accessSync as Ns,copyFileSync as Es,existsSync as Ot,mkdirSync as so,readdirSync as ao,readFileSync as bs,renameSync as Is,rmSync as Ss,statSync as co,unlinkSync as As,writeFileSync as ws}from"node:fs";import Ye from"node:path";var oe={writeToFile:(e,t)=>{try{let r=Ye.dirname(e);Ot(r)||so(r,{recursive:!0});let n=typeof t=="string"?t:JSON.stringify(t,null,2);ws(e,n,"utf-8")}catch(r){logger.error(`Failed to write file at ${e}:`,r)}},readFile:e=>{try{return bs(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=oe.readFile(e);return t===null?null:JSON.parse(t)}catch(t){return logger.error(`Failed to read JSON at ${e}:`,t),null}},dirExists:e=>{try{return Ot(e)&&co(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Ns(e),!0}catch{return!1}},mkDir:e=>so(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:r}=Ye.parse(t);for(;;){let n=Ye.join(t,e);try{if(Ot(n)&&co(n).isDirectory())return n}catch{logger.error(`Unable to locate folder ${e}`)}if(t===r)break;t=Ye.dirname(t)}return null},readFirstJSON(e){try{if(!oe.dirExists(e))return null;let t=ao(e).filter(n=>n.endsWith(".json")).sort()[0];if(!t)return null;let r=Ye.join(e,t);return oe.readFileJSON(r)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return oe.dirExists(e)?ao(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{As(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Ss(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,r){if(this.mkDir(Ye.dirname(t)),!r?.overwrite&&Ot(t))throw new Error(`moveFile: destination exists: ${t}`);r?.overwrite&&this.rmFile(t);try{Is(e,t)}catch(n){if(n?.code==="EXDEV"){Es(e,t),this.rmFile(e);return}throw n}}};function Ls(){let{preferredEditor:e}=ce(),t=[e,process.env.VISUAL,process.env.EDITOR,"vim","vi","nano"].filter(r=>!!r?.trim());return[...new Set(t)]}function Ps(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function mo(e){let t=lo.join(Ms.tmpdir(),"epiq");oe.mkDir(t);let r=lo.join(t,Rs());oe.writeToFile(r,e??"");let n=Ls();for(let o of n){let i=Ps(o,r),a=Ts(i,{stdio:"inherit",shell:!0});if(!a.error&&a.status===0){let l=oe.readFile(r);if(l==null)return s("Unable to read edited file");let m=l.replace(/\r?\n$/,"");return c("Successfully edited",m)}}return s("Unable to open editor")}import{monotonicFactory as Ds,ulid as Ut}from"ulid";var Wt=Ds(),uo=({name:e,parent:t,userId:r,userName:n})=>{let o=Wt(),i=Wt(),a=Wt(),l=Wt();return[{id:Ut(),userId:r,userName:n,action:"add.issue",payload:{id:o,parent:t,name:e}},{id:Ut(),userId:r,userName:n,action:"add.field",payload:{id:i,parent:o,name:"Description",val:""}},{id:Ut(),userId:r,userName:n,action:"add.field",payload:{id:a,parent:o,name:"Assignees"}},{id:Ut(),userId:r,userName:n,action:"add.field",payload:{id:l,parent:o,name:"Tags"}}]};var po=e=>{let t=e.log??[];for(let r=t.length-1;r>=0;r--){let n=t[r];if(n&&n.action==="close.issue"&&n.payload.id===e.id)return n.payload.parent}return null};var Fs=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[Qe,Ht]=Fs;var P=(e,t)=>s(`${t.split(".").join(" ")+" failed, "+e.toLowerCase()}`),ks={"init.workspace":({action:e,payload:t})=>{let{id:r,name:n}=t,o=X.workspace(r,n);go(o);let i=E.createNodeAtPosition(o);return d(i)?P(i.message??"Failed to initialize workspace",e):c("Workspace initialized",{action:e,result:i.data})},"add.workspace":({action:e,payload:t})=>{let{id:r,name:n}=t,o=X.workspace(r,n),i=E.createNodeAtPosition(o);return d(i)?P(i.message??"Failed to add workspace",e):c("Added workspace",{action:e,result:i.data})},"add.board":({action:e,payload:t})=>{let{id:r,name:n,parent:o}=t,i=E.createNodeAtPosition(X.board(r,n,o));return d(i)?P(i.message??"Unable to create board",e):c("Added board",{action:e,result:i.data})},"add.swimlane":({action:e,payload:t})=>{let{id:r,name:n,parent:o}=t,i=E.createNodeAtPosition(X.swimlane(r,n,o));return d(i)?P(i.message??"Unable to create swimlane",e):c("Added swimlane",{action:e,result:i.data})},"add.issue":({action:e,payload:t})=>{let{id:r,name:n,parent:o}=t,i=E.createNodeAtPosition(X.ticket(r,n,o));return d(i)?P(i.message??"Unable to create issue",e):c("Added issue",{action:e,result:i.data})},"add.field":({action:e,payload:t})=>{let{id:r,name:n,parent:o,val:i}=t,a=E.createNodeAtPosition(X.field(r,n,o,{value:i},n.includes("Description")?"vertical":"horizontal"));return d(a)?P(a.message??`Unable to create field: ${n}`,e):c("Added field",{action:e,result:a.data})},"edit.title":({action:e,payload:t})=>{let{id:r,name:n}=t;if(!E.getNode(r))return P("Unable to locate node",e);let i=E.renameNode(r,n);return d(i)?P(i.message??"Unable to edit title",e):c("Edited title",{action:e,result:i.data})},"delete.node":({action:e,payload:t})=>{let{id:r}=t,n=E.tombstoneNode(r);return d(n)?P(n.message??"Unable to delete node",e):c("Deleted node",{action:e,result:n.data})},"create.tag":({action:e,payload:t})=>{let{id:r,name:n}=t,o=E.createTag({id:r,name:n});return d(o)?P(o.message??"Unable to create tag",e):c("Tag added",{action:e,result:o.data})},"create.contributor":({action:e,payload:t})=>{let{id:r,name:n}=t,o=E.createContributor({id:r,name:n});return d(o)?P(o.message??"Unable to create contributor",e):c("Contributor created",{action:e,result:o.data})},"tag.issue":({action:e,payload:t})=>{let{id:r,target:n,tagId:o}=t,i=E.tag(n,o,r);return d(i)?P(i.message??"Unable to tag issue",e):c("Issue tagged",{action:e,result:i.data})},"assign.issue":({action:e,payload:t})=>{let{id:r,contributor:n,target:o}=t,i=E.assign(o,n,r);return d(i)?P(i.message??"Unable to assign issue",e):c("Assigned successfully",{action:e,result:i.data})},"move.node":({action:e,payload:t})=>{let{id:r,parent:n,pos:o}=t,i=E.moveNode({id:r,parentId:n,position:o});return d(i)?P(i.message??"Failed to move node",e):c("Moved node",{action:e,result:i.data})},"edit.description":({action:e,payload:t})=>{let{id:r,md:n}=t,o=E.editValue(r,n);return d(o)?P(o.message??"Unable to edit description",e):c("Set node value",{action:e,result:o.data})},"close.issue":({action:e,payload:t})=>{let{id:r}=t,n=E.getNode(r);if(!n)return P("Unable to locate issue",e);if(!We(n))return P("Can only close issues",e);let o=E.getNode(Qe);if(!o)return P("Unable to locate target swimlane",e);if(o.id===n.parentNodeId)return P("Cannot close closed issue",e);let a=E.moveNode({id:r,parentId:o.id});return d(a)?P(a.message??"Unable to close issue",e):c("Issue closed",{action:e,result:a.data})},"reopen.issue":({action:e,payload:t})=>{let{id:r}=t,n=E.getNode(r);if(!n)return P("Unable to locate issue",e);if(!We(n))return P("Can only reopen issues",e);let o=E.getNode(Qe);if(!o)return P("Unable to locate closed swimlane",e);if(!(n.parentNodeId===o.id))return P("Issue is not closed",e);let a=po(n);if(!a)return P("Unable to resolve previous parent from issue history",e);if(a===o.id)return P("Previous parent resolves to closed swimlane",e);if(!E.getNode(a))return P("Previous parent no longer exists",e);let m=E.moveNode({id:r,parentId:a});return d(m)?P(m.message??"Unable to reopen issue",e):c("Issue reopened",{action:e,result:m.data})},"lock.node":({action:e,payload:t})=>{let{id:r}=t,n=E.lockNode(r);return d(n)?P(n.message??"Unable to lock node",e):c("Node locked",{action:e,result:n.data})}},Bs=(e,t)=>{let r=E.getNode(e);r&&E.updateNode({...r,log:[...r.log??[],t]})},Os=e=>{switch(e.action){case"init.workspace":case"add.workspace":case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"edit.title":case"lock.node":case"delete.node":case"move.node":case"close.issue":case"reopen.issue":return[e.payload.id];case"edit.description":let t=[e.payload.id],r=C().nodes[e.payload.id]?.parentNodeId;return r&&t.push(r),t;case"tag.issue":case"assign.issue":return[e.payload.id,e.payload.target];case"create.tag":case"create.contributor":default:return[]}};function Ze(e,t=!1){let r=ks[e.action],n=r(e);if(d(n))return n;if(!t){let a=[...new Set(Os(e))];for(let l of a)Bs(l,e)}let o=e.userId,i=e.userName;return!o?.length||!i?.length?P("Invalid user ID format",e.action):(E.createContributor({name:i,id:o}),n)}var ft=e=>e.map(t=>Ze(t));import zt from"node:fs";import $e from"node:path";import{decodeTime as Gs,monotonicFactory as Js}from"ulid";import{z as yt}from"zod";var $t=process.env.IS_LOCAL==="true",pe=()=>".epiq";import _t from"node:fs";import Kt from"node:path";import{z as Wr}from"zod";var Us=pe(),Ws="events",Hs=Wr.object({userId:Wr.string().min(1).default("unknown"),userName:Wr.string().min(1).default("unknown")}),$s=(e=process.cwd())=>Kt.join(et(e),Us,Ws),_s=e=>{let[t,r]=Kt.basename(e,".jsonl").split("."),n=Hs.safeParse({userId:t,userName:r});return n.success?c("Parsed event file actor",n.data):s(`Invalid event file name ${Kt.basename(e)}: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},Ks=e=>{let t=Object.keys(e).filter(r=>r!=="id"&&r!=="v");return t.length!==1?s(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?s("Invalid persisted event: action key is missing or invalid"):c("Resolved persisted action",t[0])},Vs=(e,t)=>t in e,js=({id:e,action:t,payload:r,userId:n,userName:o})=>({id:e,action:t,payload:r,userId:n,userName:o}),zs=e=>{let{userId:t,userName:r,...n}=e,o=Ks(n);if(d(o))return s(o.message);let i=o.data,a=e.id?.[0];return a?Vs(n,i)?c("Decoded persisted event",js({id:a,action:i,payload:n[i],userId:t,userName:r})):s(`Persisted event is missing payload for action: ${i}`):s("Persisted event is missing id")},Vt=e=>{if(!_t.existsSync(e))return c("Event file missing",[]);let t=_s(e);if(d(t))return s(t.message);let r=_t.readFileSync(e,"utf8"),n=[];for(let o of r.split(`
|
|
3
|
+
`)){let i=o.trim();if(!i)continue;let a;try{a=JSON.parse(i)}catch{return s(`Failed to parse event JSON from ${e}: ${i}`)}let l=Hr(a);if(d(l))return s(`${l.message} in ${e}: ${i}`);n.push({...l.data,userId:t.data.userId,userName:t.data.userName})}return c("Parsed persisted events file",n)};function fo(e=process.cwd()){let t=$s(e);if(!_t.existsSync(t))return s("No events found");let r=_t.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>Kt.join(t,o)),n=[];for(let o of r){let i=Vt(o);if(d(i))return s(i.message);n.push(...i.data)}return c("All events loaded",qs(n))}function jt(e=process.cwd()){let t=fo(e);if(d(t))return s(t.message);let r=[];for(let n of t.data){let o=zs(n);if(d(o))return s(`Failed to decode event ${n.id?.[0]??"<unknown>"}: ${o.message}`);r.push(o.data)}return c("Loaded merged events",r)}function yo(e=process.cwd()){let t=fo(e);return d(t)?s(t.message):c("Loaded edge reference",t.data.at(-1)?.id?.[0]??null)}var qs=e=>{let t=new Map(e.map(l=>[l.id[0],l])),r=new Map;for(let l of e){let m=l.id[1],u=r.get(m)??[];u.push(l),r.set(m,u)}for(let l of r.values())l.sort((m,u)=>{let[p]=m.id,[y]=u.id;return p.localeCompare(y)});let n=[],o=new Set,i=l=>{let m=r.get(l)??[];for(let u of m){let[p]=u.id;o.has(p)||(o.add(p),n.push(u),i(p))}};i(null);let a=[...e].filter(l=>{let[m]=l.id;return!o.has(m)}).sort((l,m)=>{let[u,p]=l.id,[y,v]=m.id,I=p===null||t.has(p),S=v===null||t.has(v);if(I&&!S)return-1;if(!I&&S)return 1;let N=(p??"").localeCompare(v??"");return N!==0?N:u.localeCompare(y)});return[...n,...a]};var xo=e=>({action:e.action,payload:e.payload});var Co=1,vo=Js(),Xs="events",Ys=yt.tuple([yt.string().min(1),yt.string().min(1).nullable()]),Qs=yt.looseObject({v:yt.literal(Co),id:Ys}),Hr=e=>{let t=Qs.safeParse(e);return t.success?c("Parsed persisted event",t.data):s(`Invalid persisted event: ${t.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},ho=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",Q=()=>{let{userName:e,userId:t}=ce();return e?t?e.trim()?c("Successfully resolved actor ID",{userId:ho(t),userName:ho(e)}):s("Unable to resolve actor ID from settings or OS user info"):s("User ID not configured"):s("User name not configured")},Zs=e=>zt.existsSync($e.join(e,pe()))&&zt.statSync($e.join(e,pe())).isDirectory(),et=(e=process.cwd())=>{let t=$e.resolve(e);for(;;){if(Zs(t))return t;let r=$e.dirname(t);if(r===t)return $e.resolve(e);t=r}},No=(e=process.cwd())=>$e.join(et(e),pe(),Xs),qt=()=>{let e=Q();return d(e)||!e.data?s("Unable to resolve event log path"):c("Succeeded",`${e.data.userId}.${e.data.userName}.jsonl`)},ea=(e=process.cwd())=>{let t=qt();if(d(t))return s("Unable to resolve file name");let r=t.data;return/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r)?c("Successfully resolved event log path",$e.join(No(e),r)):s(`Invalid event log file name: ${r}`)},ta=(e,t)=>{let r={[e.action]:e.payload,v:Co,id:t};return Hr(r)};function Eo(e,t=process.cwd()){try{let r=et(t),n=No(r),o=ea(r);if(d(o))return o;zt.mkdirSync(n,{recursive:!0});let i=yo(r);if(d(i))return s(i.message);let a;if(i.data){let m=Gs(i.data),u=Math.max(Date.now(),m+1);a=vo(u)}else a=vo();let l=ta(xo(e),[a,i.data]);return d(l)?s(l.message):(zt.appendFileSync(o.data,`${JSON.stringify(l.data)}
|
|
4
|
+
`,"utf8"),c("Event persisted",{path:o.data,entry:l.data}))}catch(r){let n=r instanceof Error?r.message:"Unknown persist error";return s(`Failed to persist event: ${n}`)}}function Z(e){let t=Ze(e);if(t.result!==he.Success)return t;let r=Eo(e);return d(r)?r:t}function Gt(e){return e.map(t=>Z(t))}import{ulid as bo}from"ulid";var tt=null,Pe=()=>structuredClone(tt),rt=e=>tt=e,Io=()=>{let{currentNode:e,selectedIndex:t}=C(),n=M(e.id)[t];return n?c("Resolved selected child",n):s("Target node not found")};function $r(e){let t=Io();if(d(t))return t;let{currentNode:r,nodes:n}=C();if(!r.parentNodeId)return s("Missing parent node id");let o=n[r.parentNodeId];if(!o)return s("Missing parent node");let i=W(o.id),a=i.findIndex(({id:v})=>v===r.id);if(a<0)return s("Current node not found among siblings");let l=i[a+e];if(!l)return s("Missing sibling node");let m=Q();if(d(m))return s("Unable to resolve user ID");let{userId:u,userName:p}=m.data;if(rt({id:bo(),userId:u,userName:p,action:"move.node",payload:{id:t.data.id,parent:l.id,pos:{at:"end"}}}),!tt)return s("Could not materialize move state");let y=Ze(tt,!0);return d(y)?y:c("Node moved successfully",y.data)}function _r(e){let t=Io();if(d(t))return t;let{currentNode:r,selectedIndex:n}=C(),i=W(r.id)[n+e];if(!i)return s("Missing sibling node");let a=Q();if(d(a))return s("Unable to resolve user ID");let{userId:l,userName:m}=a.data;if(rt({id:bo(),userId:l,userName:m,action:"move.node",payload:{id:t.data.id,parent:r.id,pos:{at:e===1?"after":"before",sibling:i.id}}}),!tt)return s("Could not materialize move state");let u=Ze(tt,!0);return d(u)?u:c("Node moved successfully",u.data)}import ra from"node:os";import So from"node:path";import{z as Jt}from"zod";var na={userId:"",userName:"",preferredEditor:""},Ao=Jt.object({preferredEditor:Jt.string().optional(),userName:Jt.string().optional(),userId:Jt.string().optional()}).strict(),oa=".epiq",ia="config.json",wo=()=>So.join(ra.homedir(),oa),Kr=()=>So.join(wo(),ia),Vr=()=>{try{return oe.mkDir(wo()),c("Ensured ~/.epiq exists",null)}catch{return s("Unable to create ~/.epiq")}},sa=e=>{let t;try{t=JSON.parse(e)}catch{return s("Invalid ~/.epiq/config.json JSON")}let r=Ao.safeParse(t??{});return r.success?c("Parsed config",r.data):s(`Invalid ~/.epiq/config.json shape: ${r.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},To=()=>{let e=Vr();if(d(e))return s(e.message);let t=Kr(),r=oe.readFile(t);return r==null||r.trim()===""?c("No config found, using empty config",{}):sa(r)},Mo=e=>{let t=Vr();if(d(t))return s(t.message);let r=Ao.safeParse(e);if(!r.success)return s(`Invalid config: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let n=Kr();try{return oe.writeToFile(n,JSON.stringify(r.data,null,2)+`
|
|
5
|
+
`),c("Config written",null)}catch{return s("Unable to write ~/.epiq/config.json")}},jr=e=>{let t=To();if(d(t))return s("Failed to read existing config");let r={...t.data,...e};return Mo(r)},Ro=()=>{let e=Kr(),t=Vr();if(d(t))throw new Error("Unable to create ~/.epiq");if(!(oe.readFile(e)!==null)){let l=Mo(na);if(d(l))throw new Error("Unable to create ~/.epiq/config.json")}let n=To();if(d(n))throw new Error(n.message||"Unable to load settings");let{preferredEditor:o,userName:i,userId:a}=n.data;return!i||!a?s("User name or ID not configured in ~/.epiq/config.json"):ut({preferredEditor:o,userName:i,userId:a})};var nt=(e,t)=>{let r=e.find(n=>n.context===t);return r!==void 0?c("Found node",r):s("Unable to find node in breadcrumb")};import Ct from"node:fs";import{spawn as ca}from"node:child_process";import qr from"node:fs";import ot from"node:path";var xt=(e,t)=>{let r=new Map,n=t??((...i)=>JSON.stringify(i)),o=((...i)=>{let a=n(...i);if(!r.has(a)){let l=e(...i).then(m=>(d(m)&&r.delete(a),m));r.set(a,l)}return r.get(a)});return o.clear=()=>r.clear(),o};import vt from"fs";import Po from"path";import aa from"util";var Lo=1e3,Do=(e=process.cwd())=>Po.join(et(e),pe(),"log","epiq.log");function da(e=process.cwd()){if(!$t)return;let t=Do(e);if(!vt.existsSync(t))return;let n=vt.readFileSync(t,"utf8").split(`
|
|
6
|
+
`);if(n[n.length-1]===""&&n.pop(),n.length<=Lo)return;let o=n.slice(-Lo).join(`
|
|
7
7
|
`)+`
|
|
8
|
-
`;
|
|
9
|
-
`;
|
|
10
|
-
`)))}),
|
|
11
|
-
`)))
|
|
12
|
-
|
|
13
|
-
${r.message}`)
|
|
14
|
-
`)
|
|
15
|
-
|
|
16
|
-
${
|
|
17
|
-
${
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
${
|
|
21
|
-
${
|
|
22
|
-
${
|
|
23
|
-
${
|
|
24
|
-
${
|
|
25
|
-
|
|
26
|
-
${
|
|
27
|
-
${
|
|
28
|
-
${
|
|
29
|
-
${t.message}`):m("Pushed remote",!0)},Lo=async({repoRoot:e,worktreeRoot:t,ensureUpstream:n})=>{S.debug("[sync] bootstrap remote storage",{repoRoot:e,worktreeRoot:t,ensureUpstream:n});let r=!1;for(let o of[zs(),await Zs({repoRoot:e}),await ta({repoRoot:e,worktreeRoot:t}),await na(t),n?await ra(t):m("Skipped remote upstream bootstrap",!1)]){if(l(o))return s(o.message);r=r||!!o.data}return S.debug("[sync] bootstrap changed",r),m(n?"Bootstrapped remote storage":"Bootstrapped remote storage (readonly)",r)},Po=(e,t)=>{for(let n of[ot(e),ot(t)]){let r=qt(n);if(l(r))return s(r.message)}return m("Ensured remote layout",void 0)},Eo=async({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=Js({repoRoot:e,worktreeRoot:t,ownEventFileName:n});if(l(r))return s(r.message);if(!r.data)return m("Own event file already up to date in remote worktree",{createdCommit:!1});let o=await oa({worktreeRoot:t,ownEventFileName:n});if(l(o))return s(o.message);let i=await ia({repoRoot:e,worktreeRoot:t});return l(i)?s(i.message):m("Copied, staged, and committed own event file",{createdCommit:!0,commitSha:i.data})},Do=async({cwd:e=process.cwd(),ownEventFileName:t})=>{S.debug("[sync] start write sync",{cwd:e,ownEventFileName:t});let n=await Hn(e);if(l(n))return s(n.message);let r=n.data,o=To(r);S.debug("[sync] resolved roots",{repoRoot:r,worktreeRoot:o});let i=await ho(r);if(l(i))return s(i.message);if(i.data)return s("Cannot run :sync while the repository is in detached HEAD state");if(t.includes("/")||t.includes("\\"))return s("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return s("Own event file must end with .jsonl");let a=await xt(r);if(l(a))return s(a.message);if(a.data)return s("Cannot run :sync while a merge, rebase, cherry-pick, or revert is in progress in the current repo");let d=await Mo(r);if(l(d))return s(d.message);S.debug("[sync] ensure initial commit changed",d.data);let c=await Lo({repoRoot:r,worktreeRoot:o,ensureUpstream:!0});if(l(c))return s(c.message);let u=await xt(o);if(l(u))return s(u.message);if(u.data)return s("Cannot run :sync while a merge, rebase, cherry-pick, or revert is in progress in the remote worktree");let f=Po(r,o);if(l(f))return s(f.message);let x=!1,N,A=!1,b=!1,I=!1;S.debug("[sync] pull remote branch before local copy");let E=await zt({cwd:o,remote:q,branch:F});if(l(E))return s(E.message);A=E.data,S.debug("[sync] pulled remote",A);let T=Ro({repoRoot:r,worktreeRoot:o,skipFileNames:[t]});if(l(T))return s(T.message);I=T.data,S.debug("[sync] hydrated from remote",I);let B=await Eo({repoRoot:r,worktreeRoot:o,ownEventFileName:t});if(l(B))return s(B.message);x=B.data.createdCommit,N=B.data.commitSha,S.debug("[sync] sync own file result",B.data);let se=await bo(o),z=se;if(l(se)&&vo(se.message)){let Me=await zt({cwd:o,remote:q,branch:F});if(l(Me))return s(Me.message);let Re=await Eo({repoRoot:r,worktreeRoot:o,ownEventFileName:t});if(l(Re))return s(Re.message);if(Re.data.createdCommit&&(x=!0,N=Re.data.commitSha),S.debug("[sync] retry sync own file result",Re.data),z=await bo(o),l(z))return s(z.message)}if(l(z))return s(z.message);if(b=z.data,S.debug("[sync] pushed remote",b),x){let Me=await k({args:["rev-parse","HEAD"],cwd:o});if(l(Me))return s(Me.message);N=Me.data.stdout.trim()}return m("Synced event logs with remote",{repoRoot:r,worktreeRoot:o,createdCommit:x,commitSha:N,pulled:A,pushed:b,hydrated:I,bootstrapped:c.data})},Fo=async(e=process.cwd())=>{S.debug("[sync] start readonly sync",{cwd:e});let t=await Hn(e);if(l(t))return s(t.message);let n=t.data,r=To(n);S.debug("[sync] resolved readonly roots",{repoRoot:n,worktreeRoot:r});let o=await xt(n);if(l(o))return s(o.message);if(o.data)return s("Cannot sync while a git operation is in progress in the current repo");let i=await Mo(n);if(l(i))return s(i.message);S.debug("[sync] readonly ensure initial commit changed",i.data);let a=await Lo({repoRoot:n,worktreeRoot:r,ensureUpstream:!1});if(l(a))return s(a.message);let d=await xt(r);if(l(d))return s(d.message);if(d.data)return s("Cannot sync while a git operation is in progress in the remote worktree");let c=Po(n,r);if(l(c))return s(c.message);S.debug("[sync] readonly pull remote branch");let u=await zt({cwd:r,remote:q,branch:F});if(l(u))return s(u.message);S.debug("[sync] readonly pulled remote",u.data);let f=Ro({repoRoot:n,worktreeRoot:r});return l(f)?s(f.message):(S.debug("[sync] readonly hydrated from remote",f.data),m("Synced from remote",{repoRoot:n,worktreeRoot:r}))};var sa=e=>Object.values(h().tags).find(t=>t.name===e),aa=e=>Object.values(h().contributors).find(t=>t.name===e),ko=[{systemOnly:!0,intent:R.Move,mode:p.COMMAND_LINE,action:()=>{let e=J();if(l(e))return s("Unable to resolve user ID");let t=e.data,{modifier:n}=pe().commandMeta,r=()=>{let c=Pe();if(!c)return s("No pending move state");let u=c.payload.id;if(!h().nodes[u])return s("Moved node not found");let x=c.payload.parent,N=h().nodes[x];if(!N)return s("Move parent not found");let A=M(x).findIndex(b=>b.id===u);return A===-1?s("Moved node not found among rendered children"):(O.navigate({currentNode:N,selectedIndex:A}),m("Synchronized navigation to moved node",null))},o=c=>{if(l(c))return s(c.message);let u=r();return l(u)?s(u.message):m("Updated move preview",null)},{currentNode:i,selectedIndex:a}=h(),d=M(i.id)[a];if(!d)return w({mode:p.DEFAULT}),s("No move target");if(n==="start"){if(d.readonly)return s("Target node is read-only");if(a===-1)return s("No item selected");if(!d.parentNodeId)return s("Target has no parent");let c=M(d.parentNodeId),u=c.findIndex(({id:b})=>b===d.id);if(u===-1)return s("Target not found among siblings");let f=c[u-1],x=c[u+1],N=x!=null?{at:"before",sibling:x.id}:f!=null?{at:"after",sibling:f.id}:{at:"start"};tt({id:_(),userId:t,action:"move.node",payload:{id:d.id,parent:d.parentNodeId,pos:N}}),w({mode:p.MOVE});let A=r();return l(A)?s(A.message):m("Move initialized",null)}if(n==="next")return w({mode:p.MOVE}),o(kn(1));if(n==="previous")return w({mode:p.MOVE}),o(kn(-1));if(n==="to-next")return w({mode:p.MOVE}),o(Fn(1));if(n==="to-previous")return w({mode:p.MOVE}),o(Fn(-1));if(n==="confirm"){w({mode:p.DEFAULT});let c=Pe();if(!c)return s("No pending move to confirm");let u=Q(c);if(l(u))return u;let f=r();return l(f)?s(f.message):(tt(null),m("Moved item",null))}return n==="cancel"?(tt(null),w({mode:p.DEFAULT}),m("Cancelling move",null)):s("Invalid move modifier")}},{intent:R.Delete,mode:p.COMMAND_LINE,action:()=>{let e=J();if(l(e))return s("Unable to resolve user ID");let t=e.data,{currentNode:n,selectedIndex:r}=h(),o=M(n.id)[r];return o?Q({id:_(),userId:t,action:"delete.node",payload:{id:o.id}}):s("Unable to resolve child to delete")},onSuccess:()=>w({mode:p.DEFAULT})},{intent:R.Edit,mode:p.COMMAND_LINE,action:()=>{let e=J();if(l(e))return s("Unable to resolve user ID");let t=e.data,n=nt(h().breadCrumb,"TICKET");if(l(n))return s("Edit target must be an issue");let r=n.data;if(r.readonly)return s("Cannot edit readonly field");let{currentNode:o,selectedIndex:i}=h();if(!M(r.id)[i])return s("No selected field");let d=M(o.id)[i];if(!d)return s("No selected field");if(d.readonly)return s("Cannot edit readonly field");let c=d.props.value;if(typeof c!="string")return s("Selected field is not editable text");let u=jr(c);if(l(u))return s("Failed to edit field");let f=u.data;return f===c?m("No changes made",null):d.title==="Description"?Q({id:_(),userId:t,action:"edit.description",payload:{id:d.id,md:f}}):d.title==="Title"?Q({id:_(),userId:t,action:"edit.title",payload:{id:d.id,name:f}}):s(`Editing not supported for "${d.title}"`)},onSuccess:()=>w({mode:p.DEFAULT})},{intent:R.Filter,mode:p.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=pe().commandMeta,n=/(!=|=)/,[r,o]=e.split(n);if(!r||!(d=>V(g.FILTER).map(c=>c.split(n)[0]).includes(d))(r))return s("Invalid filter modifier");let a={target:r,operator:"=",value:t.trim()};return ce(d=>({...d,filters:e==="clear"?[]:[...d.filters,a],mode:p.DEFAULT})),m("Viewing help",null)}},{intent:R.ViewHelp,mode:p.COMMAND_LINE,action:()=>(w({mode:p.HELP}),m("Viewing help",null))},{intent:R.CloseIssue,mode:p.COMMAND_LINE,action:()=>{let e=J();if(l(e))return s("Unable to resolve user ID");let t=e.data,{currentNode:n,selectedIndex:r}=h(),o=M(n.id)[r];if(!o)return s("Unable to close issue, no target found");if(!o.parentNodeId)return s("No target parent found");if(!He(o))return s("Cannot close in this context");let i=Q({id:_(),userId:t,action:"close.issue",payload:{id:o.id,parent:o.parentNodeId}});return l(i)?i:m("Viewing help",null)}},{intent:R.ReopenIssue,mode:p.COMMAND_LINE,action:()=>{let e=J();if(l(e))return s("Unable to resolve user ID");let t=e.data,{currentNode:n,selectedIndex:r}=h(),o=M(n.id)[r];if(!o)return s("Unable to reopen issue, no target found");let i=o.context==="TICKET"?m("Resolved ticket",o):qe(o.id,"TICKET");if(l(i))return s("Cannot reopen in this context");let a=i.data,d=Q({id:_(),userId:t,action:"reopen.issue",payload:{id:a.id}});return l(d)?d:m("Issue reopened",null)},onSuccess:()=>w({mode:p.DEFAULT})},{intent:R.SetUserName,mode:p.COMMAND_LINE,action:()=>{let{userId:e,preferredEditor:t,userName:n}=le(),r=Dt()?.trim();if(!r)return s("No username provided");let o=r??n,i=e??_();if(!o||!i)return s("Unable to resolve user name or id");let a=Un({userName:o,userId:i,preferredEditor:t??""});return l(a)?a:(mt({userName:o,userId:i}),w({mode:p.DEFAULT}),m(`Username set to "${r}"`,null))}},{intent:R.Init,mode:p.COMMAND_LINE,action:()=>{let e=Bo();if(l(e))return e;let{rootNodeId:t,nodes:n}=h();return O.navigate({currentNode:n[t],selectedIndex:0}),m("Project initialized",null)}},{intent:R.SetEditor,mode:p.COMMAND_LINE,action:()=>{let e=Dt()?.trim();if(!e)return s("No editor provided");let t=Un({preferredEditor:e});return l(t)?t:(mt({preferredEditor:e}),w({mode:p.DEFAULT}),m(`Editor configuration set to "${e}"`,null))}},{intent:R.NewItem,mode:p.COMMAND_LINE,action:(e,t)=>{let n=J();if(l(n))return s("Unable to resolve user ID");let r=n.data;if(!t.inputString)return s(`provide a name for your ${t.modifier}`);let{breadCrumb:o,currentNode:i,selectedIndex:a}=h(),d=c=>{let u=Q(c);if(l(u))return u;let f=C.getNode(u.data.result.id);if(!f)return s("Created node not found");if(!f.parentNodeId)return u;let x=C.getNode(f.parentNodeId);return x?(O.navigate({currentNode:x,selectedIndex:C.getSiblings(f.parentNodeId).findIndex(({id:N})=>N===f.id)}),u):s("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:c}=h(),u=C.getNode(c);return u?d({id:_(),userId:r,action:"add.board",payload:{id:_(),name:t.inputString,parent:u.id}}):s("Workspace not found")}if(t.modifier==="swimlane"){let c=nt(o,"BOARD");return l(c)?s("Unable to add swimlane in this context"):d({id:_(),userId:r,action:"add.swimlane",payload:{id:_(),name:t.inputString,parent:c.data.id}})}if(t.modifier==="issue"){let c=M(i.id)[a],u=i.context==="SWIMLANE"?i:i.context==="BOARD"&&c?.context==="SWIMLANE"?c:(()=>{let b=nt(o,"SWIMLANE");return l(b)?null:b.data})();if(!u)return s("Unable to add issue in this context");let f=zr({userId:r,name:t.inputString,parent:u.id}),x=_t(f);if(x.some(b=>l(b)))return s("Issue create failed: "+x.filter(l).map(b=>b.message).filter(Boolean).join(", "));let N=x[0];if(!N||l(N))return s("Issue creation failed");let A=f[0]?.payload.id;return A?(O.navigate({currentNode:u,selectedIndex:C.getSiblings(u.id).findIndex(({id:b})=>b===A)}),m("Issue created",null)):s("Unable to determine ticket id")}return mr()},onSuccess:()=>w({mode:p.DEFAULT})},{intent:R.SetView,mode:p.COMMAND_LINE,action:()=>{let{commandMeta:e}=pe();return e.validity===ve.Invalid?s("Invalid command "+he):(ce(t=>({...t,viewMode:e.modifier==="wide"?"wide":e.modifier==="dense"?"dense":t.viewMode})),m("View set",null))},onSuccess:()=>w({mode:p.DEFAULT})},{intent:R.Rename,mode:p.COMMAND_LINE,action:()=>{let e=J();if(l(e))return s("Unable to resolve user ID");let t=e.data,{currentNode:n,selectedIndex:r}=h(),o=M(n.id)[r];if(!o)return s("Missing node");if(o.readonly)return s("Cannot rename readonly node");let i=Dt();return i?Q({id:_(),userId:t,action:"edit.title",payload:{id:o.id,name:i}}):s("Provide a new name")},onSuccess:()=>w({mode:p.DEFAULT})},{intent:R.TagTicket,mode:p.COMMAND_LINE,action:()=>{let e=J();if(l(e))return s("Unable to resolve user ID");let t=e.data,{modifier:n,inputString:r}=pe().commandMeta,o=(n||r).trim();if(!o)return s("Provide a tag");let{selectedIndex:i,currentNode:a}=h(),d=M(a.id)[i];if(!d)return s("Invalid tag target");let c=qe(d.id,"TICKET");if(l(c))return s("Unable to tag issue in this context");let u=c.data,f=sa(o),x;if(f)x=f.id;else{let b=_(),I=Q({id:_(),userId:t,action:"create.tag",payload:{id:b,name:o}});if(l(I))return I;x=I.data.result.id}let N=C.getFieldByTitle(u.id,"Tags");return N?M(N.id).some(b=>b.props?.value===x)?s("Already tagged with that tag"):Q({id:_(),userId:t,action:"tag.issue",payload:{id:_(),target:u.id,tagId:x}}):s("Unable to locate tags field")},onSuccess:()=>w({mode:p.DEFAULT})},{intent:R.AssignUserToTicket,mode:p.COMMAND_LINE,action:()=>{let e=J();if(l(e))return s("Unable to resolve user ID");let t=e.data,{modifier:n,inputString:r}=pe().commandMeta,o=(n||r).trim();if(!o)return s("Provide an assignee");let{selectedIndex:i,currentNode:a}=h(),d=M(a.id)[i];if(!d)return s("Invalid assign target");let c=qe(d.id,"TICKET");if(l(c))return s("Unable to assign issue in this context");let u=c.data,f=aa(o),x;if(f)x=f.id;else{let b=_(),I=Q({id:_(),userId:t,action:"create.contributor",payload:{id:b,name:o}});if(l(I))return I;x=I.data.result.id}let N=C.getFieldByTitle(u.id,"Assignees");return N?M(N.id).some(b=>b.props?.value===x)?s("Assignee already assigned"):Q({id:_(),userId:t,action:"assign.issue",payload:{id:_(),target:u.id,contributor:x}}):s("Unable to locate assignees field")},onSuccess:()=>w({mode:p.DEFAULT})},{intent:R.Sync,mode:p.COMMAND_LINE,action:async()=>{H(()=>""),w({syncStatus:{msg:"Syncing",status:"syncing"}});let{userId:e,userName:t}=le();if(!e)return s("Unable to resolve userId");if(!t)return s("Unable to resolve userName");let n=Dn();if(l(n))return s("Unable to resolve log file name");let r=await Do({ownEventFileName:n.data});if(l(r))return w({syncStatus:{msg:r.message,status:"outOfSync"}}),s(`Unable to sync state. ${r.message}`);w({syncStatus:{msg:"Synced",status:"synced"},mode:p.DEFAULT});let o=Wt();return l(o)?s("Unable to load events"):(gt(o.data),m("Synced",!0))}}];var ie=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=pe();if(!t)return s("No command to confirm");if(!e&&n===ve.Invalid)return s("Invalid command");let i=Hr(t);Fr();let a=ko.filter(c=>e||c.systemOnly!==!0).find(c=>c.intent===i);if(!a)return Pt({result:he.Fail,message:"Command not found",data:null});let d=await a.action(a,{command:t,inputString:o,modifier:r});return l(d)?Pt(d):(kr({addToHistory:!e}),a.onSuccess?.(),Pt(d))};var Gt=[{intent:"exit",mode:p.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(w({mode:p.COMMAND_LINE}),H(()=>"move cancel"),ie({isForceExecutedBySystem:!0}))},{intent:"initMove",mode:p.DEFAULT,description:"[m] move init/confirm",action:()=>(w({mode:p.COMMAND_LINE}),H(()=>"move start"),ie({isForceExecutedBySystem:!0}))},{intent:"confirmMove",mode:p.MOVE,action:()=>(w({mode:p.COMMAND_LINE}),H(()=>"move confirm"),ie({isForceExecutedBySystem:!0}))}],Xt=[{intent:"movePreviousItem",mode:p.MOVE,action:()=>Pe()?(w({mode:p.COMMAND_LINE}),H(()=>"move previous"),ie({isForceExecutedBySystem:!0})):s("No pending move")},{intent:"moveNextItem",mode:p.MOVE,action:()=>Pe()?(w({mode:p.COMMAND_LINE}),H(()=>"move next"),ie({isForceExecutedBySystem:!0})):s("No pending move")}],Oo=[{intent:"moveToNextContainer",mode:p.MOVE,action:()=>Pe()?(w({mode:p.COMMAND_LINE}),H(()=>"move to-next"),ie({isForceExecutedBySystem:!0})):s("No pending move")},{intent:"moveToPreviousContainer",mode:p.MOVE,action:()=>Pe()?(w({mode:p.COMMAND_LINE}),H(()=>"move to-previous"),ie({isForceExecutedBySystem:!0})):s("No pending move")}];var Uo={[L.WORKSPACE]:[...Gt,...Xt],[L.BOARD]:[...Gt,...Xt],[L.SWIMLANE]:[...Gt,...Xt,...Oo],[L.TICKET]:[],[L.FIELD]:[],[L.FIELD_LIST]:[],[L.TEXT]:[]};var Wo=[{intent:"addItem",mode:p.DEFAULT,description:"[n] new...",action:()=>(w({mode:p.COMMAND_LINE}),H(()=>`${g.NEW} `),m("Adding new item",null))},{intent:"Delete",mode:p.DEFAULT,description:"[d] delete",action:()=>(w({mode:p.COMMAND_LINE}),H(()=>`${g.DELETE} `),m("Deleting item",null))},{intent:"initCommandLine",mode:p.DEFAULT,description:"[:] focus command line",action:()=>(w({mode:p.COMMAND_LINE}),H(()=>""),m("Entering command line mode",null))},{intent:"confirm",mode:p.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>(O.enterChildNode(),m("Entering context",null))},{intent:"exit",mode:p.DEFAULT,description:"[q] exit context",action:()=>(logger.debug("Executing exit action"),O.enterParentNode(),m("Exiting context",null))},{intent:"navPreviousItem",mode:p.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(O.navigateToPreviousItem(),m("Navigating to previous item",null))},{intent:"navNextItem",mode:p.DEFAULT,action:()=>(O.navigateToNextItem(),m("Navigating to next item",null))},{intent:"navToPreviousContainer",mode:p.DEFAULT,action:()=>(O.navigateToPreviousContainer(),m("Navigating to previous container",null))},{intent:"navToNextContainer",mode:p.DEFAULT,action:()=>(O.navigateToNextContainer(),m("Navigating to next container",null))},{intent:"edit",mode:p.DEFAULT,action:()=>(w({mode:p.COMMAND_LINE}),H(()=>"edit"),ie(),m("Fired command",!0))},{intent:"SetViewDense",mode:p.DEFAULT,description:"[v] view change (wide/dense)",action:()=>(w({viewMode:"dense"}),m("View set",null))},{intent:"SetViewWide",mode:p.DEFAULT,action:()=>(w({viewMode:"wide"}),m("View set",null))},{intent:"sync",mode:p.DEFAULT,description:"[s] sync epiq with remote state branch",action:()=>(w({mode:p.COMMAND_LINE}),H(()=>"sync"),ie({isForceExecutedBySystem:!0}),m("Synced",!0))}];var Ho=[{intent:"viewHelp",mode:p.DEFAULT,action:()=>(w({mode:p.HELP}),m("Viewing help",null))},{intent:"exit",mode:p.HELP,action:()=>(w({mode:p.DEFAULT}),m("Exiting help",null))},{intent:"confirm",mode:p.COMMAND_LINE,action:()=>(ie(),m("Executing command",null))},{intent:"MoveCursorLeft",mode:p.COMMAND_LINE,action:()=>(Tn(-1),m("Moving cursor left",null))},{intent:"MoveCursorRight",mode:p.COMMAND_LINE,action:()=>(Tn(1),m("Moving cursor right",null))},{intent:"MoveCursorLeftOfWord",mode:p.COMMAND_LINE,action:()=>(Mn("left"),m("Moving cursor left of word",null))},{intent:"MoveCursorRightOfWord",mode:p.COMMAND_LINE,action:()=>(Mn("right"),m("Moving cursor right of word",null))},{intent:"exitCommandLine",mode:p.COMMAND_LINE,action:()=>(w({mode:p.DEFAULT}),m("Exiting command line",null))},{intent:"autoCompleteCommand",mode:p.COMMAND_LINE,action:()=>(H((e,{remainder:t})=>t?e+t:e),m("Auto-completing command",null))},{intent:"captureInput",mode:p.COMMAND_LINE,action:(e,{sequence:t})=>(H(n=>n+t),m("Capturing input",null))},{intent:"eraseInput",mode:p.COMMAND_LINE,action:()=>(Pr(),m("Erasing input",null))},{intent:"EraseInputWord",mode:p.COMMAND_LINE,action:()=>(Dr(),m("Erasing input word",null))},{intent:"getLastCommandFromHistory",mode:p.COMMAND_LINE,action:()=>(Br(),m("Getting last command from history",null))},{intent:"getNextCommandFromHistory",mode:p.COMMAND_LINE,action:()=>(Or(),m("Getting next command from history",null))}];import da from"chalk";var Yt=": for command line",_o="q to exit",$o=`${da.hex(v.accent)("m")} to confirm`,Kn={[L.WORKSPACE]:[Yt],[L.BOARD]:[Yt],[L.BOARD+p.COMMAND_LINE]:[Yt],[L.SWIMLANE]:[Yt],[L.TICKET+p.HELP]:[_o],[L.SWIMLANE+p.HELP]:[_o],[L.TICKET]:[],[L.FIELD]:[],[L.SWIMLANE+p.MOVE]:[$o],[L.TICKET+p.MOVE]:[$o]};var Jt=e=>e.trim().toLocaleLowerCase(),ca=(e,t)=>{let n=C.getFieldByTitle(e,t);if(!n)return"";let r=n.props?.value;return typeof r=="string"?r:""},la=e=>{let{tags:t}=h(),n=C.getFieldByTitle(e,"Tags");return n?W(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},ma=e=>{let{contributors:t}=h(),n=C.getFieldByTitle(e,"Assignees");return n?W(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},Vo=(e,t)=>{let n=t.value;if(!n)return!0;switch(t.target){case"title":return Jt(e.title??"").includes(n);case"description":return Jt(ca(e.id,"Description")).includes(n);case"tag":return la(e.id).map(Jt).some(d=>d.includes(n));case"assignee":return ma(e.id).map(Jt).some(d=>d.includes(n));default:return!0}};function Ko(e,t,n){let r=t[e];if(!r)return s("buildBreadCrumb(): current node not found");let o=[],i=r;for(;i&&(o.push(i),!(i.id===n||!i.parentNodeId));)i=t[i.parentNodeId];let a=o[o.length-1];return!a||a.id!==n?s("buildBreadCrumb(): node is not connected to root"):(o.reverse(),m("Breadcrumb built",o))}var jo=e=>{let t={};for(let n of e)n.intent&&(t[n.mode]||(t[n.mode]={}),t[n.mode][n.intent]=n);return t};var Qt,jn=new Set,zo=()=>{for(let e of jn)e()},pa=e=>(jn.add(e),()=>jn.delete(e));function qo(e){let{currentNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:i}=e;if(!t)return s("derive(): currentNodeId is missing");if(!r)return s("derive(): rootNode is missing");if(!o[r])return s("derive(): unable to find root node");let d=o[t];if(!d)return logger.error("Unable to derive state, currentNode not found"),s("Unable to derive state, currentNode not found");let c=Ko(t,o,r);if(l(c))return logger.error(c.message),c;let u=c.data,{context:f}=d,x=Kn[f+n]??Kn[f]??[],N=[...Wo,...Uo[f]??[],...Ho],A=jo(N);return m("Derived successfully",{...e,currentNode:d,breadCrumb:u,availableHints:x,availableActions:N,actionIndex:A,renderedChildrenIndex:ga(o,i)})}var h=()=>(Qt||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),Qt);function Gr(e){let t={filters:[],tags:{},contributors:{},viewMode:"dense",mode:p.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,currentNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""}},n=qo(t);return l(n)?n:(Qt=n.data,zo(),m("State initialized",null))}function ce(e){let t=h(),n=e(t),r=qo(n);return l(r)?s(r.message??"Unable to update state"):(Qt=r.data,zo(),m("State updated",null))}var w=e=>ce(t=>({...t,...e}));var $=()=>ua(pa,h,h),ga=(e,t)=>{let n={};for(let r of Object.values(e))He(r)&&t.length>0&&!t.every(o=>Vo(r,o))||!r.parentNodeId||r.isDeleted||((!r.parentNodeId||!n[r.parentNodeId])&&(n[r.parentNodeId]=[]),n[r.parentNodeId].push(r));for(let r of Object.keys(n))n[r].sort((o,i)=>{let a=e[o.id],d=e[i.id];return!a||!d?0:a.rank.localeCompare(d.rank)});return n},M=e=>h().renderedChildrenIndex[e]??[];var O={exit(){process.exit(0)},enterChildNode(){let e=h(),t=e.currentNode,n=Math.max(0,e.selectedIndex),r=M(t.id)[n];!r||t.context==="FIELD"||O.navigate({currentNode:r,selectedIndex:M(r.id).length?0:-1})},enterParentNode(){let{currentNode:e,nodes:t}=h();if(!e.parentNodeId){logger.info("Missing parent node id");return}let n=t[e.parentNodeId];if(!n){logger.error("Parent not found");return}let r=M(n.id),o=r.findIndex(({id:a})=>a===e.id),i=r.length===0?-1:o>=0?o:0;O.navigate({currentNode:n,selectedIndex:i})},navigateToNextItem:()=>Go(1),navigateToPreviousItem:()=>Go(-1),navigateToNextContainer:()=>Xo(1),navigateToPreviousContainer:()=>Xo(-1),navigate:({currentNode:e=h().currentNode,selectedIndex:t})=>{w({currentNodeId:e.id,selectedIndex:t})}},Go=e=>{let t=h(),n=M(t.currentNode.id).length;if(n===0)return;let o=(Math.max(0,t.selectedIndex)+e+n)%n;O.navigate({selectedIndex:o})},Xo=e=>{let{currentNode:t,nodes:n,selectedIndex:r}=h();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!t||!o)return;let i=M(o.id),a=i.findIndex(N=>N.id===t.id);if(a<0)return;let d=i.at(a+e)??i.at(0);if(!d)return;let c=M(d.id),u=Math.max(0,c.length-1),f=Math.min(Math.max(0,r),u),x=c.length?f:-1;O.navigate({currentNode:d,selectedIndex:x})};var Ee="system.actor",vt=fa(),Fe=null;function ya(){let e=Object.values(h().nodes).find(r=>r.context==="WORKSPACE");if(!e)throw new Error("No workspace found in event log");let[t]=M(e.id),[n]=t?M(t.id):[];if(logger.debug("Boot navigation target:",{workspace:e?.id,firstBoard:t?.id,firstSwimlane:n?.id}),n){let r=h().renderedChildrenIndex?.[n.id]??[];return{currentNode:n,selectedIndex:r.length>0?0:-1}}else return t?{currentNode:t,selectedIndex:0}:e?{currentNode:e,selectedIndex:0}:{currentNode:h().nodes[h().rootNodeId],selectedIndex:0}}function xa(){let e=ya();O.navigate(e)}function va(){let e=vt(),t=vt(),n=vt(),r=vt(),o=vt();return[{id:be(),userId:Ee,action:"init.workspace",payload:{id:e,name:"Workspace"}},{id:be(),userId:Ee,action:"add.board",payload:{id:t,name:"Default",parent:e}},{id:be(),userId:Ee,action:"add.swimlane",payload:{id:n,name:"Todo",parent:t}},{id:be(),userId:Ee,action:"add.swimlane",payload:{id:r,name:"Review",parent:t}},{id:be(),userId:Ee,action:"add.swimlane",payload:{id:o,name:"Done",parent:t}},{id:be(),userId:Ee,action:"add.board",payload:{id:Ot,name:"Closed",parent:e}},{id:be(),userId:Ee,action:"add.swimlane",payload:{id:Je,name:"Closed",parent:Ot}},{id:be(),userId:Ee,action:"lock.node",payload:{id:Ot}},{id:be(),userId:Ee,action:"lock.node",payload:{id:Je}}]}function Rt(){return Fe!==null}function Bo(){if(!Fe||Fe.length===0)return m("No pending default events to persist",null);let t=_t(Fe).filter(l);return t.length>0?s([it.bold.red("Materializing failed"),"",...t.map((n,r)=>`${it.dim.gray(`${r+1}.`)} ${it.dim(n.message)}`),`
|
|
8
|
+
`;vt.writeFileSync(t,o,"utf8")}function zr(e,t,r=!1,n=process.cwd()){if(!$t)return;let o=Do(n),i=aa.format(...t),a=new Date,m=`[${r?a.toISOString().slice(11,19):a.toISOString()}] ${e} ${i}
|
|
9
|
+
`;vt.mkdirSync(Po.dirname(o),{recursive:!0}),vt.appendFileSync(o,m,"utf8"),da(n)}var A={info(...e){zr("[Info]",e,!1)},debug(...e){zr("->",e,!0)},error(...e){zr("[Error]",[...e,new Error().stack],!1)}};globalThis.logger=A;var Fo=15e3,la={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},Bo=({args:e,cwd:t,allowFail:r})=>new Promise(n=>{if(!qr.existsSync(t)){let p=`Git cwd does not exist: ${t}`;if(r){n({stdout:"",stderr:p,exitCode:1});return}n(s(p));return}let o=ca("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:la}),i=!1,a="",l="",m=p=>{i||(i=!0,clearTimeout(u),n(p))},u=setTimeout(()=>{o.kill("SIGTERM");let p=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${Fo}ms`].join(`
|
|
10
|
+
`);m(r?{stdout:a,stderr:p,exitCode:124}:s(p))},Fo);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",p=>{a+=p}),o.stderr.on("data",p=>{l+=p}),o.on("error",p=>{if(r){m({stdout:a,stderr:p.message,exitCode:1});return}m(s([`git ${e.join(" ")}`,`cwd=${t}`,p.message].join(`
|
|
11
|
+
`)))}),o.on("close",p=>{let y=p??1;if(r){m({stdout:a,stderr:l,exitCode:y});return}if(y!==0){m(s([`git ${e.join(" ")}`,l.trim()||a.trim()||"Git command failed"].filter(Boolean).join(`
|
|
12
|
+
`)));return}m(c("Git command succeeded",{stdout:a,stderr:l,exitCode:y}))})}),D=({args:e,cwd:t})=>Bo({args:e,cwd:t,allowFail:!1}),_e=({args:e,cwd:t})=>Bo({args:e,cwd:t,allowFail:!0}),Gr=xt(async(e=process.cwd())=>{let t=await D({args:["rev-parse","--show-toplevel"],cwd:e});return d(t)?s("Not inside a Git repository"):c("Resolved repo root",t.data.stdout.trim())},e=>ot.resolve(e)),ma=xt(async e=>{let t=await D({args:["rev-parse","--git-dir"],cwd:e});if(d(t))return s(t.message);let r=t.data.stdout.trim(),n=ot.isAbsolute(r)?r:ot.join(e,r);return c("Resolved git dir",n)},e=>ot.resolve(e)),Jr=async({cwd:e,message:t})=>{let r=await D({args:["commit","-m",t],cwd:e});if(d(r))return s(`Failed to create commit
|
|
13
|
+
${r.message}`);let n=await D({args:["rev-parse","HEAD"],cwd:e});return d(n)?s(`Commit created, but failed to read HEAD SHA
|
|
14
|
+
${n.message}`):c("Created commit and resolved SHA",n.data.stdout.trim())},ht=async e=>{let t=await ma(e);if(d(t))return s(t.message);let r=t.data,o=["MERGE_HEAD","CHERRY_PICK_HEAD","REVERT_HEAD","REBASE_HEAD","rebase-merge","rebase-apply"].filter(i=>qr.existsSync(ot.join(r,i)));return c("Checked for in-progress Git operation",o.length>0)},Xt=async({repoRoot:e,remote:t})=>{let r=await _e({args:["remote","get-url",t],cwd:e});return c("Checked remote",r.exitCode===0)},Yt=async({repoRoot:e,remote:t,branch:r})=>{let n=await _e({args:["ls-remote","--heads",t,r],cwd:e});return n.exitCode!==0?s(n.stderr.trim()||`Unable to inspect remote branch ${t}/${r}`):c("Checked remote branch",n.stdout.trim().length>0)},Oo=async({repoRoot:e,branch:t})=>{let r=await _e({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return r.exitCode===0?c("Local branch exists",!0):r.exitCode===1?c("Local branch missing",!1):s(r.stderr.trim()||`Unable to inspect branch ${t}`)},ko=e=>{try{return qr.realpathSync.native(e)}catch{return ot.resolve(e)}},Uo=async({repoRoot:e,worktreeRoot:t})=>{let r=await D({args:["worktree","list","--porcelain"],cwd:e});if(d(r))return s(r.message);let n=ko(t),o=r.data.stdout.split(`
|
|
15
|
+
`).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(ko).includes(n);return c("Checked worktree registration",o)},Xr=async e=>{let t=await _e({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return c("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},Qt=async e=>{let t=await D({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return d(t)?s(t.message):c("Resolved current branch",t.data.stdout.trim())},Wo=async e=>{let t=await D({args:["rev-parse","--short","HEAD"],cwd:e});return d(t)?s(t.message):c("Resolved short HEAD sha",t.data.stdout.trim())},Ho=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),Zt=async({cwd:e,remote:t,branch:r})=>{let n=await Yt({repoRoot:e,remote:t,branch:r});if(d(n))return s(n.message);if(!n.data)return c("Remote branch missing, skipped pull",!1);A.debug("[git] fetch start",{cwd:e,remote:t,branch:r});let o=await D({args:["fetch",t,r],cwd:e});if(A.debug("[git] fetch done",o),d(o))return s(`Failed to fetch ${r}
|
|
16
|
+
${o.message}`);A.debug("[git] pull start",{cwd:e,remote:t,branch:r});let i=await D({args:["pull","--rebase",t,r],cwd:e});return A.debug("[git] pull done",i),d(i)?s(`Failed during pull --rebase
|
|
17
|
+
${i.message}`):c("Pulled with rebase",!0)},$o=async e=>{let t=await D({args:["status","--porcelain"],cwd:e});return d(t)?s(t.message):c("Checked remote worktree changes",t.data.stdout.trim().length>0)},_o=async e=>{let t=await Qt(e);return d(t)?s(t.message):c("Checked detached HEAD state",t.data==="HEAD")};import{createHash as xa}from"node:crypto";import ge from"node:fs";import va from"node:os";import G from"node:path";import er from"node:fs";import ua from"node:path";import{decodeTime as pa}from"ulid";var Yr=e=>{let[t,r]=e.id;return`${t}:${r??""}`},Ko=e=>{let[t]=e.id;return pa(t)},ga=e=>{let{userId:t,userName:r,...n}=e;return n},fa=e=>e.length===0?"":e.map(t=>JSON.stringify(ga(t))).join(`
|
|
18
|
+
`)+`
|
|
19
|
+
`,ya=(e,t)=>{let r=new Map;for(let n of[...t,...e])r.set(Yr(n),n);return[...r.values()].sort((n,o)=>{let i=Ko(n)-Ko(o);return i!==0?i:Yr(n).localeCompare(Yr(o))})},tr=({sourceFile:e,targetFile:t})=>{let r=Vt(e);if(d(r))return s(r.message);let n=Vt(t);if(d(n))return s(n.message);let o=ya(n.data,r.data),i=fa(o);return(er.existsSync(t)?er.readFileSync(t,"utf8"):"")===i?c("Event file already merged",!1):(er.mkdirSync(ua.dirname(t),{recursive:!0}),er.writeFileSync(t,i,"utf8"),c("Merged event file",!0))};var F="epiq/events",q="origin",Qr=pe(),jo="events",ha="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Ca=e=>G.join(Qr,jo,e),Na=e=>xa("sha1").update(G.resolve(e)).digest("hex").slice(0,12),zo=()=>G.join(va.homedir(),".epiq"),qo=()=>G.join(zo(),"worktrees"),Zr=e=>G.join(qo(),Na(e)),Ea=e=>G.join(e,Qr),it=e=>G.join(Ea(e),jo),Ke=({root:e,fileName:t})=>G.join(it(e),t),rr=e=>(A.debug("[sync] ensure dir",e),ge.mkdirSync(e,{recursive:!0}),c("Ensured directory",void 0)),ba=()=>{A.debug("[sync] ensure epiq storage");let e=rr(zo());if(d(e))return s(e.message);let t=rr(qo());return d(t)?s(t.message):c("Ensured epiq storage",void 0)},Ia=e=>{ge.existsSync(e)&&(A.debug("[sync] remove path",e),ge.rmSync(e,{recursive:!0,force:!0}))},Sa=e=>{let t=it(e);if(!ge.existsSync(t))return A.debug("[sync] events dir missing",t),c("Events dir missing",[]);let r=ge.readdirSync(t,{withFileTypes:!0}).filter(n=>n.isFile()).map(n=>n.name).filter(n=>n.endsWith(".jsonl")).sort();return A.debug("[sync] listed event files",{eventsDir:t,count:r.length}),c("Listed event files",r)},Aa=async e=>{A.debug("[sync] inspect local HEAD",e);let t=await _e({args:["rev-parse","--verify","HEAD"],cwd:e});return t.exitCode===0?c("Repo has HEAD",!0):t.exitCode===1?c("Repo has no HEAD",!1):s(t.stderr.trim()||"Unable to inspect HEAD")},wa=xt(async e=>{A.debug("[sync] inspect remote history",{repoRoot:e,remote:q});let t=await Xt({repoRoot:e,remote:q});if(d(t))return s(t.message);if(!t.data)return c("No remote configured",!1);let r=await _e({args:["ls-remote","--heads",q],cwd:e});if(r.exitCode!==0)return s(r.stderr.trim()||"Unable to inspect remote heads");let n=r.stdout.trim().length>0;return A.debug("[sync] remote history",n),c("Checked remote history",n)},e=>G.resolve(e)),en=async e=>{A.debug("[sync] ensure initial commit");let t=await Aa(e);if(d(t))return s(t.message);if(t.data)return A.debug("[sync] local HEAD exists"),c("Repo already initialized",!1);let r=await wa(e);if(d(r))return s(r.message);if(r.data)return A.debug("[sync] skip local init commit due to remote history"),c("Skipped local init commit because remote history exists",!1);A.debug("[sync] create empty init commit");let n=await D({args:["commit","--allow-empty","-m","[epiq:init]"],cwd:e});return d(n)?s(`Failed to create initial commit
|
|
20
|
+
${n.message}`):c("Created initial commit",!0)},tn=({repoRoot:e,worktreeRoot:t})=>{let r=Sa(t);if(d(r))return s(r.message);let n=it(t),o=it(e),i=!1;for(let a of r.data){let l=G.join(n,a),m=G.join(o,a);A.debug("[sync] hydrate event file",{from:l,to:m});let u=tr({sourceFile:l,targetFile:m});if(d(u))return s(u.message);i=i||u.data}return A.debug("[sync] hydrate changed",i),c("Hydrated event files from remote worktree",i)},Vo=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",Ta=async e=>{let t=await Qt(e);if(d(t))return s(t.message);let r=await Wo(e);if(d(r))return s(r.message);let n=`[epiq:sync:${Vo(t.data)}:${Vo(r.data)}]`;return A.debug("[sync] commit message",n),c("Built sync commit message",n)},Ma=async e=>{A.debug("[sync] create empty storage branch",F);let t=await D({args:["commit-tree",ha,"-m","[epiq:init-storage-branch]"],cwd:e});if(d(t))return s(`Failed to create storage branch commit
|
|
21
|
+
${t.message}`);let r=t.data.stdout.trim(),n=await D({args:["update-ref",`refs/heads/${F}`,r],cwd:e});return d(n)?s(`Failed to create ${F}
|
|
22
|
+
${n.message}`):c("Created empty storage branch",!0)},Ra=async({repoRoot:e})=>{A.debug("[sync] ensure local remote branch",F);let t=await Oo({repoRoot:e,branch:F});if(d(t))return s(t.message);if(t.data)return A.debug("[sync] local remote branch exists"),c("Local remote branch already exists",!1);let r=await Xt({repoRoot:e,remote:q});if(d(r))return s(r.message);if(r.data){let n=await Yt({repoRoot:e,remote:q,branch:F});if(d(n))return s(n.message);if(n.data){A.debug("[sync] fetch remote branch before local track");let o=await D({args:["fetch",q,F],cwd:e});if(d(o))return s(`Failed to fetch ${F} from remote
|
|
23
|
+
${o.message}`);A.debug("[sync] create local tracking branch",F);let i=await D({args:["branch","--track",F,`${q}/${F}`],cwd:e});return d(i)?s(`Failed to create local ${F} from remote
|
|
24
|
+
${i.message}`):c("Created local remote branch from remote",!0)}}return Ma(e)},La=async({repoRoot:e,branch:t})=>{let r=await D({args:["worktree","list","--porcelain"],cwd:e});if(d(r))return s(r.message);let n=r.data.stdout.split(`
|
|
25
|
+
`),o=null;for(let i of n){if(i.startsWith("worktree ")){o=i.slice(9);continue}if(i===`branch refs/heads/${t}`&&o)return c("Found worktree for branch",o)}return c("No worktree found for branch",null)},Pa=async({repoRoot:e,worktreeRoot:t})=>{A.debug("[sync] create remote worktree",t);let r=rr(G.dirname(t));if(d(r))return s(r.message);ge.existsSync(t)&&!ge.existsSync(G.join(t,".git"))&&(A.debug("[sync] remove broken remote worktree path",t),Ia(t));let n=await D({args:["worktree","add",t,F],cwd:e});return d(n)?s(`Failed to create remote worktree
|
|
26
|
+
${n.message}`):c("Created remote worktree",!0)},Da=async({repoRoot:e,worktreeRoot:t})=>{A.debug("[sync] ensure remote worktree",t);let r=await La({repoRoot:e,branch:F});if(d(r))return s(r.message);let n=r.data,o=G.resolve(t),i=n?G.resolve(n):null;if(i&&i===o&&ge.existsSync(i))return A.debug("[sync] reuse existing remote branch worktree",{expected:o,actual:i}),c("Remote branch already checked out in expected worktree",!1);if(i&&i!==o){A.debug("[sync] remove old remote branch worktree",{expected:o,actual:i});let m=await D({args:["worktree","remove","--force",i],cwd:e});if(d(m))return s(`Failed to remove existing remote worktree
|
|
27
|
+
${m.message}`)}if(i&&!ge.existsSync(i)){A.debug("[sync] prune stale branch worktree registration",{existingBranchWorktree:i});let m=await D({args:["worktree","prune"],cwd:e});if(d(m))return s(`Failed to prune stale worktrees
|
|
28
|
+
${m.message}`)}let a=await Uo({repoRoot:e,worktreeRoot:t});if(d(a))return s(a.message);let l=ge.existsSync(t);if(a.data&&l)return A.debug("[sync] remote worktree exists"),c("Remote worktree already exists",!1);if(a.data&&!l){A.debug("[sync] prune stale remote worktree registration");let m=await D({args:["worktree","prune"],cwd:e});if(d(m))return s(`Failed to prune stale worktrees
|
|
29
|
+
${m.message}`)}return Pa({repoRoot:e,worktreeRoot:t})},Fa=async e=>{let t=await Qt(e);if(d(t))return s(t.message);if(t.data===F)return A.debug("[sync] remote branch already checked out"),c("Remote branch already checked out",!1);A.debug("[sync] checkout remote branch",F);let r=await D({args:["checkout",F],cwd:e});return d(r)?s(`Failed to checkout ${F}
|
|
30
|
+
${r.message}`):c("Checked out remote branch",!0)},ka=async e=>{let t=await D({args:["ls-tree","--name-only","HEAD"],cwd:e});if(d(t))return s(t.message);let n=t.data.stdout.trim().split(`
|
|
31
|
+
`).filter(Boolean).filter(a=>a!==Qr);if(n.length===0)return c("Remote branch is storage-only",!1);A.debug("[sync] remove app files from storage branch",n);let o=await D({args:["rm","-r","--ignore-unmatch","--",...n],cwd:e});if(d(o))return s(`Failed to clean storage branch
|
|
32
|
+
${o.message}`);let i=await Jr({cwd:e,message:"[epiq:repair-storage-branch]"});return d(i)?s(i.message):c("Cleaned storage branch",!0)},Ba=async e=>{A.debug("[sync] ensure remote upstream",F);let t=await Xr(e);if(d(t))return s(t.message);if(t.data)return A.debug("[sync] remote upstream already configured"),c("Remote upstream already configured",!1);let r=await Xt({repoRoot:e,remote:q});if(d(r))return s(r.message);if(!r.data)return A.debug("[sync] no remote configured for upstream"),c("No remote available for upstream",!1);let n=await Yt({repoRoot:e,remote:q,branch:F});if(d(n))return s(n.message);if(!n.data)return A.debug("[sync] remote branch missing; upstream will be configured on first push"),c("Deferred upstream until first push",!1);A.debug("[sync] fetch remote branch before upstream set");let o=await D({args:["fetch",q,F],cwd:e});if(d(o))return s(`Failed to fetch ${F}
|
|
33
|
+
${o.message}`);A.debug("[sync] set upstream to remote branch");let i=await D({args:["branch","--set-upstream-to",`${q}/${F}`,F],cwd:e});return d(i)?s(`Failed to set remote upstream
|
|
34
|
+
${i.message}`):c("Configured remote upstream",!0)},Go=async({worktreeRoot:e,ownEventFileName:t})=>{A.debug("[sync] stage own event file in remote worktree",t);let r=await D({args:["add",Ca(t)],cwd:e});return d(r)?s(`Failed to stage remote own event file
|
|
35
|
+
${r.message}`):c("Staged remote own event file",void 0)},Jo=async({repoRoot:e,worktreeRoot:t})=>{let r=await Ta(e);return d(r)?s(r.message):(A.debug("[sync] create remote sync commit"),Jr({cwd:t,message:r.data}))},rn=async e=>{A.debug("[sync] push remote worktree");let t=await Xr(e);if(d(t))return s(t.message);let r=await D({args:t.data?["push"]:["push","-u",q,F],cwd:e});return A.debug("[sync] push result",r),d(r)?s(`Failed during remote push
|
|
36
|
+
${r.message}`):c("Pushed remote",!0)},nn=async({repoRoot:e,worktreeRoot:t,ensureUpstream:r})=>{A.debug("[sync] bootstrap remote storage",{repoRoot:e,worktreeRoot:t,ensureUpstream:r});let n=!1,o=[ba(),await Ra({repoRoot:e}),await Da({repoRoot:e,worktreeRoot:t}),await Fa(t),await ka(t),r?await Ba(t):c("Skipped remote upstream bootstrap",!1)];for(let i of o){if(d(i))return s(i.message);n=n||!!i.data}return A.debug("[sync] bootstrap changed",n),c(r?"Bootstrapped remote storage":"Bootstrapped remote storage (readonly)",n)},on=(e,t)=>{for(let r of[it(e),it(t)]){let n=rr(r);if(d(n))return s(n.message)}return c("Ensured remote layout",void 0)};var Qo=async(e=process.cwd())=>{logger.debug("[sync] start readonly sync",{cwd:e});let t=await Gr(e);if(d(t))return s(t.message);let r=t.data,n=Zr(r);logger.debug("[sync] resolved readonly roots",{repoRoot:r,worktreeRoot:n});let o=await ht(r);if(d(o))return s(o.message);if(o.data)return s("Cannot sync while a git operation is in progress in the current repo");let i=await en(r);if(d(i))return s(i.message);logger.debug("[sync] readonly ensure initial commit changed",i.data);let a=await nn({repoRoot:r,worktreeRoot:n,ensureUpstream:!1});if(d(a))return s(a.message);let l=await ht(n);if(d(l))return s(l.message);if(l.data)return s("Cannot sync while a git operation is in progress in the remote worktree");let m=on(r,n);if(d(m))return s(m.message);logger.debug("[sync] readonly pull remote branch");let u=await Zt({cwd:n,remote:q,branch:F});if(d(u))return s(u.message);logger.debug("[sync] readonly pulled remote",u.data);let p=tn({repoRoot:r,worktreeRoot:n});return d(p)?s(p.message):(logger.debug("[sync] readonly hydrated from remote",p.data),c("Synced from remote",{repoRoot:r,worktreeRoot:n}))},Oa=({repoRoot:e,worktreeRoot:t,ownEventFileName:r})=>{let n=Ke({root:e,fileName:r}),o=Ke({root:t,fileName:r});return Ct.existsSync(n)?(logger.debug("[sync] merge own event file to remote",{ownEventFileName:r,localFile:n,remoteFile:o}),tr({sourceFile:n,targetFile:o})):(logger.debug("[sync] local own event file missing",n),c("Local own event file missing, nothing to merge",!1))},Xo=async({repoRoot:e,worktreeRoot:t,ownEventFileName:r})=>{let n=Oa({repoRoot:e,worktreeRoot:t,ownEventFileName:r});if(d(n))return s(n.message);let o=await $o(t);if(d(o))return s(o.message);if(!n.data&&!o.data)return c("Own event file already up to date in remote worktree",{createdCommit:!1});let i=await Go({worktreeRoot:t,ownEventFileName:r});if(d(i))return s(i.message);let a=await Jo({repoRoot:e,worktreeRoot:t});return d(a)?s(a.message):c("Merged, staged, and committed own event file",{createdCommit:!0,commitSha:a.data})},Yo=({repoRoot:e,worktreeRoot:t,ownEventFileName:r})=>{let n=Ke({root:e,fileName:r}),o=Ke({root:t,fileName:r});logger.debug("[sync] own event file sizes",{local:Ct.existsSync(n)?Ct.statSync(n).size:0,remote:Ct.existsSync(o)?Ct.statSync(o).size:0})},Zo=async({cwd:e=process.cwd(),ownEventFileName:t})=>{logger.debug("[sync] start write sync",{cwd:e,ownEventFileName:t});let r=await Gr(e);if(d(r))return s(r.message);let n=r.data,o=Zr(n);logger.debug("[sync] resolved roots",{repoRoot:n,worktreeRoot:o});let i=await _o(n);if(d(i))return s(i.message);if(i.data)return s("Cannot run :sync while the repository is in detached HEAD state");if(t.includes("/")||t.includes("\\"))return s("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return s("Own event file must end with .jsonl");let a=await ht(n);if(d(a))return s(a.message);if(a.data)return s("Cannot run :sync while a merge, rebase, cherry-pick, or revert is in progress in the current repo");let l=await en(n);if(d(l))return s(l.message);logger.debug("[sync] ensure initial commit changed",l.data);let m=await nn({repoRoot:n,worktreeRoot:o,ensureUpstream:!0});if(d(m))return s(m.message);let u=await ht(o);if(d(u))return s(u.message);if(u.data)return s("Cannot run :sync while a merge, rebase, cherry-pick, or revert is in progress in the remote worktree");let p=on(n,o);if(d(p))return s(p.message);let y=!1,v,I=!1,S=!1,N=!1;logger.debug("[sync] pull remote branch before local copy");let b=await Zt({cwd:o,remote:q,branch:F});if(d(b))return s(b.message);I=b.data,logger.debug("[sync] pulled remote",I);let T=tn({repoRoot:n,worktreeRoot:o});if(d(T))return s(T.message);N=T.data,logger.debug("[sync] hydrated from remote",N);let B=await Xo({repoRoot:n,worktreeRoot:o,ownEventFileName:t});if(d(B))return s(B.message);if(y=B.data.createdCommit,v=B.data.commitSha,Yo({repoRoot:n,worktreeRoot:o,ownEventFileName:t}),logger.debug("[sync] sync own file result",B.data),y||m.data){let V=await rn(o),te=V;if(d(V)&&Ho(V.message)){let wt=await Zt({cwd:o,remote:q,branch:F});if(d(wt))return s(wt.message);let Re=await Xo({repoRoot:n,worktreeRoot:o,ownEventFileName:t});if(d(Re))return s(Re.message);Re.data.createdCommit&&(y=!0,v=Re.data.commitSha),Yo({repoRoot:n,worktreeRoot:o,ownEventFileName:t}),logger.debug("[sync] retry sync own file result",Re.data),te=await rn(o)}if(d(te))return s(te.message);S=te.data,logger.debug("[sync] pushed remote",S)}else logger.debug("[sync] no commit created, skipped push");if(y){let V=await D({args:["rev-parse","HEAD"],cwd:o});if(d(V))return s(V.message);v=V.data.stdout.trim()}return c("Synced event logs with remote",{repoRoot:n,worktreeRoot:o,createdCommit:y,commitSha:v,pulled:I,pushed:S,hydrated:N,bootstrapped:m.data})};var Ua=e=>Object.values(C().tags).find(t=>t.name===e),Wa=e=>Object.values(C().contributors).find(t=>t.name===e),ei=[{systemOnly:!0,intent:R.Move,mode:g.COMMAND_LINE,action:()=>{let e=Q();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:r}=e.data,{modifier:n}=ue().commandMeta,o=()=>{let u=Pe();if(!u)return s("No pending move state");let p=u.payload.id;if(!C().nodes[p])return s("Moved node not found");let v=u.payload.parent,I=C().nodes[v];if(!I)return s("Move parent not found");let S=M(v).findIndex(N=>N.id===p);return S===-1?s("Moved node not found among rendered children"):(O.navigate({currentNode:I,selectedIndex:S}),c("Synchronized navigation to moved node",null))},i=u=>{if(d(u))return s(u.message);let p=o();return d(p)?s(p.message):c("Updated move preview",null)},{currentNode:a,selectedIndex:l}=C(),m=M(a.id)[l];if(!m)return w({mode:g.DEFAULT}),s("No move target");if(n==="start"){if(m.readonly)return s("Target node is read-only");if(l===-1)return s("No item selected");if(!m.parentNodeId)return s("Target has no parent");let u=M(m.parentNodeId),p=u.findIndex(({id:N})=>N===m.id);if(p===-1)return s("Target not found among siblings");let y=u[p-1],v=u[p+1],I=v!=null?{at:"before",sibling:v.id}:y!=null?{at:"after",sibling:y.id}:{at:"start"};rt({id:$(),userId:t,userName:r,action:"move.node",payload:{id:m.id,parent:m.parentNodeId,pos:I}}),w({mode:g.MOVE});let S=o();return d(S)?s(S.message):c("Move initialized",null)}if(n==="next")return w({mode:g.MOVE}),i(_r(1));if(n==="previous")return w({mode:g.MOVE}),i(_r(-1));if(n==="to-next")return w({mode:g.MOVE}),i($r(1));if(n==="to-previous")return w({mode:g.MOVE}),i($r(-1));if(n==="confirm"){w({mode:g.DEFAULT});let u=Pe();if(!u)return s("No pending move to confirm");let p=Z(u);if(d(p))return p;let y=o();return d(y)?s(y.message):(rt(null),c("Moved item",null))}return n==="cancel"?(rt(null),w({mode:g.DEFAULT}),c("Cancelling move",null)):s("Invalid move modifier")}},{intent:R.Delete,mode:g.COMMAND_LINE,action:()=>{let e=Q();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:r}=e.data,{currentNode:n,selectedIndex:o}=C(),i=M(n.id)[o];return i?Z({id:$(),userId:t,userName:r,action:"delete.node",payload:{id:i.id}}):s("Unable to resolve child to delete")},onSuccess:()=>w({mode:g.DEFAULT})},{intent:R.Edit,mode:g.COMMAND_LINE,action:()=>{let e=Q();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:r}=e.data,n=nt(C().breadCrumb,"TICKET");if(d(n))return s("Edit target must be an issue");let o=n.data;if(o.readonly)return s("Cannot edit readonly field");let{currentNode:i,selectedIndex:a}=C();if(!M(o.id)[a])return s("No selected field");let m=M(i.id)[a];if(!m)return s("No selected field");if(m.readonly)return s("Cannot edit readonly field");let u=m.props.value;if(typeof u!="string")return s("Selected field is not editable text");let p=mo(u);if(d(p))return s("Failed to edit field");let y=p.data;return y===u?c("No changes made",null):m.title==="Description"?Z({id:$(),userId:t,userName:r,action:"edit.description",payload:{id:m.id,md:y}}):m.title==="Title"?Z({id:$(),userId:t,userName:r,action:"edit.title",payload:{id:m.id,name:y}}):s(`Editing not supported for "${m.title}"`)},onSuccess:()=>w({mode:g.DEFAULT})},{intent:R.Filter,mode:g.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=ue().commandMeta,r=/(!=|=)/,[n,o]=e.split(r);if(!n||!(l=>K(f.FILTER).map(m=>m.split(r)[0]).includes(l))(n))return s("Invalid filter modifier");let a={target:n,operator:"=",value:t.trim()};return de(l=>({...l,filters:e==="clear"?[]:[...l.filters,a],mode:g.DEFAULT})),c("Viewing help",null)}},{intent:R.ViewHelp,mode:g.COMMAND_LINE,action:()=>(w({mode:g.HELP}),c("Viewing help",null))},{intent:R.CloseIssue,mode:g.COMMAND_LINE,action:()=>{let e=Q();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:r}=e.data,{currentNode:n,selectedIndex:o}=C(),i=M(n.id)[o];if(!i)return s("Unable to close issue, no target found");if(!i.parentNodeId)return s("No target parent found");if(!We(i))return s("Cannot close in this context");let a=Z({id:$(),userId:t,userName:r,action:"close.issue",payload:{id:i.id,parent:i.parentNodeId}});return d(a)?a:c("Viewing help",null)}},{intent:R.ReopenIssue,mode:g.COMMAND_LINE,action:()=>{let e=Q();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:r}=e.data,{currentNode:n,selectedIndex:o}=C(),i=M(n.id)[o];if(!i)return s("Unable to reopen issue, no target found");let a=i.context==="TICKET"?c("Resolved ticket",i):Ge(i.id,"TICKET");if(d(a))return s("Cannot reopen in this context");let l=a.data,m=Z({id:$(),userId:t,userName:r,action:"reopen.issue",payload:{id:l.id}});return d(m)?m:c("Issue reopened",null)},onSuccess:()=>w({mode:g.DEFAULT})},{intent:R.SetUserName,mode:g.COMMAND_LINE,action:()=>{let{userId:e,preferredEditor:t,userName:r}=ce(),n=Bt()?.trim();if(!n)return s("No username provided");let o=n??r,i=e??$();if(!o||!i)return s("Unable to resolve user name or id");let a=jr({userName:o,userId:i,preferredEditor:t??""});return d(a)?a:(ut({userName:o,userId:i}),w({mode:g.DEFAULT}),c(`Username set to "${n}"`,null))}},{intent:R.Init,mode:g.COMMAND_LINE,action:()=>{let e=an();if(d(e))return e;let{rootNodeId:t,nodes:r}=C();return O.navigate({currentNode:r[t],selectedIndex:0}),c("Project initialized",null)}},{intent:R.SetEditor,mode:g.COMMAND_LINE,action:()=>{let e=Bt()?.trim();if(!e)return s("No editor provided");let t=jr({preferredEditor:e});return d(t)?t:(ut({preferredEditor:e}),w({mode:g.DEFAULT}),c(`Editor configuration set to "${e}"`,null))}},{intent:R.NewItem,mode:g.COMMAND_LINE,action:(e,t)=>{let r=Q();if(d(r))return s("Unable to resolve user ID");let{userId:n,userName:o}=r.data;if(!t.inputString)return s(`provide a name for your ${t.modifier}`);let{breadCrumb:i,currentNode:a,selectedIndex:l}=C(),m=u=>{let p=Z(u);if(d(p))return p;let y=E.getNode(p.data.result.id);if(!y)return s("Created node not found");if(!y.parentNodeId)return p;let v=E.getNode(y.parentNodeId);return v?(O.navigate({currentNode:v,selectedIndex:E.getSiblings(y.parentNodeId).findIndex(({id:I})=>I===y.id)}),p):s("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:u}=C(),p=E.getNode(u);return p?m({id:$(),userId:n,userName:o,action:"add.board",payload:{id:$(),name:t.inputString,parent:p.id}}):s("Workspace not found")}if(t.modifier==="swimlane"){let u=nt(i,"BOARD");return d(u)?s("Unable to add swimlane in this context"):m({id:$(),userId:n,userName:o,action:"add.swimlane",payload:{id:$(),name:t.inputString,parent:u.data.id}})}if(t.modifier==="issue"){let u=M(a.id)[l],p=a.context==="SWIMLANE"?a:a.context==="BOARD"&&u?.context==="SWIMLANE"?u:(()=>{let N=nt(i,"SWIMLANE");return d(N)?null:N.data})();if(!p)return s("Unable to add issue in this context");let y=uo({userId:n,userName:o,name:t.inputString,parent:p.id}),v=Gt(y);if(v.some(N=>d(N)))return s("Issue create failed: "+v.filter(d).map(N=>N.message).filter(Boolean).join(", "));let I=v[0];if(!I||d(I))return s("Issue creation failed");let S=y[0]?.payload.id;return S?(O.navigate({currentNode:p,selectedIndex:E.getSiblings(p.id).findIndex(({id:N})=>N===S)}),c("Issue created",null)):s("Unable to determine ticket id")}return Rn()},onSuccess:()=>w({mode:g.DEFAULT})},{intent:R.SetView,mode:g.COMMAND_LINE,action:()=>{let{commandMeta:e}=ue();return e.validity===ve.Invalid?s("Invalid command "+he):(de(t=>({...t,viewMode:e.modifier==="wide"?"wide":e.modifier==="dense"?"dense":t.viewMode})),c("View set",null))},onSuccess:()=>w({mode:g.DEFAULT})},{intent:R.Rename,mode:g.COMMAND_LINE,action:()=>{let e=Q();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:r}=e.data,{currentNode:n,selectedIndex:o}=C(),i=M(n.id)[o];if(!i)return s("Missing node");if(i.readonly)return s("Cannot rename readonly node");let a=Bt();return a?Z({id:$(),userId:t,userName:r,action:"edit.title",payload:{id:i.id,name:a}}):s("Provide a new name")},onSuccess:()=>w({mode:g.DEFAULT})},{intent:R.TagTicket,mode:g.COMMAND_LINE,action:()=>{let e=Q();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:r}=e.data,{modifier:n,inputString:o}=ue().commandMeta,i=(n||o).trim();if(!i)return s("Provide a tag");let{selectedIndex:a,currentNode:l}=C(),m=M(l.id)[a];if(!m)return s("Invalid tag target");let u=Ge(m.id,"TICKET");if(d(u))return s("Unable to tag issue in this context");let p=u.data,y=Ua(i),v;if(y)v=y.id;else{let N=$(),b=Z({id:$(),userId:t,userName:r,action:"create.tag",payload:{id:N,name:i}});if(d(b))return b;v=b.data.result.id}let I=E.getFieldByTitle(p.id,"Tags");return I?M(I.id).some(N=>N.props?.value===v)?s("Already tagged with that tag"):Z({id:$(),userId:t,userName:r,action:"tag.issue",payload:{id:$(),target:p.id,tagId:v}}):s("Unable to locate tags field")},onSuccess:()=>w({mode:g.DEFAULT})},{intent:R.AssignUserToTicket,mode:g.COMMAND_LINE,action:()=>{let e=Q();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:r}=e.data,{modifier:n,inputString:o}=ue().commandMeta,i=(n||o).trim();if(!i)return s("Provide an assignee");let{selectedIndex:a,currentNode:l}=C(),m=M(l.id)[a];if(!m)return s("Invalid assign target");let u=Ge(m.id,"TICKET");if(d(u))return s("Unable to assign issue in this context");let p=u.data,y=Wa(i),v;if(y)v=y.id;else{let N=$(),b=Z({id:$(),userId:t,userName:r,action:"create.contributor",payload:{id:N,name:i}});if(d(b))return b;v=b.data.result.id}let I=E.getFieldByTitle(p.id,"Assignees");return I?M(I.id).some(N=>N.props?.value===v)?s("Assignee already assigned"):Z({id:$(),userId:t,userName:r,action:"assign.issue",payload:{id:$(),target:p.id,contributor:v}}):s("Unable to locate assignees field")},onSuccess:()=>w({mode:g.DEFAULT})},{intent:R.Sync,mode:g.COMMAND_LINE,action:async()=>{H(()=>""),w({syncStatus:{msg:"Syncing",status:"syncing"}});let{userId:e,userName:t}=ce();if(!e)return s("Unable to resolve userId");if(!t)return s("Unable to resolve userName");let r=He()?an():c("No pending default events",null);if(d(r))return s(`Unable to persist default events. ${r.message}`);let n=qt();if(d(n))return s("Unable to resolve log file name");logger.debug("[sync-command] pending defaults",He());let o=qt();logger.debug("[sync-command] persist file name",o);let i=d(o)?null:Ke({root:process.cwd(),fileName:o.data});logger.debug("[sync-command] local event file before sync",{localFile:i,exists:i?sn.existsSync(i):!1,size:i&&sn.existsSync(i)?sn.statSync(i).size:0});let a=await Zo({ownEventFileName:n.data});if(d(a))return w({syncStatus:{msg:a.message,status:"outOfSync"}}),s(`Unable to sync state. ${a.message}`);w({syncStatus:{msg:"Synced",status:"synced"},mode:g.DEFAULT});let l=jt();return d(l)?s("Unable to load events"):(ft(l.data),c("Synced",!0))}}];var ie=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:r,modifier:n,inputString:o}}=ue();if(!t)return s("No command to confirm");if(!e&&r===ve.Invalid)return s("Invalid command");let i=io(t);Zn();let a=ei.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===i);if(!a)return kt({result:he.Fail,message:"Command not found",data:null});let l=await a.action(a,{command:t,inputString:o,modifier:n});return d(l)?kt(l):(eo({addToHistory:!e}),a.onSuccess?.(),kt(l))};var nr=[{intent:"exit",mode:g.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(w({mode:g.COMMAND_LINE}),H(()=>"move cancel"),ie({isForceExecutedBySystem:!0}))},{intent:"initMove",mode:g.DEFAULT,description:"[m] move init/confirm",action:()=>(w({mode:g.COMMAND_LINE}),H(()=>"move start"),ie({isForceExecutedBySystem:!0}))},{intent:"confirmMove",mode:g.MOVE,action:()=>(w({mode:g.COMMAND_LINE}),H(()=>"move confirm"),ie({isForceExecutedBySystem:!0}))}],or=[{intent:"movePreviousItem",mode:g.MOVE,action:()=>Pe()?(w({mode:g.COMMAND_LINE}),H(()=>"move previous"),ie({isForceExecutedBySystem:!0})):s("No pending move")},{intent:"moveNextItem",mode:g.MOVE,action:()=>Pe()?(w({mode:g.COMMAND_LINE}),H(()=>"move next"),ie({isForceExecutedBySystem:!0})):s("No pending move")}],ti=[{intent:"moveToNextContainer",mode:g.MOVE,action:()=>Pe()?(w({mode:g.COMMAND_LINE}),H(()=>"move to-next"),ie({isForceExecutedBySystem:!0})):s("No pending move")},{intent:"moveToPreviousContainer",mode:g.MOVE,action:()=>Pe()?(w({mode:g.COMMAND_LINE}),H(()=>"move to-previous"),ie({isForceExecutedBySystem:!0})):s("No pending move")}];var ri={[L.WORKSPACE]:[...nr,...or],[L.BOARD]:[...nr,...or],[L.SWIMLANE]:[...nr,...or,...ti],[L.TICKET]:[],[L.FIELD]:[],[L.FIELD_LIST]:[],[L.TEXT]:[]};var ni=[{intent:"addItem",mode:g.DEFAULT,description:"[n] new...",action:()=>(w({mode:g.COMMAND_LINE}),H(()=>`${f.NEW} `),c("Adding new item",null))},{intent:"Delete",mode:g.DEFAULT,description:"[d] delete",action:()=>(w({mode:g.COMMAND_LINE}),H(()=>`${f.DELETE} `),c("Deleting item",null))},{intent:"initCommandLine",mode:g.DEFAULT,description:"[:] focus command line",action:()=>(w({mode:g.COMMAND_LINE}),H(()=>""),c("Entering command line mode",null))},{intent:"confirm",mode:g.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>(O.enterChildNode(),c("Entering context",null))},{intent:"exit",mode:g.DEFAULT,description:"[q] exit context",action:()=>(logger.debug("Executing exit action"),O.enterParentNode(),c("Exiting context",null))},{intent:"navPreviousItem",mode:g.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(O.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:"navNextItem",mode:g.DEFAULT,action:()=>(O.navigateToNextItem(),c("Navigating to next item",null))},{intent:"navToPreviousContainer",mode:g.DEFAULT,action:()=>(O.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:"navToNextContainer",mode:g.DEFAULT,action:()=>(O.navigateToNextContainer(),c("Navigating to next container",null))},{intent:"edit",mode:g.DEFAULT,action:()=>(w({mode:g.COMMAND_LINE}),H(()=>"edit"),ie(),c("Fired command",!0))},{intent:"SetViewDense",mode:g.DEFAULT,description:"[v] view change (wide/dense)",action:()=>(w({viewMode:"dense"}),c("View set",null))},{intent:"SetViewWide",mode:g.DEFAULT,action:()=>(w({viewMode:"wide"}),c("View set",null))},{intent:"sync",mode:g.DEFAULT,description:"[s] sync epiq with remote state branch",action:()=>(w({mode:g.COMMAND_LINE}),H(()=>"sync"),ie({isForceExecutedBySystem:!0}),c("Synced",!0))}];var oi=[{intent:"viewHelp",mode:g.DEFAULT,action:()=>(w({mode:g.HELP}),c("Viewing help",null))},{intent:"exit",mode:g.HELP,action:()=>(w({mode:g.DEFAULT}),c("Exiting help",null))},{intent:"confirm",mode:g.COMMAND_LINE,action:()=>(ie(),c("Executing command",null))},{intent:"MoveCursorLeft",mode:g.COMMAND_LINE,action:()=>(Br(-1),c("Moving cursor left",null))},{intent:"MoveCursorRight",mode:g.COMMAND_LINE,action:()=>(Br(1),c("Moving cursor right",null))},{intent:"MoveCursorLeftOfWord",mode:g.COMMAND_LINE,action:()=>(Or("left"),c("Moving cursor left of word",null))},{intent:"MoveCursorRightOfWord",mode:g.COMMAND_LINE,action:()=>(Or("right"),c("Moving cursor right of word",null))},{intent:"exitCommandLine",mode:g.COMMAND_LINE,action:()=>(w({mode:g.DEFAULT}),c("Exiting command line",null))},{intent:"autoCompleteCommand",mode:g.COMMAND_LINE,action:()=>(H((e,{remainder:t})=>t?e+t:e),c("Auto-completing command",null))},{intent:"captureInput",mode:g.COMMAND_LINE,action:(e,{sequence:t})=>(H(r=>r+t),c("Capturing input",null))},{intent:"eraseInput",mode:g.COMMAND_LINE,action:()=>(Yn(),c("Erasing input",null))},{intent:"EraseInputWord",mode:g.COMMAND_LINE,action:()=>(Qn(),c("Erasing input word",null))},{intent:"getLastCommandFromHistory",mode:g.COMMAND_LINE,action:()=>(to(),c("Getting last command from history",null))},{intent:"getNextCommandFromHistory",mode:g.COMMAND_LINE,action:()=>(ro(),c("Getting next command from history",null))}];import Ha from"chalk";var ir=": for command line",ii="q to exit",si=`${Ha.hex(h.accent)("m")} to confirm`,dn={[L.WORKSPACE]:[ir],[L.BOARD]:[ir],[L.BOARD+g.COMMAND_LINE]:[ir],[L.SWIMLANE]:[ir],[L.TICKET+g.HELP]:[ii],[L.SWIMLANE+g.HELP]:[ii],[L.TICKET]:[],[L.FIELD]:[],[L.SWIMLANE+g.MOVE]:[si],[L.TICKET+g.MOVE]:[si]};var sr=e=>e.trim().toLocaleLowerCase(),$a=(e,t)=>{let r=E.getFieldByTitle(e,t);if(!r)return"";let n=r.props?.value;return typeof n=="string"?n:""},_a=e=>{let{tags:t}=C(),r=E.getFieldByTitle(e,"Tags");return r?W(r.id).map(n=>{let o=n.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(n=>!!n):[]},Ka=e=>{let{contributors:t}=C(),r=E.getFieldByTitle(e,"Assignees");return r?W(r.id).map(n=>{let o=n.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(n=>!!n):[]},ai=(e,t)=>{let r=t.value;if(!r)return!0;switch(t.target){case"title":return sr(e.title??"").includes(r);case"description":return sr($a(e.id,"Description")).includes(r);case"tag":return _a(e.id).map(sr).some(l=>l.includes(r));case"assignee":return Ka(e.id).map(sr).some(l=>l.includes(r));default:return!0}};function di(e,t,r){let n=t[e];if(!n)return s("buildBreadCrumb(): current node not found");let o=[],i=n;for(;i&&(o.push(i),!(i.id===r||!i.parentNodeId));)i=t[i.parentNodeId];let a=o[o.length-1];return!a||a.id!==r?s("buildBreadCrumb(): node is not connected to root"):(o.reverse(),c("Breadcrumb built",o))}var ci=e=>{let t={};for(let r of e)r.intent&&(t[r.mode]||(t[r.mode]={}),t[r.mode][r.intent]=r);return t};var ar,cn=new Set,li=()=>{for(let e of cn)e()},ja=e=>(cn.add(e),()=>cn.delete(e));function mi(e){let{currentNodeId:t,mode:r,rootNodeId:n,nodes:o,filters:i}=e;if(!t)return s("derive(): currentNodeId is missing");if(!n)return s("derive(): rootNode is missing");if(!o[n])return s("derive(): unable to find root node");let l=o[t];if(!l)return logger.error("Unable to derive state, currentNode not found"),s("Unable to derive state, currentNode not found");let m=di(t,o,n);if(d(m))return logger.error(m.message),m;let u=m.data,{context:p}=l,y=dn[p+r]??dn[p]??[],v=[...ni,...ri[p]??[],...oi],I=ci(v),S=za(o,i),N=S[t]?.[e.selectedIndex]??null;return c("Derived successfully",{...e,currentNode:l,breadCrumb:u,availableHints:y,availableActions:v,actionIndex:I,selectedNode:N,renderedChildrenIndex:S})}var C=()=>(ar||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),ar);function go(e){let t={filters:[],tags:{},contributors:{},viewMode:"dense",mode:g.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,currentNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""}},r=mi(t);return d(r)?r:(ar=r.data,li(),c("State initialized",null))}function de(e){let t=C(),r=e(t),n=mi(r);return d(n)?s(n.message??"Unable to update state"):(ar=n.data,li(),c("State updated",null))}var w=e=>de(t=>({...t,...e}));var _=()=>Va(ja,C,C),za=(e,t)=>{let r={};for(let n of Object.values(e))We(n)&&t.length>0&&!t.every(o=>ai(n,o))||!n.parentNodeId||n.isDeleted||((!n.parentNodeId||!r[n.parentNodeId])&&(r[n.parentNodeId]=[]),r[n.parentNodeId].push(n));for(let n of Object.keys(r))r[n].sort((o,i)=>{let a=e[o.id],l=e[i.id];return!a||!l?0:a.rank.localeCompare(l.rank)});return r},M=e=>C().renderedChildrenIndex[e]??[];var O={exit(){process.exit(0)},enterChildNode(){let e=C(),t=e.currentNode,r=Math.max(0,e.selectedIndex),n=M(t.id)[r];!n||t.context==="FIELD"||O.navigate({currentNode:n,selectedIndex:M(n.id).length?0:-1})},enterParentNode(){let{currentNode:e,nodes:t}=C();if(!e.parentNodeId){logger.info("Missing parent node id");return}let r=t[e.parentNodeId];if(!r){logger.error("Parent not found");return}let n=M(r.id),o=n.findIndex(({id:a})=>a===e.id),i=n.length===0?-1:o>=0?o:0;O.navigate({currentNode:r,selectedIndex:i})},navigateToNextItem:()=>ui(1),navigateToPreviousItem:()=>ui(-1),navigateToNextContainer:()=>pi(1),navigateToPreviousContainer:()=>pi(-1),navigate:({currentNode:e=C().currentNode,selectedIndex:t})=>{w({currentNodeId:e.id,selectedIndex:t})}},ui=e=>{let t=C(),r=M(t.currentNode.id).length;if(r===0)return;let o=(Math.max(0,t.selectedIndex)+e+r)%r;O.navigate({selectedIndex:o})},pi=e=>{let{currentNode:t,nodes:r,selectedIndex:n}=C();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=r[t.parentNodeId];if(!t||!o)return;let i=M(o.id),a=i.findIndex(v=>v.id===t.id);if(a<0)return;let l=i.at(a+e)??i.at(0);if(!l)return;let m=M(l.id),u=Math.max(0,m.length-1),p=Math.min(Math.max(0,n),u),y=m.length?p:-1;O.navigate({currentNode:l,selectedIndex:y})};var be="system",Ie="ACTOR",Nt=qa(),De=null;function Ga(){let e=Object.values(C().nodes).find(n=>n.context==="WORKSPACE");if(!e)throw new Error("No workspace found in event log");let[t]=M(e.id),[r]=t?M(t.id):[];if(logger.debug("Boot navigation target:",{workspace:e?.id,firstBoard:t?.id,firstSwimlane:r?.id}),r){let n=C().renderedChildrenIndex?.[r.id]??[];return{currentNode:r,selectedIndex:n.length>0?0:-1}}else return t?{currentNode:t,selectedIndex:0}:e?{currentNode:e,selectedIndex:0}:{currentNode:C().nodes[C().rootNodeId],selectedIndex:0}}function Ja(){let e=Ga();O.navigate(e)}function Xa(){let e=Nt(),t=Nt(),r=Nt(),n=Nt(),o=Nt();return[{id:Ee(),userId:be,userName:Ie,action:"init.workspace",payload:{id:e,name:"Workspace"}},{id:Ee(),userId:be,userName:Ie,action:"add.board",payload:{id:t,name:"Default",parent:e}},{id:Ee(),userId:be,userName:Ie,action:"add.swimlane",payload:{id:r,name:"Todo",parent:t}},{id:Ee(),userId:be,userName:Ie,action:"add.swimlane",payload:{id:n,name:"Review",parent:t}},{id:Ee(),userId:be,userName:Ie,action:"add.swimlane",payload:{id:o,name:"Done",parent:t}},{id:Ee(),userId:be,userName:Ie,action:"add.board",payload:{id:Ht,name:"Closed",parent:e}},{id:Ee(),userId:be,userName:Ie,action:"add.swimlane",payload:{id:Qe,name:"Closed",parent:Ht}},{id:Ee(),userId:be,userName:Ie,action:"lock.node",payload:{id:Ht}},{id:Ee(),userId:be,userName:Ie,action:"lock.node",payload:{id:Qe}}]}function He(){return De!==null}function an(){if(!De||De.length===0)return c("No pending default events to persist",null);let t=Gt(De).filter(d);return t.length>0?s([st.bold.red("Materializing failed"),"",...t.map((r,n)=>`${st.dim.gray(`${n+1}.`)} ${st.dim(r.message)}`),`
|
|
30
37
|
`].join(`
|
|
31
|
-
`)):(
|
|
38
|
+
`)):(De=null,c("Persisted pending default events",null))}function gi(e){let t;e.some(n=>n.action==="init.workspace")?(De=null,t=ft(e)):(De=Xa(),t=ft([...De]));let r=t.filter(d);return r.length>0?s([st.bold.red("Materializing failed"),"",...r.map((n,o)=>`${st.dim.gray(`${o+1}.`)} ${st.dim(n.message)}`),`
|
|
32
39
|
`].join(`
|
|
33
|
-
`)):(xa(),m("State booted successfully",null))}import{Box as Ba}from"ink";import Gn from"react";import Ct from"chalk";import{Box as zn,Text as Jo}from"ink";import ht,{useEffect as ha,useMemo as Ca,useState as Na}from"react";var Qo=Ct.gray,ba=Ct.inverse,Ea=Ct.inverse.gray,Ia={hint:"",hints:[],overlap:0,remainder:""},ei=({value:e,command:t})=>{if(!t)return null;let n=e.trimStart(),o=e.length-n.length;return e.slice(o,o+t.length)!==t?null:{start:o,end:o+t.length}},Sa=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=ae(t);return{bg:r=>Ct.bgHex(n).black(r),bgCursor:r=>Ct.bgHex(n).inverse.black(r)}}return bn(t)},Aa=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=ei({value:e,command:t});if(!r)return null;let i=e.slice(r.end).match(/^\s*/)?.[0].length??0,a=r.end+i;return e.slice(a,a+n.length)!==n?null:{start:a,end:a+n.length}},Zo=()=>({value:j.value,cursorPosition:j.cursorPosition,commandIsPending:j.commandIsPending,autoCompletion:j.commandMeta.autoCompletion??Ia,infoMessage:j.commandMeta.infoMessage,validationStatus:j.commandMeta.validity,command:j.commandMeta.command,inputString:j.commandMeta.inputString,modifier:j.commandMeta.modifier}),wa=(e,t)=>e.value===t.value&&e.cursorPosition===t.cursorPosition&&e.commandIsPending===t.commandIsPending&&e.infoMessage===t.infoMessage&&e.autoCompletion.hint===t.autoCompletion.hint&&e.autoCompletion.overlap===t.autoCompletion.overlap&&e.autoCompletion.remainder===t.autoCompletion.remainder&&e.validationStatus===t.validationStatus&&e.command===t.command&&e.modifier===t.modifier&&e.inputString===t.inputString,ti=({width:e})=>{let[t,n]=Na(Zo());ha(()=>{let x=()=>{let A=Zo();n(b=>wa(b,A)?b:A)},N=Lr(x);return x(),()=>{N()}},[]);let{value:r,cursorPosition:o,infoMessage:i,commandIsPending:a,autoCompletion:d,command:c,modifier:u}=t,f=Ca(()=>{let x=Math.max(0,Math.min(o,r.length)),N=ei({value:r,command:c}),A=Aa({value:r,command:c,modifier:u}),b=c?bn(c):null,I=Sa({command:c,modifier:u}),E=(te,ne)=>{let fn=N&&ne>=N.start&&ne<N.end,yn=A&&ne>=A.start&&ne<A.end;return fn&&b?b.fg(te):yn&&I?I.bg(te):te},T=(te,ne)=>{let fn=N&&ne>=N.start&&ne<N.end,yn=A&&ne>=A.start&&ne<A.end;return fn&&b?b.fgCursor(te):yn&&I?I.bgCursor(te):ba(te)},B=r.slice(0,x),se=r[x]??" ",z=x<r.length?r.slice(x+1):"",Me=Array.from(B).map((te,ne)=>E(te,ne)).join(""),Re=T(se,x),cr=Array.from(z).map((te,ne)=>E(te,x+1+ne)).join("");if(d.hint){let te=d.hint[d.overlap]??se;Re=Ea(te),cr=Qo(d.remainder.slice(1)+z)}return Qo(":")+Me+Re+cr},[r,o,d,c,u]);return ht.createElement(zn,{flexDirection:"column",justifyContent:"flex-start"},ht.createElement(zn,{flexDirection:"column",paddingX:1,borderColor:v.secondary,borderStyle:"round",width:e},ht.createElement(zn,null,ht.createElement(Jo,null,f),i&&ht.createElement(Jo,{wrap:"truncate",color:a?v.red:v.secondary2},` ${i} `))))};import ni from"chalk";import{Box as Ta,Text as qn}from"ink";import Zt,{useEffect as Ma,useState as Ra}from"react";var La=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],ri=e=>{let t=e.replace("#","");return{r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16)}},Pa=({r:e,g:t,b:n})=>{let r=o=>Math.round(Math.max(0,Math.min(255,o))).toString(16).padStart(2,"0");return`#${r(e)}${r(t)}${r(n)}`},Da=(e,t,n)=>{let r=ri(e),o=ri(t);return Pa({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},Fa=(e,t)=>{if(e.length===1)return e[0];let n=t*(e.length-1),r=Math.floor(n),o=n-r,i=e[r],a=e[Math.min(r+1,e.length-1)];return Da(i,a,o)},ka=(e,t)=>e.length===t?e:e.length>t?e.slice(0,t):e.padEnd(t," "),oi=({width:e,availableHints:t})=>{let{syncStatus:{status:n,msg:r}}=$(),[o,i]=Ra(0);Ma(()=>{if(n!=="syncing"){i(0);return}let E=setInterval(()=>{i(T=>T+1)},50);return()=>clearInterval(E)},[n]);let a=[],d=0;for(let E of t){let B=(a.length>0?" | ":"").length+E.length;if(d+B>e-4)break;a.push(E),d+=B}let c=n!="synced"?r??a.join(" | "):a.join(" | "),u=Math.max(0,e-2),f=n==="syncing"?Fa(La,(Math.sin(o*.12)+1)/2):v.secondary,x=ni.hex(f??"fff"),N=ni.hex(v.secondary2),A=x(`\u256D${"\u2500".repeat(u)}\u256E`),b=x(`\u2570${"\u2500".repeat(u)}\u256F`),I=`${x("\u2502")}${N(ka(` ${c} `,u))}${x("\u2502")}`;return Zt.createElement(Ta,{flexDirection:"column",width:e},Zt.createElement(qn,null,A),Zt.createElement(qn,null,I),Zt.createElement(qn,null,b))};var en=({width:e,mode:t,availableHints:n})=>{let r=$(),o=[],i=0;for(let a of n){let c=(o.length>0?" | ":"").length+a.length;if(i+c>e+2)break;o.push(a),i+=c}return Gn.createElement(Ba,null,t===p.COMMAND_LINE&&r.syncStatus.status!=="syncing"?Gn.createElement(ti,{width:e}):Gn.createElement(oi,{width:e,mode:t,availableHints:n}))};import{Box as st,Text as ii}from"ink";import ke from"react";var si=({width:e})=>{let t=[...h().availableActions].map(n=>n.description).filter(n=>n!==void 0).map(n=>{let[r,o]=n.split("]"),i=r?.replace("[",""),a=o?.trim();return[i,a]}).filter(n=>n[0]!==void 0&&n[1]!==void 0).sort(([n],[r])=>n.length===1&&r.length!==1?-1:n.length!==1&&r.length===1?1:n.localeCompare(r,void 0,{sensitivity:"base"}));return t.unshift(["Key(s)","Action"]),ke.createElement(st,{flexDirection:"column",marginTop:3,borderColor:v.secondary,borderStyle:"round",width:e,minHeight:19},ke.createElement(st,{flexDirection:"column",width:e},h().mode===p.HELP?t.map(([n,r],o)=>ke.createElement(st,{paddingLeft:1,key:o,flexDirection:"row"},ke.createElement(st,{key:o,flexDirection:"row",paddingBottom:o?0:1},ke.createElement(st,{width:20,justifyContent:"flex-end"},ke.createElement(ii,{color:o?v.accent:v.secondary},n)),ke.createElement(st,{flexGrow:1,width:40,paddingLeft:2},ke.createElement(ii,{color:o?v.primary:v.secondary},r))))):null))};import li from"chalk";import{Box as Yn,Text as ui}from"ink";import Ie from"react";import{Box as Xn,Text as Va}from"ink";import ct from"react";import{Text as Oa}from"ink";import Ua from"react";var Wa=e=>e.toLowerCase().trim(),Ha=(e,t=Ge)=>{let n=Wa(e);return t[n]?t[n]:ut(n)},at=({id:e,isSelected:t})=>{let n=C.getContributor(e);if(n)return Ua.createElement(Oa,{underline:t,color:Ha(n.name)},"@"+n.name)};import{Text as _a}from"ink";import $a from"react";var dt=({id:e,isSelected:t})=>{let n=C.getTag(e);if(n)return $a.createElement(_a,{underline:t,backgroundColor:ae(n.name),color:v.primary}," "+n.name+" ")};var Ka=(e,t)=>e.length<=t?e:t<=1?"\u2026":e.slice(0,t-1)+"\u2026",ai=({width:e})=>{let{breadCrumb:t,currentNode:n,selectedIndex:r,viewMode:o}=h(),i=W(n.id)[r],a=qe(i?.id??n.id,"TICKET"),d=je(a)?a.data:void 0,c=d?.id?W(d.id):[],u=I=>{let E=c.find(T=>T.title===I);return E?W(E.id).map(T=>typeof T.props?.value=="string"?T.props.value:"").filter(T=>!!T):[]},f=u("Tags"),x=u("Assignees"),N=d?.parentNodeId?!hn(n.id,d?.parentNodeId)&&o==="dense":!1,A=t.map((I,E)=>{let T=E===t.length-1,B=W(I.id),se=T?B?.[r]?.title:void 0;return`${E?" / ":""}${I.title??""}${se?` \u25B8 ${se}`:""}`}).join(""),b=Ka(A,e);return ct.createElement(Xn,null,ct.createElement(Va,{color:v.secondary2},b),N?f.map(I=>ct.createElement(Xn,{key:I,paddingLeft:2},ct.createElement(dt,{id:I}))):null,N?x.map(I=>ct.createElement(Xn,{key:I,paddingLeft:2},ct.createElement(at,{id:I}))):null)};import{Box as ja,Text as di}from"ink";import tn from"react";var za=({filters:e})=>tn.createElement(ja,{columnGap:1},tn.createElement(di,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>tn.createElement(di,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),ci=tn.memo(za);function nn({filters:e,hideBreadCrumb:t=!1}){let{userName:n,preferredEditor:r}=le(),o=40,i=process.stdout.columns-o-8;return Ie.createElement(Yn,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?Ie.createElement(ui,null," "):Ie.createElement(Yn,{paddingLeft:1},e.length>0?Ie.createElement(ci,{filters:e}):Ie.createElement(ai,{width:i})),Ie.createElement(Yn,{columnGap:1,paddingRight:2,"max-width":o,overflow:"hidden",justifyContent:"flex-end"},Ie.createElement(mi,{icon:"@",value:n}),Ie.createElement(mi,{icon:"\u276F",value:r})))}function mi({icon:e,value:t}){return Ie.createElement(ui,null,li.dim(e)+li.hex(v.accent)(` ${t??"-"} `))}import{Box as gd,Text as fd}from"ink";import bt from"react";import{Box as rn,Text as Jn}from"ink";import Be from"react";import{Text as pi}from"ink";import gi,{useEffect as fi,useState as qa}from"react";var yi={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"command-line":["\u276F "]},ee=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=$(),r=yi[n]??yi.default,[o,i]=qa(0);if(fi(()=>{i(0)},[r]),fi(()=>{if(!e)return;let d=setInterval(()=>{i(c=>(c+1)%r.length)},500);return()=>clearInterval(d)},[e,r]),!e)return gi.createElement(pi,null,t);let a=r[o]??r[0]??t;return gi.createElement(pi,{color:v.accent,dimColor:o===1},a)};function Qn(){let e=$(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,i=process.stdout.columns||120,a=t?.id?M(t?.id):[];return Be.createElement(rn,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:v.secondary,width:i},Be.createElement(rn,{padding:1,paddingTop:0,paddingBottom:0},Be.createElement(Jn,null,"Select a board:")),Be.createElement(rn,{padding:1,flexDirection:"column"},a.map((d,c)=>{let u=e.currentNode.context==="WORKSPACE"&&e.selectedIndex===c,x=M(d.id).flatMap(({id:N})=>W(N)).length;return Be.createElement(rn,{key:d.id??c},Be.createElement(Jn,{color:u?v.accent:v.secondary},Be.createElement(ee,{isSelected:u})),Be.createElement(Jn,{color:u?v.accent:v.secondary},d.title," (",x," issues)",d.readonly?" \u{1F512}":""))})))}import{Box as ud}from"ink";import ln from"react";import{Box as tr,Text as Qa}from"ink";import fe from"react";import{Box as Zn,Text as Ga}from"ink";import on from"react";var sn=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,scrollByOne:o=!1})=>{if(e.length===0)return null;let i=Math.max(1,Math.floor(t)),a=Math.max(1,Math.ceil(r)),d=Math.max(1,Math.floor(i/a)),c=Math.max(0,Math.min(n,e.length-1)),u=Math.max(0,e.length-d),f=o?Math.min(u,Math.max(0,c-d+1)):Math.min(u,Math.floor(c/d)*d),x=f+d,N=e.slice(f,x),A=e.length>d,b=i,I=A?Math.max(1,Math.floor(d/e.length*b)):b,E=Math.max(0,b-I),T=Math.max(1,e.length-d),B=A?Math.floor(f/T*E):0;return on.createElement(Zn,{flexDirection:"row",height:i,width:"100%"},on.createElement(Zn,{flexDirection:"column",flexGrow:1,height:i},N),on.createElement(Zn,{flexDirection:"column",width:1,height:b},Array.from({length:b}).map((se,z)=>on.createElement(Ga,{key:z,color:A&&z>=B&&z<B+I?v.accent:v.secondary},A?"\u2502":" "))))};import{Box as an,Text as Xa}from"ink";import Ve from"react";var xi=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=St(ur(t.title),r),i=M(t.id),a=u=>{let f=i.find(x=>x.title===u);return f?M(f.id).map(x=>typeof x.props?.value=="string"?x.props.value:"").filter(x=>!!x):[]},d=a("Tags").map(u=>C.getTag(u)).filter(u=>!!u),c=a("Assignees").map(u=>C.getContributor(u)).filter(u=>!!u);return Ve.createElement(an,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?v.accent:v.secondary,justifyContent:"space-between"},Ve.createElement(an,{borderBottom:!0},Ve.createElement(an,{paddingLeft:1,flexDirection:"column"},Ve.createElement(Xa,{color:v.primary},o))),Ve.createElement(an,{flexDirection:"row",paddingLeft:1},d.map(u=>Ve.createElement(dt,{key:u.id,id:u.id})),c.map(u=>Ve.createElement(at,{key:u.id,id:u.id}))))};import Ya from"chalk";import{Box as Nt,Text as er}from"ink";import Se from"react";var Ja=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,vi=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=M(t.id),a=I=>{let E=i.find(T=>T.title===I);return E?M(E.id).map(T=>typeof T.props?.value=="string"?T.props.value:"").filter(T=>!!T):[]},d=a("Tags").map(I=>C.getTag(I)).filter(I=>!!I),c=a("Assignees").map(I=>C.getContributor(I)).filter(I=>!!I),u=1,f=d.length*(1+u),x=c.length*(2+u),N=d.map(I=>Se.createElement(Nt,{key:I.id,paddingRight:u},Se.createElement(er,{color:ae(I.name)},"\u25A0"))),A=c.map(I=>Se.createElement(Nt,{key:I.id,paddingRight:u},Se.createElement(er,{color:ut(I.name)},"@"+I.name.at(0)))),b=n?v.accent:o===p.MOVE?v.secondary:v.primary;return Se.createElement(Nt,{borderBottom:!0,justifyContent:"space-between"},Se.createElement(Nt,null,Se.createElement(ee,{isSelected:n,placeholder:Ya.dim.gray(r+1+" ")}),Se.createElement(er,{wrap:"truncate",color:b},Ja(t.title,e-f-x-14))),Se.createElement(Nt,null,N,A))};var Za=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:i,listSelectedIndex:a,mode:d})=>{let{renderedChildrenIndex:c}=$(),u=c[e.id]??[],f=`${e.title} (${u.length})`,x=3,N=o?1:4,A=r-x-(o?2:1),b=fe.createElement(tr,{borderStyle:"round",borderColor:v.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},fe.createElement(ee,{isSelected:t}),fe.createElement(Qa,{bold:!0,color:t?v.accent:v.primary},f," ",e.readonly?"\u{1F512}":"")),I=(E,T)=>{let B=i&&a===T;return o?fe.createElement(vi,{key:E.id,index:T,width:n,ticket:E,isSelected:B,mode:d}):fe.createElement(xi,{key:E.id,width:n,ticket:E,isSelected:B})};return fe.createElement(tr,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?v.accent:v.secondary,paddingRight:1,paddingLeft:1,height:r},b,fe.createElement(tr,{padding:o?1:0},u.length>0&&fe.createElement(sn,{selectedIndex:a,height:A,itemHeight:N},u.map(I)),fe.createElement(ee,{isSelected:i&&a===-1})))},hi=fe.memo(Za);import{Box as or,Text as ld}from"ink";import Oe,{useEffect as ir,useMemo as Ii}from"react";import Ae from"chalk";import Ni from"string-width";import{decodeTime as ed}from"ulid";var Ci=e=>{let t=Date.now()-e,n=[{label:"y",ms:1e3*60*60*24*365},{label:"mo",ms:1e3*60*60*24*30},{label:"w",ms:1e3*60*60*24*7},{label:"d",ms:1e3*60*60*24},{label:"h",ms:1e3*60*60},{label:"m",ms:1e3*60},{label:"s",ms:1e3}];for(let{label:r,ms:o}of n){let i=Math.floor(t/o);if(i>=1)return`${i}${r} ago`}return"just now"};var td=(e,t)=>e+" ".repeat(Math.max(0,t-Ni(e))),nd=(e,t)=>" ".repeat(Math.max(0,t-Ni(e)))+e,rd=e=>(()=>{let n={"add.issue":"Created with title","assign.issue":"Assigned to","close.issue":"Closed","delete.node":"Deleted","edit.title":"Changed title to","edit.description":"Changed description","reopen.issue":"Reopened","tag.issue":"Tagged with","lock.node":"Locked node","move.node":"Moved issue"};return(o=>n[o]??(o.endsWith("e")?`${o}d`:`${o}ed`))(e)})(),od=e=>{switch(e.action){case"move.node":{let t=C.getNode(e.payload.parent),n=t?Ae.dim.bgBlack(` ${t.title} `):"unknown",r=e.payload.pos;if(!r)return`to ${n}`;switch(r.at){case"start":return`to ${n} ${Ae.dim("(to top of list)")}`;case"end":return`to ${n} ${Ae.dim("(to bottom of list)")}`;case"before":return`to ${n} ${Ae.dim("(up in list)")}`;case"after":return`to ${n} ${Ae.dim("(down in list)")}`}}case"tag.issue":{let t=h().tags[e.payload.tagId];return t?Ae.bgHex(ae(t.name))(` ${t.name} `):"unknown tag"}case"assign.issue":{let t=h().contributors[e.payload.contributor];return t?Ae.hex(ae(t.name))(` ${t.name} `):"unknown user"}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"create.contributor":case"edit.title":return`"${"name"in e.payload?e.payload.name:""}"`;default:return""}},id=e=>{let t=Ci(ed(e));return Ae.gray(nd(t,8))},sd=12,ad=e=>{let t=e.split(".")[1]??"unknown";return td(`${t}`,sd)},bi=e=>{let t=id(e.id),n=ad(e.userId),r=rd(e.action),o=od(e),i=Ae.dim("\u203A"),a=[r,o].filter(Boolean).join(" ");return`${n} ${t} ${i} ${a}`};import{Box as dn,Text as dd}from"ink";import we from"react";var Ei=({selectedIndex:e,parent:t,selected:n})=>{let{currentNode:r}=$(),{title:o}=t,i=M(t.id).map(a=>{let d=typeof a.props?.value=="string"?a.props.value:"";if(o==="Assignees")return C.getContributor(d)?.id;if(o==="Tags")return C.getTag(d)?.id}).filter(a=>!!a);return we.createElement(dn,{alignItems:"center",paddingTop:1},we.createElement(dn,{minWidth:12},we.createElement(ee,{isSelected:n}),we.createElement(dd,{color:n?v.accent:v.secondary2},o,":")),we.createElement(dn,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((a,d)=>{let c=r.id===t.id&&d===e;return we.createElement(dn,{key:`${o}-${a}`,paddingRight:2,minHeight:1},we.createElement(ee,{isSelected:c}),o==="Assignees"?we.createElement(at,{isSelected:c,id:a}):o==="Tags"?we.createElement(dt,{isSelected:c,id:a}):null)})))};import{Box as cn,Text as nr}from"ink";import Te,{useEffect as cd}from"react";var rr=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:a,currentNode:d}=$(),c=N=>String(N).replace(/\r?\n/g,""),u=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];cd(()=>{let N=[];return u.forEach((A,b)=>{let I=X.text({id:`${b}`,name:`Line ${b+1}`,parentNodeId:e,props:{value:A},readonly:!0}),E=C.createNodeAtPosition(I);je(E)&&N.push(E.data.id)}),()=>N.forEach(C.deleteNode)},[e,n]);let f="\u2029",x=u.map((N,A)=>{let b=d.id===e&&a===A;return Te.createElement(cn,{key:`${e}-${A}`},Te.createElement(nr,{color:b?v.primary:v.secondary2,dimColor:!b},`${A+1} `.padStart(5,"\xA0")),Te.createElement(nr,{backgroundColor:b?"gray":""},c(N.length?St(N,i-10):f)))});return Te.createElement(cn,{flexDirection:"column",paddingTop:1},Te.createElement(cn,null,Te.createElement(ee,{isSelected:o}),Te.createElement(nr,{color:o?v.accent:v.secondary2},t)),Te.createElement(cn,{flexDirection:"row",borderStyle:"round",borderColor:v.secondary,paddingLeft:1,paddingRight:1,marginLeft:1},Te.createElement(sn,{scrollByOne:!0,children:x,height:r-2,selectedIndex:a,itemHeight:1})))};var md=e=>`${e}::log`,Si=({ticket:e,height:t})=>{let{selectedIndex:n,currentNode:r}=$(),o=process.stdout.columns||120,i=Ii(()=>md(e.id),[e.id]),a=Ii(()=>[...e.log].reverse().map(bi).join(`
|
|
34
|
-
`),[e.log]);
|
|
35
|
-
|
|
36
|
-
|
|
40
|
+
`)):(Ja(),c("State booted successfully",null))}import{Box as gd}from"ink";import un from"react";import bt from"chalk";import{Box as ln,Text as fi}from"ink";import Et,{useEffect as Ya,useMemo as Qa,useState as Za}from"react";var yi=bt.gray,ed=bt.inverse,td=bt.inverse.gray,rd={hint:"",hints:[],overlap:0,remainder:""},vi=({value:e,command:t})=>{if(!t)return null;let r=e.trimStart(),o=e.length-r.length;return e.slice(o,o+t.length)!==t?null:{start:o,end:o+t.length}},nd=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let r=se(t);return{bg:n=>bt.bgHex(r).black(n),bgCursor:n=>bt.bgHex(r).inverse.black(n)}}return Rr(t)},od=({value:e,command:t,modifier:r})=>{if(!t||!r)return null;let n=vi({value:e,command:t});if(!n)return null;let i=e.slice(n.end).match(/^\s*/)?.[0].length??0,a=n.end+i;return e.slice(a,a+r.length)!==r?null:{start:a,end:a+r.length}},xi=()=>({value:z.value,cursorPosition:z.cursorPosition,commandIsPending:z.commandIsPending,autoCompletion:z.commandMeta.autoCompletion??rd,infoMessage:z.commandMeta.infoMessage,validationStatus:z.commandMeta.validity,command:z.commandMeta.command,inputString:z.commandMeta.inputString,modifier:z.commandMeta.modifier}),id=(e,t)=>e.value===t.value&&e.cursorPosition===t.cursorPosition&&e.commandIsPending===t.commandIsPending&&e.infoMessage===t.infoMessage&&e.autoCompletion.hint===t.autoCompletion.hint&&e.autoCompletion.overlap===t.autoCompletion.overlap&&e.autoCompletion.remainder===t.autoCompletion.remainder&&e.validationStatus===t.validationStatus&&e.command===t.command&&e.modifier===t.modifier&&e.inputString===t.inputString,hi=({width:e})=>{let[t,r]=Za(xi());Ya(()=>{let y=()=>{let I=xi();r(S=>id(S,I)?S:I)},v=Xn(y);return y(),()=>{v()}},[]);let{value:n,cursorPosition:o,infoMessage:i,commandIsPending:a,autoCompletion:l,command:m,modifier:u}=t,p=Qa(()=>{let y=Math.max(0,Math.min(o,n.length)),v=vi({value:n,command:m}),I=od({value:n,command:m,modifier:u}),S=m?Rr(m):null,N=nd({command:m,modifier:u}),b=(re,ne)=>{let br=v&&ne>=v.start&&ne<v.end,Ir=I&&ne>=I.start&&ne<I.end;return br&&S?S.fg(re):Ir&&N?N.bg(re):re},T=(re,ne)=>{let br=v&&ne>=v.start&&ne<v.end,Ir=I&&ne>=I.start&&ne<I.end;return br&&S?S.fgCursor(re):Ir&&N?N.bgCursor(re):ed(re)},B=n.slice(0,y),V=n[y]??" ",te=y<n.length?n.slice(y+1):"",wt=Array.from(B).map((re,ne)=>b(re,ne)).join(""),Re=T(V,y),Tn=Array.from(te).map((re,ne)=>b(re,y+1+ne)).join("");if(l.hint){let re=l.hint[l.overlap]??V;Re=td(re),Tn=yi(l.remainder.slice(1)+te)}return yi(":")+wt+Re+Tn},[n,o,l,m,u]);return Et.createElement(ln,{flexDirection:"column",justifyContent:"flex-start"},Et.createElement(ln,{flexDirection:"column",paddingX:1,borderColor:h.secondary,borderStyle:"round",width:e},Et.createElement(ln,null,Et.createElement(fi,null,p),i&&Et.createElement(fi,{wrap:"truncate",color:a?h.red:h.secondary2},` ${i} `))))};import Ci from"chalk";import{Box as sd,Text as mn}from"ink";import dr,{useEffect as ad,useState as dd}from"react";var cd=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],Ni=e=>{let t=e.replace("#","");return{r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16)}},ld=({r:e,g:t,b:r})=>{let n=o=>Math.round(Math.max(0,Math.min(255,o))).toString(16).padStart(2,"0");return`#${n(e)}${n(t)}${n(r)}`},md=(e,t,r)=>{let n=Ni(e),o=Ni(t);return ld({r:n.r+(o.r-n.r)*r,g:n.g+(o.g-n.g)*r,b:n.b+(o.b-n.b)*r})},ud=(e,t)=>{if(e.length===1)return e[0];let r=t*(e.length-1),n=Math.floor(r),o=r-n,i=e[n],a=e[Math.min(n+1,e.length-1)];return md(i,a,o)},pd=(e,t)=>e.length===t?e:e.length>t?e.slice(0,t):e.padEnd(t," "),Ei=({width:e,availableHints:t})=>{let{syncStatus:{status:r,msg:n}}=_(),[o,i]=dd(0);ad(()=>{if(r!=="syncing"){i(0);return}let b=setInterval(()=>{i(T=>T+1)},50);return()=>clearInterval(b)},[r]);let a=[],l=0;for(let b of t){let B=(a.length>0?" | ":"").length+b.length;if(l+B>e-4)break;a.push(b),l+=B}let m=r!="synced"?n??a.join(" | "):a.join(" | "),u=Math.max(0,e-2),p=r==="syncing"?ud(cd,(Math.sin(o*.12)+1)/2):h.secondary,y=Ci.hex(p??"fff"),v=Ci.hex(h.secondary2),I=y(`\u256D${"\u2500".repeat(u)}\u256E`),S=y(`\u2570${"\u2500".repeat(u)}\u256F`),N=`${y("\u2502")}${v(pd(` ${m} `,u))}${y("\u2502")}`;return dr.createElement(sd,{flexDirection:"column",width:e},dr.createElement(mn,null,I),dr.createElement(mn,null,N),dr.createElement(mn,null,S))};var cr=({width:e,mode:t,availableHints:r})=>{let n=_(),o=[],i=0;for(let a of r){let m=(o.length>0?" | ":"").length+a.length;if(i+m>e+2)break;o.push(a),i+=m}return un.createElement(gd,null,t===g.COMMAND_LINE&&n.syncStatus.status!=="syncing"?un.createElement(hi,{width:e}):un.createElement(Ei,{width:e,mode:t,availableHints:r}))};import{Box as at,Text as bi}from"ink";import Fe from"react";var Ii=({width:e})=>{let t=[...C().availableActions].map(r=>r.description).filter(r=>r!==void 0).map(r=>{let[n,o]=r.split("]"),i=n?.replace("[",""),a=o?.trim();return[i,a]}).filter(r=>r[0]!==void 0&&r[1]!==void 0).sort(([r],[n])=>r.length===1&&n.length!==1?-1:r.length!==1&&n.length===1?1:r.localeCompare(n,void 0,{sensitivity:"base"}));return t.unshift(["Key(s)","Action"]),Fe.createElement(at,{flexDirection:"column",marginTop:3,borderColor:h.secondary,borderStyle:"round",width:e,minHeight:19},Fe.createElement(at,{flexDirection:"column",width:e},C().mode===g.HELP?t.map(([r,n],o)=>Fe.createElement(at,{paddingLeft:1,key:o,flexDirection:"row"},Fe.createElement(at,{key:o,flexDirection:"row",paddingBottom:o?0:1},Fe.createElement(at,{width:20,justifyContent:"flex-end"},Fe.createElement(bi,{color:o?h.accent:h.secondary},r)),Fe.createElement(at,{flexGrow:1,width:40,paddingLeft:2},Fe.createElement(bi,{color:o?h.primary:h.secondary},n))))):null))};import Ti from"chalk";import{Box as gn,Text as Ri}from"ink";import Se from"react";import{Box as pn,Text as Nd}from"ink";import lt from"react";import{Text as fd}from"ink";import yd from"react";var xd=e=>e.toLowerCase().trim(),vd=(e,t=Je)=>{let r=xd(e);return t[r]?t[r]:pt(r)},dt=({id:e,isSelected:t})=>{let r=E.getContributor(e);if(r)return yd.createElement(fd,{underline:t,color:vd(r.name)},"@"+r.name)};import{Text as hd}from"ink";import Cd from"react";var ct=({id:e,isSelected:t})=>{let r=E.getTag(e);if(r)return Cd.createElement(hd,{underline:t,backgroundColor:se(r.name),color:h.primary}," "+r.name+" ")};var Ed=(e,t)=>e.length<=t?e:t<=1?"\u2026":e.slice(0,t-1)+"\u2026",Si=({width:e})=>{let{breadCrumb:t,currentNode:r,selectedIndex:n,viewMode:o}=C(),i=W(r.id)[n],a=Ge(i?.id??r.id,"TICKET"),l=ze(a)?a.data:void 0,m=l?.id?W(l.id):[],u=N=>{let b=m.find(T=>T.title===N);return b?W(b.id).map(T=>typeof T.props?.value=="string"?T.props.value:"").filter(T=>!!T):[]},p=u("Tags"),y=u("Assignees"),v=l?.parentNodeId?!wr(r.id,l?.parentNodeId)&&o==="dense":!1,I=t.map((N,b)=>{let T=b===t.length-1,B=W(N.id),V=T?B?.[n]?.title:void 0;return`${b?" / ":""}${N.title??""}${V?` \u25B8 ${V}`:""}`}).join(""),S=Ed(I,e);return lt.createElement(pn,null,lt.createElement(Nd,{color:h.secondary2},S),v?p.map(N=>lt.createElement(pn,{key:N,paddingLeft:2},lt.createElement(ct,{id:N}))):null,v?y.map(N=>lt.createElement(pn,{key:N,paddingLeft:2},lt.createElement(dt,{id:N}))):null)};import{Box as bd,Text as Ai}from"ink";import lr from"react";var Id=({filters:e})=>lr.createElement(bd,{columnGap:1},lr.createElement(Ai,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:r,operator:n})=>lr.createElement(Ai,{backgroundColor:"black",color:"white"},` ${r}${n}"${t}" `))),wi=lr.memo(Id);function mr({filters:e,hideBreadCrumb:t=!1}){let{userName:r,preferredEditor:n}=ce(),o=40,i=process.stdout.columns-o-8;return Se.createElement(gn,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?Se.createElement(Ri,null," "):Se.createElement(gn,{paddingLeft:1},e.length>0?Se.createElement(wi,{filters:e}):Se.createElement(Si,{width:i})),Se.createElement(gn,{columnGap:1,paddingRight:2,"max-width":o,overflow:"hidden",justifyContent:"flex-end"},Se.createElement(Mi,{icon:"@",value:r}),Se.createElement(Mi,{icon:"\u276F",value:n})))}function Mi({icon:e,value:t}){return Se.createElement(Ri,null,Ti.dim(e)+Ti.hex(h.accent)(` ${t??"-"} `))}import{Box as zd,Text as qd}from"ink";import St from"react";import{Box as ur,Text as fn}from"ink";import ke from"react";import{Text as Li}from"ink";import Pi,{useEffect as Di,useState as Sd}from"react";var Fi={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"command-line":["\u276F "]},ee=({isSelected:e,placeholder:t=" "})=>{let{mode:r}=_(),n=Fi[r]??Fi.default,[o,i]=Sd(0);if(Di(()=>{i(0)},[n]),Di(()=>{if(!e)return;let l=setInterval(()=>{i(m=>(m+1)%n.length)},500);return()=>clearInterval(l)},[e,n]),!e)return Pi.createElement(Li,null,t);let a=n[o]??n[0]??t;return Pi.createElement(Li,{color:h.accent,dimColor:o===1},a)};function yn(){let e=_(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,i=process.stdout.columns||120,a=t?.id?M(t?.id):[];return ke.createElement(ur,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:h.secondary,width:i},ke.createElement(ur,{padding:1,paddingTop:0,paddingBottom:0},ke.createElement(fn,null,"Select a board:")),ke.createElement(ur,{padding:1,flexDirection:"column"},a.map((l,m)=>{let u=e.currentNode.context==="WORKSPACE"&&e.selectedIndex===m,y=M(l.id).flatMap(({id:v})=>W(v)).length;return ke.createElement(ur,{key:l.id??m},ke.createElement(fn,{color:u?h.accent:h.secondary},ke.createElement(ee,{isSelected:u})),ke.createElement(fn,{color:u?h.accent:h.secondary},l.title," (",y," issues)",l.readonly?" \u{1F512}":""))})))}import{Box as Vd}from"ink";import vr from"react";import{Box as hn,Text as Rd}from"ink";import fe from"react";import{Box as xn,Text as Ad}from"ink";import pr from"react";var gr=({children:e=[],height:t,selectedIndex:r,itemHeight:n=1,scrollByOne:o=!1})=>{if(e.length===0)return null;let i=Math.max(1,Math.floor(t)),a=Math.max(1,Math.ceil(n)),l=Math.max(1,Math.floor(i/a)),m=Math.max(0,Math.min(r,e.length-1)),u=Math.max(0,e.length-l),p=o?Math.min(u,Math.max(0,m-l+1)):Math.min(u,Math.floor(m/l)*l),y=p+l,v=e.slice(p,y),I=e.length>l,S=i,N=I?Math.max(1,Math.floor(l/e.length*S)):S,b=Math.max(0,S-N),T=Math.max(1,e.length-l),B=I?Math.floor(p/T*b):0;return pr.createElement(xn,{flexDirection:"row",height:i,width:"100%"},pr.createElement(xn,{flexDirection:"column",flexGrow:1,height:i},v),pr.createElement(xn,{flexDirection:"column",width:1,height:S},Array.from({length:S}).map((V,te)=>pr.createElement(Ad,{key:te,color:I&&te>=B&&te<B+N?h.accent:h.secondary},I?"\u2502":" "))))};import{Box as fr,Text as wd}from"ink";import Ve from"react";var ki=({width:e,ticket:t,isSelected:r})=>{let n=e-14,o=Mt(Ln(t.title),n),i=M(t.id),a=u=>{let p=i.find(y=>y.title===u);return p?M(p.id).map(y=>typeof y.props?.value=="string"?y.props.value:"").filter(y=>!!y):[]},l=a("Tags").map(u=>E.getTag(u)).filter(u=>!!u),m=a("Assignees").map(u=>E.getContributor(u)).filter(u=>!!u);return Ve.createElement(fr,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:r?h.accent:h.secondary,justifyContent:"space-between"},Ve.createElement(fr,{borderBottom:!0},Ve.createElement(fr,{paddingLeft:1,flexDirection:"column"},Ve.createElement(wd,{color:h.primary},o))),Ve.createElement(fr,{flexDirection:"row",paddingLeft:1},l.map(u=>Ve.createElement(ct,{key:u.id,id:u.id})),m.map(u=>Ve.createElement(dt,{key:u.id,id:u.id}))))};import Td from"chalk";import{Box as It,Text as vn}from"ink";import Ae from"react";var Md=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,Bi=({width:e,ticket:t,isSelected:r,index:n,mode:o})=>{let i=M(t.id),a=N=>{let b=i.find(T=>T.title===N);return b?M(b.id).map(T=>typeof T.props?.value=="string"?T.props.value:"").filter(T=>!!T):[]},l=a("Tags").map(N=>E.getTag(N)).filter(N=>!!N),m=a("Assignees").map(N=>E.getContributor(N)).filter(N=>!!N),u=1,p=l.length*(1+u),y=m.length*(2+u),v=l.map(N=>Ae.createElement(It,{key:N.id,paddingRight:u},Ae.createElement(vn,{color:se(N.name)},"\u25A0"))),I=m.map(N=>Ae.createElement(It,{key:N.id,paddingRight:u},Ae.createElement(vn,{color:pt(N.name)},"@"+N.name.at(0)))),S=r?h.accent:o===g.MOVE?h.secondary:h.primary;return Ae.createElement(It,{borderBottom:!0,justifyContent:"space-between"},Ae.createElement(It,null,Ae.createElement(ee,{isSelected:r,placeholder:Td.dim.gray(n+1+" ")}),Ae.createElement(vn,{wrap:"truncate",color:S},Md(t.title,e-p-y-14))),Ae.createElement(It,null,v,I))};var Ld=({swimlane:e,isSelected:t,width:r,height:n,isDense:o,isFocused:i,listSelectedIndex:a,mode:l})=>{let{renderedChildrenIndex:m}=_(),u=m[e.id]??[],p=`${e.title} (${u.length})`,y=3,v=o?1:4,I=n-y-(o?2:1),S=fe.createElement(hn,{borderStyle:"round",borderColor:h.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},fe.createElement(ee,{isSelected:t}),fe.createElement(Rd,{bold:!0,color:t?h.accent:h.primary},p," ",e.readonly?"\u{1F512}":"")),N=(b,T)=>{let B=i&&a===T;return o?fe.createElement(Bi,{key:b.id,index:T,width:r,ticket:b,isSelected:B,mode:l}):fe.createElement(ki,{key:b.id,width:r,ticket:b,isSelected:B})};return fe.createElement(hn,{flexDirection:"column",width:r,borderStyle:"round",borderColor:t?h.accent:h.secondary,paddingRight:1,paddingLeft:1,height:n},S,fe.createElement(hn,{padding:o?1:0},u.length>0&&fe.createElement(gr,{selectedIndex:a,height:I,itemHeight:v},u.map(N)),fe.createElement(ee,{isSelected:i&&a===-1})))},Oi=fe.memo(Ld);import{Box as En,Text as _d}from"ink";import Be,{useEffect as bn,useMemo as _i}from"react";import we from"chalk";import Wi from"string-width";import{decodeTime as Pd}from"ulid";var Ui=e=>{let t=Date.now()-e,r=[{label:"y",ms:1e3*60*60*24*365},{label:"mo",ms:1e3*60*60*24*30},{label:"w",ms:1e3*60*60*24*7},{label:"d",ms:1e3*60*60*24},{label:"h",ms:1e3*60*60},{label:"m",ms:1e3*60},{label:"s",ms:1e3}];for(let{label:n,ms:o}of r){let i=Math.floor(t/o);if(i>=1)return`${i}${n} ago`}return"just now"};var Dd=(e,t)=>e+" ".repeat(Math.max(0,t-Wi(e))),Fd=(e,t)=>" ".repeat(Math.max(0,t-Wi(e)))+e,kd=e=>(()=>{let r={"add.issue":"Created with title","assign.issue":"Assigned to","close.issue":"Closed","delete.node":"Deleted","edit.title":"Changed title to","edit.description":"Changed description","reopen.issue":"Reopened","tag.issue":"Tagged with","lock.node":"Locked node","move.node":"Moved issue"};return(o=>r[o]??(o.endsWith("e")?`${o}d`:`${o}ed`))(e)})(),Bd=e=>{switch(e.action){case"move.node":{let t=E.getNode(e.payload.parent),r=t?we.dim.bgBlack(` ${t.title} `):"unknown",n=e.payload.pos;if(!n)return`to ${r}`;switch(n.at){case"start":return`to ${r} ${we.dim("(to top of list)")}`;case"end":return`to ${r} ${we.dim("(to bottom of list)")}`;case"before":return`to ${r} ${we.dim("(up in list)")}`;case"after":return`to ${r} ${we.dim("(down in list)")}`}}case"tag.issue":{let t=C().tags[e.payload.tagId];return t?we.bgHex(se(t.name))(` ${t.name} `):"unknown tag"}case"assign.issue":{let t=C().contributors[e.payload.contributor];return t?we.hex(se(t.name))(` ${t.name} `):"unknown user"}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"create.contributor":case"edit.title":return`"${"name"in e.payload?e.payload.name:""}"`;default:return""}},Od=e=>{let t=Ui(Pd(e));return we.gray(Fd(t,8))},Ud=12,Wd=e=>Dd(`${e}`,Ud),Hi=e=>{let t=Od(e.id),r=Wd(e.userName),n=kd(e.action),o=Bd(e),i=we.dim("\u203A"),a=[n,o].filter(Boolean).join(" ");return`${r} ${t} ${i} ${a}`};import{Box as yr,Text as Hd}from"ink";import Te from"react";var $i=({selectedIndex:e,parent:t,selected:r})=>{let{currentNode:n}=_(),{title:o}=t,i=M(t.id).map(a=>{let l=typeof a.props?.value=="string"?a.props.value:"";if(o==="Assignees")return E.getContributor(l)?.id;if(o==="Tags")return E.getTag(l)?.id}).filter(a=>!!a);return Te.createElement(yr,{alignItems:"center",paddingTop:1},Te.createElement(yr,{minWidth:12},Te.createElement(ee,{isSelected:r}),Te.createElement(Hd,{color:r?h.accent:h.secondary2},o,":")),Te.createElement(yr,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((a,l)=>{let m=n.id===t.id&&l===e;return Te.createElement(yr,{key:`${o}-${a}`,paddingRight:2,minHeight:1},Te.createElement(ee,{isSelected:m}),o==="Assignees"?Te.createElement(dt,{isSelected:m,id:a}):o==="Tags"?Te.createElement(ct,{isSelected:m,id:a}):null)})))};import{Box as xr,Text as Cn}from"ink";import Me,{useEffect as $d}from"react";var Nn=({id:e,label:t,text:r,height:n,selected:o,maxWidth:i})=>{let{selectedIndex:a,currentNode:l}=_(),m=v=>String(v).replace(/\r?\n/g,""),u=typeof r=="string"?r.split(/\r?\n|\u2028|\u2029/):[];$d(()=>{let v=[];return u.forEach((I,S)=>{let N=X.text({id:`${S}`,name:`Line ${S+1}`,parentNodeId:e,props:{value:I},readonly:!0}),b=E.createNodeAtPosition(N);ze(b)&&v.push(b.data.id)}),()=>v.forEach(E.deleteNode)},[e,r]);let p="\u2029",y=u.map((v,I)=>{let S=l.id===e&&a===I;return Me.createElement(xr,{key:`${e}-${I}`},Me.createElement(Cn,{color:S?h.primary:h.secondary2,dimColor:!S},`${I+1} `.padStart(5,"\xA0")),Me.createElement(Cn,{backgroundColor:S?"gray":""},m(v.length?Mt(v,i-10):p)))});return Me.createElement(xr,{flexDirection:"column",paddingTop:1},Me.createElement(xr,null,Me.createElement(ee,{isSelected:o}),Me.createElement(Cn,{color:o?h.accent:h.secondary2},t)),Me.createElement(xr,{flexDirection:"row",borderStyle:"round",borderColor:h.secondary,paddingLeft:1,paddingRight:1,marginLeft:1},Me.createElement(gr,{scrollByOne:!0,children:y,height:n-2,selectedIndex:a,itemHeight:1})))};var Kd=e=>`${e}::log`,Ki=({ticket:e,height:t})=>{let{selectedIndex:r,currentNode:n}=_(),o=process.stdout.columns||120,i=_i(()=>Kd(e.id),[e.id]),a=_i(()=>[...e.log].reverse().map(Hi).join(`
|
|
41
|
+
`),[e.log]);bn(()=>{if(E.getNode(i))return;let T={...X.field(i,"Log",e.id,{value:a}),readonly:!0,childRenderAxis:"vertical"};return E.createNodeAtPosition(T),()=>{E.deleteNode(i)}},[i,e.id]),bn(()=>{let b=E.getNode(i);b&&b.props.value!==a&&E.updateNode({...b,props:{...b.props,value:a},childRenderAxis:"vertical",readonly:!0})},[i,a]);let l=n.id===e.id,m=n.id===i||n.parentNodeId===i;bn(()=>{m&&(r>=0||O.navigate({selectedIndex:0}))},[m,r]);let u=M(e.id);if(m){let b=E.getNode(i),B=t-3;return Be.createElement(En,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},b?Be.createElement(Nn,{id:b.id,label:"Event log",text:b.props.value??"",selected:!1,maxWidth:o,height:B}):null)}let p=u.reduce((b,T)=>T.title==="Assignees"||T.title==="Tags"||T.id===i?++b:b,0),y=2,v=p*1,S=t-3-v-y,N=(b,T)=>b.title==="Assignees"||b.title==="Tags"?Be.createElement($i,{key:b.id,parent:b,selected:T,selectedIndex:r}):b.id===i?Be.createElement(En,{key:b.id,paddingTop:1},Be.createElement(ee,{isSelected:T}),Be.createElement(_d,{backgroundColor:h.secondary,color:T?h.accent:h.primary}," History \u203A\u203A ")):Be.createElement(Nn,{label:"Description (press e to edit)",key:b.id,id:b.id,text:b.props.value??"",selected:T,maxWidth:o,height:S});return Be.createElement(En,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},u.map((b,T)=>N(b,l&&r===T)))};var jd=({swimlanes:e,currentNode:t,selectedIndex:r,breadCrumb:n,mode:o,viewMode:i,height:a,width:l})=>{let m=t.context,u=m===L.TICKET||m===L.FIELD_LIST||m===L.FIELD,p=m===L.BOARD||m===L.SWIMLANE,y=m===L.TICKET?t:n.find(b=>b.context===L.TICKET),v=Math.floor(l/3),I=Math.floor(l/Math.max(e.length,1)),S=Math.min(I,v),N=i==="dense";return vr.createElement(Vd,{flexDirection:"row",height:a},p&&e.map((b,T)=>{let B=t.id===b.id,V=B?r:-1,te=t.context===L.BOARD&&r===T;return vr.createElement(Oi,{key:b.id,height:a,width:S,swimlane:b,isSelected:te,isDense:N,isFocused:B,listSelectedIndex:V,mode:o})}),u&&y&&vr.createElement(Ki,{height:a,ticket:y}))},Vi=vr.memo(jd);var Gd=({currentNode:e,selectedIndex:t,breadCrumb:r,mode:n,viewMode:o,height:i,width:a})=>{let{renderedChildrenIndex:l}=_(),m=r.find(({context:v})=>v==="BOARD"),y=i-1-3;return St.createElement(zd,{flexDirection:"row"},e.context==="WORKSPACE"?St.createElement(yn,null):m?St.createElement(Vi,{height:y,width:a,swimlanes:(l[m.id]??[]).filter(v=>v!==void 0&&Mn(v)),currentNode:e,selectedIndex:t,breadCrumb:r,viewMode:o,mode:n}):St.createElement(qd,null))},ji=St.memo(Gd);import{Box as At,Text as ye}from"ink";import U from"react";var hr=({isDone:e,command:t,value:r})=>U.createElement(At,null,U.createElement(ye,{color:h.accent,dimColor:e},e?" \u2714 ":" "),U.createElement(ye,{dimColor:e},"Type "),U.createElement(ye,{backgroundColor:h.secondary,dimColor:e}," "+t+" "),r&&U.createElement(U.Fragment,null,U.createElement(ye,{dimColor:e}," "),U.createElement(ye,{color:h.secondary,dimColor:e},"<"+r+">")));function In({width:e,height:t,hasUserName:r,hasPreferredEditor:n,userName:o,preferredEditor:i}){let a=r&&n,l=r?n?null:":set:editor":":set:username";return U.createElement(At,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:h.secondary,rowGap:1},U.createElement(ye,{color:h.accent,bold:!0},"Welcome! \u{1F539}"),U.createElement(ye,null,"Lets get you started - its a breeze."),U.createElement(ye,{color:h.secondary2},"And remember, you can always get help with"," ",U.createElement(ye,{color:h.accent},":help"),"."),!a&&U.createElement(ye,{color:h.secondary2},l===":set:username"?"First, choose your username.":"Nice. One more step."),U.createElement(At,{flexDirection:"column"},r&&U.createElement(At,{marginBottom:1},U.createElement(hr,{isDone:!0,command:":set:username",value:o})),!r&&U.createElement(hr,{isDone:!1,command:":set:username"}),r&&!n&&U.createElement(hr,{isDone:!1,command:":set:editor"}),a&&U.createElement(At,null,U.createElement(hr,{isDone:!0,command:":set:editor",value:i}))))}var Xd=({width:e,height:t})=>k.createElement(me,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:h.secondary,rowGap:1},k.createElement(Oe,{color:h.accent,bold:!0},"Initialize project"),k.createElement(Oe,null,`This folder is not an ${Jd.hex(h.accent)("epiq")} project yet.`),k.createElement(Oe,{color:h.primary},"To start tracking issues here, we need to initialize a new"," ",k.createElement(Oe,{color:h.primary,backgroundColor:h.secondary}," .epiq/ ")," ","directory in this repository."),k.createElement(me,{marginTop:1,flexDirection:"column"},k.createElement(me,null,k.createElement(Oe,{color:h.accent}," "),k.createElement(Oe,{color:h.primary},"Type "),k.createElement(Oe,{backgroundColor:h.secondary}," :init "))),k.createElement(me,{marginTop:1},k.createElement(Oe,{color:h.secondary2},"(This will create the local epiq project files)")));function Sn({width:e,height:t}){let r=_(),n=r.filters;if(r.mode===g.HELP)return k.createElement(me,{flexDirection:"column"},k.createElement(Ii,{width:e}));let{isSetup:o,hasPreferredEditor:i,hasUserName:a,userName:l,preferredEditor:m}=Dt(),u=!o,p=o&&He();if(u)return k.createElement(me,{flexDirection:"column"},k.createElement(me,{flexDirection:"column"},k.createElement(mr,{hideBreadCrumb:!0,filters:n}),k.createElement(In,{height:t,width:e,hasUserName:a,hasPreferredEditor:i,userName:l??"",preferredEditor:m??""})),k.createElement(cr,{width:e,mode:r.mode,availableHints:r.availableHints}));if(p)return k.createElement(me,{flexDirection:"column"},k.createElement(me,{flexDirection:"column"},k.createElement(mr,{hideBreadCrumb:!0,filters:n}),k.createElement(Xd,{height:t,width:e})),k.createElement(cr,{width:e,mode:r.mode,availableHints:r.availableHints}));let y=nt(C().breadCrumb??[],"BOARD");if(ze(y)){let v=y.data.id,I=M(v).length,S=3,N=Math.floor(e/S),b=Math.floor(e/Math.max(I,1));e=Math.min(b,N)*Math.max(I,S)}return k.createElement(me,{flexDirection:"column"},k.createElement(me,{flexDirection:"column"},k.createElement(mr,{filters:n}),k.createElement(ji,{width:e,height:t,currentNode:r.currentNode,selectedIndex:r.selectedIndex,breadCrumb:r.breadCrumb,viewMode:r.viewMode,mode:r.mode})),k.createElement(cr,{width:e,mode:r.mode,availableHints:r.availableHints}))}import{Box as je,Text as Ue}from"ink";import J,{useEffect as Yd,useMemo as Qd,useState as Zd}from"react";var ec=["\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ","\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557","\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551","\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2551\u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551","\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D","\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2580\u2580\u255D "];function tc(e,t,r){return Math.min(r,Math.max(t,e))}function rc(e,t){return J.createElement(Ue,null,J.createElement(Ue,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(0,14)),J.createElement(Ue,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(14)))}function nc(e,t=28){if(e>=1)return"\u2588".repeat(t);let r=Math.floor(e*(t-1));return Array.from({length:t},(n,o)=>{let i=Math.abs(o-r);return i===0?"\u2588":i===1?"\u2593":i===2?"\u2592":i===3?"\u2591":o<r?"\u2500":"\xB7"}).join("")}function An({durationMs:e=3e3,slogan:t="Never leave the command line"}){let r=Math.max(1,e),[n,o]=Zd(0);Yd(()=>{let m=Date.now(),u=setInterval(()=>{let p=Date.now()-m;if(p>=r){o(r),clearInterval(u);return}o(p)},33);return()=>clearInterval(u)},[r]);let i=tc(n/r,0,1),a=Qd(()=>nc(i,28),[i]),l=`${Math.round(i*100)}%`;return J.createElement(je,{flexDirection:"column",alignItems:"center",justifyContent:"center",paddingX:4,paddingY:1},J.createElement(je,{flexDirection:"column",minWidth:42},J.createElement(je,{flexDirection:"column",marginBottom:1},ec.map((m,u)=>J.createElement(je,{key:u,justifyContent:"center"},rc(m,u)))),J.createElement(je,{justifyContent:"center",marginBottom:1},J.createElement(Ue,{color:"gray"},t)),J.createElement(je,{justifyContent:"center",marginBottom:1},J.createElement(Ue,{color:"cyan"},a.slice(0,10)),J.createElement(Ue,{color:"blue"},a.slice(10,18)),J.createElement(Ue,{color:"magenta"},a.slice(18))),J.createElement(je,{justifyContent:"center",marginBottom:1},J.createElement(Ue,{color:"gray"},l))))}import oc from"readline";var Cr,Nr,xe,zi=async e=>{if(e.ctrl&&e.name==="c")return O.exit();let{actionIndex:t,mode:r}=C(),n=oo(e,r);if(!n)return;let o=t[r]?.[n];if(o?.action)try{await o.action(o,e)}catch(i){logger.error(i)}},ic=()=>async function(t,r){r.name!=="escape"&&(xe&&(clearTimeout(xe),xe=void 0),await zi(r))},sc=()=>async function(t){if(t.length===1&&t[0]===27){xe&&clearTimeout(xe),xe=setTimeout(()=>{zi({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),xe=void 0},25);return}xe&&(clearTimeout(xe),xe=void 0)};function qi(){Cr&&process.stdin.removeListener("keypress",Cr),Nr&&process.stdin.removeListener("data",Nr),Cr=ic(),Nr=sc(),oc.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",Nr),process.stdin.on("keypress",Cr)}import wn from"chalk";dc(`${wn.bold("Epiq CLI")}
|
|
42
|
+
|
|
43
|
+
${wn.dim("Boot in directory:")}
|
|
44
|
+
${wn.cyan("$ epiq")}
|
|
37
45
|
|
|
38
|
-
|
|
39
|
-
$ epiq --init "Project Name"
|
|
40
|
-
`,{importMeta:import.meta,flags:{init:{type:"string"}}});var Ld=2e3,Pd=600,Li=process.stdout.columns||120,Pi=process.stdout.rows||20,gn=null,Dd=e=>new Promise(t=>setTimeout(t,e)),Di=e=>{if(!gn){gn=Md(e);return}gn.rerender(e)},Fi=()=>{Di(Ri.createElement(ar,{width:Li,height:Pi}))},Fd=e=>{Di(Ri.createElement(dr,{durationMs:e}))},kd=()=>{let e=Wt();if(l(e)){if(e.message.includes("No events found"))return logger.info("No events found, starting with empty state"),[];throw new Error(e.message)}return e.data},Bd=e=>{let t=Yo(e);if(l(t))throw new Error(`Failed to boot state: ${t.message}`)};async function Od(){co(),await Fo();let e=kd(),n=e.length===0?Ld:Pd;n>0&&Fd(n);let r=Date.now();Bd(e);let o=Date.now()-r,i=Math.max(0,n-o);i>0&&await Dd(i),Fi(),Mi()}process.stdout.on("resize",()=>{Li=process.stdout.columns||120,Pi=process.stdout.rows||20,gn&&Fi()});(async()=>(console.clear(),await Od()))();
|
|
46
|
+
`,{importMeta:import.meta,flags:{init:{type:"string"}}});var cc=2e3,lc=600,Ji=process.stdout.columns||120,Xi=process.stdout.rows||20,Er=null,mc=e=>new Promise(t=>setTimeout(t,e)),Yi=e=>{if(!Er){Er=ac(e);return}Er.rerender(e)},Qi=()=>{Yi(Gi.createElement(Sn,{width:Ji,height:Xi}))},uc=e=>{Yi(Gi.createElement(An,{durationMs:e}))},pc=()=>{let e=jt();if(d(e)){if(e.message.includes("No events found"))return logger.info("No events found, starting with empty state"),[];throw new Error(e.message)}return e.data},gc=e=>{let t=gi(e);if(d(t))throw new Error(`Failed to boot state: ${t.message}`)};async function fc(){Ro(),await Qo();let e=pc(),r=e.length===0?cc:lc;r>0&&uc(r);let n=Date.now();gc(e);let o=Date.now()-n,i=Math.max(0,r-o);i>0&&await mc(i),Qi(),qi()}process.stdout.on("resize",()=>{Ji=process.stdout.columns||120,Xi=process.stdout.rows||20,Er&&Qi()});(async()=>(console.clear(),await fc()))();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "epiq",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.29",
|
|
4
4
|
"license": "UNLICENSED",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "EPIQ - CLI based issue tracker",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"dev": "IS_LOCAL=true tsc --watch --noEmit",
|
|
21
21
|
"dev:start": "IS_LOCAL=true tsx source/cli.tsx",
|
|
22
22
|
"start": "IS_LOCAL=true tsx source/cli.tsx",
|
|
23
|
-
"test": "prettier --check \"**/*.{ts,tsx}\" && vitest run",
|
|
23
|
+
"test": "prettier --check \"**/*.{ts,tsx}\" && vitest run --coverage",
|
|
24
24
|
"prepack": "pnpm build:publish",
|
|
25
25
|
"pack:check": "rm -f epiq-*.tgz && npm pack && FILE=$(ls -t epiq-*.tgz | head -n 1) && echo \"$FILE\" && tar -tf \"$FILE\"",
|
|
26
26
|
"publish:dry": "rm -f epiq-*.tgz && npm pack && FILE=$(ls -t epiq-*.tgz | head -n 1) && npm publish --dry-run \"$FILE\"",
|
|
@@ -35,7 +35,8 @@
|
|
|
35
35
|
"meow": "^14.1.0",
|
|
36
36
|
"react": "^19.2.4",
|
|
37
37
|
"string-width": "^8.2.0",
|
|
38
|
-
"ulid": "^3.0.2"
|
|
38
|
+
"ulid": "^3.0.2",
|
|
39
|
+
"zod": "^4.3.6"
|
|
39
40
|
},
|
|
40
41
|
"devDependencies": {
|
|
41
42
|
"@sindresorhus/tsconfig": "^3.0.1",
|
|
@@ -43,6 +44,7 @@
|
|
|
43
44
|
"@types/node": "^25.5.0",
|
|
44
45
|
"@types/react": "^18.0.32",
|
|
45
46
|
"@vdemedes/prettier-config": "^2.0.1",
|
|
47
|
+
"@vitest/coverage-v8": "4.1.2",
|
|
46
48
|
"chalk": "^5.2.0",
|
|
47
49
|
"esbuild": "^0.25.0",
|
|
48
50
|
"eslint-plugin-react": "^7.32.2",
|