@basementuniverse/kanbn 1.1.1 → 2.0.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 (124) hide show
  1. package/README.md +2 -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 +2 -0
  47. package/docs/commands/add.txt +10 -0
  48. package/docs/commands/board.txt +3 -1
  49. package/docs/commands/burndown.txt +2 -4
  50. package/docs/commands/edit.txt +22 -0
  51. package/docs/commands/find.txt +45 -1
  52. package/docs/commands/help.txt +1 -0
  53. package/docs/commands/move.txt +1 -1
  54. package/docs/commands/sort.txt +13 -2
  55. package/docs/commands/validate.txt +12 -0
  56. package/docs/filtering-and-sorting.md +218 -0
  57. package/docs/index-structure.md +68 -19
  58. package/docs/index.md +26 -2
  59. package/docs/migration-2.0.md +92 -0
  60. package/docs/quick-start.md +37 -1
  61. package/docs/task-structure.md +12 -3
  62. package/docs/views.md +229 -0
  63. package/example/README.md +70 -0
  64. package/example/advanced/.kanbn/index.md +26 -0
  65. package/example/advanced/.kanbn/tasks/add-rate-limiting.md +18 -0
  66. package/example/advanced/.kanbn/tasks/add-sso-support.md +15 -0
  67. package/example/advanced/.kanbn/tasks/migrate-to-new-cdn.md +14 -0
  68. package/example/advanced/.kanbn/tasks/refresh-marketing-site.md +14 -0
  69. package/example/advanced/.kanbn/tasks/rotate-api-keys.md +15 -0
  70. package/example/advanced/.kanbn/tasks/split-billing-service.md +17 -0
  71. package/example/advanced/.kanbn/tasks/upgrade-node-runtime.md +19 -0
  72. package/example/advanced/kanbn.yml +59 -0
  73. package/example/views/.kanbn/index.md +140 -0
  74. package/example/views/.kanbn/tasks/add-audit-log-export.md +18 -0
  75. package/example/views/.kanbn/tasks/add-dark-mode-toggle.md +16 -0
  76. package/example/views/.kanbn/tasks/build-webhook-retry-queue.md +15 -0
  77. package/example/views/.kanbn/tasks/fix-avatar-upload-crash.md +13 -0
  78. package/example/views/.kanbn/tasks/fix-expired-session-redirect.md +15 -0
  79. package/example/views/.kanbn/tasks/investigate-offline-mode.md +12 -0
  80. package/example/views/.kanbn/tasks/rewrite-search-indexer.md +12 -0
  81. package/example/views/.kanbn/tasks/tidy-up-settings-copy.md +12 -0
  82. package/package.json +4 -3
  83. package/routes/edit.json +2 -1
  84. package/routes/validate.json +4 -2
  85. package/skills/kanbn-plan/references/index-structure.md +1 -0
  86. package/skills/kanbn-plan/references/task-structure.md +2 -0
  87. package/src/board.js +1 -0
  88. package/src/controller/board.js +6 -0
  89. package/src/controller/edit.js +65 -12
  90. package/src/controller/status.js +12 -0
  91. package/src/controller/task.js +1 -1
  92. package/src/controller/validate.js +78 -15
  93. package/src/main.js +300 -149
  94. package/src/parse-index.js +3 -0
  95. package/src/parse-markdown.js +3 -1
  96. package/src/parse-task.js +28 -1
  97. package/src/utility.js +26 -1
  98. package/PLANS.md +0 -9
  99. /package/example/{.kanbn → basic/.kanbn}/index.md +0 -0
  100. /package/example/{.kanbn → basic/.kanbn}/tasks/add-basic-activity-feed.md +0 -0
  101. /package/example/{.kanbn → basic/.kanbn}/tasks/add-passwordless-login-option.md +0 -0
  102. /package/example/{.kanbn → basic/.kanbn}/tasks/add-usage-alert-email-thresholds.md +0 -0
  103. /package/example/{.kanbn → basic/.kanbn}/tasks/build-email-template-system.md +0 -0
  104. /package/example/{.kanbn → basic/.kanbn}/tasks/build-invoice-download-endpoint.md +0 -0
  105. /package/example/{.kanbn → basic/.kanbn}/tasks/build-tenant-settings-page.md +0 -0
  106. /package/example/{.kanbn → basic/.kanbn}/tasks/create-organization-switcher.md +0 -0
  107. /package/example/{.kanbn → basic/.kanbn}/tasks/create-sandbox-environment-provisioner.md +0 -0
  108. /package/example/{.kanbn → basic/.kanbn}/tasks/create-self-serve-cancellation-flow.md +0 -0
  109. /package/example/{.kanbn → basic/.kanbn}/tasks/define-product-pricing-strategy.md +0 -0
  110. /package/example/{.kanbn → basic/.kanbn}/tasks/design-onboarding-checklist.md +0 -0
  111. /package/example/{.kanbn → basic/.kanbn}/tasks/design-team-invite-expiry-flow.md +0 -0
  112. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-data-retention-policy-jobs.md +0 -0
  113. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-feature-flags-foundation.md +0 -0
  114. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-project-creation-wizard.md +0 -0
  115. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-stripe-webhook-signature-check.md +0 -0
  116. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-team-permissions-ui.md +0 -0
  117. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-user-signup-and-login.md +0 -0
  118. /package/example/{.kanbn → basic/.kanbn}/tasks/integrate-crm-lead-sync.md +0 -0
  119. /package/example/{.kanbn → basic/.kanbn}/tasks/legal-review-terms-and-privacy.md +0 -0
  120. /package/example/{.kanbn → basic/.kanbn}/tasks/migrate-legacy-events-to-new-schema.md +0 -0
  121. /package/example/{.kanbn → basic/.kanbn}/tasks/optimize-dashboard-first-load.md +0 -0
  122. /package/example/{.kanbn → basic/.kanbn}/tasks/prototype-report-export-scheduler.md +0 -0
  123. /package/example/{.kanbn → basic/.kanbn}/tasks/publish-internal-qa-checklist.md +0 -0
  124. /package/example/{.kanbn → basic/.kanbn}/tasks/setup-ci-pipeline.md +0 -0
