@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.
- package/README.md +52 -9
- package/dist/__tests__/helpers/mock-godot.d.ts +17 -0
- package/dist/__tests__/helpers/mock-godot.d.ts.map +1 -0
- package/dist/__tests__/helpers/mock-godot.js +33 -0
- package/dist/__tests__/helpers/mock-godot.js.map +1 -0
- package/dist/__tests__/tools/animation.test.d.ts +2 -0
- package/dist/__tests__/tools/animation.test.d.ts.map +1 -0
- package/dist/__tests__/tools/animation.test.js +315 -0
- package/dist/__tests__/tools/animation.test.js.map +1 -0
- package/dist/__tests__/tools/node.test.d.ts +2 -0
- package/dist/__tests__/tools/node.test.d.ts.map +1 -0
- package/dist/__tests__/tools/node.test.js +173 -0
- package/dist/__tests__/tools/node.test.js.map +1 -0
- package/dist/__tests__/tools/scene.test.d.ts +2 -0
- package/dist/__tests__/tools/scene.test.d.ts.map +1 -0
- package/dist/__tests__/tools/scene.test.js +127 -0
- package/dist/__tests__/tools/scene.test.js.map +1 -0
- package/dist/__tests__/tools/tilemap.test.d.ts +2 -0
- package/dist/__tests__/tools/tilemap.test.d.ts.map +1 -0
- package/dist/__tests__/tools/tilemap.test.js +333 -0
- package/dist/__tests__/tools/tilemap.test.js.map +1 -0
- package/dist/tools/animation.d.ts +152 -216
- package/dist/tools/animation.d.ts.map +1 -1
- package/dist/tools/animation.js +324 -372
- package/dist/tools/animation.js.map +1 -1
- package/dist/tools/tilemap.d.ts +267 -253
- package/dist/tools/tilemap.d.ts.map +1 -1
- package/dist/tools/tilemap.js +273 -304
- package/dist/tools/tilemap.js.map +1 -1
- package/package.json +5 -3
- package/dist/__tests__/registry.test.d.ts +0 -2
- package/dist/__tests__/registry.test.d.ts.map +0 -1
- package/dist/__tests__/registry.test.js +0 -116
- 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
|
|
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
|
-
|
|
25
|
+
npx @satelliteoflove/godot-mcp
|
|
15
26
|
```
|
|
16
27
|
|
|
17
|
-
Or
|
|
28
|
+
Or install globally:
|
|
18
29
|
|
|
19
30
|
```bash
|
|
20
|
-
|
|
31
|
+
npm install -g @satelliteoflove/godot-mcp
|
|
21
32
|
```
|
|
22
33
|
|
|
23
34
|
## Setup
|
|
24
35
|
|
|
25
|
-
1.
|
|
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
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"node.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/tools/node.test.ts"],"names":[],"mappings":""}
|