@satelliteoflove/godot-mcp 0.1.5 → 1.0.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 (34) hide show
  1. package/README.md +52 -9
  2. package/dist/__tests__/helpers/mock-godot.d.ts +17 -0
  3. package/dist/__tests__/helpers/mock-godot.d.ts.map +1 -0
  4. package/dist/__tests__/helpers/mock-godot.js +33 -0
  5. package/dist/__tests__/helpers/mock-godot.js.map +1 -0
  6. package/dist/__tests__/tools/animation.test.d.ts +2 -0
  7. package/dist/__tests__/tools/animation.test.d.ts.map +1 -0
  8. package/dist/__tests__/tools/animation.test.js +315 -0
  9. package/dist/__tests__/tools/animation.test.js.map +1 -0
  10. package/dist/__tests__/tools/node.test.d.ts +2 -0
  11. package/dist/__tests__/tools/node.test.d.ts.map +1 -0
  12. package/dist/__tests__/tools/node.test.js +173 -0
  13. package/dist/__tests__/tools/node.test.js.map +1 -0
  14. package/dist/__tests__/tools/scene.test.d.ts +2 -0
  15. package/dist/__tests__/tools/scene.test.d.ts.map +1 -0
  16. package/dist/__tests__/tools/scene.test.js +127 -0
  17. package/dist/__tests__/tools/scene.test.js.map +1 -0
  18. package/dist/__tests__/tools/tilemap.test.d.ts +2 -0
  19. package/dist/__tests__/tools/tilemap.test.d.ts.map +1 -0
  20. package/dist/__tests__/tools/tilemap.test.js +333 -0
  21. package/dist/__tests__/tools/tilemap.test.js.map +1 -0
  22. package/dist/tools/animation.d.ts +152 -216
  23. package/dist/tools/animation.d.ts.map +1 -1
  24. package/dist/tools/animation.js +324 -372
  25. package/dist/tools/animation.js.map +1 -1
  26. package/dist/tools/tilemap.d.ts +267 -253
  27. package/dist/tools/tilemap.d.ts.map +1 -1
  28. package/dist/tools/tilemap.js +273 -304
  29. package/dist/tools/tilemap.js.map +1 -1
  30. package/package.json +5 -3
  31. package/dist/__tests__/registry.test.d.ts +0 -2
  32. package/dist/__tests__/registry.test.d.ts.map +0 -1
  33. package/dist/__tests__/registry.test.js +0 -116
  34. package/dist/__tests__/registry.test.js.map +0 -1
package/README.md CHANGED
@@ -1,34 +1,77 @@
1
1
  # @satelliteoflove/godot-mcp
2
2
 
3
- MCP (Model Context Protocol) server for Godot Engine integration. Enables AI assistants to interact with the Godot editor.
3
+ MCP (Model Context Protocol) server for Godot Engine integration. Enables AI assistants like Claude to interact with the Godot editor in real-time.
4
+
5
+ ## Features
6
+
7
+ - **33 MCP tools** across 8 categories (scene, node, script, editor, project, screenshot, animation, tilemap)
8
+ - **3 MCP resources** for reading scene trees, scripts, and project files
9
+ - Real-time bidirectional communication via WebSocket
10
+ - Debug output and screenshot capture from running games
11
+ - Full TileMapLayer and GridMap editing support
12
+ - Animation query, playback, and editing
4
13
 
5
14
  ## Requirements
6
15
 
7
- - Node.js 18+
8
- - Godot 4.5+
16
+ - Node.js 20+
17
+ - Godot 4.5+ (required for Logger class)
9
18
  - The Godot MCP addon installed in your project
10
19
 
11
20
  ## Installation
12
21
 
22
+ Use directly with npx (recommended):
23
+
13
24
  ```bash
14
- npm install -g @satelliteoflove/godot-mcp
25
+ npx @satelliteoflove/godot-mcp
15
26
  ```
16
27
 
17
- Or use directly with npx:
28
+ Or install globally:
18
29
 
