epiq 0.2.11 → 0.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import{render as Cd}from"ink";import hd from"meow";import di from"react";import od from"chalk";import{Box as ce,Text as Pe}from"ink";import P from"react";import tt from"chalk";import{monotonicFactory as ta,ulid as he}from"ulid";import{useSyncExternalStore as Qs}from"react";var L={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function ke(e){return e.context==="TICKET"}var Qn=e=>e.context==="SWIMLANE";var g={INIT:"init",HELP:"help",NEW:"new",TAG:"tag",FILTER:"filter",MOVE:"move",ASSIGN:"assign",DELETE:"delete",RENAME:"rename",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",SET_DESCRIPTION:"edit",SET_EDITOR:"set:editor",SET_VIEW:"set:view",SET_USERNAME:"set:username",SYNC:"sync",NONE:""},xe={None:"none",Invalid:"invalid",Valid:"valid"},ye={None:"none",Success:"success",Fail:"fail"},s=e=>({result:ye.Fail,message:e,data:null}),c=(e,t)=>({result:ye.Success,message:e,data:t}),Zn=()=>({result:ye.None,message:"No result",data:null}),l=e=>e.result==="fail",Ve=e=>e.result==="success";var p={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};function ht(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var Nt=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",er=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var tr=e=>{let t=new Map;for(let n of e)for(let r=1;r<=n.length;r++){let o=n.slice(0,r),i=t.get(o);i?i.push(n):t.set(o,[n])}return t},nr=(e,t)=>t?e.get(t)??[]:[];var rr=new WeakMap,pi=e=>{let t=rr.get(e);return t||(t=tr(e),rr.set(e,t)),t};var or=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return nr(pi(e),r).filter(i=>ht(r,i)>=n)};var ir=({inputToMatch:e,lastWord:t},n)=>{if(t.endsWith(" "))return{hint:"",hints:[],overlap:0,remainder:""};let r=or({wordList:n,inputToMatch:e,overlapThreshold:1});return gi(t,r)},gi=(e,t)=>{let n=t[0]??"",r=ht(e.toLowerCase(),n.toLowerCase()),o=n?n+" ":"",i=o.slice(r);return{hint:o,hints:t,overlap:r,remainder:i}};var sr=["vi","vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var Ke=24n,fi=Ke*4n,Et=(1n<<fi)-1n,xi=/^[0-9a-f]+$/;function ar(e){if(!e||!xi.test(e))throw new Error(`Invalid hex rank: ${e}`);return BigInt("0x"+e)}function It(e,t=Ke){if(e<0n)throw new Error("Negative rank not allowed");return e.toString(16).padStart(Number(t),"0")}function at(e,t){if(!e&&!t)return It(Et/2n,Ke);let n=e?ar(e):0n,r=t?ar(t):Et;if(r<=n)return It(Et/2n,Ke);let o=(n+r)/2n;return o===n||o===r?"":It(o,Ke)}function se(){return It(Et/2n,Ke)}var Y={workspace:(e,t)=>({id:e,title:t,rank:se(),isDeleted:!1,props:{},context:L.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r=!1)=>({id:e,title:t,rank:se(),isDeleted:!1,props:{},context:L.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:r,log:[]}),swimlane:(e,t,n)=>({id:e,title:t,rank:se(),isDeleted:!1,props:{},context:L.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:(e,t,n,r={},o="horizontal")=>({id:e,title:t,rank:se(),isDeleted:!1,props:r,context:L.FIELD,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[]}),ticket:(e,t,n)=>({id:e,title:t,rank:se(),isDeleted:!1,props:{},context:L.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,props:r={},readonly:o=!0})=>({id:e,title:t,rank:se(),isDeleted:!1,props:r,context:L.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:o,log:[]})};var O=e=>Object.values(C().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),dr=(e,t)=>e.findIndex(n=>n.id===t),sn=(e,t={at:"end"})=>{if(e.length===0)return c("Resolved rank",se());switch(t.at){case"start":{let n=e[0];return n?c("Resolved rank",at(void 0,n.rank)):s("Unable to resolve first sibling")}case"end":{let n=e[e.length-1];return n?c("Resolved rank",at(n.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let n=dr(e,t.sibling);if(n<0)return s("Sibling not found");let r=n>0?e[n-1]:void 0,o=e[n];return o?c("Resolved rank",at(r?.rank,o.rank)):s("Sibling not found")}case"after":{let n=dr(e,t.sibling);if(n<0)return s("Sibling not found");let r=e[n],o=n<e.length-1?e[n+1]:void 0;return r?c("Resolved rank",at(r.rank,o?.rank)):s("Sibling not found")}}};var je=(e,t)=>{let{nodes:n}=C(),r=n[e];if(!r)return s("Node not found");if(r.context===t)return c("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return c("Resolved ancestor node",o);o=o.parentNodeId?n[o.parentNodeId]:void 0}return s(`No ancestor found for context: ${t}`)},dn=(e,t)=>{let{nodes:n}=C(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},an=(e,t)=>e?e.readonly?s({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node"}[t]):null:s("Node not found"),h={deleteNode(e){re(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},editValue(e,t){let{nodes:n}=C(),r=n[e];if(!r)return s("Edit target node not found");let o=an(r,"edit");if(o)return o;let i={...r,props:{...r.props,value:t}};return h.updateNode(i),c("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return s("Rename target node not found");let r=an(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),c("Renamed node",o)},getExistingTags(){let{tags:e}=C();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=C();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return O(e).find(n=>n.title===t)},moveNode({id:e,parentId:t,position:n={at:"end"},navigate:r=!0}){let{rootNodeId:o}=C(),i=this.getNode(e),a=this.getNode(t);if(!i)return s("Node not found");if(!a)return s("Target parent not found");if(o===e)return s("Cannot move root node");if(e===t)return s("Cannot move node into itself");let d=an(i,"move");if(d)return d;if(dn(t,e))return s("Cannot move node into its own descendant");let m=O(t).filter(y=>y.id!==e),u=sn(m,n);if(l(u))return u;let f={...i,parentNodeId:t,rank:u.data};return r?this.updateNodeAndSelectInParent(f):this.updateNode(f),c("Moved node successfully",f)},tombstoneNode(e){let{nodes:t,currentNodeId:n,rootNodeId:r}=C(),o=this.getNode(e);if(!o)return s("Node not found");if(r===e)return s("Cannot delete root node");let i=new Set,a=u=>{let f=t[u];if(!(!f||i.has(u))){i.add(u);for(let y of O(f.id))a(y.id)}};a(e);let d={...structuredClone(t)};for(let u of i){if(!d[u])return s("Unable to locate node to delete");d[u]={...d[u],isDeleted:!0}}if(!n)return s("Unable to delete undefined");let m=i.has(n)?o.parentNodeId??r:n;return A({nodes:d}),F.navigate({currentNode:d[m],selectedIndex:0}),c("Successfully tomb stoned",o)},createContributor(e){let t=re(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return l(t)?s("Unable to create contributor"):c("Created contributor",e)},assign(e,t,n){let r=h.getContributor(t),o=h.getNode(e);if(!o||!r)return s("Unable assign contributor to issue");let i=this.getFieldByTitle(o.id,"Assignees");if(!i)return s("Unable to locate assignees field");if(O(i.id).some(m=>m.props?.value===t))return s("Contributor already assigned");let d=this.createNodeAtPosition(Y.field(n,r.name,i.id,{value:t}));return l(d)?d:c("Assigned contributor",d.data)},createTag(e){let t=re(n=>({...n,tags:{...n.tags,[e.id]:e}}));return l(t)?s("Could not create tag"):c("Tag created",e)},tag(e,t,n){let r=h.getTag(t),o=h.getNode(e);if(!r)return s("Unable to add tag, missing tag");if(!o)return s("Unable to add tag, missing target");let i=this.getFieldByTitle(o.id,"Tags");if(!i)return s("Unable to locate tags field");if(O(i.id).some(m=>m.props?.value===t))return s("Tag already assigned");let d=this.createNodeAtPosition(Y.field(n,r.name,i.id,{value:t}));return l(d)?d:c("Tag added",d.data)},createNodeAtPosition(e,t={at:"end"}){if(!e.parentNodeId){let i={...e,rank:se()};return this.createNode(i),c("Created node",i)}let n=O(e.parentNodeId),r=sn(n,t);if(l(r))return r;let o={...e,rank:r.data};return this.createNode(o),c("Created node",o)},createNode(e){let t=re(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return l(t)?s("Unable to create node"):c("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return s("Failed to locate node");let n={...t,readonly:!0},r=re(o=>({...o,nodes:{...o.nodes,[e]:n}}));return l(r)?s(r.message):c("Locked node",n)},updateNode(e){let t=re(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return l(t)?t:c("Updated node",e)},updateNodeAndSelectInParent(e){let t=re(a=>({...a,nodes:{...a.nodes,[e.id]:e}}));if(l(t))return s(t.message);let n=C(),r=e.parentNodeId?n.nodes[e.parentNodeId]:n.nodes[n.rootNodeId];if(!r)return s("Unable to resolve parent after update");let i=T(r.id).findIndex(({id:a})=>a===e.id);return F.navigate({currentNode:r,selectedIndex:i===-1?0:i}),c("Updated and selected",e)},getContributor(e){return C().contributors[e]},getTag(e){return C().tags[e]},getNode(e){return C().nodes[e]},getSiblings:e=>Object.values(C().nodes).filter(t=>!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank))};var bt={preferredEditor:null,userName:null,userId:null},ae=()=>bt,dt=e=>(bt={...bt,...e},bt);var St=()=>{let e=ae(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim();return{isSetup:n&&t,hasPreferredEditor:n,hasUserName:t,userName:e.userName,preferredEditor:e.preferredEditor}},cr=()=>!At();var z={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#2a2f45",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},v={accent:z.cyan,accent2:z.magenta,primary:z.white,secondary:z.grayDark,secondary2:z.grayLight,gray:z.gray,green:z.green,yellow:z.yellow,red:z.red};var x={red:z.red,yellow:z.yellow,green:z.green,blue:z.blue,magenta:z.magenta,cyan:z.cyan},ze={urgent:x.red,critical:x.red,important:x.red,blocker:x.red,asap:x.red,immediate:x.red,fail:x.red,failure:x.red,broken:x.red,bug:x.red,error:x.red,incident:x.red,outage:x.red,production:x.red,crash:x.red,security:x.red,warning:x.yellow,warn:x.yellow,risky:x.yellow,risk:x.yellow,attention:x.yellow,pending:x.yellow,review:x.yellow,"needs-review":x.yellow,qa:x.yellow,testing:x.yellow,test:x.yellow,validate:x.yellow,verification:x.yellow,staging:x.yellow,check:x.yellow,"follow-up":x.yellow,followup:x.yellow,waiting:x.yellow,blocked:x.yellow,hold:x.yellow,done:x.green,complete:x.green,completed:x.green,success:x.green,ok:x.green,stable:x.green,resolved:x.green,fixed:x.green,closed:x.green,merged:x.green,released:x.green,deployed:x.green,approved:x.green,verified:x.green,working:x.green,healthy:x.green,pass:x.green,passing:x.green,info:x.blue,information:x.blue,note:x.blue,docs:x.blue,documentation:x.blue,doc:x.blue,guide:x.blue,help:x.blue,explanation:x.blue,detail:x.blue,details:x.blue,context:x.blue,design:x.blue,discussion:x.blue,proposal:x.blue,idea:x.blue,feature:x.magenta,enhancement:x.magenta,improvement:x.magenta,refactor:x.magenta,refactoring:x.magenta,cleanup:x.magenta,optimize:x.magenta,optimization:x.magenta,perf:x.magenta,performance:x.magenta,upgrade:x.magenta,migration:x.magenta,modernize:x.magenta,debt:x.magenta,todo:x.cyan,next:x.cyan,planned:x.cyan,plan:x.cyan,future:x.cyan,backlog:x.cyan,investigate:x.cyan,explore:x.cyan,prototype:x.cyan};var j=e=>{let{currentNode:t}=C(),n=St().isSetup,r=t.context,o=[g.SYNC,g.HELP,g.SET_VIEW,g.SET_EDITOR,g.SET_USERNAME],i=[g.NEW,g.RENAME,g.DELETE],a=[g.TAG,g.ASSIGN,g.CLOSE_ISSUE,g.RE_OPEN_ISSUE,g.SET_DESCRIPTION],m=[...{WORKSPACE:[...o,...i],BOARD:[g.FILTER,...o,...i],SWIMLANE:[g.FILTER,...o,...i],TICKET:[...o,...i,...a],FIELD:[...o,...a],FIELD_LIST:[...o,...a],TEXT:[...o]}[r||"WORKSPACE"]],u={[g.SYNC]:[],[g.INIT]:[],[g.SET_USERNAME]:[],[g.SET_DESCRIPTION]:["confirm"],[g.DELETE]:["confirm"],[g.RE_OPEN_ISSUE]:["confirm"],[g.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[g.CLOSE_ISSUE]:["confirm"],[g.FILTER]:["tag","assignee","description","title","clear"],[g.SET_VIEW]:["dense","wide"],[g.SET_EDITOR]:[...sr,"vim"],[g.TAG]:[...new Set([...Object.keys(ze),...h.getExistingTags()])],[g.ASSIGN]:h.getExistingAssignees(),[g.HELP]:[],[g.RENAME]:[],[g.NEW]:r==="TICKET"||r==="FIELD"||r==="FIELD_LIST"?["issue","swimlane","board"]:r==="SWIMLANE"?["issue","swimlane","board"]:r==="BOARD"?["issue","swimlane","board"]:["board"],[g.NONE]:m};return n?cr()||(u={[g.NONE]:[g.HELP,g.INIT],[g.HELP]:u[g.HELP],[g.INIT]:u[g.INIT]}):u={[g.NONE]:[g.HELP,g.SET_EDITOR,g.SET_USERNAME],[g.SYNC]:u[g.SYNC],[g.HELP]:u[g.HELP],[g.SET_EDITOR]:u[g.SET_EDITOR],[g.SET_USERNAME]:u[g.SET_USERNAME]},u[e]??[]};import pn from"chalk";import qe from"chalk";var ln={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},yi=(e,t,n)=>Math.max(t,Math.min(n,e)),cn=(e,t,n)=>e+(t-e)*n,lr=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},vi=(e,t,n)=>{let r=t/100,o=n/100,i=(1-Math.abs(2*o-1))*r,a=e/60,d=i*(1-Math.abs(a%2-1)),m=0,u=0,f=0;a>=0&&a<1?(m=i,u=d):a>=1&&a<2?(m=d,u=i):a>=2&&a<3?(u=i,f=d):a>=3&&a<4?(u=d,f=i):a>=4&&a<5?(m=d,f=i):(m=i,f=d);let y=o-i/2;return[Math.round((m+y)*255),Math.round((u+y)*255),Math.round((f+y)*255)]},Ci=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,hi=(e,t,n)=>[Math.round(cn(e[0],t[0],n)),Math.round(cn(e[1],t[1],n)),Math.round(cn(e[2],t[2],n))],ct=e=>{let n=lr(e)%360,r=vi(n,ln.stringColor.saturation,ln.stringColor.lightness);return Ci(r)},Ni=e=>{let t=ln.gradient.stops,n=yi(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let r=t.length-1,o=n*r,i=Math.min(Math.floor(o),r-1),a=o-i;return hi(t[i],t[i+1],a)},wt=e=>lr(e.toLowerCase().trim())/4294967295,mr=e=>{let t=wt(e);return Ni(t)},Ei=e=>{let[t,n,r]=mr(e);return{normal:o=>qe.bgRgb(t,n,r).black(o),cursor:o=>qe.bgRgb(t,n,r).white.bold(o)}},mn=e=>{let[t,n,r]=mr(e);return{fg:o=>qe.rgb(t,n,r)(o),fgCursor:o=>qe.rgb(t,n,r).inverse(o),bg:o=>qe.bgRgb(t,n,r).black(o),bgCursor:o=>qe.bgRgb(t,n,r).white.bold(o)}},un=e=>Ei(e).normal(` ${e} `),oe=(e,t=ze)=>{let r=(o=>o.toLowerCase().trim())(e);return r&&t[r]?t[r]:ct(r)};var ve="<ENTER> to confirm",J=(e="",t=[])=>({message:e,validity:xe.Valid,completionWordList:t}),de=({message:e,completionWordList:t})=>({validity:xe.Invalid,message:e,completionWordList:t}),lt=e=>e.length===0,we=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=2,inputString:o,minLengthForHints:i=1})=>{let m=[...t.filter(Boolean).filter(f=>f.startsWith(o.trim()))].sort((f,y)=>wt(f)-wt(y)).slice(0,r).map(un),u=m.length>i?m.join(" "):"";return u?`${e}${u}${n}`:""},gn=({modifier:e})=>{let t="confirm";return e===t?J(ve):de({message:lt(e)?`if you are certain, enter ${un(t)}`:"",completionWordList:[t]})},Ii=({list:e,hint:t})=>({modifier:n})=>e.includes(n)?J(ve):de({message:lt(n)?t:"",completionWordList:[]}),bi=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?de({message:n,completionWordList:[]}):J():de({message:lt(r)?t:"",completionWordList:[]}),fn=({hint:e})=>({modifier:t,inputString:n})=>lt(t)&<(n)?de({message:e,completionWordList:[]}):J(ve),Si={[g.INIT]:()=>J(ve),[g.FILTER]:e=>{if(e.modifier==="clear")return J();let t=a=>j(g.FILTER).includes(a);if(!e.modifier||!t(e.modifier??""))return de({message:we({wordList:j(g.FILTER),noOfHints:100,inputString:e.inputString}),completionWordList:j(g.FILTER)});let r=Object.values(C().tags).map(a=>a.name),o=Object.values(C().contributors).map(a=>a.name),i=e.modifier==="tag"?r:e.modifier==="assignee"?o:[];return e.inputString?i.length&&!i.includes(e.inputString.trim()??"")?de({message:we({prefix:`existing ${e.modifier}s... `,wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i}):J():de({message:we({prefix:"one of... ",wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i})},[g.NONE]:e=>e.command?J():de({message:we({prefix:"commands... ",wordList:j(g.NONE),noOfHints:100,inputString:e.inputString,minLengthForHints:0}),completionWordList:[]}),[g.NEW]:e=>bi({list:j(g.NEW),hint:we({wordList:j(g.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[g.SET_DESCRIPTION]:()=>J(ve),[g.HELP]:()=>J(ve),[g.RENAME]:()=>J(ve),[g.DELETE]:e=>gn(e),[g.CLOSE_ISSUE]:e=>gn(e),[g.RE_OPEN_ISSUE]:e=>gn(e),[g.MOVE]:e=>fn({hint:we({prefix:"hey hacker! These commands are blocked for you... ",wordList:j(g.MOVE),noOfHints:10,inputString:e.inputString})})(e),[g.TAG]:e=>{let t=h.getExistingTags().map(n=>` ${pn.bgHex(oe(n))(" "+n+" ")} `).slice(0,10);return fn({hint:"tag name like... "+t.join("")})(e)},[g.ASSIGN]:e=>{let t=h.getExistingAssignees().map(n=>` ${pn.bgHex(oe(n))(" "+n+" ")} `).slice(0,10);return fn({hint:"assign to... "+t.join("")})(e)},[g.SET_EDITOR]:e=>{logger.debug(`Validating command: ${e.command} ${e.modifier} ${e.inputString}`);let t=j(g.SET_EDITOR);return e.modifier?J(ve):de({message:we({wordList:t,noOfHints:100,inputString:e.inputString}),completionWordList:[]})},[g.SET_USERNAME]:e=>e.inputString?J():de({message:`Enter a username. Saved in ${pn.bgBlack("~/.epiqrc")}`,completionWordList:[]}),[g.SET_VIEW]:e=>Ii({list:j(g.SET_VIEW),hint:we({wordList:j(g.SET_VIEW),noOfHints:3,inputString:e.inputString})})(e),[g.SYNC]:()=>J(ve)},ur=Object.fromEntries(Object.entries(Si).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var pr=["frontend","backend","infrastructure","architecture","integration","configuration","implementation","application","deployment","environment","framework","platform","service","component","module","gateway","pipeline","containerization","orchestrator","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","reproducibility","reproduction","investigation","triage","workaround","mitigation","remediation","optimization","stabilization","refinement","failure","outage","blocking","criticality","severity","escalation","diagnostics","analysis","resolution","corruption","inconsistency","validation","verification","authorization","authentication","confidentiality","availability","accessibility","reliability","compliance","governance","encryption","decryption","integrity","auditing","traceability","accountability","protection","privileges","permissions","dependency","orchestration","provisioning","synchronization","compatibility","incompatibility","interoperability","observability","instrumentation","telemetry","loadbalancing","discovery","registration","scheduling","coordination","distribution","isolation","virtualization","serialization","deserialization","initialization","instantiation","propagation","aggregation","consolidation","normalization","standardization","transformation","reconciliation","correlation","processing","indexing","partitioning","enrichment","validation","filtering","streaming","batching","concurrency","parallelism","contention","deadlock","throttling","ratelimiting","backpressure","fragmentation","saturation","exhaustion","partitioning","replication","redundancy","failover","deprecation","obsolescence","starvation","overload","underutilization","latency","throughput","refactoring","modularization","encapsulation","abstraction","extensibility","configurability","maintainability","recoverability","sustainability","readability","testability","debuggability","reusability","simplicity","consistency","performance","functionality","requirement","recommendation","improvement","enhancement","clarification","documentation","description","acceptance","criteria","estimation","prioritization","dependency","deliverable","milestone","iteration"];var M={Init:"init",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",SetView:"set-view",SetEditor:"set-editor",SetUserName:"set-user-name",NewItem:"add-new-item",TagTicket:"ticket-tag",AssignUserToTicket:"ticket-assign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Sync:"sync"};var gr=e=>Object.values(g).includes(e),fr=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:a,validity:d,completionWordList:m}=ur[n].validate(n,r,i),u=o==="command"?Object.values(g):n&&e.target==="modifier"?j(n):pr;return{validity:d,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:a??"",autoCompletion:t?ir(e,[...m,...u]):{hint:"",hints:[],remainder:"",overlap:0}}};var xr=e=>{let t=e.trimStart(),n=wi(t),r=(n[0]??"").trimStart().trimEnd(),o=(n[1]??"").trimStart().trimEnd(),i=Ti(e),a=gr(r)?r:null,d=a!==null,m=r!=="",u=e.endsWith(" "),f=a?j(a)??[]:[],y=a&&f.includes(o)?o:"",N="word";n.length<=1?N="command":n.length===2&&(N="modifier");let S=Ai(t,a,y);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:i,hasCommand:m,command:a,isCommandKeyword:d,isLastWordCompleted:u,modifier:y,target:N,inputToMatch:i,inputString:S}},Ai=(e,t,n)=>{let r=e;return t&&r.startsWith(t)&&(r=r.slice(t.length)),r=r.replace(/^\s+/,""),n&&r.startsWith(n)&&(r=r.slice(n.length),r=r.replace(/^\s+/,"")),r},wi=e=>e?e.split(/\s+/):[],Ti=e=>e.trimEnd().split(/\s+/).at(-1)??"";var yr=" ",q={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:xe.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},xn=new Set,vr=()=>{for(let e of xn)e()},Cr=e=>(xn.add(e),()=>xn.delete(e)),Ce=e=>{let n=e(q),r=xr(n.value),o=n.cursorPosition===n.value.length;q={...n,commandMeta:fr(r,o)},vr()},Tt=({message:e,result:t})=>{let n=structuredClone(q);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,q=n,vr(),c(e,null)},yn=e=>{Ce(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},vn=e=>{Ce(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&n[o-1]===" ";)o--;for(;o>0&&n[o-1]!==" ";)o--}else{for(;o<n.length&&n[o]!==" ";)o++;for(;o<n.length&&n[o]===" ";)o++}return{...t,cursorPosition:o}})},hr=()=>{Ce(e=>{let t=e.value.slice(e.cursorPosition),n=Math.max(0,e.cursorPosition-1);return{...e,value:e.value.slice(0,n)+t,cursorPosition:n,commandIsPending:!1}})},Nr=()=>{Ce(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&t[r-1]===" ";)r--;for(;r>0&&t[r-1]!==" ";)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},U=e=>{Ce(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),i=e(r,t.commandMeta.autoCompletion),a=i+o,d=Math.max(0,Math.min(i.length,a.length));return{...t,value:a,cursorPosition:d,commandIsPending:!1}})},Er=()=>{Ce(e=>({...e,commandIsPending:!0}))},Ir=({addToHistory:e=!0})=>{Ce(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),Mi()},br=()=>{Ce(e=>{let t=Math.min(e.commandHistoryIndex+1,e.commandHistory.length-1),n=e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},Sr=()=>{Ce(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},Mi=()=>U(()=>""),me=()=>q,Mt=()=>{let[e,...t]=q.value.split(yr);return t.join(yr).trim()};var Li=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",Ri=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",Pi=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",Ar=(e,t)=>{if(Ri(e,e.sequence))return"MoveCursorLeftOfWord";if(Pi(e,e.sequence))return"MoveCursorRightOfWord";if(Li(e,e.sequence))return"EraseInputWord";switch(e.name){case"tab":return"autoCompleteCommand";case"up":return"getLastCommandFromHistory";case"down":return"getNextCommandFromHistory";case"left":return"MoveCursorLeft";case"right":return"MoveCursorRight";case"return":return"confirm";case"backspace":return t?"eraseInput":"exitCommandLine";case"escape":return"exitCommandLine";default:return"captureInput"}};function Di(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 r=C().currentNode.childNavigationAcrossParents;switch(t){case"up":return e==="vertical"?n.prevItem:r?n.prevContainer:null;case"down":return e==="vertical"?n.nextItem:r?n.nextContainer:null;case"left":return e==="horizontal"?n.prevItem:r?n.prevContainer:null;case"right":return e==="horizontal"?n.nextItem:r?n.nextContainer:null}}function wr(e,t){let n=me();if(e.sequence===":"&&n.value==="")return"initCommandLine";if(t===p.MOVE)switch(e.name){case"m":case"return":return"confirmMove"}if(t===p.COMMAND_LINE)return Ar(e,n.value);let r=Di(e);if(r){let o=t===p.MOVE?{prevItem:"movePreviousItem",nextItem:"moveNextItem",prevContainer:"moveToPreviousContainer",nextContainer:"moveToNextContainer"}:{prevItem:"navPreviousItem",nextItem:"navNextItem",prevContainer:"navToPreviousContainer",nextContainer:"navToNextContainer"};return Fi(C().currentNode.childRenderAxis,r,o)}if(e.ctrl&&e.name==="c")return"exit";switch(e.name){case"e":return"edit";case"n":return"addItem";case"m":return"initMove";case"d":return"Delete";case"return":return"confirm";case"space":return"confirm";case"v":return C().viewMode==="wide"?"SetViewDense":"SetViewWide";case"q":case"escape":return"exit";case"s":return"sync";default:return null}}var Tr=e=>{let{context:t}=C()?.currentNode;if(!t)return M.None;switch(e){case g.INIT:return M.Init;case g.DELETE:return M.Delete;case g.SET_DESCRIPTION:return M.Edit;case g.HELP:return M.ViewHelp;case g.RE_OPEN_ISSUE:return M.ReopenIssue;case g.CLOSE_ISSUE:return M.CloseIssue;case g.TAG:return M.TagTicket;case g.ASSIGN:return M.AssignUserToTicket;case g.RENAME:return M.Rename;case g.NEW:return M.NewItem;case g.FILTER:return M.Filter;case g.MOVE:return M.Move;case g.SET_USERNAME:return M.SetUserName;case g.SET_EDITOR:return M.SetEditor;case g.SET_VIEW:return M.SetView;case g.SYNC:return M.Sync;default:return M.None}};import{ulid as H}from"ulid";import{spawnSync as $i}from"node:child_process";import Vi from"node:os";import Pr from"node:path";import{ulid as Ki}from"ulid";import{accessSync as Bi,copyFileSync as ki,existsSync as Lt,mkdirSync as Mr,readdirSync as Lr,readFileSync as Oi,renameSync as Ui,rmSync as Wi,statSync as Rr,unlinkSync as Hi,writeFileSync as _i}from"node:fs";import Ge from"node:path";var te={writeToFile:(e,t)=>{try{let n=Ge.dirname(e);Lt(n)||Mr(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);_i(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return Oi(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=te.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 Lt(e)&&Rr(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Bi(e),!0}catch{return!1}},mkDir:e=>Mr(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=Ge.parse(t);for(;;){let r=Ge.join(t,e);try{if(Lt(r)&&Rr(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=Ge.dirname(t)}return null},readFirstJSON(e){try{if(!te.dirExists(e))return null;let t=Lr(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=Ge.join(e,t);return te.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return te.dirExists(e)?Lr(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{Hi(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Wi(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(Ge.dirname(t)),!n?.overwrite&&Lt(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{Ui(e,t)}catch(r){if(r?.code==="EXDEV"){ki(e,t),this.rmFile(e);return}throw r}}};function ji(){let{preferredEditor:e}=ae(),t=[e,process.env.VISUAL,process.env.EDITOR,"vim","vi","nano"].filter(n=>!!n?.trim());return[...new Set(t)]}function zi(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function Dr(e){let t=Pr.join(Vi.tmpdir(),"epiq");te.mkDir(t);let n=Pr.join(t,Ki());te.writeToFile(n,e??"");let r=ji();for(let o of r){let i=zi(o,n),a=$i(i,{stdio:"inherit",shell:!0});if(!a.error&&a.status===0){let d=te.readFile(n);if(d==null)return s("Unable to read edited file");let m=d.replace(/\r?\n$/,"");return c("Successfully edited",m)}}return s("Unable to open editor")}import{monotonicFactory as qi,ulid as Rt}from"ulid";var Pt=qi(),Fr=({name:e,parent:t,userId:n})=>{let r=Pt(),o=Pt(),i=Pt(),a=Pt();return[{id:Rt(),userId:n,action:"add.issue",payload:{id:r,parent:t,name:e}},{id:Rt(),userId:n,action:"add.field",payload:{id:o,parent:r,name:"Description",val:""}},{id:Rt(),userId:n,action:"add.field",payload:{id:i,parent:r,name:"Assignees"}},{id:Rt(),userId:n,action:"add.field",payload:{id:a,parent:r,name:"Tags"}}]};var Br=e=>{let t=e.log??[];for(let n=t.length-1;n>=0;n--){let r=t[n];if(r&&r.action==="close.issue"&&r.payload.id===e.id)return r.payload.parent}return null};var Gi=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[Xe,Dt]=Gi;var R=(e,t)=>s(`${t.split(".").join(" ")+" failed, "+e.toLowerCase()}`),Xi={"init.workspace":({action:e,payload:t})=>{let{id:n,name:r}=t,o=Y.workspace(n,r);kr(o);let i=h.createNodeAtPosition(o);return l(i)?R(i.message??"Failed to initialize workspace",e):c("Workspace initialized",{action:e,result:i.data})},"add.workspace":({action:e,payload:t})=>{let{id:n,name:r}=t,o=Y.workspace(n,r),i=h.createNodeAtPosition(o);return l(i)?R(i.message??"Failed to add workspace",e):c("Added workspace",{action:e,result:i.data})},"add.board":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=h.createNodeAtPosition(Y.board(n,r,o));return l(i)?R(i.message??"Unable to create board",e):c("Added board",{action:e,result:i.data})},"add.swimlane":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=h.createNodeAtPosition(Y.swimlane(n,r,o));return l(i)?R(i.message??"Unable to create swimlane",e):c("Added swimlane",{action:e,result:i.data})},"add.issue":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=h.createNodeAtPosition(Y.ticket(n,r,o));return l(i)?R(i.message??"Unable to create issue",e):c("Added issue",{action:e,result:i.data})},"add.field":({action:e,payload:t})=>{let{id:n,name:r,parent:o,val:i}=t,a=h.createNodeAtPosition(Y.field(n,r,o,{value:i},r.includes("Description")?"vertical":"horizontal"));return l(a)?R(a.message??`Unable to create field: ${r}`,e):c("Added field",{action:e,result:a.data})},"edit.title":({action:e,payload:t})=>{let{id:n,name:r}=t;if(!h.getNode(n))return R("Unable to locate node",e);let i=h.renameNode(n,r);return l(i)?R(i.message??"Unable to edit title",e):c("Edited title",{action:e,result:i.data})},"delete.node":({action:e,payload:t})=>{let{id:n}=t,r=h.tombstoneNode(n);return l(r)?R(r.message??"Unable to delete node",e):c("Deleted node",{action:e,result:r.data})},"create.tag":({action:e,payload:t})=>{let{id:n,name:r}=t,o=h.createTag({id:n,name:r});return l(o)?R(o.message??"Unable to create tag",e):c("Tag added",{action:e,result:o.data})},"create.contributor":({action:e,payload:t})=>{let{id:n,name:r}=t,o=h.createContributor({id:n,name:r});return l(o)?R(o.message??"Unable to create contributor",e):c("Contributor created",{action:e,result:o.data})},"tag.issue":({action:e,payload:t})=>{let{id:n,target:r,tagId:o}=t,i=h.tag(r,o,n);return l(i)?R(i.message??"Unable to tag issue",e):c("Issue tagged",{action:e,result:i.data})},"assign.issue":({action:e,payload:t})=>{let{id:n,contributor:r,target:o}=t,i=h.assign(o,r,n);return l(i)?R(i.message??"Unable to assign issue",e):c("Assigned successfully",{action:e,result:i.data})},"move.node":({action:e,payload:t})=>{let{id:n,parent:r,pos:o}=t,i=h.moveNode({id:n,parentId:r,position:o});return l(i)?R(i.message??"Failed to move node",e):c("Moved node",{action:e,result:i.data})},"edit.description":({action:e,payload:t})=>{let{id:n,md:r}=t,o=h.editValue(n,r);return l(o)?R(o.message??"Unable to edit description",e):c("Set node value",{action:e,result:o.data})},"close.issue":({action:e,payload:t})=>{let{id:n}=t,r=h.getNode(n);if(!r)return R("Unable to locate issue",e);if(!ke(r))return R("Can only close issues",e);let o=h.getNode(Xe);if(!o)return R("Unable to locate target swimlane",e);if(o.id===r.parentNodeId)return R("Cannot close closed issue",e);let a=h.moveNode({id:n,parentId:o.id,navigate:!1});return l(a)?R(a.message??"Unable to close issue",e):c("Issue closed",{action:e,result:a.data})},"reopen.issue":({action:e,payload:t})=>{let{id:n}=t,r=h.getNode(n);if(!r)return R("Unable to locate issue",e);if(!ke(r))return R("Can only reopen issues",e);let o=h.getNode(Xe);if(!o)return R("Unable to locate closed swimlane",e);if(!(r.parentNodeId===o.id))return R("Issue is not closed",e);let a=Br(r);if(!a)return R("Unable to resolve previous parent from issue history",e);if(a===o.id)return R("Previous parent resolves to closed swimlane",e);if(!h.getNode(a))return R("Previous parent no longer exists",e);let m=h.moveNode({id:n,parentId:a,navigate:!1});return l(m)?R(m.message??"Unable to reopen issue",e):c("Issue reopened",{action:e,result:m.data})},"lock.node":({action:e,payload:t})=>{let{id:n}=t,r=h.lockNode(n);return l(r)?R(r.message??"Unable to lock node",e):c("Node locked",{action:e,result:r.data})}},Yi=(e,t)=>{let n=h.getNode(e);n&&h.updateNode({...n,log:[...n.log??[],t]})},Ji=e=>{switch(e.action){case"init.workspace":case"add.workspace":case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"edit.title":case"lock.node":case"delete.node":case"move.node":case"close.issue":case"reopen.issue":return[e.payload.id];case"edit.description":let t=[e.payload.id],n=C().nodes[e.payload.id]?.parentNodeId;return n&&t.push(n),t;case"tag.issue":case"assign.issue":return[e.payload.id,e.payload.target];case"create.tag":case"create.contributor":default:return[]}};function Ye(e,t=!1){let n=Xi[e.action],r=n(e);if(l(r))return r;if(!t){let a=[...new Set(Ji(e))];for(let d of a)Yi(d,e)}let[o,i]=e.userId.split(".");return!o?.length||!i?.length?R("Invalid user ID format",e.action):(h.createContributor({name:i,id:o}),r)}var hn=e=>e.map(t=>Ye(t));import Bt from"node:fs";import Oe from"node:path";import{decodeTime as os,monotonicFactory as is}from"ulid";var Ft=process.env.IS_LOCAL==="true",ue=()=>".epiq";import Nn from"node:fs";import En from"node:path";var Qi=ue(),Zi="events",es=(e=process.cwd())=>En.join(Je(e),Qi,Zi),ts=e=>{let t=Object.keys(e).filter(n=>n!=="id");return t.length!==2?s(`Invalid persisted event: expected exactly 2 keys, got ${t.length}`):!t[0]||!(t[0]in e)?s("Invalid persisted event: action key is missing or invalid"):c("Resolved persisted action",t[0])},ns=e=>{let{userId:t,...n}=e,r=ts(n);if(l(r))return s(r.message);let o=r.data;if(!o)return s("Action key is undefined");let i=e.id?.[0];if(!i)return s("Persisted event is missing id");let a=n[o];return c("Decoded persisted event",{id:i,action:o,payload:a,userId:t})};function Or(e=process.cwd()){let t=es(e);if(!Nn.existsSync(t))return s("No events found");let n=Nn.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>En.join(t,o)),r=[];for(let o of n){let i=Nn.readFileSync(o,"utf8"),a=En.basename(o,".jsonl")||"unknown";for(let d of i.split(`
|
|
3
3
|
`)){let m=d.trim();if(m)try{let u=JSON.parse(m);r.push({...u,userId:a})}catch{return s(`Failed to parse event from line: ${m}`)}}}return c("All events loaded",rs(r))}function Ur(e=process.cwd()){let t=Or(e);if(l(t))return s(t.message);let n=[];for(let r of t.data){let o=ns(r);if(l(o))return s(`Failed to decode event ${r.id?.[0]??"<unknown>"}: ${o.message}`);n.push(o.data)}return c("Loaded merged events",n)}function Wr(e=process.cwd()){let t=Or(e);return l(t)?s(t.message):c("Loaded edge reference",t.data.at(-1)?.id?.[0]??null)}var rs=e=>{let t=new Map(e.map(d=>[d.id[0],d])),n=new Map;for(let d of e){let m=d.id[1],u=n.get(m)??[];u.push(d),n.set(m,u)}for(let d of n.values())d.sort((m,u)=>{let[f]=m.id,[y]=u.id;return f.localeCompare(y)});let r=[],o=new Set,i=d=>{let m=n.get(d)??[];for(let u of m){let[f]=u.id;o.has(f)||(o.add(f),r.push(u),i(f))}};i(null);let a=[...e].filter(d=>{let[m]=d.id;return!o.has(m)}).sort((d,m)=>{let[u,f]=d.id,[y,N]=m.id,S=f===null||t.has(f),b=N===null||t.has(N);if(S&&!b)return-1;if(!S&&b)return 1;let I=(f??"").localeCompare(N??"");return I!==0?I:u.localeCompare(y)});return[...r,...a]};var Hr=e=>({action:e.action,payload:e.payload});var ss=1,_r=is(),as="events",$r=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",Q=()=>{let{userName:e,userId:t}=ae();if(!e)return s("User name not configured");if(!t)return s("User ID not configured");let n=`${$r(t)}.${$r(e)}`;return e.trim()?c("Successfully resolved actor ID",n):s("Unable to resolve actor ID from settings or OS user info")},ds=e=>Bt.existsSync(Oe.join(e,ue()))&&Bt.statSync(Oe.join(e,ue())).isDirectory(),Je=(e=process.cwd())=>{let t=Oe.resolve(e);for(;;){if(ds(t))return t;let n=Oe.dirname(t);if(n===t)return Oe.resolve(e);t=n}},Vr=(e=process.cwd())=>Oe.join(Je(e),ue(),as),In=()=>{let e=Q();return l(e)||!e.data?s("Unable to resolve event log path"):c("Succeeded",`${e.data}.jsonl`)},cs=(e=process.cwd())=>{let t=In();return l(t)?s("Unable to resolve file name"):c("Successfully resolved event log path",Oe.join(Vr(e),`${t.data}.jsonl`))},ls=(e,t)=>({[e.action]:e.payload,v:ss,id:t});function Kr(e,t=process.cwd()){try{let n=Je(t),r=Vr(n),o=cs(n);if(l(o))return o;Bt.mkdirSync(r,{recursive:!0});let i=Wr(n);if(l(i))return s(i.message);let a;if(i.data){let m=os(i.data),u=Math.max(Date.now(),m+1);a=_r(u)}else a=_r();let d=ls(Hr(e),[a,i.data]);return Bt.appendFileSync(o.data,`${JSON.stringify(d)}
|
|
4
4
|
`,"utf8"),c("Event persisted",{path:o.data,entry:d})}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return s(`Failed to persist event: ${r}`)}}function Z(e){let t=Ye(e);if(t.result!==ye.Success)return t;let n=Kr(e);return l(n)?n:t}function kt(e){return e.map(t=>Z(t))}import{ulid as jr}from"ulid";var Qe=null,Ue=()=>structuredClone(Qe),Ze=e=>Qe=e,zr=()=>{let{currentNode:e,selectedIndex:t}=C(),r=T(e.id)[t];return r?c("Resolved selected child",r):s("Target node not found")};function bn(e){let t=zr();if(l(t))return t;let{currentNode:n,nodes:r}=C();if(!n.parentNodeId)return s("Missing parent node id");let o=r[n.parentNodeId];if(!o)return s("Missing parent node");let i=O(o.id),a=i.findIndex(({id:y})=>y===n.id);if(a<0)return s("Current node not found among siblings");let d=i[a+e];if(!d)return s("Missing sibling node");let m=Q();if(l(m))return s("Unable to resolve user ID");let u=m.data;if(Ze({id:jr(),userId:u,action:"move.node",payload:{id:t.data.id,parent:d.id,pos:{at:"end"}}}),!Qe)return s("Could not materialize move state");let f=Ye(Qe,!0);return l(f)?f:c("Node moved successfully",f.data)}function Sn(e){let t=zr();if(l(t))return t;let{currentNode:n,selectedIndex:r}=C(),i=O(n.id)[r+e];if(!i)return s("Missing sibling node");let a=Q();if(l(a))return s("Unable to resolve user ID");let d=a.data;if(Ze({id:jr(),userId:d,action:"move.node",payload:{id:t.data.id,parent:n.id,pos:{at:e===1?"after":"before",sibling:i.id}}}),!Qe)return s("Could not materialize move state");let m=Ye(Qe,!0);return l(m)?m:c("Node moved successfully",m.data)}import ms from"node:os";import qr from"node:path";var us={userId:"",userName:"",preferredEditor:""},ps=".epiq",gs="config.json",Gr=()=>qr.join(ms.homedir(),ps),An=()=>qr.join(Gr(),gs),wn=()=>{try{return te.mkDir(Gr()),c("Ensured ~/.epiq exists",null)}catch{return s("Unable to create ~/.epiq")}},fs=e=>{try{let t=JSON.parse(e);return c("Parsed config",t??{})}catch{return s("Invalid ~/.epiq/config.json JSON")}},Xr=()=>{let e=wn();if(l(e))return s(e.message);let t=An(),n=te.readFile(t);return n==null||n.trim()===""?c("No config found, using empty config",{}):fs(n)},Yr=e=>{let t=wn();if(l(t))return s(t.message);let n=An();try{return te.writeToFile(n,JSON.stringify(e,null,2)+`
|
|
5
|
-
`),c("Config written",null)}catch{return s("Unable to write ~/.epiq/config.json")}},Tn=e=>{let t=Xr();if(l(t))return s("Failed to read existing config");let n={...t.data,...e};return Yr(n)},Jr=()=>{let e=An(),t=wn();if(l(t))throw new Error("Unable to create ~/.epiq");if(!(te.readFile(e)!==null)){let d=Yr(us);if(l(d))throw new Error("Unable to create ~/.epiq/config.json")}let r=Xr();if(l(r))throw new Error("Unable to load settings");let{preferredEditor:o,userName:i,userId:a}=r.data;return!i||!a?s("User name or ID not configured in ~/.epiq/config.json"):dt({preferredEditor:o,userName:i,userId:a})};var et=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?c("Found node",n):s("Unable to find node in breadcrumb")};import{spawn as ro}from"node:child_process";import{createHash as xs}from"node:crypto";import D from"node:fs";import ys from"node:os";import $ from"node:path";var Ln=ue(),vs="events",G="epiq-state",We="origin",W=({args:e,cwd:t})=>new Promise(n=>{if(!D.existsSync(t))return n(s(`Git cwd does not exist: ${t}`));let r=ro("git",e,{cwd:t,stdio:["ignore","pipe","pipe"]}),o="",i="";r.stdout.setEncoding("utf8"),r.stderr.setEncoding("utf8"),r.stdout.on("data",a=>{o+=a}),r.stderr.on("data",a=>{i+=a}),r.on("error",a=>{n(s([`git ${e.join(" ")}`,`cwd=${t}`,a.message].join(`
|
|
5
|
+
`),c("Config written",null)}catch{return s("Unable to write ~/.epiq/config.json")}},Tn=e=>{let t=Xr();if(l(t))return s("Failed to read existing config");let n={...t.data,...e};return Yr(n)},Jr=()=>{let e=An(),t=wn();if(l(t))throw new Error("Unable to create ~/.epiq");if(!(te.readFile(e)!==null)){let d=Yr(us);if(l(d))throw new Error("Unable to create ~/.epiq/config.json")}let r=Xr();if(l(r))throw new Error("Unable to load settings");let{preferredEditor:o,userName:i,userId:a}=r.data;return!i||!a?s("User name or ID not configured in ~/.epiq/config.json"):dt({preferredEditor:o,userName:i,userId:a})};var et=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?c("Found node",n):s("Unable to find node in breadcrumb")};import{spawn as ro}from"node:child_process";import{createHash as xs}from"node:crypto";import D from"node:fs";import ys from"node:os";import $ from"node:path";var Ln=ue(),vs="events",G="epiq-state-2",We="origin",W=({args:e,cwd:t})=>new Promise(n=>{if(!D.existsSync(t))return n(s(`Git cwd does not exist: ${t}`));let r=ro("git",e,{cwd:t,stdio:["ignore","pipe","pipe"]}),o="",i="";r.stdout.setEncoding("utf8"),r.stderr.setEncoding("utf8"),r.stdout.on("data",a=>{o+=a}),r.stderr.on("data",a=>{i+=a}),r.on("error",a=>{n(s([`git ${e.join(" ")}`,`cwd=${t}`,a.message].join(`
|
|
6
6
|
`)))}),r.on("close",a=>{let d=a??1;if(d!==0){n(s([`git ${e.join(" ")}`,i.trim()||o.trim()||"Git command failed"].filter(Boolean).join(`
|
|
7
7
|
`)));return}n(c("Git command succeeded",{stdout:o,stderr:i,exitCode:d}))})}),He=({args:e,cwd:t})=>new Promise(n=>{if(!D.existsSync(t))return n({stdout:"",stderr:`Git cwd does not exist: ${t}`,exitCode:1});let r=ro("git",e,{cwd:t,stdio:["ignore","pipe","pipe"]}),o="",i="";r.stdout.setEncoding("utf8"),r.stderr.setEncoding("utf8"),r.stdout.on("data",a=>{o+=a}),r.stderr.on("data",a=>{i+=a}),r.on("error",a=>{n({stdout:o,stderr:a.message,exitCode:1})}),r.on("close",a=>{n({stdout:o,stderr:i,exitCode:a??1})})}),Cs=async e=>{if((await He({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return c("Repo already initialized",!1);let n=await W({args:["commit","--allow-empty","-m","[epiq:init]"],cwd:e});return l(n)?s(`Failed to create initial commit
|
|
8
8
|
${n.message}`):c("Created initial commit",!0)},Mn=e=>(D.mkdirSync(e,{recursive:!0}),c("Ensured directory",void 0)),hs=e=>{D.existsSync(e)&&D.rmSync(e,{recursive:!0,force:!0})},Ns=async(e=process.cwd())=>{let t=await W({args:["rev-parse","--show-toplevel"],cwd:e});return l(t)?s("Not inside a Git repository"):c("Resolved repo root",t.data.stdout.trim())},Es=async e=>{let t=await W({args:["rev-parse","--git-dir"],cwd:e});if(l(t))return s(t.message);let n=t.data.stdout.trim(),r=$.isAbsolute(n)?n:$.join(e,n);return c("Resolved git dir",r)},Qr=async e=>{let t=await Es(e);if(l(t))return s(t.message);let n=t.data,o=["MERGE_HEAD","CHERRY_PICK_HEAD","REVERT_HEAD","REBASE_HEAD",$.join("rebase-merge"),$.join("rebase-apply")].filter(i=>D.existsSync($.join(n,i)));return c("Checked for in-progress Git operation",o.length>0)},Is=async e=>{let t=await He({args:["diff","--cached","--quiet"],cwd:e});return t.exitCode===0?c("No staged changes",!1):t.exitCode===1?c("Has staged changes",!0):s(t.stderr.trim()||"Unable to inspect staged changes")},bs=e=>xs("sha1").update(e).digest("hex").slice(0,12),oo=()=>$.join(ys.homedir(),".epiq"),io=()=>$.join(oo(),"worktrees"),Ss=e=>{let t=bs(e);return $.join(io(),t)},so=e=>$.join(e,Ln),mt=e=>$.join(so(e),vs),Ot=({root:e,fileName:t})=>$.join(mt(e),t),Zr=e=>{let t=so(e);return D.existsSync(t)?c("Epiq dir already exists",!1):(D.mkdirSync(t,{recursive:!0}),c("Created epiq dir",!0))},eo=e=>{let t=mt(e);return D.existsSync(t)?c("Events dir already exists",!1):(D.mkdirSync(t,{recursive:!0}),c("Created events dir",!0))},As=()=>{let e=Mn(oo());if(l(e))return s(e.message);let t=Mn(io());return l(t)?s(t.message):c("Ensured epiq storage",void 0)},ao=async({repoRoot:e,remote:t})=>{let n=await He({args:["remote","get-url",t],cwd:e});return c("Checked remote",n.exitCode===0)},co=async({repoRoot:e,remote:t,branch:n})=>{let r=await He({args:["ls-remote","--heads",t,n],cwd:e});return r.exitCode!==0?s(r.stderr.trim()||`Unable to inspect remote branch ${t}/${n}`):c("Checked remote branch",r.stdout.trim().length>0)},ws=async({repoRoot:e,branch:t})=>{let n=await He({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?c("Local branch exists",!0):n.exitCode===1?c("Local branch missing",!1):s(n.stderr.trim()||`Unable to inspect branch ${t}`)},Ts=async({repoRoot:e})=>{let t=await ws({repoRoot:e,branch:G});if(l(t))return s(t.message);if(t.data)return c("Local board branch already exists",!1);let n=await ao({repoRoot:e,remote:We});if(l(n))return s(n.message);if(n.data){let o=await co({repoRoot:e,remote:We,branch:G});if(l(o))return s(o.message);if(o.data){let i=await W({args:["branch","--track",G,`${We}/${G}`],cwd:e});return l(i)?s(`Failed to create local ${G} from remote
|