epiq 0.3.10 → 0.4.0
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/index.js +48 -48
- package/dist/mcp.js +50 -50
- package/package.json +1 -1
package/dist/mcp.js
CHANGED
|
@@ -1,65 +1,65 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{McpServer as gd}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as fd}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as L}from"zod";var pe={None:"none",Success:"success",Fail:"fail"},i=e=>({status:pe.Fail,message:e,value:null}),c=(e,t)=>({status:pe.Success,message:e,value:t}),l=e=>e.status==="fail",Zn=e=>e.status==="success";import{ulid as Ii}from"ulid";import{monotonicFactory as Pi,ulid as ft}from"ulid";var vt=Pi(),yt=({name:e,parent:t,user:{userId:n,userName:r}})=>{let o=vt(),s=vt(),a=vt(),d=vt();return[{id:ft(),userId:n,userName:r,action:"add.issue",payload:{id:o,parent:t,name:e}},{id:ft(),userId:n,userName:r,action:"add.field",payload:{id:s,parent:o,name:"Description",val:""}},{id:ft(),userId:n,userName:r,action:"add.field",payload:{id:a,parent:o,name:"Assignees"}},{id:ft(),userId:n,userName:r,action:"add.field",payload:{id:d,parent:o,name:"Tags"}}]};import Xe from"chalk";import{monotonicFactory as dd,ulid as Ee}from"ulid";import{useSyncExternalStore as id}from"react";var M={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function X(e){return e.context==="TICKET"}var Qn=e=>e.context==="SWIMLANE";var g={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};function xt(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var Nt=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",Oe=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var er=e=>{let t=new Map;for(let n of e)for(let r=1;r<=n.length;r++){let o=n.slice(0,r),s=t.get(o);s?s.push(n):t.set(o,[n])}return t},tr=(e,t)=>t?e.get(t)??[]:[];var nr=new WeakMap,Li=e=>{let t=nr.get(e);return t||(t=er(e),nr.set(e,t)),t};var rr=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return tr(Li(e),r).filter(s=>xt(r,s)>=n)};var Di={hint:"",hints:[],overlap:0,remainder:""},or=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return Di;let o=rr({wordList:r,inputToMatch:e,overlapThreshold:1});return Fi(t,o)},Fi=(e,t)=>{let n=t[0]??"",r=xt(e.toLowerCase(),n.toLowerCase()),[o,s]=n.split(":"),a=r<(o??"").length,d=!!s,f=(d&&a?o:n)+(d&&a?":":" "),N=f.slice(r);return{hint:f,hints:t,overlap:r,remainder:N}};var ir=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var Ue=24n,ki=Ue*4n,Et=(1n<<ki)-1n,Oi=/^[0-9a-f]+$/;function sr(e){if(!e||!Oi.test(e))throw new Error(`Invalid hex rank: ${e}`);return BigInt("0x"+e)}function It(e,t=Ue){if(e<0n)throw new Error("Negative rank not allowed");return e.toString(16).padStart(Number(t),"0")}function Je(e,t){if(!e&&!t)return It(Et/2n,Ue);let n=e?sr(e):0n,r=t?sr(t):Et;if(r<=n)return It(Et/2n,Ue);let o=(n+r)/2n;return o===n||o===r?"":It(o,Ue)}function de(){return It(Et/2n,Ue)}var Y={workspace:(e,t)=>({id:e,title:t,rank:de(),isDeleted:!1,props:{},context:M.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r=!1)=>({id:e,title:t,rank:de(),isDeleted:!1,props:{},context:M.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:r,log:[]}),swimlane:(e,t,n)=>({id:e,title:t,rank:de(),isDeleted:!1,props:{},context:M.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:(e,t,n,r={},o="horizontal")=>({id:e,title:t,rank:de(),isDeleted:!1,props:r,context:M.FIELD,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[]}),ticket:(e,t,n)=>({id:e,title:t,rank:de(),isDeleted:!1,props:{},context:M.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:de(),isDeleted:!1,props:r,context:M.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:o,log:[]})};var G=e=>Object.values(v().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),ar=(e,t)=>e.findIndex(n=>n.id===t),rn=(e,t={at:"end"})=>{if(e.length===0)return c("Resolved rank",de());switch(t.at){case"start":{let n=e[0];return n?c("Resolved rank",Je(void 0,n.rank)):i("Unable to resolve first sibling")}case"end":{let n=e[e.length-1];return n?c("Resolved rank",Je(n.rank,void 0)):i("Unable to resolve last sibling")}case"before":{let n=ar(e,t.sibling);if(n<0)return i("Sibling not found");let r=n>0?e[n-1]:void 0,o=e[n];return o?c("Resolved rank",Je(r?.rank,o.rank)):i("Sibling not found")}case"after":{let n=ar(e,t.sibling);if(n<0)return i("Sibling not found");let r=e[n],o=n<e.length-1?e[n+1]:void 0;return r?c("Resolved rank",Je(r.rank,o?.rank)):i("Sibling not found")}}};var Be=(e,t)=>{let{nodes:n}=v(),r=n[e];if(!r)return i("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 i(`No ancestor found for context: ${t}`)},Ui=(e,t)=>{let{nodes:n}=v(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},on=(e,t)=>e?e.readonly?i({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node"}[t]):null:i("Node not found"),x={deleteNode(e){Z(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},editValue(e,t){let{nodes:n}=v(),r=n[e];if(!r)return i("Edit target node not found");let o=on(r,"edit");if(o)return o;let s={...r,props:{...r.props,value:t}};return x.updateNode(s),c("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return i("Rename target node not found");let r=on(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),c("Renamed node",o)},getExistingTags(){let{tags:e}=v();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=v();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return G(e).find(n=>n.title===t)},moveNode({id:e,parentId:t,position:n={at:"end"}}){let{rootNodeId:r}=v(),o=this.getNode(e),s=this.getNode(t);if(!o)return i("Node not found");if(!s)return i("Target parent not found");if(r===e)return i("Cannot move root node");if(e===t)return i("Cannot move node into itself");let a=on(o,"move");if(a)return a;if(Ui(t,e))return i("Cannot move node into its own descendant");let d=G(t).filter(f=>f.id!==e),u=rn(d,n);if(l(u))return u;let m={...o,parentNodeId:t,rank:u.value};return this.updateNode(m),c("Moved node successfully",m)},tombstoneNode(e){let{nodes:t,currentNodeId:n,rootNodeId:r}=v(),o=this.getNode(e);if(!o)return i("Node not found");if(r===e)return i("Cannot delete root node");let s=new Set,a=u=>{let m=t[u];if(!(!m||s.has(u))){s.add(u);for(let f of G(m.id))a(f.id)}};a(e);let d={...structuredClone(t)};for(let u of s){if(!d[u])return i("Unable to locate node to delete");d[u]={...d[u],isDeleted:!0}}return n?(h({nodes:d}),c("Successfully tomb stoned",o)):i("Unable to delete undefined")},createContributor(e){let t=Z(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return l(t)?i("Unable to create contributor"):c("Created contributor",e)},assign(e,t,n){let r=x.getContributor(t),o=x.getNode(e);if(!o||!r)return i("Unable assign contributor to issue");let s=this.getFieldByTitle(o.id,"Assignees");if(!s)return i("Unable to locate assignees field");if(G(s.id).some(u=>u.props?.value===t))return i("Contributor already assigned");let d=this.createNodeAtPosition(Y.field(n,r.name,s.id,{value:t}));return l(d)?d:c("Assigned contributor",d.value)},createTag(e){let t=Z(n=>({...n,tags:{...n.tags,[e.id]:e}}));return l(t)?i("Could not create tag"):c("Tag created",e)},tag(e,t,n){let r=x.getTag(t),o=x.getNode(e);if(!r)return i("Unable to add tag, missing tag");if(!o)return i("Unable to add tag, missing target");let s=this.getFieldByTitle(o.id,"Tags");if(!s)return i("Unable to locate tags field");if(G(s.id).some(u=>u.props?.value===t))return i("Tag already assigned");let d=this.createNodeAtPosition(Y.field(n,r.name,s.id,{value:t}));return l(d)?d:c("Tag added",d.value)},untag(e,t){let n=x.getTag(t),r=x.getNode(e);if(!n)return i("Unable to remove tag, missing tag");if(!r)return i("Unable to remove tag, missing target");let o=this.getFieldByTitle(r.id,"Tags");if(!o)return i("Unable to locate tags field");let s=G(o.id).find(d=>d.props?.value===t);if(!s)return c("Issue is not tagged with that tag",null);let a={...s,isDeleted:!0};return this.updateNode(a),c("Tag removed",a)},unassign(e,t){let n=x.getContributor(t),r=x.getNode(e);if(!n)return i("Unable to unassign, missing contributor");if(!r)return i("Unable to unassign, missing target");let o=this.getFieldByTitle(r.id,"Assignees");if(!o)return i("Unable to locate assignees field");let s=G(o.id).find(d=>d.props?.value===t);if(!s)return c("Issue is not assigned to that contributor",null);let a={...s,isDeleted:!0};return this.updateNode(a),c("Assignee removed",a)},createNodeAtPosition(e,t={at:"end"}){if(!e.parentNodeId){let s={...e,rank:de()};return this.createNode(s),c("Created node",s)}let n=G(e.parentNodeId),r=rn(n,t);if(l(r))return r;let o={...e,rank:r.value};return this.createNode(o),c("Created node",o)},createNode(e){let t=Z(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return l(t)?i("Unable to create node"):c("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return i("Failed to locate node");let n={...t,readonly:!0},r=Z(o=>({...o,nodes:{...o.nodes,[e]:n}}));return l(r)?i(r.message):c("Locked node",n)},updateNode(e){let t=Z(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return l(t)?t:c("Updated node",e)},getContributor(e){return v().contributors[e]},getTag(e){return v().tags[e]},getNode(e){return v().nodes[e]},getSiblings:e=>Object.values(v().nodes).filter(t=>!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank))};var ht={autoSync:!1,preferredEditor:null,userName:null,userId:null},ge=()=>ht,Ct=e=>(ht={...ht,...e},ht);var dr=()=>{let e=ge(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim();return{isSetup:n&&t,hasPreferredEditor:n,hasUserName:t,userName:e.userName,preferredEditor:e.preferredEditor}},lr=()=>!Ze();var K={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#2a2f45",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},w={accent:K.cyan,accent2:K.magenta,primary:K.white,secondary:K.grayDark,secondary2:K.grayLight,gray:K.gray,green:K.green,yellow:K.yellow,red:K.red};var y={red:K.red,yellow:K.yellow,green:K.green,blue:K.blue,magenta:K.magenta,cyan:K.cyan},_e={urgent:y.red,critical:y.red,important:y.red,blocker:y.red,asap:y.red,immediate:y.red,fail:y.red,failure:y.red,broken:y.red,bug:y.red,error:y.red,incident:y.red,outage:y.red,production:y.red,crash:y.red,security:y.red,warning:y.yellow,warn:y.yellow,risky:y.yellow,risk:y.yellow,attention:y.yellow,pending:y.yellow,review:y.yellow,"needs-review":y.yellow,qa:y.yellow,testing:y.yellow,test:y.yellow,validate:y.yellow,verification:y.yellow,staging:y.yellow,check:y.yellow,"follow-up":y.yellow,followup:y.yellow,waiting:y.yellow,blocked:y.yellow,hold:y.yellow,done:y.green,complete:y.green,completed:y.green,success:y.green,ok:y.green,stable:y.green,resolved:y.green,fixed:y.green,closed:y.green,merged:y.green,released:y.green,deployed:y.green,approved:y.green,verified:y.green,working:y.green,healthy:y.green,pass:y.green,passing:y.green,info:y.blue,information:y.blue,note:y.blue,docs:y.blue,documentation:y.blue,doc:y.blue,guide:y.blue,help:y.blue,explanation:y.blue,detail:y.blue,details:y.blue,context:y.blue,design:y.blue,discussion:y.blue,proposal:y.blue,idea:y.blue,feature:y.magenta,enhancement:y.magenta,improvement:y.magenta,refactor:y.magenta,refactoring:y.magenta,cleanup:y.magenta,optimize:y.magenta,optimization:y.magenta,perf:y.magenta,performance:y.magenta,upgrade:y.magenta,migration:y.magenta,modernize:y.magenta,debt:y.magenta,todo:y.cyan,next:y.cyan,planned:y.cyan,plan:y.cyan,future:y.cyan,backlog:y.cyan,investigate:y.cyan,explore:y.cyan,prototype:y.cyan};var cr=(e,t)=>{let r=b(e.id).find(o=>o.title===t);return r?b(r.id).map(o=>typeof o.props?.value=="string"?o.props.value:"").filter(o=>!!o):[]},sn=e=>cr(e,"Tags").map(t=>x.getTag(t)).filter(t=>!!t),bt=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!X(n)?i("Invalid untag target"):c("Retrieved tags from ticket in breadcrumb",sn(n)??[])},St=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!X(n)?i("Invalid untag target"):c("Retrieved tags from ticket in breadcrumb",an(n)??[])},an=e=>cr(e,"Assignees").map(t=>x.getContributor(t)).filter(t=>!!t);var ur=(e,t)=>{let r=b(e.id).find(o=>o.title===t);return r&&typeof r.props?.value=="string"?Oe(r.props.value):""};var p={EXIT:"exit",INIT:"init",HELP:"help",NEW:"new",TAG:"tag",UNTAG:"untag",MOVE:"move",PEEK:"peek",FILTER:"filter",ASSIGN:"assign",UNASSIGN:"unassign",DELETE:"delete",RENAME:"rename",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",SET_DESCRIPTION:"edit",SET_EDITOR:"config:editor",SET_VIEW:"config:view",SET_USERNAME:"config:username",SYNC:"sync",EXPORT:"export",NONE:""};var Bi=/^(\d+)(h|d|w|mo|y)$/,_i=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,$i=({year:e,month:t,day:n,hour:r=0,minute:o=0})=>{let s=new Date(e,t-1,n,r,o);return s.getFullYear()===e&&s.getMonth()===t-1&&s.getDate()===n&&s.getHours()===r&&s.getMinutes()===o},Wi=(e,t=new Date)=>{let n=e.match(Bi);if(!n)return null;let[,r,o]=n,s=Number(r);if(!Number.isInteger(s)||s<=0)return null;let a=new Date(t);switch(o){case"h":return a.setHours(a.getHours()-s),a;case"d":return a.setDate(a.getDate()-s),a;case"w":return a.setDate(a.getDate()-s*7),a;case"mo":return a.setMonth(a.getMonth()-s),a;case"y":return a.setFullYear(a.getFullYear()-s),a;default:return null}},Hi=e=>{let t=e.match(_i);if(!t)return null;let[,n,r,o,s,a]=t,d=Number(n),u=Number(r),m=Number(o),f=s?Number(s):0,N=a?Number(a):0;return $i({year:d,month:u,day:m,hour:f,minute:N})?new Date(d,u-1,m,f,N):null},Rt=e=>{let t=e.trim().toLowerCase();return Wi(t)??Hi(t)},mr=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Ki=[{unit:"h",from:1,to:24},{unit:"d",from:1,to:7},{unit:"w",from:1,to:52},{unit:"mo",from:1,to:12},{unit:"y",from:1,to:5}],pr=(e=Ki)=>{let t=[];for(let{unit:n,from:r,to:o}of e)for(let s=r;s<=o;s++)t.push(`${s}${n}`);return t};var Vi=["BOARD","TICKET","SWIMLANE"],Me=[p.SYNC,p.HELP,p.EXPORT,p.SET_VIEW,p.SET_EDITOR,p.SET_USERNAME],At=[p.NEW,p.RENAME,p.DELETE,p.MOVE],dn=[p.TAG,p.UNTAG,p.ASSIGN,p.UNASSIGN,p.CLOSE_ISSUE,p.RE_OPEN_ISSUE,p.SET_DESCRIPTION],gr=[p.FILTER,p.PEEK],ji={WORKSPACE:[...Me,...At],BOARD:[...gr,...Me,...At],SWIMLANE:[...gr,...Me,...At],TICKET:[...Me,...At,...dn],FIELD:[...Me,...dn],FIELD_LIST:[...Me,...dn],TEXT:[...Me]},zi=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Gi=()=>{let{currentNode:e,selectedNode:t,readOnly:n}=v();if(!dr().isSetup)return[p.HELP,p.SET_EDITOR,p.SET_USERNAME];if(!lr())return[p.HELP,p.INIT];if(n)return[p.HELP,p.PEEK,p.EXPORT,p.SET_VIEW];let o=e.context??"WORKSPACE",s=t?.context,a=s&&Vi.includes(s);return ji[o].filter(d=>d===p.RENAME||d===p.DELETE||d===p.MOVE?a:!0)},W=e=>{let{currentNode:t}=v(),n=t.context??"WORKSPACE";return{[p.NONE]:Gi(),[p.EXIT]:["confirm"],[p.EXPORT]:[],[p.SYNC]:[],[p.INIT]:[],[p.HELP]:[],[p.PEEK]:[...pr(),"now","prev","next"],[p.SET_USERNAME]:[],[p.SET_DESCRIPTION]:["confirm"],[p.DELETE]:["confirm"],[p.RE_OPEN_ISSUE]:["confirm"],[p.CLOSE_ISSUE]:["confirm"],[p.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[p.FILTER]:["tag","assignee","description","title","clear"],[p.SET_VIEW]:["dense","wide"],[p.SET_EDITOR]:[...ir],[p.TAG]:[...new Set([...Object.keys(_e),...x.getExistingTags()])],[p.UNTAG]:[...bt()?.value?.map(({name:o})=>o)??[]],[p.UNASSIGN]:[...St()?.value?.map(({name:o})=>o)??[]],[p.ASSIGN]:x.getExistingAssignees(),[p.RENAME]:[],[p.NEW]:zi(n)}[e]??[]};import $e from"chalk";import{decodeTime as fr}from"ulid";var vr=e=>{let t=Date.now()-e,n=[{label:"y",ms:1e3*60*60*24*365},{label:"mo",ms:1e3*60*60*24*30},{label:"w",ms:1e3*60*60*24*7},{label:"d",ms:1e3*60*60*24},{label:"h",ms:1e3*60*60},{label:"m",ms:1e3*60},{label:"s",ms:1e3}];for(let{label:r,ms:o}of n){let s=Math.floor(t/o);if(s>=1)return`${s}${r} ago`}return"just now"};var yr=e=>{try{return c("Decoded date",new Date(fr(e)))}catch(t){return i("Decoding failed + "+t.message)}},ln=e=>{if(!e?.id)return null;try{return fr(e.id)}catch{return null}};var Pe=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?c("Found node",n):i("Unable to find node in breadcrumb")};import xr from"chalk";var un={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},qi=(e,t,n)=>Math.max(t,Math.min(n,e)),cn=(e,t,n)=>e+(t-e)*n,Nr=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Xi=(e,t,n)=>{let r=t/100,o=n/100,s=(1-Math.abs(2*o-1))*r,a=e/60,d=s*(1-Math.abs(a%2-1)),u=0,m=0,f=0;a>=0&&a<1?(u=s,m=d):a>=1&&a<2?(u=d,m=s):a>=2&&a<3?(m=s,f=d):a>=3&&a<4?(m=d,f=s):a>=4&&a<5?(u=d,f=s):(u=s,f=d);let N=o-s/2;return[Math.round((u+N)*255),Math.round((m+N)*255),Math.round((f+N)*255)]},Yi=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,Ji=(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))],Qe=e=>{let n=Nr(e)%360,r=Xi(n,un.stringColor.saturation,un.stringColor.lightness);return Yi(r)},Zi=e=>{let t=un.gradient.stops,n=qi(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,s=Math.min(Math.floor(o),r-1),a=o-s;return Ji(t[s],t[s+1],a)},Tt=e=>Nr(e.toLowerCase().trim())/4294967295,Qi=e=>{let t=Tt(e);return Zi(t)},es=e=>{let[t,n,r]=Qi(e);return{normal:o=>xr.bgRgb(t,n,r).black(o),cursor:o=>xr.bgRgb(t,n,r).white.bold(o)}};var mn=e=>es(e).normal(` ${e} `),J=(e,t=_e)=>{let r=(o=>o.toLowerCase().trim())(e);return r&&t[r]?t[r]:Qe(r)};var fe={None:"none",Invalid:"invalid",Valid:"valid"};var ts=["BOARD","TICKET","SWIMLANE"],pn=()=>{let e=v().selectedNode;return e?.context?ts.includes(e?.context)?_():U({message:"Command not available in this context"}):U({message:"Missing target context"})},q="<ENTER> to confirm",_=(e="",t=[])=>({message:e,validity:fe.Valid,completionWordList:t}),U=({message:e,completionWordList:t=[]})=>({validity:fe.Invalid,message:e,completionWordList:t}),tt=e=>e.length===0,be=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:s=1})=>{let u=[...t.filter(Boolean).filter(f=>f.startsWith(o.trim()))].sort((f,N)=>Tt(f)-Tt(N)).slice(0,r).map(mn),m=u.length>s?u.join(" "):"";return m?`${e}${m}${n}`:""},gn=({modifier:e})=>{let t="confirm";return e===t?_(q):U({message:tt(e)?`if you are certain, enter ${mn(t)}`:"",completionWordList:[t]})},ns=({list:e,hint:t})=>({modifier:n})=>e.includes(n)?_(q):U({message:tt(n)?t:""}),rs=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?U({message:n}):_():U({message:tt(r)?t:""}),et=({hint:e})=>({modifier:t,inputString:n})=>tt(t)&&tt(n)?U({message:e,completionWordList:[]}):_(q),os={[p.EXPORT]:()=>_(q+", and create export markdown file"),[p.PEEK]:e=>{let t=e.modifier;if(t==="now")return _(q);let n={message:"historical state from: '1h', '2d', '23h', '1mo', '2y', 'previous', 'next' or full date as YYYY-MM-DD"};if(t==="prev"||t==="next")return _(q);let r=Rt(t);if(!t||!r)return U(n);let o=Pe(v().breadCrumb,"BOARD");if(l(o))return U({message:"Command is not applicable in this context"});let s=yr(o.value.id);return l(s)?U({message:"Unable to peek: board id is not a valid ULID"}):mr({date:r,horizonDate:s.value})?_(q):U({message:$e.red(`nothing to peek before ${s.value.toISOString().slice(0,16).replace("T"," ")}`)})},[p.EXIT]:()=>_(q+" and exit the application"),[p.INIT]:()=>_(q),[p.FILTER]:e=>{if(e.modifier==="clear")return _();let t=a=>W(p.FILTER).includes(a);if(!e.modifier||!t(e.modifier??""))return U({message:be({wordList:W(p.FILTER),inputString:e.inputString}),completionWordList:W(p.FILTER)});let r=Object.values(v().tags).map(a=>a.name),o=Object.values(v().contributors).map(a=>a.name),s=e.modifier==="tag"?r:e.modifier==="assignee"?o:[];return e.inputString?s.length&&!s.includes(e.inputString.trim()??"")?U({message:be({prefix:`existing ${e.modifier}s... `,wordList:s,noOfHints:10,inputString:e.inputString}),completionWordList:s}):_():U({message:be({prefix:"one of... ",wordList:s,noOfHints:10,inputString:e.inputString}),completionWordList:s})},[p.NONE]:e=>{let t=W(p.NONE),n=/^[A-Za-z_]+:/g,r=e.inputString.match(n);return r&&r.length?t=[...t.filter(o=>o.trim().match(n))]:t=[...new Set(t.flatMap(o=>o.match(n)?.join("").replace(":","")??o))],e.command?_():U({message:be({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0})})},[p.NEW]:e=>rs({list:W(p.NEW),hint:be({wordList:W(p.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[p.SET_DESCRIPTION]:()=>_(q),[p.HELP]:()=>_(q),[p.RENAME]:()=>{let e=pn();return e.validity==="invalid"?e:_(q)},[p.DELETE]:e=>{let t=pn();return t.validity==="invalid"?t:gn(e)},[p.CLOSE_ISSUE]:e=>gn(e),[p.RE_OPEN_ISSUE]:e=>gn(e),[p.MOVE]:e=>{let t=pn();return t.validity==="invalid"?t:et({hint:be({prefix:"hey hacker! These commands are blocked for you... ",wordList:W(p.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[p.TAG]:e=>{let t=x.getExistingTags().map(n=>` ${$e.bgHex(J(n))(" "+n+" ")} `).slice(0,10);return et({hint:"tag name like... "+t.join("")})(e)},[p.UNTAG]:e=>{let t=bt();if(l(t))return U({message:"Invalid untag target",completionWordList:[]});let n=t.value.map(({name:r})=>r).map(r=>` ${$e.bgHex(J(r))(" "+r+" ")} `).slice(0,10);return n.length?et({hint:" ... "+n.join("")})(e):U({message:"Issue has not tags",completionWordList:[]})},[p.ASSIGN]:e=>{let t=x.getExistingAssignees().map(n=>` ${$e.bgHex(J(n))(" "+n+" ")} `).slice(0,10);return et({hint:"assign to... "+t.join("")})(e)},[p.UNASSIGN]:e=>{let t=St();if(l(t))return U({message:"Invalid unassign target",completionWordList:[]});let n=t.value.map(({name:r})=>r).map(r=>` ${$e.bgHex(J(r))(" "+r+" ")} `).slice(0,10);return n.length?et({hint:"remove assignee... "+n.join("")})(e):U({message:"Issue has no assignees",completionWordList:[]})},[p.SET_EDITOR]:e=>{logger.debug(`Validating command: ${e.command} ${e.modifier} ${e.inputString}`);let t=W(p.SET_EDITOR);return e.modifier?_(q):U({message:be({wordList:t,inputString:e.inputString})})},[p.SET_USERNAME]:e=>e.inputString?_():U({message:`Enter a username. Saved in ${$e.bgBlack("~/.epiq-global/")}`}),[p.SET_VIEW]:e=>ns({list:W(p.SET_VIEW),hint:be({wordList:W(p.SET_VIEW),noOfHints:3,inputString:e.inputString})})(e),[p.SYNC]:()=>_(q)},Er=Object.fromEntries(Object.entries(os).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var Ir=["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 S={Exit:"exit",Init:"init",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",Peek:"peek",SetView:"set-view",SetEditor:"set-editor",SetUserName:"set-user-name",SetAutoSync:"set-auto-sync",NewItem:"add-new-item",TagTicket:"ticket-tag",UntagTicket:"ticket-untag",AssignUserToTicket:"ticket-assign-user",UnassignUserFromTicket:"ticket-unassign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Sync:"sync",Export:"export"};var hr=e=>Object.values(p).includes(e),Cr=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:s}=e,{message:a,validity:d,completionWordList:u}=Er[n].validate(n,r,s),m=o==="command"?Object.values(p):n&&e.target==="modifier"?W(n):Ir;return{validity:d,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:a??"",autoCompletion:t?or(e,[...u,...m]):{hint:"",hints:[],remainder:"",overlap:0}}};var br=e=>{let t=e.trimStart(),n=ss(t),r=n[0]??"",o=n[1]??"",s=/\s$/.test(e),a=as(e),d=hr(r)?r:null,u=d!==null,m=r!=="",f=d?W(d)??[]:[],N=d&&f.includes(o)?o:"",E="word";n.length===0||n.length===1&&!s?E="command":(n.length===1&&s||n.length===2&&!s)&&(E="modifier");let I=s?"":a,R=is(t,d,N);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:a,hasCommand:m,command:d,isCommandKeyword:u,isLastWordCompleted:s,modifier:N,target:E,inputToMatch:I,inputString:R}},is=(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},ss=e=>e.trim()?e.trim().split(/\s+/):[],as=e=>e.trimEnd().split(/\s+/).at(-1)??"";var Sr=" ",We={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:fe.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},ds=new Set,Rr=()=>{for(let e of ds)e()};var ve=e=>{let n=e(We),r=br(n.value),o=n.cursorPosition===n.value.length;We={...n,commandMeta:Cr(r,o)},Rr()},nt=({message:e,status:t})=>{let n=structuredClone(We);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,We=n,Rr(),c(e,null)},fn=e=>{ve(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},vn=e=>{ve(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&n[o-1]===" ";)o--;for(;o>0&&n[o-1]!==" ";)o--}else{for(;o<n.length&&n[o]!==" ";)o++;for(;o<n.length&&n[o]===" ";)o++}return{...t,cursorPosition:o}})},Ar=()=>{ve(e=>{let t=e.value.slice(e.cursorPosition),n=Math.max(0,e.cursorPosition-1);return{...e,value:e.value.slice(0,n)+t,cursorPosition:n,commandIsPending:!1}})},Tr=()=>{ve(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&t[r-1]===" ";)r--;for(;r>0&&t[r-1]!==" ";)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},$=e=>{ve(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),s=e(r,t.commandMeta.autoCompletion),a=s+o,d=Math.max(0,Math.min(s.length,a.length));return{...t,value:a,cursorPosition:d,commandIsPending:!1}})},wr=()=>{ve(e=>({...e,commandIsPending:!0}))},Mr=({addToHistory:e=!0})=>{ve(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),ls()},Pr=()=>{ve(e=>{let t=Math.min(e.commandHistoryIndex+1,e.commandHistory.length-1),n=e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},Lr=()=>{ve(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},ls=()=>$(()=>""),Q=()=>We,wt=()=>{let[e,...t]=We.value.split(Sr);return t.join(Sr).trim()};var T={Sync:"sync",NavPreviousItem:"navPreviousItem",NavNextItem:"navNextItem",NavToPreviousContainer:"navToPreviousContainer",NavToNextContainer:"navToNextContainer",MovePreviousItem:"movePreviousItem",MoveNextItem:"moveNextItem",MoveToPreviousContainer:"moveToPreviousContainer",MoveToNextContainer:"moveToNextContainer",Confirm:"confirm",Exit:"exit",ViewHelp:"viewHelp",HideHelp:"hideHelp",InitMove:"initMove",ConfirmMove:"confirmMove",Delete:"Delete",InitCommandLine:"initCommandLine",ExitCommandLine:"exitCommandLine",CaptureInput:"captureInput",EraseInput:"eraseInput",AddItem:"addItem",GetLastCommandFromHistory:"getLastCommandFromHistory",GetNextCommandFromHistory:"getNextCommandFromHistory",AutoCompleteCommand:"autoCompleteCommand",MoveCursorLeft:"MoveCursorLeft",MoveCursorRight:"MoveCursorRight",MoveCursorLeftOfWord:"MoveCursorLeftOfWord",MoveCursorRightOfWord:"MoveCursorRightOfWord",EraseInputWord:"EraseInputWord",None:"None",Edit:"edit",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"};var Dr=e=>{let{context:t}=v()?.currentNode;if(!t)return S.None;switch(e){case p.EXIT:return S.Exit;case p.EXPORT:return S.Export;case p.INIT:return S.Init;case p.DELETE:return S.Delete;case p.SET_DESCRIPTION:return S.Edit;case p.HELP:return S.ViewHelp;case p.RE_OPEN_ISSUE:return S.ReopenIssue;case p.CLOSE_ISSUE:return S.CloseIssue;case p.TAG:return S.TagTicket;case p.UNTAG:return S.UntagTicket;case p.ASSIGN:return S.AssignUserToTicket;case p.UNASSIGN:return S.UnassignUserFromTicket;case p.RENAME:return S.Rename;case p.NEW:return S.NewItem;case p.FILTER:return S.Filter;case p.MOVE:return S.Move;case p.PEEK:return S.Peek;case p.SET_USERNAME:return S.SetUserName;case p.SET_EDITOR:return S.SetEditor;case p.SET_VIEW:return S.SetView;case p.SYNC:return S.Sync;default:return S.None}};import{ulid as B}from"ulid";import{spawnSync as ys}from"node:child_process";import xs from"node:os";import Ur from"node:path";import{ulid as Ns}from"ulid";import{accessSync as cs,copyFileSync as us,existsSync as Mt,mkdirSync as Fr,readdirSync as kr,readFileSync as ms,renameSync as ps,rmSync as gs,statSync as Or,unlinkSync as fs,writeFileSync as vs}from"node:fs";import He from"node:path";var ee={writeToFile:(e,t)=>{try{let n=He.dirname(e);Mt(n)||Fr(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);vs(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return ms(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=ee.readFile(e);return t===null?null:JSON.parse(t)}catch(t){return logger.error(`Failed to read JSON at ${e}:`,t),null}},dirExists:e=>{try{return Mt(e)&&Or(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await cs(e),!0}catch{return!1}},mkDir:e=>Fr(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=He.parse(t);for(;;){let r=He.join(t,e);try{if(Mt(r)&&Or(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=He.dirname(t)}return null},readFirstJSON(e){try{if(!ee.dirExists(e))return null;let t=kr(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=He.join(e,t);return ee.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return ee.dirExists(e)?kr(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{fs(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{gs(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(He.dirname(t)),!n?.overwrite&&Mt(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{ps(e,t)}catch(r){if(r?.code==="EXDEV"){us(e,t),this.rmFile(e);return}throw r}}};function Es(){let{preferredEditor:e}=ge(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function Is(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function Br(e){let t=Ur.join(xs.tmpdir(),"epiq");ee.mkDir(t);let n=Ur.join(t,Ns());ee.writeToFile(n,e??"");let r=Es();for(let o of r){let s=Is(o,n),a=ys(s,{stdio:"inherit",shell:!0});if(!a.error&&a.status===0){let d=ee.readFile(n);if(d==null)return i("Unable to read edited file");let u=d.replace(/\r?\n$/,"");return c("Successfully edited",u)}}return i("Unable to open editor")}import Ft from"node:fs";import In from"node:path";import{decodeTime as Ds}from"ulid";import{z as En}from"zod";import Ss from"node:fs";import Rs from"node:path";import{decodeTime as As,monotonicFactory as Ts}from"ulid";import{z as ot}from"zod";import yn from"node:fs";import Ke from"node:path";var xn=process.env.IS_LOCAL==="true",Se=".epiq",ne=".epiq-global",Pt="events",hs="epiq",_r=e=>Ke.join(e,hs),Cs=e=>Ke.join(e,Se),rt=e=>Ke.join(Cs(e),Pt),bs=e=>{let t=Ke.join(e,Se);return yn.existsSync(t)&&yn.statSync(t).isDirectory()},re=e=>{let t=Ke.resolve(e);for(;;){if(bs(t))return c("Resolved closest .epiq root",t);let n=Ke.dirname(t);if(n===t)return i("No .epiq directory found in any parent");t=n}},$r=e=>{let t=rt(e);try{return yn.mkdirSync(t,{recursive:!0}),c("Resolved events dir",t)}catch(n){return i(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}};var Wr=e=>({action:e.action,payload:e.payload});var Kr=1,Hr=Ts(),ws=ot.tuple([ot.string().min(1),ot.string().min(1).nullable()]),Ms=ot.looseObject({v:ot.literal(Kr),id:ws}),Nn=e=>{let t=Ms.safeParse(e);return t.success?c("Parsed persisted event",t.data):i(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},Lt=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",V=()=>{let{userName:e,userId:t}=ge();return e?t?e.trim()?c("Successfully resolved actor ID",{userId:Lt(t),userName:Lt(e)}):i("Unable to resolve actor ID from settings or OS user info"):i("User ID not configured"):i("User name not configured")},it=({userId:e,userName:t})=>`${Lt(e)}.${Lt(t)}.jsonl`,Ps=(e,{userId:t,userName:n})=>{let r=it({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return i(`Invalid event log file name: ${r}`);let s=Rs.join(rt(e),r);return c("Successfully resolved event log path",s)},Ls=(e,t)=>{let n={[e.action]:e.payload,v:Kr,id:t};return Nn(n)};function Dt({event:e,rootDir:t=process.cwd()}){try{let n=re(t);if(l(n))return n;let r=$r(n.value);if(l(r))return r;let o=Ps(n.value,{userId:e.userId,userName:e.userName});if(l(o))return o;let s=Vr(n.value);if(l(s))return i(s.message);let a=s.value?Hr(Math.max(Date.now(),As(s.value)+1)):Hr(),d=Ls(Wr(e),[a,s.value]);return l(d)?i(d.message):(Ss.appendFileSync(o.value,`${JSON.stringify(d.value)}
|
|
3
|
-
|
|
4
|
-
`)){let s=o.trim();if(!s)continue;let a;try{a=JSON.parse(s)}catch{return i(`Failed to parse event JSON from ${e}: ${s}`)}let d=Nn(a);if(l(d))return i(`${d.message} in ${e}: ${s}`);r.push({...d.value,userId:t.value.userId,userName:t.value.userName})}return c("Parsed persisted events file",r)};function jr(e){let t=rt(e);if(!Ft.existsSync(t))return i("No events found");let n=Ft.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>In.join(t,o)),r=[];for(let o of n){let s=kt(o);if(l(s))return i(s.message);r.push(...s.value)}return c("All events loaded",$s(r))}function st(e){let t=jr(e);if(l(t))return i(t.message);let n=[];for(let r of t.value){let o=_s(r);if(l(o))return i(`Failed to decode event ${r.id?.[0]??"<unknown>"}: ${o.message}`);n.push(o.value)}return c("Loaded merged events",n)}function Vr(e=process.cwd()){let t=jr(e);return l(t)?i(t.message):c("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var $s=e=>{let t=new Map;for(let d of e){let u=d.id[1]??null,m=t.get(u)??[];m.push(d),t.set(u,m)}for(let d of t.values())d.sort((u,m)=>u.id[0].localeCompare(m.id[0]));let n=[],r=new Set;a(t.get(null)??[]);let o=!0;for(;o;){o=!1;for(let d=0;d<n.length;d++){let u=n[d];if(!u)continue;let m=(t.get(u.id[0])??[]).filter(f=>!r.has(f.id[0]));if(m.length!==0){n.splice(d+1,0,...m);for(let f of m)r.add(f.id[0]);o=!0,d+=m.length}}}let s=e.filter(d=>!r.has(d.id[0])).sort((d,u)=>d.id[0].localeCompare(u.id[0]));return n.push(...s),n;function a(d){for(let u of d)r.has(u.id[0])||(n.push(u),r.add(u.id[0]))}},zr=(e,t)=>{let n=e.findIndex(r=>{try{return Ds(r.id)>t}catch{return!0}});return n===-1?{appliedEvents:e,unappliedEvents:[]}:{appliedEvents:e.slice(0,n),unappliedEvents:e.slice(n)}};var Gr=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 Ws=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[le,Ot]=Ws;var D=(e,t)=>i(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),Hs={"init.workspace":e=>{let{id:t,name:n}=e.payload,r=Y.workspace(t,n);hn(r);let o=x.createNodeAtPosition(r);return l(o)?D(o.message??"Failed to initialize workspace",e):c("Workspace initialized",{action:e.action,result:o.value})},"add.workspace":e=>{let{id:t,name:n}=e.payload,r=Y.workspace(t,n),o=x.createNodeAtPosition(r);return l(o)?D(o.message??"Failed to add workspace",e):c("Added workspace",{action:e.action,result:o.value})},"add.board":e=>{let{id:t,name:n,parent:r}=e.payload,o=x.createNodeAtPosition(Y.board(t,n,r));return l(o)?D(o.message??"Unable to create board",e):c("Added board",{action:e.action,result:o.value})},"add.swimlane":e=>{let{id:t,name:n,parent:r}=e.payload,o=x.createNodeAtPosition(Y.swimlane(t,n,r));return l(o)?D(o.message??"Unable to create swimlane",e):c("Added swimlane",{action:e.action,result:o.value})},"add.issue":e=>{let{id:t,name:n,parent:r}=e.payload,o=x.createNodeAtPosition(Y.ticket(t,n,r));return l(o)?D(o.message??"Unable to create issue",e):c("Added issue",{action:e.action,result:o.value})},"add.field":e=>{let{id:t,name:n,parent:r,val:o}=e.payload,s=x.createNodeAtPosition(Y.field(t,n,r,{value:o},n.includes("Description")?"vertical":"horizontal"));return l(s)?D(s.message??`Unable to create field: ${n}`,e):c("Added field",{action:e.action,result:s.value})},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!x.getNode(t))return D(`Unable to locate node with id ${t}`,e);let o=x.renameNode(t,n);return l(o)?D(o.message??"Unable to edit title",e):c("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,n=x.tombstoneNode(t);return l(n)?D(n.message??"Unable to delete node",e):c("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,r=x.createTag({id:t,name:n});return l(r)?D(r.message??"Unable to create tag",e):c("Tag added",{action:e.action,result:r.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,r=x.createContributor({id:t,name:n});return l(r)?D(r.message??"Unable to create contributor",e):c("Contributor created",{action:e.action,result:r.value})},"tag.issue":e=>{let{id:t,target:n,tagId:r}=e.payload,o=x.tag(n,r,t);return l(o)?D(o.message??"Unable to tag issue",e):c("Issue tagged",{action:e.action,result:o.value})},"untag.issue":e=>{let{target:t,tagId:n}=e.payload,r=x.untag(t,n);return l(r)?D(r.message??"Unable to untag ",e):c("Issue untagged",{action:e.action,result:r.value})},"assign.issue":e=>{let{id:t,contributor:n,target:r}=e.payload,o=x.assign(r,n,t);return l(o)?D(o.message??"Unable to assign issue",e):c("Assigned successfully",{action:e.action,result:o.value})},"unassign.issue":e=>{let{target:t,contributor:n}=e.payload,r=x.unassign(t,n);return l(r)?D(r.message??"Unable to unassign issue",e):c("Issue unassigned",{action:e.action,result:r.value})},"move.node":e=>{let{id:t,parent:n,pos:r}=e.payload,o=x.moveNode({id:t,parentId:n,position:r});return l(o)?D(o.message??"Failed to move node",e):c("Moved node",{action:e.action,result:o.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,r=x.editValue(t,n);return l(r)?D(r.message??"Unable to edit description",e):c("Set node value",{action:e.action,result:r.value})},"close.issue":e=>{let{id:t}=e.payload,n=x.getNode(t);if(!n)return D("Unable to locate issue",e);if(!X(n))return D("Can only close issues",e);let r=x.getNode(le);if(!r)return D("Unable to locate target swimlane",e);if(r.id===n.parentNodeId)return D("Cannot close closed issue",e);let s=x.moveNode({id:t,parentId:r.id});return l(s)?D(s.message??"Unable to close issue",e):c("Issue closed",{action:e.action,result:s.value})},"reopen.issue":e=>{let{id:t}=e.payload,n=x.getNode(t);if(!n)return D("Unable to locate issue",e);if(!X(n))return D("Can only reopen issues",e);let r=x.getNode(le);if(!r)return D("Unable to locate closed swimlane",e);if(!(n.parentNodeId===r.id))return D("Issue is not closed",e);let s=Gr(n);if(!s)return D("Unable to resolve previous parent from issue history",e);if(s===r.id)return D("Previous parent resolves to closed swimlane",e);if(!x.getNode(s))return D("Previous parent no longer exists",e);let d=x.moveNode({id:t,parentId:s});return l(d)?D(d.message??"Unable to reopen issue",e):c("Issue reopened",{action:e.action,result:d.value})},"lock.node":e=>{let{id:t}=e.payload,n=x.lockNode(t);return l(n)?D(n.message??"Unable to lock node",e):c("Node locked",{action:e.action,result:n.value})}},Ks=(e,t)=>{let n=x.getNode(e);n&&x.updateNode({...n,log:[...n.log??[],t]})},Vs=e=>{switch(e.action){case"init.workspace":case"add.workspace":case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"edit.title":case"lock.node":case"delete.node":case"move.node":case"close.issue":case"reopen.issue":return[e.payload.id];case"edit.description":let t=[e.payload.id],n=v().nodes[e.payload.id]?.parentNodeId;return n&&t.push(n),t;case"tag.issue":case"untag.issue":case"assign.issue":case"unassign.issue":return[e.payload.id,e.payload.target];case"create.tag":case"create.contributor":default:return[]}};function Ve(e,t=!1){let n=Hs[e.action](e);if(l(n))return n;t||([...new Set(Vs(e))].forEach(a=>Ks(a,e)),Z(a=>({...a,eventLog:[...a.eventLog,e]})));let r=e.userId,o=e.userName;return!r?.length||!o?.length?D("Invalid user ID format",e):(x.createContributor({name:o,id:r}),n)}var Le=e=>e.map(t=>Ve(t));function j(e){let t=Ve(e);if(t.status!==pe.Success)return t;let n=Dt({event:e});return l(n)?n:t}function je(e){return e.map(t=>j(t))}import ca from"node:fs";import{createHash as Xs}from"node:crypto";import dt from"node:fs";import Ys from"node:os";import ie from"node:path";var Cn=(e,t)=>{let n=new Map,r=t??((...s)=>JSON.stringify(s)),o=((...s)=>{let a=r(...s);if(!n.has(a)){let d=e(...s).then(u=>(l(u)&&n.delete(a),u));n.set(a,d)}return n.get(a)});return o.clear=()=>n.clear(),o};import at from"fs";import Xr from"path";import js from"util";var qr=1e3,Yr=()=>{let e=process.cwd(),t=re(e);if(!l(t))return Xr.join(t.value,Se,"log","epiq.log")};function zs(){if(!xn)return;let e=Yr();if(e===void 0||!at.existsSync(e))return;let n=at.readFileSync(e,"utf8").split(`
|
|
5
|
-
`);if(n[n.length-1]===""&&n.pop(),n.length<=qr)return;let r=n.slice(-qr).join(`
|
|
2
|
+
import{McpServer as Id}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as hd}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as P}from"zod";var pe={None:"none",Success:"success",Fail:"fail"},s=e=>({status:pe.Fail,message:e,value:null}),c=(e,t)=>({status:pe.Success,message:e,value:t}),l=e=>e.status==="fail",tr=e=>e.status==="success";import{ulid as Ai}from"ulid";import Is from"node:fs";import{createHash as Vi}from"node:crypto";import Qe from"node:fs";import ji from"node:os";import de from"node:path";var an=(e,t)=>{let n=new Map,r=t??((...i)=>JSON.stringify(i)),o=((...i)=>{let a=r(...i);if(!n.has(a)){let d=e(...i).then(u=>(l(u)&&n.delete(a),u));n.set(a,d)}return n.get(a)});return o.clear=()=>n.clear(),o};import Ze from"fs";import ir from"path";import $i from"util";import dn from"node:fs";import Be from"node:path";var ln=process.env.IS_LOCAL==="true",Se=".epiq",ie=".epiq-global",vt="events",Ui="epiq",nr=e=>Be.join(e,Ui),Bi=e=>Be.join(e,Se),Je=e=>Be.join(Bi(e),vt),_i=e=>{let t=Be.join(e,Se);return dn.existsSync(t)&&dn.statSync(t).isDirectory()},se=e=>{let t=Be.resolve(e);for(;;){if(_i(t))return c("Resolved closest .epiq root",t);let n=Be.dirname(t);if(n===t)return s("No .epiq directory found in any parent");t=n}},rr=e=>{let t=Je(e);try{return dn.mkdirSync(t,{recursive:!0}),c("Resolved events dir",t)}catch(n){return s(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}};var or=1e3,sr=()=>{let e=process.cwd(),t=se(e);if(!l(t))return ir.join(t.value,Se,"log","epiq.log")};function Wi(){if(!ln)return;let e=sr();if(e===void 0||!Ze.existsSync(e))return;let n=Ze.readFileSync(e,"utf8").split(`
|
|
3
|
+
`);if(n[n.length-1]===""&&n.pop(),n.length<=or)return;let r=n.slice(-or).join(`
|
|
6
4
|
`)+`
|
|
7
|
-
`;
|
|
8
|
-
`;
|
|
9
|
-
`);u(n?{stdout:a,stderr:f,exitCode:124}:
|
|
10
|
-
`)))}),o.on("close",f=>{let N=f??1;if(n){u({stdout:a,stderr:d,exitCode:N});return}if(N!==0){u(
|
|
11
|
-
`)));return}u(c("Git command succeeded",{stdout:a,stderr:d,exitCode:N}))})}),
|
|
12
|
-
${n.message}`);let r=await
|
|
13
|
-
${r.message}`):c("Created commit and resolved SHA",r.value.stdout.trim())},
|
|
14
|
-
`).filter(
|
|
15
|
-
${r.message}`);let o=await H.pullRebase({cwd:e,remote:
|
|
16
|
-
${o.message}`):c("Pulled with rebase",!0)},
|
|
17
|
-
`+e.message);let t=
|
|
18
|
-
`+t.message):c("Ensured epiq storage",!0)},
|
|
5
|
+
`;Ze.writeFileSync(e,r,"utf8")}function cn(e,t,n=!1){if(!ln)return;let r=sr();if(!r)return;let o=$i.format(...t),i=new Date,d=`[${n?i.toISOString().slice(11,19):i.toISOString()}] ${e} ${o}
|
|
6
|
+
`;Ze.mkdirSync(ir.dirname(r),{recursive:!0}),Ze.appendFileSync(r,d,"utf8"),Wi()}var te={info(...e){cn("[Info]",e,!1)},debug(...e){cn("->",e,!0)},error(...e){cn("[Error]",[...e,new Error().stack],!1)}};globalThis.logger=te;import{spawn as Hi}from"node:child_process";import un from"node:fs";import lr from"node:path";var O="epiq/eventlog",ae="origin";var H={stage:({cwd:e,pathspec:t})=>D({args:["add",t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1})=>D({args:["commit",...n?["--allow-empty"]:[],"-m",t],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>D({args:["fetch",t,n],cwd:e}),pullRebase:({cwd:e,remote:t,branch:n})=>D({args:["pull","--rebase",t,n],cwd:e}),checkout:({cwd:e,branch:t})=>D({args:["checkout",t],cwd:e}),push:({cwd:e,remote:t,branch:n,setUpstream:r=!1})=>{let o=t&&n?["push",...r?["-u"]:[],t,n]:["push"];return D({args:o,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>D({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>D({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>D({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>D({args:["worktree","prune"],cwd:e})};var ar=15e3,Ki={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},cr=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!un.existsSync(t)){let f=`Git cwd does not exist: ${t}`;if(n){r({stdout:"",stderr:f,exitCode:1});return}r(s(f));return}let o=Hi("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:Ki}),i=!1,a="",d="",u=f=>{i||(i=!0,clearTimeout(m),r(f))},m=setTimeout(()=>{o.kill("SIGTERM");let f=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${ar}ms`].join(`
|
|
7
|
+
`);u(n?{stdout:a,stderr:f,exitCode:124}:s(f))},ar);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",f=>{a+=f}),o.stderr.on("data",f=>{d+=f}),o.on("error",f=>{if(n){u({stdout:a,stderr:f.message,exitCode:1});return}u(s([`git ${e.join(" ")}`,`cwd=${t}`,f.message].join(`
|
|
8
|
+
`)))}),o.on("close",f=>{let N=f??1;if(n){u({stdout:a,stderr:d,exitCode:N});return}if(N!==0){u(s([`git ${e.join(" ")}`,d.trim()||a.trim()||"Git command failed"].filter(Boolean).join(`
|
|
9
|
+
`)));return}u(c("Git command succeeded",{stdout:a,stderr:d,exitCode:N}))})}),D=({args:e,cwd:t})=>cr({args:e,cwd:t,allowFail:!1}),_e=({args:e,cwd:t})=>cr({args:e,cwd:t,allowFail:!0}),yt=async({cwd:e,message:t})=>{let n=await H.commit({cwd:e,message:t});if(l(n))return s(`Failed to create commit
|
|
10
|
+
${n.message}`);let r=await D({args:["rev-parse","HEAD"],cwd:e});return l(r)?s(`Commit created, but failed to read HEAD SHA
|
|
11
|
+
${r.message}`):c("Created commit and resolved SHA",r.value.stdout.trim())},mn=async e=>{let t=await yr(e);if(l(t))return s(t.message);let n=t.value,o=["MERGE_HEAD","CHERRY_PICK_HEAD","REVERT_HEAD","REBASE_HEAD","rebase-merge","rebase-apply"].filter(i=>un.existsSync(lr.join(n,i)));return c("Checked for in-progress Git operation",o.length>0)},pn=async({repoRoot:e})=>{let n=(await _e({args:["remote","get-url",ae],cwd:e})).exitCode===0;return c(`Checked remote ${n}`,n)},xt=async({repoRoot:e,branch:t})=>{let n=await _e({args:["ls-remote","--heads",ae,t],cwd:e});return n.exitCode!==0?s(n.stderr.trim()||`Unable to inspect remote branch ${ae}/${t}`):c("Checked remote branch",n.stdout.trim().length>0)},ur=async({repoRoot:e,branch:t})=>{let n=await _e({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}`)},dr=e=>{try{return un.realpathSync.native(e)}catch{return lr.resolve(e)}},mr=async({repoRoot:e,worktreeRoot:t})=>{let n=await D({args:["worktree","list","--porcelain"],cwd:e});if(l(n))return s(n.message);let r=dr(t),o=n.value.stdout.split(`
|
|
12
|
+
`).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(dr).includes(r);return c("Checked worktree registration",o)},gn=async e=>{let t=await _e({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return c("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},Nt=async e=>{let t=await D({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return l(t)?s(t.message):c("Resolved current branch",t.value.stdout.trim())},pr=async e=>{let t=await D({args:["rev-parse","--short","HEAD"],cwd:e});return l(t)?s(t.message):c("Resolved short HEAD sha",t.value.stdout.trim())},gr=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),fn=async({cwd:e,branch:t})=>{let n=await xt({repoRoot:e,branch:t});if(l(n))return s(n.message);if(!n.value)return c("Remote branch missing, skipped pull",!1);let r=await H.fetch({cwd:e,remote:ae,branch:t});if(l(r))return s(`Failed to fetch ${t}
|
|
13
|
+
${r.message}`);let o=await H.pullRebase({cwd:e,remote:ae,branch:t});return l(o)?s(`Failed during pull --rebase
|
|
14
|
+
${o.message}`):c("Pulled with rebase",!0)},fr=async e=>{let t=await D({args:["status","--porcelain"],cwd:e});return l(t)?s(t.message):c("Checked state branch changes",t.value.stdout.trim().length>0)},vr=async e=>{let t=await Nt(e);return l(t)?s(t.message):c("Checked detached HEAD state",t.value==="HEAD")};var xr="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Nr=e=>de.join(Se,vt,e),zi=e=>Vi("sha1").update(de.resolve(e)).digest("hex").slice(0,12),Er=()=>de.join(ji.homedir(),ie),Ir=()=>de.join(Er(),"worktrees"),hr=e=>de.join(Ir(),zi(e)),Gi=e=>de.join(e,Se),ke=e=>de.join(Gi(e),vt),vn=({root:e,fileName:t})=>de.join(ke(e),t),et=e=>{try{return Qe.mkdirSync(e,{recursive:!0}),c("Ensured directory",void 0)}catch(t){return s(t instanceof Error?t.message:String(t))}},Cr=()=>{let e=et(Er());if(l(e))return s(`Ensure epiq home failed.
|
|
15
|
+
`+e.message);let t=et(Ir());return l(t)?s(`Ensure worktrees dir failed.
|
|
16
|
+
`+t.message):c("Ensured epiq storage",!0)},br=e=>{Qe.existsSync(e)&&(te.debug("[sync] remove path",e),Qe.rmSync(e,{recursive:!0,force:!0}))},Sr=e=>{let t=ke(e);if(!Qe.existsSync(t))return c("Events dir missing",[]);let n=Qe.readdirSync(t,{withFileTypes:!0}).filter(r=>r.isFile()).map(r=>r.name).filter(r=>r.endsWith(".jsonl")).sort();return c("Listed event files",n)},Rr=(e,t)=>{for(let n of[ke(e),ke(t)]){let r=et(n);if(l(r))return s(r.message)}return c("Ensured state branch",void 0)},Ar=async e=>{let t=await D({args:["ls-tree","--name-only","HEAD"],cwd:e});if(l(t))return s(`ensure state branch is storage only failed
|
|
19
17
|
`+t.message);let r=t.value.stdout.trim().split(`
|
|
20
|
-
`).filter(Boolean).filter(a=>a!==Se);if(r.length===0)return c("State branch is storage-only",!1);let o=await
|
|
21
|
-
${o.message}`);let
|
|
18
|
+
`).filter(Boolean).filter(a=>a!==Se);if(r.length===0)return c("State branch is storage-only",!1);let o=await D({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(l(o))return s(`Failed to clean storage branch
|
|
19
|
+
${o.message}`);let i=await yt({cwd:e,message:"[epiq:repair-storage-branch]"});return l(i)?s(i.message):c("Cleaned storage branch",!0)},Tr=an(async(e=process.cwd())=>{let t=await D({args:["rev-parse","--show-toplevel"],cwd:e});return l(t)?s("Not inside a Git repository"):c("Resolved repo root",t.value.stdout.trim())},e=>de.resolve(e)),yr=an(async e=>{let t=await D({args:["rev-parse","--git-dir"],cwd:e});if(l(t))return s(t.message);let n=t.value.stdout.trim(),r=de.isAbsolute(n)?n:de.join(e,n);return c("Resolved git dir",r)},e=>de.resolve(e));import Re from"node:fs";import tt from"node:path";var kr=async e=>{let t=tt.join(e,".gitignore"),n=Re.existsSync(t)?Re.readFileSync(t,"utf8"):"",r=".epiq";return n.split(`
|
|
22
20
|
`).some(d=>{let u=d.trim();return u===r||u===r+"/"})?c(`${r} already ignored`,!1):(n=n.trimEnd()+`
|
|
23
21
|
|
|
24
22
|
# [epiq]: hydrated state is never to be committed
|
|
25
23
|
${r}
|
|
26
24
|
`,Re.writeFileSync(t,n+`
|
|
27
|
-
`,"utf8"),te.info(`Added ${r} to .gitignore (epiq local cache)`),c(`${r} ignored`,!0))},
|
|
28
|
-
${t.message}`);let n=t.value.stdout.trim(),r=await
|
|
29
|
-
${r.message}`):c("Created state branch",!0)},
|
|
30
|
-
`+t.message);if(t.value)return c("Local state branch already exists",!1);let n=await
|
|
31
|
-
`+n.message);if(!n.value)return
|
|
32
|
-
`+r.message);if(!r.value)return
|
|
33
|
-
${o.message}`);let
|
|
34
|
-
${
|
|
35
|
-
`),o=null;for(let
|
|
36
|
-
`+n.message);Re.existsSync(t)&&!Re.existsSync(
|
|
37
|
-
${r.message}`):c("Created state branch worktree",!0)},
|
|
38
|
-
${d.message}`)}if(o&&!Re.existsSync(o)){te.info("Pruning stale state branch worktree");let d=await H.worktreePrune({cwd:e});if(l(d))return
|
|
39
|
-
${d.message}`)}let
|
|
40
|
-
${d.message}`)}return
|
|
41
|
-
${n.message}`):c("Checked out state branch",!0)},
|
|
42
|
-
${o.message}`);let
|
|
43
|
-
${
|
|
44
|
-
${n.message}`):c("Staged state branch own event file",void 0)},
|
|
45
|
-
`+n.message):
|
|
46
|
-
${n.message}`):c("Pushed state branch",!0)},
|
|
25
|
+
`,"utf8"),te.info(`Added ${r} to .gitignore (epiq local cache)`),c(`${r} ignored`,!0))},Pr=async e=>{if((await _e({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return c("Initial commit already exists",!1);te.info("Creating initial commit");let n=await H.commit({cwd:e,message:"Initial commit",allowEmpty:!0});return l(n)?s(n.message):c("Created initial commit",!0)},wr=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",qi=async e=>{let t=await Nt(e);if(l(t))return s(t.message);let n=await pr(e);if(l(n))return s(n.message);let r=`[epiq:sync:${wr(t.value)}:${wr(n.value)}]`;return c("Built sync commit message",r)},Mr=async e=>{te.info(`Creating ${O}`);let t=await D({args:["commit-tree",xr,"-m","[epiq:init-state-branch]"],cwd:e});if(l(t))return s(`Failed to create state branch commit
|
|
26
|
+
${t.message}`);let n=t.value.stdout.trim(),r=await D({args:["update-ref",`refs/heads/${O}`,n],cwd:e});return l(r)?s(`Failed to create ${O}
|
|
27
|
+
${r.message}`):c("Created state branch",!0)},Xi=async({repoRoot:e})=>{let t=await ur({repoRoot:e,branch:O});if(l(t))return s(`Ensure local state branch failed
|
|
28
|
+
`+t.message);if(t.value)return c("Local state branch already exists",!1);let n=await pn({repoRoot:e});if(l(n))return s(`Ensure local state branch failed
|
|
29
|
+
`+n.message);if(!n.value)return Mr(e);let r=await xt({repoRoot:e,branch:O});if(l(r))return s(`Ensure local state branch failed
|
|
30
|
+
`+r.message);if(!r.value)return Mr(e);let o=await H.fetch({cwd:e,remote:ae,branch:O});if(l(o))return s(`Failed to fetch ${O} from remote
|
|
31
|
+
${o.message}`);let i=await D({args:["branch","--track",O,`${ae}/${O}`],cwd:e});return l(i)?s(`Failed to create local ${O} from remote
|
|
32
|
+
${i.message}`):c("Created local state branch from remote",!0)},Yi=async({repoRoot:e,branch:t})=>{let n=await D({args:["worktree","list","--porcelain"],cwd:e});if(l(n))return s(n.message);let r=n.value.stdout.split(`
|
|
33
|
+
`),o=null;for(let i of r){if(i.startsWith("worktree ")){o=i.slice(9);continue}if(i===`branch refs/heads/${t}`&&o)return c("Found worktree for branch",o)}return c("No worktree found for branch",null)},Ji=async({repoRoot:e,stateBranchRoot:t})=>{let n=et(tt.dirname(t));if(l(n))return s(`Failed to create state branch worktree
|
|
34
|
+
`+n.message);Re.existsSync(t)&&!Re.existsSync(tt.join(t,".git"))&&(te.info("Removing broken state branch worktree path"),br(t)),te.info("Creating state branch worktree");let r=await H.worktreeAdd({cwd:e,worktreeRoot:t,branch:O});return l(r)?s(`Failed to create state branch worktree
|
|
35
|
+
${r.message}`):c("Created state branch worktree",!0)},Zi=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Yi({repoRoot:e,branch:O});if(l(n))return s(n.message);let r=tt.resolve(t),o=n.value?tt.resolve(n.value):null;if(o&&o===r&&Re.existsSync(o))return c("State branch already checked out in expected worktree",!1);if(o&&o!==r){te.info("Moving state branch worktree to expected location");let d=await H.worktreeRemove({cwd:e,worktreeRoot:o});if(l(d))return s(`Failed to remove existing state branch worktree
|
|
36
|
+
${d.message}`)}if(o&&!Re.existsSync(o)){te.info("Pruning stale state branch worktree");let d=await H.worktreePrune({cwd:e});if(l(d))return s(`Failed to prune stale worktrees
|
|
37
|
+
${d.message}`)}let i=await mr({repoRoot:e,worktreeRoot:t});if(l(i))return s(i.message);let a=Re.existsSync(t);if(i.value&&a)return c("State branch worktree already exists",!1);if(i.value&&!a){te.info("Pruning missing registered state branch worktree");let d=await H.worktreePrune({cwd:e});if(l(d))return s(`Failed to prune stale worktrees
|
|
38
|
+
${d.message}`)}return Ji({repoRoot:e,stateBranchRoot:t})},Qi=async e=>{let t=await Nt(e);if(l(t))return s(t.message);if(t.value===O)return c("State branch already checked out",!1);let n=await H.checkout({cwd:e,branch:O});return l(n)?s(`Failed to checkout ${O}
|
|
39
|
+
${n.message}`):c("Checked out state branch",!0)},es=async e=>{let t=await gn(e);if(l(t))return s(t.message);if(t.value)return c("State branch upstream already configured",!1);let n=await pn({repoRoot:e});if(l(n))return s(n.message);if(!n.value)return c("No remote available for state branch upstream",!1);let r=await xt({repoRoot:e,branch:O});if(l(r))return s(r.message);if(!r.value)return c("Remote state branch missing; upstream will be configured on first push",!1);te.info(`Configuring ${O} upstream`);let o=await H.fetch({cwd:e,remote:ae,branch:O});if(l(o))return s(`Failed to fetch ${O}
|
|
40
|
+
${o.message}`);let i=await H.setUpstream({cwd:e,branch:O,upstream:`${ae}/${O}`});return l(i)?s(`Failed to set state branch upstream
|
|
41
|
+
${i.message}`):c("Configured state branch upstream",!0)},Lr=async({stateBranchRoot:e,ownEventFileName:t})=>{let n=await H.stage({cwd:e,pathspec:Nr(t)});return l(n)?s(`Failed to stage state branch own event file
|
|
42
|
+
${n.message}`):c("Staged state branch own event file",void 0)},Dr=async({repoRoot:e,stateBranchRoot:t})=>{let n=await qi(e);return l(n)?s(`Create state branch sync commit failed
|
|
43
|
+
`+n.message):yt({cwd:t,message:n.value})},yn=async e=>{let t=await gn(e);if(l(t))return s(t.message);let n=t.value?await H.push({cwd:e}):await H.push({cwd:e,remote:ae,branch:O,setUpstream:!0});return l(n)?s(`Failed during state branch push
|
|
44
|
+
${n.message}`):c("Pushed state branch",!0)},Fr=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=[Cr(),await Xi({repoRoot:e}),await Zi({repoRoot:e,stateBranchRoot:t}),await Qi(t),await Ar(t),n?await es(t):c("Skipped state branch upstream bootstrap",!1)];for(let i of o){if(l(i))return s(i.message);r=r||!!i.value}return c(n?"Bootstrapped state storage":"Bootstrapped state storage (readonly)",r)};import Rt from"node:fs";import hn from"node:path";import{decodeTime as ys}from"ulid";import bt from"node:fs";import En from"node:path";import{decodeTime as ls}from"ulid";import{z as Nn}from"zod";import ts from"node:fs";import ns from"node:path";import{decodeTime as rs,monotonicFactory as os}from"ulid";import{z as nt}from"zod";var Et={autoSync:!1,preferredEditor:null,userName:null,userId:null},ge=()=>Et,It=e=>(Et={...Et,...e},Et);var Or=e=>({action:e.action,payload:e.payload});var Br=1,Ur=os(),is=nt.tuple([nt.string().min(1),nt.string().min(1).nullable()]),ss=nt.looseObject({v:nt.literal(Br),id:is}),xn=e=>{let t=ss.safeParse(e);return t.success?c("Parsed persisted event",t.data):s(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},ht=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",Y=()=>{let{userName:e,userId:t}=ge();return e?t?e.trim()?c("Successfully resolved actor ID",{userId:ht(t),userName:ht(e)}):s("Unable to resolve actor ID from settings or OS user info"):s("User ID not configured"):s("User name not configured")},rt=({userId:e,userName:t})=>`${ht(e)}.${ht(t)}.jsonl`,as=(e,{userId:t,userName:n})=>{let r=rt({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return s(`Invalid event log file name: ${r}`);let i=ns.join(Je(e),r);return c("Successfully resolved event log path",i)},ds=(e,t)=>{let n={[e.action]:e.payload,v:Br,id:t};return xn(n)};function Ct({event:e,rootDir:t=process.cwd()}){try{let n=se(t);if(l(n))return n;let r=rr(n.value);if(l(r))return r;let o=as(n.value,{userId:e.userId,userName:e.userName});if(l(o))return o;let i=_r(n.value);if(l(i))return s(i.message);let a=i.value?Ur(Math.max(Date.now(),rs(i.value)+1)):Ur(),d=ds(Or(e),[a,i.value]);return l(d)?s(d.message):(ts.appendFileSync(o.value,`${JSON.stringify(d.value)}
|
|
45
|
+
`,"utf8"),c("Event persisted",{path:o.value,entry:d.value}))}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return s(`Failed to persist event: ${r}`)}}var cs=Nn.object({userId:Nn.string().min(1).default("unknown"),userName:Nn.string().min(1).default("unknown")}),us=e=>{let[t,n]=En.basename(e,".jsonl").split("."),r=cs.safeParse({userId:t,userName:n});return r.success?c("Parsed event file actor",r.data):s(`Invalid event file name ${En.basename(e)}: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},ms=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?s(`Invalid persisted event: expected exactly 1 action key, 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])},ps=(e,t)=>t in e,gs=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),fs=e=>{let{userId:t,userName:n,...r}=e,o=ms(r);if(l(o))return s(o.message);let i=o.value,a=e.id?.[0];return a?ps(r,i)?c("Decoded persisted event",gs({id:a,action:i,payload:r[i],userId:t,userName:n})):s(`Persisted event is missing payload for action: ${i}`):s("Persisted event is missing id")},St=e=>{if(!bt.existsSync(e))return c("Event file missing",[]);let t=us(e);if(l(t))return s(t.message);let n=bt.readFileSync(e,"utf8"),r=[];for(let o of n.split(`
|
|
46
|
+
`)){let i=o.trim();if(!i)continue;let a;try{a=JSON.parse(i)}catch{return s(`Failed to parse event JSON from ${e}: ${i}`)}let d=xn(a);if(l(d))return s(`${d.message} in ${e}: ${i}`);r.push({...d.value,userId:t.value.userId,userName:t.value.userName})}return c("Parsed persisted events file",r)};function $r(e){let t=Je(e);if(!bt.existsSync(t))return s("No events found");let n=bt.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>En.join(t,o)),r=[];for(let o of n){let i=St(o);if(l(i))return s(i.message);r.push(...i.value)}return c("All events loaded",vs(r))}function ot(e){let t=$r(e);if(l(t))return s(t.message);let n=[];for(let r of t.value){let o=fs(r);if(l(o))return s(`Failed to decode event ${r.id?.[0]??"<unknown>"}: ${o.message}`);n.push(o.value)}return c("Loaded merged events",n)}function _r(e=process.cwd()){let t=$r(e);return l(t)?s(t.message):c("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var vs=e=>{let t=new Map;for(let d of e){let u=d.id[1]??null,m=t.get(u)??[];m.push(d),t.set(u,m)}for(let d of t.values())d.sort((u,m)=>u.id[0].localeCompare(m.id[0]));let n=[],r=new Set;a(t.get(null)??[]);let o=!0;for(;o;){o=!1;for(let d=0;d<n.length;d++){let u=n[d];if(!u)continue;let m=(t.get(u.id[0])??[]).filter(f=>!r.has(f.id[0]));if(m.length!==0){n.splice(d+1,0,...m);for(let f of m)r.add(f.id[0]);o=!0,d+=m.length}}}let i=e.filter(d=>!r.has(d.id[0])).sort((d,u)=>d.id[0].localeCompare(u.id[0]));return n.push(...i),n;function a(d){for(let u of d)r.has(u.id[0])||(n.push(u),r.add(u.id[0]))}},Wr=(e,t)=>{let n=e.findIndex(r=>{try{return ls(r.id)>t}catch{return!0}});return n===-1?{appliedEvents:e,unappliedEvents:[]}:{appliedEvents:e.slice(0,n),unappliedEvents:e.slice(n)}};var In=e=>{let[t,n]=e.id;return`${t}:${n??""}`},Hr=e=>{let[t]=e.id;return ys(t)},xs=e=>{let{userId:t,userName:n,...r}=e;return r},Ns=e=>e.length===0?"":e.map(t=>JSON.stringify(xs(t))).join(`
|
|
47
47
|
`)+`
|
|
48
|
-
`,la=(e,t)=>{let n=new Map;for(let r of[...t,...e])n.set(Ln(r),r);return[...n.values()].sort((r,o)=>{let s=Ao(r)-Ao(o);return s!==0?s:Ln(r).localeCompare(Ln(o))})},Fn=({sourceFile:e,targetFile:t})=>{let n=kt(e);if(l(n))return i(n.message);let r=kt(t);if(l(r))return i(r.message);let o=la(r.value,n.value),s=da(o);return($t.existsSync(t)?$t.readFileSync(t,"utf8"):"")===s?c("Event file already merged",!1):($t.mkdirSync(Dn.dirname(t),{recursive:!0}),$t.writeFileSync(t,s,"utf8"),c("Merged event file",!0))},To=({repoRoot:e,stateBranchRoot:t})=>{let n=vo(t);if(l(n))return i(n.message);let r=De(t),o=De(e),s=!1;for(let a of n.value){let d=Dn.join(r,a),u=Dn.join(o,a),m=Fn({sourceFile:d,targetFile:u});if(l(m))return i(m.message);s=s||m.value}return c("Hydrated event files from state branch",s)};var ua=({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{let r=Mn({root:e,fileName:n}),o=Mn({root:t,fileName:n});return ca.existsSync(r)?Fn({sourceFile:r,targetFile:o}):c("Local own event file missing, nothing to merge",!1)},ma=async({cwd:e,ensureUpstream:t})=>{let n=await No(e);if(l(n))return i(n.message);let r=n.value,o=po(r),s=await ho(r);if(l(s))return i("Sync aborted. Unable to gitignore hydrated events");let a=await Rn(r);if(l(a))return i(a.message);if(a.value)return i("Cannot sync while a git operation is in progress in the current repo");let d=await Co(r);if(l(d))return i(d.message);let u=await Ro({repoRoot:r,stateBranchRoot:o,ensureUpstream:t});if(l(u))return i(u.message);let m=await Rn(o);if(l(m))return i(m.message);if(m.value)return i("Cannot sync while a git operation is in progress in the state branch");let f=yo(r,o);return l(f)?i(f.message):c("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:o,bootstrapped:u.value})},wo=async({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{let r=ua({repoRoot:e,stateBranchRoot:t,ownEventFileName:n});if(l(r))return i(r.message);let o=await io(t);if(l(o))return i(o.message);if(!r.value&&!o.value)return c("Own event file already up to date in state branch",{createdCommit:!1});let s=await bo({stateBranchRoot:t,ownEventFileName:n});if(l(s))return i(s.message);let a=await So({repoRoot:e,stateBranchRoot:t});return l(a)?i(a.message):c("Merged, staged, and committed own event file",{createdCommit:!0,commitSha:a.value})},Wt=async({cwd:e=process.cwd(),ownEventFileName:t})=>{if(t.includes("/")||t.includes("\\"))return i("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return i("Own event file must end with .jsonl");let n=await ma({cwd:e,ensureUpstream:!0});if(l(n))return n;let{repoRoot:r,stateBranchRoot:o,bootstrapped:s}=n.value,a=await so(r);if(l(a))return i(a.message);if(a.value)return i("Cannot run :sync while the repository is in detached HEAD state");let d=!1,u,m=!1,f=!1,N=!1,E=await wn({cwd:o,branch:O});if(l(E))return i(E.message);m=E.value;let I=To({repoRoot:r,stateBranchRoot:o});if(l(I))return i(I.message);N=I.value;let R=await wo({repoRoot:r,stateBranchRoot:o,ownEventFileName:t});if(l(R))return i(R.message);if(d=R.value.createdCommit,u=R.value.commitSha,d||s){let A=await Pn(o),C=A;if(l(A)&&oo(A.message)){let P=await wn({cwd:o,branch:O});if(l(P))return i(P.message);let z=await wo({repoRoot:r,stateBranchRoot:o,ownEventFileName:t});if(l(z))return i(z.message);z.value.createdCommit&&(d=!0,u=z.value.commitSha),C=await Pn(o)}if(l(C))return i(C.message);f=C.value,logger.debug("[sync] pushed to state branch",f)}else logger.debug("[sync] no commit created, skipped push");if(d){let A=await F({args:["rev-parse","HEAD"],cwd:o});if(l(A))return i(A.message);u=A.value.stdout.trim()}return c("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:o,createdCommit:d,commitSha:u,pulled:m,pushed:f,hydrated:N,bootstrapped:s})};import{ulid as Mo}from"ulid";var Ge=null,Ae=()=>structuredClone(Ge),qe=e=>Ge=e,Po=()=>{let{currentNode:e,selectedIndex:t}=v(),r=b(e.id)[t];return r?c("Resolved selected child",r):i("Target node not found")};function kn(e){let t=Po();if(l(t))return t;let{currentNode:n,nodes:r}=v();if(!n.parentNodeId)return i("Missing parent node id");let o=r[n.parentNodeId];if(!o)return i("Missing parent node");let s=G(o.id),a=s.findIndex(({id:E})=>E===n.id);if(a<0)return i("Current node not found among siblings");let d=s[a+e];if(!d)return i("Missing sibling node");let u=V();if(l(u))return i("Unable to resolve user ID");let{userId:m,userName:f}=u.value;if(qe({id:Mo(),userId:m,userName:f,action:"move.node",payload:{id:t.value.id,parent:d.id,pos:{at:"end"}}}),!Ge)return i("Could not materialize move state");let N=Ve(Ge,!0);return l(N)?N:c("Node moved successfully",N.value)}function On(e){let t=Po();if(l(t))return t;let{currentNode:n,selectedIndex:r}=v(),s=G(n.id)[r+e];if(!s)return i("Missing sibling node");let a=V();if(l(a))return i("Unable to resolve user ID");let{userId:d,userName:u}=a.value;if(qe({id:Mo(),userId:d,userName:u,action:"move.node",payload:{id:t.value.id,parent:n.id,pos:{at:e===1?"after":"before",sibling:s.id}}}),!Ge)return i("Could not materialize move state");let m=Ve(Ge,!0);return l(m)?m:c("Node moved successfully",m.value)}import pa from"node:os";import Lo from"node:path";import{z as ut}from"zod";var ga={userId:"",userName:"",preferredEditor:"",autoSync:!1},Do=ut.object({preferredEditor:ut.string().optional(),userName:ut.string().optional(),userId:ut.string().optional(),autoSync:ut.boolean().optional()}).strict(),fa="config.json",Fo=()=>Lo.join(pa.homedir(),ne),Un=()=>Lo.join(Fo(),fa),Bn=()=>{try{return ee.mkDir(Fo()),c(`Ensured ~/${ne} exists`,null)}catch{return i(`Unable to create ~/${ne}`)}},va=e=>{let t;try{t=JSON.parse(e)}catch{return i(`Invalid ~/${ne}/config.json JSON`)}let n=Do.safeParse(t??{});return n.success?c("Parsed config",n.data):i(`Invalid ~/${ne}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},ko=()=>{let e=Bn();if(l(e))return i(e.message);let t=Un(),n=ee.readFile(t);return n==null||n.trim()===""?c("No config found, using empty config",{autoSync:!1,preferredEditor:"",userId:"",userName:""}):va(n)},Oo=e=>{let t=Bn();if(l(t))return i(t.message);let n=Do.safeParse(e);if(!n.success)return i(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=Un();try{return ee.writeToFile(r,JSON.stringify(n.data,null,2)+`
|
|
49
|
-
`),c("Config written",null)}catch{return i(`Unable to write ~/${ne}/config.json`)}},Ht=e=>{let t=ko();if(l(t))return i("Failed to read existing config");let n={...t.value,...e};return Oo(n)},Uo=()=>{let e=Un(),t=Bn();if(l(t))return i(`Unable to create ~/${ne}`);if(!(ee.readFile(e)!==null)){let u=Oo(ga);if(l(u))throw new Error(`Unable to create ~/${ne}/config.json`)}let r=ko();if(l(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:s,userId:a,autoSync:d}=r.value;return!s||!a?i(`User name or ID not configured in ~/${ne}/config.json`):c("successfully loaded settings",{preferredEditor:o??"",userName:s,userId:a,autoSync:d??!1})};var _o=()=>{let{currentNode:e,selectedIndex:t}=v(),n=b(e.id)[t];return{currentNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:n?.parentNodeId??null,selectedIndex:t}},Bo=(e,t)=>Math.max(0,Math.min(e,Math.max(0,t-1))),$o=e=>{let{nodes:t}=v(),n=t[e.currentNodeId];if(n&&!n.isDeleted&&e.selectedNodeId){let s=b(n.id).findIndex(a=>a.id===e.selectedNodeId);if(s>=0)return k.navigate({currentNode:n,selectedIndex:s}),c("Restored navigation",null)}if(e.selectedNodeId){let o=t[e.selectedNodeId];if(o&&!o.isDeleted&&o.parentNodeId){let s=t[o.parentNodeId];if(s&&!s.isDeleted){let a=b(s.id).findIndex(d=>d.id===o.id);if(a>=0)return k.navigate({currentNode:s,selectedIndex:a}),c("Restored navigation to moved node",null)}}}if(n&&!n.isDeleted){let o=b(n.id);return k.navigate({currentNode:n,selectedIndex:Bo(e.selectedIndex,o.length)}),c("Restored navigation to previous container",null)}if(e.parentNodeId){let o=t[e.parentNodeId];if(o&&!o.isDeleted){let s=b(o.id);return k.navigate({currentNode:o,selectedIndex:Bo(e.selectedIndex,s.length)}),c("Restored navigation to parent",null)}}let r=t[v().rootNodeId];return!r||r.isDeleted?i("Unable to restore navigation"):(k.navigate({currentNode:r,selectedIndex:0}),c("Restored navigation to root",null))};import ti from"node:fs";import Va from"node:path";import ja from"react";import{Box as Ha}from"ink";import Yt from"react";import{Box as Wn,Text as Ta}from"ink";import me from"react";import{Text as Wo}from"ink";import Ho,{useEffect as Ko,useState as ya}from"react";var Vo={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"command-line":["\u276F "]},se=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=ue(),r=Vo[n]??Vo.default,[o,s]=ya(0);if(Ko(()=>{s(0)},[r]),Ko(()=>{if(!e)return;let d=setInterval(()=>{s(u=>(u+1)%r.length)},500);return()=>clearInterval(d)},[e,r]),!e)return Ho.createElement(Wo,null,t);let a=r[o]??r[0]??t;return Ho.createElement(Wo,{color:w.accent,dimColor:o===1},a)};import{Box as _n,Text as xa}from"ink";import Kt from"react";var Vt=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,scrollByOne:o=!1})=>{if(e.length===0)return null;let s=Math.max(1,Math.floor(t)),a=Math.max(1,Math.ceil(r)),d=Math.max(1,Math.floor(s/a)),u=Math.max(0,Math.min(n,e.length-1)),m=Math.max(0,e.length-d),f=o?Math.min(m,Math.max(0,u-d+1)):Math.min(m,Math.floor(u/d)*d),N=f+d,E=e.slice(f,N),I=e.length>d,R=s,A=I?Math.max(1,Math.floor(d/e.length*R)):R,C=Math.max(0,R-A),P=Math.max(1,e.length-d),z=I?Math.floor(f/P*C):0;return Kt.createElement(_n,{flexDirection:"row",height:s,width:"100%"},Kt.createElement(_n,{flexDirection:"column",flexGrow:1,height:s},E),Kt.createElement(_n,{flexDirection:"column",width:1,height:R},Array.from({length:R}).map((Jn,Ye)=>Kt.createElement(xa,{key:Ye,color:I&&Ye>=z&&Ye<z+A?w.accent:w.secondary},I?"\u2502":" "))))};import{Box as Gt,Text as Sa}from"ink";import Fe from"react";import{Text as Na}from"ink";import Ea from"react";var Ia=e=>e.toLowerCase().trim(),ha=(e,t=_e)=>{let n=Ia(e);return t[n]?t[n]:Qe(n)},jt=({id:e,isSelected:t})=>{let n=x.getContributor(e);if(n)return Ea.createElement(Na,{underline:t,color:ha(n.name)},"@"+n.name)};import{Text as Ca}from"ink";import ba from"react";var zt=({id:e,isSelected:t})=>{let n=x.getTag(e);if(n)return ba.createElement(Ca,{underline:t,backgroundColor:J(n.name),color:w.primary}," "+n.name+" ")};var jo=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=Nt(Oe(t.title),r),s=sn(t),a=an(t);return Fe.createElement(Gt,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?w.accent:w.secondary,justifyContent:"space-between"},Fe.createElement(Gt,{borderBottom:!0},Fe.createElement(Gt,{paddingLeft:1,flexDirection:"column"},Fe.createElement(Sa,{color:w.primary},o))),Fe.createElement(Gt,{flexDirection:"row",paddingLeft:1},s.map(d=>Fe.createElement(zt,{key:d.id,id:d.id})),a.map(d=>Fe.createElement(jt,{key:d.id,id:d.id}))))};import Ra from"chalk";import{Box as mt,Text as $n}from"ink";import ye from"react";var Aa=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,zo=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let s=b(t.id),a=A=>{let C=s.find(P=>P.title===A);return C?b(C.id).map(P=>typeof P.props?.value=="string"?P.props.value:"").filter(P=>!!P):[]},d=a("Tags").map(A=>x.getTag(A)).filter(A=>!!A),u=a("Assignees").map(A=>x.getContributor(A)).filter(A=>!!A),m=1,f=d.length*(1+m),N=u.length*(2+m),E=d.map(A=>ye.createElement(mt,{key:A.id,paddingRight:m},ye.createElement($n,{color:J(A.name)},"\u25A0"))),I=u.map(A=>ye.createElement(mt,{key:A.id,paddingRight:m},ye.createElement($n,{color:Qe(A.name)},"@"+A.name.at(0)))),R=n?w.accent:o===g.MOVE?w.secondary:w.primary;return ye.createElement(mt,{borderBottom:!0,justifyContent:"space-between"},ye.createElement(mt,null,ye.createElement(se,{isSelected:n,placeholder:Ra.dim.gray(r+1+" ")}),ye.createElement($n,{wrap:"truncate",color:R},Aa(t.title,e-f-N-14))),ye.createElement(mt,null,E,I))};var wa=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:s,listSelectedIndex:a,mode:d})=>{let{renderedChildrenIndex:u}=ue(),m=u[e.id]??[],f=`${e.title} (${m.length})`,N=3,E=o?1:4,I=r-N-(o?2:1),R=me.createElement(Wn,{borderStyle:"round",borderColor:w.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},me.createElement(se,{isSelected:t}),me.createElement(Ta,{bold:!0,color:t?w.accent:w.primary},f," ",e.readonly?"\u{1F512}":"")),A=(C,P)=>{let z=s&&a===P;return o?me.createElement(zo,{key:C.id,index:P,width:n,ticket:C,isSelected:z,mode:d}):me.createElement(jo,{key:C.id,width:n,ticket:C,isSelected:z})};return me.createElement(Wn,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?w.accent:w.secondary,paddingRight:1,paddingLeft:1,height:r},R,me.createElement(Wn,{padding:o?1:0},m.length>0&&me.createElement(Vt,{selectedIndex:a,height:I,itemHeight:E},m.map(A)),me.createElement(se,{isSelected:s&&a===-1})))},Go=me.memo(wa);import{Box as Vn,Text as $a}from"ink";import Te,{useEffect as jn,useMemo as Jo}from"react";import ce from"chalk";import qo from"string-width";import{decodeTime as Ma}from"ulid";var Pa=(e,t)=>e+" ".repeat(Math.max(0,t-qo(e))),La=(e,t)=>" ".repeat(Math.max(0,t-qo(e)))+e,Da=e=>(()=>{let n={"add.issue":"Created with title","assign.issue":"Assigned to","unassign.issue":"Unassigned from","close.issue":"Closed","delete.node":"Deleted","edit.title":"Changed title to","edit.description":"Changed description","reopen.issue":"Reopened","tag.issue":"Tagged with","untag.issue":"Removed tag","lock.node":"Locked node","move.node":"Moved issue"};return(o=>n[o]??(o.endsWith("e")?`${o}d`:`${o}ed`))(e)})(),Fa=e=>{switch(e.action){case"move.node":{let t=x.getNode(e.payload.parent),n=t?ce.dim.bgBlack(` ${t.title} `):"unknown",r=e.payload.pos;if(!r)return`to ${n}`;switch(r.at){case"start":return`to ${n} ${ce.dim("(to top of list)")}`;case"end":return`to ${n} ${ce.dim("(to bottom of list)")}`;case"before":return`to ${n} ${ce.dim("(up in list)")}`;case"after":return`to ${n} ${ce.dim("(down in list)")}`}}case"tag.issue":{let t=v().tags[e.payload.tagId];return t?ce.bgHex(J(t.name))(` ${t.name} `):"unknown tag"}case"untag.issue":{let t=v().tags[e.payload.tagId];return t?ce.bgHex(J(t.name))(` ${t.name} `):"unknown tag"}case"assign.issue":{let t=v().contributors[e.payload.contributor];return t?ce.hex(J(t.name))(` ${t.name} `):"unknown user"}case"unassign.issue":{let t=v().contributors[e.payload.contributor];return t?ce.hex(J(t.name))(` ${t.name} `):"unknown user"}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"create.contributor":case"edit.title":return`"${"name"in e.payload?e.payload.name:""}"`;default:return""}},ka=e=>{let t=vr(Ma(e));return ce.gray(La(t,8))},Oa=12,Ua=e=>Pa(`${e}`,Oa),Xo=e=>{let t=ka(e.id),n=Ua(e.userName),r=Da(e.action),o=Fa(e),s=ce.dim("\u203A"),a=[r,o].filter(Boolean).join(" ");return`${n} ${t} ${s} ${a}`};import{Box as qt,Text as Ba}from"ink";import xe from"react";var Yo=({selectedIndex:e,parent:t,selected:n})=>{let{currentNode:r}=ue(),{title:o}=t,s=b(t.id).map(a=>{let d=typeof a.props?.value=="string"?a.props.value:"";if(o==="Assignees")return x.getContributor(d)?.id;if(o==="Tags")return x.getTag(d)?.id}).filter(a=>!!a);return xe.createElement(qt,{alignItems:"center",paddingTop:1},xe.createElement(qt,{minWidth:12},xe.createElement(se,{isSelected:n}),xe.createElement(Ba,{color:n?w.accent:w.secondary2},o,":")),xe.createElement(qt,{flexDirection:"row",marginLeft:1,paddingRight:1},s.map((a,d)=>{let u=r.id===t.id&&d===e;return xe.createElement(qt,{key:`${o}-${a}`,paddingRight:2,minHeight:1},xe.createElement(se,{isSelected:u}),o==="Assignees"?xe.createElement(jt,{isSelected:u,id:a}):o==="Tags"?xe.createElement(zt,{isSelected:u,id:a}):null)})))};import{Box as Xt,Text as Hn}from"ink";import Ne,{useEffect as _a}from"react";var Kn=({id:e,label:t,text:n,height:r,selected:o,maxWidth:s})=>{let{selectedIndex:a,currentNode:d}=ue(),u=E=>String(E).replace(/\r?\n/g,""),m=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];_a(()=>{let E=[];return m.forEach((I,R)=>{let A=Y.text({id:`${R}`,name:`Line ${R+1}`,parentNodeId:e,props:{value:I},readonly:!0}),C=x.createNodeAtPosition(A);Zn(C)&&E.push(C.value.id)}),()=>E.forEach(x.deleteNode)},[e,n]);let f="\u2029",N=m.map((E,I)=>{let R=d.id===e&&a===I;return Ne.createElement(Xt,{key:`${e}-${I}`},Ne.createElement(Hn,{color:R?w.primary:w.secondary2,dimColor:!R},`${I+1} `.padStart(5,"\xA0")),Ne.createElement(Hn,{backgroundColor:R?"gray":""},u(E.length?Nt(E,s-10):f)))});return Ne.createElement(Xt,{flexDirection:"column",paddingTop:1},Ne.createElement(Xt,null,Ne.createElement(se,{isSelected:o}),Ne.createElement(Hn,{color:o?w.accent:w.secondary2},t)),Ne.createElement(Xt,{flexDirection:"row",borderStyle:"round",borderColor:w.secondary,paddingLeft:1,paddingRight:1,marginLeft:1},Ne.createElement(Vt,{scrollByOne:!0,children:N,height:r-2,selectedIndex:a,itemHeight:1})))};var Wa=e=>`${e}::log`,Zo=e=>e==="Assignees"||e==="Tags",Qo=({ticket:e,height:t})=>{let{selectedIndex:n,currentNode:r}=ue(),o=process.stdout.columns||120,s=Jo(()=>Wa(e.id),[e.id]),a=Jo(()=>[...e.log].reverse().map(Xo).join(`
|
|
50
|
-
`),[e.log]);jn(()=>{if(x.getNode(s))return;let P={...Y.field(s,"Log",e.id,{value:a}),readonly:!0,childRenderAxis:"vertical"};return x.createNodeAtPosition(P),()=>{x.deleteNode(s)}},[s,e.id,a]),jn(()=>{let C=x.getNode(s);C&&C.props.value!==a&&x.updateNode({...C,props:{...C.props,value:a},childRenderAxis:"vertical",readonly:!0})},[s,a]);let d=r.id===e.id,u=r.id===s||r.parentNodeId===s;jn(()=>{u&&(n>=0||k.navigate({selectedIndex:0}))},[u,n]);let m=b(e.id);if(u){let C=x.getNode(s),z=t-3;return Te.createElement(Vn,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},C?Te.createElement(Kn,{id:C.id,label:"Event log",text:C.props.value??"",selected:!1,maxWidth:o,height:z}):null)}let f=m.reduce((C,P)=>Zo(P.title)||P.id===s?C+1:C,0),N=2,E=f*1,R=t-3-E-N,A=(C,P)=>Zo(C.title)?Te.createElement(Yo,{key:C.id,parent:C,selected:P,selectedIndex:n}):C.id===s?Te.createElement(Vn,{key:C.id,paddingTop:1},Te.createElement(se,{isSelected:P}),Te.createElement($a,{backgroundColor:w.secondary,color:P?w.accent:w.primary}," History \u203A\u203A ")):C.title==="Description"?Te.createElement(Kn,{label:"Description (press e to edit)",key:C.id,id:C.id,text:C.props.value??"",selected:P,maxWidth:o,height:R}):null;return Te.createElement(Vn,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},m.map((C,P)=>A(C,d&&n===P)))};var Ka=({swimlanes:e,currentNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:s,height:a,width:d})=>{let u=t.context,m=u===M.TICKET||u===M.FIELD_LIST||u===M.FIELD,f=u===M.BOARD||u===M.SWIMLANE,N=u===M.TICKET?t:r.find(C=>C.context===M.TICKET),E=Math.floor(d/3),I=Math.floor(d/Math.max(e.length,1)),R=Math.min(I,E),A=s==="dense";return Yt.createElement(Ha,{flexDirection:"row",height:a},f&&e.map((C,P)=>{let z=t.id===C.id,Jn=z?n:-1,Ye=t.context===M.BOARD&&n===P;return Yt.createElement(Go,{key:C.id,height:a,width:R,swimlane:C,isSelected:Ye,isDense:A,isFocused:z,listSelectedIndex:Jn,mode:o})}),m&&N&&Yt.createElement(Qo,{height:a,ticket:N}))},ei=Yt.memo(Ka);import{render as za}from"ink";import{Writable as Ga}from"node:stream";var pt=e=>String(e).padStart(2,"0"),qa=e=>{let t=e.getUTCFullYear(),n=pt(e.getUTCMonth()+1),r=pt(e.getUTCDate()),o=pt(e.getUTCHours()),s=pt(e.getUTCMinutes()),a=pt(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${s}-${a}`},Xa=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",Ya=async(e,{width:t,height:n})=>{let r="",o=new Ga({write(a,d,u){let m=Ja(a.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let s=za(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(a=>setTimeout(a,0)),s.unmount(),r},Ja=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),ni=async()=>{let{currentNode:e,selectedIndex:t,breadCrumb:n,viewMode:r,mode:o,renderedChildrenIndex:s}=v(),a=n.find(P=>P.context==="BOARD");if(!a)return i("No board found to export");let d=120,u=40,m=await Ya(ja.createElement(ei,{height:u,width:d,swimlanes:(s[a.id]??[]).filter(P=>P!==void 0&&Qn(P)),currentNode:e,selectedIndex:t,breadCrumb:n,viewMode:r,mode:o}),{width:d,height:u});if(!m)return i("Failed to render board export");let f=re(process.cwd());if(l(f))return i("Unable to export, epiq root not found");let N=new Date,E=qa(N),I=`board_${Xa(a.title)}_${E}.md`,R=_r(f.value);ti.mkdirSync(R,{recursive:!0});let A=Va.join(R,I),C=`# Board - ${a.title}
|
|
51
|
-
Date: ${N.toISOString()}
|
|
52
|
-
|
|
53
|
-
\`\`\`text
|
|
54
|
-
${m}
|
|
55
|
-
\`\`\`
|
|
56
|
-
`;return ti.writeFileSync(A,C,"utf8"),c("Exported board layout",A)};var ri=e=>Object.values(v().tags).find(t=>t.name===e),oi=e=>Object.values(v().contributors).find(t=>t.name===e),ii=[{systemOnly:!0,intent:S.Move,mode:g.COMMAND_LINE,action:()=>{let e=V();if(l(e))return i("Unable to resolve user ID");let{modifier:t}=Q().commandMeta,n=()=>{let d=Ae();if(!d)return i("No pending move state");let u=d.payload.id;if(!v().nodes[u])return i("Moved node not found");let f=d.payload.parent,N=v().nodes[f];if(!N)return i("Move parent not found");let E=b(f).findIndex(I=>I.id===u);return E===-1?i("Moved node not found among rendered children"):(k.navigate({currentNode:N,selectedIndex:E}),c("Synchronized navigation to moved node",null))},r=d=>{if(l(d))return i(d.message);let u=n();return l(u)?i(u.message):c("Updated move preview",null)},{currentNode:o,selectedIndex:s}=v(),a=b(o.id)[s];if(!a)return h({mode:g.DEFAULT}),i("No move target");if(t==="start"){if(a.readonly)return i("Target node is read-only");if(s===-1)return i("No item selected");if(!a.parentNodeId)return i("Target has no parent");let d=b(a.parentNodeId),u=d.findIndex(({id:I})=>I===a.id);if(u===-1)return i("Target not found among siblings");let m=d[u-1],f=d[u+1],N=f!=null?{at:"before",sibling:f.id}:m!=null?{at:"after",sibling:m.id}:{at:"start"};qe({id:B(),action:"move.node",payload:{id:a.id,parent:a.parentNodeId,pos:N},...e.value}),h({mode:g.MOVE});let E=n();return l(E)?i(E.message):c("Move initialized",null)}if(t==="next")return h({mode:g.MOVE}),r(On(1));if(t==="previous")return h({mode:g.MOVE}),r(On(-1));if(t==="to-next")return h({mode:g.MOVE}),r(kn(1));if(t==="to-previous")return h({mode:g.MOVE}),r(kn(-1));if(t==="confirm"){h({mode:g.DEFAULT});let d=Ae();if(!d)return i("No pending move to confirm");let u=j(d);if(l(u))return u;let m=n();return l(m)?i(m.message):(qe(null),c("Moved item",null))}return t==="cancel"?(qe(null),h({mode:g.DEFAULT}),c("Cancelling move",null)):i("Invalid move modifier")}},{intent:S.Delete,mode:g.COMMAND_LINE,action:()=>{let e=V();if(l(e))return i("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=v(),r=b(t.id)[n];return r?j({id:B(),action:"delete.node",payload:{id:r.id},...e.value}):i("Unable to resolve child to delete")},onSuccess:()=>h({mode:g.DEFAULT})},{intent:S.Edit,mode:g.COMMAND_LINE,action:()=>{let e=V();if(l(e))return i("Unable to resolve user ID");let t=Pe(v().breadCrumb,"TICKET");if(l(t))return i("Edit target must be an issue");let n=t.value;if(n.readonly)return i("Cannot edit readonly field");let{currentNode:r,selectedIndex:o}=v();if(!b(n.id)[o])return i("No selected field");let a=b(r.id)[o];if(!a)return i("No selected field");if(a.readonly)return i("Cannot edit readonly field");let d=a.props.value;if(typeof d!="string")return i("Selected field is not editable text");let u=Br(d);if(l(u))return i("Failed to edit field");let m=u.value;return m===d?c("No changes made",null):a.title==="Description"?j({id:B(),action:"edit.description",payload:{id:a.id,md:m},...e.value}):a.title==="Title"?j({id:B(),action:"edit.title",payload:{id:a.id,name:m},...e.value}):i(`Editing not supported for "${a.title}"`)},onSuccess:()=>h({mode:g.DEFAULT})},{intent:S.Filter,mode:g.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=Q().commandMeta,n=/(!=|=)/,[r,o]=e.split(n);if(!r||!(d=>W(p.FILTER).map(u=>u.split(n)[0]).includes(d))(r))return i("Invalid filter modifier");let a={target:r,operator:"=",value:t.trim()};return Z(d=>({...d,filters:e==="clear"?[]:[...d.filters,a],mode:g.DEFAULT})),c("Viewing help",null)}},{intent:S.ViewHelp,mode:g.COMMAND_LINE,action:()=>(h({mode:g.HELP}),c("Viewing help",null))},{intent:S.CloseIssue,mode:g.COMMAND_LINE,action:()=>{let e=V();if(l(e))return i("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=v(),r=b(t.id)[n];if(!r)return i("Unable to close issue, no target found");if(!r.parentNodeId)return i("No target parent found");if(!X(r))return i("Cannot close in this context");let o=j({id:B(),action:"close.issue",payload:{id:r.id,parent:r.parentNodeId},...e.value});return l(o)?o:c("Viewing help",null)}},{intent:S.ReopenIssue,mode:g.COMMAND_LINE,action:()=>{let e=V();if(l(e))return i("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=v(),r=b(t.id)[n];if(!r)return i("Unable to reopen issue, no target found");let o=r.context==="TICKET"?c("Resolved ticket",r):Be(r.id,"TICKET");if(l(o))return i("Cannot reopen in this context");let s=o.value,a=j({id:B(),action:"reopen.issue",payload:{id:s.id},...e.value});return l(a)?a:c("Issue reopened",null)},onSuccess:()=>h({mode:g.DEFAULT})},{intent:S.SetUserName,mode:g.COMMAND_LINE,action:()=>{let{userId:e,preferredEditor:t,userName:n}=ge(),r=wt()?.trim();if(!r)return i("No username provided");let o=r??n,s=e??B();if(!o||!s)return i("Unable to resolve user name or id");let a=Ht({userName:o,userId:s,preferredEditor:t??""});return l(a)?a:(Ct({userName:o,userId:s}),h({mode:g.DEFAULT}),c(`Username set to "${r}"`,null))}},{intent:S.Init,mode:g.COMMAND_LINE,action:()=>{let e=Gn();if(l(e))return e;let{rootNodeId:t,nodes:n}=v();return k.navigate({currentNode:n[t],selectedIndex:0}),h({mode:g.DEFAULT}),c("Project initialized",null)}},{intent:S.SetEditor,mode:g.COMMAND_LINE,action:()=>{let e=wt()?.trim();if(!e)return i("No editor provided");let t=Ht({preferredEditor:e});return l(t)?t:(Ct({preferredEditor:e}),h({mode:g.DEFAULT}),c(`Editor configuration set to "${e}"`,null))}},{intent:S.SetAutoSync,mode:g.COMMAND_LINE,action:()=>{let e=Q().commandMeta.modifier;if(e!=="true"&&e!=="false")return i("Invalid response");let t=e.toLowerCase()==="true",n=Ht({autoSync:t});return l(n)?n:(Ct({autoSync:t}),h({mode:g.DEFAULT}),c(`Auto synchronization set to "${t}"`,null))}},{intent:S.NewItem,mode:g.COMMAND_LINE,action:(e,t)=>{let n=V();if(l(n))return i("Unable to resolve user ID");if(!t.inputString)return i(`provide a name for your ${t.modifier}`);let{breadCrumb:r,currentNode:o,selectedIndex:s}=v(),a=d=>{let u=j(d);if(l(u))return u;let m=x.getNode(u.value.result.id);if(!m)return i("Created node not found");if(!m.parentNodeId)return u;let f=x.getNode(m.parentNodeId);return f?(k.navigate({currentNode:f,selectedIndex:x.getSiblings(m.parentNodeId).findIndex(({id:N})=>N===m.id)}),u):i("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:d}=v(),u=x.getNode(d);return u?a({id:B(),action:"add.board",payload:{id:B(),name:t.inputString,parent:u.id},...n.value}):i("Workspace not found")}if(t.modifier==="swimlane"){let d=Pe(r,"BOARD");return l(d)?i("Unable to add swimlane in this context"):a({id:B(),action:"add.swimlane",payload:{id:B(),name:t.inputString,parent:d.value.id},...n.value})}if(t.modifier==="issue"){let d=b(o.id)[s],u=o.context==="SWIMLANE"?o:o.context==="BOARD"&&d?.context==="SWIMLANE"?d:(()=>{let I=Pe(r,"SWIMLANE");return l(I)?null:I.value})();if(!u)return i("Unable to add issue in this context");let m=yt({name:t.inputString,parent:u.id,user:n.value}),f=je(m);if(f.some(I=>l(I)))return i("Issue create failed: "+f.filter(l).map(I=>I.message).filter(Boolean).join(", "));let N=f[0];if(!N||l(N))return i("Issue creation failed");let E=m[0]?.payload.id;return E?(k.navigate({currentNode:u,selectedIndex:x.getSiblings(u.id).findIndex(({id:I})=>I===E)}),c("Issue created",null)):i("Unable to determine ticket id")}return c("Success",null)},onSuccess:()=>h({mode:g.DEFAULT})},{intent:S.SetView,mode:g.COMMAND_LINE,action:()=>{let{commandMeta:e}=Q();return e.validity===fe.Invalid?i("Invalid command "+pe):(Z(t=>({...t,viewMode:e.modifier==="wide"?"wide":e.modifier==="dense"?"dense":t.viewMode})),c("View set",null))},onSuccess:()=>h({mode:g.DEFAULT})},{intent:S.Rename,mode:g.COMMAND_LINE,action:()=>{let e=V();if(l(e))return i("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=v(),r=b(t.id)[n];if(!r)return i("Missing node");if(r.readonly)return i("Cannot rename readonly node");let o=wt();return o?j({id:B(),action:"edit.title",payload:{id:r.id,name:o},...e.value}):i("Provide a new name")},onSuccess:()=>h({mode:g.DEFAULT})},{intent:S.UntagTicket,mode:g.COMMAND_LINE,action:()=>{let e=V();if(l(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=Q().commandMeta,r=(t||n).trim();if(!r)return i("Provide a tag");let o=ri(r);if(!o)return i(`Tag "${r}" does not exist`);let{selectedNode:s}=v();if(!s)return i("Invalid untag target");let a=Be(s.id,"TICKET");if(l(a))return i("Unable to untag issue in this context");let d=a.value,u=x.getFieldByTitle(d.id,"Tags");if(!u)return i("Unable to locate tags field");let m=b(u.id).find(f=>f.props?.value===o.id);return m?j({id:B(),action:"untag.issue",payload:{id:m.id,target:d.id,tagId:o.id},...e.value}):i("Issue is not tagged with that tag")},onSuccess:()=>h({mode:g.DEFAULT})},{intent:S.TagTicket,mode:g.COMMAND_LINE,action:()=>{let e=V();if(l(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=Q().commandMeta,r=(t||n).trim();if(!r)return i("Provide a tag");let{selectedIndex:o,currentNode:s}=v(),a=b(s.id)[o];if(!a)return i("Invalid tag target");let d=Be(a.id,"TICKET");if(l(d))return i("Unable to tag issue in this context");let u=d.value,m=ri(r),f;if(m)f=m.id;else{let I=B(),R=j({id:B(),action:"create.tag",payload:{id:I,name:r},userId:e.value.userId,userName:e.value.userName});if(l(R))return R;f=R.value.result.id}let N=x.getFieldByTitle(u.id,"Tags");return N?b(N.id).some(I=>I.props?.value===f)?i("Already tagged with that tag"):j({id:B(),action:"tag.issue",payload:{id:B(),target:u.id,tagId:f},...e.value}):i("Unable to locate tags field")},onSuccess:()=>h({mode:g.DEFAULT})},{intent:S.AssignUserToTicket,mode:g.COMMAND_LINE,action:()=>{let e=V();if(l(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=Q().commandMeta,r=(t||n).trim();if(!r)return i("Provide an assignee");let{selectedIndex:o,currentNode:s}=v(),a=b(s.id)[o];if(!a)return i("Invalid assign target");let d=Be(a.id,"TICKET");if(l(d))return i("Unable to assign issue in this context");let u=d.value,m=oi(r),f;if(m)f=m.id;else{let I=B(),R=j({id:B(),action:"create.contributor",payload:{id:I,name:r},userId:e.value.userId,userName:e.value.userName});if(l(R))return R;f=R.value.result.id}let N=x.getFieldByTitle(u.id,"Assignees");return N?b(N.id).some(I=>I.props?.value===f)?i("Assignee already assigned"):j({id:B(),action:"assign.issue",payload:{id:B(),target:u.id,contributor:f},...e.value}):i("Unable to locate assignees field")},onSuccess:()=>h({mode:g.DEFAULT})},{intent:S.UnassignUserFromTicket,mode:g.COMMAND_LINE,action:()=>{let e=V();if(l(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=Q().commandMeta,r=(t||n).trim();if(!r)return i("Provide an assignee to remove");let o=oi(r);if(!o)return i(`Assignee "${r}" does not exist`);let{selectedNode:s}=v();if(!s)return i("Invalid unassign target");let a=Be(s.id,"TICKET");if(l(a))return i("Unable to unassign in this context");let d=a.value,u=x.getFieldByTitle(d.id,"Assignees");if(!u)return i("Unable to locate assignees field");let m=b(u.id).find(f=>f.props?.value===o.id);return m?j({id:B(),action:"unassign.issue",payload:{id:m.id,target:d.id,contributor:o.id},...e.value}):i(`Issue is not assigned to "${r}"`)},onSuccess:()=>h({mode:g.DEFAULT})},{intent:S.Sync,mode:g.COMMAND_LINE,action:async()=>{let e=_o();$(()=>""),h({syncStatus:{msg:"Syncing",status:"syncing"}});let{userId:t,userName:n}=ge();if(!t)return i("Unable to resolve userId");if(!n)return i("Unable to resolve userName");let r=Ze()?Gn():c("No pending default events",null);if(l(r))return i(`Unable to persist default events. ${r.message}`);let o=V();if(l(o)||!o.value)return i("Unable to resolve event log path");let s=it(o.value);logger.debug("[sync-command] pending defaults",Ze());let a=await Wt({ownEventFileName:s});if(l(a))return h({syncStatus:{msg:a.message,status:"outOfSync"}}),i(`Unable to sync state. ${a.message}`);h({syncStatus:{msg:"Synced",status:"synced"},mode:g.DEFAULT});let d=re(process.cwd());if(l(d))throw new Error(d.message);let u=st(d.value);if(l(u))return i("Unable to load events");Le(u.value);let m=$o(e);return l(m)?m:c("Synced",!0)}},{intent:S.Peek,mode:g.COMMAND_LINE,action:async()=>{let e=Pe(v().breadCrumb,"BOARD");if(l(e))return e;let t=re(process.cwd());if(l(t))throw new Error(t.message);let n=st(t.value);if(l(n))return i(n.message);let r=n.value,{modifier:o}=Q().commandMeta,s;if(o==="now"){let E=zn();if(l(E))return E;let I=Le(r);return I.some(l)?i(I.map(R=>R.message).join(", ")):(h({mode:g.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),c("Peeking now",!0))}if(o==="prev"){let E=v().eventLog.at(-2),I=ln(E);if(I===null)return i("No previous event to peek");s=I}else if(o==="next"){let E=v().unappliedEvents.at(0),I=ln(E);if(I===null)return i("No next event to peek");s=I}else{let E=Rt(o);if(!E)return i("Invalid peek date");s=E.getTime()}let a=e.value.id,{appliedEvents:d,unappliedEvents:u}=zr(r,s),m=zn();if(l(m))return m;let f=Le(d);if(f.some(l))return i(f.map(E=>E.message).join(", "));let N=v().nodes[a];return N?(k.navigate({currentNode:N,selectedIndex:0}),h({mode:g.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:u}),c("Peeking ",!0)):i("Board did not exist at peek date")}},{intent:S.Export,mode:g.COMMAND_LINE,action:async()=>{let e=await ni();return l(e)?e:(h({mode:g.DEFAULT}),c("Export successful",!0))}},{intent:S.Exit,mode:g.COMMAND_LINE,action:async()=>(k.exit(),c("Exit successful",!0))}];var Za=new Set(["peek","filter","view-help"]),ae=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=Q();if(!t)return i("No command to confirm");if(!e&&n===fe.Invalid)return i("Invalid command");let s=Dr(t);if(wr(),v().readOnly&&!Za.has(s))return nt({status:pe.Fail,message:"Command not available in readonly state",value:null});let a=ii.filter(u=>e||u.systemOnly!==!0).find(u=>u.intent===s);if(!a)return nt({status:pe.Fail,message:"Command not found",value:null});let d=await a.action(a,{command:t,inputString:o,modifier:r});return l(d)?nt(d):(Mr({addToHistory:!e}),a.onSuccess?.(),nt(d))};var Jt=[{intent:T.Exit,mode:g.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(h({mode:g.COMMAND_LINE}),$(()=>"move cancel"),ae({isForceExecutedBySystem:!0}))},{intent:T.InitMove,mode:g.DEFAULT,description:"[m] move init/confirm",action:()=>(h({mode:g.COMMAND_LINE}),$(()=>"move start"),ae({isForceExecutedBySystem:!0}))},{intent:T.ConfirmMove,mode:g.MOVE,action:()=>(h({mode:g.COMMAND_LINE}),$(()=>"move confirm"),ae({isForceExecutedBySystem:!0}))}],Zt=[{intent:T.MovePreviousItem,mode:g.MOVE,action:()=>Ae()?(h({mode:g.COMMAND_LINE}),$(()=>"move previous"),ae({isForceExecutedBySystem:!0})):i("No pending move")},{intent:T.MoveNextItem,mode:g.MOVE,action:()=>Ae()?(h({mode:g.COMMAND_LINE}),$(()=>"move next"),ae({isForceExecutedBySystem:!0})):i("No pending move")}],si=[{intent:T.MoveToNextContainer,mode:g.MOVE,action:()=>Ae()?(h({mode:g.COMMAND_LINE}),$(()=>"move to-next"),ae({isForceExecutedBySystem:!0})):i("No pending move")},{intent:T.MoveToPreviousContainer,mode:g.MOVE,action:()=>Ae()?(h({mode:g.COMMAND_LINE}),$(()=>"move to-previous"),ae({isForceExecutedBySystem:!0})):i("No pending move")}];var ai={[M.WORKSPACE]:[...Jt,...Zt],[M.BOARD]:[...Jt,...Zt],[M.SWIMLANE]:[...Jt,...Zt,...si],[M.TICKET]:[],[M.FIELD]:[],[M.FIELD_LIST]:[],[M.TEXT]:[]};var di=[{intent:T.AddItem,mode:g.DEFAULT,description:"[n] new...",action:()=>(h({mode:g.COMMAND_LINE}),$(()=>`${p.NEW} `),c("Adding new item",null))},{intent:T.Delete,mode:g.DEFAULT,description:"[d] delete",action:()=>(h({mode:g.COMMAND_LINE}),$(()=>`${p.DELETE} `),c("Deleting item",null))},{intent:T.InitCommandLine,mode:g.DEFAULT,description:"[:] focus command line",action:()=>(h({mode:g.COMMAND_LINE}),$(()=>""),c("Entering command line mode",null))},{intent:T.Confirm,mode:g.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>(k.enterChildNode(),c("Entering context",null))},{intent:T.Exit,mode:g.DEFAULT,description:"[q] exit context",action:()=>(k.enterParentNode(),c("Exiting context",null))},{intent:T.NavPreviousItem,mode:g.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(k.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:T.NavNextItem,mode:g.DEFAULT,action:()=>(k.navigateToNextItem(),c("Navigating to next item",null))},{intent:T.NavToPreviousContainer,mode:g.DEFAULT,action:()=>(k.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:T.NavToNextContainer,mode:g.DEFAULT,action:()=>(k.navigateToNextContainer(),c("Navigating to next container",null))},{intent:T.Edit,mode:g.DEFAULT,action:()=>(h({mode:g.COMMAND_LINE}),$(()=>"edit"),ae(),c("Fired command",!0))},{intent:T.SetViewDense,mode:g.DEFAULT,description:"[v] view change (wide/dense)",action:()=>(h({viewMode:"dense"}),c("View set",null))},{intent:T.SetViewWide,mode:g.DEFAULT,action:()=>(h({viewMode:"wide"}),c("View set",null))}];var Qa=500,ed=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),li=e=>{let t=ed(e);t&&$(n=>(n+t).slice(0,Qa))};var ci=[{intent:T.ViewHelp,mode:g.DEFAULT,action:()=>(h({mode:g.HELP}),c("Viewing help",null))},{intent:T.Exit,mode:g.HELP,action:()=>(h({mode:g.DEFAULT}),c("Exiting help",null))},{intent:T.Confirm,mode:g.COMMAND_LINE,action:()=>(ae(),c("Executing command",null))},{intent:T.MoveCursorLeft,mode:g.COMMAND_LINE,action:()=>(fn(-1),c("Moving cursor left",null))},{intent:T.MoveCursorRight,mode:g.COMMAND_LINE,action:()=>(fn(1),c("Moving cursor right",null))},{intent:T.MoveCursorLeftOfWord,mode:g.COMMAND_LINE,action:()=>(vn("left"),c("Moving cursor left of word",null))},{intent:T.MoveCursorRightOfWord,mode:g.COMMAND_LINE,action:()=>(vn("right"),c("Moving cursor right of word",null))},{intent:T.ExitCommandLine,mode:g.COMMAND_LINE,action:()=>(h({mode:g.DEFAULT}),c("Exiting command line",null))},{intent:T.AutoCompleteCommand,mode:g.COMMAND_LINE,action:()=>($((e,{remainder:t})=>t?e+t:e),c("Auto-completing command",null))},{intent:T.CaptureInput,mode:g.COMMAND_LINE,action:(e,{sequence:t})=>(li(t??""),c("Capturing input",null))},{intent:T.EraseInput,mode:g.COMMAND_LINE,action:()=>(Ar(),c("Erasing input",null))},{intent:T.EraseInputWord,mode:g.COMMAND_LINE,action:()=>(Tr(),c("Erasing input word",null))},{intent:T.GetLastCommandFromHistory,mode:g.COMMAND_LINE,action:()=>(Pr(),c("Getting last command from history",null))},{intent:T.GetNextCommandFromHistory,mode:g.COMMAND_LINE,action:()=>(Lr(),c("Getting next command from history",null))}];import td from"chalk";var Qt=": for command line",ui="q to exit",mi=`${td.hex(w.accent)("m")} to confirm`,qn={[M.WORKSPACE]:[Qt],[M.BOARD]:[Qt],[M.BOARD+g.COMMAND_LINE]:[Qt],[M.SWIMLANE]:[Qt],[M.TICKET+g.HELP]:[ui],[M.SWIMLANE+g.HELP]:[ui],[M.TICKET]:[],[M.FIELD]:[],[M.SWIMLANE+g.MOVE]:[mi],[M.TICKET+g.MOVE]:[mi]};var en=e=>e.trim().toLocaleLowerCase(),nd=(e,t)=>{let n=x.getFieldByTitle(e,t);if(!n)return"";let r=n.props?.value;return typeof r=="string"?r:""},rd=e=>{let{tags:t}=v(),n=x.getFieldByTitle(e,"Tags");return n?G(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},od=e=>{let{contributors:t}=v(),n=x.getFieldByTitle(e,"Assignees");return n?G(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},pi=(e,t)=>{let n=t.value;if(!n)return!0;switch(t.target){case"title":return en(e.title??"").includes(n);case"description":return en(nd(e.id,"Description")).includes(n);case"tag":return rd(e.id).map(en).some(d=>d.includes(n));case"assignee":return od(e.id).map(en).some(d=>d.includes(n));default:return!0}};function gi(e,t,n){let r=t[e];if(!r)return i("buildBreadCrumb(): current node not found");let o=[],s=r;for(;s&&(o.push(s),!(s.id===n||!s.parentNodeId));)s=t[s.parentNodeId];let a=o[o.length-1];return!a||a.id!==n?i("buildBreadCrumb(): node is not connected to root"):(o.reverse(),c("Breadcrumb built",o))}var fi=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 tn,Xn,Yn=new Set,vi=()=>{for(let e of Yn)e()},sd=e=>(Yn.add(e),()=>Yn.delete(e));function yi(e){let{currentNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:s}=e;if(!t)return i("derive(): currentNodeId is missing");if(!r)return i("derive(): rootNode is missing");if(!o[r])return i("derive(): unable to find root node");let d=o[t];if(!d)return i("Unable to derive state, currentNode not found");let u=gi(t,o,r);if(l(u))return logger.error(u.message),u;let m=u.value,{context:f}=d,N=qn[f+n]??qn[f]??[],E=[...di,...ai[f]??[],...ci],I=fi(E),R=ad(o,s),A=R[t]?.[e.selectedIndex]??null;return c("Derived successfully",{...e,currentNode:d,breadCrumb:m,availableHints:N,availableActions:E,actionIndex:I,selectedNode:A,renderedChildrenIndex:R})}var v=()=>(tn||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),tn);function hn(e){Xn=e;let t={readOnly:!1,filters:[],tags:{},contributors:{},viewMode:"dense",mode:g.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,currentNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],timeMode:"live"},n=yi(t);return l(n)?n:(tn=n.value,vi(),c("State initialized",null))}function Z(e){let t=v(),n=e(t),r=yi(n);return l(r)?i(r.message??"Unable to update state"):(tn=r.value,vi(),c("State updated",null))}var h=e=>Z(t=>({...t,...e}));var ue=()=>id(sd,v,v),ad=(e,t)=>{let n={};for(let r of Object.values(e))X(r)&&t.length>0&&!t.every(o=>pi(r,o))||!r.parentNodeId||r.isDeleted||((!r.parentNodeId||!n[r.parentNodeId])&&(n[r.parentNodeId]=[]),n[r.parentNodeId].push(r));for(let r of Object.keys(n))n[r].sort((o,s)=>{let a=e[o.id],d=e[s.id];return!a||!d?0:a.rank.localeCompare(d.rank)});return n},b=e=>v()?.renderedChildrenIndex[e]??[],zn=()=>Xn?hn(Xn):i("Cannot reset state: no initial workspace found");var k={exit(){process.exit(0)},enterChildNode(){let e=v(),t=e.currentNode,n=Math.max(0,e.selectedIndex),r=b(t.id)[n];!r||t.context==="FIELD"||k.navigate({currentNode:r,selectedIndex:b(r.id).length?0:-1})},enterParentNode(){let{currentNode:e,nodes:t}=v();if(!e.parentNodeId){logger.info("Missing parent node id");return}let n=t[e.parentNodeId];if(!n){logger.error("Parent not found");return}let r=b(n.id),o=r.findIndex(({id:a})=>a===e.id),s=r.length===0?-1:o>=0?o:0;k.navigate({currentNode:n,selectedIndex:s})},navigateToNextItem:()=>xi(1),navigateToPreviousItem:()=>xi(-1),navigateToNextContainer:()=>Ni(1),navigateToPreviousContainer:()=>Ni(-1),navigate:({currentNode:e=v().currentNode,selectedIndex:t})=>{h({currentNodeId:e.id,selectedIndex:t})}},xi=e=>{let t=v(),n=b(t.currentNode.id).length;if(n===0)return;let o=(Math.max(0,t.selectedIndex)+e+n)%n;k.navigate({selectedIndex:o})},Ni=e=>{let{currentNode:t,nodes:n,selectedIndex:r}=v();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!t||!o)return;let s=b(o.id),a=s.findIndex(E=>E.id===t.id);if(a<0)return;let d=s.at(a+e)??s.at(0);if(!d)return;let u=b(d.id),m=Math.max(0,u.length-1),f=Math.min(Math.max(0,r),m),N=u.length?f:-1;k.navigate({currentNode:d,selectedIndex:N})};var Ie="system",he="ACTOR",gt=dd(),Ce=null;function ld(){let e=Object.values(v().nodes).find(r=>r.context==="WORKSPACE");if(!e)throw new Error("No workspace found in event log");let[t]=b(e.id),[n]=t?b(t.id):[];if(logger.debug("Boot navigation target:",{workspace:e?.id,firstBoard:t?.id,firstSwimlane:n?.id}),n){let r=v().renderedChildrenIndex?.[n.id]??[];return{currentNode:n,selectedIndex:r.length>0?0:-1}}else return t?{currentNode:t,selectedIndex:0}:e?{currentNode:e,selectedIndex:0}:{currentNode:v().nodes[v().rootNodeId],selectedIndex:0}}function cd(){let e=ld();k.navigate(e)}function ud(){let e=gt(),t=gt(),n=gt(),r=gt(),o=gt();return[{id:Ee(),userId:Ie,userName:he,action:"init.workspace",payload:{id:e,name:"Workspace"}},{id:Ee(),userId:Ie,userName:he,action:"add.board",payload:{id:t,name:"Default",parent:e}},{id:Ee(),userId:Ie,userName:he,action:"add.swimlane",payload:{id:n,name:"Todo",parent:t}},{id:Ee(),userId:Ie,userName:he,action:"add.swimlane",payload:{id:r,name:"In progress",parent:t}},{id:Ee(),userId:Ie,userName:he,action:"add.swimlane",payload:{id:o,name:"Done",parent:t}},{id:Ee(),userId:Ie,userName:he,action:"add.board",payload:{id:Ot,name:"Closed",parent:e}},{id:Ee(),userId:Ie,userName:he,action:"add.swimlane",payload:{id:le,name:"Closed",parent:Ot}},{id:Ee(),userId:Ie,userName:he,action:"lock.node",payload:{id:Ot}},{id:Ee(),userId:Ie,userName:he,action:"lock.node",payload:{id:le}}]}function Ze(){return Ce!==null}function Gn(){if(!Ce||Ce.length===0)return Ce=null,c("No pending default events to persist",null);let e=Ce.map(t=>Dt({event:t})).filter(l);return e.length>0?i([Xe.bold.red("Persisting default events failed"),"",...e.map((t,n)=>`${Xe.dim.gray(`${n+1}.`)} ${Xe.dim(t.message)}`),`
|
|
48
|
+
`,Es=(e,t)=>{let n=new Map;for(let r of[...t,...e])n.set(In(r),r);return[...n.values()].sort((r,o)=>{let i=Hr(r)-Hr(o);return i!==0?i:In(r).localeCompare(In(o))})},Cn=({sourceFile:e,targetFile:t})=>{let n=St(e);if(l(n))return s(n.message);let r=St(t);if(l(r))return s(r.message);let o=Es(r.value,n.value),i=Ns(o);return(Rt.existsSync(t)?Rt.readFileSync(t,"utf8"):"")===i?c("Event file already merged",!1):(Rt.mkdirSync(hn.dirname(t),{recursive:!0}),Rt.writeFileSync(t,i,"utf8"),c("Merged event file",!0))},Kr=({repoRoot:e,stateBranchRoot:t})=>{let n=Sr(t);if(l(n))return s(n.message);let r=ke(t),o=ke(e),i=!1;for(let a of n.value){let d=hn.join(r,a),u=hn.join(o,a),m=Cn({sourceFile:d,targetFile:u});if(l(m))return s(m.message);i=i||m.value}return c("Hydrated event files from state branch",i)};var hs=({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{let r=vn({root:e,fileName:n}),o=vn({root:t,fileName:n});return Is.existsSync(r)?Cn({sourceFile:r,targetFile:o}):c("Local own event file missing, nothing to merge",!1)},Cs=async({cwd:e,ensureUpstream:t})=>{let n=await Tr(e);if(l(n))return s(n.message);let r=n.value,o=hr(r),i=await kr(r);if(l(i))return s("Sync aborted. Unable to gitignore hydrated events");let a=await mn(r);if(l(a))return s(a.message);if(a.value)return s("Cannot sync while a git operation is in progress in the current repo");let d=await Pr(r);if(l(d))return s(d.message);let u=await Fr({repoRoot:r,stateBranchRoot:o,ensureUpstream:t});if(l(u))return s(u.message);let m=await mn(o);if(l(m))return s(m.message);if(m.value)return s("Cannot sync while a git operation is in progress in the state branch");let f=Rr(r,o);return l(f)?s(f.message):c("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:o,bootstrapped:u.value})},Vr=async({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{let r=hs({repoRoot:e,stateBranchRoot:t,ownEventFileName:n});if(l(r))return s(r.message);let o=await fr(t);if(l(o))return s(o.message);if(!r.value&&!o.value)return c("Own event file already up to date in state branch",{createdCommit:!1});let i=await Lr({stateBranchRoot:t,ownEventFileName:n});if(l(i))return s(i.message);let a=await Dr({repoRoot:e,stateBranchRoot:t});return l(a)?s(a.message):c("Merged, staged, and committed own event file",{createdCommit:!0,commitSha:a.value})},At=async({cwd:e=process.cwd(),ownEventFileName:t})=>{if(t.includes("/")||t.includes("\\"))return s("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return s("Own event file must end with .jsonl");let n=await Cs({cwd:e,ensureUpstream:!0});if(l(n))return n;let{repoRoot:r,stateBranchRoot:o,bootstrapped:i}=n.value,a=await vr(r);if(l(a))return s(a.message);if(a.value)return s("Cannot run :sync while the repository is in detached HEAD state");let d=!1,u,m=!1,f=!1,N=!1,E=await fn({cwd:o,branch:O});if(l(E))return s(E.message);m=E.value;let C=Kr({repoRoot:r,stateBranchRoot:o});if(l(C))return s(C.message);N=C.value;let I=await Vr({repoRoot:r,stateBranchRoot:o,ownEventFileName:t});if(l(I))return s(I.message);if(d=I.value.createdCommit,u=I.value.commitSha,d||i){let A=await yn(o),b=A;if(l(A)&&gr(A.message)){let k=await fn({cwd:o,branch:O});if(l(k))return s(k.message);let X=await Vr({repoRoot:r,stateBranchRoot:o,ownEventFileName:t});if(l(X))return s(X.message);X.value.createdCommit&&(d=!0,u=X.value.commitSha),b=await yn(o)}if(l(b))return s(b.message);f=b.value,logger.debug("[sync] pushed to state branch",f)}else logger.debug("[sync] no commit created, skipped push");if(d){let A=await D({args:["rev-parse","HEAD"],cwd:o});if(l(A))return s(A.message);u=A.value.stdout.trim()}return c("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:o,createdCommit:d,commitSha:u,pulled:m,pushed:f,hydrated:N,bootstrapped:i})};import{ulid as xd}from"ulid";var M={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function bn(e){return e.context==="WORKSPACE"}function V(e){return e.context==="TICKET"}function jr(e){return e.context==="FIELD"}var Tt=e=>e.context==="SWIMLANE",zr=e=>e.context==="BOARD";var $e=24n,bs=$e*4n,wt=(1n<<bs)-1n,Ss=/^[0-9a-f]+$/;function Gr(e){if(!e||!Ss.test(e))throw new Error(`Invalid hex rank: ${e}`);return BigInt("0x"+e)}function Mt(e,t=$e){if(e<0n)throw new Error("Negative rank not allowed");return e.toString(16).padStart(Number(t),"0")}function j(e,t){if(!e&&!t)return Mt(wt/2n,$e);let n=e?Gr(e):0n,r=t?Gr(t):wt;if(r<=n)return Mt(wt/2n,$e);let o=(n+r)/2n;return o===n||o===r?"":Mt(o,$e)}function J(){return Mt(wt/2n,$e)}var Q={workspace:(e,t)=>({id:e,title:t,rank:J(),isDeleted:!1,props:{},context:M.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r=!1)=>({id:e,title:t,rank:J(),isDeleted:!1,props:{},context:M.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:r,log:[]}),swimlane:(e,t,n)=>({id:e,title:t,rank:J(),isDeleted:!1,props:{},context:M.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:(e,t,n,r={},o="horizontal")=>({id:e,title:t,rank:J(),isDeleted:!1,props:r,context:M.FIELD,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[]}),ticket:(e,t,n)=>({id:e,title:t,rank:J(),isDeleted:!1,props:{},context:M.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:J(),isDeleted:!1,props:r,context:M.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:o,log:[]})};import{useSyncExternalStore as ud}from"react";var g={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};function kt(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var Pt=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",We=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var qr=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},Xr=(e,t)=>t?e.get(t)??[]:[];var Yr=new WeakMap,Rs=e=>{let t=Yr.get(e);return t||(t=qr(e),Yr.set(e,t)),t};var Jr=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return Xr(Rs(e),r).filter(i=>kt(r,i)>=n)};var As={hint:"",hints:[],overlap:0,remainder:""},Zr=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return As;let o=Jr({wordList:r,inputToMatch:e,overlapThreshold:1});return Ts(t,o)},Ts=(e,t)=>{let n=t[0]??"",r=kt(e.toLowerCase(),n.toLowerCase()),[o,i]=n.split(":"),a=r<(o??"").length,d=!!i,f=(d&&a?o:n)+(d&&a?":":" "),N=f.slice(r);return{hint:f,hints:t,overlap:r,remainder:N}};var Qr=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import He from"chalk";import{monotonicFactory as Ms,ulid as fe}from"ulid";var F={exit(){process.exit(0)},enterChildNode(){let e=v(),t=e.currentNode,n=Math.max(0,e.selectedIndex),r=S(t.id)[n];!r||t.context==="FIELD"||F.navigate({currentNode:r,selectedIndex:S(r.id).length?0:-1})},enterParentNode(){let{currentNode:e,nodes:t}=v();if(!e.parentNodeId){logger.info("Missing parent node id");return}let n=t[e.parentNodeId];if(!n){logger.error("Parent not found");return}let r=S(n.id),o=r.findIndex(({id:a})=>a===e.id),i=r.length===0?-1:o>=0?o:0;F.navigate({currentNode:n,selectedIndex:i})},navigateToNextItem:()=>eo(1),navigateToPreviousItem:()=>eo(-1),navigateToNextContainer:()=>to(1),navigateToPreviousContainer:()=>to(-1),navigate:({currentNode:e=v().currentNode,selectedIndex:t})=>{h({currentNodeId:e.id,selectedIndex:t})}},eo=e=>{let t=v(),n=S(t.currentNode.id).length;if(n===0)return;let o=(Math.max(0,t.selectedIndex)+e+n)%n;F.navigate({selectedIndex:o})},to=e=>{let{currentNode:t,nodes:n,selectedIndex:r}=v();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!t||!o)return;let i=S(o.id),a=i.findIndex(E=>E.id===t.id);if(a<0)return;let d=i.at(a+e)??i.at(0);if(!d)return;let u=S(d.id),m=Math.max(0,u.length-1),f=Math.min(Math.max(0,r),m),N=u.length?f:-1;F.navigate({currentNode:d,selectedIndex:N})};var ws=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[z,Lt]=ws;var ve="system",ye="ACTOR",it=Ms(),xe=null;function ks(){let e=Object.values(v().nodes).find(r=>r.context==="WORKSPACE");if(!e)throw new Error("No workspace found in event log");let[t]=S(e.id),[n]=t?S(t.id):[];if(logger.debug("Boot navigation target:",{workspace:e?.id,firstBoard:t?.id,firstSwimlane:n?.id}),n){let r=v().renderedChildrenIndex?.[n.id]??[];return{currentNode:n,selectedIndex:r.length>0?0:-1}}else return t?{currentNode:t,selectedIndex:0}:e?{currentNode:e,selectedIndex:0}:{currentNode:v().nodes[v().rootNodeId],selectedIndex:0}}function Ps(){let e=ks();F.navigate(e)}function Ls(){let e=it(),t=it(),n=it(),r=it(),o=it(),i=j(void 0,void 0),a=j(void 0,void 0),d=j(a,void 0),u=j(void 0,void 0),m=j(u,void 0),f=j(m,void 0),N=j(void 0,void 0);return[{id:fe(),userId:ve,userName:ye,action:"init.workspace",payload:{id:e,name:"Workspace",rank:i}},{id:fe(),userId:ve,userName:ye,action:"add.board",payload:{id:t,name:"Default",parent:e,rank:a}},{id:fe(),userId:ve,userName:ye,action:"add.swimlane",payload:{id:n,name:"Todo",parent:t,rank:u}},{id:fe(),userId:ve,userName:ye,action:"add.swimlane",payload:{id:r,name:"In progress",parent:t,rank:m}},{id:fe(),userId:ve,userName:ye,action:"add.swimlane",payload:{id:o,name:"Done",parent:t,rank:f}},{id:fe(),userId:ve,userName:ye,action:"add.board",payload:{id:Lt,name:"Closed",parent:e,rank:d}},{id:fe(),userId:ve,userName:ye,action:"add.swimlane",payload:{id:z,name:"Closed",parent:Lt,rank:N}},{id:fe(),userId:ve,userName:ye,action:"lock.node",payload:{id:Lt}},{id:fe(),userId:ve,userName:ye,action:"lock.node",payload:{id:z}}]}function st(){return xe!==null}function Sn(){if(!xe||xe.length===0)return xe=null,c("No pending default events to persist",null);let e=xe.map(t=>Ct({event:t})).filter(l);return e.length>0?s([He.bold.red("Persisting default events failed"),"",...e.map((t,n)=>`${He.dim.gray(`${n+1}.`)} ${He.dim(t.message)}`),`
|
|
57
49
|
`].join(`
|
|
58
|
-
`)):(
|
|
50
|
+
`)):(xe=null,c("Persisted pending default events",null))}function no(e){let t;e.some(r=>r.action==="init.workspace")?(xe=null,t=Pe(e)):(xe=Ls(),t=Pe([...xe]));let n=t.filter(l);return n.length>0?s([He.bold.red("Materializing failed"),"",...n.map((r,o)=>`${He.dim.gray(`${o+1}.`)} ${He.dim(r.message)}`),`
|
|
59
51
|
`].join(`
|
|
60
52
|
|
|
61
53
|
See complete log:
|
|
62
54
|
|
|
63
55
|
`)+e.map(r=>JSON.stringify(r)).join(`
|
|
64
|
-
`)):(cd(),c("State booted successfully",null))}var ke=e=>{let t=re(e??process.cwd());if(l(t))return t;let n=st(t.value);if(l(n))return i(n.message);let r=Ei(n.value);return l(r)?i(r.message):c("Booted Epiq state",{root:t.value})},nn=()=>{let e=Uo();return l(e)?i(e.message):e.value.userId?e.value.userName?c("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):i("Unable to retrieve user name"):i("Unable to retrieve user id")},hi=(e,t)=>{let r=b(e.id).find(o=>o.title===t);return r?b(r.id).map(o=>typeof o.props?.value=="string"?o.props.value:"").filter(o=>!!o):[]},md=e=>hi(e,"Tags").map(t=>x.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name})),pd=e=>hi(e,"Assignees").map(t=>x.getContributor(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name})),Ci=(e={})=>{let t=ke(e.repoRoot);if(l(t))return t;let n=Object.values(v().nodes).filter(r=>r.context==="BOARD").map(r=>({id:r.id,title:r.title,parentId:r.parentNodeId,readonly:!!r.readonly}));return c("Listed boards",n)},bi=(e={})=>{let t=ke(e.repoRoot);if(l(t))return t;let n=Object.values(v().nodes).filter(r=>r.context==="SWIMLANE").filter(r=>!e.boardId||r.parentNodeId===e.boardId).map(r=>({id:r.id,title:r.title,boardId:r.parentNodeId,isClosed:r.id===le,readonly:!!r.readonly}));return c("Listed swimlanes",n)},Si=e=>{let t=ke(e.repoRoot);if(l(t))return t;let n=Object.values(v().nodes).filter(X).filter(r=>e.includeClosed||r.parentNodeId!==le).map(r=>({id:r.id,title:Oe(r.title),description:ur(r,"Description"),parentId:r.parentNodeId,isClosed:r.parentNodeId===le,readonly:!!r.readonly,tags:md(r),assignees:pd(r)}));return c("Listed issues",n)},Ri=e=>{let t=ke(e.repoRoot);if(l(t))return t;let n=nn();if(l(n))return n;let r=x.getNode(e.parentId);if(!r)return i(`Unable to locate parent swimlane: ${e.parentId}`);if(r.context!=="SWIMLANE")return i(`Parent must be a swimlane, got: ${r.context}`);let o=yt({name:e.title,parent:e.parentId,user:n.value}),a=je(o).find(l);if(a)return i(a.message);let d=o.find(u=>u.action==="add.issue")?.payload.id;return d?c("Created issue",{id:d,title:e.title,parentId:e.parentId}):i("Unable to determine created issue id")},Ai=e=>{let t=ke(e.repoRoot);if(l(t))return t;let n=nn();if(l(n))return n;let r=x.getNode(e.issueId);if(!r)return i(`Unable to locate issue: ${e.issueId}`);if(!r.parentNodeId)return i(`Unable to locate issue parent for: ${e.issueId}`);if(!X(r))return i("Can only close issues");if(r.parentNodeId===le)return i("Issue is already closed");let o={id:Ii(),userId:n.value.userId,userName:n.value.userName,action:"close.issue",payload:{id:e.issueId,parent:r.parentNodeId}},a=je([o]).find(l);return a?i(a.message):c("Closed issue",{id:e.issueId,closed:!0})},Ti=(e={})=>{let t=ke(e.repoRoot);return l(t)?t:c("Retrieved Epiq state",{root:t.value.root,nodes:v().nodes,rootNodeId:v().rootNodeId,currentNode:v().currentNode,selectedIndex:v().selectedIndex,eventLog:v().eventLog})},wi=e=>{let t=ke(e.repoRoot);if(l(t))return t;let n=nn();if(l(n))return n;let r=x.getNode(e.issueId);if(!r)return i(`Unable to locate issue: ${e.issueId}`);if(!X(r))return i("Can only move issues");let o=x.getNode(e.parentId);if(!o)return i(`Unable to locate target swimlane: ${e.parentId}`);if(o.context!=="SWIMLANE")return i(`Target parent must be a swimlane, got: ${o.context}`);if(o.readonly)return i("Cannot move issue to readonly swimlane");let s={id:Ii(),userId:n.value.userId,userName:n.value.userName,action:"move.node",payload:{id:e.issueId,parent:e.parentId,...e.position==null?{}:{pos:e.position}}},d=je([s]).find(l);return d?i(d.message):c("Moved issue",{id:e.issueId,parentId:e.parentId,position:e.position??{at:"end"}})},Mi=async(e={})=>{let t=re(e.repoRoot??process.cwd());if(l(t))return i(`Sync failed
|
|
65
|
-
`+t);let n=nn();if(l(n))return n;let r=await Wt({cwd:t.value,ownEventFileName:it({userId:n.value.userId,userName:n.value.userName})});return l(r)?r:c("Synced Epiq state",r.value)};var we=e=>({isError:l(e),content:[{type:"text",text:JSON.stringify(e,null,2)}]}),vd=()=>{let e=new gd({name:"epiq",version:"0.2.30"});return e.registerTool("epiq_state_get",{description:"Get the full current Epiq state, including nodes and event log",inputSchema:L.object({repoRoot:L.string().optional()})},async t=>we(await Ti(t))),e.registerTool("epiq_issue_list",{description:"List Epiq issues",inputSchema:L.object({repoRoot:L.string().optional(),includeClosed:L.boolean().optional()})},async t=>we(await Si(t))),e.registerTool("epiq_board_list",{description:"List Epiq boards",inputSchema:L.object({repoRoot:L.string().optional()})},async t=>we(await Ci(t))),e.registerTool("epiq_swimlane_list",{description:"List Epiq swimlanes",inputSchema:L.object({repoRoot:L.string().optional(),boardId:L.string().optional()})},async t=>we(await bi(t))),e.registerTool("epiq_issue_create",{description:"Create an Epiq issue",inputSchema:L.object({title:L.string().min(1),parentId:L.string().min(1),repoRoot:L.string().optional()})},async t=>we(await Ri(t))),e.registerTool("epiq_issue_close",{description:"Close an Epiq issue",inputSchema:L.object({issueId:L.string().min(1),repoRoot:L.string().optional()})},async t=>we(await Ai(t))),e.registerTool("epiq_issue_move",{description:"Move an Epiq issue to another swimlane",inputSchema:L.object({issueId:L.string().min(1),parentId:L.string().min(1),position:L.discriminatedUnion("at",[L.object({at:L.literal("start")}),L.object({at:L.literal("end")}),L.object({at:L.literal("before"),sibling:L.string().min(1)}),L.object({at:L.literal("after"),sibling:L.string().min(1)})]).optional(),repoRoot:L.string().optional()})},async t=>we(await wi(t))),e.registerTool("epiq_sync",{description:"Sync Epiq state with the configured Git remote",inputSchema:L.object({repoRoot:L.string().optional()})},async t=>we(await Mi(t))),e},yd=async()=>{let e=vd(),t=new fd;await e.connect(t)};await yd();export{vd as createMcpServer,we as resultJson,yd as startMcpServer};
|
|
56
|
+
`)):(Ps(),c("State booted successfully",null))}var ro=()=>{let e=ge(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim();return{isSetup:n&&t,hasPreferredEditor:n,hasUserName:t,userName:e.userName,preferredEditor:e.preferredEditor}},oo=()=>!st();var G={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"},w={accent:G.cyan,accent2:G.magenta,primary:G.white,secondary:G.grayDark,secondary2:G.grayLight,gray:G.gray,green:G.green,yellow:G.yellow,red:G.red};var y={red:G.red,yellow:G.yellow,green:G.green,blue:G.blue,magenta:G.magenta,cyan:G.cyan},Ke={urgent:y.red,critical:y.red,important:y.red,blocker:y.red,asap:y.red,immediate:y.red,fail:y.red,failure:y.red,broken:y.red,bug:y.red,error:y.red,incident:y.red,outage:y.red,production:y.red,crash:y.red,security:y.red,warning:y.yellow,warn:y.yellow,risky:y.yellow,risk:y.yellow,attention:y.yellow,pending:y.yellow,review:y.yellow,"needs-review":y.yellow,qa:y.yellow,testing:y.yellow,test:y.yellow,validate:y.yellow,verification:y.yellow,staging:y.yellow,check:y.yellow,"follow-up":y.yellow,followup:y.yellow,waiting:y.yellow,blocked:y.yellow,hold:y.yellow,done:y.green,complete:y.green,completed:y.green,success:y.green,ok:y.green,stable:y.green,resolved:y.green,fixed:y.green,closed:y.green,merged:y.green,released:y.green,deployed:y.green,approved:y.green,verified:y.green,working:y.green,healthy:y.green,pass:y.green,passing:y.green,info:y.blue,information:y.blue,note:y.blue,docs:y.blue,documentation:y.blue,doc:y.blue,guide:y.blue,help:y.blue,explanation:y.blue,detail:y.blue,details:y.blue,context:y.blue,design:y.blue,discussion:y.blue,proposal:y.blue,idea:y.blue,feature:y.magenta,enhancement:y.magenta,improvement:y.magenta,refactor:y.magenta,refactoring:y.magenta,cleanup:y.magenta,optimize:y.magenta,optimization:y.magenta,perf:y.magenta,performance:y.magenta,upgrade:y.magenta,migration:y.magenta,modernize:y.magenta,debt:y.magenta,todo:y.cyan,next:y.cyan,planned:y.cyan,plan:y.cyan,future:y.cyan,backlog:y.cyan,investigate:y.cyan,explore:y.cyan,prototype:y.cyan};var io=(e,t)=>{let r=S(e.id).find(o=>o.title===t);return r?S(r.id).map(o=>typeof o.props?.value=="string"?o.props.value:"").filter(o=>!!o):[]},Rn=e=>io(e,"Tags").map(t=>x.getTag(t)).filter(t=>!!t),Dt=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!V(n)?s("Invalid untag target"):c("Retrieved tags from ticket in breadcrumb",Rn(n)??[])},Ft=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!V(n)?s("Invalid untag target"):c("Retrieved tags from ticket in breadcrumb",An(n)??[])},An=e=>io(e,"Assignees").map(t=>x.getContributor(t)).filter(t=>!!t);var so=(e,t)=>{let r=S(e.id).find(o=>o.title===t);return r&&typeof r.props?.value=="string"?We(r.props.value):""};var p={EXIT:"exit",INIT:"init",HELP:"help",NEW:"new",TAG:"tag",UNTAG:"untag",MOVE:"move",PEEK:"peek",FILTER:"filter",ASSIGN:"assign",UNASSIGN:"unassign",DELETE:"delete",RENAME:"rename",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",SET_DESCRIPTION:"edit",SET_EDITOR:"config:editor",SET_VIEW:"config:view",SET_USERNAME:"config:username",SYNC:"sync",EXPORT:"export",NONE:""};var Ds=/^(\d+)(h|d|w|mo|y)$/,Fs=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,Os=({year:e,month:t,day:n,hour:r=0,minute:o=0})=>{let i=new Date(e,t-1,n,r,o);return i.getFullYear()===e&&i.getMonth()===t-1&&i.getDate()===n&&i.getHours()===r&&i.getMinutes()===o},Us=(e,t=new Date)=>{let n=e.match(Ds);if(!n)return null;let[,r,o]=n,i=Number(r);if(!Number.isInteger(i)||i<=0)return null;let a=new Date(t);switch(o){case"h":return a.setHours(a.getHours()-i),a;case"d":return a.setDate(a.getDate()-i),a;case"w":return a.setDate(a.getDate()-i*7),a;case"mo":return a.setMonth(a.getMonth()-i),a;case"y":return a.setFullYear(a.getFullYear()-i),a;default:return null}},Bs=e=>{let t=e.match(Fs);if(!t)return null;let[,n,r,o,i,a]=t,d=Number(n),u=Number(r),m=Number(o),f=i?Number(i):0,N=a?Number(a):0;return Os({year:d,month:u,day:m,hour:f,minute:N})?new Date(d,u-1,m,f,N):null},Ot=e=>{let t=e.trim().toLowerCase();return Us(t)??Bs(t)},ao=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,_s=[{unit:"h",from:1,to:24},{unit:"d",from:1,to:7},{unit:"w",from:1,to:52},{unit:"mo",from:1,to:12},{unit:"y",from:1,to:5}],lo=(e=_s)=>{let t=[];for(let{unit:n,from:r,to:o}of e)for(let i=r;i<=o;i++)t.push(`${i}${n}`);return t};var $s=["BOARD","TICKET","SWIMLANE"],Le=[p.SYNC,p.HELP,p.EXPORT,p.SET_VIEW,p.SET_EDITOR,p.SET_USERNAME],Ut=[p.NEW,p.RENAME,p.DELETE,p.MOVE],Tn=[p.TAG,p.UNTAG,p.ASSIGN,p.UNASSIGN,p.CLOSE_ISSUE,p.RE_OPEN_ISSUE,p.SET_DESCRIPTION],co=[p.FILTER,p.PEEK],Ws={WORKSPACE:[...Le,...Ut],BOARD:[...co,...Le,...Ut],SWIMLANE:[...co,...Le,...Ut],TICKET:[...Le,...Ut,...Tn],FIELD:[...Le,...Tn],FIELD_LIST:[...Le,...Tn],TEXT:[...Le]},Hs=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Ks=()=>{let{currentNode:e,selectedNode:t,readOnly:n}=v();if(!ro().isSetup)return[p.HELP,p.SET_EDITOR,p.SET_USERNAME];if(!oo())return[p.HELP,p.INIT];if(n)return[p.HELP,p.PEEK,p.EXPORT,p.SET_VIEW];let o=e.context??"WORKSPACE",i=t?.context,a=i&&$s.includes(i);return Ws[o].filter(d=>d===p.RENAME||d===p.DELETE||d===p.MOVE?a:!0)},K=e=>{let{currentNode:t}=v(),n=t.context??"WORKSPACE";return{[p.NONE]:Ks(),[p.EXIT]:["confirm"],[p.EXPORT]:[],[p.SYNC]:[],[p.INIT]:[],[p.HELP]:[],[p.PEEK]:[...lo(),"now","prev","next"],[p.SET_USERNAME]:[],[p.SET_DESCRIPTION]:["confirm"],[p.DELETE]:["confirm"],[p.RE_OPEN_ISSUE]:["confirm"],[p.CLOSE_ISSUE]:["confirm"],[p.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[p.FILTER]:["tag","assignee","description","title","clear"],[p.SET_VIEW]:["dense","wide"],[p.SET_EDITOR]:[...Qr],[p.TAG]:[...new Set([...Object.keys(Ke),...x.getExistingTags()])],[p.UNTAG]:[...Dt()?.value?.map(({name:o})=>o)??[]],[p.UNASSIGN]:[...Ft()?.value?.map(({name:o})=>o)??[]],[p.ASSIGN]:x.getExistingAssignees(),[p.RENAME]:[],[p.NEW]:Hs(n)}[e]??[]};import Ve from"chalk";import{decodeTime as uo}from"ulid";var mo=e=>{let t=Date.now()-e,n=[{label:"y",ms:1e3*60*60*24*365},{label:"mo",ms:1e3*60*60*24*30},{label:"w",ms:1e3*60*60*24*7},{label:"d",ms:1e3*60*60*24},{label:"h",ms:1e3*60*60},{label:"m",ms:1e3*60},{label:"s",ms:1e3}];for(let{label:r,ms:o}of n){let i=Math.floor(t/o);if(i>=1)return`${i}${r} ago`}return"just now"};var po=e=>{try{return c("Decoded date",new Date(uo(e)))}catch(t){return s("Decoding failed + "+t.message)}},wn=e=>{if(!e?.id)return null;try{return uo(e.id)}catch{return null}};var De=(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 go from"chalk";var kn={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Vs=(e,t,n)=>Math.max(t,Math.min(n,e)),Mn=(e,t,n)=>e+(t-e)*n,fo=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},js=(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)),u=0,m=0,f=0;a>=0&&a<1?(u=i,m=d):a>=1&&a<2?(u=d,m=i):a>=2&&a<3?(m=i,f=d):a>=3&&a<4?(m=d,f=i):a>=4&&a<5?(u=d,f=i):(u=i,f=d);let N=o-i/2;return[Math.round((u+N)*255),Math.round((m+N)*255),Math.round((f+N)*255)]},zs=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,Gs=(e,t,n)=>[Math.round(Mn(e[0],t[0],n)),Math.round(Mn(e[1],t[1],n)),Math.round(Mn(e[2],t[2],n))],at=e=>{let n=fo(e)%360,r=js(n,kn.stringColor.saturation,kn.stringColor.lightness);return zs(r)},qs=e=>{let t=kn.gradient.stops,n=Vs(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 Gs(t[i],t[i+1],a)},Bt=e=>fo(e.toLowerCase().trim())/4294967295,Xs=e=>{let t=Bt(e);return qs(t)},Ys=e=>{let[t,n,r]=Xs(e);return{normal:o=>go.bgRgb(t,n,r).black(o),cursor:o=>go.bgRgb(t,n,r).white.bold(o)}};var Pn=e=>Ys(e).normal(` ${e} `),ee=(e,t=Ke)=>{let r=(o=>o.toLowerCase().trim())(e);return r&&t[r]?t[r]:at(r)};var Ne={None:"none",Invalid:"invalid",Valid:"valid"};var Js=["BOARD","TICKET","SWIMLANE"],Ln=()=>{let e=v().selectedNode;return e?.context?Js.includes(e?.context)?_():U({message:"Command not available in this context"}):U({message:"Missing target context"})},Z="<ENTER> to confirm",_=(e="",t=[])=>({message:e,validity:Ne.Valid,completionWordList:t}),U=({message:e,completionWordList:t=[]})=>({validity:Ne.Invalid,message:e,completionWordList:t}),lt=e=>e.length===0,Ae=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:i=1})=>{let u=[...t.filter(Boolean).filter(f=>f.startsWith(o.trim()))].sort((f,N)=>Bt(f)-Bt(N)).slice(0,r).map(Pn),m=u.length>i?u.join(" "):"";return m?`${e}${m}${n}`:""},Dn=({modifier:e})=>{let t="confirm";return e===t?_(Z):U({message:lt(e)?`if you are certain, enter ${Pn(t)}`:"",completionWordList:[t]})},Zs=({list:e,hint:t})=>({modifier:n})=>e.includes(n)?_(Z):U({message:lt(n)?t:""}),Qs=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?U({message:n}):_():U({message:lt(r)?t:""}),dt=({hint:e})=>({modifier:t,inputString:n})=>lt(t)&<(n)?U({message:e,completionWordList:[]}):_(Z),ea={[p.EXPORT]:()=>_(Z+", and create export markdown file"),[p.PEEK]:e=>{let t=e.modifier;if(t==="now")return _(Z);let n={message:"historical state from: '1h', '2d', '23h', '1mo', '2y', 'previous', 'next' or full date as YYYY-MM-DD"};if(t==="prev"||t==="next")return _(Z);let r=Ot(t);if(!t||!r)return U(n);let o=De(v().breadCrumb,"BOARD");if(l(o))return U({message:"Command is not applicable in this context"});let i=po(o.value.id);return l(i)?U({message:"Unable to peek: board id is not a valid ULID"}):ao({date:r,horizonDate:i.value})?_(Z):U({message:Ve.red(`nothing to peek before ${i.value.toISOString().slice(0,16).replace("T"," ")}`)})},[p.EXIT]:()=>_(Z+" and exit the application"),[p.INIT]:()=>_(Z),[p.FILTER]:e=>{if(e.modifier==="clear")return _();let t=a=>K(p.FILTER).includes(a);if(!e.modifier||!t(e.modifier??""))return U({message:Ae({wordList:K(p.FILTER),inputString:e.inputString}),completionWordList:K(p.FILTER)});let r=Object.values(v().tags).map(a=>a.name),o=Object.values(v().contributors).map(a=>a.name),i=e.modifier==="tag"?r:e.modifier==="assignee"?o:[];return e.inputString?i.length&&!i.includes(e.inputString.trim()??"")?U({message:Ae({prefix:`existing ${e.modifier}s... `,wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i}):_():U({message:Ae({prefix:"one of... ",wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i})},[p.NONE]:e=>{let t=K(p.NONE),n=/^[A-Za-z_]+:/g,r=e.inputString.match(n);return r&&r.length?t=[...t.filter(o=>o.trim().match(n))]:t=[...new Set(t.flatMap(o=>o.match(n)?.join("").replace(":","")??o))],e.command?_():U({message:Ae({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0})})},[p.NEW]:e=>Qs({list:K(p.NEW),hint:Ae({wordList:K(p.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[p.SET_DESCRIPTION]:()=>_(Z),[p.HELP]:()=>_(Z),[p.RENAME]:()=>{let e=Ln();return e.validity==="invalid"?e:_(Z)},[p.DELETE]:e=>{let t=Ln();return t.validity==="invalid"?t:Dn(e)},[p.CLOSE_ISSUE]:e=>Dn(e),[p.RE_OPEN_ISSUE]:e=>Dn(e),[p.MOVE]:e=>{let t=Ln();return t.validity==="invalid"?t:dt({hint:Ae({prefix:"hey hacker! These commands are blocked for you... ",wordList:K(p.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[p.TAG]:e=>{let t=x.getExistingTags().map(n=>` ${Ve.bgHex(ee(n))(" "+n+" ")} `).slice(0,10);return dt({hint:"tag name like... "+t.join("")})(e)},[p.UNTAG]:e=>{let t=Dt();if(l(t))return U({message:"Invalid untag target",completionWordList:[]});let n=t.value.map(({name:r})=>r).map(r=>` ${Ve.bgHex(ee(r))(" "+r+" ")} `).slice(0,10);return n.length?dt({hint:" ... "+n.join("")})(e):U({message:"Issue has not tags",completionWordList:[]})},[p.ASSIGN]:e=>{let t=x.getExistingAssignees().map(n=>` ${Ve.bgHex(ee(n))(" "+n+" ")} `).slice(0,10);return dt({hint:"assign to... "+t.join("")})(e)},[p.UNASSIGN]:e=>{let t=Ft();if(l(t))return U({message:"Invalid unassign target",completionWordList:[]});let n=t.value.map(({name:r})=>r).map(r=>` ${Ve.bgHex(ee(r))(" "+r+" ")} `).slice(0,10);return n.length?dt({hint:"remove assignee... "+n.join("")})(e):U({message:"Issue has no assignees",completionWordList:[]})},[p.SET_EDITOR]:e=>{logger.debug(`Validating command: ${e.command} ${e.modifier} ${e.inputString}`);let t=K(p.SET_EDITOR);return e.modifier?_(Z):U({message:Ae({wordList:t,inputString:e.inputString})})},[p.SET_USERNAME]:e=>e.inputString?_():U({message:`Enter a username. Saved in ${Ve.bgBlack("~/.epiq-global/")}`}),[p.SET_VIEW]:e=>Zs({list:K(p.SET_VIEW),hint:Ae({wordList:K(p.SET_VIEW),noOfHints:3,inputString:e.inputString})})(e),[p.SYNC]:()=>_(Z)},vo=Object.fromEntries(Object.entries(ea).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var yo=["frontend","backend","infrastructure","architecture","integration","configuration","implementation","application","deployment","environment","framework","platform","service","component","module","gateway","pipeline","containerization","orchestrator","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","reproducibility","reproduction","investigation","triage","workaround","mitigation","remediation","optimization","stabilization","refinement","failure","outage","blocking","criticality","severity","escalation","diagnostics","analysis","resolution","corruption","inconsistency","validation","verification","authorization","authentication","confidentiality","availability","accessibility","reliability","compliance","governance","encryption","decryption","integrity","auditing","traceability","accountability","protection","privileges","permissions","dependency","orchestration","provisioning","synchronization","compatibility","incompatibility","interoperability","observability","instrumentation","telemetry","loadbalancing","discovery","registration","scheduling","coordination","distribution","isolation","virtualization","serialization","deserialization","initialization","instantiation","propagation","aggregation","consolidation","normalization","standardization","transformation","reconciliation","correlation","processing","indexing","partitioning","enrichment","validation","filtering","streaming","batching","concurrency","parallelism","contention","deadlock","throttling","ratelimiting","backpressure","fragmentation","saturation","exhaustion","partitioning","replication","redundancy","failover","deprecation","obsolescence","starvation","overload","underutilization","latency","throughput","refactoring","modularization","encapsulation","abstraction","extensibility","configurability","maintainability","recoverability","sustainability","readability","testability","debuggability","reusability","simplicity","consistency","performance","functionality","requirement","recommendation","improvement","enhancement","clarification","documentation","description","acceptance","criteria","estimation","prioritization","dependency","deliverable","milestone","iteration"];var R={Exit:"exit",Init:"init",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",Peek:"peek",SetView:"set-view",SetEditor:"set-editor",SetUserName:"set-user-name",SetAutoSync:"set-auto-sync",NewItem:"add-new-item",TagTicket:"ticket-tag",UntagTicket:"ticket-untag",AssignUserToTicket:"ticket-assign-user",UnassignUserFromTicket:"ticket-unassign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Sync:"sync",Export:"export"};var xo=e=>Object.values(p).includes(e),No=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:a,validity:d,completionWordList:u}=vo[n].validate(n,r,i),m=o==="command"?Object.values(p):n&&e.target==="modifier"?K(n):yo;return{validity:d,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:a??"",autoCompletion:t?Zr(e,[...u,...m]):{hint:"",hints:[],remainder:"",overlap:0}}};var Eo=e=>{let t=e.trimStart(),n=na(t),r=n[0]??"",o=n[1]??"",i=/\s$/.test(e),a=ra(e),d=xo(r)?r:null,u=d!==null,m=r!=="",f=d?K(d)??[]:[],N=d&&f.includes(o)?o:"",E="word";n.length===0||n.length===1&&!i?E="command":(n.length===1&&i||n.length===2&&!i)&&(E="modifier");let C=i?"":a,I=ta(t,d,N);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:a,hasCommand:m,command:d,isCommandKeyword:u,isLastWordCompleted:i,modifier:N,target:E,inputToMatch:C,inputString:I}},ta=(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},na=e=>e.trim()?e.trim().split(/\s+/):[],ra=e=>e.trimEnd().split(/\s+/).at(-1)??"";var Io=" ",je={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Ne.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},oa=new Set,ho=()=>{for(let e of oa)e()};var Ee=e=>{let n=e(je),r=Eo(n.value),o=n.cursorPosition===n.value.length;je={...n,commandMeta:No(r,o)},ho()},ct=({message:e,status:t})=>{let n=structuredClone(je);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,je=n,ho(),c(e,null)},Fn=e=>{Ee(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},On=e=>{Ee(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}})},Co=()=>{Ee(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}})},bo=()=>{Ee(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}})},W=e=>{Ee(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}})},So=()=>{Ee(e=>({...e,commandIsPending:!0}))},Ro=({addToHistory:e=!0})=>{Ee(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),ia()},Ao=()=>{Ee(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}})},To=()=>{Ee(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},ia=()=>W(()=>""),ne=()=>je,_t=()=>{let[e,...t]=je.value.split(Io);return t.join(Io).trim()};var T={Sync:"sync",NavPreviousItem:"navPreviousItem",NavNextItem:"navNextItem",NavToPreviousContainer:"navToPreviousContainer",NavToNextContainer:"navToNextContainer",MovePreviousItem:"movePreviousItem",MoveNextItem:"moveNextItem",MoveToPreviousContainer:"moveToPreviousContainer",MoveToNextContainer:"moveToNextContainer",Confirm:"confirm",Exit:"exit",ViewHelp:"viewHelp",HideHelp:"hideHelp",InitMove:"initMove",ConfirmMove:"confirmMove",Delete:"Delete",InitCommandLine:"initCommandLine",ExitCommandLine:"exitCommandLine",CaptureInput:"captureInput",EraseInput:"eraseInput",AddItem:"addItem",GetLastCommandFromHistory:"getLastCommandFromHistory",GetNextCommandFromHistory:"getNextCommandFromHistory",AutoCompleteCommand:"autoCompleteCommand",MoveCursorLeft:"MoveCursorLeft",MoveCursorRight:"MoveCursorRight",MoveCursorLeftOfWord:"MoveCursorLeftOfWord",MoveCursorRightOfWord:"MoveCursorRightOfWord",EraseInputWord:"EraseInputWord",None:"None",Edit:"edit",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"};var wo=e=>{let{context:t}=v()?.currentNode;if(!t)return R.None;switch(e){case p.EXIT:return R.Exit;case p.EXPORT:return R.Export;case p.INIT:return R.Init;case p.DELETE:return R.Delete;case p.SET_DESCRIPTION:return R.Edit;case p.HELP:return R.ViewHelp;case p.RE_OPEN_ISSUE:return R.ReopenIssue;case p.CLOSE_ISSUE:return R.CloseIssue;case p.TAG:return R.TagTicket;case p.UNTAG:return R.UntagTicket;case p.ASSIGN:return R.AssignUserToTicket;case p.UNASSIGN:return R.UnassignUserFromTicket;case p.RENAME:return R.Rename;case p.NEW:return R.NewItem;case p.FILTER:return R.Filter;case p.MOVE:return R.Move;case p.PEEK:return R.Peek;case p.SET_USERNAME:return R.SetUserName;case p.SET_EDITOR:return R.SetEditor;case p.SET_VIEW:return R.SetView;case p.SYNC:return R.Sync;default:return R.None}};import{ulid as B}from"ulid";import{spawnSync as pa}from"node:child_process";import ga from"node:os";import Lo from"node:path";import{ulid as fa}from"ulid";import{accessSync as sa,copyFileSync as aa,existsSync as $t,mkdirSync as Mo,readdirSync as ko,readFileSync as da,renameSync as la,rmSync as ca,statSync as Po,unlinkSync as ua,writeFileSync as ma}from"node:fs";import ze from"node:path";var re={writeToFile:(e,t)=>{try{let n=ze.dirname(e);$t(n)||Mo(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);ma(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return da(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=re.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 $t(e)&&Po(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await sa(e),!0}catch{return!1}},mkDir:e=>Mo(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=ze.parse(t);for(;;){let r=ze.join(t,e);try{if($t(r)&&Po(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=ze.dirname(t)}return null},readFirstJSON(e){try{if(!re.dirExists(e))return null;let t=ko(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=ze.join(e,t);return re.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return re.dirExists(e)?ko(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{ua(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{ca(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(ze.dirname(t)),!n?.overwrite&&$t(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{la(e,t)}catch(r){if(r?.code==="EXDEV"){aa(e,t),this.rmFile(e);return}throw r}}};function va(){let{preferredEditor:e}=ge(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function ya(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function Do(e){let t=Lo.join(ga.tmpdir(),"epiq");re.mkDir(t);let n=Lo.join(t,fa());re.writeToFile(n,e??"");let r=va();for(let o of r){let i=ya(o,n),a=pa(i,{stdio:"inherit",shell:!0});if(!a.error&&a.status===0){let d=re.readFile(n);if(d==null)return s("Unable to read edited file");let u=d.replace(/\r?\n$/,"");return c("Successfully edited",u)}}return s("Unable to open editor")}import{monotonicFactory as xa,ulid as Wt}from"ulid";var Ht=xa(),Kt=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let i=Ht(),a=Ht(),d=Ht(),u=Ht(),m=J(),f=j(m,void 0),N=j(f,void 0);return[{id:Wt(),userId:r,userName:o,action:"add.issue",payload:{id:i,parent:t,name:e,rank:n}},{id:Wt(),userId:r,userName:o,action:"add.field",payload:{id:a,parent:i,name:"Description",val:"",rank:m}},{id:Wt(),userId:r,userName:o,action:"add.field",payload:{id:d,parent:i,name:"Assignees",rank:f}},{id:Wt(),userId:r,userName:o,action:"add.field",payload:{id:u,parent:i,name:"Tags",rank:N}}]};function q(e){let t=ut(e);if(t.status!==pe.Success)return t;let n=Ct({event:e});return l(n)?n:t}function Ge(e){return e.map(t=>q(t))}import Na from"node:os";import Fo from"node:path";import{z as mt}from"zod";var Ea={userId:"",userName:"",preferredEditor:"",autoSync:!1},Oo=mt.object({preferredEditor:mt.string().optional(),userName:mt.string().optional(),userId:mt.string().optional(),autoSync:mt.boolean().optional()}).strict(),Ia="config.json",Uo=()=>Fo.join(Na.homedir(),ie),Un=()=>Fo.join(Uo(),Ia),Bn=()=>{try{return re.mkDir(Uo()),c(`Ensured ~/${ie} exists`,null)}catch{return s(`Unable to create ~/${ie}`)}},ha=e=>{let t;try{t=JSON.parse(e)}catch{return s(`Invalid ~/${ie}/config.json JSON`)}let n=Oo.safeParse(t??{});return n.success?c("Parsed config",n.data):s(`Invalid ~/${ie}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},Bo=()=>{let e=Bn();if(l(e))return s(e.message);let t=Un(),n=re.readFile(t);return n==null||n.trim()===""?c("No config found, using empty config",{autoSync:!1,preferredEditor:"",userId:"",userName:""}):ha(n)},_o=e=>{let t=Bn();if(l(t))return s(t.message);let n=Oo.safeParse(e);if(!n.success)return s(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=Un();try{return re.writeToFile(r,JSON.stringify(n.data,null,2)+`
|
|
57
|
+
`),c("Config written",null)}catch{return s(`Unable to write ~/${ie}/config.json`)}},Vt=e=>{let t=Bo();if(l(t))return s("Failed to read existing config");let n={...t.value,...e};return _o(n)},$o=()=>{let e=Un(),t=Bn();if(l(t))return s(`Unable to create ~/${ie}`);if(!(re.readFile(e)!==null)){let u=_o(Ea);if(l(u))throw new Error(`Unable to create ~/${ie}/config.json`)}let r=Bo();if(l(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:i,userId:a,autoSync:d}=r.value;return!i||!a?s(`User name or ID not configured in ~/${ie}/config.json`):c("successfully loaded settings",{preferredEditor:o??"",userName:i,userId:a,autoSync:d??!1})};var Ho=()=>{let{currentNode:e,selectedIndex:t}=v(),n=S(e.id)[t];return{currentNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:n?.parentNodeId??null,selectedIndex:t}},Wo=(e,t)=>Math.max(0,Math.min(e,Math.max(0,t-1))),Ko=e=>{let{nodes:t}=v(),n=t[e.currentNodeId];if(n&&!n.isDeleted&&e.selectedNodeId){let i=S(n.id).findIndex(a=>a.id===e.selectedNodeId);if(i>=0)return F.navigate({currentNode:n,selectedIndex:i}),c("Restored navigation",null)}if(e.selectedNodeId){let o=t[e.selectedNodeId];if(o&&!o.isDeleted&&o.parentNodeId){let i=t[o.parentNodeId];if(i&&!i.isDeleted){let a=S(i.id).findIndex(d=>d.id===o.id);if(a>=0)return F.navigate({currentNode:i,selectedIndex:a}),c("Restored navigation to moved node",null)}}}if(n&&!n.isDeleted){let o=S(n.id);return F.navigate({currentNode:n,selectedIndex:Wo(e.selectedIndex,o.length)}),c("Restored navigation to previous container",null)}if(e.parentNodeId){let o=t[e.parentNodeId];if(o&&!o.isDeleted){let i=S(o.id);return F.navigate({currentNode:o,selectedIndex:Wo(e.selectedIndex,i.length)}),c("Restored navigation to parent",null)}}let r=t[v().rootNodeId];return!r||r.isDeleted?s("Unable to restore navigation"):(F.navigate({currentNode:r,selectedIndex:0}),c("Restored navigation to root",null))};import oi from"node:fs";import Ya from"node:path";import Ja from"react";import{Box as qa}from"ink";import Zt from"react";import{Box as Wn,Text as Da}from"ink";import me from"react";import{Text as Vo}from"ink";import jo,{useEffect as zo,useState as Ca}from"react";var Go={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"command-line":["\u276F "]},le=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=ue(),r=Go[n]??Go.default,[o,i]=Ca(0);if(zo(()=>{i(0)},[r]),zo(()=>{if(!e)return;let d=setInterval(()=>{i(u=>(u+1)%r.length)},500);return()=>clearInterval(d)},[e,r]),!e)return jo.createElement(Vo,null,t);let a=r[o]??r[0]??t;return jo.createElement(Vo,{color:w.accent,dimColor:o===1},a)};import{Box as _n,Text as ba}from"ink";import jt from"react";var zt=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,scrollByOne:o=!1})=>{if(e.length===0)return null;let i=Math.max(1,Math.floor(t)),a=Math.max(1,Math.ceil(r)),d=Math.max(1,Math.floor(i/a)),u=Math.max(0,Math.min(n,e.length-1)),m=Math.max(0,e.length-d),f=o?Math.min(m,Math.max(0,u-d+1)):Math.min(m,Math.floor(u/d)*d),N=f+d,E=e.slice(f,N),C=e.length>d,I=i,A=C?Math.max(1,Math.floor(d/e.length*I)):I,b=Math.max(0,I-A),k=Math.max(1,e.length-d),X=C?Math.floor(f/k*b):0;return jt.createElement(_n,{flexDirection:"row",height:i,width:"100%"},jt.createElement(_n,{flexDirection:"column",flexGrow:1,height:i},E),jt.createElement(_n,{flexDirection:"column",width:1,height:I},Array.from({length:I}).map((er,Ye)=>jt.createElement(ba,{key:Ye,color:C&&Ye>=X&&Ye<X+A?w.accent:w.secondary},C?"\u2502":" "))))};import{Box as Xt,Text as ka}from"ink";import Fe from"react";import{Text as Sa}from"ink";import Ra from"react";var Aa=e=>e.toLowerCase().trim(),Ta=(e,t=Ke)=>{let n=Aa(e);return t[n]?t[n]:at(n)},Gt=({id:e,isSelected:t})=>{let n=x.getContributor(e);if(n)return Ra.createElement(Sa,{underline:t,color:Ta(n.name)},"@"+n.name)};import{Text as wa}from"ink";import Ma from"react";var qt=({id:e,isSelected:t})=>{let n=x.getTag(e);if(n)return Ma.createElement(wa,{underline:t,backgroundColor:ee(n.name),color:w.primary}," "+n.name+" ")};var qo=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=Pt(We(t.title),r),i=Rn(t),a=An(t);return Fe.createElement(Xt,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?w.accent:w.secondary,justifyContent:"space-between"},Fe.createElement(Xt,{borderBottom:!0},Fe.createElement(Xt,{paddingLeft:1,flexDirection:"column"},Fe.createElement(ka,{color:w.primary},o))),Fe.createElement(Xt,{flexDirection:"row",paddingLeft:1},i.map(d=>Fe.createElement(qt,{key:d.id,id:d.id})),a.map(d=>Fe.createElement(Gt,{key:d.id,id:d.id}))))};import Pa from"chalk";import{Box as pt,Text as $n}from"ink";import Ie from"react";var La=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,Xo=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=S(t.id),a=A=>{let b=i.find(k=>k.title===A);return b?S(b.id).map(k=>typeof k.props?.value=="string"?k.props.value:"").filter(k=>!!k):[]},d=a("Tags").map(A=>x.getTag(A)).filter(A=>!!A),u=a("Assignees").map(A=>x.getContributor(A)).filter(A=>!!A),m=1,f=d.length*(1+m),N=u.length*(2+m),E=d.map(A=>Ie.createElement(pt,{key:A.id,paddingRight:m},Ie.createElement($n,{color:ee(A.name)},"\u25A0"))),C=u.map(A=>Ie.createElement(pt,{key:A.id,paddingRight:m},Ie.createElement($n,{color:at(A.name)},"@"+A.name.at(0)))),I=n?w.accent:o===g.MOVE?w.secondary:w.primary;return Ie.createElement(pt,{borderBottom:!0,justifyContent:"space-between"},Ie.createElement(pt,null,Ie.createElement(le,{isSelected:n,placeholder:Pa.dim.gray(r+1+" ")}),Ie.createElement($n,{wrap:"truncate",color:I},La(t.title,e-f-N-14))),Ie.createElement(pt,null,E,C))};var Fa=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:i,listSelectedIndex:a,mode:d})=>{let{renderedChildrenIndex:u}=ue(),m=u[e.id]??[],f=`${e.title} (${m.length})`,N=3,E=o?1:4,C=r-N-(o?2:1),I=me.createElement(Wn,{borderStyle:"round",borderColor:w.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},me.createElement(le,{isSelected:t}),me.createElement(Da,{bold:!0,color:t?w.accent:w.primary},f," ",e.readonly?"\u{1F512}":"")),A=(b,k)=>{let X=i&&a===k;return o?me.createElement(Xo,{key:b.id,index:k,width:n,ticket:b,isSelected:X,mode:d}):me.createElement(qo,{key:b.id,width:n,ticket:b,isSelected:X})};return me.createElement(Wn,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?w.accent:w.secondary,paddingRight:1,paddingLeft:1,height:r},I,me.createElement(Wn,{padding:o?1:0},m.length>0&&me.createElement(zt,{selectedIndex:a,height:C,itemHeight:E},m.map(A)),me.createElement(le,{isSelected:i&&a===-1})))},Yo=me.memo(Fa);import{Box as Vn,Text as za}from"ink";import Te,{useEffect as jn,useMemo as ei}from"react";import Oe from"chalk";import Jo from"string-width";import{decodeTime as Oa}from"ulid";var Ua=(e,t)=>e+" ".repeat(Math.max(0,t-Jo(e))),Ba=(e,t)=>" ".repeat(Math.max(0,t-Jo(e)))+e,_a=e=>(()=>{let n={"add.issue":"Created with title","assign.issue":"Assigned to","unassign.issue":"Unassigned from","close.issue":"Closed","delete.node":"Deleted","edit.title":"Changed title to","edit.description":"Changed description","reopen.issue":"Reopened","tag.issue":"Tagged with","untag.issue":"Removed tag","lock.node":"Locked node","move.node":"Moved issue"};return(o=>n[o]??(o.endsWith("e")?`${o}d`:`${o}ed`))(e)})(),$a=e=>{switch(e.action){case"move.node":{let t=x.getNode(e.payload.parent);return`to ${t?Oe.dim.bgBlack(` ${t.title} `):"unknown"} with rank ${e.payload.rank}`}case"tag.issue":{let t=v().tags[e.payload.tagId];return t?Oe.bgHex(ee(t.name))(` ${t.name} `):"unknown tag"}case"untag.issue":{let t=v().tags[e.payload.tagId];return t?Oe.bgHex(ee(t.name))(` ${t.name} `):"unknown tag"}case"assign.issue":{let t=v().contributors[e.payload.contributor];return t?Oe.hex(ee(t.name))(` ${t.name} `):"unknown user"}case"unassign.issue":{let t=v().contributors[e.payload.contributor];return t?Oe.hex(ee(t.name))(` ${t.name} `):"unknown user"}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"create.contributor":case"edit.title":return`"${"name"in e.payload?e.payload.name:""}"`;default:return""}},Wa=e=>{let t=mo(Oa(e));return Oe.gray(Ba(t,8))},Ha=12,Ka=e=>Ua(`${e}`,Ha),Zo=e=>{let t=Wa(e.id),n=Ka(e.userName),r=_a(e.action),o=$a(e),i=Oe.dim("\u203A"),a=[r,o].filter(Boolean).join(" ");return`${n} ${t} ${i} ${a}`};import{Box as Yt,Text as Va}from"ink";import he from"react";var Qo=({selectedIndex:e,parent:t,selected:n})=>{let{currentNode:r}=ue(),{title:o}=t,i=S(t.id).map(a=>{let d=typeof a.props?.value=="string"?a.props.value:"";if(o==="Assignees")return x.getContributor(d)?.id;if(o==="Tags")return x.getTag(d)?.id}).filter(a=>!!a);return he.createElement(Yt,{alignItems:"center",paddingTop:1},he.createElement(Yt,{minWidth:12},he.createElement(le,{isSelected:n}),he.createElement(Va,{color:n?w.accent:w.secondary2},o,":")),he.createElement(Yt,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((a,d)=>{let u=r.id===t.id&&d===e;return he.createElement(Yt,{key:`${o}-${a}`,paddingRight:2,minHeight:1},he.createElement(le,{isSelected:u}),o==="Assignees"?he.createElement(Gt,{isSelected:u,id:a}):o==="Tags"?he.createElement(qt,{isSelected:u,id:a}):null)})))};import{Box as Jt,Text as Hn}from"ink";import Ce,{useEffect as ja}from"react";var Kn=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:a,currentNode:d}=ue(),u=E=>String(E).replace(/\r?\n/g,""),m=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];ja(()=>{let E=[];return m.forEach((C,I)=>{let A=Q.text({id:`${I}`,name:`Line ${I+1}`,parentNodeId:e,props:{value:C},readonly:!0}),b=x.createNodeAtPosition(A);tr(b)&&E.push(b.value.id)}),()=>E.forEach(x.deleteNode)},[e,n]);let f="\u2029",N=m.map((E,C)=>{let I=d.id===e&&a===C;return Ce.createElement(Jt,{key:`${e}-${C}`},Ce.createElement(Hn,{color:I?w.primary:w.secondary2,dimColor:!I},`${C+1} `.padStart(5,"\xA0")),Ce.createElement(Hn,{backgroundColor:I?"gray":""},u(E.length?Pt(E,i-10):f)))});return Ce.createElement(Jt,{flexDirection:"column",paddingTop:1},Ce.createElement(Jt,null,Ce.createElement(le,{isSelected:o}),Ce.createElement(Hn,{color:o?w.accent:w.secondary2},t)),Ce.createElement(Jt,{flexDirection:"row",borderStyle:"round",borderColor:w.secondary,paddingLeft:1,paddingRight:1,marginLeft:1},Ce.createElement(zt,{scrollByOne:!0,children:N,height:r-2,selectedIndex:a,itemHeight:1})))};var Ga=e=>`${e}::log`,ti=e=>e==="Assignees"||e==="Tags",ni=({ticket:e,height:t})=>{let{selectedIndex:n,currentNode:r}=ue(),o=process.stdout.columns||120,i=ei(()=>Ga(e.id),[e.id]),a=ei(()=>[...e.log].reverse().map(Zo).join(`
|
|
58
|
+
`),[e.log]);jn(()=>{if(x.getNode(i))return;let k={...Q.field(i,"Log",e.id,{value:a}),readonly:!0,childRenderAxis:"vertical"};return x.createNodeAtPosition(k),()=>{x.deleteNode(i)}},[i,e.id,a]),jn(()=>{let b=x.getNode(i);b&&b.props.value!==a&&x.updateNode({...b,props:{...b.props,value:a},childRenderAxis:"vertical",readonly:!0})},[i,a]);let d=r.id===e.id,u=r.id===i||r.parentNodeId===i;jn(()=>{u&&(n>=0||F.navigate({selectedIndex:0}))},[u,n]);let m=S(e.id);if(u){let b=x.getNode(i),X=t-3;return Te.createElement(Vn,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},b?Te.createElement(Kn,{id:b.id,label:"Event log",text:b.props.value??"",selected:!1,maxWidth:o,height:X}):null)}let f=m.reduce((b,k)=>ti(k.title)||k.id===i?b+1:b,0),N=2,E=f*1,I=t-3-E-N,A=(b,k)=>ti(b.title)?Te.createElement(Qo,{key:b.id,parent:b,selected:k,selectedIndex:n}):b.id===i?Te.createElement(Vn,{key:b.id,paddingTop:1},Te.createElement(le,{isSelected:k}),Te.createElement(za,{backgroundColor:w.secondary,color:k?w.accent:w.primary}," History \u203A\u203A ")):b.title==="Description"?Te.createElement(Kn,{label:"Description (press e to edit)",key:b.id,id:b.id,text:b.props.value??"",selected:k,maxWidth:o,height:I}):null;return Te.createElement(Vn,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},m.map((b,k)=>A(b,d&&n===k)))};var Xa=({swimlanes:e,currentNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:i,height:a,width:d})=>{let u=t.context,m=u===M.TICKET||u===M.FIELD_LIST||u===M.FIELD,f=u===M.BOARD||u===M.SWIMLANE,N=u===M.TICKET?t:r.find(b=>b.context===M.TICKET),E=Math.floor(d/3),C=Math.floor(d/Math.max(e.length,1)),I=Math.min(C,E),A=i==="dense";return Zt.createElement(qa,{flexDirection:"row",height:a},f&&e.map((b,k)=>{let X=t.id===b.id,er=X?n:-1,Ye=t.context===M.BOARD&&n===k;return Zt.createElement(Yo,{key:b.id,height:a,width:I,swimlane:b,isSelected:Ye,isDense:A,isFocused:X,listSelectedIndex:er,mode:o})}),m&&N&&Zt.createElement(ni,{height:a,ticket:N}))},ri=Zt.memo(Xa);import{render as Za}from"ink";import{Writable as Qa}from"node:stream";var gt=e=>String(e).padStart(2,"0"),ed=e=>{let t=e.getUTCFullYear(),n=gt(e.getUTCMonth()+1),r=gt(e.getUTCDate()),o=gt(e.getUTCHours()),i=gt(e.getUTCMinutes()),a=gt(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${i}-${a}`},td=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",nd=async(e,{width:t,height:n})=>{let r="",o=new Qa({write(a,d,u){let m=rd(a.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let i=Za(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(a=>setTimeout(a,0)),i.unmount(),r},rd=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),ii=async()=>{let{currentNode:e,selectedIndex:t,breadCrumb:n,viewMode:r,mode:o,renderedChildrenIndex:i}=v(),a=n.find(k=>k.context==="BOARD");if(!a)return s("No board found to export");let d=120,u=40,m=await nd(Ja.createElement(ri,{height:u,width:d,swimlanes:(i[a.id]??[]).filter(k=>k!==void 0&&Tt(k)),currentNode:e,selectedIndex:t,breadCrumb:n,viewMode:r,mode:o}),{width:d,height:u});if(!m)return s("Failed to render board export");let f=se(process.cwd());if(l(f))return s("Unable to export, epiq root not found");let N=new Date,E=ed(N),C=`board_${td(a.title)}_${E}.md`,I=nr(f.value);oi.mkdirSync(I,{recursive:!0});let A=Ya.join(I,C),b=`# Board - ${a.title}
|
|
59
|
+
Date: ${N.toISOString()}
|
|
60
|
+
|
|
61
|
+
\`\`\`text
|
|
62
|
+
${m}
|
|
63
|
+
\`\`\`
|
|
64
|
+
`;return oi.writeFileSync(A,b,"utf8"),c("Exported board layout",A)};var Qt=e=>be($(e),{at:"end"}),be=(e,t={at:"end"})=>{if(e.length===0)return c("Resolved rank",J());switch(t.at){case"start":{let n=e[0];return n?c("Resolved rank",j(void 0,n.rank)):s("Unable to resolve first sibling")}case"end":{let n=e[e.length-1];return n?c("Resolved rank",j(n.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let n=si(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",j(r?.rank,o.rank)):s("Sibling not found")}case"after":{let n=si(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",j(r.rank,o?.rank)):s("Sibling not found")}}},$=e=>Object.values(v().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),si=(e,t)=>e.findIndex(n=>n.id===t);var ai=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 di=e=>Object.values(v().tags).find(t=>t.name===e),li=e=>Object.values(v().contributors).find(t=>t.name===e),ci=[{systemOnly:!0,intent:R.Move,mode:g.COMMAND_LINE,action:()=>{let e=Y();if(l(e))return s("Unable to resolve user ID");let{modifier:t}=ne().commandMeta,n=()=>{let d=we();if(!d)return s("No pending move state");let u=d.payload.id;if(!v().nodes[u])return s("Moved node not found");let f=d.payload.parent,N=v().nodes[f];if(!N)return s("Move parent not found");let E=S(f).findIndex(C=>C.id===u);return E===-1?s("Moved node not found among rendered children"):(F.navigate({currentNode:N,selectedIndex:E}),c("Synchronized navigation to moved node",null))},r=d=>{if(l(d))return s(d.message);let u=n();return l(u)?s(u.message):c("Updated move preview",null)},{currentNode:o,selectedIndex:i}=v(),a=S(o.id)[i];if(!a)return h({mode:g.DEFAULT}),s("No move target");if(t==="start"){if(a.readonly)return s("Target node is read-only");if(i===-1)return s("No item selected");if(!a.parentNodeId)return s("Target has no parent");let d=$(a.parentNodeId),u=d.findIndex(({id:I})=>I===a.id);if(u===-1)return s("Target not found among siblings");let m=d[u-1],f=d[u+1],N=f!=null?{at:"before",sibling:f.id}:m!=null?{at:"after",sibling:m.id}:{at:"start"},E=Xe({id:a.id,parentId:a.parentNodeId,position:N});if(l(E))return E;ft({id:B(),action:"move.node",payload:{id:a.id,parent:a.parentNodeId,rank:E.value},...e.value}),h({mode:g.MOVE});let C=n();return l(C)?s(C.message):c("Move initialized",null)}if(t==="next")return h({mode:g.MOVE}),r(qn(1));if(t==="previous")return h({mode:g.MOVE}),r(qn(-1));if(t==="to-next")return h({mode:g.MOVE}),r(Gn(1));if(t==="to-previous")return h({mode:g.MOVE}),r(Gn(-1));if(t==="confirm"){h({mode:g.DEFAULT});let d=we();if(!d)return s("No pending move to confirm");let u=q(d);if(l(u))return u;let m=n();return l(m)?s(m.message):(ft(null),c("Moved item",null))}return t==="cancel"?(ft(null),h({mode:g.DEFAULT}),c("Cancelling move",null)):s("Invalid move modifier")}},{intent:R.Delete,mode:g.COMMAND_LINE,action:()=>{let e=Y();if(l(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=v(),r=S(t.id)[n];return r?q({id:B(),action:"delete.node",payload:{id:r.id},...e.value}):s("Unable to resolve child to delete")},onSuccess:()=>h({mode:g.DEFAULT})},{intent:R.Edit,mode:g.COMMAND_LINE,action:()=>{let e=Y();if(l(e))return s("Unable to resolve user ID");let t=De(v().breadCrumb,"TICKET");if(l(t))return s("Edit target must be an issue");let n=t.value;if(n.readonly)return s("Cannot edit readonly field");let{currentNode:r,selectedIndex:o}=v();if(!S(n.id)[o])return s("No selected field");let a=S(r.id)[o];if(!a)return s("No selected field");if(a.readonly)return s("Cannot edit readonly field");let d=a.props.value;if(typeof d!="string")return s("Selected field is not editable text");let u=Do(d);if(l(u))return s("Failed to edit field");let m=u.value;return m===d?c("No changes made",null):a.title==="Description"?q({id:B(),action:"edit.description",payload:{id:a.id,md:m},...e.value}):a.title==="Title"?q({id:B(),action:"edit.title",payload:{id:a.id,name:m},...e.value}):s(`Editing not supported for "${a.title}"`)},onSuccess:()=>h({mode:g.DEFAULT})},{intent:R.Filter,mode:g.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=ne().commandMeta,n=/(!=|=)/,[r,o]=e.split(n);if(!r||!(d=>K(p.FILTER).map(u=>u.split(n)[0]).includes(d))(r))return s("Invalid filter modifier");let a={target:r,operator:"=",value:t.trim()};return oe(d=>({...d,filters:e==="clear"?[]:[...d.filters,a],mode:g.DEFAULT})),c("Viewing help",null)}},{intent:R.ViewHelp,mode:g.COMMAND_LINE,action:()=>(h({mode:g.HELP}),c("Viewing help",null))},{intent:R.CloseIssue,mode:g.COMMAND_LINE,action:()=>{let e=Y();if(l(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=v(),r=S(t.id)[n];if(!r)return s("Unable to close issue, no target found");if(!V(r))return s("Cannot close in this context");let o=v().nodes[z];if(!o)return s("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return s("Issue is already closed");let i=be($(o.id).filter(d=>d.id!==r.id),{at:"end"});if(l(i))return i;let a=q({id:B(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:i.value},...e.value});return l(a)?a:c("Issue closed",null)},onSuccess:()=>h({mode:g.DEFAULT})},{intent:R.ReopenIssue,mode:g.COMMAND_LINE,action:()=>{let e=Y();if(l(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=v(),r=S(t.id)[n];if(!r)return s("Unable to reopen issue, no target found");let o=r.context==="TICKET"?c("Resolved ticket",r):qe(r.id,"TICKET");if(l(o))return s("Cannot reopen in this context");let i=o.value,a=v().nodes[z];if(!a)return s("Unable to locate closed swimlane");if(i.parentNodeId!==a.id)return s("Issue is not closed");if(!V(i))return s("Target node is not issue");let d=ai(i);if(!d)return s("Unable to resolve previous parent from issue history");if(d===a.id)return s("Previous parent resolves to closed swimlane");let u=v().nodes[d];if(!u)return s("Previous parent no longer exists");let m=be($(u.id).filter(N=>N.id!==i.id),{at:"end"});if(l(m))return m;let f=q({id:B(),action:"reopen.issue",payload:{id:i.id,parent:u.id,rank:m.value},...e.value});return l(f)?f:c("Issue reopened",null)},onSuccess:()=>h({mode:g.DEFAULT})},{intent:R.SetUserName,mode:g.COMMAND_LINE,action:()=>{let{userId:e,preferredEditor:t,userName:n}=ge(),r=_t()?.trim();if(!r)return s("No username provided");let o=r??n,i=e??B();if(!o||!i)return s("Unable to resolve user name or id");let a=Vt({userName:o,userId:i,preferredEditor:t??""});return l(a)?a:(It({userName:o,userId:i}),h({mode:g.DEFAULT}),c(`Username set to "${r}"`,null))}},{intent:R.Init,mode:g.COMMAND_LINE,action:()=>{let e=Sn();if(l(e))return e;let{rootNodeId:t,nodes:n}=v();return F.navigate({currentNode:n[t],selectedIndex:0}),h({mode:g.DEFAULT}),c("Project initialized",null)}},{intent:R.SetEditor,mode:g.COMMAND_LINE,action:()=>{let e=_t()?.trim();if(!e)return s("No editor provided");let t=Vt({preferredEditor:e});return l(t)?t:(It({preferredEditor:e}),h({mode:g.DEFAULT}),c(`Editor configuration set to "${e}"`,null))}},{intent:R.SetAutoSync,mode:g.COMMAND_LINE,action:()=>{let e=ne().commandMeta.modifier;if(e!=="true"&&e!=="false")return s("Invalid response");let t=e.toLowerCase()==="true",n=Vt({autoSync:t});return l(n)?n:(It({autoSync:t}),h({mode:g.DEFAULT}),c(`Auto synchronization set to "${t}"`,null))}},{intent:R.NewItem,mode:g.COMMAND_LINE,action:(e,t)=>{let n=Y();if(l(n))return s("Unable to resolve user ID");if(!t.inputString)return s(`provide a name for your ${t.modifier}`);let{breadCrumb:r,currentNode:o,selectedIndex:i}=v(),a=d=>{let u=q(d);if(l(u))return u;let m=x.getNode(u.value.result.id);if(!m)return s("Created node not found");if(!m.parentNodeId)return u;let f=x.getNode(m.parentNodeId);return f?(F.navigate({currentNode:f,selectedIndex:x.getSiblings(m.parentNodeId).findIndex(({id:N})=>N===m.id)}),u):s("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:d}=v(),u=x.getNode(d);if(!u)return s("Workspace not found");let m=Qt(u.id);return l(m)?m:a({id:B(),action:"add.board",payload:{id:B(),name:t.inputString,parent:u.id,rank:m.value},...n.value})}if(t.modifier==="swimlane"){let d=De(r,"BOARD");if(l(d))return s("Unable to add swimlane in this context");let u=Qt(d.value.id);return l(u)?u:a({id:B(),action:"add.swimlane",payload:{id:B(),name:t.inputString,parent:d.value.id,rank:u.value},...n.value})}if(t.modifier==="issue"){let d=S(o.id)[i],u=o.context==="SWIMLANE"?o:o.context==="BOARD"&&d?.context==="SWIMLANE"?d:(()=>{let I=De(r,"SWIMLANE");return l(I)?null:I.value})();if(!u)return s("Unable to add issue in this context");let m=Qt(u.id);if(l(m))return m;let f=Kt({name:t.inputString,parent:u.id,rank:m.value,user:n.value}),N=Ge(f);if(N.some(I=>l(I)))return s("Issue create failed: "+N.filter(l).map(I=>I.message).filter(Boolean).join(", "));let E=N[0];if(!E||l(E))return s("Issue creation failed");let C=f[0]?.payload.id;return C?(F.navigate({currentNode:u,selectedIndex:x.getSiblings(u.id).findIndex(({id:I})=>I===C)}),c("Issue created",null)):s("Unable to determine ticket id")}return c("Success",null)},onSuccess:()=>h({mode:g.DEFAULT})},{intent:R.SetView,mode:g.COMMAND_LINE,action:()=>{let{commandMeta:e}=ne();return e.validity===Ne.Invalid?s("Invalid command "+pe):(oe(t=>({...t,viewMode:e.modifier==="wide"?"wide":e.modifier==="dense"?"dense":t.viewMode})),c("View set",null))},onSuccess:()=>h({mode:g.DEFAULT})},{intent:R.Rename,mode:g.COMMAND_LINE,action:()=>{let e=Y();if(l(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=v(),r=S(t.id)[n];if(!r)return s("Missing node");if(r.readonly)return s("Cannot rename readonly node");let o=_t();return o?q({id:B(),action:"edit.title",payload:{id:r.id,name:o},...e.value}):s("Provide a new name")},onSuccess:()=>h({mode:g.DEFAULT})},{intent:R.UntagTicket,mode:g.COMMAND_LINE,action:()=>{let e=Y();if(l(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=ne().commandMeta,r=(t||n).trim();if(!r)return s("Provide a tag");let o=di(r);if(!o)return s(`Tag "${r}" does not exist`);let{selectedNode:i}=v();if(!i)return s("Invalid untag target");let a=qe(i.id,"TICKET");if(l(a))return s("Unable to untag issue in this context");let d=a.value,u=x.getFieldByTitle(d.id,"Tags");if(!u)return s("Unable to locate tags field");let m=S(u.id).find(f=>f.props?.value===o.id);return m?q({id:B(),action:"untag.issue",payload:{id:m.id,target:d.id,tagId:o.id},...e.value}):s("Issue is not tagged with that tag")},onSuccess:()=>h({mode:g.DEFAULT})},{intent:R.TagTicket,mode:g.COMMAND_LINE,action:()=>{let e=Y();if(l(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=ne().commandMeta,r=(t||n).trim();if(!r)return s("Provide a tag");let{selectedIndex:o,currentNode:i}=v(),a=S(i.id)[o];if(!a)return s("Invalid tag target");let d=qe(a.id,"TICKET");if(l(d))return s("Unable to tag issue in this context");let u=d.value,m=di(r),f;if(m)f=m.id;else{let C=B(),I=q({id:B(),action:"create.tag",payload:{id:C,name:r},userId:e.value.userId,userName:e.value.userName});if(l(I))return I;f=I.value.result.id}let N=x.getFieldByTitle(u.id,"Tags");return N?S(N.id).some(C=>C.props?.value===f)?s("Already tagged with that tag"):q({id:B(),action:"tag.issue",payload:{id:B(),target:u.id,tagId:f},...e.value}):s("Unable to locate tags field")},onSuccess:()=>h({mode:g.DEFAULT})},{intent:R.AssignUserToTicket,mode:g.COMMAND_LINE,action:()=>{let e=Y();if(l(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=ne().commandMeta,r=(t||n).trim();if(!r)return s("Provide an assignee");let{selectedIndex:o,currentNode:i}=v(),a=S(i.id)[o];if(!a)return s("Invalid assign target");let d=qe(a.id,"TICKET");if(l(d))return s("Unable to assign issue in this context");let u=d.value,m=li(r),f;if(m)f=m.id;else{let C=B(),I=q({id:B(),action:"create.contributor",payload:{id:C,name:r},userId:e.value.userId,userName:e.value.userName});if(l(I))return I;f=I.value.result.id}let N=x.getFieldByTitle(u.id,"Assignees");return N?S(N.id).some(C=>C.props?.value===f)?s("Assignee already assigned"):q({id:B(),action:"assign.issue",payload:{id:B(),target:u.id,contributor:f},...e.value}):s("Unable to locate assignees field")},onSuccess:()=>h({mode:g.DEFAULT})},{intent:R.UnassignUserFromTicket,mode:g.COMMAND_LINE,action:()=>{let e=Y();if(l(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=ne().commandMeta,r=(t||n).trim();if(!r)return s("Provide an assignee to remove");let o=li(r);if(!o)return s(`Assignee "${r}" does not exist`);let{selectedNode:i}=v();if(!i)return s("Invalid unassign target");let a=qe(i.id,"TICKET");if(l(a))return s("Unable to unassign in this context");let d=a.value,u=x.getFieldByTitle(d.id,"Assignees");if(!u)return s("Unable to locate assignees field");let m=S(u.id).find(f=>f.props?.value===o.id);return m?q({id:B(),action:"unassign.issue",payload:{id:m.id,target:d.id,contributor:o.id},...e.value}):s(`Issue is not assigned to "${r}"`)},onSuccess:()=>h({mode:g.DEFAULT})},{intent:R.Sync,mode:g.COMMAND_LINE,action:async()=>{let e=Ho();W(()=>""),h({syncStatus:{msg:"Syncing",status:"syncing"}});let{userId:t,userName:n}=ge();if(!t)return s("Unable to resolve userId");if(!n)return s("Unable to resolve userName");let r=st()?Sn():c("No pending default events",null);if(l(r))return s(`Unable to persist default events. ${r.message}`);let o=Y();if(l(o)||!o.value)return s("Unable to resolve event log path");let i=rt(o.value);logger.debug("[sync-command] pending defaults",st());let a=await At({ownEventFileName:i});if(l(a))return h({syncStatus:{msg:a.message,status:"outOfSync"}}),s(`Unable to sync state. ${a.message}`);h({syncStatus:{msg:"Synced",status:"synced"},mode:g.DEFAULT});let d=se(process.cwd());if(l(d))throw new Error(d.message);let u=ot(d.value);if(l(u))return s("Unable to load events");Pe(u.value);let m=Ko(e);return l(m)?m:c("Synced",!0)}},{intent:R.Peek,mode:g.COMMAND_LINE,action:async()=>{let e=De(v().breadCrumb,"BOARD");if(l(e))return e;let t=se(process.cwd());if(l(t))throw new Error(t.message);let n=ot(t.value);if(l(n))return s(n.message);let r=n.value,{modifier:o}=ne().commandMeta,i;if(o==="now"){let E=zn();if(l(E))return E;let C=Pe(r);return C.some(l)?s(C.map(I=>I.message).join(", ")):(h({mode:g.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),c("Peeking now",!0))}if(o==="prev"){let E=v().eventLog.at(-2),C=wn(E);if(C===null)return s("No previous event to peek");i=C}else if(o==="next"){let E=v().unappliedEvents.at(0),C=wn(E);if(C===null)return s("No next event to peek");i=C}else{let E=Ot(o);if(!E)return s("Invalid peek date");i=E.getTime()}let a=e.value.id,{appliedEvents:d,unappliedEvents:u}=Wr(r,i),m=zn();if(l(m))return m;let f=Pe(d);if(f.some(l))return s(f.map(E=>E.message).join(", "));let N=v().nodes[a];return N?(F.navigate({currentNode:N,selectedIndex:0}),h({mode:g.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:u}),c("Peeking ",!0)):s("Board did not exist at peek date")}},{intent:R.Export,mode:g.COMMAND_LINE,action:async()=>{let e=await ii();return l(e)?e:(h({mode:g.DEFAULT}),c("Export successful",!0))}},{intent:R.Exit,mode:g.COMMAND_LINE,action:async()=>(F.exit(),c("Exit successful",!0))}];var od=new Set(["peek","filter","view-help"]),ce=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=ne();if(!t)return s("No command to confirm");if(!e&&n===Ne.Invalid)return s("Invalid command");let i=wo(t);if(So(),v().readOnly&&!od.has(i))return ct({status:pe.Fail,message:"Command not available in readonly state",value:null});let a=ci.filter(u=>e||u.systemOnly!==!0).find(u=>u.intent===i);if(!a)return ct({status:pe.Fail,message:"Command not found",value:null});let d=await a.action(a,{command:t,inputString:o,modifier:r});return l(d)?ct(d):(Ro({addToHistory:!e}),a.onSuccess?.(),ct(d))};var en=[{intent:T.Exit,mode:g.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(h({mode:g.COMMAND_LINE}),W(()=>"move cancel"),ce({isForceExecutedBySystem:!0}))},{intent:T.InitMove,mode:g.DEFAULT,description:"[m] move init/confirm",action:()=>(h({mode:g.COMMAND_LINE}),W(()=>"move start"),ce({isForceExecutedBySystem:!0}))},{intent:T.ConfirmMove,mode:g.MOVE,action:()=>(h({mode:g.COMMAND_LINE}),W(()=>"move confirm"),ce({isForceExecutedBySystem:!0}))}],tn=[{intent:T.MovePreviousItem,mode:g.MOVE,action:()=>we()?(h({mode:g.COMMAND_LINE}),W(()=>"move previous"),ce({isForceExecutedBySystem:!0})):s("No pending move")},{intent:T.MoveNextItem,mode:g.MOVE,action:()=>we()?(h({mode:g.COMMAND_LINE}),W(()=>"move next"),ce({isForceExecutedBySystem:!0})):s("No pending move")}],ui=[{intent:T.MoveToNextContainer,mode:g.MOVE,action:()=>we()?(h({mode:g.COMMAND_LINE}),W(()=>"move to-next"),ce({isForceExecutedBySystem:!0})):s("No pending move")},{intent:T.MoveToPreviousContainer,mode:g.MOVE,action:()=>we()?(h({mode:g.COMMAND_LINE}),W(()=>"move to-previous"),ce({isForceExecutedBySystem:!0})):s("No pending move")}];var mi={[M.WORKSPACE]:[...en,...tn],[M.BOARD]:[...en,...tn],[M.SWIMLANE]:[...en,...tn,...ui],[M.TICKET]:[],[M.FIELD]:[],[M.FIELD_LIST]:[],[M.TEXT]:[]};var pi=[{intent:T.AddItem,mode:g.DEFAULT,description:"[n] new...",action:()=>(h({mode:g.COMMAND_LINE}),W(()=>`${p.NEW} `),c("Adding new item",null))},{intent:T.Delete,mode:g.DEFAULT,description:"[d] delete",action:()=>(h({mode:g.COMMAND_LINE}),W(()=>`${p.DELETE} `),c("Deleting item",null))},{intent:T.InitCommandLine,mode:g.DEFAULT,description:"[:] focus command line",action:()=>(h({mode:g.COMMAND_LINE}),W(()=>""),c("Entering command line mode",null))},{intent:T.Confirm,mode:g.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>(F.enterChildNode(),c("Entering context",null))},{intent:T.Exit,mode:g.DEFAULT,description:"[q] exit context",action:()=>(F.enterParentNode(),c("Exiting context",null))},{intent:T.NavPreviousItem,mode:g.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(F.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:T.NavNextItem,mode:g.DEFAULT,action:()=>(F.navigateToNextItem(),c("Navigating to next item",null))},{intent:T.NavToPreviousContainer,mode:g.DEFAULT,action:()=>(F.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:T.NavToNextContainer,mode:g.DEFAULT,action:()=>(F.navigateToNextContainer(),c("Navigating to next container",null))},{intent:T.Edit,mode:g.DEFAULT,action:()=>(h({mode:g.COMMAND_LINE}),W(()=>"edit"),ce(),c("Fired command",!0))},{intent:T.SetViewDense,mode:g.DEFAULT,description:"[v] view change (wide/dense)",action:()=>(h({viewMode:"dense"}),c("View set",null))},{intent:T.SetViewWide,mode:g.DEFAULT,action:()=>(h({viewMode:"wide"}),c("View set",null))}];var id=500,sd=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),gi=e=>{let t=sd(e);t&&W(n=>(n+t).slice(0,id))};var fi=[{intent:T.ViewHelp,mode:g.DEFAULT,action:()=>(h({mode:g.HELP}),c("Viewing help",null))},{intent:T.Exit,mode:g.HELP,action:()=>(h({mode:g.DEFAULT}),c("Exiting help",null))},{intent:T.Confirm,mode:g.COMMAND_LINE,action:()=>(ce(),c("Executing command",null))},{intent:T.MoveCursorLeft,mode:g.COMMAND_LINE,action:()=>(Fn(-1),c("Moving cursor left",null))},{intent:T.MoveCursorRight,mode:g.COMMAND_LINE,action:()=>(Fn(1),c("Moving cursor right",null))},{intent:T.MoveCursorLeftOfWord,mode:g.COMMAND_LINE,action:()=>(On("left"),c("Moving cursor left of word",null))},{intent:T.MoveCursorRightOfWord,mode:g.COMMAND_LINE,action:()=>(On("right"),c("Moving cursor right of word",null))},{intent:T.ExitCommandLine,mode:g.COMMAND_LINE,action:()=>(h({mode:g.DEFAULT}),c("Exiting command line",null))},{intent:T.AutoCompleteCommand,mode:g.COMMAND_LINE,action:()=>(W((e,{remainder:t})=>t?e+t:e),c("Auto-completing command",null))},{intent:T.CaptureInput,mode:g.COMMAND_LINE,action:(e,{sequence:t})=>(gi(t??""),c("Capturing input",null))},{intent:T.EraseInput,mode:g.COMMAND_LINE,action:()=>(Co(),c("Erasing input",null))},{intent:T.EraseInputWord,mode:g.COMMAND_LINE,action:()=>(bo(),c("Erasing input word",null))},{intent:T.GetLastCommandFromHistory,mode:g.COMMAND_LINE,action:()=>(Ao(),c("Getting last command from history",null))},{intent:T.GetNextCommandFromHistory,mode:g.COMMAND_LINE,action:()=>(To(),c("Getting next command from history",null))}];import ad from"chalk";var nn=": for command line",vi="q to exit",yi=`${ad.hex(w.accent)("m")} to confirm`,Xn={[M.WORKSPACE]:[nn],[M.BOARD]:[nn],[M.BOARD+g.COMMAND_LINE]:[nn],[M.SWIMLANE]:[nn],[M.TICKET+g.HELP]:[vi],[M.SWIMLANE+g.HELP]:[vi],[M.TICKET]:[],[M.FIELD]:[],[M.SWIMLANE+g.MOVE]:[yi],[M.TICKET+g.MOVE]:[yi]};var rn=e=>e.trim().toLocaleLowerCase(),dd=(e,t)=>{let n=x.getFieldByTitle(e,t);if(!n)return"";let r=n.props?.value;return typeof r=="string"?r:""},ld=e=>{let{tags:t}=v(),n=x.getFieldByTitle(e,"Tags");return n?$(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},cd=e=>{let{contributors:t}=v(),n=x.getFieldByTitle(e,"Assignees");return n?$(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},xi=(e,t)=>{let n=t.value;if(!n)return!0;switch(t.target){case"title":return rn(e.title??"").includes(n);case"description":return rn(dd(e.id,"Description")).includes(n);case"tag":return ld(e.id).map(rn).some(d=>d.includes(n));case"assignee":return cd(e.id).map(rn).some(d=>d.includes(n));default:return!0}};function Ni(e,t,n){let r=t[e];if(!r)return s("buildBreadCrumb(): current node not found");let o=[],i=r;for(;i&&(o.push(i),!(i.id===n||!i.parentNodeId));)i=t[i.parentNodeId];let a=o[o.length-1];return!a||a.id!==n?s("buildBreadCrumb(): node is not connected to root"):(o.reverse(),c("Breadcrumb built",o))}var Ei=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 on,Yn,Jn=new Set,Ii=()=>{for(let e of Jn)e()},md=e=>(Jn.add(e),()=>Jn.delete(e));function hi(e){let{currentNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:i}=e;if(!t)return s("derive(): currentNodeId is missing");if(!r)return s("derive(): rootNode is missing");if(!o[r])return s("derive(): unable to find root node");let d=o[t];if(!d)return s("Unable to derive state, currentNode not found");let u=Ni(t,o,r);if(l(u))return logger.error(u.message),u;let m=u.value,{context:f}=d,N=Xn[f+n]??Xn[f]??[],E=[...pi,...mi[f]??[],...fi],C=Ei(E),I=pd(o,i),A=I[t]?.[e.selectedIndex]??null;return c("Derived successfully",{...e,currentNode:d,breadCrumb:m,availableHints:N,availableActions:E,actionIndex:C,selectedNode:A,renderedChildrenIndex:I})}var v=()=>(on||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),on);function Zn(e){Yn=e;let t={readOnly:!1,filters:[],tags:{},contributors:{},viewMode:"dense",mode:g.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,currentNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],timeMode:"live"},n=hi(t);return l(n)?n:(on=n.value,Ii(),c("State initialized",null))}function oe(e){let t=v(),n=e(t),r=hi(n);return l(r)?s(r.message??"Unable to update state"):(on=r.value,Ii(),c("State updated",null))}var h=e=>oe(t=>({...t,...e}));var ue=()=>ud(md,v,v),pd=(e,t)=>{let n={};for(let r of Object.values(e))V(r)&&t.length>0&&!t.every(o=>xi(r,o))||!r.parentNodeId||r.isDeleted||((!r.parentNodeId||!n[r.parentNodeId])&&(n[r.parentNodeId]=[]),n[r.parentNodeId].push(r));for(let r of Object.keys(n))n[r].sort((o,i)=>{let a=e[o.id],d=e[i.id];return!a||!d?0:a.rank.localeCompare(d.rank)});return n},S=e=>v()?.renderedChildrenIndex[e]??[],zn=()=>Yn?Zn(Yn):s("Cannot reset state: no initial workspace found");var qe=(e,t)=>{let{nodes:n}=v(),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}`)},gd=(e,t)=>{let{nodes:n}=v(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},Qn=(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"),x={deleteNode(e){oe(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},editValue(e,t){let{nodes:n}=v(),r=n[e];if(!r)return s("Edit target node not found");let o=Qn(r,"edit");if(o)return o;let i={...r,props:{...r.props,value:t}};return x.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=Qn(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),c("Renamed node",o)},getExistingTags(){let{tags:e}=v();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=v();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return $(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:r}=v(),o=this.getNode(e),i=this.getNode(t);if(!o)return s("Node not found");if(!i)return s("Target parent not found");if(r===e)return s("Cannot move root node");if(e===t)return s("Cannot move node into itself");let a=Qn(o,"move");if(a)return a;if(gd(t,e))return s("Cannot move node into its own descendant");let d={...o,parentNodeId:t,rank:n};return this.updateNode(d),c("Moved node successfully",d)},moveNodeToPosition({id:e,parentId:t,position:n={at:"end"}}){let r=$(t).filter(i=>i.id!==e),o=be(r,n);return l(o)?o:this.moveNodeToRank({id:e,parentId:t,rank:o.value})},tombstoneNode(e){let{nodes:t,currentNodeId:n,rootNodeId:r}=v(),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 m=t[u];if(!(!m||i.has(u))){i.add(u);for(let f of $(m.id))a(f.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}}return n?(h({nodes:d}),c("Successfully tomb stoned",o)):s("Unable to delete undefined")},createContributor(e){let t=oe(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=x.getContributor(t),o=x.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($(i.id).some(u=>u.props?.value===t))return s("Contributor already assigned");let d=this.createNodeAtPosition(Q.field(n,r.name,i.id,{value:t}));return l(d)?d:c("Assigned contributor",d.value)},createTag(e){let t=oe(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=x.getTag(t),o=x.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($(i.id).some(u=>u.props?.value===t))return s("Tag already assigned");let d=this.createNodeAtPosition(Q.field(n,r.name,i.id,{value:t}));return l(d)?d:c("Tag added",d.value)},untag(e,t){let n=x.getTag(t),r=x.getNode(e);if(!n)return s("Unable to remove tag, missing tag");if(!r)return s("Unable to remove tag, missing target");let o=this.getFieldByTitle(r.id,"Tags");if(!o)return s("Unable to locate tags field");let i=$(o.id).find(d=>d.props?.value===t);if(!i)return c("Issue is not tagged with that tag",null);let a={...i,isDeleted:!0};return this.updateNode(a),c("Tag removed",a)},unassign(e,t){let n=x.getContributor(t),r=x.getNode(e);if(!n)return s("Unable to unassign, missing contributor");if(!r)return s("Unable to unassign, missing target");let o=this.getFieldByTitle(r.id,"Assignees");if(!o)return s("Unable to locate assignees field");let i=$(o.id).find(d=>d.props?.value===t);if(!i)return c("Issue is not assigned to that contributor",null);let a={...i,isDeleted:!0};return this.updateNode(a),c("Assignee removed",a)},createNodeAtPosition(e,t={at:"end"}){if(!e.parentNodeId){let i={...e,rank:J()};return this.createNode(i),c("Created node",i)}let n=$(e.parentNodeId),r=be(n,t);if(l(r))return r;let o={...e,rank:r.value};return this.createNode(o),c("Created node",o)},createNode(e){let t=oe(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=oe(o=>({...o,nodes:{...o.nodes,[e]:n}}));return l(r)?s(r.message):c("Locked node",n)},updateNode(e){let t=oe(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return l(t)?t:c("Updated node",e)},getContributor(e){return v().contributors[e]},getTag(e){return v().tags[e]},getNode(e){return v().nodes[e]},getSiblings:e=>Object.values(v().nodes).filter(t=>!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank))};var L=(e,t)=>s(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),fd={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o={...Q.workspace(t,n),rank:r};Zn(o);let i=x.createNode(o);return l(i)?L(i.message??"Failed to initialize workspace",e):bn(i.value)?c("Workspace initialized",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o={...Q.workspace(t,n),rank:r},i=x.createNode(o);return l(i)?L(i.message??"Failed to add workspace",e):bn(i.value)?c("Added workspace",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=x.createNode({...Q.board(t,n,r),rank:o});return l(i)?L(i.message??"Unable to create board",e):zr(i.value)?c("Added board",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=x.createNode({...Q.swimlane(t,n,r),rank:o});return l(i)?L(i.message??"Unable to create swimlane",e):Tt(i.value)?c("Added swimlane",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=x.createNode({...Q.ticket(t,n,r),rank:o});return l(i)?L(i.message??"Unable to create issue",e):V(i.value)?c("Added issue",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:r,val:o,rank:i}=e.payload,a=x.createNode({...Q.field(t,n,r,{value:o},n.includes("Description")?"vertical":"horizontal"),rank:i});return l(a)?L(a.message??`Unable to create field: ${n}`,e):jr(a.value)?c("Added field",{action:e.action,result:a.value}):s("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!x.getNode(t))return L(`Unable to locate node with id ${t}`,e);let o=x.renameNode(t,n);return l(o)?L(o.message??"Unable to edit title",e):c("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,n=x.tombstoneNode(t);return l(n)?L(n.message??"Unable to delete node",e):c("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,r=x.createTag({id:t,name:n});return l(r)?L(r.message??"Unable to create tag",e):c("Tag added",{action:e.action,result:r.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,r=x.createContributor({id:t,name:n});return l(r)?L(r.message??"Unable to create contributor",e):c("Contributor created",{action:e.action,result:r.value})},"tag.issue":e=>{let{id:t,target:n,tagId:r}=e.payload,o=x.tag(n,r,t);return l(o)?L(o.message??"Unable to tag issue",e):c("Issue tagged",{action:e.action,result:o.value})},"untag.issue":e=>{let{target:t,tagId:n}=e.payload,r=x.untag(t,n);return l(r)?L(r.message??"Unable to untag ",e):c("Issue untagged",{action:e.action,result:r.value})},"assign.issue":e=>{let{id:t,contributor:n,target:r}=e.payload,o=x.assign(r,n,t);return l(o)?L(o.message??"Unable to assign issue",e):c("Assigned successfully",{action:e.action,result:o.value})},"unassign.issue":e=>{let{target:t,contributor:n}=e.payload,r=x.unassign(t,n);return l(r)?L(r.message??"Unable to unassign issue",e):c("Issue unassigned",{action:e.action,result:r.value})},"move.node":e=>{let{id:t,parent:n,rank:r}=e.payload,o=x.moveNodeToRank({id:t,parentId:n,rank:r});return l(o)?L(o.message??"Failed to move node",e):c("Moved node",{action:e.action,result:o.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,r=x.editValue(t,n);return l(r)?L(r.message??"Unable to edit description",e):c("Set node value",{action:e.action,result:r.value})},"close.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=x.getNode(t);if(!o)return L("Unable to locate issue",e);if(!V(o))return L("Can only close issues",e);let i=x.getNode(z);if(!i)return L("Unable to locate target swimlane",e);if(n!==i.id)return L("Close target must be closed swimlane",e);let a=x.moveNodeToRank({id:t,parentId:n,rank:r});return l(a)?L(a.message??"Unable to close issue",e):c("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=x.getNode(t);if(!o)return L("Unable to locate issue",e);if(!V(o))return L("Can only reopen issues",e);let i=x.getNode(z);if(!i)return L("Unable to locate closed swimlane",e);if(n===i.id)return L("Cannot reopen issue into closed swimlane",e);if(!x.getNode(n))return L("Reopen parent no longer exists",e);let d=x.moveNodeToRank({id:t,parentId:n,rank:r});return l(d)?L(d.message??"Unable to reopen issue",e):c("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=x.lockNode(t);return l(n)?L(n.message??"Unable to lock node",e):c("Node locked",{action:e.action,result:n.value})}},vd=(e,t)=>{let n=x.getNode(e);n&&x.updateNode({...n,log:[...n.log??[],t]})},yd=e=>{switch(e.action){case"init.workspace":case"add.workspace":case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"edit.title":case"lock.node":case"delete.node":case"move.node":case"close.issue":case"reopen.issue":return[e.payload.id];case"edit.description":let t=[e.payload.id],n=v().nodes[e.payload.id]?.parentNodeId;return n&&t.push(n),t;case"tag.issue":case"untag.issue":case"assign.issue":case"unassign.issue":return[e.payload.id,e.payload.target];case"create.tag":case"create.contributor":default:return[]}};function ut(e,t=!1){let n=fd[e.action](e);if(l(n))return n;t||([...new Set(yd(e))].forEach(a=>vd(a,e)),oe(a=>({...a,eventLog:[...a.eventLog,e]})));let r=e.userId,o=e.userName;return!r?.length||!o?.length?L("Invalid user ID format",e):(x.createContributor({name:o,id:r}),n)}var Pe=e=>e.map(t=>ut(t));var Ci=null,we=()=>structuredClone(Ci),ft=e=>Ci=e,bi=()=>{let{currentNode:e,selectedIndex:t}=v(),r=S(e.id)[t];return r?c("Resolved selected child",r):s("Target node not found")},Xe=({id:e,parentId:t,position:n={at:"end"}})=>{let r=$(t).filter(o=>o.id!==e);return be(r,n)},Si=({id:e,parentId:t,position:n})=>{let r=Y();if(l(r))return s("Unable to resolve user ID");let o=Xe({id:e,parentId:t,position:n});return l(o)?o:c("Created pending move state",{id:xd(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value}})},Ri=e=>{ft(e);let t=ut(e,!0);return l(t)?t:c("Node moved successfully",t.value)};function Gn(e){let t=bi();if(l(t))return t;let{currentNode:n,nodes:r}=v();if(!n.parentNodeId)return s("Missing parent node id");let o=r[n.parentNodeId];if(!o)return s("Missing parent node");let i=$(o.id),a=i.findIndex(({id:m})=>m===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 u=Si({id:t.value.id,parentId:d.id,position:{at:"end"}});return l(u)?u:Ri(u.value)}function qn(e){let t=bi();if(l(t))return t;let{currentNode:n,selectedIndex:r}=v(),i=$(n.id)[r+e];if(!i)return s("Missing sibling node");let a=Si({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:i.id}});return l(a)?a:Ri(a.value)}var Ue=e=>{let t=se(e??process.cwd());if(l(t))return t;let n=ot(t.value);if(l(n))return s(n.message);let r=no(n.value);return l(r)?s(r.message):c("Booted Epiq state",{root:t.value})},sn=()=>{let e=$o();return l(e)?s(e.message):e.value.userId?e.value.userName?c("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):s("Unable to retrieve user name"):s("Unable to retrieve user id")},Ti=(e,t)=>{let r=S(e.id).find(o=>o.title===t);return r?S(r.id).map(o=>typeof o.props?.value=="string"?o.props.value:"").filter(o=>!!o):[]},Nd=e=>Ti(e,"Tags").map(t=>x.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name})),Ed=e=>Ti(e,"Assignees").map(t=>x.getContributor(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name})),wi=(e={})=>{let t=Ue(e.repoRoot);if(l(t))return t;let n=Object.values(v().nodes).filter(r=>r.context==="BOARD").map(r=>({id:r.id,title:r.title,parentId:r.parentNodeId,readonly:!!r.readonly}));return c("Listed boards",n)},Mi=(e={})=>{let t=Ue(e.repoRoot);if(l(t))return t;let n=Object.values(v().nodes).filter(r=>r.context==="SWIMLANE").filter(r=>!e.boardId||r.parentNodeId===e.boardId).map(r=>({id:r.id,title:r.title,boardId:r.parentNodeId,isClosed:r.id===z,readonly:!!r.readonly}));return c("Listed swimlanes",n)},ki=e=>{let t=Ue(e.repoRoot);if(l(t))return t;let n=Object.values(v().nodes).filter(V).filter(r=>e.includeClosed||r.parentNodeId!==z).map(r=>({id:r.id,title:We(r.title),description:so(r,"Description"),parentId:r.parentNodeId,isClosed:r.parentNodeId===z,readonly:!!r.readonly,tags:Nd(r),assignees:Ed(r)}));return c("Listed issues",n)},Pi=e=>{let t=Ue(e.repoRoot);if(l(t))return t;let n=sn();if(l(n))return n;let r=x.getNode(e.parentId);if(!r)return s(`Unable to locate parent swimlane: ${e.parentId}`);if(r.context!=="SWIMLANE")return s(`Parent must be a swimlane, got: ${r.context}`);let o=Kt({name:e.title,parent:e.parentId,user:n.value,rank:J()}),a=Ge(o).find(l);if(a)return s(a.message);let d=o.find(u=>u.action==="add.issue")?.payload.id;return d?c("Created issue",{id:d,title:e.title,parentId:e.parentId}):s("Unable to determine created issue id")},Li=e=>{let t=Ue(e.repoRoot);if(l(t))return t;let n=sn();if(l(n))return n;let r=x.getNode(e.issueId);if(!r)return s(`Unable to locate issue: ${e.issueId}`);if(!r.parentNodeId)return s(`Unable to locate issue parent for: ${e.issueId}`);if(!V(r))return s("Can only close issues");if(r.parentNodeId===z)return s("Issue is already closed");let o=Xe({id:e.issueId,parentId:z,position:{at:"end"}});if(l(o))return o;let i={id:Ai(),userId:n.value.userId,userName:n.value.userName,action:"close.issue",payload:{id:e.issueId,parent:z,rank:o.value}},d=Ge([i]).find(l);return d?s(d.message):c("Closed issue",{id:e.issueId,closed:!0})},Di=(e={})=>{let t=Ue(e.repoRoot);return l(t)?t:c("Retrieved Epiq state",{root:t.value.root,nodes:v().nodes,rootNodeId:v().rootNodeId,currentNode:v().currentNode,selectedIndex:v().selectedIndex,eventLog:v().eventLog})},Fi=e=>{let t=Ue(e.repoRoot);if(l(t))return t;let n=sn();if(l(n))return n;let r=x.getNode(e.issueId);if(!r)return s(`Unable to locate issue: ${e.issueId}`);if(!V(r))return s("Can only move issues");let o=x.getNode(e.parentId);if(!o)return s(`Unable to locate target swimlane: ${e.parentId}`);if(o.context!=="SWIMLANE")return s(`Target parent must be a swimlane, got: ${o.context}`);if(o.readonly)return s("Cannot move issue to readonly swimlane");let i=e.position??{at:"end"},a=Xe({id:e.issueId,parentId:e.parentId,position:i});if(l(a))return a;let d={id:Ai(),userId:n.value.userId,userName:n.value.userName,action:"move.node",payload:{id:e.issueId,parent:e.parentId,rank:a.value}},m=Ge([d]).find(l);return m?s(m.message):c("Moved issue",{id:e.issueId,parentId:e.parentId,position:e.position??{at:"end"}})},Oi=async(e={})=>{let t=se(e.repoRoot??process.cwd());if(l(t))return s(`Sync failed
|
|
65
|
+
`+t);let n=sn();if(l(n))return n;let r=await At({cwd:t.value,ownEventFileName:rt({userId:n.value.userId,userName:n.value.userName})});return l(r)?r:c("Synced Epiq state",r.value)};var Me=e=>({isError:l(e),content:[{type:"text",text:JSON.stringify(e,null,2)}]}),Cd=()=>{let e=new Id({name:"epiq",version:"0.2.30"});return e.registerTool("epiq_state_get",{description:"Get the full current Epiq state, including nodes and event log",inputSchema:P.object({repoRoot:P.string().optional()})},async t=>Me(await Di(t))),e.registerTool("epiq_issue_list",{description:"List Epiq issues",inputSchema:P.object({repoRoot:P.string().optional(),includeClosed:P.boolean().optional()})},async t=>Me(await ki(t))),e.registerTool("epiq_board_list",{description:"List Epiq boards",inputSchema:P.object({repoRoot:P.string().optional()})},async t=>Me(await wi(t))),e.registerTool("epiq_swimlane_list",{description:"List Epiq swimlanes",inputSchema:P.object({repoRoot:P.string().optional(),boardId:P.string().optional()})},async t=>Me(await Mi(t))),e.registerTool("epiq_issue_create",{description:"Create an Epiq issue",inputSchema:P.object({title:P.string().min(1),parentId:P.string().min(1),repoRoot:P.string().optional()})},async t=>Me(await Pi(t))),e.registerTool("epiq_issue_close",{description:"Close an Epiq issue",inputSchema:P.object({issueId:P.string().min(1),repoRoot:P.string().optional()})},async t=>Me(await Li(t))),e.registerTool("epiq_issue_move",{description:"Move an Epiq issue to another swimlane",inputSchema:P.object({issueId:P.string().min(1),parentId:P.string().min(1),position:P.discriminatedUnion("at",[P.object({at:P.literal("start")}),P.object({at:P.literal("end")}),P.object({at:P.literal("before"),sibling:P.string().min(1)}),P.object({at:P.literal("after"),sibling:P.string().min(1)})]).optional(),repoRoot:P.string().optional()})},async t=>Me(await Fi(t))),e.registerTool("epiq_sync",{description:"Sync Epiq state with the configured Git remote",inputSchema:P.object({repoRoot:P.string().optional()})},async t=>Me(await Oi(t))),e},bd=async()=>{let e=Cd(),t=new hd;await e.connect(t)};await bd();export{Cd as createMcpServer,Me as resultJson,bd as startMcpServer};
|