@joeytheman/gemini-mcp-tool 1.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 (123) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +239 -0
  3. package/dist/__tests__/ask-gemini.test.d.ts +2 -0
  4. package/dist/__tests__/ask-gemini.test.d.ts.map +1 -0
  5. package/dist/__tests__/ask-gemini.test.js +165 -0
  6. package/dist/__tests__/ask-gemini.test.js.map +1 -0
  7. package/dist/__tests__/server.test.d.ts +2 -0
  8. package/dist/__tests__/server.test.d.ts.map +1 -0
  9. package/dist/__tests__/server.test.js +72 -0
  10. package/dist/__tests__/server.test.js.map +1 -0
  11. package/dist/__tests__/tools.test.d.ts +2 -0
  12. package/dist/__tests__/tools.test.d.ts.map +1 -0
  13. package/dist/__tests__/tools.test.js +131 -0
  14. package/dist/__tests__/tools.test.js.map +1 -0
  15. package/dist/__tests__/utils/changeModeChunker.test.d.ts +2 -0
  16. package/dist/__tests__/utils/changeModeChunker.test.d.ts.map +1 -0
  17. package/dist/__tests__/utils/changeModeChunker.test.js +137 -0
  18. package/dist/__tests__/utils/changeModeChunker.test.js.map +1 -0
  19. package/dist/__tests__/utils/changeModeParser.test.d.ts +2 -0
  20. package/dist/__tests__/utils/changeModeParser.test.d.ts.map +1 -0
  21. package/dist/__tests__/utils/changeModeParser.test.js +254 -0
  22. package/dist/__tests__/utils/changeModeParser.test.js.map +1 -0
  23. package/dist/__tests__/utils/changeModeTranslator.test.d.ts +2 -0
  24. package/dist/__tests__/utils/changeModeTranslator.test.d.ts.map +1 -0
  25. package/dist/__tests__/utils/changeModeTranslator.test.js +112 -0
  26. package/dist/__tests__/utils/changeModeTranslator.test.js.map +1 -0
  27. package/dist/__tests__/utils/chunkCache.test.d.ts +2 -0
  28. package/dist/__tests__/utils/chunkCache.test.d.ts.map +1 -0
  29. package/dist/__tests__/utils/chunkCache.test.js +140 -0
  30. package/dist/__tests__/utils/chunkCache.test.js.map +1 -0
  31. package/dist/__tests__/utils/commandExecutor.test.d.ts +2 -0
  32. package/dist/__tests__/utils/commandExecutor.test.d.ts.map +1 -0
  33. package/dist/__tests__/utils/commandExecutor.test.js +139 -0
  34. package/dist/__tests__/utils/commandExecutor.test.js.map +1 -0
  35. package/dist/__tests__/utils/geminiExecutor.test.d.ts +2 -0
  36. package/dist/__tests__/utils/geminiExecutor.test.d.ts.map +1 -0
  37. package/dist/__tests__/utils/geminiExecutor.test.js +337 -0
  38. package/dist/__tests__/utils/geminiExecutor.test.js.map +1 -0
  39. package/dist/__tests__/utils/responseCache.test.d.ts +2 -0
  40. package/dist/__tests__/utils/responseCache.test.d.ts.map +1 -0
  41. package/dist/__tests__/utils/responseCache.test.js +98 -0
  42. package/dist/__tests__/utils/responseCache.test.js.map +1 -0
  43. package/dist/__tests__/utils/test-helpers.d.ts +17 -0
  44. package/dist/__tests__/utils/test-helpers.d.ts.map +1 -0
  45. package/dist/__tests__/utils/test-helpers.js +50 -0
  46. package/dist/__tests__/utils/test-helpers.js.map +1 -0
  47. package/dist/constants.d.ts +96 -0
  48. package/dist/constants.d.ts.map +1 -0
  49. package/dist/constants.js +89 -0
  50. package/dist/constants.js.map +1 -0
  51. package/dist/index.d.ts +3 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +186 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/tools/ask-gemini.tool.d.ts +3 -0
  56. package/dist/tools/ask-gemini.tool.d.ts.map +1 -0
  57. package/dist/tools/ask-gemini.tool.js +65 -0
  58. package/dist/tools/ask-gemini.tool.js.map +1 -0
  59. package/dist/tools/brainstorm.tool.d.ts +3 -0
  60. package/dist/tools/brainstorm.tool.d.ts.map +1 -0
  61. package/dist/tools/brainstorm.tool.js +147 -0
  62. package/dist/tools/brainstorm.tool.js.map +1 -0
  63. package/dist/tools/fetch-chunk.tool.d.ts +3 -0
  64. package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
  65. package/dist/tools/fetch-chunk.tool.js +67 -0
  66. package/dist/tools/fetch-chunk.tool.js.map +1 -0
  67. package/dist/tools/index.d.ts +2 -0
  68. package/dist/tools/index.d.ts.map +1 -0
  69. package/dist/tools/index.js +10 -0
  70. package/dist/tools/index.js.map +1 -0
  71. package/dist/tools/registry.d.ts +43 -0
  72. package/dist/tools/registry.d.ts.map +1 -0
  73. package/dist/tools/registry.js +81 -0
  74. package/dist/tools/registry.js.map +1 -0
  75. package/dist/tools/simple-tools.d.ts +4 -0
  76. package/dist/tools/simple-tools.d.ts.map +1 -0
  77. package/dist/tools/simple-tools.js +42 -0
  78. package/dist/tools/simple-tools.js.map +1 -0
  79. package/dist/tools/test-tool.example.d.ts +13 -0
  80. package/dist/tools/test-tool.example.d.ts.map +1 -0
  81. package/dist/tools/test-tool.example.js +32 -0
  82. package/dist/tools/test-tool.example.js.map +1 -0
  83. package/dist/tools/timeout-test.tool.d.ts +3 -0
  84. package/dist/tools/timeout-test.tool.d.ts.map +1 -0
  85. package/dist/tools/timeout-test.tool.js +36 -0
  86. package/dist/tools/timeout-test.tool.js.map +1 -0
  87. package/dist/utils/changeModeChunker.d.ts +11 -0
  88. package/dist/utils/changeModeChunker.d.ts.map +1 -0
  89. package/dist/utils/changeModeChunker.js +89 -0
  90. package/dist/utils/changeModeChunker.js.map +1 -0
  91. package/dist/utils/changeModeParser.d.ts +15 -0
  92. package/dist/utils/changeModeParser.d.ts.map +1 -0
  93. package/dist/utils/changeModeParser.js +67 -0
  94. package/dist/utils/changeModeParser.js.map +1 -0
  95. package/dist/utils/changeModeTranslator.d.ts +8 -0
  96. package/dist/utils/changeModeTranslator.d.ts.map +1 -0
  97. package/dist/utils/changeModeTranslator.js +70 -0
  98. package/dist/utils/changeModeTranslator.js.map +1 -0
  99. package/dist/utils/chunkCache.d.ts +22 -0
  100. package/dist/utils/chunkCache.d.ts.map +1 -0
  101. package/dist/utils/chunkCache.js +161 -0
  102. package/dist/utils/chunkCache.js.map +1 -0
  103. package/dist/utils/commandExecutor.d.ts +2 -0
  104. package/dist/utils/commandExecutor.d.ts.map +1 -0
  105. package/dist/utils/commandExecutor.js +79 -0
  106. package/dist/utils/commandExecutor.js.map +1 -0
  107. package/dist/utils/geminiExecutor.d.ts +17 -0
  108. package/dist/utils/geminiExecutor.d.ts.map +1 -0
  109. package/dist/utils/geminiExecutor.js +238 -0
  110. package/dist/utils/geminiExecutor.js.map +1 -0
  111. package/dist/utils/logger.d.ts +13 -0
  112. package/dist/utils/logger.d.ts.map +1 -0
  113. package/dist/utils/logger.js +42 -0
  114. package/dist/utils/logger.js.map +1 -0
  115. package/dist/utils/responseCache.d.ts +33 -0
  116. package/dist/utils/responseCache.d.ts.map +1 -0
  117. package/dist/utils/responseCache.js +87 -0
  118. package/dist/utils/responseCache.js.map +1 -0
  119. package/dist/utils/timeoutManager.d.ts +2 -0
  120. package/dist/utils/timeoutManager.d.ts.map +1 -0
  121. package/dist/utils/timeoutManager.js +2 -0
  122. package/dist/utils/timeoutManager.js.map +1 -0
  123. package/package.json +79 -0
