kadence 0.1.4 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +66 -0
- package/README.md +189 -163
- package/dist/chunks/chunk-JA73FCAN.js +172 -0
- package/dist/chunks/{ui-WFLRVGUH.js → ui-ILZI767Q.js} +1 -1
- package/dist/cli.js +47 -92
- package/package.json +6 -5
- package/dist/chunks/chunk-BUHXYOZ4.js +0 -90
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kadence",
|
|
3
|
-
"version": "0.1
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"description": "Your team and your AI agents work from the same context: tasks, their full history and time as plain files in your git repository",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"engines": {
|
|
@@ -44,15 +44,16 @@
|
|
|
44
44
|
"tui",
|
|
45
45
|
"project-management",
|
|
46
46
|
"ai-agents",
|
|
47
|
+
"shared-context",
|
|
47
48
|
"event-sourcing",
|
|
48
49
|
"offline"
|
|
49
50
|
],
|
|
50
51
|
"repository": {
|
|
51
52
|
"type": "git",
|
|
52
|
-
"url": "git+https://github.com/bogutskiandriy/
|
|
53
|
+
"url": "git+https://github.com/bogutskiandriy/kadence.git"
|
|
53
54
|
},
|
|
54
|
-
"homepage": "https://github.com/bogutskiandriy/
|
|
55
|
+
"homepage": "https://github.com/bogutskiandriy/kadence#readme",
|
|
55
56
|
"bugs": {
|
|
56
|
-
"url": "https://github.com/bogutskiandriy/
|
|
57
|
+
"url": "https://github.com/bogutskiandriy/kadence/issues"
|
|
57
58
|
}
|
|
58
59
|
}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
var U=["backlog","todo","in_progress","blocked","in_review","done","cancelled"],Ot="done",Ie="cancelled",D=["task","bug","story","epic"],R=["low","normal","high","urgent"];function ne(e){let n=[...e].sort((l,p)=>l.id<p.id?-1:l.id>p.id?1:0),r=new Map,t=new Map,s=new Map,i=null,o=[],a=[];for(let l of n){if(l.type==="template.saved"){let p=typeof l.data?.name=="string"?l.data.name:null;p!==null&&s.set(p,{name:p,fields:l.data?.fields??{},author:l.actor});continue}if(l.type==="board.configured"){let p=l.data?.statuses;if(Array.isArray(p)){let m=p.filter(g=>typeof g=="string"&&g.length>0);m.length>0&&(i=m)}continue}if(l.type==="template.deleted"){let p=typeof l.data?.name=="string"?l.data.name:null;p!==null&&s.delete(p);continue}q(l,r,t,o,a)}let d=a.length>0,u=a;for(;u.length>0;){let l=[];for(let p of u)q(p,r,t,o,l);if(l.length===u.length){u=l;break}u=l}if(d)for(let l of r.values())l.history.sort((p,m)=>p.id<m.id?-1:1);let c=[...r.values()].sort((l,p)=>l.id<p.id?-1:1);c.forEach((l,p)=>{l.label=`KAD-${p+1}`});let f=new Set(c.map(l=>l.id));for(let l of c)l.parent!==null&&!f.has(l.parent)&&(l.parent=null),l.blockedBy=l.blockedBy.filter(p=>f.has(p));return{tasks:c,sprints:[...t.values()].sort((l,p)=>l.id<p.id?-1:1),statuses:i??[...U],orphanStatuses:[...new Set(c.map(l=>l.status).filter(l=>!(i??U).includes(l)))].sort(),templates:[...s.values()].sort((l,p)=>l.name.localeCompare(p.name)),cycles:_e(c),pending:u,rejected:o}}function q(e,n,r,t,s){let i=e.data??{};if(e.type==="task.created")return n.has(e.entity)||n.set(e.entity,{id:e.entity,label:"",title:typeof i.title=="string"?i.title:"(untitled)",description:x(i.description),type:Q(i.type),priority:ee(i.priority),status:"backlog",labels:te(i.labels),assignee:x(i.assignee),reporter:e.actor,sprint:null,parent:x(i.parent),blockedBy:[],due:x(i.due),comments:[],estimate:typeof i.estimate=="number"?i.estimate:null,loggedHours:0,createdAt:e.ts,updatedAt:e.ts,history:[]}),K(n.get(e.entity),e),!0;if(e.type==="sprint.created")return r.has(e.entity)||r.set(e.entity,{id:e.entity,name:typeof i.name=="string"?i.name:"(untitled)",description:x(i.description),startDate:x(i.startDate),endDate:x(i.endDate),status:"planned",closedBy:null,taskIds:[]}),!0;if(e.type.startsWith("sprint.")){let a=r.get(e.entity);if(a===void 0)return s.push(e),!1;if(e.type==="sprint.started")return a.status==="planned"&&(a.status="active"),!0;if(e.type==="sprint.updated")return a.status==="closed"?(t.push(e),!0):(typeof i.name=="string"&&(a.name=i.name),i.description!==void 0&&(a.description=x(i.description)),i.startDate!==void 0&&(a.startDate=x(i.startDate)),i.endDate!==void 0&&(a.endDate=x(i.endDate)),!0);if(e.type==="sprint.closed")return a.closedBy===null?(a.status="closed",a.closedBy=e.id):t.push(e),!0;if(e.type==="sprint.cancelled")return a.status==="planned"?a.status="cancelled":t.push(e),!0;if(e.type==="sprint.task_added"){if(a.status==="closed")return t.push(e),!0;let d=typeof i.task=="string"?i.task:null;if(d===null)return!0;let u=n.get(d);return u===void 0?(s.push(e),!1):(u.sprint=a.id,a.taskIds.includes(d)||a.taskIds.push(d),K(u,e),!0)}return!0}let o=n.get(e.entity);if(o===void 0)return s.push(e),!1;if(e.type==="task.deleted")return n.delete(e.entity),!0;switch(e.type){case"task.moved":{let a=i.to;typeof a=="string"&&a.length>0&&(o.status=a);break}case"task.cancelled":o.status=Ie;break;case"task.reopened":o.status="in_progress";break;case"task.assigned":o.assignee=x(i.assignee);break;case"task.updated":typeof i.title=="string"&&(o.title=i.title),i.description!==void 0&&(o.description=x(i.description)),i.type!==void 0&&(o.type=Q(i.type)),i.priority!==void 0&&(o.priority=ee(i.priority)),i.labels!==void 0&&(o.labels=te(i.labels)),i.due!==void 0&&(o.due=x(i.due)),typeof i.estimate=="number"&&(o.estimate=i.estimate);break;case"task.parent_set":o.parent=x(i.parent);break;case"task.blocked_by_added":{let a=x(i.blocker);a!==null&&!o.blockedBy.includes(a)&&o.blockedBy.push(a);break}case"task.blocked_by_removed":{let a=x(i.blocker);a!==null&&(o.blockedBy=o.blockedBy.filter(d=>d!==a));break}case"task.time_logged":{let a=i.hours;typeof a=="number"&&Number.isFinite(a)&&(o.loggedHours=Math.max(0,o.loggedHours+a));break}case"task.commented":{let a=x(i.text);a!==null&&o.comments.push({id:e.id,author:e.actor,ts:e.ts,text:a});break}default:break}return K(o,e),!0}function K(e,n){e.history.push({id:n.id,type:n.type,actor:n.actor,ts:n.ts,data:n.data??{}}),n.ts>e.updatedAt&&(e.updatedAt=n.ts)}function x(e){return typeof e=="string"&&e.length>0?e:null}function Q(e){return D.includes(e)?e:"task"}function ee(e){return R.includes(e)?e:"normal"}function te(e){return Array.isArray(e)?e.filter(n=>typeof n=="string"&&n.length>0):[]}function _e(e){let n=new Map(e.map(i=>[i.id,i])),r=[],t=new Set,s=(i,o)=>{let a=new Map,d=(u,c)=>{let f=a.get(u);if(f==="done")return;if(f==="visiting"){let p=c.indexOf(u),m=c.slice(p),g=`${i}:${[...m].sort().join(",")}`;t.has(g)||(t.add(g),r.push({kind:i,path:[...m,u]}));return}a.set(u,"visiting");let l=n.get(u);if(l!==void 0)for(let p of o(l))d(p,[...c,u]);a.set(u,"done")};for(let u of e)d(u.id,[])};return s("parent",i=>i.parent===null?[]:[i.parent]),s("blocking",i=>i.blockedBy),r}var re={urgent:0,high:1,normal:2,low:3};function se(e,n){return e!==null&&e.toLowerCase().includes(n)}function oe(e,n,r=new Date){let t=r.toISOString().slice(0,10),s=n.search?.toLowerCase();return e.filter(i=>{if(s!==void 0&&s.length>0){let o=i.comments.some(a=>a.text.toLowerCase().includes(s));if(!se(i.title,s)&&!se(i.description,s)&&!o)return!1}if(n.status!==void 0&&i.status!==n.status||n.type!==void 0&&i.type!==n.type||n.priority!==void 0&&i.priority!==n.priority)return!1;if(n.assignee!==void 0){let o=n.assignee.toLowerCase(),a=(i.assignee??"").toLowerCase();if(o==="none"?a!=="":a!==o)return!1}if(n.label!==void 0){let o=n.label.toLowerCase();if(!i.labels.some(a=>a.toLowerCase()===o))return!1}return!(n.sprint!==void 0&&i.sprint!==n.sprint||n.overdue===!0&&(i.due===null||i.due>=t)||n.dueBefore!==void 0&&(i.due===null||i.due>=n.dueBefore))})}function ae(e,n){let r=[...e];switch(n){case"priority":return r.sort((t,s)=>re[t.priority]-re[s.priority]);case"due":return r.sort((t,s)=>ie(t.due,s.due,(i,o)=>i<o?-1:i>o?1:0));case"estimate":return r.sort((t,s)=>ie(t.estimate,s.estimate,(i,o)=>o-i));default:return r.sort((t,s)=>t.id<s.id?-1:t.id>s.id?1:0)}}function ie(e,n,r){return e===null&&n===null?0:e===null?1:n===null?-1:r(e,n)}function de(e){let n=[];return e.search!==void 0&&n.push(`search="${e.search}"`),e.status!==void 0&&n.push(`status=${e.status}`),e.type!==void 0&&n.push(`type=${e.type}`),e.priority!==void 0&&n.push(`priority=${e.priority}`),e.assignee!==void 0&&n.push(`assignee=${e.assignee}`),e.label!==void 0&&n.push(`label=${e.label}`),e.overdue===!0&&n.push("overdue"),e.dueBefore!==void 0&&n.push(`due before ${e.dueBefore}`),n.length===0?`No tasks yet.
|
|
3
|
-
Create the first one:
|
|
4
|
-
kadence task add "title"`:`No tasks match ${n.join(" and ")}.
|
|
5
|
-
Try fewer filters:
|
|
6
|
-
kadence task list`}var H=["created","priority","due","estimate"];function ue(e){return H.includes(e)}import{execFileSync as Fe}from"node:child_process";function le(e,n){try{return Fe("git",n,{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return null}}function ce(e){let n=le(e,["rev-parse","--show-toplevel"]);return n===null||n.length===0?null:n}function pe(e){let n=le(e,["config","user.email"]);return n===null||n.length===0?null:n}import{mkdirSync as He,readdirSync as Ye,readFileSync as We,renameSync as Ge,rmSync as Jt,writeFileSync as Ze}from"node:fs";import{join as N}from"node:path";var Me=["task.created","task.moved","task.assigned","task.commented","task.updated","task.cancelled","task.reopened","task.deleted","task.parent_set","task.blocked_by_added","task.blocked_by_removed","task.time_logged","template.saved","template.deleted","board.configured","sprint.created","sprint.started","sprint.updated","sprint.closed","sprint.cancelled","sprint.task_added"],Be=new Set(Me),fe=/^[0-9ABCDEFGHJKMNPQRSTVWXYZ]{26}$/,Le=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,3})?(Z|[+-]\d{2}:\d{2})$/;function Je(e){return typeof e=="string"&&Be.has(e)}function Ue(e){if(typeof e!="object"||e===null)return["event"];let n=e,r=[];return(typeof n.id!="string"||!fe.test(n.id))&&r.push("id"),Je(n.type)||r.push("type"),(typeof n.entity!="string"||!fe.test(n.entity))&&r.push("entity"),(typeof n.actor!="string"||n.actor.length===0)&&r.push("actor"),(typeof n.ts!="string"||!Le.test(n.ts)||Number.isNaN(Date.parse(n.ts)))&&r.push("ts"),n.source!=="human"&&n.source!=="agent"&&r.push("source"),n.data!==void 0&&(typeof n.data!="object"||n.data===null)&&r.push("data"),r}function ge(e){let n=e.data?.description;if(typeof n!="string"||!n.includes(`
|
|
7
|
-
`))return JSON.stringify(e);let r={...e,data:{...e.data,description:n.split(`
|
|
8
|
-
`)}};return JSON.stringify(r,null,2)}function Y(e){let n;try{n=JSON.parse(e)}catch(t){return{event:null,error:`unreadable JSON: ${t.message}`,unknownType:!1}}n=Ke(n);let r=Ue(n);return r.length===1&&r[0]==="type"?{event:null,error:null,unknownType:!0}:r.length>0?{event:null,error:`invalid fields: ${r.join(", ")}`,unknownType:!1}:{event:n,error:null,unknownType:!1}}function Ke(e){if(typeof e!="object"||e===null)return e;let n=e,r=n.data;if(typeof r!="object"||r===null)return e;let t=r.description;return Array.isArray(t)?{...n,data:{...r,description:t.filter(s=>typeof s=="string").join(`
|
|
9
|
-
`)}}:e}var Ve=.2;function O(e){return N(e,".kadence")}function M(e){return N(O(e),"events")}function ze(e){return N(M(e),"archive")}function Xe(e){return e.slice(0,7)}function w(e,n){let r=N(M(e),Xe(n.ts));He(r,{recursive:!0});let t=N(r,`${n.id}.json`),s=N(r,`.${n.id}.tmp`);Ze(s,`${ge(n)}
|
|
10
|
-
`,"utf8"),Ge(s,t)}function I(e){let n=M(e),r=[],t=[],s=new Set,i=0,o=W(ze(e)),a=new Set(o);for(let u of W(n)){let c;try{c=We(u,"utf8")}catch{t.push(u);continue}if(a.has(u)){let l;try{l=JSON.parse(c)}catch{t.push(u);continue}if(!Array.isArray(l)){t.push(u);continue}for(let p of l){let m=Y(JSON.stringify(p));m.unknownType?i++:m.error!==null||m.event===null?t.push(u):s.has(m.event.id)||(s.add(m.event.id),r.push(m.event))}continue}let f=Y(c);if(f.unknownType){i++;continue}if(f.error!==null||f.event===null){t.push(u);continue}s.has(f.event.id)||(s.add(f.event.id),r.push(f.event))}r.sort((u,c)=>u.id<c.id?-1:u.id>c.id?1:0);let d=r.length+t.length;return{events:r,corrupted:t,unknownTypes:i,systemicCorruption:d>0&&t.length/d>Ve}}function W(e){let n;try{n=Ye(e,{withFileTypes:!0})}catch{return[]}let r=[];for(let t of n){let s=N(e,t.name);t.isDirectory()?r.push(...W(s)):t.name.endsWith(".json")&&r.push(s)}return r}import{randomFillSync as qe}from"node:crypto";var ke="0123456789ABCDEFGHJKMNPQRSTVWXYZ",Qe=10,et=16,me=2**48-1;function tt(e){let n="",r=e;for(let t=Qe-1;t>=0;t--)n=ke[r%32]+n,r=Math.floor(r/32);return n}function nt(e){let n="",r=0,t=0;for(let s of e){for(r=r<<8|s,t+=8;t>=5;)t-=5,n+=ke[r>>>t&31];r&=(1<<t)-1}return n.slice(0,et)}function rt(e){for(let n=e.length-1;n>=0;n--){let r=e[n];if(r<255){e[n]=r+1;return}e[n]=0}throw new Error("ULID: random space exhausted within a single millisecond")}function st(){let e=-1,n=new Uint8Array(10);return function(t=Date.now()){if(!Number.isInteger(t)||t<0||t>me)throw new RangeError(`ULID: time out of range 0..${me}: ${t}`);return t>e?(e=t,qe(n)):rt(n),tt(e)+nt(n)}}var $=st();import{readFileSync as it,writeFileSync as ot,renameSync as at,readdirSync as dt,mkdirSync as ut}from"node:fs";import{join as he}from"node:path";var ye="kadence-snapshot/1";function be(e){return he(O(e),"state.json")}function xe(e,n){let r=lt(M(e)),t=ct(e);if(t!==null&&t.version===ye&&t.lastEventId===r.lastEventId&&t.eventCount===r.count)return{state:t.state,fromCache:!0,incomingEvents:0};let s=I(e),i=ne(s.events),o=t===null||n===void 0?0:ft(s.events,t,n);return pt(e,{version:ye,lastEventId:r.lastEventId,eventCount:r.count,state:i}),{state:i,fromCache:!1,incomingEvents:o}}function lt(e){let n="",r=0,t=s=>{let i;try{i=dt(s,{withFileTypes:!0})}catch{return}for(let o of i)if(o.isDirectory())t(he(s,o.name));else if(o.name.endsWith(".json")){r++;let a=o.name.slice(0,-5);a>n&&(n=a)}};return t(e),{lastEventId:n,count:r}}function ct(e){try{let n=JSON.parse(it(be(e),"utf8"));if(typeof n!="object"||n===null)return null;let r=n;return typeof r.version!="string"||typeof r.lastEventId!="string"||typeof r.eventCount!="number"||typeof r.state!="object"?null:r}catch{return null}}function pt(e,n){try{ut(O(e),{recursive:!0});let r=be(e),t=`${r}.tmp`;ot(t,JSON.stringify(n),"utf8"),at(t,r)}catch{}}function ft(e,n,r){let t=0,s=0;for(let o of e)o.id<=n.lastEventId?t++:o.actor!==r&&s++;let i=Math.max(0,t-n.eventCount);return s+i}var S={dim:"\x1B[2m",bold:"\x1B[1m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",reset:"\x1B[0m"};function Z(e,n){return e.NO_COLOR!==void 0?!1:n}function E(e,n,r){return r?`${n}${e}${S.reset}`:e}var gt={done:S.green,in_progress:S.blue,blocked:S.yellow,cancelled:S.dim},mt=72;function Se(e,n=mt){let r=[...e];return r.length<=n?e:`${r.slice(0,n-1).join("")}\u2026`}function G(e){return[...e].length}function ve(e,n){let r=n-G(e);return r>0?e+" ".repeat(r):e}function $e(e,n){if(e.length===0)return`No tasks yet.
|
|
11
|
-
Create the first one:
|
|
12
|
-
kadence task add "title"`;let r=Math.max(...e.map(s=>G(s.label)),2),t=Math.max(...e.map(s=>G(s.status)),6);return e.map(s=>{let i=E(ve(s.label,r),S.bold,n),o=E(ve(s.status,t),gt[s.status]??S.dim,n),a=s.estimate===null?"":E(` (${s.estimate})`,S.dim,n);return`${i} ${o} ${Se(s.title)}${a}`}).join(`
|
|
13
|
-
`)}function we(e){return e<=0?null:`Merged ${e} ${e===1?"change":"changes"} from another branch, no conflicts.`}var kt={urgent:"!!",high:"!",normal:"",low:"v"},yt={bug:"BUG",story:"STORY",task:""};function Te(e,n){let r=[E(e.label,S.bold,n)],t=kt[e.priority];t!==""&&r.push(E(t,e.priority==="low"?S.dim:S.yellow,n));let s=yt[e.type]??"";s!==""&&r.push(E(s,S.dim,n)),r.push(Se(e.title));let i=[];return e.assignee!==null&&i.push(`@${e.assignee.split("@")[0]}`),e.estimate!==null&&i.push(`${e.estimate}`),i.length>0&&r.push(E(`(${i.join(", ")})`,S.dim,n)),` ${r.join(" ")}`}function qt(e,n){if(Object.values(e).reduce((s,i)=>s+i.length,0)===0)return`No tasks yet.
|
|
14
|
-
Create the first one:
|
|
15
|
-
kadence task add "title"`;let t=[];for(let[s,i]of Object.entries(e)){if(i.length===0)continue;let o=i.reduce((d,u)=>d+(u.estimate??0),0),a=o>0?` \u2014 ${o}`:"";t.push(E(`${s} (${i.length}${a})`,S.bold,n),...i.map(d=>Te(d,n)),"")}return t.join(`
|
|
16
|
-
`).trimEnd()}function ht(e,n=new Date){let r=Date.parse(`${e}T00:00:00.000Z`),t=Date.parse(`${n.toISOString().slice(0,10)}T00:00:00.000Z`);if(Number.isNaN(r))return"";let s=Math.round((r-t)/864e5);return s<0?` (overdue by ${-s} day${s===-1?"":"s"})`:s===0?" (today)":s===1?" (tomorrow)":s<=7?` (in ${s} days)`:""}function Ce(e,n){if(e.length===0)return`No tasks yet.
|
|
17
|
-
Create the first one:
|
|
18
|
-
kadence task add "title"`;let r=new Set(e.map(a=>a.id)),t=new Map;for(let a of e){let d=a.parent!==null&&r.has(a.parent)?a.parent:null,u=t.get(d)??[];u.push(a),t.set(d,u)}let s=[],i=new Set,o=(a,d)=>{if(!(d>10))for(let u of t.get(a)??[]){if(i.has(u.id))continue;i.add(u.id);let c=" ".repeat(d),f=u.blockedBy.length>0?E(" [blocked]",S.yellow,n):"";s.push(`${c}${Te(u,n).trimStart()}${f}`),o(u.id,d+1)}};return o(null,0),s.join(`
|
|
19
|
-
`)}function Ee(e){let n=[`${e.label} ${e.title}`,""];if(e.description!==null&&n.push(e.description,""),n.push(` Status: ${e.status}`),n.push(` Type: ${e.type}`),n.push(` Priority: ${e.priority}`),e.labels.length>0&&n.push(` Labels: ${e.labels.join(", ")}`),e.parent!==null&&n.push(` Parent: ${e.parent}`),e.blockedBy.length>0&&n.push(` Blocked by: ${e.blockedBy.length} task(s)`),n.push(` Assignee: ${e.assignee??"\u2014"}`),n.push(` Reporter: ${e.reporter}`),e.due!==null&&n.push(` Due: ${e.due}${ht(e.due)}`),n.push(` Estimate: ${e.estimate??"\u2014"}`),e.comments.length>0){n.push("",` Comments (${e.comments.length}):`);for(let r of e.comments){n.push(` ${r.author} \xB7 ${r.ts.slice(0,10)}`);for(let t of r.text.split(`
|
|
20
|
-
`))n.push(` ${t}`)}}if(e.history.length>0){n.push("",` History (${e.history.length}):`);for(let r of e.history){let t=r.type==="task.moved"?` \u2192 ${String(r.data.to)}`:"";n.push(` ${r.ts.slice(0,16).replace("T"," ")} ${r.actor} ${r.type}${t}`)}}return n.join(`
|
|
21
|
-
`)}import{existsSync as bt}from"node:fs";var un=U;function h(e,n){let r=ce(e);if(r===null)return{ok:!1,exitCode:1,message:`kadence lives inside a git repository, and there is none here.
|
|
22
|
-
Create one and try again:
|
|
23
|
-
git init`};if(!bt(O(r)))return{ok:!1,exitCode:1,message:`No .kadence/ found here.
|
|
24
|
-
Run:
|
|
25
|
-
npx kadence init`};let t=pe(r);if(t===null)return{ok:!1,exitCode:1,message:`Git does not know who you are, so there is no author for the event.
|
|
26
|
-
Run:
|
|
27
|
-
git config user.email you@example.com`};let s=n.KADENCE_SOURCE==="agent"?"agent":"human";return{root:r,actor:t,source:s}}function b(e){return"root"in e}function ln(e,n,r,t={}){let s=h(e,n);if(!b(s))return s;let i=r.trim();if(i.length===0)return{ok:!1,exitCode:2,message:"A task needs a title."};if(t.type!==void 0&&!D.includes(t.type))return{ok:!1,exitCode:2,message:`Unknown type "${t.type}".
|
|
28
|
-
Available: ${D.join(", ")}`};if(t.priority!==void 0&&!R.includes(t.priority))return{ok:!1,exitCode:2,message:`Unknown priority "${t.priority}".
|
|
29
|
-
Available: ${R.join(", ")}`};let o;if(t.parent!==void 0){let{state:c}=k(s.root,s.actor),f=T(c,t.parent);if(f===void 0)return{ok:!1,exitCode:1,message:`No parent task ${t.parent}.
|
|
30
|
-
kadence task list`};o=f.id}let a=$(),d={id:a,type:"task.created",entity:a,actor:s.actor,ts:new Date().toISOString(),source:s.source,data:{title:i,...t.description!==void 0?{description:t.description}:{},...t.type!==void 0?{type:t.type}:{},...t.priority!==void 0?{priority:t.priority}:{},...t.assignee!==void 0?{assignee:t.assignee}:{},...t.labels!==void 0&&t.labels.length>0?{labels:t.labels}:{},...t.due!==void 0?{due:t.due}:{},...o!==void 0?{parent:o}:{},...t.estimate!==void 0?{estimate:t.estimate}:{}}};w(s.root,d);let u=t.estimate===void 0?`
|
|
31
|
-
Without an estimate this task will not count towards velocity. Add --estimate.`:"";return{ok:!0,exitCode:0,message:`Created: ${i}${u}`,data:{schema:"kadence/v1",ok:!0,task:{id:a,title:i}}}}function k(e,n){let r=xe(e,n),t=I(e),s=[],i=we(r.incomingEvents);return i!==null&&s.push(i),t.systemicCorruption?s.push(`The journal is badly damaged: ${t.corrupted.length} of ${t.corrupted.length+t.events.length} events are unreadable. Try: git checkout .kadence/`):t.corrupted.length>0&&s.push(`Skipped ${t.corrupted.length} corrupted event(s).`),t.unknownTypes>0&&s.push(`Skipped ${t.unknownTypes} event(s) from a newer format. Update kadence.`),{state:r.state,warnings:s}}function T(e,n){let r=n.toUpperCase();return e.tasks.find(t=>t.id===r||t.label===r)}function De(e,n){return{ok:!1,exitCode:2,message:`Unknown status "${e}".
|
|
32
|
-
Available: ${n.join(", ")}
|
|
33
|
-
kadence board config --statuses "todo,doing,done"`}}function cn(e,n,r){let t=h(e,n);if(!b(t))return t;if(r.type!==void 0&&!D.includes(r.type))return{ok:!1,exitCode:2,message:`Unknown type "${r.type}".
|
|
34
|
-
Available: ${D.join(", ")}`};if(r.priority!==void 0&&!R.includes(r.priority))return{ok:!1,exitCode:2,message:`Unknown priority "${r.priority}".
|
|
35
|
-
Available: ${R.join(", ")}`};if(r.sort!==void 0&&!ue(r.sort))return{ok:!1,exitCode:2,message:`Unknown sort key "${r.sort}".
|
|
36
|
-
Available: ${H.join(", ")}`};let{state:s,warnings:i}=k(t.root,t.actor);if(r.status!==void 0&&!s.statuses.includes(r.status))return De(r.status,s.statuses);let{sort:o,tree:a,...d}=r,u=oe(s.tasks,d),c=o===void 0?u:ae(u,o);return c.length===0?{ok:!0,exitCode:0,warnings:i,message:de(d),data:{schema:"kadence/v1",ok:!0,tasks:[]}}:{ok:!0,exitCode:0,warnings:i,message:a===!0?Ce(c,Z(n,process.stdout.isTTY===!0)):$e(c,Z(n,process.stdout.isTTY===!0)),data:{schema:"kadence/v1",ok:!0,tasks:c.map(Re),cycles:s.cycles}}}function pn(e,n,r,t){let s=h(e,n);if(!b(s))return s;let{state:i,warnings:o}=k(s.root,s.actor);if(!i.statuses.includes(t))return De(t,i.statuses);let{tasks:a,error:d}=P(i,r);if(d!==null)return{ok:!1,exitCode:1,message:d};let u=[],c=[],f="";for(let p of a){if(p.status===t){c.push(p);continue}let m=p.status;w(s.root,{id:$(),type:"task.moved",entity:p.id,actor:s.actor,ts:new Date().toISOString(),source:s.source,data:{from:m,to:t}}),u.push(p),a.length===1&&i.statuses.indexOf(t)-i.statuses.indexOf(m)>1&&(f=`
|
|
37
|
-
Moved straight from ${m} to ${t}, skipping the stages between.`)}if(u.length===0)return{ok:!0,exitCode:0,warnings:o,message:v("already there",c,`is already ${t}.`)};let l=c.length>0?`
|
|
38
|
-
${c.length} already ${t}.`:"";return{ok:!0,exitCode:0,warnings:o,message:`${v("moved",u,`${u[0].status} \u2192 ${t}`)}${f}${l}`,data:{schema:"kadence/v1",ok:!0,moved:u.map(p=>({id:p.id,label:p.label,to:t}))}}}function Re(e){return{id:e.id,label:e.label,title:e.title,description:e.description,type:e.type,priority:e.priority,status:e.status,labels:e.labels,assignee:e.assignee,reporter:e.reporter,sprint:e.sprint,loggedHours:e.loggedHours,parent:e.parent,blockedBy:e.blockedBy,due:e.due,comments:e.comments,estimate:e.estimate,history:e.history}}function fn(e,n,r,t){let s=h(e,n);if(!b(s))return s;let{state:i,warnings:o}=k(s.root,s.actor),{tasks:a,error:d}=P(i,r);if(d!==null)return{ok:!1,exitCode:1,message:d};let u=t.trim().toLowerCase()==="none"?null:t.trim(),c=a.filter(f=>f.assignee!==u);if(c.length===0)return{ok:!0,exitCode:0,warnings:o,message:u===null?v("already unassigned",a,"is already unassigned."):v("already assigned",a,`is already assigned to ${u}.`)};for(let f of c)w(s.root,{id:$(),type:"task.assigned",entity:f.id,actor:s.actor,ts:new Date().toISOString(),source:s.source,data:{assignee:u}});return{ok:!0,exitCode:0,warnings:o,message:u===null?v("unassigned",c,"unassigned."):v("assigned",c,`\u2192 ${u}`),data:{schema:"kadence/v1",ok:!0,assigned:c.map(f=>({id:f.id,label:f.label,assignee:u}))}}}function gn(e,n,r){let t=h(e,n);if(!b(t))return t;let{state:s,warnings:i}=k(t.root,t.actor),o=T(s,r);return o===void 0?{ok:!1,exitCode:1,message:`No task ${r}.
|
|
39
|
-
kadence task list`}:{ok:!0,exitCode:0,warnings:i,message:Ee(o),data:{schema:"kadence/v1",ok:!0,task:Re(o)}}}function mn(e,n,r,t){let s=h(e,n);if(!b(s))return s;if(t.type!==void 0&&!D.includes(t.type))return{ok:!1,exitCode:2,message:`Unknown type "${t.type}".
|
|
40
|
-
Available: ${D.join(", ")}`};if(t.priority!==void 0&&!R.includes(t.priority))return{ok:!1,exitCode:2,message:`Unknown priority "${t.priority}".
|
|
41
|
-
Available: ${R.join(", ")}`};if(t.due!==void 0&&t.due!==""&&!xt(t.due))return{ok:!1,exitCode:2,message:`Due date must be YYYY-MM-DD, got "${t.due}".
|
|
42
|
-
kadence task edit KAD-1 --due 2026-09-30`};let{state:i,warnings:o}=k(s.root,s.actor),{tasks:a,error:d}=P(i,r);if(d!==null)return{ok:!1,exitCode:1,message:d};if(t.title!==void 0&&a.length>1)return{ok:!1,exitCode:2,message:"A title can only be set on one task at a time."};let u=[],c=new Set;for(let l of a){let p={},m=[];if(t.title!==void 0&&t.title!==l.title&&(p.title=t.title,m.push("title")),t.description!==void 0&&t.description!==(l.description??"")&&(p.description=t.description,m.push("description")),t.type!==void 0&&t.type!==l.type&&(p.type=t.type,m.push("type")),t.priority!==void 0&&t.priority!==l.priority&&(p.priority=t.priority,m.push("priority")),t.due!==void 0&&t.due!==(l.due??"")&&(p.due=t.due,m.push("due")),t.estimate!==void 0&&t.estimate!==l.estimate&&(p.estimate=t.estimate,m.push("estimate")),t.labels!==void 0&&t.labels.join(",")!==l.labels.join(",")&&(p.labels=t.labels,m.push("labels")),m.length!==0){w(s.root,{id:$(),type:"task.updated",entity:l.id,actor:s.actor,ts:new Date().toISOString(),source:s.source,data:p}),u.push(l);for(let g of m)c.add(g)}}if(u.length===0)return{ok:!0,exitCode:0,warnings:o,message:v("unchanged",a,"nothing changed.")};let f=[...c].join(", ");return{ok:!0,exitCode:0,warnings:o,message:v("updated",u,`updated ${f}.`),data:{schema:"kadence/v1",ok:!0,updated:u.map(l=>({id:l.id,label:l.label})),changed:[...c]}}}function xt(e){if(!/^\d{4}-\d{2}-\d{2}$/.test(e))return!1;let n=new Date(`${e}T00:00:00.000Z`);return!Number.isNaN(n.getTime())&&n.toISOString().slice(0,10)===e}function kn(e,n,r){let t=h(e,n);if(!b(t))return t;let{state:s,warnings:i}=k(t.root,t.actor),{tasks:o,error:a}=P(s,r);if(a!==null)return{ok:!1,exitCode:1,message:a};let d=o.filter(u=>u.status!=="cancelled");if(d.length===0)return{ok:!0,exitCode:0,warnings:i,message:v("already cancelled",o,"is already cancelled.")};for(let u of d)w(t.root,{id:$(),type:"task.cancelled",entity:u.id,actor:t.actor,ts:new Date().toISOString(),source:t.source,data:{}});return{ok:!0,exitCode:0,warnings:i,message:`${v("cancelled",d,"cancelled.")}
|
|
43
|
-
Cancelled work stays in history and does not count as missed.`,data:{schema:"kadence/v1",ok:!0,cancelled:d.map(u=>({id:u.id,label:u.label}))}}}function yn(e,n,r){let t=h(e,n);if(!b(t))return t;let{state:s,warnings:i}=k(t.root,t.actor),{tasks:o,error:a}=P(s,r);if(a!==null)return{ok:!1,exitCode:1,message:a};for(let u of o)w(t.root,{id:$(),type:"task.deleted",entity:u.id,actor:t.actor,ts:new Date().toISOString(),source:t.source,data:{title:u.title}});let d=o.length===1?`${o[0].label} deleted: "${o[0].title}".`:`${o.length} tasks deleted: ${o.map(u=>u.label).join(", ")}.`;return{ok:!0,exitCode:0,warnings:i,message:`${d}
|
|
44
|
-
The events stay in the journal \u2014 history is never rewritten.`,data:{schema:"kadence/v1",ok:!0,deleted:o.map(u=>({id:u.id,label:u.label}))}}}function hn(e,n,r,t){let s=h(e,n);if(!b(s))return s;let i=t.trim();if(i.length===0)return{ok:!1,exitCode:2,message:"A comment needs text."};let{state:o,warnings:a}=k(s.root,s.actor),d=T(o,r);return d===void 0?{ok:!1,exitCode:1,message:`No task ${r}.
|
|
45
|
-
kadence task list`}:(w(s.root,{id:$(),type:"task.commented",entity:d.id,actor:s.actor,ts:new Date().toISOString(),source:s.source,data:{text:i}}),{ok:!0,exitCode:0,warnings:a,message:`Comment added to ${d.label}.`,data:{schema:"kadence/v1",ok:!0,task:{id:d.id,label:d.label}}})}function P(e,n){let r=n.split(",").map(o=>o.trim()).filter(o=>o.length>0);if(r.length===0)return{tasks:[],error:"No task given."};let t=[],s=[];for(let o of r){let a=T(e,o);a===void 0?s.push(o):t.push(a)}return s.length>0?{tasks:[],error:`No task ${s.join(", ")} \u2014 nothing was changed.
|
|
46
|
-
All ids must exist before a bulk change runs.
|
|
47
|
-
kadence task list`}:{tasks:[...new Map(t.map(o=>[o.id,o])).values()],error:null}}function v(e,n,r){return n.length===1?`${n[0].label}: ${r}`:`${n.length} tasks ${e}: ${n.map(t=>t.label).join(", ")}`}function bn(e,n,r,t){let s=h(e,n);if(!b(s))return s;let{state:i,warnings:o}=k(s.root,s.actor),{tasks:a,error:d}=P(i,r);if(d!==null)return{ok:!1,exitCode:1,message:d};let u=t.trim().toLowerCase()==="none",c=null;if(!u){let p=T(i,t);if(p===void 0)return{ok:!1,exitCode:1,message:`No task ${t}.
|
|
48
|
-
kadence task list`};if(a.some(m=>m.id===p.id))return{ok:!1,exitCode:2,message:"A task cannot be its own parent."};c=p.id}let f=a.filter(p=>p.parent!==c);if(f.length===0)return{ok:!0,exitCode:0,warnings:o,message:v("unchanged",a,"already there.")};for(let p of f)w(s.root,{id:$(),type:"task.parent_set",entity:p.id,actor:s.actor,ts:new Date().toISOString(),source:s.source,data:{parent:c}});let l=u?"detached":T(i,t).label;return{ok:!0,exitCode:0,warnings:[...o,...Ne(s.root,s.actor)],message:u?v("detached",f,"detached from its parent."):v("moved",f,`\u2192 child of ${l}`),data:{schema:"kadence/v1",ok:!0,parent:c}}}function xn(e,n,r,t,s){let i=h(e,n);if(!b(i))return i;let{state:o,warnings:a}=k(i.root,i.actor),{tasks:d,error:u}=P(o,r);if(u!==null)return{ok:!1,exitCode:1,message:u};let c=T(o,t);if(c===void 0)return{ok:!1,exitCode:1,message:`No task ${t}.
|
|
49
|
-
kadence task list`};if(d.some(l=>l.id===c.id))return{ok:!1,exitCode:2,message:"A task cannot block itself."};let f=d.filter(l=>s?l.blockedBy.includes(c.id):!l.blockedBy.includes(c.id));if(f.length===0)return{ok:!0,exitCode:0,warnings:a,message:v("unchanged",d,s?"was not blocked by it.":"is already blocked by it.")};for(let l of f)w(i.root,{id:$(),type:s?"task.blocked_by_removed":"task.blocked_by_added",entity:l.id,actor:i.actor,ts:new Date().toISOString(),source:i.source,data:{blocker:c.id}});return{ok:!0,exitCode:0,warnings:[...a,...Ne(i.root,i.actor)],message:s?v("unblocked",f,`no longer blocked by ${c.label}.`):v("blocked",f,`blocked by ${c.label}.`),data:{schema:"kadence/v1",ok:!0,blocker:c.id}}}function Ne(e,n){let{state:r}=k(e,n),t=new Map(r.tasks.map(s=>[s.id,s.label]));return r.cycles.map(s=>{let i=s.path.map(o=>t.get(o)??o).join(" \u2192 ");return`Dependency cycle (${s.kind}): ${i}. Both edges were kept \u2014 resolve it when you can.`})}function vt(e){let n=/^(-?\d+(?:\.\d+)?)\s*(h|hours?|m|min|minutes?)?$/i.exec(e.trim());if(n===null)return null;let r=Number(n[1]);return!Number.isFinite(r)||r===0?null:(n[2]??"h").toLowerCase().startsWith("m")?r/60:r}function vn(e,n,r,t){let s=h(e,n);if(!b(s))return s;let i=vt(t);if(i===null)return{ok:!1,exitCode:2,message:`Cannot read "${t}" as a duration.
|
|
50
|
-
Use hours or minutes:
|
|
51
|
-
kadence task log KAD-1 2h
|
|
52
|
-
kadence task log KAD-1 90m
|
|
53
|
-
kadence task log KAD-1 -30m to correct a mistake`};let{state:o,warnings:a}=k(s.root,s.actor),d=T(o,r);if(d===void 0)return{ok:!1,exitCode:1,message:`No task ${r}.
|
|
54
|
-
kadence task list`};w(s.root,{id:$(),type:"task.time_logged",entity:d.id,actor:s.actor,ts:new Date().toISOString(),source:s.source,data:{hours:i}});let u=Math.max(0,d.loggedHours+i),c=d.estimate===null?`
|
|
55
|
-
No estimate on this task, so there is nothing to compare against.`:"";return{ok:!0,exitCode:0,warnings:a,message:`${d.label}: ${u.toFixed(1)}h logged in total.${c}`,data:{schema:"kadence/v1",ok:!0,task:{id:d.id,label:d.label,loggedHours:u}}}}import{spawnSync as St}from"node:child_process";import{mkdtempSync as $t,readFileSync as wt,rmSync as Tt,writeFileSync as Ct}from"node:fs";import{tmpdir as Et}from"node:os";import{join as Pe}from"node:path";var B="#";function Dt(e){return e.GIT_EDITOR??e.VISUAL??e.EDITOR??"vi"}function En(e,n,r){let t=$t(Pe(Et(),"kadence-edit-")),s=Pe(t,"KADENCE_EDITMSG.md"),i=["",`${B} ${r}`,`${B} Lines starting with '${B}' are ignored.`,`${B} Save an empty file to abort.`].join(`
|
|
56
|
-
`);try{Ct(s,`${n}${i}
|
|
57
|
-
`,"utf8");let o=Dt(e),a=St(o,[s],{stdio:"inherit",shell:!0});if(a.error!==void 0||a.status!==null&&a.status!==0)return{text:null,error:`Editor "${o}" exited without saving.
|
|
58
|
-
Set one explicitly:
|
|
59
|
-
export EDITOR=nano`};let u=wt(s,"utf8").split(`
|
|
60
|
-
`).filter(c=>!c.startsWith(B)).join(`
|
|
61
|
-
`).trim();return{text:u.length===0?null:u,error:null}}catch(o){return{text:null,error:`Could not open an editor: ${o.message}`}}finally{Tt(t,{recursive:!0,force:!0})}}function Dn(e,n){return e.KADENCE_SOURCE==="agent"?!1:n}function V(e,n){let r=e.sprints.find(g=>g.id===n);if(r===void 0)return null;let t=e.tasks.filter(g=>g.sprint===n),s=t.filter(g=>g.status==="cancelled"),i=t.filter(g=>g.status!=="cancelled"),o=i.filter(g=>g.status==="done"),a=i.filter(g=>g.status!=="done"),d=L(i.map(g=>g.estimate??0)),u=L(o.map(g=>g.estimate??0)),c=o.filter(g=>g.estimate===null),f=o.map(Rt).filter(g=>g!==null),l=f.length>0?L(f):null,p=L(o.filter(g=>g.estimate!==null).map(g=>g.estimate)),m=l!==null&&p>0?l/p:null;return{id:r.id,name:r.name,status:r.status,committed:d,velocity:u,actualHours:l,hoursPerPoint:m,done:o,carriedOver:a,cancelled:s,unestimated:c,loggedHours:L(t.map(g=>g.loggedHours))}}function Rt(e){let n=e.history.find(s=>s.type==="task.moved"&&s.data.to==="in_progress"),r=[...e.history].reverse().find(s=>s.type==="task.moved"&&s.data.to==="done");if(n===void 0||r===void 0)return null;let t=Date.parse(r.ts)-Date.parse(n.ts);return t>0?t/36e5:null}function L(e){return e.reduce((n,r)=>n+r,0)}function J(e){return new Date(e).toISOString().slice(0,10)}function Nt(e,n){let r=[];for(let t=Date.parse(`${e}T00:00:00.000Z`);t<=Date.parse(`${n}T00:00:00.000Z`);t+=864e5)r.push(J(t));return r}function je(e,n,r,t=J(Date.now())){let s=e.tasks.filter(y=>y.sprint===r.id&&y.status!=="cancelled"),i=new Map(s.map(y=>[y.id,y.estimate??0])),o=[...i.values()].reduce((y,C)=>y+C,0),a=n.filter(y=>i.has(y.entity));if(a.length===0)return null;let d=r.startDate??J(a[0].ts),u=r.endDate??J(a.at(-1).ts),c=r.status==="closed"||u<t?u:t;if(c<d)return null;let f=new Set,l=new Map;for(let y of a){let C=J(y.ts);if(C<d)continue;let A=y.type==="task.moved"?y.data?.to:void 0,X=i.get(y.entity)??0;A==="done"&&!f.has(y.entity)?(f.add(y.entity),l.set(C,(l.get(C)??0)+X)):A!==void 0&&A!=="done"&&f.has(y.entity)&&(f.delete(y.entity),l.set(C,(l.get(C)??0)-X))}let p=Nt(d,c),m=Math.max(p.length-1,1),g=o;return{sprintName:r.name,committed:o,finalRemaining:(r.status==="closed",null),days:p.map((y,C)=>{let A=l.get(y)??0;return g-=A,{date:y,remaining:Math.max(0,g),ideal:Math.max(0,o-o/m*C),completed:A}})}}function Ae(e,n=40){if(e.committed===0)return`"${e.sprintName}": nothing to burn down \u2014 no estimated tasks.`;let r=[`"${e.sprintName}" \u2014 ${e.committed} points committed`,""];for(let s of e.days){let i=Math.round(s.remaining/e.committed*n),o=Math.round(s.ideal/e.committed*n),a=[];for(let c=0;c<n;c++)c===o&&c>=i?a.push("\u250A"):c<i?a.push(c===o?"\u2503":"\u2588"):a.push(" ");let d=s.remaining-s.ideal,u=Math.abs(d)<.5?"":d>0?` +${d.toFixed(0)}`:` ${d.toFixed(0)}`;r.push(`${s.date.slice(5)} ${a.join("")} ${String(s.remaining).padStart(3)}${u}`)}let t=e.days.at(-1);return t!==void 0&&(r.push(""),r.push(t.remaining===0?" All committed work is done.":` ${t.remaining} of ${e.committed} points remain.`+(t.remaining>t.ideal?" Behind the ideal line.":" On or ahead of the line."))),r.join(`
|
|
62
|
-
`)}function j(e){return e.sprints.find(n=>n.status==="active")}function Pt(e){return e.sprints.filter(n=>n.status==="planned")}function _(e,n){let r=n.trim().toLowerCase();return e.sprints.find(t=>t.name.toLowerCase()===r)}function F(e,n,r,t){w(e.root,{id:$(),type:n,entity:r,actor:e.actor,ts:new Date().toISOString(),source:e.source,data:t})}function Mn(e,n,r){let t=h(e,n);if(!b(t))return t;let s=r.trim();if(s.length===0)return{ok:!1,exitCode:2,message:"A sprint needs a name."};let{state:i,warnings:o}=k(t.root,t.actor);if(_(i,s)!==void 0)return{ok:!1,exitCode:2,message:`Sprint "${s}" already exists.`};let a=j(i)!==void 0,d=$();return F(t,"sprint.created",d,{name:s}),a||F(t,"sprint.started",d,{}),{ok:!0,exitCode:0,warnings:o,message:a?`Sprint "${s}" planned.
|
|
63
|
-
|
|
64
|
-
kadence sprint add KAD-1 --sprint "${s}"
|
|
65
|
-
kadence sprint start "${s}"`:`Sprint "${s}" started.
|
|
66
|
-
|
|
67
|
-
kadence sprint add KAD-1
|
|
68
|
-
kadence sprint status`,data:{schema:"kadence/v1",ok:!0,sprint:{id:d,name:s,status:a?"planned":"active"}}}}function Bn(e,n,r,t={}){let s=h(e,n);if(!b(s))return s;let{state:i,warnings:o}=k(s.root,s.actor),a=t.sprint===void 0?j(i):_(i,t.sprint);if(a===void 0)return t.sprint===void 0?{ok:!1,exitCode:1,message:`No active sprint.
|
|
69
|
-
kadence sprint create "Sprint 1"`}:{ok:!1,exitCode:1,message:`No sprint named "${t.sprint}".
|
|
70
|
-
kadence sprint list`};if(a.status==="closed")return{ok:!1,exitCode:1,message:`Sprint "${a.name}" is closed \u2014 its velocity is not rewritten.`};let d=T(i,r);if(d===void 0)return{ok:!1,exitCode:1,message:`No task ${r}.
|
|
71
|
-
kadence task list`};if(d.sprint===a.id)return{ok:!0,exitCode:0,warnings:o,message:`${d.label} is already in the sprint.`};F(s,"sprint.task_added",a.id,{task:d.id});let u=d.estimate===null?`
|
|
72
|
-
Without an estimate this task will not count towards velocity.`:"";return{ok:!0,exitCode:0,warnings:o,message:`${d.label} \u2192 "${a.name}"${u}`,data:{schema:"kadence/v1",ok:!0,task:{id:d.id,label:d.label},sprint:a.id}}}function Ln(e,n){let r=h(e,n);if(!b(r))return r;let{state:t,warnings:s}=k(r.root,r.actor),i=j(t);if(i===void 0)return{ok:!1,exitCode:1,message:`No active sprint.
|
|
73
|
-
kadence sprint create "Sprint 1"`};let o=V(t,i.id);F(r,"sprint.closed",i.id,{velocity:o.velocity});let a=[...s];return o.unestimated.length>0&&a.push(`${o.unestimated.length} completed task(s) without an estimate were left out of velocity: `+o.unestimated.map(d=>d.label).join(", ")),{ok:!0,exitCode:0,warnings:a,message:jt(o),data:{schema:"kadence/v1",ok:!0,report:Oe(o)}}}function Jn(e,n){let r=h(e,n);if(!b(r))return r;let{state:t,warnings:s}=k(r.root,r.actor),i=j(t);if(i===void 0)return{ok:!0,exitCode:0,warnings:s,message:`No active sprint.
|
|
74
|
-
kadence sprint create "Sprint 1"`,data:{schema:"kadence/v1",ok:!0,sprint:null}};let o=V(t,i.id),a=[`"${o.name}" \u2014 ${o.velocity} of ${o.committed} points`,"",...o.done.map(d=>` \u2713 ${d.label} ${d.title}`),...o.carriedOver.map(d=>` \xB7 ${d.label} ${d.title} (${d.status})`)];return{ok:!0,exitCode:0,warnings:s,message:a.join(`
|
|
75
|
-
`),data:{schema:"kadence/v1",ok:!0,report:Oe(o)}}}function jt(e){let n=[`Sprint "${e.name}" closed.`,""];if(n.push(` Velocity: ${e.velocity} of ${e.committed} points`),e.hoursPerPoint!==null&&e.actualHours!==null&&e.actualHours>=1/60&&n.push(` Actual: ${z(e.actualHours)} \u2014 ${z(e.hoursPerPoint)} per point`),e.loggedHours>0&&n.push(` Logged: ${z(e.loggedHours)} entered by hand`),e.carriedOver.length>0){n.push("",` Carried over (${e.carriedOver.length}):`);for(let r of e.carriedOver)n.push(` \xB7 ${r.label} ${r.title}`)}return e.cancelled.length>0&&n.push("",` Cancelled (${e.cancelled.length}) \u2014 not counted towards velocity`),n.join(`
|
|
76
|
-
`)}function z(e){return e<1?`${Math.round(e*60)}m`:e<10?`${e.toFixed(1)}h`:`${Math.round(e)}h`}function Oe(e){return{id:e.id,name:e.name,status:e.status,velocity:e.velocity,committed:e.committed,actualHours:e.actualHours,hoursPerPoint:e.hoursPerPoint,done:e.done.map(n=>n.label),carriedOver:e.carriedOver.map(n=>n.label),cancelled:e.cancelled.map(n=>n.label),unestimated:e.unestimated.map(n=>n.label),loggedHours:e.loggedHours}}function Un(e,n,r){let t=h(e,n);if(!b(t))return t;let{state:s,warnings:i}=k(t.root,t.actor),o=j(s);if(o!==void 0)return{ok:!1,exitCode:1,message:`Sprint "${o.name}" is still active.
|
|
77
|
-
Close it so velocity can be computed:
|
|
78
|
-
kadence sprint close`};let a=Pt(s),d=r===void 0?a[0]:_(s,r);return d===void 0?{ok:!1,exitCode:1,message:r===void 0?`No planned sprints.
|
|
79
|
-
kadence sprint create "Sprint 2"`:`No sprint named "${r}".
|
|
80
|
-
kadence sprint list`}:d.status!=="planned"?{ok:!1,exitCode:1,message:`Sprint "${d.name}" is already ${d.status}.`}:(F(t,"sprint.started",d.id,{}),{ok:!0,exitCode:0,warnings:i,message:`Sprint "${d.name}" started.
|
|
81
|
-
|
|
82
|
-
kadence sprint status`,data:{schema:"kadence/v1",ok:!0,sprint:{id:d.id,name:d.name}}})}function Kn(e,n){let r=h(e,n);if(!b(r))return r;let{state:t,warnings:s}=k(r.root,r.actor);if(t.sprints.length===0)return{ok:!0,exitCode:0,warnings:s,message:`No sprints yet.
|
|
83
|
-
kadence sprint create "Sprint 1"`,data:{schema:"kadence/v1",ok:!0,sprints:[]}};let i=t.sprints.map(o=>{let a=t.tasks.filter(u=>u.sprint===o.id),d=a.reduce((u,c)=>u+(c.estimate??0),0);return{sprint:o,tasks:a,points:d}});return{ok:!0,exitCode:0,warnings:s,message:i.map(({sprint:o,tasks:a,points:d})=>{let u=o.status==="active"?"\u2192":" ",c=a.length===0?"":` ${a.length} tasks, ${d} points`;return`${u} ${o.name.padEnd(20)} ${o.status.padEnd(8)}${c}`}).join(`
|
|
84
|
-
`),data:{schema:"kadence/v1",ok:!0,sprints:i.map(({sprint:o,tasks:a,points:d})=>({id:o.id,name:o.name,status:o.status,taskIds:o.taskIds,taskCount:a.length,points:d}))}}}function At(e){if(!/^\d{4}-\d{2}-\d{2}$/.test(e))return!1;let n=new Date(`${e}T00:00:00.000Z`);return!Number.isNaN(n.getTime())&&n.toISOString().slice(0,10)===e}function Hn(e,n,r,t){let s=h(e,n);if(!b(s))return s;for(let[l,p]of[["--start",t.startDate],["--end",t.endDate]])if(p!==void 0&&p!==""&&!At(p))return{ok:!1,exitCode:2,message:`${l} must be YYYY-MM-DD, got "${p}".
|
|
85
|
-
kadence sprint edit --start 2026-09-01`};let{state:i,warnings:o}=k(s.root,s.actor),a=r===void 0?j(i):_(i,r);if(a===void 0)return{ok:!1,exitCode:1,message:r===void 0?`No active sprint.
|
|
86
|
-
kadence sprint list`:`No sprint named "${r}".
|
|
87
|
-
kadence sprint list`};if(a.status==="closed")return{ok:!1,exitCode:1,message:`Sprint "${a.name}" is closed \u2014 its record is not rewritten.`};if(t.name!==void 0&&t.name!==a.name&&_(i,t.name)!==void 0)return{ok:!1,exitCode:2,message:`Sprint "${t.name}" already exists.`};let d=t.startDate??a.startDate??"",u=t.endDate??a.endDate??"";if(d!==""&&u!==""&&u<d)return{ok:!1,exitCode:2,message:`The end date (${u}) is before the start date (${d}).`};let c={},f=[];return t.name!==void 0&&t.name!==a.name&&(c.name=t.name,f.push("name")),t.description!==void 0&&t.description!==(a.description??"")&&(c.description=t.description,f.push("description")),t.startDate!==void 0&&t.startDate!==(a.startDate??"")&&(c.startDate=t.startDate,f.push("start")),t.endDate!==void 0&&t.endDate!==(a.endDate??"")&&(c.endDate=t.endDate,f.push("end")),f.length===0?{ok:!0,exitCode:0,warnings:o,message:`"${a.name}": nothing changed.`}:(F(s,"sprint.updated",a.id,c),{ok:!0,exitCode:0,warnings:o,message:`"${a.name}": updated ${f.join(", ")}.`,data:{schema:"kadence/v1",ok:!0,sprint:{id:a.id,changed:f}}})}function Yn(e,n,r){let t=h(e,n);if(!b(t))return t;let{state:s,warnings:i}=k(t.root,t.actor),o=r===void 0?j(s):_(s,r);if(o===void 0)return{ok:!1,exitCode:1,message:r===void 0?`No active sprint.
|
|
88
|
-
kadence sprint list`:`No sprint named "${r}".
|
|
89
|
-
kadence sprint list`};let a=je(s,I(t.root).events,o);return a===null?{ok:!0,exitCode:0,warnings:i,message:`"${o.name}" has no tasks yet.
|
|
90
|
-
kadence sprint add KAD-1`,data:{schema:"kadence/v1",ok:!0,burndown:null}}:{ok:!0,exitCode:0,warnings:i,message:Ae(a),data:{schema:"kadence/v1",ok:!0,burndown:a}}}export{ce as a,O as b,M as c,w as d,$ as e,Ot as f,Ie as g,D as h,R as i,Z as j,qt as k,H as l,un as m,h as n,b as o,ln as p,k as q,cn as r,pn as s,Re as t,fn as u,gn as v,mn as w,kn as x,yn as y,hn as z,bn as A,xn as B,vn as C,En as D,Dn as E,Mn as F,Bn as G,Ln as H,Jn as I,Un as J,Kn as K,Hn as L,Yn as M};
|