@basementuniverse/kanbn 1.1.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/README.md +3 -0
  2. package/coverage/base.css +224 -0
  3. package/coverage/block-navigation.js +87 -0
  4. package/coverage/coverage-summary.json +31 -0
  5. package/coverage/favicon.png +0 -0
  6. package/coverage/index.html +146 -0
  7. package/coverage/kanbn/index.html +116 -0
  8. package/coverage/kanbn/index.js.html +217 -0
  9. package/coverage/kanbn/src/board.js.html +646 -0
  10. package/coverage/kanbn/src/controller/add.js.html +1729 -0
  11. package/coverage/kanbn/src/controller/archive.js.html +277 -0
  12. package/coverage/kanbn/src/controller/board.js.html +217 -0
  13. package/coverage/kanbn/src/controller/burndown.js.html +607 -0
  14. package/coverage/kanbn/src/controller/comment.js.html +397 -0
  15. package/coverage/kanbn/src/controller/edit.js.html +2920 -0
  16. package/coverage/kanbn/src/controller/find.js.html +1597 -0
  17. package/coverage/kanbn/src/controller/gantt.js.html +1342 -0
  18. package/coverage/kanbn/src/controller/help.js.html +115 -0
  19. package/coverage/kanbn/src/controller/history.js.html +400 -0
  20. package/coverage/kanbn/src/controller/index.html +431 -0
  21. package/coverage/kanbn/src/controller/init.js.html +511 -0
  22. package/coverage/kanbn/src/controller/move.js.html +514 -0
  23. package/coverage/kanbn/src/controller/remove-all.js.html +226 -0
  24. package/coverage/kanbn/src/controller/remove.js.html +307 -0
  25. package/coverage/kanbn/src/controller/rename.js.html +397 -0
  26. package/coverage/kanbn/src/controller/restore.js.html +268 -0
  27. package/coverage/kanbn/src/controller/sort.js.html +1318 -0
  28. package/coverage/kanbn/src/controller/sprint.js.html +361 -0
  29. package/coverage/kanbn/src/controller/status.js.html +310 -0
  30. package/coverage/kanbn/src/controller/task.js.html +244 -0
  31. package/coverage/kanbn/src/controller/validate.js.html +367 -0
  32. package/coverage/kanbn/src/controller/version.js.html +100 -0
  33. package/coverage/kanbn/src/index.html +191 -0
  34. package/coverage/kanbn/src/main.js.html +9787 -0
  35. package/coverage/kanbn/src/parse-index.js.html +1063 -0
  36. package/coverage/kanbn/src/parse-markdown.js.html +202 -0
  37. package/coverage/kanbn/src/parse-task.js.html +2191 -0
  38. package/coverage/kanbn/src/utility.js.html +616 -0
  39. package/coverage/lcov.info +11837 -0
  40. package/coverage/prettify.css +1 -0
  41. package/coverage/prettify.js +2 -0
  42. package/coverage/sort-arrow-sprite.png +0 -0
  43. package/coverage/sorter.js +210 -0
  44. package/coverage/tmp/coverage-214292-1787777191526-0.json +1 -0
  45. package/coverage/tmp/coverage-214293-1787777184569-0.json +1 -0
  46. package/docs/advanced-configuration.md +25 -0
  47. package/docs/commands/add.txt +19 -0
  48. package/docs/commands/archive.txt +5 -0
  49. package/docs/commands/board.txt +8 -1
  50. package/docs/commands/boards.txt +34 -0
  51. package/docs/commands/burndown.txt +8 -4
  52. package/docs/commands/comment.txt +5 -0
  53. package/docs/commands/edit.txt +27 -0
  54. package/docs/commands/find.txt +56 -1
  55. package/docs/commands/gantt.txt +5 -0
  56. package/docs/commands/help.txt +2 -0
  57. package/docs/commands/history.txt +5 -0
  58. package/docs/commands/init.txt +13 -0
  59. package/docs/commands/move.txt +10 -1
  60. package/docs/commands/remove.txt +12 -1
  61. package/docs/commands/rename.txt +5 -0
  62. package/docs/commands/restore.txt +6 -0
  63. package/docs/commands/sort.txt +18 -2
  64. package/docs/commands/sprint.txt +9 -0
  65. package/docs/commands/status.txt +10 -1
  66. package/docs/commands/task.txt +5 -0
  67. package/docs/commands/validate.txt +27 -0
  68. package/docs/filtering-and-sorting.md +218 -0
  69. package/docs/index-structure.md +94 -19
  70. package/docs/index.md +28 -2
  71. package/docs/migration-2.0.md +92 -0
  72. package/docs/multiple-boards.md +258 -0
  73. package/docs/quick-start.md +57 -1
  74. package/docs/task-structure.md +33 -3
  75. package/docs/views.md +229 -0
  76. package/example/README.md +93 -0
  77. package/example/advanced/.kanbn/index.md +26 -0
  78. package/example/advanced/.kanbn/tasks/add-rate-limiting.md +18 -0
  79. package/example/advanced/.kanbn/tasks/add-sso-support.md +15 -0
  80. package/example/advanced/.kanbn/tasks/migrate-to-new-cdn.md +14 -0
  81. package/example/advanced/.kanbn/tasks/refresh-marketing-site.md +14 -0
  82. package/example/advanced/.kanbn/tasks/rotate-api-keys.md +15 -0
  83. package/example/advanced/.kanbn/tasks/split-billing-service.md +17 -0
  84. package/example/advanced/.kanbn/tasks/upgrade-node-runtime.md +19 -0
  85. package/example/advanced/kanbn.yml +59 -0
  86. package/example/boards/.kanbn/design.md +31 -0
  87. package/example/boards/.kanbn/index.md +44 -0
  88. package/example/boards/.kanbn/tasks/add-usage-alert-emails.md +19 -0
  89. package/example/boards/.kanbn/tasks/build-tenant-settings-page.md +43 -0
  90. package/example/boards/.kanbn/tasks/create-organization-switcher.md +44 -0
  91. package/example/boards/.kanbn/tasks/design-onboarding-checklist.md +22 -0
  92. package/example/boards/.kanbn/tasks/refresh-marketing-site.md +28 -0
  93. package/example/boards/.kanbn/tasks/ship-billing-portal.md +29 -0
  94. package/example/views/.kanbn/index.md +140 -0
  95. package/example/views/.kanbn/tasks/add-audit-log-export.md +18 -0
  96. package/example/views/.kanbn/tasks/add-dark-mode-toggle.md +16 -0
  97. package/example/views/.kanbn/tasks/build-webhook-retry-queue.md +15 -0
  98. package/example/views/.kanbn/tasks/fix-avatar-upload-crash.md +13 -0
  99. package/example/views/.kanbn/tasks/fix-expired-session-redirect.md +15 -0
  100. package/example/views/.kanbn/tasks/investigate-offline-mode.md +12 -0
  101. package/example/views/.kanbn/tasks/rewrite-search-indexer.md +12 -0
  102. package/example/views/.kanbn/tasks/tidy-up-settings-copy.md +12 -0
  103. package/package.json +12 -9
  104. package/routes/add.json +35 -11
  105. package/routes/archive.json +10 -2
  106. package/routes/board.json +11 -3
  107. package/routes/boards.json +30 -0
  108. package/routes/burndown.json +23 -7
  109. package/routes/comment.json +14 -4
  110. package/routes/edit.json +33 -10
  111. package/routes/find.json +37 -12
  112. package/routes/gantt.json +20 -6
  113. package/routes/history.json +39 -25
  114. package/routes/init.json +3 -1
  115. package/routes/move.json +22 -6
  116. package/routes/remove.json +15 -4
  117. package/routes/rename.json +11 -3
  118. package/routes/restore.json +8 -2
  119. package/routes/sort.json +35 -11
  120. package/routes/sprint.json +14 -4
  121. package/routes/status.json +23 -7
  122. package/routes/task.json +10 -2
  123. package/routes/validate.json +19 -4
  124. package/skills/kanbn-plan/SKILL.md +10 -1
  125. package/skills/kanbn-plan/references/index-structure.md +1 -0
  126. package/skills/kanbn-plan/references/task-structure.md +2 -0
  127. package/skills/kanbn-replan/SKILL.md +6 -1
  128. package/src/board.js +2 -1
  129. package/src/controller/add.js +52 -46
  130. package/src/controller/archive.js +8 -4
  131. package/src/controller/board.js +9 -4
  132. package/src/controller/boards.js +140 -0
  133. package/src/controller/burndown.js +9 -5
  134. package/src/controller/comment.js +9 -5
  135. package/src/controller/edit.js +74 -17
  136. package/src/controller/find.js +12 -9
  137. package/src/controller/gantt.js +8 -4
  138. package/src/controller/history.js +8 -4
  139. package/src/controller/init.js +39 -4
  140. package/src/controller/move.js +69 -15
  141. package/src/controller/remove.js +34 -11
  142. package/src/controller/rename.js +8 -4
  143. package/src/controller/restore.js +23 -8
  144. package/src/controller/sort.js +19 -3
  145. package/src/controller/sprint.js +31 -7
  146. package/src/controller/status.js +20 -4
  147. package/src/controller/task.js +22 -9
  148. package/src/controller/validate.js +139 -23
  149. package/src/git-user-name.js +19 -0
  150. package/src/main.d.ts +184 -6
  151. package/src/main.js +1642 -221
  152. package/src/parse-index.js +17 -0
  153. package/src/parse-markdown.js +3 -1
  154. package/src/parse-task.js +44 -1
  155. package/src/utility.js +166 -1
  156. package/PLANS.md +0 -9
  157. /package/example/{.kanbn → basic/.kanbn}/index.md +0 -0
  158. /package/example/{.kanbn → basic/.kanbn}/tasks/add-basic-activity-feed.md +0 -0
  159. /package/example/{.kanbn → basic/.kanbn}/tasks/add-passwordless-login-option.md +0 -0
  160. /package/example/{.kanbn → basic/.kanbn}/tasks/add-usage-alert-email-thresholds.md +0 -0
  161. /package/example/{.kanbn → basic/.kanbn}/tasks/build-email-template-system.md +0 -0
  162. /package/example/{.kanbn → basic/.kanbn}/tasks/build-invoice-download-endpoint.md +0 -0
  163. /package/example/{.kanbn → basic/.kanbn}/tasks/build-tenant-settings-page.md +0 -0
  164. /package/example/{.kanbn → basic/.kanbn}/tasks/create-organization-switcher.md +0 -0
  165. /package/example/{.kanbn → basic/.kanbn}/tasks/create-sandbox-environment-provisioner.md +0 -0
  166. /package/example/{.kanbn → basic/.kanbn}/tasks/create-self-serve-cancellation-flow.md +0 -0
  167. /package/example/{.kanbn → basic/.kanbn}/tasks/define-product-pricing-strategy.md +0 -0
  168. /package/example/{.kanbn → basic/.kanbn}/tasks/design-onboarding-checklist.md +0 -0
  169. /package/example/{.kanbn → basic/.kanbn}/tasks/design-team-invite-expiry-flow.md +0 -0
  170. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-data-retention-policy-jobs.md +0 -0
  171. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-feature-flags-foundation.md +0 -0
  172. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-project-creation-wizard.md +0 -0
  173. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-stripe-webhook-signature-check.md +0 -0
  174. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-team-permissions-ui.md +0 -0
  175. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-user-signup-and-login.md +0 -0
  176. /package/example/{.kanbn → basic/.kanbn}/tasks/integrate-crm-lead-sync.md +0 -0
  177. /package/example/{.kanbn → basic/.kanbn}/tasks/legal-review-terms-and-privacy.md +0 -0
  178. /package/example/{.kanbn → basic/.kanbn}/tasks/migrate-legacy-events-to-new-schema.md +0 -0
  179. /package/example/{.kanbn → basic/.kanbn}/tasks/optimize-dashboard-first-load.md +0 -0
  180. /package/example/{.kanbn → basic/.kanbn}/tasks/prototype-report-export-scheduler.md +0 -0
  181. /package/example/{.kanbn → basic/.kanbn}/tasks/publish-internal-qa-checklist.md +0 -0
  182. /package/example/{.kanbn → basic/.kanbn}/tasks/setup-ci-pipeline.md +0 -0
