epiq 0.4.8 → 0.4.10
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 +53 -59
- package/dist/mcp.js +48 -54
- package/package.json +1 -1
- package/readme.md +38 -31
package/dist/index.js
CHANGED
|
@@ -1,69 +1,63 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import Xr from"chalk";import{render as Ec}from"ink";import Nc from"meow";import Cc from"react";import{Box as Ze}from"ink";import G from"react";import ut from"chalk";import{monotonicFactory as _l,ulid as ke}from"ulid";import{useSyncExternalStore as Bl}from"react";var P={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function Hn(e){return e.context==="WORKSPACE"}function le(e){return e.context==="TICKET"}function Qr(e){return e.context==="FIELD"}var Qe=e=>e.context==="SWIMLANE",eo=e=>e.context==="BOARD";var he={None:"none",Success:"success",Fail:"fail"},s=e=>({status:he.Fail,message:e,value:null}),c=(e,t)=>({status:he.Success,message:e,value:t}),d=e=>e.status==="fail",Ee=e=>e.status==="success";var g={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};function $t(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var _t=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",jn=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var to=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},no=(e,t)=>t?e.get(t)??[]:[];var ro=new WeakMap,oa=e=>{let t=ro.get(e);return t||(t=to(e),ro.set(e,t)),t};var oo=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return no(oa(e),r).filter(i=>$t(r,i)>=n)};var ia={hint:"",hints:[],overlap:0,remainder:""},io=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return ia;let o=oo({wordList:r,inputToMatch:e,overlapThreshold:1});return sa(t,o)},sa=(e,t)=>{let n=t[0]??"",r=$t(e.toLowerCase(),n.toLowerCase()),[o,i]=n.split(":"),a=r<(o??"").length,l=!!i,p=(l&&a?o:n)+(l&&a?":":" "),y=p.slice(r);return{hint:p,hints:t,overlap:r,remainder:y}};var so=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var te={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:P.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r,o=!1)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:P.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:P.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:(e,t,n,r,o={},i="horizontal")=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:P.FIELD,childRenderAxis:i,parentNodeId:n,readonly:!1,log:[]}),ticket:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:P.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,rank:r,props:o={},readonly:i=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:P.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:i,log:[]})};import{ulid as la}from"ulid";var ze=24n,aa=ze*4n,gt=(1n<<aa)-1n,da=/^[0-9a-f]+$/;function ao(e){return!e||!da.test(e)?s(`Invalid hex rank: ${e}`):c("Converted rank to bigint",BigInt("0x"+e))}function Ne(e,t=ze){if(e<0n)return s("Negative rank not allowed");let n=e.toString(16);return c("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function V(e,t){if(!e&&!t)return Ne(gt/2n,ze);let n=e?ao(e):c("Resolved lower bound",0n);if(d(n))return n;let r=t?ao(t):c("Resolved upper bound",gt);if(d(r))return r;let o=n.value,i=r.value;if(i<=o)return Ne(gt/2n,ze);let a=(o+i)/2n;return a===o||a===i?s("No rank space available between neighbors"):Ne(a,ze)}function lo(){return Ne(gt/2n,ze)}function co(e){if(e<=0)return c("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=gt*BigInt(r+1)/(t+1n),i=Ne(o,ze);if(d(i))return i;n.push(i.value)}return c("Resolved evenly spaced ranks",n)}var Kn=(e,t)=>{let n=F(e),r=co(n.length);if(d(r))return r;let o={};for(let i=0;i<n.length;i++){let a=n[i],l=r.value[i];if(!a||!l)return s("Unable to assign rebalance rank");o[a.id]=l}return c("Created rebalance event",{id:la(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})};var ca=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[Ce,Wt]=ca;var k=(e,t)=>s(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),ua={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=te.workspace(t,n,r),i=Vn(o);if(d(i))return k(i.message,e);let a=b.createNode(o);return d(a)?k(a.message??"Failed to initialize workspace",e):Hn(a.value)?c("Workspace initialized",{action:e.action,result:a.value}):s("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=te.workspace(t,n,r),i=b.createNode(o);return d(i)?k(i.message??"Failed to add workspace",e):Hn(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=b.createNode(te.board(t,n,r,o));return d(i)?k(i.message??"Unable to create board",e):eo(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=b.createNode(te.swimlane(t,n,r,o));return d(i)?k(i.message??"Unable to create swimlane",e):Qe(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=b.createNode(te.ticket(t,n,r,o));return d(i)?k(i.message??"Unable to create issue",e):le(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=b.createNode(te.field(t,n,r,i,{value:o},n.includes("Description")?"vertical":"horizontal"));return d(a)?k(a.message??`Unable to create field: ${n}`,e):Qr(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(!b.getNode(t))return k(`Unable to locate node with id ${t}`,e);let o=b.renameNode(t,n);return d(o)?k(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=b.tombstoneNode(t);return d(n)?k(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=b.createTag({id:t,name:n});return d(r)?k(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=b.createContributor({id:t,name:n});return d(r)?k(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,rank:o}=e.payload,i=b.tag(n,r,t,o);return d(i)?k(i.message??"Unable to tag issue",e):c("Issue tagged",{action:e.action,result:i.value})},"untag.issue":e=>{let{target:t,tagId:n}=e.payload,r=b.untag(t,n);return d(r)?k(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,rank:o}=e.payload,i=b.assign(r,n,t,o);return d(i)?k(i.message??"Unable to assign issue",e):c("Assigned successfully",{action:e.action,result:i.value})},"unassign.issue":e=>{let{target:t,contributor:n}=e.payload,r=b.unassign(t,n);return d(r)?k(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=b.moveNodeToRank({id:t,parentId:n,rank:r});return d(o)?k(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=b.editValue(t,n);return d(r)?k(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=b.getNode(t);if(!o)return k("Unable to locate issue",e);if(!le(o))return k("Can only close issues",e);let i=b.getNode(Ce);if(!i)return k("Unable to locate target swimlane",e);if(n!==i.id)return k("Close target must be closed swimlane",e);let a=b.moveNodeToRank({id:t,parentId:n,rank:r});return d(a)?k(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=b.getNode(t);if(!o)return k("Unable to locate issue",e);if(!le(o))return k("Can only reopen issues",e);let i=b.getNode(Ce);if(!i)return k("Unable to locate closed swimlane",e);if(n===i.id)return k("Cannot reopen issue into closed swimlane",e);if(!b.getNode(n))return k("Reopen parent no longer exists",e);let l=b.moveNodeToRank({id:t,parentId:n,rank:r});return d(l)?k(l.message??"Unable to reopen issue",e):c("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=b.lockNode(t);return d(n)?k(n.message??"Unable to lock node",e):c("Node locked",{action:e.action,result:n.value})},"rebalance.children":e=>{let{parent:t,ranks:n}=e.payload;for(let[r,o]of Object.entries(n)){let i=b.getNode(r);if(!i)return k(`Unable to locate node ${r}`,e);if(i.parentNodeId!==t)return k(`Node ${r} is not child of ${t}`,e);let a=b.updateNode({...i,rank:o});if(d(a))return k(a.message??"Unable to rebalance child",e)}return c("Rebalanced children",{action:e.action,result:{parent:t}})}},ma=(e,t)=>{let n=b.getNode(e);n&&b.updateNode({...n,log:[...n.log??[],t]})},pa=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 ft(e,t=!1){let n=ua[e.action](e);if(d(n))return n;t||([...new Set(pa(e))].forEach(a=>ma(a,e)),ae(a=>({...a,eventLog:[...a.eventLog,e]})));let r=e.userId,o=e.userName;return!r?.length||!o?.length?k("Invalid user ID format",e):(b.createContributor({name:o,id:r}),n)}var qe=e=>e.map(t=>ft(t));import Sa from"node:fs";import Aa from"node:path";import{decodeTime as wa,monotonicFactory as Ta}from"ulid";import{z as ht}from"zod";var Ht={autoSync:!1,preferredEditor:null,userName:null,userId:null},ge=()=>Ht,et=e=>(Ht={...Ht,...e},Ht);import vt from"node:fs";import be from"node:path";var zn=process.env.IS_LOCAL==="true",Ie=".epiq",ce=".epiq-global",jt="events",ga="project.json",uo=e=>be.join(e,Ie),Kt=e=>be.join(e,Ie),Vt=e=>be.join(Kt(e),ga),xt=e=>be.join(Kt(e),jt),fa=e=>{let t=be.join(e,Ie);return vt.existsSync(t)&&vt.statSync(t).isDirectory()},va=e=>{let t=Vt(e);return vt.existsSync(t)&&vt.statSync(t).isFile()},Se=e=>{let t=be.resolve(e);for(;;){if(fa(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}},zt=e=>{let t=be.resolve(e);for(;;){if(va(t))return c("Resolved closest epiq project root",t);let n=be.dirname(t);if(n===t)return s("No .epiq/project.json found in any parent");t=n}},mo=e=>{let t=xt(e);try{return vt.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")}};import qt from"node:fs";import Gn from"node:path";import{decodeTime as xa}from"ulid";import{z as qn}from"zod";var ya=qn.object({userId:qn.string().min(1).default("unknown"),userName:qn.string().min(1).default("unknown")}),ha=e=>{let[t,n]=Gn.basename(e,".jsonl").split("."),r=ya.safeParse({userId:t,userName:n});return r.success?c("Parsed event file actor",r.data):s(`Invalid event file name ${Gn.basename(e)}: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},Ea=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])},Na=(e,t)=>t in e,Ca=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),ba=e=>{let{userId:t,userName:n,...r}=e,o=Ea(r);if(d(o))return s(o.message);let i=o.value,a=e.id?.[0];return a?Na(r,i)?c("Decoded persisted event",Ca({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")},Gt=e=>{if(!qt.existsSync(e))return c("Event file missing",[]);let t=ha(e);if(d(t))return s(t.message);let n=qt.readFileSync(e,"utf8"),r=[];for(let o of n.split(`
|
|
3
|
-
`)){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 l=Yn(a);if(d(l))return s(`${l.message} in ${e}: ${i}`);r.push({...l.value,userId:t.value.userId,userName:t.value.userName})}return c("Parsed persisted events file",r)};function po(e){let t=xt(e);if(!qt.existsSync(t))return c("No events found",[]);let n=qt.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>Gn.join(t,o)),r=[];for(let o of n){let i=Gt(o);if(d(i))return s(i.message);r.push(...i.value)}return c("All events loaded",Ia(r))}function yt(e){let t=po(e);if(d(t))return s(t.message);let n=[];for(let r of t.value){let o=ba(r);if(d(o))return s(`Failed to decode event ${r.id?.[0]??"<unknown>"}: ${o.message}`);n.push(o.value)}return c("Loaded merged events",n)}function go(e=process.cwd()){let t=po(e);return d(t)?s(t.message):c("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var Ia=e=>{let t=new Map;for(let l of e){let u=l.id[1]??null,m=t.get(u)??[];m.push(l),t.set(u,m)}for(let l of t.values())l.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 l=0;l<n.length;l++){let u=n[l];if(!u)continue;let m=(t.get(u.id[0])??[]).filter(p=>!r.has(p.id[0]));if(m.length!==0){n.splice(l+1,0,...m);for(let p of m)r.add(p.id[0]);o=!0,l+=m.length}}}let i=e.filter(l=>!r.has(l.id[0])).sort((l,u)=>l.id[0].localeCompare(u.id[0]));return n.push(...i),n;function a(l){for(let u of l)r.has(u.id[0])||(n.push(u),r.add(u.id[0]))}},fo=(e,t)=>{let n=e.findIndex(r=>{try{return xa(r.id)>t}catch{return!0}});return n===-1?{appliedEvents:e,unappliedEvents:[]}:{appliedEvents:e.slice(0,n),unappliedEvents:e.slice(n)}};var vo=e=>({action:e.action,payload:e.payload});var yo=1,xo=Ta(),Ra=ht.tuple([ht.string().min(1),ht.string().min(1).nullable()]),Ma=ht.looseObject({v:ht.literal(yo),id:Ra}),Yn=e=>{let t=Ma.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(", ")}`)},Yt=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",Q=()=>{let{userName:e,userId:t}=ge();return e?t?e.trim()?c("Successfully resolved actor ID",{userId:Yt(t),userName:Yt(e)}):s("Unable to resolve actor ID from settings or OS user info"):s("User ID not configured"):s("User name not configured")},Xn=({userId:e,userName:t})=>`${Yt(e)}.${Yt(t)}.jsonl`,Pa=(e,{userId:t,userName:n})=>{let r=Xn({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return s(`Invalid event log file name: ${r}`);let i=Aa.join(xt(e),r);return c("Successfully resolved event log path",i)},ka=(e,t)=>{let n={[e.action]:e.payload,v:yo,id:t};return Yn(n)};function Xt({event:e,rootDir:t=process.cwd()}){try{let n=Se(t);if(d(n))return n;let r=mo(n.value);if(d(r))return r;let o=Pa(n.value,{userId:e.userId,userName:e.userName});if(d(o))return o;let i=go(n.value);if(d(i))return s(i.message);let a=i.value?xo(Math.max(Date.now(),wa(i.value)+1)):xo(),l=ka(vo(e),[a,i.value]);return d(l)?s(l.message):(Sa.appendFileSync(o.value,`${JSON.stringify(l.value)}
|
|
4
|
-
`,"utf8"),c("Event persisted",{path:o.value,entry:l.value}))}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return s(`Failed to persist event: ${r}`)}}function K(e){let t=ft(e);if(t.status!==he.Success)return t;let n=Xt({event:e});return d(n)?n:t}function ho(e){return e.map(t=>K(t))}var Eo=e=>Jn(F(e),{at:"end"}),Jn=(e,t={at:"end"})=>{let n=r=>d(r)?c("Rank space exhausted",{rank:"",needsRebalance:!0}):c("Resolved rank",{rank:r.value,needsRebalance:!1});if(e.length===0)return n(V(void 0,void 0));switch(t.at){case"start":{let r=e[0];return r?n(V(void 0,r.rank)):s("Unable to resolve first sibling")}case"end":{let r=e[e.length-1];return r?n(V(r.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let r=No(e,t.sibling);if(r<0)return s("Sibling not found");let o=r>0?e[r-1]:void 0,i=e[r];return i?n(V(o?.rank,i.rank)):s("Sibling not found")}case"after":{let r=No(e,t.sibling);if(r<0)return s("Sibling not found");let o=e[r],i=r<e.length-1?e[r+1]:void 0;return o?n(V(o.rank,i?.rank)):s("Sibling not found")}}},F=e=>Object.values(v().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),No=(e,t)=>e.findIndex(n=>n.id===t),Co=(e,t,n={at:"end"})=>Jn(F(t).filter(r=>r.id!==e),n),tt=(e,t,n,r)=>{let o=Co(t,e,n);if(d(o))return o;if(!o.value.needsRebalance)return c("Resolved rank",o.value.rank);let i=Kn(e,r);if(d(i))return i;let a=K(i.value);if(d(a))return a;let l=Co(t,e,n);return d(l)?l:l.value.needsRebalance?s("Rank rebalance failed to create space"):c("Resolved rank after rebalance",l.value.rank)},nt=(e,t)=>{let n=Eo(e);if(d(n))return n;if(!n.value.needsRebalance)return c("Resolved rank",n.value.rank);let r=Kn(e,t);if(d(r))return r;let o=K(r.value);if(d(o))return o;let i=Eo(e);return d(i)?i:i.value.needsRebalance?s("Rank rebalance failed to create space"):c("Resolved rank after rebalance",i.value.rank)};var Ue=(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}`)},Qn=(e,t)=>{let{nodes:n}=v(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},Zn=(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"),b={deleteNode(e){ae(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=Zn(r,"edit");if(o)return o;let i={...r,props:{...r.props,value:t}};return this.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=Zn(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 F(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=Zn(o,"move");if(a)return a;if(Qn(t,e))return s("Cannot move node into its own descendant");let l={...o,parentNodeId:t,rank:n};return this.updateNode(l),c("Moved node successfully",l)},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 p of F(m.id))a(p.id)}};a(e);let l={...structuredClone(t)};for(let u of i){if(!l[u])return s("Unable to locate node to delete");l[u]={...l[u],isDeleted:!0}}return n?(w({nodes:l}),c("Successfully tomb stoned",o)):s("Unable to delete undefined")},createContributor(e){let t=ae(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return d(t)?s("Unable to create contributor"):c("Created contributor",e)},assign(e,t,n,r){let o=this.getContributor(t),i=this.getNode(e);if(!i||!o)return s("Unable assign contributor to issue");let a=this.getFieldByTitle(i.id,"Assignees");if(!a)return s("Unable to locate assignees field");if(F(a.id).some(p=>p.props?.value===t))return s("Contributor already assigned");let u=te.field(n,o.name,a.id,r,{value:t}),m=this.createNode(u);return d(m)?m:c("Assigned contributor",u)},createTag(e){let t=ae(n=>({...n,tags:{...n.tags,[e.id]:e}}));return d(t)?s("Could not create tag"):c("Tag created",e)},tag(e,t,n,r){let o=this.getTag(t),i=this.getNode(e);if(!o)return s("Unable to add tag, missing tag");if(!i)return s("Unable to add tag, missing target");let a=this.getFieldByTitle(i.id,"Tags");if(!a)return s("Unable to locate tags field");if(F(a.id).some(p=>p.props?.value===t))return s("Tag already assigned");let u=te.field(n,o.name,a.id,r,{value:t}),m=this.createNode(u);return d(m)?m:c("Tag added",u)},untag(e,t){let n=this.getTag(t),r=this.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=F(o.id).find(l=>l.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=this.getContributor(t),r=this.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=F(o.id).find(l=>l.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)},createNode(e){let t=ae(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(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=ae(o=>({...o,nodes:{...o.nodes,[e]:n}}));return d(r)?s(r.message):c("Locked node",n)},updateNode(e){let t=ae(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(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){return F(e)}};var Y={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"},E={accent:Y.cyan,accent2:Y.magenta,primary:Y.white,secondary:Y.grayDark,secondary2:Y.grayLight,gray:Y.gray,green:Y.green,yellow:Y.yellow,red:Y.red};var h={red:Y.red,yellow:Y.yellow,green:Y.green,blue:Y.blue,magenta:Y.magenta,cyan:Y.cyan},rt={urgent:h.red,critical:h.red,important:h.red,blocker:h.red,asap:h.red,immediate:h.red,fail:h.red,failure:h.red,broken:h.red,bug:h.red,error:h.red,incident:h.red,outage:h.red,production:h.red,crash:h.red,security:h.red,warning:h.yellow,warn:h.yellow,risky:h.yellow,risk:h.yellow,attention:h.yellow,pending:h.yellow,review:h.yellow,"needs-review":h.yellow,qa:h.yellow,testing:h.yellow,test:h.yellow,validate:h.yellow,verification:h.yellow,staging:h.yellow,check:h.yellow,"follow-up":h.yellow,followup:h.yellow,waiting:h.yellow,blocked:h.yellow,hold:h.yellow,done:h.green,complete:h.green,completed:h.green,success:h.green,ok:h.green,stable:h.green,resolved:h.green,fixed:h.green,closed:h.green,merged:h.green,released:h.green,deployed:h.green,approved:h.green,verified:h.green,working:h.green,healthy:h.green,pass:h.green,passing:h.green,info:h.blue,information:h.blue,note:h.blue,docs:h.blue,documentation:h.blue,doc:h.blue,guide:h.blue,help:h.blue,explanation:h.blue,detail:h.blue,details:h.blue,context:h.blue,design:h.blue,discussion:h.blue,proposal:h.blue,idea:h.blue,feature:h.magenta,enhancement:h.magenta,improvement:h.magenta,refactor:h.magenta,refactoring:h.magenta,cleanup:h.magenta,optimize:h.magenta,optimization:h.magenta,perf:h.magenta,performance:h.magenta,upgrade:h.magenta,migration:h.magenta,modernize:h.magenta,debt:h.magenta,todo:h.cyan,next:h.cyan,planned:h.cyan,plan:h.cyan,future:h.cyan,backlog:h.cyan,investigate:h.cyan,explore:h.cyan,prototype:h.cyan};var bo=(e,t)=>{let r=R(e.id).find(o=>o.title===t);return r?R(r.id).map(o=>typeof o.props?.value=="string"?o.props.value:"").filter(o=>!!o):[]},er=e=>bo(e,"Tags").map(t=>b.getTag(t)).filter(t=>!!t),Jt=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!le(n)?s("Invalid untag target"):c("Retrieved tags from ticket in breadcrumb",er(n)??[])},Zt=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!le(n)?s("Invalid untag target"):c("Retrieved tags from ticket in breadcrumb",tr(n)??[])},tr=e=>bo(e,"Assignees").map(t=>b.getContributor(t)).filter(t=>!!t);var f={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 Da=/^(\d+)(h|d|w|mo|y)$/,La=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,Fa=({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},Oa=(e,t=new Date)=>{let n=e.match(Da);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}},Ba=e=>{let t=e.match(La);if(!t)return null;let[,n,r,o,i,a]=t,l=Number(n),u=Number(r),m=Number(o),p=i?Number(i):0,y=a?Number(a):0;return Fa({year:l,month:u,day:m,hour:p,minute:y})?new Date(l,u-1,m,p,y):null},Qt=e=>{let t=e.trim().toLowerCase();return Oa(t)??Ba(t)},Io=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Ua=[{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}],So=(e=Ua)=>{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 $a=["BOARD","TICKET","SWIMLANE"],Ge=[f.SYNC,f.HELP,f.EXPORT,f.SET_VIEW,f.SET_EDITOR,f.SET_USERNAME],en=[f.NEW,f.RENAME,f.DELETE,f.MOVE],nr=[f.TAG,f.UNTAG,f.ASSIGN,f.UNASSIGN,f.CLOSE_ISSUE,f.RE_OPEN_ISSUE,f.SET_DESCRIPTION],Ao=[f.FILTER,f.PEEK],_a={WORKSPACE:[...Ge,...en],BOARD:[...Ao,...Ge,...en],SWIMLANE:[...Ao,...Ge,...en],TICKET:[...Ge,...en,...nr],FIELD:[...Ge,...nr],FIELD_LIST:[...Ge,...nr],TEXT:[...Ge]},Wa=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Ha=()=>{let{currentNode:e,selectedNode:t,readOnly:n}=v();if(!tn().isSetup)return[f.HELP,f.SET_EDITOR,f.SET_USERNAME];if(!wo())return[f.HELP,f.INIT];if(n)return[f.HELP,f.PEEK,f.EXPORT,f.SET_VIEW];let o=e.context??"WORKSPACE",i=t?.context,a=i&&$a.includes(i);return _a[o].filter(l=>l===f.RENAME||l===f.DELETE||l===f.MOVE?a:!0)},z=e=>{let{currentNode:t}=v(),n=t.context??"WORKSPACE";return{[f.NONE]:Ha(),[f.EXIT]:["confirm"],[f.EXPORT]:[],[f.SYNC]:[],[f.INIT]:[],[f.HELP]:[],[f.PEEK]:[...So(),"now","prev","next"],[f.SET_USERNAME]:[],[f.SET_DESCRIPTION]:["confirm"],[f.DELETE]:["confirm"],[f.RE_OPEN_ISSUE]:["confirm"],[f.CLOSE_ISSUE]:["confirm"],[f.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[f.FILTER]:["tag","assignee","description","title","clear"],[f.SET_VIEW]:["dense","wide"],[f.SET_EDITOR]:[...so],[f.TAG]:[...new Set([...Object.keys(rt),...b.getExistingTags()])],[f.UNTAG]:[...Jt()?.value?.map(({name:o})=>o)??[]],[f.UNASSIGN]:[...Zt()?.value?.map(({name:o})=>o)??[]],[f.ASSIGN]:b.getExistingAssignees(),[f.RENAME]:[],[f.NEW]:Wa(n)}[e]??[]};import it from"chalk";import{decodeTime as To}from"ulid";var Ro=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"},Mo=e=>{let t=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())} ${t(e.getHours())}:${t(e.getMinutes())}`},nn=e=>{try{return c("Decoded date",new Date(To(e)))}catch(t){return s("Decoding failed + "+t.message)}},rr=e=>{if(!e?.id)return null;try{return To(e.id)}catch{return null}};var Ae=(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 ot from"chalk";var ir={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},ja=(e,t,n)=>Math.max(t,Math.min(n,e)),or=(e,t,n)=>e+(t-e)*n,Po=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Ka=(e,t,n)=>{let r=t/100,o=n/100,i=(1-Math.abs(2*o-1))*r,a=e/60,l=i*(1-Math.abs(a%2-1)),u=0,m=0,p=0;a>=0&&a<1?(u=i,m=l):a>=1&&a<2?(u=l,m=i):a>=2&&a<3?(m=i,p=l):a>=3&&a<4?(m=l,p=i):a>=4&&a<5?(u=l,p=i):(u=i,p=l);let y=o-i/2;return[Math.round((u+y)*255),Math.round((m+y)*255),Math.round((p+y)*255)]},Va=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,za=(e,t,n)=>[Math.round(or(e[0],t[0],n)),Math.round(or(e[1],t[1],n)),Math.round(or(e[2],t[2],n))],Et=e=>{let n=Po(e)%360,r=Ka(n,ir.stringColor.saturation,ir.stringColor.lightness);return Va(r)},qa=e=>{let t=ir.gradient.stops,n=ja(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 za(t[i],t[i+1],a)},rn=e=>Po(e.toLowerCase().trim())/4294967295,ko=e=>{let t=rn(e);return qa(t)},Ga=e=>{let[t,n,r]=ko(e);return{normal:o=>ot.bgRgb(t,n,r).black(o),cursor:o=>ot.bgRgb(t,n,r).white.bold(o)}},sr=e=>{let[t,n,r]=ko(e);return{fg:o=>ot.rgb(t,n,r)(o),fgCursor:o=>ot.rgb(t,n,r).inverse(o),bg:o=>ot.bgRgb(t,n,r).black(o),bgCursor:o=>ot.bgRgb(t,n,r).white.bold(o)}},ar=e=>Ga(e).normal(` ${e} `),X=(e,t=rt)=>{let r=(o=>o.toLowerCase().trim())(e);return r&&t[r]?t[r]:Et(r)};var we={None:"none",Invalid:"invalid",Valid:"valid"};var Ya=["BOARD","TICKET","SWIMLANE"],dr=()=>{let e=v().selectedNode;return e?.context?Ya.includes(e?.context)?W():U({message:"Command not available in this context"}):U({message:"Missing target context"})},ee="<ENTER> to confirm",W=(e="",t=[])=>({message:e,validity:we.Valid,completionWordList:t}),U=({message:e,completionWordList:t=[]})=>({validity:we.Invalid,message:e,completionWordList:t}),Ct=e=>e.length===0,$e=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:i=1})=>{let u=[...t.filter(Boolean).filter(p=>p.startsWith(o.trim()))].sort((p,y)=>rn(p)-rn(y)).slice(0,r).map(ar),m=u.length>i?u.join(" "):"";return m?`${e}${m}${n}`:""},lr=({modifier:e})=>{let t="confirm";return e===t?W(ee):U({message:Ct(e)?`if you are certain, enter ${ar(t)}`:"",completionWordList:[t]})},Xa=({list:e,hint:t})=>({modifier:n})=>e.includes(n)?W(ee):U({message:Ct(n)?t:""}),Ja=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?U({message:n}):W():U({message:Ct(r)?t:""}),Nt=({hint:e})=>({modifier:t,inputString:n})=>Ct(t)&&Ct(n)?U({message:e,completionWordList:[]}):W(ee),Za={[f.EXPORT]:()=>W(ee+", and create export markdown file"),[f.PEEK]:e=>{let t=e.modifier;if(t==="now")return W(ee);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 W(ee);let r=Qt(t);if(!t||!r)return U(n);let o=Ae(v().breadCrumb,"BOARD");if(d(o))return U({message:"Command is not applicable in this context"});let i=nn(o.value.id);return d(i)?U({message:"Unable to peek: board id is not a valid ULID"}):Io({date:r,horizonDate:i.value})?W(ee):U({message:it.red(`nothing to peek before ${i.value.toISOString().slice(0,16).replace("T"," ")}`)})},[f.EXIT]:()=>W(ee+" and exit the application"),[f.INIT]:()=>W(ee),[f.FILTER]:e=>{if(e.modifier==="clear")return W();let t=a=>z(f.FILTER).includes(a);if(!e.modifier||!t(e.modifier??""))return U({message:$e({wordList:z(f.FILTER),inputString:e.inputString}),completionWordList:z(f.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:$e({prefix:`existing ${e.modifier}s... `,wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i}):W():U({message:$e({prefix:"one of... ",wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i})},[f.NONE]:e=>{let t=z(f.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?W():U({message:$e({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0})})},[f.NEW]:e=>Ja({list:z(f.NEW),hint:$e({wordList:z(f.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[f.SET_DESCRIPTION]:()=>W(ee),[f.HELP]:()=>W(ee),[f.RENAME]:()=>{let e=dr();return e.validity==="invalid"?e:W(ee)},[f.DELETE]:e=>{let t=dr();return t.validity==="invalid"?t:lr(e)},[f.CLOSE_ISSUE]:e=>lr(e),[f.RE_OPEN_ISSUE]:e=>lr(e),[f.MOVE]:e=>{let t=dr();return t.validity==="invalid"?t:Nt({hint:$e({prefix:"hey hacker! These commands are blocked for you... ",wordList:z(f.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[f.TAG]:e=>{let t=b.getExistingTags().map(n=>` ${it.bgHex(X(n))(" "+n+" ")} `).slice(0,10);return Nt({hint:"tag name like... "+t.join("")})(e)},[f.UNTAG]:e=>{let t=Jt();if(d(t))return U({message:"Invalid untag target",completionWordList:[]});let n=t.value.map(({name:r})=>r).map(r=>` ${it.bgHex(X(r))(" "+r+" ")} `).slice(0,10);return n.length?Nt({hint:" ... "+n.join("")})(e):U({message:"Issue has not tags",completionWordList:[]})},[f.ASSIGN]:e=>{let t=b.getExistingAssignees().map(n=>` ${it.bgHex(X(n))(" "+n+" ")} `).slice(0,10);return Nt({hint:"assign to... "+t.join("")})(e)},[f.UNASSIGN]:e=>{let t=Zt();if(d(t))return U({message:"Invalid unassign target",completionWordList:[]});let n=t.value.map(({name:r})=>r).map(r=>` ${it.bgHex(X(r))(" "+r+" ")} `).slice(0,10);return n.length?Nt({hint:"remove assignee... "+n.join("")})(e):U({message:"Issue has no assignees",completionWordList:[]})},[f.SET_EDITOR]:e=>{logger.debug(`Validating command: ${e.command} ${e.modifier} ${e.inputString}`);let t=z(f.SET_EDITOR);return e.modifier?W(ee):U({message:$e({wordList:t,inputString:e.inputString})})},[f.SET_USERNAME]:e=>e.inputString?W():U({message:`Enter a username. Saved in ${it.bgBlack("~/.epiq-global/")}`}),[f.SET_VIEW]:e=>Xa({list:z(f.SET_VIEW),hint:$e({wordList:z(f.SET_VIEW),noOfHints:3,inputString:e.inputString})})(e),[f.SYNC]:()=>W(ee)},Do=Object.fromEntries(Object.entries(Za).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var Lo=["frontend","backend","infrastructure","architecture","integration","configuration","implementation","application","deployment","environment","framework","platform","service","component","module","gateway","pipeline","containerization","orchestrator","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","reproducibility","reproduction","investigation","triage","workaround","mitigation","remediation","optimization","stabilization","refinement","failure","outage","blocking","criticality","severity","escalation","diagnostics","analysis","resolution","corruption","inconsistency","validation","verification","authorization","authentication","confidentiality","availability","accessibility","reliability","compliance","governance","encryption","decryption","integrity","auditing","traceability","accountability","protection","privileges","permissions","dependency","orchestration","provisioning","synchronization","compatibility","incompatibility","interoperability","observability","instrumentation","telemetry","loadbalancing","discovery","registration","scheduling","coordination","distribution","isolation","virtualization","serialization","deserialization","initialization","instantiation","propagation","aggregation","consolidation","normalization","standardization","transformation","reconciliation","correlation","processing","indexing","partitioning","enrichment","validation","filtering","streaming","batching","concurrency","parallelism","contention","deadlock","throttling","ratelimiting","backpressure","fragmentation","saturation","exhaustion","partitioning","replication","redundancy","failover","deprecation","obsolescence","starvation","overload","underutilization","latency","throughput","refactoring","modularization","encapsulation","abstraction","extensibility","configurability","maintainability","recoverability","sustainability","readability","testability","debuggability","reusability","simplicity","consistency","performance","functionality","requirement","recommendation","improvement","enhancement","clarification","documentation","description","acceptance","criteria","estimation","prioritization","dependency","deliverable","milestone","iteration"];var M={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 Fo=e=>Object.values(f).includes(e),Oo=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:a,validity:l,completionWordList:u}=Do[n].validate(n,r,i),m=o==="command"?Object.values(f):n&&e.target==="modifier"?z(n):Lo;return{validity:l,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:a??"",autoCompletion:t?io(e,[...u,...m]):{hint:"",hints:[],remainder:"",overlap:0}}};var Bo=e=>{let t=e.trimStart(),n=ed(t),r=n[0]??"",o=n[1]??"",i=/\s$/.test(e),a=td(e),l=Fo(r)?r:null,u=l!==null,m=r!=="",p=l?z(l)??[]:[],y=l&&p.includes(o)?o:"",N="word";n.length===0||n.length===1&&!i?N="command":(n.length===1&&i||n.length===2&&!i)&&(N="modifier");let S=i?"":a,A=Qa(t,l,y);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:a,hasCommand:m,command:l,isCommandKeyword:u,isLastWordCompleted:i,modifier:y,target:N,inputToMatch:S,inputString:A}},Qa=(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},ed=e=>e.trim()?e.trim().split(/\s+/):[],td=e=>e.trimEnd().split(/\s+/).at(-1)??"";var Uo=" ",J={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:we.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},cr=new Set,$o=()=>{for(let e of cr)e()},_o=e=>(cr.add(e),()=>cr.delete(e)),Te=e=>{let n=e(J),r=Bo(n.value),o=n.cursorPosition===n.value.length;J={...n,commandMeta:Oo(r,o)},$o()},bt=({message:e,status:t})=>{let n=structuredClone(J);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,J=n,$o(),c(e,null)},ur=e=>{Te(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},mr=e=>{Te(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}})},Wo=()=>{Te(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}})},Ho=()=>{Te(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}})},j=e=>{Te(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,l=Math.max(0,Math.min(i.length,a.length));return{...t,value:a,cursorPosition:l,commandIsPending:!1}})},jo=()=>{Te(e=>({...e,commandIsPending:!0}))},Ko=({addToHistory:e=!0})=>{Te(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),nd()},Vo=()=>{Te(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}})},zo=()=>{Te(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},nd=()=>j(()=>""),ne=()=>J,on=()=>{let[e,...t]=J.value.split(Uo);return t.join(Uo).trim()};var rd=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",od=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",id=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",qo=(e,t)=>{if(od(e,e.sequence))return x.MoveCursorLeftOfWord;if(id(e,e.sequence))return x.MoveCursorRightOfWord;if(rd(e,e.sequence))return x.EraseInputWord;switch(e.name){case"tab":return x.AutoCompleteCommand;case"up":return x.GetLastCommandFromHistory;case"down":return x.GetNextCommandFromHistory;case"left":return x.MoveCursorLeft;case"right":return x.MoveCursorRight;case"return":return x.Confirm;case"backspace":return t?x.EraseInput:x.ExitCommandLine;case"escape":return x.ExitCommandLine;default:return x.CaptureInput}};var x={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"};function sd(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function ad(e,t,n){let r=v().currentNode.childNavigationAcrossParents;switch(t){case"up":return e==="vertical"?n.prevItem:r?n.prevContainer:null;case"down":return e==="vertical"?n.nextItem:r?n.nextContainer:null;case"left":return e==="horizontal"?n.prevItem:r?n.prevContainer:null;case"right":return e==="horizontal"?n.nextItem:r?n.nextContainer:null}}function Go(e,t){let n=ne();if(e.sequence===":"&&n.value==="")return x.InitCommandLine;if(t===g.MOVE)switch(e.name){case"m":case"return":return x.ConfirmMove}if(t===g.COMMAND_LINE)return qo(e,n.value);let r=sd(e);if(r){let o=t===g.MOVE?{prevItem:x.MovePreviousItem,nextItem:x.MoveNextItem,prevContainer:x.MoveToPreviousContainer,nextContainer:x.MoveToNextContainer}:{prevItem:x.NavPreviousItem,nextItem:x.NavNextItem,prevContainer:x.NavToPreviousContainer,nextContainer:x.NavToNextContainer};return ad(v().currentNode.childRenderAxis,r,o)}if(e.ctrl&&e.name==="c")return x.Exit;switch(e.name){case"e":return x.Edit;case"n":return x.AddItem;case"m":return x.InitMove;case"d":return x.Delete;case"return":return x.Confirm;case"space":return x.Confirm;case"v":return v().viewMode==="wide"?x.SetViewDense:x.SetViewWide;case"q":case"escape":return x.Exit;case"s":return x.Sync;default:return null}}var Yo=e=>{let{context:t}=v()?.currentNode;if(!t)return M.None;switch(e){case f.EXIT:return M.Exit;case f.EXPORT:return M.Export;case f.INIT:return M.Init;case f.DELETE:return M.Delete;case f.SET_DESCRIPTION:return M.Edit;case f.HELP:return M.ViewHelp;case f.RE_OPEN_ISSUE:return M.ReopenIssue;case f.CLOSE_ISSUE:return M.CloseIssue;case f.TAG:return M.TagTicket;case f.UNTAG:return M.UntagTicket;case f.ASSIGN:return M.AssignUserToTicket;case f.UNASSIGN:return M.UnassignUserFromTicket;case f.RENAME:return M.Rename;case f.NEW:return M.NewItem;case f.FILTER:return M.Filter;case f.MOVE:return M.Move;case f.PEEK:return M.Peek;case f.SET_USERNAME:return M.SetUserName;case f.SET_EDITOR:return M.SetEditor;case f.SET_VIEW:return M.SetView;case f.SYNC:return M.Sync;default:return M.None}};import{ulid as _}from"ulid";import li from"node:fs";import Fd from"node:path";import Od from"react";import{Box as Dd}from"ink";import un from"react";import{Box as fr,Text as hd}from"ink";import ve from"react";import{Text as Xo}from"ink";import Jo,{useEffect as Zo,useState as dd}from"react";var Qo={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"command-line":["\u276F "]},re=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=$(),r=Qo[n]??Qo.default,[o,i]=dd(0);if(Zo(()=>{i(0)},[r]),Zo(()=>{if(!e)return;let l=setInterval(()=>{i(u=>(u+1)%r.length)},500);return()=>clearInterval(l)},[e,r]),!e)return Jo.createElement(Xo,null,t);let a=r[o]??r[0]??t;return Jo.createElement(Xo,{color:E.accent,dimColor:o===1},a)};import{Box as pr,Text as ld}from"ink";import sn from"react";var an=({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)),l=Math.max(1,Math.floor(i/a)),u=Math.max(0,Math.min(n,e.length-1)),m=Math.max(0,e.length-l),p=o?Math.min(m,Math.max(0,u-l+1)):Math.min(m,Math.floor(u/l)*l),y=p+l,N=e.slice(p,y),S=e.length>l,A=i,I=S?Math.max(1,Math.floor(l/e.length*A)):A,C=Math.max(0,A-I),T=Math.max(1,e.length-l),B=S?Math.floor(p/T*C):0;return sn.createElement(pr,{flexDirection:"row",height:i,width:"100%"},sn.createElement(pr,{flexDirection:"column",flexGrow:1,height:i},N),sn.createElement(pr,{flexDirection:"column",width:1,height:A},Array.from({length:A}).map((Oe,Be)=>sn.createElement(ld,{key:Be,color:S&&Be>=B&&Be<B+I?E.accent:E.secondary},S?"\u2502":" "))))};import{Box as dn,Text as vd}from"ink";import Ye from"react";import{Text as cd}from"ink";import ud from"react";var md=e=>e.toLowerCase().trim(),pd=(e,t=rt)=>{let n=md(e);return t[n]?t[n]:Et(n)},st=({id:e,isSelected:t})=>{let n=b.getContributor(e);if(n)return ud.createElement(cd,{underline:t,color:pd(n.name)},"@"+n.name)};import{Text as gd}from"ink";import fd from"react";var at=({id:e,isSelected:t})=>{let n=b.getTag(e);if(n)return fd.createElement(gd,{underline:t,backgroundColor:X(n.name),color:E.primary}," "+n.name+" ")};var ei=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=_t(jn(t.title),r),i=er(t),a=tr(t);return Ye.createElement(dn,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?E.accent:E.secondary,justifyContent:"space-between"},Ye.createElement(dn,{borderBottom:!0},Ye.createElement(dn,{paddingLeft:1,flexDirection:"column"},Ye.createElement(vd,{color:E.primary},o))),Ye.createElement(dn,{flexDirection:"row",paddingLeft:1},i.map(l=>Ye.createElement(at,{key:l.id,id:l.id})),a.map(l=>Ye.createElement(st,{key:l.id,id:l.id}))))};import xd from"chalk";import{Box as It,Text as gr}from"ink";import Re from"react";var yd=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,ti=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=R(t.id),a=I=>{let C=i.find(T=>T.title===I);return C?R(C.id).map(T=>typeof T.props?.value=="string"?T.props.value:"").filter(T=>!!T):[]},l=a("Tags").map(I=>b.getTag(I)).filter(I=>!!I),u=a("Assignees").map(I=>b.getContributor(I)).filter(I=>!!I),m=1,p=l.length*(1+m),y=u.length*(2+m),N=l.map(I=>Re.createElement(It,{key:I.id,paddingRight:m},Re.createElement(gr,{color:X(I.name)},"\u25A0"))),S=u.map(I=>Re.createElement(It,{key:I.id,paddingRight:m},Re.createElement(gr,{color:Et(I.name)},"@"+I.name.at(0)))),A=n?E.accent:o===g.MOVE?E.secondary:E.primary;return Re.createElement(It,{borderBottom:!0,justifyContent:"space-between"},Re.createElement(It,null,Re.createElement(re,{isSelected:n,placeholder:xd.dim.gray(r+1+" ")}),Re.createElement(gr,{wrap:"truncate",color:A},yd(t.title,e-p-y-14))),Re.createElement(It,null,N,S))};var Ed=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:i,listSelectedIndex:a,mode:l})=>{let{renderedChildrenIndex:u}=$(),m=u[e.id]??[],p=`${e.title} (${m.length})`,y=3,N=o?1:4,S=r-y-(o?2:1),A=ve.createElement(fr,{borderStyle:"round",borderColor:E.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},ve.createElement(re,{isSelected:t}),ve.createElement(hd,{bold:!0,color:t?E.accent:E.primary},p," ",e.readonly?"\u{1F512}":"")),I=(C,T)=>{let B=i&&a===T;return o?ve.createElement(ti,{key:C.id,index:T,width:n,ticket:C,isSelected:B,mode:l}):ve.createElement(ei,{key:C.id,width:n,ticket:C,isSelected:B})};return ve.createElement(fr,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?E.accent:E.secondary,paddingRight:1,paddingLeft:1,height:r},A,ve.createElement(fr,{padding:o?1:0},m.length>0&&ve.createElement(an,{selectedIndex:a,height:S,itemHeight:N},m.map(I)),ve.createElement(re,{isSelected:i&&a===-1})))},ni=ve.memo(Ed);import{Box as yr,Text as Pd}from"ink";import _e,{useEffect as hr,useMemo as si}from"react";import Xe from"chalk";import ri from"string-width";import{decodeTime as Nd}from"ulid";var Cd=(e,t)=>e+" ".repeat(Math.max(0,t-ri(e))),bd=(e,t)=>" ".repeat(Math.max(0,t-ri(e)))+e,Id=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)})(),Sd=e=>{switch(e.action){case"move.node":{let t=b.getNode(e.payload.parent);return`to ${t?Xe.dim.bgBlack(` ${t.title} `):"unknown"} with rank ${e.payload.rank}`}case"tag.issue":{let t=v().tags[e.payload.tagId];return t?Xe.bgHex(X(t.name))(` ${t.name} `):"unknown tag"}case"untag.issue":{let t=v().tags[e.payload.tagId];return t?Xe.bgHex(X(t.name))(` ${t.name} `):"unknown tag"}case"assign.issue":{let t=v().contributors[e.payload.contributor];return t?Xe.hex(X(t.name))(` ${t.name} `):"unknown user"}case"unassign.issue":{let t=v().contributors[e.payload.contributor];return t?Xe.hex(X(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""}},Ad=e=>{let t=Ro(Nd(e));return Xe.gray(bd(t,8))},wd=12,Td=e=>Cd(`${e}`,wd),oi=e=>{let t=Ad(e.id),n=Td(e.userName),r=Id(e.action),o=Sd(e),i=Xe.dim("\u203A"),a=[r,o].filter(Boolean).join(" ");return`${n} ${t} ${i} ${a}`};import{Box as ln,Text as Rd}from"ink";import Me from"react";var ii=({selectedIndex:e,parent:t,selected:n})=>{let{currentNode:r}=$(),{title:o}=t,i=R(t.id).map(a=>{let l=typeof a.props?.value=="string"?a.props.value:"";if(o==="Assignees")return b.getContributor(l)?.id;if(o==="Tags")return b.getTag(l)?.id}).filter(a=>!!a);return Me.createElement(ln,{alignItems:"center",paddingTop:1},Me.createElement(ln,{minWidth:12},Me.createElement(re,{isSelected:n}),Me.createElement(Rd,{color:n?E.accent:E.secondary2},o,":")),Me.createElement(ln,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((a,l)=>{let u=r.id===t.id&&l===e;return Me.createElement(ln,{key:`${o}-${a}`,paddingRight:2,minHeight:1},Me.createElement(re,{isSelected:u}),o==="Assignees"?Me.createElement(st,{isSelected:u,id:a}):o==="Tags"?Me.createElement(at,{isSelected:u,id:a}):null)})))};import{Box as cn,Text as vr}from"ink";import Pe,{useEffect as Md}from"react";var xr=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:a,currentNode:l}=$(),u=N=>String(N).replace(/\r?\n/g,""),m=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];Md(()=>{let N=[];return m.forEach((S,A)=>{let I=Ne(BigInt(A+1));if(!Ee(I))return;let C=te.text({id:`${e}-${A}`,name:`Line ${A+1}`,parentNodeId:e,rank:I.value,props:{value:S},readonly:!0}),T=b.createNode(C);Ee(T)&&N.push(T.value.id)}),()=>N.forEach(b.deleteNode)},[e,n]);let p="\u2029",y=m.map((N,S)=>{let A=l.id===e&&a===S;return Pe.createElement(cn,{key:`${e}-${S}`},Pe.createElement(vr,{color:A?E.primary:E.secondary2,dimColor:!A},`${S+1} `.padStart(5,"\xA0")),Pe.createElement(vr,{backgroundColor:A?"gray":""},u(N.length?_t(N,i-10):p)))});return Pe.createElement(cn,{flexDirection:"column",paddingTop:1},Pe.createElement(cn,null,Pe.createElement(re,{isSelected:o}),Pe.createElement(vr,{color:o?E.accent:E.secondary2},t)),Pe.createElement(cn,{flexDirection:"row",borderStyle:"round",borderColor:E.secondary,paddingLeft:1,paddingRight:1,marginLeft:1},Pe.createElement(an,{scrollByOne:!0,children:y,height:r-2,selectedIndex:a,itemHeight:1})))};var kd=e=>`${e}::log`,ai=e=>e==="Assignees"||e==="Tags",di=({ticket:e,height:t})=>{let{selectedIndex:n,currentNode:r}=$(),o=process.stdout.columns||120,i=si(()=>kd(e.id),[e.id]),a=si(()=>[...e.log].reverse().map(oi).join(`
|
|
5
|
-
`),[e.log]);hr(()=>{if(b.getNode(i))return;let T=Ne(1n);if(d(T))return;let B={...te.field(i,"Log",e.id,T.value,{value:a}),readonly:!0,childRenderAxis:"vertical"};return b.createNode(B),()=>{b.deleteNode(i)}},[i,e.id,a]),hr(()=>{let C=b.getNode(i);C&&C.props.value!==a&&b.updateNode({...C,props:{...C.props,value:a},childRenderAxis:"vertical",readonly:!0})},[i,a]);let l=r.id===e.id,u=r.id===i||r.parentNodeId===i;hr(()=>{u&&(n>=0||D.navigate({selectedIndex:0}))},[u,n]);let m=R(e.id);if(u){let C=b.getNode(i),B=t-3;return _e.createElement(yr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},C?_e.createElement(xr,{id:C.id,label:"Event log",text:C.props.value??"",selected:!1,maxWidth:o,height:B}):null)}let p=m.reduce((C,T)=>ai(T.title)||T.id===i?C+1:C,0),y=2,N=p*1,A=t-3-N-y,I=(C,T)=>ai(C.title)?_e.createElement(ii,{key:C.id,parent:C,selected:T,selectedIndex:n}):C.id===i?_e.createElement(yr,{key:C.id,paddingTop:1},_e.createElement(re,{isSelected:T}),_e.createElement(Pd,{backgroundColor:E.secondary,color:T?E.accent:E.primary}," History \u203A\u203A ")):C.title==="Description"?_e.createElement(xr,{label:"Description (press e to edit)",key:C.id,id:C.id,text:C.props.value??"",selected:T,maxWidth:o,height:A}):null;return _e.createElement(yr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},m.map((C,T)=>I(C,l&&n===T)))};var Ld=({swimlanes:e,currentNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:i,height:a,width:l})=>{let u=t.context,m=u===P.TICKET||u===P.FIELD_LIST||u===P.FIELD,p=u===P.BOARD||u===P.SWIMLANE,y=u===P.TICKET?t:r.find(C=>C.context===P.TICKET),N=Math.floor(l/3),S=Math.floor(l/Math.max(e.length,1)),A=Math.min(S,N),I=i==="dense";return un.createElement(Dd,{flexDirection:"row",height:a},p&&e.map((C,T)=>{let B=t.id===C.id,Oe=B?n:-1,Be=t.context===P.BOARD&&n===T;return un.createElement(ni,{key:C.id,height:a,width:A,swimlane:C,isSelected:Be,isDense:I,isFocused:B,listSelectedIndex:Oe,mode:o})}),m&&y&&un.createElement(di,{height:a,ticket:y}))},mn=un.memo(Ld);import{render as Bd}from"ink";import{Writable as Ud}from"node:stream";var St=e=>String(e).padStart(2,"0"),$d=e=>{let t=e.getUTCFullYear(),n=St(e.getUTCMonth()+1),r=St(e.getUTCDate()),o=St(e.getUTCHours()),i=St(e.getUTCMinutes()),a=St(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${i}-${a}`},_d=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",Wd=async(e,{width:t,height:n})=>{let r="",o=new Ud({write(a,l,u){let m=Hd(a.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let i=Bd(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(a=>setTimeout(a,0)),i.unmount(),r},Hd=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),ci=async()=>{let{currentNode:e,selectedIndex:t,breadCrumb:n,viewMode:r,mode:o,renderedChildrenIndex:i}=v(),a=n.find(T=>T.context==="BOARD");if(!a)return s("No board found to export");let l=120,u=40,m=await Wd(Od.createElement(mn,{height:u,width:l,swimlanes:(i[a.id]??[]).filter(T=>T!==void 0&&Qe(T)),currentNode:e,selectedIndex:t,breadCrumb:n,viewMode:r,mode:o}),{width:l,height:u});if(!m)return s("Failed to render board export");let p=Se(process.cwd());if(d(p))return s("Unable to export, epiq root not found");let y=new Date,N=$d(y),S=`board_${_d(a.title)}_${N}.md`,A=uo(p.value);li.mkdirSync(A,{recursive:!0});let I=Fd.join(A,S),C=`# Board - ${a.title}
|
|
6
|
-
|
|
2
|
+
import io from"chalk";import{render as Il}from"ink";import Sl from"meow";import Rl from"react";import{Box as Je}from"ink";import Y from"react";import Et from"node:fs";import{ulid as ma}from"ulid";import{z as Zt}from"zod";var be={None:"none",Success:"success",Fail:"fail"},s=e=>({status:be.Fail,message:e,value:null}),l=(e,t)=>({status:be.Success,message:e,value:t}),d=e=>e.status==="fail",xe=e=>e.status==="success";import ht from"node:fs";import Ie from"node:path";var en=process.env.IS_LOCAL==="true",Se=".epiq",me=".epiq-global",Yt="events",la="project.json",co=e=>Ie.join(e,Se),Xt=e=>Ie.join(e,Se),Jt=e=>Ie.join(Xt(e),la),yt=e=>Ie.join(Xt(e),Yt),ua=e=>{let t=Ie.join(e,Se);return ht.existsSync(t)&&ht.statSync(t).isDirectory()},tn=e=>{let t=Jt(e);return ht.existsSync(t)&&ht.statSync(t).isFile()},De=e=>{let t=Ie.resolve(e);for(;;){if(ua(t))return l("Resolved closest .epiq root",t);let r=Ie.dirname(t);if(r===t)return s("No .epiq directory found in any parent");t=r}},ye=e=>{let t=Ie.resolve(e);for(;;){if(tn(t))return l("Resolved closest epiq project root",t);let r=Ie.dirname(t);if(r===t)return s("No .epiq/project.json found in any parent");t=r}},lo=e=>{let t=yt(e);try{return ht.mkdirSync(t,{recursive:!0}),l("Resolved events dir",t)}catch(r){return s(r instanceof Error?`Failed to ensure events dir: ${r.message}`:"Failed to ensure events dir")}};var pa="epiq/eventlog",ga=Zt.object({projectId:Zt.string().min(1),stateBranch:Zt.string().min(1),createdAt:Zt.string().datetime()}),uo=()=>({projectId:ma(),stateBranch:pa,createdAt:new Date().toISOString()}),Be=e=>{let t=Jt(e);if(!Et.existsSync(t))return s("Missing .epiq/project.json");try{let r=Et.readFileSync(t,"utf8"),n=JSON.parse(r),o=ga.safeParse(n);return o.success?l("Read project.json",o.data):s(`Invalid .epiq/project.json: ${o.error.issues.map(i=>`${i.path.join(".")}: ${i.message}`).join(", ")}`)}catch(r){return s(r instanceof Error?`Failed to read .epiq/project.json: ${r.message}`:"Failed to read .epiq/project.json")}},mo=e=>{let t=Be(e);return d(t)?s(t.message):l("Read projectId",t.value.projectId)},po=({repoRoot:e,fileContents:t})=>{let r=Xt(e),n=Jt(e);try{if(Et.mkdirSync(r,{recursive:!0}),Et.existsSync(n)){let o=Be(e);return d(o)?s(o.message):l("Project already initialized",null)}return Et.writeFileSync(n,JSON.stringify(t,null,2)+`
|
|
3
|
+
`,"utf8"),l("Created project.json",null)}catch(o){return s(o instanceof Error?`Failed to initialize project: ${o.message}`:"Failed to initialize project")}};var Qt={autoSync:!1,preferredEditor:null,userName:null,userId:null},ce=()=>Qt,Qe=e=>(Qt={...Qt,...e},Qt);var et=()=>{let e=ce(),t=!!e.userName?.trim(),r=!!e.preferredEditor?.trim();return{isSetup:r&&t,hasPreferredEditor:r,hasUserName:t,userName:e.userName,preferredEditor:e.preferredEditor}},go=()=>{let e=ye(process.cwd());if(d(e))return s("Unable to determine if repository is initialized");let t=Be(e.value);return xe(t)};var g={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};var Re=(e,t)=>{let r=e.find(n=>n.context===t);return r!==void 0?l("Found node",r):s("Unable to find node in breadcrumb")};import{useSyncExternalStore as Vc}from"react";var P={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function rn(e){return e.context==="WORKSPACE"}function pe(e){return e.context==="TICKET"}function fo(e){return e.context==="FIELD"}var tt=e=>e.context==="SWIMLANE",vo=e=>e.context==="BOARD";function er(e,t){let r=Math.min(e.length,t.length),n=0;for(;n<r&&e[n]===t[n];)n++;return n}var tr=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",nn=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var xo=e=>{let t=new Map;for(let r of e)for(let n=1;n<=r.length;n++){let o=r.slice(0,n),i=t.get(o);i?i.push(r):t.set(o,[r])}return t},ho=(e,t)=>t?e.get(t)??[]:[];var yo=new WeakMap,fa=e=>{let t=yo.get(e);return t||(t=xo(e),yo.set(e,t)),t};var Eo=({wordList:e,inputToMatch:t,overlapThreshold:r=1})=>{let n=t.toLowerCase();return ho(fa(e),n).filter(i=>er(n,i)>=r)};var va={hint:"",hints:[],overlap:0,remainder:""},Co=({inputToMatch:e,lastWord:t,isLastWordCompleted:r},n)=>{if(r||e==="")return va;let o=Eo({wordList:n,inputToMatch:e,overlapThreshold:1});return xa(t,o)},xa=(e,t)=>{let r=t[0]??"",n=er(e.toLowerCase(),r.toLowerCase()),[o,i]=r.split(":"),a=n<(o??"").length,c=!!i,p=(c&&a?o:r)+(c&&a?":":" "),v=p.slice(n);return{hint:p,hints:t,overlap:n,remainder:v}};var No=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var Z={workspace:(e,t,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:P.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,r,n,o=!1)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:P.BOARD,childRenderAxis:"horizontal",parentNodeId:r,readonly:o,log:[]}),swimlane:(e,t,r,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:P.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:r,readonly:!1,log:[]}),field:(e,t,r,n,o={},i="horizontal")=>({id:e,title:t,rank:n,isDeleted:!1,props:o,context:P.FIELD,childRenderAxis:i,parentNodeId:r,readonly:!1,log:[]}),ticket:(e,t,r,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:P.TICKET,childRenderAxis:"vertical",parentNodeId:r,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:r,rank:n,props:o={},readonly:i=!0})=>({id:e,title:t,rank:n,isDeleted:!1,props:o,context:P.TEXT,childRenderAxis:"vertical",parentNodeId:r,readonly:i,log:[]})};import{ulid as Ea}from"ulid";var Ve=24n,ha=Ve*4n,Ct=(1n<<ha)-1n,ya=/^[0-9a-f]+$/;function bo(e){return!e||!ya.test(e)?s(`Invalid hex rank: ${e}`):l("Converted rank to bigint",BigInt("0x"+e))}function we(e,t=Ve){if(e<0n)return s("Negative rank not allowed");let r=e.toString(16);return l("Converted bigint to hex rank",r.padStart(Number(t),"0"))}function z(e,t){if(!e&&!t)return we(Ct/2n,Ve);let r=e?bo(e):l("Resolved lower bound",0n);if(d(r))return r;let n=t?bo(t):l("Resolved upper bound",Ct);if(d(n))return n;let o=r.value,i=n.value;if(i<=o)return we(Ct/2n,Ve);let a=(o+i)/2n;return a===o||a===i?s("No rank space available between neighbors"):we(a,Ve)}function Io(){return we(Ct/2n,Ve)}function So(e){if(e<=0)return l("Resolved empty rank list",[]);let t=BigInt(e),r=[];for(let n=0;n<e;n++){let o=Ct*BigInt(n+1)/(t+1n),i=we(o,Ve);if(d(i))return i;r.push(i.value)}return l("Resolved evenly spaced ranks",r)}var on=(e,t)=>{let r=B(e),n=So(r.length);if(d(n))return n;let o={};for(let i=0;i<r.length;i++){let a=r[i],c=n.value[i];if(!a||!c)return s("Unable to assign rebalance rank");o[a.id]=c}return l("Created rebalance event",{id:Ea(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})};var Ca=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[Ae,rr]=Ca;var k=(e,t)=>s(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),Na={"init.workspace":e=>{let{id:t,name:r,rank:n}=e.payload,o=Z.workspace(t,r,n),i=It(o);if(d(i))return k(i.message,e);let a=I.createNode(o);return d(a)?k(a.message??"Failed to initialize workspace",e):rn(a.value)?l("Workspace initialized",{action:e.action,result:a.value}):s("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:r,rank:n}=e.payload,o=Z.workspace(t,r,n),i=I.createNode(o);return d(i)?k(i.message??"Failed to add workspace",e):rn(i.value)?l("Added workspace",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.board":e=>{let{id:t,name:r,parent:n,rank:o}=e.payload,i=I.createNode(Z.board(t,r,n,o));return d(i)?k(i.message??"Unable to create board",e):vo(i.value)?l("Added board",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:r,parent:n,rank:o}=e.payload,i=I.createNode(Z.swimlane(t,r,n,o));return d(i)?k(i.message??"Unable to create swimlane",e):tt(i.value)?l("Added swimlane",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:r,parent:n,rank:o}=e.payload,i=I.createNode(Z.ticket(t,r,n,o));return d(i)?k(i.message??"Unable to create issue",e):pe(i.value)?l("Added issue",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.field":e=>{let{id:t,name:r,parent:n,val:o,rank:i}=e.payload,a=I.createNode(Z.field(t,r,n,i,{value:o},r.includes("Description")?"vertical":"horizontal"));return d(a)?k(a.message??`Unable to create field: ${r}`,e):fo(a.value)?l("Added field",{action:e.action,result:a.value}):s("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:r}=e.payload;if(!I.getNode(t))return k(`Unable to locate node with id ${t}`,e);let o=I.renameNode(t,r);return d(o)?k(o.message??"Unable to edit title",e):l("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,r=I.tombstoneNode(t);return d(r)?k(r.message??"Unable to delete node",e):l("Deleted node",{action:e.action,result:r.value})},"create.tag":e=>{let{id:t,name:r}=e.payload,n=I.createTag({id:t,name:r});return d(n)?k(n.message??"Unable to create tag",e):l("Tag added",{action:e.action,result:n.value})},"create.contributor":e=>{let{id:t,name:r}=e.payload,n=I.createContributor({id:t,name:r});return d(n)?k(n.message??"Unable to create contributor",e):l("Contributor created",{action:e.action,result:n.value})},"tag.issue":e=>{let{id:t,target:r,tagId:n,rank:o}=e.payload,i=I.tag(r,n,t,o);return d(i)?k(i.message??"Unable to tag issue",e):l("Issue tagged",{action:e.action,result:i.value})},"untag.issue":e=>{let{target:t,tagId:r}=e.payload,n=I.untag(t,r);return d(n)?k(n.message??"Unable to untag ",e):l("Issue untagged",{action:e.action,result:n.value})},"assign.issue":e=>{let{id:t,contributor:r,target:n,rank:o}=e.payload,i=I.assign(n,r,t,o);return d(i)?k(i.message??"Unable to assign issue",e):l("Assigned successfully",{action:e.action,result:i.value})},"unassign.issue":e=>{let{target:t,contributor:r}=e.payload,n=I.unassign(t,r);return d(n)?k(n.message??"Unable to unassign issue",e):l("Issue unassigned",{action:e.action,result:n.value})},"move.node":e=>{let{id:t,parent:r,rank:n}=e.payload,o=I.moveNodeToRank({id:t,parentId:r,rank:n});return d(o)?k(o.message??"Failed to move node",e):l("Moved node",{action:e.action,result:o.value})},"edit.description":e=>{let{id:t,md:r}=e.payload,n=I.editValue(t,r);return d(n)?k(n.message??"Unable to edit description",e):l("Set node value",{action:e.action,result:n.value})},"close.issue":e=>{let{id:t,parent:r,rank:n}=e.payload,o=I.getNode(t);if(!o)return k("Unable to locate issue",e);if(!pe(o))return k("Can only close issues",e);let i=I.getNode(Ae);if(!i)return k("Unable to locate target swimlane",e);if(r!==i.id)return k("Close target must be closed swimlane",e);let a=I.moveNodeToRank({id:t,parentId:r,rank:n});return d(a)?k(a.message??"Unable to close issue",e):l("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:r,rank:n}=e.payload,o=I.getNode(t);if(!o)return k("Unable to locate issue",e);if(!pe(o))return k("Can only reopen issues",e);let i=I.getNode(Ae);if(!i)return k("Unable to locate closed swimlane",e);if(r===i.id)return k("Cannot reopen issue into closed swimlane",e);if(!I.getNode(r))return k("Reopen parent no longer exists",e);let c=I.moveNodeToRank({id:t,parentId:r,rank:n});return d(c)?k(c.message??"Unable to reopen issue",e):l("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,r=I.lockNode(t);return d(r)?k(r.message??"Unable to lock node",e):l("Node locked",{action:e.action,result:r.value})},"rebalance.children":e=>{let{parent:t,ranks:r}=e.payload;for(let[n,o]of Object.entries(r)){let i=I.getNode(n);if(!i)return k(`Unable to locate node ${n}`,e);if(i.parentNodeId!==t)return k(`Node ${n} is not child of ${t}`,e);let a=I.updateNode({...i,rank:o});if(d(a))return k(a.message??"Unable to rebalance child",e)}return l("Rebalanced children",{action:e.action,result:{parent:t}})}},ba=(e,t)=>{let r=I.getNode(e);r&&I.updateNode({...r,log:[...r.log??[],t]})},Ia=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],r=x().nodes[e.payload.id]?.parentNodeId;return r&&t.push(r),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 Nt(e,t=!1){let r=Na[e.action](e);if(d(r))return r;t||([...new Set(Ia(e))].forEach(a=>ba(a,e)),le(a=>({...a,eventLog:[...a.eventLog,e]})));let n=e.userId,o=e.userName;return!n?.length||!o?.length?k("Invalid user ID format",e):(I.createContributor({name:o,id:n}),r)}var bt=e=>e.map(t=>Nt(t));import La from"node:fs";import Fa from"node:path";import{decodeTime as Da,monotonicFactory as Ba}from"ulid";import{z as Rt}from"zod";import nr from"node:fs";import an from"node:path";import{decodeTime as Sa}from"ulid";import{z as sn}from"zod";var Ra=sn.object({userId:sn.string().min(1).default("unknown"),userName:sn.string().min(1).default("unknown")}),wa=e=>{let[t,r]=an.basename(e,".jsonl").split("."),n=Ra.safeParse({userId:t,userName:r});return n.success?l("Parsed event file actor",n.data):s(`Invalid event file name ${an.basename(e)}: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},Aa=e=>{let t=Object.keys(e).filter(r=>r!=="id"&&r!=="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"):l("Resolved persisted action",t[0])},Ta=(e,t)=>t in e,Ma=({id:e,action:t,payload:r,userId:n,userName:o})=>({id:e,action:t,payload:r,userId:n,userName:o}),Pa=e=>{let{userId:t,userName:r,...n}=e,o=Aa(n);if(d(o))return s(o.message);let i=o.value,a=e.id?.[0];return a?Ta(n,i)?l("Decoded persisted event",Ma({id:a,action:i,payload:n[i],userId:t,userName:r})):s(`Persisted event is missing payload for action: ${i}`):s("Persisted event is missing id")},or=e=>{if(!nr.existsSync(e))return l("Event file missing",[]);let t=wa(e);if(d(t))return s(t.message);let r=nr.readFileSync(e,"utf8"),n=[];for(let o of r.split(`
|
|
4
|
+
`)){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 c=dn(a);if(d(c))return s(`${c.message} in ${e}: ${i}`);n.push({...c.value,userId:t.value.userId,userName:t.value.userName})}return l("Parsed persisted events file",n)};function Ro(e){let t=yt(e);if(!nr.existsSync(t))return l("No events found",[]);let r=nr.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>an.join(t,o)),n=[];for(let o of r){let i=or(o);if(d(i))return s(i.message);n.push(...i.value)}return l("All events loaded",ka(n))}function St(e){let t=Ro(e);if(d(t))return s(t.message);let r=[];for(let n of t.value){let o=Pa(n);if(d(o))return s(`Failed to decode event ${n.id?.[0]??"<unknown>"}: ${o.message}`);r.push(o.value)}return l("Loaded merged events",r)}function wo(e=process.cwd()){let t=Ro(e);return d(t)?s(t.message):l("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var ka=e=>{let t=new Map,r=new Map;for(let m of e){let p=m.id[0],v=m.id[1]??null;t.set(p,m);let y=r.get(v)??[];y.push(m),r.set(v,y)}for(let m of r.values())m.sort((p,v)=>p.id[0].localeCompare(v.id[0]));let n=[],o=new Set,i=m=>{let p=m.id[0];if(o.has(p))return;n.push(m),o.add(p);let v=r.get(p)??[];for(let y of v)i(y)},a=r.get(null)??[];for(let m of a)i(m);let c=e.filter(m=>{let p=m.id[0],v=m.id[1]??null;return!o.has(p)&&v!==null&&!t.has(v)}).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of c)i(m);let u=e.filter(m=>!o.has(m.id[0])).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of u)i(m);return n},Ao=(e,t)=>{let r=e.findIndex(n=>{try{return Sa(n.id)>t}catch{return!0}});return r===-1?{appliedEvents:e,unappliedEvents:[]}:{appliedEvents:e.slice(0,r),unappliedEvents:e.slice(r)}};var To=e=>({action:e.action,payload:e.payload});var Po=1,Mo=Ba(),Oa=Rt.tuple([Rt.string().min(1),Rt.string().min(1).nullable()]),Ua=Rt.looseObject({v:Rt.literal(Po),id:Oa}),dn=e=>{let t=Ua.safeParse(e);return t.success?l("Parsed persisted event",t.data):s(`Invalid persisted event: ${t.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},ir=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",ne=()=>{let{userName:e,userId:t}=ce();return e?t?e.trim()?l("Successfully resolved actor ID",{userId:ir(t),userName:ir(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})=>`${ir(e)}.${ir(t)}.jsonl`,$a=(e,{userId:t,userName:r})=>{let n=rt({userId:t,userName:r});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(n))return s(`Invalid event log file name: ${n}`);let i=Fa.join(yt(e),n);return l("Successfully resolved event log path",i)},ja=(e,t)=>{let r={[e.action]:e.payload,v:Po,id:t};return dn(r)};function sr({event:e,rootDir:t=process.cwd()}){try{let r=De(t);if(d(r))return r;let n=lo(r.value);if(d(n))return n;let o=$a(r.value,{userId:e.userId,userName:e.userName});if(d(o))return o;let i=wo(r.value);if(d(i))return s(i.message);let a=i.value?Mo(Math.max(Date.now(),Da(i.value)+1)):Mo(),c=ja(To(e),[a,i.value]);return d(c)?s(c.message):(La.appendFileSync(o.value,`${JSON.stringify(c.value)}
|
|
5
|
+
`,"utf8"),l("Event persisted",{path:o.value,entry:c.value}))}catch(r){let n=r instanceof Error?r.message:"Unknown persist error";return s(`Failed to persist event: ${n}`)}}function V(e){let t=Nt(e);if(t.status!==be.Success)return t;let r=sr({event:e});return d(r)?r:t}function ar(e){return e.map(t=>V(t))}var ko=e=>cn(B(e),{at:"end"}),cn=(e,t={at:"end"})=>{let r=n=>d(n)?l("Rank space exhausted",{rank:"",needsRebalance:!0}):l("Resolved rank",{rank:n.value,needsRebalance:!1});if(e.length===0)return r(z(void 0,void 0));switch(t.at){case"start":{let n=e[0];return n?r(z(void 0,n.rank)):s("Unable to resolve first sibling")}case"end":{let n=e[e.length-1];return n?r(z(n.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let n=Lo(e,t.sibling);if(n<0)return s("Sibling not found");let o=n>0?e[n-1]:void 0,i=e[n];return i?r(z(o?.rank,i.rank)):s("Sibling not found")}case"after":{let n=Lo(e,t.sibling);if(n<0)return s("Sibling not found");let o=e[n],i=n<e.length-1?e[n+1]:void 0;return o?r(z(o.rank,i?.rank)):s("Sibling not found")}}},B=e=>Object.values(x().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,r)=>t.rank.localeCompare(r.rank)),Lo=(e,t)=>e.findIndex(r=>r.id===t),Fo=(e,t,r={at:"end"})=>cn(B(t).filter(n=>n.id!==e),r),nt=(e,t,r,n)=>{let o=Fo(t,e,r);if(d(o))return o;if(!o.value.needsRebalance)return l("Resolved rank",o.value.rank);let i=on(e,n);if(d(i))return i;let a=V(i.value);if(d(a))return a;let c=Fo(t,e,r);return d(c)?c:c.value.needsRebalance?s("Rank rebalance failed to create space"):l("Resolved rank after rebalance",c.value.rank)},ot=(e,t)=>{let r=ko(e);if(d(r))return r;if(!r.value.needsRebalance)return l("Resolved rank",r.value.rank);let n=on(e,t);if(d(n))return n;let o=V(n.value);if(d(o))return o;let i=ko(e);return d(i)?i:i.value.needsRebalance?s("Rank rebalance failed to create space"):l("Resolved rank after rebalance",i.value.rank)};var Oe=(e,t)=>{let{nodes:r}=x(),n=r[e];if(!n)return s("Node not found");if(n.context===t)return l("Resolved ancestor node",n);let o=n.parentNodeId?r[n.parentNodeId]:void 0;for(;o;){if(o.context===t)return l("Resolved ancestor node",o);o=o.parentNodeId?r[o.parentNodeId]:void 0}return s(`No ancestor found for context: ${t}`)},un=(e,t)=>{let{nodes:r}=x(),n=r[e];for(;n?.parentNodeId;){if(n.parentNodeId===t)return!0;n=r[n.parentNodeId]}return!1},ln=(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"),I={deleteNode(e){le(t=>{let r={...t.nodes};return delete r[e],{...t,nodes:r}})},editValue(e,t){let{nodes:r}=x(),n=r[e];if(!n)return s("Edit target node not found");let o=ln(n,"edit");if(o)return o;let i={...n,props:{...n.props,value:t}};return this.updateNode(i),l("Issue description updated",{md:t})},renameNode(e,t){let r=this.getNode(e);if(!r)return s("Rename target node not found");let n=ln(r,"rename");if(n)return n;let o={...r,title:t};return this.updateNode(o),l("Renamed node",o)},getExistingTags(){let{tags:e}=x();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=x();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return B(e).find(r=>r.title===t)},moveNodeToRank({id:e,parentId:t,rank:r}){let{rootNodeId:n}=x(),o=this.getNode(e),i=this.getNode(t);if(!o)return s("Node not found");if(!i)return s("Target parent not found");if(n===e)return s("Cannot move root node");if(e===t)return s("Cannot move node into itself");let a=ln(o,"move");if(a)return a;if(un(t,e))return s("Cannot move node into its own descendant");let c={...o,parentNodeId:t,rank:r};return this.updateNode(c),l("Moved node successfully",c)},tombstoneNode(e){let{nodes:t,currentNodeId:r,rootNodeId:n}=x(),o=this.getNode(e);if(!o)return s("Node not found");if(n===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 p of B(m.id))a(p.id)}};a(e);let c={...structuredClone(t)};for(let u of i){if(!c[u])return s("Unable to locate node to delete");c[u]={...c[u],isDeleted:!0}}return r?(A({nodes:c}),l("Successfully tomb stoned",o)):s("Unable to delete undefined")},createContributor(e){let t=le(r=>({...r,contributors:{...r.contributors,[e.id]:e}}));return d(t)?s("Unable to create contributor"):l("Created contributor",e)},assign(e,t,r,n){let o=this.getContributor(t),i=this.getNode(e);if(!i||!o)return s("Unable assign contributor to issue");let a=this.getFieldByTitle(i.id,"Assignees");if(!a)return s("Unable to locate assignees field");if(B(a.id).some(p=>p.props?.value===t))return s("Contributor already assigned");let u=Z.field(r,o.name,a.id,n,{value:t}),m=this.createNode(u);return d(m)?m:l("Assigned contributor",u)},createTag(e){let t=le(r=>({...r,tags:{...r.tags,[e.id]:e}}));return d(t)?s("Could not create tag"):l("Tag created",e)},tag(e,t,r,n){let o=this.getTag(t),i=this.getNode(e);if(!o)return s("Unable to add tag, missing tag");if(!i)return s("Unable to add tag, missing target");let a=this.getFieldByTitle(i.id,"Tags");if(!a)return s("Unable to locate tags field");if(B(a.id).some(p=>p.props?.value===t))return s("Tag already assigned");let u=Z.field(r,o.name,a.id,n,{value:t}),m=this.createNode(u);return d(m)?m:l("Tag added",u)},untag(e,t){let r=this.getTag(t),n=this.getNode(e);if(!r)return s("Unable to remove tag, missing tag");if(!n)return s("Unable to remove tag, missing target");let o=this.getFieldByTitle(n.id,"Tags");if(!o)return s("Unable to locate tags field");let i=B(o.id).find(c=>c.props?.value===t);if(!i)return l("Issue is not tagged with that tag",null);let a={...i,isDeleted:!0};return this.updateNode(a),l("Tag removed",a)},unassign(e,t){let r=this.getContributor(t),n=this.getNode(e);if(!r)return s("Unable to unassign, missing contributor");if(!n)return s("Unable to unassign, missing target");let o=this.getFieldByTitle(n.id,"Assignees");if(!o)return s("Unable to locate assignees field");let i=B(o.id).find(c=>c.props?.value===t);if(!i)return l("Issue is not assigned to that contributor",null);let a={...i,isDeleted:!0};return this.updateNode(a),l("Assignee removed",a)},createNode(e){let t=le(r=>({...r,nodes:{...r.nodes,[e.id]:e}}));return d(t)?s("Unable to create node"):l("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return s("Failed to locate node");let r={...t,readonly:!0},n=le(o=>({...o,nodes:{...o.nodes,[e]:r}}));return d(n)?s(n.message):l("Locked node",r)},updateNode(e){let t=le(r=>({...r,nodes:{...r.nodes,[e.id]:e}}));return d(t)?t:l("Updated node",e)},getContributor(e){return x().contributors[e]},getTag(e){return x().tags[e]},getNode(e){return x().nodes[e]},getSiblings(e){return B(e)}};var Q={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"},C={accent:Q.cyan,accent2:Q.magenta,primary:Q.white,secondary:Q.grayDark,secondary2:Q.grayLight,gray:Q.gray,green:Q.green,yellow:Q.yellow,red:Q.red};var E={red:Q.red,yellow:Q.yellow,green:Q.green,blue:Q.blue,magenta:Q.magenta,cyan:Q.cyan},it={urgent:E.red,critical:E.red,important:E.red,blocker:E.red,asap:E.red,immediate:E.red,fail:E.red,failure:E.red,broken:E.red,bug:E.red,error:E.red,incident:E.red,outage:E.red,production:E.red,crash:E.red,security:E.red,warning:E.yellow,warn:E.yellow,risky:E.yellow,risk:E.yellow,attention:E.yellow,pending:E.yellow,review:E.yellow,"needs-review":E.yellow,qa:E.yellow,testing:E.yellow,test:E.yellow,validate:E.yellow,verification:E.yellow,staging:E.yellow,check:E.yellow,"follow-up":E.yellow,followup:E.yellow,waiting:E.yellow,blocked:E.yellow,hold:E.yellow,done:E.green,complete:E.green,completed:E.green,success:E.green,ok:E.green,stable:E.green,resolved:E.green,fixed:E.green,closed:E.green,merged:E.green,released:E.green,deployed:E.green,approved:E.green,verified:E.green,working:E.green,healthy:E.green,pass:E.green,passing:E.green,info:E.blue,information:E.blue,note:E.blue,docs:E.blue,documentation:E.blue,doc:E.blue,guide:E.blue,help:E.blue,explanation:E.blue,detail:E.blue,details:E.blue,context:E.blue,design:E.blue,discussion:E.blue,proposal:E.blue,idea:E.blue,feature:E.magenta,enhancement:E.magenta,improvement:E.magenta,refactor:E.magenta,refactoring:E.magenta,cleanup:E.magenta,optimize:E.magenta,optimization:E.magenta,perf:E.magenta,performance:E.magenta,upgrade:E.magenta,migration:E.magenta,modernize:E.magenta,debt:E.magenta,todo:E.cyan,next:E.cyan,planned:E.cyan,plan:E.cyan,future:E.cyan,backlog:E.cyan,investigate:E.cyan,explore:E.cyan,prototype:E.cyan};var Do=(e,t)=>{let n=T(e.id).find(o=>o.title===t);return n?T(n.id).map(o=>typeof o.props?.value=="string"?o.props.value:"").filter(o=>!!o):[]},mn=e=>Do(e,"Tags").map(t=>I.getTag(t)).filter(t=>!!t),dr=()=>{let{breadCrumb:e,selectedNode:t}=x(),r=[...e,t].find(n=>n?.context==="TICKET");return!r||!pe(r)?s("Invalid untag target"):l("Retrieved tags from ticket in breadcrumb",mn(r)??[])},cr=()=>{let{breadCrumb:e,selectedNode:t}=x(),r=[...e,t].find(n=>n?.context==="TICKET");return!r||!pe(r)?s("Invalid untag target"):l("Retrieved tags from ticket in breadcrumb",pn(r)??[])},pn=e=>Do(e,"Assignees").map(t=>I.getContributor(t)).filter(t=>!!t);var f={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 Wa=/^(\d+)(h|d|w|mo|y)$/,_a=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,Ha=({year:e,month:t,day:r,hour:n=0,minute:o=0})=>{let i=new Date(e,t-1,r,n,o);return i.getFullYear()===e&&i.getMonth()===t-1&&i.getDate()===r&&i.getHours()===n&&i.getMinutes()===o},Ka=(e,t=new Date)=>{let r=e.match(Wa);if(!r)return null;let[,n,o]=r,i=Number(n);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}},Va=e=>{let t=e.match(_a);if(!t)return null;let[,r,n,o,i,a]=t,c=Number(r),u=Number(n),m=Number(o),p=i?Number(i):0,v=a?Number(a):0;return Ha({year:c,month:u,day:m,hour:p,minute:v})?new Date(c,u-1,m,p,v):null},lr=e=>{let t=e.trim().toLowerCase();return Ka(t)??Va(t)},Bo=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,qa=[{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}],Oo=(e=qa)=>{let t=[];for(let{unit:r,from:n,to:o}of e)for(let i=n;i<=o;i++)t.push(`${i}${r}`);return t};var za=["BOARD","TICKET","SWIMLANE"],qe=[f.SYNC,f.HELP,f.EXPORT,f.SET_VIEW,f.SET_EDITOR,f.SET_USERNAME],ur=[f.NEW,f.RENAME,f.DELETE,f.MOVE],gn=[f.TAG,f.UNTAG,f.ASSIGN,f.UNASSIGN,f.CLOSE_ISSUE,f.RE_OPEN_ISSUE,f.SET_DESCRIPTION],Uo=[f.FILTER,f.PEEK],Ga={WORKSPACE:[...qe,...ur],BOARD:[...Uo,...qe,...ur],SWIMLANE:[...Uo,...qe,...ur],TICKET:[...qe,...ur,...gn],FIELD:[...qe,...gn],FIELD_LIST:[...qe,...gn],TEXT:[...qe]},Ya=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Xa=()=>{let{currentNode:e,selectedNode:t,readOnly:r}=x();if(!et().isSetup)return[f.HELP,f.SET_EDITOR,f.SET_USERNAME];if(!go())return[f.HELP,f.INIT];if(r)return[f.HELP,f.PEEK,f.EXPORT,f.SET_VIEW];let o=e.context??"WORKSPACE",i=t?.context,a=i&&za.includes(i);return Ga[o].filter(c=>c===f.RENAME||c===f.DELETE||c===f.MOVE?a:!0)},G=e=>{let{currentNode:t}=x(),r=t.context??"WORKSPACE";return{[f.NONE]:Xa(),[f.EXIT]:["confirm"],[f.EXPORT]:[],[f.SYNC]:[],[f.INIT]:[],[f.HELP]:[],[f.PEEK]:[...Oo(),"now","prev","next"],[f.SET_USERNAME]:[],[f.SET_DESCRIPTION]:["confirm"],[f.DELETE]:["confirm"],[f.RE_OPEN_ISSUE]:["confirm"],[f.CLOSE_ISSUE]:["confirm"],[f.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[f.FILTER]:["tag","assignee","description","title","clear"],[f.SET_VIEW]:["dense","wide"],[f.SET_EDITOR]:[...No],[f.TAG]:[...new Set([...Object.keys(it),...I.getExistingTags()])],[f.UNTAG]:[...dr()?.value?.map(({name:o})=>o)??[]],[f.UNASSIGN]:[...cr()?.value?.map(({name:o})=>o)??[]],[f.ASSIGN]:I.getExistingAssignees(),[f.RENAME]:[],[f.NEW]:Ya(r)}[e]??[]};import at from"chalk";import{decodeTime as $o}from"ulid";var jo=e=>{let t=Date.now()-e,r=[{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:n,ms:o}of r){let i=Math.floor(t/o);if(i>=1)return`${i}${n} ago`}return"just now"},Wo=e=>{let t=r=>String(r).padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())} ${t(e.getHours())}:${t(e.getMinutes())}`},mr=e=>{try{return l("Decoded date",new Date($o(e)))}catch(t){return s("Decoding failed + "+t.message)}},fn=e=>{if(!e?.id)return null;try{return $o(e.id)}catch{return null}};import st from"chalk";var xn={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Ja=(e,t,r)=>Math.max(t,Math.min(r,e)),vn=(e,t,r)=>e+(t-e)*r,_o=e=>{let t=0;for(let r=0;r<e.length;r++)t=t*31+e.charCodeAt(r)>>>0;return t},Za=(e,t,r)=>{let n=t/100,o=r/100,i=(1-Math.abs(2*o-1))*n,a=e/60,c=i*(1-Math.abs(a%2-1)),u=0,m=0,p=0;a>=0&&a<1?(u=i,m=c):a>=1&&a<2?(u=c,m=i):a>=2&&a<3?(m=i,p=c):a>=3&&a<4?(m=c,p=i):a>=4&&a<5?(u=c,p=i):(u=i,p=c);let v=o-i/2;return[Math.round((u+v)*255),Math.round((m+v)*255),Math.round((p+v)*255)]},Qa=([e,t,r])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${r.toString(16).padStart(2,"0")}`,ed=(e,t,r)=>[Math.round(vn(e[0],t[0],r)),Math.round(vn(e[1],t[1],r)),Math.round(vn(e[2],t[2],r))],wt=e=>{let r=_o(e)%360,n=Za(r,xn.stringColor.saturation,xn.stringColor.lightness);return Qa(n)},td=e=>{let t=xn.gradient.stops,r=Ja(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let n=t.length-1,o=r*n,i=Math.min(Math.floor(o),n-1),a=o-i;return ed(t[i],t[i+1],a)},pr=e=>_o(e.toLowerCase().trim())/4294967295,Ho=e=>{let t=pr(e);return td(t)},rd=e=>{let[t,r,n]=Ho(e);return{normal:o=>st.bgRgb(t,r,n).black(o),cursor:o=>st.bgRgb(t,r,n).white.bold(o)}},hn=e=>{let[t,r,n]=Ho(e);return{fg:o=>st.rgb(t,r,n)(o),fgCursor:o=>st.rgb(t,r,n).inverse(o),bg:o=>st.bgRgb(t,r,n).black(o),bgCursor:o=>st.bgRgb(t,r,n).white.bold(o)}},yn=e=>rd(e).normal(` ${e} `),ee=(e,t=it)=>{let n=(o=>o.toLowerCase().trim())(e);return n&&t[n]?t[n]:wt(n)};var Te={None:"none",Invalid:"invalid",Valid:"valid"};var nd=["BOARD","TICKET","SWIMLANE"],En=()=>{let e=x().selectedNode;return e?.context?nd.includes(e?.context)?j():O({message:"Command not available in this context"}):O({message:"Missing target context"})},oe="<ENTER> to confirm",j=(e="",t=[])=>({message:e,validity:Te.Valid,completionWordList:t}),O=({message:e,completionWordList:t=[]})=>({validity:Te.Invalid,message:e,completionWordList:t}),Tt=e=>e.length===0,Ue=({prefix:e="",wordList:t,postfix:r="",noOfHints:n=100,inputString:o,minLengthForHints:i=1})=>{let u=[...t.filter(Boolean).filter(p=>p.startsWith(o.trim()))].sort((p,v)=>pr(p)-pr(v)).slice(0,n).map(yn),m=u.length>i?u.join(" "):"";return m?`${e}${m}${r}`:""},Cn=({modifier:e})=>{let t="confirm";return e===t?j(oe):O({message:Tt(e)?`if you are certain, enter ${yn(t)}`:"",completionWordList:[t]})},od=({list:e,hint:t})=>({modifier:r})=>e.includes(r)?j(oe):O({message:Tt(r)?t:""}),id=({list:e,hint:t,onValue:r})=>({modifier:n,inputString:o})=>e.includes(n)?o.trim().length<1?O({message:r}):j():O({message:Tt(n)?t:""}),At=({hint:e})=>({modifier:t,inputString:r})=>Tt(t)&&Tt(r)?O({message:e,completionWordList:[]}):j(oe),sd={[f.EXPORT]:()=>j(oe+", and create export markdown file"),[f.PEEK]:e=>{let t=e.modifier;if(t==="now")return j(oe);let r={message:"historical state from: '1h', '2d', '23h', '1mo', '2y', 'previous', 'next' or full date as YYYY-MM-DD"};if(t==="prev"||t==="next")return j(oe);let n=lr(t);if(!t||!n)return O(r);let o=Re(x().breadCrumb,"BOARD");if(d(o))return O({message:"Command is not applicable in this context"});let i=mr(o.value.id);return d(i)?O({message:"Unable to peek: board id is not a valid ULID"}):Bo({date:n,horizonDate:i.value})?j(oe):O({message:at.red(`nothing to peek before ${i.value.toISOString().slice(0,16).replace("T"," ")}`)})},[f.EXIT]:()=>j(oe+" and exit the application"),[f.INIT]:()=>j(oe),[f.FILTER]:e=>{if(e.modifier==="clear")return j();let t=a=>G(f.FILTER).includes(a);if(!e.modifier||!t(e.modifier??""))return O({message:Ue({wordList:G(f.FILTER),inputString:e.inputString}),completionWordList:G(f.FILTER)});let n=Object.values(x().tags).map(a=>a.name),o=Object.values(x().contributors).map(a=>a.name),i=e.modifier==="tag"?n:e.modifier==="assignee"?o:[];return e.inputString?i.length&&!i.includes(e.inputString.trim()??"")?O({message:Ue({prefix:`existing ${e.modifier}s... `,wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i}):j():O({message:Ue({prefix:"one of... ",wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i})},[f.NONE]:e=>{let t=G(f.NONE),r=/^[A-Za-z_]+:/g,n=e.inputString.match(r);return n&&n.length?t=[...t.filter(o=>o.trim().match(r))]:t=[...new Set(t.flatMap(o=>o.match(r)?.join("").replace(":","")??o))],e.command?j():O({message:Ue({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0})})},[f.NEW]:e=>id({list:G(f.NEW),hint:Ue({wordList:G(f.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[f.SET_DESCRIPTION]:()=>j(oe),[f.HELP]:()=>j(oe),[f.RENAME]:()=>{let e=En();return e.validity==="invalid"?e:j(oe)},[f.DELETE]:e=>{let t=En();return t.validity==="invalid"?t:Cn(e)},[f.CLOSE_ISSUE]:e=>Cn(e),[f.RE_OPEN_ISSUE]:e=>Cn(e),[f.MOVE]:e=>{let t=En();return t.validity==="invalid"?t:At({hint:Ue({prefix:"hey hacker! These commands are blocked for you... ",wordList:G(f.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[f.TAG]:e=>{let t=I.getExistingTags().map(r=>` ${at.bgHex(ee(r))(" "+r+" ")} `).slice(0,10);return At({hint:"tag name like... "+t.join("")})(e)},[f.UNTAG]:e=>{let t=dr();if(d(t))return O({message:"Invalid untag target",completionWordList:[]});let r=t.value.map(({name:n})=>n).map(n=>` ${at.bgHex(ee(n))(" "+n+" ")} `).slice(0,10);return r.length?At({hint:" ... "+r.join("")})(e):O({message:"Issue has not tags",completionWordList:[]})},[f.ASSIGN]:e=>{let t=I.getExistingAssignees().map(r=>` ${at.bgHex(ee(r))(" "+r+" ")} `).slice(0,10);return At({hint:"assign to... "+t.join("")})(e)},[f.UNASSIGN]:e=>{let t=cr();if(d(t))return O({message:"Invalid unassign target",completionWordList:[]});let r=t.value.map(({name:n})=>n).map(n=>` ${at.bgHex(ee(n))(" "+n+" ")} `).slice(0,10);return r.length?At({hint:"remove assignee... "+r.join("")})(e):O({message:"Issue has no assignees",completionWordList:[]})},[f.SET_EDITOR]:e=>{logger.debug(`Validating command: ${e.command} ${e.modifier} ${e.inputString}`);let t=G(f.SET_EDITOR);return e.modifier?j(oe):O({message:Ue({wordList:t,inputString:e.inputString})})},[f.SET_USERNAME]:e=>e.inputString?j():O({message:`Enter a username. Saved in ${at.bgBlack("~/.epiq-global/")}`}),[f.SET_VIEW]:e=>od({list:G(f.SET_VIEW),hint:Ue({wordList:G(f.SET_VIEW),noOfHints:3,inputString:e.inputString})})(e),[f.SYNC]:()=>j(oe)},Ko=Object.fromEntries(Object.entries(sd).map(([e,t])=>[e,{validate:(r,n,o)=>t({modifier:n,command:r,inputString:o})}]));var Vo=["frontend","backend","infrastructure","architecture","integration","configuration","implementation","application","deployment","environment","framework","platform","service","component","module","gateway","pipeline","containerization","orchestrator","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","reproducibility","reproduction","investigation","triage","workaround","mitigation","remediation","optimization","stabilization","refinement","failure","outage","blocking","criticality","severity","escalation","diagnostics","analysis","resolution","corruption","inconsistency","validation","verification","authorization","authentication","confidentiality","availability","accessibility","reliability","compliance","governance","encryption","decryption","integrity","auditing","traceability","accountability","protection","privileges","permissions","dependency","orchestration","provisioning","synchronization","compatibility","incompatibility","interoperability","observability","instrumentation","telemetry","loadbalancing","discovery","registration","scheduling","coordination","distribution","isolation","virtualization","serialization","deserialization","initialization","instantiation","propagation","aggregation","consolidation","normalization","standardization","transformation","reconciliation","correlation","processing","indexing","partitioning","enrichment","validation","filtering","streaming","batching","concurrency","parallelism","contention","deadlock","throttling","ratelimiting","backpressure","fragmentation","saturation","exhaustion","partitioning","replication","redundancy","failover","deprecation","obsolescence","starvation","overload","underutilization","latency","throughput","refactoring","modularization","encapsulation","abstraction","extensibility","configurability","maintainability","recoverability","sustainability","readability","testability","debuggability","reusability","simplicity","consistency","performance","functionality","requirement","recommendation","improvement","enhancement","clarification","documentation","description","acceptance","criteria","estimation","prioritization","dependency","deliverable","milestone","iteration"];var M={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 qo=e=>Object.values(f).includes(e),zo=(e,t)=>{let r=e.command??"",{modifier:n,target:o,inputString:i}=e,{message:a,validity:c,completionWordList:u}=Ko[r].validate(r,n,i),m=o==="command"?Object.values(f):r&&e.target==="modifier"?G(r):Vo;return{validity:c,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:a??"",autoCompletion:t?Co(e,[...u,...m]):{hint:"",hints:[],remainder:"",overlap:0}}};var Go=e=>{let t=e.trimStart(),r=dd(t),n=r[0]??"",o=r[1]??"",i=/\s$/.test(e),a=cd(e),c=qo(n)?n:null,u=c!==null,m=n!=="",p=c?G(c)??[]:[],v=c&&p.includes(o)?o:"",y="word";r.length===0||r.length===1&&!i?y="command":(r.length===1&&i||r.length===2&&!i)&&(y="modifier");let b=i?"":a,R=ad(t,c,v);return{raw:e,trimmedStart:t,words:r,firstWord:n,lastWord:a,hasCommand:m,command:c,isCommandKeyword:u,isLastWordCompleted:i,modifier:v,target:y,inputToMatch:b,inputString:R}},ad=(e,t,r)=>{let n=e;return t&&n.startsWith(t)&&(n=n.slice(t.length)),n=n.replace(/^\s+/,""),r&&n.startsWith(r)&&(n=n.slice(r.length),n=n.replace(/^\s+/,"")),n},dd=e=>e.trim()?e.trim().split(/\s+/):[],cd=e=>e.trimEnd().split(/\s+/).at(-1)??"";var Yo=" ",te={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Te.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},Nn=new Set,Xo=()=>{for(let e of Nn)e()},Jo=e=>(Nn.add(e),()=>Nn.delete(e)),Me=e=>{let r=e(te),n=Go(r.value),o=r.cursorPosition===r.value.length;te={...r,commandMeta:zo(n,o)},Xo()},Mt=({message:e,status:t})=>{let r=structuredClone(te);return r.commandMeta={...r.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},r.commandIsPending=!0,te=r,Xo(),l(e,null)},bn=e=>{Me(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},In=e=>{Me(t=>{let{value:r,cursorPosition:n}=t,o=n;if(e==="left"){for(;o>0&&r[o-1]===" ";)o--;for(;o>0&&r[o-1]!==" ";)o--}else{for(;o<r.length&&r[o]!==" ";)o++;for(;o<r.length&&r[o]===" ";)o++}return{...t,cursorPosition:o}})},Zo=()=>{Me(e=>{let t=e.value.slice(e.cursorPosition),r=Math.max(0,e.cursorPosition-1);return{...e,value:e.value.slice(0,r)+t,cursorPosition:r,commandIsPending:!1}})},Qo=()=>{Me(e=>{let{value:t,cursorPosition:r}=e,n=r;for(;n>0&&t[n-1]===" ";)n--;for(;n>0&&t[n-1]!==" ";)n--;let o=t.slice(r);return{...e,value:t.slice(0,n)+o,cursorPosition:n,commandIsPending:!1}})},H=e=>{Me(t=>{let r=Math.max(0,Math.min(t.cursorPosition,t.value.length)),n=t.value.slice(0,r),o=t.value.slice(r),i=e(n,t.commandMeta.autoCompletion),a=i+o,c=Math.max(0,Math.min(i.length,a.length));return{...t,value:a,cursorPosition:c,commandIsPending:!1}})},ei=()=>{Me(e=>({...e,commandIsPending:!0}))},ti=({addToHistory:e=!0})=>{Me(r=>({...r,commandHistory:e?[r.value,...r.commandHistory].slice(0,40):r.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),ld()},ri=()=>{Me(e=>{let t=Math.min(e.commandHistoryIndex+1,e.commandHistory.length-1),r=e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:r,cursorPosition:r.length}})},ni=()=>{Me(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),r=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:r,cursorPosition:r.length}})},ld=()=>H(()=>""),se=()=>te,gr=()=>{let[e,...t]=te.value.split(Yo);return t.join(Yo).trim()};var ud=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",md=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",pd=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",oi=(e,t)=>{if(md(e,e.sequence))return h.MoveCursorLeftOfWord;if(pd(e,e.sequence))return h.MoveCursorRightOfWord;if(ud(e,e.sequence))return h.EraseInputWord;switch(e.name){case"tab":return h.AutoCompleteCommand;case"up":return h.GetLastCommandFromHistory;case"down":return h.GetNextCommandFromHistory;case"left":return h.MoveCursorLeft;case"right":return h.MoveCursorRight;case"return":return h.Confirm;case"backspace":return t?h.EraseInput:h.ExitCommandLine;case"escape":return h.ExitCommandLine;default:return h.CaptureInput}};var h={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"};function gd(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function fd(e,t,r){let n=x().currentNode.childNavigationAcrossParents;switch(t){case"up":return e==="vertical"?r.prevItem:n?r.prevContainer:null;case"down":return e==="vertical"?r.nextItem:n?r.nextContainer:null;case"left":return e==="horizontal"?r.prevItem:n?r.prevContainer:null;case"right":return e==="horizontal"?r.nextItem:n?r.nextContainer:null}}function ii(e,t){let r=se();if(e.sequence===":"&&r.value==="")return h.InitCommandLine;if(t===g.MOVE)switch(e.name){case"m":case"return":return h.ConfirmMove}if(t===g.COMMAND_LINE)return oi(e,r.value);let n=gd(e);if(n){let o=t===g.MOVE?{prevItem:h.MovePreviousItem,nextItem:h.MoveNextItem,prevContainer:h.MoveToPreviousContainer,nextContainer:h.MoveToNextContainer}:{prevItem:h.NavPreviousItem,nextItem:h.NavNextItem,prevContainer:h.NavToPreviousContainer,nextContainer:h.NavToNextContainer};return fd(x().currentNode.childRenderAxis,n,o)}if(e.ctrl&&e.name==="c")return h.Exit;switch(e.name){case"e":return h.Edit;case"n":return h.AddItem;case"m":return h.InitMove;case"d":return h.Delete;case"return":return h.Confirm;case"space":return h.Confirm;case"v":return x().viewMode==="wide"?h.SetViewDense:h.SetViewWide;case"q":case"escape":return h.Exit;case"s":return h.Sync;default:return null}}var si=e=>{let{context:t}=x()?.currentNode;if(!t)return M.None;switch(e){case f.EXIT:return M.Exit;case f.EXPORT:return M.Export;case f.INIT:return M.Init;case f.DELETE:return M.Delete;case f.SET_DESCRIPTION:return M.Edit;case f.HELP:return M.ViewHelp;case f.RE_OPEN_ISSUE:return M.ReopenIssue;case f.CLOSE_ISSUE:return M.CloseIssue;case f.TAG:return M.TagTicket;case f.UNTAG:return M.UntagTicket;case f.ASSIGN:return M.AssignUserToTicket;case f.UNASSIGN:return M.UnassignUserFromTicket;case f.RENAME:return M.Rename;case f.NEW:return M.NewItem;case f.FILTER:return M.Filter;case f.MOVE:return M.Move;case f.PEEK:return M.Peek;case f.SET_USERNAME:return M.SetUserName;case f.SET_EDITOR:return M.SetEditor;case f.SET_VIEW:return M.SetView;case f.SYNC:return M.Sync;default:return M.None}};import{ulid as $}from"ulid";import Ni from"node:fs";import Hd from"node:path";import Kd from"react";import{Box as Wd}from"ink";import Er from"react";import{Box as wn,Text as wd}from"ink";import Ee from"react";import{Text as ai}from"ink";import di,{useEffect as ci,useState as vd}from"react";var li={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"command-line":["\u276F "]},ae=({isSelected:e,placeholder:t=" "})=>{let{mode:r}=U(),n=li[r]??li.default,[o,i]=vd(0);if(ci(()=>{i(0)},[n]),ci(()=>{if(!e)return;let c=setInterval(()=>{i(u=>(u+1)%n.length)},500);return()=>clearInterval(c)},[e,n]),!e)return di.createElement(ai,null,t);let a=n[o]??n[0]??t;return di.createElement(ai,{color:C.accent,dimColor:o===1},a)};import{Box as Sn,Text as xd}from"ink";import fr from"react";var vr=({children:e=[],height:t,selectedIndex:r,itemHeight:n=1,scrollByOne:o=!1})=>{if(e.length===0)return null;let i=Math.max(1,Math.floor(t)),a=Math.max(1,Math.ceil(n)),c=Math.max(1,Math.floor(i/a)),u=Math.max(0,Math.min(r,e.length-1)),m=Math.max(0,e.length-c),p=o?Math.min(m,Math.max(0,u-c+1)):Math.min(m,Math.floor(u/c)*c),v=p+c,y=e.slice(p,v),b=e.length>c,R=i,S=b?Math.max(1,Math.floor(c/e.length*R)):R,N=Math.max(0,R-S),w=Math.max(1,e.length-c),D=b?Math.floor(p/w*N):0;return fr.createElement(Sn,{flexDirection:"row",height:i,width:"100%"},fr.createElement(Sn,{flexDirection:"column",flexGrow:1,height:i},y),fr.createElement(Sn,{flexDirection:"column",width:1,height:R},Array.from({length:R}).map((ie,X)=>fr.createElement(xd,{key:X,color:b&&X>=D&&X<D+S?C.accent:C.secondary},b?"\u2502":" "))))};import{Box as xr,Text as Id}from"ink";import ze from"react";import{Text as hd}from"ink";import yd from"react";var Ed=e=>e.toLowerCase().trim(),Cd=(e,t=it)=>{let r=Ed(e);return t[r]?t[r]:wt(r)},dt=({id:e,isSelected:t})=>{let r=I.getContributor(e);if(r)return yd.createElement(hd,{underline:t,color:Cd(r.name)},"@"+r.name)};import{Text as Nd}from"ink";import bd from"react";var ct=({id:e,isSelected:t})=>{let r=I.getTag(e);if(r)return bd.createElement(Nd,{underline:t,backgroundColor:ee(r.name),color:C.primary}," "+r.name+" ")};var ui=({width:e,ticket:t,isSelected:r})=>{let n=e-14,o=tr(nn(t.title),n),i=mn(t),a=pn(t);return ze.createElement(xr,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:r?C.accent:C.secondary,justifyContent:"space-between"},ze.createElement(xr,{borderBottom:!0},ze.createElement(xr,{paddingLeft:1,flexDirection:"column"},ze.createElement(Id,{color:C.primary},o))),ze.createElement(xr,{flexDirection:"row",paddingLeft:1},i.map(c=>ze.createElement(ct,{key:c.id,id:c.id})),a.map(c=>ze.createElement(dt,{key:c.id,id:c.id}))))};import Sd from"chalk";import{Box as Pt,Text as Rn}from"ink";import Pe from"react";var Rd=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,mi=({width:e,ticket:t,isSelected:r,index:n,mode:o})=>{let i=T(t.id),a=S=>{let N=i.find(w=>w.title===S);return N?T(N.id).map(w=>typeof w.props?.value=="string"?w.props.value:"").filter(w=>!!w):[]},c=a("Tags").map(S=>I.getTag(S)).filter(S=>!!S),u=a("Assignees").map(S=>I.getContributor(S)).filter(S=>!!S),m=1,p=c.length*(1+m),v=u.length*(2+m),y=c.map(S=>Pe.createElement(Pt,{key:S.id,paddingRight:m},Pe.createElement(Rn,{color:ee(S.name)},"\u25A0"))),b=u.map(S=>Pe.createElement(Pt,{key:S.id,paddingRight:m},Pe.createElement(Rn,{color:wt(S.name)},"@"+S.name.at(0)))),R=r?C.accent:o===g.MOVE?C.secondary:C.primary;return Pe.createElement(Pt,{borderBottom:!0,justifyContent:"space-between"},Pe.createElement(Pt,null,Pe.createElement(ae,{isSelected:r,placeholder:Sd.dim.gray(n+1+" ")}),Pe.createElement(Rn,{wrap:"truncate",color:R},Rd(t.title,e-p-v-14))),Pe.createElement(Pt,null,y,b))};var Ad=({swimlane:e,isSelected:t,width:r,height:n,isDense:o,isFocused:i,listSelectedIndex:a,mode:c})=>{let{renderedChildrenIndex:u}=U(),m=u[e.id]??[],p=`${e.title} (${m.length})`,v=3,y=o?1:4,b=n-v-(o?2:1),R=Ee.createElement(wn,{borderStyle:"round",borderColor:C.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},Ee.createElement(ae,{isSelected:t}),Ee.createElement(wd,{bold:!0,color:t?C.accent:C.primary},p," ",e.readonly?"\u{1F512}":"")),S=(N,w)=>{let D=i&&a===w;return o?Ee.createElement(mi,{key:N.id,index:w,width:r,ticket:N,isSelected:D,mode:c}):Ee.createElement(ui,{key:N.id,width:r,ticket:N,isSelected:D})};return Ee.createElement(wn,{flexDirection:"column",width:r,borderStyle:"round",borderColor:t?C.accent:C.secondary,paddingRight:1,paddingLeft:1,height:n},R,Ee.createElement(wn,{padding:o?1:0},m.length>0&&Ee.createElement(vr,{selectedIndex:a,height:b,itemHeight:y},m.map(S)),Ee.createElement(ae,{isSelected:i&&a===-1})))},pi=Ee.memo(Ad);import{Box as Mn,Text as $d}from"ink";import $e,{useEffect as Pn,useMemo as yi}from"react";import Ge from"chalk";import gi from"string-width";import{decodeTime as Td}from"ulid";var Md=(e,t)=>e+" ".repeat(Math.max(0,t-gi(e))),Pd=(e,t)=>" ".repeat(Math.max(0,t-gi(e)))+e,kd=e=>(()=>{let r={"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=>r[o]??(o.endsWith("e")?`${o}d`:`${o}ed`))(e)})(),Ld=e=>{switch(e.action){case"move.node":{let t=I.getNode(e.payload.parent);return`to ${t?Ge.dim.bgBlack(` ${t.title} `):"unknown"} with rank ${e.payload.rank}`}case"tag.issue":{let t=x().tags[e.payload.tagId];return t?Ge.bgHex(ee(t.name))(` ${t.name} `):"unknown tag"}case"untag.issue":{let t=x().tags[e.payload.tagId];return t?Ge.bgHex(ee(t.name))(` ${t.name} `):"unknown tag"}case"assign.issue":{let t=x().contributors[e.payload.contributor];return t?Ge.hex(ee(t.name))(` ${t.name} `):"unknown user"}case"unassign.issue":{let t=x().contributors[e.payload.contributor];return t?Ge.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""}},Fd=e=>{let t=jo(Td(e));return Ge.gray(Pd(t,8))},Dd=12,Bd=e=>Md(`${e}`,Dd),fi=e=>{let t=Fd(e.id),r=Bd(e.userName),n=kd(e.action),o=Ld(e),i=Ge.dim("\u203A"),a=[n,o].filter(Boolean).join(" ");return`${r} ${t} ${i} ${a}`};var L={exit(){process.exit(0)},enterChildNode(){let e=x(),t=e.currentNode,r=Math.max(0,e.selectedIndex),n=T(t.id)[r];!n||t.context==="FIELD"||L.navigate({currentNode:n,selectedIndex:T(n.id).length?0:-1})},enterParentNode(){let{currentNode:e,nodes:t}=x();if(!e.parentNodeId){logger.info("Missing parent node id");return}let r=t[e.parentNodeId];if(!r){logger.error("Parent not found");return}let n=T(r.id),o=n.findIndex(({id:a})=>a===e.id),i=n.length===0?-1:o>=0?o:0;L.navigate({currentNode:r,selectedIndex:i})},navigateToNextItem:()=>vi(1),navigateToPreviousItem:()=>vi(-1),navigateToNextContainer:()=>xi(1),navigateToPreviousContainer:()=>xi(-1),navigate:({currentNode:e=x().currentNode,selectedIndex:t})=>{A({currentNodeId:e.id,selectedIndex:t})}},vi=e=>{let t=x(),r=T(t.currentNode.id).length;if(r===0)return;let o=(Math.max(0,t.selectedIndex)+e+r)%r;L.navigate({selectedIndex:o})},xi=e=>{let{currentNode:t,nodes:r,selectedIndex:n}=x();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=r[t.parentNodeId];if(!t||!o)return;let i=T(o.id),a=i.findIndex(y=>y.id===t.id);if(a<0)return;let c=i.at(a+e)??i.at(0);if(!c)return;let u=T(c.id),m=Math.max(0,u.length-1),p=Math.min(Math.max(0,n),m),v=u.length?p:-1;L.navigate({currentNode:c,selectedIndex:v})};import{Box as hr,Text as Od}from"ink";import ke from"react";var hi=({selectedIndex:e,parent:t,selected:r})=>{let{currentNode:n}=U(),{title:o}=t,i=T(t.id).map(a=>{let c=typeof a.props?.value=="string"?a.props.value:"";if(o==="Assignees")return I.getContributor(c)?.id;if(o==="Tags")return I.getTag(c)?.id}).filter(a=>!!a);return ke.createElement(hr,{alignItems:"center",paddingTop:1},ke.createElement(hr,{minWidth:12},ke.createElement(ae,{isSelected:r}),ke.createElement(Od,{color:r?C.accent:C.secondary2},o,":")),ke.createElement(hr,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((a,c)=>{let u=n.id===t.id&&c===e;return ke.createElement(hr,{key:`${o}-${a}`,paddingRight:2,minHeight:1},ke.createElement(ae,{isSelected:u}),o==="Assignees"?ke.createElement(dt,{isSelected:u,id:a}):o==="Tags"?ke.createElement(ct,{isSelected:u,id:a}):null)})))};import{Box as yr,Text as An}from"ink";import Le,{useEffect as Ud}from"react";var Tn=({id:e,label:t,text:r,height:n,selected:o,maxWidth:i})=>{let{selectedIndex:a,currentNode:c}=U(),u=y=>String(y).replace(/\r?\n/g,""),m=typeof r=="string"?r.split(/\r?\n|\u2028|\u2029/):[];Ud(()=>{let y=[];return m.forEach((b,R)=>{let S=we(BigInt(R+1));if(!xe(S))return;let N=Z.text({id:`${e}-${R}`,name:`Line ${R+1}`,parentNodeId:e,rank:S.value,props:{value:b},readonly:!0}),w=I.createNode(N);xe(w)&&y.push(w.value.id)}),()=>y.forEach(I.deleteNode)},[e,r]);let p="\u2029",v=m.map((y,b)=>{let R=c.id===e&&a===b;return Le.createElement(yr,{key:`${e}-${b}`},Le.createElement(An,{color:R?C.primary:C.secondary2,dimColor:!R},`${b+1} `.padStart(5,"\xA0")),Le.createElement(An,{backgroundColor:R?"gray":""},u(y.length?tr(y,i-10):p)))});return Le.createElement(yr,{flexDirection:"column",paddingTop:1},Le.createElement(yr,null,Le.createElement(ae,{isSelected:o}),Le.createElement(An,{color:o?C.accent:C.secondary2},t)),Le.createElement(yr,{flexDirection:"row",borderStyle:"round",borderColor:C.secondary,paddingLeft:1,paddingRight:1,marginLeft:1},Le.createElement(vr,{scrollByOne:!0,children:v,height:n-2,selectedIndex:a,itemHeight:1})))};var jd=e=>`${e}::log`,Ei=e=>e==="Assignees"||e==="Tags",Ci=({ticket:e,height:t})=>{let{selectedIndex:r,currentNode:n}=U(),o=process.stdout.columns||120,i=yi(()=>jd(e.id),[e.id]),a=yi(()=>[...e.log].reverse().map(fi).join(`
|
|
6
|
+
`),[e.log]);Pn(()=>{if(I.getNode(i))return;let w=we(1n);if(d(w))return;let D={...Z.field(i,"Log",e.id,w.value,{value:a}),readonly:!0,childRenderAxis:"vertical"};return I.createNode(D),()=>{I.deleteNode(i)}},[i,e.id,a]),Pn(()=>{let N=I.getNode(i);N&&N.props.value!==a&&I.updateNode({...N,props:{...N.props,value:a},childRenderAxis:"vertical",readonly:!0})},[i,a]);let c=n.id===e.id,u=n.id===i||n.parentNodeId===i;Pn(()=>{u&&(r>=0||L.navigate({selectedIndex:0}))},[u,r]);let m=T(e.id);if(u){let N=I.getNode(i),D=t-3;return $e.createElement(Mn,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},N?$e.createElement(Tn,{id:N.id,label:"Event log",text:N.props.value??"",selected:!1,maxWidth:o,height:D}):null)}let p=m.reduce((N,w)=>Ei(w.title)||w.id===i?N+1:N,0),v=2,y=p*1,R=t-3-y-v,S=(N,w)=>Ei(N.title)?$e.createElement(hi,{key:N.id,parent:N,selected:w,selectedIndex:r}):N.id===i?$e.createElement(Mn,{key:N.id,paddingTop:1},$e.createElement(ae,{isSelected:w}),$e.createElement($d,{backgroundColor:C.secondary,color:w?C.accent:C.primary}," History \u203A\u203A ")):N.title==="Description"?$e.createElement(Tn,{label:"Description (press e to edit)",key:N.id,id:N.id,text:N.props.value??"",selected:w,maxWidth:o,height:R}):null;return $e.createElement(Mn,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},m.map((N,w)=>S(N,c&&r===w)))};var _d=({swimlanes:e,currentNode:t,selectedIndex:r,breadCrumb:n,mode:o,viewMode:i,height:a,width:c})=>{let u=t.context,m=u===P.TICKET||u===P.FIELD_LIST||u===P.FIELD,p=u===P.BOARD||u===P.SWIMLANE,v=u===P.TICKET?t:n.find(N=>N.context===P.TICKET),y=Math.floor(c/3),b=Math.floor(c/Math.max(e.length,1)),R=Math.min(b,y),S=i==="dense";return Er.createElement(Wd,{flexDirection:"row",height:a},p&&e.map((N,w)=>{let D=t.id===N.id,ie=D?r:-1,X=t.context===P.BOARD&&r===w;return Er.createElement(pi,{key:N.id,height:a,width:R,swimlane:N,isSelected:X,isDense:S,isFocused:D,listSelectedIndex:ie,mode:o})}),m&&v&&Er.createElement(Ci,{height:a,ticket:v}))},Cr=Er.memo(_d);import{render as Vd}from"ink";import{Writable as qd}from"node:stream";var kt=e=>String(e).padStart(2,"0"),zd=e=>{let t=e.getUTCFullYear(),r=kt(e.getUTCMonth()+1),n=kt(e.getUTCDate()),o=kt(e.getUTCHours()),i=kt(e.getUTCMinutes()),a=kt(e.getUTCSeconds());return`${t}-${r}-${n}_${o}-${i}-${a}`},Gd=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",Yd=async(e,{width:t,height:r})=>{let n="",o=new qd({write(a,c,u){let m=Xd(a.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(n=m),u()}});o.columns=t,o.rows=r,o.isTTY=!0;let i=Vd(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(a=>setTimeout(a,0)),i.unmount(),n},Xd=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),bi=async()=>{let{currentNode:e,selectedIndex:t,breadCrumb:r,viewMode:n,mode:o,renderedChildrenIndex:i}=x(),a=r.find(w=>w.context==="BOARD");if(!a)return s("No board found to export");let c=120,u=40,m=await Yd(Kd.createElement(Cr,{height:u,width:c,swimlanes:(i[a.id]??[]).filter(w=>w!==void 0&&tt(w)),currentNode:e,selectedIndex:t,breadCrumb:r,viewMode:n,mode:o}),{width:c,height:u});if(!m)return s("Failed to render board export");let p=De(process.cwd());if(d(p))return s("Unable to export, epiq root not found");let v=new Date,y=zd(v),b=`board_${Gd(a.title)}_${y}.md`,R=co(p.value);Ni.mkdirSync(R,{recursive:!0});let S=Hd.join(R,b),N=`# Board - ${a.title}
|
|
7
|
+
Date: ${v.toISOString()}
|
|
7
8
|
|
|
8
9
|
\`\`\`text
|
|
9
10
|
${m}
|
|
10
11
|
\`\`\`
|
|
11
|
-
`;return
|
|
12
|
-
|
|
13
|
-
`);if(n[n.length-1]===""&&n.pop(),n.length<=pi)return;let r=n.slice(-pi).join(`
|
|
12
|
+
`;return Ni.writeFileSync(S,N,"utf8"),l("Exported board layout",S)};import pc from"node:fs";var Ye=e=>{let t=ye(e);if(d(t))return s("Unable to resolve epiq project root");let r=Be(t.value);return d(r)?s("Unable to read project.json"):l("Resolved state branch",r.value.stateBranch)},ge="origin";import Dt from"node:fs";import tc from"node:os";import he from"node:path";var kn=(e,t)=>{let r=new Map,n=t??((...i)=>JSON.stringify(i)),o=((...i)=>{let a=n(...i);if(!r.has(a)){let c=e(...i).then(u=>(d(u)&&r.delete(a),u));r.set(a,c)}return r.get(a)});return o.clear=()=>r.clear(),o};import Lt from"fs";import Si from"path";import Jd from"util";var Ii=1e3,Ri=()=>{let e=process.cwd(),t=De(e);if(!d(t))return Si.join(t.value,Se,"log","epiq.log")};function Zd(){if(!en)return;let e=Ri();if(e===void 0||!Lt.existsSync(e))return;let r=Lt.readFileSync(e,"utf8").split(`
|
|
13
|
+
`);if(r[r.length-1]===""&&r.pop(),r.length<=Ii)return;let n=r.slice(-Ii).join(`
|
|
14
14
|
`)+`
|
|
15
|
-
`;
|
|
16
|
-
`;
|
|
17
|
-
`);u(
|
|
18
|
-
`)))}),o.on("close",p=>{let
|
|
19
|
-
`)));return}u(
|
|
20
|
-
${
|
|
21
|
-
${
|
|
22
|
-
`).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(
|
|
23
|
-
${
|
|
24
|
-
${o.message}`):
|
|
25
|
-
`+e.message);let t=
|
|
26
|
-
`+t.message):
|
|
27
|
-
`+t.message);let
|
|
28
|
-
`).filter(Boolean).filter(a=>a!==
|
|
29
|
-
${o.message}`);let i=await
|
|
30
|
-
${
|
|
31
|
-
${
|
|
32
|
-
`+
|
|
33
|
-
`+n.message);if(!n.value)return
|
|
34
|
-
`+
|
|
35
|
-
${
|
|
36
|
-
${
|
|
37
|
-
`),o=null;for(let i of
|
|
38
|
-
`+n.message);
|
|
39
|
-
${
|
|
40
|
-
${
|
|
41
|
-
${
|
|
42
|
-
${
|
|
43
|
-
${n.message}`):
|
|
44
|
-
${
|
|
45
|
-
${
|
|
46
|
-
${o.message}`):
|
|
47
|
-
`+
|
|
48
|
-
${
|
|
15
|
+
`;Lt.writeFileSync(e,n,"utf8")}function Ln(e,t,r=!1){if(!en)return;let n=Ri();if(!n)return;let o=Jd.format(...t),i=new Date,c=`[${r?i.toISOString().slice(11,19):i.toISOString()}] ${e} ${o}
|
|
16
|
+
`;Lt.mkdirSync(Si.dirname(n),{recursive:!0}),Lt.appendFileSync(n,c,"utf8"),Zd()}var de={info(...e){Ln("[Info]",e,!1)},debug(...e){Ln("->",e,!0)},error(...e){Ln("[Error]",[...e,new Error().stack],!1)}};globalThis.logger=de;import{spawn as Qd}from"node:child_process";import Fn from"node:fs";import Ti from"node:path";var W={stage:({cwd:e,pathspec:t})=>F({args:["add",...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:r=!1})=>F({args:["commit",...r?["--allow-empty"]:[],"-m",t],cwd:e}),fetch:({cwd:e,remote:t,branch:r})=>F({args:["fetch",t,r],cwd:e}),pullRebase:({cwd:e,remote:t,branch:r})=>F({args:["pull","--rebase",t,r],cwd:e}),checkout:({cwd:e,branch:t})=>F({args:["checkout",t],cwd:e}),push:({cwd:e,remote:t,branch:r,setUpstream:n=!1})=>{let o=t&&r?["push",...n?["-u"]:[],t,r]:["push"];return F({args:o,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:r})=>F({args:["branch","--set-upstream-to",r,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:r})=>F({args:["worktree","add",t,r],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>F({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>F({args:["worktree","prune"],cwd:e})};var wi=15e3,ec={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},Mi=({args:e,cwd:t,allowFail:r})=>new Promise(n=>{if(!Fn.existsSync(t)){let p=`Git cwd does not exist: ${t}`;if(r){n({stdout:"",stderr:p,exitCode:1});return}n(s(p));return}let o=Qd("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:ec}),i=!1,a="",c="",u=p=>{i||(i=!0,clearTimeout(m),n(p))},m=setTimeout(()=>{o.kill("SIGTERM");let p=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${wi}ms`].join(`
|
|
17
|
+
`);u(r?{stdout:a,stderr:p,exitCode:124}:s(p))},wi);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",p=>{a+=p}),o.stderr.on("data",p=>{c+=p}),o.on("error",p=>{if(r){u({stdout:a,stderr:p.message,exitCode:1});return}u(s([`git ${e.join(" ")}`,`cwd=${t}`,p.message].join(`
|
|
18
|
+
`)))}),o.on("close",p=>{let v=p??1;if(r){u({stdout:a,stderr:c,exitCode:v});return}if(v!==0){u(s([`git ${e.join(" ")}`,c.trim()||a.trim()||"Git command failed"].filter(Boolean).join(`
|
|
19
|
+
`)));return}u(l("Git command succeeded",{stdout:a,stderr:c,exitCode:v}))})}),F=({args:e,cwd:t})=>Mi({args:e,cwd:t,allowFail:!1}),lt=({args:e,cwd:t})=>Mi({args:e,cwd:t,allowFail:!0}),ut=async({cwd:e,message:t})=>{let r=await W.commit({cwd:e,message:t});if(d(r))return s(`Failed to create commit
|
|
20
|
+
${r.message}`);let n=await F({args:["rev-parse","HEAD"],cwd:e});return d(n)?s(`Commit created, but failed to read HEAD SHA
|
|
21
|
+
${n.message}`):l("Created commit and resolved SHA",n.value.stdout.trim())},Ft=async e=>{let t=await Bi(e);if(d(t))return s(t.message);let r=t.value,o=["MERGE_HEAD","CHERRY_PICK_HEAD","REVERT_HEAD","REBASE_HEAD","rebase-merge","rebase-apply"].filter(i=>Fn.existsSync(Ti.join(r,i)));return l("Checked for in-progress Git operation",o.length>0)},Dn=async({repoRoot:e})=>{let r=(await lt({args:["remote","get-url",ge],cwd:e})).exitCode===0;return l(`Checked remote ${r}`,r)},Nr=async({repoRoot:e,branch:t})=>{let r=await lt({args:["ls-remote","--heads",ge,t],cwd:e});return r.exitCode!==0?s(r.stderr.trim()||`Unable to inspect remote branch ${ge}/${t}`):l("Checked remote branch",r.stdout.trim().length>0)},br=async({repoRoot:e,branch:t})=>{let r=await lt({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return r.exitCode===0?l("Local branch exists",!0):r.exitCode===1?l("Local branch missing",!1):s(r.stderr.trim()||`Unable to inspect branch ${t}`)},Ai=e=>{try{return Fn.realpathSync.native(e)}catch{return Ti.resolve(e)}},Pi=async({repoRoot:e,worktreeRoot:t})=>{let r=await F({args:["worktree","list","--porcelain"],cwd:e});if(d(r))return s(r.message);let n=Ai(t),o=r.value.stdout.split(`
|
|
22
|
+
`).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(Ai).includes(n);return l("Checked worktree registration",o)},Bn=async e=>{let t=await lt({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return l("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},Ir=async e=>{let t=await F({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return d(t)?s(t.message):l("Resolved current branch",t.value.stdout.trim())},ki=async e=>{let t=await F({args:["rev-parse","--short","HEAD"],cwd:e});return d(t)?s(t.message):l("Resolved short HEAD sha",t.value.stdout.trim())},Li=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),Sr=async({cwd:e,branch:t})=>{let r=await Nr({repoRoot:e,branch:t});if(d(r))return s(r.message);if(!r.value)return l("Remote branch missing, skipped pull",!1);let n=await W.fetch({cwd:e,remote:ge,branch:t});if(d(n))return s(`Failed to fetch ${t}
|
|
23
|
+
${n.message}`);let o=await W.pullRebase({cwd:e,remote:ge,branch:t});return d(o)?s(`Failed during pull --rebase
|
|
24
|
+
${o.message}`):l("Pulled with rebase",!0)},Fi=async e=>{let t=await F({args:["status","--porcelain"],cwd:e});return d(t)?s(t.message):l("Checked state branch changes",t.value.stdout.trim().length>0)},Di=async e=>{let t=await Ir(e);return d(t)?s(t.message):l("Checked detached HEAD state",t.value==="HEAD")};var Oi="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Ui=e=>he.join(Se,Yt,e),$i=()=>he.join(tc.homedir(),me),Rr=()=>he.join($i(),"worktrees"),ji=({repoRoot:e})=>{let t=mo(e);return d(t)?s(t.message):l("Resolved state branch root",he.join(Rr(),t.value))},rc=e=>he.join(e,Se),Xe=e=>he.join(rc(e),Yt),On=({root:e,fileName:t})=>he.join(Xe(e),t),Bt=e=>{try{return Dt.mkdirSync(e,{recursive:!0}),l("Ensured directory",void 0)}catch(t){return s(t instanceof Error?t.message:String(t))}},wr=()=>{let e=Bt($i());if(d(e))return s(`Ensure epiq home failed.
|
|
25
|
+
`+e.message);let t=Bt(Rr());return d(t)?s(`Ensure worktrees dir failed.
|
|
26
|
+
`+t.message):l("Ensured epiq storage",!0)},Wi=e=>{Dt.existsSync(e)&&(de.debug("[sync] remove path",e),Dt.rmSync(e,{recursive:!0,force:!0}))},_i=e=>{let t=Xe(e);if(!Dt.existsSync(t))return l("Events dir missing",[]);let r=Dt.readdirSync(t,{withFileTypes:!0}).filter(n=>n.isFile()).map(n=>n.name).filter(n=>n.endsWith(".jsonl")).sort();return l("Listed event files",r)},Hi=(e,t)=>{for(let r of[Xe(e),Xe(t)]){let n=Bt(r);if(d(n))return s(n.message)}return l("Ensured state branch",void 0)},Ki=async e=>{let t=await F({args:["ls-tree","--name-only","HEAD"],cwd:e});if(d(t))return s(`ensure state branch is storage only failed
|
|
27
|
+
`+t.message);let n=t.value.stdout.trim().split(`
|
|
28
|
+
`).filter(Boolean).filter(a=>a!==Se);if(n.length===0)return l("State branch is storage-only",!1);let o=await F({args:["rm","-r","--ignore-unmatch","--",...n],cwd:e});if(d(o))return s(`Failed to clean storage branch
|
|
29
|
+
${o.message}`);let i=await ut({cwd:e,message:"[epiq:repair-storage-branch]"});return d(i)?s(i.message):l("Cleaned storage branch",!0)},Ar=kn(async(e=process.cwd())=>{let t=await F({args:["rev-parse","--show-toplevel"],cwd:e});return d(t)?s("Not inside a Git repository"):l("Resolved repo root",t.value.stdout.trim())},e=>he.resolve(e)),Bi=kn(async e=>{let t=await F({args:["rev-parse","--git-dir"],cwd:e});if(d(t))return s(t.message);let r=t.value.stdout.trim(),n=he.isAbsolute(r)?r:he.join(e,r);return l("Resolved git dir",n)},e=>he.resolve(e));import mt from"node:fs";import Ot from"node:path";var qi=async e=>{if((await lt({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return l("Initial commit already exists",!1);de.info("Creating initial commit");let r=await W.commit({cwd:e,message:"Initial commit",allowEmpty:!0});return d(r)?s(r.message):l("Created initial commit",!0)},Vi=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",nc=async e=>{let t=await Ir(e);if(d(t))return s(t.message);let r=await ki(e);if(d(r))return s(r.message);let n=`[epiq:sync:${Vi(t.value)}:${Vi(r.value)}]`;return l("Built sync commit message",n)},Tr=async({repoRoot:e,stateBranchName:t})=>{de.info(`Creating ${t}`);let r=await F({args:["commit-tree",Oi,"-m","[epiq:init-state-branch]"],cwd:e});if(d(r))return s(`Failed to create state branch commit
|
|
30
|
+
${r.message}`);let n=r.value.stdout.trim(),o=await F({args:["update-ref",`refs/heads/${t}`,n],cwd:e});return d(o)?s(`Failed to create ${t}
|
|
31
|
+
${o.message}`):l("Created state branch",!0)},oc=async({repoRoot:e,stateBranchName:t})=>{let r=await br({repoRoot:e,branch:t});if(d(r))return s(`Ensure local state branch failed
|
|
32
|
+
`+r.message);if(r.value)return l("Local state branch already exists",!1);let n=await Dn({repoRoot:e});if(d(n))return s(`Ensure local state branch failed
|
|
33
|
+
`+n.message);if(!n.value)return Tr({repoRoot:e,stateBranchName:t});let o=await Nr({repoRoot:e,branch:t});if(d(o))return s(`Ensure local state branch failed
|
|
34
|
+
`+o.message);if(!o.value)return Tr({repoRoot:e,stateBranchName:t});let i=await W.fetch({cwd:e,remote:ge,branch:t});if(d(i))return s(`Failed to fetch ${t} from remote
|
|
35
|
+
${i.message}`);let a=await F({args:["branch","--track",t,`${ge}/${t}`],cwd:e});return d(a)?s(`Failed to create local ${t} from remote
|
|
36
|
+
${a.message}`):l("Created local state branch from remote",!0)},ic=async({repoRoot:e,branch:t})=>{let r=await F({args:["worktree","list","--porcelain"],cwd:e});if(d(r))return s(r.message);let n=r.value.stdout.split(`
|
|
37
|
+
`),o=null;for(let i of n){if(i.startsWith("worktree ")){o=i.slice(9);continue}if(i===`branch refs/heads/${t}`&&o)return l("Found worktree for branch",o)}return l("No worktree found for branch",null)},sc=async({repoRoot:e,stateBranchRoot:t,stateBranchName:r})=>{let n=Bt(Ot.dirname(t));if(d(n))return s(`Failed to create state branch worktree
|
|
38
|
+
`+n.message);mt.existsSync(t)&&!mt.existsSync(Ot.join(t,".git"))&&(de.info("Removing broken state branch worktree path"),Wi(t)),de.info("Creating state branch worktree");let o=await W.worktreeAdd({cwd:e,worktreeRoot:t,branch:r});return d(o)?s(`Failed to create state branch worktree
|
|
39
|
+
${o.message}`):l("Created state branch worktree",!0)},Un=async({repoRoot:e,stateBranchRoot:t,stateBranchName:r})=>{let n=await ic({repoRoot:e,branch:r});if(d(n))return s(n.message);let o=Ot.resolve(t),i=n.value?Ot.resolve(n.value):null;if(i&&i===o&&mt.existsSync(i))return l("State branch already checked out in expected worktree",!1);if(i&&i!==o){de.info("Moving state branch worktree to expected location");let u=await W.worktreeRemove({cwd:e,worktreeRoot:i});if(d(u))return s(`Failed to remove existing state branch worktree
|
|
40
|
+
${u.message}`)}if(i&&!mt.existsSync(i)){de.info("Pruning stale state branch worktree");let u=await W.worktreePrune({cwd:e});if(d(u))return s(`Failed to prune stale worktrees
|
|
41
|
+
${u.message}`)}let a=await Pi({repoRoot:e,worktreeRoot:t});if(d(a))return s(a.message);let c=mt.existsSync(t);if(a.value&&c)return l("State branch worktree already exists",!1);if(a.value&&!c){de.info("Pruning missing registered state branch worktree");let u=await W.worktreePrune({cwd:e});if(d(u))return s(`Failed to prune stale worktrees
|
|
42
|
+
${u.message}`)}return sc({repoRoot:e,stateBranchRoot:t,stateBranchName:r})},ac=async({stateBranchRoot:e,stateBranchName:t})=>{let r=await Ir(e);if(d(r))return s(r.message);if(r.value===t)return l("State branch already checked out",!1);let n=await W.checkout({cwd:e,branch:t});return d(n)?s(`Failed to checkout ${t}
|
|
43
|
+
${n.message}`):l("Checked out state branch",!0)},dc=async({repoRoot:e,stateBranchRoot:t})=>{let r=await Bn(t);if(d(r))return s(r.message);if(r.value)return l("State branch upstream already configured",!1);let n=await Dn({repoRoot:t});if(d(n))return s(n.message);if(!n.value)return l("No remote available for state branch upstream",!1);let o=Ye(e);if(d(o))return o;let i=o.value,a=await Nr({repoRoot:t,branch:i});if(d(a))return s(a.message);if(!a.value)return l("Remote state branch missing; upstream will be configured on first push",!1);de.info(`Configuring ${i} upstream`);let c=await W.fetch({cwd:t,remote:ge,branch:i});if(d(c))return s(`Failed to fetch ${i}
|
|
44
|
+
${c.message}`);let u=await W.setUpstream({cwd:t,branch:i,upstream:`${ge}/${i}`});return d(u)?s(`Failed to set state branch upstream
|
|
45
|
+
${u.message}`):l("Configured state branch upstream",!0)},Mr=async({stateBranchRoot:e,eventFileName:t})=>{let r=Ui(t),n=Ot.join(e,r);if(!mt.existsSync(n))return l("No event file to stage",void 0);let o=await W.stage({cwd:e,pathspec:[r]});return d(o)?s(`Failed to stage state branch event file
|
|
46
|
+
${o.message}`):l("Staged state branch event file",void 0)},zi=async({repoRoot:e,stateBranchRoot:t})=>{let r=await nc(e);return d(r)?s(`Create state branch sync commit failed
|
|
47
|
+
`+r.message):ut({cwd:t,message:r.value})},Ut=async({repoRoot:e,stateBranchRoot:t})=>{let r=await Bn(t);if(d(r))return s(r.message);let n=Ye(e);if(d(n))return n;let o=n.value,i=r.value?await W.push({cwd:t}):await W.push({cwd:t,remote:ge,branch:o,setUpstream:!0});return d(i)?s(`Failed during state branch push
|
|
48
|
+
${i.message}`):l("Pushed state branch",!0)},Gi=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:r})=>{let n=!1,o=Ye(e);if(d(o))return o;let i=o.value,a=[wr(),await oc({repoRoot:e,stateBranchName:i}),await Un({repoRoot:e,stateBranchRoot:t,stateBranchName:i}),await ac({stateBranchRoot:t,stateBranchName:i}),await Ki(t),r?await dc({stateBranchRoot:t,repoRoot:e}):l("Skipped state branch upstream bootstrap",!1)];for(let c of a){if(d(c))return s(c.message);n=n||!!c.value}return l(r?"Bootstrapped state storage":"Bootstrapped state storage (readonly)",n)};import Pr from"node:fs";import jn from"node:path";import{decodeTime as cc}from"ulid";var $n=e=>{let[t,r]=e.id;return`${t}:${r??""}`},Yi=e=>{let[t]=e.id;return cc(t)},lc=e=>{let{userId:t,userName:r,...n}=e;return n},uc=e=>e.length===0?"":e.map(t=>JSON.stringify(lc(t))).join(`
|
|
49
49
|
`)+`
|
|
50
|
-
`,
|
|
51
|
-
`),
|
|
52
|
-
`)
|
|
53
|
-
`);return
|
|
50
|
+
`,mc=(e,t)=>{let r=new Map;for(let n of[...t,...e])r.set($n(n),n);return[...r.values()].sort((n,o)=>{let i=Yi(n)-Yi(o);return i!==0?i:$n(n).localeCompare($n(o))})},Wn=({sourceFile:e,targetFile:t})=>{let r=or(e);if(d(r))return s(r.message);let n=or(t);if(d(n))return s(n.message);let o=mc(n.value,r.value),i=uc(o);return(Pr.existsSync(t)?Pr.readFileSync(t,"utf8"):"")===i?l("Event file already merged",!1):(Pr.mkdirSync(jn.dirname(t),{recursive:!0}),Pr.writeFileSync(t,i,"utf8"),l("Merged event file",!0))},$t=({repoRoot:e,stateBranchRoot:t})=>{let r=_i(t);if(d(r))return s(r.message);let n=Xe(t),o=Xe(e),i=!1;for(let a of r.value){let c=jn.join(n,a),u=jn.join(o,a),m=Wn({sourceFile:c,targetFile:u});if(d(m))return s(m.message);i=i||m.value}return l("Hydrated event files from state branch",i)};var Ji=async(e=process.cwd())=>{let t=await Zi({cwd:e,ensureUpstream:!1});if(d(t))return t;let{repoRoot:r,stateBranchRoot:n}=t.value,o=Ye(e);if(d(o))return o;let i=o.value,a=await Sr({cwd:n,branch:i});if(d(a))return s(a.message);let c=$t({repoRoot:r,stateBranchRoot:n});return d(c)?s(c.message):l("Synced state branch",{repoRoot:r,stateBranchRoot:n})},gc=({repoRoot:e,stateBranchRoot:t,ownEventFileName:r})=>{let n=On({root:e,fileName:r}),o=On({root:t,fileName:r});return pc.existsSync(n)?Wn({sourceFile:n,targetFile:o}):l("Local own event file missing, nothing to merge",!1)},Zi=async({cwd:e,ensureUpstream:t})=>{let r=await Ar(e);if(d(r))return s(r.message);let n=r.value,o=ji({repoRoot:n});if(d(o))return s(o.message);let i=o.value,a=await Ft(n);if(d(a))return s(a.message);if(a.value)return s("Cannot sync while a git operation is in progress in the current repo");let c=await qi(n);if(d(c))return s(c.message);let u=await Gi({repoRoot:n,stateBranchRoot:i,ensureUpstream:t});if(d(u))return s(u.message);let m=await Ft(i);if(d(m))return s(m.message);if(m.value)return s("Cannot sync while a git operation is in progress in the state branch");let p=Hi(n,i);return d(p)?s(p.message):l("Sync preconditions satisfied",{repoRoot:n,stateBranchRoot:i,bootstrapped:u.value})},Xi=async({repoRoot:e,stateBranchRoot:t,ownEventFileName:r})=>{let n=gc({repoRoot:e,stateBranchRoot:t,ownEventFileName:r});if(d(n))return s(n.message);let o=await Fi(t);if(d(o))return s(o.message);if(!n.value&&!o.value)return l("Own event file already up to date in state branch",{createdCommit:!1});let i=await Mr({stateBranchRoot:t,eventFileName:r});if(d(i))return s(i.message);let a=await zi({repoRoot:e,stateBranchRoot:t});return d(a)?s(a.message):l("Merged, staged, and committed own event file",{createdCommit:!0,commitSha:a.value})},Qi=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 r=await Zi({cwd:e,ensureUpstream:!0});if(d(r))return r;let{repoRoot:n,stateBranchRoot:o,bootstrapped:i}=r.value,a=await Di(n);if(d(a))return s(a.message);if(a.value)return s("Cannot run :sync while the repository is in detached HEAD state");let c=!1,u,m=!1,p=!1,v=!1,y=Ye(n);if(d(y))return y;let b=y.value,R=await Sr({cwd:o,branch:b});if(d(R))return s(R.message);m=R.value;let S=$t({repoRoot:n,stateBranchRoot:o});if(d(S))return s(S.message);v=S.value;let N=await Xi({repoRoot:n,stateBranchRoot:o,ownEventFileName:t});if(d(N))return s(N.message);if(c=N.value.createdCommit,u=N.value.commitSha,c||i){let w=await Ut({stateBranchRoot:o,repoRoot:n}),D=w;if(d(w)&&Li(w.message)){let ie=await Sr({cwd:o,branch:b});if(d(ie))return s(ie.message);let X=await Xi({repoRoot:n,stateBranchRoot:o,ownEventFileName:t});if(d(X))return s(X.message);X.value.createdCommit&&(c=!0,u=X.value.commitSha),D=await Ut({stateBranchRoot:o,repoRoot:n})}if(d(D))return s(D.message);p=D.value,logger.debug("[sync] pushed to state branch",p)}else logger.debug("[sync] no commit created, skipped push");if(c){let w=await F({args:["rev-parse","HEAD"],cwd:o});if(d(w))return s(w.message);u=w.value.stdout.trim()}return l("Synced event logs with state branch",{repoRoot:n,stateBranchRoot:o,createdCommit:c,commitSha:u,pulled:m,pushed:p,hydrated:v,bootstrapped:i})};var ts=()=>{let{currentNode:e,selectedIndex:t}=x(),r=T(e.id)[t];return{currentNodeId:e.id,selectedNodeId:r?.id??null,parentNodeId:r?.parentNodeId??null,selectedIndex:t}},es=(e,t)=>Math.max(0,Math.min(e,Math.max(0,t-1))),rs=e=>{let{nodes:t}=x(),r=t[e.currentNodeId];if(r&&!r.isDeleted&&e.selectedNodeId){let i=T(r.id).findIndex(a=>a.id===e.selectedNodeId);if(i>=0)return L.navigate({currentNode:r,selectedIndex:i}),l("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=T(i.id).findIndex(c=>c.id===o.id);if(a>=0)return L.navigate({currentNode:i,selectedIndex:a}),l("Restored navigation to moved node",null)}}}if(r&&!r.isDeleted){let o=T(r.id);return L.navigate({currentNode:r,selectedIndex:es(e.selectedIndex,o.length)}),l("Restored navigation to previous container",null)}if(e.parentNodeId){let o=t[e.parentNodeId];if(o&&!o.isDeleted){let i=T(o.id);return L.navigate({currentNode:o,selectedIndex:es(e.selectedIndex,i.length)}),l("Restored navigation to parent",null)}}let n=t[x().rootNodeId];return!n||n.isDeleted?s("Unable to restore navigation"):(L.navigate({currentNode:n,selectedIndex:0}),l("Restored navigation to root",null))};import{ulid as fc}from"ulid";var ns=null,je=()=>structuredClone(ns),jt=e=>ns=e,os=()=>{let{currentNode:e,selectedIndex:t}=x(),n=T(e.id)[t];return n?l("Resolved selected child",n):s("Target node not found")};var is=({id:e,parentId:t,position:r={at:"end"}})=>{let n=ne();if(d(n))return s("Unable to resolve user ID");let o=nt(t,e,r,n.value);return d(o)?o:l("Created pending move state",{id:fc(),...n.value,action:"move.node",payload:{id:e,parent:t,rank:o.value}})},ss=e=>{jt(e);let t=Nt(e,!0);return d(t)?t:l("Node moved successfully",t.value)};function _n(e){let t=os();if(d(t))return t;let{currentNode:r,nodes:n}=x();if(!r.parentNodeId)return s("Missing parent node id");let o=n[r.parentNodeId];if(!o)return s("Missing parent node");let i=B(o.id),a=i.findIndex(({id:m})=>m===r.id);if(a<0)return s("Current node not found among siblings");let c=i[a+e];if(!c)return s("Missing sibling node");let u=is({id:t.value.id,parentId:c.id,position:{at:"end"}});return d(u)?u:ss(u.value)}function Hn(e){let t=os();if(d(t))return t;let{currentNode:r,selectedIndex:n}=x(),i=B(r.id)[n+e];if(!i)return s("Missing sibling node");let a=is({id:t.value.id,parentId:r.id,position:{at:e===1?"after":"before",sibling:i.id}});return d(a)?a:ss(a.value)}import bc from"node:os";import ls from"node:path";import{z as Wt}from"zod";import{accessSync as vc,copyFileSync as xc,existsSync as kr,mkdirSync as as,readdirSync as ds,readFileSync as hc,renameSync as yc,rmSync as Ec,statSync as cs,unlinkSync as Cc,writeFileSync as Nc}from"node:fs";import pt from"node:path";var ue={writeToFile:(e,t)=>{try{let r=pt.dirname(e);kr(r)||as(r,{recursive:!0});let n=typeof t=="string"?t:JSON.stringify(t,null,2);Nc(e,n,"utf-8")}catch(r){logger.error(`Failed to write file at ${e}:`,r)}},readFile:e=>{try{return hc(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=ue.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 kr(e)&&cs(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await vc(e),!0}catch{return!1}},mkDir:e=>as(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:r}=pt.parse(t);for(;;){let n=pt.join(t,e);try{if(kr(n)&&cs(n).isDirectory())return n}catch{logger.error(`Unable to locate folder ${e}`)}if(t===r)break;t=pt.dirname(t)}return null},readFirstJSON(e){try{if(!ue.dirExists(e))return null;let t=ds(e).filter(n=>n.endsWith(".json")).sort()[0];if(!t)return null;let r=pt.join(e,t);return ue.readFileJSON(r)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return ue.dirExists(e)?ds(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{Cc(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Ec(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,r){if(this.mkDir(pt.dirname(t)),!r?.overwrite&&kr(t))throw new Error(`moveFile: destination exists: ${t}`);r?.overwrite&&this.rmFile(t);try{yc(e,t)}catch(n){if(n?.code==="EXDEV"){xc(e,t),this.rmFile(e);return}throw n}}};var Ic={userId:"",userName:"",preferredEditor:"",autoSync:!1},us=Wt.object({preferredEditor:Wt.string().optional(),userName:Wt.string().optional(),userId:Wt.string().optional(),autoSync:Wt.boolean().optional()}).strict(),Sc="config.json",ms=()=>ls.join(bc.homedir(),me),Kn=()=>ls.join(ms(),Sc),Vn=()=>{try{return ue.mkDir(ms()),l(`Ensured ~/${me} exists`,null)}catch{return s(`Unable to create ~/${me}`)}},Rc=e=>{let t;try{t=JSON.parse(e)}catch{return s(`Invalid ~/${me}/config.json JSON`)}let r=us.safeParse(t??{});return r.success?l("Parsed config",r.data):s(`Invalid ~/${me}/config.json shape: ${r.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},ps=()=>{let e=Vn();if(d(e))return s(e.message);let t=Kn(),r=ue.readFile(t);return r==null||r.trim()===""?l("No config found, using empty config",{autoSync:!1,preferredEditor:"",userId:"",userName:""}):Rc(r)},gs=e=>{let t=Vn();if(d(t))return s(t.message);let r=us.safeParse(e);if(!r.success)return s(`Invalid config: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let n=Kn();try{return ue.writeToFile(n,JSON.stringify(r.data,null,2)+`
|
|
51
|
+
`),l("Config written",null)}catch{return s(`Unable to write ~/${me}/config.json`)}},Lr=e=>{let t=ps();if(d(t))return s("Failed to read existing config");let r={...t.value,...e};return gs(r)},fs=()=>{let e=Kn(),t=Vn();if(d(t))return s(`Unable to create ~/${me}`);if(!(ue.readFile(e)!==null)){let u=gs(Ic);if(d(u))throw new Error(`Unable to create ~/${me}/config.json`)}let n=ps();if(d(n))throw new Error(n.message||"Unable to load settings");let{preferredEditor:o,userName:i,userId:a,autoSync:c}=n.value;return!i||!a?s(`User name or ID not configured in ~/${me}/config.json`):l("successfully loaded settings",{preferredEditor:o??"",userName:i,userId:a,autoSync:c??!1})};import{spawnSync as wc}from"node:child_process";import Ac from"node:os";import vs from"node:path";import{ulid as Tc}from"ulid";function Mc(){let{preferredEditor:e}=ce(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(r=>!!r?.trim());return[...new Set(t)]}function Pc(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function xs(e){let t=vs.join(Ac.tmpdir(),"epiq");ue.mkDir(t);let r=vs.join(t,Tc());ue.writeToFile(r,e??"");let n=Mc();for(let o of n){let i=Pc(o,r),a=wc(i,{stdio:"inherit",shell:!0});if(!a.error&&a.status===0){let c=ue.readFile(r);if(c==null)return s("Unable to read edited file");let u=c.replace(/\r?\n$/,"");return l("Successfully edited",u)}}return s("Unable to open editor")}import{monotonicFactory as kc,ulid as Fr}from"ulid";var Dr=kc(),hs=({name:e,parent:t,rank:r,user:{userId:n,userName:o}})=>{let i=Dr(),a=Dr(),c=Dr(),u=Dr(),m=Io();if(d(m))return m;let p=z(m.value,void 0);if(d(p))return p;let v=z(p.value,void 0);return d(v)?v:l("Created issue events",[{id:Fr(),userId:n,userName:o,action:"add.issue",payload:{id:i,parent:t,name:e,rank:r}},{id:Fr(),userId:n,userName:o,action:"add.field",payload:{id:a,parent:i,name:"Description",val:"",rank:m.value}},{id:Fr(),userId:n,userName:o,action:"add.field",payload:{id:c,parent:i,name:"Assignees",rank:p.value}},{id:Fr(),userId:n,userName:o,action:"add.field",payload:{id:u,parent:i,name:"Tags",rank:v.value}}])};import{monotonicFactory as Lc,ulid as Fe}from"ulid";var _t=Lc();function Fc(){let e=Object.values(x().nodes).find(n=>n.context==="WORKSPACE");if(!e)throw new Error("No workspace found in event log");let[t]=T(e.id),[r]=t?T(t.id):[];if(logger.debug("Boot navigation target:",{workspace:e?.id,firstBoard:t?.id,firstSwimlane:r?.id}),r){let n=x().renderedChildrenIndex?.[r.id]??[];return{currentNode:r,selectedIndex:n.length>0?0:-1}}else return t?{currentNode:t,selectedIndex:0}:e?{currentNode:e,selectedIndex:0}:{currentNode:x().nodes[x().rootNodeId],selectedIndex:0}}function Dc(){let e=Fc();L.navigate(e)}function ys({userId:e,userName:t}){let r=_t(),n=_t(),o=_t(),i=_t(),a=_t(),c=z(void 0,void 0);if(d(c))return c;let u=z(void 0,void 0);if(d(u))return u;let m=z(u.value,void 0);if(d(m))return m;let p=z(void 0,void 0);if(d(p))return p;let v=z(p.value,void 0);if(d(v))return v;let y=z(v.value,void 0);if(d(y))return y;let b=z(void 0,void 0);return d(b)?b:l("Created default events",[{id:Fe(),userId:e,userName:t,action:"init.workspace",payload:{id:r,name:"Workspace",rank:c.value}},{id:Fe(),userId:e,userName:t,action:"add.board",payload:{id:n,name:"Default",parent:r,rank:u.value}},{id:Fe(),userId:e,userName:t,action:"add.swimlane",payload:{id:o,name:"Todo",parent:n,rank:p.value}},{id:Fe(),userId:e,userName:t,action:"add.swimlane",payload:{id:i,name:"In progress",parent:n,rank:v.value}},{id:Fe(),userId:e,userName:t,action:"add.swimlane",payload:{id:a,name:"Done",parent:n,rank:y.value}},{id:Fe(),userId:e,userName:t,action:"add.board",payload:{id:rr,name:"Closed",parent:r,rank:m.value}},{id:Fe(),userId:e,userName:t,action:"add.swimlane",payload:{id:Ae,name:"Closed",parent:rr,rank:b.value}},{id:Fe(),userId:e,userName:t,action:"lock.node",payload:{id:rr}},{id:Fe(),userId:e,userName:t,action:"lock.node",payload:{id:Ae}}])}function Br({hasProject:e,eventLog:t}){if(!e){let o=Z.workspace("temporary-uninitialized-workspace","Workspace","a0"),i=It(o);return d(i)?i:(A({hasProject:!1,mode:g.DEFAULT}),l("Booted uninitialized workspace placeholder",null))}if(!t.some(o=>o.action==="init.workspace"))return s("Initialized Epiq project has no workspace init event");let n=bt(t).filter(d);return n.length>0?s(n.map(o=>o.message).join(`
|
|
52
|
+
`)):(Dc(),A({hasProject:!0}),l("State booted successfully",null))}var Es=e=>{let t=e.log??[];for(let r=t.length-1;r>=0;r--){let n=t[r];if(n&&n.action==="close.issue"&&n.payload.id===e.id)return n.payload.parent}return null};import Oc from"node:fs";import Ns from"node:path";import qn from"node:fs";import Bc from"node:path";var Cs=async e=>{let t=Bc.join(e,".gitignore"),r=qn.existsSync(t)?qn.readFileSync(t,"utf8"):"",n=[".epiq/events/",".epiq/logs/"],o=r.split(`
|
|
53
|
+
`).map(u=>u.trim()),i=n.filter(u=>!o.some(m=>m===u||m===u.replace(/\/$/,"")||m==="/"+u||m==="/"+u.replace(/\/$/,"")));if(i.length===0)return l("Local epiq paths already ignored",!1);let c=["# [epiq]: local hydrated state is never committed",...i].join(`
|
|
54
|
+
`);return r=r.trimEnd()+`
|
|
54
55
|
|
|
55
|
-
${
|
|
56
|
-
`,Or.writeFileSync(t,n,"utf8"),oe.info(`Added ${i.join(", ")} to .gitignore (epiq local state)`),c("Local epiq paths ignored",!0)};var vs=e=>Object.values(v().tags).find(t=>t.name===e),xs=e=>Object.values(v().contributors).find(t=>t.name===e),ys=[{systemOnly:!0,intent:M.Move,mode:g.COMMAND_LINE,action:()=>{let e=Q();if(d(e))return s("Unable to resolve user ID");let{modifier:t}=ne().commandMeta,n=()=>{let l=We();if(!l)return s("No pending move state");let u=l.payload.id;if(!v().nodes[u])return s("Moved node not found");let p=l.payload.parent,y=v().nodes[p];if(!y)return s("Move parent not found");let N=R(p).findIndex(S=>S.id===u);return N===-1?s("Moved node not found among rendered children"):(D.navigate({currentNode:y,selectedIndex:N}),c("Synchronized navigation to moved node",null))},r=l=>{if(d(l))return s(l.message);let u=n();return d(u)?s(u.message):c("Updated move preview",null)},{currentNode:o,selectedIndex:i}=v(),a=R(o.id)[i];if(!a)return w({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 l=F(a.parentNodeId),u=l.findIndex(({id:A})=>A===a.id);if(u===-1)return s("Target not found among siblings");let m=l[u-1],p=l[u+1],y=p!=null?{at:"before",sibling:p.id}:m!=null?{at:"after",sibling:m.id}:{at:"start"},N=tt(a.parentNodeId,a.id,y,e.value);if(d(N))return N;Pt({id:_(),action:"move.node",payload:{id:a.id,parent:a.parentNodeId,rank:N.value},...e.value}),w({mode:g.MOVE});let S=n();return d(S)?s(S.message):c("Move initialized",null)}if(t==="next")return w({mode:g.MOVE}),r(Dr(1));if(t==="previous")return w({mode:g.MOVE}),r(Dr(-1));if(t==="to-next")return w({mode:g.MOVE}),r(kr(1));if(t==="to-previous")return w({mode:g.MOVE}),r(kr(-1));if(t==="confirm"){w({mode:g.DEFAULT});let l=We();if(!l)return s("No pending move to confirm");let u=K(l);if(d(u))return u;let m=n();return d(m)?s(m.message):(Pt(null),c("Moved item",null))}return t==="cancel"?(Pt(null),w({mode:g.DEFAULT}),c("Cancelling move",null)):s("Invalid move modifier")}},{intent:M.Delete,mode:g.COMMAND_LINE,action:()=>{let e=Q();if(d(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=v(),r=R(t.id)[n];return r?K({id:_(),action:"delete.node",payload:{id:r.id},...e.value}):s("Unable to resolve child to delete")},onSuccess:()=>w({mode:g.DEFAULT})},{intent:M.Edit,mode:g.COMMAND_LINE,action:()=>{let e=Q();if(d(e))return s("Unable to resolve user ID");let t=Ae(v().breadCrumb,"TICKET");if(d(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(!R(n.id)[o])return s("No selected field");let a=R(r.id)[o];if(!a)return s("No selected field");if(a.readonly)return s("Cannot edit readonly field");let l=a.props.value;if(typeof l!="string")return s("Selected field is not editable text");let u=ms(l);if(d(u))return s("Failed to edit field");let m=u.value;return m===l?c("No changes made",null):a.title==="Description"?K({id:_(),action:"edit.description",payload:{id:a.id,md:m},...e.value}):a.title==="Title"?K({id:_(),action:"edit.title",payload:{id:a.id,name:m},...e.value}):s(`Editing not supported for "${a.title}"`)},onSuccess:()=>w({mode:g.DEFAULT})},{intent:M.Filter,mode:g.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=ne().commandMeta,n=/(!=|=)/,[r,o]=e.split(n);if(!r||!(l=>z(f.FILTER).map(u=>u.split(n)[0]).includes(l))(r))return s("Invalid filter modifier");let a={target:r,operator:"=",value:t.trim()};return ae(l=>({...l,filters:e==="clear"?[]:[...l.filters,a],mode:g.DEFAULT})),c("Viewing help",null)}},{intent:M.ViewHelp,mode:g.COMMAND_LINE,action:()=>(w({mode:g.HELP}),c("Viewing help",null))},{intent:M.CloseIssue,mode:g.COMMAND_LINE,action:()=>{let e=Q();if(d(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=v(),r=R(t.id)[n];if(!r)return s("Unable to close issue, no target found");if(!le(r))return s("Cannot close in this context");let o=v().nodes[Ce];if(!o)return s("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return s("Issue is already closed");let i=tt(o.id,r.id,{at:"end"},e.value);if(d(i))return i;let a=K({id:_(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:i.value},...e.value});return d(a)?a:c("Issue closed",null)},onSuccess:()=>w({mode:g.DEFAULT})},{intent:M.ReopenIssue,mode:g.COMMAND_LINE,action:()=>{let e=Q();if(d(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=v(),r=R(t.id)[n];if(!r)return s("Unable to reopen issue, no target found");let o=r.context==="TICKET"?c("Resolved ticket",r):Ue(r.id,"TICKET");if(d(o))return s("Cannot reopen in this context");let i=o.value,a=v().nodes[Ce];if(!a)return s("Unable to locate closed swimlane");if(i.parentNodeId!==a.id)return s("Issue is not closed");if(!le(i))return s("Target node is not issue");let l=gs(i);if(!l)return s("Unable to resolve previous parent from issue history");if(l===a.id)return s("Previous parent resolves to closed swimlane");let u=v().nodes[l];if(!u)return s("Previous parent no longer exists");let m=tt(u.id,i.id,{at:"end"},e.value);if(d(m))return m;let p=K({id:_(),action:"reopen.issue",payload:{id:i.id,parent:u.id,rank:m.value},...e.value});return d(p)?p:c("Issue reopened",null)},onSuccess:()=>w({mode:g.DEFAULT})},{intent:M.SetUserName,mode:g.COMMAND_LINE,action:()=>{let{userId:e,preferredEditor:t,userName:n}=ge(),r=on()?.trim();if(!r)return s("No username provided");let o=r??n,i=e??_();if(!o||!i)return s("Unable to resolve user name or id");let a=Nn({userName:o,userId:i,preferredEditor:t??""});return d(a)?a:(et({userName:o,userId:i}),w({mode:g.DEFAULT}),c(`Username set to "${r}"`,null))}},{intent:M.Init,mode:g.COMMAND_LINE,action:async()=>{let e=mi(process.cwd());if(d(e))return e;let t=await fs(process.cwd());if(d(t))return t;let n=Ur();if(d(n))return n;let{rootNodeId:r,nodes:o}=v();return D.navigate({currentNode:o[r],selectedIndex:0}),w({hasProject:!0,mode:g.DEFAULT}),c("Project initialized",null)}},{intent:M.SetEditor,mode:g.COMMAND_LINE,action:()=>{let e=on()?.trim();if(!e)return s("No editor provided");let t=Nn({preferredEditor:e});return d(t)?t:(et({preferredEditor:e}),w({mode:g.DEFAULT}),c(`Editor configuration set to "${e}"`,null))}},{intent:M.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=Nn({autoSync:t});return d(n)?n:(et({autoSync:t}),w({mode:g.DEFAULT}),c(`Auto synchronization set to "${t}"`,null))}},{intent:M.NewItem,mode:g.COMMAND_LINE,action:(e,t)=>{let n=Q();if(d(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=l=>{let u=K(l);if(d(u))return u;let m=b.getNode(u.value.result.id);if(!m)return s("Created node not found");if(!m.parentNodeId)return u;let p=b.getNode(m.parentNodeId);return p?(D.navigate({currentNode:p,selectedIndex:b.getSiblings(m.parentNodeId).findIndex(({id:y})=>y===m.id)}),u):s("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:l}=v(),u=b.getNode(l);if(!u)return s("Workspace not found");let m=nt(u.id,n.value);return d(m)?m:a({id:_(),action:"add.board",payload:{id:_(),name:t.inputString,parent:u.id,rank:m.value},...n.value})}if(t.modifier==="swimlane"){let l=Ae(r,"BOARD");if(d(l))return s("Unable to add swimlane in this context");let u=nt(l.value.id,n.value);return d(u)?u:a({id:_(),action:"add.swimlane",payload:{id:_(),name:t.inputString,parent:l.value.id,rank:u.value},...n.value})}if(t.modifier==="issue"){let l=R(o.id)[i],u=o.context==="SWIMLANE"?o:o.context==="BOARD"&&l?.context==="SWIMLANE"?l:(()=>{let C=Ae(r,"SWIMLANE");return d(C)?null:C.value})();if(!u)return s("Unable to add issue in this context");let m=nt(u.id,n.value);if(d(m))return m;let p=ps({name:t.inputString,parent:u.id,rank:m.value,user:n.value});if(d(p))return p;let y=p.value,N=ho(y);if(N.some(C=>d(C)))return s("Issue create failed: "+N.filter(d).map(C=>C.message).filter(Boolean).join(", "));let S=N[0];if(!S||d(S))return s("Issue creation failed");let I=y.find(C=>C.action==="add.issue")?.payload.id;return I?(D.navigate({currentNode:u,selectedIndex:b.getSiblings(u.id).findIndex(({id:C})=>C===I)}),c("Issue created",null)):s("Unable to determine ticket id")}return c("Success",null)},onSuccess:()=>w({mode:g.DEFAULT})},{intent:M.SetView,mode:g.COMMAND_LINE,action:()=>{let{commandMeta:e}=ne();return e.validity===we.Invalid?s("Invalid command "+he):(ae(t=>({...t,viewMode:e.modifier==="wide"?"wide":e.modifier==="dense"?"dense":t.viewMode})),c("View set",null))},onSuccess:()=>w({mode:g.DEFAULT})},{intent:M.Rename,mode:g.COMMAND_LINE,action:()=>{let e=Q();if(d(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=v(),r=R(t.id)[n];if(!r)return s("Missing node");if(r.readonly)return s("Cannot rename readonly node");let o=on();return o?K({id:_(),action:"edit.title",payload:{id:r.id,name:o},...e.value}):s("Provide a new name")},onSuccess:()=>w({mode:g.DEFAULT})},{intent:M.UntagTicket,mode:g.COMMAND_LINE,action:()=>{let e=Q();if(d(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=vs(r);if(!o)return s(`Tag "${r}" does not exist`);let{selectedNode:i}=v();if(!i)return s("Invalid untag target");let a=Ue(i.id,"TICKET");if(d(a))return s("Unable to untag issue in this context");let l=a.value,u=b.getFieldByTitle(l.id,"Tags");if(!u)return s("Unable to locate tags field");let m=R(u.id).find(p=>p.props?.value===o.id);return m?K({id:_(),action:"untag.issue",payload:{id:m.id,target:l.id,tagId:o.id},...e.value}):s("Issue is not tagged with that tag")},onSuccess:()=>w({mode:g.DEFAULT})},{intent:M.TagTicket,mode:g.COMMAND_LINE,action:()=>{let e=Q();if(d(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=R(i.id)[o];if(!a)return s("Invalid tag target");let l=Ue(a.id,"TICKET");if(d(l))return s("Unable to tag issue in this context");let u=l.value,m=vs(r),p;if(m)p=m.id;else{let A=_(),I=K({id:_(),action:"create.tag",payload:{id:A,name:r},userId:e.value.userId,userName:e.value.userName});if(d(I))return I;p=I.value.result.id}let y=b.getFieldByTitle(u.id,"Tags");if(!y)return s("Unable to locate tags field");if(R(y.id).some(A=>A.props?.value===p))return s("Already tagged with that tag");let S=nt(y.id,e.value);return d(S)?S:K({id:_(),action:"tag.issue",payload:{id:_(),target:u.id,tagId:p,rank:S.value},...e.value})},onSuccess:()=>w({mode:g.DEFAULT})},{intent:M.AssignUserToTicket,mode:g.COMMAND_LINE,action:()=>{let e=Q();if(d(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=R(i.id)[o];if(!a)return s("Invalid assign target");let l=Ue(a.id,"TICKET");if(d(l))return s("Unable to assign issue in this context");let u=l.value,m=xs(r),p;if(m)p=m.id;else{let A=_(),I=K({id:_(),action:"create.contributor",payload:{id:A,name:r},userId:e.value.userId,userName:e.value.userName});if(d(I))return I;p=I.value.result.id}let y=b.getFieldByTitle(u.id,"Assignees");if(!y)return s("Unable to locate assignees field");if(R(y.id).some(A=>A.props?.value===p))return s("Assignee already assigned");let S=nt(y.id,e.value);return d(S)?S:K({id:_(),action:"assign.issue",payload:{id:_(),target:u.id,contributor:p,rank:S.value},...e.value})},onSuccess:()=>w({mode:g.DEFAULT})},{intent:M.UnassignUserFromTicket,mode:g.COMMAND_LINE,action:()=>{let e=Q();if(d(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=xs(r);if(!o)return s(`Assignee "${r}" does not exist`);let{selectedNode:i}=v();if(!i)return s("Invalid unassign target");let a=Ue(i.id,"TICKET");if(d(a))return s("Unable to unassign in this context");let l=a.value,u=b.getFieldByTitle(l.id,"Assignees");if(!u)return s("Unable to locate assignees field");let m=R(u.id).find(p=>p.props?.value===o.id);return m?K({id:_(),action:"unassign.issue",payload:{id:m.id,target:l.id,contributor:o.id},...e.value}):s(`Issue is not assigned to "${r}"`)},onSuccess:()=>w({mode:g.DEFAULT})},{intent:M.Sync,mode:g.COMMAND_LINE,action:async()=>{let e=Xi();j(()=>""),w({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=Dt()?Ur():c("No pending default events",null);if(d(r))return s(`Unable to persist default events. ${r.message}`);let o=Q();if(d(o)||!o.value)return s("Unable to resolve event log path");let i=Xn(o.value);logger.debug("[sync-command] pending defaults",Dt());let a=await Gi({ownEventFileName:i});if(d(a))return w({syncStatus:{msg:a.message,status:"outOfSync"}}),s(`Unable to sync state. ${a.message}`);w({syncStatus:{msg:"Synced",status:"synced"},mode:g.DEFAULT});let l=Se(process.cwd());if(d(l))throw new Error(l.message);let u=yt(l.value);if(d(u))return s("Unable to load events");qe(u.value);let m=Ji(e);return d(m)?m:c("Synced",!0)}},{intent:M.Peek,mode:g.COMMAND_LINE,action:async()=>{let e=Ae(v().breadCrumb,"BOARD");if(d(e))return e;let t=Se(process.cwd());if(d(t))throw new Error(t.message);let n=yt(t.value);if(d(n))return s(n.message);let r=n.value,{modifier:o}=ne().commandMeta,i;if(o==="now"){let N=Br();if(d(N))return N;let S=qe(r);return S.some(d)?s(S.map(A=>A.message).join(", ")):(w({mode:g.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),c("Peeking now",!0))}if(o==="prev"){let N=v().eventLog.at(-2),S=rr(N);if(S===null)return s("No previous event to peek");i=S}else if(o==="next"){let N=v().unappliedEvents.at(0),S=rr(N);if(S===null)return s("No next event to peek");i=S}else{let N=Qt(o);if(!N)return s("Invalid peek date");i=N.getTime()}let a=e.value.id,{appliedEvents:l,unappliedEvents:u}=fo(r,i),m=Br();if(d(m))return m;let p=qe(l);if(p.some(d))return s(p.map(N=>N.message).join(", "));let y=v().nodes[a];return y?(D.navigate({currentNode:y,selectedIndex:0}),w({mode:g.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:u}),c("Peeking ",!0)):s("Board did not exist at peek date")}},{intent:M.Export,mode:g.COMMAND_LINE,action:async()=>{let e=await ci();return d(e)?e:(w({mode:g.DEFAULT}),c("Export successful",!0))}},{intent:M.Exit,mode:g.COMMAND_LINE,action:async()=>(D.exit(),c("Exit successful",!0))}];var Ml=new Set(["peek","filter","view-help"]),me=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===we.Invalid)return s("Invalid command");let i=Yo(t);if(jo(),v().readOnly&&!Ml.has(i))return bt({status:he.Fail,message:"Command not available in readonly state",value:null});let a=ys.filter(u=>e||u.systemOnly!==!0).find(u=>u.intent===i);if(!a)return bt({status:he.Fail,message:"Command not found",value:null});let l=await a.action(a,{command:t,inputString:o,modifier:r});return d(l)?bt(l):(Ko({addToHistory:!e}),a.onSuccess?.(),bt(l))};var In=[{intent:x.Exit,mode:g.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(w({mode:g.COMMAND_LINE}),j(()=>"move cancel"),me({isForceExecutedBySystem:!0}))},{intent:x.InitMove,mode:g.DEFAULT,description:"[m] move init/confirm",action:()=>(w({mode:g.COMMAND_LINE}),j(()=>"move start"),me({isForceExecutedBySystem:!0}))},{intent:x.ConfirmMove,mode:g.MOVE,action:()=>(w({mode:g.COMMAND_LINE}),j(()=>"move confirm"),me({isForceExecutedBySystem:!0}))}],Sn=[{intent:x.MovePreviousItem,mode:g.MOVE,action:()=>We()?(w({mode:g.COMMAND_LINE}),j(()=>"move previous"),me({isForceExecutedBySystem:!0})):s("No pending move")},{intent:x.MoveNextItem,mode:g.MOVE,action:()=>We()?(w({mode:g.COMMAND_LINE}),j(()=>"move next"),me({isForceExecutedBySystem:!0})):s("No pending move")}],hs=[{intent:x.MoveToNextContainer,mode:g.MOVE,action:()=>We()?(w({mode:g.COMMAND_LINE}),j(()=>"move to-next"),me({isForceExecutedBySystem:!0})):s("No pending move")},{intent:x.MoveToPreviousContainer,mode:g.MOVE,action:()=>We()?(w({mode:g.COMMAND_LINE}),j(()=>"move to-previous"),me({isForceExecutedBySystem:!0})):s("No pending move")}];var Es={[P.WORKSPACE]:[...In,...Sn],[P.BOARD]:[...In,...Sn],[P.SWIMLANE]:[...In,...Sn,...hs],[P.TICKET]:[],[P.FIELD]:[],[P.FIELD_LIST]:[],[P.TEXT]:[]};var Ns=[{intent:x.AddItem,mode:g.DEFAULT,description:"[n] new...",action:()=>(w({mode:g.COMMAND_LINE}),j(()=>`${f.NEW} `),c("Adding new item",null))},{intent:x.Delete,mode:g.DEFAULT,description:"[d] delete",action:()=>(w({mode:g.COMMAND_LINE}),j(()=>`${f.DELETE} `),c("Deleting item",null))},{intent:x.InitCommandLine,mode:g.DEFAULT,description:"[:] focus command line",action:()=>(w({mode:g.COMMAND_LINE}),j(()=>""),c("Entering command line mode",null))},{intent:x.Confirm,mode:g.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>(D.enterChildNode(),c("Entering context",null))},{intent:x.Exit,mode:g.DEFAULT,description:"[q] exit context",action:()=>(D.enterParentNode(),c("Exiting context",null))},{intent:x.NavPreviousItem,mode:g.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(D.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:x.NavNextItem,mode:g.DEFAULT,action:()=>(D.navigateToNextItem(),c("Navigating to next item",null))},{intent:x.NavToPreviousContainer,mode:g.DEFAULT,action:()=>(D.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:x.NavToNextContainer,mode:g.DEFAULT,action:()=>(D.navigateToNextContainer(),c("Navigating to next container",null))},{intent:x.Edit,mode:g.DEFAULT,action:()=>(w({mode:g.COMMAND_LINE}),j(()=>"edit"),me(),c("Fired command",!0))},{intent:x.SetViewDense,mode:g.DEFAULT,description:"[v] view change (wide/dense)",action:()=>(w({viewMode:"dense"}),c("View set",null))},{intent:x.SetViewWide,mode:g.DEFAULT,action:()=>(w({viewMode:"wide"}),c("View set",null))}];var Pl=500,kl=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),Cs=e=>{let t=kl(e);t&&j(n=>(n+t).slice(0,Pl))};var bs=[{intent:x.ViewHelp,mode:g.DEFAULT,action:()=>(w({mode:g.HELP}),c("Viewing help",null))},{intent:x.Exit,mode:g.HELP,action:()=>(w({mode:g.DEFAULT}),c("Exiting help",null))},{intent:x.Confirm,mode:g.COMMAND_LINE,action:()=>(me(),c("Executing command",null))},{intent:x.MoveCursorLeft,mode:g.COMMAND_LINE,action:()=>(ur(-1),c("Moving cursor left",null))},{intent:x.MoveCursorRight,mode:g.COMMAND_LINE,action:()=>(ur(1),c("Moving cursor right",null))},{intent:x.MoveCursorLeftOfWord,mode:g.COMMAND_LINE,action:()=>(mr("left"),c("Moving cursor left of word",null))},{intent:x.MoveCursorRightOfWord,mode:g.COMMAND_LINE,action:()=>(mr("right"),c("Moving cursor right of word",null))},{intent:x.ExitCommandLine,mode:g.COMMAND_LINE,action:()=>(w({mode:g.DEFAULT}),c("Exiting command line",null))},{intent:x.AutoCompleteCommand,mode:g.COMMAND_LINE,action:()=>(j((e,{remainder:t})=>t?e+t:e),c("Auto-completing command",null))},{intent:x.CaptureInput,mode:g.COMMAND_LINE,action:(e,{sequence:t})=>(Cs(t??""),c("Capturing input",null))},{intent:x.EraseInput,mode:g.COMMAND_LINE,action:()=>(Wo(),c("Erasing input",null))},{intent:x.EraseInputWord,mode:g.COMMAND_LINE,action:()=>(Ho(),c("Erasing input word",null))},{intent:x.GetLastCommandFromHistory,mode:g.COMMAND_LINE,action:()=>(Vo(),c("Getting last command from history",null))},{intent:x.GetNextCommandFromHistory,mode:g.COMMAND_LINE,action:()=>(zo(),c("Getting next command from history",null))}];import Dl from"chalk";var An=": for command line",Is="q to exit",Ss=`${Dl.hex(E.accent)("m")} to confirm`,$r={[P.WORKSPACE]:[An],[P.BOARD]:[An],[P.BOARD+g.COMMAND_LINE]:[An],[P.SWIMLANE]:[An],[P.TICKET+g.HELP]:[Is],[P.SWIMLANE+g.HELP]:[Is],[P.TICKET]:[],[P.FIELD]:[],[P.SWIMLANE+g.MOVE]:[Ss],[P.TICKET+g.MOVE]:[Ss]};var wn=e=>e.trim().toLocaleLowerCase(),Ll=(e,t)=>{let n=b.getFieldByTitle(e,t);if(!n)return"";let r=n.props?.value;return typeof r=="string"?r:""},Fl=e=>{let{tags:t}=v(),n=b.getFieldByTitle(e,"Tags");return n?F(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},Ol=e=>{let{contributors:t}=v(),n=b.getFieldByTitle(e,"Assignees");return n?F(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},As=(e,t)=>{let n=t.value;if(!n)return!0;switch(t.target){case"title":return wn(e.title??"").includes(n);case"description":return wn(Ll(e.id,"Description")).includes(n);case"tag":return Fl(e.id).map(wn).some(l=>l.includes(n));case"assignee":return Ol(e.id).map(wn).some(l=>l.includes(n));default:return!0}};function ws(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 Ts=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,_r,Wr=new Set,Rs=()=>{for(let e of Wr)e()},Ul=e=>(Wr.add(e),()=>Wr.delete(e));function Ms(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 l=o[t];if(!l)return s("Unable to derive state, currentNode not found");let u=ws(t,o,r);if(d(u))return logger.error(u.message),u;let m=u.value,{context:p}=l,y=$r[p+n]??$r[p]??[],N=[...Ns,...Es[p]??[],...bs],S=Ts(N),A=$l(o,i),I=A[t]?.[e.selectedIndex]??null;return c("Derived successfully",{...e,currentNode:l,breadCrumb:m,availableHints:y,availableActions:N,actionIndex:S,selectedNode:I,renderedChildrenIndex:A})}var v=()=>(Tn||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),Tn);function Vn(e){_r=e;let t=zt(process.cwd()),n=!1;if(!d(t)){let i=gn(t.value);if(d(i))return s(i.message);n=!0}let r={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",hasProject:n},o=Ms(r);return d(o)?o:(Tn=o.value,Rs(),c("State initialized",null))}function ae(e){let t=v(),n=e(t),r=Ms(n);return d(r)?s(r.message??"Unable to update state"):(Tn=r.value,Rs(),c("State updated",null))}var w=e=>ae(t=>({...t,...e}));var $=()=>Bl(Ul,v,v),$l=(e,t)=>{let n={};for(let r of Object.values(e))le(r)&&t.length>0&&!t.every(o=>As(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],l=e[i.id];return!a||!l?0:a.rank.localeCompare(l.rank)});return n},R=e=>v()?.renderedChildrenIndex[e]??[],Br=()=>_r?Vn(_r):s("Cannot reset state: no initial workspace found");var D={exit(){process.exit(0)},enterChildNode(){let e=v(),t=e.currentNode,n=Math.max(0,e.selectedIndex),r=R(t.id)[n];!r||t.context==="FIELD"||D.navigate({currentNode:r,selectedIndex:R(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=R(n.id),o=r.findIndex(({id:a})=>a===e.id),i=r.length===0?-1:o>=0?o:0;D.navigate({currentNode:n,selectedIndex:i})},navigateToNextItem:()=>Ps(1),navigateToPreviousItem:()=>Ps(-1),navigateToNextContainer:()=>ks(1),navigateToPreviousContainer:()=>ks(-1),navigate:({currentNode:e=v().currentNode,selectedIndex:t})=>{w({currentNodeId:e.id,selectedIndex:t})}},Ps=e=>{let t=v(),n=R(t.currentNode.id).length;if(n===0)return;let o=(Math.max(0,t.selectedIndex)+e+n)%n;D.navigate({selectedIndex:o})},ks=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=R(o.id),a=i.findIndex(N=>N.id===t.id);if(a<0)return;let l=i.at(a+e)??i.at(0);if(!l)return;let u=R(l.id),m=Math.max(0,u.length-1),p=Math.min(Math.max(0,r),m),y=u.length?p:-1;D.navigate({currentNode:l,selectedIndex:y})};var De="system",Le="ACTOR",Lt=_l(),Fe=null;function Wl(){let e=Object.values(v().nodes).find(r=>r.context==="WORKSPACE");if(!e)throw new Error("No workspace found in event log");let[t]=R(e.id),[n]=t?R(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 Hl(){let e=Wl();D.navigate(e)}function jl(){let e=Lt(),t=Lt(),n=Lt(),r=Lt(),o=Lt(),i=V(void 0,void 0);if(d(i))return i;let a=V(void 0,void 0);if(d(a))return a;let l=V(a.value,void 0);if(d(l))return l;let u=V(void 0,void 0);if(d(u))return u;let m=V(u.value,void 0);if(d(m))return m;let p=V(m.value,void 0);if(d(p))return p;let y=V(void 0,void 0);return d(y)?y:c("Created default events",[{id:ke(),userId:De,userName:Le,action:"init.workspace",payload:{id:e,name:"Workspace",rank:i.value}},{id:ke(),userId:De,userName:Le,action:"add.board",payload:{id:t,name:"Default",parent:e,rank:a.value}},{id:ke(),userId:De,userName:Le,action:"add.swimlane",payload:{id:n,name:"Todo",parent:t,rank:u.value}},{id:ke(),userId:De,userName:Le,action:"add.swimlane",payload:{id:r,name:"In progress",parent:t,rank:m.value}},{id:ke(),userId:De,userName:Le,action:"add.swimlane",payload:{id:o,name:"Done",parent:t,rank:p.value}},{id:ke(),userId:De,userName:Le,action:"add.board",payload:{id:Wt,name:"Closed",parent:e,rank:l.value}},{id:ke(),userId:De,userName:Le,action:"add.swimlane",payload:{id:Ce,name:"Closed",parent:Wt,rank:y.value}},{id:ke(),userId:De,userName:Le,action:"lock.node",payload:{id:Wt}},{id:ke(),userId:De,userName:Le,action:"lock.node",payload:{id:Ce}}])}function Dt(){return Fe!==null}function Ur(){if(!Fe||Fe.length===0)return Fe=null,c("No pending default events to persist",null);let e=Fe.map(t=>Xt({event:t})).filter(d);return e.length>0?s([ut.bold.red("Persisting default events failed"),"",...e.map((t,n)=>`${ut.dim.gray(`${n+1}.`)} ${ut.dim(t.message)}`),`
|
|
57
|
-
`].join(`
|
|
58
|
-
`)):(Fe=null,c("Persisted pending default events",null))}function Ds(e){let t;if(e.some(r=>r.action==="init.workspace"))Fe=null,t=qe(e);else{let r=jl();if(d(r))return r;Fe=r.value,t=qe([...Fe])}let n=t.filter(d);return n.length>0?s([ut.bold.red("Materializing failed"),"",...n.map((r,o)=>`${ut.dim.gray(`${o+1}.`)} ${ut.dim(r.message)}`),`
|
|
59
|
-
`].join(`
|
|
56
|
+
${c}
|
|
57
|
+
`,qn.writeFileSync(t,r,"utf8"),de.info(`Added ${i.join(", ")} to .gitignore (epiq local state)`),l("Local epiq paths ignored",!0)};var K=(e,t,r)=>s(`[init:${e}] ${t}: ${r}`),bs=async()=>{let e=uo(),t=await Ar(process.cwd());if(d(t))return K(1,"resolve git repo",t.message);let r=t.value,n=await Ft(r);if(d(n))return K(2,"check pending git operation",n.message);if(n.value)return K(2,"pending git operation","Cannot initialize Epiq while a git operation is in progress");if(tn(r))return K(3,"check existing project","Epiq project already initialized");let o=et();if(!o.isSetup||!o.userName)return K(4,"resolve user config","Missing Epiq user configuration (userId / userName). Run setup first.");let i=ce(),a=i.userName,c=i.userId;if(!c||!a)return K(4,"resolve user config","Missing Epiq user id");let u=rt({userId:c,userName:a}),m=e.stateBranch,p=await br({repoRoot:r,branch:m});if(d(p))return K(5,"check state branch",p.message);let v=await Tr({repoRoot:r,stateBranchName:e.stateBranch});if(d(v))return K(5,"create state branch",v.message);let y=wr();if(d(y))return K(6,"ensure worktrees dir",y.message);let b=Ns.join(Rr(),e.projectId),R=await Un({repoRoot:r,stateBranchRoot:b,stateBranchName:e.stateBranch});if(d(R))return K(7,"ensure state worktree",R.message);let S=Ns.join(b,".epiq");Oc.mkdirSync(S,{recursive:!0});let N=ys({userId:c,userName:a});if(d(N))return K(8,"create default events",N.message);for(let Qr of N.value){let ao=sr({event:Qr,rootDir:b});if(d(ao))return K(8,"persist initial event log",ao.message)}let w=await Mr({stateBranchRoot:b,eventFileName:rt({userId:c,userName:a})});if(d(w))return K(9,"stage state event file",w.message);let D=await ut({cwd:b,message:"[epiq:init]"});if(d(D))return K(9,"commit state branch",D.message);let ie=await Cs(r);if(d(ie))return K(11,"ensure gitignore",ie.message);let X=po({repoRoot:r,fileContents:e});if(d(X))return K(12,"create project file",X.message);let zt=await W.stage({cwd:r,pathspec:[".epiq/project.json",".gitignore"]});if(d(zt))return K(13,"stage project file",zt.message);let vt=await W.commit({cwd:r,message:"[epiq:init-project]"});if(d(vt))return K(13,"commit project file",vt.message);let xt=$t({repoRoot:r,stateBranchRoot:b});if(d(xt))return K(14,"hydrate local events",xt.message);let q="Project initialized!",J=await Ut({repoRoot:r,stateBranchRoot:b});d(J)&&(q+=` Warn: [init:15] ${J.message}`);let Ze=await W.push({cwd:r});d(Ze)&&(q+=` Warn: [init:16] ${Ze.message}`);let so=ar(N.value).filter(d);if(so.length>0)return K(17,"boot app",so.map(Qr=>Qr.message).join(`
|
|
58
|
+
`));let{rootNodeId:da,nodes:ca}=x();return L.navigate({currentNode:ca[da],selectedIndex:0}),A({hasProject:!0,mode:g.DEFAULT}),l(q,null)};var Is=e=>Object.values(x().tags).find(t=>t.name===e),Ss=e=>Object.values(x().contributors).find(t=>t.name===e),Rs=[{systemOnly:!0,intent:M.Move,mode:g.COMMAND_LINE,action:()=>{let e=ne();if(d(e))return s("Unable to resolve user ID");let{modifier:t}=se().commandMeta,r=()=>{let c=je();if(!c)return s("No pending move state");let u=c.payload.id;if(!x().nodes[u])return s("Moved node not found");let p=c.payload.parent,v=x().nodes[p];if(!v)return s("Move parent not found");let y=T(p).findIndex(b=>b.id===u);return y===-1?s("Moved node not found among rendered children"):(L.navigate({currentNode:v,selectedIndex:y}),l("Synchronized navigation to moved node",null))},n=c=>{if(d(c))return s(c.message);let u=r();return d(u)?s(u.message):l("Updated move preview",null)},{currentNode:o,selectedIndex:i}=x(),a=T(o.id)[i];if(!a)return A({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 c=B(a.parentNodeId),u=c.findIndex(({id:R})=>R===a.id);if(u===-1)return s("Target not found among siblings");let m=c[u-1],p=c[u+1],v=p!=null?{at:"before",sibling:p.id}:m!=null?{at:"after",sibling:m.id}:{at:"start"},y=nt(a.parentNodeId,a.id,v,e.value);if(d(y))return y;jt({id:$(),action:"move.node",payload:{id:a.id,parent:a.parentNodeId,rank:y.value},...e.value}),A({mode:g.MOVE});let b=r();return d(b)?s(b.message):l("Move initialized",null)}if(t==="next")return A({mode:g.MOVE}),n(Hn(1));if(t==="previous")return A({mode:g.MOVE}),n(Hn(-1));if(t==="to-next")return A({mode:g.MOVE}),n(_n(1));if(t==="to-previous")return A({mode:g.MOVE}),n(_n(-1));if(t==="confirm"){A({mode:g.DEFAULT});let c=je();if(!c)return s("No pending move to confirm");let u=V(c);if(d(u))return u;let m=r();return d(m)?s(m.message):(jt(null),l("Moved item",null))}return t==="cancel"?(jt(null),A({mode:g.DEFAULT}),l("Cancelling move",null)):s("Invalid move modifier")}},{intent:M.Delete,mode:g.COMMAND_LINE,action:()=>{let e=ne();if(d(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:r}=x(),n=T(t.id)[r];return n?V({id:$(),action:"delete.node",payload:{id:n.id},...e.value}):s("Unable to resolve child to delete")},onSuccess:()=>A({mode:g.DEFAULT})},{intent:M.Edit,mode:g.COMMAND_LINE,action:()=>{let e=ne();if(d(e))return s("Unable to resolve user ID");let t=Re(x().breadCrumb,"TICKET");if(d(t))return s("Edit target must be an issue");let r=t.value;if(r.readonly)return s("Cannot edit readonly field");let{currentNode:n,selectedIndex:o}=x();if(!T(r.id)[o])return s("No selected field");let a=T(n.id)[o];if(!a)return s("No selected field");if(a.readonly)return s("Cannot edit readonly field");let c=a.props.value;if(typeof c!="string")return s("Selected field is not editable text");let u=xs(c);if(d(u))return s("Failed to edit field");let m=u.value;return m===c?l("No changes made",null):a.title==="Description"?V({id:$(),action:"edit.description",payload:{id:a.id,md:m},...e.value}):a.title==="Title"?V({id:$(),action:"edit.title",payload:{id:a.id,name:m},...e.value}):s(`Editing not supported for "${a.title}"`)},onSuccess:()=>A({mode:g.DEFAULT})},{intent:M.Filter,mode:g.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=se().commandMeta,r=/(!=|=)/,[n,o]=e.split(r);if(!n||!(c=>G(f.FILTER).map(u=>u.split(r)[0]).includes(c))(n))return s("Invalid filter modifier");let a={target:n,operator:"=",value:t.trim()};return le(c=>({...c,filters:e==="clear"?[]:[...c.filters,a],mode:g.DEFAULT})),l("Viewing help",null)}},{intent:M.ViewHelp,mode:g.COMMAND_LINE,action:()=>(A({mode:g.HELP}),l("Viewing help",null))},{intent:M.CloseIssue,mode:g.COMMAND_LINE,action:()=>{let e=ne();if(d(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:r}=x(),n=T(t.id)[r];if(!n)return s("Unable to close issue, no target found");if(!pe(n))return s("Cannot close in this context");let o=x().nodes[Ae];if(!o)return s("Unable to locate closed swimlane");if(n.parentNodeId===o.id)return s("Issue is already closed");let i=nt(o.id,n.id,{at:"end"},e.value);if(d(i))return i;let a=V({id:$(),action:"close.issue",payload:{id:n.id,parent:o.id,rank:i.value},...e.value});return d(a)?a:l("Issue closed",null)},onSuccess:()=>A({mode:g.DEFAULT})},{intent:M.ReopenIssue,mode:g.COMMAND_LINE,action:()=>{let e=ne();if(d(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:r}=x(),n=T(t.id)[r];if(!n)return s("Unable to reopen issue, no target found");let o=n.context==="TICKET"?l("Resolved ticket",n):Oe(n.id,"TICKET");if(d(o))return s("Cannot reopen in this context");let i=o.value,a=x().nodes[Ae];if(!a)return s("Unable to locate closed swimlane");if(i.parentNodeId!==a.id)return s("Issue is not closed");if(!pe(i))return s("Target node is not issue");let c=Es(i);if(!c)return s("Unable to resolve previous parent from issue history");if(c===a.id)return s("Previous parent resolves to closed swimlane");let u=x().nodes[c];if(!u)return s("Previous parent no longer exists");let m=nt(u.id,i.id,{at:"end"},e.value);if(d(m))return m;let p=V({id:$(),action:"reopen.issue",payload:{id:i.id,parent:u.id,rank:m.value},...e.value});return d(p)?p:l("Issue reopened",null)},onSuccess:()=>A({mode:g.DEFAULT})},{intent:M.SetUserName,mode:g.COMMAND_LINE,action:()=>{let{userId:e,preferredEditor:t,userName:r}=ce(),n=gr()?.trim();if(!n)return s("No username provided");let o=n??r,i=e??$();if(!o||!i)return s("Unable to resolve user name or id");let a=Lr({userName:o,userId:i,preferredEditor:t??""});return d(a)?a:(Qe({userName:o,userId:i}),A({mode:g.DEFAULT}),l(`Username set to "${n}"`,null))}},{intent:M.Init,mode:g.COMMAND_LINE,action:bs},{intent:M.SetEditor,mode:g.COMMAND_LINE,action:()=>{let e=gr()?.trim();if(!e)return s("No editor provided");let t=Lr({preferredEditor:e});return d(t)?t:(Qe({preferredEditor:e}),A({mode:g.DEFAULT}),l(`Editor configuration set to "${e}"`,null))}},{intent:M.SetAutoSync,mode:g.COMMAND_LINE,action:()=>{let e=se().commandMeta.modifier;if(e!=="true"&&e!=="false")return s("Invalid response");let t=e.toLowerCase()==="true",r=Lr({autoSync:t});return d(r)?r:(Qe({autoSync:t}),A({mode:g.DEFAULT}),l(`Auto synchronization set to "${t}"`,null))}},{intent:M.NewItem,mode:g.COMMAND_LINE,action:(e,t)=>{let r=ne();if(d(r))return s("Unable to resolve user ID");if(!t.inputString)return s(`provide a name for your ${t.modifier}`);let{breadCrumb:n,currentNode:o,selectedIndex:i}=x(),a=c=>{let u=V(c);if(d(u))return u;let m=I.getNode(u.value.result.id);if(!m)return s("Created node not found");if(!m.parentNodeId)return u;let p=I.getNode(m.parentNodeId);return p?(L.navigate({currentNode:p,selectedIndex:I.getSiblings(m.parentNodeId).findIndex(({id:v})=>v===m.id)}),u):s("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:c}=x(),u=I.getNode(c);if(!u)return s("Workspace not found");let m=ot(u.id,r.value);return d(m)?m:a({id:$(),action:"add.board",payload:{id:$(),name:t.inputString,parent:u.id,rank:m.value},...r.value})}if(t.modifier==="swimlane"){let c=Re(n,"BOARD");if(d(c))return s("Unable to add swimlane in this context");let u=ot(c.value.id,r.value);return d(u)?u:a({id:$(),action:"add.swimlane",payload:{id:$(),name:t.inputString,parent:c.value.id,rank:u.value},...r.value})}if(t.modifier==="issue"){let c=T(o.id)[i],u=o.context==="SWIMLANE"?o:o.context==="BOARD"&&c?.context==="SWIMLANE"?c:(()=>{let N=Re(n,"SWIMLANE");return d(N)?null:N.value})();if(!u)return s("Unable to add issue in this context");let m=ot(u.id,r.value);if(d(m))return m;let p=hs({name:t.inputString,parent:u.id,rank:m.value,user:r.value});if(d(p))return p;let v=p.value,y=ar(v);if(y.some(N=>d(N)))return s("Issue create failed: "+y.filter(d).map(N=>N.message).filter(Boolean).join(", "));let b=y[0];if(!b||d(b))return s("Issue creation failed");let S=v.find(N=>N.action==="add.issue")?.payload.id;return S?(L.navigate({currentNode:u,selectedIndex:I.getSiblings(u.id).findIndex(({id:N})=>N===S)}),l("Issue created",null)):s("Unable to determine ticket id")}return l("Success",null)},onSuccess:()=>A({mode:g.DEFAULT})},{intent:M.SetView,mode:g.COMMAND_LINE,action:()=>{let{commandMeta:e}=se();return e.validity===Te.Invalid?s("Invalid command "+be):(le(t=>({...t,viewMode:e.modifier==="wide"?"wide":e.modifier==="dense"?"dense":t.viewMode})),l("View set",null))},onSuccess:()=>A({mode:g.DEFAULT})},{intent:M.Rename,mode:g.COMMAND_LINE,action:()=>{let e=ne();if(d(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:r}=x(),n=T(t.id)[r];if(!n)return s("Missing node");if(n.readonly)return s("Cannot rename readonly node");let o=gr();return o?V({id:$(),action:"edit.title",payload:{id:n.id,name:o},...e.value}):s("Provide a new name")},onSuccess:()=>A({mode:g.DEFAULT})},{intent:M.UntagTicket,mode:g.COMMAND_LINE,action:()=>{let e=ne();if(d(e))return s("Unable to resolve user ID");let{modifier:t,inputString:r}=se().commandMeta,n=(t||r).trim();if(!n)return s("Provide a tag");let o=Is(n);if(!o)return s(`Tag "${n}" does not exist`);let{selectedNode:i}=x();if(!i)return s("Invalid untag target");let a=Oe(i.id,"TICKET");if(d(a))return s("Unable to untag issue in this context");let c=a.value,u=I.getFieldByTitle(c.id,"Tags");if(!u)return s("Unable to locate tags field");let m=T(u.id).find(p=>p.props?.value===o.id);return m?V({id:$(),action:"untag.issue",payload:{id:m.id,target:c.id,tagId:o.id},...e.value}):s("Issue is not tagged with that tag")},onSuccess:()=>A({mode:g.DEFAULT})},{intent:M.TagTicket,mode:g.COMMAND_LINE,action:()=>{let e=ne();if(d(e))return s("Unable to resolve user ID");let{modifier:t,inputString:r}=se().commandMeta,n=(t||r).trim();if(!n)return s("Provide a tag");let{selectedIndex:o,currentNode:i}=x(),a=T(i.id)[o];if(!a)return s("Invalid tag target");let c=Oe(a.id,"TICKET");if(d(c))return s("Unable to tag issue in this context");let u=c.value,m=Is(n),p;if(m)p=m.id;else{let R=$(),S=V({id:$(),action:"create.tag",payload:{id:R,name:n},userId:e.value.userId,userName:e.value.userName});if(d(S))return S;p=S.value.result.id}let v=I.getFieldByTitle(u.id,"Tags");if(!v)return s("Unable to locate tags field");if(T(v.id).some(R=>R.props?.value===p))return s("Already tagged with that tag");let b=ot(v.id,e.value);return d(b)?b:V({id:$(),action:"tag.issue",payload:{id:$(),target:u.id,tagId:p,rank:b.value},...e.value})},onSuccess:()=>A({mode:g.DEFAULT})},{intent:M.AssignUserToTicket,mode:g.COMMAND_LINE,action:()=>{let e=ne();if(d(e))return s("Unable to resolve user ID");let{modifier:t,inputString:r}=se().commandMeta,n=(t||r).trim();if(!n)return s("Provide an assignee");let{selectedIndex:o,currentNode:i}=x(),a=T(i.id)[o];if(!a)return s("Invalid assign target");let c=Oe(a.id,"TICKET");if(d(c))return s("Unable to assign issue in this context");let u=c.value,m=Ss(n),p;if(m)p=m.id;else{let R=$(),S=V({id:$(),action:"create.contributor",payload:{id:R,name:n},userId:e.value.userId,userName:e.value.userName});if(d(S))return S;p=S.value.result.id}let v=I.getFieldByTitle(u.id,"Assignees");if(!v)return s("Unable to locate assignees field");if(T(v.id).some(R=>R.props?.value===p))return s("Assignee already assigned");let b=ot(v.id,e.value);return d(b)?b:V({id:$(),action:"assign.issue",payload:{id:$(),target:u.id,contributor:p,rank:b.value},...e.value})},onSuccess:()=>A({mode:g.DEFAULT})},{intent:M.UnassignUserFromTicket,mode:g.COMMAND_LINE,action:()=>{let e=ne();if(d(e))return s("Unable to resolve user ID");let{modifier:t,inputString:r}=se().commandMeta,n=(t||r).trim();if(!n)return s("Provide an assignee to remove");let o=Ss(n);if(!o)return s(`Assignee "${n}" does not exist`);let{selectedNode:i}=x();if(!i)return s("Invalid unassign target");let a=Oe(i.id,"TICKET");if(d(a))return s("Unable to unassign in this context");let c=a.value,u=I.getFieldByTitle(c.id,"Assignees");if(!u)return s("Unable to locate assignees field");let m=T(u.id).find(p=>p.props?.value===o.id);return m?V({id:$(),action:"unassign.issue",payload:{id:m.id,target:c.id,contributor:o.id},...e.value}):s(`Issue is not assigned to "${n}"`)},onSuccess:()=>A({mode:g.DEFAULT})},{intent:M.Sync,mode:g.COMMAND_LINE,action:async()=>{let e=ts();H(()=>""),A({syncStatus:{msg:"Syncing",status:"syncing"}});let{userId:t,userName:r}=ce();if(!t)return s("Unable to resolve userId");if(!r)return s("Unable to resolve userName");let n=ne();if(d(n)||!n.value)return s("Unable to resolve event log path");let o=rt(n.value),i=await Qi({ownEventFileName:o});if(d(i))return A({syncStatus:{msg:i.message,status:"outOfSync"}}),s(`Unable to sync state. ${i.message}`);let a=ye(process.cwd());if(d(a))return a;let c=St(a.value);if(d(c))return s(`Unable to load events. ${c.message}`);let u=Br({eventLog:c.value,hasProject:!0});if(d(u))return s(`Unable to boot synced state. ${u.message}`);A({hasProject:!0,syncStatus:{msg:"Synced",status:"synced"},mode:g.DEFAULT});let m=rs(e);return d(m)?m:l("Synced",!0)}},{intent:M.Peek,mode:g.COMMAND_LINE,action:async()=>{let e=Re(x().breadCrumb,"BOARD");if(d(e))return e;let t=De(process.cwd());if(d(t))throw new Error(t.message);let r=St(t.value);if(d(r))return s(r.message);let n=r.value,{modifier:o}=se().commandMeta,i;if(o==="now"){let y=zn();if(d(y))return y;let b=bt(n);return b.some(d)?s(b.map(R=>R.message).join(", ")):(A({mode:g.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),l("Peeking now",!0))}if(o==="prev"){let y=x().eventLog.at(-2),b=fn(y);if(b===null)return s("No previous event to peek");i=b}else if(o==="next"){let y=x().unappliedEvents.at(0),b=fn(y);if(b===null)return s("No next event to peek");i=b}else{let y=lr(o);if(!y)return s("Invalid peek date");i=y.getTime()}let a=e.value.id,{appliedEvents:c,unappliedEvents:u}=Ao(n,i),m=zn();if(d(m))return m;let p=bt(c);if(p.some(d))return s(p.map(y=>y.message).join(", "));let v=x().nodes[a];return v?(L.navigate({currentNode:v,selectedIndex:0}),A({mode:g.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:u}),l("Peeking ",!0)):s("Board did not exist at peek date")}},{intent:M.Export,mode:g.COMMAND_LINE,action:async()=>{let e=await bi();return d(e)?e:(A({mode:g.DEFAULT}),l("Export successful",!0))}},{intent:M.Exit,mode:g.COMMAND_LINE,action:async()=>(L.exit(),l("Exit successful",!0))}];var Uc=new Set(["peek","filter","view-help"]),fe=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:r,modifier:n,inputString:o}}=se();if(!t)return s("No command to confirm");if(!e&&r===Te.Invalid)return s("Invalid command");let i=si(t);if(ei(),x().readOnly&&!Uc.has(i))return Mt({status:be.Fail,message:"Command not available in readonly state",value:null});let a=Rs.filter(u=>e||u.systemOnly!==!0).find(u=>u.intent===i);if(!a)return Mt({status:be.Fail,message:"Command not found",value:null});let c=await a.action(a,{command:t,inputString:o,modifier:n});return d(c)?Mt(c):(ti({addToHistory:!e}),a.onSuccess?.(),Mt(c))};var Or=[{intent:h.Exit,mode:g.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(A({mode:g.COMMAND_LINE}),H(()=>"move cancel"),fe({isForceExecutedBySystem:!0}))},{intent:h.InitMove,mode:g.DEFAULT,description:"[m] move init/confirm",action:()=>(A({mode:g.COMMAND_LINE}),H(()=>"move start"),fe({isForceExecutedBySystem:!0}))},{intent:h.ConfirmMove,mode:g.MOVE,action:()=>(A({mode:g.COMMAND_LINE}),H(()=>"move confirm"),fe({isForceExecutedBySystem:!0}))}],Ur=[{intent:h.MovePreviousItem,mode:g.MOVE,action:()=>je()?(A({mode:g.COMMAND_LINE}),H(()=>"move previous"),fe({isForceExecutedBySystem:!0})):s("No pending move")},{intent:h.MoveNextItem,mode:g.MOVE,action:()=>je()?(A({mode:g.COMMAND_LINE}),H(()=>"move next"),fe({isForceExecutedBySystem:!0})):s("No pending move")}],ws=[{intent:h.MoveToNextContainer,mode:g.MOVE,action:()=>je()?(A({mode:g.COMMAND_LINE}),H(()=>"move to-next"),fe({isForceExecutedBySystem:!0})):s("No pending move")},{intent:h.MoveToPreviousContainer,mode:g.MOVE,action:()=>je()?(A({mode:g.COMMAND_LINE}),H(()=>"move to-previous"),fe({isForceExecutedBySystem:!0})):s("No pending move")}];var As={[P.WORKSPACE]:[...Or,...Ur],[P.BOARD]:[...Or,...Ur],[P.SWIMLANE]:[...Or,...Ur,...ws],[P.TICKET]:[],[P.FIELD]:[],[P.FIELD_LIST]:[],[P.TEXT]:[]};var Ts=[{intent:h.AddItem,mode:g.DEFAULT,description:"[n] new...",action:()=>(A({mode:g.COMMAND_LINE}),H(()=>`${f.NEW} `),l("Adding new item",null))},{intent:h.Delete,mode:g.DEFAULT,description:"[d] delete",action:()=>(A({mode:g.COMMAND_LINE}),H(()=>`${f.DELETE} `),l("Deleting item",null))},{intent:h.InitCommandLine,mode:g.DEFAULT,description:"[:] focus command line",action:()=>(A({mode:g.COMMAND_LINE}),H(()=>""),l("Entering command line mode",null))},{intent:h.Confirm,mode:g.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>(L.enterChildNode(),l("Entering context",null))},{intent:h.Exit,mode:g.DEFAULT,description:"[q] exit context",action:()=>(L.enterParentNode(),l("Exiting context",null))},{intent:h.NavPreviousItem,mode:g.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(L.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:h.NavNextItem,mode:g.DEFAULT,action:()=>(L.navigateToNextItem(),l("Navigating to next item",null))},{intent:h.NavToPreviousContainer,mode:g.DEFAULT,action:()=>(L.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:h.NavToNextContainer,mode:g.DEFAULT,action:()=>(L.navigateToNextContainer(),l("Navigating to next container",null))},{intent:h.Edit,mode:g.DEFAULT,action:()=>(A({mode:g.COMMAND_LINE}),H(()=>"edit"),fe(),l("Fired command",!0))},{intent:h.SetViewDense,mode:g.DEFAULT,description:"[v] view change (wide/dense)",action:()=>(A({viewMode:"dense"}),l("View set",null))},{intent:h.SetViewWide,mode:g.DEFAULT,action:()=>(A({viewMode:"wide"}),l("View set",null))}];var $c=500,jc=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),Ms=e=>{let t=jc(e);t&&H(r=>(r+t).slice(0,$c))};var Ps=[{intent:h.ViewHelp,mode:g.DEFAULT,action:()=>(A({mode:g.HELP}),l("Viewing help",null))},{intent:h.Exit,mode:g.HELP,action:()=>(A({mode:g.DEFAULT}),l("Exiting help",null))},{intent:h.Confirm,mode:g.COMMAND_LINE,action:()=>(fe(),l("Executing command",null))},{intent:h.MoveCursorLeft,mode:g.COMMAND_LINE,action:()=>(bn(-1),l("Moving cursor left",null))},{intent:h.MoveCursorRight,mode:g.COMMAND_LINE,action:()=>(bn(1),l("Moving cursor right",null))},{intent:h.MoveCursorLeftOfWord,mode:g.COMMAND_LINE,action:()=>(In("left"),l("Moving cursor left of word",null))},{intent:h.MoveCursorRightOfWord,mode:g.COMMAND_LINE,action:()=>(In("right"),l("Moving cursor right of word",null))},{intent:h.ExitCommandLine,mode:g.COMMAND_LINE,action:()=>(A({mode:g.DEFAULT}),l("Exiting command line",null))},{intent:h.AutoCompleteCommand,mode:g.COMMAND_LINE,action:()=>(H((e,{remainder:t})=>t?e+t:e),l("Auto-completing command",null))},{intent:h.CaptureInput,mode:g.COMMAND_LINE,action:(e,{sequence:t})=>(Ms(t??""),l("Capturing input",null))},{intent:h.EraseInput,mode:g.COMMAND_LINE,action:()=>(Zo(),l("Erasing input",null))},{intent:h.EraseInputWord,mode:g.COMMAND_LINE,action:()=>(Qo(),l("Erasing input word",null))},{intent:h.GetLastCommandFromHistory,mode:g.COMMAND_LINE,action:()=>(ri(),l("Getting last command from history",null))},{intent:h.GetNextCommandFromHistory,mode:g.COMMAND_LINE,action:()=>(ni(),l("Getting next command from history",null))}];import Wc from"chalk";var $r=": for command line",ks="q to exit",Ls=`${Wc.hex(C.accent)("m")} to confirm`,Gn={[P.WORKSPACE]:[$r],[P.BOARD]:[$r],[P.BOARD+g.COMMAND_LINE]:[$r],[P.SWIMLANE]:[$r],[P.TICKET+g.HELP]:[ks],[P.SWIMLANE+g.HELP]:[ks],[P.TICKET]:[],[P.FIELD]:[],[P.SWIMLANE+g.MOVE]:[Ls],[P.TICKET+g.MOVE]:[Ls]};var jr=e=>e.trim().toLocaleLowerCase(),_c=(e,t)=>{let r=I.getFieldByTitle(e,t);if(!r)return"";let n=r.props?.value;return typeof n=="string"?n:""},Hc=e=>{let{tags:t}=x(),r=I.getFieldByTitle(e,"Tags");return r?B(r.id).map(n=>{let o=n.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(n=>!!n):[]},Kc=e=>{let{contributors:t}=x(),r=I.getFieldByTitle(e,"Assignees");return r?B(r.id).map(n=>{let o=n.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(n=>!!n):[]},Fs=(e,t)=>{let r=t.value;if(!r)return!0;switch(t.target){case"title":return jr(e.title??"").includes(r);case"description":return jr(_c(e.id,"Description")).includes(r);case"tag":return Hc(e.id).map(jr).some(c=>c.includes(r));case"assignee":return Kc(e.id).map(jr).some(c=>c.includes(r));default:return!0}};function Ds(e,t,r){let n=t[e];if(!n)return s("buildBreadCrumb(): current node not found");let o=[],i=n;for(;i&&(o.push(i),!(i.id===r||!i.parentNodeId));)i=t[i.parentNodeId];let a=o[o.length-1];return!a||a.id!==r?s("buildBreadCrumb(): node is not connected to root"):(o.reverse(),l("Breadcrumb built",o))}var Bs=e=>{let t={};for(let r of e)r.intent&&(t[r.mode]||(t[r.mode]={}),t[r.mode][r.intent]=r);return t};var Wr,Yn,Xn=new Set,Os=()=>{for(let e of Xn)e()},qc=e=>(Xn.add(e),()=>Xn.delete(e));function Us(e){let{currentNodeId:t,mode:r,rootNodeId:n,nodes:o,filters:i}=e;if(!t)return s("derive(): currentNodeId is missing");if(!n)return s("derive(): rootNode is missing");if(!o[n])return s("derive(): unable to find root node");let c=o[t];if(!c)return s("Unable to derive state, currentNode not found");let u=Ds(t,o,n);if(d(u))return logger.error(u.message),u;let m=u.value,{context:p}=c,v=Gn[p+r]??Gn[p]??[],y=[...Ts,...As[p]??[],...Ps],b=Bs(y),R=zc(o,i),S=R[t]?.[e.selectedIndex]??null;return l("Derived successfully",{...e,currentNode:c,breadCrumb:m,availableHints:v,availableActions:y,actionIndex:b,selectedNode:S,renderedChildrenIndex:R})}var x=()=>(Wr||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),Wr);function It(e){Yn=e;let t=ye(process.cwd()),r=!1;if(!d(t)){let i=Be(t.value);if(d(i))return s(i.message);r=!0}let n={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",hasProject:r},o=Us(n);return d(o)?o:(Wr=o.value,Os(),l("State initialized",null))}function le(e){let t=x(),r=e(t),n=Us(r);return d(n)?s(n.message??"Unable to update state"):(Wr=n.value,Os(),l("State updated",null))}var A=e=>le(t=>({...t,...e}));var U=()=>Vc(qc,x,x),zc=(e,t)=>{let r={};for(let n of Object.values(e))pe(n)&&t.length>0&&!t.every(o=>Fs(n,o))||!n.parentNodeId||n.isDeleted||((!n.parentNodeId||!r[n.parentNodeId])&&(r[n.parentNodeId]=[]),r[n.parentNodeId].push(n));for(let n of Object.keys(r))r[n].sort((o,i)=>{let a=e[o.id],c=e[i.id];return!a||!c?0:a.rank.localeCompare(c.rank)});return r},T=e=>x()?.renderedChildrenIndex[e]??[],zn=()=>Yn?It(Yn):s("Cannot reset state: no initial workspace found");import{Box as ul}from"ink";import Qn from"react";import Kt from"chalk";import{Box as Jn,Text as $s}from"ink";import Ht,{useEffect as Gc,useMemo as Yc,useState as Xc}from"react";var js=Kt.gray,Jc=Kt.inverse,Zc=Kt.inverse.gray,Qc={hint:"",hints:[],overlap:0,remainder:""},_s=({value:e,command:t})=>{if(!t)return null;let r=e.trimStart(),o=e.length-r.length;return e.slice(o,o+t.length)!==t?null:{start:o,end:o+t.length}},el=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let r=ee(t);return{bg:n=>Kt.bgHex(r).black(n),bgCursor:n=>Kt.bgHex(r).inverse.black(n)}}return hn(t)},tl=({value:e,command:t,modifier:r})=>{if(!t||!r)return null;let n=_s({value:e,command:t});if(!n)return null;let i=e.slice(n.end).match(/^\s*/)?.[0].length??0,a=n.end+i;return e.slice(a,a+r.length)!==r?null:{start:a,end:a+r.length}},Ws=()=>({value:te.value,cursorPosition:te.cursorPosition,commandIsPending:te.commandIsPending,autoCompletion:te.commandMeta.autoCompletion??Qc,infoMessage:te.commandMeta.infoMessage,validationStatus:te.commandMeta.validity,command:te.commandMeta.command,inputString:te.commandMeta.inputString,modifier:te.commandMeta.modifier}),rl=(e,t)=>e.value===t.value&&e.cursorPosition===t.cursorPosition&&e.commandIsPending===t.commandIsPending&&e.infoMessage===t.infoMessage&&e.autoCompletion.hint===t.autoCompletion.hint&&e.autoCompletion.overlap===t.autoCompletion.overlap&&e.autoCompletion.remainder===t.autoCompletion.remainder&&e.validationStatus===t.validationStatus&&e.command===t.command&&e.modifier===t.modifier&&e.inputString===t.inputString,Hs=({width:e})=>{let[t,r]=Xc(Ws());Gc(()=>{let v=()=>{let b=Ws();r(R=>rl(R,b)?R:b)},y=Jo(v);return v(),()=>{y()}},[]);let{value:n,cursorPosition:o,infoMessage:i,commandIsPending:a,autoCompletion:c,command:u,modifier:m}=t,p=Yc(()=>{let v=Math.max(0,Math.min(o,n.length)),y=_s({value:n,command:u}),b=tl({value:n,command:u,modifier:m}),R=u?hn(u):null,S=el({command:u,modifier:m}),N=(q,J)=>{let Ze=y&&J>=y.start&&J<y.end,Gt=b&&J>=b.start&&J<b.end;return Ze&&R?R.fg(q):Gt&&S?S.bg(q):q},w=(q,J)=>{let Ze=y&&J>=y.start&&J<y.end,Gt=b&&J>=b.start&&J<b.end;return Ze&&R?R.fgCursor(q):Gt&&S?S.bgCursor(q):Jc(q)},D=n.slice(0,v),ie=n[v]??" ",X=v<n.length?n.slice(v+1):"",zt=Array.from(D).map((q,J)=>N(q,J)).join(""),vt=w(ie,v),xt=Array.from(X).map((q,J)=>N(q,v+1+J)).join("");if(c.hint){let q=c.hint[c.overlap]??ie;vt=Zc(q),xt=js(c.remainder.slice(1)+X)}return js(":")+zt+vt+xt},[n,o,c,u,m]);return Ht.createElement(Jn,{flexDirection:"column",justifyContent:"flex-start"},Ht.createElement(Jn,{flexDirection:"column",paddingX:1,borderColor:C.secondary,borderStyle:"round",width:e},Ht.createElement(Jn,null,Ht.createElement($s,null,p),i&&Ht.createElement($s,{wrap:"truncate",color:a?C.red:C.secondary2},` ${i} `))))};import Ks from"chalk";import{Box as nl,Text as Zn}from"ink";import _r,{useEffect as ol,useState as il}from"react";var sl=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],Vs=e=>{let t=e.replace("#","");return{r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16)}},al=({r:e,g:t,b:r})=>{let n=o=>Math.round(Math.max(0,Math.min(255,o))).toString(16).padStart(2,"0");return`#${n(e)}${n(t)}${n(r)}`},dl=(e,t,r)=>{let n=Vs(e),o=Vs(t);return al({r:n.r+(o.r-n.r)*r,g:n.g+(o.g-n.g)*r,b:n.b+(o.b-n.b)*r})},cl=(e,t)=>{if(e.length===1)return e[0];let r=t*(e.length-1),n=Math.floor(r),o=r-n,i=e[n],a=e[Math.min(n+1,e.length-1)];return dl(i,a,o)},ll=(e,t)=>e.length===t?e:e.length>t?e.slice(0,t):e.padEnd(t," "),qs=({width:e,availableHints:t})=>{let{syncStatus:{status:r,msg:n}}=U(),[o,i]=il(0);ol(()=>{if(r!=="syncing"){i(0);return}let N=setInterval(()=>{i(w=>w+1)},50);return()=>clearInterval(N)},[r]);let a=[],c=0;for(let N of t){let D=(a.length>0?" | ":"").length+N.length;if(c+D>e-4)break;a.push(N),c+=D}let u=r!="synced"?n??a.join(" | "):a.join(" | "),m=Math.max(0,e-2),p=r==="syncing"?cl(sl,(Math.sin(o*.12)+1)/2):C.secondary,v=Ks.hex(p??"fff"),y=Ks.hex(C.secondary2),b=v(`\u256D${"\u2500".repeat(m)}\u256E`),R=v(`\u2570${"\u2500".repeat(m)}\u256F`),S=`${v("\u2502")}${y(ll(` ${u} `,m))}${v("\u2502")}`;return _r.createElement(nl,{flexDirection:"column",width:e},_r.createElement(Zn,null,b),_r.createElement(Zn,null,S),_r.createElement(Zn,null,R))};var Hr=({width:e,mode:t,availableHints:r})=>{let n=U(),o=[],i=0;for(let a of r){let u=(o.length>0?" | ":"").length+a.length;if(i+u>e+2)break;o.push(a),i+=u}return Qn.createElement(ul,null,t===g.COMMAND_LINE&&n.syncStatus.status!=="syncing"?Qn.createElement(Hs,{width:e}):Qn.createElement(qs,{width:e,mode:t,availableHints:r}))};import{Box as gt,Text as zs}from"ink";import We from"react";var Gs=({width:e})=>{let t=[...x().availableActions].map(r=>r.description).filter(r=>r!==void 0).map(r=>{let[n,o]=r.split("]"),i=n?.replace("[",""),a=o?.trim();return[i,a]}).filter(r=>r[0]!==void 0&&r[1]!==void 0).sort(([r],[n])=>r.length===1&&n.length!==1?-1:r.length!==1&&n.length===1?1:r.localeCompare(n,void 0,{sensitivity:"base"}));return t.unshift(["Key(s)","Action"]),We.createElement(gt,{flexDirection:"column",marginTop:3,borderColor:C.secondary,borderStyle:"round",width:e,minHeight:19},We.createElement(gt,{flexDirection:"column",width:e},x().mode===g.HELP?t.map(([r,n],o)=>We.createElement(gt,{paddingLeft:1,key:o,flexDirection:"row"},We.createElement(gt,{key:o,flexDirection:"row",paddingBottom:o?0:1},We.createElement(gt,{width:20,justifyContent:"flex-end"},We.createElement(zs,{color:o?C.accent:C.secondary},r)),We.createElement(gt,{flexGrow:1,width:40,paddingLeft:2},We.createElement(zs,{color:o?C.primary:C.secondary},n))))):null))};import ml from"chalk";import{Box as Kr,Text as _e}from"ink";import ve from"react";var Ys=({width:e,height:t})=>ve.createElement(Kr,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:C.secondary,rowGap:1},ve.createElement(_e,{color:C.accent,bold:!0},"Initialize project"),ve.createElement(_e,null,`This folder is not an ${ml.hex(C.accent)("epiq")} project yet.`),ve.createElement(_e,{color:C.primary},"To start tracking issues here, we need to initialize a new"," ",ve.createElement(_e,{color:C.primary,backgroundColor:C.secondary}," .epiq/project.json ")," ","file in this repository."),ve.createElement(Kr,{marginTop:1,flexDirection:"column"},ve.createElement(Kr,null,ve.createElement(_e,{color:C.accent}," "),ve.createElement(_e,{color:C.primary},"Type "),ve.createElement(_e,{backgroundColor:C.secondary}," :init "))),ve.createElement(Kr,{marginTop:1},ve.createElement(_e,{color:C.secondary2},"(This will create the local epiq project files)")));import{Box as Vt,Text as Ce}from"ink";import _ from"react";var Vr=({isDone:e,command:t,value:r})=>_.createElement(Vt,null,_.createElement(Ce,{color:C.accent,dimColor:e},e?" \u2714 ":" "),_.createElement(Ce,{dimColor:e},"Type "),_.createElement(Ce,{backgroundColor:C.secondary,dimColor:e}," "+t+" "),r&&_.createElement(_.Fragment,null,_.createElement(Ce,{dimColor:e}," "),_.createElement(Ce,{color:C.secondary,dimColor:e},"<"+r+">")));function eo({width:e,height:t,hasUserName:r,hasPreferredEditor:n,userName:o,preferredEditor:i}){let a=r&&n,c=r?n?null:":config:editor":":config:username";return _.createElement(Vt,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:C.secondary,rowGap:1},_.createElement(Ce,{color:C.accent,bold:!0},"Welcome! \u{1F539}"),_.createElement(Ce,null,"Lets get you started - its a breeze."),_.createElement(Ce,{color:C.secondary2},"And remember, you can always get help with"," ",_.createElement(Ce,{color:C.accent},":help"),"."),!a&&_.createElement(Ce,{color:C.secondary2},c===":config:username"?"First, choose your username.":"Nice. One more step."),_.createElement(Vt,{flexDirection:"column"},r&&_.createElement(Vt,{marginBottom:1},_.createElement(Vr,{isDone:!0,command:":config:username",value:o})),!r&&_.createElement(Vr,{isDone:!1,command:":config:username"}),r&&!n&&_.createElement(Vr,{isDone:!1,command:":config:editor"}),a&&_.createElement(Vt,null,_.createElement(Vr,{isDone:!0,command:":config:editor",value:i}))))}import ea from"chalk";import{Box as zr,Text as He}from"ink";import re from"react";import{Box as to,Text as pl}from"ink";import ft from"react";var gl=(e,t)=>e.length<=t?e:t<=1?"\u2026":e.slice(0,t-1)+"\u2026",Xs=({width:e})=>{let{breadCrumb:t,currentNode:r,selectedIndex:n,viewMode:o}=x(),i=B(r.id)[n],a=Oe(i?.id??r.id,"TICKET"),c=xe(a)?a.value:void 0,u=c?.id?B(c.id):[],m=S=>{let N=u.find(w=>w.title===S);return N?B(N.id).map(w=>typeof w.props?.value=="string"?w.props.value:"").filter(w=>!!w):[]},p=m("Tags"),v=m("Assignees"),y=c?.parentNodeId?!un(r.id,c?.parentNodeId)&&o==="dense":!1,b=t.map((S,N)=>{let w=N===t.length-1,D=B(S.id),ie=w?D?.[n]?.title:void 0;return`${N?" / ":""}${S.title??""}${ie?` \u25B8 ${ie}`:""}`}).join(""),R=gl(b,e);return ft.createElement(to,null,ft.createElement(pl,{color:C.secondary2},R),y?p.map(S=>ft.createElement(to,{key:S,paddingLeft:2},ft.createElement(ct,{id:S}))):null,y?v.map(S=>ft.createElement(to,{key:S,paddingLeft:2},ft.createElement(dt,{id:S}))):null)};import{Box as fl,Text as Js}from"ink";import qr from"react";var vl=({filters:e})=>qr.createElement(fl,{columnGap:1},qr.createElement(Js,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:r,operator:n})=>qr.createElement(Js,{backgroundColor:"black",color:"white"},` ${r}${n}"${t}" `))),Zs=qr.memo(vl);var Qs="0.4.10";function Gr({filters:e,hideBreadCrumb:t=!1}){let{timeMode:r,eventLog:n,unappliedEvents:o}=U(),{userName:i,preferredEditor:a}=ce(),c=40,u=process.stdout.columns-c-8,m=n.at(-1)?.id,p=mr(m??""),v=xe(p)?Wo(p.value):"INVALID DATE";return re.createElement(zr,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?re.createElement(He,null," "):re.createElement(zr,{paddingLeft:1},e.length>0?re.createElement(Zs,{filters:e}):re.createElement(Xs,{width:u})),r==="live"?re.createElement(zr,{columnGap:1,paddingRight:2,"max-width":c,overflow:"hidden",justifyContent:"flex-end"},re.createElement(He,{dimColor:!0,color:C.secondary2},Qs+" "),re.createElement(ta,{icon:"@",value:i}),re.createElement(ta,{icon:"\u276F",value:a})):"",r==="peek"?re.createElement(zr,{paddingLeft:1},re.createElement(He,{backgroundColor:C.yellow}," Readonly "),re.createElement(He,{color:C.yellow}," "+o.length+" edits ago at "),re.createElement(He,{backgroundColor:C.yellow,color:C.accent}," "+v+" "),re.createElement(He,{color:C.yellow},". Resume with "),re.createElement(He,{backgroundColor:C.yellow}," :peek now ")):"")}function ta({icon:e,value:t}){return re.createElement(He,null,ea.dim(e)+ea.hex(C.accent)(` ${t??"-"} `))}import{Box as xl,Text as hl}from"ink";import qt from"react";import{Box as Yr,Text as ro}from"ink";import Ke from"react";function no(){let e=U(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,i=process.stdout.columns||120,a=t?.id?T(t?.id):[];return Ke.createElement(Yr,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:C.secondary,width:i},Ke.createElement(Yr,{padding:1,paddingTop:0,paddingBottom:0},Ke.createElement(ro,null,"Select a board:")),Ke.createElement(Yr,{padding:1,flexDirection:"column"},a.map((c,u)=>{let m=e.currentNode.context==="WORKSPACE"&&e.selectedIndex===u,v=T(c.id).flatMap(({id:y})=>B(y)).length;return Ke.createElement(Yr,{key:c.id??u},Ke.createElement(ro,{color:m?C.accent:C.secondary2},Ke.createElement(ae,{isSelected:m})),Ke.createElement(ro,{color:m?C.accent:C.secondary2},c.title," (",v," issues)",c.readonly?" \u{1F512}":""))})))}var yl=({currentNode:e,selectedIndex:t,breadCrumb:r,mode:n,viewMode:o,height:i,width:a})=>{let{renderedChildrenIndex:c}=U(),u=r.find(({context:y})=>y==="BOARD"),v=i-1-3;return qt.createElement(xl,{flexDirection:"row"},e.context==="WORKSPACE"?qt.createElement(no,null):u?qt.createElement(Cr,{height:v,width:a,swimlanes:(c[u.id]??[]).filter(y=>y!==void 0&&tt(y)),currentNode:e,selectedIndex:t,breadCrumb:r,viewMode:o,mode:n}):qt.createElement(hl,null))},ra=qt.memo(yl);function oo({width:e,height:t}){let r=U(),n=r.filters;if(r.mode===g.HELP)return Y.createElement(Je,{flexDirection:"column"},Y.createElement(Gs,{width:e}));let{isSetup:o,hasPreferredEditor:i,hasUserName:a,userName:c,preferredEditor:u}=et(),m=!o,p=o&&!r.hasProject;if(m)return Y.createElement(Je,{flexDirection:"column"},Y.createElement(Je,{flexDirection:"column"},Y.createElement(Gr,{hideBreadCrumb:!0,filters:n}),Y.createElement(eo,{height:t,width:e,hasUserName:a,hasPreferredEditor:i,userName:c??"",preferredEditor:u??""})),Y.createElement(Hr,{width:e,mode:r.mode,availableHints:r.availableHints}));if(p)return Y.createElement(Je,{flexDirection:"column"},Y.createElement(Je,{flexDirection:"column"},Y.createElement(Gr,{hideBreadCrumb:!0,filters:n}),Y.createElement(Ys,{height:t,width:e})),Y.createElement(Hr,{width:e,mode:r.mode,availableHints:r.availableHints}));let v=Re(x().breadCrumb??[],"BOARD");if(xe(v)){let y=v.value.id,b=T(y).length,R=3,S=Math.floor(e/R),N=Math.floor(e/Math.max(b,1));e=Math.min(N,S)*Math.max(b,R)}return Y.createElement(Je,{flexDirection:"column"},Y.createElement(Je,{flexDirection:"column"},Y.createElement(Gr,{filters:n}),Y.createElement(ra,{width:e,height:t,currentNode:r.currentNode,selectedIndex:r.selectedIndex,breadCrumb:r.breadCrumb,viewMode:r.viewMode,mode:r.mode})),Y.createElement(Hr,{width:e,mode:r.mode,availableHints:r.availableHints}))}import El from"readline";var Xr,Jr,Ne,Cl=new Set([h.MoveCursorLeft,h.EraseInputWord,h.MoveCursorLeftOfWord,h.MoveCursorRight,h.MoveCursorRightOfWord,h.NavToPreviousContainer,h.NavToNextContainer,h.NavPreviousItem,h.NavNextItem,h.SetViewDense,h.SetViewWide,h.Confirm,h.Exit,h.InitCommandLine,h.ExitCommandLine,h.CaptureInput,h.EraseInput,h.EraseInputWord,h.HideHelp,h.ViewHelp,h.SetViewDense,h.SetViewWide,h.GetLastCommandFromHistory,h.GetNextCommandFromHistory,h.AutoCompleteCommand]),na=async e=>{if(e.ctrl&&e.name==="c")return L.exit();let{actionIndex:t,mode:r,readOnly:n}=x(),o=ii(e,r);if(!o||n&&!Cl.has(o))return;let i=t[r]?.[o];if(i?.action)try{await i.action(i,e)}catch(a){logger.error(a)}},Nl=()=>async function(t,r){r.name!=="escape"&&(Ne&&(clearTimeout(Ne),Ne=void 0),await na(r))},bl=()=>async function(t){if(t.length===1&&t[0]===27){Ne&&clearTimeout(Ne),Ne=setTimeout(()=>{na({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),Ne=void 0},25);return}Ne&&(clearTimeout(Ne),Ne=void 0)};function oa(){Xr&&process.stdin.removeListener("keypress",Xr),Jr&&process.stdin.removeListener("data",Jr),Xr=Nl(),Jr=bl(),El.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",Jr),process.stdin.on("keypress",Xr)}Sl(`${io.bold("Epiq CLI")}
|
|
60
59
|
|
|
61
|
-
|
|
60
|
+
${io.dim("Boot in directory:")}
|
|
61
|
+
${io.cyan("$ epiq")}
|
|
62
62
|
|
|
63
|
-
|
|
64
|
-
`)):(Hl(),c("State booted successfully",null))}var tn=()=>{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}},wo=()=>!Dt();import{Box as ac}from"ink";import Kr from"react";import Ot from"chalk";import{Box as Hr,Text as Ls}from"ink";import Ft,{useEffect as Kl,useMemo as Vl,useState as zl}from"react";var Fs=Ot.gray,ql=Ot.inverse,Gl=Ot.inverse.gray,Yl={hint:"",hints:[],overlap:0,remainder:""},Bs=({value:e,command:t})=>{if(!t)return null;let n=e.trimStart(),o=e.length-n.length;return e.slice(o,o+t.length)!==t?null:{start:o,end:o+t.length}},Xl=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=X(t);return{bg:r=>Ot.bgHex(n).black(r),bgCursor:r=>Ot.bgHex(n).inverse.black(r)}}return sr(t)},Jl=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=Bs({value:e,command:t});if(!r)return null;let i=e.slice(r.end).match(/^\s*/)?.[0].length??0,a=r.end+i;return e.slice(a,a+n.length)!==n?null:{start:a,end:a+n.length}},Os=()=>({value:J.value,cursorPosition:J.cursorPosition,commandIsPending:J.commandIsPending,autoCompletion:J.commandMeta.autoCompletion??Yl,infoMessage:J.commandMeta.infoMessage,validationStatus:J.commandMeta.validity,command:J.commandMeta.command,inputString:J.commandMeta.inputString,modifier:J.commandMeta.modifier}),Zl=(e,t)=>e.value===t.value&&e.cursorPosition===t.cursorPosition&&e.commandIsPending===t.commandIsPending&&e.infoMessage===t.infoMessage&&e.autoCompletion.hint===t.autoCompletion.hint&&e.autoCompletion.overlap===t.autoCompletion.overlap&&e.autoCompletion.remainder===t.autoCompletion.remainder&&e.validationStatus===t.validationStatus&&e.command===t.command&&e.modifier===t.modifier&&e.inputString===t.inputString,Us=({width:e})=>{let[t,n]=zl(Os());Kl(()=>{let y=()=>{let S=Os();n(A=>Zl(A,S)?A:S)},N=_o(y);return y(),()=>{N()}},[]);let{value:r,cursorPosition:o,infoMessage:i,commandIsPending:a,autoCompletion:l,command:u,modifier:m}=t,p=Vl(()=>{let y=Math.max(0,Math.min(o,r.length)),N=Bs({value:r,command:u}),S=Jl({value:r,command:u,modifier:m}),A=u?sr(u):null,I=Xl({command:u,modifier:m}),C=(ie,se)=>{let _n=N&&se>=N.start&&se<N.end,Wn=S&&se>=S.start&&se<S.end;return _n&&A?A.fg(ie):Wn&&I?I.bg(ie):ie},T=(ie,se)=>{let _n=N&&se>=N.start&&se<N.end,Wn=S&&se>=S.start&&se<S.end;return _n&&A?A.fgCursor(ie):Wn&&I?I.bgCursor(ie):ql(ie)},B=r.slice(0,y),Oe=r[y]??" ",Be=y<r.length?r.slice(y+1):"",ra=Array.from(B).map((ie,se)=>C(ie,se)).join(""),Jr=T(Oe,y),Zr=Array.from(Be).map((ie,se)=>C(ie,y+1+se)).join("");if(l.hint){let ie=l.hint[l.overlap]??Oe;Jr=Gl(ie),Zr=Fs(l.remainder.slice(1)+Be)}return Fs(":")+ra+Jr+Zr},[r,o,l,u,m]);return Ft.createElement(Hr,{flexDirection:"column",justifyContent:"flex-start"},Ft.createElement(Hr,{flexDirection:"column",paddingX:1,borderColor:E.secondary,borderStyle:"round",width:e},Ft.createElement(Hr,null,Ft.createElement(Ls,null,p),i&&Ft.createElement(Ls,{wrap:"truncate",color:a?E.red:E.secondary2},` ${i} `))))};import $s from"chalk";import{Box as Ql,Text as jr}from"ink";import Rn,{useEffect as ec,useState as tc}from"react";var nc=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],_s=e=>{let t=e.replace("#","");return{r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16)}},rc=({r:e,g:t,b:n})=>{let r=o=>Math.round(Math.max(0,Math.min(255,o))).toString(16).padStart(2,"0");return`#${r(e)}${r(t)}${r(n)}`},oc=(e,t,n)=>{let r=_s(e),o=_s(t);return rc({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},ic=(e,t)=>{if(e.length===1)return e[0];let n=t*(e.length-1),r=Math.floor(n),o=n-r,i=e[r],a=e[Math.min(r+1,e.length-1)];return oc(i,a,o)},sc=(e,t)=>e.length===t?e:e.length>t?e.slice(0,t):e.padEnd(t," "),Ws=({width:e,availableHints:t})=>{let{syncStatus:{status:n,msg:r}}=$(),[o,i]=tc(0);ec(()=>{if(n!=="syncing"){i(0);return}let C=setInterval(()=>{i(T=>T+1)},50);return()=>clearInterval(C)},[n]);let a=[],l=0;for(let C of t){let B=(a.length>0?" | ":"").length+C.length;if(l+B>e-4)break;a.push(C),l+=B}let u=n!="synced"?r??a.join(" | "):a.join(" | "),m=Math.max(0,e-2),p=n==="syncing"?ic(nc,(Math.sin(o*.12)+1)/2):E.secondary,y=$s.hex(p??"fff"),N=$s.hex(E.secondary2),S=y(`\u256D${"\u2500".repeat(m)}\u256E`),A=y(`\u2570${"\u2500".repeat(m)}\u256F`),I=`${y("\u2502")}${N(sc(` ${u} `,m))}${y("\u2502")}`;return Rn.createElement(Ql,{flexDirection:"column",width:e},Rn.createElement(jr,null,S),Rn.createElement(jr,null,I),Rn.createElement(jr,null,A))};var Mn=({width:e,mode:t,availableHints:n})=>{let r=$(),o=[],i=0;for(let a of n){let u=(o.length>0?" | ":"").length+a.length;if(i+u>e+2)break;o.push(a),i+=u}return Kr.createElement(ac,null,t===g.COMMAND_LINE&&r.syncStatus.status!=="syncing"?Kr.createElement(Us,{width:e}):Kr.createElement(Ws,{width:e,mode:t,availableHints:n}))};import{Box as mt,Text as Hs}from"ink";import He from"react";var js=({width:e})=>{let t=[...v().availableActions].map(n=>n.description).filter(n=>n!==void 0).map(n=>{let[r,o]=n.split("]"),i=r?.replace("[",""),a=o?.trim();return[i,a]}).filter(n=>n[0]!==void 0&&n[1]!==void 0).sort(([n],[r])=>n.length===1&&r.length!==1?-1:n.length!==1&&r.length===1?1:n.localeCompare(r,void 0,{sensitivity:"base"}));return t.unshift(["Key(s)","Action"]),He.createElement(mt,{flexDirection:"column",marginTop:3,borderColor:E.secondary,borderStyle:"round",width:e,minHeight:19},He.createElement(mt,{flexDirection:"column",width:e},v().mode===g.HELP?t.map(([n,r],o)=>He.createElement(mt,{paddingLeft:1,key:o,flexDirection:"row"},He.createElement(mt,{key:o,flexDirection:"row",paddingBottom:o?0:1},He.createElement(mt,{width:20,justifyContent:"flex-end"},He.createElement(Hs,{color:o?E.accent:E.secondary},n)),He.createElement(mt,{flexGrow:1,width:40,paddingLeft:2},He.createElement(Hs,{color:o?E.primary:E.secondary},r))))):null))};import dc from"chalk";import{Box as Pn,Text as je}from"ink";import pe from"react";var Ks=({width:e,height:t})=>pe.createElement(Pn,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:E.secondary,rowGap:1},pe.createElement(je,{color:E.accent,bold:!0},"Initialize project"),pe.createElement(je,null,`This folder is not an ${dc.hex(E.accent)("epiq")} project yet.`),pe.createElement(je,{color:E.primary},"To start tracking issues here, we need to initialize a new"," ",pe.createElement(je,{color:E.primary,backgroundColor:E.secondary}," .epiq/project.json ")," ","file in this repository."),pe.createElement(Pn,{marginTop:1,flexDirection:"column"},pe.createElement(Pn,null,pe.createElement(je,{color:E.accent}," "),pe.createElement(je,{color:E.primary},"Type "),pe.createElement(je,{backgroundColor:E.secondary}," :init "))),pe.createElement(Pn,{marginTop:1},pe.createElement(je,{color:E.secondary2},"(This will create the local epiq project files)")));import{Box as Bt,Text as xe}from"ink";import H from"react";var kn=({isDone:e,command:t,value:n})=>H.createElement(Bt,null,H.createElement(xe,{color:E.accent,dimColor:e},e?" \u2714 ":" "),H.createElement(xe,{dimColor:e},"Type "),H.createElement(xe,{backgroundColor:E.secondary,dimColor:e}," "+t+" "),n&&H.createElement(H.Fragment,null,H.createElement(xe,{dimColor:e}," "),H.createElement(xe,{color:E.secondary,dimColor:e},"<"+n+">")));function Vr({width:e,height:t,hasUserName:n,hasPreferredEditor:r,userName:o,preferredEditor:i}){let a=n&&r,l=n?r?null:":config:editor":":config:username";return H.createElement(Bt,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:E.secondary,rowGap:1},H.createElement(xe,{color:E.accent,bold:!0},"Welcome! \u{1F539}"),H.createElement(xe,null,"Lets get you started - its a breeze."),H.createElement(xe,{color:E.secondary2},"And remember, you can always get help with"," ",H.createElement(xe,{color:E.accent},":help"),"."),!a&&H.createElement(xe,{color:E.secondary2},l===":config:username"?"First, choose your username.":"Nice. One more step."),H.createElement(Bt,{flexDirection:"column"},n&&H.createElement(Bt,{marginBottom:1},H.createElement(kn,{isDone:!0,command:":config:username",value:o})),!n&&H.createElement(kn,{isDone:!1,command:":config:username"}),n&&!r&&H.createElement(kn,{isDone:!1,command:":config:editor"}),a&&H.createElement(Bt,null,H.createElement(kn,{isDone:!0,command:":config:editor",value:i}))))}import Ys from"chalk";import{Box as Ln,Text as Ke}from"ink";import Z from"react";import{Box as zr,Text as lc}from"ink";import pt from"react";var cc=(e,t)=>e.length<=t?e:t<=1?"\u2026":e.slice(0,t-1)+"\u2026",Vs=({width:e})=>{let{breadCrumb:t,currentNode:n,selectedIndex:r,viewMode:o}=v(),i=F(n.id)[r],a=Ue(i?.id??n.id,"TICKET"),l=Ee(a)?a.value:void 0,u=l?.id?F(l.id):[],m=I=>{let C=u.find(T=>T.title===I);return C?F(C.id).map(T=>typeof T.props?.value=="string"?T.props.value:"").filter(T=>!!T):[]},p=m("Tags"),y=m("Assignees"),N=l?.parentNodeId?!Qn(n.id,l?.parentNodeId)&&o==="dense":!1,S=t.map((I,C)=>{let T=C===t.length-1,B=F(I.id),Oe=T?B?.[r]?.title:void 0;return`${C?" / ":""}${I.title??""}${Oe?` \u25B8 ${Oe}`:""}`}).join(""),A=cc(S,e);return pt.createElement(zr,null,pt.createElement(lc,{color:E.secondary2},A),N?p.map(I=>pt.createElement(zr,{key:I,paddingLeft:2},pt.createElement(at,{id:I}))):null,N?y.map(I=>pt.createElement(zr,{key:I,paddingLeft:2},pt.createElement(st,{id:I}))):null)};import{Box as uc,Text as zs}from"ink";import Dn from"react";var mc=({filters:e})=>Dn.createElement(uc,{columnGap:1},Dn.createElement(zs,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>Dn.createElement(zs,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),qs=Dn.memo(mc);var Gs="0.4.8";function Fn({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,eventLog:r,unappliedEvents:o}=$(),{userName:i,preferredEditor:a}=ge(),l=40,u=process.stdout.columns-l-8,m=r.at(-1)?.id,p=nn(m??""),y=Ee(p)?Mo(p.value):"INVALID DATE";return Z.createElement(Ln,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?Z.createElement(Ke,null," "):Z.createElement(Ln,{paddingLeft:1},e.length>0?Z.createElement(qs,{filters:e}):Z.createElement(Vs,{width:u})),n==="live"?Z.createElement(Ln,{columnGap:1,paddingRight:2,"max-width":l,overflow:"hidden",justifyContent:"flex-end"},Z.createElement(Ke,{dimColor:!0,color:E.secondary2},Gs+" "),Z.createElement(Xs,{icon:"@",value:i}),Z.createElement(Xs,{icon:"\u276F",value:a})):"",n==="peek"?Z.createElement(Ln,{paddingLeft:1},Z.createElement(Ke,{backgroundColor:E.yellow}," Readonly "),Z.createElement(Ke,{color:E.yellow}," "+o.length+" edits ago at "),Z.createElement(Ke,{backgroundColor:E.yellow,color:E.accent}," "+y+" "),Z.createElement(Ke,{color:E.yellow},". Resume with "),Z.createElement(Ke,{backgroundColor:E.yellow}," :peek now ")):"")}function Xs({icon:e,value:t}){return Z.createElement(Ke,null,Ys.dim(e)+Ys.hex(E.accent)(` ${t??"-"} `))}import{Box as pc,Text as gc}from"ink";import Ut from"react";import{Box as On,Text as qr}from"ink";import Ve from"react";function Gr(){let e=$(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,i=process.stdout.columns||120,a=t?.id?R(t?.id):[];return Ve.createElement(On,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:E.secondary,width:i},Ve.createElement(On,{padding:1,paddingTop:0,paddingBottom:0},Ve.createElement(qr,null,"Select a board:")),Ve.createElement(On,{padding:1,flexDirection:"column"},a.map((l,u)=>{let m=e.currentNode.context==="WORKSPACE"&&e.selectedIndex===u,y=R(l.id).flatMap(({id:N})=>F(N)).length;return Ve.createElement(On,{key:l.id??u},Ve.createElement(qr,{color:m?E.accent:E.secondary2},Ve.createElement(re,{isSelected:m})),Ve.createElement(qr,{color:m?E.accent:E.secondary2},l.title," (",y," issues)",l.readonly?" \u{1F512}":""))})))}var fc=({currentNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:i,width:a})=>{let{renderedChildrenIndex:l}=$(),u=n.find(({context:N})=>N==="BOARD"),y=i-1-3;return Ut.createElement(pc,{flexDirection:"row"},e.context==="WORKSPACE"?Ut.createElement(Gr,null):u?Ut.createElement(mn,{height:y,width:a,swimlanes:(l[u.id]??[]).filter(N=>N!==void 0&&Qe(N)),currentNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):Ut.createElement(gc,null))},Js=Ut.memo(fc);function Yr({width:e,height:t}){let n=$(),r=n.filters;if(n.mode===g.HELP)return G.createElement(Ze,{flexDirection:"column"},G.createElement(js,{width:e}));let{isSetup:o,hasPreferredEditor:i,hasUserName:a,userName:l,preferredEditor:u}=tn(),m=!o,p=o&&!n.hasProject;if(m)return G.createElement(Ze,{flexDirection:"column"},G.createElement(Ze,{flexDirection:"column"},G.createElement(Fn,{hideBreadCrumb:!0,filters:r}),G.createElement(Vr,{height:t,width:e,hasUserName:a,hasPreferredEditor:i,userName:l??"",preferredEditor:u??""})),G.createElement(Mn,{width:e,mode:n.mode,availableHints:n.availableHints}));if(p)return G.createElement(Ze,{flexDirection:"column"},G.createElement(Ze,{flexDirection:"column"},G.createElement(Fn,{hideBreadCrumb:!0,filters:r}),G.createElement(Ks,{height:t,width:e})),G.createElement(Mn,{width:e,mode:n.mode,availableHints:n.availableHints}));let y=Ae(v().breadCrumb??[],"BOARD");if(Ee(y)){let N=y.value.id,S=R(N).length,A=3,I=Math.floor(e/A),C=Math.floor(e/Math.max(S,1));e=Math.min(C,I)*Math.max(S,A)}return G.createElement(Ze,{flexDirection:"column"},G.createElement(Ze,{flexDirection:"column"},G.createElement(Fn,{filters:r}),G.createElement(Js,{width:e,height:t,currentNode:n.currentNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:n.viewMode,mode:n.mode})),G.createElement(Mn,{width:e,mode:n.mode,availableHints:n.availableHints}))}import vc from"readline";var Bn,Un,ye,xc=new Set([x.MoveCursorLeft,x.EraseInputWord,x.MoveCursorLeftOfWord,x.MoveCursorRight,x.MoveCursorRightOfWord,x.NavToPreviousContainer,x.NavToNextContainer,x.NavPreviousItem,x.NavNextItem,x.SetViewDense,x.SetViewWide,x.Confirm,x.Exit,x.InitCommandLine,x.ExitCommandLine,x.CaptureInput,x.EraseInput,x.EraseInputWord,x.HideHelp,x.ViewHelp,x.SetViewDense,x.SetViewWide,x.GetLastCommandFromHistory,x.GetNextCommandFromHistory,x.AutoCompleteCommand]),Zs=async e=>{if(e.ctrl&&e.name==="c")return D.exit();let{actionIndex:t,mode:n,readOnly:r}=v(),o=Go(e,n);if(!o||r&&!xc.has(o))return;let i=t[n]?.[o];if(i?.action)try{await i.action(i,e)}catch(a){logger.error(a)}},yc=()=>async function(t,n){n.name!=="escape"&&(ye&&(clearTimeout(ye),ye=void 0),await Zs(n))},hc=()=>async function(t){if(t.length===1&&t[0]===27){ye&&clearTimeout(ye),ye=setTimeout(()=>{Zs({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),ye=void 0},25);return}ye&&(clearTimeout(ye),ye=void 0)};function Qs(){Bn&&process.stdin.removeListener("keypress",Bn),Un&&process.stdin.removeListener("data",Un),Bn=yc(),Un=hc(),vc.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",Un),process.stdin.on("keypress",Bn)}Nc(`${Xr.bold("Epiq CLI")}
|
|
65
|
-
|
|
66
|
-
${Xr.dim("Boot in directory:")}
|
|
67
|
-
${Xr.cyan("$ epiq")}
|
|
68
|
-
|
|
69
|
-
`,{importMeta:import.meta,flags:{init:{type:"boolean",default:!1}}});var ea=process.stdout.columns||120,ta=process.stdout.rows||20,$n=null,bc=e=>{if(!$n){$n=Ec(e);return}$n.rerender(e)},na=()=>{bc(Cc.createElement(Yr,{width:ea,height:ta}))},Ic=()=>{let e=zt(process.cwd());return d(e)?{hasProject:!1,epiqRootDir:null,events:[]}:{hasProject:!0,epiqRootDir:e.value,events:[]}};async function Sc(){let e=cs();d(e)||et(e.value);let t=Ic();if(t.hasProject){let r=await zi();if(d(r))throw new Error(r.message);let o=yt(t.epiqRootDir);d(o)||(t.events=o.value)}let n=Ds(t.events);if(d(n))throw new Error(`Failed to boot state: ${n.message}`);w({hasProject:t.hasProject}),na(),Qs()}process.stdout.on("resize",()=>{ea=process.stdout.columns||120,ta=process.stdout.rows||20,$n&&na()});(async()=>(console.clear(),await Sc()))();
|
|
63
|
+
`,{importMeta:import.meta,flags:{init:{type:"boolean",default:!1}}});var ia=process.stdout.columns||120,sa=process.stdout.rows||20,Zr=null,wl=e=>{if(!Zr){Zr=Il(e);return}Zr.rerender(e)},aa=()=>{wl(Rl.createElement(oo,{width:ia,height:sa}))},Al=()=>{let e=ye(process.cwd());return d(e)?{hasProject:!1,epiqRootDir:null,events:[]}:{hasProject:!0,epiqRootDir:e.value,events:[]}};async function Tl(){let e=fs();d(e)||Qe(e.value);let t=Al();if(t.hasProject){await Ji();let n=St(t.epiqRootDir);d(n)||(t.events=n.value)}let r=Br({hasProject:t.hasProject,eventLog:t.events});d(r)&&logger.info(`Failed to boot state: ${r.message}`),A({hasProject:t.hasProject}),aa(),oa()}process.stdout.on("resize",()=>{ia=process.stdout.columns||120,sa=process.stdout.rows||20,Zr&&aa()});(async()=>(console.clear(),await Tl()))();
|