@@ -0,0 +1,131 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { toolRegistry, getToolDefinitions, toolExists, getPromptDefinitions } from '../tools/index.js';
3
+ describe('Tool Registry', () => {
4
+ describe('getToolDefinitions', () => {
5
+ it('should return an array of tool definitions', () => {
6
+ const tools = getToolDefinitions();
7
+ expect(Array.isArray(tools)).toBe(true);
8
+ expect(tools.length).toBeGreaterThan(0);
9
+ });
10
+ it('should include ask-gemini tool', () => {
11
+ const tools = getToolDefinitions();
12
+ const askGeminiTool = tools.find(t => t.name === 'ask-gemini');
13
+ expect(askGeminiTool).toBeDefined();
14
+ expect(askGeminiTool?.description).toBeTruthy();
15
+ expect(askGeminiTool?.inputSchema).toBeDefined();
16
+ });
17
+ it('should include brainstorm tool', () => {
18
+ const tools = getToolDefinitions();
19
+ const brainstormTool = tools.find(t => t.name === 'brainstorm');
20
+ expect(brainstormTool).toBeDefined();
21
+ expect(brainstormTool?.description).toContain('Generate novel ideas');
22
+ });
23
+ it('should include ping tool', () => {
24
+ const tools = getToolDefinitions();
25
+ const pingTool = tools.find(t => t.name === 'ping');
26
+ expect(pingTool).toBeDefined();
27
+ });
28
+ it('should include Help tool', () => {
29
+ const tools = getToolDefinitions();
30
+ const helpTool = tools.find(t => t.name === 'Help');
31
+ expect(helpTool).toBeDefined();
32
+ });
33
+ it('should include fetch-chunk tool', () => {
34
+ const tools = getToolDefinitions();
35
+ const fetchChunkTool = tools.find(t => t.name === 'fetch-chunk');
36
+ expect(fetchChunkTool).toBeDefined();
37
+ });
38
+ it('should have valid input schemas', () => {
39
+ const tools = getToolDefinitions();
40
+ tools.forEach(tool => {
41
+ expect(tool.inputSchema).toBeDefined();
42
+ expect(tool.inputSchema.type).toBe('object');
43
+ expect(tool.inputSchema).toHaveProperty('properties');
44
+ expect(tool.inputSchema).toHaveProperty('required');
45
+ });
46
+ });
47
+ });
48
+ describe('toolExists', () => {
49
+ it('should return true for existing tools', () => {
50
+ expect(toolExists('ask-gemini')).toBe(true);
51
+ expect(toolExists('brainstorm')).toBe(true);
52
+ expect(toolExists('ping')).toBe(true);
53
+ expect(toolExists('Help')).toBe(true);
54
+ expect(toolExists('fetch-chunk')).toBe(true);
55
+ });
56
+ it('should return false for non-existent tools', () => {
57
+ expect(toolExists('nonexistent-tool')).toBe(false);
58
+ expect(toolExists('fake-tool')).toBe(false);
59
+ });
60
+ });
61
+ describe('getPromptDefinitions', () => {
62
+ it('should return an array of prompt definitions', () => {
63
+ const prompts = getPromptDefinitions();
64
+ expect(Array.isArray(prompts)).toBe(true);
65
+ expect(prompts.length).toBeGreaterThan(0);
66
+ });
67
+ it('should only include tools with prompt property', () => {
68
+ const prompts = getPromptDefinitions();
69
+ prompts.forEach(prompt => {
70
+ expect(prompt).toHaveProperty('name');
71
+ expect(prompt).toHaveProperty('description');
72
+ expect(prompt).toHaveProperty('arguments');
73
+ });
74
+ });
75
+ it('should include ask-gemini prompt', () => {
76
+ const prompts = getPromptDefinitions();
77
+ const askGeminiPrompt = prompts.find(p => p.name === 'ask-gemini');
78
+ expect(askGeminiPrompt).toBeDefined();
79
+ expect(askGeminiPrompt?.description).toBeTruthy();
80
+ });
81
+ it('should include brainstorm prompt', () => {
82
+ const prompts = getPromptDefinitions();
83
+ const brainstormPrompt = prompts.find(p => p.name === 'brainstorm');
84
+ expect(brainstormPrompt).toBeDefined();
85
+ });
86
+ });
87
+ describe('Tool Schema Validation', () => {
88
+ it('ask-gemini should have required prompt parameter', () => {
89
+ const tools = getToolDefinitions();
90
+ const askGeminiTool = tools.find(t => t.name === 'ask-gemini');
91
+ expect(askGeminiTool?.inputSchema.properties).toHaveProperty('prompt');
92
+ expect(askGeminiTool?.inputSchema.required).toContain('prompt');
93
+ });
94
+ it('ask-gemini should have optional parameters', () => {
95
+ const tools = getToolDefinitions();
96
+ const askGeminiTool = tools.find(t => t.name === 'ask-gemini');
97
+ const properties = askGeminiTool?.inputSchema.properties;
98
+ expect(properties).toHaveProperty('model');
99
+ expect(properties).toHaveProperty('sandbox');
100
+ expect(properties).toHaveProperty('changeMode');
101
+ expect(properties).toHaveProperty('yolo');
102
+ expect(properties).toHaveProperty('approvalMode');
103
+ });
104
+ it('brainstorm should have methodology parameter', () => {
105
+ const tools = getToolDefinitions();
106
+ const brainstormTool = tools.find(t => t.name === 'brainstorm');
107
+ expect(brainstormTool?.inputSchema.properties).toHaveProperty('methodology');
108
+ });
109
+ it('fetch-chunk should have required cacheKey and chunkIndex', () => {
110
+ const tools = getToolDefinitions();
111
+ const fetchChunkTool = tools.find(t => t.name === 'fetch-chunk');
112
+ expect(fetchChunkTool?.inputSchema.properties).toHaveProperty('cacheKey');
113
+ expect(fetchChunkTool?.inputSchema.properties).toHaveProperty('chunkIndex');
114
+ expect(fetchChunkTool?.inputSchema.required).toContain('cacheKey');
115
+ expect(fetchChunkTool?.inputSchema.required).toContain('chunkIndex');
116
+ });
117
+ });
118
+ describe('Tool Categories', () => {
119
+ it('should categorize tools correctly', () => {
120
+ const askGemini = toolRegistry.find(t => t.name === 'ask-gemini');
121
+ const brainstorm = toolRegistry.find(t => t.name === 'brainstorm');
122
+ const ping = toolRegistry.find(t => t.name === 'ping');
123
+ const fetchChunk = toolRegistry.find(t => t.name === 'fetch-chunk');
124
+ expect(askGemini?.category).toBe('gemini');
125
+ expect(brainstorm?.category).toBe('gemini');
126
+ expect(ping?.category).toBe('simple');
127
+ expect(fetchChunk?.category).toBe('utility');
128
+ });
129
+ });
130
+ });
131
+ //# sourceMappingURL=tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=changeModeChunker.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changeModeChunker.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/changeModeChunker.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,137 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { chunkChangeModeEdits, summarizeChunking } from '../../utils/changeModeChunker.js';
3
+ function makeEdit(filename, codeSize = 50) {
4
+ return {
5
+ filename,
6
+ oldStartLine: 1,
7
+ oldEndLine: 1,
8
+ oldCode: 'x'.repeat(codeSize),
9
+ newStartLine: 1,
10
+ newEndLine: 1,
11
+ newCode: 'y'.repeat(codeSize),
12
+ };
13
+ }
14
+ describe('chunkChangeModeEdits', () => {
15
+ it('should return single empty chunk for empty edits', () => {
16
+ const chunks = chunkChangeModeEdits([]);
17
+ expect(chunks).toHaveLength(1);
18
+ expect(chunks[0].edits).toHaveLength(0);
19
+ expect(chunks[0].chunkIndex).toBe(1);
20
+ expect(chunks[0].totalChunks).toBe(1);
21
+ expect(chunks[0].hasMore).toBe(false);
22
+ expect(chunks[0].estimatedChars).toBe(0);
23
+ });
24
+ it('should fit small edit set in one chunk', () => {
25
+ const edits = [makeEdit('src/a.ts'), makeEdit('src/b.ts')];
26
+ const chunks = chunkChangeModeEdits(edits);
27
+ expect(chunks).toHaveLength(1);
28
+ expect(chunks[0].edits).toHaveLength(2);
29
+ expect(chunks[0].totalChunks).toBe(1);
30
+ expect(chunks[0].hasMore).toBe(false);
31
+ });
32
+ it('should split large edits into multiple chunks', () => {
33
+ // Create edits that exceed 20KB per chunk
34
+ // Each edit is ~250 overhead + 2*codeSize. With codeSize=5000, each is ~10250 chars
35
+ // Two edits from different files should split into 2 chunks at 20KB
36
+ const edits = [
37
+ makeEdit('src/a.ts', 5000),
38
+ makeEdit('src/b.ts', 5000),
39
+ makeEdit('src/c.ts', 5000),
40
+ ];
41
+ const chunks = chunkChangeModeEdits(edits, 12000);
42
+ expect(chunks.length).toBeGreaterThan(1);
43
+ expect(chunks[0].hasMore).toBe(true);
44
+ expect(chunks[chunks.length - 1].hasMore).toBe(false);
45
+ });
46
+ it('should group edits by file when possible', () => {
47
+ const edits = [
48
+ makeEdit('src/a.ts', 50),
49
+ makeEdit('src/a.ts', 50),
50
+ makeEdit('src/b.ts', 50),
51
+ makeEdit('src/b.ts', 50),
52
+ ];
53
+ const chunks = chunkChangeModeEdits(edits);
54
+ expect(chunks).toHaveLength(1);
55
+ // All edits for same file should be grouped together
56
+ const aEdits = chunks[0].edits.filter(e => e.filename === 'src/a.ts');
57
+ const bEdits = chunks[0].edits.filter(e => e.filename === 'src/b.ts');
58
+ expect(aEdits).toHaveLength(2);
59
+ expect(bEdits).toHaveLength(2);
60
+ });
61
+ it('should split large single-file edits across chunks', () => {
62
+ // Many edits for a single file exceeding max chunk size
63
+ const edits = [];
64
+ for (let i = 0; i < 20; i++) {
65
+ edits.push(makeEdit('src/big.ts', 2000));
66
+ }
67
+ const chunks = chunkChangeModeEdits(edits, 10000);
68
+ expect(chunks.length).toBeGreaterThan(1);
69
+ // All edits should belong to the same file
70
+ for (const chunk of chunks) {
71
+ for (const edit of chunk.edits) {
72
+ expect(edit.filename).toBe('src/big.ts');
73
+ }
74
+ }
75
+ });
76
+ it('should flush partial chunk when a large-file group follows small files', () => {
77
+ // First: small edits from file A that fit in a chunk
78
+ // Then: a large-file group from file B that exceeds maxCharsPerChunk
79
+ // This triggers the flush of the partial chunk (lines 47-51)
80
+ const edits = [
81
+ makeEdit('src/small.ts', 100), // small file, goes into currentChunk
82
+ makeEdit('src/huge.ts', 8000), // large file group, should flush previous chunk first
83
+ makeEdit('src/huge.ts', 8000), // second edit for the large file
84
+ ];
85
+ // Set max so that small.ts fits but huge.ts group (2 edits) doesn't
86
+ const chunks = chunkChangeModeEdits(edits, 5000);
87
+ expect(chunks.length).toBeGreaterThanOrEqual(2);
88
+ // First chunk should contain only the small file edit
89
+ const smallFileChunks = chunks.filter(c => c.edits.some(e => e.filename === 'src/small.ts'));
90
+ const hugeFileChunks = chunks.filter(c => c.edits.some(e => e.filename === 'src/huge.ts'));
91
+ expect(smallFileChunks.length).toBe(1);
92
+ expect(hugeFileChunks.length).toBeGreaterThanOrEqual(1);
93
+ // The small file edits should not be mixed with huge file edits
94
+ for (const chunk of smallFileChunks) {
95
+ expect(chunk.edits.every(e => e.filename === 'src/small.ts')).toBe(true);
96
+ }
97
+ });
98
+ it('should set correct chunk metadata', () => {
99
+ const edits = [
100
+ makeEdit('src/a.ts', 5000),
101
+ makeEdit('src/b.ts', 5000),
102
+ makeEdit('src/c.ts', 5000),
103
+ ];
104
+ const chunks = chunkChangeModeEdits(edits, 12000);
105
+ for (let i = 0; i < chunks.length; i++) {
106
+ expect(chunks[i].chunkIndex).toBe(i + 1);
107
+ expect(chunks[i].totalChunks).toBe(chunks.length);
108
+ expect(chunks[i].hasMore).toBe(i < chunks.length - 1);
109
+ expect(chunks[i].estimatedChars).toBeGreaterThan(0);
110
+ }
111
+ });
112
+ });
113
+ describe('summarizeChunking', () => {
114
+ it('should produce correct summary format', () => {
115
+ const edits = [makeEdit('src/a.ts'), makeEdit('src/b.ts')];
116
+ const chunks = chunkChangeModeEdits(edits);
117
+ const summary = summarizeChunking(chunks);
118
+ expect(summary).toContain('Chunking Summary:');
119
+ expect(summary).toContain('# edits: 2');
120
+ expect(summary).toContain('# chunks: 1');
121
+ expect(summary).toContain('est chars:');
122
+ expect(summary).toContain('mean size:');
123
+ expect(summary).toContain('Chunk 1:');
124
+ });
125
+ it('should correctly count edits across multiple chunks', () => {
126
+ const edits = [
127
+ makeEdit('src/a.ts', 5000),
128
+ makeEdit('src/b.ts', 5000),
129
+ makeEdit('src/c.ts', 5000),
130
+ ];
131
+ const chunks = chunkChangeModeEdits(edits, 12000);
132
+ const summary = summarizeChunking(chunks);
133
+ expect(summary).toContain('# edits: 3');
134
+ expect(summary).toContain(`# chunks: ${chunks.length}`);
135
+ });
136
+ });
137
+ //# sourceMappingURL=changeModeChunker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changeModeChunker.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/changeModeChunker.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=changeModeParser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changeModeParser.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/changeModeParser.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,254 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { parseChangeModeOutput, validateChangeModeEdits } from '../../utils/changeModeParser.js';
3
+ describe('parseChangeModeOutput', () => {
4
+ it('should parse a single edit in markdown format', () => {
5
+ const input = `**FILE: src/index.ts:10**
6
+ \`\`\`
7
+ OLD:
8
+ const x = 1;
9
+ NEW:
10
+ const x = 2;
11
+ \`\`\``;
12
+ const edits = parseChangeModeOutput(input);
13
+ expect(edits).toHaveLength(1);
14
+ expect(edits[0].filename).toBe('src/index.ts');
15
+ expect(edits[0].oldStartLine).toBe(10);
16
+ expect(edits[0].oldCode).toBe('const x = 1;');
17
+ expect(edits[0].newCode).toBe('const x = 2;');
18
+ });
19
+ it('should parse multiple edits across different files', () => {
20
+ const input = `**FILE: src/a.ts:5**
21
+ \`\`\`
22
+ OLD:
23
+ let a = 1;
24
+ NEW:
25
+ let a = 2;
26
+ \`\`\`
27
+
28
+ **FILE: src/b.ts:20**
29
+ \`\`\`
30
+ OLD:
31
+ let b = 3;
32
+ NEW:
33
+ let b = 4;
34
+ \`\`\``;
35
+ const edits = parseChangeModeOutput(input);
36
+ expect(edits).toHaveLength(2);
37
+ expect(edits[0].filename).toBe('src/a.ts');
38
+ expect(edits[0].oldStartLine).toBe(5);
39
+ expect(edits[1].filename).toBe('src/b.ts');
40
+ expect(edits[1].oldStartLine).toBe(20);
41
+ });
42
+ it('should handle empty OLD code (insertions)', () => {
43
+ const input = `**FILE: src/index.ts:1**
44
+ \`\`\`
45
+ OLD:
46
+
47
+ NEW:
48
+ const newLine = true;
49
+ \`\`\``;
50
+ const edits = parseChangeModeOutput(input);
51
+ expect(edits).toHaveLength(1);
52
+ expect(edits[0].oldCode).toBe('');
53
+ expect(edits[0].newCode).toBe('const newLine = true;');
54
+ });
55
+ it('should handle empty NEW code (deletions)', () => {
56
+ const input = `**FILE: src/index.ts:5**
57
+ \`\`\`
58
+ OLD:
59
+ const toDelete = true;
60
+ NEW:
61
+
62
+ \`\`\``;
63
+ const edits = parseChangeModeOutput(input);
64
+ expect(edits).toHaveLength(1);
65
+ expect(edits[0].oldCode).toBe('const toDelete = true;');
66
+ expect(edits[0].newCode).toBe('');
67
+ });
68
+ it('should fall back to legacy /old/ format when markdown not found', () => {
69
+ const input = `/old/ * src/file.ts 'start:' 10
70
+ const old = true;
71
+ // 'end:' 10
72
+ \\new\\ * src/file.ts 'start:' 10
73
+ const updated = true;
74
+ // 'end:' 10`;
75
+ const edits = parseChangeModeOutput(input);
76
+ expect(edits).toHaveLength(1);
77
+ expect(edits[0].filename).toBe('src/file.ts');
78
+ expect(edits[0].oldStartLine).toBe(10);
79
+ expect(edits[0].oldEndLine).toBe(10);
80
+ expect(edits[0].oldCode).toBe('const old = true;');
81
+ expect(edits[0].newCode).toBe('const updated = true;');
82
+ });
83
+ it('should return empty array when no edits found', () => {
84
+ const input = 'Just some regular text with no edits.';
85
+ const edits = parseChangeModeOutput(input);
86
+ expect(edits).toHaveLength(0);
87
+ });
88
+ it('should handle multiline code blocks', () => {
89
+ const input = `**FILE: src/component.tsx:15**
90
+ \`\`\`
91
+ OLD:
92
+ function render() {
93
+ return (
94
+ <div>Hello</div>
95
+ );
96
+ }
97
+ NEW:
98
+ function render() {
99
+ return (
100
+ <div>World</div>
101
+ );
102
+ }
103
+ \`\`\``;
104
+ const edits = parseChangeModeOutput(input);
105
+ expect(edits).toHaveLength(1);
106
+ expect(edits[0].oldStartLine).toBe(15);
107
+ // Old code has 5 lines, so end line = 15 + 5 - 1 = 19
108
+ expect(edits[0].oldEndLine).toBe(19);
109
+ expect(edits[0].oldCode).toContain('<div>Hello</div>');
110
+ expect(edits[0].newCode).toContain('<div>World</div>');
111
+ });
112
+ it('should calculate correct line ranges for multiline edits', () => {
113
+ const input = `**FILE: src/test.ts:100**
114
+ \`\`\`
115
+ OLD:
116
+ line1
117
+ line2
118
+ line3
119
+ NEW:
120
+ newLine1
121
+ newLine2
122
+ \`\`\``;
123
+ const edits = parseChangeModeOutput(input);
124
+ expect(edits).toHaveLength(1);
125
+ expect(edits[0].oldStartLine).toBe(100);
126
+ expect(edits[0].oldEndLine).toBe(102); // 100 + 3 - 1
127
+ expect(edits[0].newStartLine).toBe(100);
128
+ expect(edits[0].newEndLine).toBe(101); // 100 + 2 - 1
129
+ });
130
+ it('should trim filename whitespace', () => {
131
+ const input = `**FILE: src/padded.ts :42**
132
+ \`\`\`
133
+ OLD:
134
+ x = 1;
135
+ NEW:
136
+ x = 2;
137
+ \`\`\``;
138
+ const edits = parseChangeModeOutput(input);
139
+ expect(edits).toHaveLength(1);
140
+ expect(edits[0].filename).toBe('src/padded.ts');
141
+ });
142
+ it('should skip legacy edits with mismatched filenames', () => {
143
+ const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
144
+ const input = `/old/ * src/fileA.ts 'start:' 10
145
+ old code
146
+ // 'end:' 10
147
+ \\new\\ * src/fileB.ts 'start:' 10
148
+ new code
149
+ // 'end:' 10`;
150
+ const edits = parseChangeModeOutput(input);
151
+ expect(edits).toHaveLength(0);
152
+ consoleWarnSpy.mockRestore();
153
+ });
154
+ });
155
+ describe('validateChangeModeEdits', () => {
156
+ it('should validate valid edits', () => {
157
+ const edits = [{
158
+ filename: 'src/test.ts',
159
+ oldStartLine: 1,
160
+ oldEndLine: 5,
161
+ oldCode: 'old code',
162
+ newStartLine: 1,
163
+ newEndLine: 5,
164
+ newCode: 'new code',
165
+ }];
166
+ const result = validateChangeModeEdits(edits);
167
+ expect(result.valid).toBe(true);
168
+ expect(result.errors).toHaveLength(0);
169
+ });
170
+ it('should fail for missing filename', () => {
171
+ const edits = [{
172
+ filename: '',
173
+ oldStartLine: 1,
174
+ oldEndLine: 5,
175
+ oldCode: 'old code',
176
+ newStartLine: 1,
177
+ newEndLine: 5,
178
+ newCode: 'new code',
179
+ }];
180
+ const result = validateChangeModeEdits(edits);
181
+ expect(result.valid).toBe(false);
182
+ expect(result.errors).toContain('Edit missing filename');
183
+ });
184
+ it('should fail for invalid old line range (startLine > endLine)', () => {
185
+ const edits = [{
186
+ filename: 'test.ts',
187
+ oldStartLine: 10,
188
+ oldEndLine: 5,
189
+ oldCode: 'code',
190
+ newStartLine: 1,
191
+ newEndLine: 1,
192
+ newCode: 'code',
193
+ }];
194
+ const result = validateChangeModeEdits(edits);
195
+ expect(result.valid).toBe(false);
196
+ expect(result.errors[0]).toContain('Invalid line range');
197
+ });
198
+ it('should fail for invalid new line range', () => {
199
+ const edits = [{
200
+ filename: 'test.ts',
201
+ oldStartLine: 1,
202
+ oldEndLine: 1,
203
+ oldCode: 'code',
204
+ newStartLine: 10,
205
+ newEndLine: 5,
206
+ newCode: 'code',
207
+ }];
208
+ const result = validateChangeModeEdits(edits);
209
+ expect(result.valid).toBe(false);
210
+ expect(result.errors[0]).toContain('Invalid new line range');
211
+ });
212
+ it('should fail for empty edit (both oldCode and newCode empty)', () => {
213
+ const edits = [{
214
+ filename: 'test.ts',
215
+ oldStartLine: 1,
216
+ oldEndLine: 1,
217
+ oldCode: '',
218
+ newStartLine: 1,
219
+ newEndLine: 1,
220
+ newCode: '',
221
+ }];
222
+ const result = validateChangeModeEdits(edits);
223
+ expect(result.valid).toBe(false);
224
+ expect(result.errors[0]).toContain('Empty edit');
225
+ });
226
+ it('should accumulate multiple errors', () => {
227
+ const edits = [
228
+ {
229
+ filename: '',
230
+ oldStartLine: 10,
231
+ oldEndLine: 5,
232
+ oldCode: '',
233
+ newStartLine: 1,
234
+ newEndLine: 1,
235
+ newCode: '',
236
+ },
237
+ {
238
+ filename: 'file.ts',
239
+ oldStartLine: 1,
240
+ oldEndLine: 1,
241
+ oldCode: '',
242
+ newStartLine: 1,
243
+ newEndLine: 1,
244
+ newCode: '',
245
+ },
246
+ ];
247
+ const result = validateChangeModeEdits(edits);
248
+ expect(result.valid).toBe(false);
249
+ // First edit has 3 errors: missing filename, invalid line range, empty edit
250
+ // Second edit has 1 error: empty edit
251
+ expect(result.errors.length).toBeGreaterThanOrEqual(3);
252
+ });
253
+ });
254
+ //# sourceMappingURL=changeModeParser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changeModeParser.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/changeModeParser.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=changeModeTranslator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changeModeTranslator.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/changeModeTranslator.test.ts"],"names":[],"mappings":""}