kadence 0.3.0 → 0.3.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
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.3.1] — 2026-09-08
|
|
4
|
+
|
|
5
|
+
A patch, and the reason to take it is the fix: anyone already on 0.3.0 has a
|
|
6
|
+
state cache that can serve records folded by the previous build. The added field
|
|
7
|
+
is additive within `kadence/v1`, which the contract permits at any version.
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- `decision list` and `decision show` now report **who wrote the record** —
|
|
12
|
+
`source: "human" | "agent"`, from `KADENCE_SOURCE` at the time of writing.
|
|
13
|
+
kadence has always refused to guess this when writing an event; that refusal
|
|
14
|
+
only means something if the source survives to the point of reading. Human
|
|
15
|
+
output marks only agent-written records, because labelling every human one in
|
|
16
|
+
a repository written mostly by people hides the exception.
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- **The state cache could serve a shape folded by an older version of kadence.**
|
|
21
|
+
`.kadence/state.json` carries a version, and it was not bumped when a projected
|
|
22
|
+
record gained a field — so after an upgrade the cache kept returning records
|
|
23
|
+
without the new field, and any consumer branching on it saw `undefined`.
|
|
24
|
+
Invariant I6 says deleting the cache changes nothing, which is true; what bites
|
|
25
|
+
is *keeping* it. The version is now pinned to the projected shape by a test, so
|
|
26
|
+
adding a field without invalidating the cache fails the build.
|
|
27
|
+
|
|
28
|
+
Found by using the product on itself: three decisions recorded minutes earlier
|
|
29
|
+
refused to show their source.
|
|
30
|
+
|
|
3
31
|
## [0.3.0] — 2026-09-08
|
|
4
32
|
|
|
5
33
|
The journal held what happened. It now holds **why** — and the reasoning cannot
|
package/README.md
CHANGED
|
@@ -224,7 +224,7 @@ true.
|
|
|
224
224
|
|
|
225
225
|
**Verified.** The merge thesis, on real git branches. Performance and size, by
|
|
226
226
|
tests that fail if they regress. That the conflict problem exists in the wild —
|
|
227
|
-
measured, not assumed.
|
|
227
|
+
measured, not assumed. 548 tests, including an end-to-end run through the
|
|
228
228
|
installed binary.
|
|
229
229
|
|
|
230
230
|
**Not verified.** That teams and their AI agents actually lose enough context to want
|
|
@@ -266,7 +266,7 @@ revisit it: [docs/decisions/](docs/decisions/).
|
|
|
266
266
|
|
|
267
267
|
```bash
|
|
268
268
|
npm install
|
|
269
|
-
npm test #
|
|
269
|
+
npm test # 548 tests
|
|
270
270
|
npm run build # 35 KB bundle
|
|
271
271
|
```
|
|
272
272
|
|
|
@@ -118,15 +118,15 @@ ${Z}`}function Vt(e,n){let r=He(n);if(e===null||e.trim().length===0)return`${r}
|
|
|
118
118
|
`:`
|
|
119
119
|
|
|
120
120
|
`;return`${e}${i}${r}
|
|
121
|
-
`}var F=["id","label","title","description","type","priority","status","labels","assignee","reporter","sprint","loggedHours","parent","blockedBy","due","comments","estimate","history"],ie=["not_a_repository","not_initialised","no_git_identity","task_not_found","sprint_not_found","decision_not_found","unknown_status","unknown_type","unknown_priority","unknown_field","invalid_argument","template_not_found","conflicting_state"],We={not_a_repository:"There is no git repository here. kadence stores its journal inside one.",not_initialised:"The repository has no .kadence/ folder yet. Run `kadence init`.",no_git_identity:"Git has no user.email, so an event would have no author.",task_not_found:"No task carries that ULID or KAD-N label. Nothing was changed.",sprint_not_found:"No sprint carries that name or id.",decision_not_found:"No decision carries that ULID or DEC-N label.",unknown_status:"The status is not one of this project\u2019s columns. They are configurable, so read `allowed`.",unknown_type:"The task type is not one of the four kadence defines.",unknown_priority:"The priority is not one of the four kadence defines.",unknown_field:"A name given to --fields is not a task field. Read `allowed`.",invalid_argument:"An argument was missing or malformed; the command did nothing.",template_not_found:"No template carries that name.",conflicting_state:"The arguments were understood, but the current state does not allow it \u2014 a closed sprint, or one already started."};function zt(e){return{version:"kadence/v1",tool:{name:"kadence",version:e},stability:"Additive only: fields and error codes may be added, never renamed or removed within kadence/v1.",exitCodes:{0:"success",1:"runtime error \u2014 the command understood you and could not comply",2:"bad arguments \u2014 nothing was attempted"},output:{stdout:"With --json, JSON and nothing else.",stderr:"Warnings and human messages, never part of the contract."},env:{KADENCE_SOURCE:'Set to "agent" so events record agent authorship. Without it an event counts as human \u2014 we do not guess.',NO_COLOR:"Any value disables colour."},errors:ie.map(n=>({code:n,meaning:We[n]})),shapes:{task:{required:["id","label","title","status","type","priority","estimate","assignee","blockedBy","loggedHours"],selectable:[...F],notes:{id:"ULID. The identity of the task; KAD-N is a label derived while folding and is never stored.",history:"Present in `task show` only \u2014 the events that produced this state.",required:"What a full response carries. With --fields you get exactly what you asked for and nothing else."}},board:{required:["schema","ok","columns"]},decision:{required:["id","label","title","why","rejected","docs","supersedes","supersededBy"],notes:{why:"The reason. Required when recording \u2014 a decision without one is a changelog line.",supersededBy:"Derived while folding from a later decision carrying `supersedes`. Both directions come from one write, so they cannot fall out of step.",docs:"Repository-relative paths. kadence does not store the documents, only the link.",listing:"`decision list` hides superseded decisions unless --all is passed: a reversed reason presented as current is worse than no memory."}},error:{required:["code","message"],optional:["received","allowed","hint"],notes:{allowed:"Present when the valid set is knowable \u2014 statuses are project-configurable.",retryable:"Deliberately absent: no network, no lock, so a retry always fails identically."}}},commands:[{name:"schema",summary:"This contract. Works outside a repository."},{name:"init",summary:"Create .kadence/ and the agent instruction files."},{name:"board",summary:"The whole board, grouped by column. Every task in full \u2014 pass --fields on a large project.",flags:["--json","--fields"],json:!0},{name:"task list",summary:"All tasks, filterable.",flags:["--json","--fields"],json:!0},{name:"task show",summary:"One task with its comments and full history.",args:["ref"],json:!0},{name:"task add",summary:"Create a task.",args:["title"],json:!0},{name:"task move",summary:"Change status. Accepts several refs, all or nothing.",args:["refs","status"],json:!0},{name:"task assign",summary:"Assign or unassign.",args:["refs","who"],json:!0},{name:"task comment",summary:"Append a comment.",args:["ref","text"],json:!0},{name:"task edit",summary:"Change fields.",args:["refs"],json:!0},{name:"task log",summary:"Log hours.",args:["refs","hours"],json:!0},{name:"task block",summary:"Record a blocker.",args:["ref","blocker"],json:!0},{name:"decision add",summary:"Record why something was chosen, and what was turned down.",args:["title"],flags:["--why","--rejected","--task","--supersedes","--doc"],json:!0},{name:"decision list",summary:"Current decisions. Superseded ones need --all.",flags:["--all","--task"],json:!0},{name:"decision show",summary:"One decision in full.",args:["ref"],json:!0},{name:"task doc",summary:"Link a document to a task. The file stays plain markdown in the repo.",args:["ref","path"],json:!0},{name:"sprint status",summary:"Current sprint progress.",json:!0},{name:"sprint create",summary:"Start a sprint.",args:["name"],json:!0},{name:"sprint close",summary:"Close it and report velocity.",json:!0}]}}var G=["backlog","todo","in_progress","blocked","in_review","done","cancelled"],Qt="done",Ye="cancelled",N=["task","bug","story","epic"],A=["low","normal","high","urgent"];function ce(e){let n=[...e].sort((c,p)=>c.id<p.id?-1:c.id>p.id?1:0),r=new Map,t=new Map,s=new Map,i=new Map,o=null,a=[],d=[];for(let c of n){if(c.type==="decision.recorded"){let p=c.data??{},k=R=>typeof p[R]=="string"&&p[R].length>0?p[R]:null,$=k("title"),_=k("why");$!==null&&_!==null&&i.set(c.id,{id:c.id,label:"",title:$,why:_,rejected:k("rejected"),task:k("task"),docs:Array.isArray(p.docs)?p.docs.filter(R=>typeof R=="string"):[],supersedes:k("supersedes"),supersededBy:null,at:c.ts,by:c.actor});continue}if(c.type==="template.saved"){let p=typeof c.data?.name=="string"?c.data.name:null;p!==null&&s.set(p,{name:p,fields:c.data?.fields??{},author:c.actor});continue}if(c.type==="board.configured"){let p=c.data?.statuses;if(Array.isArray(p)){let k=p.filter($=>typeof $=="string"&&$.length>0);k.length>0&&(o=k)}continue}if(c.type==="template.deleted"){let p=typeof c.data?.name=="string"?c.data.name:null;p!==null&&s.delete(p);continue}oe(c,r,t,a,d)}let u=d.length>0,l=d;for(;l.length>0;){let c=[];for(let p of l)oe(p,r,t,a,c);if(c.length===l.length){l=c;break}l=c}if(u)for(let c of r.values())c.history.sort((p,k)=>p.id<k.id?-1:1);let f=[...r.values()].sort((c,p)=>c.id<p.id?-1:1);f.forEach((c,p)=>{c.label=`KAD-${p+1}`});let g=new Set(f.map(c=>c.id));for(let c of f)c.parent!==null&&!g.has(c.parent)&&(c.parent=null),c.blockedBy=c.blockedBy.filter(p=>g.has(p));let m=[...i.values()].sort((c,p)=>c.id<p.id?-1:1);m.forEach((c,p)=>{c.label=`DEC-${p+1}`});for(let c of m){if(c.supersedes===null)continue;let p=i.get(c.supersedes);p!==void 0&&(p.supersededBy=c.id)}for(let c of m)c.task!==null&&!g.has(c.task)&&(c.task=null);return{tasks:f,decisions:m,sprints:[...t.values()].sort((c,p)=>c.id<p.id?-1:1),statuses:o??[...G],orphanStatuses:[...new Set(f.map(c=>c.status).filter(c=>!(o??G).includes(c)))].sort(),templates:[...s.values()].sort((c,p)=>c.name.localeCompare(p.name)),cycles:Ge(f),pending:l,rejected:a}}function oe(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:v(i.description),type:ae(i.type),priority:de(i.priority),status:"backlog",labels:ue(i.labels),assignee:v(i.assignee),reporter:e.actor,sprint:null,parent:v(i.parent),blockedBy:[],due:v(i.due),comments:[],docs:[],estimate:typeof i.estimate=="number"?i.estimate:null,loggedHours:0,createdAt:e.ts,updatedAt:e.ts,history:[]}),V(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:v(i.description),startDate:v(i.startDate),endDate:v(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=v(i.description)),i.startDate!==void 0&&(a.startDate=v(i.startDate)),i.endDate!==void 0&&(a.endDate=v(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),V(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=Ye;break;case"task.reopened":o.status="in_progress";break;case"task.assigned":o.assignee=v(i.assignee);break;case"task.updated":typeof i.title=="string"&&(o.title=i.title),i.description!==void 0&&(o.description=v(i.description)),i.type!==void 0&&(o.type=ae(i.type)),i.priority!==void 0&&(o.priority=de(i.priority)),i.labels!==void 0&&(o.labels=ue(i.labels)),i.due!==void 0&&(o.due=v(i.due)),typeof i.estimate=="number"&&(o.estimate=i.estimate);break;case"task.parent_set":o.parent=v(i.parent);break;case"task.blocked_by_added":{let a=v(i.blocker);a!==null&&!o.blockedBy.includes(a)&&o.blockedBy.push(a);break}case"task.blocked_by_removed":{let a=v(i.blocker);a!==null&&(o.blockedBy=o.blockedBy.filter(d=>d!==a));break}case"task.doc_linked":{let a=v(i.path);a!==null&&!o.docs.includes(a)&&o.docs.push(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=v(i.text);a!==null&&o.comments.push({id:e.id,author:e.actor,ts:e.ts,text:a});break}default:break}return V(o,e),!0}function V(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 v(e){return typeof e=="string"&&e.length>0?e:null}function ae(e){return N.includes(e)?e:"task"}function de(e){return A.includes(e)?e:"normal"}function ue(e){return Array.isArray(e)?e.filter(n=>typeof n=="string"&&n.length>0):[]}function Ge(e){let n=new Map(e.map(i=>[i.id,i])),r=[],t=new Set,s=(i,o)=>{let a=new Map,d=(u,l)=>{let f=a.get(u);if(f==="done")return;if(f==="visiting"){let m=l.indexOf(u),c=l.slice(m),p=`${i}:${[...c].sort().join(",")}`;t.has(p)||(t.add(p),r.push({kind:i,path:[...c,u]}));return}a.set(u,"visiting");let g=n.get(u);if(g!==void 0)for(let m of o(g))d(m,[...l,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 le={urgent:0,high:1,normal:2,low:3};function pe(e,n){return e!==null&&e.toLowerCase().includes(n)}function ge(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(!pe(i.title,s)&&!pe(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 me(e,n){let r=[...e];switch(n){case"priority":return r.sort((t,s)=>le[t.priority]-le[s.priority]);case"due":return r.sort((t,s)=>fe(t.due,s.due,(i,o)=>i<o?-1:i>o?1:0));case"estimate":return r.sort((t,s)=>fe(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 fe(e,n,r){return e===null&&n===null?0:e===null?1:n===null?-1:r(e,n)}function he(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.
|
|
121
|
+
`}var F=["id","label","title","description","type","priority","status","labels","assignee","reporter","sprint","loggedHours","parent","blockedBy","due","comments","estimate","history"],ie=["not_a_repository","not_initialised","no_git_identity","task_not_found","sprint_not_found","decision_not_found","unknown_status","unknown_type","unknown_priority","unknown_field","invalid_argument","template_not_found","conflicting_state"],We={not_a_repository:"There is no git repository here. kadence stores its journal inside one.",not_initialised:"The repository has no .kadence/ folder yet. Run `kadence init`.",no_git_identity:"Git has no user.email, so an event would have no author.",task_not_found:"No task carries that ULID or KAD-N label. Nothing was changed.",sprint_not_found:"No sprint carries that name or id.",decision_not_found:"No decision carries that ULID or DEC-N label.",unknown_status:"The status is not one of this project\u2019s columns. They are configurable, so read `allowed`.",unknown_type:"The task type is not one of the four kadence defines.",unknown_priority:"The priority is not one of the four kadence defines.",unknown_field:"A name given to --fields is not a task field. Read `allowed`.",invalid_argument:"An argument was missing or malformed; the command did nothing.",template_not_found:"No template carries that name.",conflicting_state:"The arguments were understood, but the current state does not allow it \u2014 a closed sprint, or one already started."};function zt(e){return{version:"kadence/v1",tool:{name:"kadence",version:e},stability:"Additive only: fields and error codes may be added, never renamed or removed within kadence/v1.",exitCodes:{0:"success",1:"runtime error \u2014 the command understood you and could not comply",2:"bad arguments \u2014 nothing was attempted"},output:{stdout:"With --json, JSON and nothing else.",stderr:"Warnings and human messages, never part of the contract."},env:{KADENCE_SOURCE:'Set to "agent" so events record agent authorship. Without it an event counts as human \u2014 we do not guess.',NO_COLOR:"Any value disables colour."},errors:ie.map(n=>({code:n,meaning:We[n]})),shapes:{task:{required:["id","label","title","status","type","priority","estimate","assignee","blockedBy","loggedHours"],selectable:[...F],notes:{id:"ULID. The identity of the task; KAD-N is a label derived while folding and is never stored.",history:"Present in `task show` only \u2014 the events that produced this state.",required:"What a full response carries. With --fields you get exactly what you asked for and nothing else."}},board:{required:["schema","ok","columns"]},decision:{required:["id","label","title","why","rejected","docs","supersedes","supersededBy","source"],notes:{why:"The reason. Required when recording \u2014 a decision without one is a changelog line.",supersededBy:"Derived while folding from a later decision carrying `supersedes`. Both directions come from one write, so they cannot fall out of step.",docs:"Repository-relative paths. kadence does not store the documents, only the link.",source:'"human" or "agent", from KADENCE_SOURCE at the time of writing. Never guessed: without the variable an event counts as human.',listing:"`decision list` hides superseded decisions unless --all is passed: a reversed reason presented as current is worse than no memory."}},error:{required:["code","message"],optional:["received","allowed","hint"],notes:{allowed:"Present when the valid set is knowable \u2014 statuses are project-configurable.",retryable:"Deliberately absent: no network, no lock, so a retry always fails identically."}}},commands:[{name:"schema",summary:"This contract. Works outside a repository."},{name:"init",summary:"Create .kadence/ and the agent instruction files."},{name:"board",summary:"The whole board, grouped by column. Every task in full \u2014 pass --fields on a large project.",flags:["--json","--fields"],json:!0},{name:"task list",summary:"All tasks, filterable.",flags:["--json","--fields"],json:!0},{name:"task show",summary:"One task with its comments and full history.",args:["ref"],json:!0},{name:"task add",summary:"Create a task.",args:["title"],json:!0},{name:"task move",summary:"Change status. Accepts several refs, all or nothing.",args:["refs","status"],json:!0},{name:"task assign",summary:"Assign or unassign.",args:["refs","who"],json:!0},{name:"task comment",summary:"Append a comment.",args:["ref","text"],json:!0},{name:"task edit",summary:"Change fields.",args:["refs"],json:!0},{name:"task log",summary:"Log hours.",args:["refs","hours"],json:!0},{name:"task block",summary:"Record a blocker.",args:["ref","blocker"],json:!0},{name:"decision add",summary:"Record why something was chosen, and what was turned down.",args:["title"],flags:["--why","--rejected","--task","--supersedes","--doc"],json:!0},{name:"decision list",summary:"Current decisions. Superseded ones need --all.",flags:["--all","--task"],json:!0},{name:"decision show",summary:"One decision in full.",args:["ref"],json:!0},{name:"task doc",summary:"Link a document to a task. The file stays plain markdown in the repo.",args:["ref","path"],json:!0},{name:"sprint status",summary:"Current sprint progress.",json:!0},{name:"sprint create",summary:"Start a sprint.",args:["name"],json:!0},{name:"sprint close",summary:"Close it and report velocity.",json:!0}]}}var G=["backlog","todo","in_progress","blocked","in_review","done","cancelled"],Qt="done",Ye="cancelled",N=["task","bug","story","epic"],A=["low","normal","high","urgent"];function ce(e){let n=[...e].sort((c,p)=>c.id<p.id?-1:c.id>p.id?1:0),r=new Map,t=new Map,s=new Map,i=new Map,o=null,a=[],d=[];for(let c of n){if(c.type==="decision.recorded"){let p=c.data??{},k=R=>typeof p[R]=="string"&&p[R].length>0?p[R]:null,$=k("title"),_=k("why");$!==null&&_!==null&&i.set(c.id,{id:c.id,label:"",title:$,why:_,rejected:k("rejected"),task:k("task"),docs:Array.isArray(p.docs)?p.docs.filter(R=>typeof R=="string"):[],supersedes:k("supersedes"),supersededBy:null,at:c.ts,by:c.actor,source:c.source});continue}if(c.type==="template.saved"){let p=typeof c.data?.name=="string"?c.data.name:null;p!==null&&s.set(p,{name:p,fields:c.data?.fields??{},author:c.actor});continue}if(c.type==="board.configured"){let p=c.data?.statuses;if(Array.isArray(p)){let k=p.filter($=>typeof $=="string"&&$.length>0);k.length>0&&(o=k)}continue}if(c.type==="template.deleted"){let p=typeof c.data?.name=="string"?c.data.name:null;p!==null&&s.delete(p);continue}oe(c,r,t,a,d)}let u=d.length>0,l=d;for(;l.length>0;){let c=[];for(let p of l)oe(p,r,t,a,c);if(c.length===l.length){l=c;break}l=c}if(u)for(let c of r.values())c.history.sort((p,k)=>p.id<k.id?-1:1);let f=[...r.values()].sort((c,p)=>c.id<p.id?-1:1);f.forEach((c,p)=>{c.label=`KAD-${p+1}`});let g=new Set(f.map(c=>c.id));for(let c of f)c.parent!==null&&!g.has(c.parent)&&(c.parent=null),c.blockedBy=c.blockedBy.filter(p=>g.has(p));let m=[...i.values()].sort((c,p)=>c.id<p.id?-1:1);m.forEach((c,p)=>{c.label=`DEC-${p+1}`});for(let c of m){if(c.supersedes===null)continue;let p=i.get(c.supersedes);p!==void 0&&(p.supersededBy=c.id)}for(let c of m)c.task!==null&&!g.has(c.task)&&(c.task=null);return{tasks:f,decisions:m,sprints:[...t.values()].sort((c,p)=>c.id<p.id?-1:1),statuses:o??[...G],orphanStatuses:[...new Set(f.map(c=>c.status).filter(c=>!(o??G).includes(c)))].sort(),templates:[...s.values()].sort((c,p)=>c.name.localeCompare(p.name)),cycles:Ge(f),pending:l,rejected:a}}function oe(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:w(i.description),type:ae(i.type),priority:de(i.priority),status:"backlog",labels:ue(i.labels),assignee:w(i.assignee),reporter:e.actor,sprint:null,parent:w(i.parent),blockedBy:[],due:w(i.due),comments:[],docs:[],estimate:typeof i.estimate=="number"?i.estimate:null,loggedHours:0,createdAt:e.ts,updatedAt:e.ts,history:[]}),V(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:w(i.description),startDate:w(i.startDate),endDate:w(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=w(i.description)),i.startDate!==void 0&&(a.startDate=w(i.startDate)),i.endDate!==void 0&&(a.endDate=w(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),V(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=Ye;break;case"task.reopened":o.status="in_progress";break;case"task.assigned":o.assignee=w(i.assignee);break;case"task.updated":typeof i.title=="string"&&(o.title=i.title),i.description!==void 0&&(o.description=w(i.description)),i.type!==void 0&&(o.type=ae(i.type)),i.priority!==void 0&&(o.priority=de(i.priority)),i.labels!==void 0&&(o.labels=ue(i.labels)),i.due!==void 0&&(o.due=w(i.due)),typeof i.estimate=="number"&&(o.estimate=i.estimate);break;case"task.parent_set":o.parent=w(i.parent);break;case"task.blocked_by_added":{let a=w(i.blocker);a!==null&&!o.blockedBy.includes(a)&&o.blockedBy.push(a);break}case"task.blocked_by_removed":{let a=w(i.blocker);a!==null&&(o.blockedBy=o.blockedBy.filter(d=>d!==a));break}case"task.doc_linked":{let a=w(i.path);a!==null&&!o.docs.includes(a)&&o.docs.push(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=w(i.text);a!==null&&o.comments.push({id:e.id,author:e.actor,ts:e.ts,text:a});break}default:break}return V(o,e),!0}function V(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 w(e){return typeof e=="string"&&e.length>0?e:null}function ae(e){return N.includes(e)?e:"task"}function de(e){return A.includes(e)?e:"normal"}function ue(e){return Array.isArray(e)?e.filter(n=>typeof n=="string"&&n.length>0):[]}function Ge(e){let n=new Map(e.map(i=>[i.id,i])),r=[],t=new Set,s=(i,o)=>{let a=new Map,d=(u,l)=>{let f=a.get(u);if(f==="done")return;if(f==="visiting"){let m=l.indexOf(u),c=l.slice(m),p=`${i}:${[...c].sort().join(",")}`;t.has(p)||(t.add(p),r.push({kind:i,path:[...c,u]}));return}a.set(u,"visiting");let g=n.get(u);if(g!==void 0)for(let m of o(g))d(m,[...l,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 le={urgent:0,high:1,normal:2,low:3};function pe(e,n){return e!==null&&e.toLowerCase().includes(n)}function ge(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(!pe(i.title,s)&&!pe(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 me(e,n){let r=[...e];switch(n){case"priority":return r.sort((t,s)=>le[t.priority]-le[s.priority]);case"due":return r.sort((t,s)=>fe(t.due,s.due,(i,o)=>i<o?-1:i>o?1:0));case"estimate":return r.sort((t,s)=>fe(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 fe(e,n,r){return e===null&&n===null?0:e===null?1:n===null?-1:r(e,n)}function he(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.
|
|
122
122
|
Create the first one:
|
|
123
123
|
kadence task add "title"`:`No tasks match ${n.join(" and ")}.
|
|
124
124
|
Try fewer filters:
|
|
125
|
-
kadence task list`}var q=["created","priority","due","estimate"];function ke(e){return q.includes(e)}import{isAbsolute as jt,join as Rt,relative as Nt}from"node:path";import{execFileSync as qe}from"node:child_process";function ye(e,n){try{return qe("git",n,{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return null}}function be(e){let n=ye(e,["rev-parse","--show-toplevel"]);return n===null||n.length===0?null:n}function
|
|
125
|
+
kadence task list`}var q=["created","priority","due","estimate"];function ke(e){return q.includes(e)}import{isAbsolute as jt,join as Rt,relative as Nt}from"node:path";import{execFileSync as qe}from"node:child_process";function ye(e,n){try{return qe("git",n,{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return null}}function be(e){let n=ye(e,["rev-parse","--show-toplevel"]);return n===null||n.length===0?null:n}function ve(e){let n=ye(e,["config","user.email"]);return n===null||n.length===0?null:n}import{mkdirSync as tt,readdirSync as nt,readFileSync as rt,renameSync as st,rmSync as an,writeFileSync as it}from"node:fs";import{join as O}from"node:path";var Ze=["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","task.doc_linked","template.saved","template.deleted","board.configured","sprint.created","sprint.started","sprint.updated","sprint.closed","sprint.cancelled","sprint.task_added","decision.recorded"],Ve=new Set(Ze),we=/^[0-9ABCDEFGHJKMNPQRSTVWXYZ]{26}$/,ze=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,3})?(Z|[+-]\d{2}:\d{2})$/;function Xe(e){return typeof e=="string"&&Ve.has(e)}function Qe(e){if(typeof e!="object"||e===null)return["event"];let n=e,r=[];if((typeof n.id!="string"||!we.test(n.id))&&r.push("id"),Xe(n.type)||r.push("type"),(typeof n.entity!="string"||!we.test(n.entity))&&r.push("entity"),(typeof n.actor!="string"||n.actor.length===0)&&r.push("actor"),(typeof n.ts!="string"||!ze.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"),n.type==="decision.recorded"){let t=n.data??{};for(let s of["title","why"]){let i=t[s];(typeof i!="string"||i.trim().length===0)&&r.push(`data.${s}`)}}return r}function Se(e){let n=e.data?.description;if(typeof n!="string"||!n.includes(`
|
|
126
126
|
`))return JSON.stringify(e);let r={...e,data:{...e.data,description:n.split(`
|
|
127
127
|
`)}};return JSON.stringify(r,null,2)}function z(e){let n;try{n=JSON.parse(e)}catch(t){return{event:null,error:`unreadable JSON: ${t.message}`,unknownType:!1}}n=et(n);let r=Qe(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 et(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(`
|
|
128
128
|
`)}}:e}var ot=.2;function M(e){return O(e,".kadence")}function U(e){return O(M(e),"events")}function at(e){return O(U(e),"archive")}function dt(e){return e.slice(0,7)}function E(e,n){let r=O(U(e),dt(n.ts));tt(r,{recursive:!0});let t=O(r,`${n.id}.json`),s=O(r,`.${n.id}.tmp`);it(s,`${Se(n)}
|
|
129
|
-
`,"utf8"),st(s,t)}function B(e){let n=U(e),r=[],t=[],s=new Set,i=0,o=X(at(e)),a=new Set(o);for(let u of X(n)){let l;try{l=rt(u,"utf8")}catch{t.push(u);continue}if(a.has(u)){let g;try{g=JSON.parse(l)}catch{t.push(u);continue}if(!Array.isArray(g)){t.push(u);continue}for(let m of g){let c=z(JSON.stringify(m));c.unknownType?i++:c.error!==null||c.event===null?t.push(u):s.has(c.event.id)||(s.add(c.event.id),r.push(c.event))}continue}let f=z(l);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,l)=>u.id<l.id?-1:u.id>l.id?1:0);let d=r.length+t.length;return{events:r,corrupted:t,unknownTypes:i,systemicCorruption:d>0&&t.length/d>ot}}function X(e){let n;try{n=nt(e,{withFileTypes:!0})}catch{return[]}let r=[];for(let t of n){let s=O(e,t.name);t.isDirectory()?r.push(...X(s)):t.name.endsWith(".json")&&r.push(s)}return r}import{randomFillSync as ut}from"node:crypto";var xe="0123456789ABCDEFGHJKMNPQRSTVWXYZ",ct=10,lt=16,$e=2**48-1;function pt(e){let n="",r=e;for(let t=ct-1;t>=0;t--)n=xe[r%32]+n,r=Math.floor(r/32);return n}function ft(e){let n="",r=0,t=0;for(let s of e){for(r=r<<8|s,t+=8;t>=5;)t-=5,n+=xe[r>>>t&31];r&=(1<<t)-1}return n.slice(0,lt)}function gt(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 mt(){let e=-1,n=new Uint8Array(10);return function(t=Date.now()){if(!Number.isInteger(t)||t<0||t>$e)throw new RangeError(`ULID: time out of range 0..${$e}: ${t}`);return t>e?(e=t,ut(n)):gt(n),pt(e)+ft(n)}}var x=mt();import{readFileSync as ht,writeFileSync as kt,renameSync as yt,readdirSync as bt,mkdirSync as
|
|
129
|
+
`,"utf8"),st(s,t)}function B(e){let n=U(e),r=[],t=[],s=new Set,i=0,o=X(at(e)),a=new Set(o);for(let u of X(n)){let l;try{l=rt(u,"utf8")}catch{t.push(u);continue}if(a.has(u)){let g;try{g=JSON.parse(l)}catch{t.push(u);continue}if(!Array.isArray(g)){t.push(u);continue}for(let m of g){let c=z(JSON.stringify(m));c.unknownType?i++:c.error!==null||c.event===null?t.push(u):s.has(c.event.id)||(s.add(c.event.id),r.push(c.event))}continue}let f=z(l);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,l)=>u.id<l.id?-1:u.id>l.id?1:0);let d=r.length+t.length;return{events:r,corrupted:t,unknownTypes:i,systemicCorruption:d>0&&t.length/d>ot}}function X(e){let n;try{n=nt(e,{withFileTypes:!0})}catch{return[]}let r=[];for(let t of n){let s=O(e,t.name);t.isDirectory()?r.push(...X(s)):t.name.endsWith(".json")&&r.push(s)}return r}import{randomFillSync as ut}from"node:crypto";var xe="0123456789ABCDEFGHJKMNPQRSTVWXYZ",ct=10,lt=16,$e=2**48-1;function pt(e){let n="",r=e;for(let t=ct-1;t>=0;t--)n=xe[r%32]+n,r=Math.floor(r/32);return n}function ft(e){let n="",r=0,t=0;for(let s of e){for(r=r<<8|s,t+=8;t>=5;)t-=5,n+=xe[r>>>t&31];r&=(1<<t)-1}return n.slice(0,lt)}function gt(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 mt(){let e=-1,n=new Uint8Array(10);return function(t=Date.now()){if(!Number.isInteger(t)||t<0||t>$e)throw new RangeError(`ULID: time out of range 0..${$e}: ${t}`);return t>e?(e=t,ut(n)):gt(n),pt(e)+ft(n)}}var x=mt();import{readFileSync as ht,writeFileSync as kt,renameSync as yt,readdirSync as bt,mkdirSync as vt}from"node:fs";import{join as Ee}from"node:path";var Te="kadence-snapshot/2";function Ce(e){return Ee(M(e),"state.json")}function _e(e,n){let r=wt(U(e)),t=St(e);if(t!==null&&t.version===Te&&t.lastEventId===r.lastEventId&&t.eventCount===r.count)return{state:t.state,fromCache:!0,incomingEvents:0};let s=B(e),i=ce(s.events),o=t===null||n===void 0?0:xt(s.events,t,n);return $t(e,{version:Te,lastEventId:r.lastEventId,eventCount:r.count,state:i}),{state:i,fromCache:!1,incomingEvents:o}}function wt(e){let n="",r=0,t=s=>{let i;try{i=bt(s,{withFileTypes:!0})}catch{return}for(let o of i)if(o.isDirectory())t(Ee(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 St(e){try{let n=JSON.parse(ht(Ce(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 $t(e,n){try{vt(M(e),{recursive:!0});let r=Ce(e),t=`${r}.tmp`;kt(t,JSON.stringify(n),"utf8"),yt(t,r)}catch{}}function xt(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 T={dim:"\x1B[2m",bold:"\x1B[1m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",reset:"\x1B[0m"};function ee(e,n){return e.NO_COLOR!==void 0?!1:n}function D(e,n,r){return r?`${n}${e}${T.reset}`:e}var Tt={done:T.green,in_progress:T.blue,blocked:T.yellow,cancelled:T.dim},Et=72;function je(e,n=Et){let r=[...e];return r.length<=n?e:`${r.slice(0,n-1).join("")}\u2026`}function Q(e){return[...e].length}function De(e,n){let r=n-Q(e);return r>0?e+" ".repeat(r):e}function Re(e,n){if(e.length===0)return`No tasks yet.
|
|
130
130
|
Create the first one:
|
|
131
131
|
kadence task add "title"`;let r=Math.max(...e.map(s=>Q(s.label)),2),t=Math.max(...e.map(s=>Q(s.status)),6);return e.map(s=>{let i=D(De(s.label,r),T.bold,n),o=D(De(s.status,t),Tt[s.status]??T.dim,n),a=s.estimate===null?"":D(` (${s.estimate})`,T.dim,n);return`${i} ${o} ${je(s.title)}${a}`}).join(`
|
|
132
132
|
`)}function Ne(e){return e<=0?null:`Merged ${e} ${e===1?"change":"changes"} from another branch, no conflicts.`}var Ct={urgent:"!!",high:"!",normal:"",low:"v"},_t={bug:"BUG",story:"STORY",task:""};function Ae(e,n){let r=[D(e.label,T.bold,n)],t=Ct[e.priority];t!==""&&r.push(D(t,e.priority==="low"?T.dim:T.yellow,n));let s=_t[e.type]??"";s!==""&&r.push(D(s,T.dim,n)),r.push(je(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(D(`(${i.join(", ")})`,T.dim,n)),` ${r.join(" ")}`}function yn(e,n){if(Object.values(e).reduce((s,i)=>s+i.length,0)===0)return`No tasks yet.
|
|
@@ -143,21 +143,21 @@ Available: ${t.join(", ")}`,{received:r,allowed:t})}function b(e,n){let r=be(e);
|
|
|
143
143
|
Create one and try again:
|
|
144
144
|
git init`,{hint:"git init"});if(!Ie(M(r)))return h(1,"not_initialised",`No .kadence/ found here.
|
|
145
145
|
Run:
|
|
146
|
-
npx kadence init`,{hint:"kadence init"});let t=
|
|
146
|
+
npx kadence init`,{hint:"kadence init"});let t=ve(r);if(t===null)return h(1,"no_git_identity",`Git does not know who you are, so there is no author for the event.
|
|
147
147
|
Run:
|
|
148
|
-
git config user.email you@example.com`,{hint:"git config user.email you@example.com"});let s=n.KADENCE_SOURCE==="agent"?"agent":"human";return{root:r,actor:t,source:s}}function
|
|
148
|
+
git config user.email you@example.com`,{hint:"git config user.email you@example.com"});let s=n.KADENCE_SOURCE==="agent"?"agent":"human";return{root:r,actor:t,source:s}}function v(e){return"root"in e}function Rn(e,n,r,t={}){let s=b(e,n);if(!v(s))return s;let i=r.trim();if(i.length===0)return h(2,"invalid_argument","A task needs a title.",{hint:"kadence task list --json"});if(t.type!==void 0&&!N.includes(t.type))return L("unknown_type","type",t.type,N);if(t.priority!==void 0&&!A.includes(t.priority))return L("unknown_priority","priority",t.priority,A);let o;if(t.parent!==void 0){let{state:l}=y(s.root,s.actor),f=C(l,t.parent);if(f===void 0)return{...j(t.parent)};o=f.id}let a=x(),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}:{}}};E(s.root,d);let u=t.estimate===void 0?`
|
|
149
149
|
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 y(e,n){let r=_e(e,n),t=B(e),s=[],i=Ne(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 C(e,n){let r=n.toUpperCase();return e.tasks.find(t=>t.id===r||t.label===r)}function Fe(e,n){return h(2,"unknown_status",`Unknown status "${e}".
|
|
150
150
|
Available: ${n.join(", ")}
|
|
151
|
-
kadence board config --statuses "todo,doing,done"`,{received:e,allowed:n,hint:"kadence board config --json"})}function Nn(e,n,r){let t=b(e,n);if(!
|
|
152
|
-
Available: ${q.join(", ")}`,{received:r.sort,allowed:q})};let{state:o,warnings:a}=y(t.root,t.actor);if(r.status!==void 0&&!o.statuses.includes(r.status))return Fe(r.status,o.statuses);let{sort:d,tree:u,...l}=r,f=ge(o.tasks,l),g=d===void 0?f:me(f,d);return g.length===0?{ok:!0,exitCode:0,warnings:a,message:he(l),data:{schema:"kadence/v1",ok:!0,tasks:[]}}:{ok:!0,exitCode:0,warnings:a,message:u===!0?Oe(g,ee(n,process.stdout.isTTY===!0)):Re(g,ee(n,process.stdout.isTTY===!0)),data:{schema:"kadence/v1",ok:!0,tasks:g.map(m=>Me(m,s)),cycles:o.cycles}}}function An(e,n,r,t){let s=b(e,n);if(!
|
|
151
|
+
kadence board config --statuses "todo,doing,done"`,{received:e,allowed:n,hint:"kadence board config --json"})}function Nn(e,n,r){let t=b(e,n);if(!v(t))return t;if(r.type!==void 0&&!N.includes(r.type))return L("unknown_type","type",r.type,N);if(r.priority!==void 0&&!A.includes(r.priority))return L("unknown_priority","priority",r.priority,A);let{fields:s,error:i}=At(r.fields);if(i!==null)return i;if(r.sort!==void 0&&!ke(r.sort))return{...h(2,"invalid_argument",`Unknown sort key "${r.sort}".
|
|
152
|
+
Available: ${q.join(", ")}`,{received:r.sort,allowed:q})};let{state:o,warnings:a}=y(t.root,t.actor);if(r.status!==void 0&&!o.statuses.includes(r.status))return Fe(r.status,o.statuses);let{sort:d,tree:u,...l}=r,f=ge(o.tasks,l),g=d===void 0?f:me(f,d);return g.length===0?{ok:!0,exitCode:0,warnings:a,message:he(l),data:{schema:"kadence/v1",ok:!0,tasks:[]}}:{ok:!0,exitCode:0,warnings:a,message:u===!0?Oe(g,ee(n,process.stdout.isTTY===!0)):Re(g,ee(n,process.stdout.isTTY===!0)),data:{schema:"kadence/v1",ok:!0,tasks:g.map(m=>Me(m,s)),cycles:o.cycles}}}function An(e,n,r,t){let s=b(e,n);if(!v(s))return s;let{state:i,warnings:o}=y(s.root,s.actor);if(!i.statuses.includes(t))return Fe(t,i.statuses);let{tasks:a,error:d}=P(i,r);if(d!==null)return d;let u=[],l=[],f="";for(let m of a){if(m.status===t){l.push(m);continue}let c=m.status;E(s.root,{id:x(),type:"task.moved",entity:m.id,actor:s.actor,ts:new Date().toISOString(),source:s.source,data:{from:c,to:t}}),u.push(m),a.length===1&&i.statuses.indexOf(t)-i.statuses.indexOf(c)>1&&(f=`
|
|
153
153
|
Moved straight from ${c} to ${t}, skipping the stages between.`)}if(u.length===0)return{ok:!0,exitCode:0,warnings:o,message:S("already there",l,`is already ${t}.`)};let g=l.length>0?`
|
|
154
154
|
${l.length} already ${t}.`:"";return{ok:!0,exitCode:0,warnings:o,message:`${S("moved",u,`${u[0].status} \u2192 ${t}`)}${f}${g}`,data:{schema:"kadence/v1",ok:!0,moved:u.map(m=>({id:m.id,label:m.label,to:t}))}}}function At(e){if(e===void 0)return{fields:null,error:null};let n=e.split(",").map(t=>t.trim()).filter(t=>t.length>0);if(n.length===0)return{fields:null,error:h(2,"invalid_argument","--fields needs at least one field name.",{allowed:F})};let r=n.find(t=>!F.includes(t));return r!==void 0?{fields:null,error:h(2,"unknown_field",`Unknown field "${r}".
|
|
155
|
-
Available: ${F.join(", ")}`,{received:r,allowed:F})}:{fields:n,error:null}}function Me(e,n=null){let r=Ot(e);return n===null?r:Object.fromEntries(n.map(t=>[t,r[t]]))}function Ot(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,docs:e.docs,estimate:e.estimate,history:e.history}}function On(e,n,r,t){let s=b(e,n);if(!
|
|
156
|
-
kadence task edit KAD-1 --due 2026-09-30`,{received:t.due})};let{state:i,warnings:o}=y(s.root,s.actor),{tasks:a,error:d}=P(i,r);if(d!==null)return d;if(t.title!==void 0&&a.length>1)return{...h(2,"invalid_argument","A title can only be set on one task at a time.")};let u=[],l=new Set;for(let g of a){let m={},c=[];if(t.title!==void 0&&t.title!==g.title&&(m.title=t.title,c.push("title")),t.description!==void 0&&t.description!==(g.description??"")&&(m.description=t.description,c.push("description")),t.type!==void 0&&t.type!==g.type&&(m.type=t.type,c.push("type")),t.priority!==void 0&&t.priority!==g.priority&&(m.priority=t.priority,c.push("priority")),t.due!==void 0&&t.due!==(g.due??"")&&(m.due=t.due,c.push("due")),t.estimate!==void 0&&t.estimate!==g.estimate&&(m.estimate=t.estimate,c.push("estimate")),t.labels!==void 0&&t.labels.join(",")!==g.labels.join(",")&&(m.labels=t.labels,c.push("labels")),c.length!==0){E(s.root,{id:x(),type:"task.updated",entity:g.id,actor:s.actor,ts:new Date().toISOString(),source:s.source,data:m}),u.push(g);for(let p of c)l.add(p)}}if(u.length===0)return{ok:!0,exitCode:0,warnings:o,message:S("unchanged",a,"nothing changed.")};let f=[...l].join(", ");return{ok:!0,exitCode:0,warnings:o,message:S("updated",u,`updated ${f}.`),data:{schema:"kadence/v1",ok:!0,updated:u.map(g=>({id:g.id,label:g.label})),changed:[...l]}}}function Pt(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 Fn(e,n,r){let t=b(e,n);if(!
|
|
157
|
-
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 Mn(e,n,r){let t=b(e,n);if(!
|
|
158
|
-
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 Bn(e,n,r,t){let s=b(e,n);if(!
|
|
155
|
+
Available: ${F.join(", ")}`,{received:r,allowed:F})}:{fields:n,error:null}}function Me(e,n=null){let r=Ot(e);return n===null?r:Object.fromEntries(n.map(t=>[t,r[t]]))}function Ot(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,docs:e.docs,estimate:e.estimate,history:e.history}}function On(e,n,r,t){let s=b(e,n);if(!v(s))return s;let{state:i,warnings:o}=y(s.root,s.actor),{tasks:a,error:d}=P(i,r);if(d!==null)return d;let u=t.trim().toLowerCase()==="none"?null:t.trim(),l=a.filter(f=>f.assignee!==u);if(l.length===0)return{ok:!0,exitCode:0,warnings:o,message:u===null?S("already unassigned",a,"is already unassigned."):S("already assigned",a,`is already assigned to ${u}.`)};for(let f of l)E(s.root,{id:x(),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?S("unassigned",l,"unassigned."):S("assigned",l,`\u2192 ${u}`),data:{schema:"kadence/v1",ok:!0,assigned:l.map(f=>({id:f.id,label:f.label,assignee:u}))}}}function Pn(e,n,r){let t=b(e,n);if(!v(t))return t;let{state:s,warnings:i}=y(t.root,t.actor),o=C(s,r);if(o===void 0)return j(r);let a=s.decisions.filter(d=>d.task===o.id&&d.supersededBy===null).map(d=>({id:d.id,label:d.label,title:d.title,why:d.why,rejected:d.rejected,docs:d.docs,source:d.source}));return{ok:!0,exitCode:0,warnings:i,message:Pe(o),data:{schema:"kadence/v1",ok:!0,task:{...Me(o),decisions:a}}}}function In(e,n,r,t){let s=b(e,n);if(!v(s))return s;if(t.type!==void 0&&!N.includes(t.type))return L("unknown_type","type",t.type,N);if(t.priority!==void 0&&!A.includes(t.priority))return L("unknown_priority","priority",t.priority,A);if(t.due!==void 0&&t.due!==""&&!Pt(t.due))return{...h(2,"invalid_argument",`Due date must be YYYY-MM-DD, got "${t.due}".
|
|
156
|
+
kadence task edit KAD-1 --due 2026-09-30`,{received:t.due})};let{state:i,warnings:o}=y(s.root,s.actor),{tasks:a,error:d}=P(i,r);if(d!==null)return d;if(t.title!==void 0&&a.length>1)return{...h(2,"invalid_argument","A title can only be set on one task at a time.")};let u=[],l=new Set;for(let g of a){let m={},c=[];if(t.title!==void 0&&t.title!==g.title&&(m.title=t.title,c.push("title")),t.description!==void 0&&t.description!==(g.description??"")&&(m.description=t.description,c.push("description")),t.type!==void 0&&t.type!==g.type&&(m.type=t.type,c.push("type")),t.priority!==void 0&&t.priority!==g.priority&&(m.priority=t.priority,c.push("priority")),t.due!==void 0&&t.due!==(g.due??"")&&(m.due=t.due,c.push("due")),t.estimate!==void 0&&t.estimate!==g.estimate&&(m.estimate=t.estimate,c.push("estimate")),t.labels!==void 0&&t.labels.join(",")!==g.labels.join(",")&&(m.labels=t.labels,c.push("labels")),c.length!==0){E(s.root,{id:x(),type:"task.updated",entity:g.id,actor:s.actor,ts:new Date().toISOString(),source:s.source,data:m}),u.push(g);for(let p of c)l.add(p)}}if(u.length===0)return{ok:!0,exitCode:0,warnings:o,message:S("unchanged",a,"nothing changed.")};let f=[...l].join(", ");return{ok:!0,exitCode:0,warnings:o,message:S("updated",u,`updated ${f}.`),data:{schema:"kadence/v1",ok:!0,updated:u.map(g=>({id:g.id,label:g.label})),changed:[...l]}}}function Pt(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 Fn(e,n,r){let t=b(e,n);if(!v(t))return t;let{state:s,warnings:i}=y(t.root,t.actor),{tasks:o,error:a}=P(s,r);if(a!==null)return a;let d=o.filter(u=>u.status!=="cancelled");if(d.length===0)return{ok:!0,exitCode:0,warnings:i,message:S("already cancelled",o,"is already cancelled.")};for(let u of d)E(t.root,{id:x(),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:`${S("cancelled",d,"cancelled.")}
|
|
157
|
+
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 Mn(e,n,r){let t=b(e,n);if(!v(t))return t;let{state:s,warnings:i}=y(t.root,t.actor),{tasks:o,error:a}=P(s,r);if(a!==null)return a;for(let u of o)E(t.root,{id:x(),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}
|
|
158
|
+
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 Bn(e,n,r,t){let s=b(e,n);if(!v(s))return s;let i=t.trim();if(i.length===0)return h(2,"invalid_argument","A link needs a path.",{hint:"kadence task doc KAD-1 docs/design.md"});let{state:o,warnings:a}=y(s.root,s.actor),d=C(o,r);if(d===void 0)return j(r);let u=jt(i)?Nt(s.root,i):i.replace(/^\.\//,""),l=!Ie(Rt(s.root,u));return E(s.root,{id:x(),type:"task.doc_linked",entity:d.id,actor:s.actor,ts:new Date().toISOString(),source:s.source,data:{path:u}}),{ok:!0,exitCode:0,warnings:[...a,...l?[`No file at ${u} \u2014 the link is recorded anyway; it may arrive later.`]:[]],message:`${u} linked to ${d.label}.`,data:{schema:"kadence/v1",ok:!0,task:{id:d.id,label:d.label},doc:u}}}function Ln(e,n,r,t){let s=b(e,n);if(!v(s))return s;let i=t.trim();if(i.length===0)return h(2,"invalid_argument","A comment needs text.",{received:r});let{state:o,warnings:a}=y(s.root,s.actor),d=C(o,r);return d===void 0?j(r):(E(s.root,{id:x(),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:h(2,"invalid_argument","No task given.")};let t=[],s=[];for(let o of r){let a=C(e,o);a===void 0?s.push(o):t.push(a)}return s.length>0?{tasks:[],error:h(1,"task_not_found",`No task ${s.join(", ")} \u2014 nothing was changed.
|
|
159
159
|
All ids must exist before a bulk change runs.
|
|
160
|
-
kadence task list`,{received:s.join(","),hint:"kadence task list --json"})}:{tasks:[...new Map(t.map(o=>[o.id,o])).values()],error:null}}function S(e,n,r){return n.length===1?`${n[0].label}: ${r}`:`${n.length} tasks ${e}: ${n.map(t=>t.label).join(", ")}`}function Kn(e,n,r,t){let s=b(e,n);if(!
|
|
160
|
+
kadence task list`,{received:s.join(","),hint:"kadence task list --json"})}:{tasks:[...new Map(t.map(o=>[o.id,o])).values()],error:null}}function S(e,n,r){return n.length===1?`${n[0].label}: ${r}`:`${n.length} tasks ${e}: ${n.map(t=>t.label).join(", ")}`}function Kn(e,n,r,t){let s=b(e,n);if(!v(s))return s;let{state:i,warnings:o}=y(s.root,s.actor),{tasks:a,error:d}=P(i,r);if(d!==null)return d;let u=t.trim().toLowerCase()==="none",l=null;if(!u){let m=C(i,t);if(m===void 0)return j(t);if(a.some(c=>c.id===m.id))return h(2,"invalid_argument","A task cannot be its own parent.",{received:r});l=m.id}let f=a.filter(m=>m.parent!==l);if(f.length===0)return{ok:!0,exitCode:0,warnings:o,message:S("unchanged",a,"already there.")};for(let m of f)E(s.root,{id:x(),type:"task.parent_set",entity:m.id,actor:s.actor,ts:new Date().toISOString(),source:s.source,data:{parent:l}});let g=u?"detached":C(i,t).label;return{ok:!0,exitCode:0,warnings:[...o,...Be(s.root,s.actor)],message:u?S("detached",f,"detached from its parent."):S("moved",f,`\u2192 child of ${g}`),data:{schema:"kadence/v1",ok:!0,parent:l}}}function Jn(e,n,r,t,s){let i=b(e,n);if(!v(i))return i;let{state:o,warnings:a}=y(i.root,i.actor),{tasks:d,error:u}=P(o,r);if(u!==null)return u;let l=C(o,t);if(l===void 0)return j(t);if(d.some(g=>g.id===l.id))return h(2,"invalid_argument","A task cannot block itself.",{received:r});let f=d.filter(g=>s?g.blockedBy.includes(l.id):!g.blockedBy.includes(l.id));if(f.length===0)return{ok:!0,exitCode:0,warnings:a,message:S("unchanged",d,s?"was not blocked by it.":"is already blocked by it.")};for(let g of f)E(i.root,{id:x(),type:s?"task.blocked_by_removed":"task.blocked_by_added",entity:g.id,actor:i.actor,ts:new Date().toISOString(),source:i.source,data:{blocker:l.id}});return{ok:!0,exitCode:0,warnings:[...a,...Be(i.root,i.actor)],message:s?S("unblocked",f,`no longer blocked by ${l.label}.`):S("blocked",f,`blocked by ${l.label}.`),data:{schema:"kadence/v1",ok:!0,blocker:l.id}}}function Be(e,n){let{state:r}=y(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 It(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 Un(e,n,r,t){let s=b(e,n);if(!v(s))return s;let i=It(t);if(i===null)return{...h(2,"invalid_argument",`Cannot read "${t}" as a duration.
|
|
161
161
|
Use hours or minutes:
|
|
162
162
|
kadence task log KAD-1 2h
|
|
163
163
|
kadence task log KAD-1 90m
|
|
@@ -169,31 +169,31 @@ Set one explicitly:
|
|
|
169
169
|
export EDITOR=nano`};let u=Bt(s,"utf8").split(`
|
|
170
170
|
`).filter(l=>!l.startsWith(H)).join(`
|
|
171
171
|
`).trim();return{text:u.length===0?null:u,error:null}}catch(o){return{text:null,error:`Could not open an editor: ${o.message}`}}finally{Lt(t,{recursive:!0,force:!0})}}function Vn(e,n){return e.KADENCE_SOURCE==="agent"?!1:n}function te(e,n){let r=e.sprints.find(p=>p.id===n);if(r===void 0)return null;let t=e.tasks.filter(p=>p.sprint===n),s=t.filter(p=>p.status==="cancelled"),i=t.filter(p=>p.status!=="cancelled"),o=i.filter(p=>p.status==="done"),a=i.filter(p=>p.status!=="done"),d=W(i.map(p=>p.estimate??0)),u=W(o.map(p=>p.estimate??0)),l=o.filter(p=>p.estimate===null),f=o.map(Ht).filter(p=>p!==null),g=f.length>0?W(f):null,m=W(o.filter(p=>p.estimate!==null).map(p=>p.estimate)),c=g!==null&&m>0?g/m:null;return{id:r.id,name:r.name,status:r.status,committed:d,velocity:u,actualHours:g,hoursPerPoint:c,done:o,carriedOver:a,cancelled:s,unestimated:l,loggedHours:W(t.map(p=>p.loggedHours))}}function Ht(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 W(e){return e.reduce((n,r)=>n+r,0)}function Y(e){return new Date(e).toISOString().slice(0,10)}function Wt(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(Y(t));return r}function Ke(e,n,r,t=Y(Date.now())){let s=e.tasks.filter(k=>k.sprint===r.id&&k.status!=="cancelled"),i=new Map(s.map(k=>[k.id,k.estimate??0])),o=[...i.values()].reduce((k,$)=>k+$,0),a=n.filter(k=>i.has(k.entity));if(a.length===0)return null;let d=r.startDate??Y(a[0].ts),u=r.endDate??Y(a.at(-1).ts),l=r.status==="closed"||u<t?u:t;if(l<d)return null;let f=new Set,g=new Map;for(let k of a){let $=Y(k.ts);if($<d)continue;let _=k.type==="task.moved"?k.data?.to:void 0,R=i.get(k.entity)??0;_==="done"&&!f.has(k.entity)?(f.add(k.entity),g.set($,(g.get($)??0)+R)):_!==void 0&&_!=="done"&&f.has(k.entity)&&(f.delete(k.entity),g.set($,(g.get($)??0)-R))}let m=Wt(d,l),c=Math.max(m.length-1,1),p=o;return{sprintName:r.name,committed:o,finalRemaining:(r.status==="closed",null),days:m.map((k,$)=>{let _=g.get(k)??0;return p-=_,{date:k,remaining:Math.max(0,p),ideal:Math.max(0,o-o/c*$),completed:_}})}}function Je(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 l=0;l<n;l++)l===o&&l>=i?a.push("\u250A"):l<i?a.push(l===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(`
|
|
172
|
-
`)}function I(e){return e.sprints.find(n=>n.status==="active")}function Yt(e){return e.sprints.filter(n=>n.status==="planned")}function K(e,n){let r=n.trim().toLowerCase();return e.sprints.find(t=>t.name.toLowerCase()===r)}function J(e,n,r,t){E(e.root,{id:x(),type:n,entity:r,actor:e.actor,ts:new Date().toISOString(),source:e.source,data:t})}function or(e,n,r){let t=b(e,n);if(!
|
|
172
|
+
`)}function I(e){return e.sprints.find(n=>n.status==="active")}function Yt(e){return e.sprints.filter(n=>n.status==="planned")}function K(e,n){let r=n.trim().toLowerCase();return e.sprints.find(t=>t.name.toLowerCase()===r)}function J(e,n,r,t){E(e.root,{id:x(),type:n,entity:r,actor:e.actor,ts:new Date().toISOString(),source:e.source,data:t})}function or(e,n,r){let t=b(e,n);if(!v(t))return t;let s=r.trim();if(s.length===0)return h(2,"invalid_argument","A sprint needs a name.",{hint:"kadence sprint list --json"});let{state:i,warnings:o}=y(t.root,t.actor);if(K(i,s)!==void 0)return h(2,"invalid_argument",`Sprint "${s}" already exists.`,{received:s,hint:"kadence sprint list --json"});let a=I(i)!==void 0,d=x();return J(t,"sprint.created",d,{name:s}),a||J(t,"sprint.started",d,{}),{ok:!0,exitCode:0,warnings:o,message:a?`Sprint "${s}" planned.
|
|
173
173
|
|
|
174
174
|
kadence sprint add KAD-1 --sprint "${s}"
|
|
175
175
|
kadence sprint start "${s}"`:`Sprint "${s}" started.
|
|
176
176
|
|
|
177
177
|
kadence sprint add KAD-1
|
|
178
|
-
kadence sprint status`,data:{schema:"kadence/v1",ok:!0,sprint:{id:d,name:s,status:a?"planned":"active"}}}}function ar(e,n,r,t={}){let s=b(e,n);if(!
|
|
178
|
+
kadence sprint status`,data:{schema:"kadence/v1",ok:!0,sprint:{id:d,name:s,status:a?"planned":"active"}}}}function ar(e,n,r,t={}){let s=b(e,n);if(!v(s))return s;let{state:i,warnings:o}=y(s.root,s.actor),a=t.sprint===void 0?I(i):K(i,t.sprint);if(a===void 0)return t.sprint===void 0?{...h(1,"sprint_not_found",`No active sprint.
|
|
179
179
|
kadence sprint create "Sprint 1"`,{hint:"kadence sprint list --json"})}:h(1,"sprint_not_found",`No sprint named "${t.sprint}".
|
|
180
180
|
kadence sprint list`,{received:t.sprint,hint:"kadence sprint list --json"});if(a.status==="closed")return h(1,"conflicting_state",`Sprint "${a.name}" is closed \u2014 its velocity is not rewritten.`,{received:a.name});let d=C(i,r);if(d===void 0)return j(r);if(d.sprint===a.id)return{ok:!0,exitCode:0,warnings:o,message:`${d.label} is already in the sprint.`};J(s,"sprint.task_added",a.id,{task:d.id});let u=d.estimate===null?`
|
|
181
|
-
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 dr(e,n){let r=b(e,n);if(!
|
|
182
|
-
kadence sprint create "Sprint 1"`,{hint:"kadence sprint list --json"})};let o=te(t,i.id);J(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:Gt(o),data:{schema:"kadence/v1",ok:!0,report:Ue(o)}}}function ur(e,n){let r=b(e,n);if(!
|
|
181
|
+
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 dr(e,n){let r=b(e,n);if(!v(r))return r;let{state:t,warnings:s}=y(r.root,r.actor),i=I(t);if(i===void 0)return{...h(1,"sprint_not_found",`No active sprint.
|
|
182
|
+
kadence sprint create "Sprint 1"`,{hint:"kadence sprint list --json"})};let o=te(t,i.id);J(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:Gt(o),data:{schema:"kadence/v1",ok:!0,report:Ue(o)}}}function ur(e,n){let r=b(e,n);if(!v(r))return r;let{state:t,warnings:s}=y(r.root,r.actor),i=I(t);if(i===void 0)return{ok:!0,exitCode:0,warnings:s,message:`No active sprint.
|
|
183
183
|
kadence sprint create "Sprint 1"`,data:{schema:"kadence/v1",ok:!0,sprint:null}};let o=te(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(`
|
|
184
184
|
`),data:{schema:"kadence/v1",ok:!0,report:Ue(o)}}}function Gt(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: ${ne(e.actualHours)} \u2014 ${ne(e.hoursPerPoint)} per point`),e.loggedHours>0&&n.push(` Logged: ${ne(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(`
|
|
185
|
-
`)}function ne(e){return e<1?`${Math.round(e*60)}m`:e<10?`${e.toFixed(1)}h`:`${Math.round(e)}h`}function Ue(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 cr(e,n,r){let t=b(e,n);if(!
|
|
185
|
+
`)}function ne(e){return e<1?`${Math.round(e*60)}m`:e<10?`${e.toFixed(1)}h`:`${Math.round(e)}h`}function Ue(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 cr(e,n,r){let t=b(e,n);if(!v(t))return t;let{state:s,warnings:i}=y(t.root,t.actor),o=I(s);if(o!==void 0)return{...h(1,"conflicting_state",`Sprint "${o.name}" is still active.
|
|
186
186
|
Close it so velocity can be computed:
|
|
187
187
|
kadence sprint close`,{received:o.name})};let a=Yt(s),d=r===void 0?a[0]:K(s,r);return d===void 0?{...h(1,"sprint_not_found",r===void 0?`No planned sprints.
|
|
188
188
|
kadence sprint create "Sprint 2"`:`No sprint named "${r}".
|
|
189
189
|
kadence sprint list`,{...r!==void 0?{received:r}:{},hint:"kadence sprint list --json"})}:d.status!=="planned"?h(1,"conflicting_state",`Sprint "${d.name}" is already ${d.status}.`,{received:d.name}):(J(t,"sprint.started",d.id,{}),{ok:!0,exitCode:0,warnings:i,message:`Sprint "${d.name}" started.
|
|
190
190
|
|
|
191
|
-
kadence sprint status`,data:{schema:"kadence/v1",ok:!0,sprint:{id:d.id,name:d.name}}})}function lr(e,n){let r=b(e,n);if(!
|
|
191
|
+
kadence sprint status`,data:{schema:"kadence/v1",ok:!0,sprint:{id:d.id,name:d.name}}})}function lr(e,n){let r=b(e,n);if(!v(r))return r;let{state:t,warnings:s}=y(r.root,r.actor);if(t.sprints.length===0)return{ok:!0,exitCode:0,warnings:s,message:`No sprints yet.
|
|
192
192
|
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,l)=>u+(l.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":" ",l=a.length===0?"":` ${a.length} tasks, ${d} points`;return`${u} ${o.name.padEnd(20)} ${o.status.padEnd(8)}${l}`}).join(`
|
|
193
|
-
`),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 qt(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 pr(e,n,r,t){let s=b(e,n);if(!
|
|
193
|
+
`),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 qt(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 pr(e,n,r,t){let s=b(e,n);if(!v(s))return s;for(let[g,m]of[["--start",t.startDate],["--end",t.endDate]])if(m!==void 0&&m!==""&&!qt(m))return{...h(2,"invalid_argument",`${g} must be YYYY-MM-DD, got "${m}".
|
|
194
194
|
kadence sprint edit --start 2026-09-01`,{received:m})};let{state:i,warnings:o}=y(s.root,s.actor),a=r===void 0?I(i):K(i,r);if(a===void 0)return{...h(1,"sprint_not_found",r===void 0?`No active sprint.
|
|
195
195
|
kadence sprint list`:`No sprint named "${r}".
|
|
196
|
-
kadence sprint list`,{...r!==void 0?{received:r}:{},hint:"kadence sprint list --json"})};if(a.status==="closed")return{...h(1,"conflicting_state",`Sprint "${a.name}" is closed \u2014 its record is not rewritten.`,{received:a.name})};if(t.name!==void 0&&t.name!==a.name&&K(i,t.name)!==void 0)return h(2,"invalid_argument",`Sprint "${t.name}" already exists.`,{received:t.name});let d=t.startDate??a.startDate??"",u=t.endDate??a.endDate??"";if(d!==""&&u!==""&&u<d)return{...h(2,"invalid_argument",`The end date (${u}) is before the start date (${d}).`,{received:u})};let l={},f=[];return t.name!==void 0&&t.name!==a.name&&(l.name=t.name,f.push("name")),t.description!==void 0&&t.description!==(a.description??"")&&(l.description=t.description,f.push("description")),t.startDate!==void 0&&t.startDate!==(a.startDate??"")&&(l.startDate=t.startDate,f.push("start")),t.endDate!==void 0&&t.endDate!==(a.endDate??"")&&(l.endDate=t.endDate,f.push("end")),f.length===0?{ok:!0,exitCode:0,warnings:o,message:`"${a.name}": nothing changed.`}:(J(s,"sprint.updated",a.id,l),{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 fr(e,n,r){let t=b(e,n);if(!
|
|
196
|
+
kadence sprint list`,{...r!==void 0?{received:r}:{},hint:"kadence sprint list --json"})};if(a.status==="closed")return{...h(1,"conflicting_state",`Sprint "${a.name}" is closed \u2014 its record is not rewritten.`,{received:a.name})};if(t.name!==void 0&&t.name!==a.name&&K(i,t.name)!==void 0)return h(2,"invalid_argument",`Sprint "${t.name}" already exists.`,{received:t.name});let d=t.startDate??a.startDate??"",u=t.endDate??a.endDate??"";if(d!==""&&u!==""&&u<d)return{...h(2,"invalid_argument",`The end date (${u}) is before the start date (${d}).`,{received:u})};let l={},f=[];return t.name!==void 0&&t.name!==a.name&&(l.name=t.name,f.push("name")),t.description!==void 0&&t.description!==(a.description??"")&&(l.description=t.description,f.push("description")),t.startDate!==void 0&&t.startDate!==(a.startDate??"")&&(l.startDate=t.startDate,f.push("start")),t.endDate!==void 0&&t.endDate!==(a.endDate??"")&&(l.endDate=t.endDate,f.push("end")),f.length===0?{ok:!0,exitCode:0,warnings:o,message:`"${a.name}": nothing changed.`}:(J(s,"sprint.updated",a.id,l),{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 fr(e,n,r){let t=b(e,n);if(!v(t))return t;let{state:s,warnings:i}=y(t.root,t.actor),o=r===void 0?I(s):K(s,r);if(o===void 0)return{...h(1,"sprint_not_found",r===void 0?`No active sprint.
|
|
197
197
|
kadence sprint list`:`No sprint named "${r}".
|
|
198
198
|
kadence sprint list`,{...r!==void 0?{received:r}:{},hint:"kadence sprint list --json"})};let a=Ke(s,B(t.root).events,o);return a===null?{ok:!0,exitCode:0,warnings:i,message:`"${o.name}" has no tasks yet.
|
|
199
|
-
kadence sprint add KAD-1`,data:{schema:"kadence/v1",ok:!0,burndown:null}}:{ok:!0,exitCode:0,warnings:i,message:Je(a),data:{schema:"kadence/v1",ok:!0,burndown:a}}}export{be as a,M as b,U as c,E as d,Zt as e,Vt as f,zt as g,x as h,Qt as i,Ye as j,N as k,A as l,ee as m,yn as n,q as o,jn as p,h as q,j as r,b as s,
|
|
199
|
+
kadence sprint add KAD-1`,data:{schema:"kadence/v1",ok:!0,burndown:null}}:{ok:!0,exitCode:0,warnings:i,message:Je(a),data:{schema:"kadence/v1",ok:!0,burndown:a}}}export{be as a,M as b,U as c,E as d,Zt as e,Vt as f,zt as g,x as h,Qt as i,Ye as j,N as k,A as l,ee as m,yn as n,q as o,jn as p,h as q,j as r,b as s,v as t,Rn as u,y as v,C as w,Nn as x,An as y,At as z,Me as A,On as B,Pn as C,In as D,Fn as E,Mn as F,Bn as G,Ln as H,Kn as I,Jn as J,Un as K,Zn as L,Vn as M,or as N,ar as O,dr as P,ur as Q,cr as R,lr as S,pr as T,fr as U};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{B as f,D as u,F as S,H as k,K as x,L as C,M as h,O as y,P as E,Q as A,R as N,U as F,s as b,t as T,u as c,v as l,y as d}from"./chunk-
|
|
2
|
+
import{B as f,D as u,F as S,H as k,K as x,L as C,M as h,O as y,P as E,Q as A,R as N,U as F,s as b,t as T,u as c,v as l,y as d}from"./chunk-EPFIY2MT.js";async function $(r,e){let a=b(r,e);if(!T(a))return a;if(process.stdout.isTTY!==!0)return{ok:!1,exitCode:1,message:`The interactive board needs a terminal.
|
|
3
3
|
For pipes and scripts use:
|
|
4
4
|
kadence board --json`};let g;try{g=await import("./board-7RVHIQJQ.js")}catch(t){return{ok:!1,exitCode:1,message:`The interactive board could not start: ${t.message}
|
|
5
5
|
The plain board always works:
|
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{A as re,B as oe,C as I,D as de,E as ce,F as le,G as ue,H as me,I as fe,J as pe,K as B,L as he,M as ge,N as ke,O as be,P as ye,Q as
|
|
2
|
+
import{A as re,B as oe,C as I,D as de,E as ce,F as le,G as ue,H as me,I as fe,J as pe,K as B,L as he,M as ge,N as ke,O as be,P as ye,Q as we,R as ve,S as Ae,T as xe,U as De,a as Y,b as V,c as O,d as C,e as J,f as G,g as H,h as x,i as N,j as z,k as Q,l as X,m as Z,n as ee,o as te,p as K,q as k,r as _,s as b,t as y,u as ne,v as w,w as R,x as se,y as ie,z as ae}from"./chunks/chunk-EPFIY2MT.js";function U(e){return e==null?[]:Array.isArray(e)?e:[e]}function ze(e,s,n,t){var i,a=e[s],r=~t.string.indexOf(s)?n==null||n===!0?"":String(n):typeof n=="boolean"?n:~t.boolean.indexOf(s)?n==="false"?!1:n==="true"||(e._.push((i=+n,i*0===0?i:n)),!!n):(i=+n,i*0===0?i:n);e[s]=a==null?r:Array.isArray(a)?a.concat(r):[a,r]}function Qe(e,s){e=e||[],s=s||{};var n,t,i,a,r,o={_:[]},c=0,l=0,u=0,m=e.length;let A=s.alias!==void 0,p=s.unknown!==void 0,h=s.default!==void 0;if(s.alias=s.alias||{},s.string=U(s.string),s.boolean=U(s.boolean),A)for(n in s.alias)for(t=s.alias[n]=U(s.alias[n]),c=0;c<t.length;c++)(s.alias[t[c]]=t.concat(n)).splice(c,1);for(c=s.boolean.length;c-- >0;)for(t=s.alias[s.boolean[c]]||[],l=t.length;l-- >0;)s.boolean.push(t[l]);for(c=s.string.length;c-- >0;)for(t=s.alias[s.string[c]]||[],l=t.length;l-- >0;)s.string.push(t[l]);if(h){for(n in s.default)if(a=typeof s.default[n],t=s.alias[n]=s.alias[n]||[],s[a]!==void 0)for(s[a].push(n),c=0;c<t.length;c++)s[a].push(t[c])}let D=p?Object.keys(s.alias):[];for(c=0;c<m;c++){if(i=e[c],i==="--"){o._=o._.concat(e.slice(++c));break}for(l=0;l<i.length&&i.charCodeAt(l)===45;l++);if(l===0)o._.push(i);else if(i.substring(l,l+3)==="no-"){if(a=i.substring(l+3),p&&!~D.indexOf(a))return s.unknown(i);o[a]=!1}else{for(u=l+1;u<i.length&&i.charCodeAt(u)!==61;u++);for(a=i.substring(l,u),r=i.substring(++u)||c+1===m||(""+e[c+1]).charCodeAt(0)===45||e[++c],t=l===2?[a]:a,u=0;u<t.length;u++){if(a=t[u],p&&!~D.indexOf(a))return s.unknown("-".repeat(l)+a);ze(o,a,u+1<t.length||r,s)}}}if(h)for(n in s.default)o[n]===void 0&&(o[n]=s.default[n]);if(A)for(n in o)for(t=s.alias[n]||[];t.length>0;)o[t.shift()]=o[n];return o}function $e(e){return e.replace(/[<[].+/,"").trim()}function Xe(e){let s=/<([^>]+)>/g,n=/\[([^\]]+)\]/g,t=[],i=o=>{let c=!1,l=o[1];return l.startsWith("...")&&(l=l.slice(3),c=!0),{required:o[0].startsWith("<"),value:l,variadic:c}},a;for(;a=s.exec(e);)t.push(i(a));let r;for(;r=n.exec(e);)t.push(i(r));return t}function Ze(e){let s={alias:{},boolean:[]};for(let[n,t]of e.entries())t.names.length>1&&(s.alias[t.names[0]]=t.names.slice(1)),t.isBoolean&&(t.negated&&e.some((i,a)=>a!==n&&i.names.some(r=>t.names.includes(r))&&typeof i.required=="boolean")||s.boolean.push(t.names[0]));return s}function Ce(e){return e.sort((s,n)=>s.length>n.length?-1:1)[0]}function Se(e,s){return e.length>=s?e:`${e}${" ".repeat(s-e.length)}`}function et(e){return e.replaceAll(/([a-z])-([a-z])/g,(s,n,t)=>n+t.toUpperCase())}function tt(e,s,n){let t=e;for(let i=0;i<s.length;i++){let a=s[i];if(i===s.length-1){t[a]=n;return}if(t[a]==null){let r=+s[i+1]>-1;t[a]=r?[]:{}}t=t[a]}}function nt(e,s){for(let n of Object.keys(s)){let t=s[n];t.shouldTransform&&(e[n]=[e[n]].flat(),typeof t.transformFunction=="function"&&(e[n]=e[n].map(t.transformFunction)))}}function st(e){let s=/([^\\/]+)$/.exec(e);return s?s[1]:""}function je(e){return e.split(".").map((s,n)=>n===0?et(s):s).join(".")}var j=class extends Error{constructor(e){super(e),this.name="CACError",typeof Error.captureStackTrace!="function"&&(this.stack=new Error(e).stack)}},it=class{rawName;description;name;names;isBoolean;required;config;negated;constructor(e,s,n){this.rawName=e,this.description=s,this.config=Object.assign({},n),e=e.replaceAll(".*",""),this.negated=!1,this.names=$e(e).split(",").map(t=>{let i=t.trim().replace(/^-{1,2}/,"");return i.startsWith("no-")&&(this.negated=!0,i=i.replace(/^no-/,"")),je(i)}).sort((t,i)=>t.length>i.length?1:-1),this.name=this.names.at(-1),this.negated&&this.config.default==null&&(this.config.default=!0),e.includes("<")?this.required=!0:e.includes("[")?this.required=!1:this.isBoolean=!0}},L,E;if(typeof process<"u"){let e;typeof Deno<"u"&&typeof Deno.version?.deno=="string"?e="deno":typeof Bun<"u"&&typeof Bun.version=="string"?e="bun":e="node",E=`${process.platform}-${process.arch} ${e}-${process.version}`,L=process.argv}else typeof navigator>"u"?E="unknown":E=`${navigator.platform} ${navigator.userAgent}`;var Ee=class{rawName;description;config;cli;options;aliasNames;name;args;commandAction;usageText;versionNumber;examples;helpCallback;globalCommand;constructor(e,s,n={},t){this.rawName=e,this.description=s,this.config=n,this.cli=t,this.options=[],this.aliasNames=[],this.name=$e(e),this.args=Xe(e),this.examples=[]}usage(e){return this.usageText=e,this}allowUnknownOptions(){return this.config.allowUnknownOptions=!0,this}ignoreOptionDefaultValue(){return this.config.ignoreOptionDefaultValue=!0,this}version(e,s="-v, --version"){return this.versionNumber=e,this.option(s,"Display version number"),this}example(e){return this.examples.push(e),this}option(e,s,n){let t=new it(e,s,n);return this.options.push(t),this}alias(e){return this.aliasNames.push(e),this}action(e){return this.commandAction=e,this}isMatched(e){return this.name===e||this.aliasNames.includes(e)}get isDefaultCommand(){return this.name===""||this.aliasNames.includes("!")}get isGlobalCommand(){return this instanceof Te}hasOption(e){return e=e.split(".")[0],this.options.find(s=>s.names.includes(e))}outputHelp(){let{name:e,commands:s}=this.cli,{versionNumber:n,options:t,helpCallback:i}=this.cli.globalCommand,a=[{body:`${e}${n?`/${n}`:""}`}];if(a.push({title:"Usage",body:` $ ${e} ${this.usageText||this.rawName}`}),(this.isGlobalCommand||this.isDefaultCommand)&&s.length>0){let o=Ce(s.map(c=>c.rawName));a.push({title:"Commands",body:s.map(c=>` ${Se(c.rawName,o.length)} ${c.description}`).join(`
|
|
3
3
|
`)},{title:"For more info, run any command with the `--help` flag",body:s.map(c=>` $ ${e}${c.name===""?"":` ${c.name}`} --help`).join(`
|
|
4
4
|
`)})}let r=this.isGlobalCommand?t:[...this.options,...t||[]];if(!this.isGlobalCommand&&!this.isDefaultCommand&&(r=r.filter(o=>o.name!=="version")),r.length>0){let o=Ce(r.map(c=>c.rawName));a.push({title:"Options",body:r.map(c=>` ${Se(c.rawName,o.length)} ${c.description} ${c.config.default===void 0?"":`(default: ${c.config.default})`}`).join(`
|
|
5
5
|
`)})}this.examples.length>0&&a.push({title:"Examples",body:this.examples.map(o=>typeof o=="function"?o(e):o).join(`
|
|
@@ -18,37 +18,37 @@ Files were created but not committed \u2014 that call is yours.`}}function dt(e)
|
|
|
18
18
|
`:"";P(s,`${n}${t}${Ne}
|
|
19
19
|
`,"utf8")}function ct(e,s,n){let t=F(e,s),i=T(t)?Ke(t,"utf8"):null,a=G(i,n);a!==i&&P(t,a,"utf8")}import{existsSync as lt}from"node:fs";import{isAbsolute as ut,join as mt,relative as ft}from"node:path";function Re(e,s){let n=s.toUpperCase();return e.decisions.find(t=>t.id===n||t.label===n)}function Ie(e){return k(1,"decision_not_found",`No decision ${e}.
|
|
20
20
|
kadence decision list`,{received:e,hint:"kadence decision list --json"})}function Be(e,s,n,t){let i=b(e,s);if(!y(i))return i;let a=n.trim();if(a.length===0)return k(2,"invalid_argument","A decision needs a title.",{hint:'kadence decision add "Use ULIDs" --why "Clocks disagree between machines"'});let r=t.why?.trim()??"";if(r.length===0)return k(2,"invalid_argument",`A decision needs a reason.
|
|
21
|
-
--why "..."`,{received:a,hint:'kadence decision add "Use ULIDs" --why "Clocks disagree between machines"'});let{state:o,warnings:c}=
|
|
22
|
-
It replaces ${t.supersedes}, and both links were written by one event \u2014 neither side can go stale.`;return{ok:!0,exitCode:0,warnings:[...c,...p],message:`${W} recorded.${He}`,data:{schema:"kadence/v1",ok:!0,decision:{id:h,label:W,title:a}}}}function Ue(e,s,n){let t=b(e,s);if(!y(t))return t;let{state:i,warnings:a}=
|
|
21
|
+
--why "..."`,{received:a,hint:'kadence decision add "Use ULIDs" --why "Clocks disagree between machines"'});let{state:o,warnings:c}=w(i.root,i.actor),l;if(t.task!==void 0){let g=R(o,t.task);if(g===void 0)return _(t.task);l=g.id}let u;if(t.supersedes!==void 0){let g=Re(o,t.supersedes);if(g===void 0)return Ie(t.supersedes);u=g.id,l===void 0&&g.task!==null&&(l=g.task)}let m=(t.docs??[]).map(g=>ut(g)?ft(i.root,g):g.replace(/^\.\//,"")),p=m.filter(g=>!lt(mt(i.root,g))).map(g=>`No file at ${g} \u2014 the link is recorded anyway; it may arrive later.`),h=x();C(i.root,{id:h,type:"decision.recorded",entity:h,actor:i.actor,ts:new Date().toISOString(),source:i.source,data:{title:a,why:r,...t.rejected!==void 0?{rejected:t.rejected.trim()}:{},...l!==void 0?{task:l}:{},...u!==void 0?{supersedes:u}:{},...m.length>0?{docs:m}:{}}});let W=w(i.root,i.actor).state.decisions.find(g=>g.id===h)?.label??h,He=u===void 0?"":`
|
|
22
|
+
It replaces ${t.supersedes}, and both links were written by one event \u2014 neither side can go stale.`;return{ok:!0,exitCode:0,warnings:[...c,...p],message:`${W} recorded.${He}`,data:{schema:"kadence/v1",ok:!0,decision:{id:h,label:W,title:a}}}}function Ue(e,s,n){let t=b(e,s);if(!y(t))return t;let{state:i,warnings:a}=w(t.root,t.actor),r=i.decisions;if(n.task!==void 0){let o=R(i,n.task);if(o===void 0)return _(n.task);r=r.filter(c=>c.task===o.id)}return n.all!==!0&&(r=r.filter(o=>o.supersededBy===null)),{ok:!0,exitCode:0,warnings:a,message:pt(r,i),data:{schema:"kadence/v1",ok:!0,decisions:r.map(o=>Pe(o,i))}}}function Le(e,s,n){let t=b(e,s);if(!y(t))return t;let{state:i,warnings:a}=w(t.root,t.actor),r=Re(i,n);return r===void 0?Ie(n):{ok:!0,exitCode:0,warnings:a,message:ht(r,i),data:{schema:"kadence/v1",ok:!0,decision:Pe(r,i)}}}function S(e,s){return s===null?null:e.decisions.find(n=>n.id===s)?.label??e.tasks.find(n=>n.id===s)?.label??s}function Pe(e,s){return{id:e.id,label:e.label,title:e.title,why:e.why,rejected:e.rejected,task:S(s,e.task),docs:e.docs,supersedes:S(s,e.supersedes),supersededBy:S(s,e.supersededBy),superseded:e.supersededBy!==null,at:e.at,by:e.by,source:e.source}}function pt(e,s){return e.length===0?`No decisions recorded yet.
|
|
23
23
|
Record the first one:
|
|
24
|
-
kadence decision add "Use ULIDs" --why "Clocks disagree"`:e.map(n=>{let t=n.supersededBy===null?"":` (superseded by ${S(s,n.supersededBy)})
|
|
25
|
-
`)}function ht(e,s){let n=[`${e.label} ${e.title}`];return e.supersededBy!==null&&n.push("",`!! SUPERSEDED by ${S(s,e.supersededBy)} \u2014 this is no longer in force.`),n.push("",`Why: ${e.why}`),e.rejected!==null&&n.push(`Rejected: ${e.rejected}`),e.task!==null&&n.push(`Task: ${S(s,e.task)}`),e.docs.length>0&&n.push(`Docs: ${e.docs.join(", ")}`),e.supersedes!==null&&n.push(`Replaces: ${S(s,e.supersedes)}`),n.join(`
|
|
26
|
-
`)}import{writeSync as kt}from"node:fs";var M="cancelled";function Fe(e,s,n,t){let i=b(e,s);if(!y(i))return i;let{fields:a,error:r}=ae(t);if(r!==null)return r;let{state:o,warnings:c}=
|
|
24
|
+
kadence decision add "Use ULIDs" --why "Clocks disagree"`:e.map(n=>{let t=n.supersededBy===null?"":` (superseded by ${S(s,n.supersededBy)})`,i=n.source==="agent"?" [agent]":"";return`${n.label} ${n.title}${t}${i}`}).join(`
|
|
25
|
+
`)}function ht(e,s){let n=[`${e.label} ${e.title}`];return e.supersededBy!==null&&n.push("",`!! SUPERSEDED by ${S(s,e.supersededBy)} \u2014 this is no longer in force.`),n.push("",`Why: ${e.why}`),e.rejected!==null&&n.push(`Rejected: ${e.rejected}`),e.task!==null&&n.push(`Task: ${S(s,e.task)}`),e.docs.length>0&&n.push(`Docs: ${e.docs.join(", ")}`),n.push(`By: ${e.by}${e.source==="agent"?" (agent)":""}`),e.supersedes!==null&&n.push(`Replaces: ${S(s,e.supersedes)}`),n.join(`
|
|
26
|
+
`)}import{writeSync as kt}from"node:fs";var M="cancelled";function Fe(e,s,n,t){let i=b(e,s);if(!y(i))return i;let{fields:a,error:r}=ae(t);if(r!==null)return r;let{state:o,warnings:c}=w(i.root,i.actor),l=o.tasks.filter(p=>p.status!==M);if(n.assignee!==void 0){let p=n.assignee.toLowerCase(),h=p==="me"?i.actor.toLowerCase():p;l=l.filter(D=>(D.assignee??"").toLowerCase()===h)}if(n.sprint==="active"){let p=o.sprints.find(h=>h.status==="active"||h.status==="planned");l=p===void 0?[]:l.filter(h=>h.sprint===p.id)}let u={};for(let p of o.statuses)p!==M&&(u[p]=l.filter(h=>h.status===p));let m=o.orphanStatuses.filter(p=>p!==M);for(let p of m)u[p]=l.filter(h=>h.status===p);let A=m.length>0?[`Statuses not in the board configuration: ${m.join(", ")}.
|
|
27
27
|
Tasks there are still shown. Add the column or move them:
|
|
28
|
-
kadence board config --statuses "..."`]:[];return{ok:!0,exitCode:0,warnings:[...c,...A],message:ee(u,Z(s,process.stdout.isTTY===!0)),data:{schema:"kadence/v1",ok:!0,columns:Object.fromEntries(Object.entries(u).map(([p,h])=>[p,h.map(D=>re(D,a))]))}}}function Me(e,s,n){let t=b(e,s);if(!y(t))return t;let{state:i,warnings:a}=
|
|
28
|
+
kadence board config --statuses "..."`]:[];return{ok:!0,exitCode:0,warnings:[...c,...A],message:ee(u,Z(s,process.stdout.isTTY===!0)),data:{schema:"kadence/v1",ok:!0,columns:Object.fromEntries(Object.entries(u).map(([p,h])=>[p,h.map(D=>re(D,a))]))}}}function Me(e,s,n){let t=b(e,s);if(!y(t))return t;let{state:i,warnings:a}=w(t.root,t.actor);if(n===void 0)return{ok:!0,exitCode:0,warnings:a,message:`Board columns: ${i.statuses.join(", ")}
|
|
29
29
|
|
|
30
30
|
Change them with:
|
|
31
31
|
kadence board config --statuses "todo,doing,review,done"`,data:{schema:"kadence/v1",ok:!0,statuses:i.statuses}};let r=n.split(",").map(l=>l.trim().toLowerCase().replace(/\s+/g,"_")).filter(l=>l.length>0);if(r.length===0)return k(2,"invalid_argument","At least one status is required.",{received:n});if(new Set(r).size!==r.length)return k(2,"invalid_argument","The same status is listed twice.",{received:n});if(!r.includes(N))return k(2,"invalid_argument",`The list must include "${N}" \u2014 velocity and burndown are computed from it.`,{received:n});let o=i.tasks.filter(l=>!r.includes(l.status)&&l.status!==z);C(t.root,{id:x(),type:"board.configured",entity:x(),actor:t.actor,ts:new Date().toISOString(),source:t.source,data:{statuses:r}});let c=o.length>0?`
|
|
32
32
|
${o.length} task(s) remain in removed columns: ${[...new Set(o.map(l=>l.status))].join(", ")}. They are still listed.`:"";return{ok:!0,exitCode:0,warnings:a,message:`Board columns: ${r.join(", ")}${c}`,data:{schema:"kadence/v1",ok:!0,statuses:r}}}var gt=["description","type","priority","estimate","labels","assignee"];function qe(e,s,n,t){let i=b(e,s);if(!y(i))return i;let a=n.trim();if(a.length===0)return k(2,"invalid_argument","A template needs a name.",{hint:"kadence template list --json"});let r={};for(let o of gt)t[o]!==void 0&&(r[o]=t[o]);return Object.keys(r).length===0?k(2,"invalid_argument",`A template needs at least one field.
|
|
33
33
|
kadence template save bug --type bug --priority high --label triage`,{received:n}):(C(i.root,{id:x(),type:"template.saved",entity:x(),actor:i.actor,ts:new Date().toISOString(),source:i.source,data:{name:a,fields:r}}),{ok:!0,exitCode:0,message:`Template "${a}" saved: ${Object.keys(r).join(", ")}.
|
|
34
|
-
kadence task add "title" --template ${a}`,data:{schema:"kadence/v1",ok:!0,template:{name:a,fields:r}}})}function We(e,s){let n=b(e,s);if(!y(n))return n;let{state:t,warnings:i}=
|
|
34
|
+
kadence task add "title" --template ${a}`,data:{schema:"kadence/v1",ok:!0,template:{name:a,fields:r}}})}function We(e,s){let n=b(e,s);if(!y(n))return n;let{state:t,warnings:i}=w(n.root,n.actor);return t.templates.length===0?{ok:!0,exitCode:0,warnings:i,message:`No templates yet.
|
|
35
35
|
kadence template save bug --type bug --priority high`,data:{schema:"kadence/v1",ok:!0,templates:[]}}:{ok:!0,exitCode:0,warnings:i,message:t.templates.map(a=>{let r=Object.entries(a.fields).map(([o,c])=>`${o}=${Array.isArray(c)?c.join("/"):String(c)}`).join(" ");return` ${a.name.padEnd(14)} ${r}`}).join(`
|
|
36
|
-
`),data:{schema:"kadence/v1",ok:!0,templates:t.templates}}}function Ye(e,s,n){let t=b(e,s);if(!y(t))return t;let{state:i,warnings:a}=
|
|
37
|
-
kadence template list`,{received:n,hint:"kadence template list --json"})}function Ve(e,s,n){let t=b(e,s);if(!y(t))return{error:t};let{state:i}=
|
|
36
|
+
`),data:{schema:"kadence/v1",ok:!0,templates:t.templates}}}function Ye(e,s,n){let t=b(e,s);if(!y(t))return t;let{state:i,warnings:a}=w(t.root,t.actor);return i.templates.some(r=>r.name===n)?(C(t.root,{id:x(),type:"template.deleted",entity:x(),actor:t.actor,ts:new Date().toISOString(),source:t.source,data:{name:n}}),{ok:!0,exitCode:0,warnings:a,message:`Template "${n}" deleted.`}):k(1,"template_not_found",`No template "${n}".
|
|
37
|
+
kadence template list`,{received:n,hint:"kadence template list --json"})}function Ve(e,s,n){let t=b(e,s);if(!y(t))return{error:t};let{state:i}=w(t.root,t.actor),a=i.templates.find(r=>r.name===n);if(a===void 0){let r=i.templates.map(o=>o.name);return{error:k(1,"template_not_found",`No template "${n}".`+(r.length>0?`
|
|
38
38
|
Available: ${r.join(", ")}`:`
|
|
39
|
-
kadence template save ...`),{received:n,...r.length>0?{allowed:r}:{}})}}return{fields:a.fields}}function q(e,s){let n=Buffer.from(s,"utf8"),t=0;for(;t<n.length;)try{t+=kt(e,n,t,n.length-t)}catch(i){if(i.code!=="EAGAIN")throw i}}var
|
|
39
|
+
kadence template save ...`),{received:n,...r.length>0?{allowed:r}:{}})}}return{fields:a.fields}}function q(e,s){let n=Buffer.from(s,"utf8"),t=0;for(;t<n.length;)try{t+=kt(e,n,t,n.length-t)}catch(i){if(i.code!=="EAGAIN")throw i}}var v=Oe("kadence");function d(e,s){for(let n of e.warnings??[])q(2,`${n}
|
|
40
40
|
`);if(s){let n=e.data??{schema:"kadence/v1",ok:e.ok,...e.ok?{}:{error:e.error??{message:e.message}}};q(1,`${JSON.stringify(n)}
|
|
41
41
|
`)}else q(e.ok?1:2,`${e.message}
|
|
42
42
|
`);process.exit(e.exitCode)}function Je(e,s,n,t){if(e!==void 0)return e;ge(process.env,process.stdout.isTTY===!0)||d(f(`No terminal available for an editor.
|
|
43
43
|
Pass the text directly:
|
|
44
|
-
--description "..."`),t);let i=he(process.env,s,n);return i.error!==null&&d({ok:!1,exitCode:1,message:i.error},t),i.text===null&&d({ok:!0,exitCode:0,message:"Aborted \u2014 nothing changed."},t),i.text}var bt=["add","list","show","edit","move","assign","comment","log","parent","block","unblock","cancel","delete"],yt=["create","add","edit","start","close","status","list","burndown"],
|
|
44
|
+
--description "..."`),t);let i=he(process.env,s,n);return i.error!==null&&d({ok:!1,exitCode:1,message:i.error},t),i.text===null&&d({ok:!0,exitCode:0,message:"Aborted \u2014 nothing changed."},t),i.text}var bt=["add","list","show","edit","move","assign","comment","log","parent","block","unblock","cancel","delete"],yt=["create","add","edit","start","close","status","list","burndown"],wt=["save","list","delete"];function f(e,s={}){return k(2,"invalid_argument",e,s)}function vt(e){let s=e.commands,n=e.errors;return`kadence/v1 \u2014 ${s.length} commands, ${n.length} error codes.
|
|
45
45
|
${e.stability}
|
|
46
46
|
|
|
47
47
|
The machine-readable form is what agents read:
|
|
48
|
-
kadence schema --json`}
|
|
48
|
+
kadence schema --json`}v.command("decision [action] [arg]","Decisions: add | list | show \u2014 the why behind the work").option("--why <text>","Why this was chosen. Required \u2014 without it this is a changelog line").option("--rejected <text>","The alternative that was turned down").option("--task <ref>","The task this decision came out of").option("--supersedes <ref>","The decision this one replaces").option("--doc <path>","A document that carries the detail; repeat for several").option("--all","Include superseded decisions, hidden by default").option("--json","Machine-readable output for agents").example(' kadence decision add "Use ULIDs" --why "Clocks disagree between machines"').example(' kadence decision add "Use Avro" --why "..." --supersedes DEC-1').example(" kadence decision list --json").action((e,s,n)=>{let t=n.json===!0,i=process.cwd(),a=n.doc===void 0?void 0:Array.isArray(n.doc)?n.doc:[n.doc];switch(e){case"add":s===void 0&&d(f(`A title is required:
|
|
49
49
|
kadence decision add "Use ULIDs" --why "..."`),t),d(Be(i,process.env,s,{...n.why!==void 0?{why:n.why}:{},...n.rejected!==void 0?{rejected:n.rejected}:{},...n.task!==void 0?{task:n.task}:{},...n.supersedes!==void 0?{supersedes:n.supersedes}:{},...a!==void 0?{docs:a}:{}}),t);break;case void 0:case"list":d(Ue(i,process.env,{...n.all===!0?{all:!0}:{},...n.task!==void 0?{task:n.task}:{}}),t);break;case"show":s===void 0&&d(f(`Which decision?
|
|
50
50
|
kadence decision show DEC-1`),t),d(Le(i,process.env,s),t);break;default:d(f(`Unknown action "${e}".
|
|
51
|
-
Available: add, list, show`),t)}});
|
|
51
|
+
Available: add, list, show`),t)}});v.command("schema","The machine-readable --json contract, for agents").option("--json","Machine-readable output for agents").example(" kadence schema --json").action(e=>{let s=e.json===!0,n=H("0.3.1");d({ok:!0,exitCode:0,message:vt(n),data:{schema:"kadence/v1",ok:!0,contract:n}},s)});v.command("init","Set up kadence in this repository").example(" kadence init").action(()=>{let e=_e(process.cwd(),"0.3.1");d({ok:e.ok,message:e.message,exitCode:e.ok?0:1},!1)});v.command("task [action] [arg] [value]","Tasks: add | list | show | move | assign | doc").option("--title <text>","New title (for edit)").option("-d, --description <text>","Full description; use quotes for multiple lines").option("--type <type>",`Type: ${Q.join(" | ")}`).option("--priority <level>",`Priority: ${X.join(" | ")}`).option("-a, --assignee <who>","Assignee, e.g. dev@example.com").option("--label <name>","Label; repeat the flag for several").option("--estimate <points>","Estimate in points, a positive number").option("--due <date>","Due date, YYYY-MM-DD; empty string clears it").option("--status <status>",`Filter by status: ${K.join(" | ")}`).option("--search <text>","Search title, description and comments").option("--overdue","Only tasks past their due date").option("--due-before <date>","Only tasks due before YYYY-MM-DD").option("--sort <key>",`Sort by: ${te.join(" | ")}`).option("--tree","Show parent/child structure").option("--parent <task>",'Parent task, e.g. KAD-1 (use "none" to detach)').option("--template <name>","Pre-fill fields from a saved template").option("--fields <list>","JSON only: comma-separated task fields to return").option("--json","Machine-readable output for agents").example(' kadence task add "Fix login" -d "Broken since 2.3" --type bug --priority high --estimate 3').example(" kadence task list --status in_progress --sort priority").example(" kadence task list --search cookie --overdue").example(" kadence task list --assignee me --label auth").example(" kadence task list --tree").example(" kadence task list --json --fields id,label,status").example(" kadence task move KAD-1,KAD-2,KAD-3 done bulk: all or nothing").example(' kadence task add "Login form" --parent KAD-1 KAD-1 can be an epic').example(" kadence task parent KAD-2 KAD-1").example(" kadence task block KAD-2 KAD-1 KAD-2 waits for KAD-1").example(" kadence task unblock KAD-2 KAD-1").example(" kadence task log KAD-1 2h also 90m, or -30m to correct").example(' kadence task add "Crash on save" --template bug').example(" kadence task show KAD-1").example(" kadence task move KAD-1 done").example(" kadence task edit KAD-1 --priority urgent --due 2026-09-30").example(" kadence task edit KAD-1 opens $EDITOR for the description").example(' kadence task comment KAD-1 "Needs review"').example(' kadence task assign KAD-1 dev@example.com (use "none" to unassign)').example(" kadence task cancel KAD-1 keeps it in history").example(" kadence task delete KAD-1 drops it from the board").action((e,s,n,t)=>{let i=t.json===!0,a=process.cwd();switch(e===void 0&&d(f(`Which action?
|
|
52
52
|
kadence task add "Fix login"
|
|
53
53
|
kadence task list
|
|
54
54
|
kadence task show KAD-1
|
|
@@ -78,9 +78,9 @@ Statuses: ${K.join(", ")}`),i),d(ie(a,process.env,s,n),i);break;case"assign":(s=
|
|
|
78
78
|
kadence task assign KAD-1 none to unassign`),i),d(oe(a,process.env,s,n),i);break;default:d(f(`Unknown action "${e}".
|
|
79
79
|
Available: add, list, show, edit, move, assign, comment, log,
|
|
80
80
|
parent, block, unblock, cancel, delete
|
|
81
|
-
kadence task --help`,{received:e,allowed:bt}),i)}});
|
|
81
|
+
kadence task --help`,{received:e,allowed:bt}),i)}});v.command("board [action]",'Kanban board in the terminal; "config" edits the columns').option("--fields <list>","JSON only: comma-separated task fields to return").option("--statuses <list>",'Comma-separated columns, e.g. "todo,doing,done"').option("-a, --assignee <who>",`Only this person's tasks; "me" means you`).option("--sprint","Only tasks in the active sprint").option("--json","Machine-readable output for agents").example(" kadence board").example(" kadence board --assignee me --sprint").example(" kadence board --json --fields label,status,assignee").example(" kadence board config").example(' kadence board config --statuses "todo,doing,review,done"').action((e,s)=>{e==="config"&&d(Me(process.cwd(),process.env,s.statuses),s.json===!0),e!==void 0&&d(f(`Unknown action "${e}".
|
|
82
82
|
Available: config
|
|
83
|
-
kadence board --help`,{received:e,allowed:["config"]}),s.json===!0),d(Fe(process.cwd(),process.env,{...s.assignee!==void 0?{assignee:s.assignee}:{},...s.sprint===!0?{sprint:"active"}:{}},s.json===!0?s.fields:void 0),s.json===!0)});
|
|
83
|
+
kadence board --help`,{received:e,allowed:["config"]}),s.json===!0),d(Fe(process.cwd(),process.env,{...s.assignee!==void 0?{assignee:s.assignee}:{},...s.sprint===!0?{sprint:"active"}:{}},s.json===!0?s.fields:void 0),s.json===!0)});v.command("sprint [action] [name]","Sprints: create | add | edit | start | close | status | list | burndown").option("--sprint <name>","Which sprint to add to; defaults to the active one").option("--name <name>","New name (for edit)").option("-d, --description <text>","Sprint description (for edit)").option("--start <date>","Start date, YYYY-MM-DD").option("--end <date>","End date, YYYY-MM-DD").option("--json","Machine-readable output for agents").example(' kadence sprint create "Sprint 1" first one starts right away').example(' kadence sprint create "Sprint 2" later ones are planned').example(' kadence sprint add KAD-1 --sprint "Sprint 2"').example(" kadence sprint start starts the next planned sprint").example(" kadence sprint edit --start 2026-09-01 --end 2026-09-14").example(' kadence sprint edit "Sprint 2" --name "Sprint 2: auth"').example(" kadence sprint burndown chart from the journal, any day").example(" kadence sprint close closes the active one, reports velocity").action((e,s,n)=>{let t=n.json===!0,i=process.cwd();switch(e===void 0&&d(f(`Which action?
|
|
84
84
|
kadence sprint create "Sprint 1"
|
|
85
85
|
kadence sprint add KAD-1
|
|
86
86
|
kadence sprint edit --start 2026-09-01
|
|
@@ -90,12 +90,12 @@ Available: config
|
|
|
90
90
|
kadence sprint list`),t),e){case"create":s===void 0&&d(f(`A sprint name is required:
|
|
91
91
|
kadence sprint create "Sprint 1"`),t),d(ke(i,process.env,s),t);break;case"add":s===void 0&&d(f(`Which task?
|
|
92
92
|
kadence sprint add KAD-1
|
|
93
|
-
kadence sprint add KAD-1 --sprint "Sprint 2"`),t),d(be(i,process.env,s,n.sprint===void 0?{}:{sprint:n.sprint}),t);break;case"edit":d(xe(i,process.env,s,{...n.name!==void 0?{name:n.name}:{},...n.description!==void 0?{description:n.description}:{},...n.start!==void 0?{startDate:n.start}:{},...n.end!==void 0?{endDate:n.end}:{}}),t);break;case"start":d(
|
|
93
|
+
kadence sprint add KAD-1 --sprint "Sprint 2"`),t),d(be(i,process.env,s,n.sprint===void 0?{}:{sprint:n.sprint}),t);break;case"edit":d(xe(i,process.env,s,{...n.name!==void 0?{name:n.name}:{},...n.description!==void 0?{description:n.description}:{},...n.start!==void 0?{startDate:n.start}:{},...n.end!==void 0?{endDate:n.end}:{}}),t);break;case"start":d(ve(i,process.env,s),t);break;case"close":d(ye(i,process.env),t);break;case"status":d(we(i,process.env),t);break;case"list":d(Ae(i,process.env),t);break;case"burndown":d(De(i,process.env,s),t);break;default:d(f(`Unknown action "${e}".
|
|
94
94
|
Available: create, add, edit, start, close, status, list, burndown
|
|
95
|
-
kadence sprint --help`,{received:e,allowed:yt}),t)}});
|
|
95
|
+
kadence sprint --help`,{received:e,allowed:yt}),t)}});v.command("template [action] [name]","Task templates: save | list | delete").option("-d, --description <text>","Default description").option("--type <type>","Default type").option("--priority <level>","Default priority").option("-a, --assignee <who>","Default assignee").option("--label <name>","Default label; repeat for several").option("--estimate <points>","Default estimate").option("--json","Machine-readable output for agents").example(" kadence template save bug --type bug --priority high --label triage").example(" kadence template list").action((e,s,n)=>{let t=n.json===!0,i=process.cwd();switch(e){case"save":{s===void 0&&d(f(`A template name is required:
|
|
96
96
|
kadence template save bug --type bug`),t);let a=n.label===void 0?void 0:Array.isArray(n.label)?n.label:[n.label];d(qe(i,process.env,s,{...n.description!==void 0?{description:n.description}:{},...n.type!==void 0?{type:n.type}:{},...n.priority!==void 0?{priority:n.priority}:{},...n.assignee!==void 0?{assignee:n.assignee}:{},...a!==void 0?{labels:a}:{},...n.estimate!==void 0?{estimate:Number(n.estimate)}:{}}),t);break}case"list":case void 0:d(We(i,process.env),t);break;case"delete":s===void 0&&d(f(`Which template?
|
|
97
97
|
kadence template delete bug`),t),d(Ye(i,process.env,s),t);break;default:d(f(`Unknown action "${e}".
|
|
98
|
-
Available: save, list, delete`,{received:e,allowed:
|
|
98
|
+
Available: save, list, delete`,{received:e,allowed:wt}),t)}});v.command("ui","Interactive kanban board").alias("board:ui").example(" kadence ui").action(async()=>{let{runUi:e}=await import("./chunks/ui-HHJ5TWYZ.js"),s=await e(process.cwd(),process.env);s.ok||d(s,!1)});v.help();v.version("0.3.1");var $=process.argv;if($[2]==="task"&&$[3]==="log"&&$[4]!==void 0&&$[5]!==void 0){let e=B(process.cwd(),process.env,$[4],$[5]),s=$.includes("--json");d(e,s)}var Ge=process.argv.findIndex((e,s)=>e.startsWith("-")&&/^-\d+(\.\d+)?$/.test(e)&&process.argv[s-1]==="--estimate");Ge!==-1&&(process.stderr.write(`Estimate must be a positive number, got "${process.argv[Ge]}".
|
|
99
99
|
kadence task add "Fix login" --estimate 3
|
|
100
|
-
`),process.exit(2));try{
|
|
100
|
+
`),process.exit(2));try{v.parse()}catch(e){process.stderr.write(`${e.message}
|
|
101
101
|
`),process.exit(2)}
|
package/package.json
CHANGED