epiq 0.2.24 → 0.2.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/cli.js +29 -29
  2. package/package.json +1 -1
  3. package/readme.md +96 -23
package/dist/cli.js CHANGED
@@ -1,40 +1,40 @@
1
1
  #!/usr/bin/env node
2
- import{render as wd}from"ink";import Td from"meow";import wi from"react";import fd from"chalk";import{Box as pe,Text as Be}from"ink";import D from"react";import it from"chalk";import{monotonicFactory as ua,ulid as Ie}from"ulid";import{useSyncExternalStore as ca}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 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:""},he={None:"none",Invalid:"invalid",Valid:"valid"},Ce={None:"none",Success:"success",Fail:"fail"},s=e=>({result:Ce.Fail,message:e,data:null}),c=(e,t)=>({result:Ce.Success,message:e,data:t}),mr=()=>({result:Ce.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 Et(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var It=(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,Pi=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(Pi(e),r).filter(i=>Et(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 Di(t,r)},Di=(e,t)=>{let n=t[0]??"",r=Et(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,Fi=ze*4n,St=(1n<<Fi)-1n,ki=/^[0-9a-f]+$/;function hr(e){if(!e||!ki.test(e))throw new Error(`Invalid hex rank: ${e}`);return BigInt("0x"+e)}function At(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 At(St/2n,ze);let n=e?hr(e):0n,r=t?hr(t):St;if(r<=n)return At(St/2n,ze);let o=(n+r)/2n;return o===n||o===r?"":At(o,ze)}function le(){return At(St/2n,ze)}var Y={workspace:(e,t)=>({id:e,title:t,rank:le(),isDeleted:!1,props:{},context:L.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r=!1)=>({id:e,title:t,rank:le(),isDeleted:!1,props:{},context:L.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:r,log:[]}),swimlane:(e,t,n)=>({id:e,title:t,rank:le(),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:le(),isDeleted:!1,props:r,context:L.FIELD,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[]}),ticket:(e,t,n)=>({id:e,title:t,rank:le(),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:le(),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),gn=(e,t={at:"end"})=>{if(e.length===0)return c("Resolved rank",le());switch(t.at){case"start":{let n=e[0];return n?c("Resolved rank",lt(void 0,n.rank)):s("Unable to resolve first sibling")}case"end":{let n=e[e.length-1];return n?c("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?c("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?c("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 c("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return c("Resolved ancestor node",o);o=o.parentNodeId?n[o.parentNodeId]:void 0}return s(`No ancestor found for context: ${t}`)},yn=(e,t)=>{let{nodes:n}=h(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},fn=(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){de(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=fn(r,"edit");if(o)return o;let i={...r,props:{...r.props,value:t}};return C.updateNode(i),c("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return s("Rename target node not found");let r=fn(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),c("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"},navigate:r=!0}){let{rootNodeId:o}=h(),i=this.getNode(e),a=this.getNode(t);if(!i)return s("Node not found");if(!a)return s("Target parent not found");if(o===e)return s("Cannot move root node");if(e===t)return s("Cannot move node into itself");let d=fn(i,"move");if(d)return d;if(yn(t,e))return s("Cannot move node into its own descendant");let m=W(t).filter(x=>x.id!==e),u=gn(m,n);if(l(u))return u;let f={...i,parentNodeId:t,rank:u.data};return r?this.updateNodeAndSelectInParent(f):this.updateNode(f),c("Moved node successfully",f)},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=u=>{let f=t[u];if(!(!f||i.has(u))){i.add(u);for(let x of W(f.id))a(x.id)}};a(e);let d={...structuredClone(t)};for(let u of i){if(!d[u])return s("Unable to locate node to delete");d[u]={...d[u],isDeleted:!0}}if(!n)return s("Unable to delete undefined");let m=i.has(n)?o.parentNodeId??r:n;return T({nodes:d}),k.navigate({currentNode:d[m],selectedIndex:0}),c("Successfully tomb stoned",o)},createContributor(e){let t=de(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return l(t)?s("Unable to create contributor"):c("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(m=>m.props?.value===t))return s("Contributor already assigned");let d=this.createNodeAtPosition(Y.field(n,r.name,i.id,{value:t}));return l(d)?d:c("Assigned contributor",d.data)},createTag(e){let t=de(n=>({...n,tags:{...n.tags,[e.id]:e}}));return l(t)?s("Could not create tag"):c("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(m=>m.props?.value===t))return s("Tag already assigned");let d=this.createNodeAtPosition(Y.field(n,r.name,i.id,{value:t}));return l(d)?d:c("Tag added",d.data)},createNodeAtPosition(e,t={at:"end"}){if(!e.parentNodeId){let i={...e,rank:le()};return this.createNode(i),c("Created node",i)}let n=W(e.parentNodeId),r=gn(n,t);if(l(r))return r;let o={...e,rank:r.data};return this.createNode(o),c("Created node",o)},createNode(e){let t=de(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return l(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 n={...t,readonly:!0},r=de(o=>({...o,nodes:{...o.nodes,[e]:n}}));return l(r)?s(r.message):c("Locked node",n)},updateNode(e){let t=de(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return l(t)?t:c("Updated node",e)},updateNodeAndSelectInParent(e){let t=de(a=>({...a,nodes:{...a.nodes,[e.id]:e}}));if(l(t))return s(t.message);let n=h(),r=e.parentNodeId?n.nodes[e.parentNodeId]:n.nodes[n.rootNodeId];if(!r)return s("Unable to resolve parent after update");let i=M(r.id).findIndex(({id:a})=>a===e.id);return k.navigate({currentNode:r,selectedIndex:i===-1?0:i}),c("Updated and selected",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 wt={preferredEditor:null,userName:null,userId:null},me=()=>wt,mt=e=>(wt={...wt,...e},wt);var Tt=()=>{let e=me(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim();return{isSetup:n&&t,hasPreferredEditor:n,hasUserName:t,userName:e.userName,preferredEditor:e.preferredEditor}},Nr=()=>!Mt();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=Tt().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],m=[...{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]:m};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 Nn from"chalk";import Xe from"chalk";var vn={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Bi=(e,t,n)=>Math.max(t,Math.min(n,e)),xn=(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},Oi=(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)),m=0,u=0,f=0;a>=0&&a<1?(m=i,u=d):a>=1&&a<2?(m=d,u=i):a>=2&&a<3?(u=i,f=d):a>=3&&a<4?(u=d,f=i):a>=4&&a<5?(m=d,f=i):(m=i,f=d);let x=o-i/2;return[Math.round((m+x)*255),Math.round((u+x)*255),Math.round((f+x)*255)]},Ui=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,Wi=(e,t,n)=>[Math.round(xn(e[0],t[0],n)),Math.round(xn(e[1],t[1],n)),Math.round(xn(e[2],t[2],n))],ut=e=>{let n=br(e)%360,r=Oi(n,vn.stringColor.saturation,vn.stringColor.lightness);return Ui(r)},Hi=e=>{let t=vn.gradient.stops,n=Bi(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 Wi(t[i],t[i+1],a)},Rt=e=>br(e.toLowerCase().trim())/4294967295,Er=e=>{let t=Rt(e);return Hi(t)},$i=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)}},hn=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)}},Cn=e=>$i(e).normal(` ${e} `),ce=(e,t=Ge)=>{let r=(o=>o.toLowerCase().trim())(e);return r&&t[r]?t[r]:ut(r)};var Ne="<ENTER> to confirm",J=(e="",t=[])=>({message:e,validity:he.Valid,completionWordList:t}),ue=({message:e,completionWordList:t})=>({validity:he.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 m=[...t.filter(Boolean).filter(f=>f.startsWith(o.trim()))].sort((f,x)=>Rt(f)-Rt(x)).slice(0,r).map(Cn),u=m.length>i?m.join(" "):"";return u?`${e}${u}${n}`:""},bn=({modifier:e})=>{let t="confirm";return e===t?J(Ne):ue({message:pt(e)?`if you are certain, enter ${Cn(t)}`:"",completionWordList:[t]})},_i=({list:e,hint:t})=>({modifier:n})=>e.includes(n)?J(Ne):ue({message:pt(n)?t:"",completionWordList:[]}),Vi=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?ue({message:n,completionWordList:[]}):J():ue({message:pt(r)?t:"",completionWordList:[]}),En=({hint:e})=>({modifier:t,inputString:n})=>pt(t)&&pt(n)?ue({message:e,completionWordList:[]}):J(Ne),Ki={[g.INIT]:()=>J(Ne),[g.FILTER]:e=>{if(e.modifier==="clear")return J();let t=a=>V(g.FILTER).includes(a);if(!e.modifier||!t(e.modifier??""))return ue({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()??"")?ue({message:Le({prefix:`existing ${e.modifier}s... `,wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i}):J():ue({message:Le({prefix:"one of... ",wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i})},[g.NONE]:e=>e.command?J():ue({message:Le({prefix:"commands... ",wordList:V(g.NONE),noOfHints:100,inputString:e.inputString,minLengthForHints:0}),completionWordList:[]}),[g.NEW]:e=>Vi({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]:()=>J(Ne),[g.HELP]:()=>J(Ne),[g.RENAME]:()=>J(Ne),[g.DELETE]:e=>bn(e),[g.CLOSE_ISSUE]:e=>bn(e),[g.RE_OPEN_ISSUE]:e=>bn(e),[g.MOVE]:e=>En({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=>` ${Nn.bgHex(ce(n))(" "+n+" ")} `).slice(0,10);return En({hint:"tag name like... "+t.join("")})(e)},[g.ASSIGN]:e=>{let t=C.getExistingAssignees().map(n=>` ${Nn.bgHex(ce(n))(" "+n+" ")} `).slice(0,10);return En({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?J(Ne):ue({message:Le({wordList:t,noOfHints:100,inputString:e.inputString}),completionWordList:[]})},[g.SET_USERNAME]:e=>e.inputString?J():ue({message:`Enter a username. Saved in ${Nn.bgBlack("~/.epiqrc")}`,completionWordList:[]}),[g.SET_VIEW]:e=>_i({list:V(g.SET_VIEW),hint:Le({wordList:V(g.SET_VIEW),noOfHints:3,inputString:e.inputString})})(e),[g.SYNC]:()=>J(Ne)},Ir=Object.fromEntries(Object.entries(Ki).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:m}=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,[...m,...u]):{hint:"",hints:[],remainder:"",overlap:0}}};var Tr=e=>{let t=e.trimStart(),n=zi(t),r=(n[0]??"").trimStart().trimEnd(),o=(n[1]??"").trimStart().trimEnd(),i=qi(e),a=Ar(r)?r:null,d=a!==null,m=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=ji(t,a,x);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:i,hasCommand:m,command:a,isCommandKeyword:d,isLastWordCompleted:u,modifier:x,target:N,inputToMatch:i,inputString:A}},ji=(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},zi=e=>e?e.split(/\s+/):[],qi=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:he.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},In=new Set,Rr=()=>{for(let e of In)e()},Lr=e=>(In.add(e),()=>In.delete(e)),be=e=>{let n=e(j),r=Tr(n.value),o=n.cursorPosition===n.value.length;j={...n,commandMeta:wr(r,o)},Rr()},Lt=({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(),c(e,null)},Sn=e=>{be(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},An=e=>{be(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=()=>{be(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=()=>{be(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=>{be(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=()=>{be(e=>({...e,commandIsPending:!0}))},kr=({addToHistory:e=!0})=>{be(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),Gi()},Br=()=>{be(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=()=>{be(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},Gi=()=>H(()=>""),ge=()=>j,Pt=()=>{let[e,...t]=j.value.split(Mr);return t.join(Mr).trim()};var Xi=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",Yi=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",Ji=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",Ur=(e,t)=>{if(Yi(e,e.sequence))return"MoveCursorLeftOfWord";if(Ji(e,e.sequence))return"MoveCursorRightOfWord";if(Xi(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 Qi(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 Zi(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=ge();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=Qi(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 Zi(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 as}from"node:child_process";import ds from"node:os";import Kr from"node:path";import{ulid as cs}from"ulid";import{accessSync as es,copyFileSync as ts,existsSync as Dt,mkdirSync as $r,readdirSync as _r,readFileSync as ns,renameSync as rs,rmSync as os,statSync as Vr,unlinkSync as is,writeFileSync as ss}from"node:fs";import Ye from"node:path";var ie={writeToFile:(e,t)=>{try{let n=Ye.dirname(e);Dt(n)||$r(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);ss(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return ns(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=ie.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 Dt(e)&&Vr(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await es(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(Dt(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(!ie.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 ie.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return ie.dirExists(e)?_r(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{is(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{os(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&&Dt(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{rs(e,t)}catch(r){if(r?.code==="EXDEV"){ts(e,t),this.rmFile(e);return}throw r}}};function ls(){let{preferredEditor:e}=me(),t=[e,process.env.VISUAL,process.env.EDITOR,"vim","vi","nano"].filter(n=>!!n?.trim());return[...new Set(t)]}function ms(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function jr(e){let t=Kr.join(ds.tmpdir(),"epiq");ie.mkDir(t);let n=Kr.join(t,cs());ie.writeToFile(n,e??"");let r=ls();for(let o of r){let i=ms(o,n),a=as(i,{stdio:"inherit",shell:!0});if(!a.error&&a.status===0){let d=ie.readFile(n);if(d==null)return s("Unable to read edited file");let m=d.replace(/\r?\n$/,"");return c("Successfully edited",m)}}return s("Unable to open editor")}import{monotonicFactory as us,ulid as Ft}from"ulid";var kt=us(),zr=({name:e,parent:t,userId:n})=>{let r=kt(),o=kt(),i=kt(),a=kt();return[{id:Ft(),userId:n,action:"add.issue",payload:{id:r,parent:t,name:e}},{id:Ft(),userId:n,action:"add.field",payload:{id:o,parent:r,name:"Description",val:""}},{id:Ft(),userId:n,action:"add.field",payload:{id:i,parent:r,name:"Assignees"}},{id:Ft(),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 ps=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[Je,Bt]=ps;var P=(e,t)=>s(`${t.split(".").join(" ")+" failed, "+e.toLowerCase()}`),gs={"init.workspace":({action:e,payload:t})=>{let{id:n,name:r}=t,o=Y.workspace(n,r);Gr(o);let i=C.createNodeAtPosition(o);return l(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:n,name:r}=t,o=Y.workspace(n,r),i=C.createNodeAtPosition(o);return l(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:n,name:r,parent:o}=t,i=C.createNodeAtPosition(Y.board(n,r,o));return l(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:n,name:r,parent:o}=t,i=C.createNodeAtPosition(Y.swimlane(n,r,o));return l(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:n,name:r,parent:o}=t,i=C.createNodeAtPosition(Y.ticket(n,r,o));return l(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:n,name:r,parent:o,val:i}=t,a=C.createNodeAtPosition(Y.field(n,r,o,{value:i},r.includes("Description")?"vertical":"horizontal"));return l(a)?P(a.message??`Unable to create field: ${r}`,e):c("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):c("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):c("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):c("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):c("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):c("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):c("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):c("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):c("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(!We(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,navigate:!1});return l(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:n}=t,r=C.getNode(n);if(!r)return P("Unable to locate issue",e);if(!We(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 m=C.moveNode({id:n,parentId:a,navigate:!1});return l(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:n}=t,r=C.lockNode(n);return l(r)?P(r.message??"Unable to lock node",e):c("Node locked",{action:e,result:r.data})}},fs=(e,t)=>{let n=C.getNode(e);n&&C.updateNode({...n,log:[...n.log??[],t]})},ys=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=gs[e.action],r=n(e);if(l(r))return r;if(!t){let a=[...new Set(ys(e))];for(let d of a)fs(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 Wt from"node:fs";import He from"node:path";import{decodeTime as Es,monotonicFactory as Is}from"ulid";var Ot=process.env.IS_LOCAL==="true",fe=()=>".epiq";import Tn from"node:fs";import Mn from"node:path";var xs=fe(),vs="events",hs=(e=process.cwd())=>Mn.join(Ze(e),xs,vs),Cs=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"):c("Resolved persisted action",t[0])},Ns=e=>{let{userId:t,...n}=e,r=Cs(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 c("Decoded persisted event",{id:i,action:o,payload:a,userId:t})};function Xr(e=process.cwd()){let t=hs(e);if(!Tn.existsSync(t))return s("No events found");let n=Tn.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>Mn.join(t,o)),r=[];for(let o of n){let i=Tn.readFileSync(o,"utf8"),a=Mn.basename(o,".jsonl")||"unknown";for(let d of i.split(`
3
- `)){let m=d.trim();if(m)try{let u=JSON.parse(m);r.push({...u,userId:a})}catch{return s(`Failed to parse event from line: ${m}`)}}}return c("All events loaded",bs(r))}function Ut(e=process.cwd()){let t=Xr(e);if(l(t))return s(t.message);let n=[];for(let r of t.data){let o=Ns(r);if(l(o))return s(`Failed to decode event ${r.id?.[0]??"<unknown>"}: ${o.message}`);n.push(o.data)}return c("Loaded merged events",n)}function Yr(e=process.cwd()){let t=Xr(e);return l(t)?s(t.message):c("Loaded edge reference",t.data.at(-1)?.id?.[0]??null)}var bs=e=>{let t=new Map(e.map(d=>[d.id[0],d])),n=new Map;for(let d of e){let m=d.id[1],u=n.get(m)??[];u.push(d),n.set(m,u)}for(let d of n.values())d.sort((m,u)=>{let[f]=m.id,[x]=u.id;return f.localeCompare(x)});let r=[],o=new Set,i=d=>{let m=n.get(d)??[];for(let u of m){let[f]=u.id;o.has(f)||(o.add(f),r.push(u),i(f))}};i(null);let a=[...e].filter(d=>{let[m]=d.id;return!o.has(m)}).sort((d,m)=>{let[u,f]=d.id,[x,N]=m.id,A=f===null||t.has(f),S=N===null||t.has(N);if(A&&!S)return-1;if(!A&&S)return 1;let E=(f??"").localeCompare(N??"");return E!==0?E:u.localeCompare(x)});return[...r,...a]};var Jr=e=>({action:e.action,payload:e.payload});var Ss=1,Qr=Is(),As="events",Zr=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",Q=()=>{let{userName:e,userId:t}=me();if(!e)return s("User name not configured");if(!t)return s("User ID not configured");let n=`${Zr(t)}.${Zr(e)}`;return e.trim()?c("Successfully resolved actor ID",n):s("Unable to resolve actor ID from settings or OS user info")},ws=e=>Wt.existsSync(He.join(e,fe()))&&Wt.statSync(He.join(e,fe())).isDirectory(),Ze=(e=process.cwd())=>{let t=He.resolve(e);for(;;){if(ws(t))return t;let n=He.dirname(t);if(n===t)return He.resolve(e);t=n}},eo=(e=process.cwd())=>He.join(Ze(e),fe(),As),Rn=()=>{let e=Q();return l(e)||!e.data?s("Unable to resolve event log path"):c("Succeeded",`${e.data}.jsonl`)},Ts=(e=process.cwd())=>{let t=Rn();if(l(t))return s("Unable to resolve file name");let n=t.data;return/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(n)?c("Successfully resolved event log path",He.join(eo(e),n)):s(`Invalid event log file name: ${n}`)},Ms=(e,t)=>({[e.action]:e.payload,v:Ss,id:t});function to(e,t=process.cwd()){try{let n=Ze(t),r=eo(n),o=Ts(n);if(l(o))return o;Wt.mkdirSync(r,{recursive:!0});let i=Yr(n);if(l(i))return s(i.message);let a;if(i.data){let m=Es(i.data),u=Math.max(Date.now(),m+1);a=Qr(u)}else a=Qr();let d=Ms(Jr(e),[a,i.data]);return Wt.appendFileSync(o.data,`${JSON.stringify(d)}
4
- `,"utf8"),c("Event persisted",{path:o.data,entry:d})}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return s(`Failed to persist event: ${r}`)}}function Z(e){let t=Qe(e);if(t.result!==Ce.Success)return t;let n=to(e);return l(n)?n:t}function Ht(e){return e.map(t=>Z(t))}import{ulid as no}from"ulid";var et=null,$e=()=>structuredClone(et),tt=e=>et=e,ro=()=>{let{currentNode:e,selectedIndex:t}=h(),r=M(e.id)[t];return r?c("Resolved selected child",r):s("Target node not found")};function Ln(e){let t=ro();if(l(t))return t;let{currentNode:n,nodes:r}=h();if(!n.parentNodeId)return s("Missing parent node id");let o=r[n.parentNodeId];if(!o)return s("Missing parent node");let i=W(o.id),a=i.findIndex(({id:x})=>x===n.id);if(a<0)return s("Current node not found among siblings");let d=i[a+e];if(!d)return s("Missing sibling node");let m=Q();if(l(m))return s("Unable to resolve user ID");let u=m.data;if(tt({id:no(),userId:u,action:"move.node",payload:{id:t.data.id,parent:d.id,pos:{at:"end"}}}),!et)return s("Could not materialize move state");let f=Qe(et,!0);return l(f)?f:c("Node moved successfully",f.data)}function Pn(e){let t=ro();if(l(t))return t;let{currentNode:n,selectedIndex:r}=h(),i=W(n.id)[r+e];if(!i)return s("Missing sibling node");let a=Q();if(l(a))return s("Unable to resolve user ID");let d=a.data;if(tt({id:no(),userId:d,action:"move.node",payload:{id:t.data.id,parent:n.id,pos:{at:e===1?"after":"before",sibling:i.id}}}),!et)return s("Could not materialize move state");let m=Qe(et,!0);return l(m)?m:c("Node moved successfully",m.data)}import Rs from"node:os";import oo from"node:path";var Ls={userId:"",userName:"",preferredEditor:""},Ps=".epiq",Ds="config.json",io=()=>oo.join(Rs.homedir(),Ps),Dn=()=>oo.join(io(),Ds),Fn=()=>{try{return ie.mkDir(io()),c("Ensured ~/.epiq exists",null)}catch{return s("Unable to create ~/.epiq")}},Fs=e=>{try{let t=JSON.parse(e);return c("Parsed config",t??{})}catch{return s("Invalid ~/.epiq/config.json JSON")}},so=()=>{let e=Fn();if(l(e))return s(e.message);let t=Dn(),n=ie.readFile(t);return n==null||n.trim()===""?c("No config found, using empty config",{}):Fs(n)},ao=e=>{let t=Fn();if(l(t))return s(t.message);let n=Dn();try{return ie.writeToFile(n,JSON.stringify(e,null,2)+`
5
- `),c("Config written",null)}catch{return s("Unable to write ~/.epiq/config.json")}},kn=e=>{let t=so();if(l(t))return s("Failed to read existing config");let n={...t.data,...e};return ao(n)},co=()=>{let e=Dn(),t=Fn();if(l(t))throw new Error("Unable to create ~/.epiq");if(!(ie.readFile(e)!==null)){let d=ao(Ls);if(l(d))throw new Error("Unable to create ~/.epiq/config.json")}let r=so();if(l(r))throw new Error("Unable to load settings");let{preferredEditor:o,userName:i,userId:a}=r.data;return!i||!a?s("User name or ID not configured in ~/.epiq/config.json"):mt({preferredEditor:o,userName:i,userId:a})};var nt=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?c("Found node",n):s("Unable to find node in breadcrumb")};import{createHash as Us}from"node:crypto";import se from"node:fs";import Ws from"node:os";import te from"node:path";import ft from"fs";import mo from"path";import ks from"util";var lo=1e3,uo=(e=process.cwd())=>mo.join(Ze(e),fe(),"log","epiq.log");function Bs(e=process.cwd()){if(!Ot)return;let t=uo(e);if(!ft.existsSync(t))return;let r=ft.readFileSync(t,"utf8").split(`
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 c=d.trim();if(c)try{let u=JSON.parse(c);r.push({...u,userId:a})}catch{return s(`Failed to parse event from line: ${c}`)}}}return m("All events loaded",Ss(r))}function Wt(e=process.cwd()){let t=Xr(e);if(l(t))return s(t.message);let n=[];for(let r of t.data){let o=Is(r);if(l(o))return s(`Failed to decode event ${r.id?.[0]??"<unknown>"}: ${o.message}`);n.push(o.data)}return m("Loaded merged events",n)}function Yr(e=process.cwd()){let t=Xr(e);return l(t)?s(t.message):m("Loaded edge reference",t.data.at(-1)?.id?.[0]??null)}var Ss=e=>{let t=new Map(e.map(d=>[d.id[0],d])),n=new Map;for(let d of e){let c=d.id[1],u=n.get(c)??[];u.push(d),n.set(c,u)}for(let d of n.values())d.sort((c,u)=>{let[f]=c.id,[x]=u.id;return f.localeCompare(x)});let r=[],o=new Set,i=d=>{let c=n.get(d)??[];for(let u of c){let[f]=u.id;o.has(f)||(o.add(f),r.push(u),i(f))}};i(null);let a=[...e].filter(d=>{let[c]=d.id;return!o.has(c)}).sort((d,c)=>{let[u,f]=d.id,[x,N]=c.id,A=f===null||t.has(f),b=N===null||t.has(N);if(A&&!b)return-1;if(!A&&b)return 1;let I=(f??"").localeCompare(N??"");return I!==0?I:u.localeCompare(x)});return[...r,...a]};var Jr=e=>({action:e.action,payload:e.payload});var Ts=1,Qr=ws(),Ms="events",Zr=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",J=()=>{let{userName:e,userId:t}=le();if(!e)return s("User name not configured");if(!t)return s("User ID not configured");let n=`${Zr(t)}.${Zr(e)}`;return e.trim()?m("Successfully resolved actor ID",n):s("Unable to resolve actor ID from settings or OS user info")},Rs=e=>Ht.existsSync(_e.join(e,ge()))&&Ht.statSync(_e.join(e,ge())).isDirectory(),Ze=(e=process.cwd())=>{let t=_e.resolve(e);for(;;){if(Rs(t))return t;let n=_e.dirname(t);if(n===t)return _e.resolve(e);t=n}},eo=(e=process.cwd())=>_e.join(Ze(e),ge(),Ms),Dn=()=>{let e=J();return l(e)||!e.data?s("Unable to resolve event log path"):m("Succeeded",`${e.data}.jsonl`)},Ls=(e=process.cwd())=>{let t=Dn();if(l(t))return s("Unable to resolve file name");let n=t.data;return/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(n)?m("Successfully resolved event log path",_e.join(eo(e),n)):s(`Invalid event log file name: ${n}`)},Ps=(e,t)=>({[e.action]:e.payload,v:Ts,id:t});function to(e,t=process.cwd()){try{let n=Ze(t),r=eo(n),o=Ls(n);if(l(o))return o;Ht.mkdirSync(r,{recursive:!0});let i=Yr(n);if(l(i))return s(i.message);let a;if(i.data){let c=As(i.data),u=Math.max(Date.now(),c+1);a=Qr(u)}else a=Qr();let d=Ps(Jr(e),[a,i.data]);return Ht.appendFileSync(o.data,`${JSON.stringify(d)}
4
+ `,"utf8"),m("Event persisted",{path:o.data,entry:d})}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return s(`Failed to persist event: ${r}`)}}function Q(e){let t=Qe(e);if(t.result!==he.Success)return t;let n=to(e);return l(n)?n:t}function _t(e){return e.map(t=>Q(t))}import{ulid as no}from"ulid";var et=null,Pe=()=>structuredClone(et),tt=e=>et=e,ro=()=>{let{currentNode:e,selectedIndex:t}=h(),r=M(e.id)[t];return r?m("Resolved selected child",r):s("Target node not found")};function Fn(e){let t=ro();if(l(t))return t;let{currentNode:n,nodes:r}=h();if(!n.parentNodeId)return s("Missing parent node id");let o=r[n.parentNodeId];if(!o)return s("Missing parent node");let i=W(o.id),a=i.findIndex(({id:x})=>x===n.id);if(a<0)return s("Current node not found among siblings");let d=i[a+e];if(!d)return s("Missing sibling node");let c=J();if(l(c))return s("Unable to resolve user ID");let u=c.data;if(tt({id:no(),userId:u,action:"move.node",payload:{id:t.data.id,parent:d.id,pos:{at:"end"}}}),!et)return s("Could not materialize move state");let f=Qe(et,!0);return l(f)?f:m("Node moved successfully",f.data)}function kn(e){let t=ro();if(l(t))return t;let{currentNode:n,selectedIndex:r}=h(),i=W(n.id)[r+e];if(!i)return s("Missing sibling node");let a=J();if(l(a))return s("Unable to resolve user ID");let d=a.data;if(tt({id:no(),userId:d,action:"move.node",payload:{id:t.data.id,parent:n.id,pos:{at:e===1?"after":"before",sibling:i.id}}}),!et)return s("Could not materialize move state");let c=Qe(et,!0);return l(c)?c:m("Node moved successfully",c.data)}import Ds from"node:os";import oo from"node:path";var Fs={userId:"",userName:"",preferredEditor:""},ks=".epiq",Bs="config.json",io=()=>oo.join(Ds.homedir(),ks),Bn=()=>oo.join(io(),Bs),On=()=>{try{return re.mkDir(io()),m("Ensured ~/.epiq exists",null)}catch{return s("Unable to create ~/.epiq")}},Os=e=>{try{let t=JSON.parse(e);return m("Parsed config",t??{})}catch{return s("Invalid ~/.epiq/config.json JSON")}},so=()=>{let e=On();if(l(e))return s(e.message);let t=Bn(),n=re.readFile(t);return n==null||n.trim()===""?m("No config found, using empty config",{}):Os(n)},ao=e=>{let t=On();if(l(t))return s(t.message);let n=Bn();try{return re.writeToFile(n,JSON.stringify(e,null,2)+`
5
+ `),m("Config written",null)}catch{return s("Unable to write ~/.epiq/config.json")}},Un=e=>{let t=so();if(l(t))return s("Failed to read existing config");let n={...t.data,...e};return ao(n)},co=()=>{let e=Bn(),t=On();if(l(t))throw new Error("Unable to create ~/.epiq");if(!(re.readFile(e)!==null)){let d=ao(Fs);if(l(d))throw new Error("Unable to create ~/.epiq/config.json")}let r=so();if(l(r))throw new Error("Unable to load settings");let{preferredEditor:o,userName:i,userId:a}=r.data;return!i||!a?s("User name or ID not configured in ~/.epiq/config.json"):mt({preferredEditor:o,userName:i,userId:a})};var nt=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?m("Found node",n):s("Unable to find node in breadcrumb")};import{createHash as _s}from"node:crypto";import oe from"node:fs";import $s from"node:os";import Z from"node:path";import ft from"fs";import mo from"path";import Us from"util";var lo=1e3,uo=(e=process.cwd())=>mo.join(Ze(e),ge(),"log","epiq.log");function Ws(e=process.cwd()){if(!Ut)return;let t=uo(e);if(!ft.existsSync(t))return;let r=ft.readFileSync(t,"utf8").split(`
6
6
  `);if(r[r.length-1]===""&&r.pop(),r.length<=lo)return;let o=r.slice(-lo).join(`
7
7
  `)+`
8
- `;ft.writeFileSync(t,o,"utf8")}function Bn(e,t,n=!1,r=process.cwd()){if(!Ot)return;let o=uo(r),i=ks.format(...t),a=new Date,m=`[${n?a.toISOString().slice(11,19):a.toISOString()}] ${e} ${i}
9
- `;ft.mkdirSync(mo.dirname(o),{recursive:!0}),ft.appendFileSync(o,m,"utf8"),Bs(r)}var I={info(...e){Bn("[Info]",e,!1)},debug(...e){Bn("->",e,!0)},error(...e){Bn("[Error]",[...e,new Error().stack],!1)}};globalThis.logger=I;import{spawn as po}from"node:child_process";import On from"node:fs";import ee from"node:path";var Ee=(e,t)=>{let n=new Map,r=t??((...i)=>JSON.stringify(i)),o=((...i)=>{let a=r(...i);if(!n.has(a)){let d=e(...i).then(m=>(l(m)&&n.delete(a),m));n.set(a,d)}return n.get(a)});return o.clear=()=>n.clear(),o};var B=({args:e,cwd:t})=>new Promise(n=>{if(!On.existsSync(t))return n(s(`Git cwd does not exist: ${t}`));let r=po("git",e,{cwd:t,stdio:["ignore","pipe","pipe"]}),o="",i="";r.stdout.setEncoding("utf8"),r.stderr.setEncoding("utf8"),r.stdout.on("data",a=>{o+=a}),r.stderr.on("data",a=>{i+=a}),r.on("error",a=>{n(s([`git ${e.join(" ")}`,`cwd=${t}`,a.message].join(`
8
+ `;ft.writeFileSync(t,o,"utf8")}function Wn(e,t,n=!1,r=process.cwd()){if(!Ut)return;let o=uo(r),i=Us.format(...t),a=new Date,c=`[${n?a.toISOString().slice(11,19):a.toISOString()}] ${e} ${i}
9
+ `;ft.mkdirSync(mo.dirname(o),{recursive:!0}),ft.appendFileSync(o,c,"utf8"),Ws(r)}var S={info(...e){Wn("[Info]",e,!1)},debug(...e){Wn("->",e,!0)},error(...e){Wn("[Error]",[...e,new Error().stack],!1)}};globalThis.logger=S;import{spawn as go}from"node:child_process";import $t from"node:fs";import De from"node:path";var yt=(e,t)=>{let n=new Map,r=t??((...i)=>JSON.stringify(i)),o=((...i)=>{let a=r(...i);if(!n.has(a)){let d=e(...i).then(c=>(l(c)&&n.delete(a),c));n.set(a,d)}return n.get(a)});return o.clear=()=>n.clear(),o};var k=({args:e,cwd:t})=>new Promise(n=>{if(!$t.existsSync(t))return n(s(`Git cwd does not exist: ${t}`));let r=go("git",e,{cwd:t,stdio:["ignore","pipe","pipe"]}),o="",i="";r.stdout.setEncoding("utf8"),r.stderr.setEncoding("utf8"),r.stdout.on("data",a=>{o+=a}),r.stderr.on("data",a=>{i+=a}),r.on("error",a=>{n(s([`git ${e.join(" ")}`,`cwd=${t}`,a.message].join(`
10
10
  `)))}),r.on("close",a=>{let d=a??1;if(d!==0){n(s([`git ${e.join(" ")}`,i.trim()||o.trim()||"Git command failed"].filter(Boolean).join(`
11
- `)));return}n(c("Git command succeeded",{stdout:o,stderr:i,exitCode:d}))})}),_e=({args:e,cwd:t})=>new Promise(n=>{if(!On.existsSync(t))return n({stdout:"",stderr:`Git cwd does not exist: ${t}`,exitCode:1});let r=po("git",e,{cwd:t,stdio:["ignore","pipe","pipe"]}),o="",i="";r.stdout.setEncoding("utf8"),r.stderr.setEncoding("utf8"),r.stdout.on("data",a=>{o+=a}),r.stderr.on("data",a=>{i+=a}),r.on("error",a=>{n({stdout:o,stderr:a.message,exitCode:1})}),r.on("close",a=>{n({stdout:o,stderr:i,exitCode:a??1})})}),Un=Ee(async(e=process.cwd())=>{let t=await B({args:["rev-parse","--show-toplevel"],cwd:e});return l(t)?s("Not inside a Git repository"):t.data?c("Resolved repo root",t.data.stdout.trim()):s("Git command returned no repo root")},e=>ee.resolve(e)),Os=Ee(async e=>{let t=await B({args:["rev-parse","--git-dir"],cwd:e});if(l(t))return s(t.message);if(!t.data)return s("Git command returned no git dir");let n=t.data.stdout.trim(),r=ee.isAbsolute(n)?n:ee.join(e,n);return c("Resolved git dir",r)},e=>ee.resolve(e)),go=async({cwd:e,message:t})=>{let n=await B({args:["commit","-m",t],cwd:e});if(l(n))return s(`Failed to create commit
12
- ${n.message}`);let r=await B({args:["rev-parse","HEAD"],cwd:e});return l(r)?s(`Commit created, but failed to read HEAD SHA
13
- ${r.message}`):c("Created commit and resolved SHA",r.data.stdout.trim())},yt=async e=>{let t=await Os(e);if(l(t))return s(t.message);if(!t.data)return s("Git dir result missing data");let n=t.data,o=["MERGE_HEAD","CHERRY_PICK_HEAD","REVERT_HEAD","REBASE_HEAD",ee.join("rebase-merge"),ee.join("rebase-apply")].filter(i=>On.existsSync(ee.join(n,i)));return c("Checked for in-progress Git operation",o.length>0)},$t=Ee(async({repoRoot:e,remote:t})=>{let n=await _e({args:["remote","get-url",t],cwd:e});return c("Checked remote",n.exitCode===0)},({repoRoot:e,remote:t})=>`${ee.resolve(e)}::${t}`),_t=async({repoRoot:e,remote:t,branch:n})=>{let r=await _e({args:["ls-remote","--heads",t,n],cwd:e});return r.exitCode!==0?s(r.stderr.trim()||`Unable to inspect remote branch ${t}/${n}`):c("Checked remote branch",r.stdout.trim().length>0)},fo=Ee(async({repoRoot:e,branch:t})=>{let n=await _e({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?c("Local branch exists",!0):n.exitCode===1?c("Local branch missing",!1):s(n.stderr.trim()||`Unable to inspect branch ${t}`)},({repoRoot:e,branch:t})=>`${ee.resolve(e)}::${t}`),Wn=Ee(async({repoRoot:e,worktreeRoot:t})=>{let n=await B({args:["worktree","list","--porcelain"],cwd:e});if(l(n))return s(n.message);if(!n.data)return s("Git command returned no worktree data");let r=ee.resolve(t),o=n.data.stdout.split(`
14
- `).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(i=>ee.resolve(i)).includes(r);return c("Checked worktree registration",o)},({repoRoot:e,worktreeRoot:t})=>`${ee.resolve(e)}::${ee.resolve(t)}`),Hn=Ee(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)},e=>ee.resolve(e)),$n=async e=>{let t=await B({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return l(t)?s(t.message):t.data?c("Resolved current branch",t.data.stdout.trim()):s("Git command returned no branch name")},yo=async e=>{let t=await B({args:["rev-parse","--short","HEAD"],cwd:e});return l(t)?s(t.message):t.data?c("Resolved short HEAD sha",t.data.stdout.trim()):s("Git command returned no short sha")},xo=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),Vt=async({cwd:e,remote:t,branch:n})=>{let r=await Hn(e);if(l(r))return s(r.message);if(!r.data)return c("No upstream configured, skipped pull",!1);let o=await _t({repoRoot:e,remote:t,branch:n});if(l(o))return s(o.message);if(!o.data)return c("Remote branch missing, skipped pull",!1);let i=await B({args:["fetch",t,n],cwd:e});if(l(i))return s(`Failed to fetch ${n}
15
- ${i.message}`);if(!i.data)return s("Git command returned no fetch result data");let a=await B({args:["pull","--rebase"],cwd:e});return l(a)?s(`Failed during pull --rebase
16
- ${a.message}`):a.data?c("Pulled with rebase",!0):s("Git command returned no pull result data")};import rt from"node:fs";var _n=(e,t)=>{if(!rt.existsSync(e)||!rt.existsSync(t))return!1;let n=rt.statSync(e),r=rt.statSync(t);if(n.size!==r.size)return!1;let o=rt.readFileSync(e),i=rt.readFileSync(t);return o.equals(i)};var bo=fe(),Eo="events",F="epiq-state-5",G="origin",Hs=e=>te.join(bo,Eo,e),$s=e=>Us("sha1").update(e).digest("hex").slice(0,12),Io=()=>te.join(Ws.homedir(),".epiq"),So=()=>te.join(Io(),"worktrees"),Ao=e=>te.join(So(),$s(e)),_s=e=>te.join(e,bo),ot=e=>te.join(_s(e),Eo),vo=({root:e,fileName:t})=>te.join(ot(e),t),Kt=e=>(I.debug("[sync] ensure dir",e),se.mkdirSync(e,{recursive:!0}),c("Ensured directory",void 0)),Vs=()=>{I.debug("[sync] ensure epiq storage");let e=Kt(Io());if(l(e))return s(e.message);let t=Kt(So());return l(t)?s(t.message):c("Ensured epiq storage",void 0)},Ks=e=>{se.existsSync(e)&&(I.debug("[sync] remove path",e),se.rmSync(e,{recursive:!0,force:!0}))},js=e=>{let t=ot(e);if(!se.existsSync(t))return I.debug("[sync] events dir missing",t),c("Events dir missing",[]);let n=se.readdirSync(t,{withFileTypes:!0}).filter(r=>r.isFile()).map(r=>r.name).filter(r=>r.endsWith(".jsonl")).sort();return I.debug("[sync] listed event files",{eventsDir:t,count:n.length}),c("Listed event files",n)},zs=async e=>{I.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")},qs=Ee(async e=>{I.debug("[sync] inspect remote history",{repoRoot:e,remote:G});let t=await $t({repoRoot:e,remote:G});if(l(t))return s(t.message);if(!t.data)return c("No remote configured",!1);let n=await _e({args:["ls-remote","--heads",G],cwd:e});if(n.exitCode!==0)return s(n.stderr.trim()||"Unable to inspect remote heads");let r=n.stdout.trim().length>0;return I.debug("[sync] remote history",r),c("Checked remote history",r)},e=>te.resolve(e)),wo=async e=>{I.debug("[sync] ensure initial commit");let t=await zs(e);if(l(t))return s(t.message);if(t.data)return I.debug("[sync] local HEAD exists"),c("Repo already initialized",!1);let n=await qs(e);if(l(n))return s(n.message);if(n.data)return I.debug("[sync] skip local init commit due to remote history"),c("Skipped local init commit because remote history exists",!1);I.debug("[sync] create empty init commit");let r=await B({args:["commit","--allow-empty","-m","[epiq:init]"],cwd:e});return l(r)?s(`Failed to create initial commit
17
- ${r.message}`):c("Created initial commit",!0)},Gs=({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=vo({root:e,fileName:n}),o=vo({root:t,fileName:n});return se.existsSync(r)?_n(r,o)?(I.debug("[sync] own event file already matches remote",n),c("Own event file already matches remote worktree",!1)):(I.debug("[sync] copy own event file to remote",n),se.mkdirSync(te.dirname(o),{recursive:!0}),se.copyFileSync(r,o),c("Copied own event file into remote worktree",!0)):(I.debug("[sync] local own event file missing",r),c("Local own event file missing, nothing to copy",!1))},To=({repoRoot:e,worktreeRoot:t,skipFileNames:n=[]})=>{let r=js(t);if(l(r))return s(r.message);let o=ot(t),i=ot(e),a=new Set(n),d=!1;for(let m of r.data){if(a.has(m)){I.debug("[sync] skip hydrate for file",m);continue}let u=te.join(o,m),f=te.join(i,m);_n(u,f)||(I.debug("[sync] hydrate remote file",m),se.mkdirSync(te.dirname(f),{recursive:!0}),se.copyFileSync(u,f),d=!0)}return I.debug("[sync] hydrate changed",d),c("Hydrated event files from remote worktree",d)},ho=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",Xs=async e=>{let t=await $n(e);if(l(t))return s(t.message);let n=await yo(e);if(l(n))return s(n.message);let r=`[epiq:sync:${ho(t.data)}:${ho(n.data)}]`;return I.debug("[sync] commit message",r),c("Built sync commit message",r)},Ys=async({repoRoot:e})=>{I.debug("[sync] ensure local remote branch",F);let t=await fo({repoRoot:e,branch:F});if(l(t))return s(t.message);if(t.data)return I.debug("[sync] local remote branch exists"),c("Local remote branch already exists",!1);let n=await $t({repoRoot:e,remote:G});if(l(n))return s(n.message);if(n.data){let o=await _t({repoRoot:e,remote:G,branch:F});if(l(o))return s(o.message);if(o.data){I.debug("[sync] fetch remote branch before local track");let i=await B({args:["fetch",G,F],cwd:e});if(l(i))return s(`Failed to fetch ${F} from remote
18
- ${i.message}`);I.debug("[sync] create local tracking branch",F);let a=await B({args:["branch","--track",F,`${G}/${F}`],cwd:e});return l(a)?s(`Failed to create local ${F} from remote
19
- ${a.message}`):c("Created local remote branch from remote",!0)}}I.debug("[sync] create local remote branch from HEAD",F);let r=await B({args:["branch",F,"HEAD"],cwd:e});return l(r)?s(`Failed to create local ${F}
20
- ${r.message}`):c("Created local remote branch",!0)},Js=async({repoRoot:e,worktreeRoot:t})=>{I.debug("[sync] create remote worktree",t);let n=Kt(te.dirname(t));if(l(n))return s(n.message);se.existsSync(t)&&!se.existsSync(te.join(t,".git"))&&(I.debug("[sync] remove broken remote worktree path",t),Ks(t));let r=await B({args:["worktree","add",t,F],cwd:e});return l(r)?s(`Failed to create remote worktree
21
- ${r.message}`):c("Created remote worktree",!0)},Qs=async({repoRoot:e,worktreeRoot:t})=>{I.debug("[sync] ensure remote worktree",t);let n=await Wn({repoRoot:e,worktreeRoot:t});if(l(n))return s(n.message);let r=se.existsSync(t);if(n.data&&r)return I.debug("[sync] remote worktree exists"),c("Remote worktree already exists",!1);if(n.data&&!r){I.debug("[sync] prune stale remote worktree registration");let o=await B({args:["worktree","prune"],cwd:e});if(l(o))return s(`Failed to prune stale worktrees
22
- ${o.message}`);let i=await Wn({repoRoot:e,worktreeRoot:t});if(l(i))return s(i.message);if(i.data){I.debug("[sync] remove stale remote worktree registration");let a=await B({args:["worktree","remove","--force",t],cwd:e});if(l(a))return s(`Failed to remove stale worktree registration
23
- ${a.message}`)}}return Js({repoRoot:e,worktreeRoot:t})},Zs=async e=>{let t=await $n(e);if(l(t))return s(t.message);if(t.data===F)return I.debug("[sync] remote branch already checked out"),c("Remote branch already checked out",!1);I.debug("[sync] checkout remote branch",F);let n=await B({args:["checkout",F],cwd:e});return l(n)?s(`Failed to checkout ${F}
24
- ${n.message}`):c("Checked out remote branch",!0)},ea=async e=>{I.debug("[sync] ensure remote upstream",F);let t=await Hn(e);if(l(t))return s(t.message);if(t.data)return I.debug("[sync] remote upstream already configured"),c("Remote upstream already configured",!1);let n=await $t({repoRoot:e,remote:G});if(l(n))return s(n.message);if(!n.data)return I.debug("[sync] no remote configured for upstream"),c("No remote available for upstream",!1);let r=await _t({repoRoot:e,remote:G,branch:F});if(l(r))return s(r.message);if(r.data){I.debug("[sync] fetch remote branch before upstream set");let i=await B({args:["fetch",G,F],cwd:e});if(l(i))return s(`Failed to fetch ${F}
25
- ${i.message}`);I.debug("[sync] set upstream to remote branch");let a=await B({args:["branch","--set-upstream-to",`${G}/${F}`,F],cwd:e});return l(a)?s(`Failed to set remote upstream
26
- ${a.message}`):c("Configured remote upstream",!0)}I.debug("[sync] publish remote branch and set upstream");let o=await B({args:["push","-u",G,F],cwd:e});return l(o)?s(`Failed to publish remote branch
27
- ${o.message}`):c("Published remote branch and configured upstream",!0)},ta=async({worktreeRoot:e,ownEventFileName:t})=>{I.debug("[sync] stage own event file in remote worktree",t);let n=await B({args:["add",Hs(t)],cwd:e});return l(n)?s(`Failed to stage remote own event file
28
- ${n.message}`):c("Staged remote own event file",void 0)},na=async({repoRoot:e,worktreeRoot:t})=>{let n=await Xs(e);return l(n)?s(n.message):(I.debug("[sync] create remote sync commit"),go({cwd:t,message:n.data}))},Co=async e=>{I.debug("[sync] push remote worktree");let t=await B({args:["push"],cwd:e});return l(t)?s(`Failed during remote push
29
- ${t.message}`):c("Pushed remote",!0)},Mo=async({repoRoot:e,worktreeRoot:t,ensureUpstream:n})=>{I.debug("[sync] bootstrap remote storage",{repoRoot:e,worktreeRoot:t,ensureUpstream:n});let r=!1;for(let o of[Vs(),await Ys({repoRoot:e}),await Qs({repoRoot:e,worktreeRoot:t}),await Zs(t),n?await ea(t):c("Skipped remote upstream bootstrap",!1)]){if(l(o))return s(o.message);r=r||!!o.data}return I.debug("[sync] bootstrap changed",r),c(n?"Bootstrapped remote storage":"Bootstrapped remote storage (readonly)",r)},Ro=(e,t)=>{for(let n of[ot(e),ot(t)]){let r=Kt(n);if(l(r))return s(r.message)}return c("Ensured remote layout",void 0)},No=async({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=Gs({repoRoot:e,worktreeRoot:t,ownEventFileName:n});if(l(r))return s(r.message);if(!r.data)return c("Own event file already up to date in remote worktree",{createdCommit:!1});let o=await ta({worktreeRoot:t,ownEventFileName:n});if(l(o))return s(o.message);let i=await na({repoRoot:e,worktreeRoot:t});return l(i)?s(i.message):c("Copied, staged, and committed own event file",{createdCommit:!0,commitSha:i.data})},Lo=async({cwd:e=process.cwd(),ownEventFileName:t})=>{I.debug("[sync] start write sync",{cwd:e,ownEventFileName:t});let n=await Un(e);if(l(n))return s(n.message);let r=n.data,o=Ao(r);if(I.debug("[sync] resolved roots",{repoRoot:r,worktreeRoot:o}),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 i=await yt(r);if(l(i))return s(i.message);if(i.data)return s("Cannot run :sync while a merge, rebase, cherry-pick, or revert is in progress in the current repo");let a=await wo(r);if(l(a))return s(a.message);I.debug("[sync] ensure initial commit changed",a.data);let d=await Mo({repoRoot:r,worktreeRoot:o,ensureUpstream:!0});if(l(d))return s(d.message);let m=await yt(o);if(l(m))return s(m.message);if(m.data)return s("Cannot run :sync while a merge, rebase, cherry-pick, or revert is in progress in the remote worktree");let u=Ro(r,o);if(l(u))return s(u.message);let f=!1,x,N=!1,A=!1,S=!1;I.debug("[sync] pull remote branch before local copy");let E=await Vt({cwd:o,remote:G,branch:F});if(l(E))return s(E.message);N=E.data,I.debug("[sync] pulled remote",N);let b=To({repoRoot:r,worktreeRoot:o,skipFileNames:[t]});if(l(b))return s(b.message);S=b.data,I.debug("[sync] hydrated from remote",S);let w=await No({repoRoot:r,worktreeRoot:o,ownEventFileName:t});if(l(w))return s(w.message);f=w.data.createdCommit,x=w.data.commitSha,I.debug("[sync] sync own file result",w.data);let O=await Co(o),z=O;if(l(O)&&xo(O.message)){let q=await Vt({cwd:o,remote:G,branch:F});if(l(q))return s(q.message);let Ue=await No({repoRoot:r,worktreeRoot:o,ownEventFileName:t});if(l(Ue))return s(Ue.message);if(Ue.data.createdCommit&&(f=!0,x=Ue.data.commitSha),I.debug("[sync] retry sync own file result",Ue.data),z=await Co(o),l(z))return s(z.message)}if(l(z))return s(z.message);if(A=z.data,I.debug("[sync] pushed remote",A),f){let q=await B({args:["rev-parse","HEAD"],cwd:o});if(l(q))return s(q.message);x=q.data.stdout.trim()}return c("Synced event logs with remote",{repoRoot:r,worktreeRoot:o,createdCommit:f,commitSha:x,pulled:N,pushed:A,hydrated:S,bootstrapped:d.data})},Po=async(e=process.cwd())=>{I.debug("[sync] start readonly sync",{cwd:e});let t=await Un(e);if(l(t))return s(t.message);let n=t.data,r=Ao(n);I.debug("[sync] resolved readonly roots",{repoRoot:n,worktreeRoot:r});let o=await yt(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 wo(n);if(l(i))return s(i.message);I.debug("[sync] readonly ensure initial commit changed",i.data);let a=await Mo({repoRoot:n,worktreeRoot:r,ensureUpstream:!1});if(l(a))return s(a.message);let d=await yt(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 m=Ro(n,r);if(l(m))return s(m.message);I.debug("[sync] readonly pull remote branch");let u=await Vt({cwd:r,remote:G,branch:F});if(l(u))return s(u.message);I.debug("[sync] readonly pulled remote",u.data);let f=To({repoRoot:n,worktreeRoot:r});return l(f)?s(f.message):(I.debug("[sync] readonly hydrated from remote",f.data),c("Synced from remote",{repoRoot:n,worktreeRoot:r}))};var ra=e=>Object.values(h().tags).find(t=>t.name===e),oa=e=>Object.values(h().contributors).find(t=>t.name===e),Do=[{systemOnly:!0,intent:R.Move,mode:p.COMMAND_LINE,action:()=>{let e=Q();if(l(e))return s("Unable to resolve user ID");let t=e.data,{modifier:n}=ge().commandMeta,{currentNode:r,selectedIndex:o}=h(),i=M(r.id)[o];if(!i)return T({mode:p.DEFAULT}),s("No move target");if(n==="start"){if(i.readonly)return s("Target node is read-only");if(o===-1)return s("No item selected");if(!i.parentNodeId)return s("Target has no parent");let a=M(i.parentNodeId),d=a.findIndex(({id:x})=>x===i.id);if(d===-1)return s("Target not found among siblings");let m=a[d-1],u=a[d+1],f=u!=null?{at:"before",sibling:u.id}:m!=null?{at:"after",sibling:m.id}:{at:"start"};return tt({id:$(),userId:t,action:"move.node",payload:{id:i.id,parent:i.parentNodeId,pos:f}}),T({mode:p.MOVE}),c("Move initialized",null)}if(n==="next")return T({mode:p.MOVE}),Pn(1);if(n==="previous")return T({mode:p.MOVE}),Pn(-1);if(n==="to-next")return T({mode:p.MOVE}),Ln(1);if(n==="to-previous")return T({mode:p.MOVE}),Ln(-1);if(n==="confirm"){T({mode:p.DEFAULT});let a=$e();if(!a)return s("No pending move to confirm");let d=Z(a);return l(d)?d:(tt(null),c("Moved item",null))}return n==="cancel"?(tt(null),T({mode:p.DEFAULT}),c("Cancelling move",null)):s("Invalid move modifier")}},{intent:R.Delete,mode:p.COMMAND_LINE,action:()=>{let e=Q();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?Z({id:$(),userId:t,action:"delete.node",payload:{id:o.id}}):s("Unable to resolve child to delete")},onSuccess:()=>T({mode:p.DEFAULT})},{intent:R.Edit,mode:p.COMMAND_LINE,action:()=>{let e=Q();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 m=d.props.value;if(typeof m!="string")return s("Selected field is not editable text");let u=jr(m);if(l(u))return s("Failed to edit field");let f=u.data;return f===m?c("No changes made",null):d.title==="Description"?Z({id:$(),userId:t,action:"edit.description",payload:{id:d.id,md:f}}):d.title==="Title"?Z({id:$(),userId:t,action:"edit.title",payload:{id:d.id,name:f}}):s(`Editing not supported for "${d.title}"`)},onSuccess:()=>T({mode:p.DEFAULT})},{intent:R.Filter,mode:p.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=ge().commandMeta,n=/(!=|=)/,[r,o]=e.split(n);if(!r||!(d=>V(g.FILTER).map(m=>m.split(n)[0]).includes(d))(r))return s("Invalid filter modifier");let a={target:r,operator:"=",value:t.trim()};return de(d=>({...d,filters:e==="clear"?[]:[...d.filters,a],mode:p.DEFAULT})),c("Viewing help",null)}},{intent:R.ViewHelp,mode:p.COMMAND_LINE,action:()=>(T({mode:p.HELP}),c("Viewing help",null))},{intent:R.CloseIssue,mode:p.COMMAND_LINE,action:()=>{let e=Q();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(!We(o))return s("Cannot close in this context");let i=Z({id:$(),userId:t,action:"close.issue",payload:{id:o.id,parent:o.parentNodeId}});return l(i)?i:c("Viewing help",null)}},{intent:R.ReopenIssue,mode:p.COMMAND_LINE,action:()=>{let e=Q();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"?c("Resolved ticket",o):qe(o.id,"TICKET");if(l(i))return s("Cannot reopen in this context");let a=i.data,d=Z({id:$(),userId:t,action:"reopen.issue",payload:{id:a.id}});return l(d)?d:c("Issue reopened",null)},onSuccess:()=>T({mode:p.DEFAULT})},{intent:R.SetUserName,mode:p.COMMAND_LINE,action:()=>{let{userId:e,preferredEditor:t,userName:n}=me(),r=Pt()?.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=kn({userName:o,userId:i,preferredEditor:t??""});return l(a)?a:(mt({userName:o,userId:i}),T({mode:p.DEFAULT}),c(`Username set to "${r}"`,null))}},{intent:R.Init,mode:p.COMMAND_LINE,action:()=>{let e=Fo();if(l(e))return e;let{rootNodeId:t,nodes:n}=h();return k.navigate({currentNode:n[t],selectedIndex:0}),c("Project initialized",null)}},{intent:R.SetEditor,mode:p.COMMAND_LINE,action:()=>{let e=Pt()?.trim();if(!e)return s("No editor provided");let t=kn({preferredEditor:e});return l(t)?t:(mt({preferredEditor:e}),T({mode:p.DEFAULT}),c(`Editor configuration set to "${e}"`,null))}},{intent:R.NewItem,mode:p.COMMAND_LINE,action:(e,t)=>{let n=Q();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=m=>{let u=Z(m);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?(k.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:m}=h(),u=C.getNode(m);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 m=nt(o,"BOARD");return l(m)?s("Unable to add swimlane in this context"):d({id:$(),userId:r,action:"add.swimlane",payload:{id:$(),name:t.inputString,parent:m.data.id}})}if(t.modifier==="issue"){let m=M(i.id)[a],u=i.context==="SWIMLANE"?i:i.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let S=nt(o,"SWIMLANE");return l(S)?null:S.data})();if(!u)return s("Unable to add issue in this context");let f=zr({userId:r,name:t.inputString,parent:u.id}),x=Ht(f);if(x.some(S=>l(S)))return s("Issue create failed: "+x.filter(l).map(S=>S.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?(k.navigate({currentNode:u,selectedIndex:C.getSiblings(u.id).findIndex(({id:S})=>S===A)}),c("Issue created",null)):s("Unable to determine ticket id")}return mr()},onSuccess:()=>T({mode:p.DEFAULT})},{intent:R.SetView,mode:p.COMMAND_LINE,action:()=>{let{commandMeta:e}=ge();return e.validity===he.Invalid?s("Invalid command "+Ce):(de(t=>({...t,viewMode:e.modifier==="wide"?"wide":e.modifier==="dense"?"dense":t.viewMode})),c("View set",null))},onSuccess:()=>T({mode:p.DEFAULT})},{intent:R.Rename,mode:p.COMMAND_LINE,action:()=>{let e=Q();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=Pt();return i?Z({id:$(),userId:t,action:"edit.title",payload:{id:o.id,name:i}}):s("Provide a new name")},onSuccess:()=>T({mode:p.DEFAULT})},{intent:R.TagTicket,mode:p.COMMAND_LINE,action:()=>{let e=Q();if(l(e))return s("Unable to resolve user ID");let t=e.data,{modifier:n,inputString:r}=ge().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 m=qe(d.id,"TICKET");if(l(m))return s("Unable to tag issue in this context");let u=m.data,f=ra(o),x;if(f)x=f.id;else{let S=$(),E=Z({id:$(),userId:t,action:"create.tag",payload:{id:S,name:o}});if(l(E))return E;x=E.data.result.id}let N=C.getFieldByTitle(u.id,"Tags");return N?M(N.id).some(S=>S.props?.value===x)?s("Already tagged with that tag"):Z({id:$(),userId:t,action:"tag.issue",payload:{id:$(),target:u.id,tagId:x}}):s("Unable to locate tags field")},onSuccess:()=>T({mode:p.DEFAULT})},{intent:R.AssignUserToTicket,mode:p.COMMAND_LINE,action:()=>{let e=Q();if(l(e))return s("Unable to resolve user ID");let t=e.data,{modifier:n,inputString:r}=ge().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 m=qe(d.id,"TICKET");if(l(m))return s("Unable to assign issue in this context");let u=m.data,f=oa(o),x;if(f)x=f.id;else{let S=$(),E=Z({id:$(),userId:t,action:"create.contributor",payload:{id:S,name:o}});if(l(E))return E;x=E.data.result.id}let N=C.getFieldByTitle(u.id,"Assignees");return N?M(N.id).some(S=>S.props?.value===x)?s("Assignee already assigned"):Z({id:$(),userId:t,action:"assign.issue",payload:{id:$(),target:u.id,contributor:x}}):s("Unable to locate assignees field")},onSuccess:()=>T({mode:p.DEFAULT})},{intent:R.Sync,mode:p.COMMAND_LINE,action:async()=>{H(()=>""),T({syncStatus:{msg:"Syncing",status:"syncing"}});let{userId:e,userName:t}=me();if(!e)return s("Unable to resolve userId");if(!t)return s("Unable to resolve userName");let n=Rn();if(l(n))return s("Unable to resolve log file name");let r=await Lo({ownEventFileName:n.data});if(l(r))return T({syncStatus:{msg:r.message,status:"outOfSync"}}),s(`Unable to sync state. ${r.message}`);T({syncStatus:{msg:"Synced",status:"synced"},mode:p.DEFAULT});let o=Ut();return l(o)?s("Unable to load events"):(gt(o.data),c("Synced",!0))}}];var ae=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=ge();if(!t)return s("No command to confirm");if(!e&&n===he.Invalid)return s("Invalid command");let i=Hr(t);Fr();let a=Do.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===i);if(!a)return Lt({result:Ce.Fail,message:"Command not found",data:null});let d=await a.action(a,{command:t,inputString:o,modifier:r});return l(d)?Lt(d):(kr({addToHistory:!e}),a.onSuccess?.(),Lt(d))};var jt=[{intent:"exit",mode:p.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(T({mode:p.COMMAND_LINE}),H(()=>"move cancel"),ae({isForceExecutedBySystem:!0}))},{intent:"initMove",mode:p.DEFAULT,description:"[m] move init/confirm",action:()=>(T({mode:p.COMMAND_LINE}),H(()=>"move start"),ae({isForceExecutedBySystem:!0}))},{intent:"confirmMove",mode:p.MOVE,action:()=>(T({mode:p.COMMAND_LINE}),H(()=>"move confirm"),ae({isForceExecutedBySystem:!0}))}],zt=[{intent:"movePreviousItem",mode:p.MOVE,action:()=>$e()?(T({mode:p.COMMAND_LINE}),H(()=>"move previous"),ae({isForceExecutedBySystem:!0})):s("No pending move")},{intent:"moveNextItem",mode:p.MOVE,action:()=>$e()?(T({mode:p.COMMAND_LINE}),H(()=>"move next"),ae({isForceExecutedBySystem:!0})):s("No pending move")}],ko=[{intent:"moveToNextContainer",mode:p.MOVE,action:()=>$e()?(T({mode:p.COMMAND_LINE}),H(()=>"move to-next"),ae({isForceExecutedBySystem:!0})):s("No pending move")},{intent:"moveToPreviousContainer",mode:p.MOVE,action:()=>$e()?(T({mode:p.COMMAND_LINE}),H(()=>"move to-previous"),ae({isForceExecutedBySystem:!0})):s("No pending move")}];var Bo={[L.WORKSPACE]:[...jt,...zt],[L.BOARD]:[...jt,...zt],[L.SWIMLANE]:[...jt,...zt,...ko],[L.TICKET]:[],[L.FIELD]:[],[L.FIELD_LIST]:[],[L.TEXT]:[]};var Oo=[{intent:"addItem",mode:p.DEFAULT,description:"[n] new...",action:()=>(T({mode:p.COMMAND_LINE}),H(()=>`${g.NEW} `),c("Adding new item",null))},{intent:"Delete",mode:p.DEFAULT,description:"[d] delete",action:()=>(T({mode:p.COMMAND_LINE}),H(()=>`${g.DELETE} `),c("Deleting item",null))},{intent:"initCommandLine",mode:p.DEFAULT,description:"[:] focus command line",action:()=>(T({mode:p.COMMAND_LINE}),H(()=>""),c("Entering command line mode",null))},{intent:"confirm",mode:p.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>(k.enterChildNode(),c("Entering context",null))},{intent:"exit",mode:p.DEFAULT,description:"[q] exit context",action:()=>(logger.debug("Executing exit action"),k.enterParentNode(),c("Exiting context",null))},{intent:"navPreviousItem",mode:p.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(k.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:"navNextItem",mode:p.DEFAULT,action:()=>(k.navigateToNextItem(),c("Navigating to next item",null))},{intent:"navToPreviousContainer",mode:p.DEFAULT,action:()=>(k.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:"navToNextContainer",mode:p.DEFAULT,action:()=>(k.navigateToNextContainer(),c("Navigating to next container",null))},{intent:"edit",mode:p.DEFAULT,action:()=>(T({mode:p.COMMAND_LINE}),H(()=>"edit"),ae(),c("Fired command",!0))},{intent:"SetViewDense",mode:p.DEFAULT,description:"[v] view change (wide/dense)",action:()=>(T({viewMode:"dense"}),c("View set",null))},{intent:"SetViewWide",mode:p.DEFAULT,action:()=>(T({viewMode:"wide"}),c("View set",null))},{intent:"sync",mode:p.DEFAULT,description:"[s] sync epiq with remote state branch",action:()=>(T({mode:p.COMMAND_LINE}),H(()=>"sync"),ae({isForceExecutedBySystem:!0}),c("Synced",!0))}];var Uo=[{intent:"viewHelp",mode:p.DEFAULT,action:()=>(T({mode:p.HELP}),c("Viewing help",null))},{intent:"exit",mode:p.HELP,action:()=>(T({mode:p.DEFAULT}),c("Exiting help",null))},{intent:"confirm",mode:p.COMMAND_LINE,action:()=>(ae(),c("Executing command",null))},{intent:"MoveCursorLeft",mode:p.COMMAND_LINE,action:()=>(Sn(-1),c("Moving cursor left",null))},{intent:"MoveCursorRight",mode:p.COMMAND_LINE,action:()=>(Sn(1),c("Moving cursor right",null))},{intent:"MoveCursorLeftOfWord",mode:p.COMMAND_LINE,action:()=>(An("left"),c("Moving cursor left of word",null))},{intent:"MoveCursorRightOfWord",mode:p.COMMAND_LINE,action:()=>(An("right"),c("Moving cursor right of word",null))},{intent:"exitCommandLine",mode:p.COMMAND_LINE,action:()=>(T({mode:p.DEFAULT}),c("Exiting command line",null))},{intent:"autoCompleteCommand",mode:p.COMMAND_LINE,action:()=>(H((e,{remainder:t})=>t?e+t:e),c("Auto-completing command",null))},{intent:"captureInput",mode:p.COMMAND_LINE,action:(e,{sequence:t})=>(H(n=>n+t),c("Capturing input",null))},{intent:"eraseInput",mode:p.COMMAND_LINE,action:()=>(Pr(),c("Erasing input",null))},{intent:"EraseInputWord",mode:p.COMMAND_LINE,action:()=>(Dr(),c("Erasing input word",null))},{intent:"getLastCommandFromHistory",mode:p.COMMAND_LINE,action:()=>(Br(),c("Getting last command from history",null))},{intent:"getNextCommandFromHistory",mode:p.COMMAND_LINE,action:()=>(Or(),c("Getting next command from history",null))}];import ia from"chalk";var qt=": for command line",Wo="q to exit",Ho=`${ia.hex(v.accent)("m")} to confirm`,Vn={[L.WORKSPACE]:[qt],[L.BOARD]:[qt],[L.BOARD+p.COMMAND_LINE]:[qt],[L.SWIMLANE]:[qt],[L.TICKET+p.HELP]:[Wo],[L.SWIMLANE+p.HELP]:[Wo],[L.TICKET]:[],[L.FIELD]:[],[L.SWIMLANE+p.MOVE]:[Ho],[L.TICKET+p.MOVE]:[Ho]};var Gt=e=>e.trim().toLocaleLowerCase(),sa=(e,t)=>{let n=C.getFieldByTitle(e,t);if(!n)return"";let r=n.props?.value;return typeof r=="string"?r:""},aa=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):[]},da=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):[]},$o=(e,t)=>{let n=t.value;if(!n)return!0;switch(t.target){case"title":return Gt(e.title??"").includes(n);case"description":return Gt(sa(e.id,"Description")).includes(n);case"tag":return aa(e.id).map(Gt).some(d=>d.includes(n));case"assignee":return da(e.id).map(Gt).some(d=>d.includes(n));default:return!0}};function _o(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(),c("Breadcrumb built",o))}var Vo=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 Xt,Kn=new Set,Ko=()=>{for(let e of Kn)e()},la=e=>(Kn.add(e),()=>Kn.delete(e));function jo(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 m=_o(t,o,r);if(l(m))return logger.error(m.message),m;let u=m.data,{context:f}=d,x=Vn[f+n]??Vn[f]??[],N=[...Oo,...Bo[f]??[],...Uo],A=Vo(N);return c("Derived successfully",{...e,currentNode:d,breadCrumb:u,availableHints:x,availableActions:N,actionIndex:A,renderedChildrenIndex:ma(o,i)})}var h=()=>(Xt||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),Xt);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=jo(t);return l(n)?n:(Xt=n.data,Ko(),c("State initialized",null))}function de(e){let t=h(),n=e(t),r=jo(n);return l(r)?s(r.message??"Unable to update state"):(Xt=r.data,Ko(),c("State updated",null))}var T=e=>de(t=>({...t,...e}));var _=()=>ca(la,h,h),ma=(e,t)=>{let n={};for(let r of Object.values(e))We(r)&&t.length>0&&!t.every(o=>$o(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 k={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"||k.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;k.navigate({currentNode:n,selectedIndex:i})},navigateToNextItem:()=>zo(1),navigateToPreviousItem:()=>zo(-1),navigateToNextContainer:()=>qo(1),navigateToPreviousContainer:()=>qo(-1),navigate:({currentNode:e=h().currentNode,selectedIndex:t})=>{T({currentNodeId:e.id,selectedIndex:t})}},zo=e=>{let t=h(),n=M(t.currentNode.id).length;if(n===0)return;let o=(Math.max(0,t.selectedIndex)+e+n)%n;k.navigate({selectedIndex:o})},qo=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 m=M(d.id),u=Math.max(0,m.length-1),f=Math.min(Math.max(0,r),u),x=m.length?f:-1;k.navigate({currentNode:d,selectedIndex:x})};var Se="system.actor",xt=ua(),Pe=null;function pa(){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 ga(){let e=pa();k.navigate(e)}function fa(){let e=xt(),t=xt(),n=xt(),r=xt(),o=xt();return[{id:Ie(),userId:Se,action:"init.workspace",payload:{id:e,name:"Workspace"}},{id:Ie(),userId:Se,action:"add.board",payload:{id:t,name:"Default",parent:e}},{id:Ie(),userId:Se,action:"add.swimlane",payload:{id:n,name:"Todo",parent:t}},{id:Ie(),userId:Se,action:"add.swimlane",payload:{id:r,name:"Review",parent:t}},{id:Ie(),userId:Se,action:"add.swimlane",payload:{id:o,name:"Done",parent:t}},{id:Ie(),userId:Se,action:"add.board",payload:{id:Bt,name:"Closed",parent:e}},{id:Ie(),userId:Se,action:"add.swimlane",payload:{id:Je,name:"Closed",parent:Bt}},{id:Ie(),userId:Se,action:"lock.node",payload:{id:Bt}},{id:Ie(),userId:Se,action:"lock.node",payload:{id:Je}}]}function Mt(){return Pe!==null}function Fo(){if(!Pe||Pe.length===0)return c("No pending default events to persist",null);let t=Ht(Pe).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)}`),`
11
+ `)));return}n(m("Git command succeeded",{stdout:o,stderr:i,exitCode:d}))})}),$e=({args:e,cwd:t})=>new Promise(n=>{if(!$t.existsSync(t))return n({stdout:"",stderr:`Git cwd does not exist: ${t}`,exitCode:1});let r=go("git",e,{cwd:t,stdio:["ignore","pipe","pipe"]}),o="",i="";r.stdout.setEncoding("utf8"),r.stderr.setEncoding("utf8"),r.stdout.on("data",a=>{o+=a}),r.stderr.on("data",a=>{i+=a}),r.on("error",a=>{n({stdout:o,stderr:a.message,exitCode:1})}),r.on("close",a=>{n({stdout:o,stderr:i,exitCode:a??1})})}),Hn=yt(async(e=process.cwd())=>{let t=await k({args:["rev-parse","--show-toplevel"],cwd:e});return l(t)?s("Not inside a Git repository"):t.data?m("Resolved repo root",t.data.stdout.trim()):s("Git command returned no repo root")},e=>De.resolve(e)),Hs=yt(async e=>{let t=await k({args:["rev-parse","--git-dir"],cwd:e});if(l(t))return s(t.message);if(!t.data)return s("Git command returned no git dir");let n=t.data.stdout.trim(),r=De.isAbsolute(n)?n:De.join(e,n);return m("Resolved git dir",r)},e=>De.resolve(e)),fo=async({cwd:e,message:t})=>{let n=await k({args:["commit","-m",t],cwd:e});if(l(n))return s(`Failed to create commit
12
+ ${n.message}`);let r=await k({args:["rev-parse","HEAD"],cwd:e});return l(r)?s(`Commit created, but failed to read HEAD SHA
13
+ ${r.message}`):m("Created commit and resolved SHA",r.data.stdout.trim())},xt=async e=>{let t=await Hs(e);if(l(t))return s(t.message);if(!t.data)return s("Git dir result missing data");let n=t.data,o=["MERGE_HEAD","CHERRY_PICK_HEAD","REVERT_HEAD","REBASE_HEAD",De.join("rebase-merge"),De.join("rebase-apply")].filter(i=>$t.existsSync(De.join(n,i)));return m("Checked for in-progress Git operation",o.length>0)},Vt=async({repoRoot:e,remote:t})=>{let n=await $e({args:["remote","get-url",t],cwd:e});return m("Checked remote",n.exitCode===0)},Kt=async({repoRoot:e,remote:t,branch:n})=>{let r=await $e({args:["ls-remote","--heads",t,n],cwd:e});return r.exitCode!==0?s(r.stderr.trim()||`Unable to inspect remote branch ${t}/${n}`):m("Checked remote branch",r.stdout.trim().length>0)},yo=async({repoRoot:e,branch:t})=>{let n=await $e({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?m("Local branch exists",!0):n.exitCode===1?m("Local branch missing",!1):s(n.stderr.trim()||`Unable to inspect branch ${t}`)},po=e=>{try{return $t.realpathSync.native(e)}catch{return De.resolve(e)}},_n=async({repoRoot:e,worktreeRoot:t})=>{let n=await k({args:["worktree","list","--porcelain"],cwd:e});if(l(n))return s(n.message);if(!n.data)return s("Git command returned no worktree data");let r=po(t),o=n.data.stdout.split(`
14
+ `).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(po).includes(r);return m("Checked worktree registration",o)},$n=async e=>{let t=await $e({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return m("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},jt=async e=>{let t=await k({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return l(t)?s(t.message):t.data?m("Resolved current branch",t.data.stdout.trim()):s("Git command returned no branch name")},xo=async e=>{let t=await k({args:["rev-parse","--short","HEAD"],cwd:e});return l(t)?s(t.message):t.data?m("Resolved short HEAD sha",t.data.stdout.trim()):s("Git command returned no short sha")},vo=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),zt=async({cwd:e,remote:t,branch:n})=>{let r=await $n(e);if(l(r))return s(r.message);if(!r.data)return m("No upstream configured, skipped pull",!1);let o=await Kt({repoRoot:e,remote:t,branch:n});if(l(o))return s(o.message);if(!o.data)return m("Remote branch missing, skipped pull",!1);let i=await k({args:["fetch",t,n],cwd:e});if(l(i))return s(`Failed to fetch ${n}
15
+ ${i.message}`);if(!i.data)return s("Git command returned no fetch result data");let a=await k({args:["pull","--rebase"],cwd:e});return l(a)?s(`Failed during pull --rebase
16
+ ${a.message}`):a.data?m("Pulled with rebase",!0):s("Git command returned no pull result data")},ho=async e=>{let t=await jt(e);return l(t)?s(t.message):m("Checked detached HEAD state",t.data==="HEAD")};import rt from"node:fs";var Vn=(e,t)=>{if(!rt.existsSync(e)||!rt.existsSync(t))return!1;let n=rt.statSync(e),r=rt.statSync(t);if(n.size!==r.size)return!1;let o=rt.readFileSync(e),i=rt.readFileSync(t);return o.equals(i)};var Io=ge(),So="events",F="epiq-state-5",q="origin",Vs=e=>Z.join(Io,So,e),Ks=e=>_s("sha1").update(e).digest("hex").slice(0,12),Ao=()=>Z.join($s.homedir(),".epiq"),wo=()=>Z.join(Ao(),"worktrees"),To=e=>Z.join(wo(),Ks(e)),js=e=>Z.join(e,Io),ot=e=>Z.join(js(e),So),Co=({root:e,fileName:t})=>Z.join(ot(e),t),qt=e=>(S.debug("[sync] ensure dir",e),oe.mkdirSync(e,{recursive:!0}),m("Ensured directory",void 0)),zs=()=>{S.debug("[sync] ensure epiq storage");let e=qt(Ao());if(l(e))return s(e.message);let t=qt(wo());return l(t)?s(t.message):m("Ensured epiq storage",void 0)},qs=e=>{oe.existsSync(e)&&(S.debug("[sync] remove path",e),oe.rmSync(e,{recursive:!0,force:!0}))},Gs=e=>{let t=ot(e);if(!oe.existsSync(t))return S.debug("[sync] events dir missing",t),m("Events dir missing",[]);let n=oe.readdirSync(t,{withFileTypes:!0}).filter(r=>r.isFile()).map(r=>r.name).filter(r=>r.endsWith(".jsonl")).sort();return S.debug("[sync] listed event files",{eventsDir:t,count:n.length}),m("Listed event files",n)},Xs=async e=>{S.debug("[sync] inspect local HEAD",e);let t=await $e({args:["rev-parse","--verify","HEAD"],cwd:e});return t.exitCode===0?m("Repo has HEAD",!0):t.exitCode===1?m("Repo has no HEAD",!1):s(t.stderr.trim()||"Unable to inspect HEAD")},Ys=yt(async e=>{S.debug("[sync] inspect remote history",{repoRoot:e,remote:q});let t=await Vt({repoRoot:e,remote:q});if(l(t))return s(t.message);if(!t.data)return m("No remote configured",!1);let n=await $e({args:["ls-remote","--heads",q],cwd:e});if(n.exitCode!==0)return s(n.stderr.trim()||"Unable to inspect remote heads");let r=n.stdout.trim().length>0;return S.debug("[sync] remote history",r),m("Checked remote history",r)},e=>Z.resolve(e)),Mo=async e=>{S.debug("[sync] ensure initial commit");let t=await Xs(e);if(l(t))return s(t.message);if(t.data)return S.debug("[sync] local HEAD exists"),m("Repo already initialized",!1);let n=await Ys(e);if(l(n))return s(n.message);if(n.data)return S.debug("[sync] skip local init commit due to remote history"),m("Skipped local init commit because remote history exists",!1);S.debug("[sync] create empty init commit");let r=await k({args:["commit","--allow-empty","-m","[epiq:init]"],cwd:e});return l(r)?s(`Failed to create initial commit
17
+ ${r.message}`):m("Created initial commit",!0)},Js=({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=Co({root:e,fileName:n}),o=Co({root:t,fileName:n});return oe.existsSync(r)?Vn(r,o)?(S.debug("[sync] own event file already matches remote",n),m("Own event file already matches remote worktree",!1)):(S.debug("[sync] copy own event file to remote",n),oe.mkdirSync(Z.dirname(o),{recursive:!0}),oe.copyFileSync(r,o),m("Copied own event file into remote worktree",!0)):(S.debug("[sync] local own event file missing",r),m("Local own event file missing, nothing to copy",!1))},Ro=({repoRoot:e,worktreeRoot:t,skipFileNames:n=[]})=>{let r=Gs(t);if(l(r))return s(r.message);let o=ot(t),i=ot(e),a=new Set(n),d=!1;for(let c of r.data){if(a.has(c)){S.debug("[sync] skip hydrate for file",c);continue}let u=Z.join(o,c),f=Z.join(i,c);Vn(u,f)||(S.debug("[sync] hydrate remote file",c),oe.mkdirSync(Z.dirname(f),{recursive:!0}),oe.copyFileSync(u,f),d=!0)}return S.debug("[sync] hydrate changed",d),m("Hydrated event files from remote worktree",d)},No=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",Qs=async e=>{let t=await jt(e);if(l(t))return s(t.message);let n=await xo(e);if(l(n))return s(n.message);let r=`[epiq:sync:${No(t.data)}:${No(n.data)}]`;return S.debug("[sync] commit message",r),m("Built sync commit message",r)},Zs=async({repoRoot:e})=>{S.debug("[sync] ensure local remote branch",F);let t=await yo({repoRoot:e,branch:F});if(l(t))return s(t.message);if(t.data)return S.debug("[sync] local remote branch exists"),m("Local remote branch already exists",!1);let n=await Vt({repoRoot:e,remote:q});if(l(n))return s(n.message);if(n.data){let o=await Kt({repoRoot:e,remote:q,branch:F});if(l(o))return s(o.message);if(o.data){S.debug("[sync] fetch remote branch before local track");let i=await k({args:["fetch",q,F],cwd:e});if(l(i))return s(`Failed to fetch ${F} from remote
18
+ ${i.message}`);S.debug("[sync] create local tracking branch",F);let a=await k({args:["branch","--track",F,`${q}/${F}`],cwd:e});return l(a)?s(`Failed to create local ${F} from remote
19
+ ${a.message}`):m("Created local remote branch from remote",!0)}}S.debug("[sync] create local remote branch from HEAD",F);let r=await k({args:["branch",F,"HEAD"],cwd:e});return l(r)?s(`Failed to create local ${F}
20
+ ${r.message}`):m("Created local remote branch",!0)},ea=async({repoRoot:e,worktreeRoot:t})=>{S.debug("[sync] create remote worktree",t);let n=qt(Z.dirname(t));if(l(n))return s(n.message);oe.existsSync(t)&&!oe.existsSync(Z.join(t,".git"))&&(S.debug("[sync] remove broken remote worktree path",t),qs(t));let r=await k({args:["worktree","add",t,F],cwd:e});return l(r)?s(`Failed to create remote worktree
21
+ ${r.message}`):m("Created remote worktree",!0)},ta=async({repoRoot:e,worktreeRoot:t})=>{S.debug("[sync] ensure remote worktree",t);let n=await _n({repoRoot:e,worktreeRoot:t});if(l(n))return s(n.message);let r=oe.existsSync(t);if(n.data&&r)return S.debug("[sync] remote worktree exists"),m("Remote worktree already exists",!1);if(n.data&&!r){S.debug("[sync] prune stale remote worktree registration");let o=await k({args:["worktree","prune"],cwd:e});if(l(o))return s(`Failed to prune stale worktrees
22
+ ${o.message}`);let i=await _n({repoRoot:e,worktreeRoot:t});if(l(i))return s(i.message);if(i.data){S.debug("[sync] remove stale remote worktree registration");let a=await k({args:["worktree","remove","--force",t],cwd:e});if(l(a))return s(`Failed to remove stale worktree registration
23
+ ${a.message}`)}}return ea({repoRoot:e,worktreeRoot:t})},na=async e=>{let t=await jt(e);if(l(t))return s(t.message);if(t.data===F)return S.debug("[sync] remote branch already checked out"),m("Remote branch already checked out",!1);S.debug("[sync] checkout remote branch",F);let n=await k({args:["checkout",F],cwd:e});return l(n)?s(`Failed to checkout ${F}
24
+ ${n.message}`):m("Checked out remote branch",!0)},ra=async e=>{S.debug("[sync] ensure remote upstream",F);let t=await $n(e);if(l(t))return s(t.message);if(t.data)return S.debug("[sync] remote upstream already configured"),m("Remote upstream already configured",!1);let n=await Vt({repoRoot:e,remote:q});if(l(n))return s(n.message);if(!n.data)return S.debug("[sync] no remote configured for upstream"),m("No remote available for upstream",!1);let r=await Kt({repoRoot:e,remote:q,branch:F});if(l(r))return s(r.message);if(r.data){S.debug("[sync] fetch remote branch before upstream set");let i=await k({args:["fetch",q,F],cwd:e});if(l(i))return s(`Failed to fetch ${F}
25
+ ${i.message}`);S.debug("[sync] set upstream to remote branch");let a=await k({args:["branch","--set-upstream-to",`${q}/${F}`,F],cwd:e});return l(a)?s(`Failed to set remote upstream
26
+ ${a.message}`):m("Configured remote upstream",!0)}S.debug("[sync] publish remote branch and set upstream");let o=await k({args:["push","-u",q,F],cwd:e});return l(o)?s(`Failed to publish remote branch
27
+ ${o.message}`):m("Published remote branch and configured upstream",!0)},oa=async({worktreeRoot:e,ownEventFileName:t})=>{S.debug("[sync] stage own event file in remote worktree",t);let n=await k({args:["add",Vs(t)],cwd:e});return l(n)?s(`Failed to stage remote own event file
28
+ ${n.message}`):m("Staged remote own event file",void 0)},ia=async({repoRoot:e,worktreeRoot:t})=>{let n=await Qs(e);return l(n)?s(n.message):(S.debug("[sync] create remote sync commit"),fo({cwd:t,message:n.data}))},bo=async e=>{S.debug("[sync] push remote worktree");let t=await k({args:["push"],cwd:e});return l(t)?s(`Failed during remote push
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)}`),`
30
30
  `].join(`
31
- `)):(Pe=null,c("Persisted pending default events",null))}function Go(e){let t;e.some(r=>r.action==="init.workspace")?(Pe=null,t=gt(e)):(Pe=fa(),t=gt([...Pe]));let n=t.filter(l);return n.length>0?s([it.bold.red("Materializing failed"),"",...n.map((r,o)=>`${it.dim.gray(`${o+1}.`)} ${it.dim(r.message)}`),`
31
+ `)):(Fe=null,m("Persisted pending default events",null))}function Yo(e){let t;e.some(r=>r.action==="init.workspace")?(Fe=null,t=gt(e)):(Fe=va(),t=gt([...Fe]));let n=t.filter(l);return n.length>0?s([it.bold.red("Materializing failed"),"",...n.map((r,o)=>`${it.dim.gray(`${o+1}.`)} ${it.dim(r.message)}`),`
32
32
  `].join(`
33
- `)):(ga(),c("State booted successfully",null))}import{Box as Da}from"ink";import qn from"react";import ht from"chalk";import{Box as jn,Text as Xo}from"ink";import vt,{useEffect as ya,useMemo as xa,useState as va}from"react";var Yo=ht.gray,ha=ht.inverse,Ca=ht.inverse.gray,Na={hint:"",hints:[],overlap:0,remainder:""},Qo=({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}},ba=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=ce(t);return{bg:r=>ht.bgHex(n).black(r),bgCursor:r=>ht.bgHex(n).inverse.black(r)}}return hn(t)},Ea=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=Qo({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}},Jo=()=>({value:j.value,cursorPosition:j.cursorPosition,commandIsPending:j.commandIsPending,autoCompletion:j.commandMeta.autoCompletion??Na,infoMessage:j.commandMeta.infoMessage,validationStatus:j.commandMeta.validity,command:j.commandMeta.command,inputString:j.commandMeta.inputString,modifier:j.commandMeta.modifier}),Ia=(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,Zo=({width:e})=>{let[t,n]=va(Jo());ya(()=>{let x=()=>{let A=Jo();n(S=>Ia(S,A)?S:A)},N=Lr(x);return x(),()=>{N()}},[]);let{value:r,cursorPosition:o,infoMessage:i,commandIsPending:a,autoCompletion:d,command:m,modifier:u}=t,f=xa(()=>{let x=Math.max(0,Math.min(o,r.length)),N=Qo({value:r,command:m}),A=Ea({value:r,command:m,modifier:u}),S=m?hn(m):null,E=ba({command:m,modifier:u}),b=(re,oe)=>{let un=N&&oe>=N.start&&oe<N.end,pn=A&&oe>=A.start&&oe<A.end;return un&&S?S.fg(re):pn&&E?E.bg(re):re},w=(re,oe)=>{let un=N&&oe>=N.start&&oe<N.end,pn=A&&oe>=A.start&&oe<A.end;return un&&S?S.fgCursor(re):pn&&E?E.bgCursor(re):ha(re)},O=r.slice(0,x),z=r[x]??" ",q=x<r.length?r.slice(x+1):"",Ue=Array.from(O).map((re,oe)=>b(re,oe)).join(""),dr=w(z,x),cr=Array.from(q).map((re,oe)=>b(re,x+1+oe)).join("");if(d.hint){let re=d.hint[d.overlap]??z;dr=Ca(re),cr=Yo(d.remainder.slice(1)+q)}return Yo(":")+Ue+dr+cr},[r,o,d,m,u]);return vt.createElement(jn,{flexDirection:"column",justifyContent:"flex-start"},vt.createElement(jn,{flexDirection:"column",paddingX:1,borderColor:v.secondary,borderStyle:"round",width:e},vt.createElement(jn,null,vt.createElement(Xo,null,f),i&&vt.createElement(Xo,{wrap:"truncate",color:a?v.red:v.secondary2},` ${i} `))))};import ei from"chalk";import{Box as Sa,Text as zn}from"ink";import Yt,{useEffect as Aa,useState as wa}from"react";var Ta=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],ti=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)}},Ma=({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)}`},Ra=(e,t,n)=>{let r=ti(e),o=ti(t);return Ma({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},La=(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 Ra(i,a,o)},Pa=(e,t)=>e.length===t?e:e.length>t?e.slice(0,t):e.padEnd(t," "),ni=({width:e,availableHints:t})=>{let{syncStatus:{status:n,msg:r}}=_(),[o,i]=wa(0);Aa(()=>{if(n!=="syncing"){i(0);return}let b=setInterval(()=>{i(w=>w+1)},50);return()=>clearInterval(b)},[n]);let a=[],d=0;for(let b of t){let O=(a.length>0?" | ":"").length+b.length;if(d+O>e-4)break;a.push(b),d+=O}let m=n!="synced"?r??a.join(" | "):a.join(" | "),u=Math.max(0,e-2),f=n==="syncing"?La(Ta,(Math.sin(o*.12)+1)/2):v.secondary,x=ei.hex(f??"fff"),N=ei.hex(v.secondary2),A=x(`\u256D${"\u2500".repeat(u)}\u256E`),S=x(`\u2570${"\u2500".repeat(u)}\u256F`),E=`${x("\u2502")}${N(Pa(` ${m} `,u))}${x("\u2502")}`;return Yt.createElement(Sa,{flexDirection:"column",width:e},Yt.createElement(zn,null,A),Yt.createElement(zn,null,E),Yt.createElement(zn,null,S))};var Jt=({width:e,mode:t,availableHints:n})=>{let r=_(),o=[],i=0;for(let a of n){let m=(o.length>0?" | ":"").length+a.length;if(i+m>e+2)break;o.push(a),i+=m}return qn.createElement(Da,null,t===p.COMMAND_LINE&&r.syncStatus.status!=="syncing"?qn.createElement(Zo,{width:e}):qn.createElement(ni,{width:e,mode:t,availableHints:n}))};import{Box as st,Text as ri}from"ink";import De from"react";var oi=({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"]),De.createElement(st,{flexDirection:"column",marginTop:3,borderColor:v.secondary,borderStyle:"round",width:e,minHeight:19},De.createElement(st,{flexDirection:"column",width:e},h().mode===p.HELP?t.map(([n,r],o)=>De.createElement(st,{paddingLeft:1,key:o,flexDirection:"row"},De.createElement(st,{key:o,flexDirection:"row",paddingBottom:o?0:1},De.createElement(st,{width:20,justifyContent:"flex-end"},De.createElement(ri,{color:o?v.accent:v.secondary},n)),De.createElement(st,{flexGrow:1,width:40,paddingLeft:2},De.createElement(ri,{color:o?v.primary:v.secondary},r))))):null))};import di from"chalk";import{Box as Xn,Text as li}from"ink";import Ae from"react";import{Box as Gn,Text as Ha}from"ink";import ct from"react";import{Text as Fa}from"ink";import ka from"react";var Ba=e=>e.toLowerCase().trim(),Oa=(e,t=Ge)=>{let n=Ba(e);return t[n]?t[n]:ut(n)},at=({id:e,isSelected:t})=>{let n=C.getContributor(e);if(n)return ka.createElement(Fa,{underline:t,color:Oa(n.name)},"@"+n.name)};import{Text as Ua}from"ink";import Wa from"react";var dt=({id:e,isSelected:t})=>{let n=C.getTag(e);if(n)return Wa.createElement(Ua,{underline:t,backgroundColor:ce(n.name),color:v.primary}," "+n.name+" ")};var $a=(e,t)=>e.length<=t?e:t<=1?"\u2026":e.slice(0,t-1)+"\u2026",ii=({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,m=d?.id?W(d.id):[],u=E=>{let b=m.find(w=>w.title===E);return b?W(b.id).map(w=>typeof w.props?.value=="string"?w.props.value:"").filter(w=>!!w):[]},f=u("Tags"),x=u("Assignees"),N=d?.parentNodeId?!yn(n.id,d?.parentNodeId)&&o==="dense":!1,A=t.map((E,b)=>{let w=b===t.length-1,O=W(E.id),z=w?O?.[r]?.title:void 0;return`${b?" / ":""}${E.title??""}${z?` \u25B8 ${z}`:""}`}).join(""),S=$a(A,e);return ct.createElement(Gn,null,ct.createElement(Ha,{color:v.secondary2},S),N?f.map(E=>ct.createElement(Gn,{key:E,paddingLeft:2},ct.createElement(dt,{id:E}))):null,N?x.map(E=>ct.createElement(Gn,{key:E,paddingLeft:2},ct.createElement(at,{id:E}))):null)};import{Box as _a,Text as si}from"ink";import Qt from"react";var Va=({filters:e})=>Qt.createElement(_a,{columnGap:1},Qt.createElement(si,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>Qt.createElement(si,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),ai=Qt.memo(Va);function Zt({filters:e,hideBreadCrumb:t=!1}){let{userName:n,preferredEditor:r}=me(),o=40,i=process.stdout.columns-o-8;return Ae.createElement(Xn,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?Ae.createElement(li,null," "):Ae.createElement(Xn,{paddingLeft:1},e.length>0?Ae.createElement(ai,{filters:e}):Ae.createElement(ii,{width:i})),Ae.createElement(Xn,{columnGap:1,paddingRight:2,"max-width":o,overflow:"hidden",justifyContent:"flex-end"},Ae.createElement(ci,{icon:"@",value:n}),Ae.createElement(ci,{icon:"\u276F",value:r})))}function ci({icon:e,value:t}){return Ae.createElement(li,null,di.dim(e)+di.hex(v.accent)(` ${t??"-"} `))}import{Box as ud,Text as pd}from"ink";import Nt from"react";import{Box as en,Text as Yn}from"ink";import Fe from"react";import{Text as mi}from"ink";import ui,{useEffect as Ka,useState as ja}from"react";var pi={help:["\u25B8 ","\u25B8 ","\u25B8 "],default:["\u25B8 ","\u25B8 ","\u25B8 "],move:["\u2191 ","\u2192 ","\u2193 ","\u2190 "],"command-line":["\u276F ","\u276F ","\u276F "]},ne=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=_(),r=pi[n]??pi.default,[o,i]=ja(r.length-1);return Ka(()=>{if(!e)return;let a=setInterval(()=>{i(d=>(d+1)%r.length)},800);return()=>clearInterval(a)},[e,r]),e?ui.createElement(mi,{color:v.accent,dimColor:o===1},r[o]):ui.createElement(mi,null,t)};function Jn(){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 Fe.createElement(en,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:v.secondary,width:i},Fe.createElement(en,{padding:1,paddingTop:0,paddingBottom:0},Fe.createElement(Yn,null,"Select a board:")),Fe.createElement(en,{padding:1,flexDirection:"column"},a.map((d,m)=>{let u=e.currentNode.context==="WORKSPACE"&&e.selectedIndex===m,x=M(d.id).flatMap(({id:N})=>W(N)).length;return Fe.createElement(en,{key:d.id??m},Fe.createElement(Yn,{color:u?v.accent:v.secondary},Fe.createElement(ne,{isSelected:u})),Fe.createElement(Yn,{color:u?v.accent:v.secondary},d.title," (",x," issues)",d.readonly?" \u{1F512}":""))})))}import{Box as ld}from"ink";import an from"react";import{Box as er,Text as Ya}from"ink";import ye from"react";import{Box as Qn,Text as za}from"ink";import tn from"react";var nn=({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)),m=Math.max(0,Math.min(n,e.length-1)),u=Math.max(0,e.length-d),f=o?Math.min(u,Math.max(0,m-d+1)):Math.min(u,Math.floor(m/d)*d),x=f+d,N=e.slice(f,x),A=e.length>d,S=i,E=A?Math.max(1,Math.floor(d/e.length*S)):S,b=Math.max(0,S-E),w=Math.max(1,e.length-d),O=A?Math.floor(f/w*b):0;return tn.createElement(Qn,{flexDirection:"row",height:i,width:"100%"},tn.createElement(Qn,{flexDirection:"column",flexGrow:1,height:i},N),tn.createElement(Qn,{flexDirection:"column",width:1,height:S},Array.from({length:S}).map((z,q)=>tn.createElement(za,{key:q,color:A&&q>=O&&q<O+E?v.accent:v.secondary},A?"\u2502":" "))))};import{Box as rn,Text as qa}from"ink";import Ve from"react";var gi=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=It(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),m=a("Assignees").map(u=>C.getContributor(u)).filter(u=>!!u);return Ve.createElement(rn,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?v.accent:v.secondary,justifyContent:"space-between"},Ve.createElement(rn,{borderBottom:!0},Ve.createElement(rn,{paddingLeft:1,flexDirection:"column"},Ve.createElement(qa,{color:v.primary},o))),Ve.createElement(rn,{flexDirection:"row",paddingLeft:1},d.map(u=>Ve.createElement(dt,{key:u.id,id:u.id})),m.map(u=>Ve.createElement(at,{key:u.id,id:u.id}))))};import Ga from"chalk";import{Box as Ct,Text as Zn}from"ink";import we from"react";var Xa=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,fi=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=M(t.id),a=E=>{let b=i.find(w=>w.title===E);return b?M(b.id).map(w=>typeof w.props?.value=="string"?w.props.value:"").filter(w=>!!w):[]},d=a("Tags").map(E=>C.getTag(E)).filter(E=>!!E),m=a("Assignees").map(E=>C.getContributor(E)).filter(E=>!!E),u=1,f=d.length*(1+u),x=m.length*(2+u),N=d.map(E=>we.createElement(Ct,{key:E.id,paddingRight:u},we.createElement(Zn,{color:ce(E.name)},"\u25A0"))),A=m.map(E=>we.createElement(Ct,{key:E.id,paddingRight:u},we.createElement(Zn,{color:ut(E.name)},"@"+E.name.at(0)))),S=n?v.accent:o===p.MOVE?v.secondary:v.primary;return we.createElement(Ct,{borderBottom:!0,justifyContent:"space-between"},we.createElement(Ct,null,we.createElement(ne,{isSelected:n,placeholder:Ga.dim.gray(r+1+" ")}),we.createElement(Zn,{wrap:"truncate",color:S},Xa(t.title,e-f-x-14))),we.createElement(Ct,null,N,A))};var Ja=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:i,listSelectedIndex:a,mode:d})=>{let{renderedChildrenIndex:m}=_(),u=m[e.id]??[],f=`${e.title} (${u.length})`,x=3,N=o?1:4,A=r-x-(o?2:1),S=ye.createElement(er,{borderStyle:"round",borderColor:v.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},ye.createElement(ne,{isSelected:t}),ye.createElement(Ya,{bold:!0,color:t?v.accent:v.primary},f," ",e.readonly?"\u{1F512}":"")),E=(b,w)=>{let O=i&&a===w;return o?ye.createElement(fi,{key:b.id,index:w,width:n,ticket:b,isSelected:O,mode:d}):ye.createElement(gi,{key:b.id,width:n,ticket:b,isSelected:O})};return ye.createElement(er,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?v.accent:v.secondary,paddingRight:1,paddingLeft:1,height:r},S,ye.createElement(er,{padding:o?1:0},u.length>0&&ye.createElement(nn,{selectedIndex:a,height:A,itemHeight:N},u.map(E)),ye.createElement(ne,{isSelected:i&&a===-1})))},yi=ye.memo(Ja);import{Box as rr,Text as dd}from"ink";import ke,{useEffect as or,useMemo as Ni}from"react";import Te from"chalk";import vi from"string-width";import{decodeTime as Qa}from"ulid";var xi=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 Za=(e,t)=>e+" ".repeat(Math.max(0,t-vi(e))),ed=(e,t)=>" ".repeat(Math.max(0,t-vi(e)))+e,td=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)})(),nd=e=>{switch(e.action){case"move.node":{let t=C.getNode(e.payload.parent),n=t?Te.dim.bgBlack(` ${t.title} `):"unknown",r=e.payload.pos;if(!r)return`to ${n}`;switch(r.at){case"start":return`to ${n} ${Te.dim("(to top of list)")}`;case"end":return`to ${n} ${Te.dim("(to bottom of list)")}`;case"before":return`to ${n} ${Te.dim("(up in list)")}`;case"after":return`to ${n} ${Te.dim("(down in list)")}`}}case"tag.issue":{let t=h().tags[e.payload.tagId];return t?Te.bgHex(ce(t.name))(` ${t.name} `):"unknown tag"}case"assign.issue":{let t=h().contributors[e.payload.contributor];return t?Te.hex(ce(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""}},rd=e=>{let t=xi(Qa(e));return Te.gray(ed(t,8))},od=12,id=e=>{let t=e.split(".")[1]??"unknown";return Za(`${t}`,od)},hi=e=>{let t=rd(e.id),n=id(e.userId),r=td(e.action),o=nd(e),i=Te.dim("\u203A"),a=[r,o].filter(Boolean).join(" ");return`${n} ${t} ${i} ${a}`};import{Box as on,Text as sd}from"ink";import Me from"react";var Ci=({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 Me.createElement(on,{alignItems:"center",paddingTop:1},Me.createElement(on,{minWidth:12},Me.createElement(ne,{isSelected:n}),Me.createElement(sd,{color:n?v.accent:v.secondary2},o,":")),Me.createElement(on,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((a,d)=>{let m=r.id===t.id&&d===e;return Me.createElement(on,{key:`${o}-${a}`,paddingRight:2,minHeight:1},Me.createElement(ne,{isSelected:m}),o==="Assignees"?Me.createElement(at,{isSelected:m,id:a}):o==="Tags"?Me.createElement(dt,{isSelected:m,id:a}):null)})))};import{Box as sn,Text as tr}from"ink";import Re,{useEffect as ad}from"react";var nr=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:a,currentNode:d}=_(),m=N=>String(N).replace(/\r?\n/g,""),u=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];ad(()=>{let N=[];return u.forEach((A,S)=>{let E=Y.text({id:`${S}`,name:`Line ${S+1}`,parentNodeId:e,props:{value:A},readonly:!0}),b=C.createNodeAtPosition(E);je(b)&&N.push(b.data.id)}),()=>N.forEach(C.deleteNode)},[e,n]);let f="\u2029",x=u.map((N,A)=>{let S=d.id===e&&a===A;return Re.createElement(sn,{key:`${e}-${A}`},Re.createElement(tr,{color:S?v.primary:v.secondary2,dimColor:!S},`${A+1} `.padStart(5,"\xA0")),Re.createElement(tr,{backgroundColor:S?"gray":""},m(N.length?It(N,i-10):f)))});return Re.createElement(sn,{flexDirection:"column",paddingTop:1},Re.createElement(sn,null,Re.createElement(ne,{isSelected:o}),Re.createElement(tr,{color:o?v.accent:v.secondary2},t)),Re.createElement(sn,{flexDirection:"row",borderStyle:"round",borderColor:v.secondary,paddingLeft:1,paddingRight:1,marginLeft:1},Re.createElement(nn,{scrollByOne:!0,children:x,height:r-2,selectedIndex:a,itemHeight:1})))};var cd=e=>`${e}::log`,bi=({ticket:e,height:t})=>{let{selectedIndex:n,currentNode:r}=_(),o=process.stdout.columns||120,i=Ni(()=>cd(e.id),[e.id]),a=Ni(()=>[...e.log].reverse().map(hi).join(`
34
- `),[e.log]);or(()=>{if(C.getNode(i))return;let w={...Y.field(i,"Log",e.id,{value:a}),readonly:!0,childRenderAxis:"vertical"};return C.createNodeAtPosition(w),()=>{C.deleteNode(i)}},[i,e.id]),or(()=>{let b=C.getNode(i);b&&b.props.value!==a&&C.updateNode({...b,props:{...b.props,value:a},childRenderAxis:"vertical",readonly:!0})},[i,a]);let d=r.id===e.id,m=r.id===i||r.parentNodeId===i;or(()=>{m&&(n>=0||k.navigate({selectedIndex:0}))},[m,n]);let u=M(e.id);if(m){let b=C.getNode(i),O=t-3;return ke.createElement(rr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},b?ke.createElement(nr,{id:b.id,label:"Event log",text:b.props.value??"",selected:!1,maxWidth:o,height:O}):null)}let f=u.reduce((b,w)=>w.title==="Assignees"||w.title==="Tags"||w.id===i?++b:b,0),x=2,N=f*1,S=t-3-N-x,E=(b,w)=>b.title==="Assignees"||b.title==="Tags"?ke.createElement(Ci,{key:b.id,parent:b,selected:w,selectedIndex:n}):b.id===i?ke.createElement(rr,{key:b.id,paddingTop:1},ke.createElement(ne,{isSelected:w}),ke.createElement(dd,{backgroundColor:v.secondary,color:w?v.accent:v.primary}," History \u203A\u203A ")):ke.createElement(nr,{label:"Description (press e to edit)",key:b.id,id:b.id,text:b.props.value??"",selected:w,maxWidth:o,height:S});return ke.createElement(rr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},u.map((b,w)=>E(b,d&&n===w)))};var md=({swimlanes:e,currentNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:i,height:a,width:d})=>{let m=t.context,u=m===L.TICKET||m===L.FIELD_LIST||m===L.FIELD,f=m===L.BOARD||m===L.SWIMLANE,x=m===L.TICKET?t:r.find(b=>b.context===L.TICKET),N=Math.floor(d/3),A=Math.floor(d/Math.max(e.length,1)),S=Math.min(A,N),E=i==="dense";return an.createElement(ld,{flexDirection:"row",height:a},f&&e.map((b,w)=>{let O=t.id===b.id,z=O?n:-1,q=t.context===L.BOARD&&n===w;return an.createElement(yi,{key:b.id,height:a,width:S,swimlane:b,isSelected:q,isDense:E,isFocused:O,listSelectedIndex:z,mode:o})}),u&&x&&an.createElement(bi,{height:a,ticket:x}))},Ei=an.memo(md);var gd=({currentNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:i,width:a})=>{let{renderedChildrenIndex:d}=_(),m=n.find(({context:N})=>N==="BOARD"),x=i-1-3;return Nt.createElement(ud,{flexDirection:"row"},e.context==="WORKSPACE"?Nt.createElement(Jn,null):m?Nt.createElement(Ei,{height:x,width:a,swimlanes:(d[m.id]??[]).filter(N=>N!==void 0&&lr(N)),currentNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):Nt.createElement(pd,null))},Ii=Nt.memo(gd);import{Box as bt,Text as xe}from"ink";import U from"react";var dn=({isDone:e,command:t,value:n})=>U.createElement(bt,null,U.createElement(xe,{color:v.accent,dimColor:e},e?" \u2714 ":" "),U.createElement(xe,{dimColor:e},"Type "),U.createElement(xe,{backgroundColor:v.secondary,dimColor:e}," "+t+" "),n&&U.createElement(U.Fragment,null,U.createElement(xe,{dimColor:e}," "),U.createElement(xe,{color:v.secondary,dimColor:e},"<"+n+">")));function ir({width:e,height:t,hasUserName:n,hasPreferredEditor:r,userName:o,preferredEditor:i}){let a=n&&r,d=n?r?null:":set:editor":":set:username";return U.createElement(bt,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:v.secondary,rowGap:1},U.createElement(xe,{color:v.accent,bold:!0},"Welcome! \u{1F539}"),U.createElement(xe,null,"Lets get you started - its a breeze."),U.createElement(xe,{color:v.secondary2},"And remember, you can always get help with"," ",U.createElement(xe,{color:v.accent},":help"),"."),!a&&U.createElement(xe,{color:v.secondary2},d===":set:username"?"First, choose your username.":"Nice. One more step."),U.createElement(bt,{flexDirection:"column"},n&&U.createElement(bt,{marginBottom:1},U.createElement(dn,{isDone:!0,command:":set:username",value:o})),!n&&U.createElement(dn,{isDone:!1,command:":set:username"}),n&&!r&&U.createElement(dn,{isDone:!1,command:":set:editor"}),a&&U.createElement(bt,null,U.createElement(dn,{isDone:!0,command:":set:editor",value:i}))))}var yd=({width:e,height:t})=>D.createElement(pe,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:v.secondary,rowGap:1},D.createElement(Be,{color:v.accent,bold:!0},"Initialize project"),D.createElement(Be,null,`This folder is not an ${fd.hex(v.accent)("epiq")} project yet.`),D.createElement(Be,{color:v.primary},"To start tracking issues here, we need to initialize a new"," ",D.createElement(Be,{color:v.primary,backgroundColor:v.secondary}," .epiq/ ")," ","directory in this repository."),D.createElement(pe,{marginTop:1,flexDirection:"column"},D.createElement(pe,null,D.createElement(Be,{color:v.accent}," "),D.createElement(Be,{color:v.primary},"Type "),D.createElement(Be,{backgroundColor:v.secondary}," :init "))),D.createElement(pe,{marginTop:1},D.createElement(Be,{color:v.secondary2},"(This will create the local epiq project files)")));function sr({width:e,height:t}){let n=_(),r=n.filters;if(n.mode===p.HELP)return D.createElement(pe,{flexDirection:"column"},D.createElement(oi,{width:e}));let{isSetup:o,hasPreferredEditor:i,hasUserName:a,userName:d,preferredEditor:m}=Tt(),u=!o,f=o&&Mt();if(u)return D.createElement(pe,{flexDirection:"column"},D.createElement(pe,{flexDirection:"column"},D.createElement(Zt,{hideBreadCrumb:!0,filters:r}),D.createElement(ir,{height:t,width:e,hasUserName:a,hasPreferredEditor:i,userName:d??"",preferredEditor:m??""})),D.createElement(Jt,{width:e,mode:n.mode,availableHints:n.availableHints}));if(f)return D.createElement(pe,{flexDirection:"column"},D.createElement(pe,{flexDirection:"column"},D.createElement(Zt,{hideBreadCrumb:!0,filters:r}),D.createElement(yd,{height:t,width:e})),D.createElement(Jt,{width:e,mode:n.mode,availableHints:n.availableHints}));let x=nt(h().breadCrumb??[],"BOARD");if(je(x)){let N=x.data.id,A=M(N).length,S=3,E=Math.floor(e/S),b=Math.floor(e/Math.max(A,1));e=Math.min(b,E)*Math.max(A,S)}return D.createElement(pe,{flexDirection:"column"},D.createElement(pe,{flexDirection:"column"},D.createElement(Zt,{filters:r}),D.createElement(Ii,{width:e,height:t,currentNode:n.currentNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:n.viewMode,mode:n.mode})),D.createElement(Jt,{width:e,mode:n.mode,availableHints:n.availableHints}))}import{Box as Ke,Text as Oe}from"ink";import X,{useEffect as xd,useMemo as vd,useState as hd}from"react";var Cd=["\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 Nd(e,t,n){return Math.min(n,Math.max(t,e))}function bd(e,t){return X.createElement(Oe,null,X.createElement(Oe,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(0,14)),X.createElement(Oe,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(14)))}function Ed(e,t=28){if(e>=1)return"\u2588".repeat(t);let n=Math.floor(e*(t-1));return Array.from({length:t},(r,o)=>{let i=Math.abs(o-n);return i===0?"\u2588":i===1?"\u2593":i===2?"\u2592":i===3?"\u2591":o<n?"\u2500":"\xB7"}).join("")}function ar({durationMs:e=3e3,slogan:t="Never leave the command line"}){let n=Math.max(1,e),[r,o]=hd(0);xd(()=>{let m=Date.now(),u=setInterval(()=>{let f=Date.now()-m;if(f>=n){o(n),clearInterval(u);return}o(f)},33);return()=>clearInterval(u)},[n]);let i=Nd(r/n,0,1),a=vd(()=>Ed(i,28),[i]),d=`${Math.round(i*100)}%`;return X.createElement(Ke,{flexDirection:"column",alignItems:"center",justifyContent:"center",paddingX:4,paddingY:1},X.createElement(Ke,{flexDirection:"column",minWidth:42},X.createElement(Ke,{flexDirection:"column",marginBottom:1},Cd.map((m,u)=>X.createElement(Ke,{key:u,justifyContent:"center"},bd(m,u)))),X.createElement(Ke,{justifyContent:"center",marginBottom:1},X.createElement(Oe,{color:"gray"},t)),X.createElement(Ke,{justifyContent:"center",marginBottom:1},X.createElement(Oe,{color:"cyan"},a.slice(0,10)),X.createElement(Oe,{color:"blue"},a.slice(10,18)),X.createElement(Oe,{color:"magenta"},a.slice(18))),X.createElement(Ke,{justifyContent:"center",marginBottom:1},X.createElement(Oe,{color:"gray"},d))))}import Id from"readline";var cn,ln,ve,Si=async e=>{if(e.ctrl&&e.name==="c")return k.exit();let{actionIndex:t,mode:n}=h(),r=Wr(e,n);if(!r)return;let o=t[n]?.[r];if(o?.action)try{await o.action(o,e)}catch(i){logger.error(i)}},Sd=()=>async function(t,n){n.name!=="escape"&&(ve&&(clearTimeout(ve),ve=void 0),await Si(n))},Ad=()=>async function(t){if(t.length===1&&t[0]===27){ve&&clearTimeout(ve),ve=setTimeout(()=>{Si({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),ve=void 0},25);return}ve&&(clearTimeout(ve),ve=void 0)};function Ai(){cn&&process.stdin.removeListener("keypress",cn),ln&&process.stdin.removeListener("data",ln),cn=Sd(),ln=Ad(),Id.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",ln),process.stdin.on("keypress",cn)}Td(`
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]);ir(()=>{if(C.getNode(i))return;let T={...X.field(i,"Log",e.id,{value:a}),readonly:!0,childRenderAxis:"vertical"};return C.createNodeAtPosition(T),()=>{C.deleteNode(i)}},[i,e.id]),ir(()=>{let E=C.getNode(i);E&&E.props.value!==a&&C.updateNode({...E,props:{...E.props,value:a},childRenderAxis:"vertical",readonly:!0})},[i,a]);let d=r.id===e.id,c=r.id===i||r.parentNodeId===i;ir(()=>{c&&(n>=0||O.navigate({selectedIndex:0}))},[c,n]);let u=M(e.id);if(c){let E=C.getNode(i),B=t-3;return Oe.createElement(or,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},E?Oe.createElement(rr,{id:E.id,label:"Event log",text:E.props.value??"",selected:!1,maxWidth:o,height:B}):null)}let f=u.reduce((E,T)=>T.title==="Assignees"||T.title==="Tags"||T.id===i?++E:E,0),x=2,N=f*1,b=t-3-N-x,I=(E,T)=>E.title==="Assignees"||E.title==="Tags"?Oe.createElement(Ei,{key:E.id,parent:E,selected:T,selectedIndex:n}):E.id===i?Oe.createElement(or,{key:E.id,paddingTop:1},Oe.createElement(ee,{isSelected:T}),Oe.createElement(ld,{backgroundColor:v.secondary,color:T?v.accent:v.primary}," History \u203A\u203A ")):Oe.createElement(rr,{label:"Description (press e to edit)",key:E.id,id:E.id,text:E.props.value??"",selected:T,maxWidth:o,height:b});return Oe.createElement(or,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},u.map((E,T)=>I(E,d&&n===T)))};var pd=({swimlanes:e,currentNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:i,height:a,width:d})=>{let c=t.context,u=c===L.TICKET||c===L.FIELD_LIST||c===L.FIELD,f=c===L.BOARD||c===L.SWIMLANE,x=c===L.TICKET?t:r.find(E=>E.context===L.TICKET),N=Math.floor(d/3),A=Math.floor(d/Math.max(e.length,1)),b=Math.min(A,N),I=i==="dense";return ln.createElement(ud,{flexDirection:"row",height:a},f&&e.map((E,T)=>{let B=t.id===E.id,se=B?n:-1,z=t.context===L.BOARD&&n===T;return ln.createElement(hi,{key:E.id,height:a,width:b,swimlane:E,isSelected:z,isDense:I,isFocused:B,listSelectedIndex:se,mode:o})}),u&&x&&ln.createElement(Si,{height:a,ticket:x}))},Ai=ln.memo(pd);var yd=({currentNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:i,width:a})=>{let{renderedChildrenIndex:d}=$(),c=n.find(({context:N})=>N==="BOARD"),x=i-1-3;return bt.createElement(gd,{flexDirection:"row"},e.context==="WORKSPACE"?bt.createElement(Qn,null):c?bt.createElement(Ai,{height:x,width:a,swimlanes:(d[c.id]??[]).filter(N=>N!==void 0&&lr(N)),currentNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):bt.createElement(fd,null))},wi=bt.memo(yd);import{Box as Et,Text as ye}from"ink";import U from"react";var mn=({isDone:e,command:t,value:n})=>U.createElement(Et,null,U.createElement(ye,{color:v.accent,dimColor:e},e?" \u2714 ":" "),U.createElement(ye,{dimColor:e},"Type "),U.createElement(ye,{backgroundColor:v.secondary,dimColor:e}," "+t+" "),n&&U.createElement(U.Fragment,null,U.createElement(ye,{dimColor:e}," "),U.createElement(ye,{color:v.secondary,dimColor:e},"<"+n+">")));function sr({width:e,height:t,hasUserName:n,hasPreferredEditor:r,userName:o,preferredEditor:i}){let a=n&&r,d=n?r?null:":set:editor":":set:username";return U.createElement(Et,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:v.secondary,rowGap:1},U.createElement(ye,{color:v.accent,bold:!0},"Welcome! \u{1F539}"),U.createElement(ye,null,"Lets get you started - its a breeze."),U.createElement(ye,{color:v.secondary2},"And remember, you can always get help with"," ",U.createElement(ye,{color:v.accent},":help"),"."),!a&&U.createElement(ye,{color:v.secondary2},d===":set:username"?"First, choose your username.":"Nice. One more step."),U.createElement(Et,{flexDirection:"column"},n&&U.createElement(Et,{marginBottom:1},U.createElement(mn,{isDone:!0,command:":set:username",value:o})),!n&&U.createElement(mn,{isDone:!1,command:":set:username"}),n&&!r&&U.createElement(mn,{isDone:!1,command:":set:editor"}),a&&U.createElement(Et,null,U.createElement(mn,{isDone:!0,command:":set:editor",value:i}))))}var vd=({width:e,height:t})=>D.createElement(ue,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:v.secondary,rowGap:1},D.createElement(Ue,{color:v.accent,bold:!0},"Initialize project"),D.createElement(Ue,null,`This folder is not an ${xd.hex(v.accent)("epiq")} project yet.`),D.createElement(Ue,{color:v.primary},"To start tracking issues here, we need to initialize a new"," ",D.createElement(Ue,{color:v.primary,backgroundColor:v.secondary}," .epiq/ ")," ","directory in this repository."),D.createElement(ue,{marginTop:1,flexDirection:"column"},D.createElement(ue,null,D.createElement(Ue,{color:v.accent}," "),D.createElement(Ue,{color:v.primary},"Type "),D.createElement(Ue,{backgroundColor:v.secondary}," :init "))),D.createElement(ue,{marginTop:1},D.createElement(Ue,{color:v.secondary2},"(This will create the local epiq project files)")));function ar({width:e,height:t}){let n=$(),r=n.filters;if(n.mode===p.HELP)return D.createElement(ue,{flexDirection:"column"},D.createElement(si,{width:e}));let{isSetup:o,hasPreferredEditor:i,hasUserName:a,userName:d,preferredEditor:c}=Mt(),u=!o,f=o&&Rt();if(u)return D.createElement(ue,{flexDirection:"column"},D.createElement(ue,{flexDirection:"column"},D.createElement(nn,{hideBreadCrumb:!0,filters:r}),D.createElement(sr,{height:t,width:e,hasUserName:a,hasPreferredEditor:i,userName:d??"",preferredEditor:c??""})),D.createElement(en,{width:e,mode:n.mode,availableHints:n.availableHints}));if(f)return D.createElement(ue,{flexDirection:"column"},D.createElement(ue,{flexDirection:"column"},D.createElement(nn,{hideBreadCrumb:!0,filters:r}),D.createElement(vd,{height:t,width:e})),D.createElement(en,{width:e,mode:n.mode,availableHints:n.availableHints}));let x=nt(h().breadCrumb??[],"BOARD");if(je(x)){let N=x.data.id,A=M(N).length,b=3,I=Math.floor(e/b),E=Math.floor(e/Math.max(A,1));e=Math.min(E,I)*Math.max(A,b)}return D.createElement(ue,{flexDirection:"column"},D.createElement(ue,{flexDirection:"column"},D.createElement(nn,{filters:r}),D.createElement(wi,{width:e,height:t,currentNode:n.currentNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:n.viewMode,mode:n.mode})),D.createElement(en,{width:e,mode:n.mode,availableHints:n.availableHints}))}import{Box as Ke,Text as We}from"ink";import G,{useEffect as hd,useMemo as Cd,useState as Nd}from"react";var bd=["\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 Ed(e,t,n){return Math.min(n,Math.max(t,e))}function Id(e,t){return G.createElement(We,null,G.createElement(We,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(0,14)),G.createElement(We,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(14)))}function Sd(e,t=28){if(e>=1)return"\u2588".repeat(t);let n=Math.floor(e*(t-1));return Array.from({length:t},(r,o)=>{let i=Math.abs(o-n);return i===0?"\u2588":i===1?"\u2593":i===2?"\u2592":i===3?"\u2591":o<n?"\u2500":"\xB7"}).join("")}function dr({durationMs:e=3e3,slogan:t="Never leave the command line"}){let n=Math.max(1,e),[r,o]=Nd(0);hd(()=>{let c=Date.now(),u=setInterval(()=>{let f=Date.now()-c;if(f>=n){o(n),clearInterval(u);return}o(f)},33);return()=>clearInterval(u)},[n]);let i=Ed(r/n,0,1),a=Cd(()=>Sd(i,28),[i]),d=`${Math.round(i*100)}%`;return G.createElement(Ke,{flexDirection:"column",alignItems:"center",justifyContent:"center",paddingX:4,paddingY:1},G.createElement(Ke,{flexDirection:"column",minWidth:42},G.createElement(Ke,{flexDirection:"column",marginBottom:1},bd.map((c,u)=>G.createElement(Ke,{key:u,justifyContent:"center"},Id(c,u)))),G.createElement(Ke,{justifyContent:"center",marginBottom:1},G.createElement(We,{color:"gray"},t)),G.createElement(Ke,{justifyContent:"center",marginBottom:1},G.createElement(We,{color:"cyan"},a.slice(0,10)),G.createElement(We,{color:"blue"},a.slice(10,18)),G.createElement(We,{color:"magenta"},a.slice(18))),G.createElement(Ke,{justifyContent:"center",marginBottom:1},G.createElement(We,{color:"gray"},d))))}import Ad from"readline";var un,pn,xe,Ti=async e=>{if(e.ctrl&&e.name==="c")return O.exit();let{actionIndex:t,mode:n}=h(),r=Wr(e,n);if(!r)return;let o=t[n]?.[r];if(o?.action)try{await o.action(o,e)}catch(i){logger.error(i)}},wd=()=>async function(t,n){n.name!=="escape"&&(xe&&(clearTimeout(xe),xe=void 0),await Ti(n))},Td=()=>async function(t){if(t.length===1&&t[0]===27){xe&&clearTimeout(xe),xe=setTimeout(()=>{Ti({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),xe=void 0},25);return}xe&&(clearTimeout(xe),xe=void 0)};function Mi(){un&&process.stdin.removeListener("keypress",un),pn&&process.stdin.removeListener("data",pn),un=wd(),pn=Td(),Ad.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",pn),process.stdin.on("keypress",un)}Rd(`
35
35
  View board in directory:
36
36
  $ epiq
37
37
 
38
38
  Init project in directory:
39
39
  $ epiq --init "Project Name"
40
- `,{importMeta:import.meta,flags:{init:{type:"string"}}});var Md=2e3,Rd=600,Ti=process.stdout.columns||120,Mi=process.stdout.rows||20,mn=null,Ld=e=>new Promise(t=>setTimeout(t,e)),Ri=e=>{if(!mn){mn=wd(e);return}mn.rerender(e)},Li=()=>{Ri(wi.createElement(sr,{width:Ti,height:Mi}))},Pd=e=>{Ri(wi.createElement(ar,{durationMs:e}))},Dd=()=>{let e=Ut();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},Fd=e=>{let t=Go(e);if(l(t))throw new Error(`Failed to boot state: ${t.message}`)};async function kd(){co(),await Po();let e=Dd(),n=e.length===0?Md:Rd;n>0&&Pd(n);let r=Date.now();Fd(e);let o=Date.now()-r,i=Math.max(0,n-o);i>0&&await Ld(i),Li(),Ai()}process.stdout.on("resize",()=>{Ti=process.stdout.columns||120,Mi=process.stdout.rows||20,mn&&Li()});(async()=>(console.clear(),await kd()))();
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()))();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "epiq",
3
- "version": "0.2.24",
3
+ "version": "0.2.26",
4
4
  "license": "UNLICENSED",
5
5
  "type": "module",
6
6
  "description": "EPIQ - CLI based issue tracker",
package/readme.md CHANGED
@@ -1,6 +1,11 @@
1
+ > ⓘ First stable release scheduled for end of April
2
+
1
3
  # Epiq
2
4
 
3
5
  **CLI-native issue tracker** — powered by Git.
6
+ Manage all your projects directly via the command line, edit in your favorite editor.
7
+
8
+ Epiq stores your issue tracker as event logs inside your Git repository.
4
9
 
5
10
  ```
6
11
  '███████╗██████╗ ██╗ ██████╗ '
@@ -12,15 +17,46 @@
12
17
  🫡 Never leave your editor!
13
18
  ```
14
19
 
20
+ ## Features
21
+
22
+ - Issue tracking — tickets with name, description, tags, assignees, and history log
23
+ - Filtering — query issues by description, tags, assignees, and so on
24
+ - Ergonomics — fast keyboard-driven navigation
25
+ - Autocompletion — minimize typing, stay in flow
26
+ - Command system — built with ergonomics and automation in mind
27
+ - Traceable event log — full history of every change
28
+
29
+ ### Example workflow:
30
+
31
+ An issue lifecycle as epiq commands:
32
+
33
+ ```
34
+ 1. epiq new issue "Fix login bug"
35
+ 2. epiq assign @john
36
+ 3. epiq tag urgent
37
+ 4. # move with keys to reflect progress
38
+ 5. epiq close
39
+ ```
40
+
41
+ ## What is epiq?
42
+
43
+ Epiq is a vim-inspired issue tracker fully integrated in the terminal that brings the tooling to the developers’ fingertips in their comfort zone.
44
+
45
+ Epiq renders your issue board directly in the terminal using ASCII and stores its state on disk using an event log, versioned and synchronized in Git, resulting in a fast application that can run anywhere, anytime, by anyone with access to Git. It also works without Git for single-user setups.
46
+
15
47
  ## Why epiq?
16
48
 
17
- Never leave your favorite editor!
49
+ Most issue trackers live outside your workflow. Epiq brings issue tracking into your editor and your repo—where you already work.
18
50
 
19
- - **Zero setup** no dashboards, no setup overhead
51
+ These design choices result in a system that is:
52
+
53
+ - **Zero setup** — no account registration required
20
54
  - **Repo-native** — your issues live where your code lives
21
- - **Offline-first** — works anywhere Git works
22
- - **Portable** — your entire project state travels with the repo
23
- - **CLI-first** — fast, scriptable, and automation-friendly
55
+ - **Offline-friendly** — works anywhere, with eventual consistency as a promise
56
+ - **Speed** — local first, and eventual consistency makes epiq edits instant
57
+ - **Portable** — run on your local machine, on a dusty old Linux server or your grandma’s connected toaster
58
+ - **Command driven** — scriptable and automation-friendly, ready for the agentic era
59
+ - **Versioned** — every change is tracked and recoverable through Git
24
60
 
25
61
  ---
26
62
 
@@ -43,7 +79,7 @@ epiq --version
43
79
  ## Getting Started
44
80
 
45
81
  Starting the application will launch a wizard that sets you up in 20 seconds.
46
- It will result in settings persisted at `~/.epicrc`
82
+ It will result in settings and state persisted in `~/.epiq/**`
47
83
 
48
84
  In any folder, run:
49
85
 
@@ -51,28 +87,65 @@ In any folder, run:
51
87
  epiq
52
88
  ```
53
89
 
54
- This opens the interactive CLI workspace.
90
+ If it is your first run, this opens the interactive setup wizard.
55
91
 
56
- ---
92
+ From here, you can start running commands or use keyboard shortcuts to navigate.
93
+
94
+ ## Usage Guide
95
+
96
+ ### Help
97
+
98
+ - The first thing to know is that you always can access help with `:help`.
99
+
100
+ ### Navigation
57
101
 
58
- ## Philosophy
102
+ - The second thing to know is that you can navigate with the keyboard using arrow keys or `h` `j` `k` `l`.
103
+ - You can enter nodes with `enter`, and navigate out of a context with `q` or `esc`
59
104
 
60
- What epiq brings:
105
+ ### Commands
61
106
 
62
- - **Speed** event sourcing to the file system keeps operations fast
63
- - **Editor-level productivity** stay in the environment you already use
64
- - **Repo-native issues** — tickets live alongside your code
65
- - **Built-in versioning** — Git is the backend
66
- - **Seamless collaboration** — leverage Git’s distributed workflow
67
- - **Fully distributed** no central configuration or registration required
107
+ - If you type `:` you are put in command line mode and can now insert commands.
108
+ - Commands are context-aware, so for instance `:close` only exists for issues.
109
+
110
+ ### :new ...
111
+
112
+ - Create nodes with `:new issue|swimlane|board <Name of new node>`.
113
+
114
+ ### Move nodes
115
+
116
+ - Move nodes by pressing `m`. This sets you in a move state, after which you can navigate as normal, navigate to the target location, then press m again to confirm.
117
+
118
+ ### Filtering
119
+
120
+ - Apply filters with the `filter` command followed by a target, and a qualifier. So in order to filter `prio` tags you can write `:filter tag prio` and hit `enter`. By running several filter commands in succession you add a combination of filters.
121
+
122
+ Clear filters with `:filter clear`
123
+
124
+ ### Close issue
125
+
126
+ - Close issues with `:close`. This moves the issue to a special board named `Closed` which you can find if you navigate up (press `q`) a few times.
127
+
128
+ ### Reopen
129
+
130
+ - You can reopen a task by visiting the `Closed` board, selecting an issue and typing command `:reopen`.
68
131
 
69
132
  ---
70
133
 
71
- ## Features
134
+ ## How epiq is synchronized
135
+
136
+ Epiq uses Git to synchronize state between clients. Running `:sync` pulls and pushes changes between your local state and the remote.
137
+
138
+ - Your issue data is stored in a dedicated branch managed automatically by epiq
139
+ - A local `.epiq/` folder is created in your project as a cache
140
+
141
+ The `.epiq/` folder:
72
142
 
73
- - Issue tracking lightweight, structured tickets
74
- - Event log full history of every change
75
- - Filteringquery issues by tags, assignees, and more
76
- - Navigation-first UI — fast keyboard-driven workflow
77
- - Markdown descriptions shareable, human-readable boards
78
- - Extensible command system — built with automation in mind
143
+ - Is non-authoritative and used for caching and local tracking
144
+ - Can be committed if you want your board state versioned alongside your code
145
+ - Is optional epiq works whether you commit it or not
146
+
147
+ You generally don’t need to interact with these directly.
148
+
149
+ > ⓘ The system is designed to avoid merge conflicts.
150
+
151
+ ---