epiq 1.16.2 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{Index-WQDRC3CF.js → Index-3QU43YBE.js} +5 -5
- package/dist/{args-6LT6KUMQ.js → args-D7OXPSAH.js} +1 -1
- package/dist/chunk-2KWSZBVJ.js +2 -0
- package/dist/chunk-7KCKIQRO.js +116 -0
- package/dist/chunk-ITVJCUOL.js +10 -0
- package/dist/chunk-SID42K4V.js +4 -0
- package/dist/gui/main.js +128 -128
- package/dist/index.js +1 -1
- package/dist/mcp.js +1 -1
- package/dist/server-JQTYRNQ7.js +2 -0
- package/dist/{virtual-nodes-W5WJQXFR.js → virtual-nodes-XI6JN2RD.js} +1 -1
- package/package.json +6 -6
- package/readme.md +13 -48
- package/dist/chunk-5E42KQM3.js +0 -10
- package/dist/chunk-GOROXQFX.js +0 -116
- package/dist/chunk-MTEK6CI6.js +0 -2
- package/dist/server-JWNOKRFL.js +0 -2
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import{$a as Bo,A as Jt,Aa as ht,Ac as Je,B as Qt,Ba as bo,C as Zt,Ca as bt,D as Ae,Da as Rt,Dc as _,E as O,Ec as Zo,F as eo,Fa as Ro,Fc as es,G as to,Ga as yt,H as te,Ha as ze,Hb as me,I as oo,Ia as yo,Ib as Ee,J as D,Ja as Ao,K as We,Ka as Se,Kb as pe,La as Ke,M as Te,Ma as To,N as so,Na as wo,Nb as jo,O as no,Oa as At,Ob as Ho,P as pt,Pa as Tt,Pb as Uo,Q as ro,Qa as y,R as io,Ra as So,S as ao,Sa as A,Sb as zo,T as F,Ta as Eo,Tb as Ko,Ub as Xo,V as U,Va as wt,W as $,Wa as ue,Xa as xo,Ya as ce,Za as oe,_ as C,_a as Co,ab as S,b as Fe,c as le,ca as lo,d as _e,e as Ge,f as zt,fa as uo,fb as Lo,fc as qo,g as Q,ga as co,gb as No,i as Kt,ia as k,ib as ko,jb as Xe,k as $e,ka as mo,kb as Po,kc as Vo,la as po,lb as Oo,lc as St,ma as je,mb as Mo,mc as Yo,n as ee,na as He,nb as Do,o as Xt,oa as we,ob as Fo,pa as ft,pb as _o,q as mt,qa as gt,qb as Go,qc as Ve,ra as de,rc as Jo,s as qt,sa as Ue,sb as $o,ta as It,ua as fo,uc as Qo,va as go,vc as Ye,wa as vt,wb as qe,wc as Et,xa as Io,xb as Wo,y as Vt,ya as vo,yb as M,z as Yt,za as ho,zc as xt}from"./chunk-7KCKIQRO.js";import{g as Ut}from"./chunk-WUCQWBQE.js";import{b as d,c as m,d as l}from"./chunk-5RIQL7P4.js";var dn=e=>e.payload??{},Ct=e=>{let t=new Map,o={},s=new Set,n=new Set,a=new Set;for(let r of e){let{id:i,name:u}=dn(r);if(i)switch(r.action){case"create.contributor":case"create.tag":t.set(i,u??""),s.add(i),n.delete(i);break;case"rename.contributor":u!==void 0&&s.has(i)&&!n.has(i)&&t.set(i,u);break;case"tombstone.contributor":s.has(i)&&(t.set(i,We),n.add(i));break;case"restore.contributor":case"restore.tag":u!==void 0&&s.has(i)&&(t.set(i,u),n.delete(i));break;case"add.board":u!==void 0&&(t.set(i,u),a.add(i));break;case"add.swimlane":u!==void 0&&(t.set(i,u),a.add(i),o[i]=u);break;case"edit.title":u!==void 0&&a.has(i)&&(t.set(i,u),i in o&&(o[i]=u));break;default:break}}return{byId:t,lanes:o}};var un=e=>{let t=new Map,o=new Map;for(let s of e){let n=s.payload;!n?.id||!n.parent||(s.action==="move.node"&&t.set(s.id,o.get(n.id)),o.set(n.id,n.parent))}return t},os=e=>{let t=e.payload;return e.action==="tombstone.tag"||e.action==="restore.tag"?t?.id:t?.tag},cn=e=>{let t=new Set,o=new Map;for(let s of e){let n=s.payload,a=n?.id;a&&(s.action==="add.issue"&&t.add(a),n.parent&&o.set(a,n.parent))}return{issueIds:t,parentById:o}},mn=(e,{issueIds:t,parentById:o})=>{let s=e.payload;if(s?.issue)return s.issue;let n=new Set,a=s?.id;for(;a!==void 0&&!n.has(a);){if(t.has(a))return a;n.add(a),a=o.get(a)}return null},pn=new Set(["add.issue.comment","edit.issue.comment","delete.issue.comment"]),fn=e=>pn.has(e.action)?e.payload?.id??null:null,gn=new Set(["add.issue","move.node","close.issue","reopen.issue"]),In=(e,t)=>{let o=new Map;return e.map((s,n)=>{let a=t[n]??null;if(a===null)return{lane:null,laneBefore:null};let r=s.payload,i=null;if(gn.has(s.action)&&r?.id===a&&r.parent){let u=o.get(a);u!==void 0&&u!==r.parent&&(i=u),o.set(a,r.parent)}return{lane:o.get(a)??null,laneBefore:i}})},vn=e=>{let t=new Map,o=new Map;return e.map(s=>{let{id:n,name:a}=s.payload??{};if(!n)return null;s.action==="add.board"&&t.set(n,"board"),s.action==="add.swimlane"&&t.set(n,"swimlane");let r=t.get(n);if(!r)return null;let i={kind:r,name:o.get(n)??a};return(s.action==="edit.title"||s.action.startsWith("add."))&&a!==void 0&&o.set(n,a),i})},ts=90,hn=e=>{let t=e.trim().split(`
|
|
3
|
+
`)[0]?.trim()??"";return t.length>ts?`${t.slice(0,ts).trimEnd()}\u2026`:t},ss=({kind:e,name:t})=>t===void 0?e:`${e} "${t}"`,bn=(e,t,o,s)=>{let{name:n,parent:a}=e.payload??{},r=ss(t);switch(e.action){case"move.node":{if(t.kind==="board"||!a)return`Moved ${r}`;let i=o.get(a);return i?s.get(e.id)===a?`Moved ${r} within ${i}`:`Moved ${r} to ${i}`:`Moved ${r}`}case"edit.title":return n===void 0?`Renamed ${r}`:`Renamed ${r} to "${n}"`;case"delete.node":return`Deleted ${r}`;case"lock.node":return`Locked ${r}`;default:return null}},Rn=(e,t,o,s,n)=>{let a=e.payload,r=os(e),i=e.action?Zo(e.action):"";if(a?.md!==void 0){let f=hn(a.md),g=e.action==="edit.description"&&!s&&n?`${i} of ${ss(n)}`:i;return f?`${g}: ${f}`:g}if(n&&!s){let f=bn(e,n,t,o);if(f)return f}if(e.action==="move.node"&&a?.parent){let f=t.get(a.parent),g=s?`${A(s)} moved`:"Moved";return f?o.get(e.id)===a.parent?`${g} within ${f}`:`${g} to ${f}`:s?g:i}if((e.action==="close.issue"||e.action==="reopen.issue")&&s)return`${A(s)} ${i.toLowerCase()}`;if(Qt(e.action))return[i,Zt(e)].filter(Boolean).join(" ");let u=r!==void 0?t.get(r)??"":a?.assignee!==void 0?t.get(a.assignee)??"":a?.email!==void 0?a.email:a?.name!==void 0?`"${a.name}"`:"";return[i,u].filter(Boolean).join(" ")},Bt=(e,t)=>e?D(e,t.get(e)):null,yn=(e,t)=>{let o=e.payload;return{actor:Bt(e.userId,t),tag:Bt(os(e),t),assignee:Bt(o?.assignee,t)}},ns=e=>{let t=new Map,o=new Set,s=n=>{let a=new Set,r=n;for(;r&&!a.has(r);){if(o.has(r))return r;a.add(r),r=t.get(r)}return null};return e.map(n=>{let a=n.payload,r=a?.id;if(!r)return null;n.action==="add.board"&&o.add(r);let i=n.action==="close.issue"?s(r):null,u=a.parent??a.issue;return u&&t.set(r,u),i!==null?i:o.has(r)?r:s(r)})},rs=e=>An.has(e),An=new Set(["create.contributor","rename.contributor","tombstone.contributor","restore.contributor","link.contributor.user","link.contributor.email","unlink.contributor.email","connect.repo","edit.repo","disconnect.repo","create.tag","tombstone.tag","restore.tag"]),is=(e,t)=>{let o=ns(e);return e.filter((s,n)=>o[n]===t)},Tn=(e,t=new Map)=>{let o=new Map([...t,...Ct(e).byId]),s=un(e),n=cn(e),a=e.map(c=>mn(c,n)),r=vn(e),i=In(e,a),u=ns(e),f=eo(e.map(c=>te(c)));return e.flatMap((c,I)=>{let v=f[I]??null;return v===null?[]:[{id:c.id,t:v,action:c.action,label:Rn(c,o,s,a[I]??null,r[I]??null),issue:a[I]??null,target:fn(c),...i[I],board:u[I]??null,...yn(c,o)}]}).sort((c,I)=>c.t-I.t)},wn=e=>{let t=new Map;for(let s of e){if(s.issue===null||s.lane===null)continue;let n=t.get(s.issue)??[],a=n[n.length-1];(a===void 0||a.lane!==s.lane)&&(n.push({t:s.t,lane:s.lane,board:s.board}),t.set(s.issue,n))}let o=new Map;for(let[s,n]of t){let a=n[n.length-1];o.set(s,{changes:n,from:n[0].t,closedFrom:a.lane===k?a.t:null})}return o},Sn=(e,t)=>{let o=0,s=e.length;for(;o<s;){let n=o+s>>1;e[n].t<t?o=n+1:s=n}return e[o-1]},as=(e,t,o)=>{let s={};for(let[n,a]of e){if(a.from>=t||a.closedFrom!==null&&a.closedFrom<t)continue;let r=Sn(a.changes,t);r===void 0||r.lane===k||o&&r.board!==o||(s[n]=r.lane)}return s},En=e=>Ct(e).lanes,xe=null,ls=e=>{let t=Ke(e);if(xe&&xe.root===e&&xe.signature===t)return m("Timeline entries, cached",xe.index);let o=oe(e);if(l(o))return d(o.message);let s=Tn(o.value,ce(e)),n={entries:s,lanes:wn(s),laneNames:En(o.value)};return xe={root:e,signature:t,index:n},m("Timeline entries, built",n)};var ds=1e5,xn=2e4,Qe=null,us=Promise.resolve(),ms=e=>{let t=us.then(e,e);return us=t.then(()=>{},()=>{}),t},Ze=e=>{let t=Se(e);return l(t)?t:Q({repoRoot:t.value})},z=()=>{if(!Je())return{mode:"live",asOfTime:null};let{timeMode:e}=Qo();return e==="live"?{mode:"live",asOfTime:null}:{mode:"scrub",asOfTime:Qe}},cs=(e,t)=>{let o=0,s=e.length;for(;o<s;){let n=o+s>>1;e[n].t<t?o=n+1:s=n}return o},aa=async(e={})=>{let t=Ze(e.repoRoot);if(l(t))return d(t.message);let o=ls(t.value);if(l(o))return d(o.message);let s=o.value.entries,n=Date.now(),a=e.end??n,r=e.start??s[0]?.t??a;if(a<=r)return m("Empty time window",{bucketMs:0,buckets:[],capped:!1,events:[],lanesAtStart:{},laneNames:o.value.laneNames,closedLane:k,earliest:r,latest:a});let i=cs(s,r),u=cs(s,a),f=s.slice(i,u).filter(p=>!e.boardId||p.board===e.boardId||rs(p.action)),g=f.map(p=>p.t),c=Math.max(1,Math.ceil((a-r)/ds)),I=new Map;for(let p of g){let b=Math.min(ds-1,Math.floor((p-r)/c)),T=r+b*c;I.set(T,(I.get(T)??0)+1)}let v=[...I.entries()].sort(([p],[b])=>p-b).map(([p,b])=>({t:p,count:b})),h=f.length>xn;return m("Computed event timeline",{bucketMs:c,buckets:v,capped:h,events:h?[]:f,lanesAtStart:as(o.value.lanes,r,e.boardId),laneNames:o.value.laneNames,closedLane:k,earliest:r,latest:a})},ps=e=>{let t=oe(e);if(l(t))return d(t.message);let o=xt();if(l(o))return d(o.message);Qe=null;let s=wt(t.value),{fatal:n,skipped:a}=At(s);return n.length>0?d(n.map(r=>r.message).join(", ")):(Tt(a),Et({readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),m("Restored live state",!0))},Cn=(e,t)=>{Qe=null;let o=ps(e);return l(o)?d(`${t} (recovery to live also failed: ${o.message})`):d(t)},Bn=e=>ms(async()=>{let t=Ze(e.repoRoot);if(l(t))return d(t.message);let o=Co(t.value,e.targetTime);if(l(o))return d(o.message);let{appliedEvents:s,unappliedEvents:n}=o.value,a=xt();if(l(a))return a;let r=wt(s),{fatal:i,skipped:u}=At(r);return i.length>0?Cn(t.value,i.map(f=>f.message).join(", ")):(Tt(u),Et({readOnly:!0,timeMode:"peek",unappliedEvents:n,replay:null}),Qe=e.targetTime,m("Checked out historical state",{asOfTime:e.targetTime}))}),la=async e=>{let t=Ze(e.repoRoot);if(l(t))return d(t.message);let o=Bo(t.value);if(l(o))return d(o.message);let s=o.value.get(e.eventId)??null;return s===null?d("Event not found in the log"):Bn({repoRoot:e.repoRoot,targetTime:s+1})},da=(e={})=>ms(async()=>{let t=Ze(e.repoRoot);if(l(t))return d(t.message);let o=ps(t.value);return l(o)?d(o.message):m("Returned to live state",!0)});import Nn from"node:fs";var fs=new Map,Ln=3e4,gs=async e=>{let t=fs.get(e);if(t&&Date.now()-t.readAt<Ln)return{name:t.name,email:t.email};let o=await Ge({args:["config","--get-regexp","^user\\.(name|email)$"],cwd:e}),s=null,n=null;if(o.exitCode===0)for(let a of(o.stdout??"").split(`
|
|
4
|
+
`)){let r=a.indexOf(" ");if(r===-1)continue;let i=a.slice(0,r),u=a.slice(r+1);i==="user.name"&&(s=u.trim()||null),i==="user.email"&&(n=Te(u)||null)}return fs.set(e,{name:s,email:n,readAt:Date.now()}),{name:s,email:n}},Is=async e=>(await gs(e)).email,fe=async e=>(await gs(e)).name;var se=e=>{let t=$e(e??process.cwd());return l(t)?d(t.message):m("Resolved Epiq repo root",t.value)},et=null,kn=async(e,t)=>{let o=se(e);if(l(o))return o;let s=Q({repoRoot:o.value});if(l(s))return d(s.message);let n=le(o.value);if(l(n))return d(n.message);if(!(et!==null&&et.repoRoot===o.value&&et.stateBranchRoot===s.value&&Nn.existsSync(Kt(s.value)))){let c=await zo({repoRoot:o.value,stateBranchName:n.value});if(l(c))return d(c.message);let I=await Ko({repoRoot:o.value,stateBranchRoot:s.value,stateBranchName:n.value});if(l(I))return d(I.message);et={repoRoot:o.value,stateBranchRoot:s.value}}if(t?.pull??!1){let c=await _e({cwd:s.value,args:["pull","--ff-only"]});l(c)&&Fe.info(3,c.message)}let r={repoRoot:o.value,stateBranchRoot:s.value},i=ee();l(i)||mt(i.value),mt({gitEmail:await Is(o.value),gitName:await fe(o.value)});let u=Ke(s.value);if(To(s.value)===u&&Je()&&z().mode==="live")return m("Booted Epiq state, unchanged",r);let f=ue(s.value);if(l(f))return d(f.message);let g=pe(f.value.events,f.value.unreadable);return l(g)?d(g.message):(wo(s.value,u),m("Booted Epiq state",r))},W=()=>{let e=ee();return l(e)?d(e.message):e.value.userId?e.value.userName?m("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):d("Unable to retrieve user name"):d("Unable to retrieve user id")},B=()=>{let e=Ye();return l(e)?d(e.message):e},L=e=>kn(e,{pull:!1}),R=async e=>{let t=await L(e);if(l(t))return t;let o=W();if(l(o))return o;let s=B();return l(s)?s:m("Booted",{boot:t.value,actor:o.value,state:s.value})};import{ulid as Pn}from"ulid";var N=e=>{let t=B();if(l(t))return t;let o=t.value.nodes[e];return!o||o.isDeleted?d("Issue not found"):F(o)?o.readonly?d("Issue is readonly"):m("Found issue",o):d("Target must be an issue")},j=e=>{let t=B();if(l(t))return t;let o=t.value.nodes[e];return!o||o.isDeleted?d("Swimlane not found"):U(o)?o.readonly?d("Swimlane is readonly"):m("Found swimlane",o):d("Target must be a swimlane")},Ce=e=>{let t=B();if(l(t))return t;let o=t.value.nodes[e];return!o||o.isDeleted?d("Board not found"):$(o)?o.readonly?d("Board is readonly"):m("Found board",o):d("Target must be a board")};var Lt=e=>{if(!e)return;let t=B();if(l(t))return;let o=t.value.nodes[e];if(!o||!($(o)||U(o)))return;let s=o.props?.description;return s?.trim()?s:void 0},tt=e=>{let t=Lt(e);return t?{laneDescription:t}:{}},Be=e=>{let t=Lt(e);return t?{boardDescription:t}:{}},ge=e=>{let t=Lt(e);return t?{description:t}:{}},Le=({node:e,label:t,max:o,description:s,actor:n,stateBranchRoot:a,action:r="edit.description"})=>{let i=Wo(s),u=M(t,i,o);if(u)return d(u);if(z().mode!=="live")return d(`Cannot edit the ${t.toLowerCase()} while time travelling`);let f={id:e.id,ref:A(e.id),description:i};if((e.props?.description??"")===i)return m("No changes made",f);let g={id:Pn(),...y(n),action:r,payload:{id:e.id,md:i}},c=S([g],a);return l(c)?d(c.message):m(`Edited ${t.toLowerCase()}`,f)},On=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=Ce(e.boardId);return l(o)?o:Le({node:o.value,label:"Board description",max:qe("board"),description:e.description,actor:t.value.actor,stateBranchRoot:t.value.boot.stateBranchRoot})},Mn=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=j(e.swimlaneId);return l(o)?o:Le({node:o.value,label:"Swimlane description",max:qe("swimlane"),description:e.description,actor:t.value.actor,stateBranchRoot:t.value.boot.stateBranchRoot})},Dn=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=de(e.goal);return o?Le({node:{id:o.id,props:{description:o.description}},label:"Goal description",action:"edit.goal.description",max:qe("goal"),description:e.description,actor:t.value.actor,stateBranchRoot:t.value.boot.stateBranchRoot}):d(`No goal called or with the id "${e.goal}"`)};import{ulid as Ne}from"ulid";var kt=e=>({id:e.id,name:C(e.name),color:fo(e)}),Ie=e=>{let t=Ue(e);return t?{goal:kt(t)}:{}},vs=e=>({...kt(e),...ht(e.id),...e.description&&{description:e.description},...vt(e.id)&&{closed:!0}}),hs=()=>bt().map(vs),Fn=async(e={})=>{let t=await L(e.repoRoot);return l(t)?t:m("Listed goals",bt().map(o=>({...vs(o),boards:Io(o.id).map(s=>({id:s,ref:A(s)}))})))},ot=e=>ho(e).map(t=>({...kt(t),...ht(t.id),members:vo(t.id,e).map(o=>({id:o.id,done:bo(o)}))})),Nt=(e,t)=>l(e)||!t||!vt(t)?e:m(`${e.message}: all its tickets are closed, so the goal is closed`,e.value),st=(e,t,o)=>{let s=S(t,e);return l(s)?d(s.message):m("Saved",o)},_n=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=N(e.issueId);if(l(o))return o;let s=o.value,n={id:s.id,ref:A(s.id)},a;if(e.goal!==null){let u=de(e.goal);if(!u){let f=await bs({repoRoot:e.repoRoot,name:e.goal,issueId:s.id});return l(f)?f:Nt(m(`Created goal "${f.value.name}"`,n),f.value.id)}a=u.id}let r=It(s,a);if(r.length===0)return m("No changes made",n);let i=y(t.value.actor);return Nt(st(t.value.boot.stateBranchRoot,r.map(u=>({id:Ne(),...i,...u})),n),a)},bs=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=gt(e.name),s=Rt(o);if(s)return d(s);let n=y(t.value.actor),a=Ne(),r=[{id:a,...n,action:"create.goal",payload:{id:a,name:o}}];if(e.issueId){let i=N(e.issueId);if(l(i))return i;let u=i.value;for(let f of It(u,a))r.push({id:Ne(),...n,...f})}return Nt(st(t.value.boot.stateBranchRoot,r,{id:a,name:o}),a)},Gn=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=ft(e.goalId);if(!o)return d("Goal not found");let s=gt(e.name);if(s===o.name)return m("No changes made",{id:o.id,name:s});let n=Rt(s,o.id);return n?d(n):st(t.value.boot.stateBranchRoot,[{id:Ne(),...y(t.value.actor),action:"rename.goal",payload:{id:o.id,name:s}}],{id:o.id,name:s})},$n=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=ft(e.goalId);return o?st(t.value.boot.stateBranchRoot,[{id:Ne(),...y(t.value.actor),action:"tombstone.goal",payload:{id:o.id}}],{id:o.id,name:o.name}):d("Goal not found")};import{ulid as Wn}from"ulid";var nt=e=>{let t=mo(e);return t.length>0?{rules:t}:{}},jn=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=j(e.swimlaneId);if(l(o))return o;let s=o.value,n=po(s,e.rule,e.on);if(l(n))return n;let a={id:s.id,ref:A(s.id),rule:e.rule};if(!n.value)return m(n.message,a);let r=S([{id:Wn(),...y(t.value.actor),...n.value}],t.value.boot.stateBranchRoot);return l(r)?d(r.message):m(e.on?"Added lane rule":"Removed lane rule",a)};import Hn from"node:fs";import Un from"node:path";import{ulid as Pt}from"ulid";var zn=e=>{if(e.filePath)try{return m("Read attachment file",{data:Hn.readFileSync(e.filePath),name:e.name??Un.basename(e.filePath)})}catch(t){return d(`Unable to read ${e.filePath}: ${t instanceof Error?t.message:String(t)}`)}return e.dataBase64?m("Decoded attachment data",{data:Buffer.from(e.dataBase64,"base64"),name:e.name??"image"}):d("Provide either filePath or dataBase64")},rt=()=>{let e=ee();return l(e)?yt:e.value.attachmentMaxKb??yt},Kn=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=N(e.issueId);if(l(o))return o;let s=zn(e);if(l(s))return s;let n=yo(t.value.boot.stateBranchRoot,s.value.data,rt());if(l(n))return n;let a=C(s.value.name).trim()||"image",r=Pt(),i={id:Pt(),...y(t.value.actor),action:"add.issue.attachment",payload:{id:r,issue:e.issueId,author:t.value.actor.userId,hash:n.value.hash,ext:n.value.ext,name:a,bytes:n.value.bytes}},u=S([i],t.value.boot.stateBranchRoot);if(l(u))return d(u.message);let f=ze(n.value.hash,n.value.ext);return m("Added issue attachment",{id:r,issueId:e.issueId,fileName:f,bytes:n.value.bytes,markdown:Ro(a,f)})},Xn=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=t.value.state.eventLog.find(i=>i.action==="add.issue.attachment"&&i.payload.id===e.attachmentId);if(!o)return d("Unable to resolve attachment");if(o.payload.author!==t.value.actor.userId)return d("You can only delete your own attachments");let s=N(o.payload.issue);if(l(s))return s;if(t.value.state.eventLog.some(i=>i.action==="delete.issue.attachment"&&i.payload.id===e.attachmentId))return m("Attachment already deleted",{id:e.attachmentId,issueId:o.payload.issue});let a={id:Pt(),...y(t.value.actor),action:"delete.issue.attachment",payload:{id:e.attachmentId,issue:o.payload.issue}},r=S([a],t.value.boot.stateBranchRoot);return l(r)?d(r.message):m("Deleted issue attachment",{id:e.attachmentId,issueId:o.payload.issue})},qn=async e=>{let t=await L(e.repoRoot);return l(t)?t:Ao(t.value.stateBranchRoot,e.fileName,rt())};var Vn=e=>{switch(e.action){case"add.issue":case"move.node":case"close.issue":case"reopen.issue":return e.payload.parent;default:return null}},Ot=(e,t)=>{let o=[];for(let s of e){let n=Vn(s);if(n===null||n===o.at(-1)?.laneId)continue;let a=te(s);o.push({laneId:n,enteredAt:a===null?t:Ae(a)})}return o},Rs=(e,t)=>e.reduce((o,s)=>{let n=te(s);return n===null?o:Math.max(o,Ae(n))},t),ke=(e,t)=>Ot(e,t).at(-1)?.enteredAt??t;var ne=e=>uo(e).map(t=>D(t.id,t.name)),Yn=e=>_.getCommentsByIssue(e).sort((t,o)=>t.id<o.id?-1:t.id>o.id?1:0).map(t=>({id:t.id,author:oo(t.authorId,_.getContributor(t.authorId)?.name),createdAt:O(t.id),body:t.md})),re=e=>co(e).map(({id:t,name:o})=>D(t,o)),Jn=3,Qn=3,Zn=400,er=200,tr=" \u2026 [cut: call epiq_issue_get with allComments: true to read the rest]",or=e=>{let t=e.split(`
|
|
5
|
+
`).slice(0,Qn).join(`
|
|
6
|
+
`).slice(0,Zn);return e.length-t.length<er?e:`${t}${tr}`},ys=(e,t=!1)=>{let o=Yn(e),s=o.length-Jn;return t||s<=0?{comments:o}:{comments:o.map((n,a)=>a<s?{...n,body:or(n.body)}:n),olderComments:`The first ${s} show their first lines only: pass allComments to read them whole`}};var sr=async(e={})=>{let t=await L(e.repoRoot);if(l(t))return t;let o=B();return l(o)?o:m("Retrieved Epiq state",{root:t.value.repoRoot,stateBranchRoot:t.value.stateBranchRoot,nodes:o.value.nodes,rootNodeId:o.value.rootNodeId,contextNode:o.value.contextNode,selectedIndex:o.value.selectedIndex,eventLog:o.value.eventLog})},nr=365*24*60*60*1e3,rr=e=>{let t=B();if(l(t))return t;let o=t.value.nodes[e];return m("Issue description",o&&F(o)&&!o.isDeleted?o.props.description??"":"")},Mt=()=>{let e=B();if(l(e))return e;let t=z(),o=t.mode!=="live",s=Object.values(e.value.nodes),n=s.filter(p=>$(p)&&!p.isDeleted),a=Date.now()-nr,r=new Map,i=new Map;for(let p of s)if(!p.isDeleted){if(U(p)&&p.parentNodeId){let b=r.get(p.parentNodeId)??[];b.push(p),r.set(p.parentNodeId,b)}if(F(p)&&p.parentNodeId){if(p.parentNodeId===k&&O(p.id)<a&&!Ue(p))continue;let b=i.get(p.parentNodeId)??[];b.push(p),i.set(p.parentNodeId,b)}}let u=new Set;for(let p of i.values())for(let b of p)u.add(b.id);let f=ee();if(l(f))return f;let g={},c=_.getCommentsGroupedByIssue();for(let p of s.filter(F))p.isDeleted||!u.has(p.id)||(g[p.id]=(c.get(p.id)??[]).map(b=>{let T=_.getContributor(b.authorId);return{id:b.id,issueId:b.issue,body:b.md,author:D(b.authorId,T?.name),createdAt:O(b.id)}}));let I=new Map;for(let p of e.value.eventLog)p.action==="add.issue.attachment"&&I.set(p.payload.id,p.payload.author);let v={},h=_.getAttachmentsGroupedByIssue();for(let p of s.filter(F))p.isDeleted||!u.has(p.id)||(v[p.id]=(h.get(p.id)??[]).map(b=>({id:b.id,issueId:b.issue,name:b.name,fileName:ze(b.hash,b.ext),bytes:b.bytes,createdAt:O(b.id),canDelete:I.get(b.id)===f.value.userId})));return m("Retrieved Epiq GUI state",{boards:n.sort((p,b)=>p.rank.localeCompare(b.rank)).map(p=>({id:p.id,ref:A(p.id),title:p.title,readonly:!!p.readonly||o,...ge(p.id),goals:ot(p.id),swimlanes:(r.get(p.id)??[]).sort((b,T)=>b.rank.localeCompare(T.rank)).map(b=>({id:b.id,title:b.title,readonly:!!b.readonly||o,issues:(i.get(b.id)??[]).sort((T,Y)=>T.rank.localeCompare(Y.rank)).map(T=>({id:T.id,ref:A(T.id),title:C(T.title),description:T.props.description??"",createdAt:O(T.id),enteredLaneAt:ke(T.log??[],O(T.id)),lastEventAt:Rs(T.log??[],O(T.id)),readonly:!!T.readonly||o,tags:ne(T),assignees:re(T),...Ie(T),parentNodeId:T.parentNodeId,isClosed:T.parentNodeId===k,boardIds:we(T)})),parentNodeId:b.parentNodeId,...ge(b.id),...nt(b),countsDone:He(b.id),doneByName:je(b)}))})),tags:_.getTags().map(p=>({...p,...D(p.id,p.name)})),goals:hs(),contributors:Object.values(e.value.contributors).map(p=>({...p,...D(p.id,p.name)})),user:{id:f.value.userId??"",name:f.value.userName??"",color:qt(f.value.userName??"")},commentsByIssueId:g,attachmentsByIssueId:v,attachmentMaxKb:rt(),timeTravel:t})},As=null,ir=e=>{if(e===As)return;let t=lo({root:e});if(l(t)){Fe.info(t.message);return}As=e},ar=async(e={})=>{if(z().mode!=="live")return Mt();let t=await L(e.repoRoot);return l(t)?t:(ir(t.value.repoRoot),Mt())},lr=async(e={})=>{jo();let t=se(e.repoRoot);if(l(t))return d("Sync failed");let o=W();if(l(o))return o;let s=await Xo({cwd:t.value,ownEventFileName:So(o.value)});return l(s)?(Uo(s.message),s):s.value.offline?s:(Ho(),m("Synced",s.value))};import{ulid as K}from"ulid";var Pe=e=>{let t=[...new Set([...e.issueIds??[],...e.issueId?[e.issueId]:[]])];return t.length?m("Resolved targets",t):d("Provide issueId or issueIds")},ve=(e,t)=>{let o=t.done.length,s=`${e} ${o} issue${o===1?"":"s"}`+(t.failed.length?`, ${t.failed.length} failed`:"");return o?m(s,t):d(`${s}: ${t.failed.map(n=>`${n.ref} ${n.reason}`).join("; ")}`)},Oe=(e,t)=>{let o={done:[],failed:[]};for(let s of e){let n=t(s);l(n)?o.failed.push({id:s,ref:A(s),reason:n.message}):o.done.push({id:s,ref:A(s)})}return o};var dr=async e=>{let t=await L(e.repoRoot);if(l(t))return t;let o=B();if(l(o))return o;let s=e.idOrRef.trim();if(!s)return d("Provide an issue id or ref");let n=Object.values(o.value.nodes).filter(F).filter(u=>!u.isDeleted),a=n.find(u=>u.id===s),r=a?[a]:n.filter(u=>Eo(u.id,s));if(r.length===0)return d(`No issue matches "${s}"`);if(r.length>1)return d(`"${s}" matches ${r.length} issues: ${r.map(u=>`${A(u.id)} (${C(u.title)})`).join(", ")}. Use a full ref or id.`);let i=r[0];return m("Found issue",{id:i.id,ref:A(i.id),title:C(i.title),description:i.props.description??"",createdAt:O(i.id),enteredLaneAt:ke(i.log??[],O(i.id)),parentNodeId:i.parentNodeId,isClosed:i.parentNodeId===k,boardIds:we(i),readonly:!!i.readonly,tags:ne(i),assignees:re(i),...Ie(i),...ys(i.id,e.allComments),...tt(i.parentNodeId)})},Ss=(e,t)=>e.trim().toLowerCase()===t.trim().toLowerCase();async function ur(e){let t=await L(e.repoRoot);if(l(t))return t;let o=B();if(l(o))return o;let s=o.value.nodes,n=e.query?.trim().toLowerCase(),a=Object.values(s).filter(F).filter(i=>!i.isDeleted).filter(i=>e.includeClosed||i.parentNodeId!==k).filter(i=>e.boardId?(i.parentNodeId?s[i.parentNodeId]:void 0)?.parentNodeId===e.boardId:!0).filter(i=>!e.swimlaneId||i.parentNodeId===e.swimlaneId).filter(i=>!e.tag||ne(i).some(u=>Ss(u.name,e.tag))).filter(i=>!e.assignee||re(i).some(u=>Ss(u.name,e.assignee))).filter(i=>!n||i.title.toLowerCase().includes(n)||(i.props.description??"").toLowerCase().includes(n)),r=i=>C((i.parentNodeId?s[i.parentNodeId]?.title:void 0)??"");return e.brief?m("Listed issues",a.map(i=>({id:i.id,ref:A(i.id),title:C(i.title),swimlane:r(i),swimlaneId:i.parentNodeId,tags:ne(i).map(u=>u.name),assignees:re(i).map(u=>u.name),...Ie(i)}))):m("Listed issues",a.map(i=>({id:i.id,ref:A(i.id),title:C(i.title),description:i.props.description??"",createdAt:O(i.id),enteredLaneAt:ke(i.log??[],O(i.id)),parentNodeId:i.parentNodeId,isClosed:i.parentNodeId===k,boardIds:we(i),readonly:!!i.readonly,tags:ne(i),assignees:re(i),...Ie(i)})))}var cr=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=C(e.title);if(!o)return d("Issue title cannot be empty");let s=e.description??"",n=M("Issue title",o,300)??M("Issue description",s,2e4);if(n)return d(n);if((e.tagNames?.length??0)>20)return d(`Cannot set more than ${20} tags at once`);if((e.assigneeNames?.length??0)>20)return d(`Cannot set more than ${20} assignees at once`);let a=j(e.parentId);if(l(a))return a;let r=Ee(e.parentId,t.value.actor,t.value.boot.stateBranchRoot);if(l(r))return r;let i=qo({name:o,parent:e.parentId,user:t.value.actor,rank:r.value});if(l(i))return i;let u=[...i.value],f=u.find(v=>v.action==="add.issue")?.payload.id;if(!f)return d("Unable to determine created issue id");s&&u.push({id:K(),...y(t.value.actor),action:"edit.description",payload:{id:f,md:s}});let g=[];for(let v of e.tagNames??[]){let h=C(v).trim();if(!h||g.some(Y=>Y.name===h))continue;let p=M("Tag name",h,60);if(p)return d(p);let b=_.findTagByName(h),T=b?.id??K();b||u.push({id:K(),...y(t.value.actor),action:"create.tag",payload:{id:T,name:h}}),u.push({id:K(),...y(t.value.actor),action:"add.issue.tag",payload:{id:f,tag:T}}),g.push({id:T,name:h})}let c=[];for(let v of e.assigneeNames??[]){let h=C(v).trim();if(!h||c.some(Y=>Y.name===h))continue;let p=M("Assignee name",h,80);if(p)return d(p);let b=Object.values(t.value.state.contributors).find(Y=>Y.name===h),T=b?.id??K();b||u.push({id:K(),...y(t.value.actor),action:"create.contributor",payload:{id:T,name:h}}),u.push({id:K(),...y(t.value.actor),action:"add.issue.assignee",payload:{id:f,assignee:T}}),c.push({id:T,name:h})}let I=S(u,t.value.boot.stateBranchRoot);return l(I)?d(I.message):m("Created issue",{id:f,ref:A(f),title:o,parentId:e.parentId,tags:g,assignees:c,...tt(e.parentId),...Be(t.value.state.nodes[e.parentId]?.parentNodeId)})},mr=(e,t,o)=>{let s=N(e);if(l(s))return s;let n=me(k,e,{at:"end"},t,o);if(l(n))return n;let a={id:K(),...y(t),action:"close.issue",payload:{id:e,parent:k,rank:n.value}},r=S([a],o);return l(r)?d(r.message):m("Closed issue",{id:e,ref:A(e)})};async function pr(e){let t=await L(e.repoRoot);if(l(t))return t;let o=W();if(l(o))return o;let s=Pe(e);if(l(s))return s;let n=a=>mr(a,o.value,t.value.stateBranchRoot);return e.issueIds?ve("Closed",Oe(s.value,n)):n(s.value[0])}var fr=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=t.value.state.nodes[e.issueId];if(!o||o.isDeleted)return d("Issue not found");if(!F(o))return d("Target must be an issue");if(o.parentNodeId!==k)return d("Issue is not closed");let s=Vo(o);if(!s)return d("Unable to resolve previous parent from issue history");if(s===k)return d("Previous parent resolves to closed swimlane");let n=j(s);if(l(n))return n;let a=n.value,r=me(a.id,o.id,{at:"end"},t.value.actor,t.value.boot.stateBranchRoot);if(l(r))return r;let i={id:K(),...y(t.value.actor),action:"reopen.issue",payload:{id:o.id,parent:a.id,rank:r.value}},u=S([i],t.value.boot.stateBranchRoot);return l(u)?d(u.message):m("Reopened issue",{id:o.id,ref:A(o.id),parentId:a.id})},gr=(e,t,o,s)=>{let n=N(e);if(l(n))return n;let a=j(t.parentId);if(l(a))return a;let r=me(t.parentId,e,t.position??{at:"end"},o,s);if(l(r))return r;let i={id:K(),...y(o),action:"move.node",payload:{id:e,parent:t.parentId,rank:r.value}},u=S([i],s);return l(u)?d(u.message):m("Moved issue",{id:e,ref:A(e),parentId:t.parentId})};async function Ir(e){let t=se(e.repoRoot);if(l(t))return t;let o=W();if(l(o))return o;let s=Q({repoRoot:t.value});if(l(s))return s;let n=ue(s.value);if(l(n))return n;let a=pe(n.value.events,n.value.unreadable);if(l(a))return a;let r=Pe(e);if(l(r))return r;let i=(()=>{let g=B();if(l(g))return()=>({});let{nodes:c}=g.value,I=p=>p?c[p]?.parentNodeId:void 0,v=I(e.parentId),h=r.value.some(p=>I(c[p]?.parentNodeId)!==v);return()=>({...tt(e.parentId),...h?Be(v):{}})})(),u=g=>gr(g,e,o.value,s.value);if(!e.issueIds){let g=u(r.value[0]);return l(g)?g:m(g.message,{...g.value,...i()})}let f=ve("Moved",Oe(r.value,u));return l(f)?f:m(f.message,{...f.value,...i()})}var vr=e=>{let t=B();if(l(t))return t;let o=t.value.nodes[e];return o?m("Read issue history",(o.log??[]).map(s=>({id:s.id,t:O(s.id),action:s.action,label:es(s),...s.action==="move.node"?{parentId:s.payload.parent}:{},actor:D(s.userId,t.value.contributors[s.userId]?.name)}))):d("Issue not found")},hr=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=N(e.issueId);return l(o)?o:Le({node:o.value,label:"Issue description",max:2e4,description:e.description,actor:t.value.actor,stateBranchRoot:t.value.boot.stateBranchRoot})},br=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=N(e.issueId);if(l(o))return o;let s=o.value,n=C(e.title);if(!n.trim())return d("Issue title cannot be empty");let a=M("Issue title",n,300);if(a)return d(a);if(s.title===n)return m("No changes made",{id:e.issueId,ref:A(e.issueId),title:n});let r={id:K(),...y(t.value.actor),action:"edit.title",payload:{id:e.issueId,name:n}},i=S([r],t.value.boot.stateBranchRoot);return l(i)?d(i.message):m("Edited issue title",{id:e.issueId,ref:A(e.issueId),title:n})};import{ulid as Z}from"ulid";var Rr=async(e={})=>{let t=await L(e.repoRoot);if(l(t))return t;let o=B();if(l(o))return o;let s=Object.values(o.value.nodes).filter(n=>n.context==="BOARD"&&!n.isDeleted).map(n=>({id:n.id,ref:A(n.id),title:n.title,parentId:n.parentNodeId,readonly:!!n.readonly,...ge(n.id),goals:ot(n.id)}));return m("Listed boards",s)},yr=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=t.value.state.nodes[t.value.state.rootNodeId];if(!o)return d("Workspace not found");if(z().mode!=="live")return d("Cannot add a board while time travelling");let s=C(e.title);if(!s.trim())return d("Board title cannot be empty");let n=M("Board title",s,300);if(n)return d(n);let a=Ee(o.id,t.value.actor,t.value.boot.stateBranchRoot);if(l(a))return a;let r=Z(),i={id:Z(),...y(t.value.actor),action:"add.board",payload:{id:r,name:s,parent:o.id,rank:a.value}},u=S([i],t.value.boot.stateBranchRoot);return l(u)?d(u.message):m("Created board",{id:r,ref:A(r),title:s})},Ar=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=t.value.state.nodes[e.boardId];if(!o||o.isDeleted)return d("Board not found");if(!$(o))return d("Edit target must be a board");if(o.readonly)return d("Cannot edit readonly board");if(z().mode!=="live")return d("Cannot rename a board while time travelling");let s=C(e.title);if(!s.trim())return d("Board title cannot be empty");let n=M("Board title",s,300);if(n)return d(n);if(o.title===s)return m("No changes made",{id:e.boardId,ref:A(e.boardId),title:s});let a={id:Z(),...y(t.value.actor),action:"edit.title",payload:{id:e.boardId,name:s}},r=S([a],t.value.boot.stateBranchRoot);return l(r)?d(r.message):m("Edited board title",{id:e.boardId,ref:A(e.boardId),title:s})},Tr=async(e={})=>{let t=await L(e.repoRoot);if(l(t))return t;let o=B();if(l(o))return o;let s=Object.values(o.value.nodes).filter(n=>n.context==="SWIMLANE"&&!n.isDeleted).filter(n=>!e.boardId||n.parentNodeId===e.boardId).map(n=>({id:n.id,title:n.title,boardId:n.parentNodeId,isClosed:n.id===k,readonly:!!n.readonly,...ge(n.id),...U(n)?nt(n):{},countsDone:He(n.id),doneByName:U(n)&&je(n)}));return m("Listed swimlanes",s)},wr=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=Ce(e.boardId);if(l(o))return o;if(z().mode!=="live")return d("Cannot add a swimlane while time travelling");let s=C(e.title);if(!s.trim())return d("Swimlane title cannot be empty");let n=M("Swimlane title",s,300);if(n)return d(n);let a=Ee(e.boardId,t.value.actor,t.value.boot.stateBranchRoot);if(l(a))return a;let r=Z(),i={id:Z(),...y(t.value.actor),action:"add.swimlane",payload:{id:r,name:s,parent:e.boardId,rank:a.value}},u=S([i],t.value.boot.stateBranchRoot);return l(u)?d(u.message):m("Created swimlane",{id:r,ref:A(r),title:s,boardId:e.boardId})},Sr=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=j(e.swimlaneId);if(l(o))return o;let s=o.value,n=C(e.title);if(!n.trim())return d("Swimlane title cannot be empty");let a=M("Swimlane title",n,300);if(a)return d(a);if(s.title===n)return m("No changes made",{id:e.swimlaneId,ref:A(e.swimlaneId),title:n});let r={id:Z(),...y(t.value.actor),action:"edit.title",payload:{id:e.swimlaneId,name:n}},i=S([r],t.value.boot.stateBranchRoot);return l(i)?d(i.message):m("Edited swimlane title",{id:e.swimlaneId,ref:A(e.swimlaneId),title:n})},Er=async e=>{let t=se(e.repoRoot);if(l(t))return t;let o=W();if(l(o))return o;let s=Q({repoRoot:t.value});if(l(s))return s;let n=ue(s.value);if(l(n))return n;let a=pe(n.value.events,n.value.unreadable);if(l(a))return a;let r=j(e.swimlaneId);if(l(r))return r;let i=Ce(e.boardId);if(l(i))return i;let u=me(e.boardId,e.swimlaneId,e.position??{at:"end"},o.value,s.value);if(l(u))return u;let f={id:Z(),...y(o.value),action:"move.node",payload:{id:e.swimlaneId,parent:e.boardId,rank:u.value}},g=S([f],s.value);return l(g)?d(g.message):m("Moved swimlane",{id:e.swimlaneId,ref:A(e.swimlaneId),boardId:e.boardId})},xr=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=j(e.swimlaneId);if(l(o))return o;let s={id:Z(),...y(t.value.actor),action:"delete.node",payload:{id:e.swimlaneId}},n=S([s],t.value.boot.stateBranchRoot);return l(n)?d(n.message):m("Deleted swimlane",{id:e.swimlaneId,ref:A(e.swimlaneId)})};var V=e=>({path:e.path,sha:e.shas[e.shas.length-1]??""});var Cr=e=>{let t=e.lastIndexOf("/");return t===-1?".":e.slice(0,t)},xs=({commits:e,patch:t})=>{let o=e.map(r=>r.time),n=t.files.map(r=>({...V(r),changed:r.addedCount+r.removed})).reduce((r,i)=>r===null||i.changed>r.changed?i:r,null),a=t.insertions+t.deletions;return{commits:e.length,authors:[...new Set(e.map(r=>r.author))].sort(),firstCommitAt:o.length?Math.min(...o):null,lastCommitAt:o.length?Math.max(...o):null,files:t.files.length,filesAdded:t.files.filter(r=>r.status==="added").length,filesModified:t.files.filter(r=>r.status==="modified").length,filesDeleted:t.files.filter(r=>r.status==="deleted").length,binaryFiles:t.files.filter(r=>r.binary).length,directories:new Set(t.files.map(r=>Cr(r.path))).size,insertions:t.insertions,deletions:t.deletions,net:t.insertions-t.deletions,largestFile:n,concentration:n&&a>0?n.changed/a:0,selfChurn:t.selfChurn,truncated:t.truncated}};var P={line:["//"],block:[["/*","*/"]]},H={line:["#"],block:[]},_t={line:["--"],block:[]},he={line:[],block:[["<!--","-->"]]},Br={line:[],block:[]},w=(e,t)=>({name:e,comment:t}),it=w("TypeScript",P),at=w("JavaScript",P),Cs={ts:it,tsx:it,mts:it,cts:it,js:at,jsx:at,mjs:at,cjs:at,py:w("Python",{line:["#"],block:[['"""','"""']]}),rb:w("Ruby",{line:["#"],block:[["=begin","=end"]]}),go:w("Go",P),rs:w("Rust",P),java:w("Java",P),kt:w("Kotlin",P),swift:w("Swift",P),c:w("C",P),h:w("C",P),cc:w("C++",P),cpp:w("C++",P),hpp:w("C++",P),cs:w("C#",P),php:w("PHP",P),scala:w("Scala",P),dart:w("Dart",P),lua:w("Lua",_t),hs:w("Haskell",_t),sql:w("SQL",_t),ex:w("Elixir",H),exs:w("Elixir",H),pl:w("Perl",H),r:w("R",H),jl:w("Julia",H),sh:w("Shell",H),bash:w("Shell",H),zsh:w("Shell",H),vue:w("Vue",he),svelte:w("Svelte",he),html:w("HTML",he),xml:w("XML",he),md:w("Markdown",he),mdx:w("Markdown",he),css:w("CSS",{line:[],block:[["/*","*/"]]}),scss:w("CSS",P),less:w("CSS",P),yml:w("YAML",H),yaml:w("YAML",H),toml:w("TOML",H),ini:w("INI",H),json:w("JSON",Br)},Lr="Other",Bs=e=>{let t=e.slice(e.lastIndexOf("/")+1),o=t.lastIndexOf(".");return o<=0?"":t.slice(o+1).toLowerCase()},ae=e=>Cs[Bs(e)]?.name??Lr,Me=e=>Cs[Bs(e)]?.comment??null,Nr=[/\.(test|spec)\.[a-z0-9]+$/i,/(^|\/)test_[^/]+\.py$/,/_test\.[a-z0-9]+$/i,/(^|\/)conftest\.py$/,/Tests?\.(java|kt|cs|scala)$/],kr=/(^|\/)(tests?|__tests__|spec|specs|e2e|src\/test|features)\//i,be=e=>kr.test(e)||Nr.some(t=>t.test(e)),Pr=/(^|\/)(package-lock\.json|npm-shrinkwrap\.json|yarn\.lock|pnpm-lock\.yaml|Cargo\.lock|go\.sum|poetry\.lock|Gemfile\.lock|composer\.lock)$/,Or=/(^|\/)(node_modules|dist|build|out|target|vendor|coverage|\.next|__snapshots__)\//,Mr=/(\.min\.(js|css)|\.map|\.snap|\.pb\.go|_pb2\.py)$/,X=e=>Pr.test(e)||Or.test(e)||Mr.test(e),Ls=e=>/(^|\/)(package\.json|go\.mod|Cargo\.toml|requirements[^/]*\.txt|pyproject\.toml|Gemfile|composer\.json|pom\.xml|build\.gradle(\.kts)?)$/.test(e),Ns=e=>/(^|\/)\.github\/workflows\//.test(e)||/(^|\/)(Dockerfile|docker-compose[^/]*\.ya?ml|Makefile|Jenkinsfile|\.gitlab-ci\.yml)$/.test(e)||/\.tf$/.test(e),ks=e=>/\.(md|mdx|rst|txt)$/i.test(e)||/(^|\/)docs?\//i.test(e),Dr=/\b(it|test|describe|context|suite)\.skip\b|\bx(it|describe|test)\s*\(|@pytest\.mark\.skip|@unittest\.skip|\bt\.Skip\s*\(|@(Ignore|Disabled)\b/,Fr=/\b(it|test|describe|context|suite)\.only\b|\bf(it|describe|test)\s*\(/,Ps=e=>Dr.test(e),Os=e=>Fr.test(e);var Ms=/\b(TODO|FIXME|HACK|XXX)\b/,_r=/[;{}]\s*$|^\s*(const|let|var|function|def|class|if|for|while|return|import|export|await|print)\b.*[=(]/,Gt=(e,t)=>{let o=e.trim();return o===""?"blank":t&&(t.line.some(s=>o.startsWith(s))||t.block.some(([s])=>o.startsWith(s))||t.block.some(([s])=>s==="/*")&&(o.startsWith("*")||o.startsWith("*/")))?"comment":"code"},Gr=(e,t)=>{let o=e.trim();for(let s of[...t.line,...t.block.flat(),"*"])if(o.startsWith(s)){o=o.slice(s.length).trim();break}return o},Ds=({patch:e,repoShareByLanguage:t})=>{let o=new Map,s=0,n=0,a=0,r=0,i=0,u=0;for(let g of e.files){if(g.binary||X(g.path))continue;let c=Me(g.path);if(!c||c.line.length===0&&c.block.length===0)continue;let I=ae(g.path),v=o.get(I)??{comment:0,code:0};for(let{text:h}of g.added){let p=Gt(h,c);if(Ms.test(h)&&r++,p==="blank"){a++;continue}if(p==="comment"){s++,v.comment++,c&&_r.test(Gr(h,c))&&u++;continue}n++,v.code++}for(let{text:h}of g.removedLines)Ms.test(h)&&i++;o.set(I,v)}let f=s+n;return{byLanguage:[...o.entries()].map(([g,c])=>({name:g,commentLines:c.comment,codeLines:c.code,share:c.comment+c.code===0?0:c.comment/(c.comment+c.code),repoShare:t?.get(g)??null})).sort((g,c)=>c.commentLines+c.codeLines-(g.commentLines+g.codeLines)),commentLines:s,codeLines:n,blankLines:a,share:f===0?0:s/f,todoLinesAdded:r,todoLinesRemoved:i,commentedOutCodeLines:u}};var $r=/\bconsole\.(log|debug|dir)\s*\(|\bdebugger\b|^\s*print\s*\(|\bfmt\.Print(ln|f)?\s*\(|\bSystem\.out\.print|\bdbg!\s*\(/,lt=6,$t=10,Wr=e=>{let t=0;for(let o of e){if(o.trim()===""||o.startsWith(" "))continue;let s=o.length-o.trimStart().length;s>0&&(t===0||s<t)&&(t=s)}return Math.min(Math.max(t,2),8)},jr=(e,t)=>{let o=e.length-e.trimStart().length;if(o===0)return 0;let s=e.slice(0,o).split(" ").length-1;return s>0?s:Math.floor(o/t)},Hr=e=>{if(e.length<lt*2)return 0;let t=new Map,o=new Array(e.length).fill(!1);for(let s=0;s+lt<=e.length;s++){let n=e.slice(s,s+lt);if(n.some(i=>i.text.length<3))continue;let a=n.map(i=>i.text).join(`
|
|
7
|
+
`),r=t.get(a);if(r===void 0){t.set(a,{...n[0],at:s});continue}if(r.file!==n[0]?.file)for(let i=0;i<lt;i++)o[r.at+i]=!0,o[s+i]=!0}return o.filter(Boolean).length},Fs=({patch:e})=>{let t=[],o=[],s=[],n=!1,a=0,r=0,i=null,u=[];for(let[f,g]of e.files.entries()){if(X(g.path)&&t.push(V(g)),Ls(g.path)&&o.push(V(g)),Ns(g.path)&&s.push(V(g)),ks(g.path)&&(n=!0),g.binary||X(g.path))continue;let c=g.added.map(h=>h.text),I=Wr(c),v=g.status!=="deleted";for(let h of c){$r.test(h)&&a++;let p=jr(h,I);p>r&&(r=p,i=V(g)),v&&u.push({text:h.trim(),file:f})}u.push({text:" ",file:f})}return{generatedPaths:t.slice(0,$t),dependencyManifests:o.slice(0,$t),buildOrCiPaths:s.slice(0,$t),docsTouched:n,debugPrintLinesAdded:a,maxIndentLevels:r,deepestFile:i,duplicatedLines:Hr(u)}};var _s=({patch:e,languagesBefore:t})=>{let o=new Map,s=0;for(let r of e.files){if(r.binary)continue;let i=r.addedCount+r.removed;if(X(r.path)){s+=i;continue}let u=ae(r.path),f=o.get(u)??{name:u,added:0,removed:0,addedInTests:0,share:0};f.added+=r.addedCount,f.removed+=r.removed,be(r.path)&&(f.addedInTests+=r.addedCount),o.set(u,f)}let n=[...o.values()].reduce((r,i)=>r+i.added+i.removed,0),a=[...o.values()].map(r=>({...r,share:n===0?0:(r.added+r.removed)/n})).sort((r,i)=>i.added+i.removed-(r.added+r.removed));return{languages:a,introduced:t===null?[]:a.filter(r=>!t.has(r.name)).map(r=>r.name),generatedLines:s}};var Ur=200,Wt=2e5,zr=5e4,Kr=25,Gs=64*1024*1024,jt="",Xr=/^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/,qr=/^diff --git a\/(.+) b\/\1$/,$s=(e,t)=>e==="/dev/null"?null:e.startsWith(t)?e.slice(2):e,Ws=(e,t)=>e===null?"added":t===null?"deleted":"modified",Vr=()=>({byPath:new Map,insertions:0,deletions:0,selfChurn:0,retainedLines:0}),Yr=(e,t)=>{let o=e.byPath,s="",n=null,a=null,r=null,i=!1,u=0,f=(c,I)=>I==="modified"&&c==="added"?"added":I,g=(c,I)=>{let v=o.get(c);if(v)return v.entry.status=f(v.entry.status,I),v.entry.shas.includes(s)||v.entry.shas.push(s),v;let p={entry:{path:c,status:I,binary:!1,added:[],addedCount:0,removed:0,removedLines:[],shas:[s]},pendingByText:new Map};return o.set(c,p),p};for(let c of t.split(`
|
|
8
|
+
`)){if(c.startsWith(jt)){s=c.slice(jt.length).trim(),n=null,a=null,r=null,i=!1;continue}if(c.startsWith("diff --git ")){n=null,r=null,i=!0,a=qr.exec(c)?.[1]??null;continue}if(i&&c.startsWith("Binary files ")&&a){let[,v=""]=/^Binary files (.*) differ$/.exec(c)??[],[h="",p=""]=v.split(" and ");n=g(a,Ws(h==="/dev/null"?null:h,p==="/dev/null"?null:p)),n.entry.binary=!0;continue}if(i&&c.startsWith("--- ")){r=$s(c.slice(4),"a/");continue}if(i&&c.startsWith("+++ ")){let v=$s(c.slice(4),"b/"),h=v??r??a;h&&(n=g(h,Ws(r,v)));continue}let I=Xr.exec(c);if(I){u=Number(I[1]),i=!1;continue}if(n){if(c.startsWith("+")){let v=c.slice(1);e.insertions++,n.entry.addedCount++,e.retainedLines<Wt&&(n.entry.added.push({sha:s,line:u,text:v}),e.retainedLines++),n.pendingByText.size<zr&&n.pendingByText.set(v,(n.pendingByText.get(v)??0)+1),u++;continue}if(c.startsWith("-")){let v=c.slice(1);e.deletions++,n.entry.removed++,e.retainedLines<Wt&&(n.entry.removedLines.push({sha:s,line:0,text:v}),e.retainedLines++);let h=n.pendingByText.get(v)??0;h>0&&v.trim().length>2&&(e.selfChurn++,n.pendingByText.set(v,h-1))}}}},Jr=e=>({files:[...e.byPath.values()].map(t=>t.entry),insertions:e.insertions,deletions:e.deletions,selfChurn:e.selfChurn,retainedLines:e.retainedLines});var js=async({repoRoot:e,shas:t,cwdOf:o=()=>e})=>{if(t.length===0)return m("No commits to scan",{files:[],insertions:0,deletions:0,selfChurn:0,scannedCommits:0,truncated:!1});let s=t.slice(0,Ur).reverse(),n=Vr(),a=0,r=0,i=!1,u=[];for(let g of s){let c=o(g),I=u[u.length-1];I&&I.cwd===c&&I.shas.length<Kr?I.shas.push(g):u.push({cwd:c,shas:[g]})}for(let{cwd:g,shas:c}of u){let I=await _e({cwd:g,maxOutput:Math.max(1,Gs-a),keepPartial:!0,args:["-c","core.quotePath=false","show","--unified=0","--no-renames","--no-color",`--format=${jt}%H`,...c]});if(l(I)){if(g!==e)continue;return d(I.message)}if(Yr(n,I.value.stdout),a+=I.value.stdout.length,r+=c.length,I.value.truncated||a>Gs){i=!0;break}}let f=Jr(n);return m("Scanned ticket patch",{files:f.files,insertions:f.insertions,deletions:f.deletions,selfChurn:f.selfChurn,scannedCommits:r,truncated:i||r<t.length||f.retainedLines>=Wt})};var Qr=40,Zr=/^\d{6} blob ([0-9a-f]{40})\t(.+)$/,Hs=async({repoRoot:e,sha:t})=>{let o=await Ge({cwd:e,args:["-c","core.quotePath=false","ls-tree","-r",`${t}~1`]});if(o.exitCode!==0)return null;let s=new Set,n=new Map;for(let g of o.stdout.split(`
|
|
9
|
+
`)){let c=Zr.exec(g);if(!c)continue;let[,I="",v=""]=c;if(X(v))continue;let h=ae(v);if(s.add(h),be(v)||!Me(v))continue;let p=n.get(h)??[];p.length<Qr&&(p.push({blob:I,path:v}),n.set(h,p))}let a=[...n.values()].flat(),r=await zt(a.map(g=>g.blob),e);if(l(r))return{languages:s,commentShareByLanguage:new Map};let i=r.value,u=new Map;for(let{blob:g,path:c}of a){let I=i.get(g);if(I===void 0)continue;let v=Me(c),h=ae(c),p=u.get(h)??{comment:0,code:0};for(let b of I.split(`
|
|
10
|
+
`)){let T=Gt(b,v);T==="comment"&&p.comment++,T==="code"&&p.code++}u.set(h,p)}let f=new Map;for(let[g,c]of u){let I=c.comment+c.code;I>0&&f.set(g,c.comment/I)}return{languages:s,commentShareByLanguage:f}};var Us=({patch:e})=>{let t=0,o=0,s=[],n=[],a=0,r=0;for(let i of e.files)if(!(i.binary||X(i.path))&&be(i.path)){t+=i.addedCount,o+=i.removed,i.status==="added"&&s.push(V(i)),i.status==="deleted"&&n.push(V(i));for(let{text:u}of i.added)Ps(u)&&a++,Os(u)&&r++}return{testLinesAdded:t,testLinesRemoved:o,addedTestFiles:s,deletedTestFiles:n,skippedTestLinesAdded:a,focusedTestLinesAdded:r}};var ei=e=>e.reduce((t,o)=>t===null||o.time<t.time?o:t,null),zs=async({repoRoot:e,ref:t,commits:o})=>{let s=await Lo(e);if(l(s))return d(s.message);let n=No(s.value),a=new Map(o.map(c=>[c.sha,c.repo])),r=c=>n(a.get(c))??e,i=await js({repoRoot:e,shas:o.map(c=>c.sha),cwdOf:r});if(l(i))return d(i.message);let u=i.value,f=ei(o),g=f?await Hs({repoRoot:r(f.sha),sha:f.sha}):null;return m("Derived issue stats",{ref:t,shape:xs({commits:o,patch:u}),languages:_s({patch:u,languagesBefore:g?.languages??null}),tests:Us({patch:u}),comments:Ds({patch:u,repoShareByLanguage:g?.commentShareByLanguage??null}),flags:Fs({patch:u})})};var dt=e=>{if(l(e))return e;let t=Ye(),o=l(t)?{}:t.value.emailLinks,s=l(t)?{}:t.value.contributors,n=io(o),a=e.value.map(r=>({...r,authorIdentity:Yo({authorName:r.author,authorEmail:r.authorEmail,owners:n,registry:s})}));return m(e.message,a)};var oi=32,De=new Map;var si=(e,t)=>{if(De.set(e,t),De.size>oi){let o=De.keys().next();o.done||De.delete(o.value)}return t},Ks=e=>{let t=dt(e);return l(t)?d(t.message):m("Matched commits by ref",t.value.map(o=>({sha:o.sha,...o.repo?{repo:o.repo}:{},time:o.time,author:o.authorIdentity?.resolved?o.authorIdentity.name:o.author,subject:o.subject})))},Xs=e=>{let t=$e(e??process.cwd());return l(t)?d(t.message):t},qs=async(e,t,o)=>{let s=[e,t,o.map(r=>`${r.sha}:${r.author}`).join(",")].join(" "),n=De.get(s);if(n)return m("Derived issue stats",n);let a=await zs({repoRoot:e,ref:t,commits:o});return l(a)?d(a.message):m("Derived issue stats",si(s,a.value))},Oc=async(e={idOrRef:""})=>{let t=e.idOrRef.trim();if(!t)return d("idOrRef must not be empty");let o=t.length>7?A(t):t.toUpperCase(),s=Xs(e.repoRoot);if(l(s))return s;let n=Ks(await ko({repoRoot:s.value,ref:o,end:e.end}));return l(n)?n:qs(s.value,o,n.value)},Vs=async e=>{let t=Xs(e.repoRoot);if(l(t))return t;let o=Ks(await Xe({repoRoot:t.value,refs:e.refs,end:e.end}));return l(o)?o:qs(t.value,e.label,o.value)};var Ys=e=>{let t=B();if(l(t))return t;let o=de(e);return o?m("Found goal",{id:o.id,refs:go(o.id).map(s=>A(s.id))}):d(`No goal called or with the id "${e}"`)},Js=async e=>{let t=Ys(e.goal);return l(t)?t:Vs({repoRoot:e.repoRoot,label:t.value.id,refs:t.value.refs,end:e.end})},ni=async e=>{let t=Ys(e.goal);return l(t)?t:$o(e.repoRoot,dt(await Xe({repoRoot:e.repoRoot,refs:t.value.refs,end:e.end})))},ri=async e=>{let t=await L(e.repoRoot);return l(t)?t:Js({repoRoot:t.value.repoRoot,goal:e.goal})};import{ulid as Re}from"ulid";async function ii(e){let t=await L(e.repoRoot);if(l(t))return t;let o=W();if(l(o))return o;let s=Pe(e);if(l(s))return s;let n=C(e.tagName).trim();if(!n)return d("Tag name cannot be empty");let a=M("Tag name",n,60);if(a)return d(a);let r=Oe(s.value,N);if(!e.issueIds&&r.failed[0])return d(r.failed[0].reason);if(r.done.length===0)return d(ve("Tagged",r).message);let i=_.findTagByName(n),u=i?.id??Re(),f=[...i?[]:[{id:Re(),...y(o.value),action:"create.tag",payload:{id:u,name:n}}],...r.done.map(({id:v})=>({id:Re(),...y(o.value),action:"add.issue.tag",payload:{id:v,tag:u}}))],g=S(f,t.value.stateBranchRoot);if(l(g))return d(g.message);let c={id:u,name:n};if(!e.issueIds)return m("Added issue tag",{...r.done[0],tag:c});let I=ve("Tagged",r);return l(I)?I:m(I.message,{...I.value,tag:c})}var ai=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=t.value.state.tags[e.tagId];if(!o)return d("Tag not found");if(o.tombstoned)return d("Tag is already deleted");let s=[{id:Re(),...y(t.value.actor),action:"tombstone.tag",payload:{id:e.tagId}}],n=S(s,t.value.boot.stateBranchRoot);return l(n)?d(n.message):m("Deleted tag",{id:o.id,name:o.name})},li=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=t.value.state.tags[e.tagId];if(!o)return d("Tag not found");if(!o.tombstoned)return d("Tag is not deleted");if(_.findTagByName(o.name))return d(`Cannot restore: another tag is already named "${o.name}"`);let s=[{id:Re(),...y(t.value.actor),action:"restore.tag",payload:{id:e.tagId,name:o.name}}],n=S(s,t.value.boot.stateBranchRoot);return l(n)?d(n.message):m("Restored tag",{id:o.id,name:o.name})},di=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=N(e.issueId);if(l(o))return o;if(!t.value.state.tags[e.tagId])return d("Tag not found");let s={id:Re(),...y(t.value.actor),action:"remove.issue.tag",payload:{id:e.issueId,tag:e.tagId}},n=S([s],t.value.boot.stateBranchRoot);return l(n)?d(n.message):m("Removed issue tag",{id:e.issueId,ref:A(e.issueId),tagId:e.tagId})};import{ulid as J}from"ulid";var ui=async e=>{let t=Ut(e.name,"name");if(l(t))return d(t.message);let o=await R(e.repoRoot);if(l(o))return o;let s=o.value.actor,n=!!o.value.state.contributors[s.userId];if(!n){let r=S([{id:J(),...y(s),action:"create.contributor",payload:{id:s.userId,name:s.userName}}],o.value.boot.stateBranchRoot);if(l(r))return d(r.message)}let a=Object.values(o.value.state.nodes).filter(r=>$(r)&&!r.isDeleted).flatMap(r=>{let{boardDescription:i}=Be(r.id);return i?[{id:r.id,title:C(r.title),boardDescription:i}]:[]});return m(`Assumed ${s.userName}`,{...s,registered:!n,...a.length?{boards:a}:{}})},Qs=async(e,t)=>{let o=ce(e).get(t);return o===void 0?void 0:{id:t,name:o}},ci=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=N(e.issueId);if(l(o))return o;let s=e.self?t.value.actor.userId:e.assigneeId;if(s){let v=t.value.state.contributors[s],h=v?void 0:await Qs(t.value.boot.stateBranchRoot,s);if(!v&&!h)return d("Unknown assignee id");let p=v??h,b=[...v?[]:[{id:J(),...y(t.value.actor),action:"create.contributor",payload:{id:p.id,name:p.name}}],{id:J(),...y(t.value.actor),action:"add.issue.assignee",payload:{id:e.issueId,assignee:p.id}}],T=S(b,t.value.boot.stateBranchRoot);return l(T)?d(T.message):m("Added issue assignee",{id:e.issueId,ref:A(e.issueId),assignee:{id:p.id,name:p.name}})}let n=C(e.assigneeName??"").trim();if(!n)return d("Provide assigneeId, self or assigneeName");let a=M("Assignee name",n,80);if(a)return d(a);let r=St({events:t.value.state.eventLog??[],registry:t.value.state.contributors,logFileNames:ce(t.value.boot.stateBranchRoot)}).filter(v=>v.name===n);if(r.length>1)return d(`"${n}" matches ${r.length} contributors (${r.map(({id:v})=>v).join(", ")}). Assign by assigneeId to choose.`);let i=r[0];if(!i&&!e.createUnlinked)return d(`No contributor named "${n}". Assign by id, or pass createUnlinked to add them as an external assignee.`);let u=i?.id??J(),f=i?.name??n,c=[...!!t.value.state.contributors[u]?[]:[{id:J(),...y(t.value.actor),action:"create.contributor",payload:{id:u,name:f}}],{id:J(),...y(t.value.actor),action:"add.issue.assignee",payload:{id:e.issueId,assignee:u}}],I=S(c,t.value.boot.stateBranchRoot);return l(I)?d(I.message):m("Added issue assignee",{id:e.issueId,ref:A(e.issueId),assignee:{id:u,name:f}})},mi=async e=>{let t=await R(e.repoRoot);if(l(t))return t;if(!t.value.state.contributors[e.contributorId])return d("Contributor not found");if(await Qs(t.value.boot.stateBranchRoot,e.contributorId))return d("Cannot remove a contributor who has authored events \u2014 their name appears throughout the log");let n=[{id:J(),...y(t.value.actor),action:"tombstone.contributor",payload:{id:e.contributorId}}],a=S(n,t.value.boot.stateBranchRoot);return l(a)?d(a.message):m("Tombstoned contributor",{id:e.contributorId,name:We})},pi=async(e,t)=>{let o=oe(e);if(l(o))return;let s;for(let n of o.value){if(n.action!=="create.contributor")continue;let a=n.payload;a.id===t&&a.name&&(s=a.name)}return s},fi=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=t.value.state.contributors[e.contributorId];if(!o)return d("Contributor not found");if(!o.tombstoned)return d("Contributor is not tombstoned");let s=await pi(t.value.boot.stateBranchRoot,e.contributorId);if(!s)return d("Cannot restore this contributor \u2014 no original name found in the event log");let n=[{id:J(),...y(t.value.actor),action:"restore.contributor",payload:{id:e.contributorId,name:s}}],a=S(n,t.value.boot.stateBranchRoot);return l(a)?d(a.message):m("Restored contributor",{id:e.contributorId,name:s})},gi=async(e={})=>{let t=await R(e.repoRoot);if(l(t))return t;let o=oe(t.value.boot.stateBranchRoot);if(l(o))return d(o.message);let s=e.boardId?is(o.value,e.boardId):o.value,n=new Set,a=xo(t.value.boot.stateBranchRoot);if(l(a))return d(a.message);for(let u of a.value)u.userId&&n.add(u.userId);let r=t.value.state.contributors,i=St({events:s,registry:r,logFileNames:ce(t.value.boot.stateBranchRoot)}).map(({id:u,name:f,isExternal:g})=>({...D(u,f),isSelf:u===t.value.actor.userId,isExternal:g,isRemoved:r[u]?.tombstoned===!0,hasAuthoredAnywhere:n.has(u)}));return m("Listed board contributors",i)},Ii=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=N(e.issueId);if(l(o))return o;if(!t.value.state.contributors[e.assigneeId])return d("Assignee not found");let s={id:J(),...y(t.value.actor),action:"remove.issue.assignee",payload:{id:e.issueId,assignee:e.assigneeId}},n=S([s],t.value.boot.stateBranchRoot);return l(n)?d(n.message):m("Removed issue assignee",{id:e.issueId,ref:A(e.issueId),assigneeId:e.assigneeId})};import{ulid as ct}from"ulid";var vi=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=N(e.issueId);if(l(o))return o;let s=e.body.trim();if(!s)return d("Comment cannot be empty");if(s.length>4e3)return d(`Comment cannot exceed ${4e3} characters (got ${s.length})`);let n=ct(),a={id:ct(),...y(t.value.actor),action:"add.issue.comment",payload:{id:n,issue:e.issueId,md:s,author:t.value.actor.userId}},r=S([a],t.value.boot.stateBranchRoot);return l(r)?d(r.message):m("Added issue comment",{id:n,issueId:e.issueId,body:s})},hi=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=t.value.state.eventLog.find(i=>i.action==="add.issue.comment"&&i.payload.id===e.commentId);if(!o)return d("Unable to resolve comment");if(o.payload.author!==t.value.actor.userId)return d("You can only delete your own comments");let s=N(o.payload.issue);if(l(s))return s;if(t.value.state.eventLog.some(i=>i.action==="delete.issue.comment"&&i.payload.id===e.commentId))return m("Comment already deleted",{id:e.commentId,issueId:o.payload.issue});let a={id:ct(),...y(t.value.actor),action:"delete.issue.comment",payload:{id:e.commentId,issue:o.payload.issue}},r=S([a],t.value.boot.stateBranchRoot);return l(r)?d(r.message):m("Deleted issue comment",{id:e.commentId,issueId:o.payload.issue})},bi=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=t.value.state.eventLog.find(u=>u.action==="add.issue.comment"&&u.payload.id===e.commentId);if(!o)return d("Unable to resolve comment");if(o.payload.author!==t.value.actor.userId)return d("You can only edit your own comments");let s=N(o.payload.issue);if(l(s))return s;if(t.value.state.eventLog.some(u=>u.action==="delete.issue.comment"&&u.payload.id===e.commentId))return d("Comment was deleted");let a=e.body.trim();if(!a)return d("Comment cannot be empty");if(a.length>4e3)return d(`Comment cannot exceed ${4e3} characters (got ${a.length})`);let r={id:ct(),...y(t.value.actor),action:"edit.issue.comment",payload:{id:e.commentId,issue:o.payload.issue,md:a}},i=S([r],t.value.boot.stateBranchRoot);return l(i)?d(i.message):m("Edited issue comment",{id:e.commentId,issueId:o.payload.issue,body:a})};import{ulid as Zs}from"ulid";var Ri=async e=>{let t=await R(e.repoRoot);if(l(t))return t;if(!so(e.email))return d(`Not an email address: ${e.email}`);let o=Te(e.email),s=e.contributorId??t.value.actor.userId;if(!t.value.state.contributors[s])return d(`Unknown contributor: ${s}`);let n=pt(t.value.state.emailLinks,o);if(n.includes(s))return m(`${o} is already yours`,{contributor:s,email:o,contested:n.filter(r=>r!==s)});let a=S([{id:Zs(),action:"link.contributor.email",payload:{contributor:s,email:o},userId:t.value.actor.userId}],t.value.boot.stateBranchRoot);return l(a)?d(a.message):m(n.length>0?`Claimed ${o}, but somebody else claims it too, so it now resolves to neither of you`:`Claimed ${o}`,{contributor:s,email:o,contested:n})},yi=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let o=Te(e.email),s=e.contributorId??t.value.actor.userId,n=t.value.state.emailLinks[no(o,s)];if(!n||n.tombstoned)return d(`No such link: ${o} to ${s}`);if(!ao(t.value.actor.userId,n))return d("Only whoever made a claim, or the contributor it names, may undo it");let a=S([{id:Zs(),action:"unlink.contributor.email",payload:{contributor:s,email:o},userId:t.value.actor.userId}],t.value.boot.stateBranchRoot);return l(a)?d(a.message):m(`Unclaimed ${o}`,{contributor:s,email:o})},Ai=async(e={})=>{let t=await L(e.repoRoot);if(l(t))return t;let o=B();if(l(o))return o;let{emailLinks:s,contributors:n}=o.value,a=new Map;for(let c of Object.values(s)){if(c.tombstoned)continue;let I=a.get(c.email)??new Set;I.add(c.contributor),a.set(c.email,I)}let r=[...a.entries()].map(([c,I])=>({email:c,contested:I.size>1,claimants:[...I].map(v=>D(v,n[v]?.name))})).sort((c,I)=>c.email.localeCompare(I.email)),i=W(),u=l(i)?[]:ro(s,i.value.userId),f=Xt().gitEmail,g=f?pt(s,f).filter(c=>l(i)||c!==i.value.userId):[];return m("Listed contributor emails",{emails:r,mine:u,git:f?{email:f,linkedToMe:u.includes(f),heldByOthers:g.map(c=>D(c,n[c]?.name))}:null})},Ti=async(e={})=>{let t=await R(e.repoRoot);if(l(t))return t;let{userId:o,userName:s}=t.value.actor,n=le(t.value.boot.repoRoot),a=await Ve({repoRoot:t.value.boot.repoRoot,stateBranch:l(n)?void 0:n.value,names:[s,await fe(t.value.boot.repoRoot)],links:t.value.state.emailLinks});if(l(a))return a;let r=Jo(a.value),i=r.filter(u=>u.looksLikeYours);return m(r.length===0?"No unclaimed addresses in this history":`${r.length} unclaimed address(es) in this history, ${i.length>0?`${i.length} of which look like yours`:"none obviously yours"}. Show them to the user and link only the ones they confirm; each is a permanent event that replicates to every clone.`,{contributor:o,candidates:r,likely:i.length})};var Ht=e=>{let t=Po(e);return l(t)?d(t.message):m("Listed repos",{repos:t.value,claimedBytes:_o(e),limit:Yt,allowLocal:Vt()})},wi=async(e={})=>{let t=Se(e.repoRoot);return l(t)?d(t.message):Ht(t.value)},Si=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let{repoRoot:o}=t.value.boot,s=await Go({repoRoot:o,actorId:t.value.actor.userId,url:e.url,branches:e.branches,since:e.since,label:e.label,mode:e.previewOnly?"preview":e.confirm?"confirm":"auto"});if(l(s))return d(s.message);let n=Ht(o);return l(n)?d(n.message):m(s.message,{...n.value,...s.value.kind==="preview"?{preview:s.value.preview}:{}})},Ei=async e=>{let t=await R(e.repoRoot);if(l(t))return t;let{repoRoot:o}=t.value.boot,s=Oo({repoRoot:o,actorId:t.value.actor.userId,repo:e.repo});if(l(s))return d(s.message);let n=Ht(o);return l(n)?d(n.message):m(s.message,n.value)},xi=e=>(Fo("repo"in e?e.repo:Jt(e.url.trim())),m("Cancelled",null)),Ci=async(e,t={},o=2e4)=>{if(l(e))return e;let s,n=await Promise.race([en(t),new Promise(a=>{s=setTimeout(()=>a(null),o)})]);return clearTimeout(s),n===null?m(`${e.message} \xB7 still fetching other repos; epiq_repo_list shows how they stand`,e.value):l(n)||n.value.length===0?e:m([e.message,Do(n.value)].filter(Boolean).join(" \xB7 "),{...e.value,repos:n.value})},en=async(e={})=>{let t=Se(e.repoRoot);return l(t)?d(t.message):Mo({repoRoot:t.value,minIntervalMs:e.minIntervalMs})};var tn=(e,t)=>{let o=0,s=0,n=null;for(let a of e){if(a.userId!==t)continue;a.action==="add.issue"&&o++,a.action==="add.issue.comment"&&s++;let r=to(a.id);if(l(r))continue;let i=r.value.getTime();(n===null||i<n)&&(n=i)}return{tickets:o,comments:s,joinedAt:n}};var Bi=async(e={})=>{let t=await R(e.repoRoot);if(l(t))return t;let{userId:o,userName:s}=t.value.actor,n=tn(t.value.state.eventLog,o),a=le(t.value.boot.repoRoot),r=await Ve({repoRoot:t.value.boot.repoRoot,stateBranch:l(a)?void 0:a.value,names:[s,await fe(t.value.boot.repoRoot)],links:t.value.state.emailLinks}),i=l(r)?[]:r.value.filter(u=>u.claimedBy.length===1&&u.claimedBy[0]===o);return m("Derived personal stats",{...n,scanned:!l(r),commits:i.reduce((u,f)=>u+f.commits,0),claimedEmails:i.length})};var on=e=>{if(e.length===0)return null;let t=Math.floor(e.length/2);return e.length%2===0?(e[t-1]+e[t])/2:e[t]};var Li=8,Ni=(e,t)=>{let o=new Date(e);return o.setHours(0,0,0,0),o.setDate(o.getDate()-(o.getDay()+6)%7),Array.from({length:t},(s,n)=>{let a=new Date(o);return a.setDate(o.getDate()-7*(t-1-n)),a.getTime()})},ki=e=>on([...e].sort((t,o)=>t-o)),sn=({boardId:e,lanes:t,formerLaneIds:o=[],tickets:s,now:n})=>{let a=new Map(t.map((E,x)=>[E.id,x])),r=new Set(o),i=E=>E!=null&&(a.has(E)||r.has(E)),f=s.map(E=>({ticket:E,visits:Ot(E.log,E.createdAt)})).filter(({visits:E})=>E.some(x=>i(x.laneId))),g=E=>{let x=te(E);return x===null?null:Math.min(Ae(x,n),n)},c=E=>{let x=E.flatMap(q=>{let G=a.get(q.laneId);return G===void 0?[]:[G]});return x.some((q,G)=>G>0&&q<x[G-1])},I=f.flatMap(({ticket:E,visits:x})=>{let q=E.log.findLast(ye=>ye.action==="close.issue");if(!q||i(E.parentNodeId))return[];let G=g(q),rn=x.at(-2)?.laneId;if(G===null||!i(rn))return[];let an=x.slice(0,-1).flatMap((ye,ln)=>i(ye.laneId)?[{laneId:ye.laneId,ms:x[ln+1].enteredAt-ye.enteredAt}]:[]);return[{closedAt:G,leadTime:G-E.createdAt,sentBack:c(x),stays:an}]}),v=Ni(n,Li),h=v[0],p=I.filter(E=>E.closedAt>=h),b=v.map((E,x)=>{let q=v[x+1]??1/0;return{t:E,closed:p.filter(G=>G.closedAt>=E&&G.closedAt<q).length}}),T=new Map;for(let{stays:E}of p)for(let{laneId:x,ms:q}of E)T.set(x,(T.get(x)??0)+q);let Y=t.reduce((E,x)=>E+(T.get(x.id)??0),0),nn=t.flatMap(E=>{let x=T.get(E.id)??0;return x<=0?[]:[{laneId:E.id,title:E.title,meanMs:x/p.length,share:x/Y}]});return{boardId:e,throughput:b,filed:f.filter(({ticket:E,visits:x})=>E.createdAt>=h&&i(x[0]?.laneId)).length,closed:p.length,medianLeadTimeMs:ki(p.map(E=>E.leadTime)),sentBackShare:p.length===0?null:p.filter(E=>E.sentBack).length/p.length,laneTime:nn}};var Pi=e=>{let t=B();if(l(t))return t;let o=Object.values(t.value.nodes),s=o.find(r=>r.id===e.boardId);if(!s||s.isDeleted||!$(s))return d("Board not found");let n=o.filter(r=>U(r)&&r.parentNodeId===s.id),a=n.filter(r=>!r.isDeleted).sort((r,i)=>r.rank.localeCompare(i.rank));return m("Derived board overview",sn({boardId:s.id,lanes:a,formerLaneIds:n.filter(r=>r.isDeleted).map(r=>r.id),tickets:o.filter(r=>!r.isDeleted).filter(F).map(r=>({id:r.id,parentNodeId:r.parentNodeId,log:r.log??[],createdAt:O(r.id)})),now:Date.now()}))};export{Ot as a,ms as b,z as c,aa as d,Bn as e,la as f,da as g,Is as h,fe as i,B as j,L as k,On as l,Mn as m,Dn as n,Fn as o,_n as p,bs as q,Gn as r,$n as s,jn as t,Kn as u,Xn as v,qn as w,sr as x,rr as y,Mt as z,ar as A,lr as B,dr as C,ur as D,cr as E,pr as F,fr as G,Ir as H,vr as I,hr as J,br as K,Rr as L,yr as M,Ar as N,Tr as O,wr as P,Sr as Q,Er as R,xr as S,dt as T,Oc as U,Js as V,ni as W,ri as X,ii as Y,ai as Z,li as _,di as $,ui as aa,ci as ba,mi as ca,fi as da,gi as ea,Ii as fa,vi as ga,hi as ha,bi as ia,Ri as ja,yi as ka,Ai as la,Ti as ma,Bi as na,wi as oa,Si as pa,Ei as qa,xi as ra,Ci as sa,en as ta,on as ua,Pi as va};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
var n=e=>{let r=Number(e.split(".")[0]);return Number.isFinite(r)&&r>=22?null:[`epiq needs Node 22 or newer; this is Node ${e}.`,"Install a newer Node, or use the release binary, which carries its own."].join(`
|
|
3
|
+
`)},o=()=>{let e=n(process.versions.node);e!==null&&(process.stderr.write(`${e}
|
|
4
|
+
`),process.exit(1))};export{o as a};
|