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