@@ -0,0 +1,19 @@
1
+ ---
2
+ created: 2026-07-09T15:00:00.000Z
3
+ tags:
4
+ - Medium
5
+ ---
6
+
7
+ # Add Usage Alert Emails
8
+
9
+ Warn an organisation by email when it crosses 80% and 100% of its plan's usage allowance.
10
+
11
+ Engineering-only work, so it never reaches the design board.
12
+
13
+ ## History
14
+
15
+ - type: created
16
+ date: 2026-07-09T15:00:00.000Z
17
+ column: Backlog
18
+ fromProgress: 0
19
+ toProgress: 0
@@ -0,0 +1,43 @@
1
+ ---
2
+ created: 2026-07-02T09:15:00.000Z
3
+ updated: 2026-07-14T11:30:00.000Z
4
+ started: 2026-07-10T09:00:00.000Z
5
+ designStartedAt: 2026-07-06T10:00:00.000Z
6
+ assigned: priya
7
+ tags:
8
+ - Medium
9
+ ---
10
+
11
+ # Build Tenant Settings Page
12
+
13
+ A single place for an organisation's owner to manage name, logo, timezone and default roles.
14
+
15
+ This task is on both boards: `In Progress` on the engineering board and `Designing` on the design
16
+ board. Its `started` date is the engineering start; `designStartedAt` is when design picked it up.
17
+
18
+ ## Sub-tasks
19
+
20
+ - [x] Settings form layout
21
+ - [ ] Logo upload and cropping
22
+ - [ ] Role defaults
23
+
24
+ ## History
25
+
26
+ - type: created
27
+ date: 2026-07-02T09:15:00.000Z
28
+ column: Backlog
29
+ fromProgress: 0
30
+ toProgress: 0
31
+ - type: added
32
+ date: 2026-07-06T10:00:00.000Z
33
+ column: Ideas
34
+ board: design
35
+ - type: moved
36
+ date: 2026-07-06T10:00:00.000Z
37
+ fromColumn: Ideas
38
+ toColumn: Designing
39
+ board: design
40
+ - type: moved
41
+ date: 2026-07-10T09:00:00.000Z
42
+ fromColumn: Backlog
43
+ toColumn: 'In Progress'
@@ -0,0 +1,44 @@
1
+ ---
2
+ created: 2026-07-03T14:00:00.000Z
3
+ updated: 2026-07-12T16:45:00.000Z
4
+ designStartedAt: 2026-07-05T09:30:00.000Z
5
+ designSignedOffAt: 2026-07-12T16:45:00.000Z
6
+ assigned: sam
7
+ tags:
8
+ - Small
9
+ ---
10
+
11
+ # Create Organization Switcher
12
+
13
+ A dropdown for moving between the organisations a user belongs to, without signing out.
14
+
15
+ Design has finished with this one - it sits in `Signed Off` on the design board - but engineering
16
+ hasn't started it, so it's still in `Todo` on the main board. Because the design board reads
17
+ `designSignedOffAt` rather than the shared `completed` field, finishing it here doesn't mark it done
18
+ for engineering.
19
+
20
+ ## Sub-tasks
21
+
22
+ - [ ] Switcher component
23
+ - [ ] Persist last-used organisation
24
+
25
+ ## History
26
+
27
+ - type: created
28
+ date: 2026-07-03T14:00:00.000Z
29
+ column: Backlog
30
+ fromProgress: 0
31
+ toProgress: 0
32
+ - type: added
33
+ date: 2026-07-05T09:30:00.000Z
34
+ column: Designing
35
+ board: design
36
+ - type: moved
37
+ date: 2026-07-08T10:00:00.000Z
38
+ fromColumn: Backlog
39
+ toColumn: Todo
40
+ - type: moved
41
+ date: 2026-07-12T16:45:00.000Z
42
+ fromColumn: Designing
43
+ toColumn: 'Signed Off'
44
+ board: design
@@ -0,0 +1,22 @@
1
+ ---
2
+ created: 2026-07-11T13:20:00.000Z
3
+ assigned: priya
4
+ tags:
5
+ - Small
6
+ ---
7
+
8
+ # Design Onboarding Checklist
9
+
10
+ An in-product checklist walking a new organisation through its first week.
11
+
12
+ This one is only on the design board - engineering hasn't picked it up, so it isn't on the main
13
+ board at all. `kanbn status --untracked` would not list it: it is tracked, just not here.
14
+
15
+ ## History
16
+
17
+ - type: created
18
+ date: 2026-07-11T13:20:00.000Z
19
+ column: Ideas
20
+ board: design
21
+ fromProgress: 0
22
+ toProgress: 0
@@ -0,0 +1,28 @@
1
+ ---
2
+ created: 2026-07-05T08:00:00.000Z
3
+ updated: 2026-07-13T09:00:00.000Z
4
+ designStartedAt: 2026-07-13T09:00:00.000Z
5
+ assigned: priya
6
+ tags:
7
+ - Large
8
+ ---
9
+
10
+ # Refresh Marketing Site
11
+
12
+ New landing page, pricing page and case studies, ahead of the autumn launch.
13
+
14
+ Design has started, engineering hasn't - `Designing` on the design board, `Backlog` on the main one.
15
+ This is the shape that makes per-board state fields worth having: the task genuinely is in flight on
16
+ one board and untouched on the other.
17
+
18
+ ## History
19
+
20
+ - type: created
21
+ date: 2026-07-05T08:00:00.000Z
22
+ column: Backlog
23
+ fromProgress: 0
24
+ toProgress: 0
25
+ - type: added
26
+ date: 2026-07-13T09:00:00.000Z
27
+ column: Designing
28
+ board: design
@@ -0,0 +1,29 @@
1
+ ---
2
+ created: 2026-06-24T10:00:00.000Z
3
+ updated: 2026-07-07T17:10:00.000Z
4
+ started: 2026-06-26T09:00:00.000Z
5
+ completed: 2026-07-07T17:10:00.000Z
6
+ assigned: sam
7
+ tags:
8
+ - Large
9
+ ---
10
+
11
+ # Ship Billing Portal
12
+
13
+ Self-serve plan changes, payment method updates and invoice history.
14
+
15
+ ## History
16
+
17
+ - type: created
18
+ date: 2026-06-24T10:00:00.000Z
19
+ column: Backlog
20
+ fromProgress: 0
21
+ toProgress: 0
22
+ - type: moved
23
+ date: 2026-06-26T09:00:00.000Z
24
+ fromColumn: Backlog
25
+ toColumn: 'In Progress'
26
+ - type: moved
27
+ date: 2026-07-07T17:10:00.000Z
28
+ fromColumn: 'In Progress'
29
+ toColumn: Done
@@ -0,0 +1,140 @@
1
+ ---
2
+ startedColumns:
3
+ - 'In Progress'
4
+ completedColumns:
5
+ - Done
6
+ hiddenColumns:
7
+ - Icebox
8
+ taskWorkloadTags:
9
+ Tiny: 1
10
+ Small: 2
11
+ Medium: 3
12
+ Large: 5
13
+ Huge: 8
14
+ views:
15
+
16
+ # The index columns, spelled out explicitly. Note that a view column with no
17
+ # filters would show *every* task, not the tasks in a column of that name.
18
+ - name: 'default'
19
+ columns:
20
+ - name: 'Backlog'
21
+ filters:
22
+ column: 'Backlog'
23
+ - name: 'In Progress'
24
+ filters:
25
+ column: 'In Progress'
26
+ - name: 'Done'
27
+ filters:
28
+ column: 'Done'
29
+
30
+ # The same columns, grouped into one lane per assignee.
31
+ # Lane filters are merged over each column's filters.
32
+ - name: 'by-assignee'
33
+ columns:
34
+ - name: 'Backlog'
35
+ filters:
36
+ column: 'Backlog'
37
+ - name: 'In Progress'
38
+ filters:
39
+ column: 'In Progress'
40
+ - name: 'Done'
41
+ filters:
42
+ column: 'Done'
43
+ lanes:
44
+ - name: 'Ana'
45
+ filters:
46
+ assigned: '^Ana$'
47
+ - name: 'Ben'
48
+ filters:
49
+ assigned: '^Ben$'
50
+ - name: 'Unassigned'
51
+ filters:
52
+ assigned: '^$'
53
+
54
+ # A root filter narrows the whole view to bugs before columns are built.
55
+ # The second column has no filters, so within this view it shows all bugs.
56
+ - name: 'triage'
57
+ filters:
58
+ tag: Bug
59
+ columns:
60
+ - name: 'Due before Aug 2026'
61
+ filters:
62
+ due:
63
+ - 2020-01-01
64
+ - 2026-08-01
65
+ sorters:
66
+ - field: workload
67
+ order: descending
68
+ - name: 'All bugs'
69
+ sorters:
70
+ - field: name
71
+ order: ascending
72
+
73
+ # Columns and lanes don't have to correspond to index columns at all.
74
+ - name: 'workload'
75
+ columns:
76
+ - name: 'Small (1-2)'
77
+ filters:
78
+ workload:
79
+ - 1
80
+ - 2
81
+ - name: 'Medium (3-5)'
82
+ filters:
83
+ workload:
84
+ - 3
85
+ - 5
86
+ - name: 'Large (6+)'
87
+ filters:
88
+ workload:
89
+ - 6
90
+ - 99
91
+ lanes:
92
+ - name: 'Not started'
93
+ filters:
94
+ column: 'Backlog'
95
+ - name: 'Started'
96
+ filters:
97
+ column: 'In Progress'
98
+
99
+ # A view that defines its own columns ignores hiddenColumns, so this one
100
+ # also shows tasks in the hidden Icebox column.
101
+ - name: 'everything'
102
+ columns:
103
+ - name: 'All tasks (including Icebox)'
104
+ sorters:
105
+ - field: column
106
+ order: ascending
107
+ - field: name
108
+ order: ascending
109
+ ---
110
+
111
+ # Views Example
112
+
113
+ A small board used to demonstrate views, lanes, filters and sorters. Try:
114
+
115
+ - `kanbn board`
116
+ - `kanbn board -v default`
117
+ - `kanbn board -v by-assignee`
118
+ - `kanbn board -v triage`
119
+ - `kanbn board -v workload`
120
+ - `kanbn board -v everything`
121
+
122
+ ## Backlog
123
+
124
+ - [add-audit-log-export](tasks/add-audit-log-export.md)
125
+ - [fix-avatar-upload-crash](tasks/fix-avatar-upload-crash.md)
126
+ - [rewrite-search-indexer](tasks/rewrite-search-indexer.md)
127
+ - [tidy-up-settings-copy](tasks/tidy-up-settings-copy.md)
128
+
129
+ ## In Progress
130
+
131
+ - [fix-expired-session-redirect](tasks/fix-expired-session-redirect.md)
132
+ - [build-webhook-retry-queue](tasks/build-webhook-retry-queue.md)
133
+
134
+ ## Done
135
+
136
+ - [add-dark-mode-toggle](tasks/add-dark-mode-toggle.md)
137
+
138
+ ## Icebox
139
+
140
+ - [investigate-offline-mode](tasks/investigate-offline-mode.md)
@@ -0,0 +1,18 @@
1
+ ---
2
+ created: 2026-07-02T09:00:00.000Z
3
+ updated: 2026-07-02T09:00:00.000Z
4
+ assigned: Ana
5
+ due: 2026-09-30T17:00:00.000Z
6
+ tags:
7
+ - Feature
8
+ - Medium
9
+ ---
10
+
11
+ # Add Audit Log Export
12
+
13
+ Let admins download an audit log as CSV.
14
+
15
+ ## Sub-tasks
16
+
17
+ - [ ] Add an export endpoint
18
+ - [ ] Add a download button to the audit log page
@@ -0,0 +1,16 @@
1
+ ---
2
+ created: 2026-06-20T09:00:00.000Z
3
+ updated: 2026-07-01T09:00:00.000Z
4
+ started: 2026-06-22T09:00:00.000Z
5
+ completed: 2026-07-01T09:00:00.000Z
6
+ assigned: Ana
7
+ progress: 1
8
+ due: 2026-07-01T17:00:00.000Z
9
+ tags:
10
+ - Feature
11
+ - Small
12
+ ---
13
+
14
+ # Add Dark Mode Toggle
15
+
16
+ Add a dark mode toggle to the account menu.
@@ -0,0 +1,15 @@
1
+ ---
2
+ created: 2026-07-07T09:00:00.000Z
3
+ updated: 2026-07-14T09:00:00.000Z
4
+ started: 2026-07-11T09:00:00.000Z
5
+ assigned: Ben
6
+ progress: 0.3
7
+ due: 2026-10-01T17:00:00.000Z
8
+ tags:
9
+ - Feature
10
+ - Large
11
+ ---
12
+
13
+ # Build Webhook Retry Queue
14
+
15
+ Retry failed webhook deliveries with exponential backoff.
@@ -0,0 +1,13 @@
1
+ ---
2
+ created: 2026-07-03T09:00:00.000Z
3
+ updated: 2026-07-03T09:00:00.000Z
4
+ assigned: Ben
5
+ due: 2026-07-20T17:00:00.000Z
6
+ tags:
7
+ - Bug
8
+ - Small
9
+ ---
10
+
11
+ # Fix Avatar Upload Crash
12
+
13
+ Uploading a PNG larger than 5MB crashes the avatar cropper.
@@ -0,0 +1,15 @@
1
+ ---
2
+ created: 2026-07-06T09:00:00.000Z
3
+ updated: 2026-07-12T09:00:00.000Z
4
+ started: 2026-07-10T09:00:00.000Z
5
+ assigned: Ana
6
+ progress: 0.5
7
+ due: 2026-07-25T17:00:00.000Z
8
+ tags:
9
+ - Bug
10
+ - Medium
11
+ ---
12
+
13
+ # Fix Expired Session Redirect
14
+
15
+ Expired sessions redirect to the dashboard instead of the login page.
@@ -0,0 +1,12 @@
1
+ ---
2
+ created: 2026-05-01T09:00:00.000Z
3
+ updated: 2026-05-01T09:00:00.000Z
4
+ due: 2027-01-01T17:00:00.000Z
5
+ tags:
6
+ - Feature
7
+ - Huge
8
+ ---
9
+
10
+ # Investigate Offline Mode
11
+
12
+ Parked until after the search rewrite.
@@ -0,0 +1,12 @@
1
+ ---
2
+ created: 2026-07-04T09:00:00.000Z
3
+ updated: 2026-07-04T09:00:00.000Z
4
+ due: 2026-11-30T17:00:00.000Z
5
+ tags:
6
+ - Feature
7
+ - Huge
8
+ ---
9
+
10
+ # Rewrite Search Indexer
11
+
12
+ Replace the nightly re-index with an incremental indexer.
@@ -0,0 +1,12 @@
1
+ ---
2
+ created: 2026-07-05T09:00:00.000Z
3
+ updated: 2026-07-05T09:00:00.000Z
4
+ due: 2026-10-15T17:00:00.000Z
5
+ tags:
6
+ - Chore
7
+ - Tiny
8
+ ---
9
+
10
+ # Tidy Up Settings Copy
11
+
12
+ Fix inconsistent capitalisation across the settings pages.
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "@basementuniverse/kanbn",
3
- "version": "1.1.1",
3
+ "version": "2.1.0",
4
4
  "description": "A CLI Kanban application",
