@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,256 @@
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 { registerGetTodoStats } from '../../src/mcp/tools/get-todo-stats.js';
6
+ import { initDb, getDb } from '../../src/mcp/db.js';
7
+ import { scanFile } from '../../src/mcp/scanner.js';
8
+ import { syncFileTodos } from '../../src/mcp/db.js';
9
+ class MockMcpServer {
10
+ tools = new Map();
11
+ registerTool(name, schema, handler) {
12
+ this.tools.set(name, { schema, handler });
13
+ }
14
+ getTool(name) {
15
+ return this.tools.get(name);
16
+ }
17
+ }
18
+ describe('get-todo-stats tool', () => {
19
+ let testDir;
20
+ let mockServer;
21
+ beforeEach(async () => {
22
+ testDir = join(tmpdir(), `get-todo-stats-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
23
+ mkdirSync(testDir, { recursive: true });
24
+ mockServer = new MockMcpServer();
25
+ await initDb(testDir);
26
+ });
27
+ afterEach(async () => {
28
+ try {
29
+ const db = getDb();
30
+ await db.close();
31
+ }
32
+ catch {
33
+ // ignore
34
+ }
35
+ if (existsSync(testDir)) {
36
+ rmSync(testDir, { recursive: true, force: true });
37
+ }
38
+ });
39
+ describe('tool registration', () => {
40
+ it('should register get-todo-stats tool with correct schema', () => {
41
+ registerGetTodoStats(mockServer);
42
+ const tool = mockServer.getTool('get-todo-stats');
43
+ expect(tool).toBeDefined();
44
+ expect(tool?.schema).toBeDefined();
45
+ });
46
+ });
47
+ describe('stats when no todos exist', () => {
48
+ it('should return "No TODOs in database" message', async () => {
49
+ registerGetTodoStats(mockServer);
50
+ const tool = mockServer.getTool('get-todo-stats');
51
+ expect(tool).toBeDefined();
52
+ const result = await tool.handler({});
53
+ const content = result.content;
54
+ expect(content).toBeDefined();
55
+ expect(content[0].type).toBe('text');
56
+ expect(content[0].text).toContain('No TODOs in database');
57
+ });
58
+ });
59
+ describe('stats with multiple todos', () => {
60
+ it('should return total count', async () => {
61
+ const file1 = join(testDir, 'file1.ts');
62
+ writeFileSync(file1, `// TODO: First
63
+ // TODO: Second
64
+ `);
65
+ const todos1 = await scanFile(file1);
66
+ await syncFileTodos('file1.ts', todos1);
67
+ const file2 = join(testDir, 'file2.ts');
68
+ writeFileSync(file2, '// FIXME: Third\n');
69
+ const todos2 = await scanFile(file2);
70
+ await syncFileTodos('file2.ts', todos2);
71
+ registerGetTodoStats(mockServer);
72
+ const tool = mockServer.getTool('get-todo-stats');
73
+ expect(tool).toBeDefined();
74
+ const result = await tool.handler({});
75
+ const content = result.content;
76
+ expect(content).toBeDefined();
77
+ expect(content[0].text).toContain('Total TODOs: 3');
78
+ });
79
+ it('should include breakdown by tag', async () => {
80
+ const file = join(testDir, 'mixed.ts');
81
+ writeFileSync(file, `// TODO: First
82
+ // TODO: Second
83
+ // FIXME: Fix this
84
+ `);
85
+ const todos = await scanFile(file);
86
+ await syncFileTodos('mixed.ts', todos);
87
+ registerGetTodoStats(mockServer);
88
+ const tool = mockServer.getTool('get-todo-stats');
89
+ expect(tool).toBeDefined();
90
+ const result = await tool.handler({});
91
+ const content = result.content;
92
+ expect(content).toBeDefined();
93
+ const text = content[0].text;
94
+ expect(text).toContain('By Tag:');
95
+ expect(text).toContain('TODO: 2');
96
+ expect(text).toContain('FIXME: 1');
97
+ });
98
+ it('should include top files by TODO count', async () => {
99
+ const file1 = join(testDir, 'file1.ts');
100
+ writeFileSync(file1, `// TODO: First
101
+ // TODO: Second
102
+ // TODO: Third
103
+ `);
104
+ const todos1 = await scanFile(file1);
105
+ await syncFileTodos('file1.ts', todos1);
106
+ const file2 = join(testDir, 'file2.ts');
107
+ writeFileSync(file2, '// TODO: Fourth\n');
108
+ const todos2 = await scanFile(file2);
109
+ await syncFileTodos('file2.ts', todos2);
110
+ registerGetTodoStats(mockServer);
111
+ const tool = mockServer.getTool('get-todo-stats');
112
+ expect(tool).toBeDefined();
113
+ const result = await tool.handler({});
114
+ const content = result.content;
115
+ expect(content).toBeDefined();
116
+ const text = content[0].text;
117
+ expect(text).toContain('Top Files:');
118
+ expect(text).toContain('file1.ts: 3');
119
+ expect(text).toContain('file2.ts: 1');
120
+ });
121
+ it('should sort tags by count descending', async () => {
122
+ const file = join(testDir, 'tags.ts');
123
+ writeFileSync(file, `// TODO: One
124
+ // TODO: Two
125
+ // TODO: Three
126
+ // FIXME: One
127
+ // FIXME: Two
128
+ `);
129
+ const todos = await scanFile(file);
130
+ await syncFileTodos('tags.ts', todos);
131
+ registerGetTodoStats(mockServer);
132
+ const tool = mockServer.getTool('get-todo-stats');
133
+ expect(tool).toBeDefined();
134
+ const result = await tool.handler({});
135
+ const content = result.content;
136
+ expect(content).toBeDefined();
137
+ const text = content[0].text;
138
+ const byTagSection = text.split('By Tag:')[1]?.split('Top Files:')[0];
139
+ expect(byTagSection).toBeDefined();
140
+ const lines = byTagSection.trim().split('\n');
141
+ expect(lines.length).toBeGreaterThanOrEqual(2);
142
+ expect(lines[0]).toContain('TODO: 3');
143
+ expect(lines[1]).toContain('FIXME: 2');
144
+ });
145
+ it('should sort files by count descending', async () => {
146
+ const file1 = join(testDir, 'few.ts');
147
+ writeFileSync(file1, '// TODO: One\n');
148
+ const todos1 = await scanFile(file1);
149
+ await syncFileTodos('few.ts', todos1);
150
+ const file2 = join(testDir, 'many.ts');
151
+ writeFileSync(file2, `// TODO: One
152
+ // TODO: Two
153
+ // TODO: Three
154
+ `);
155
+ const todos2 = await scanFile(file2);
156
+ await syncFileTodos('many.ts', todos2);
157
+ const file3 = join(testDir, 'some.ts');
158
+ writeFileSync(file3, '// TODO: One\n// TODO: Two\n');
159
+ const todos3 = await scanFile(file3);
160
+ await syncFileTodos('some.ts', todos3);
161
+ registerGetTodoStats(mockServer);
162
+ const tool = mockServer.getTool('get-todo-stats');
163
+ expect(tool).toBeDefined();
164
+ const result = await tool.handler({});
165
+ const content = result.content;
166
+ expect(content).toBeDefined();
167
+ const text = content[0].text;
168
+ const topFilesSection = text.split('Top Files:')[1];
169
+ expect(topFilesSection).toBeDefined();
170
+ const lines = topFilesSection.trim().split('\n');
171
+ expect(lines[0]).toContain('many.ts: 3');
172
+ expect(lines[1]).toContain('some.ts: 2');
173
+ expect(lines[2]).toContain('few.ts: 1');
174
+ });
175
+ it('should limit top files to 20', async () => {
176
+ for (let i = 1; i <= 25; i++) {
177
+ const file = join(testDir, `file${i}.ts`);
178
+ writeFileSync(file, '// TODO: Test\n');
179
+ const todos = await scanFile(file);
180
+ await syncFileTodos(`file${i}.ts`, todos);
181
+ }
182
+ registerGetTodoStats(mockServer);
183
+ const tool = mockServer.getTool('get-todo-stats');
184
+ expect(tool).toBeDefined();
185
+ const result = await tool.handler({});
186
+ const content = result.content;
187
+ expect(content).toBeDefined();
188
+ const text = content[0].text;
189
+ const topFilesSection = text.split('Top Files:')[1];
190
+ expect(topFilesSection).toBeDefined();
191
+ const lines = topFilesSection.trim().split('\n');
192
+ expect(lines.length).toBeLessThanOrEqual(20);
193
+ });
194
+ });
195
+ describe('output format verification', () => {
196
+ it('should have correct structure with all sections', async () => {
197
+ const file = join(testDir, 'test.ts');
198
+ writeFileSync(file, '// TODO: Test\n');
199
+ const todos = await scanFile(file);
200
+ await syncFileTodos('test.ts', todos);
201
+ registerGetTodoStats(mockServer);
202
+ const tool = mockServer.getTool('get-todo-stats');
203
+ expect(tool).toBeDefined();
204
+ const result = await tool.handler({});
205
+ const content = result.content;
206
+ expect(content).toBeDefined();
207
+ const text = content[0].text;
208
+ expect(text).toMatch(/^Total TODOs: \d+/);
209
+ expect(text).toContain('\n\nBy Tag:\n');
210
+ expect(text).toContain('\n\nTop Files:\n');
211
+ });
212
+ it('should format tag lines correctly', async () => {
213
+ const file = join(testDir, 'test.ts');
214
+ writeFileSync(file, '// TODO: Test\n');
215
+ const todos = await scanFile(file);
216
+ await syncFileTodos('test.ts', todos);
217
+ registerGetTodoStats(mockServer);
218
+ const tool = mockServer.getTool('get-todo-stats');
219
+ expect(tool).toBeDefined();
220
+ const result = await tool.handler({});
221
+ const content = result.content;
222
+ expect(content).toBeDefined();
223
+ const text = content[0].text;
224
+ expect(text).toMatch(/ \w+: \d+/);
225
+ });
226
+ it('should format file lines correctly', async () => {
227
+ const file = join(testDir, 'test.ts');
228
+ writeFileSync(file, '// TODO: Test\n');
229
+ const todos = await scanFile(file);
230
+ await syncFileTodos('test.ts', todos);
231
+ registerGetTodoStats(mockServer);
232
+ const tool = mockServer.getTool('get-todo-stats');
233
+ expect(tool).toBeDefined();
234
+ const result = await tool.handler({});
235
+ const content = result.content;
236
+ expect(content).toBeDefined();
237
+ const text = content[0].text;
238
+ expect(text).toMatch(/ [\w./]+: \d+/);
239
+ });
240
+ });
241
+ describe('error handling', () => {
242
+ it('should handle database errors gracefully', async () => {
243
+ registerGetTodoStats(mockServer);
244
+ const tool = mockServer.getTool('get-todo-stats');
245
+ expect(tool).toBeDefined();
246
+ const db = getDb();
247
+ await db.close();
248
+ const result = await tool.handler({});
249
+ const content = result.content;
250
+ expect(content).toBeDefined();
251
+ expect(content[0].type).toBe('text');
252
+ expect(content[0].text).toContain('Error getting TODO stats');
253
+ });
254
+ });
255
+ });
256
+ //# sourceMappingURL=get-todo-stats.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-todo-stats.test.js","sourceRoot":"","sources":["../../../tests/tools/get-todo-stats.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,aAAa;IACjB,KAAK,GAAmF,IAAI,GAAG,EAAE,CAAC;IAElG,YAAY,CACV,IAAY,EACZ,MAAe,EACf,OAA4C;QAE5C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;CACF;AAED,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAI,OAAe,CAAC;IACpB,IAAI,UAAyB,CAAC;IAE9B,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,uBAAuB,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrG,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,UAAU,GAAG,IAAI,aAAa,EAAE,CAAC;QAEjC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;YACnB,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,oBAAoB,CAAC,UAAmB,CAAC,CAAC;YAE1C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,oBAAoB,CAAC,UAAmB,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACxC,aAAa,CACX,KAAK,EACL;;CAEP,CACM,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAExC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACxC,aAAa,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAExC,oBAAoB,CAAC,UAAmB,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACvC,aAAa,CACX,IAAI,EACJ;;;CAGP,CACM,CAAC;YACF,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAEvC,oBAAoB,CAAC,UAAmB,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAE9B,MAAM,IAAI,GAAG,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACxC,aAAa,CACX,KAAK,EACL;;;CAGP,CACM,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAExC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACxC,aAAa,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAExC,oBAAoB,CAAC,UAAmB,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAE9B,MAAM,IAAI,GAAG,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACtC,aAAa,CACX,IAAI,EACJ;;;;;CAKP,CACM,CAAC;YACF,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAEtC,oBAAoB,CAAC,UAAmB,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAE9B,MAAM,IAAI,GAAG,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;YAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YACtE,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;YAEnC,MAAM,KAAK,GAAG,YAAa,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACtC,aAAa,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAEtC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACvC,aAAa,CACX,KAAK,EACL;;;CAGP,CACM,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAEvC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACvC,aAAa,CAAC,KAAK,EAAE,8BAA8B,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAEvC,oBAAoB,CAAC,UAAmB,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAE9B,MAAM,IAAI,GAAG,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;YAC/B,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;YAEtC,MAAM,KAAK,GAAG,eAAgB,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC1C,aAAa,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;gBACvC,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACnC,MAAM,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC5C,CAAC;YAED,oBAAoB,CAAC,UAAmB,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAE9B,MAAM,IAAI,GAAG,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;YAC/B,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;YAEtC,MAAM,KAAK,GAAG,eAAgB,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACtC,aAAa,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;YACvC,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAEtC,oBAAoB,CAAC,UAAmB,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAE9B,MAAM,IAAI,GAAG,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACtC,aAAa,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;YACvC,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAEtC,oBAAoB,CAAC,UAAmB,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAE9B,MAAM,IAAI,GAAG,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACtC,aAAa,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;YACvC,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAEtC,oBAAoB,CAAC,UAAmB,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAE9B,MAAM,IAAI,GAAG,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,oBAAoB,CAAC,UAAmB,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;YACnB,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;YAEjB,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=list-extensions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-extensions.test.d.ts","sourceRoot":"","sources":["../../../tests/tools/list-extensions.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,123 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { registerListExtensions } from '../../src/mcp/tools/list-extensions.js';
3
+ class MockMcpServer {
4
+ tools = new Map();
5
+ registerTool(name, schema, handler) {
6
+ this.tools.set(name, { schema, handler });
7
+ }
8
+ getTool(name) {
9
+ return this.tools.get(name);
10
+ }
11
+ }
12
+ describe('list-supported-extensions tool', () => {
13
+ let mockServer;
14
+ beforeEach(() => {
15
+ mockServer = new MockMcpServer();
16
+ });
17
+ describe('tool registration', () => {
18
+ it('should register list-supported-extensions tool with correct schema', () => {
19
+ registerListExtensions(mockServer);
20
+ const tool = mockServer.getTool('list-supported-extensions');
21
+ expect(tool).toBeDefined();
22
+ expect(tool?.schema).toBeDefined();
23
+ });
24
+ });
25
+ describe('listing supported extensions', () => {
26
+ it('should return list of supported extensions', async () => {
27
+ registerListExtensions(mockServer);
28
+ const tool = mockServer.getTool('list-supported-extensions');
29
+ expect(tool).toBeDefined();
30
+ const result = await tool.handler({});
31
+ const content = result.content;
32
+ expect(content).toBeDefined();
33
+ expect(content[0].type).toBe('text');
34
+ expect(content[0].text).toContain('Supported extensions');
35
+ });
36
+ it('should include count of supported extensions', async () => {
37
+ registerListExtensions(mockServer);
38
+ const tool = mockServer.getTool('list-supported-extensions');
39
+ expect(tool).toBeDefined();
40
+ const result = await tool.handler({});
41
+ const content = result.content;
42
+ expect(content).toBeDefined();
43
+ expect(content[0].text).toMatch(/Supported extensions \(\d+\):/);
44
+ });
45
+ it('should list extensions in comma-separated format', async () => {
46
+ registerListExtensions(mockServer);
47
+ const tool = mockServer.getTool('list-supported-extensions');
48
+ expect(tool).toBeDefined();
49
+ const result = await tool.handler({});
50
+ const content = result.content;
51
+ expect(content).toBeDefined();
52
+ expect(content[0].text).toContain(',');
53
+ });
54
+ it('should include common programming language extensions', async () => {
55
+ registerListExtensions(mockServer);
56
+ const tool = mockServer.getTool('list-supported-extensions');
57
+ expect(tool).toBeDefined();
58
+ const result = await tool.handler({});
59
+ const content = result.content;
60
+ expect(content).toBeDefined();
61
+ const text = content[0].text;
62
+ expect(text).toContain('.ts');
63
+ expect(text).toContain('.js');
64
+ expect(text).toContain('.py');
65
+ });
66
+ it('should only include actually supported extensions', async () => {
67
+ registerListExtensions(mockServer);
68
+ const tool = mockServer.getTool('list-supported-extensions');
69
+ expect(tool).toBeDefined();
70
+ const result = await tool.handler({});
71
+ const content = result.content;
72
+ expect(content).toBeDefined();
73
+ const text = content[0].text;
74
+ const extensions = text.split('\n')[1];
75
+ expect(extensions).toBeDefined();
76
+ const extList = extensions.split(', ');
77
+ expect(extList.length).toBeGreaterThan(0);
78
+ extList.forEach(ext => {
79
+ expect(ext).toMatch(/^\.\w+$/);
80
+ });
81
+ });
82
+ it('should filter out unsupported extensions from candidates', async () => {
83
+ registerListExtensions(mockServer);
84
+ const tool = mockServer.getTool('list-supported-extensions');
85
+ expect(tool).toBeDefined();
86
+ const result = await tool.handler({});
87
+ const content = result.content;
88
+ expect(content).toBeDefined();
89
+ const text = content[0].text;
90
+ expect(text).not.toContain('.xyz');
91
+ expect(text).not.toContain('.unsupported');
92
+ });
93
+ });
94
+ describe('output format', () => {
95
+ it('should have consistent output format', async () => {
96
+ registerListExtensions(mockServer);
97
+ const tool = mockServer.getTool('list-supported-extensions');
98
+ expect(tool).toBeDefined();
99
+ const result = await tool.handler({});
100
+ const content = result.content;
101
+ expect(content).toBeDefined();
102
+ const text = content[0].text;
103
+ const lines = text.split('\n');
104
+ expect(lines.length).toBe(2);
105
+ expect(lines[0]).toMatch(/^Supported extensions \(\d+\):$/);
106
+ expect(lines[1]).toMatch(/^\.\w+/);
107
+ });
108
+ it('should return non-empty list', async () => {
109
+ registerListExtensions(mockServer);
110
+ const tool = mockServer.getTool('list-supported-extensions');
111
+ expect(tool).toBeDefined();
112
+ const result = await tool.handler({});
113
+ const content = result.content;
114
+ expect(content).toBeDefined();
115
+ const text = content[0].text;
116
+ const countMatch = text.match(/\((\d+)\)/);
117
+ expect(countMatch).toBeDefined();
118
+ const count = parseInt(countMatch[1], 10);
119
+ expect(count).toBeGreaterThan(0);
120
+ });
121
+ });
122
+ });
123
+ //# sourceMappingURL=list-extensions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-extensions.test.js","sourceRoot":"","sources":["../../../tests/tools/list-extensions.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=list-todos.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-todos.test.d.ts","sourceRoot":"","sources":["../../../tests/tools/list-todos.test.ts"],"names":[],"mappings":""}