epiq 0.1.9 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/cli.js +10 -10
  2. package/package.json +1 -1
  3. package/readme.md +43 -35
package/dist/cli.js CHANGED
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
- import Ke from"fs";import Ln from"path";import Br from"util";var Pn=process.env.IS_LOCAL==="true",Ve=Ln.resolve(process.cwd(),".epiq","log","epiq.log"),wn=1e3;function Fr(){if(!Pn||!Ke.existsSync(Ve))return;let t=Ke.readFileSync(Ve,"utf8").split(`
3
- `);if(t[t.length-1]===""&&t.pop(),t.length<=wn)return;let n=t.slice(-wn).join(`
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
4
  `)+`
5
- `;Ke.writeFileSync(Ve,n,"utf8")}function Ut(e,t,n=!1){if(!Pn)return;let o=Br.format(...t),r=new Date,s=`[${n?r.toISOString().slice(11,19):r.toISOString()}] ${e} ${o}
6
- `;Ke.mkdirSync(Ln.dirname(Ve),{recursive:!0}),Ke.appendFileSync(Ve,s,"utf8"),Fr()}var kr={info(...e){Ut("[Info]",e,!1)},debug(...e){Ut("->",e,!0)},error(...e){Ut("[Error]",[...e,new Error().stack],!1)}};globalThis.logger=kr;import{render as Pr}from"ink";import Js from"meow";import Ze from"react";import{Box as Lt}from"ink";import J from"react";import{Box as bs,Text as Ss}from"ink";import Xe from"react";var T={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function Ie(e){return e.context==="TICKET"}function Dn(e){return e.context==="FIELD_LIST"}var Bn=e=>e.context==="SWIMLANE";import{useSyncExternalStore as ji}from"react";var y={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:""},Z={None:"none",Invalid:"invalid",Valid:"valid"},ee={None:"none",Success:"success",Fail:"fail"},l=e=>({result:ee.Fail,message:e,data:null}),m=(e,t)=>({result:ee.Success,message:e,data:t}),Fn=()=>({result:ee.None,message:"No result",data:null}),v=e=>e.result==="fail",pe=e=>e.result==="success";var Se=24n,Rr=Se*4n,et=(1n<<Rr)-1n,Or=/^[0-9a-f]+$/;function kn(e){if(!e||!Or.test(e))throw new Error(`Invalid hex rank: ${e}`);return BigInt("0x"+e)}function tt(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 tt(et/2n,Se);let n=e?kn(e):0n,o=t?kn(t):et;if(o<=n)return tt(et/2n,Se);let r=(n+o)/2n;return r===n||r===o?"":tt(r,Se)}function q(){return tt(et/2n,Se)}var H={workspace:(e,t)=>({id:e,title:t,rank:q(),isDeleted:!1,props:{},context:T.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,o=!1)=>({id:e,title:t,rank:q(),isDeleted:!1,props:{},context:T.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n)=>({id:e,title:t,rank:q(),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:q(),isDeleted:!1,props:o,context:T.FIELD,childRenderAxis:r,parentNodeId:n,readonly:!1,log:[]}),ticket:(e,t,n)=>({id:e,title:t,rank:q(),isDeleted:!1,props:{},context:T.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:(e,t,n,o={})=>({id:e,title:t,rank:q(),isDeleted:!1,props:o,context:T.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]})};function nt(e,t){let n=Math.min(e.length,t.length),o=0;for(;o<n&&e[o]===t[o];)o++;return o}var ot=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",rt=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)),Rn=(e,t)=>e.findIndex(n=>n.id===t),Wt=(e,t={at:"end"})=>{if(e.length===0)return m("Resolved rank",q());switch(t.at){case"start":{let n=e[0];return n?m("Resolved rank",$e(void 0,n.rank)):l("Unable to resolve first sibling")}case"end":{let n=e[e.length-1];return n?m("Resolved rank",$e(n.rank,void 0)):l("Unable to resolve last sibling")}case"before":{let n=Rn(e,t.sibling);if(n<0)return l("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)):l("Sibling not found")}case"after":{let n=Rn(e,t.sibling);if(n<0)return l("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)):l("Sibling not found")}}};var Te=(e,t)=>{let{nodes:n}=f(),o=n[e];if(!o)return l("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 l(`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 Ur(e){return rt(e).replace(/\s+/g," ").trim()}function On(e,t){if(!e)return[];let n=[],o=new Set,r=f(),{renderedChildrenIndex:i,tags:s,contributors:a}=r,d=c=>{let g=i[c.id];if(c.title===t&&Dn(c))for(let p of g??[]){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=Ur(A),I=E.toLowerCase();E&&!o.has(I)&&(o.add(I),n.push(E))}for(let p of g??[])d(p)};return d(e),n.sort((c,g)=>c.localeCompare(g))}var Ht=(e,t)=>e?e.readonly?l({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node"}[t]):null:l("Node not found"),x={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 l("Edit target node not found");let r=Ht(o,"edit");if(r)return r;let i={...o,props:{...o.props,value:t}};return x.updateNode(i),m("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return l("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?On(n,"Tags"):[]},getExistingAssignees(){let{rootNodeId:e,nodes:t}=f(),n=t[e];return n?On(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 l("Node not found");if(!s)return l("Target parent not found");if(r===e)return l("Cannot move root node");if(e===t)return l("Cannot move node into itself");let a=Ht(i,"move");if(a)return a;if(_t(t,e))return l("Cannot move node into its own descendant");let d=P(t).filter(p=>p.id!==e),c=Wt(d,n);if(v(c))return c;let g={...i,parentNodeId:t,rank:c.data};return o?this.updateNodeAndSelectInParent(g):this.updateNode(g),m("Moved node successfully",g)},tombstoneNode(e){let{nodes:t,currentNodeId:n,rootNodeId:o}=f(),r=this.getNode(e);if(!r)return l("Node not found");if(o===e)return l("Cannot delete root node");let i=new Set,s=c=>{let g=t[c];if(!(!g||i.has(c))){i.add(c);for(let p of P(g.id))s(p.id)}};s(e);let a={...structuredClone(t)};for(let c of i){if(!a[c])return l("Unable to locate node to delete");a[c]={...a[c],isDeleted:!0}}if(!n)return l("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 v(t)?l("Unable to create contributor"):m("Created contributor",e)},assign(e,t,n){let o=x.getContributor(t),r=x.getNode(e);if(!r||!o)return l("Unable assign contributor to issue");let i=this.getFieldByTitle(r.id,"Assignees");if(!i)return l("Unable to locate assignees field");if(P(i.id).some(d=>d.props?.value===t))return l("Contributor already assigned");let a=this.createNodeAtPosition(H.field(n,o.name,i.id,{value:t}));return v(a)?a:m("Assigned contributor",a.data)},createTag(e){let t=j(n=>({...n,tags:{...n.tags,[e.id]:e}}));return v(t)?l("Could not create tag"):m("Tag created",e)},tag(e,t,n){let o=x.getTag(t),r=x.getNode(e);if(!o)return l("Unable to add tag, missing tag");if(!r)return l("Unable to add tag, missing target");let i=this.getFieldByTitle(r.id,"Tags");if(!i)return l("Unable to locate tags field");if(P(i.id).some(d=>d.props?.value===t))return l("Tag already assigned");let a=this.createNodeAtPosition(H.field(n,o.name,i.id,{value:t}));return v(a)?a:m("Tag added",a.data)},createNodeAtPosition(e,t={at:"end"}){if(!e.parentNodeId){let i={...e,rank:q()};return this.createNode(i),m("Created node",i)}let n=P(e.parentNodeId),o=Wt(n,t);if(v(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 v(t)?m("Node created",e):l("Unable to create node")},lockNode(e){let t=this.getNode(e);if(!t)return l("Failed to locate node");let n={...t,readonly:!0},o=j(r=>({...r,nodes:{...r.nodes,[e]:n}}));return v(o)?l(o.message):m("Locked node",n)},updateNode(e){let t=j(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return v(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 Un=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 Wr=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[Me,it]=Wr;var w=(e,t)=>l(`${t.split(".").join(" ")+" failed, "+e.toLowerCase()}`),Hr={"init.workspace":({action:e,payload:t})=>{let{id:n,name:o}=t,r=H.workspace(n,o);Hn(r);let i=x.createNodeAtPosition(r);return v(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=x.createNodeAtPosition(r);return v(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=x.createNodeAtPosition(H.board(n,o,r));return v(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=x.createNodeAtPosition(H.swimlane(n,o,r));return v(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=x.createNodeAtPosition(H.ticket(n,o,r));return v(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=x.createNodeAtPosition(H.field(n,o,r,{value:i},o.includes("Description")?"vertical":"horizontal"));return v(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(!x.getNode(n))return w("Unable to locate node",e);let i=x.renameNode(n,o);return v(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=x.tombstoneNode(n);return v(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=x.createTag({id:n,name:o});return v(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=x.createContributor({id:n,name:o});return v(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=x.tag(o,r,n);return v(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=x.assign(r,o,n);return v(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=x.moveNode({id:n,parentId:o,position:r});return v(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=x.editValue(n,o);return v(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=x.getNode(n);if(!o)return w("Unable to locate issue",e);if(!Ie(o))return w("Can only close issues",e);let r=x.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=x.moveNode({id:n,parentId:r.id,navigate:!1});return v(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=x.getNode(n);if(!o)return w("Unable to locate issue",e);if(!Ie(o))return w("Can only reopen issues",e);let r=x.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=Un(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(!x.getNode(s))return w("Previous parent no longer exists",e);let d=x.moveNode({id:n,parentId:s,navigate:!1});return v(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=x.lockNode(n);return v(o)?w(o.message??"Unable to lock node",e):m("Node locked",{action:e,result:o.data})}},_r=(e,t)=>{let n=x.getNode(e);n&&x.updateNode({...n,log:[...n.log??[],t]})},Kr=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=Hr[e.action],n=t(e);if(!v(n)){let o=[...new Set(Kr(e))];for(let r of o)_r(r,e)}return n}var Wn=e=>e.map(t=>we(t));import jn from"node:fs";import Jr from"node:os";import qn from"node:path";import{decodeTime as Yr,monotonicFactory as Qr}from"ulid";var st={preferredEditor:null,userName:null},ge=()=>st,ze=e=>(st={...st,...e},st);var _n=e=>({action:e.action,payload:e.payload});import Kt from"node:fs";import Kn from"node:path";import{ulid as Vr}from"ulid";var $r=".epiq",zr="events",jr=(e=process.cwd())=>Kn.join(e,$r,zr),Gr=e=>{let t=Object.keys(e).filter(n=>n!=="id");return t.length!==1?l(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):m("Resolved persisted action",t[0])},qr=e=>{let t=Gr(e);if(v(t))return l(t.message);let n=t.data;if(!n)return l("Action key is undefined");let o=e[n];return m("Decoded persisted event",{id:e.id[0]??Vr(),action:n,payload:o,userId:Y()})};function Vn(e=process.cwd()){let t=jr(e);if(!Kt.existsSync(t))return[];let n=Kt.readdirSync(t).filter(r=>r.endsWith(".jsonl")).map(r=>Kn.join(t,r)),o=[];for(let r of n){let i=Kt.readFileSync(r,"utf8");for(let s of i.split(`
7
- `)){let a=s.trim();if(a)try{o.push(JSON.parse(a))}catch{}}}return Xr(o)}function $n(e=process.cwd()){return Vn(e).map(qr).filter(pe).map(({data:t})=>t)}function zn(e=process.cwd()){return Vn(e).at(-1)?.id[0]??null}var Xr=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],c=n.get(d)??[];c.push(a),n.set(d,c)}for(let a of n.values())a.sort((d,c)=>{let[g]=d.id,[p]=c.id;return g.localeCompare(p)});let o=[],r=new Set,i=a=>{let d=n.get(a)??[];for(let c of d){let[g]=c.id;r.has(g)||(r.add(g),o.push(c),i(g))}};i(null);let s=[...e].filter(a=>{let[d]=a.id;return!r.has(d)}).sort((a,d)=>{let[c,g]=a.id,[p,C]=d.id,h=g===null||t.has(g),A=C===null||t.has(C);if(h&&!A)return-1;if(!h&&A)return 1;let E=(g??"").localeCompare(C??"");return E!==0?E:c.localeCompare(p)});return[...o,...s]};var Gn=Qr(),Zr=".epiq",ei="events",Vt=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",Y=()=>{let e=process.env.EPIQ_ACTOR_ID;if(e?.trim())return Vt(e);let t=ge().userName;if(t?.trim())return Vt(t);try{return Vt(Jr.userInfo().username)}catch{return"unknown"}},Xn=(e=process.cwd())=>qn.join(e,Zr,ei),ti=(e=process.cwd())=>{let t=Y();return qn.join(Xn(e),`${t}.jsonl`)},ni=(e,t)=>({[e.action]:e.payload,id:t});function Jn(e,t=process.cwd()){try{let n=Xn(t),o=ti(t);jn.mkdirSync(n,{recursive:!0});let r=zn(t),i;if(r){let a=Yr(r),d=Math.max(Date.now(),a+1);i=Gn(d)}else i=Gn();let s=ni(_n(e),[i,r]);return jn.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 l(`Failed to persist event: ${o}`)}}function U(e){let t=we(e);if(t.result!==ee.Success)return t;let n=Jn(e);return v(n)?n:t}function at(e){return e.map(t=>U(t))}var u={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};var oi=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",ri=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",ii=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",Yn=(e,t)=>{if(ri(e,e.sequence))return"MoveCursorLeftOfWord";if(ii(e,e.sequence))return"MoveCursorRightOfWord";if(oi(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 Qn=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 eo=new WeakMap,si=e=>{let t=eo.get(e);return t||(t=Qn(e),eo.set(e,t)),t};var to=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let o=t.toLowerCase();return Zn(si(e),o).filter(i=>nt(o,i)>=n)};var no=({inputToMatch:e,lastWord:t},n)=>{if(t.endsWith(" "))return{hint:"",hints:[],overlap:0,remainder:""};let o=to({wordList:n,inputToMatch:e,overlapThreshold:1});return ai(t,o)},ai=(e,t)=>{let n=t[0]??"",o=nt(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 k=e=>({[y.FILTER]:["tag","assignee","description","title","clear"],[y.DELETE]:["confirm"],[y.RE_OPEN_ISSUE]:["confirm"],[y.CLOSE_ISSUE]:["confirm"],[y.SET_USERNAME]:[],[y.SET_VIEW]:["dense","wide"],[y.SET_EDITOR]:["vi","vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"],[y.NONE]:[...new Set([...Object.values(y)])],[y.TAG]:[...new Set([...Object.keys(Le),...x.getExistingTags()])],[y.ASSIGN]:x.getExistingAssignees(),[y.HELP]:[],[y.RENAME]:[],[y.NEW]:["issue","swimlane","board"]})[e];import ro from"chalk";import Pe from"chalk";var di=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)},li=(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 c=n-o/2,g=p=>Math.round((p+c)*255).toString(16).padStart(2,"0");return`#${g(s)}${g(a)}${g(d)}`},De=e=>{let n=di(e)%360;return li(n,65,45)},dt=[[168,85,247],[34,211,238],[59,130,246]],zt=(e,t,n)=>e+(t-e)*n,ci=(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))],oo=e=>{let t=Math.max(0,Math.min(1,e)),n=dt.length-1,o=t*n,r=Math.min(Math.floor(o),n-1),i=o-r;return dt?ci(dt[r],dt[r+1],i):[0,0,0]},mi=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},je=e=>mi(e.toLowerCase().trim())/4294967295,ui=e=>{let t=je(e),[n,o,r]=oo(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]=oo(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=>ui(e).normal(` ${e} `);var oe=()=>({validity:Z.Valid,completionWordList:[]}),ne=({message:e,completionWordList:t})=>({validity:Z.Invalid,message:e,completionWordList:t}),lt=e=>e.length===0,te=({prefix:e="",wordList:t,postfix:n="",noOfHints:o=2,inputString:r})=>{let a=[...t.filter(Boolean).filter(c=>c.startsWith(r.trim()))].sort((c,g)=>je(c)-je(g)).slice(0,o).map(Gt),d=a.length>1?a.join(" "):"";return d?`${ro.dim(e)}${d}${ro.dim(n)}`:""},io=()=>oe(),qt=({modifier:e})=>{let t="confirm";return e===t?oe():ne({message:lt(e)?`if you are certain, enter ${Gt(t)}`:"",completionWordList:[t]})},so=({list:e,hint:t})=>({modifier:n})=>e.includes(n)?oe():ne({message:lt(n)?t:"",completionWordList:[]}),ao=({hint:e})=>({modifier:t,inputString:n})=>lt(t)&&lt(n)?ne({message:e,completionWordList:[]}):oe(),pi={[y.FILTER]:e=>{if(e.modifier==="clear")return oe();let t=s=>k(y.FILTER).includes(s);if(!e.modifier||!t(e.modifier??""))return ne({message:te({wordList:k(y.FILTER),noOfHints:100,inputString:e.inputString}),completionWordList:k(y.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()??"")?ne({message:te({prefix:`existing ${e.modifier}s...`,wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i}):oe():ne({message:te({prefix:"one of... ",wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i})},[y.NONE]:e=>{let t=k(y.NONE);return e.command?oe():ne({message:te({prefix:"commands... ",wordList:t,noOfHints:100,inputString:e.inputString}),completionWordList:[]})},[y.NEW]:e=>so({list:k(y.NEW),hint:te({wordList:k(y.NEW),noOfHints:3,inputString:e.inputString})})(e),[y.HELP]:io,[y.RENAME]:io,[y.DELETE]:e=>qt(e),[y.CLOSE_ISSUE]:e=>qt(e),[y.RE_OPEN_ISSUE]:e=>qt(e),[y.TAG]:e=>ao({hint:te({prefix:"tag name like... ",wordList:k(y.TAG),noOfHints:3,inputString:e.inputString})})(e),[y.ASSIGN]:e=>ao({hint:te({wordList:k(y.ASSIGN),postfix:", etc.",noOfHints:3,inputString:e.inputString})})(e),[y.SET_EDITOR]:e=>{let t=k(y.SET_EDITOR);return e.modifier?oe():ne({message:te({wordList:t,noOfHints:100,inputString:e.inputString}),completionWordList:[]})},[y.SET_USERNAME]:e=>e.inputString?oe():ne({message:"enter global username (must be unique in project for consistent logs)",completionWordList:[]}),[y.SET_VIEW]:e=>so({list:k(y.SET_VIEW),hint:te({wordList:k(y.SET_VIEW),noOfHints:3,inputString:e.inputString})})(e)},lo=Object.fromEntries(Object.entries(pi).map(([e,t])=>[e,{validate:(n,o,r)=>t({modifier:o,command:n,inputString:r})}]));var co=["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 mo=e=>Object.values(y).includes(e),uo=(e,t)=>{let n=e.command??"",{modifier:o,target:r,inputString:i}=e,{message:s,validity:a,completionWordList:d}=lo[n].validate(n,o,i),c=r==="command"?Object.values(y):n&&e.target==="modifier"?k(n):co;return{validity:a,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:s??"",autoCompletion:t?no(e,[...d,...c]):{hint:"",hints:[],remainder:"",overlap:0}}};var po=e=>{let t=e.trimStart(),n=fi(t),o=(n[0]??"").trimStart().trimEnd(),r=(n[1]??"").trimStart().trimEnd(),i=xi(e),s=mo(o)?o:null,a=s!==null,d=o!=="",c=e.endsWith(" "),g=s?k(s)??[]:[],p=s&&g.includes(r)?r:"",C="word";n.length<=1?C="command":n.length===2&&(C="modifier");let h=gi(t,s,p);return{raw:e,trimmedStart:t,words:n,firstWord:o,lastWord:i,hasCommand:d,command:s,isCommandKeyword:a,isLastWordCompleted:c,modifier:p,target:C,inputToMatch:i,inputString:h}},gi=(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},fi=e=>e?e.split(/\s+/):[],xi=e=>e.trimEnd().split(/\s+/).at(-1)??"";var go=" ",R={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Z.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},Xt=new Set,fo=()=>{for(let e of Xt)e()},xo=e=>(Xt.add(e),()=>Xt.delete(e)),re=e=>{let n=e(R),o=po(n.value),r=n.cursorPosition===n.value.length;R={...n,commandMeta:uo(o,r)},fo()},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,fo()},Yt=e=>{re(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},Qt=e=>{re(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}})},vo=()=>{re(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}})},Co=()=>{re(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=>{re(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}})},yo=()=>{re(e=>({...e,commandIsPending:!0}))},No=()=>{re(e=>({...e,commandHistory:[e.value,...e.commandHistory].slice(0,20),commandHistoryIndex:-1,commandIsPending:!1})),vi()},ho=()=>{re(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}})},Io=()=>{re(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},vi=()=>fe(()=>""),ie=()=>R,ct=()=>{let[e,...t]=R.value.split(go);return t.join(go).trim()};function Ci(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function yi(e,t,n){let 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 Eo(e,t){let n=ie();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 Yn(e,n.value);let o=Ci(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 yi(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 Ao}from"ulid";var Be=null,bo=()=>structuredClone(Be),mt=e=>Be=e,So=()=>{let{currentNode:e,selectedIndex:t}=f(),o=b(e.id)[t];return o?m("Resolved selected child",o):l("Target node not found")};function Zt(e){let t=So();if(v(t))return t;let{currentNode:n,nodes:o}=f();if(!n.parentNodeId)return l("Missing parent node id");let r=o[n.parentNodeId];if(!r)return l("Missing parent node");let i=P(r.id),s=i.findIndex(({id:c})=>c===n.id);if(s<0)return l("Current node not found among siblings");let a=i[s+e];if(!a)return l("Missing sibling node");if(mt({id:Ao(),userId:Y(),action:"move.node",payload:{id:t.data.id,parent:a.id,pos:{at:"end"}}}),!Be)return l("Could not materialize move state");let d=we(Be);return v(d)?d:m("Node moved successfully",d.data)}function en(e){let t=So();if(v(t))return t;let{currentNode:n,selectedIndex:o}=f(),i=P(n.id)[o+e];if(!i)return l("Missing sibling node");if(mt({id:Ao(),userId:Y(),action:"move.node",payload:{id:t.data.id,parent:n.id,pos:{at:e===1?"after":"before",sibling:i.id}}}),!Be)return l("Could not materialize move state");let s=we(Be);return v(s)?s:m("Node moved successfully",s.data)}var ut=[{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?l("No item selected"):(M({mode:u.MOVE}),m("Init movie succeeded",null))},{intent:"confirmMove",mode:u.MOVE,action:()=>{M({mode:u.DEFAULT});let e=bo();return e!==null&&U(e),mt(null),m("Pasting item",null)}}],pt=[{intent:"movePreviousItem",mode:u.MOVE,action:()=>en(-1)},{intent:"moveNextItem",mode:u.MOVE,action:()=>en(1)}],To=[{intent:"moveToNextContainer",mode:u.MOVE,action:()=>Zt(1)},{intent:"moveToPreviousContainer",mode:u.MOVE,action:()=>Zt(-1)}];var Mo={[T.WORKSPACE]:[...ut,...pt],[T.BOARD]:[...ut,...pt],[T.SWIMLANE]:[...ut,...pt,...To],[T.TICKET]:[],[T.FIELD]:[],[T.FIELD_LIST]:[],[T.TEXT]:[]};import{ulid as Di}from"ulid";import{spawnSync as Ti}from"node:child_process";import Mi from"node:os";import Do from"node:path";import{ulid as wi}from"ulid";import{accessSync as Ni,copyFileSync as hi,existsSync as gt,mkdirSync as wo,readdirSync as Lo,readFileSync as Ii,renameSync as Ei,rmSync as Ai,statSync as Po,unlinkSync as bi,writeFileSync as Si}from"node:fs";import Fe from"node:path";var $={writeToFile:(e,t)=>{try{let n=Fe.dirname(e);gt(n)||wo(n,{recursive:!0});let o=typeof t=="string"?t:JSON.stringify(t,null,2);Si(e,o,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return Ii(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)&&Po(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Ni(e),!0}catch{return!1}},mkDir:e=>wo(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=Fe.parse(t);for(;;){let o=Fe.join(t,e);try{if(gt(o)&&Po(o).isDirectory())return o}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=Fe.dirname(t)}return null},readFirstJSON(e){try{if(!$.dirExists(e))return null;let t=Lo(e).filter(o=>o.endsWith(".json")).sort()[0];if(!t)return null;let n=Fe.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)?Lo(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{bi(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Ai(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(Fe.dirname(t)),!n?.overwrite&&gt(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{Ei(e,t)}catch(o){if(o?.code==="EXDEV"){hi(e,t),this.rmFile(e);return}throw o}}};function Li(){let{preferredEditor:e}=ge(),t=[e,process.env.VISUAL,process.env.EDITOR,"vim","vi","nano"].filter(n=>!!n?.trim());return[...new Set(t)]}function Pi(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function Bo(e){let t=Do.join(Mi.tmpdir(),"epiq");$.mkDir(t);let n=Do.join(t,wi());$.writeToFile(n,e??"");let o=Li();for(let r of o){let i=Pi(r,n),s=Ti(i,{stdio:"inherit",shell:!0});if(!s.error&&s.status===0){let a=$.readFile(n);if(a==null)return l("Unable to read edited file");let d=a.replace(/\r?\n$/,"");return m("Successfully edited",d)}}return l("Unable to open editor")}var Ee=(e,t)=>{let n=e.find(o=>o.context===t);return n!==void 0?m("Found node",n):l("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:()=>Fo(1),navigateToPreviousItem:()=>Fo(-1),navigateToNextContainer:()=>ko(1),navigateToPreviousContainer:()=>ko(-1),navigate:({currentNode:e=f().currentNode,selectedIndex:t})=>{M({currentNodeId:e.id,selectedIndex:t})}},Fo=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})},ko=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),c=Math.max(0,d.length-1),g=Math.min(Math.max(0,o),c),p=d.length?g:-1;D.navigate({currentNode:a,selectedIndex:p})};var Ro=[{intent:"addItem",mode:u.DEFAULT,description:"[n] new...",action:()=>(M({mode:u.COMMAND_LINE}),fe(()=>`${y.NEW} `),m("Adding new item",null))},{intent:"Delete",mode:u.DEFAULT,description:"[d] delete",action:()=>(M({mode:u.COMMAND_LINE}),fe(()=>`${y.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=Ee(f().breadCrumb,"TICKET");if(v(e))return l("No issue node");let t=e.data,n=b(t.id).find(s=>s?.title==="Description");if(!n)return l("Description field not found");let o=n.props.value;if(typeof o!="string")return l("Description field is not a text field");let r=Bo(o);if(v(r))return l("Failed to edit description");let i=r.data;return i===o?m("No changes made",void 0):U({id:Di(),action:"edit.description",userId:Y(),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 Oo=e=>{let{context:t}=f()?.currentNode;if(!t)return L.None;switch(e){case y.DELETE:return L.Delete;case y.HELP:return L.ViewHelp;case y.RE_OPEN_ISSUE:return L.ReopenIssue;case y.CLOSE_ISSUE:return L.CloseIssue;case y.TAG:return L.TagTicket;case y.ASSIGN:return L.AssignUserToTicket;case y.RENAME:return L.Rename;case y.NEW:return L.NewItem;case y.FILTER:return L.Filter;case y.SET_USERNAME:return L.SetUserName;case y.SET_EDITOR:return L.SetEditor;case y.SET_VIEW:return L.SetView;default:return L.None}};import{ulid as O}from"ulid";import{monotonicFactory as Bi,ulid as ft}from"ulid";var xt=Bi(),Uo=({name:e,parent:t,userId:n})=>{let o=xt(),r=xt(),i=xt(),s=xt();return[{id:ft(),userId:n,action:"add.issue",payload:{id:o,parent:t,name:e}},{id:ft(),userId:n,action:"add.field",payload:{id:r,parent:o,name:"Description",val:""}},{id:ft(),userId:n,action:"add.field",payload:{id:i,parent:o,name:"Assignees"}},{id:ft(),userId:n,action:"add.field",payload:{id:s,parent:o,name:"Tags"}}]};import Fi from"node:os";import ki from"node:path";var Ri=".epiqrc",vt=()=>ki.join(Fi.homedir(),Ri),Oi=e=>{try{let t=JSON.parse(e);return m("Parsed config",t??{})}catch{return l("Invalid ~/.epiqrc JSON")}},tn=()=>{let e=vt(),t=$.readFile(e);return t==null||t.trim()===""?m("No config found, using empty config",{}):Oi(t)},nn=e=>{let t=vt();try{return $.writeToFile(t,JSON.stringify(e,null,2)+`
9
- `),m("Config written",null)}catch{return l("Unable to write ~/.epiqrc")}},on=e=>{let t=tn();if(v(t))return l("Failed to set preferred editor");let n={...t.data,...e};return nn(n)};var Ui=e=>Object.values(f().tags).find(t=>t.name===e),Wi=e=>Object.values(f().contributors).find(t=>t.name===e),X=()=>Y(),Wo=[{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:X(),action:"delete.node",payload:{id:n.id}}):l("Unable to resolve child to delete")},onSuccess:()=>M({mode:u.DEFAULT})},{intent:L.Filter,mode:u.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=ie().commandMeta,n=/(!=|=)/,[o,r]=e.split(n);if(!o||!(a=>k(y.FILTER).map(d=>d.split(n)[0]).includes(a))(o))return l("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 l("Unable to close issue, no target found");if(!n.parentNodeId)return l("No target parent found");if(!Ie(n))return l("Cannot close in this context");let o=U({id:O(),userId:X(),action:"close.issue",payload:{id:n.id,parent:n.parentNodeId}});return v(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 l("Unable to reopen issue, no target found");let o=n.context==="TICKET"?m("Resolved ticket",n):Te(n.id,"TICKET");if(v(o))return l("Cannot reopen in this context");let r=o.data,i=U({id:O(),userId:X(),action:"reopen.issue",payload:{id:r.id}});return v(i)?i:m("Issue reopened",null)},onSuccess:()=>M({mode:u.DEFAULT})},{intent:L.SetUserName,mode:u.COMMAND_LINE,action:()=>{let e=ct()?.trim();if(!e)return l("No username provided");let t=on({userName:e});return v(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=ct()?.trim();if(!e)return l("No editor provided");let t=on({preferredEditor:e});return v(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 l(`provide a name for your ${t.modifier}`);let n=o=>{let r=U(o);if(v(r))return r;let i=x.getNode(r.data.result.id);if(!i)return l("Created node not found");if(!i.parentNodeId)return r;let s=x.getNode(i.parentNodeId);return s?(D.navigate({currentNode:s,selectedIndex:x.getSiblings(i.parentNodeId).findIndex(({id:a})=>a===i.id)}),r):l("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:o}=f(),r=x.getNode(o);return r?n({id:O(),userId:X(),action:"add.board",payload:{id:O(),name:t.inputString,parent:r.id}}):l("Workspace not found")}if(t.modifier==="swimlane"){let o=Ee(f().breadCrumb,"BOARD");return v(o)?l("Unable to add swimlane in this context"):n({id:O(),userId:X(),action:"add.swimlane",payload:{id:O(),name:t.inputString,parent:o.data.id}})}if(t.modifier==="issue"){let o=Ee(f().breadCrumb,"SWIMLANE");if(v(o))return l("Unable to add issue in this context");let r=Uo({name:t.inputString,parent:o.data.id,userId:X()}),i=at(r);if(i.some(d=>v(d)))return l("Issue create failed: "+i.filter(v).map(d=>d.message).filter(Boolean).join(", "));let s=i[0];if(!s||v(s))return l("Issue creation failed");let a=r[0]?.payload.id;return a?(D.navigate({currentNode:o.data,selectedIndex:x.getSiblings(o.data.id).findIndex(({id:d})=>d===a)}),m("Issue created",null)):l("Unable to determine ticket id")}return Fn()},onSuccess:()=>M({mode:u.DEFAULT})},{intent:L.SetView,mode:u.COMMAND_LINE,action:()=>{let{commandMeta:e}=ie();return e.validity===Z.Invalid?l("Invalid command "+ee):(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 l("Missing node");let o=ct();return o?U({id:O(),userId:X(),action:"edit.title",payload:{id:n.id,name:o}}):l("Provide a new name")},onSuccess:()=>M({mode:u.DEFAULT})},{intent:L.TagTicket,mode:u.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=ie().commandMeta,n=e||t;if(!n)return l("Provide a tag");let{selectedIndex:o,currentNode:r}=f(),i=b(r.id)[o];if(!i)return l("Invalid tag target");let s=Te(i.id,"TICKET");if(v(s))return l("Unable to tag issue in this context");let a=s.data,d=Ui(n),c;if(d)c=d.id;else{let C=O(),h=U({id:O(),userId:X(),action:"create.tag",payload:{id:C,name:n}});if(v(h))return h;c=h.data.result.id}let g=x.getFieldByTitle(a.id,"Tags");return g?b(g.id).some(C=>C.props?.value===c)?l("Already tagged with that tag"):U({id:O(),userId:X(),action:"tag.issue",payload:{id:O(),target:a.id,tagId:c}}):l("Unable to locate tags field")},onSuccess:()=>M({mode:u.DEFAULT})},{intent:L.AssignUserToTicket,mode:u.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=ie().commandMeta,n=e||t;if(!n)return l("Provide an assignee");let{selectedIndex:o,currentNode:r}=f(),i=b(r.id)[o];if(!i)return l("Invalid assign target");let s=Te(i.id,"TICKET");if(v(s))return l("Unable to assign issue in this context");let a=s.data,d=Wi(n),c;if(d)c=d.id;else{let C=O(),h=U({id:O(),userId:X(),action:"create.contributor",payload:{id:C,name:n}});if(v(h))return h;c=h.data.result.id}let g=x.getFieldByTitle(a.id,"Assignees");return g?b(g.id).some(C=>C.props?.value===c)?l("Assignee already assigned"):U({id:O(),userId:X(),action:"assign.issue",payload:{id:O(),target:a.id,contributor:c}}):l("Unable to locate assignees field")},onSuccess:()=>M({mode:u.DEFAULT})}];var Ho=(...e)=>{let{commandMeta:{command:t,validity:n,modifier:o,inputString:r}}=ie();if(!t)return;let i=Oo(t);if(yo(),n===Z.Invalid)return;let s=Wo.find(d=>d.intent===i);if(!s)return Jt({result:ee.Fail,message:"Command not found",data:null});let a=s.action(s,{command:t,inputString:r,modifier:o});if(v(a))return Jt(a);No(),s?.onSuccess?.()};var _o=[{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)=>(Ho(...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:()=>(vo(),m("Erasing input",null))},{intent:"EraseInputWord",mode:u.COMMAND_LINE,action:()=>(Co(),m("Erasing input word",null))},{intent:"getLastCommandFromHistory",mode:u.COMMAND_LINE,action:()=>(ho(),m("Getting last command from history",null))},{intent:"getNextCommandFromHistory",mode:u.COMMAND_LINE,action:()=>(Io(),m("Getting next command from history",null))}];var Ko="Press : for command line",Vo="HJKL (navigate)",$o="Q (exit)",Hi="I (edit)",zo="E (enter)",_i="M (move)",jo="HJKL (move issue)",Ki="M (move confirm)",rn={[T.WORKSPACE]:[Vo],[T.BOARD]:[Ko],[T.BOARD+u.COMMAND_LINE]:[],[T.SWIMLANE]:[Ko,Vo,_i],[T.TICKET+u.HELP]:[$o],[T.SWIMLANE+u.HELP]:[$o],[T.TICKET]:[Hi,zo],[T.FIELD]:[],[T.SWIMLANE+u.MOVE]:[jo,Ki],[T.TICKET+u.MOVE]:[jo,zo]};var Ct=e=>e.trim().toLocaleLowerCase(),Vi=(e,t)=>{let n=x.getFieldByTitle(e,t);if(!n)return"";let o=n.props?.value;return typeof o=="string"?o:""},$i=e=>{let{tags:t}=f(),n=x.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):[]},zi=e=>{let{contributors:t}=f(),n=x.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):[]},Go=(e,t)=>{let n=t.value;if(!n)return!0;switch(t.target){case"title":return Ct(e.title??"").includes(n);case"description":return Ct(Vi(e.id,"Description")).includes(n);case"tag":return $i(e.id).map(Ct).some(a=>a.includes(n));case"assignee":return zi(e.id).map(Ct).some(a=>a.includes(n));default:return!0}};function qo(e,t,n){let o=t[e];if(!o)return l("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?l("buildBreadCrumb(): node is not connected to root"):(r.reverse(),m("Breadcrumb built",r))}var Xo=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 yt,sn=new Set,Jo=()=>{for(let e of sn)e()},Gi=e=>(sn.add(e),()=>sn.delete(e));function Yo(e){let{currentNodeId:t,mode:n,rootNodeId:o,nodes:r,filters:i}=e;if(!t)return l("derive(): currentNodeId is missing");if(!o)return l("derive(): rootNode is missing");if(!r[o])return l("derive(): unable to find root node");let a=r[t];if(!a)return logger.error("Unable to derive state, currentNode not found"),l("Unable to derive state, currentNode not found");let d=qo(t,r,o);if(v(d))return logger.error(d.message),d;let c=d.data,{context:g}=a,p=rn[g+n]??rn[g]??[],C=[...Ro,...Mo[g]??[],..._o],h=Xo(C);return m("Derived successfully",{...e,currentNode:a,breadCrumb:c,availableHints:p,availableActions:C,actionIndex:h,renderedChildrenIndex:qi(r,i)})}var f=()=>(yt||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),yt);function Hn(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=Yo(t);return v(n)?n:(yt=n.data,Jo(),m("State initialized",null))}function j(e){let t=f(),n=e(t),o=Yo(n);return v(o)?l(o.message??"Unable to update state"):(yt=o.data,Jo(),m("State updated",null))}var M=e=>j(t=>({...t,...e}));var W=()=>ji(Gi,f,f),qi=(e,t)=>{let n={};for(let o of Object.values(e))Ie(o)&&t.length>0&&!t.every(r=>Go(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 ht,Text as an}from"ink";import xe from"react";var Nt={black:"black",red:"red",green:"green",yellow:"yellow",blue:"blue",cyan:"cyan",magenta:"magenta",white:"white",gray:"gray",grey:"grey",blackBright:"blackBright",redBright:"redBright",greenBright:"greenBright",yellowBright:"yellowBright",blueBright:"blueBright",cyanBright:"cyanBright",magentaBright:"magentaBright",whiteBright:"whiteBright"};var N={accent:Nt.cyan,accent2:Nt.magenta,primary:Nt.white,secondary:Nt.gray};import{Text as Qo}from"ink";import Zo,{useEffect as Xi,useState as Ji}from"react";var _=({isSelected:e,placeholder:t=" "})=>{let n=["\u25B8 ","\u25B8 ","\u25B8 "],[o,r]=Ji(n.length-1);return Xi(()=>{if(!e)return;let i=setInterval(()=>{r(s=>(s+1)%n.length)},800);return()=>clearInterval(i)},[e]),e?Zo.createElement(Qo,{color:N.accent,dimColor:o===1},n[o]):Zo.createElement(Qo,null,t)};function dn(){let e=W(),t=e.nodes[e.rootNodeId],r=process.stdout.rows-1-3,i=process.stdout.columns||120,s=t?.id?b(t?.id):[];return xe.createElement(ht,{flexDirection:"column",height:r,padding:1,borderStyle:"round",borderColor:N.secondary,width:i},xe.createElement(ht,{padding:1,paddingTop:0,paddingBottom:0},xe.createElement(an,null,"Select a board:")),xe.createElement(ht,{padding:1,flexDirection:"column"},s.map((a,d)=>{let c=e.currentNode.context==="WORKSPACE"&&e.selectedIndex===d,p=b(a.id).flatMap(({id:C})=>P(C)).length;return xe.createElement(ht,{key:a.id??d},xe.createElement(an,{color:c?N.accent:N.secondary},xe.createElement(_,{isSelected:c})),xe.createElement(an,{color:c?N.accent:N.secondary},a.title," (",p," issues)",a.readonly?" \u{1F512}":""))})))}import{Box as Es}from"ink";import St from"react";import{Box as mn,Text as ds}from"ink";import Q from"react";import{Box as ln,Text as Yi}from"ink";import It from"react";var Et=({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)),c=Math.max(0,e.length-a),g=r?Math.min(c,Math.max(0,d-a+1)):Math.min(c,Math.floor(d/a)*a),p=g+a,C=e.slice(g,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(g/S*I):0;return It.createElement(ln,{flexDirection:"row",height:i,width:"100%"},It.createElement(ln,{flexDirection:"column",flexGrow:1,height:i},C),It.createElement(ln,{flexDirection:"column",width:1,height:A},Array.from({length:A}).map((_e,ue)=>It.createElement(Yi,{key:ue,color:h&&ue>=z&&ue<z+E?N.accent:N.secondary},h?"\u2502":" "))))};import{Box as At,Text as is}from"ink";import Ae from"react";import{Text as Qi}from"ink";import Zi from"react";var es=e=>e.toLowerCase().trim(),ts=(e,t=Le)=>{let n=es(e);return t[n]?t[n]:De(n)},ke=({id:e,isSelected:t})=>{let n=x.getContributor(e);if(n)return Zi.createElement(Qi,{underline:t,color:ts(n.name)},"@"+n.name)};import{Text as ns}from"ink";import os from"react";var rs=e=>e.toLowerCase().trim(),Ge=(e,t=Le)=>{let n=rs(e);return t[n]?t[n]:De(n)},Re=({id:e,isSelected:t})=>{let n=x.getTag(e);if(n)return os.createElement(ns,{underline:t,backgroundColor:Ge(n.name),color:N.primary}," "+n.name+" ")};var er=({width:e,ticket:t,isSelected:n})=>{let o=e-12,r=ot(rt(t.title),o),i=b(t.id),s=c=>{let g=i.find(p=>p.title===c);return g?b(g.id).map(p=>typeof p.props?.value=="string"?p.props.value:"").filter(p=>!!p):[]},a=s("Tags").map(c=>x.getTag(c)).filter(c=>!!c),d=s("Assignees").map(c=>x.getContributor(c)).filter(c=>!!c);return Ae.createElement(At,{borderStyle:"round",width:e-6,height:4,flexDirection:"column",borderColor:n?N.accent:N.secondary,justifyContent:"space-between"},Ae.createElement(At,{borderBottom:!0},Ae.createElement(At,{paddingLeft:1,flexDirection:"column"},Ae.createElement(is,{color:N.primary},r))),Ae.createElement(At,{flexDirection:"row",paddingLeft:1},a.map(c=>Ae.createElement(Re,{key:c.id,id:c.id})),d.map(c=>Ae.createElement(ke,{key:c.id,id:c.id}))))};import ss from"chalk";import{Box as qe,Text as cn}from"ink";import se from"react";var as=(e,t)=>e.length>=t?e.slice(0,t-3)+"...":e,tr=({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=>x.getTag(E)).filter(E=>!!E),d=s("Assignees").map(E=>x.getContributor(E)).filter(E=>!!E),c=1,g=a.length*(1+c),p=d.length*(2+c),C=a.map(E=>se.createElement(qe,{key:E.id,paddingRight:c},se.createElement(cn,{color:Ge(E.name)},"\u25A0"))),h=d.map(E=>se.createElement(qe,{key:E.id,paddingRight:c},se.createElement(cn,{color:De(E.name)},"@"+E.name.at(0)))),A=n?N.accent:r===u.MOVE?N.secondary:N.primary;return se.createElement(qe,{borderBottom:!0,justifyContent:"space-between"},se.createElement(qe,null,se.createElement(_,{isSelected:n,placeholder:ss.dim.gray(o+1+" ")}),se.createElement(cn,{color:A},as(t.title,e-g-p-15))),se.createElement(qe,null,C,h))};var ls=({swimlane:e,isSelected:t,width:n,height:o,isDense:r,isFocused:i,listSelectedIndex:s,mode:a})=>{let{renderedChildrenIndex:d}=W(),c=d[e.id]??[],g=`${e.title} (${c.length})`,p=3,C=r?1:4,h=o-p-(r?2:1),A=Q.createElement(mn,{borderStyle:"round",borderColor:N.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},Q.createElement(_,{isSelected:t}),Q.createElement(ds,{bold:!0,color:t?N.accent:N.primary},g," ",e.readonly?"\u{1F512}":"")),E=(I,S)=>{let z=i&&s===S;return r?Q.createElement(tr,{key:I.id,index:S,width:n,ticket:I,isSelected:z,mode:a}):Q.createElement(er,{key:I.id,width:n,ticket:I,isSelected:z})};return Q.createElement(mn,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?N.accent:N.secondary,paddingRight:1,paddingLeft:1,height:o},A,Q.createElement(mn,{padding:r?1:0},c.length>0&&Q.createElement(Et,{selectedIndex:s,height:h,itemHeight:C},c.map(E)),Q.createElement(_,{isSelected:i&&s===-1})))},nr=Q.memo(ls);import{Box as gn,Text as hs}from"ink";import ve,{useEffect as fn,useMemo as cr}from"react";import Oe from"chalk";import{decodeTime as cs}from"ulid";import rr from"string-width";var or=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 ms=(e,t)=>e+" ".repeat(Math.max(0,t-rr(e))),us=(e,t)=>" ".repeat(Math.max(0,t-rr(e)))+e,ps=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)})(),gs=e=>{switch(e.action){case"move.node":{let t=x.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(Ge(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""}},fs=e=>{let t=or(cs(e));return Oe.gray(us(t,8))},xs=12,vs=e=>Oe.dim(ms(`${e}`,xs)),ir=e=>{let t=fs(e.id),n=vs(e.userId),o=ps(e.action),r=gs(e),i=Oe.dim("\u203A"),s=[o,r].filter(Boolean).join(" ");return`${n} ${t} ${i} ${s}`};import{Box as bt,Text as Cs}from"ink";import ae from"react";var sr=({selectedIndex:e,parent:t,selected:n})=>{let{currentNode:o}=W(),{title:r}=t,i=b(t.id).map(s=>{let a=typeof s.props?.value=="string"?s.props.value:"";if(r==="Assignees")return x.getContributor(a)?.id;if(r==="Tags")return x.getTag(a)?.id}).filter(s=>!!s);return ae.createElement(bt,{alignItems:"center",paddingTop:1},ae.createElement(bt,{minWidth:12},ae.createElement(_,{isSelected:n}),ae.createElement(Cs,{color:n?N.accent:N.secondary},r,":")),ae.createElement(bt,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((s,a)=>{let d=o.id===t.id&&a===e;return ae.createElement(bt,{key:`${r}-${s}`,paddingRight:2,minHeight:1},ae.createElement(_,{isSelected:d}),r==="Assignees"?ae.createElement(ke,{isSelected:d,id:s}):r==="Tags"?ae.createElement(Re,{isSelected:d,id:s}):null)})))};import ar from"chalk";import{Box as un,Text as dr}from"ink";import{marked as lr}from"marked";import ys from"marked-terminal";import be,{useEffect as Ns}from"react";var pn=({id:e,text:t,height:n,selected:o,maxWidth:r})=>{let{selectedIndex:i,currentNode:s}=W();lr.setOptions({renderer:new ys});let a=p=>String(lr.parseInline(p)).replace(/\r?\n/g,""),d=typeof t=="string"?t.split(/\r?\n|\u2028|\u2029/):[];Ns(()=>{let p=[];return d.forEach((C,h)=>{let A=H.text(`${h}`,`Line ${h+1}`,e,{value:C}),E=x.createNodeAtPosition(A);pe(E)&&p.push(E.data.id)}),()=>p.forEach(x.deleteNode)},[e,t]);let c="\u2029",g=d.map((p,C)=>be.createElement(dr,{key:`${e}-${C}`},(s.id===e&&i===C?ar.cyan(`\u25B8 ${Array.from({length:String(C).length}).map(()=>" ").join("")}`):ar.dim.gray(`${C+1} `))+a(p.length?ot(p,r-10):c)));return be.createElement(un,{flexDirection:"column",paddingTop:1},be.createElement(un,null,be.createElement(_,{isSelected:o}),be.createElement(dr,{color:o?N.accent:N.secondary},"Inline Editor (press e to edit)")),be.createElement(un,{flexDirection:"row",borderStyle:"round",borderColor:N.secondary,paddingLeft:1,paddingRight:1,marginLeft:1},be.createElement(Et,{scrollByOne:!0,children:g,height:n-2,selectedIndex:i,itemHeight:1})))};var Is=e=>`${e}::log`,mr=({ticket:e,height:t})=>{let{selectedIndex:n,currentNode:o}=W(),r=process.stdout.columns||120,i=cr(()=>Is(e.id),[e.id]),s=cr(()=>[...e.log].reverse().map(ir).join(`
10
- `),[e.log]);fn(()=>{if(x.getNode(i))return;let S={...H.field(i,"Log",e.id,{value:s}),readonly:!0,childRenderAxis:"vertical"};return x.createNodeAtPosition(S),()=>{x.deleteNode(i)}},[i,e.id]),fn(()=>{let I=x.getNode(i);I&&I.props.value!==s&&x.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;fn(()=>{d&&(n>=0||D.navigate({selectedIndex:0}))},[d,n]);let c=b(e.id);if(d){let I=x.getNode(i),z=t-3;return ve.createElement(gn,{width:r,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},I?ve.createElement(pn,{id:I.id,text:I.props.value??"",selected:!1,maxWidth:r,height:z}):null)}let g=c.reduce((I,S)=>S.title==="Assignees"||S.title==="Tags"||S.id===i?I+1:I,0),p=2,C=g*2,A=t-3-C-p,E=(I,S)=>I.title==="Assignees"||I.title==="Tags"?ve.createElement(sr,{key:I.id,parent:I,selected:S,selectedIndex:n}):I.id===i?ve.createElement(gn,{key:I.id,paddingTop:1},ve.createElement(_,{isSelected:S}),ve.createElement(hs,{backgroundColor:N.secondary,color:S?N.accent:N.secondary}," History \u203A\u203A ")):ve.createElement(pn,{key:I.id,id:I.id,text:I.props.value??"",selected:S,maxWidth:r,height:A});return ve.createElement(gn,{width:r,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},c.map((I,S)=>E(I,a&&n===S)))};var As=({swimlanes:e,currentNode:t,selectedIndex:n,breadCrumb:o,mode:r,viewMode:i,height:s,width:a})=>{let d=t.context,c=d===T.TICKET||d===T.FIELD_LIST||d===T.FIELD,g=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 St.createElement(Es,{flexDirection:"row",height:s},g&&e.map((I,S)=>{let z=t.id===I.id,_e=z?n:-1,ue=t.context===T.BOARD&&n===S;return St.createElement(nr,{key:I.id,height:s,width:A,swimlane:I,isSelected:ue,isDense:E,isFocused:z,listSelectedIndex:_e,mode:r})}),c&&p&&St.createElement(mr,{height:s,ticket:p}))},ur=St.memo(As);var Ts=({currentNode:e,selectedIndex:t,breadCrumb:n,mode:o,viewMode:r,height:i,width:s})=>{let{renderedChildrenIndex:a}=W(),d=n.find(({context:C})=>C==="BOARD"),p=i-1-3;return Xe.createElement(bs,{flexDirection:"row"},e.context==="WORKSPACE"?Xe.createElement(dn,null):d?Xe.createElement(ur,{height:p,width:s,swimlanes:(a[d.id]??[]).filter(C=>C!==void 0&&Bn(C)),currentNode:e,selectedIndex:t,breadCrumb:n,viewMode:r,mode:o}):Xe.createElement(Ss,null))},pr=Xe.memo(Ts);import{Box as Cn,Text as yr}from"ink";import Ue from"react";import vn from"chalk";import{Box as xn,Text as gr}from"ink";import Je,{useEffect as Ms,useMemo as ws,useState as Ls}from"react";var fr=vn.gray,Ps=vn.inverse,Ds=vn.inverse.gray,Bs={hint:"",hints:[],overlap:0,remainder:""},vr=({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}},Fs=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let o=vr({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}},xr=()=>({value:R.value,cursorPosition:R.cursorPosition,commandIsPending:R.commandIsPending,autoCompletion:R.commandMeta.autoCompletion??Bs,infoMessage:R.commandMeta.infoMessage,validationStatus:R.commandMeta.validity,command:R.commandMeta.command,inputString:R.commandMeta.inputString,modifier:R.commandMeta.modifier}),ks=(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,Cr=({width:e})=>{let[t,n]=Ls(xr());Ms(()=>{let p=()=>{let h=xr();n(A=>ks(A,h)?A:h)},C=xo(p);return p(),()=>{C()}},[]);let{value:o,cursorPosition:r,infoMessage:i,commandIsPending:s,autoCompletion:a,command:d,modifier:c}=t,g=ws(()=>{let p=Math.max(0,Math.min(r,o.length)),C=vr({value:o,command:d}),h=Fs({value:o,command:d,modifier:c}),A=d?jt(d):null,E=c?jt(c):null,I=(K,V)=>{let Rt=C&&V>=C.start&&V<C.end,Ot=h&&V>=h.start&&V<h.end;return Rt&&A?A.fg(K):Ot&&E?E.bg(K):K},S=(K,V)=>{let Rt=C&&V>=C.start&&V<C.end,Ot=h&&V>=h.start&&V<h.end;return Rt&&A?A.fgCursor(K):Ot&&E?E.bgCursor(K):Ps(K)},z=o.slice(0,p),_e=o[p]??" ",ue=p<o.length?o.slice(p+1):"",Dr=Array.from(z).map((K,V)=>I(K,V)).join(""),Tn=S(_e,p),Mn=Array.from(ue).map((K,V)=>I(K,p+1+V)).join("");if(a.hint){let K=a.hint[a.overlap]??_e;Tn=Ds(K),Mn=fr(a.remainder.slice(1)+ue)}return fr(":")+Dr+Tn+Mn},[o,r,a,d,c]);return Je.createElement(xn,{flexDirection:"column",justifyContent:"flex-start"},Je.createElement(xn,{flexDirection:"column",paddingX:1,borderColor:N.secondary,borderStyle:"round",width:e},Je.createElement(xn,null,Je.createElement(gr,null,g),i&&Je.createElement(gr,{color:s?"red":N.secondary},` ${i} `))))};var yn=({width:e,mode:t,availableHints:n})=>Ue.createElement(Cn,null,t===u.COMMAND_LINE?Ue.createElement(Cr,{width:e}):Ue.createElement(Cn,{flexDirection:"column",paddingX:1,borderColor:N.secondary,borderStyle:"round",width:e},Ue.createElement(Cn,{flexDirection:"row"},n.map((o,r)=>Ue.createElement(yr,{key:o,color:N.secondary},(r?" | ":"")+o)),Ue.createElement(yr,null," "))));import{Box as We,Text as Nr}from"ink";import Ce from"react";var hr=({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"]),Ce.createElement(We,{flexDirection:"column",marginTop:3,borderColor:N.secondary,borderStyle:"round",width:e,minHeight:19},Ce.createElement(We,{flexDirection:"column",width:e},f().mode===u.HELP?t.map(([n,o],r)=>Ce.createElement(We,{paddingLeft:1,key:r,flexDirection:"row"},Ce.createElement(We,{key:r,flexDirection:"row",paddingBottom:r?0:1},Ce.createElement(We,{width:20,justifyContent:"flex-end"},Ce.createElement(Nr,{color:r?N.accent:N.secondary},n)),Ce.createElement(We,{flexGrow:1,width:40,paddingLeft:2},Ce.createElement(Nr,{color:r?N.primary:N.secondary},o))))):null))};import{Box as He,Text as ye}from"ink";import B from"react";var Tt=({isDone:e,command:t,value:n})=>B.createElement(He,null,B.createElement(ye,{color:N.accent,dimColor:e},e?" \u2714 ":" "),B.createElement(ye,{dimColor:e},"Enter command "),B.createElement(ye,{backgroundColor:N.secondary,dimColor:e}," "+t+" "),n&&B.createElement(B.Fragment,null,B.createElement(ye,{dimColor:e}," "),B.createElement(ye,{color:N.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 B.createElement(He,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:N.secondary,rowGap:1},B.createElement(ye,{color:N.accent,bold:!0},"Welcome! \u{1F680}"),!s&&B.createElement(ye,{dimColor:!0},a===":set:username"?"First, choose your username.":"Nice. One more step."),B.createElement(He,{flexDirection:"column"},n&&B.createElement(He,{marginBottom:1},B.createElement(Tt,{isDone:!0,command:":set:username",value:r})),!n&&B.createElement(Tt,{isDone:!1,command:":set:username"}),n&&!o&&B.createElement(Tt,{isDone:!1,command:":set:editor"}),s&&B.createElement(He,null,B.createElement(Tt,{isDone:!0,command:":set:editor",value:i}))),B.createElement(He,{marginTop:1,flexDirection:"column"},s&&B.createElement(ye,{color:"green"},"You are ready to go.")))}import br from"chalk";import{Box as In,Text as Tr}from"ink";import le from"react";import{Box as Mt,Text as hn}from"ink";import de from"react";var Ir=()=>{let{breadCrumb:e,currentNode:t,selectedIndex:n,viewMode:o}=f(),r=P(t.id)[n],i=Te(r?.id??t.id,"TICKET"),s=pe(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):[]},c=d("Tags"),g=d("Assignees"),p=s?.parentNodeId?!_t(t.id,s?.parentNodeId)&&o==="dense":!1;return de.createElement(Mt,null,e.map((C,h)=>{let A=h===e.length-1,E=P(C.id),I=A?E?.[n]?.title:void 0;return de.createElement(Mt,{key:`${C.id}-${h}`},de.createElement(hn,{color:N.secondary},h?" / ":""),de.createElement(hn,{color:N.secondary},C.title??""),I?de.createElement(hn,{color:N.primary},` \u25B8 ${I}`):null,p&&A?c.map(S=>de.createElement(Mt,{key:S,paddingLeft:2},de.createElement(Re,{id:S}))):null,p&&A?g.map(S=>de.createElement(Mt,{key:S,paddingLeft:2},de.createElement(ke,{id:S}))):null)}))};import{Box as Rs,Text as Er}from"ink";import wt from"react";var Os=({filters:e})=>wt.createElement(Rs,{columnGap:1},wt.createElement(Er,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:o})=>wt.createElement(Er,{backgroundColor:"black",color:"white"},` ${n}${o}"${t}" `))),Ar=wt.memo(Os);function En({filters:e,hideBreadCrumb:t=!1}){let{userName:n,preferredEditor:o}=ge();return le.createElement(In,{justifyContent:"space-between",flexDirection:"row"},t?le.createElement(Tr,null," "):le.createElement(In,{paddingLeft:1},e.length>0?le.createElement(Ar,{filters:e}):le.createElement(Ir,null)),le.createElement(In,{columnGap:1,paddingRight:2},le.createElement(Sr,{icon:"@",value:n}),le.createElement(Sr,{icon:"\u276F",value:o})))}function Sr({icon:e,value:t}){return le.createElement(Tr,null,br.dim(e)+br.magenta(` ${t??"-"} `))}function Ye({width:e,height:t}){let n=W(),o=ge(),r=!!o.userName?.trim(),i=!!o.preferredEditor?.trim(),s=r&&i,a=W().filters,d=!o.userName||!o.preferredEditor;if(!s)return J.createElement(Lt,{flexDirection:"column"},J.createElement(Lt,{flexDirection:"column"},J.createElement(En,{hideBreadCrumb:d,filters:a}),J.createElement(Nn,{height:t,width:e,hasUserName:r,hasPreferredEditor:i,userName:o.userName??"",preferredEditor:o.preferredEditor??""})),J.createElement(yn,{width:e,mode:n.mode,availableHints:n.availableHints}));let c=Ee(f().breadCrumb??[],"BOARD");if(pe(c)){let g=c.data.id,p=b(g).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 J.createElement(Lt,{flexDirection:"column"},n.mode!==u.HELP&&J.createElement(Lt,{flexDirection:"column"},J.createElement(En,{filters:a}),J.createElement(pr,{width:e,height:t,currentNode:n.currentNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:n.viewMode,mode:n.mode})),n.mode===u.HELP&&J.createElement(hr,{width:e}),n.mode!==u.HELP&&J.createElement(yn,{width:e,mode:n.mode,availableHints:n.availableHints}))}import{Box as Ne,Text as G}from"ink";import F,{useEffect as Us,useMemo as An,useState as Ws}from"react";var Hs=["\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 "],bn=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Pt=["Sourcing","Materializing"];function _s(e,t,n){return Math.min(n,Math.max(t,e))}function Ks(e,t){return F.createElement(G,null,F.createElement(G,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(0,14)),F.createElement(G,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(14)))}function Vs(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]=Ws(0);Us(()=>{let g=Date.now(),p=setInterval(()=>{let C=Date.now()-g;if(C>=n){r(n),clearInterval(p);return}r(C)},33);return()=>clearInterval(p)},[n]);let i=_s(o/n,0,1),s=i>=1,a=An(()=>{if(s)return"\u2714";let g=bn.length*4,p=Math.floor(i*g)%bn.length;return bn[p]},[i,s]),d=An(()=>s?Pt.length-1:Math.min(Pt.length-1,Math.floor(i*Pt.length)),[i,s]),c=An(()=>Vs(i,28),[i]);return F.createElement(Ne,{flexDirection:"column",alignItems:"center",justifyContent:"center",paddingX:4,paddingY:1},F.createElement(Ne,{flexDirection:"column",borderStyle:"round",borderColor:s?"green":"cyan",paddingX:4,paddingY:1,minWidth:42},F.createElement(Ne,{flexDirection:"column",marginBottom:1},Hs.map((g,p)=>F.createElement(Ne,{key:p,justifyContent:"center"},Ks(g,p)))),F.createElement(Ne,{flexDirection:"column",alignItems:"center",marginBottom:1},F.createElement(G,{color:"greenBright",bold:!0},"EPIQ CLI")),F.createElement(Ne,{justifyContent:"center",marginBottom:1},F.createElement(G,{color:"gray"},t)),F.createElement(Ne,{justifyContent:"center",marginBottom:1},F.createElement(G,{color:"cyan"},c.slice(0,10)),F.createElement(G,{color:"blue"},c.slice(10,18)),F.createElement(G,{color:"magenta"},c.slice(18))),F.createElement(Ne,{justifyContent:"center"},F.createElement(G,{color:s?"greenBright":"yellow",bold:!0},a),F.createElement(G,null," "),F.createElement(G,{color:"white"},Pt[d]),F.createElement(G,{color:"gray"},s?" complete":"..."))))}import $s from"readline";var Bt,zs=()=>async function(t,n){if(n.ctrl&&n.name==="c")return D.exit();let{actionIndex:o,mode:r}=f(),i=Eo(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 Mr(){Bt&&process.stdin.removeListener("keypress",Bt),Bt=zs(),$s.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("keypress",Bt)}import Sn from"chalk";import{monotonicFactory as js,ulid as ce}from"ulid";var me="system";function Gs(){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 qs(){let e=Gs(),t=f().renderedChildrenIndex?.[e.id]??[];D.navigate({currentNode:e,selectedIndex:t.length>0?0:-1})}var Qe=js();function Xs(){let e=Qe(),t=Qe(),n=Qe(),o=Qe(),r=Qe();return[{id:ce(),userId:me,action:"init.workspace",payload:{id:e,name:"Workspace"}},{id:ce(),userId:me,action:"add.board",payload:{id:t,name:"Default",parent:e}},{id:ce(),userId:me,action:"add.swimlane",payload:{id:n,name:"Todo",parent:t}},{id:ce(),userId:me,action:"add.swimlane",payload:{id:o,name:"Review",parent:t}},{id:ce(),userId:me,action:"add.swimlane",payload:{id:r,name:"Done",parent:t}},{id:ce(),userId:me,action:"add.board",payload:{id:it,name:"Closed",parent:e}},{id:ce(),userId:me,action:"add.swimlane",payload:{id:Me,name:"Closed",parent:it}},{id:ce(),userId:me,action:"lock.node",payload:{id:it}},{id:ce(),userId:me,action:"lock.node",payload:{id:Me}}]}function wr(e){let n=(e.length===0?at(Xs()):Wn(e)).filter(v);if(n.length>0)throw new Error([Sn.bold.red("Materializing failed"),"",...n.map((o,r)=>`${Sn.dim.gray(`${r+1}.`)} ${Sn.dim(o.message)}`),`
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)}`),`
11
11
  `].join(`
12
- `));qs()}var Lr=()=>{let e=vt();if(!($.readFile(e)!==null)){let i=nn({});if(v(i))throw new Error("Unable to create ~/.epiqrc")}let n=tn();if(v(n))throw new Error("Unable to load settings");let{preferredEditor:o,userName:r}=n.data;ze({preferredEditor:o,userName:r})};Js(`
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(`
13
13
  View board in directory:
14
14
  $ epiq
15
15
 
16
16
  Init project in directory:
17
17
  $ epiq --init "Project Name"
18
- `,{importMeta:import.meta,flags:{init:{type:"string"}}});var Ft=process.stdout.columns||120,kt=process.stdout.rows||20,Ys=5e3,Qs=0,he=null;function Zs(e){return new Promise(t=>setTimeout(t,e))}function ea(){if(!he){he=Pr(Ze.createElement(Ye,{width:Ft,height:kt}));return}he.rerender(Ze.createElement(Ye,{width:Ft,height:kt}))}function ta(){if(!he){he=Pr(Ze.createElement(Dt,{durationMs:2e3}));return}he.rerender(Ze.createElement(Dt,{durationMs:2e3}))}async function na(){Lr();let e=$n(),n=e.length===0?Ys:Qs;n>0&&ta();let o=Date.now();wr(e);let r=Date.now()-o,i=Math.max(0,n-r);i>0&&await Zs(i),ea(),Mr()}process.stdout.on("resize",()=>{Ft=process.stdout.columns||120,kt=process.stdout.rows||20,he&&he.rerender(Ze.createElement(Ye,{width:Ft,height:kt}))});(async()=>(console.clear(),await na()))();
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()))();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "epiq",
3
- "version": "0.1.9",
3
+ "version": "0.2.1",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "description": "EPIQ - CLI based issue tracker",
package/readme.md CHANGED
@@ -1,30 +1,38 @@
1
- # epiq
1
+ # Epiq
2
2
 