5
5
  "main": "index.js",
6
6
  "scripts": {
7
- "test": "KANBN_ENV=test qunit ./test/**/*.test.js"
7
+ "test": "KANBN_ENV=test qunit ./test/**/*.test.js",
8
+ "coverage": "KANBN_ENV=test c8 --reporter=text --reporter=html --include=src/** --include=index.js qunit ./test/**/*.test.js"
8
9
  },
9
10
  "preferGlobal": true,
10
11
  "bin": {
@@ -17,7 +18,7 @@
17
18
  "url": "git+https://github.com/basementuniverse/kanbn.git"
18
19
  },
19
20
  "engines": {
20
- "node": ">=12.0.0"
21
+ "node": ">=16.13.0"
21
22
  },
22
23
  "keywords": [
23
24
  "kanbn",
@@ -37,7 +38,6 @@
37
38
  "dotenv": "^8.2.0",
38
39
  "front-matter": "^4.0.2",
39
40
  "fuzzy": "^0.1.3",
40
- "git-user-name": "^2.0.0",
41
41
  "glob-promise": "^3.4.0",
42
42
  "humanize-duration": "^3.25.0",
43
43
  "inquirer": "^7.3.3",
@@ -46,24 +46,27 @@
46
46
  "inquirer-recursive": "github:basementuniverse/inquirer-recursive",
47
47
  "inquirer-select-line": "github:basementuniverse/inquirer-select-line",
48
48
  "jsonschema": "^1.4.0",
49
- "marked": "^1.2.7",
50
- "marked-terminal": "^4.1.1",
51
- "minimist": "^1.2.5",
49
+ "marked": "^4.3.0",
50
+ "marked-terminal": "^5.2.0",
51
+ "minimist": "^1.2.8",
52
52
  "rimraf": "^3.0.2",
53
- "terminal-kit": "^1.44.0",
53
+ "terminal-kit": "^3.1.4",
54
54
  "yamljs": "^0.3.0"
55
55
  },