@@ -0,0 +1,646 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for kanbn/src/board.js</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">kanbn/src</a> board.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">100% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>187/187</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">95.38% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>62/65</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>3/3</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">100% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>187/187</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
254
+ <span class="cline-any cline-yes">1x</span>
255
+ <span class="cline-any cline-yes">1x</span>
256
+ <span class="cline-any cline-yes">1x</span>
257
+ <span class="cline-any cline-yes">1x</span>
258
+ <span class="cline-any cline-yes">1x</span>
259
+ <span class="cline-any cline-yes">1x</span>
260
+ <span class="cline-any cline-yes">1x</span>
261
+ <span class="cline-any cline-yes">1x</span>
262
+ <span class="cline-any cline-yes">1x</span>
263
+ <span class="cline-any cline-yes">1x</span>
264
+ <span class="cline-any cline-yes">1x</span>
265
+ <span class="cline-any cline-yes">1x</span>
266
+ <span class="cline-any cline-yes">1x</span>
267
+ <span class="cline-any cline-yes">1x</span>
268
+ <span class="cline-any cline-yes">9x</span>
269
+ <span class="cline-any cline-yes">9x</span>
270
+ <span class="cline-any cline-yes">9x</span>
271
+ <span class="cline-any cline-yes">9x</span>
272
+ <span class="cline-any cline-yes">9x</span>
273
+ <span class="cline-any cline-yes">9x</span>
274
+ <span class="cline-any cline-yes">1x</span>
275
+ <span class="cline-any cline-yes">1x</span>
276
+ <span class="cline-any cline-yes">1x</span>
277
+ <span class="cline-any cline-yes">1x</span>
278
+ <span class="cline-any cline-yes">1x</span>
279
+ <span class="cline-any cline-yes">1x</span>
280
+ <span class="cline-any cline-yes">9x</span>
281
+ <span class="cline-any cline-yes">9x</span>
282
+ <span class="cline-any cline-yes">9x</span>
283
+ <span class="cline-any cline-yes">9x</span>
284
+ <span class="cline-any cline-yes">9x</span>
285
+ <span class="cline-any cline-yes">9x</span>
286
+ <span class="cline-any cline-yes">9x</span>
287
+ <span class="cline-any cline-yes">9x</span>
288
+ <span class="cline-any cline-yes">9x</span>
289
+ <span class="cline-any cline-yes">9x</span>
290
+ <span class="cline-any cline-yes">9x</span>
291
+ <span class="cline-any cline-yes">9x</span>
292
+ <span class="cline-any cline-yes">9x</span>
293
+ <span class="cline-any cline-yes">9x</span>
294
+ <span class="cline-any cline-yes">9x</span>
295
+ <span class="cline-any cline-yes">9x</span>
296
+ <span class="cline-any cline-yes">9x</span>
297
+ <span class="cline-any cline-yes">9x</span>
298
+ <span class="cline-any cline-yes">9x</span>
299
+ <span class="cline-any cline-yes">9x</span>
300
+ <span class="cline-any cline-yes">9x</span>
301
+ <span class="cline-any cline-yes">9x</span>
302
+ <span class="cline-any cline-yes">9x</span>
303
+ <span class="cline-any cline-yes">9x</span>
304
+ <span class="cline-any cline-yes">9x</span>
305
+ <span class="cline-any cline-yes">2x</span>
306
+ <span class="cline-any cline-yes">2x</span>
307
+ <span class="cline-any cline-yes">2x</span>
308
+ <span class="cline-any cline-yes">9x</span>
309
+ <span class="cline-any cline-yes">1x</span>
310
+ <span class="cline-any cline-yes">1x</span>
311
+ <span class="cline-any cline-yes">1x</span>
312
+ <span class="cline-any cline-yes">1x</span>
313
+ <span class="cline-any cline-yes">1x</span>
314
+ <span class="cline-any cline-yes">1x</span>
315
+ <span class="cline-any cline-yes">1x</span>
316
+ <span class="cline-any cline-yes">1x</span>
317
+ <span class="cline-any cline-yes">21x</span>
318
+ <span class="cline-any cline-yes">21x</span>
319
+ <span class="cline-any cline-yes">21x</span>
320
+ <span class="cline-any cline-yes">2x</span>
321
+ <span class="cline-any cline-yes">21x</span>
322
+ <span class="cline-any cline-yes">1x</span>
323
+ <span class="cline-any cline-yes">1x</span>
324
+ <span class="cline-any cline-yes">21x</span>
325
+ <span class="cline-any cline-yes">21x</span>
326
+ <span class="cline-any cline-yes">2x</span>
327
+ <span class="cline-any cline-yes">21x</span>
328
+ <span class="cline-any cline-yes">1x</span>
329
+ <span class="cline-any cline-yes">1x</span>
330
+ <span class="cline-any cline-yes">21x</span>
331
+ <span class="cline-any cline-yes">21x</span>
332
+ <span class="cline-any cline-yes">1x</span>
333
+ <span class="cline-any cline-yes">1x</span>
334
+ <span class="cline-any cline-yes">1x</span>
335
+ <span class="cline-any cline-yes">1x</span>
336
+ <span class="cline-any cline-yes">1x</span>
337
+ <span class="cline-any cline-yes">1x</span>
338
+ <span class="cline-any cline-yes">1x</span>
339
+ <span class="cline-any cline-yes">1x</span>
340
+ <span class="cline-any cline-yes">1x</span>
341
+ <span class="cline-any cline-yes">1x</span>
342
+ <span class="cline-any cline-yes">1x</span>
343
+ <span class="cline-any cline-yes">13x</span>
344
+ <span class="cline-any cline-yes">13x</span>
345
+ <span class="cline-any cline-yes">13x</span>
346
+ <span class="cline-any cline-yes">4x</span>
347
+ <span class="cline-any cline-yes">4x</span>
348
+ <span class="cline-any cline-yes">4x</span>
349
+ <span class="cline-any cline-yes">4x</span>
350
+ <span class="cline-any cline-yes">3x</span>
351
+ <span class="cline-any cline-yes">4x</span>
352
+ <span class="cline-any cline-yes">1x</span>
353
+ <span class="cline-any cline-yes">1x</span>
354
+ <span class="cline-any cline-yes">4x</span>
355
+ <span class="cline-any cline-yes">12x</span>
356
+ <span class="cline-any cline-yes">12x</span>
357
+ <span class="cline-any cline-yes">13x</span>
358
+ <span class="cline-any cline-yes">10x</span>
359
+ <span class="cline-any cline-yes">10x</span>
360
+ <span class="cline-any cline-yes">20x</span>
361
+ <span class="cline-any cline-yes">2x</span>
362
+ <span class="cline-any cline-yes">10x</span>
363
+ <span class="cline-any cline-yes">10x</span>
364
+ <span class="cline-any cline-yes">19x</span>
365
+ <span class="cline-any cline-yes">19x</span>
366
+ <span class="cline-any cline-yes">19x</span>
367
+ <span class="cline-any cline-yes">19x</span>
368
+ <span class="cline-any cline-yes">10x</span>
369
+ <span class="cline-any cline-yes">10x</span>
370
+ <span class="cline-any cline-yes">12x</span>
371
+ <span class="cline-any cline-yes">12x</span>
372
+ <span class="cline-any cline-yes">13x</span>
373
+ <span class="cline-any cline-yes">11x</span>
374
+ <span class="cline-any cline-yes">11x</span>
375
+ <span class="cline-any cline-yes">11x</span>
376
+ <span class="cline-any cline-yes">11x</span>
377
+ <span class="cline-any cline-yes">12x</span>
378
+ <span class="cline-any cline-yes">12x</span>
379
+ <span class="cline-any cline-yes">13x</span>
380
+ <span class="cline-any cline-yes">1x</span>
381
+ <span class="cline-any cline-yes">1x</span>
382
+ <span class="cline-any cline-yes">12x</span>
383
+ <span class="cline-any cline-yes">12x</span>
384
+ <span class="cline-any cline-yes">12x</span>
385
+ <span class="cline-any cline-yes">21x</span>
386
+ <span class="cline-any cline-yes">21x</span>
387
+ <span class="cline-any cline-yes">12x</span>
388
+ <span class="cline-any cline-yes">12x</span>
389
+ <span class="cline-any cline-yes">12x</span>
390
+ <span class="cline-any cline-yes">12x</span>
391
+ <span class="cline-any cline-yes">13x</span>
392
+ <span class="cline-any cline-yes">13x</span>
393
+ <span class="cline-any cline-yes">13x</span>
394
+ <span class="cline-any cline-yes">23x</span>
395
+ <span class="cline-any cline-yes">23x</span>
396
+ <span class="cline-any cline-yes">23x</span>
397
+ <span class="cline-any cline-yes">23x</span>
398
+ <span class="cline-any cline-yes">23x</span>
399
+ <span class="cline-any cline-yes">23x</span>
400
+ <span class="cline-any cline-yes">23x</span>
401
+ <span class="cline-any cline-yes">23x</span>
402
+ <span class="cline-any cline-yes">23x</span>
403
+ <span class="cline-any cline-yes">23x</span>
404
+ <span class="cline-any cline-yes">23x</span>
405
+ <span class="cline-any cline-yes">13x</span>
406
+ <span class="cline-any cline-yes">13x</span>
407
+ <span class="cline-any cline-yes">13x</span>
408
+ <span class="cline-any cline-yes">13x</span>
409
+ <span class="cline-any cline-yes">13x</span>
410
+ <span class="cline-any cline-yes">12x</span>
411
+ <span class="cline-any cline-yes">13x</span>
412
+ <span class="cline-any cline-yes">7x</span>
413
+ <span class="cline-any cline-yes">7x</span>
414
+ <span class="cline-any cline-yes">7x</span>
415
+ <span class="cline-any cline-yes">5x</span>
416
+ <span class="cline-any cline-yes">5x</span>
417
+ <span class="cline-any cline-yes">5x</span>
418
+ <span class="cline-any cline-yes">5x</span>
419
+ <span class="cline-any cline-yes">5x</span>
420
+ <span class="cline-any cline-yes">5x</span>
421
+ <span class="cline-any cline-yes">5x</span>
422
+ <span class="cline-any cline-yes">5x</span>
423
+ <span class="cline-any cline-yes">5x</span>
424
+ <span class="cline-any cline-yes">5x</span>
425
+ <span class="cline-any cline-yes">5x</span>
426
+ <span class="cline-any cline-yes">5x</span>
427
+ <span class="cline-any cline-yes">5x</span>
428
+ <span class="cline-any cline-yes">5x</span>
429
+ <span class="cline-any cline-yes">5x</span>
430
+ <span class="cline-any cline-yes">5x</span>
431
+ <span class="cline-any cline-yes">5x</span>
432
+ <span class="cline-any cline-yes">5x</span>
433
+ <span class="cline-any cline-yes">5x</span>
434
+ <span class="cline-any cline-yes">5x</span>
435
+ <span class="cline-any cline-yes">5x</span>
436
+ <span class="cline-any cline-yes">5x</span>
437
+ <span class="cline-any cline-yes">13x</span>
438
+ <span class="cline-any cline-yes">1x</span>
439
+ <span class="cline-any cline-yes">1x</span>
440
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const kanbn = require('./main');
441
+ const term = require('terminal-kit').terminal;
442
+ const formatDate = require('dateformat');
443
+ const utility = require('./utility');
444
+ &nbsp;
445
+ module.exports = (() =&gt; {
446
+ const TASK_SEPARATOR = '\n\n';
447
+ &nbsp;
448
+ /**
449
+ * Show only the selected fields for a task, as specified in the index options
450
+ * @param {object} index
451
+ * @param {object} task
452
+ * @return {string} The selected task fields
453
+ */
454
+ function getTaskString(index, task) {
455
+ const taskTemplate = kanbn.getTaskTemplate(index);
456
+ const dateFormat = kanbn.getDateFormat(index);
457
+ &nbsp;
458
+ // Get an object containing custom fields from the task
459
+ let customFields = {};
460
+ if ('customFields' in index.options) {
461
+ const customFieldNames = index.options.customFields.map(customField =&gt; customField.name);
462
+ customFields = Object.fromEntries(utility.zip(
463
+ customFieldNames,
464
+ customFieldNames.map(customFieldName =&gt; task.metadata[customFieldName] <span class="branch-0 cbranch-no" title="branch not covered" >|| '')</span>
465
+ ));
466
+ }
467
+ &nbsp;
468
+ // Prepare task data for interpolation
469
+ const taskData = {
470
+ name: task.name,
471
+ description: task.name,
472
+ created: 'created' in task.metadata ? formatDate(task.metadata.created, dateFormat) <span class="branch-0 cbranch-no" title="branch not covered" >: '',</span>
473
+ updated: 'updated' in task.metadata ? formatDate(task.metadata.updated, dateFormat) : '',
474
+ started: 'started' in task.metadata ? formatDate(task.metadata.started, dateFormat) : '',
475
+ completed: 'completed' in task.metadata ? formatDate(task.metadata.completed, dateFormat) : '',
476
+ due: 'due' in task.metadata ? formatDate(task.metadata.due, dateFormat) : '',
477
+ assigned: 'assigned' in task.metadata ? task.metadata.assigned : '',
478
+ tags: 'tags' in task.metadata ? task.metadata.tags : [],
479
+ subTasks: task.subTasks,
480
+ relations: task.relations,
481
+ overdue: 'dueData' in task &amp;&amp; 'overdue' in task.dueData ? task.dueData.overdue : null,
482
+ dueDelta: 'dueData' in task &amp;&amp; 'dueDelta' in task.dueData ? task.dueData.dueDelta : 0,
483
+ dueMessage: 'dueData' in task &amp;&amp; 'dueMessage' in task.dueData ? task.dueData.dueMessage : '',
484
+ column: task.column,
485
+ workload: task.workload,
486
+ progress: task.progress,
487
+ ...customFields
488
+ };
489
+ try {
490
+ return new Function(...Object.keys(taskData), 'return `^:' + taskTemplate + '`;')(...Object.values(taskData));
491
+ } catch (e) {
492
+ utility.error(`Unable to build task template: ${e.message}`);
493
+ return;
494
+ }
495
+ }
496
+ &nbsp;
497
+ /**
498
+ * Get a column heading with icons
499
+ * @param {object} index
500
+ * @param {string} columnName
501
+ * @return {string} The column heading
502
+ */
503
+ function getColumnHeading(index, columnName) {
504
+ let heading = '^:';
505
+ if (
506
+ 'completedColumns' in index.options &amp;&amp;
507
+ index.options.completedColumns.indexOf(columnName) !== -1
508
+ ) {
509
+ heading += '^g\u2713^: ';
510
+ }
511
+ if (
512
+ 'startedColumns' in index.options &amp;&amp;
513
+ index.options.startedColumns.indexOf(columnName) !== -1
514
+ ) {
515
+ heading += '^c\u00bb^: ';
516
+ }
517
+ return heading + `^+${columnName}^:`;
518
+ }
519
+ &nbsp;
520
+ return {
521
+ &nbsp;
522
+ /**
523
+ * Show the kanbn board
524
+ * @param {object} index The index object
525
+ * @param {object[]} tasks An array of task objects
526
+ * @param {?string} [view=null] The view to show, or null to show the default view
527
+ * @param {boolean} [json=false] Show JSON output
528
+ */
529
+ async show(index, tasks, view = null, json = false) {
530
+ const board = {};
531
+ let viewSettings = {};
532
+ if (view !== null) {
533
+ &nbsp;
534
+ // Make sure the view exists
535
+ if (
536
+ !('views' in index.options) ||
537
+ (viewSettings = index.options.views.find(v =&gt; v.name === view)) === undefined
538
+ ) {
539
+ throw new Error(`No view found with name "${view}"`);
540
+ }
541
+ }
542
+ &nbsp;
543
+ // Check if there is a list of columns in the view settings
544
+ if (!('columns' in viewSettings)) {
545
+ viewSettings.columns = Object.keys(index.columns)
546
+ .filter(columnName =&gt; (
547
+ !('hiddenColumns' in index.options) ||
548
+ index.options.hiddenColumns.indexOf(columnName) === -1
549
+ ))
550
+ .map(columnName =&gt; ({
551
+ name: columnName,
552
+ filters: {
553
+ column: columnName
554
+ }
555
+ }));
556
+ }
557
+ &nbsp;
558
+ // Check if there is a list of lanes in the view settings
559
+ if (!('lanes' in viewSettings) || viewSettings.lanes.length === 0) {
560
+ viewSettings.lanes = [{
561
+ name: 'All tasks'
562
+ }];
563
+ }
564
+ &nbsp;
565
+ // If a root-level filter is defined, apply it to the tasks
566
+ if ('filters' in viewSettings) {
567
+ tasks = kanbn.filterAndSortTasks(index, tasks, viewSettings.filters, []);
568
+ }
569
+ &nbsp;
570
+ // Add columns
571
+ board.headings = viewSettings.columns.map(column =&gt; ({
572
+ name: column.name,
573
+ heading: getColumnHeading(index, column.name)
574
+ }));
575
+ &nbsp;
576
+ // Add lanes and column contents
577
+ board.lanes = [];
578
+ for (let lane of viewSettings.lanes) {
579
+ const columns = [];
580
+ for (let column of viewSettings.columns) {
581
+ const cellTasks = kanbn.filterAndSortTasks(
582
+ index,
583
+ tasks,
584
+ {
585
+ ...('filters' in column ? column.filters <span class="branch-0 cbranch-no" title="branch not covered" >: {})</span>,
586
+ ...('filters' in lane ? lane.filters : {})
587
+ },
588
+ 'sorters' in column ? column.sorters : []
589
+ );
590
+ columns.push(cellTasks);
591
+ }
592
+ board.lanes.push({
593
+ name: lane.name,
594
+ columns
595
+ });
596
+ }
597
+ &nbsp;
598
+ if (json) {
599
+ console.log(JSON.stringify(board, null, 2));
600
+ return;
601
+ }
602
+ &nbsp;
603
+ // Prepare table
604
+ const table = [];
605
+ table.push(board.headings.map(heading =&gt; heading.heading));
606
+ board.lanes.forEach(lane =&gt; table.push(
607
+ [lane.name],
608
+ lane.columns.map(column =&gt; column.map(task =&gt; getTaskString(index, task)).join(TASK_SEPARATOR))
609
+ ));
610
+ &nbsp;
611
+ // Display as a table
612
+ term.table(
613
+ table,
614
+ {
615
+ hasBorder: true,
616
+ contentHasMarkup: true,
617
+ borderChars: 'lightRounded',
618
+ borderAttr: { color: 'grey' },
619
+ textAttr: { color: 'white', bgColor: 'default' },
620
+ width: term.width,
621
+ fit: true
622
+ }
623
+ );
624
+ }
625
+ }
626
+ })();
627
+ &nbsp;</pre></td></tr></table></pre>
628
+
629
+ <div class='push'></div><!-- for sticky footer -->
630
+ </div><!-- /wrapper -->
631
+ <div class='footer quiet pad2 space-top1 center small'>
632
+ Code coverage generated by
633
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
634
+ at 2026-08-26T20:46:31.702Z
635
+ </div>
636
+ <script src="../../prettify.js"></script>
637
+ <script>
638
+ window.onload = function () {
639
+ prettyPrint();
640
+ };
641
+ </script>
642
+ <script src="../../sorter.js"></script>
643
+ <script src="../../block-navigation.js"></script>
644
+ </body>
645
+ </html>
646
+