3
- > **The ultimate productivity tool** — a CLI-based issue tracking client powered by Git as its backend, living directly inside the repository you work in.
4
- > No external services. No context switching. Just tickets - versioned and colocated with your code.
3
+ **CLI-native issue tracker** powered by Git.
5
4
 
6
- ---
5
+ ```
6
+ '███████╗██████╗ ██╗ ██████╗ '
7
+ '██╔════╝██╔══██╗██║██╔═══██╗'
8
+ '█████╗ ██████╔╝██║██║ ██║'
9
+ '██╔══╝ ██╔═══╝ ██║██║▄▄ ██║'
10
+ '███████╗██║ ██║╚██████╔╝'
11
+ '╚══════╝╚═╝ ╚═╝ ╚═══▀▀╝ '
12
+ 🫡 Never leave your editor!
13
+ ```
7
14
 
8
15
  ## Why epiq?
9
16
 
10
- - **Simplicity** Skip the additional tooling complexity
11
- - **Repo-native** — Lives inside your project directory
12
- - **Offline-ready** — Works wherever Git works
13
- - **Team-friendly** — Collaborate through normal Git workflows
14
- - **Shareable** — ASCII board exported to `.md`, viewable in the CLI, on GitHub/GitLab, or as your project README.
15
- - **CLI-first** — Fast, scriptable, and developer/agent-friendly
17
+ Never leave your favorite editor!
18
+
19
+ - **Zero setup** — no dashboards, no setup overhead
20
+ - **Repo-native** — your issues live where your code lives
21
+ - **Offline-first** — works anywhere Git works
22
+ - **Portable** — your entire project state travels with the repo
23
+ - **CLI-first** — fast, scriptable, and automation-friendly
16
24
 
