@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.
- package/LICENSE +26 -0
- package/README.md +239 -0
- package/dist/__tests__/ask-gemini.test.d.ts +2 -0
- package/dist/__tests__/ask-gemini.test.d.ts.map +1 -0
- package/dist/__tests__/ask-gemini.test.js +165 -0
- package/dist/__tests__/ask-gemini.test.js.map +1 -0
- package/dist/__tests__/server.test.d.ts +2 -0
- package/dist/__tests__/server.test.d.ts.map +1 -0
- package/dist/__tests__/server.test.js +72 -0
- package/dist/__tests__/server.test.js.map +1 -0
- package/dist/__tests__/tools.test.d.ts +2 -0
- package/dist/__tests__/tools.test.d.ts.map +1 -0
- package/dist/__tests__/tools.test.js +131 -0
- package/dist/__tests__/tools.test.js.map +1 -0
- package/dist/__tests__/utils/changeModeChunker.test.d.ts +2 -0
- package/dist/__tests__/utils/changeModeChunker.test.d.ts.map +1 -0
- package/dist/__tests__/utils/changeModeChunker.test.js +137 -0
- package/dist/__tests__/utils/changeModeChunker.test.js.map +1 -0
- package/dist/__tests__/utils/changeModeParser.test.d.ts +2 -0
- package/dist/__tests__/utils/changeModeParser.test.d.ts.map +1 -0
- package/dist/__tests__/utils/changeModeParser.test.js +254 -0
- package/dist/__tests__/utils/changeModeParser.test.js.map +1 -0
- package/dist/__tests__/utils/changeModeTranslator.test.d.ts +2 -0
- package/dist/__tests__/utils/changeModeTranslator.test.d.ts.map +1 -0
- package/dist/__tests__/utils/changeModeTranslator.test.js +112 -0
- package/dist/__tests__/utils/changeModeTranslator.test.js.map +1 -0
- package/dist/__tests__/utils/chunkCache.test.d.ts +2 -0
- package/dist/__tests__/utils/chunkCache.test.d.ts.map +1 -0
- package/dist/__tests__/utils/chunkCache.test.js +140 -0
- package/dist/__tests__/utils/chunkCache.test.js.map +1 -0
- package/dist/__tests__/utils/commandExecutor.test.d.ts +2 -0
- package/dist/__tests__/utils/commandExecutor.test.d.ts.map +1 -0
- package/dist/__tests__/utils/commandExecutor.test.js +139 -0
- package/dist/__tests__/utils/commandExecutor.test.js.map +1 -0
- package/dist/__tests__/utils/geminiExecutor.test.d.ts +2 -0
- package/dist/__tests__/utils/geminiExecutor.test.d.ts.map +1 -0
- package/dist/__tests__/utils/geminiExecutor.test.js +337 -0
- package/dist/__tests__/utils/geminiExecutor.test.js.map +1 -0
- package/dist/__tests__/utils/responseCache.test.d.ts +2 -0
- package/dist/__tests__/utils/responseCache.test.d.ts.map +1 -0
- package/dist/__tests__/utils/responseCache.test.js +98 -0
- package/dist/__tests__/utils/responseCache.test.js.map +1 -0
- package/dist/__tests__/utils/test-helpers.d.ts +17 -0
- package/dist/__tests__/utils/test-helpers.d.ts.map +1 -0
- package/dist/__tests__/utils/test-helpers.js +50 -0
- package/dist/__tests__/utils/test-helpers.js.map +1 -0
- package/dist/constants.d.ts +96 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +89 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +186 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/ask-gemini.tool.d.ts +3 -0
- package/dist/tools/ask-gemini.tool.d.ts.map +1 -0
- package/dist/tools/ask-gemini.tool.js +65 -0
- package/dist/tools/ask-gemini.tool.js.map +1 -0
- package/dist/tools/brainstorm.tool.d.ts +3 -0
- package/dist/tools/brainstorm.tool.d.ts.map +1 -0
- package/dist/tools/brainstorm.tool.js +147 -0
- package/dist/tools/brainstorm.tool.js.map +1 -0
- package/dist/tools/fetch-chunk.tool.d.ts +3 -0
- package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
- package/dist/tools/fetch-chunk.tool.js +67 -0
- package/dist/tools/fetch-chunk.tool.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +10 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +43 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +81 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/simple-tools.d.ts +4 -0
- package/dist/tools/simple-tools.d.ts.map +1 -0
- package/dist/tools/simple-tools.js +42 -0
- package/dist/tools/simple-tools.js.map +1 -0
- package/dist/tools/test-tool.example.d.ts +13 -0
- package/dist/tools/test-tool.example.d.ts.map +1 -0
- package/dist/tools/test-tool.example.js +32 -0
- package/dist/tools/test-tool.example.js.map +1 -0
- package/dist/tools/timeout-test.tool.d.ts +3 -0
- package/dist/tools/timeout-test.tool.d.ts.map +1 -0
- package/dist/tools/timeout-test.tool.js +36 -0
- package/dist/tools/timeout-test.tool.js.map +1 -0
- package/dist/utils/changeModeChunker.d.ts +11 -0
- package/dist/utils/changeModeChunker.d.ts.map +1 -0
- package/dist/utils/changeModeChunker.js +89 -0
- package/dist/utils/changeModeChunker.js.map +1 -0
- package/dist/utils/changeModeParser.d.ts +15 -0
- package/dist/utils/changeModeParser.d.ts.map +1 -0
- package/dist/utils/changeModeParser.js +67 -0
- package/dist/utils/changeModeParser.js.map +1 -0
- package/dist/utils/changeModeTranslator.d.ts +8 -0
- package/dist/utils/changeModeTranslator.d.ts.map +1 -0
- package/dist/utils/changeModeTranslator.js +70 -0
- package/dist/utils/changeModeTranslator.js.map +1 -0
- package/dist/utils/chunkCache.d.ts +22 -0
- package/dist/utils/chunkCache.d.ts.map +1 -0
- package/dist/utils/chunkCache.js +161 -0
- package/dist/utils/chunkCache.js.map +1 -0
- package/dist/utils/commandExecutor.d.ts +2 -0
- package/dist/utils/commandExecutor.d.ts.map +1 -0
- package/dist/utils/commandExecutor.js +79 -0
- package/dist/utils/commandExecutor.js.map +1 -0
- package/dist/utils/geminiExecutor.d.ts +17 -0
- package/dist/utils/geminiExecutor.d.ts.map +1 -0
- package/dist/utils/geminiExecutor.js +238 -0
- package/dist/utils/geminiExecutor.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +42 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/responseCache.d.ts +33 -0
- package/dist/utils/responseCache.d.ts.map +1 -0
- package/dist/utils/responseCache.js +87 -0
- package/dist/utils/responseCache.js.map +1 -0
- package/dist/utils/timeoutManager.d.ts +2 -0
- package/dist/utils/timeoutManager.d.ts.map +1 -0
- package/dist/utils/timeoutManager.js +2 -0
- package/dist/utils/timeoutManager.js.map +1 -0
- 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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAc,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEvG,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;YACnC,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;YAE/D,MAAM,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC;YAChD,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;YACnC,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;YAEhE,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YAEpD,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YAEpD,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;YACnC,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;YAEjE,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;YAEnC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACnB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC7C,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;gBACtD,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnD,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAC;YAEvC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;gBACvB,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;gBACtC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;gBAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAC;YACvC,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;YAEnE,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAC;YACvC,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;YAEpE,MAAM,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;YACnC,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;YAE/D,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACvE,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;YACnC,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;YAE/D,MAAM,UAAU,GAAG,aAAa,EAAE,WAAW,CAAC,UAAU,CAAC;YACzD,MAAM,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YAChD,MAAM,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;YACnC,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;YAEhE,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QAC/E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;YACnC,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;YAEjE,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC1E,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YAC5E,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACnE,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;YAClE,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;YACnE,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YACvD,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;YAEpE,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3C,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"changeModeTranslator.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/changeModeTranslator.test.ts"],"names":[],"mappings":""}
|