@eeymoo/context-todos 0.1.0-alpha.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 (98) hide show
  1. package/README.md +261 -0
  2. package/dist/src/index.d.ts +3 -0
  3. package/dist/src/index.d.ts.map +1 -0
  4. package/dist/src/index.js +88 -0
  5. package/dist/src/index.js.map +1 -0
  6. package/dist/src/mcp/db.d.ts +29 -0
  7. package/dist/src/mcp/db.d.ts.map +1 -0
  8. package/dist/src/mcp/db.js +111 -0
  9. package/dist/src/mcp/db.js.map +1 -0
  10. package/dist/src/mcp/gitignore.d.ts +6 -0
  11. package/dist/src/mcp/gitignore.d.ts.map +1 -0
  12. package/dist/src/mcp/gitignore.js +32 -0
  13. package/dist/src/mcp/gitignore.js.map +1 -0
  14. package/dist/src/mcp/index.d.ts +7 -0
  15. package/dist/src/mcp/index.d.ts.map +1 -0
  16. package/dist/src/mcp/index.js +87 -0
  17. package/dist/src/mcp/index.js.map +1 -0
  18. package/dist/src/mcp/scanner.d.ts +7 -0
  19. package/dist/src/mcp/scanner.d.ts.map +1 -0
  20. package/dist/src/mcp/scanner.js +45 -0
  21. package/dist/src/mcp/scanner.js.map +1 -0
  22. package/dist/src/mcp/tools/get-todo-stats.d.ts +3 -0
  23. package/dist/src/mcp/tools/get-todo-stats.d.ts.map +1 -0
  24. package/dist/src/mcp/tools/get-todo-stats.js +37 -0
  25. package/dist/src/mcp/tools/get-todo-stats.js.map +1 -0
  26. package/dist/src/mcp/tools/list-extensions.d.ts +3 -0
  27. package/dist/src/mcp/tools/list-extensions.d.ts.map +1 -0
  28. package/dist/src/mcp/tools/list-extensions.js +28 -0
  29. package/dist/src/mcp/tools/list-extensions.js.map +1 -0
  30. package/dist/src/mcp/tools/list-todos.d.ts +3 -0
  31. package/dist/src/mcp/tools/list-todos.d.ts.map +1 -0
  32. package/dist/src/mcp/tools/list-todos.js +60 -0
  33. package/dist/src/mcp/tools/list-todos.js.map +1 -0
  34. package/dist/src/mcp/tools/scan-directory.d.ts +3 -0
  35. package/dist/src/mcp/tools/scan-directory.d.ts.map +1 -0
  36. package/dist/src/mcp/tools/scan-directory.js +78 -0
  37. package/dist/src/mcp/tools/scan-directory.js.map +1 -0
  38. package/dist/src/mcp/tools/scan-file.d.ts +3 -0
  39. package/dist/src/mcp/tools/scan-file.d.ts.map +1 -0
  40. package/dist/src/mcp/tools/scan-file.js +63 -0
  41. package/dist/src/mcp/tools/scan-file.js.map +1 -0
  42. package/dist/src/mcp/tools/watch.d.ts +4 -0
  43. package/dist/src/mcp/tools/watch.d.ts.map +1 -0
  44. package/dist/src/mcp/tools/watch.js +110 -0
  45. package/dist/src/mcp/tools/watch.js.map +1 -0
  46. package/dist/src/mcp/types.d.ts +35 -0
  47. package/dist/src/mcp/types.d.ts.map +1 -0
  48. package/dist/src/mcp/types.js +23 -0
  49. package/dist/src/mcp/types.js.map +1 -0
  50. package/dist/src/mcp/watcher.d.ts +7 -0
  51. package/dist/src/mcp/watcher.d.ts.map +1 -0
  52. package/dist/src/mcp/watcher.js +74 -0
  53. package/dist/src/mcp/watcher.js.map +1 -0
  54. package/dist/tests/db.test.d.ts +2 -0
  55. package/dist/tests/db.test.d.ts.map +1 -0
  56. package/dist/tests/db.test.js +339 -0
  57. package/dist/tests/db.test.js.map +1 -0
  58. package/dist/tests/mcp/index.test.d.ts +2 -0
  59. package/dist/tests/mcp/index.test.d.ts.map +1 -0
  60. package/dist/tests/mcp/index.test.js +276 -0
  61. package/dist/tests/mcp/index.test.js.map +1 -0
  62. package/dist/tests/scanner.test.d.ts +2 -0
  63. package/dist/tests/scanner.test.d.ts.map +1 -0
  64. package/dist/tests/scanner.test.js +101 -0
  65. package/dist/tests/scanner.test.js.map +1 -0
  66. package/dist/tests/tools/get-todo-stats.test.d.ts +2 -0
  67. package/dist/tests/tools/get-todo-stats.test.d.ts.map +1 -0
  68. package/dist/tests/tools/get-todo-stats.test.js +256 -0
  69. package/dist/tests/tools/get-todo-stats.test.js.map +1 -0
  70. package/dist/tests/tools/list-extensions.test.d.ts +2 -0
  71. package/dist/tests/tools/list-extensions.test.d.ts.map +1 -0
  72. package/dist/tests/tools/list-extensions.test.js +123 -0
  73. package/dist/tests/tools/list-extensions.test.js.map +1 -0
  74. package/dist/tests/tools/list-todos.test.d.ts +2 -0
  75. package/dist/tests/tools/list-todos.test.d.ts.map +1 -0
  76. package/dist/tests/tools/list-todos.test.js +279 -0
  77. package/dist/tests/tools/list-todos.test.js.map +1 -0
  78. package/dist/tests/tools/scan-directory.test.d.ts +2 -0
  79. package/dist/tests/tools/scan-directory.test.d.ts.map +1 -0
  80. package/dist/tests/tools/scan-directory.test.js +194 -0
  81. package/dist/tests/tools/scan-directory.test.js.map +1 -0
  82. package/dist/tests/tools/scan-file.test.d.ts +2 -0
  83. package/dist/tests/tools/scan-file.test.d.ts.map +1 -0
  84. package/dist/tests/tools/scan-file.test.js +176 -0
  85. package/dist/tests/tools/scan-file.test.js.map +1 -0
  86. package/dist/tests/tools/watch.test.d.ts +2 -0
  87. package/dist/tests/tools/watch.test.d.ts.map +1 -0
  88. package/dist/tests/tools/watch.test.js +286 -0
  89. package/dist/tests/tools/watch.test.js.map +1 -0
  90. package/dist/tests/watcher.test.d.ts +2 -0
  91. package/dist/tests/watcher.test.d.ts.map +1 -0
  92. package/dist/tests/watcher.test.js +372 -0
  93. package/dist/tests/watcher.test.js.map +1 -0
  94. package/dist/vitest.config.d.ts +3 -0
  95. package/dist/vitest.config.d.ts.map +1 -0
  96. package/dist/vitest.config.js +15 -0
  97. package/dist/vitest.config.js.map +1 -0
  98. package/package.json +67 -0