19
30
  ```bash
20
- npx @satelliteoflove/godot-mcp
31
+ npm install -g @satelliteoflove/godot-mcp
21
32
  ```
22
33
 
23
34
  ## Setup
24
35
 
25
- 1. Install the Godot addon from this repository's `godot/addons/godot_mcp` folder into your Godot project
36
+ 1. Copy the Godot addon from `godot/addons/godot_mcp` into your project's `addons` folder
26
37
  2. Enable the addon in Project Settings > Plugins
27
- 3. Configure your MCP client to use this server
38
+ 3. Configure your MCP client (see below)
39
+
40
+ ### Claude Desktop Configuration
41
+
42
+ Add to your config file:
43
+ - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
44
+ - Windows: `%APPDATA%\Claude\claude_desktop_config.json`
45
+
46
+ ```json
47
+ {
48
+ "mcpServers": {
49
+ "godot-mcp": {
50
+ "command": "npx",
51
+ "args": ["-y", "@satelliteoflove/godot-mcp"]
52
+ }
53
+ }
54
+ }
55
+ ```
56
+
57
+ ### Claude Code Configuration
58
+
59
+ Add to your project's `.mcp.json`:
60
+
61
+ ```json
62
+ {
63
+ "mcpServers": {
64
+ "godot-mcp": {
65
+ "command": "npx",
66
+ "args": ["-y", "@satelliteoflove/godot-mcp"]
67
+ }
68
+ }
69
+ }
70
+ ```
28
71
 
29
72
  ## Documentation
30
73
 
