epiq 0.2.2 → 0.2.4

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