@@ -0,0 +1,372 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { writeFileSync, mkdirSync, rmSync, existsSync, unlinkSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { createWatcher } from '../src/mcp/watcher.js';
6
+ describe('Watcher Module', () => {
7
+ let testDir;
8
+ let watcher;
9
+ beforeEach(() => {
10
+ testDir = join(tmpdir(), `watcher-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
11
+ mkdirSync(testDir, { recursive: true });
12
+ });
13
+ afterEach(async () => {
14
+ if (watcher && watcher.watching) {
15
+ await watcher.stop();
16
+ }
17
+ if (existsSync(testDir)) {
18
+ rmSync(testDir, { recursive: true, force: true });
19
+ }
20
+ });
21
+ describe('createWatcher', () => {
22
+ it('should return a TodoWatcher object with correct properties', () => {
23
+ watcher = createWatcher();
24
+ expect(watcher).toBeDefined();
25
+ expect(typeof watcher.start).toBe('function');
26
+ expect(typeof watcher.stop).toBe('function');
27
+ expect(typeof watcher.getChanges).toBe('function');
28
+ expect(typeof watcher.clearChanges).toBe('function');
29
+ expect(typeof watcher.watching).toBe('boolean');
30
+ });
31
+ it('should have watching property initially false', () => {
32
+ watcher = createWatcher();
33
+ expect(watcher.watching).toBe(false);
34
+ });
35
+ it('should use default maxChanges of 200', async () => {
36
+ watcher = createWatcher();
37
+ await watcher.start(testDir);
38
+ // Create 250 files to exceed default limit
39
+ for (let i = 0; i < 250; i++) {
40
+ const testFile = join(testDir, `test${i}.ts`);
41
+ writeFileSync(testFile, `// TODO: Test ${i}\n`);
42
+ }
43
+ // Wait for all events to be processed
44
+ await new Promise((resolve) => setTimeout(resolve, 500));
45
+ const changes = watcher.getChanges();
46
+ expect(changes.length).toBeLessThanOrEqual(200);
47
+ });
48
+ it('should use custom maxChanges parameter', async () => {
49
+ watcher = createWatcher({ maxChanges: 10 });
50
+ await watcher.start(testDir);
51
+ // Create 20 files to exceed custom limit
52
+ for (let i = 0; i < 20; i++) {
53
+ const testFile = join(testDir, `test${i}.ts`);
54
+ writeFileSync(testFile, `// TODO: Test ${i}\n`);
55
+ }
56
+ // Wait for all events to be processed
57
+ await new Promise((resolve) => setTimeout(resolve, 500));
58
+ const changes = watcher.getChanges();
59
+ expect(changes.length).toBeLessThanOrEqual(10);
60
+ });
61
+ });
62
+ describe('watcher.start', () => {
63
+ it('should start watching a directory', async () => {
64
+ watcher = createWatcher();
65
+ expect(watcher.watching).toBe(false);
66
+ await watcher.start(testDir);
67
+ expect(watcher.watching).toBe(true);
68
+ });
69
+ it('should detect file additions', async () => {
70
+ watcher = createWatcher();
71
+ await watcher.start(testDir);
72
+ await new Promise((resolve) => setTimeout(resolve, 100));
73
+ const testFile = join(testDir, 'new-file.ts');
74
+ writeFileSync(testFile, '// TODO: New file\n');
75
+ await new Promise((resolve) => setTimeout(resolve, 300));
76
+ const changes = watcher.getChanges();
77
+ expect(changes.length).toBeGreaterThan(0);
78
+ expect(changes.some((c) => c.type === 'add' && c.path === testFile)).toBe(true);
79
+ });
80
+ it('should filter files by extensions when provided', async () => {
81
+ watcher = createWatcher();
82
+ await watcher.start(testDir, ['.ts', '.js']);
83
+ await new Promise((resolve) => setTimeout(resolve, 100));
84
+ const tsFile = join(testDir, 'test.ts');
85
+ const pyFile = join(testDir, 'test.py');
86
+ writeFileSync(tsFile, '// TODO: TypeScript file\n');
87
+ writeFileSync(pyFile, '# TODO: Python file\n');
88
+ await new Promise((resolve) => setTimeout(resolve, 300));
89
+ const changes = watcher.getChanges();
90
+ const tsPaths = changes.map((c) => c.path);
91
+ expect(tsPaths.includes(tsFile)).toBe(true);
92
+ expect(tsPaths.includes(pyFile)).toBe(false);
93
+ });
94
+ it('should stop previous watcher when restarting', async () => {
95
+ watcher = createWatcher();
96
+ await watcher.start(testDir);
97
+ expect(watcher.watching).toBe(true);
98
+ const testDir2 = join(tmpdir(), `watcher-test-2-${Date.now()}`);
99
+ mkdirSync(testDir2, { recursive: true });
100
+ await watcher.start(testDir2);
101
+ expect(watcher.watching).toBe(true);
102
+ // Clean up second directory
103
+ if (existsSync(testDir2)) {
104
+ rmSync(testDir2, { recursive: true, force: true });
105
+ }
106
+ });
107
+ });
108
+ describe('file change detection', () => {
109
+ it('should detect add events when file is created', async () => {
110
+ watcher = createWatcher();
111
+ await watcher.start(testDir);
112
+ await new Promise((resolve) => setTimeout(resolve, 100));
113
+ const testFile = join(testDir, 'new-file.ts');
114
+ writeFileSync(testFile, '// TODO: New file\n');
115
+ await new Promise((resolve) => setTimeout(resolve, 300));
116
+ const changes = watcher.getChanges();
117
+ const addEvent = changes.find((c) => c.type === 'add' && c.path === testFile);
118
+ expect(addEvent).toBeDefined();
119
+ expect(addEvent?.type).toBe('add');
120
+ expect(addEvent?.path).toBe(testFile);
121
+ });
122
+ it('should detect change events when file is modified', async () => {
123
+ const testFile = join(testDir, 'existing-file.ts');
124
+ writeFileSync(testFile, '// TODO: Original content\n');
125
+ watcher = createWatcher();
126
+ await watcher.start(testDir);
127
+ // Wait a bit before modifying
128
+ await new Promise((resolve) => setTimeout(resolve, 100));
129
+ writeFileSync(testFile, '// TODO: Modified content\n');
130
+ // Wait for change event
131
+ await new Promise((resolve) => setTimeout(resolve, 200));
132
+ const changes = watcher.getChanges();
133
+ const changeEvent = changes.find((c) => c.type === 'change' && c.path === testFile);
134
+ expect(changeEvent).toBeDefined();
135
+ expect(changeEvent?.type).toBe('change');
136
+ expect(changeEvent?.path).toBe(testFile);
137
+ });
138
+ it('should detect unlink events when file is deleted', async () => {
139
+ const testFile = join(testDir, 'to-delete.ts');
140
+ writeFileSync(testFile, '// TODO: Will be deleted\n');
141
+ watcher = createWatcher();
142
+ await watcher.start(testDir);
143
+ // Wait a bit before deleting
144
+ await new Promise((resolve) => setTimeout(resolve, 100));
145
+ unlinkSync(testFile);
146
+ // Wait for unlink event
147
+ await new Promise((resolve) => setTimeout(resolve, 200));
148
+ const changes = watcher.getChanges();
149
+ const unlinkEvent = changes.find((c) => c.type === 'unlink' && c.path === testFile);
150
+ expect(unlinkEvent).toBeDefined();
151
+ expect(unlinkEvent?.type).toBe('unlink');
152
+ expect(unlinkEvent?.path).toBe(testFile);
153
+ });
154
+ it('should scan TODOs on add events', async () => {
155
+ watcher = createWatcher();
156
+ await watcher.start(testDir);
157
+ await new Promise((resolve) => setTimeout(resolve, 100));
158
+ const testFile = join(testDir, 'with-todos.ts');
159
+ writeFileSync(testFile, `// TODO: First todo
160
+ // FIXME: Second todo
161
+ const x = 1;
162
+ `);
163
+ await new Promise((resolve) => setTimeout(resolve, 400));
164
+ const changes = watcher.getChanges();
165
+ const addEvent = changes.find((c) => c.type === 'add' && c.path === testFile);
166
+ expect(addEvent).toBeDefined();
167
+ expect(addEvent?.todos).toBeDefined();
168
+ expect(addEvent?.todos.length).toBeGreaterThanOrEqual(2);
169
+ });
170
+ it('should scan TODOs on change events', async () => {
171
+ const testFile = join(testDir, 'to-modify.ts');
172
+ writeFileSync(testFile, 'const x = 1;\n');
173
+ watcher = createWatcher();
174
+ await watcher.start(testDir);
175
+ await new Promise((resolve) => setTimeout(resolve, 100));
176
+ writeFileSync(testFile, `// TODO: New todo
177
+ const x = 2;
178
+ `);
179
+ // Wait for change event and TODO scanning
180
+ await new Promise((resolve) => setTimeout(resolve, 300));
181
+ const changes = watcher.getChanges();
182
+ const changeEvent = changes.find((c) => c.type === 'change' && c.path === testFile);
183
+ expect(changeEvent).toBeDefined();
184
+ expect(changeEvent?.todos).toBeDefined();
185
+ expect(changeEvent?.todos.length).toBeGreaterThan(0);
186
+ });
187
+ it('should have empty todos array on unlink events', async () => {
188
+ const testFile = join(testDir, 'with-todos-delete.ts');
189
+ writeFileSync(testFile, '// TODO: Will be deleted\n');
190
+ watcher = createWatcher();
191
+ await watcher.start(testDir);
192
+ await new Promise((resolve) => setTimeout(resolve, 100));
193
+ unlinkSync(testFile);
194
+ // Wait for unlink event
195
+ await new Promise((resolve) => setTimeout(resolve, 200));
196
+ const changes = watcher.getChanges();
197
+ const unlinkEvent = changes.find((c) => c.type === 'unlink' && c.path === testFile);
198
+ expect(unlinkEvent).toBeDefined();
199
+ expect(unlinkEvent?.todos).toEqual([]);
200
+ });
201
+ it('should handle errors when scanning temporarily unavailable files', async () => {
202
+ watcher = createWatcher();
203
+ await watcher.start(testDir);
204
+ // This test verifies the catch block in handleFile
205
+ // Create a file and immediately delete it to simulate atomic write issues
206
+ const testFile = join(testDir, 'atomic-write.ts');
207
+ writeFileSync(testFile, '// TODO: Atomic write test\n');
208
+ // The watcher should not crash even if scanning fails
209
+ await new Promise((resolve) => setTimeout(resolve, 200));
210
+ // Watcher should still be running
211
+ expect(watcher.watching).toBe(true);
212
+ });
213
+ });
214
+ describe('watcher.getChanges', () => {
215
+ it('should return all changes when called without parameters', async () => {
216
+ watcher = createWatcher();
217
+ await watcher.start(testDir);
218
+ await new Promise((resolve) => setTimeout(resolve, 100));
219
+ const file1 = join(testDir, 'file1.ts');
220
+ const file2 = join(testDir, 'file2.ts');
221
+ writeFileSync(file1, '// TODO: File 1\n');
222
+ writeFileSync(file2, '// TODO: File 2\n');
223
+ await new Promise((resolve) => setTimeout(resolve, 300));
224
+ const changes = watcher.getChanges();
225
+ expect(changes.length).toBe(2);
226
+ });
227
+ it('should return changes since a timestamp', async () => {
228
+ watcher = createWatcher();
229
+ await watcher.start(testDir);
230
+ const file1 = join(testDir, 'file1.ts');
231
+ writeFileSync(file1, '// TODO: File 1\n');
232
+ await new Promise((resolve) => setTimeout(resolve, 200));
233
+ const timestamp = Date.now();
234
+ await new Promise((resolve) => setTimeout(resolve, 100));
235
+ const file2 = join(testDir, 'file2.ts');
236
+ writeFileSync(file2, '// TODO: File 2\n');
237
+ await new Promise((resolve) => setTimeout(resolve, 200));
238
+ const recentChanges = watcher.getChanges(timestamp);
239
+ expect(recentChanges.length).toBe(1);
240
+ expect(recentChanges[0]?.path).toBe(file2);
241
+ });
242
+ it('should return changes in chronological order', async () => {
243
+ watcher = createWatcher();
244
+ await watcher.start(testDir);
245
+ await new Promise((resolve) => setTimeout(resolve, 100));
246
+ const file1 = join(testDir, 'file1.ts');
247
+ const file2 = join(testDir, 'file2.ts');
248
+ const file3 = join(testDir, 'file3.ts');
249
+ writeFileSync(file1, '// TODO: File 1\n');
250
+ await new Promise((resolve) => setTimeout(resolve, 150));
251
+ writeFileSync(file2, '// TODO: File 2\n');
252
+ await new Promise((resolve) => setTimeout(resolve, 150));
253
+ writeFileSync(file3, '// TODO: File 3\n');
254
+ await new Promise((resolve) => setTimeout(resolve, 300));
255
+ const changes = watcher.getChanges();
256
+ expect(changes.length).toBe(3);
257
+ expect(changes[0]?.timestamp).toBeLessThanOrEqual(changes[1]?.timestamp ?? 0);
258
+ expect(changes[1]?.timestamp).toBeLessThanOrEqual(changes[2]?.timestamp ?? 0);
259
+ });
260
+ it('should not mutate original array (immutability)', async () => {
261
+ watcher = createWatcher();
262
+ await watcher.start(testDir);
263
+ const testFile = join(testDir, 'test.ts');
264
+ writeFileSync(testFile, '// TODO: Test\n');
265
+ await new Promise((resolve) => setTimeout(resolve, 200));
266
+ const changes1 = watcher.getChanges();
267
+ const changes2 = watcher.getChanges();
268
+ expect(changes1).not.toBe(changes2);
269
+ expect(changes1).toEqual(changes2);
270
+ // Modifying returned array should not affect internal state
271
+ changes1.pop();
272
+ const changes3 = watcher.getChanges();
273
+ expect(changes3.length).toBe(changes2.length);
274
+ });
275
+ });
276
+ describe('watcher.clearChanges', () => {
277
+ it('should empty the changes buffer', async () => {
278
+ watcher = createWatcher();
279
+ await watcher.start(testDir);
280
+ await new Promise((resolve) => setTimeout(resolve, 100));
281
+ const testFile = join(testDir, 'test.ts');
282
+ writeFileSync(testFile, '// TODO: Test\n');
283
+ await new Promise((resolve) => setTimeout(resolve, 300));
284
+ let changes = watcher.getChanges();
285
+ expect(changes.length).toBeGreaterThan(0);
286
+ watcher.clearChanges();
287
+ changes = watcher.getChanges();
288
+ expect(changes.length).toBe(0);
289
+ });
290
+ it('should return empty array after clear', async () => {
291
+ watcher = createWatcher();
292
+ await watcher.start(testDir);
293
+ await new Promise((resolve) => setTimeout(resolve, 100));
294
+ const file1 = join(testDir, 'file1.ts');
295
+ const file2 = join(testDir, 'file2.ts');
296
+ writeFileSync(file1, '// TODO: File 1\n');
297
+ writeFileSync(file2, '// TODO: File 2\n');
298
+ await new Promise((resolve) => setTimeout(resolve, 300));
299
+ expect(watcher.getChanges().length).toBe(2);
300
+ watcher.clearChanges();
301
+ expect(watcher.getChanges()).toEqual([]);
302
+ });
303
+ });
304
+ describe('watcher.stop', () => {
305
+ it('should set watching property to false after stop', async () => {
306
+ watcher = createWatcher();
307
+ await watcher.start(testDir);
308
+ expect(watcher.watching).toBe(true);
309
+ await watcher.stop();
310
+ expect(watcher.watching).toBe(false);
311
+ });
312
+ it('should not detect changes after stop', async () => {
313
+ watcher = createWatcher();
314
+ await watcher.start(testDir);
315
+ await new Promise((resolve) => setTimeout(resolve, 100));
316
+ const file1 = join(testDir, 'file1.ts');
317
+ writeFileSync(file1, '// TODO: File 1\n');
318
+ await new Promise((resolve) => setTimeout(resolve, 300));
319
+ expect(watcher.getChanges().length).toBe(1);
320
+ await watcher.stop();
321
+ const file2 = join(testDir, 'file2.ts');
322
+ writeFileSync(file2, '// TODO: File 2\n');
323
+ await new Promise((resolve) => setTimeout(resolve, 300));
324
+ const changes = watcher.getChanges();
325
+ expect(changes.length).toBe(1);
326
+ expect(changes[0]?.path).toBe(file1);
327
+ });
328
+ it('should be safe to call stop when not watching', async () => {
329
+ watcher = createWatcher();
330
+ expect(watcher.watching).toBe(false);
331
+ await expect(watcher.stop()).resolves.toBeUndefined();
332
+ expect(watcher.watching).toBe(false);
333
+ });
334
+ });
335
+ describe('maxChanges buffer limit', () => {
336
+ it('should truncate oldest changes when limit exceeded', async () => {
337
+ watcher = createWatcher({ maxChanges: 5 });
338
+ await watcher.start(testDir);
339
+ // Create 10 files to exceed limit
340
+ for (let i = 0; i < 10; i++) {
341
+ const testFile = join(testDir, `test${i}.ts`);
342
+ writeFileSync(testFile, `// TODO: Test ${i}\n`);
343
+ await new Promise((resolve) => setTimeout(resolve, 50));
344
+ }
345
+ // Wait for all events
346
+ await new Promise((resolve) => setTimeout(resolve, 200));
347
+ const changes = watcher.getChanges();
348
+ expect(changes.length).toBeLessThanOrEqual(5);
349
+ // Verify that the most recent changes are kept
350
+ if (changes.length > 0) {
351
+ const lastChange = changes[changes.length - 1];
352
+ expect(lastChange?.path).toContain('test');
353
+ }
354
+ });
355
+ it('should maintain correct slice behavior with changes.slice(-maxChanges)', async () => {
356
+ watcher = createWatcher({ maxChanges: 3 });
357
+ await watcher.start(testDir);
358
+ // Create files one by one
359
+ for (let i = 0; i < 5; i++) {
360
+ const testFile = join(testDir, `file${i}.ts`);
361
+ writeFileSync(testFile, `// TODO: File ${i}\n`);
362
+ await new Promise((resolve) => setTimeout(resolve, 80));
363
+ }
364
+ // Wait for all events
365
+ await new Promise((resolve) => setTimeout(resolve, 200));
366
+ const changes = watcher.getChanges();
367
+ // Should only have the last 3 changes
368
+ expect(changes.length).toBeLessThanOrEqual(3);
369
+ });
370
+ });
371
+ });
372
+ //# sourceMappingURL=watcher.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.test.js","sourceRoot":"","sources":["../../tests/watcher.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("vite").UserConfig;
2
+ export default _default;
3
+ //# sourceMappingURL=vitest.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.config.d.ts","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":";AAEA,wBAYG"}
@@ -0,0 +1,15 @@
1
+ import { defineConfig } from 'vitest/config';
2
+ export default defineConfig({
3
+ test: {
4
+ globals: true,
5
+ environment: 'node',
6
+ include: ['tests/**/*.test.ts'],
7
+ coverage: {
8
+ provider: 'v8',
9
+ reporter: ['text', 'json-summary', 'html'],
10
+ include: ['src/**/*.ts'],
11
+ exclude: ['tests/**/*.ts'],
12
+ },
13
+ },
14
+ });
15
+ //# sourceMappingURL=vitest.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.config.js","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,eAAe,YAAY,CAAC;IAC1B,IAAI,EAAE;QACJ,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,MAAM;QACnB,OAAO,EAAE,CAAC,oBAAoB,CAAC;QAC/B,QAAQ,EAAE;YACR,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC;YAC1C,OAAO,EAAE,CAAC,aAAa,CAAC;YACxB,OAAO,EAAE,CAAC,eAAe,CAAC;SAC3B;KACF;CACF,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "@eeymoo/context-todos",
3
+ "version": "0.1.0-alpha.0",
4
+ "type": "module",
5
+ "description": "MCP server for scanning and managing TODO/FIXME/HACK/XXX comments in your codebase",
6
+ "author": "eeymoo",
7
+ "license": "ISC",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/Eeymoo/context-todos"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/Eeymoo/context-todos/issues"
14
+ },
15
+ "homepage": "https://github.com/Eeymoo/context-todos#readme",
16
+ "bin": {
17
+ "context-todos": "./dist/index.js"
18
+ },
19
+ "main": "./dist/index.js",
20
+ "exports": {
21
+ ".": "./dist/index.js"
22
+ },
23
+ "keywords": [
24
+ "mcp",
25
+ "model-context-protocol",
26
+ "todo",
27
+ "fixme",
28
+ "code-scanner",
29
+ "code-analysis",
30
+ "ai-tools"
31
+ ],
32
+ "dependencies": {
33
+ "@libsql/client": "^0.17.2",
34
+ "@modelcontextprotocol/sdk": "^1.27.1",
35
+ "chokidar": "^5.0.0",
36
+ "commander": "^14.0.3",
37
+ "consola": "^3.4.2",
38
+ "ignore": "^7.0.5",
39
+ "leasot": "^14.4.0",
40
+ "zod": "^4.3.6"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^25.5.0",
44
+ "@vitest/coverage-v8": "^4.1.0",
45
+ "tsx": "^4.21.0",
46
+ "typescript": "^5.9.3",
47
+ "vitest": "^4.1.0"
48
+ },
49
+ "files": [
50
+ "dist"
51
+ ],
52
+ "engines": {
53
+ "node": ">=18.0.0"
54
+ },
55
+ "publishConfig": {
56
+ "access": "public"
57
+ },
58
+ "scripts": {
59
+ "build": "tsc",
60
+ "dev": "tsx src/index.ts mcp",
61
+ "start": "node dist/index.js mcp",
62
+ "test": "vitest run",
63
+ "test:watch": "vitest",
64
+ "inspector": "pnpm dlx @modelcontextprotocol/inspector node dist/index.js mcp",
65
+ "inspector:dev": "pnpm dlx @modelcontextprotocol/inspector tsx src/index.ts mcp"
66
+ }
67
+ }