@md2do/cli 0.2.2 → 0.3.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 (36) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/coverage/coverage-final.json +9 -9
  3. package/coverage/index.html +7 -7
  4. package/coverage/lcov-report/index.html +7 -7
  5. package/coverage/lcov-report/src/cli.ts.html +53 -5
  6. package/coverage/lcov-report/src/commands/index.html +5 -5
  7. package/coverage/lcov-report/src/commands/index.ts.html +1 -1
  8. package/coverage/lcov-report/src/commands/list.ts.html +49 -10
  9. package/coverage/lcov-report/src/commands/stats.ts.html +1 -1
  10. package/coverage/lcov-report/src/commands/todoist.ts.html +1 -1
  11. package/coverage/lcov-report/src/formatters/index.html +1 -1
  12. package/coverage/lcov-report/src/formatters/json.ts.html +1 -1
  13. package/coverage/lcov-report/src/formatters/pretty.ts.html +1 -1
  14. package/coverage/lcov-report/src/index.html +5 -5
  15. package/coverage/lcov-report/src/index.ts.html +1 -1
  16. package/coverage/lcov-report/src/scanner.ts.html +1 -1
  17. package/coverage/lcov.info +31 -2
  18. package/coverage/src/cli.ts.html +53 -5
  19. package/coverage/src/commands/index.html +5 -5
  20. package/coverage/src/commands/index.ts.html +1 -1
  21. package/coverage/src/commands/list.ts.html +49 -10
  22. package/coverage/src/commands/stats.ts.html +1 -1
  23. package/coverage/src/commands/todoist.ts.html +1 -1
  24. package/coverage/src/formatters/index.html +1 -1
  25. package/coverage/src/formatters/json.ts.html +1 -1
  26. package/coverage/src/formatters/pretty.ts.html +1 -1
  27. package/coverage/src/index.html +5 -5
  28. package/coverage/src/index.ts.html +1 -1
  29. package/coverage/src/scanner.ts.html +1 -1
  30. package/dist/cli.js +34 -18
  31. package/dist/index.js +34 -18
  32. package/package.json +5 -5
  33. package/src/commands/list.ts +41 -12
  34. package/src/scanner.ts +6 -1
  35. package/tests/e2e/__snapshots__/warnings.test.ts.snap +104 -0
  36. package/tests/e2e/warnings.test.ts +186 -0
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/26</span>
28
+ <span class='fraction'>0/42</span>
29
29
  </div>
30
30
 
31
31
 
@@ -46,7 +46,7 @@
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/26</span>
49
+ <span class='fraction'>0/42</span>
50
50
  </div>
51
51
 
52
52
 
@@ -89,7 +89,39 @@
89
89
  <a name='L24'></a><a href='#L24'>24</a>
90
90
  <a name='L25'></a><a href='#L25'>25</a>
91
91
  <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
109
+ <span class="cline-any cline-no">&nbsp;</span>
110
+ <span class="cline-any cline-no">&nbsp;</span>
111
+ <span class="cline-any cline-no">&nbsp;</span>
112
+ <span class="cline-any cline-no">&nbsp;</span>
113
+ <span class="cline-any cline-no">&nbsp;</span>
114
+ <span class="cline-any cline-no">&nbsp;</span>
115
+ <span class="cline-any cline-no">&nbsp;</span>
116
+ <span class="cline-any cline-no">&nbsp;</span>
117
+ <span class="cline-any cline-no">&nbsp;</span>
118
+ <span class="cline-any cline-no">&nbsp;</span>
119
+ <span class="cline-any cline-no">&nbsp;</span>
120
+ <span class="cline-any cline-no">&nbsp;</span>
121
+ <span class="cline-any cline-no">&nbsp;</span>
122
+ <span class="cline-any cline-no">&nbsp;</span>
123
+ <span class="cline-any cline-no">&nbsp;</span>
124
+ <span class="cline-any cline-no">&nbsp;</span>
93
125
  <span class="cline-any cline-no">&nbsp;</span>
94
126
  <span class="cline-any cline-no">&nbsp;</span>
95
127
  <span class="cline-any cline-no">&nbsp;</span>