56
56
  "devDependencies": {
57
57
  "@types/typescript": "^2.0.0",
58
+ "c8": "^12.0.0",
58
59
  "capture-console": "^1.0.1",
59
60
  "faker": "^5.1.0",
60
61
  "mock-argv": "^1.1.10",
61
- "mock-fs": "^4.13.0",
62
62
  "mock-require": "^3.0.3",
63
63
  "mock-stdin": "^1.0.0",
64
64
  "mockdate": "^3.0.2",
65
65
  "qunit": "^2.13.0",
66
66
  "strip-ansi": "^6.0.0",
67
67
  "typescript": "^4.9.3"
68
+ },
69
+ "overrides": {
70
+ "tmp": "^0.2.7"
68
71
  }
69
72
  }
package/routes/add.json CHANGED
@@ -18,19 +18,43 @@
18
18
  "due",
19
19
  "plannedStart",
20
20
  "plannedFinish",
21
- "progress"
21
+ "progress",
22
+ "board"
22
23
  ],
23
24
  "alias": {
24
- "interactive": ["i"],
25
- "name": ["n"],
26
- "description": ["d"],
27
- "column": ["c"],
28
- "sub-task": ["s"],
29
- "tag": ["t"],
30
- "relation": ["r"],
31
- "due": ["e"],
32
- "assigned": ["a"],
33
- "untracked": ["u"]
25
+ "interactive": [
26
+ "i"
27
+ ],
28
+ "name": [
29
+ "n"
30
+ ],
31
+ "description": [
32
+ "d"
33
+ ],
34
+ "column": [
35
+ "c"
36
+ ],
37
+ "sub-task": [
38
+ "s"
39
+ ],
40
+ "tag": [
41
+ "t"
42
+ ],
43
+ "relation": [
44
+ "r"
45
+ ],
46
+ "due": [
47
+ "e"
48
+ ],
49
+ "assigned": [
50
+ "a"
51
+ ],
52
+ "untracked": [
53
+ "u"
54
+ ],
55
+ "board": [
56
+ "b"
57
+ ]
34
58
  }