31
- For full documentation, setup guides, and the Godot addon, visit the [GitHub repository](https://github.com/satelliteoflove/godot-mcp).
74
+ For full API documentation, setup guides, and the Godot addon source, visit the [GitHub repository](https://github.com/satelliteoflove/godot-mcp).
32
75
 
33
76
  ## License
34
77
 
@@ -0,0 +1,17 @@
1
+ import { vi } from 'vitest';
2
+ import type { GodotConnection } from '../../connection/websocket.js';
3
+ export interface CommandCall {
4
+ command: string;
5
+ params: Record<string, unknown>;
6
+ }
7
+ export interface MockGodotConnection {
8
+ sendCommand: ReturnType<typeof vi.fn>;
9
+ calls: CommandCall[];
10
+ mockResponse: (response: unknown) => void;
11
+ mockError: (error: Error) => void;
12
+ }
13
+ export declare function createMockGodot(): MockGodotConnection;
14
+ export declare function createToolContext(mock: MockGodotConnection): {
15
+ godot: GodotConnection;
16
+ };
17
+ //# sourceMappingURL=mock-godot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-godot.d.ts","sourceRoot":"","sources":["../../../src/__tests__/helpers/mock-godot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACtC,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,YAAY,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACnC;AAED,wBAAgB,eAAe,IAAI,mBAAmB,CA2BrD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB;WAEA,eAAe;EAEzE"}
@@ -0,0 +1,33 @@
1
+ import { vi } from 'vitest';
2
+ export function createMockGodot() {
3
+ const calls = [];
4
+ let nextResponse = {};
5
+ let nextError = null;
6
+ const sendCommand = vi.fn(async (command, params = {}) => {
7
+ calls.push({ command, params });
8
+ if (nextError) {
9
+ const err = nextError;
10
+ nextError = null;
11
+ throw err;
12
+ }
13
+ const response = nextResponse;
14
+ nextResponse = {};
15
+ return response;
16
+ });
17
+ return {
18
+ sendCommand,
19
+ calls,
20
+ mockResponse: (response) => {
21
+ nextResponse = response;
22
+ },
23
+ mockError: (error) => {
24
+ nextError = error;
25
+ },
26
+ };
27
+ }
28
+ export function createToolContext(mock) {
29
+ return {
30
+ godot: { sendCommand: mock.sendCommand },
31
+ };
32
+ }
33
+ //# sourceMappingURL=mock-godot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-godot.js","sourceRoot":"","sources":["../../../src/__tests__/helpers/mock-godot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAe5B,MAAM,UAAU,eAAe;IAC7B,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,IAAI,YAAY,GAAY,EAAE,CAAC;IAC/B,IAAI,SAAS,GAAiB,IAAI,CAAC;IAEnC,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,OAAe,EAAE,SAAkC,EAAE,EAAE,EAAE;QACxF,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAChC,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,SAAS,CAAC;YACtB,SAAS,GAAG,IAAI,CAAC;YACjB,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,MAAM,QAAQ,GAAG,YAAY,CAAC;QAC9B,YAAY,GAAG,EAAE,CAAC;QAClB,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,WAAW;QACX,KAAK;QACL,YAAY,EAAE,CAAC,QAAiB,EAAE,EAAE;YAClC,YAAY,GAAG,QAAQ,CAAC;QAC1B,CAAC;QACD,SAAS,EAAE,CAAC,KAAY,EAAE,EAAE;YAC1B,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAyB;IACzD,OAAO;QACL,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAgC;KACvE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=animation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animation.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/tools/animation.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,315 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { createMockGodot, createToolContext } from '../helpers/mock-godot.js';
3
+ import { animationQuery, animationPlayback, animationEdit } from '../../tools/animation.js';
4
+ describe('animation_query', () => {
5
+ let mock;
6
+ beforeEach(() => {
7
+ mock = createMockGodot();
8
+ });
9
+ it('list_players sends command and formats empty result', async () => {
10
+ mock.mockResponse({ animation_players: [] });
11
+ const ctx = createToolContext(mock);
12
+ const result = await animationQuery.execute({ action: 'list_players' }, ctx);
13
+ expect(mock.calls[0].command).toBe('list_animation_players');
14
+ expect(result).toBe('No AnimationPlayer nodes found in scene');
15
+ });
16
+ it('list_players formats found players', async () => {
17
+ mock.mockResponse({
18
+ animation_players: [
19
+ { path: '/root/Player/AnimPlayer', name: 'AnimPlayer' },
20
+ { path: '/root/Enemy/AnimPlayer', name: 'AnimPlayer' },
21
+ ],
22
+ });
23
+ const ctx = createToolContext(mock);
24
+ const result = await animationQuery.execute({ action: 'list_players' }, ctx);
25
+ expect(result).toContain('Found 2 AnimationPlayer(s)');
26
+ expect(result).toContain('/root/Player/AnimPlayer');
27
+ });
28
+ it('get_info sends command and returns JSON', async () => {
29
+ const info = { current_animation: 'idle', is_playing: true, current_position: 0.5 };
30
+ mock.mockResponse(info);
31
+ const ctx = createToolContext(mock);
32
+ const result = await animationQuery.execute({
33
+ action: 'get_info',
34
+ node_path: '/root/AnimPlayer',
35
+ }, ctx);
36
+ expect(mock.calls[0].command).toBe('get_animation_player_info');
37
+ expect(mock.calls[0].params.node_path).toBe('/root/AnimPlayer');
38
+ expect(result).toBe(JSON.stringify(info, null, 2));
39
+ });
40
+ it('get_details sends command with animation name', async () => {
41
+ const details = { name: 'walk', length: 1.5, track_count: 3 };
42
+ mock.mockResponse(details);
43
+ const ctx = createToolContext(mock);
44
+ const result = await animationQuery.execute({
45
+ action: 'get_details',
46
+ node_path: '/root/AnimPlayer',
47
+ animation_name: 'walk',
48
+ }, ctx);
49
+ expect(mock.calls[0].command).toBe('get_animation_details');
50
+ expect(mock.calls[0].params.animation_name).toBe('walk');
51
+ expect(result).toBe(JSON.stringify(details, null, 2));
52
+ });
53
+ it('get_keyframes sends command with track index', async () => {
54
+ const keyframes = { track_path: 'Sprite:frame', keyframes: [{ time: 0, value: 0 }] };
55
+ mock.mockResponse(keyframes);
56
+ const ctx = createToolContext(mock);
57
+ const result = await animationQuery.execute({
58
+ action: 'get_keyframes',
59
+ node_path: '/root/AnimPlayer',
60
+ animation_name: 'walk',
61
+ track_index: 0,
62
+ }, ctx);
63
+ expect(mock.calls[0].command).toBe('get_track_keyframes');
64
+ expect(mock.calls[0].params.track_index).toBe(0);
65
+ expect(result).toBe(JSON.stringify(keyframes, null, 2));
66
+ });
67
+ it('throws on error from Godot', async () => {
68
+ mock.mockError(new Error('Node not found'));
69
+ const ctx = createToolContext(mock);
70
+ await expect(animationQuery.execute({
71
+ action: 'get_info',
72
+ node_path: '/root/Missing',
73
+ }, ctx)).rejects.toThrow('Node not found');
74
+ });
75
+ });
76
+ describe('animation_playback', () => {
77
+ let mock;
78
+ beforeEach(() => {
79
+ mock = createMockGodot();
80
+ });
81
+ it('play sends command and returns confirmation', async () => {
82
+ mock.mockResponse({ playing: 'run', from_position: 0 });
83
+ const ctx = createToolContext(mock);
84
+ const result = await animationPlayback.execute({
85
+ action: 'play',
86
+ node_path: '/root/AnimPlayer',
87
+ animation_name: 'run',
88
+ }, ctx);
89
+ expect(mock.calls[0].command).toBe('play_animation');
90
+ expect(mock.calls[0].params.animation_name).toBe('run');
91
+ expect(result).toBe('Playing animation: run');
92
+ });
93
+ it('play passes optional params', async () => {
94
+ mock.mockResponse({ playing: 'walk', from_position: 0 });
95
+ const ctx = createToolContext(mock);
96
+ await animationPlayback.execute({
97
+ action: 'play',
98
+ node_path: '/root/AnimPlayer',
99
+ animation_name: 'walk',
100
+ custom_speed: 2.0,
101
+ custom_blend: 0.5,
102
+ from_end: true,
103
+ }, ctx);
104
+ expect(mock.calls[0].params.custom_speed).toBe(2.0);
105
+ expect(mock.calls[0].params.custom_blend).toBe(0.5);
106
+ expect(mock.calls[0].params.from_end).toBe(true);
107
+ });
108
+ it('stop sends command and returns confirmation', async () => {
109
+ mock.mockResponse({});
110
+ const ctx = createToolContext(mock);
111
+ const result = await animationPlayback.execute({
112
+ action: 'stop',
113
+ node_path: '/root/AnimPlayer',
114
+ }, ctx);
115
+ expect(mock.calls[0].command).toBe('stop_animation');
116
+ expect(result).toBe('Animation stopped');
117
+ });
118
+ it('pause sends command with paused=true', async () => {
119
+ mock.mockResponse({});
120
+ const ctx = createToolContext(mock);
121
+ const result = await animationPlayback.execute({
122
+ action: 'pause',
123
+ node_path: '/root/AnimPlayer',
124
+ paused: true,
125
+ }, ctx);
126
+ expect(mock.calls[0].command).toBe('pause_animation');
127
+ expect(mock.calls[0].params.paused).toBe(true);
128
+ expect(result).toBe('Animation paused');
129
+ });
130
+ it('pause sends command with paused=false', async () => {
131
+ mock.mockResponse({});
132
+ const ctx = createToolContext(mock);
133
+ const result = await animationPlayback.execute({
134
+ action: 'pause',
135
+ node_path: '/root/AnimPlayer',
136
+ paused: false,
137
+ }, ctx);
138
+ expect(mock.calls[0].params.paused).toBe(false);
139
+ expect(result).toBe('Animation unpaused');
140
+ });
141
+ it('seek sends command and returns position', async () => {
142
+ mock.mockResponse({ position: 1.5 });
143
+ const ctx = createToolContext(mock);
144
+ const result = await animationPlayback.execute({
145
+ action: 'seek',
146
+ node_path: '/root/AnimPlayer',
147
+ seconds: 1.5,
148
+ }, ctx);
149
+ expect(mock.calls[0].command).toBe('seek_animation');
150
+ expect(mock.calls[0].params.seconds).toBe(1.5);
151
+ expect(result).toBe('Seeked to position: 1.5');
152
+ });
153
+ it('queue sends command and returns queue info', async () => {
154
+ mock.mockResponse({ queued: 'attack', queue_length: 3 });
155
+ const ctx = createToolContext(mock);
156
+ const result = await animationPlayback.execute({
157
+ action: 'queue',
158
+ node_path: '/root/AnimPlayer',
159
+ animation_name: 'attack',
160
+ }, ctx);
161
+ expect(mock.calls[0].command).toBe('queue_animation');
162
+ expect(result).toBe('Queued animation: attack (queue length: 3)');
163
+ });
164
+ it('clear_queue sends command and returns confirmation', async () => {
165
+ mock.mockResponse({});
166
+ const ctx = createToolContext(mock);
167
+ const result = await animationPlayback.execute({
168
+ action: 'clear_queue',
169
+ node_path: '/root/AnimPlayer',
170
+ }, ctx);
171
+ expect(mock.calls[0].command).toBe('clear_animation_queue');
172
+ expect(result).toBe('Animation queue cleared');
173
+ });
174
+ });
175
+ describe('animation_edit', () => {
176
+ let mock;
177
+ beforeEach(() => {
178
+ mock = createMockGodot();
179
+ });
180
+ it('create sends command and returns confirmation', async () => {
181
+ mock.mockResponse({ created: 'new_anim', library: '' });
182
+ const ctx = createToolContext(mock);
183
+ const result = await animationEdit.execute({
184
+ action: 'create',
185
+ node_path: '/root/AnimPlayer',
186
+ animation_name: 'new_anim',
187
+ length: 2.0,
188
+ }, ctx);
189
+ expect(mock.calls[0].command).toBe('create_animation');
190
+ expect(mock.calls[0].params.animation_name).toBe('new_anim');
191
+ expect(mock.calls[0].params.length).toBe(2.0);
192
+ expect(result).toBe('Created animation: new_anim');
193
+ });
194
+ it('create includes library in result when provided', async () => {
195
+ mock.mockResponse({ created: 'walk', library: 'movement' });
196
+ const ctx = createToolContext(mock);
197
+ const result = await animationEdit.execute({
198
+ action: 'create',
199
+ node_path: '/root/AnimPlayer',
200
+ animation_name: 'walk',
201
+ library_name: 'movement',
202
+ }, ctx);
203
+ expect(result).toBe('Created animation: walk in library: movement');
204
+ });
205
+ it('delete sends command and returns confirmation', async () => {
206
+ mock.mockResponse({ deleted: 'old_anim' });
207
+ const ctx = createToolContext(mock);
208
+ const result = await animationEdit.execute({
209
+ action: 'delete',
210
+ node_path: '/root/AnimPlayer',
211
+ animation_name: 'old_anim',
212
+ }, ctx);
213
+ expect(mock.calls[0].command).toBe('delete_animation');
214
+ expect(result).toBe('Deleted animation: old_anim');
215
+ });
216
+ it('rename sends command with old and new names', async () => {
217
+ mock.mockResponse({ renamed: { from: 'walk', to: 'walk_slow' } });
218
+ const ctx = createToolContext(mock);
219
+ const result = await animationEdit.execute({
220
+ action: 'rename',
221
+ node_path: '/root/AnimPlayer',
222
+ old_name: 'walk',
223
+ new_name: 'walk_slow',
224
+ }, ctx);
225
+ expect(mock.calls[0].command).toBe('rename_animation');
226
+ expect(mock.calls[0].params.old_name).toBe('walk');
227
+ expect(mock.calls[0].params.new_name).toBe('walk_slow');
228
+ expect(result).toBe('Renamed animation: walk -> walk_slow');
229
+ });
230
+ it('update_props sends command and returns updated properties', async () => {
231
+ mock.mockResponse({ updated: 'walk', properties: { length: 2.0, loop_mode: 'linear' } });
232
+ const ctx = createToolContext(mock);
233
+ const result = await animationEdit.execute({
234
+ action: 'update_props',
235
+ node_path: '/root/AnimPlayer',
236
+ animation_name: 'walk',
237
+ length: 2.0,
238
+ loop_mode: 'linear',
239
+ }, ctx);
240
+ expect(mock.calls[0].command).toBe('update_animation_properties');
241
+ expect(result).toContain('Updated animation: walk');
242
+ expect(result).toContain('"length":2');
243
+ });
244
+ it('add_track sends command and returns track info', async () => {
245
+ mock.mockResponse({ track_index: 0, track_path: 'Sprite2D:frame', track_type: 'value' });
246
+ const ctx = createToolContext(mock);
247
+ const result = await animationEdit.execute({
248
+ action: 'add_track',
249
+ node_path: '/root/AnimPlayer',
250
+ animation_name: 'walk',
251
+ track_type: 'value',
252
+ track_path: 'Sprite2D:frame',
253
+ }, ctx);
254
+ expect(mock.calls[0].command).toBe('add_animation_track');
255
+ expect(result).toBe('Added track 0: value -> Sprite2D:frame');
256
+ });
257
+ it('remove_track sends command and returns confirmation', async () => {
258
+ mock.mockResponse({ removed_track: 2 });
259
+ const ctx = createToolContext(mock);
260
+ const result = await animationEdit.execute({
261
+ action: 'remove_track',
262
+ node_path: '/root/AnimPlayer',
263
+ animation_name: 'walk',
264
+ track_index: 2,
265
+ }, ctx);
266
+ expect(mock.calls[0].command).toBe('remove_animation_track');
267
+ expect(result).toBe('Removed track: 2');
268
+ });
269
+ it('add_keyframe sends command and returns keyframe info', async () => {
270
+ mock.mockResponse({ keyframe_index: 0, time: 0.5, value: 3 });
271
+ const ctx = createToolContext(mock);
272
+ const result = await animationEdit.execute({
273
+ action: 'add_keyframe',
274
+ node_path: '/root/AnimPlayer',
275
+ animation_name: 'walk',
276
+ track_index: 0,
277
+ time: 0.5,
278
+ value: 3,
279
+ }, ctx);
280
+ expect(mock.calls[0].command).toBe('add_keyframe');
281
+ expect(mock.calls[0].params.time).toBe(0.5);
282
+ expect(mock.calls[0].params.value).toBe(3);
283
+ expect(result).toBe('Added keyframe 0 at 0.5s');
284
+ });
285
+ it('remove_keyframe sends command and returns confirmation', async () => {
286
+ mock.mockResponse({ removed_keyframe: 1, track_index: 0 });
287
+ const ctx = createToolContext(mock);
288
+ const result = await animationEdit.execute({
289
+ action: 'remove_keyframe',
290
+ node_path: '/root/AnimPlayer',
291
+ animation_name: 'walk',
292
+ track_index: 0,
293
+ keyframe_index: 1,
294
+ }, ctx);
295
+ expect(mock.calls[0].command).toBe('remove_keyframe');
296
+ expect(result).toBe('Removed keyframe 1 from track 0');
297
+ });
298
+ it('update_keyframe sends command and returns changes', async () => {
299
+ mock.mockResponse({ updated_keyframe: 0, changes: { time: 0.75, value: 5 } });
300
+ const ctx = createToolContext(mock);
301
+ const result = await animationEdit.execute({
302
+ action: 'update_keyframe',
303
+ node_path: '/root/AnimPlayer',
304
+ animation_name: 'walk',
305
+ track_index: 0,
306
+ keyframe_index: 0,
307
+ time: 0.75,
308
+ value: 5,
309
+ }, ctx);
310
+ expect(mock.calls[0].command).toBe('update_keyframe');
311
+ expect(result).toContain('Updated keyframe 0');
312
+ expect(result).toContain('"time":0.75');
313
+ });
314
+ });
315
+ //# sourceMappingURL=animation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animation.test.js","sourceRoot":"","sources":["../../../src/__tests__/tools/animation.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=node.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/tools/node.test.ts"],"names":[],"mappings":""}