@@ -117,18 +149,34 @@
117
149
  <span class="cline-any cline-no">&nbsp;</span>
118
150
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" >#!/usr/bin/env node</span></span></span>
119
151
  <span class="cstat-no" title="statement not covered" >import { Command } from 'commander';</span>
152
+ <span class="cstat-no" title="statement not covered" >import { readFileSync } from 'fs';</span>
153
+ <span class="cstat-no" title="statement not covered" >import { join } from 'path';</span>
120
154
  <span class="cstat-no" title="statement not covered" >import {</span>
121
155
  <span class="cstat-no" title="statement not covered" > createListCommand,</span>
122
156
  <span class="cstat-no" title="statement not covered" > createStatsCommand,</span>
123
157
  <span class="cstat-no" title="statement not covered" > createTodoistCommand,</span>
124
158
  <span class="cstat-no" title="statement not covered" >} from './commands/index.js';</span>
125
159
  <span class="cstat-no" title="statement not covered" ></span>
160
+ <span class="cstat-no" title="statement not covered" >// Read version from package.json</span>
161
+ <span class="cstat-no" title="statement not covered" >// __dirname will be available in the compiled CJS output</span>
162
+ <span class="cstat-no" title="statement not covered" >const getVersion = (): string =&gt; {</span>
163
+ <span class="cstat-no" title="statement not covered" > try {</span>
164
+ <span class="cstat-no" title="statement not covered" > const packagePath = join(__dirname, '../package.json');</span>
165
+ <span class="cstat-no" title="statement not covered" > const packageJson = JSON.parse(readFileSync(packagePath, 'utf-8')) as {</span>
166
+ <span class="cstat-no" title="statement not covered" > version: string;</span>
167
+ <span class="cstat-no" title="statement not covered" > };</span>
168
+ <span class="cstat-no" title="statement not covered" > return packageJson.version;</span>
169
+ <span class="cstat-no" title="statement not covered" > } catch {</span>
170
+ <span class="cstat-no" title="statement not covered" > return '0.0.0';</span>
171
+ <span class="cstat-no" title="statement not covered" > }</span>
172
+ <span class="cstat-no" title="statement not covered" >};</span>
173
+ <span class="cstat-no" title="statement not covered" ></span>
126
174
  <span class="cstat-no" title="statement not covered" >const program = new Command();</span>
127
175
  <span class="cstat-no" title="statement not covered" ></span>
128
176
  <span class="cstat-no" title="statement not covered" >program</span>
129
177
  <span class="cstat-no" title="statement not covered" > .name('md2do')</span>
130
178
  <span class="cstat-no" title="statement not covered" > .description('Scan and manage TODOs in markdown files')</span>
131
- <span class="cstat-no" title="statement not covered" > .version('0.1.0');</span>
179
+ <span class="cstat-no" title="statement not covered" > .version(getVersion());</span>
132
180
  <span class="cstat-no" title="statement not covered" ></span>
133
181
  <span class="cstat-no" title="statement not covered" >// Add commands</span>
134
182
  <span class="cstat-no" title="statement not covered" >program.addCommand(createListCommand());</span>
@@ -148,7 +196,7 @@
148
196
  <div class='footer quiet pad2 space-top1 center small'>
149
197
  Code coverage generated by
150
198
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
151
- at 2026-01-22T01:16:23.805Z
199
+ at 2026-01-26T03:50:54.693Z
152
200
  </div>
153
201
  <script src="../prettify.js"></script>
154
202
  <script>
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/1362</span>
28
+ <span class='fraction'>0/1375</span>
29
29
  </div>
30
30
 
31
31
 
@@ -46,7 +46,7 @@
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/1362</span>
49
+ <span class='fraction'>0/1375</span>
50
50
  </div>
51
51
 
52
52
 
@@ -99,13 +99,13 @@
99
99
  <div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
100
100
  </td>
101
101
  <td data-value="0" class="pct low">0%</td>
102
- <td data-value="231" class="abs low">0/231</td>
102
+ <td data-value="244" class="abs low">0/244</td>
103
103
  <td data-value="0" class="pct low">0%</td>