35
59
  },
36
60
  "controller": "./src/controller/add",
@@ -9,8 +9,16 @@
9
9
  "list"
10
10
  ],
11
11
  "alias": {
12
- "list": ["l"]
13
- }
12
+ "list": [
13
+ "l"
14
+ ],
15
+ "board": [
16
+ "b"
17
+ ]
18
+ },
19
+ "string": [
20
+ "board"
21
+ ]
14
22
  },
15
23
  "controller": "./src/controller/archive",
16
24
  "help": "./docs/commands/archive.txt"
package/routes/board.json CHANGED
@@ -9,11 +9,19 @@
9
9
  "json"
10
10
  ],
11
11
  "string": [
12
- "view"
12
+ "view",
13
+ "board"
13
14
  ],
14
15
  "alias": {
15
- "view": ["v"],
16
- "json": ["j"]
16
+ "view": [
17
+ "v"
18
+ ],
19
+ "json": [
20
+ "j"
21
+ ],
22
+ "board": [
23
+ "b"
24
+ ]
17
25
  }
18
26
  },
19
27
  "controller": "./src/controller/board",
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "Boards",
3
+ "commands": [
4
+ "boards"
5
+ ],
6
+ "args": {
7
+ "boolean": [
8
+ "json",
9
+ "tasks",
10
+ "all",
11
+ "force"
12
+ ],
13
+ "string": [
14
+ "rename",
15
+ "delete",
16
+ "name"
17
+ ],
18
+ "alias": {
19
+ "json": ["j"],
20
+ "tasks": ["t"],
21
+ "all": ["a"],
22
+ "force": ["f"],
23
+ "rename": ["r"],
24
+ "delete": ["d"],
25
+ "name": ["n"]
26
+ }
27
+ },
28
+ "controller": "./src/controller/boards",
29
+ "help": "./docs/commands/boards.txt"
30
+ }
@@ -13,15 +13,31 @@
13
13
  "sprint",
14
14
  "assigned",
15
15
  "column",
16
- "normalise"
16
+ "normalise",
17
+ "board"
17
18
  ],
18
19
  "alias": {
19
- "json": ["j"],
20
- "date": ["d"],
21
- "sprint": ["p"],
22
- "assigned": ["a"],
23
- "column": ["c"],
24
- "normalise": ["n"]
20
+ "json": [
21
+ "j"
22
+ ],
23
+ "date": [
24
+ "d"
25
+ ],
26
+ "sprint": [
27
+ "p"
28
+ ],
29
+ "assigned": [
30
+ "a"
31
+ ],
32
+ "column": [
33
+ "c"
34
+ ],
35
+ "normalise": [
36
+ "n"
37
+ ],
38
+ "board": [
39
+ "b"
40
+ ]
25
41
  }
26
42
  },
27
43
  "controller": "./src/controller/burndown",