@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,176 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { writeFileSync, mkdirSync, rmSync, existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { registerScanFile } from '../../src/mcp/tools/scan-file.js';
6
+ // Mock MCP Server for testing
7
+ class MockMcpServer {
8
+ tools = new Map();
9
+ registerTool(name, schema, handler) {
10
+ this.tools.set(name, { schema, handler });
11
+ }
12
+ getTool(name) {
13
+ return this.tools.get(name);
14
+ }
15
+ }
16
+ describe('scan-file tool', () => {
17
+ let testDir;
18
+ let mockServer;
19
+ beforeEach(() => {
20
+ testDir = join(tmpdir(), `scan-file-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
21
+ mkdirSync(testDir, { recursive: true });
22
+ mockServer = new MockMcpServer();
23
+ });
24
+ afterEach(() => {
25
+ if (existsSync(testDir)) {
26
+ rmSync(testDir, { recursive: true, force: true });
27
+ }
28
+ });
29
+ describe('tool registration', () => {
30
+ it('should register scan-file tool with correct schema', () => {
31
+ registerScanFile(mockServer);
32
+ const tool = mockServer.getTool('scan-file');
33
+ expect(tool).toBeDefined();
34
+ expect(tool?.schema).toBeDefined();
35
+ });
36
+ });
37
+ describe('scanning file with TODOs', () => {
38
+ it('should return formatted output for file with TODOs', async () => {
39
+ const testFile = join(testDir, 'test.ts');
40
+ writeFileSync(testFile, `// TODO: First todo
41
+ // FIXME: Second todo
42
+ const x = 1;
43
+ `);
44
+ registerScanFile(mockServer);
45
+ const tool = mockServer.getTool('scan-file');
46
+ expect(tool).toBeDefined();
47
+ const result = await tool.handler({ path: testFile });
48
+ expect(result).toBeDefined();
49
+ const content = result.content;
50
+ expect(content).toBeDefined();
51
+ expect(content.length).toBeGreaterThan(0);
52
+ expect(content[0].type).toBe('text');
53
+ expect(content[0].text).toContain('Found 2 TODO(s)');
54
+ expect(content[0].text).toContain('[TODO]');
55
+ expect(content[0].text).toContain('[FIXME]');
56
+ expect(content[0].text).toContain('First todo');
57
+ expect(content[0].text).toContain('Second todo');
58
+ });
59
+ it('should include line numbers in output', async () => {
60
+ const testFile = join(testDir, 'test.ts');
61
+ writeFileSync(testFile, `// Line 1
62
+ // TODO: Line 2 todo
63
+ // Line 3
64
+ `);
65
+ registerScanFile(mockServer);
66
+ const tool = mockServer.getTool('scan-file');
67
+ expect(tool).toBeDefined();
68
+ const result = await tool.handler({ path: testFile });
69
+ const content = result.content;
70
+ expect(content).toBeDefined();
71
+ expect(content[0].text).toContain(':2');
72
+ });
73
+ it('should include ref if present', async () => {
74
+ const testFile = join(testDir, 'test.ts');
75
+ writeFileSync(testFile, `// TODO(user123): Todo with reference
76
+ const x = 1;
77
+ `);
78
+ registerScanFile(mockServer);
79
+ const tool = mockServer.getTool('scan-file');
80
+ expect(tool).toBeDefined();
81
+ const result = await tool.handler({ path: testFile });
82
+ const content = result.content;
83
+ expect(content).toBeDefined();
84
+ expect(content[0].text).toContain('(ref:');
85
+ });
86
+ });
87
+ describe('scanning file without TODOs', () => {
88
+ it('should return "No TODOs found" message', async () => {
89
+ const testFile = join(testDir, 'test.ts');
90
+ writeFileSync(testFile, `const x = 1;
91
+ const y = 2;
92
+ `);
93
+ registerScanFile(mockServer);
94
+ const tool = mockServer.getTool('scan-file');
95
+ expect(tool).toBeDefined();
96
+ const result = await tool.handler({ path: testFile });
97
+ const content = result.content;
98
+ expect(content).toBeDefined();
99
+ expect(content[0].type).toBe('text');
100
+ expect(content[0].text).toContain('No TODOs found');
101
+ });
102
+ });
103
+ describe('unsupported file extension', () => {
104
+ it('should return error message for unsupported extension', async () => {
105
+ const testFile = join(testDir, 'test.xyz');
106
+ writeFileSync(testFile, '// TODO: This should be ignored\n');
107
+ registerScanFile(mockServer);
108
+ const tool = mockServer.getTool('scan-file');
109
+ expect(tool).toBeDefined();
110
+ const result = await tool.handler({ path: testFile });
111
+ const content = result.content;
112
+ expect(content).toBeDefined();
113
+ expect(content[0].type).toBe('text');
114
+ expect(content[0].text).toContain('Unsupported file extension');
115
+ expect(content[0].text).toContain('.xyz');
116
+ });
117
+ it('should return error message for file with no extension', async () => {
118
+ const testFile = join(testDir, 'test');
119
+ writeFileSync(testFile, '// TODO: This should be ignored\n');
120
+ registerScanFile(mockServer);
121
+ const tool = mockServer.getTool('scan-file');
122
+ expect(tool).toBeDefined();
123
+ const result = await tool.handler({ path: testFile });
124
+ const content = result.content;
125
+ expect(content).toBeDefined();
126
+ expect(content[0].type).toBe('text');
127
+ expect(content[0].text).toContain('Unsupported file extension');
128
+ expect(content[0].text).toContain('(none)');
129
+ });
130
+ });
131
+ describe('error handling', () => {
132
+ it('should handle file read errors gracefully', async () => {
133
+ const nonExistentFile = join(testDir, 'nonexistent.ts');
134
+ registerScanFile(mockServer);
135
+ const tool = mockServer.getTool('scan-file');
136
+ expect(tool).toBeDefined();
137
+ const result = await tool.handler({ path: nonExistentFile });
138
+ const content = result.content;
139
+ expect(content).toBeDefined();
140
+ expect(content[0].type).toBe('text');
141
+ expect(content[0].text).toContain('Error scanning file');
142
+ });
143
+ });
144
+ describe('relative path handling', () => {
145
+ it('should resolve relative paths correctly', async () => {
146
+ const testFile = join(testDir, 'test.ts');
147
+ writeFileSync(testFile, `// TODO: Test relative path
148
+ `);
149
+ registerScanFile(mockServer);
150
+ const tool = mockServer.getTool('scan-file');
151
+ expect(tool).toBeDefined();
152
+ const result = await tool.handler({ path: testFile });
153
+ const content = result.content;
154
+ expect(content).toBeDefined();
155
+ expect(content[0].text).toContain('Found 1 TODO(s)');
156
+ });
157
+ });
158
+ describe('multiple TODO types', () => {
159
+ it('should detect TODO and FIXME tags', async () => {
160
+ const testFile = join(testDir, 'test.ts');
161
+ writeFileSync(testFile, `// TODO: Regular todo
162
+ // FIXME: Fix me
163
+ `);
164
+ registerScanFile(mockServer);
165
+ const tool = mockServer.getTool('scan-file');
166
+ expect(tool).toBeDefined();
167
+ const result = await tool.handler({ path: testFile });
168
+ const content = result.content;
169
+ expect(content).toBeDefined();
170
+ expect(content[0].text).toContain('Found 2 TODO(s)');
171
+ expect(content[0].text).toContain('[TODO]');
172
+ expect(content[0].text).toContain('[FIXME]');
173
+ });
174
+ });
175
+ });
176
+ //# sourceMappingURL=scan-file.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-file.test.js","sourceRoot":"","sources":["../../../tests/tools/scan-file.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=watch.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.test.d.ts","sourceRoot":"","sources":["../../../tests/tools/watch.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,286 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { writeFileSync, mkdirSync, rmSync, existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { registerWatchTools } from '../../src/mcp/tools/watch.js';
6
+ class MockMcpServer {
7
+ tools = new Map();
8
+ registerTool(name, schema, handler) {
9
+ this.tools.set(name, { schema, handler });
10
+ }
11
+ getTool(name) {
12
+ return this.tools.get(name);
13
+ }
14
+ }
15
+ describe('watch tools', () => {
16
+ let testDir;
17
+ let mockServer;
18
+ beforeEach(() => {
19
+ testDir = join(tmpdir(), `watch-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
20
+ mkdirSync(testDir, { recursive: true });
21
+ mockServer = new MockMcpServer();
22
+ });
23
+ afterEach(async () => {
24
+ if (existsSync(testDir)) {
25
+ rmSync(testDir, { recursive: true, force: true });
26
+ }
27
+ });
28
+ describe('tool registration', () => {
29
+ it('should register start-watching tool', () => {
30
+ registerWatchTools(mockServer);
31
+ const tool = mockServer.getTool('start-watching');
32
+ expect(tool).toBeDefined();
33
+ expect(tool?.schema).toBeDefined();
34
+ });
35
+ it('should register stop-watching tool', () => {
36
+ registerWatchTools(mockServer);
37
+ const tool = mockServer.getTool('stop-watching');
38
+ expect(tool).toBeDefined();
39
+ expect(tool?.schema).toBeDefined();
40
+ });
41
+ it('should register get-watched-changes tool', () => {
42
+ registerWatchTools(mockServer);
43
+ const tool = mockServer.getTool('get-watched-changes');
44
+ expect(tool).toBeDefined();
45
+ expect(tool?.schema).toBeDefined();
46
+ });
47
+ });
48
+ describe('start-watching', () => {
49
+ it('should start watching a directory', async () => {
50
+ registerWatchTools(mockServer);
51
+ const tool = mockServer.getTool('start-watching');
52
+ expect(tool).toBeDefined();
53
+ const result = await tool.handler({ path: testDir });
54
+ const content = result.content;
55
+ expect(content).toBeDefined();
56
+ expect(content[0].type).toBe('text');
57
+ expect(content[0].text).toContain('Started watching');
58
+ });
59
+ it('should use current directory when path not provided', async () => {
60
+ registerWatchTools(mockServer);
61
+ const tool = mockServer.getTool('start-watching');
62
+ expect(tool).toBeDefined();
63
+ const result = await tool.handler({});
64
+ const content = result.content;
65
+ expect(content).toBeDefined();
66
+ expect(content[0].text).toContain('Started watching: .');
67
+ });
68
+ it('should support custom path', async () => {
69
+ registerWatchTools(mockServer);
70
+ const tool = mockServer.getTool('start-watching');
71
+ expect(tool).toBeDefined();
72
+ const result = await tool.handler({ path: testDir });
73
+ const content = result.content;
74
+ expect(content).toBeDefined();
75
+ expect(content[0].text).toContain(testDir);
76
+ });
77
+ it('should support extensions filter', async () => {
78
+ registerWatchTools(mockServer);
79
+ const tool = mockServer.getTool('start-watching');
80
+ expect(tool).toBeDefined();
81
+ const result = await tool.handler({ path: testDir, extensions: ['.ts', '.js'] });
82
+ const content = result.content;
83
+ expect(content).toBeDefined();
84
+ expect(content[0].text).toContain('Started watching');
85
+ });
86
+ it('should handle errors gracefully', async () => {
87
+ registerWatchTools(mockServer);
88
+ const tool = mockServer.getTool('start-watching');
89
+ expect(tool).toBeDefined();
90
+ const result = await tool.handler({ path: '/invalid/path/that/does/not/exist' });
91
+ const content = result.content;
92
+ expect(content).toBeDefined();
93
+ expect(content[0].type).toBe('text');
94
+ });
95
+ });
96
+ describe('stop-watching', () => {
97
+ it('should stop active watcher', async () => {
98
+ registerWatchTools(mockServer);
99
+ const startTool = mockServer.getTool('start-watching');
100
+ expect(startTool).toBeDefined();
101
+ await startTool.handler({ path: testDir });
102
+ const stopTool = mockServer.getTool('stop-watching');
103
+ expect(stopTool).toBeDefined();
104
+ const result = await stopTool.handler({});
105
+ const content = result.content;
106
+ expect(content).toBeDefined();
107
+ expect(content[0].type).toBe('text');
108
+ expect(content[0].text).toContain('Watcher stopped');
109
+ });
110
+ it('should return message when no active watcher', async () => {
111
+ registerWatchTools(mockServer);
112
+ const stopTool = mockServer.getTool('stop-watching');
113
+ expect(stopTool).toBeDefined();
114
+ const result = await stopTool.handler({});
115
+ const content = result.content;
116
+ expect(content).toBeDefined();
117
+ expect(content[0].type).toBe('text');
118
+ expect(content[0].text).toContain('No active watcher to stop');
119
+ });
120
+ });
121
+ describe('get-watched-changes', () => {
122
+ it('should return error when no watcher is active', async () => {
123
+ registerWatchTools(mockServer);
124
+ const tool = mockServer.getTool('get-watched-changes');
125
+ expect(tool).toBeDefined();
126
+ const result = await tool.handler({});
127
+ const content = result.content;
128
+ expect(content).toBeDefined();
129
+ expect(content[0].type).toBe('text');
130
+ expect(content[0].text).toContain('No active watcher');
131
+ });
132
+ it('should return buffered changes', async () => {
133
+ registerWatchTools(mockServer);
134
+ const startTool = mockServer.getTool('start-watching');
135
+ expect(startTool).toBeDefined();
136
+ await startTool.handler({ path: testDir });
137
+ await new Promise(resolve => setTimeout(resolve, 100));
138
+ writeFileSync(join(testDir, 'new.ts'), '// TODO: New file\n');
139
+ await new Promise(resolve => setTimeout(resolve, 200));
140
+ const getTool = mockServer.getTool('get-watched-changes');
141
+ expect(getTool).toBeDefined();
142
+ const result = await getTool.handler({});
143
+ const content = result.content;
144
+ expect(content).toBeDefined();
145
+ expect(content[0].type).toBe('text');
146
+ expect(content[0].text).toMatch(/\d+ change\(s\) detected/);
147
+ });
148
+ it('should filter changes by since parameter', async () => {
149
+ registerWatchTools(mockServer);
150
+ const startTool = mockServer.getTool('start-watching');
151
+ expect(startTool).toBeDefined();
152
+ await startTool.handler({ path: testDir });
153
+ await new Promise(resolve => setTimeout(resolve, 100));
154
+ writeFileSync(join(testDir, 'file1.ts'), '// TODO: File 1\n');
155
+ const timestamp = Date.now();
156
+ await new Promise(resolve => setTimeout(resolve, 100));
157
+ writeFileSync(join(testDir, 'file2.ts'), '// TODO: File 2\n');
158
+ await new Promise(resolve => setTimeout(resolve, 200));
159
+ const getTool = mockServer.getTool('get-watched-changes');
160
+ expect(getTool).toBeDefined();
161
+ const result = await getTool.handler({ since: timestamp });
162
+ const content = result.content;
163
+ expect(content).toBeDefined();
164
+ expect(content[0].type).toBe('text');
165
+ });
166
+ it('should clear changes when clear parameter is true', async () => {
167
+ registerWatchTools(mockServer);
168
+ const startTool = mockServer.getTool('start-watching');
169
+ expect(startTool).toBeDefined();
170
+ await startTool.handler({ path: testDir });
171
+ await new Promise(resolve => setTimeout(resolve, 100));
172
+ writeFileSync(join(testDir, 'new.ts'), '// TODO: New file\n');
173
+ await new Promise(resolve => setTimeout(resolve, 200));
174
+ const getTool = mockServer.getTool('get-watched-changes');
175
+ expect(getTool).toBeDefined();
176
+ const result1 = await getTool.handler({ clear: true });
177
+ const content1 = result1.content;
178
+ expect(content1).toBeDefined();
179
+ const result2 = await getTool.handler({});
180
+ const content2 = result2.content;
181
+ expect(content2).toBeDefined();
182
+ expect(content2[0].text).toContain('No changes detected');
183
+ });
184
+ it('should return "No changes detected" when buffer is empty', async () => {
185
+ registerWatchTools(mockServer);
186
+ const startTool = mockServer.getTool('start-watching');
187
+ expect(startTool).toBeDefined();
188
+ await startTool.handler({ path: testDir });
189
+ await new Promise(resolve => setTimeout(resolve, 100));
190
+ const getTool = mockServer.getTool('get-watched-changes');
191
+ expect(getTool).toBeDefined();
192
+ const result = await getTool.handler({});
193
+ const content = result.content;
194
+ expect(content).toBeDefined();
195
+ expect(content[0].type).toBe('text');
196
+ expect(content[0].text).toContain('No changes detected');
197
+ });
198
+ it('should show TODO counts in change events', async () => {
199
+ registerWatchTools(mockServer);
200
+ const startTool = mockServer.getTool('start-watching');
201
+ expect(startTool).toBeDefined();
202
+ await startTool.handler({ path: testDir });
203
+ await new Promise(resolve => setTimeout(resolve, 200));
204
+ writeFileSync(join(testDir, 'todos.ts'), `// TODO: First
205
+ // TODO: Second
206
+ `);
207
+ await new Promise(resolve => setTimeout(resolve, 400));
208
+ const getTool = mockServer.getTool('get-watched-changes');
209
+ expect(getTool).toBeDefined();
210
+ const result = await getTool.handler({});
211
+ const content = result.content;
212
+ expect(content).toBeDefined();
213
+ expect(content[0].text).toContain('2 TODOs');
214
+ });
215
+ it('should detect file add events', async () => {
216
+ registerWatchTools(mockServer);
217
+ const startTool = mockServer.getTool('start-watching');
218
+ expect(startTool).toBeDefined();
219
+ await startTool.handler({ path: testDir });
220
+ await new Promise(resolve => setTimeout(resolve, 200));
221
+ writeFileSync(join(testDir, 'new.ts'), '// TODO: New\n');
222
+ await new Promise(resolve => setTimeout(resolve, 400));
223
+ const getTool = mockServer.getTool('get-watched-changes');
224
+ expect(getTool).toBeDefined();
225
+ const result = await getTool.handler({});
226
+ const content = result.content;
227
+ expect(content).toBeDefined();
228
+ expect(content[0].text).toContain('[ADD]');
229
+ });
230
+ it('should detect file change events', async () => {
231
+ registerWatchTools(mockServer);
232
+ const testFile = join(testDir, 'existing.ts');
233
+ writeFileSync(testFile, '// TODO: Original\n');
234
+ const startTool = mockServer.getTool('start-watching');
235
+ expect(startTool).toBeDefined();
236
+ await startTool.handler({ path: testDir });
237
+ await new Promise(resolve => setTimeout(resolve, 100));
238
+ writeFileSync(testFile, '// TODO: Modified\n');
239
+ await new Promise(resolve => setTimeout(resolve, 200));
240
+ const getTool = mockServer.getTool('get-watched-changes');
241
+ expect(getTool).toBeDefined();
242
+ const result = await getTool.handler({});
243
+ const content = result.content;
244
+ expect(content).toBeDefined();
245
+ expect(content[0].text).toContain('[CHANGE]');
246
+ });
247
+ it('should detect file unlink events', async () => {
248
+ registerWatchTools(mockServer);
249
+ const testFile = join(testDir, 'todelete.ts');
250
+ writeFileSync(testFile, '// TODO: Delete me\n');
251
+ const startTool = mockServer.getTool('start-watching');
252
+ expect(startTool).toBeDefined();
253
+ await startTool.handler({ path: testDir });
254
+ await new Promise(resolve => setTimeout(resolve, 100));
255
+ rmSync(testFile);
256
+ await new Promise(resolve => setTimeout(resolve, 200));
257
+ const getTool = mockServer.getTool('get-watched-changes');
258
+ expect(getTool).toBeDefined();
259
+ const result = await getTool.handler({});
260
+ const content = result.content;
261
+ expect(content).toBeDefined();
262
+ expect(content[0].text).toContain('[UNLINK]');
263
+ });
264
+ });
265
+ describe('watcher with extension filter', () => {
266
+ it('should only watch files with specified extensions', async () => {
267
+ registerWatchTools(mockServer);
268
+ const startTool = mockServer.getTool('start-watching');
269
+ expect(startTool).toBeDefined();
270
+ await startTool.handler({ path: testDir, extensions: ['.ts'] });
271
+ await new Promise(resolve => setTimeout(resolve, 100));
272
+ writeFileSync(join(testDir, 'included.ts'), '// TODO: Included\n');
273
+ writeFileSync(join(testDir, 'excluded.js'), '// TODO: Excluded\n');
274
+ await new Promise(resolve => setTimeout(resolve, 200));
275
+ const getTool = mockServer.getTool('get-watched-changes');
276
+ expect(getTool).toBeDefined();
277
+ const result = await getTool.handler({});
278
+ const content = result.content;
279
+ expect(content).toBeDefined();
280
+ const text = content[0].text;
281
+ expect(text).toContain('included.ts');
282
+ expect(text).not.toContain('excluded.js');
283
+ });
284
+ });
285
+ });
286
+ //# sourceMappingURL=watch.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.test.js","sourceRoot":"","sources":["../../../tests/tools/watch.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=watcher.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.test.d.ts","sourceRoot":"","sources":["../../tests/watcher.test.ts"],"names":[],"mappings":""}