104
104
  <td data-value="1" class="abs low">0/1</td>
105
105
  <td data-value="0" class="pct low">0%</td>
106
106
  <td data-value="1" class="abs low">0/1</td>
107
107
  <td data-value="0" class="pct low">0%</td>
108
- <td data-value="231" class="abs low">0/231</td>
108
+ <td data-value="244" class="abs low">0/244</td>
109
109
  </tr>
110
110
 
111
111
  <tr>
@@ -146,7 +146,7 @@
146
146
  <div class='footer quiet pad2 space-top1 center small'>
147
147
  Code coverage generated by
148
148
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
149
- at 2026-01-22T01:16:23.805Z
149
+ at 2026-01-26T03:50:54.693Z
150
150
  </div>
151
151
  <script src="../../prettify.js"></script>
152
152
  <script>
@@ -82,7 +82,7 @@
82
82
  <div class='footer quiet pad2 space-top1 center small'>
83
83
  Code coverage generated by
84
84
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
85
- at 2026-01-22T01:16:23.805Z
85
+ at 2026-01-26T03:50:54.693Z
86
86
  </div>
87
87
  <script src="../../prettify.js"></script>
88
88
  <script>
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/231</span>
28
+ <span class='fraction'>0/244</span>
29
29
  </div>
30
30
 
31
31
 
@@ -46,7 +46,7 @@
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/231</span>
49
+ <span class='fraction'>0/244</span>
50
50
  </div>
51
51
 
52
52
 
@@ -294,7 +294,33 @@
294
294
  <a name='L229'></a><a href='#L229'>229</a>
295
295
  <a name='L230'></a><a href='#L230'>230</a>
296
296
  <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
311
+ <span class="cline-any cline-no">&nbsp;</span>
312
+ <span class="cline-any cline-no">&nbsp;</span>
313
+ <span class="cline-any cline-no">&nbsp;</span>
314
+ <span class="cline-any cline-no">&nbsp;</span>
315
+ <span class="cline-any cline-no">&nbsp;</span>
316
+ <span class="cline-any cline-no">&nbsp;</span>
317
+ <span class="cline-any cline-no">&nbsp;</span>
318
+ <span class="cline-any cline-no">&nbsp;</span>
319
+ <span class="cline-any cline-no">&nbsp;</span>
320
+ <span class="cline-any cline-no">&nbsp;</span>
321
+ <span class="cline-any cline-no">&nbsp;</span>
322
+ <span class="cline-any cline-no">&nbsp;</span>
323
+ <span class="cline-any cline-no">&nbsp;</span>
298
324
  <span class="cline-any cline-no">&nbsp;</span>
299
325
  <span class="cline-any cline-no">&nbsp;</span>
300
326
  <span class="cline-any cline-no">&nbsp;</span>
@@ -552,6 +578,8 @@
552
578
  <span class="cstat-no" title="statement not covered" > colors?: boolean;</span>
553
579
  <span class="cstat-no" title="statement not covered" > paths?: boolean;</span>
554
580
  <span class="cstat-no" title="statement not covered" > context?: boolean;</span>
581
+ <span class="cstat-no" title="statement not covered" > warnings?: boolean;</span>
582
+ <span class="cstat-no" title="statement not covered" > allWarnings?: boolean;</span>
555
583
  <span class="cstat-no" title="statement not covered" >}</span>
556
584
  <span class="cstat-no" title="statement not covered" ></span>