17
25
  ---
18
26
 
19
- ## 📦 Installation
27
+ ## Installation
20
28
 
21
- Install globally using npm:
29
+ Install globally via npm:
22
30
 
23
31
  ```bash
24
32
  npm install --global epiq
25
33
  ```
26
34
 
27
- Verify installation:
35
+ Verify:
28
36
 
29
37
  ```bash
30
38
  epiq --version
@@ -32,43 +40,43 @@ epiq --version
32
40
 
33
41
  ---
34
42
 
35
- ## 🚀 Getting Started
43
+ ## Getting Started
36
44
 
37
- ### Initialize a project
45
+ Starting the application will launch a wizard that sets you up in 20 seconds.
46
+ It will result in settings persisted at `~/.epicrc`
38
47
 
39
- Create a new epiq workspace inside your current directory:
48
+ In any folder, run:
40
49
 
41
50
  ```bash
42
- epiq --init "Project Name"
51
+ epiq
43
52
  ```
44
53
 
45
- This sets up epiq in your repository and prepares it for issue tracking.
54
+ This opens the interactive CLI workspace.
46
55
 
47
56
  ---
48
57
 
49
- ### Open the workspace
58
+ ## Philosophy
50
59
 
51
- Run epiq inside any initialized repository:
60
+ What epiq brings:
52
61
 
53
- ```bash
54
- epiq
55
- ```
56
-
57
- This opens the interactive CLI workspace.
62
+ - **Speed** — event sourcing to the file system keeps operations fast
63
+ - **Editor-level productivity** — stay in the environment you already use
64
+ - **Repo-native issues** — tickets live alongside your code
65
+ - **Built-in versioning** — Git is the backend
66
+ - **Seamless collaboration** leverage Git’s distributed workflow
67
+ - **Fully distributed** — no central configuration or registration required
58
68
 
59
69
  ---
60
70
 
61
- ## 🛠 Philosophy
62
-
63
- epiq keeps issue tracking:
64
-
65
- - Close to your code
66
- - Versioned with your commits
67
- - Simple and transparent
68
- - Independent from external platforms
71
+ ## Features
69
72
 
70
- If you use Git, you already have everything you need.
73
+ - Issue tracking — lightweight, structured tickets
74
+ - Event log — full history of every change
75
+ - Filtering — query issues by tags, assignees, and more
76
+ - Navigation-first UI — fast keyboard-driven workflow
77
+ - Markdown descriptions — shareable, human-readable boards
78
+ - Extensible command system — built with automation in mind
71
79
 
72
80
  ---
73
81
 
74
- Built for developers who live in the terminal.
82
+ ## What it looks like