epiq 0.2.21 → 0.2.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +31 -31
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,40 +1,40 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{render as bd}from"ink";import Sd from"meow";import Ii from"react";import cd from"chalk";import{Box as me,Text as De}from"ink";import P from"react";import et from"chalk";import{monotonicFactory as sa,ulid as Ne}from"ulid";import{useSyncExternalStore as ra}from"react";var R={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function Be(e){return e.context==="TICKET"}var ir=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:""},ye={None:"none",Invalid:"invalid",Valid:"valid"},ve={None:"none",Success:"success",Fail:"fail"},s=e=>({result:ve.Fail,message:e,data:null}),c=(e,t)=>({result:ve.Success,message:e,data:t}),sr=()=>({result:ve.None,message:"No result",data:null}),l=e=>e.result==="fail",_e=e=>e.result==="success";var p={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};function vt(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var ht=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",ar=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var dr=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},cr=(e,t)=>t?e.get(t)??[]:[];var lr=new WeakMap,Mi=e=>{let t=lr.get(e);return t||(t=dr(e),lr.set(e,t)),t};var mr=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return cr(Mi(e),r).filter(i=>vt(r,i)>=n)};var ur=({inputToMatch:e,lastWord:t},n)=>{if(t.endsWith(" "))return{hint:"",hints:[],overlap:0,remainder:""};let r=mr({wordList:n,inputToMatch:e,overlapThreshold:1});return Ri(t,r)},Ri=(e,t)=>{let n=t[0]??"",r=vt(e.toLowerCase(),n.toLowerCase()),o=n?n+" ":"",i=o.slice(r);return{hint:o,hints:t,overlap:r,remainder:i}};var pr=["vi","vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var $e=24n,Li=$e*4n,Ct=(1n<<Li)-1n,Pi=/^[0-9a-f]+$/;function gr(e){if(!e||!Pi.test(e))throw new Error(`Invalid hex rank: ${e}`);return BigInt("0x"+e)}function Nt(e,t=$e){if(e<0n)throw new Error("Negative rank not allowed");return e.toString(16).padStart(Number(t),"0")}function it(e,t){if(!e&&!t)return Nt(Ct/2n,$e);let n=e?gr(e):0n,r=t?gr(t):Ct;if(r<=n)return Nt(Ct/2n,$e);let o=(n+r)/2n;return o===n||o===r?"":Nt(o,$e)}function ae(){return Nt(Ct/2n,$e)}var G={workspace:(e,t)=>({id:e,title:t,rank:ae(),isDeleted:!1,props:{},context:R.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r=!1)=>({id:e,title:t,rank:ae(),isDeleted:!1,props:{},context:R.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:r,log:[]}),swimlane:(e,t,n)=>({id:e,title:t,rank:ae(),isDeleted:!1,props:{},context:R.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:(e,t,n,r={},o="horizontal")=>({id:e,title:t,rank:ae(),isDeleted:!1,props:r,context:R.FIELD,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[]}),ticket:(e,t,n)=>({id:e,title:t,rank:ae(),isDeleted:!1,props:{},context:R.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:ae(),isDeleted:!1,props:r,context:R.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)),fr=(e,t)=>e.findIndex(n=>n.id===t),sn=(e,t={at:"end"})=>{if(e.length===0)return c("Resolved rank",ae());switch(t.at){case"start":{let n=e[0];return n?c("Resolved rank",it(void 0,n.rank)):s("Unable to resolve first sibling")}case"end":{let n=e[e.length-1];return n?c("Resolved rank",it(n.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let n=fr(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",it(r?.rank,o.rank)):s("Sibling not found")}case"after":{let n=fr(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",it(r.rank,o?.rank)):s("Sibling not found")}}};var Ve=(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}`)},dn=(e,t)=>{let{nodes:n}=h(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},an=(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){ie(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=an(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=an(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=an(i,"move");if(d)return d;if(dn(t,e))return s("Cannot move node into its own descendant");let m=W(t).filter(y=>y.id!==e),u=sn(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 y of W(f.id))a(y.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 A({nodes:d}),D.navigate({currentNode:d[m],selectedIndex:0}),c("Successfully tomb stoned",o)},createContributor(e){let t=ie(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(G.field(n,r.name,i.id,{value:t}));return l(d)?d:c("Assigned contributor",d.data)},createTag(e){let t=ie(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(G.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:ae()};return this.createNode(i),c("Created node",i)}let n=W(e.parentNodeId),r=sn(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=ie(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=ie(o=>({...o,nodes:{...o.nodes,[e]:n}}));return l(r)?s(r.message):c("Locked node",n)},updateNode(e){let t=ie(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return l(t)?t:c("Updated node",e)},updateNodeAndSelectInParent(e){let t=ie(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=T(r.id).findIndex(({id:a})=>a===e.id);return D.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 Et={preferredEditor:null,userName:null,userId:null},de=()=>Et,st=e=>(Et={...Et,...e},Et);var It=()=>{let e=de(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim();return{isSetup:n&&t,hasPreferredEditor:n,hasUserName:t,userName:e.userName,preferredEditor:e.preferredEditor}},xr=()=>!bt();var j={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#2a2f45",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},v={accent:j.cyan,accent2:j.magenta,primary:j.white,secondary:j.grayDark,secondary2:j.grayLight,gray:j.gray,green:j.green,yellow:j.yellow,red:j.red};var x={red:j.red,yellow:j.yellow,green:j.green,blue:j.blue,magenta:j.magenta,cyan:j.cyan},Ke={urgent:x.red,critical:x.red,important:x.red,blocker:x.red,asap:x.red,immediate:x.red,fail:x.red,failure:x.red,broken:x.red,bug:x.red,error:x.red,incident:x.red,outage:x.red,production:x.red,crash:x.red,security:x.red,warning:x.yellow,warn:x.yellow,risky:x.yellow,risk:x.yellow,attention:x.yellow,pending:x.yellow,review:x.yellow,"needs-review":x.yellow,qa:x.yellow,testing:x.yellow,test:x.yellow,validate:x.yellow,verification:x.yellow,staging:x.yellow,check:x.yellow,"follow-up":x.yellow,followup:x.yellow,waiting:x.yellow,blocked:x.yellow,hold:x.yellow,done:x.green,complete:x.green,completed:x.green,success:x.green,ok:x.green,stable:x.green,resolved:x.green,fixed:x.green,closed:x.green,merged:x.green,released:x.green,deployed:x.green,approved:x.green,verified:x.green,working:x.green,healthy:x.green,pass:x.green,passing:x.green,info:x.blue,information:x.blue,note:x.blue,docs:x.blue,documentation:x.blue,doc:x.blue,guide:x.blue,help:x.blue,explanation:x.blue,detail:x.blue,details:x.blue,context:x.blue,design:x.blue,discussion:x.blue,proposal:x.blue,idea:x.blue,feature:x.magenta,enhancement:x.magenta,improvement:x.magenta,refactor:x.magenta,refactoring:x.magenta,cleanup:x.magenta,optimize:x.magenta,optimization:x.magenta,perf:x.magenta,performance:x.magenta,upgrade:x.magenta,migration:x.magenta,modernize:x.magenta,debt:x.magenta,todo:x.cyan,next:x.cyan,planned:x.cyan,plan:x.cyan,future:x.cyan,backlog:x.cyan,investigate:x.cyan,explore:x.cyan,prototype:x.cyan};var V=e=>{let{currentNode:t}=h(),n=It().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]:[...pr,"vim"],[g.TAG]:[...new Set([...Object.keys(Ke),...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?xr()||(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 pn from"chalk";import je from"chalk";var ln={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Di=(e,t,n)=>Math.max(t,Math.min(n,e)),cn=(e,t,n)=>e+(t-e)*n,yr=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Fi=(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 y=o-i/2;return[Math.round((m+y)*255),Math.round((u+y)*255),Math.round((f+y)*255)]},Bi=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,ki=(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))],at=e=>{let n=yr(e)%360,r=Fi(n,ln.stringColor.saturation,ln.stringColor.lightness);return Bi(r)},Oi=e=>{let t=ln.gradient.stops,n=Di(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 ki(t[i],t[i+1],a)},St=e=>yr(e.toLowerCase().trim())/4294967295,vr=e=>{let t=St(e);return Oi(t)},Ui=e=>{let[t,n,r]=vr(e);return{normal:o=>je.bgRgb(t,n,r).black(o),cursor:o=>je.bgRgb(t,n,r).white.bold(o)}},mn=e=>{let[t,n,r]=vr(e);return{fg:o=>je.rgb(t,n,r)(o),fgCursor:o=>je.rgb(t,n,r).inverse(o),bg:o=>je.bgRgb(t,n,r).black(o),bgCursor:o=>je.bgRgb(t,n,r).white.bold(o)}},un=e=>Ui(e).normal(` ${e} `),se=(e,t=Ke)=>{let r=(o=>o.toLowerCase().trim())(e);return r&&t[r]?t[r]:at(r)};var he="<ENTER> to confirm",X=(e="",t=[])=>({message:e,validity:ye.Valid,completionWordList:t}),ce=({message:e,completionWordList:t})=>({validity:ye.Invalid,message:e,completionWordList:t}),dt=e=>e.length===0,Te=({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,y)=>St(f)-St(y)).slice(0,r).map(un),u=m.length>i?m.join(" "):"";return u?`${e}${u}${n}`:""},gn=({modifier:e})=>{let t="confirm";return e===t?X(he):ce({message:dt(e)?`if you are certain, enter ${un(t)}`:"",completionWordList:[t]})},Wi=({list:e,hint:t})=>({modifier:n})=>e.includes(n)?X(he):ce({message:dt(n)?t:"",completionWordList:[]}),Hi=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?ce({message:n,completionWordList:[]}):X():ce({message:dt(r)?t:"",completionWordList:[]}),fn=({hint:e})=>({modifier:t,inputString:n})=>dt(t)&&dt(n)?ce({message:e,completionWordList:[]}):X(he),_i={[g.INIT]:()=>X(he),[g.FILTER]:e=>{if(e.modifier==="clear")return X();let t=a=>V(g.FILTER).includes(a);if(!e.modifier||!t(e.modifier??""))return ce({message:Te({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()??"")?ce({message:Te({prefix:`existing ${e.modifier}s... `,wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i}):X():ce({message:Te({prefix:"one of... ",wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i})},[g.NONE]:e=>e.command?X():ce({message:Te({prefix:"commands... ",wordList:V(g.NONE),noOfHints:100,inputString:e.inputString,minLengthForHints:0}),completionWordList:[]}),[g.NEW]:e=>Hi({list:V(g.NEW),hint:Te({wordList:V(g.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[g.SET_DESCRIPTION]:()=>X(he),[g.HELP]:()=>X(he),[g.RENAME]:()=>X(he),[g.DELETE]:e=>gn(e),[g.CLOSE_ISSUE]:e=>gn(e),[g.RE_OPEN_ISSUE]:e=>gn(e),[g.MOVE]:e=>fn({hint:Te({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=>` ${pn.bgHex(se(n))(" "+n+" ")} `).slice(0,10);return fn({hint:"tag name like... "+t.join("")})(e)},[g.ASSIGN]:e=>{let t=C.getExistingAssignees().map(n=>` ${pn.bgHex(se(n))(" "+n+" ")} `).slice(0,10);return fn({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?X(he):ce({message:Te({wordList:t,noOfHints:100,inputString:e.inputString}),completionWordList:[]})},[g.SET_USERNAME]:e=>e.inputString?X():ce({message:`Enter a username. Saved in ${pn.bgBlack("~/.epiqrc")}`,completionWordList:[]}),[g.SET_VIEW]:e=>Wi({list:V(g.SET_VIEW),hint:Te({wordList:V(g.SET_VIEW),noOfHints:3,inputString:e.inputString})})(e),[g.SYNC]:()=>X(he)},hr=Object.fromEntries(Object.entries(_i).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var Cr=["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 M={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 Nr=e=>Object.values(g).includes(e),Er=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:a,validity:d,completionWordList:m}=hr[n].validate(n,r,i),u=o==="command"?Object.values(g):n&&e.target==="modifier"?V(n):Cr;return{validity:d,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:a??"",autoCompletion:t?ur(e,[...m,...u]):{hint:"",hints:[],remainder:"",overlap:0}}};var Ir=e=>{let t=e.trimStart(),n=Vi(t),r=(n[0]??"").trimStart().trimEnd(),o=(n[1]??"").trimStart().trimEnd(),i=Ki(e),a=Nr(r)?r:null,d=a!==null,m=r!=="",u=e.endsWith(" "),f=a?V(a)??[]:[],y=a&&f.includes(o)?o:"",N="word";n.length<=1?N="command":n.length===2&&(N="modifier");let S=$i(t,a,y);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:i,hasCommand:m,command:a,isCommandKeyword:d,isLastWordCompleted:u,modifier:y,target:N,inputToMatch:i,inputString:S}},$i=(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},Vi=e=>e?e.split(/\s+/):[],Ki=e=>e.trimEnd().split(/\s+/).at(-1)??"";var br=" ",z={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:ye.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},xn=new Set,Sr=()=>{for(let e of xn)e()},Ar=e=>(xn.add(e),()=>xn.delete(e)),Ce=e=>{let n=e(z),r=Ir(n.value),o=n.cursorPosition===n.value.length;z={...n,commandMeta:Er(r,o)},Sr()},At=({message:e,result:t})=>{let n=structuredClone(z);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,z=n,Sr(),c(e,null)},yn=e=>{Ce(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},vn=e=>{Ce(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}})},wr=()=>{Ce(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}})},Tr=()=>{Ce(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=>{Ce(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}})},Mr=()=>{Ce(e=>({...e,commandIsPending:!0}))},Rr=({addToHistory:e=!0})=>{Ce(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),ji()},Lr=()=>{Ce(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}})},Pr=()=>{Ce(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(()=>""),ue=()=>z,wt=()=>{let[e,...t]=z.value.split(br);return t.join(br).trim()};var zi=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",qi=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",Gi=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",Dr=(e,t)=>{if(qi(e,e.sequence))return"MoveCursorLeftOfWord";if(Gi(e,e.sequence))return"MoveCursorRightOfWord";if(zi(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 Xi(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 Yi(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 Fr(e,t){let n=ue();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 Dr(e,n.value);let r=Xi(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 Yi(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 Br=e=>{let{context:t}=h()?.currentNode;if(!t)return M.None;switch(e){case g.INIT:return M.Init;case g.DELETE:return M.Delete;case g.SET_DESCRIPTION:return M.Edit;case g.HELP:return M.ViewHelp;case g.RE_OPEN_ISSUE:return M.ReopenIssue;case g.CLOSE_ISSUE:return M.CloseIssue;case g.TAG:return M.TagTicket;case g.ASSIGN:return M.AssignUserToTicket;case g.RENAME:return M.Rename;case g.NEW:return M.NewItem;case g.FILTER:return M.Filter;case g.MOVE:return M.Move;case g.SET_USERNAME:return M.SetUserName;case g.SET_EDITOR:return M.SetEditor;case g.SET_VIEW:return M.SetView;case g.SYNC:return M.Sync;default:return M.None}};import{ulid as _}from"ulid";import{spawnSync as os}from"node:child_process";import is from"node:os";import Wr from"node:path";import{ulid as ss}from"ulid";import{accessSync as Ji,copyFileSync as Qi,existsSync as Tt,mkdirSync as kr,readdirSync as Or,readFileSync as Zi,renameSync as es,rmSync as ts,statSync as Ur,unlinkSync as ns,writeFileSync as rs}from"node:fs";import ze from"node:path";var ne={writeToFile:(e,t)=>{try{let n=ze.dirname(e);Tt(n)||kr(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);rs(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return Zi(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=ne.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 Tt(e)&&Ur(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Ji(e),!0}catch{return!1}},mkDir:e=>kr(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=ze.parse(t);for(;;){let r=ze.join(t,e);try{if(Tt(r)&&Ur(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=ze.dirname(t)}return null},readFirstJSON(e){try{if(!ne.dirExists(e))return null;let t=Or(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=ze.join(e,t);return ne.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return ne.dirExists(e)?Or(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{ns(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{ts(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(ze.dirname(t)),!n?.overwrite&&Tt(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{es(e,t)}catch(r){if(r?.code==="EXDEV"){Qi(e,t),this.rmFile(e);return}throw r}}};function as(){let{preferredEditor:e}=de(),t=[e,process.env.VISUAL,process.env.EDITOR,"vim","vi","nano"].filter(n=>!!n?.trim());return[...new Set(t)]}function ds(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function Hr(e){let t=Wr.join(is.tmpdir(),"epiq");ne.mkDir(t);let n=Wr.join(t,ss());ne.writeToFile(n,e??"");let r=as();for(let o of r){let i=ds(o,n),a=os(i,{stdio:"inherit",shell:!0});if(!a.error&&a.status===0){let d=ne.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 cs,ulid as Mt}from"ulid";var Rt=cs(),_r=({name:e,parent:t,userId:n})=>{let r=Rt(),o=Rt(),i=Rt(),a=Rt();return[{id:Mt(),userId:n,action:"add.issue",payload:{id:r,parent:t,name:e}},{id:Mt(),userId:n,action:"add.field",payload:{id:o,parent:r,name:"Description",val:""}},{id:Mt(),userId:n,action:"add.field",payload:{id:i,parent:r,name:"Assignees"}},{id:Mt(),userId:n,action:"add.field",payload:{id:a,parent:r,name:"Tags"}}]};var $r=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 ls=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[qe,Lt]=ls;var L=(e,t)=>s(`${t.split(".").join(" ")+" failed, "+e.toLowerCase()}`),ms={"init.workspace":({action:e,payload:t})=>{let{id:n,name:r}=t,o=G.workspace(n,r);Vr(o);let i=C.createNodeAtPosition(o);return l(i)?L(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=G.workspace(n,r),i=C.createNodeAtPosition(o);return l(i)?L(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(G.board(n,r,o));return l(i)?L(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(G.swimlane(n,r,o));return l(i)?L(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(G.ticket(n,r,o));return l(i)?L(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(G.field(n,r,o,{value:i},r.includes("Description")?"vertical":"horizontal"));return l(a)?L(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 L("Unable to locate node",e);let i=C.renameNode(n,r);return l(i)?L(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)?L(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)?L(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)?L(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)?L(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)?L(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)?L(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)?L(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 L("Unable to locate issue",e);if(!Be(r))return L("Can only close issues",e);let o=C.getNode(qe);if(!o)return L("Unable to locate target swimlane",e);if(o.id===r.parentNodeId)return L("Cannot close closed issue",e);let a=C.moveNode({id:n,parentId:o.id,navigate:!1});return l(a)?L(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 L("Unable to locate issue",e);if(!Be(r))return L("Can only reopen issues",e);let o=C.getNode(qe);if(!o)return L("Unable to locate closed swimlane",e);if(!(r.parentNodeId===o.id))return L("Issue is not closed",e);let a=$r(r);if(!a)return L("Unable to resolve previous parent from issue history",e);if(a===o.id)return L("Previous parent resolves to closed swimlane",e);if(!C.getNode(a))return L("Previous parent no longer exists",e);let m=C.moveNode({id:n,parentId:a,navigate:!1});return l(m)?L(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)?L(r.message??"Unable to lock node",e):c("Node locked",{action:e,result:r.data})}},us=(e,t)=>{let n=C.getNode(e);n&&C.updateNode({...n,log:[...n.log??[],t]})},ps=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 Ge(e,t=!1){let n=ms[e.action],r=n(e);if(l(r))return r;if(!t){let a=[...new Set(ps(e))];for(let d of a)us(d,e)}let[o,i]=e.userId.split(".");return!o?.length||!i?.length?L("Invalid user ID format",e.action):(C.createContributor({name:i,id:o}),r)}var Cn=e=>e.map(t=>Ge(t));import Dt from"node:fs";import ke from"node:path";import{decodeTime as Cs,monotonicFactory as Ns}from"ulid";var Pt=process.env.IS_LOCAL==="true",pe=()=>".epiq";import Nn from"node:fs";import En from"node:path";var gs=pe(),fs="events",xs=(e=process.cwd())=>En.join(Xe(e),gs,fs),ys=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])},vs=e=>{let{userId:t,...n}=e,r=ys(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 Kr(e=process.cwd()){let t=xs(e);if(!Nn.existsSync(t))return s("No events found");let n=Nn.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>En.join(t,o)),r=[];for(let o of n){let i=Nn.readFileSync(o,"utf8"),a=En.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",hs(r))}function
|
|
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 J(e){let t=
|
|
5
|
-
`),c("Config written",null)}catch{return s("Unable to write ~/.epiq/config.json")}},
|
|
2
|
+
import{render as Id}from"ink";import Sd from"meow";import Ii from"react";import ud from"chalk";import{Box as ue,Text as ke}from"ink";import D from"react";import nt from"chalk";import{monotonicFactory as ca,ulid as be}from"ulid";import{useSyncExternalStore as sa}from"react";var L={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function Oe(e){return e.context==="TICKET"}var sr=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}),c=(e,t)=>({result:he.Success,message:e,data:t}),ar=()=>({result:he.None,message:"No result",data:null}),l=e=>e.result==="fail",Ke=e=>e.result==="success";var p={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};function Ct(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var Nt=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",dr=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var cr=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},lr=(e,t)=>t?e.get(t)??[]:[];var mr=new WeakMap,Mi=e=>{let t=mr.get(e);return t||(t=cr(e),mr.set(e,t)),t};var ur=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return lr(Mi(e),r).filter(i=>Ct(r,i)>=n)};var pr=({inputToMatch:e,lastWord:t},n)=>{if(t.endsWith(" "))return{hint:"",hints:[],overlap:0,remainder:""};let r=ur({wordList:n,inputToMatch:e,overlapThreshold:1});return Ri(t,r)},Ri=(e,t)=>{let n=t[0]??"",r=Ct(e.toLowerCase(),n.toLowerCase()),o=n?n+" ":"",i=o.slice(r);return{hint:o,hints:t,overlap:r,remainder:i}};var gr=["vi","vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var je=24n,Li=je*4n,bt=(1n<<Li)-1n,Pi=/^[0-9a-f]+$/;function fr(e){if(!e||!Pi.test(e))throw new Error(`Invalid hex rank: ${e}`);return BigInt("0x"+e)}function Et(e,t=je){if(e<0n)throw new Error("Negative rank not allowed");return e.toString(16).padStart(Number(t),"0")}function at(e,t){if(!e&&!t)return Et(bt/2n,je);let n=e?fr(e):0n,r=t?fr(t):bt;if(r<=n)return Et(bt/2n,je);let o=(n+r)/2n;return o===n||o===r?"":Et(o,je)}function ce(){return Et(bt/2n,je)}var G={workspace:(e,t)=>({id:e,title:t,rank:ce(),isDeleted:!1,props:{},context:L.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r=!1)=>({id:e,title:t,rank:ce(),isDeleted:!1,props:{},context:L.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:r,log:[]}),swimlane:(e,t,n)=>({id:e,title:t,rank:ce(),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:ce(),isDeleted:!1,props:r,context:L.FIELD,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[]}),ticket:(e,t,n)=>({id:e,title:t,rank:ce(),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:ce(),isDeleted:!1,props:r,context:L.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:o,log:[]})};var H=e=>Object.values(h().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),yr=(e,t)=>e.findIndex(n=>n.id===t),cn=(e,t={at:"end"})=>{if(e.length===0)return c("Resolved rank",ce());switch(t.at){case"start":{let n=e[0];return n?c("Resolved rank",at(void 0,n.rank)):s("Unable to resolve first sibling")}case"end":{let n=e[e.length-1];return n?c("Resolved rank",at(n.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let n=yr(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",at(r?.rank,o.rank)):s("Sibling not found")}case"after":{let n=yr(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",at(r.rank,o?.rank)):s("Sibling not found")}}};var ze=(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}`)},mn=(e,t)=>{let{nodes:n}=h(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},ln=(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){se(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=ln(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=ln(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 H(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=ln(i,"move");if(d)return d;if(mn(t,e))return s("Cannot move node into its own descendant");let m=H(t).filter(x=>x.id!==e),u=cn(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 H(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 w({nodes:d}),k.navigate({currentNode:d[m],selectedIndex:0}),c("Successfully tomb stoned",o)},createContributor(e){let t=se(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(H(i.id).some(m=>m.props?.value===t))return s("Contributor already assigned");let d=this.createNodeAtPosition(G.field(n,r.name,i.id,{value:t}));return l(d)?d:c("Assigned contributor",d.data)},createTag(e){let t=se(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(H(i.id).some(m=>m.props?.value===t))return s("Tag already assigned");let d=this.createNodeAtPosition(G.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:ce()};return this.createNode(i),c("Created node",i)}let n=H(e.parentNodeId),r=cn(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=se(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=se(o=>({...o,nodes:{...o.nodes,[e]:n}}));return l(r)?s(r.message):c("Locked node",n)},updateNode(e){let t=se(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return l(t)?t:c("Updated node",e)},updateNodeAndSelectInParent(e){let t=se(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 It={preferredEditor:null,userName:null,userId:null},le=()=>It,dt=e=>(It={...It,...e},It);var St=()=>{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}},xr=()=>!At();var j={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#2a2f45",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},v={accent:j.cyan,accent2:j.magenta,primary:j.white,secondary:j.grayDark,secondary2:j.grayLight,gray:j.gray,green:j.green,yellow:j.yellow,red:j.red};var y={red:j.red,yellow:j.yellow,green:j.green,blue:j.blue,magenta:j.magenta,cyan:j.cyan},qe={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 K=e=>{let{currentNode:t}=h(),n=St().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]:[...gr,"vim"],[g.TAG]:[...new Set([...Object.keys(qe),...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?xr()||(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 yn from"chalk";import Ge from"chalk";var pn={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Di=(e,t,n)=>Math.max(t,Math.min(n,e)),un=(e,t,n)=>e+(t-e)*n,vr=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Fi=(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)]},ki=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,Bi=(e,t,n)=>[Math.round(un(e[0],t[0],n)),Math.round(un(e[1],t[1],n)),Math.round(un(e[2],t[2],n))],ct=e=>{let n=vr(e)%360,r=Fi(n,pn.stringColor.saturation,pn.stringColor.lightness);return ki(r)},Oi=e=>{let t=pn.gradient.stops,n=Di(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 Bi(t[i],t[i+1],a)},wt=e=>vr(e.toLowerCase().trim())/4294967295,hr=e=>{let t=wt(e);return Oi(t)},Ui=e=>{let[t,n,r]=hr(e);return{normal:o=>Ge.bgRgb(t,n,r).black(o),cursor:o=>Ge.bgRgb(t,n,r).white.bold(o)}},gn=e=>{let[t,n,r]=hr(e);return{fg:o=>Ge.rgb(t,n,r)(o),fgCursor:o=>Ge.rgb(t,n,r).inverse(o),bg:o=>Ge.bgRgb(t,n,r).black(o),bgCursor:o=>Ge.bgRgb(t,n,r).white.bold(o)}},fn=e=>Ui(e).normal(` ${e} `),ae=(e,t=qe)=>{let r=(o=>o.toLowerCase().trim())(e);return r&&t[r]?t[r]:ct(r)};var Ce="<ENTER> to confirm",X=(e="",t=[])=>({message:e,validity:ve.Valid,completionWordList:t}),me=({message:e,completionWordList:t})=>({validity:ve.Invalid,message:e,completionWordList:t}),lt=e=>e.length===0,Me=({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)=>wt(f)-wt(x)).slice(0,r).map(fn),u=m.length>i?m.join(" "):"";return u?`${e}${u}${n}`:""},xn=({modifier:e})=>{let t="confirm";return e===t?X(Ce):me({message:lt(e)?`if you are certain, enter ${fn(t)}`:"",completionWordList:[t]})},Wi=({list:e,hint:t})=>({modifier:n})=>e.includes(n)?X(Ce):me({message:lt(n)?t:"",completionWordList:[]}),Hi=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?me({message:n,completionWordList:[]}):X():me({message:lt(r)?t:"",completionWordList:[]}),vn=({hint:e})=>({modifier:t,inputString:n})=>lt(t)&<(n)?me({message:e,completionWordList:[]}):X(Ce),_i={[g.INIT]:()=>X(Ce),[g.FILTER]:e=>{if(e.modifier==="clear")return X();let t=a=>K(g.FILTER).includes(a);if(!e.modifier||!t(e.modifier??""))return me({message:Me({wordList:K(g.FILTER),noOfHints:100,inputString:e.inputString}),completionWordList:K(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:Me({prefix:`existing ${e.modifier}s... `,wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i}):X():me({message:Me({prefix:"one of... ",wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i})},[g.NONE]:e=>e.command?X():me({message:Me({prefix:"commands... ",wordList:K(g.NONE),noOfHints:100,inputString:e.inputString,minLengthForHints:0}),completionWordList:[]}),[g.NEW]:e=>Hi({list:K(g.NEW),hint:Me({wordList:K(g.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[g.SET_DESCRIPTION]:()=>X(Ce),[g.HELP]:()=>X(Ce),[g.RENAME]:()=>X(Ce),[g.DELETE]:e=>xn(e),[g.CLOSE_ISSUE]:e=>xn(e),[g.RE_OPEN_ISSUE]:e=>xn(e),[g.MOVE]:e=>vn({hint:Me({prefix:"hey hacker! These commands are blocked for you... ",wordList:K(g.MOVE),noOfHints:10,inputString:e.inputString})})(e),[g.TAG]:e=>{let t=C.getExistingTags().map(n=>` ${yn.bgHex(ae(n))(" "+n+" ")} `).slice(0,10);return vn({hint:"tag name like... "+t.join("")})(e)},[g.ASSIGN]:e=>{let t=C.getExistingAssignees().map(n=>` ${yn.bgHex(ae(n))(" "+n+" ")} `).slice(0,10);return vn({hint:"assign to... "+t.join("")})(e)},[g.SET_EDITOR]:e=>{logger.debug(`Validating command: ${e.command} ${e.modifier} ${e.inputString}`);let t=K(g.SET_EDITOR);return e.modifier?X(Ce):me({message:Me({wordList:t,noOfHints:100,inputString:e.inputString}),completionWordList:[]})},[g.SET_USERNAME]:e=>e.inputString?X():me({message:`Enter a username. Saved in ${yn.bgBlack("~/.epiqrc")}`,completionWordList:[]}),[g.SET_VIEW]:e=>Wi({list:K(g.SET_VIEW),hint:Me({wordList:K(g.SET_VIEW),noOfHints:3,inputString:e.inputString})})(e),[g.SYNC]:()=>X(Ce)},Cr=Object.fromEntries(Object.entries(_i).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var Nr=["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 br=e=>Object.values(g).includes(e),Er=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:a,validity:d,completionWordList:m}=Cr[n].validate(n,r,i),u=o==="command"?Object.values(g):n&&e.target==="modifier"?K(n):Nr;return{validity:d,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:a??"",autoCompletion:t?pr(e,[...m,...u]):{hint:"",hints:[],remainder:"",overlap:0}}};var Ir=e=>{let t=e.trimStart(),n=Vi(t),r=(n[0]??"").trimStart().trimEnd(),o=(n[1]??"").trimStart().trimEnd(),i=Ki(e),a=br(r)?r:null,d=a!==null,m=r!=="",u=e.endsWith(" "),f=a?K(a)??[]:[],x=a&&f.includes(o)?o:"",N="word";n.length<=1?N="command":n.length===2&&(N="modifier");let A=$i(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}},$i=(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},Vi=e=>e?e.split(/\s+/):[],Ki=e=>e.trimEnd().split(/\s+/).at(-1)??"";var Sr=" ",z={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:ve.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},hn=new Set,Ar=()=>{for(let e of hn)e()},wr=e=>(hn.add(e),()=>hn.delete(e)),Ne=e=>{let n=e(z),r=Ir(n.value),o=n.cursorPosition===n.value.length;z={...n,commandMeta:Er(r,o)},Ar()},Tt=({message:e,result:t})=>{let n=structuredClone(z);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,z=n,Ar(),c(e,null)},Cn=e=>{Ne(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},Nn=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}})},Tr=()=>{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}})},Mr=()=>{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}})},_=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}})},Rr=()=>{Ne(e=>({...e,commandIsPending:!0}))},Lr=({addToHistory:e=!0})=>{Ne(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),ji()},Pr=()=>{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}})},Dr=()=>{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=()=>_(()=>""),pe=()=>z,Mt=()=>{let[e,...t]=z.value.split(Sr);return t.join(Sr).trim()};var zi=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",qi=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",Gi=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",Fr=(e,t)=>{if(qi(e,e.sequence))return"MoveCursorLeftOfWord";if(Gi(e,e.sequence))return"MoveCursorRightOfWord";if(zi(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 Xi(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 Yi(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 kr(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 Fr(e,n.value);let r=Xi(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 Yi(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 Br=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 os}from"node:child_process";import is from"node:os";import Hr from"node:path";import{ulid as ss}from"ulid";import{accessSync as Ji,copyFileSync as Qi,existsSync as Rt,mkdirSync as Or,readdirSync as Ur,readFileSync as Zi,renameSync as es,rmSync as ts,statSync as Wr,unlinkSync as ns,writeFileSync as rs}from"node:fs";import Xe from"node:path";var ne={writeToFile:(e,t)=>{try{let n=Xe.dirname(e);Rt(n)||Or(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);rs(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return Zi(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=ne.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 Rt(e)&&Wr(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Ji(e),!0}catch{return!1}},mkDir:e=>Or(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=Xe.parse(t);for(;;){let r=Xe.join(t,e);try{if(Rt(r)&&Wr(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=Xe.dirname(t)}return null},readFirstJSON(e){try{if(!ne.dirExists(e))return null;let t=Ur(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=Xe.join(e,t);return ne.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return ne.dirExists(e)?Ur(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{ns(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{ts(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(Xe.dirname(t)),!n?.overwrite&&Rt(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{es(e,t)}catch(r){if(r?.code==="EXDEV"){Qi(e,t),this.rmFile(e);return}throw r}}};function as(){let{preferredEditor:e}=le(),t=[e,process.env.VISUAL,process.env.EDITOR,"vim","vi","nano"].filter(n=>!!n?.trim());return[...new Set(t)]}function ds(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function _r(e){let t=Hr.join(is.tmpdir(),"epiq");ne.mkDir(t);let n=Hr.join(t,ss());ne.writeToFile(n,e??"");let r=as();for(let o of r){let i=ds(o,n),a=os(i,{stdio:"inherit",shell:!0});if(!a.error&&a.status===0){let d=ne.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 cs,ulid as Lt}from"ulid";var Pt=cs(),$r=({name:e,parent:t,userId:n})=>{let r=Pt(),o=Pt(),i=Pt(),a=Pt();return[{id:Lt(),userId:n,action:"add.issue",payload:{id:r,parent:t,name:e}},{id:Lt(),userId:n,action:"add.field",payload:{id:o,parent:r,name:"Description",val:""}},{id:Lt(),userId:n,action:"add.field",payload:{id:i,parent:r,name:"Assignees"}},{id:Lt(),userId:n,action:"add.field",payload:{id:a,parent:r,name:"Tags"}}]};var Vr=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 ls=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[Ye,Dt]=ls;var P=(e,t)=>s(`${t.split(".").join(" ")+" failed, "+e.toLowerCase()}`),ms={"init.workspace":({action:e,payload:t})=>{let{id:n,name:r}=t,o=G.workspace(n,r);Kr(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=G.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(G.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(G.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(G.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(G.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(!Oe(r))return P("Can only close issues",e);let o=C.getNode(Ye);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(!Oe(r))return P("Can only reopen issues",e);let o=C.getNode(Ye);if(!o)return P("Unable to locate closed swimlane",e);if(!(r.parentNodeId===o.id))return P("Issue is not closed",e);let a=Vr(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})}},us=(e,t)=>{let n=C.getNode(e);n&&C.updateNode({...n,log:[...n.log??[],t]})},ps=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 Je(e,t=!1){let n=ms[e.action],r=n(e);if(l(r))return r;if(!t){let a=[...new Set(ps(e))];for(let d of a)us(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 En=e=>e.map(t=>Je(t));import kt from"node:fs";import Ue from"node:path";import{decodeTime as Cs,monotonicFactory as Ns}from"ulid";var Ft=process.env.IS_LOCAL==="true",ge=()=>".epiq";import In from"node:fs";import Sn from"node:path";var gs=ge(),fs="events",ys=(e=process.cwd())=>Sn.join(Qe(e),gs,fs),xs=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])},vs=e=>{let{userId:t,...n}=e,r=xs(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 jr(e=process.cwd()){let t=ys(e);if(!In.existsSync(t))return s("No events found");let n=In.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>Sn.join(t,o)),r=[];for(let o of n){let i=In.readFileSync(o,"utf8"),a=Sn.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",hs(r))}function zr(e=process.cwd()){let t=jr(e);if(l(t))return s(t.message);let n=[];for(let r of t.data){let o=vs(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 qr(e=process.cwd()){let t=jr(e);return l(t)?s(t.message):c("Loaded edge reference",t.data.at(-1)?.id?.[0]??null)}var hs=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 I=(f??"").localeCompare(N??"");return I!==0?I:u.localeCompare(x)});return[...r,...a]};var Gr=e=>({action:e.action,payload:e.payload});var bs=1,Xr=Ns(),Es="events",Yr=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",Y=()=>{let{userName:e,userId:t}=le();if(!e)return s("User name not configured");if(!t)return s("User ID not configured");let n=`${Yr(t)}.${Yr(e)}`;return e.trim()?c("Successfully resolved actor ID",n):s("Unable to resolve actor ID from settings or OS user info")},Is=e=>kt.existsSync(Ue.join(e,ge()))&&kt.statSync(Ue.join(e,ge())).isDirectory(),Qe=(e=process.cwd())=>{let t=Ue.resolve(e);for(;;){if(Is(t))return t;let n=Ue.dirname(t);if(n===t)return Ue.resolve(e);t=n}},Jr=(e=process.cwd())=>Ue.join(Qe(e),ge(),Es),An=()=>{let e=Y();return l(e)||!e.data?s("Unable to resolve event log path"):c("Succeeded",`${e.data}.jsonl`)},Ss=(e=process.cwd())=>{let t=An();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",Ue.join(Jr(e),n)):s(`Invalid event log file name: ${n}`)},As=(e,t)=>({[e.action]:e.payload,v:bs,id:t});function Qr(e,t=process.cwd()){try{let n=Qe(t),r=Jr(n),o=Ss(n);if(l(o))return o;kt.mkdirSync(r,{recursive:!0});let i=qr(n);if(l(i))return s(i.message);let a;if(i.data){let m=Cs(i.data),u=Math.max(Date.now(),m+1);a=Xr(u)}else a=Xr();let d=As(Gr(e),[a,i.data]);return kt.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 J(e){let t=Je(e);if(t.result!==he.Success)return t;let n=Qr(e);return l(n)?n:t}function Bt(e){return e.map(t=>J(t))}import{ulid as Zr}from"ulid";var Ze=null,We=()=>structuredClone(Ze),et=e=>Ze=e,eo=()=>{let{currentNode:e,selectedIndex:t}=h(),r=M(e.id)[t];return r?c("Resolved selected child",r):s("Target node not found")};function wn(e){let t=eo();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=H(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=Y();if(l(m))return s("Unable to resolve user ID");let u=m.data;if(et({id:Zr(),userId:u,action:"move.node",payload:{id:t.data.id,parent:d.id,pos:{at:"end"}}}),!Ze)return s("Could not materialize move state");let f=Je(Ze,!0);return l(f)?f:c("Node moved successfully",f.data)}function Tn(e){let t=eo();if(l(t))return t;let{currentNode:n,selectedIndex:r}=h(),i=H(n.id)[r+e];if(!i)return s("Missing sibling node");let a=Y();if(l(a))return s("Unable to resolve user ID");let d=a.data;if(et({id:Zr(),userId:d,action:"move.node",payload:{id:t.data.id,parent:n.id,pos:{at:e===1?"after":"before",sibling:i.id}}}),!Ze)return s("Could not materialize move state");let m=Je(Ze,!0);return l(m)?m:c("Node moved successfully",m.data)}import ws from"node:os";import to from"node:path";var Ts={userId:"",userName:"",preferredEditor:""},Ms=".epiq",Rs="config.json",no=()=>to.join(ws.homedir(),Ms),Mn=()=>to.join(no(),Rs),Rn=()=>{try{return ne.mkDir(no()),c("Ensured ~/.epiq exists",null)}catch{return s("Unable to create ~/.epiq")}},Ls=e=>{try{let t=JSON.parse(e);return c("Parsed config",t??{})}catch{return s("Invalid ~/.epiq/config.json JSON")}},ro=()=>{let e=Rn();if(l(e))return s(e.message);let t=Mn(),n=ne.readFile(t);return n==null||n.trim()===""?c("No config found, using empty config",{}):Ls(n)},oo=e=>{let t=Rn();if(l(t))return s(t.message);let n=Mn();try{return ne.writeToFile(n,JSON.stringify(e,null,2)+`
|
|
5
|
+
`),c("Config written",null)}catch{return s("Unable to write ~/.epiq/config.json")}},Ln=e=>{let t=ro();if(l(t))return s("Failed to read existing config");let n={...t.data,...e};return oo(n)},io=()=>{let e=Mn(),t=Rn();if(l(t))throw new Error("Unable to create ~/.epiq");if(!(ne.readFile(e)!==null)){let d=oo(Ts);if(l(d))throw new Error("Unable to create ~/.epiq/config.json")}let r=ro();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"):dt({preferredEditor:o,userName:i,userId:a})};var tt=(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 ks}from"node:crypto";import B from"node:fs";import Bs from"node:os";import re from"node:path";import mt from"fs";import ao from"path";import Ps from"util";var so=1e3,co=(e=process.cwd())=>ao.join(Qe(e),ge(),"log","epiq.log");function Ds(e=process.cwd()){if(!Ft)return;let t=co(e);if(!mt.existsSync(t))return;let r=mt.readFileSync(t,"utf8").split(`
|
|
6
|
+
`);if(r[r.length-1]===""&&r.pop(),r.length<=so)return;let o=r.slice(-so).join(`
|
|
7
|
+
`)+`
|
|
8
|
+
`;mt.writeFileSync(t,o,"utf8")}function Pn(e,t,n=!1,r=process.cwd()){if(!Ft)return;let o=co(r),i=Ps.format(...t),a=new Date,m=`[${n?a.toISOString().slice(11,19):a.toISOString()}] ${e} ${i}
|
|
9
|
+
`;mt.mkdirSync(ao.dirname(o),{recursive:!0}),mt.appendFileSync(o,m,"utf8"),Ds(r)}var b={info(...e){Pn("[Info]",e,!1)},debug(...e){Pn("->",e,!0)},error(...e){Pn("[Error]",[...e,new Error().stack],!1)}};globalThis.logger=b;import{spawn as lo}from"node:child_process";import Dn from"node:fs";import He from"node:path";var O=({args:e,cwd:t})=>new Promise(n=>{if(!Dn.existsSync(t))return n(s(`Git cwd does not exist: ${t}`));let r=lo("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(`
|
|
6
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(`
|
|
7
|
-
`)));return}n(c("Git command succeeded",{stdout:o,stderr:i,exitCode:d}))})}),
|
|
8
|
-
`).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(i=>
|
|
9
|
-
${
|
|
10
|
-
${
|
|
11
|
-
${
|
|
12
|
-
${i.message}`);let a=await
|
|
13
|
-
${a.message}`):c("Created local
|
|
14
|
-
${r.message}`):c("Created local
|
|
15
|
-
${r.message}`):c("Created
|
|
16
|
-
${o.message}`);let i=await
|
|
17
|
-
${a.message}`)}}return
|
|
18
|
-
${n.message}`):c("Checked out
|
|
19
|
-
${i.message}`);let a=await
|
|
20
|
-
${a.message}`):c("Configured
|
|
21
|
-
${o.message}`):c("Published
|
|
22
|
-
${n.message}`):c("Staged
|
|
23
|
-
${i.message}`);let a=await
|
|
24
|
-
${n.message}`):c("Pushed
|
|
25
|
-
`));S=w.data;let k=No({repoRoot:o,worktreeRoot:i,skipFileNames:[n.data]});return l(k)?s(k.message):(b=k.data,c("Synced board event logs via git",{repoRoot:o,worktreeRoot:i,createdCommit:f,commitSha:y,pulled:N,pushed:S,hydrated:b,bootstrapped:d.data}))},So=async(e=process.cwd())=>{let t=await Rn(e);if(l(t))return s(t.message);let n=t.data,r=ho(n),o=await ct(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 Fn(n);if(l(i))return s(i.message);let a=await Eo({repoRoot:n,worktreeRoot:r,ensureUpstream:!1});if(l(a))return s(a.message);let d=await ct(r);if(l(d))return s(d.message);if(d.data)return s("Cannot sync while a git operation is in progress in the board worktree");let m=Io(n,r);if(l(m))return s(m.message);let u=await Bn({cwd:r,remote:le,branch:O});if(l(u))return s(u.message);let f=No({repoRoot:n,worktreeRoot:r});return l(f)?s(f.message):c("Synced from remote",{repoRoot:n,worktreeRoot:r})};var Js=e=>Object.values(h().tags).find(t=>t.name===e),Qs=e=>Object.values(h().contributors).find(t=>t.name===e),Ao=[{systemOnly:!0,intent:M.Move,mode:p.COMMAND_LINE,action:()=>{let e=Y();if(l(e))return s("Unable to resolve user ID");let t=e.data,{modifier:n}=ue().commandMeta,{currentNode:r,selectedIndex:o}=h(),i=T(r.id)[o];if(!i)return A({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=T(i.parentNodeId),d=a.findIndex(({id:y})=>y===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 Je({id:_(),userId:t,action:"move.node",payload:{id:i.id,parent:i.parentNodeId,pos:f}}),A({mode:p.MOVE}),c("Move initialized",null)}if(n==="next")return A({mode:p.MOVE}),Sn(1);if(n==="previous")return A({mode:p.MOVE}),Sn(-1);if(n==="to-next")return A({mode:p.MOVE}),bn(1);if(n==="to-previous")return A({mode:p.MOVE}),bn(-1);if(n==="confirm"){A({mode:p.DEFAULT});let a=Oe();if(!a)return s("No pending move to confirm");let d=J(a);return l(d)?d:(Je(null),c("Moved item",null))}return n==="cancel"?(Je(null),A({mode:p.DEFAULT}),c("Cancelling move",null)):s("Invalid move modifier")}},{intent:M.Delete,mode:p.COMMAND_LINE,action:()=>{let e=Y();if(l(e))return s("Unable to resolve user ID");let t=e.data,{currentNode:n,selectedIndex:r}=h(),o=T(n.id)[r];return o?J({id:_(),userId:t,action:"delete.node",payload:{id:o.id}}):s("Unable to resolve child to delete")},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.Edit,mode:p.COMMAND_LINE,action:()=>{let e=Y();if(l(e))return s("Unable to resolve user ID");let t=e.data,n=Qe(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(!T(r.id)[i])return s("No selected field");let d=T(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=Hr(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"?J({id:_(),userId:t,action:"edit.description",payload:{id:d.id,md:f}}):d.title==="Title"?J({id:_(),userId:t,action:"edit.title",payload:{id:d.id,name:f}}):s(`Editing not supported for "${d.title}"`)},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.Filter,mode:p.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=ue().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 ie(d=>({...d,filters:e==="clear"?[]:[...d.filters,a],mode:p.DEFAULT})),c("Viewing help",null)}},{intent:M.ViewHelp,mode:p.COMMAND_LINE,action:()=>(A({mode:p.HELP}),c("Viewing help",null))},{intent:M.CloseIssue,mode:p.COMMAND_LINE,action:()=>{let e=Y();if(l(e))return s("Unable to resolve user ID");let t=e.data,{currentNode:n,selectedIndex:r}=h(),o=T(n.id)[r];if(!o)return s("Unable to close issue, no target found");if(!o.parentNodeId)return s("No target parent found");if(!Be(o))return s("Cannot close in this context");let i=J({id:_(),userId:t,action:"close.issue",payload:{id:o.id,parent:o.parentNodeId}});return l(i)?i:c("Viewing help",null)}},{intent:M.ReopenIssue,mode:p.COMMAND_LINE,action:()=>{let e=Y();if(l(e))return s("Unable to resolve user ID");let t=e.data,{currentNode:n,selectedIndex:r}=h(),o=T(n.id)[r];if(!o)return s("Unable to reopen issue, no target found");let i=o.context==="TICKET"?c("Resolved ticket",o):Ve(o.id,"TICKET");if(l(i))return s("Cannot reopen in this context");let a=i.data,d=J({id:_(),userId:t,action:"reopen.issue",payload:{id:a.id}});return l(d)?d:c("Issue reopened",null)},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.SetUserName,mode:p.COMMAND_LINE,action:()=>{let{userId:e,preferredEditor:t,userName:n}=de(),r=wt()?.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=Tn({userName:o,userId:i,preferredEditor:t??""});return l(a)?a:(st({userName:o,userId:i}),A({mode:p.DEFAULT}),c(`Username set to "${r}"`,null))}},{intent:M.Init,mode:p.COMMAND_LINE,action:()=>{let e=wo();if(l(e))return e;let{rootNodeId:t,nodes:n}=h();return D.navigate({currentNode:n[t],selectedIndex:0}),c("Project initialized",null)}},{intent:M.SetEditor,mode:p.COMMAND_LINE,action:()=>{let e=wt()?.trim();if(!e)return s("No editor provided");let t=Tn({preferredEditor:e});return l(t)?t:(st({preferredEditor:e}),A({mode:p.DEFAULT}),c(`Editor configuration set to "${e}"`,null))}},{intent:M.NewItem,mode:p.COMMAND_LINE,action:(e,t)=>{let n=Y();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=J(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 y=C.getNode(f.parentNodeId);return y?(D.navigate({currentNode:y,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=Qe(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=T(i.id)[a],u=i.context==="SWIMLANE"?i:i.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let b=Qe(o,"SWIMLANE");return l(b)?null:b.data})();if(!u)return s("Unable to add issue in this context");let f=_r({userId:r,name:t.inputString,parent:u.id}),y=Ft(f);if(y.some(b=>l(b)))return s("Issue create failed: "+y.filter(l).map(b=>b.message).filter(Boolean).join(", "));let N=y[0];if(!N||l(N))return s("Issue creation failed");let S=f[0]?.payload.id;return S?(D.navigate({currentNode:u,selectedIndex:C.getSiblings(u.id).findIndex(({id:b})=>b===S)}),c("Issue created",null)):s("Unable to determine ticket id")}return sr()},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.SetView,mode:p.COMMAND_LINE,action:()=>{let{commandMeta:e}=ue();return e.validity===ye.Invalid?s("Invalid command "+ve):(ie(t=>({...t,viewMode:e.modifier==="wide"?"wide":e.modifier==="dense"?"dense":t.viewMode})),c("View set",null))},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.Rename,mode:p.COMMAND_LINE,action:()=>{let e=Y();if(l(e))return s("Unable to resolve user ID");let t=e.data,{currentNode:n,selectedIndex:r}=h(),o=T(n.id)[r];if(!o)return s("Missing node");if(o.readonly)return s("Cannot rename readonly node");let i=wt();return i?J({id:_(),userId:t,action:"edit.title",payload:{id:o.id,name:i}}):s("Provide a new name")},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.TagTicket,mode:p.COMMAND_LINE,action:()=>{let e=Y();if(l(e))return s("Unable to resolve user ID");let t=e.data,{modifier:n,inputString:r}=ue().commandMeta,o=(n||r).trim();if(!o)return s("Provide a tag");let{selectedIndex:i,currentNode:a}=h(),d=T(a.id)[i];if(!d)return s("Invalid tag target");let m=Ve(d.id,"TICKET");if(l(m))return s("Unable to tag issue in this context");let u=m.data,f=Js(o),y;if(f)y=f.id;else{let b=_(),I=J({id:_(),userId:t,action:"create.tag",payload:{id:b,name:o}});if(l(I))return I;y=I.data.result.id}let N=C.getFieldByTitle(u.id,"Tags");return N?T(N.id).some(b=>b.props?.value===y)?s("Already tagged with that tag"):J({id:_(),userId:t,action:"tag.issue",payload:{id:_(),target:u.id,tagId:y}}):s("Unable to locate tags field")},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.AssignUserToTicket,mode:p.COMMAND_LINE,action:()=>{let e=Y();if(l(e))return s("Unable to resolve user ID");let t=e.data,{modifier:n,inputString:r}=ue().commandMeta,o=(n||r).trim();if(!o)return s("Provide an assignee");let{selectedIndex:i,currentNode:a}=h(),d=T(a.id)[i];if(!d)return s("Invalid assign target");let m=Ve(d.id,"TICKET");if(l(m))return s("Unable to assign issue in this context");let u=m.data,f=Qs(o),y;if(f)y=f.id;else{let b=_(),I=J({id:_(),userId:t,action:"create.contributor",payload:{id:b,name:o}});if(l(I))return I;y=I.data.result.id}let N=C.getFieldByTitle(u.id,"Assignees");return N?T(N.id).some(b=>b.props?.value===y)?s("Assignee already assigned"):J({id:_(),userId:t,action:"assign.issue",payload:{id:_(),target:u.id,contributor:y}}):s("Unable to locate assignees field")},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.Sync,mode:p.COMMAND_LINE,action:async()=>{H(()=>""),A({syncStatus:{msg:"Syncing",status:"syncing"}});let{userId:e,userName:t}=de();if(!e)return s("Unable to resolve userId");if(!t)return s("Unable to resolve userName");let n=In();if(l(n))return s("Unable to resolve log file name");let r=await bo({ownEventFileName:n.data});return l(r)?(A({syncStatus:{msg:r.message,status:"outOfSync"}}),s(`Unable to sync state. ${r.message}`)):(A({syncStatus:{msg:"Synced",status:"synced"},mode:p.DEFAULT}),c("Synced",!0))}}];var oe=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=ue();if(!t)return s("No command to confirm");if(!e&&n===ye.Invalid)return s("Invalid command");let i=Br(t);Mr();let a=Ao.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===i);if(!a)return At({result:ve.Fail,message:"Command not found",data:null});let d=await a.action(a,{command:t,inputString:o,modifier:r});return l(d)?At(d):(Rr({addToHistory:!e}),a.onSuccess?.(),At(d))};var Ot=[{intent:"exit",mode:p.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(A({mode:p.COMMAND_LINE}),H(()=>"move cancel"),oe({isForceExecutedBySystem:!0}))},{intent:"initMove",mode:p.DEFAULT,description:"[m] move init/confirm",action:()=>(A({mode:p.COMMAND_LINE}),H(()=>"move start"),oe({isForceExecutedBySystem:!0}))},{intent:"confirmMove",mode:p.MOVE,action:()=>(A({mode:p.COMMAND_LINE}),H(()=>"move confirm"),oe({isForceExecutedBySystem:!0}))}],Ut=[{intent:"movePreviousItem",mode:p.MOVE,action:()=>Oe()?(A({mode:p.COMMAND_LINE}),H(()=>"move previous"),oe({isForceExecutedBySystem:!0})):s("No pending move")},{intent:"moveNextItem",mode:p.MOVE,action:()=>Oe()?(A({mode:p.COMMAND_LINE}),H(()=>"move next"),oe({isForceExecutedBySystem:!0})):s("No pending move")}],To=[{intent:"moveToNextContainer",mode:p.MOVE,action:()=>Oe()?(A({mode:p.COMMAND_LINE}),H(()=>"move to-next"),oe({isForceExecutedBySystem:!0})):s("No pending move")},{intent:"moveToPreviousContainer",mode:p.MOVE,action:()=>Oe()?(A({mode:p.COMMAND_LINE}),H(()=>"move to-previous"),oe({isForceExecutedBySystem:!0})):s("No pending move")}];var Mo={[R.WORKSPACE]:[...Ot,...Ut],[R.BOARD]:[...Ot,...Ut],[R.SWIMLANE]:[...Ot,...Ut,...To],[R.TICKET]:[],[R.FIELD]:[],[R.FIELD_LIST]:[],[R.TEXT]:[]};var Ro=[{intent:"addItem",mode:p.DEFAULT,description:"[n] new...",action:()=>(A({mode:p.COMMAND_LINE}),H(()=>`${g.NEW} `),c("Adding new item",null))},{intent:"Delete",mode:p.DEFAULT,description:"[d] delete",action:()=>(A({mode:p.COMMAND_LINE}),H(()=>`${g.DELETE} `),c("Deleting item",null))},{intent:"initCommandLine",mode:p.DEFAULT,description:"[:] focus command line",action:()=>(A({mode:p.COMMAND_LINE}),H(()=>""),c("Entering command line mode",null))},{intent:"confirm",mode:p.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>(D.enterChildNode(),c("Entering context",null))},{intent:"exit",mode:p.DEFAULT,description:"[q] exit context",action:()=>(logger.debug("Executing exit action"),D.enterParentNode(),c("Exiting context",null))},{intent:"navPreviousItem",mode:p.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(D.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:"navNextItem",mode:p.DEFAULT,action:()=>(D.navigateToNextItem(),c("Navigating to next item",null))},{intent:"navToPreviousContainer",mode:p.DEFAULT,action:()=>(D.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:"navToNextContainer",mode:p.DEFAULT,action:()=>(D.navigateToNextContainer(),c("Navigating to next container",null))},{intent:"edit",mode:p.DEFAULT,action:()=>(A({mode:p.COMMAND_LINE}),H(()=>"edit"),oe(),c("Fired command",!0))},{intent:"SetViewDense",mode:p.DEFAULT,description:"[v] view change (wide/dense)",action:()=>(A({viewMode:"dense"}),c("View set",null))},{intent:"SetViewWide",mode:p.DEFAULT,action:()=>(A({viewMode:"wide"}),c("View set",null))},{intent:"sync",mode:p.DEFAULT,description:"[s] sync epiq with remote state branch",action:()=>(A({mode:p.COMMAND_LINE}),H(()=>"sync"),oe({isForceExecutedBySystem:!0}),c("Synced",!0))}];var Lo=[{intent:"viewHelp",mode:p.DEFAULT,action:()=>(A({mode:p.HELP}),c("Viewing help",null))},{intent:"exit",mode:p.HELP,action:()=>(A({mode:p.DEFAULT}),c("Exiting help",null))},{intent:"confirm",mode:p.COMMAND_LINE,action:()=>(oe(),c("Executing command",null))},{intent:"MoveCursorLeft",mode:p.COMMAND_LINE,action:()=>(yn(-1),c("Moving cursor left",null))},{intent:"MoveCursorRight",mode:p.COMMAND_LINE,action:()=>(yn(1),c("Moving cursor right",null))},{intent:"MoveCursorLeftOfWord",mode:p.COMMAND_LINE,action:()=>(vn("left"),c("Moving cursor left of word",null))},{intent:"MoveCursorRightOfWord",mode:p.COMMAND_LINE,action:()=>(vn("right"),c("Moving cursor right of word",null))},{intent:"exitCommandLine",mode:p.COMMAND_LINE,action:()=>(A({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:()=>(wr(),c("Erasing input",null))},{intent:"EraseInputWord",mode:p.COMMAND_LINE,action:()=>(Tr(),c("Erasing input word",null))},{intent:"getLastCommandFromHistory",mode:p.COMMAND_LINE,action:()=>(Lr(),c("Getting last command from history",null))},{intent:"getNextCommandFromHistory",mode:p.COMMAND_LINE,action:()=>(Pr(),c("Getting next command from history",null))}];import Zs from"chalk";var Wt=": for command line",Po="q to exit",Do=`${Zs.hex(v.accent)("m")} to confirm`,On={[R.WORKSPACE]:[Wt],[R.BOARD]:[Wt],[R.BOARD+p.COMMAND_LINE]:[Wt],[R.SWIMLANE]:[Wt],[R.TICKET+p.HELP]:[Po],[R.SWIMLANE+p.HELP]:[Po],[R.TICKET]:[],[R.FIELD]:[],[R.SWIMLANE+p.MOVE]:[Do],[R.TICKET+p.MOVE]:[Do]};var Ht=e=>e.trim().toLocaleLowerCase(),ea=(e,t)=>{let n=C.getFieldByTitle(e,t);if(!n)return"";let r=n.props?.value;return typeof r=="string"?r:""},ta=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):[]},na=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):[]},Fo=(e,t)=>{let n=t.value;if(!n)return!0;switch(t.target){case"title":return Ht(e.title??"").includes(n);case"description":return Ht(ea(e.id,"Description")).includes(n);case"tag":return ta(e.id).map(Ht).some(d=>d.includes(n));case"assignee":return na(e.id).map(Ht).some(d=>d.includes(n));default:return!0}};function Bo(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 ko=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 _t,Un=new Set,Oo=()=>{for(let e of Un)e()},oa=e=>(Un.add(e),()=>Un.delete(e));function Uo(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=Bo(t,o,r);if(l(m))return logger.error(m.message),m;let u=m.data,{context:f}=d,y=On[f+n]??On[f]??[],N=[...Ro,...Mo[f]??[],...Lo],S=ko(N);return c("Derived successfully",{...e,currentNode:d,breadCrumb:u,availableHints:y,availableActions:N,actionIndex:S,renderedChildrenIndex:ia(o,i)})}var h=()=>(_t||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),_t);function Vr(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=Uo(t);return l(n)?n:(_t=n.data,Oo(),c("State initialized",null))}function ie(e){let t=h(),n=e(t),r=Uo(n);return l(r)?s(r.message??"Unable to update state"):(_t=r.data,Oo(),c("State updated",null))}var A=e=>ie(t=>({...t,...e}));var $=()=>ra(oa,h,h),ia=(e,t)=>{let n={};for(let r of Object.values(e))Be(r)&&t.length>0&&!t.every(o=>Fo(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},T=e=>h().renderedChildrenIndex[e]??[];var D={exit(){process.exit(0)},enterChildNode(){let e=h(),t=e.currentNode,n=Math.max(0,e.selectedIndex),r=T(t.id)[n];!r||t.context==="FIELD"||D.navigate({currentNode:r,selectedIndex:T(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=T(n.id),o=r.findIndex(({id:a})=>a===e.id),i=r.length===0?-1:o>=0?o:0;D.navigate({currentNode:n,selectedIndex:i})},navigateToNextItem:()=>Wo(1),navigateToPreviousItem:()=>Wo(-1),navigateToNextContainer:()=>Ho(1),navigateToPreviousContainer:()=>Ho(-1),navigate:({currentNode:e=h().currentNode,selectedIndex:t})=>{A({currentNodeId:e.id,selectedIndex:t})}},Wo=e=>{let t=h(),n=T(t.currentNode.id).length;if(n===0)return;let o=(Math.max(0,t.selectedIndex)+e+n)%n;D.navigate({selectedIndex:o})},Ho=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=T(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=T(d.id),u=Math.max(0,m.length-1),f=Math.min(Math.max(0,r),u),y=m.length?f:-1;D.navigate({currentNode:d,selectedIndex:y})};var Ee="system.actor",mt=sa(),Me=null;function aa(){let e=Object.values(h().nodes).find(r=>r.context==="WORKSPACE");if(!e)throw new Error("No workspace found in event log");let[t]=T(e.id),[n]=t?T(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 da(){let e=aa();D.navigate(e)}function ca(){let e=mt(),t=mt(),n=mt(),r=mt(),o=mt();return[{id:Ne(),userId:Ee,action:"init.workspace",payload:{id:e,name:"Workspace"}},{id:Ne(),userId:Ee,action:"add.board",payload:{id:t,name:"Default",parent:e}},{id:Ne(),userId:Ee,action:"add.swimlane",payload:{id:n,name:"Todo",parent:t}},{id:Ne(),userId:Ee,action:"add.swimlane",payload:{id:r,name:"Review",parent:t}},{id:Ne(),userId:Ee,action:"add.swimlane",payload:{id:o,name:"Done",parent:t}},{id:Ne(),userId:Ee,action:"add.board",payload:{id:Lt,name:"Closed",parent:e}},{id:Ne(),userId:Ee,action:"add.swimlane",payload:{id:qe,name:"Closed",parent:Lt}},{id:Ne(),userId:Ee,action:"lock.node",payload:{id:Lt}},{id:Ne(),userId:Ee,action:"lock.node",payload:{id:qe}}]}function bt(){return Me!==null}function wo(){if(!Me||Me.length===0)return c("No pending default events to persist",null);let t=Ft(Me).filter(l);return t.length>0?s([et.bold.red("Materializing failed"),"",...t.map((n,r)=>`${et.dim.gray(`${r+1}.`)} ${et.dim(n.message)}`),`
|
|
11
|
+
`)));return}n(c("Git command succeeded",{stdout:o,stderr:i,exitCode:d}))})}),Re=({args:e,cwd:t})=>new Promise(n=>{if(!Dn.existsSync(t))return n({stdout:"",stderr:`Git cwd does not exist: ${t}`,exitCode:1});let r=lo("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})})}),Fn=async(e=process.cwd())=>{let t=await O({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")},Fs=async e=>{let t=await O({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=He.isAbsolute(n)?n:He.join(e,n);return c("Resolved git dir",r)},ut=async e=>{let t=await Fs(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",He.join("rebase-merge"),He.join("rebase-apply")].filter(i=>Dn.existsSync(He.join(n,i)));return c("Checked for in-progress Git operation",o.length>0)},Ot=async({repoRoot:e,remote:t})=>{let n=await Re({args:["remote","get-url",t],cwd:e});return c("Checked remote",n.exitCode===0)},Ut=async({repoRoot:e,remote:t,branch:n})=>{let r=await Re({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)},mo=async({repoRoot:e,branch:t})=>{let n=await Re({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}`)},kn=async({repoRoot:e,worktreeRoot:t})=>{let n=await O({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=He.resolve(t),o=n.data.stdout.split(`
|
|
12
|
+
`).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(i=>He.resolve(i)).includes(r);return c("Checked worktree registration",o)},Wt=async e=>{let t=await Re({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return c("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},Bn=async e=>{let t=await O({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")},uo=async e=>{let t=await O({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")},On=async({cwd:e,remote:t,branch:n})=>{let r=await Wt(e);if(l(r))return s(r.message);if(!r.data)return c("No upstream configured, skipped pull",!1);let o=await Ut({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 O({args:["fetch",t,n],cwd:e});if(l(i))return s(`Failed to fetch ${n}
|
|
13
|
+
${i.message}`);if(!i.data)return s("Git command returned no fetch result data");let a=await O({args:["pull","--rebase"],cwd:e});return l(a)?s(`Failed during pull --rebase
|
|
14
|
+
${a.message}`):a.data?c("Pulled with rebase",!0):s("Git command returned no pull result data")};var xo=ge(),vo="events",F="epiq-state-5",Q="origin",ho=e=>re.join(xo,vo,e),Os=e=>ks("sha1").update(e).digest("hex").slice(0,12),Co=()=>re.join(Bs.homedir(),".epiq"),No=()=>re.join(Co(),"worktrees"),bo=e=>re.join(No(),Os(e)),Eo=e=>re.join(e,xo),pt=e=>re.join(Eo(e),vo),po=({root:e,fileName:t})=>re.join(pt(e),t),Un=e=>(b.debug("[sync] ensure dir",e),B.mkdirSync(e,{recursive:!0}),c("Ensured directory",void 0)),Us=()=>{b.debug("[sync] ensure epiq storage");let e=Un(Co());if(l(e))return s(e.message);let t=Un(No());return l(t)?s(t.message):c("Ensured epiq storage",void 0)},go=e=>{let t=Eo(e);return B.existsSync(t)?(b.debug("[sync] epiq dir exists",t),c("Epiq dir already exists",!1)):(b.debug("[sync] create epiq dir",t),B.mkdirSync(t,{recursive:!0}),c("Created epiq dir",!0))},fo=e=>{let t=pt(e);return B.existsSync(t)?(b.debug("[sync] events dir exists",t),c("Events dir already exists",!1)):(b.debug("[sync] create events dir",t),B.mkdirSync(t,{recursive:!0}),c("Created events dir",!0))},Ws=e=>{B.existsSync(e)&&(b.debug("[sync] remove path",e),B.rmSync(e,{recursive:!0,force:!0}))},Hs=e=>{let t=pt(e);if(!B.existsSync(t))return b.debug("[sync] events dir missing",t),c("Events dir missing",[]);let n=B.readdirSync(t,{withFileTypes:!0}).filter(r=>r.isFile()).map(r=>r.name).filter(r=>r.endsWith(".jsonl")).sort();return b.debug("[sync] listed event files",{eventsDir:t,count:n.length}),c("Listed event files",n)},_s=async e=>{b.debug("[sync] inspect local HEAD",e);let t=await Re({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")},$s=async e=>{b.debug("[sync] inspect remote history",{repoRoot:e,remote:Q});let t=await Ot({repoRoot:e,remote:Q});if(l(t))return s(t.message);if(!t.data)return c("No remote configured",!1);let n=await Re({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 b.debug("[sync] remote history",r),c("Checked remote history",r)},Io=async e=>{b.debug("[sync] ensure initial commit");let t=await _s(e);if(l(t))return s(t.message);if(t.data)return b.debug("[sync] local HEAD exists"),c("Repo already initialized",!1);let n=await $s(e);if(l(n))return s(n.message);if(n.data)return b.debug("[sync] skip local init commit due to remote history"),c("Skipped local init commit because remote history exists",!1);b.debug("[sync] create empty init commit");let r=await O({args:["commit","--allow-empty","-m","[epiq:init]"],cwd:e});return l(r)?s(`Failed to create initial commit
|
|
15
|
+
${r.message}`):c("Created initial commit",!0)},Vs=({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=po({root:e,fileName:n}),o=po({root:t,fileName:n});if(!B.existsSync(r))return b.debug("[sync] local own event file missing",r),c("Local own event file missing, nothing to copy",!1);let i=B.readFileSync(r,"utf8"),a=B.existsSync(o)?B.readFileSync(o,"utf8"):"";return i===a?(b.debug("[sync] own event file already matches remote",n),c("Own event file already matches remote worktree",!1)):(b.debug("[sync] copy own event file to remote",n),B.mkdirSync(re.dirname(o),{recursive:!0}),B.copyFileSync(r,o),c("Copied own event file into remote worktree",!0))},So=({repoRoot:e,worktreeRoot:t,skipFileNames:n=[]})=>{let r=Hs(t);if(l(r))return s(r.message);let o=pt(t),i=pt(e),a=new Set(n),d=!1;for(let m of r.data){if(a.has(m)){b.debug("[sync] skip hydrate for file",m);continue}let u=re.join(o,m),f=re.join(i,m),x=B.existsSync(u)?B.readFileSync(u,"utf8"):"",N=B.existsSync(f)?B.readFileSync(f,"utf8"):"";x!==N&&(b.debug("[sync] hydrate remote file",m),B.mkdirSync(re.dirname(f),{recursive:!0}),B.copyFileSync(u,f),d=!0)}return b.debug("[sync] hydrate changed",d),c("Hydrated event files from remote worktree",d)},yo=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",Ks=async e=>{let t=await Bn(e);if(l(t))return s(t.message);let n=await uo(e);if(l(n))return s(n.message);let r=`[epiq:sync:${yo(t.data)}:${yo(n.data)}]`;return b.debug("[sync] commit message",r),c("Built sync commit message",r)},js=async({repoRoot:e})=>{b.debug("[sync] ensure local remote branch",F);let t=await mo({repoRoot:e,branch:F});if(l(t))return s(t.message);if(t.data)return b.debug("[sync] local remote branch exists"),c("Local remote branch already exists",!1);let n=await Ot({repoRoot:e,remote:Q});if(l(n))return s(n.message);if(n.data){let o=await Ut({repoRoot:e,remote:Q,branch:F});if(l(o))return s(o.message);if(o.data){b.debug("[sync] fetch remote branch before local track");let i=await O({args:["fetch",Q,F],cwd:e});if(l(i))return s(`Failed to fetch ${F} from remote
|
|
16
|
+
${i.message}`);b.debug("[sync] create local tracking branch",F);let a=await O({args:["branch","--track",F,`${Q}/${F}`],cwd:e});return l(a)?s(`Failed to create local ${F} from remote
|
|
17
|
+
${a.message}`):c("Created local remote branch from remote",!0)}}b.debug("[sync] create local remote branch from HEAD",F);let r=await O({args:["branch",F,"HEAD"],cwd:e});return l(r)?s(`Failed to create local ${F}
|
|
18
|
+
${r.message}`):c("Created local remote branch",!0)},zs=async({repoRoot:e,worktreeRoot:t})=>{b.debug("[sync] create remote worktree",t);let n=Un(re.dirname(t));if(l(n))return s(n.message);B.existsSync(t)&&!B.existsSync(re.join(t,".git"))&&(b.debug("[sync] remove broken remote worktree path",t),Ws(t));let r=await O({args:["worktree","add",t,F],cwd:e});return l(r)?s(`Failed to create remote worktree
|
|
19
|
+
${r.message}`):c("Created remote worktree",!0)},qs=async({repoRoot:e,worktreeRoot:t})=>{b.debug("[sync] ensure remote worktree",t);let n=await kn({repoRoot:e,worktreeRoot:t});if(l(n))return s(n.message);let r=B.existsSync(t);if(n.data&&r)return b.debug("[sync] remote worktree exists"),c("Remote worktree already exists",!1);if(n.data&&!r){b.debug("[sync] prune stale remote worktree registration");let o=await O({args:["worktree","prune"],cwd:e});if(l(o))return s(`Failed to prune stale worktrees
|
|
20
|
+
${o.message}`);let i=await kn({repoRoot:e,worktreeRoot:t});if(l(i))return s(i.message);if(i.data){b.debug("[sync] remove stale remote worktree registration");let a=await O({args:["worktree","remove","--force",t],cwd:e});if(l(a))return s(`Failed to remove stale worktree registration
|
|
21
|
+
${a.message}`)}}return zs({repoRoot:e,worktreeRoot:t})},Gs=async e=>{let t=await Bn(e);if(l(t))return s(t.message);if(t.data===F)return b.debug("[sync] remote branch already checked out"),c("Remote branch already checked out",!1);b.debug("[sync] checkout remote branch",F);let n=await O({args:["checkout",F],cwd:e});return l(n)?s(`Failed to checkout ${F}
|
|
22
|
+
${n.message}`):c("Checked out remote branch",!0)},Xs=async e=>{b.debug("[sync] ensure remote upstream",F);let t=await Wt(e);if(l(t))return s(t.message);if(t.data)return b.debug("[sync] remote upstream already configured"),c("Remote upstream already configured",!1);let n=await Ot({repoRoot:e,remote:Q});if(l(n))return s(n.message);if(!n.data)return b.debug("[sync] no remote configured for upstream"),c("No remote available for upstream",!1);let r=await Ut({repoRoot:e,remote:Q,branch:F});if(l(r))return s(r.message);if(r.data){b.debug("[sync] fetch remote branch before upstream set");let i=await O({args:["fetch",Q,F],cwd:e});if(l(i))return s(`Failed to fetch ${F}
|
|
23
|
+
${i.message}`);b.debug("[sync] set upstream to remote branch");let a=await O({args:["branch","--set-upstream-to",`${Q}/${F}`,F],cwd:e});return l(a)?s(`Failed to set remote upstream
|
|
24
|
+
${a.message}`):c("Configured remote upstream",!0)}b.debug("[sync] publish remote branch and set upstream");let o=await O({args:["push","-u",Q,F],cwd:e});return l(o)?s(`Failed to publish remote branch
|
|
25
|
+
${o.message}`):c("Published remote branch and configured upstream",!0)},Ys=async({worktreeRoot:e,ownEventFileName:t})=>{b.debug("[sync] stage own event file in remote worktree",t);let n=await O({args:["add",ho(t)],cwd:e});return l(n)?s(`Failed to stage remote own event file
|
|
26
|
+
${n.message}`):c("Staged remote own event file",void 0)},Js=async({worktreeRoot:e,ownEventFileName:t})=>{b.debug("[sync] inspect staged remote change",t);let n=await Re({args:["diff","--cached","--quiet","--",ho(t)],cwd:e});return n.exitCode===0?c("No staged remote own event file change",!1):n.exitCode===1?c("Has staged remote own event file change",!0):s(n.stderr.trim()||"Unable to inspect staged remote own event file change")},Qs=async({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=await Js({worktreeRoot:t,ownEventFileName:n});if(l(r))return s(r.message);if(!r.data)return b.debug("[sync] no staged remote file change to commit"),c("No remote own event file commit needed",null);let o=await Ks(e);if(l(o))return s(o.message);b.debug("[sync] create remote sync commit");let i=await O({args:["commit","-m",o.data],cwd:t});if(l(i))return s(`Failed to commit remote own event file
|
|
27
|
+
${i.message}`);let a=await O({args:["rev-parse","HEAD"],cwd:t});if(l(a))return s(a.message);let d=a.data.stdout.trim();return b.debug("[sync] created remote sync commit",d),c("Created remote sync commit",d)},Zs=async e=>{b.debug("[sync] push remote worktree");let t=await Wt(e);if(l(t))return s(t.message);if(!t.data)return b.debug("[sync] skip push, no upstream"),c("No upstream configured, skipped push",!1);let n=await O({args:["push"],cwd:e});return l(n)?s(`Failed during remote push
|
|
28
|
+
${n.message}`):c("Pushed remote",!0)},Ao=async({repoRoot:e,worktreeRoot:t,ensureUpstream:n})=>{b.debug("[sync] bootstrap remote storage",{repoRoot:e,worktreeRoot:t,ensureUpstream:n});let r=!1;for(let o of[Us(),await js({repoRoot:e}),await qs({repoRoot:e,worktreeRoot:t}),await Gs(t),n?await Xs(t):c("Skipped remote upstream bootstrap",!1)]){if(l(o))return s(o.message);r=r||!!o.data}return b.debug("[sync] bootstrap changed",r),c(n?"Bootstrapped remote storage":"Bootstrapped remote storage (readonly)",r)},wo=(e,t)=>{b.debug("[sync] ensure local and remote layout");for(let n of[go(e),go(t),fo(e),fo(t)])if(l(n))return s(n.message);return c("Ensured remote layout",void 0)},To=async({cwd:e=process.cwd(),ownEventFileName:t})=>{b.debug("[sync] start write sync",{cwd:e,ownEventFileName:t});let n=await Fn(e);if(l(n))return s(n.message);let r=n.data,o=bo(r);b.debug("[sync] resolved roots",{repoRoot:r,worktreeRoot:o});let i=c("Validated own event file name",t);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 ut(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 Io(r);if(l(d))return s(d.message);b.debug("[sync] ensure initial commit changed",d.data);let m=await Ao({repoRoot:r,worktreeRoot:o,ensureUpstream:!0});if(l(m))return s(m.message);let u=await ut(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=wo(r,o);if(l(f))return s(f.message);let x=!1,N,A=!1,S=!1,I=!1;b.debug("[sync] pull remote branch before local copy");let E=await On({cwd:o,remote:Q,branch:F});if(l(E))return s(E.message);A=E.data,b.debug("[sync] pulled remote",A);let T=So({repoRoot:r,worktreeRoot:o,skipFileNames:[i.data]});if(l(T))return s(T.message);I=T.data,b.debug("[sync] hydrated from remote",I);let U=Vs({repoRoot:r,worktreeRoot:o,ownEventFileName:i.data});if(l(U))return s(U.message);if(b.debug("[sync] copied own file to remote",U.data),U.data){let de=await Ys({worktreeRoot:o,ownEventFileName:i.data});if(l(de))return s(de.message);let Ve=await Qs({repoRoot:r,worktreeRoot:o,ownEventFileName:i.data});if(l(Ve))return s(Ve.message);x=!!Ve.data,N=Ve.data??void 0,b.debug("[sync] remote commit created",{createdCommit:x,commitSha:N})}let ie=await Zs(o);return l(ie)?s([ie.message,x&&N?`Local remote sync commit exists: ${N}`:""].filter(Boolean).join(`
|
|
29
|
+
`)):(S=ie.data,b.debug("[sync] pushed remote",S),c("Synced event logs with remote",{repoRoot:r,worktreeRoot:o,createdCommit:x,commitSha:N,pulled:A,pushed:S,hydrated:I,bootstrapped:m.data}))},Mo=async(e=process.cwd())=>{b.debug("[sync] start readonly sync",{cwd:e});let t=await Fn(e);if(l(t))return s(t.message);let n=t.data,r=bo(n);b.debug("[sync] resolved readonly roots",{repoRoot:n,worktreeRoot:r});let o=await ut(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 Io(n);if(l(i))return s(i.message);b.debug("[sync] readonly ensure initial commit changed",i.data);let a=await Ao({repoRoot:n,worktreeRoot:r,ensureUpstream:!1});if(l(a))return s(a.message);let d=await ut(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=wo(n,r);if(l(m))return s(m.message);b.debug("[sync] readonly pull remote branch");let u=await On({cwd:r,remote:Q,branch:F});if(l(u))return s(u.message);b.debug("[sync] readonly pulled remote",u.data);let f=So({repoRoot:n,worktreeRoot:r});return l(f)?s(f.message):(b.debug("[sync] readonly hydrated from remote",f.data),c("Synced from remote",{repoRoot:n,worktreeRoot:r}))};var ea=e=>Object.values(h().tags).find(t=>t.name===e),ta=e=>Object.values(h().contributors).find(t=>t.name===e),Ro=[{systemOnly:!0,intent:R.Move,mode:p.COMMAND_LINE,action:()=>{let e=Y();if(l(e))return s("Unable to resolve user ID");let t=e.data,{modifier:n}=pe().commandMeta,{currentNode:r,selectedIndex:o}=h(),i=M(r.id)[o];if(!i)return w({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 et({id:$(),userId:t,action:"move.node",payload:{id:i.id,parent:i.parentNodeId,pos:f}}),w({mode:p.MOVE}),c("Move initialized",null)}if(n==="next")return w({mode:p.MOVE}),Tn(1);if(n==="previous")return w({mode:p.MOVE}),Tn(-1);if(n==="to-next")return w({mode:p.MOVE}),wn(1);if(n==="to-previous")return w({mode:p.MOVE}),wn(-1);if(n==="confirm"){w({mode:p.DEFAULT});let a=We();if(!a)return s("No pending move to confirm");let d=J(a);return l(d)?d:(et(null),c("Moved item",null))}return n==="cancel"?(et(null),w({mode:p.DEFAULT}),c("Cancelling move",null)):s("Invalid move modifier")}},{intent:R.Delete,mode:p.COMMAND_LINE,action:()=>{let e=Y();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?J({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=Y();if(l(e))return s("Unable to resolve user ID");let t=e.data,n=tt(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=_r(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"?J({id:$(),userId:t,action:"edit.description",payload:{id:d.id,md:f}}):d.title==="Title"?J({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=>K(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 se(d=>({...d,filters:e==="clear"?[]:[...d.filters,a],mode:p.DEFAULT})),c("Viewing help",null)}},{intent:R.ViewHelp,mode:p.COMMAND_LINE,action:()=>(w({mode:p.HELP}),c("Viewing help",null))},{intent:R.CloseIssue,mode:p.COMMAND_LINE,action:()=>{let e=Y();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(!Oe(o))return s("Cannot close in this context");let i=J({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=Y();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):ze(o.id,"TICKET");if(l(i))return s("Cannot reopen in this context");let a=i.data,d=J({id:$(),userId:t,action:"reopen.issue",payload:{id:a.id}});return l(d)?d:c("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=Mt()?.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=Ln({userName:o,userId:i,preferredEditor:t??""});return l(a)?a:(dt({userName:o,userId:i}),w({mode:p.DEFAULT}),c(`Username set to "${r}"`,null))}},{intent:R.Init,mode:p.COMMAND_LINE,action:()=>{let e=Lo();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=Mt()?.trim();if(!e)return s("No editor provided");let t=Ln({preferredEditor:e});return l(t)?t:(dt({preferredEditor:e}),w({mode:p.DEFAULT}),c(`Editor configuration set to "${e}"`,null))}},{intent:R.NewItem,mode:p.COMMAND_LINE,action:(e,t)=>{let n=Y();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=J(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=tt(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=tt(o,"SWIMLANE");return l(S)?null:S.data})();if(!u)return s("Unable to add issue in this context");let f=$r({userId:r,name:t.inputString,parent:u.id}),x=Bt(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 ar()},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):(se(t=>({...t,viewMode:e.modifier==="wide"?"wide":e.modifier==="dense"?"dense":t.viewMode})),c("View set",null))},onSuccess:()=>w({mode:p.DEFAULT})},{intent:R.Rename,mode:p.COMMAND_LINE,action:()=>{let e=Y();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=Mt();return i?J({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=Y();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 m=ze(d.id,"TICKET");if(l(m))return s("Unable to tag issue in this context");let u=m.data,f=ea(o),x;if(f)x=f.id;else{let S=$(),I=J({id:$(),userId:t,action:"create.tag",payload:{id:S,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(S=>S.props?.value===x)?s("Already tagged with that tag"):J({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=Y();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 m=ze(d.id,"TICKET");if(l(m))return s("Unable to assign issue in this context");let u=m.data,f=ta(o),x;if(f)x=f.id;else{let S=$(),I=J({id:$(),userId:t,action:"create.contributor",payload:{id:S,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(S=>S.props?.value===x)?s("Assignee already assigned"):J({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()=>{_(()=>""),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=An();if(l(n))return s("Unable to resolve log file name");let r=await To({ownEventFileName:n.data});return l(r)?(w({syncStatus:{msg:r.message,status:"outOfSync"}}),s(`Unable to sync state. ${r.message}`)):(w({syncStatus:{msg:"Synced",status:"synced"},mode:p.DEFAULT}),c("Synced",!0))}}];var oe=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=Br(t);Rr();let a=Ro.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===i);if(!a)return Tt({result:he.Fail,message:"Command not found",data:null});let d=await a.action(a,{command:t,inputString:o,modifier:r});return l(d)?Tt(d):(Lr({addToHistory:!e}),a.onSuccess?.(),Tt(d))};var Ht=[{intent:"exit",mode:p.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(w({mode:p.COMMAND_LINE}),_(()=>"move cancel"),oe({isForceExecutedBySystem:!0}))},{intent:"initMove",mode:p.DEFAULT,description:"[m] move init/confirm",action:()=>(w({mode:p.COMMAND_LINE}),_(()=>"move start"),oe({isForceExecutedBySystem:!0}))},{intent:"confirmMove",mode:p.MOVE,action:()=>(w({mode:p.COMMAND_LINE}),_(()=>"move confirm"),oe({isForceExecutedBySystem:!0}))}],_t=[{intent:"movePreviousItem",mode:p.MOVE,action:()=>We()?(w({mode:p.COMMAND_LINE}),_(()=>"move previous"),oe({isForceExecutedBySystem:!0})):s("No pending move")},{intent:"moveNextItem",mode:p.MOVE,action:()=>We()?(w({mode:p.COMMAND_LINE}),_(()=>"move next"),oe({isForceExecutedBySystem:!0})):s("No pending move")}],Po=[{intent:"moveToNextContainer",mode:p.MOVE,action:()=>We()?(w({mode:p.COMMAND_LINE}),_(()=>"move to-next"),oe({isForceExecutedBySystem:!0})):s("No pending move")},{intent:"moveToPreviousContainer",mode:p.MOVE,action:()=>We()?(w({mode:p.COMMAND_LINE}),_(()=>"move to-previous"),oe({isForceExecutedBySystem:!0})):s("No pending move")}];var Do={[L.WORKSPACE]:[...Ht,..._t],[L.BOARD]:[...Ht,..._t],[L.SWIMLANE]:[...Ht,..._t,...Po],[L.TICKET]:[],[L.FIELD]:[],[L.FIELD_LIST]:[],[L.TEXT]:[]};var Fo=[{intent:"addItem",mode:p.DEFAULT,description:"[n] new...",action:()=>(w({mode:p.COMMAND_LINE}),_(()=>`${g.NEW} `),c("Adding new item",null))},{intent:"Delete",mode:p.DEFAULT,description:"[d] delete",action:()=>(w({mode:p.COMMAND_LINE}),_(()=>`${g.DELETE} `),c("Deleting item",null))},{intent:"initCommandLine",mode:p.DEFAULT,description:"[:] focus command line",action:()=>(w({mode:p.COMMAND_LINE}),_(()=>""),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:()=>(w({mode:p.COMMAND_LINE}),_(()=>"edit"),oe(),c("Fired command",!0))},{intent:"SetViewDense",mode:p.DEFAULT,description:"[v] view change (wide/dense)",action:()=>(w({viewMode:"dense"}),c("View set",null))},{intent:"SetViewWide",mode:p.DEFAULT,action:()=>(w({viewMode:"wide"}),c("View set",null))},{intent:"sync",mode:p.DEFAULT,description:"[s] sync epiq with remote state branch",action:()=>(w({mode:p.COMMAND_LINE}),_(()=>"sync"),oe({isForceExecutedBySystem:!0}),c("Synced",!0))}];var ko=[{intent:"viewHelp",mode:p.DEFAULT,action:()=>(w({mode:p.HELP}),c("Viewing help",null))},{intent:"exit",mode:p.HELP,action:()=>(w({mode:p.DEFAULT}),c("Exiting help",null))},{intent:"confirm",mode:p.COMMAND_LINE,action:()=>(oe(),c("Executing command",null))},{intent:"MoveCursorLeft",mode:p.COMMAND_LINE,action:()=>(Cn(-1),c("Moving cursor left",null))},{intent:"MoveCursorRight",mode:p.COMMAND_LINE,action:()=>(Cn(1),c("Moving cursor right",null))},{intent:"MoveCursorLeftOfWord",mode:p.COMMAND_LINE,action:()=>(Nn("left"),c("Moving cursor left of word",null))},{intent:"MoveCursorRightOfWord",mode:p.COMMAND_LINE,action:()=>(Nn("right"),c("Moving cursor right of word",null))},{intent:"exitCommandLine",mode:p.COMMAND_LINE,action:()=>(w({mode:p.DEFAULT}),c("Exiting command line",null))},{intent:"autoCompleteCommand",mode:p.COMMAND_LINE,action:()=>(_((e,{remainder:t})=>t?e+t:e),c("Auto-completing command",null))},{intent:"captureInput",mode:p.COMMAND_LINE,action:(e,{sequence:t})=>(_(n=>n+t),c("Capturing input",null))},{intent:"eraseInput",mode:p.COMMAND_LINE,action:()=>(Tr(),c("Erasing input",null))},{intent:"EraseInputWord",mode:p.COMMAND_LINE,action:()=>(Mr(),c("Erasing input word",null))},{intent:"getLastCommandFromHistory",mode:p.COMMAND_LINE,action:()=>(Pr(),c("Getting last command from history",null))},{intent:"getNextCommandFromHistory",mode:p.COMMAND_LINE,action:()=>(Dr(),c("Getting next command from history",null))}];import na from"chalk";var $t=": for command line",Bo="q to exit",Oo=`${na.hex(v.accent)("m")} to confirm`,Wn={[L.WORKSPACE]:[$t],[L.BOARD]:[$t],[L.BOARD+p.COMMAND_LINE]:[$t],[L.SWIMLANE]:[$t],[L.TICKET+p.HELP]:[Bo],[L.SWIMLANE+p.HELP]:[Bo],[L.TICKET]:[],[L.FIELD]:[],[L.SWIMLANE+p.MOVE]:[Oo],[L.TICKET+p.MOVE]:[Oo]};var Vt=e=>e.trim().toLocaleLowerCase(),ra=(e,t)=>{let n=C.getFieldByTitle(e,t);if(!n)return"";let r=n.props?.value;return typeof r=="string"?r:""},oa=e=>{let{tags:t}=h(),n=C.getFieldByTitle(e,"Tags");return n?H(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},ia=e=>{let{contributors:t}=h(),n=C.getFieldByTitle(e,"Assignees");return n?H(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},Uo=(e,t)=>{let n=t.value;if(!n)return!0;switch(t.target){case"title":return Vt(e.title??"").includes(n);case"description":return Vt(ra(e.id,"Description")).includes(n);case"tag":return oa(e.id).map(Vt).some(d=>d.includes(n));case"assignee":return ia(e.id).map(Vt).some(d=>d.includes(n));default:return!0}};function Wo(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 Ho=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 Kt,Hn=new Set,_o=()=>{for(let e of Hn)e()},aa=e=>(Hn.add(e),()=>Hn.delete(e));function $o(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=Wo(t,o,r);if(l(m))return logger.error(m.message),m;let u=m.data,{context:f}=d,x=Wn[f+n]??Wn[f]??[],N=[...Fo,...Do[f]??[],...ko],A=Ho(N);return c("Derived successfully",{...e,currentNode:d,breadCrumb:u,availableHints:x,availableActions:N,actionIndex:A,renderedChildrenIndex:da(o,i)})}var h=()=>(Kt||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),Kt);function Kr(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=$o(t);return l(n)?n:(Kt=n.data,_o(),c("State initialized",null))}function se(e){let t=h(),n=e(t),r=$o(n);return l(r)?s(r.message??"Unable to update state"):(Kt=r.data,_o(),c("State updated",null))}var w=e=>se(t=>({...t,...e}));var V=()=>sa(aa,h,h),da=(e,t)=>{let n={};for(let r of Object.values(e))Oe(r)&&t.length>0&&!t.every(o=>Uo(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:()=>Vo(1),navigateToPreviousItem:()=>Vo(-1),navigateToNextContainer:()=>Ko(1),navigateToPreviousContainer:()=>Ko(-1),navigate:({currentNode:e=h().currentNode,selectedIndex:t})=>{w({currentNodeId:e.id,selectedIndex:t})}},Vo=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})},Ko=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 Ee="system.actor",gt=ca(),Le=null;function la(){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 ma(){let e=la();k.navigate(e)}function ua(){let e=gt(),t=gt(),n=gt(),r=gt(),o=gt();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:Dt,name:"Closed",parent:e}},{id:be(),userId:Ee,action:"add.swimlane",payload:{id:Ye,name:"Closed",parent:Dt}},{id:be(),userId:Ee,action:"lock.node",payload:{id:Dt}},{id:be(),userId:Ee,action:"lock.node",payload:{id:Ye}}]}function At(){return Le!==null}function Lo(){if(!Le||Le.length===0)return c("No pending default events to persist",null);let t=Bt(Le).filter(l);return t.length>0?s([nt.bold.red("Materializing failed"),"",...t.map((n,r)=>`${nt.dim.gray(`${r+1}.`)} ${nt.dim(n.message)}`),`
|
|
26
30
|
`].join(`
|
|
27
|
-
`)):(
|
|
31
|
+
`)):(Le=null,c("Persisted pending default events",null))}function jo(e){let t;e.some(r=>r.action==="init.workspace")?(Le=null,t=En(e)):(Le=ua(),t=En([...Le]));let n=t.filter(l);return n.length>0?s([nt.bold.red("Materializing failed"),"",...n.map((r,o)=>`${nt.dim.gray(`${o+1}.`)} ${nt.dim(r.message)}`),`
|
|
28
32
|
`].join(`
|
|
29
|
-
`)):(da(),c("State booted successfully",null))}import{Box as wa}from"ink";import _n from"react";import pt from"chalk";import{Box as Wn,Text as $o}from"ink";import ut,{useEffect as la,useMemo as ma,useState as ua}from"react";var Vo=pt.gray,pa=pt.inverse,ga=pt.inverse.gray,fa={hint:"",hints:[],overlap:0,remainder:""},jo=({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}},xa=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=se(t);return{bg:r=>pt.bgHex(n).black(r),bgCursor:r=>pt.bgHex(n).inverse.black(r)}}return mn(t)},ya=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=jo({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}},Ko=()=>({value:z.value,cursorPosition:z.cursorPosition,commandIsPending:z.commandIsPending,autoCompletion:z.commandMeta.autoCompletion??fa,infoMessage:z.commandMeta.infoMessage,validationStatus:z.commandMeta.validity,command:z.commandMeta.command,inputString:z.commandMeta.inputString,modifier:z.commandMeta.modifier}),va=(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]=ua(Ko());la(()=>{let y=()=>{let S=Ko();n(b=>va(b,S)?b:S)},N=Ar(y);return y(),()=>{N()}},[]);let{value:r,cursorPosition:o,infoMessage:i,commandIsPending:a,autoCompletion:d,command:m,modifier:u}=t,f=ma(()=>{let y=Math.max(0,Math.min(o,r.length)),N=jo({value:r,command:m}),S=ya({value:r,command:m,modifier:u}),b=m?mn(m):null,I=xa({command:m,modifier:u}),E=(ee,te)=>{let rn=N&&te>=N.start&&te<N.end,on=S&&te>=S.start&&te<S.end;return rn&&b?b.fg(ee):on&&I?I.bg(ee):ee},w=(ee,te)=>{let rn=N&&te>=N.start&&te<N.end,on=S&&te>=S.start&&te<S.end;return rn&&b?b.fgCursor(ee):on&&I?I.bgCursor(ee):pa(ee)},k=r.slice(0,y),K=r[y]??" ",Z=y<r.length?r.slice(y+1):"",Ti=Array.from(k).map((ee,te)=>E(ee,te)).join(""),rr=w(K,y),or=Array.from(Z).map((ee,te)=>E(ee,y+1+te)).join("");if(d.hint){let ee=d.hint[d.overlap]??K;rr=ga(ee),or=Vo(d.remainder.slice(1)+Z)}return Vo(":")+Ti+rr+or},[r,o,d,m,u]);return ut.createElement(Wn,{flexDirection:"column",justifyContent:"flex-start"},ut.createElement(Wn,{flexDirection:"column",paddingX:1,borderColor:v.secondary,borderStyle:"round",width:e},ut.createElement(Wn,null,ut.createElement($o,null,f),i&&ut.createElement($o,{wrap:"truncate",color:a?v.red:v.secondary2},` ${i} `))))};import qo from"chalk";import{Box as ha,Text as Hn}from"ink";import $t,{useEffect as Ca,useState as Na}from"react";var Ea=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],Go=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)}},Ia=({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)}`},ba=(e,t,n)=>{let r=Go(e),o=Go(t);return Ia({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},Sa=(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 ba(i,a,o)},Aa=(e,t)=>e.length===t?e:e.length>t?e.slice(0,t):e.padEnd(t," "),Xo=({width:e,availableHints:t})=>{let{syncStatus:{status:n,msg:r}}=$(),[o,i]=Na(0);Ca(()=>{if(n!=="syncing"){i(0);return}let E=setInterval(()=>{i(w=>w+1)},50);return()=>clearInterval(E)},[n]);let a=[],d=0;for(let E of t){let k=(a.length>0?" | ":"").length+E.length;if(d+k>e-4)break;a.push(E),d+=k}let m=n!="synced"?r??a.join(" | "):a.join(" | "),u=Math.max(0,e-2),f=n==="syncing"?Sa(Ea,(Math.sin(o*.12)+1)/2):v.secondary,y=qo.hex(f??"fff"),N=qo.hex(v.secondary2),S=y(`\u256D${"\u2500".repeat(u)}\u256E`),b=y(`\u2570${"\u2500".repeat(u)}\u256F`),I=`${y("\u2502")}${N(Aa(` ${m} `,u))}${y("\u2502")}`;return $t.createElement(ha,{flexDirection:"column",width:e},$t.createElement(Hn,null,S),$t.createElement(Hn,null,I),$t.createElement(Hn,null,b))};var Vt=({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 _n.createElement(wa,null,t===p.COMMAND_LINE&&r.syncStatus.status!=="syncing"?_n.createElement(zo,{width:e}):_n.createElement(Xo,{width:e,mode:t,availableHints:n}))};import{Box as tt,Text as Yo}from"ink";import Re from"react";var Jo=({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"]),Re.createElement(tt,{flexDirection:"column",marginTop:3,borderColor:v.secondary,borderStyle:"round",width:e,minHeight:19},Re.createElement(tt,{flexDirection:"column",width:e},h().mode===p.HELP?t.map(([n,r],o)=>Re.createElement(tt,{paddingLeft:1,key:o,flexDirection:"row"},Re.createElement(tt,{key:o,flexDirection:"row",paddingBottom:o?0:1},Re.createElement(tt,{width:20,justifyContent:"flex-end"},Re.createElement(Yo,{color:o?v.accent:v.secondary},n)),Re.createElement(tt,{flexGrow:1,width:40,paddingLeft:2},Re.createElement(Yo,{color:o?v.primary:v.secondary},r))))):null))};import ti from"chalk";import{Box as Vn,Text as ri}from"ink";import Ie from"react";import{Box as $n,Text as Fa}from"ink";import ot from"react";import{Text as Ta}from"ink";import Ma from"react";var Ra=e=>e.toLowerCase().trim(),La=(e,t=Ke)=>{let n=Ra(e);return t[n]?t[n]:at(n)},nt=({id:e,isSelected:t})=>{let n=C.getContributor(e);if(n)return Ma.createElement(Ta,{underline:t,color:La(n.name)},"@"+n.name)};import{Text as Pa}from"ink";import Da from"react";var rt=({id:e,isSelected:t})=>{let n=C.getTag(e);if(n)return Da.createElement(Pa,{underline:t,backgroundColor:se(n.name),color:v.primary}," "+n.name+" ")};var Ba=(e,t)=>e.length<=t?e:t<=1?"\u2026":e.slice(0,t-1)+"\u2026",Qo=({width:e})=>{let{breadCrumb:t,currentNode:n,selectedIndex:r,viewMode:o}=h(),i=W(n.id)[r],a=Ve(i?.id??n.id,"TICKET"),d=_e(a)?a.data:void 0,m=d?.id?W(d.id):[],u=I=>{let E=m.find(w=>w.title===I);return E?W(E.id).map(w=>typeof w.props?.value=="string"?w.props.value:"").filter(w=>!!w):[]},f=u("Tags"),y=u("Assignees"),N=d?.parentNodeId?!dn(n.id,d?.parentNodeId)&&o==="dense":!1,S=t.map((I,E)=>{let w=E===t.length-1,k=W(I.id),K=w?k?.[r]?.title:void 0;return`${E?" / ":""}${I.title??""}${K?` \u25B8 ${K}`:""}`}).join(""),b=Ba(S,e);return ot.createElement($n,null,ot.createElement(Fa,{color:v.secondary2},b),N?f.map(I=>ot.createElement($n,{key:I,paddingLeft:2},ot.createElement(rt,{id:I}))):null,N?y.map(I=>ot.createElement($n,{key:I,paddingLeft:2},ot.createElement(nt,{id:I}))):null)};import{Box as ka,Text as Zo}from"ink";import Kt from"react";var Oa=({filters:e})=>Kt.createElement(ka,{columnGap:1},Kt.createElement(Zo,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>Kt.createElement(Zo,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),ei=Kt.memo(Oa);function jt({filters:e,hideBreadCrumb:t=!1}){let{userName:n,preferredEditor:r}=de(),o=40,i=process.stdout.columns-o-8;return Ie.createElement(Vn,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?Ie.createElement(ri,null," "):Ie.createElement(Vn,{paddingLeft:1},e.length>0?Ie.createElement(ei,{filters:e}):Ie.createElement(Qo,{width:i})),Ie.createElement(Vn,{columnGap:1,paddingRight:2,"max-width":o,overflow:"hidden",justifyContent:"flex-end"},Ie.createElement(ni,{icon:"@",value:n}),Ie.createElement(ni,{icon:"\u276F",value:r})))}function ni({icon:e,value:t}){return Ie.createElement(ri,null,ti.dim(e)+ti.hex(v.accent)(` ${t??"-"} `))}import{Box as sd,Text as ad}from"ink";import ft from"react";import{Box as zt,Text as Kn}from"ink";import Le from"react";import{Text as oi}from"ink";import ii,{useEffect as Ua,useState as Wa}from"react";var si={help:["\u25B8 ","\u25B8 ","\u25B8 "],default:["\u25B8 ","\u25B8 ","\u25B8 "],move:["\u2191 ","\u2192 ","\u2193 ","\u2190 "],"command-line":["\u276F ","\u276F ","\u276F "]},Q=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=$(),r=si[n]??si.default,[o,i]=Wa(r.length-1);return Ua(()=>{if(!e)return;let a=setInterval(()=>{i(d=>(d+1)%r.length)},800);return()=>clearInterval(a)},[e,r]),e?ii.createElement(oi,{color:v.accent,dimColor:o===1},r[o]):ii.createElement(oi,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?T(t?.id):[];return Le.createElement(zt,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:v.secondary,width:i},Le.createElement(zt,{padding:1,paddingTop:0,paddingBottom:0},Le.createElement(Kn,null,"Select a board:")),Le.createElement(zt,{padding:1,flexDirection:"column"},a.map((d,m)=>{let u=e.currentNode.context==="WORKSPACE"&&e.selectedIndex===m,y=T(d.id).flatMap(({id:N})=>W(N)).length;return Le.createElement(zt,{key:d.id??m},Le.createElement(Kn,{color:u?v.accent:v.secondary},Le.createElement(Q,{isSelected:u})),Le.createElement(Kn,{color:u?v.accent:v.secondary},d.title," (",y," issues)",d.readonly?" \u{1F512}":""))})))}import{Box as od}from"ink";import Qt from"react";import{Box as Gn,Text as Ka}from"ink";import ge from"react";import{Box as zn,Text as Ha}from"ink";import qt from"react";var Gt=({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),y=f+d,N=e.slice(f,y),S=e.length>d,b=i,I=S?Math.max(1,Math.floor(d/e.length*b)):b,E=Math.max(0,b-I),w=Math.max(1,e.length-d),k=S?Math.floor(f/w*E):0;return qt.createElement(zn,{flexDirection:"row",height:i,width:"100%"},qt.createElement(zn,{flexDirection:"column",flexGrow:1,height:i},N),qt.createElement(zn,{flexDirection:"column",width:1,height:b},Array.from({length:b}).map((K,Z)=>qt.createElement(Ha,{key:Z,color:S&&Z>=k&&Z<k+I?v.accent:v.secondary},S?"\u2502":" "))))};import{Box as Xt,Text as _a}from"ink";import We from"react";var ai=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=ht(ar(t.title),r),i=T(t.id),a=u=>{let f=i.find(y=>y.title===u);return f?T(f.id).map(y=>typeof y.props?.value=="string"?y.props.value:"").filter(y=>!!y):[]},d=a("Tags").map(u=>C.getTag(u)).filter(u=>!!u),m=a("Assignees").map(u=>C.getContributor(u)).filter(u=>!!u);return We.createElement(Xt,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?v.accent:v.secondary,justifyContent:"space-between"},We.createElement(Xt,{borderBottom:!0},We.createElement(Xt,{paddingLeft:1,flexDirection:"column"},We.createElement(_a,{color:v.primary},o))),We.createElement(Xt,{flexDirection:"row",paddingLeft:1},d.map(u=>We.createElement(rt,{key:u.id,id:u.id})),m.map(u=>We.createElement(nt,{key:u.id,id:u.id}))))};import $a from"chalk";import{Box as gt,Text as qn}from"ink";import be from"react";var Va=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,di=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=T(t.id),a=I=>{let E=i.find(w=>w.title===I);return E?T(E.id).map(w=>typeof w.props?.value=="string"?w.props.value:"").filter(w=>!!w):[]},d=a("Tags").map(I=>C.getTag(I)).filter(I=>!!I),m=a("Assignees").map(I=>C.getContributor(I)).filter(I=>!!I),u=1,f=d.length*(1+u),y=m.length*(2+u),N=d.map(I=>be.createElement(gt,{key:I.id,paddingRight:u},be.createElement(qn,{color:se(I.name)},"\u25A0"))),S=m.map(I=>be.createElement(gt,{key:I.id,paddingRight:u},be.createElement(qn,{color:at(I.name)},"@"+I.name.at(0)))),b=n?v.accent:o===p.MOVE?v.secondary:v.primary;return be.createElement(gt,{borderBottom:!0,justifyContent:"space-between"},be.createElement(gt,null,be.createElement(Q,{isSelected:n,placeholder:$a.dim.gray(r+1+" ")}),be.createElement(qn,{wrap:"truncate",color:b},Va(t.title,e-f-y-14))),be.createElement(gt,null,N,S))};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})`,y=3,N=o?1:4,S=r-y-(o?2:1),b=ge.createElement(Gn,{borderStyle:"round",borderColor:v.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},ge.createElement(Q,{isSelected:t}),ge.createElement(Ka,{bold:!0,color:t?v.accent:v.primary},f," ",e.readonly?"\u{1F512}":"")),I=(E,w)=>{let k=i&&a===w;return o?ge.createElement(di,{key:E.id,index:w,width:n,ticket:E,isSelected:k,mode:d}):ge.createElement(ai,{key:E.id,width:n,ticket:E,isSelected:k})};return ge.createElement(Gn,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?v.accent:v.secondary,paddingRight:1,paddingLeft:1,height:r},b,ge.createElement(Gn,{padding:o?1:0},u.length>0&&ge.createElement(Gt,{selectedIndex:a,height:S,itemHeight:N},u.map(I)),ge.createElement(Q,{isSelected:i&&a===-1})))},ci=ge.memo(ja);import{Box as Jn,Text as nd}from"ink";import Pe,{useEffect as Qn,useMemo as gi}from"react";import Se from"chalk";import mi from"string-width";import{decodeTime as za}from"ulid";var li=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 qa=(e,t)=>e+" ".repeat(Math.max(0,t-mi(e))),Ga=(e,t)=>" ".repeat(Math.max(0,t-mi(e)))+e,Xa=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)})(),Ya=e=>{switch(e.action){case"move.node":{let t=C.getNode(e.payload.parent),n=t?Se.dim.bgBlack(` ${t.title} `):"unknown",r=e.payload.pos;if(!r)return`to ${n}`;switch(r.at){case"start":return`to ${n} ${Se.dim("(to top of list)")}`;case"end":return`to ${n} ${Se.dim("(to bottom of list)")}`;case"before":return`to ${n} ${Se.dim("(up in list)")}`;case"after":return`to ${n} ${Se.dim("(down in list)")}`}}case"tag.issue":{let t=h().tags[e.payload.tagId];return t?Se.bgHex(se(t.name))(` ${t.name} `):"unknown tag"}case"assign.issue":{let t=h().contributors[e.payload.contributor];return t?Se.hex(se(t.name))(` ${t.name} `):"unknown user"}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"create.contributor":case"edit.title":return`"${"name"in e.payload?e.payload.name:""}"`;default:return""}},Ja=e=>{let t=li(za(e));return Se.gray(Ga(t,8))},Qa=12,Za=e=>{let t=e.split(".")[1]??"unknown";return qa(`${t}`,Qa)},ui=e=>{let t=Ja(e.id),n=Za(e.userId),r=Xa(e.action),o=Ya(e),i=Se.dim("\u203A"),a=[r,o].filter(Boolean).join(" ");return`${n} ${t} ${i} ${a}`};import{Box as Yt,Text as ed}from"ink";import Ae from"react";var pi=({selectedIndex:e,parent:t,selected:n})=>{let{currentNode:r}=$(),{title:o}=t,i=T(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 Ae.createElement(Yt,{alignItems:"center",paddingTop:1},Ae.createElement(Yt,{minWidth:12},Ae.createElement(Q,{isSelected:n}),Ae.createElement(ed,{color:n?v.accent:v.secondary2},o,":")),Ae.createElement(Yt,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((a,d)=>{let m=r.id===t.id&&d===e;return Ae.createElement(Yt,{key:`${o}-${a}`,paddingRight:2,minHeight:1},Ae.createElement(Q,{isSelected:m}),o==="Assignees"?Ae.createElement(nt,{isSelected:m,id:a}):o==="Tags"?Ae.createElement(rt,{isSelected:m,id:a}):null)})))};import{Box as Jt,Text as Xn}from"ink";import we,{useEffect as td}from"react";var Yn=({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/):[];td(()=>{let N=[];return u.forEach((S,b)=>{let I=G.text({id:`${b}`,name:`Line ${b+1}`,parentNodeId:e,props:{value:S},readonly:!0}),E=C.createNodeAtPosition(I);_e(E)&&N.push(E.data.id)}),()=>N.forEach(C.deleteNode)},[e,n]);let f="\u2029",y=u.map((N,S)=>{let b=d.id===e&&a===S;return we.createElement(Jt,{key:`${e}-${S}`},we.createElement(Xn,{color:b?v.primary:v.secondary2,dimColor:!b},`${S+1} `.padStart(5,"\xA0")),we.createElement(Xn,{backgroundColor:b?"gray":""},m(N.length?ht(N,i-10):f)))});return we.createElement(Jt,{flexDirection:"column",paddingTop:1},we.createElement(Jt,null,we.createElement(Q,{isSelected:o}),we.createElement(Xn,{color:o?v.accent:v.secondary2},t)),we.createElement(Jt,{flexDirection:"row",borderStyle:"round",borderColor:v.secondary,paddingLeft:1,paddingRight:1,marginLeft:1},we.createElement(Gt,{scrollByOne:!0,children:y,height:r-2,selectedIndex:a,itemHeight:1})))};var rd=e=>`${e}::log`,fi=({ticket:e,height:t})=>{let{selectedIndex:n,currentNode:r}=$(),o=process.stdout.columns||120,i=gi(()=>rd(e.id),[e.id]),a=gi(()=>[...e.log].reverse().map(ui).join(`
|
|
30
|
-
`),[e.log]);
|
|
31
|
-
`);if(r[r.length-1]===""&&r.pop(),r.length<=Ci)return;let o=r.slice(-Ci).join(`
|
|
32
|
-
`)+`
|
|
33
|
-
`;yt.writeFileSync(t,o,"utf8")}function nr(e,t,n=!1,r=process.cwd()){if(!Pt)return;let o=Ei(r),i=Nd.format(...t),a=new Date,m=`[${n?a.toISOString().slice(11,19):a.toISOString()}] ${e} ${i}
|
|
34
|
-
`;yt.mkdirSync(Ni.dirname(o),{recursive:!0}),yt.appendFileSync(o,m,"utf8"),Ed(r)}var Id={info(...e){nr("[Info]",e,!1)},debug(...e){nr("->",e,!0)},error(...e){nr("[Error]",[...e,new Error().stack],!1)}};globalThis.logger=Id;Sd(`
|
|
33
|
+
`)):(ma(),c("State booted successfully",null))}import{Box as Ra}from"ink";import Vn from"react";import yt from"chalk";import{Box as _n,Text as zo}from"ink";import ft,{useEffect as pa,useMemo as ga,useState as fa}from"react";var qo=yt.gray,ya=yt.inverse,xa=yt.inverse.gray,va={hint:"",hints:[],overlap:0,remainder:""},Xo=({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}},ha=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=ae(t);return{bg:r=>yt.bgHex(n).black(r),bgCursor:r=>yt.bgHex(n).inverse.black(r)}}return gn(t)},Ca=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=Xo({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}},Go=()=>({value:z.value,cursorPosition:z.cursorPosition,commandIsPending:z.commandIsPending,autoCompletion:z.commandMeta.autoCompletion??va,infoMessage:z.commandMeta.infoMessage,validationStatus:z.commandMeta.validity,command:z.commandMeta.command,inputString:z.commandMeta.inputString,modifier:z.commandMeta.modifier}),Na=(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,Yo=({width:e})=>{let[t,n]=fa(Go());pa(()=>{let x=()=>{let A=Go();n(S=>Na(S,A)?S:A)},N=wr(x);return x(),()=>{N()}},[]);let{value:r,cursorPosition:o,infoMessage:i,commandIsPending:a,autoCompletion:d,command:m,modifier:u}=t,f=ga(()=>{let x=Math.max(0,Math.min(o,r.length)),N=Xo({value:r,command:m}),A=Ca({value:r,command:m,modifier:u}),S=m?gn(m):null,I=ha({command:m,modifier:u}),E=(ee,te)=>{let an=N&&te>=N.start&&te<N.end,dn=A&&te>=A.start&&te<A.end;return an&&S?S.fg(ee):dn&&I?I.bg(ee):ee},T=(ee,te)=>{let an=N&&te>=N.start&&te<N.end,dn=A&&te>=A.start&&te<A.end;return an&&S?S.fgCursor(ee):dn&&I?I.bgCursor(ee):ya(ee)},U=r.slice(0,x),ie=r[x]??" ",de=x<r.length?r.slice(x+1):"",Ve=Array.from(U).map((ee,te)=>E(ee,te)).join(""),or=T(ie,x),ir=Array.from(de).map((ee,te)=>E(ee,x+1+te)).join("");if(d.hint){let ee=d.hint[d.overlap]??ie;or=xa(ee),ir=qo(d.remainder.slice(1)+de)}return qo(":")+Ve+or+ir},[r,o,d,m,u]);return ft.createElement(_n,{flexDirection:"column",justifyContent:"flex-start"},ft.createElement(_n,{flexDirection:"column",paddingX:1,borderColor:v.secondary,borderStyle:"round",width:e},ft.createElement(_n,null,ft.createElement(zo,null,f),i&&ft.createElement(zo,{wrap:"truncate",color:a?v.red:v.secondary2},` ${i} `))))};import Jo from"chalk";import{Box as ba,Text as $n}from"ink";import jt,{useEffect as Ea,useState as Ia}from"react";var Sa=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],Qo=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)}},Aa=({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)}`},wa=(e,t,n)=>{let r=Qo(e),o=Qo(t);return Aa({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},Ta=(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 wa(i,a,o)},Ma=(e,t)=>e.length===t?e:e.length>t?e.slice(0,t):e.padEnd(t," "),Zo=({width:e,availableHints:t})=>{let{syncStatus:{status:n,msg:r}}=V(),[o,i]=Ia(0);Ea(()=>{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 U=(a.length>0?" | ":"").length+E.length;if(d+U>e-4)break;a.push(E),d+=U}let m=n!="synced"?r??a.join(" | "):a.join(" | "),u=Math.max(0,e-2),f=n==="syncing"?Ta(Sa,(Math.sin(o*.12)+1)/2):v.secondary,x=Jo.hex(f??"fff"),N=Jo.hex(v.secondary2),A=x(`\u256D${"\u2500".repeat(u)}\u256E`),S=x(`\u2570${"\u2500".repeat(u)}\u256F`),I=`${x("\u2502")}${N(Ma(` ${m} `,u))}${x("\u2502")}`;return jt.createElement(ba,{flexDirection:"column",width:e},jt.createElement($n,null,A),jt.createElement($n,null,I),jt.createElement($n,null,S))};var zt=({width:e,mode:t,availableHints:n})=>{let r=V(),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 Vn.createElement(Ra,null,t===p.COMMAND_LINE&&r.syncStatus.status!=="syncing"?Vn.createElement(Yo,{width:e}):Vn.createElement(Zo,{width:e,mode:t,availableHints:n}))};import{Box as rt,Text as ei}from"ink";import Pe from"react";var ti=({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"]),Pe.createElement(rt,{flexDirection:"column",marginTop:3,borderColor:v.secondary,borderStyle:"round",width:e,minHeight:19},Pe.createElement(rt,{flexDirection:"column",width:e},h().mode===p.HELP?t.map(([n,r],o)=>Pe.createElement(rt,{paddingLeft:1,key:o,flexDirection:"row"},Pe.createElement(rt,{key:o,flexDirection:"row",paddingBottom:o?0:1},Pe.createElement(rt,{width:20,justifyContent:"flex-end"},Pe.createElement(ei,{color:o?v.accent:v.secondary},n)),Pe.createElement(rt,{flexGrow:1,width:40,paddingLeft:2},Pe.createElement(ei,{color:o?v.primary:v.secondary},r))))):null))};import ii from"chalk";import{Box as jn,Text as ai}from"ink";import Ie from"react";import{Box as Kn,Text as Oa}from"ink";import st from"react";import{Text as La}from"ink";import Pa from"react";var Da=e=>e.toLowerCase().trim(),Fa=(e,t=qe)=>{let n=Da(e);return t[n]?t[n]:ct(n)},ot=({id:e,isSelected:t})=>{let n=C.getContributor(e);if(n)return Pa.createElement(La,{underline:t,color:Fa(n.name)},"@"+n.name)};import{Text as ka}from"ink";import Ba from"react";var it=({id:e,isSelected:t})=>{let n=C.getTag(e);if(n)return Ba.createElement(ka,{underline:t,backgroundColor:ae(n.name),color:v.primary}," "+n.name+" ")};var Ua=(e,t)=>e.length<=t?e:t<=1?"\u2026":e.slice(0,t-1)+"\u2026",ni=({width:e})=>{let{breadCrumb:t,currentNode:n,selectedIndex:r,viewMode:o}=h(),i=H(n.id)[r],a=ze(i?.id??n.id,"TICKET"),d=Ke(a)?a.data:void 0,m=d?.id?H(d.id):[],u=I=>{let E=m.find(T=>T.title===I);return E?H(E.id).map(T=>typeof T.props?.value=="string"?T.props.value:"").filter(T=>!!T):[]},f=u("Tags"),x=u("Assignees"),N=d?.parentNodeId?!mn(n.id,d?.parentNodeId)&&o==="dense":!1,A=t.map((I,E)=>{let T=E===t.length-1,U=H(I.id),ie=T?U?.[r]?.title:void 0;return`${E?" / ":""}${I.title??""}${ie?` \u25B8 ${ie}`:""}`}).join(""),S=Ua(A,e);return st.createElement(Kn,null,st.createElement(Oa,{color:v.secondary2},S),N?f.map(I=>st.createElement(Kn,{key:I,paddingLeft:2},st.createElement(it,{id:I}))):null,N?x.map(I=>st.createElement(Kn,{key:I,paddingLeft:2},st.createElement(ot,{id:I}))):null)};import{Box as Wa,Text as ri}from"ink";import qt from"react";var Ha=({filters:e})=>qt.createElement(Wa,{columnGap:1},qt.createElement(ri,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>qt.createElement(ri,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),oi=qt.memo(Ha);function Gt({filters:e,hideBreadCrumb:t=!1}){let{userName:n,preferredEditor:r}=le(),o=40,i=process.stdout.columns-o-8;return Ie.createElement(jn,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?Ie.createElement(ai,null," "):Ie.createElement(jn,{paddingLeft:1},e.length>0?Ie.createElement(oi,{filters:e}):Ie.createElement(ni,{width:i})),Ie.createElement(jn,{columnGap:1,paddingRight:2,"max-width":o,overflow:"hidden",justifyContent:"flex-end"},Ie.createElement(si,{icon:"@",value:n}),Ie.createElement(si,{icon:"\u276F",value:r})))}function si({icon:e,value:t}){return Ie.createElement(ai,null,ii.dim(e)+ii.hex(v.accent)(` ${t??"-"} `))}import{Box as cd,Text as ld}from"ink";import vt from"react";import{Box as Xt,Text as zn}from"ink";import De from"react";import{Text as di}from"ink";import ci,{useEffect as _a,useState as $a}from"react";var li={help:["\u25B8 ","\u25B8 ","\u25B8 "],default:["\u25B8 ","\u25B8 ","\u25B8 "],move:["\u2191 ","\u2192 ","\u2193 ","\u2190 "],"command-line":["\u276F ","\u276F ","\u276F "]},Z=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=V(),r=li[n]??li.default,[o,i]=$a(r.length-1);return _a(()=>{if(!e)return;let a=setInterval(()=>{i(d=>(d+1)%r.length)},800);return()=>clearInterval(a)},[e,r]),e?ci.createElement(di,{color:v.accent,dimColor:o===1},r[o]):ci.createElement(di,null,t)};function qn(){let e=V(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,i=process.stdout.columns||120,a=t?.id?M(t?.id):[];return De.createElement(Xt,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:v.secondary,width:i},De.createElement(Xt,{padding:1,paddingTop:0,paddingBottom:0},De.createElement(zn,null,"Select a board:")),De.createElement(Xt,{padding:1,flexDirection:"column"},a.map((d,m)=>{let u=e.currentNode.context==="WORKSPACE"&&e.selectedIndex===m,x=M(d.id).flatMap(({id:N})=>H(N)).length;return De.createElement(Xt,{key:d.id??m},De.createElement(zn,{color:u?v.accent:v.secondary},De.createElement(Z,{isSelected:u})),De.createElement(zn,{color:u?v.accent:v.secondary},d.title," (",x," issues)",d.readonly?" \u{1F512}":""))})))}import{Box as ad}from"ink";import tn from"react";import{Box as Yn,Text as qa}from"ink";import fe from"react";import{Box as Gn,Text as Va}from"ink";import Yt from"react";var Jt=({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,I=A?Math.max(1,Math.floor(d/e.length*S)):S,E=Math.max(0,S-I),T=Math.max(1,e.length-d),U=A?Math.floor(f/T*E):0;return Yt.createElement(Gn,{flexDirection:"row",height:i,width:"100%"},Yt.createElement(Gn,{flexDirection:"column",flexGrow:1,height:i},N),Yt.createElement(Gn,{flexDirection:"column",width:1,height:S},Array.from({length:S}).map((ie,de)=>Yt.createElement(Va,{key:de,color:A&&de>=U&&de<U+I?v.accent:v.secondary},A?"\u2502":" "))))};import{Box as Qt,Text as Ka}from"ink";import _e from"react";var mi=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=Nt(dr(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 _e.createElement(Qt,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?v.accent:v.secondary,justifyContent:"space-between"},_e.createElement(Qt,{borderBottom:!0},_e.createElement(Qt,{paddingLeft:1,flexDirection:"column"},_e.createElement(Ka,{color:v.primary},o))),_e.createElement(Qt,{flexDirection:"row",paddingLeft:1},d.map(u=>_e.createElement(it,{key:u.id,id:u.id})),m.map(u=>_e.createElement(ot,{key:u.id,id:u.id}))))};import ja from"chalk";import{Box as xt,Text as Xn}from"ink";import Se from"react";var za=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,ui=({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),m=a("Assignees").map(I=>C.getContributor(I)).filter(I=>!!I),u=1,f=d.length*(1+u),x=m.length*(2+u),N=d.map(I=>Se.createElement(xt,{key:I.id,paddingRight:u},Se.createElement(Xn,{color:ae(I.name)},"\u25A0"))),A=m.map(I=>Se.createElement(xt,{key:I.id,paddingRight:u},Se.createElement(Xn,{color:ct(I.name)},"@"+I.name.at(0)))),S=n?v.accent:o===p.MOVE?v.secondary:v.primary;return Se.createElement(xt,{borderBottom:!0,justifyContent:"space-between"},Se.createElement(xt,null,Se.createElement(Z,{isSelected:n,placeholder:ja.dim.gray(r+1+" ")}),Se.createElement(Xn,{wrap:"truncate",color:S},za(t.title,e-f-x-14))),Se.createElement(xt,null,N,A))};var Ga=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:i,listSelectedIndex:a,mode:d})=>{let{renderedChildrenIndex:m}=V(),u=m[e.id]??[],f=`${e.title} (${u.length})`,x=3,N=o?1:4,A=r-x-(o?2:1),S=fe.createElement(Yn,{borderStyle:"round",borderColor:v.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},fe.createElement(Z,{isSelected:t}),fe.createElement(qa,{bold:!0,color:t?v.accent:v.primary},f," ",e.readonly?"\u{1F512}":"")),I=(E,T)=>{let U=i&&a===T;return o?fe.createElement(ui,{key:E.id,index:T,width:n,ticket:E,isSelected:U,mode:d}):fe.createElement(mi,{key:E.id,width:n,ticket:E,isSelected:U})};return fe.createElement(Yn,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?v.accent:v.secondary,paddingRight:1,paddingLeft:1,height:r},S,fe.createElement(Yn,{padding:o?1:0},u.length>0&&fe.createElement(Jt,{selectedIndex:a,height:A,itemHeight:N},u.map(I)),fe.createElement(Z,{isSelected:i&&a===-1})))},pi=fe.memo(Ga);import{Box as Zn,Text as id}from"ink";import Fe,{useEffect as er,useMemo as vi}from"react";import Ae from"chalk";import fi from"string-width";import{decodeTime as Xa}from"ulid";var gi=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 Ya=(e,t)=>e+" ".repeat(Math.max(0,t-fi(e))),Ja=(e,t)=>" ".repeat(Math.max(0,t-fi(e)))+e,Qa=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)})(),Za=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""}},ed=e=>{let t=gi(Xa(e));return Ae.gray(Ja(t,8))},td=12,nd=e=>{let t=e.split(".")[1]??"unknown";return Ya(`${t}`,td)},yi=e=>{let t=ed(e.id),n=nd(e.userId),r=Qa(e.action),o=Za(e),i=Ae.dim("\u203A"),a=[r,o].filter(Boolean).join(" ");return`${n} ${t} ${i} ${a}`};import{Box as Zt,Text as rd}from"ink";import we from"react";var xi=({selectedIndex:e,parent:t,selected:n})=>{let{currentNode:r}=V(),{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(Zt,{alignItems:"center",paddingTop:1},we.createElement(Zt,{minWidth:12},we.createElement(Z,{isSelected:n}),we.createElement(rd,{color:n?v.accent:v.secondary2},o,":")),we.createElement(Zt,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((a,d)=>{let m=r.id===t.id&&d===e;return we.createElement(Zt,{key:`${o}-${a}`,paddingRight:2,minHeight:1},we.createElement(Z,{isSelected:m}),o==="Assignees"?we.createElement(ot,{isSelected:m,id:a}):o==="Tags"?we.createElement(it,{isSelected:m,id:a}):null)})))};import{Box as en,Text as Jn}from"ink";import Te,{useEffect as od}from"react";var Qn=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:a,currentNode:d}=V(),m=N=>String(N).replace(/\r?\n/g,""),u=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];od(()=>{let N=[];return u.forEach((A,S)=>{let I=G.text({id:`${S}`,name:`Line ${S+1}`,parentNodeId:e,props:{value:A},readonly:!0}),E=C.createNodeAtPosition(I);Ke(E)&&N.push(E.data.id)}),()=>N.forEach(C.deleteNode)},[e,n]);let f="\u2029",x=u.map((N,A)=>{let S=d.id===e&&a===A;return Te.createElement(en,{key:`${e}-${A}`},Te.createElement(Jn,{color:S?v.primary:v.secondary2,dimColor:!S},`${A+1} `.padStart(5,"\xA0")),Te.createElement(Jn,{backgroundColor:S?"gray":""},m(N.length?Nt(N,i-10):f)))});return Te.createElement(en,{flexDirection:"column",paddingTop:1},Te.createElement(en,null,Te.createElement(Z,{isSelected:o}),Te.createElement(Jn,{color:o?v.accent:v.secondary2},t)),Te.createElement(en,{flexDirection:"row",borderStyle:"round",borderColor:v.secondary,paddingLeft:1,paddingRight:1,marginLeft:1},Te.createElement(Jt,{scrollByOne:!0,children:x,height:r-2,selectedIndex:a,itemHeight:1})))};var sd=e=>`${e}::log`,hi=({ticket:e,height:t})=>{let{selectedIndex:n,currentNode:r}=V(),o=process.stdout.columns||120,i=vi(()=>sd(e.id),[e.id]),a=vi(()=>[...e.log].reverse().map(yi).join(`
|
|
34
|
+
`),[e.log]);er(()=>{if(C.getNode(i))return;let T={...G.field(i,"Log",e.id,{value:a}),readonly:!0,childRenderAxis:"vertical"};return C.createNodeAtPosition(T),()=>{C.deleteNode(i)}},[i,e.id]),er(()=>{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,m=r.id===i||r.parentNodeId===i;er(()=>{m&&(n>=0||k.navigate({selectedIndex:0}))},[m,n]);let u=M(e.id);if(m){let E=C.getNode(i),U=t-3;return Fe.createElement(Zn,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},E?Fe.createElement(Qn,{id:E.id,label:"Event log",text:E.props.value??"",selected:!1,maxWidth:o,height:U}):null)}let f=u.reduce((E,T)=>T.title==="Assignees"||T.title==="Tags"||T.id===i?++E:E,0),x=2,N=f*1,S=t-3-N-x,I=(E,T)=>E.title==="Assignees"||E.title==="Tags"?Fe.createElement(xi,{key:E.id,parent:E,selected:T,selectedIndex:n}):E.id===i?Fe.createElement(Zn,{key:E.id,paddingTop:1},Fe.createElement(Z,{isSelected:T}),Fe.createElement(id,{backgroundColor:v.secondary,color:T?v.accent:v.primary}," History \u203A\u203A ")):Fe.createElement(Qn,{label:"Description (press e to edit)",key:E.id,id:E.id,text:E.props.value??"",selected:T,maxWidth:o,height:S});return Fe.createElement(Zn,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},u.map((E,T)=>I(E,d&&n===T)))};var dd=({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(E=>E.context===L.TICKET),N=Math.floor(d/3),A=Math.floor(d/Math.max(e.length,1)),S=Math.min(A,N),I=i==="dense";return tn.createElement(ad,{flexDirection:"row",height:a},f&&e.map((E,T)=>{let U=t.id===E.id,ie=U?n:-1,de=t.context===L.BOARD&&n===T;return tn.createElement(pi,{key:E.id,height:a,width:S,swimlane:E,isSelected:de,isDense:I,isFocused:U,listSelectedIndex:ie,mode:o})}),u&&x&&tn.createElement(hi,{height:a,ticket:x}))},Ci=tn.memo(dd);var md=({currentNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:i,width:a})=>{let{renderedChildrenIndex:d}=V(),m=n.find(({context:N})=>N==="BOARD"),x=i-1-3;return vt.createElement(cd,{flexDirection:"row"},e.context==="WORKSPACE"?vt.createElement(qn,null):m?vt.createElement(Ci,{height:x,width:a,swimlanes:(d[m.id]??[]).filter(N=>N!==void 0&&sr(N)),currentNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):vt.createElement(ld,null))},Ni=vt.memo(md);import{Box as ht,Text as ye}from"ink";import W from"react";var nn=({isDone:e,command:t,value:n})=>W.createElement(ht,null,W.createElement(ye,{color:v.accent,dimColor:e},e?" \u2714 ":" "),W.createElement(ye,{dimColor:e},"Type "),W.createElement(ye,{backgroundColor:v.secondary,dimColor:e}," "+t+" "),n&&W.createElement(W.Fragment,null,W.createElement(ye,{dimColor:e}," "),W.createElement(ye,{color:v.secondary,dimColor:e},"<"+n+">")));function tr({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 W.createElement(ht,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:v.secondary,rowGap:1},W.createElement(ye,{color:v.accent,bold:!0},"Welcome! \u{1F539}"),W.createElement(ye,null,"Lets get you started - its a breeze."),W.createElement(ye,{color:v.secondary2},"And remember, you can always get help with"," ",W.createElement(ye,{color:v.accent},":help"),"."),!a&&W.createElement(ye,{color:v.secondary2},d===":set:username"?"First, choose your username.":"Nice. One more step."),W.createElement(ht,{flexDirection:"column"},n&&W.createElement(ht,{marginBottom:1},W.createElement(nn,{isDone:!0,command:":set:username",value:o})),!n&&W.createElement(nn,{isDone:!1,command:":set:username"}),n&&!r&&W.createElement(nn,{isDone:!1,command:":set:editor"}),a&&W.createElement(ht,null,W.createElement(nn,{isDone:!0,command:":set:editor",value:i}))))}var pd=({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(ke,{color:v.accent,bold:!0},"Initialize project"),D.createElement(ke,null,`This folder is not an ${ud.hex(v.accent)("epiq")} project yet.`),D.createElement(ke,{color:v.primary},"To start tracking issues here, we need to initialize a new"," ",D.createElement(ke,{color:v.primary,backgroundColor:v.secondary}," .epiq/ ")," ","directory in this repository."),D.createElement(ue,{marginTop:1,flexDirection:"column"},D.createElement(ue,null,D.createElement(ke,{color:v.accent}," "),D.createElement(ke,{color:v.primary},"Type "),D.createElement(ke,{backgroundColor:v.secondary}," :init "))),D.createElement(ue,{marginTop:1},D.createElement(ke,{color:v.secondary2},"(This will create the local epiq project files)")));function nr({width:e,height:t}){let n=V(),r=n.filters;if(n.mode===p.HELP)return D.createElement(ue,{flexDirection:"column"},D.createElement(ti,{width:e}));let{isSetup:o,hasPreferredEditor:i,hasUserName:a,userName:d,preferredEditor:m}=St(),u=!o,f=o&&At();if(u)return D.createElement(ue,{flexDirection:"column"},D.createElement(ue,{flexDirection:"column"},D.createElement(Gt,{hideBreadCrumb:!0,filters:r}),D.createElement(tr,{height:t,width:e,hasUserName:a,hasPreferredEditor:i,userName:d??"",preferredEditor:m??""})),D.createElement(zt,{width:e,mode:n.mode,availableHints:n.availableHints}));if(f)return D.createElement(ue,{flexDirection:"column"},D.createElement(ue,{flexDirection:"column"},D.createElement(Gt,{hideBreadCrumb:!0,filters:r}),D.createElement(pd,{height:t,width:e})),D.createElement(zt,{width:e,mode:n.mode,availableHints:n.availableHints}));let x=tt(h().breadCrumb??[],"BOARD");if(Ke(x)){let N=x.data.id,A=M(N).length,S=3,I=Math.floor(e/S),E=Math.floor(e/Math.max(A,1));e=Math.min(E,I)*Math.max(A,S)}return D.createElement(ue,{flexDirection:"column"},D.createElement(ue,{flexDirection:"column"},D.createElement(Gt,{filters:r}),D.createElement(Ni,{width:e,height:t,currentNode:n.currentNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:n.viewMode,mode:n.mode})),D.createElement(zt,{width:e,mode:n.mode,availableHints:n.availableHints}))}import{Box as $e,Text as Be}from"ink";import q,{useEffect as gd,useMemo as fd,useState as yd}from"react";var xd=["\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 vd(e,t,n){return Math.min(n,Math.max(t,e))}function hd(e,t){return q.createElement(Be,null,q.createElement(Be,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(0,14)),q.createElement(Be,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(14)))}function Cd(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 rr({durationMs:e=3e3,slogan:t="Never leave the command line"}){let n=Math.max(1,e),[r,o]=yd(0);gd(()=>{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=vd(r/n,0,1),a=fd(()=>Cd(i,28),[i]),d=`${Math.round(i*100)}%`;return q.createElement($e,{flexDirection:"column",alignItems:"center",justifyContent:"center",paddingX:4,paddingY:1},q.createElement($e,{flexDirection:"column",minWidth:42},q.createElement($e,{flexDirection:"column",marginBottom:1},xd.map((m,u)=>q.createElement($e,{key:u,justifyContent:"center"},hd(m,u)))),q.createElement($e,{justifyContent:"center",marginBottom:1},q.createElement(Be,{color:"gray"},t)),q.createElement($e,{justifyContent:"center",marginBottom:1},q.createElement(Be,{color:"cyan"},a.slice(0,10)),q.createElement(Be,{color:"blue"},a.slice(10,18)),q.createElement(Be,{color:"magenta"},a.slice(18))),q.createElement($e,{justifyContent:"center",marginBottom:1},q.createElement(Be,{color:"gray"},d))))}import Nd from"readline";var rn,on,xe,bi=async e=>{if(e.ctrl&&e.name==="c")return k.exit();let{actionIndex:t,mode:n}=h(),r=kr(e,n);if(!r)return;let o=t[n]?.[r];if(o?.action)try{await o.action(o,e)}catch(i){logger.error(i)}},bd=()=>async function(t,n){n.name!=="escape"&&(xe&&(clearTimeout(xe),xe=void 0),await bi(n))},Ed=()=>async function(t){if(t.length===1&&t[0]===27){xe&&clearTimeout(xe),xe=setTimeout(()=>{bi({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),xe=void 0},25);return}xe&&(clearTimeout(xe),xe=void 0)};function Ei(){rn&&process.stdin.removeListener("keypress",rn),on&&process.stdin.removeListener("data",on),rn=bd(),on=Ed(),Nd.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",on),process.stdin.on("keypress",rn)}Sd(`
|
|
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 Ad=2e3,wd=600,
|
|
40
|
+
`,{importMeta:import.meta,flags:{init:{type:"string"}}});var Ad=2e3,wd=600,Si=process.stdout.columns||120,Ai=process.stdout.rows||20,sn=null,Td=e=>new Promise(t=>setTimeout(t,e)),wi=e=>{if(!sn){sn=Id(e);return}sn.rerender(e)},Ti=()=>{wi(Ii.createElement(nr,{width:Si,height:Ai}))},Md=e=>{wi(Ii.createElement(rr,{durationMs:e}))},Rd=()=>{let e=zr();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},Ld=e=>{let t=jo(e);if(l(t))throw new Error(`Failed to boot state: ${t.message}`)};async function Pd(){io(),await Mo();let e=Rd(),n=e.length===0?Ad:wd;n>0&&Md(n);let r=Date.now();Ld(e);let o=Date.now()-r,i=Math.max(0,n-o);i>0&&await Td(i),Ti(),Ei()}process.stdout.on("resize",()=>{Si=process.stdout.columns||120,Ai=process.stdout.rows||20,sn&&Ti()});(async()=>(console.clear(),await Pd()))();
|