557
585
  <span class="cstat-no" title="statement not covered" >export function createListCommand(): Command {</span>
@@ -604,6 +632,10 @@
604
632
  <span class="cstat-no" title="statement not covered" > .option('--no-paths', 'Hide file paths')</span>
605
633
  <span class="cstat-no" title="statement not covered" > .option('--context', 'Show context information (project, person, heading)')</span>
606
634
  <span class="cstat-no" title="statement not covered" ></span>
635
+ <span class="cstat-no" title="statement not covered" > // Warning options</span>
636
+ <span class="cstat-no" title="statement not covered" > .option('--no-warnings', 'Hide all warnings')</span>
637
+ <span class="cstat-no" title="statement not covered" > .option('--all-warnings', 'Show all warnings (default shows first 5)')</span>
638
+ <span class="cstat-no" title="statement not covered" ></span>
607
639
  <span class="cstat-no" title="statement not covered" > .action(async (options: ListCommandOptions) =&gt; {</span>
608
640
  <span class="cstat-no" title="statement not covered" > try {</span>
609
641
  <span class="cstat-no" title="statement not covered" > // Scan markdown files</span>
@@ -732,19 +764,26 @@
732
764
  <span class="cstat-no" title="statement not covered" ></span>
733
765
  <span class="cstat-no" title="statement not covered" > console.log(output);</span>
734
766
  <span class="cstat-no" title="statement not covered" ></span>
735
- <span class="cstat-no" title="statement not covered" > // Show warnings if any</span>
736
- <span class="cstat-no" title="statement not covered" > if (scanResult.warnings.length &gt; 0) {</span>
767
+ <span class="cstat-no" title="statement not covered" > // Show warnings if any (unless --no-warnings)</span>
768
+ <span class="cstat-no" title="statement not covered" > if (options.warnings !== false &amp;&amp; scanResult.warnings.length &gt; 0) {</span>
737
769
  <span class="cstat-no" title="statement not covered" > console.error(</span>
738
- <span class="cstat-no" title="statement not covered" > `\n⚠️ ${scanResult.warnings.length} warnings encountered during scanning`,</span>
770
+ <span class="cstat-no" title="statement not covered" > `\n⚠️ ${scanResult.warnings.length} warning${scanResult.warnings.length &gt; 1 ? 's' : ''} encountered during scanning`,</span>
739
771
  <span class="cstat-no" title="statement not covered" > );</span>
740
- <span class="cstat-no" title="statement not covered" > for (const warning of scanResult.warnings.slice(0, 5)) {</span>
772
+ <span class="cstat-no" title="statement not covered" ></span>
773
+ <span class="cstat-no" title="statement not covered" > // Show all warnings if --all-warnings, otherwise show first 5</span>
774
+ <span class="cstat-no" title="statement not covered" > const warningsToShow = options.allWarnings</span>
775
+ <span class="cstat-no" title="statement not covered" > ? scanResult.warnings</span>
776
+ <span class="cstat-no" title="statement not covered" > : scanResult.warnings.slice(0, 5);</span>
777
+ <span class="cstat-no" title="statement not covered" ></span>
778
+ <span class="cstat-no" title="statement not covered" > for (const warning of warningsToShow) {</span>
741
779
  <span class="cstat-no" title="statement not covered" > console.error(</span>
742
780
  <span class="cstat-no" title="statement not covered" > ` ${warning.file}:${warning.line} - ${warning.reason}`,</span>
743
781
  <span class="cstat-no" title="statement not covered" > );</span>
744
782
  <span class="cstat-no" title="statement not covered" > }</span>
745
- <span class="cstat-no" title="statement not covered" > if (scanResult.warnings.length &gt; 5) {</span>
783
+ <span class="cstat-no" title="statement not covered" ></span>
784
+ <span class="cstat-no" title="statement not covered" > if (!options.allWarnings &amp;&amp; scanResult.warnings.length &gt; 5) {</span>
746
785
  <span class="cstat-no" title="statement not covered" > console.error(</span>
747
- <span class="cstat-no" title="statement not covered" > ` ... and ${scanResult.warnings.length - 5} more warnings`,</span>
786
+ <span class="cstat-no" title="statement not covered" > ` ... and ${scanResult.warnings.length - 5} more warning${scanResult.warnings.length - 5 &gt; 1 ? 's' : ''} (use --all-warnings to see all)`,</span>
748
787
  <span class="cstat-no" title="statement not covered" > );</span>
749
788
  <span class="cstat-no" title="statement not covered" > }</span>
750
789
  <span class="cstat-no" title="statement not covered" > }</span>
@@ -763,7 +802,7 @@
763
802
  <div class='footer quiet pad2 space-top1 center small'>
764
803
  Code coverage generated by
765
804
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
766
- at 2026-01-22T01:16:23.805Z
805
+ at 2026-01-26T03:50:54.693Z
767
806
  </div>
768
807
  <script src="../../prettify.js"></script>
769
808
  <script>
@@ -1153,7 +1153,7 @@
1153
1153
  <div class='footer quiet pad2 space-top1 center small'>
1154
1154
  Code coverage generated by
1155
1155
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1156
- at 2026-01-22T01:16:23.805Z
1156
+ at 2026-01-26T03:50:54.693Z
1157
1157
  </div>
1158
1158
  <script src="../../prettify.js"></script>
1159
1159
  <script>
@@ -2368,7 +2368,7 @@
2368
2368
  <div class='footer quiet pad2 space-top1 center small'>
2369
2369
  Code coverage generated by
2370
2370
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2371
- at 2026-01-22T01:16:23.805Z
2371
+ at 2026-01-26T03:50:54.693Z
2372
2372
  </div>
2373
2373
  <script src="../../prettify.js"></script>
2374
2374
  <script>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2026-01-22T01:16:23.805Z
119
+ at 2026-01-26T03:50:54.693Z
120
120
  </div>
121
121
  <script src="../../prettify.js"></script>
122
122
  <script>
@@ -265,7 +265,7 @@
265
265
  <div class='footer quiet pad2 space-top1 center small'>
266
266
  Code coverage generated by
267
267
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
268
- at 2026-01-22T01:16:23.805Z
268
+ at 2026-01-26T03:50:54.693Z
269
269
  </div>
270
270
  <script src="../../prettify.js"></script>
271
271
  <script>
@@ -940,7 +940,7 @@
940
940
  <div class='footer quiet pad2 space-top1 center small'>
941
941
  Code coverage generated by
942
942
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
943
- at 2026-01-22T01:16:23.805Z
943
+ at 2026-01-26T03:50:54.693Z
944
944
  </div>
945
945
  <script src="../../prettify.js"></script>
946
946
  <script>
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/133</span>
28
+ <span class='fraction'>0/149</span>
29
29
  </div>
30
30
 
31
31
 
@@ -46,7 +46,7 @@
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/133</span>
49
+ <span class='fraction'>0/149</span>
50
50
  </div>
51
51
 
52
52
 
@@ -84,13 +84,13 @@
84
84
  <div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
85
85
  </td>
86
86
  <td data-value="0" class="pct low">0%</td>
87
- <td data-value="26" class="abs low">0/26</td>
87
+ <td data-value="42" class="abs low">0/42</td>
88
88
  <td data-value="0" class="pct low">0%</td>
89
89
  <td data-value="1" class="abs low">0/1</td>
90
90
  <td data-value="0" class="pct low">0%</td>
91
91
  <td data-value="1" class="abs low">0/1</td>
92
92
  <td data-value="0" class="pct low">0%</td>
93
- <td data-value="26" class="abs low">0/26</td>
93
+ <td data-value="42" class="abs low">0/42</td>
94
94
  </tr>
95
95
 
96
96
  <tr>
@@ -131,7 +131,7 @@
131
131
  <div class='footer quiet pad2 space-top1 center small'>
132
132
  Code coverage generated by
133
133
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
134
- at 2026-01-22T01:16:23.805Z
134
+ at 2026-01-26T03:50:54.693Z
135
135
  </div>
136
136
  <script src="../prettify.js"></script>
137
137
  <script>
@@ -76,7 +76,7 @@
76
76
  <div class='footer quiet pad2 space-top1 center small'>
77
77
  Code coverage generated by
78
78
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
79
- at 2026-01-22T01:16:23.805Z
79
+ at 2026-01-26T03:50:54.693Z
80
80
  </div>
81
81
  <script src="../prettify.js"></script>
82
82
  <script>
@@ -385,7 +385,7 @@
385
385
  <div class='footer quiet pad2 space-top1 center small'>
386
386
  Code coverage generated by
387
387
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
388
- at 2026-01-22T01:16:23.805Z
388
+ at 2026-01-26T03:50:54.693Z
389
389
  </div>
390
390
  <script src="../prettify.js"></script>
391
391
  <script>
package/dist/cli.js CHANGED
@@ -31,6 +31,7 @@ var import_path = require("path");
31
31
  // src/commands/list.ts
32
32
  var import_commander = require("commander");
33
33
  var import_core2 = require("@md2do/core");
34
+ var import_config = require("@md2do/config");
34
35
 
35
36
  // src/scanner.ts
36
37
  var import_promises = require("fs/promises");
@@ -68,11 +69,16 @@ async function scanMarkdownFiles(options = {}) {
68
69
  allTasks.push(...result.tasks);
69
70
  allWarnings.push(...result.warnings);
70
71
  } catch (error) {
72
+ const message = `Failed to read file: ${error instanceof Error ? error.message : "Unknown error"}`;
71
73
  allWarnings.push({
74
+ severity: "error",
75
+ source: "md2do",
76
+ ruleId: "file-read-error",
72
77
  file,
73
78
  line: 0,
74
79
  text: "",
75
- reason: `Failed to read file: ${error instanceof Error ? error.message : "Unknown error"}`
80
+ message,
81
+ reason: message
76
82
  });
77
83
  }
78
84
  }
@@ -291,7 +297,7 @@ function createListCommand() {
291
297
  "-f, --format <type>",
292
298
  "Output format (pretty|table|json)",
293
299
  "pretty"
294
- ).option("--no-colors", "Disable colors in output").option("--no-paths", "Hide file paths").option("--context", "Show context information (project, person, heading)").action(async (options) => {
300
+ ).option("--no-colors", "Disable colors in output").option("--no-paths", "Hide file paths").option("--context", "Show context information (project, person, heading)").option("--no-warnings", "Hide all warnings").option("--all-warnings", "Show all warnings (default shows first 5)").action(async (options) => {
295
301
  try {
296
302
  const scanResult = await scanMarkdownFiles({
297
303
  root: options.path || process.cwd(),
@@ -388,20 +394,30 @@ function createListCommand() {
388
394
  break;
389
395
  }
390
396
  console.log(output);
391
- if (scanResult.warnings.length > 0) {
392
- console.error(
393
- `
394
- \u26A0\uFE0F ${scanResult.warnings.length} warnings encountered during scanning`
397
+ if (options.warnings !== false) {
398
+ const config = await (0, import_config.loadConfig)({
399
+ cwd: options.path || process.cwd()
400
+ });
401
+ const warningConfig = config.warnings ?? import_config.DEFAULT_CONFIG.warnings;
402
+ const filteredWarnings = (0, import_core2.filterWarnings)(
403
+ scanResult.warnings,
404
+ warningConfig ?? {}
395
405
  );
396
- for (const warning of scanResult.warnings.slice(0, 5)) {
397
- console.error(
398
- ` ${warning.file}:${warning.line} - ${warning.reason}`
399
- );
400
- }
401
- if (scanResult.warnings.length > 5) {
406
+ if (filteredWarnings.length > 0) {
402
407
  console.error(
403
- ` ... and ${scanResult.warnings.length - 5} more warnings`
408
+ `
409
+ \u26A0\uFE0F ${filteredWarnings.length} warning${filteredWarnings.length > 1 ? "s" : ""} encountered during scanning`
404
410
  );
411
+ const warningsToShow = options.allWarnings ? filteredWarnings : filteredWarnings.slice(0, 5);
412
+ for (const warning of warningsToShow) {
413
+ const message = warning.message || warning.reason || "Unknown warning";
414
+ console.error(` ${warning.file}:${warning.line} - ${message}`);
415
+ }
416
+ if (!options.allWarnings && filteredWarnings.length > 5) {
417
+ console.error(
418
+ ` ... and ${filteredWarnings.length - 5} more warning${filteredWarnings.length - 5 > 1 ? "s" : ""} (use --all-warnings to see all)`
419
+ );
420
+ }
405
421
  }
406
422
  }
407
423
  } catch (error) {
@@ -651,7 +667,7 @@ function capitalize(str) {
651
667
 
652
668
  // src/commands/todoist.ts
653
669
  var import_commander3 = require("commander");
654
- var import_config = require("@md2do/config");
670
+ var import_config2 = require("@md2do/config");
655
671
  var import_todoist = require("@md2do/todoist");
656
672
  var import_core4 = require("@md2do/core");
657
673
  var import_promises2 = __toESM(require("fs/promises"));
@@ -680,7 +696,7 @@ function createTodoistListCommand() {
680
696
  return command;
681
697
  }
682
698
  async function todoistListAction(options) {
683
- const config = await (0, import_config.loadConfig)();
699
+ const config = await (0, import_config2.loadConfig)();
684
700
  if (!config.todoist?.apiToken) {
685
701
  console.error("\u274C Error: Todoist API token not configured");
686
702
  console.error("");
@@ -811,7 +827,7 @@ function createTodoistAddCommand() {
811
827
  return command;
812
828
  }
813
829
  async function todoistAddAction(taskContent, options) {
814
- const config = await (0, import_config.loadConfig)();
830
+ const config = await (0, import_config2.loadConfig)();
815
831
  if (!config.todoist?.apiToken) {
816
832
  console.error("\u274C Error: Todoist API token not configured");
817
833
  console.error("");
@@ -904,7 +920,7 @@ async function todoistImportAction(location, options) {
904
920
  console.error(`\u274C Error: Invalid line number: ${lineStr}`);
905
921
  process.exit(1);
906
922
  }
907
- const config = await (0, import_config.loadConfig)();
923
+ const config = await (0, import_config2.loadConfig)();
908
924
  if (!config.todoist?.apiToken) {
909
925
  console.error("\u274C Error: Todoist API token not configured");
910
926
  console.error("");
@@ -1018,7 +1034,7 @@ function createTodoistSyncCommand() {
1018
1034
  return command;
1019
1035
  }
1020
1036
  async function todoistSyncAction(options) {
1021
- const config = await (0, import_config.loadConfig)();
1037
+ const config = await (0, import_config2.loadConfig)();
1022
1038
  if (!config.todoist?.apiToken) {
1023
1039
  console.error("\u274C Error: Todoist API token not configured");
1024
1040
  console.error("");
package/dist/index.js CHANGED
@@ -39,6 +39,7 @@ module.exports = __toCommonJS(index_exports);
39
39
  // src/commands/list.ts
40
40
  var import_commander = require("commander");
41
41
  var import_core2 = require("@md2do/core");
42
+ var import_config = require("@md2do/config");
42
43
 
43
44
  // src/scanner.ts
44
45
  var import_promises = require("fs/promises");
@@ -76,11 +77,16 @@ async function scanMarkdownFiles(options = {}) {
76
77
  allTasks.push(...result.tasks);
77
78
  allWarnings.push(...result.warnings);
78
79
  } catch (error) {
80
+ const message = `Failed to read file: ${error instanceof Error ? error.message : "Unknown error"}`;
79
81
  allWarnings.push({
82
+ severity: "error",
83
+ source: "md2do",
84
+ ruleId: "file-read-error",
80
85
  file,
81
86
  line: 0,
82
87
  text: "",
83
- reason: `Failed to read file: ${error instanceof Error ? error.message : "Unknown error"}`
88
+ message,
89
+ reason: message
84
90
  });
85
91
  }
86
92
  }
@@ -299,7 +305,7 @@ function createListCommand() {
299
305
  "-f, --format <type>",
300
306
  "Output format (pretty|table|json)",
301
307
  "pretty"
302
- ).option("--no-colors", "Disable colors in output").option("--no-paths", "Hide file paths").option("--context", "Show context information (project, person, heading)").action(async (options) => {
308
+ ).option("--no-colors", "Disable colors in output").option("--no-paths", "Hide file paths").option("--context", "Show context information (project, person, heading)").option("--no-warnings", "Hide all warnings").option("--all-warnings", "Show all warnings (default shows first 5)").action(async (options) => {
303
309
  try {
304
310
  const scanResult = await scanMarkdownFiles({
305
311
  root: options.path || process.cwd(),
@@ -396,20 +402,30 @@ function createListCommand() {
396
402
  break;
397
403
  }
398
404
  console.log(output);
399
- if (scanResult.warnings.length > 0) {
400
- console.error(
401
- `
402
- \u26A0\uFE0F ${scanResult.warnings.length} warnings encountered during scanning`
405
+ if (options.warnings !== false) {
406
+ const config = await (0, import_config.loadConfig)({
407
+ cwd: options.path || process.cwd()
408
+ });
409
+ const warningConfig = config.warnings ?? import_config.DEFAULT_CONFIG.warnings;
410
+ const filteredWarnings = (0, import_core2.filterWarnings)(
411
+ scanResult.warnings,
412
+ warningConfig ?? {}
403
413
  );
404
- for (const warning of scanResult.warnings.slice(0, 5)) {
405
- console.error(
406
- ` ${warning.file}:${warning.line} - ${warning.reason}`
407
- );
408
- }
409
- if (scanResult.warnings.length > 5) {
414
+ if (filteredWarnings.length > 0) {
410
415
  console.error(
411
- ` ... and ${scanResult.warnings.length - 5} more warnings`
416
+ `
417
+ \u26A0\uFE0F ${filteredWarnings.length} warning${filteredWarnings.length > 1 ? "s" : ""} encountered during scanning`
412
418
  );
419
+ const warningsToShow = options.allWarnings ? filteredWarnings : filteredWarnings.slice(0, 5);
420
+ for (const warning of warningsToShow) {
421
+ const message = warning.message || warning.reason || "Unknown warning";
422
+ console.error(` ${warning.file}:${warning.line} - ${message}`);
423
+ }
424
+ if (!options.allWarnings && filteredWarnings.length > 5) {
425
+ console.error(
426
+ ` ... and ${filteredWarnings.length - 5} more warning${filteredWarnings.length - 5 > 1 ? "s" : ""} (use --all-warnings to see all)`
427
+ );
428
+ }
413
429
  }
414
430
  }
415
431
  } catch (error) {
@@ -659,7 +675,7 @@ function capitalize(str) {
659
675
 
660
676
  // src/commands/todoist.ts
661
677
  var import_commander3 = require("commander");
662
- var import_config = require("@md2do/config");
678
+ var import_config2 = require("@md2do/config");
663
679
  var import_todoist = require("@md2do/todoist");
664
680
  var import_core4 = require("@md2do/core");
665
681
  var import_promises2 = __toESM(require("fs/promises"));
@@ -688,7 +704,7 @@ function createTodoistListCommand() {
688
704
  return command;
689
705
  }
690
706
  async function todoistListAction(options) {
691
- const config = await (0, import_config.loadConfig)();
707
+ const config = await (0, import_config2.loadConfig)();
692
708
  if (!config.todoist?.apiToken) {
693
709
  console.error("\u274C Error: Todoist API token not configured");
694
710
  console.error("");
@@ -819,7 +835,7 @@ function createTodoistAddCommand() {
819
835
  return command;
820
836
  }
821
837
  async function todoistAddAction(taskContent, options) {
822
- const config = await (0, import_config.loadConfig)();
838
+ const config = await (0, import_config2.loadConfig)();
823
839
  if (!config.todoist?.apiToken) {
824
840
  console.error("\u274C Error: Todoist API token not configured");
825
841
  console.error("");
@@ -912,7 +928,7 @@ async function todoistImportAction(location, options) {
912
928
  console.error(`\u274C Error: Invalid line number: ${lineStr}`);
913
929
  process.exit(1);
914
930
  }
915
- const config = await (0, import_config.loadConfig)();
931
+ const config = await (0, import_config2.loadConfig)();
916
932
  if (!config.todoist?.apiToken) {
917
933
  console.error("\u274C Error: Todoist API token not configured");
918
934
  console.error("");
@@ -1026,7 +1042,7 @@ function createTodoistSyncCommand() {
1026
1042
  return command;
1027
1043
  }
1028
1044
  async function todoistSyncAction(options) {
1029
- const config = await (0, import_config.loadConfig)();
1045
+ const config = await (0, import_config2.loadConfig)();
1030
1046
  if (!config.todoist?.apiToken) {
1031
1047
  console.error("\u274C Error: Todoist API token not configured");
1032
1048
  console.error("");