unreal-engine-mcp-server 0.5.0 → 0.5.1

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 (139) hide show
  1. package/.env.example +1 -1
  2. package/.github/release-drafter-config.yml +51 -0
  3. package/.github/workflows/greetings.yml +5 -1
  4. package/.github/workflows/labeler.yml +2 -1
  5. package/.github/workflows/publish-mcp.yml +1 -0
  6. package/.github/workflows/release-drafter.yml +1 -1
  7. package/.github/workflows/release.yml +3 -3
  8. package/CHANGELOG.md +71 -0
  9. package/CONTRIBUTING.md +1 -1
  10. package/GEMINI.md +115 -0
  11. package/Public/Plugin_setup_guide.mp4 +0 -0
  12. package/README.md +166 -200
  13. package/dist/config.d.ts +0 -1
  14. package/dist/config.js +0 -1
  15. package/dist/constants.d.ts +4 -0
  16. package/dist/constants.js +4 -0
  17. package/dist/graphql/loaders.d.ts +64 -0
  18. package/dist/graphql/loaders.js +117 -0
  19. package/dist/graphql/resolvers.d.ts +3 -3
  20. package/dist/graphql/resolvers.js +33 -30
  21. package/dist/graphql/server.js +3 -1
  22. package/dist/graphql/types.d.ts +2 -0
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.js +13 -2
  25. package/dist/server-setup.d.ts +0 -1
  26. package/dist/server-setup.js +0 -40
  27. package/dist/tools/actors.d.ts +40 -24
  28. package/dist/tools/actors.js +8 -2
  29. package/dist/tools/assets.d.ts +19 -71
  30. package/dist/tools/assets.js +28 -22
  31. package/dist/tools/base-tool.d.ts +4 -4
  32. package/dist/tools/base-tool.js +1 -1
  33. package/dist/tools/blueprint.d.ts +33 -61
  34. package/dist/tools/consolidated-tool-handlers.js +96 -110
  35. package/dist/tools/dynamic-handler-registry.d.ts +11 -9
  36. package/dist/tools/dynamic-handler-registry.js +17 -95
  37. package/dist/tools/editor.d.ts +19 -193
  38. package/dist/tools/editor.js +8 -0
  39. package/dist/tools/environment.d.ts +8 -14
  40. package/dist/tools/foliage.d.ts +18 -143
  41. package/dist/tools/foliage.js +4 -2
  42. package/dist/tools/handlers/actor-handlers.js +0 -5
  43. package/dist/tools/handlers/asset-handlers.js +454 -454
  44. package/dist/tools/landscape.d.ts +16 -116
  45. package/dist/tools/landscape.js +7 -3
  46. package/dist/tools/level.d.ts +22 -103
  47. package/dist/tools/level.js +24 -16
  48. package/dist/tools/lighting.js +5 -1
  49. package/dist/tools/materials.js +5 -1
  50. package/dist/tools/niagara.js +37 -2
  51. package/dist/tools/performance.d.ts +0 -1
  52. package/dist/tools/performance.js +0 -1
  53. package/dist/tools/physics.js +5 -1
  54. package/dist/tools/sequence.d.ts +24 -24
  55. package/dist/tools/sequence.js +13 -0
  56. package/dist/tools/ui.d.ts +0 -2
  57. package/dist/types/automation-responses.d.ts +115 -0
  58. package/dist/types/automation-responses.js +2 -0
  59. package/dist/types/responses.d.ts +249 -0
  60. package/dist/types/responses.js +2 -0
  61. package/dist/types/tool-interfaces.d.ts +135 -135
  62. package/dist/utils/command-validator.js +3 -2
  63. package/dist/utils/path-security.d.ts +2 -0
  64. package/dist/utils/path-security.js +24 -0
  65. package/dist/utils/response-factory.d.ts +4 -4
  66. package/dist/utils/response-factory.js +15 -21
  67. package/docs/Migration-Guide-v0.5.0.md +1 -9
  68. package/docs/testing-guide.md +2 -2
  69. package/package.json +12 -6
  70. package/scripts/run-all-tests.mjs +25 -20
  71. package/server.json +3 -2
  72. package/src/config.ts +1 -1
  73. package/src/constants.ts +7 -0
  74. package/src/graphql/loaders.ts +244 -0
  75. package/src/graphql/resolvers.ts +47 -49
  76. package/src/graphql/server.ts +3 -1
  77. package/src/graphql/types.ts +3 -0
  78. package/src/index.ts +15 -2
  79. package/src/resources/assets.ts +5 -4
  80. package/src/server-setup.ts +3 -37
  81. package/src/tools/actors.ts +36 -28
  82. package/src/tools/animation.ts +1 -0
  83. package/src/tools/assets.ts +74 -63
  84. package/src/tools/base-tool.ts +3 -3
  85. package/src/tools/blueprint.ts +59 -59
  86. package/src/tools/consolidated-tool-handlers.ts +129 -150
  87. package/src/tools/dynamic-handler-registry.ts +22 -140
  88. package/src/tools/editor.ts +39 -26
  89. package/src/tools/environment.ts +21 -27
  90. package/src/tools/foliage.ts +28 -25
  91. package/src/tools/handlers/actor-handlers.ts +2 -8
  92. package/src/tools/handlers/asset-handlers.ts +484 -484
  93. package/src/tools/handlers/sequence-handlers.ts +1 -1
  94. package/src/tools/landscape.ts +34 -28
  95. package/src/tools/level.ts +96 -76
  96. package/src/tools/lighting.ts +6 -1
  97. package/src/tools/materials.ts +8 -2
  98. package/src/tools/niagara.ts +44 -2
  99. package/src/tools/performance.ts +1 -2
  100. package/src/tools/physics.ts +7 -1
  101. package/src/tools/sequence.ts +41 -25
  102. package/src/tools/ui.ts +0 -2
  103. package/src/types/automation-responses.ts +119 -0
  104. package/src/types/responses.ts +355 -0
  105. package/src/types/tool-interfaces.ts +135 -135
  106. package/src/utils/command-validator.ts +3 -2
  107. package/src/utils/normalize.test.ts +162 -0
  108. package/src/utils/path-security.ts +43 -0
  109. package/src/utils/response-factory.ts +29 -24
  110. package/src/utils/safe-json.test.ts +90 -0
  111. package/src/utils/validation.test.ts +184 -0
  112. package/tests/test-animation.mjs +358 -33
  113. package/tests/test-asset-graph.mjs +311 -0
  114. package/tests/test-audio.mjs +314 -116
  115. package/tests/test-behavior-tree.mjs +327 -144
  116. package/tests/test-blueprint-graph.mjs +343 -12
  117. package/tests/test-control-editor.mjs +85 -53
  118. package/tests/test-graphql.mjs +58 -8
  119. package/tests/test-input.mjs +349 -0
  120. package/tests/test-inspect.mjs +291 -61
  121. package/tests/test-landscape.mjs +304 -48
  122. package/tests/test-lighting.mjs +428 -0
  123. package/tests/test-manage-level.mjs +70 -51
  124. package/tests/test-performance.mjs +539 -0
  125. package/tests/test-sequence.mjs +82 -46
  126. package/tests/test-system.mjs +72 -33
  127. package/tests/test-wasm.mjs +98 -8
  128. package/vitest.config.ts +35 -0
  129. package/.github/release-drafter.yml +0 -148
  130. package/dist/prompts/index.d.ts +0 -21
  131. package/dist/prompts/index.js +0 -217
  132. package/dist/tools/blueprint/helpers.d.ts +0 -29
  133. package/dist/tools/blueprint/helpers.js +0 -182
  134. package/src/prompts/index.ts +0 -249
  135. package/src/tools/blueprint/helpers.ts +0 -189
  136. package/tests/test-blueprint-events.mjs +0 -35
  137. package/tests/test-extra-tools.mjs +0 -38
  138. package/tests/test-render.mjs +0 -33
  139. package/tests/test-search-assets.mjs +0 -66
@@ -1,59 +1,315 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Condensed Environment Building Test Suite (15 cases)
3
+ * Comprehensive Environment Building Test Suite
4
4
  * Tool: build_environment
5
+ * Coverage: All 20 actions with success, error, and edge cases
5
6
  */
6
7
 
7
8
  import { runToolTests } from './test-runner.mjs';
8
9
 
9
10
  const testCases = [
10
- { scenario: 'Create small landscape', toolName: 'build_environment', arguments: { action: 'create_landscape', name: 'TC_Landscape', sizeX: 4, sizeY: 4 }, expected: 'success - landscape created' },
11
- { scenario: 'Sculpt landscape - smooth', toolName: 'build_environment', arguments: { action: 'sculpt', name: 'TC_Landscape', tool: 'Smooth' }, expected: 'success or LOAD_FAILED' },
12
- { scenario: 'Flatten small area', toolName: 'build_environment', arguments: { action: 'sculpt', name: 'TC_Landscape', tool: 'Flatten' }, expected: 'success or LOAD_FAILED' },
13
- { scenario: 'Add foliage type (trees)', toolName: 'build_environment', arguments: { action: 'add_foliage', foliageType: 'TC_Tree', meshPath: '/Engine/BasicShapes/Cube.Cube', density: 0.1 }, expected: 'success - foliage added' },
14
- { scenario: 'Paint a small foliage patch', toolName: 'build_environment', arguments: { action: 'paint_foliage', foliageType: 'TC_Tree', position: { x: 0, y: 0, z: 0 }, brushSize: 100, strength: 0.5 }, expected: 'success - foliage painted' },
15
- { scenario: 'Create procedural terrain', toolName: 'build_environment', arguments: { action: 'create_procedural_terrain', name: 'TC_ProcTerrain', location: { x: 500, y: 0, z: 0 }, subdivisions: 8 }, expected: 'success - procedural terrain created' },
16
- { scenario: 'Create procedural foliage (small)', toolName: 'build_environment', arguments: { action: 'create_procedural_foliage', bounds: { location: { x: 0, y: 0, z: 0 }, size: { x: 1000, y: 1000, z: 100 } }, seed: 42 }, expected: 'success - procedural foliage created' },
17
- { scenario: 'Add grass foliage', toolName: 'build_environment', arguments: { action: 'add_foliage', meshPath: '/Engine/BasicShapes/Cube.Cube', density: 0.5 }, expected: 'success - grass added' },
18
- { scenario: 'Generate small LODs (best-effort)', toolName: 'build_environment', arguments: { action: 'generate_lods', assetPath: '/Game/Meshes/SM_Test', lodCount: 2 }, expected: 'success or ASSET_NOT_FOUND' },
19
- { scenario: 'Bake lightmap for a small area (preview)', toolName: 'build_environment', arguments: { action: 'bake_lightmap', quality: 'Preview' }, expected: 'success - lightmap bake requested' },
20
- { scenario: 'Create landscape grass type', toolName: 'build_environment', arguments: { action: 'create_landscape_grass_type', name: 'TC_Grass', meshPath: '/Engine/BasicShapes/Cube.Cube' }, expected: 'success - grass type created' },
21
- { scenario: 'Add foliage instances', toolName: 'build_environment', arguments: { action: 'add_foliage', foliageType: 'TC_Tree', locations: [{ x: 0, y: 0, z: 0 }] }, expected: 'success - instances added' },
22
- { scenario: 'Export environment snapshot', toolName: 'build_environment', arguments: { action: 'export_snapshot', path: './tests/reports/env_snapshot.json' }, expected: 'success - snapshot exported' },
23
- { scenario: 'Import environment snapshot', toolName: 'build_environment', arguments: { action: 'import_snapshot', path: './tests/reports/env_snapshot.json' }, expected: 'success - import handled' },
24
- { scenario: 'Cleanup landscape artifacts', toolName: 'build_environment', arguments: { action: 'delete', names: ['TC_Landscape', 'TC_ProcTerrain'] }, expected: 'success or DELETE_PARTIAL' },
25
- // Additional
26
- // Real-World Scenario: Terrain Sculpting
27
- { scenario: 'Sculpting - Create Landscape', toolName: 'build_environment', arguments: { action: 'create_landscape', name: 'TC_Sculpt_Landscape', sizeX: 8, sizeY: 8 }, expected: 'success' },
28
- { scenario: 'Sculpting - Apply Noise', toolName: 'build_environment', arguments: { action: 'sculpt', name: 'TC_Sculpt_Landscape', tool: 'Noise', strength: 0.2 }, expected: 'success or LOAD_FAILED' },
29
- { scenario: 'Sculpting - Assign Material', toolName: 'build_environment', arguments: { action: 'set_landscape_material', name: 'TC_Sculpt_Landscape', materialPath: '/Engine/EngineMaterials/WorldGridMaterial.WorldGridMaterial' }, expected: 'success or LOAD_FAILED' },
30
-
31
- // Cleanup
32
- { scenario: 'Cleanup - Delete Sculpt Landscape', toolName: 'build_environment', arguments: { action: 'delete', names: ['TC_Sculpt_Landscape'] }, expected: 'success or DELETE_PARTIAL' },
33
-
34
- {
35
- scenario: "Error: Invalid sculpt tool",
36
- toolName: "build_environment",
37
- arguments: { action: "sculpt", tool: "InvalidTool" },
38
- expected: "error"
39
- },
40
- {
41
- scenario: "Edge: Landscape size 0",
42
- toolName: "build_environment",
43
- arguments: { action: "create_landscape", sizeX: 0, sizeY: 0 },
44
- expected: "error|validation|required"
45
- },
46
- {
47
- scenario: "Border: Zero density foliage",
48
- toolName: "build_environment",
49
- arguments: { action: "add_foliage", meshPath: "/Game/Valid", density: 0 },
50
- expected: "success|no_instances|LOAD_FAILED|ASSET_NOT_FOUND|INVALID_ARGUMENT"
51
- },
52
- {
53
- scenario: "Edge: Empty foliage types",
54
- toolName: "build_environment",
55
- arguments: { action: "create_procedural_foliage", foliageTypes: [] },
56
- expected: "success|no_op"
11
+ // === PRE-CLEANUP ===
12
+ {
13
+ scenario: 'Pre-cleanup: Delete test landscapes',
14
+ toolName: 'build_environment',
15
+ arguments: { action: 'delete', names: ['TC_Landscape', 'TC_ProcTerrain', 'TC_Sculpt_Landscape'] },
16
+ expected: 'success|not_found'
17
+ },
18
+
19
+ // === CREATE LANDSCAPE ===
20
+ {
21
+ scenario: 'Create small landscape',
22
+ toolName: 'build_environment',
23
+ arguments: {
24
+ action: 'create_landscape',
25
+ name: 'TC_Landscape',
26
+ sizeX: 4,
27
+ sizeY: 4,
28
+ sectionSize: 63,
29
+ sectionsPerComponent: 1
30
+ },
31
+ expected: 'success - landscape created'
32
+ },
33
+ {
34
+ scenario: 'Create medium landscape',
35
+ toolName: 'build_environment',
36
+ arguments: {
37
+ action: 'create_landscape',
38
+ name: 'TC_Landscape_Med',
39
+ sizeX: 8,
40
+ sizeY: 8,
41
+ componentCount: { x: 2, y: 2 }
42
+ },
43
+ expected: 'success'
44
+ },
45
+
46
+ // === SCULPT LANDSCAPE ===
47
+ {
48
+ scenario: 'Sculpt landscape - smooth',
49
+ toolName: 'build_environment',
50
+ arguments: { action: 'sculpt', name: 'TC_Landscape', tool: 'Smooth' },
51
+ expected: 'success or LOAD_FAILED'
52
+ },
53
+ {
54
+ scenario: 'Sculpt landscape - flatten',
55
+ toolName: 'build_environment',
56
+ arguments: { action: 'sculpt', name: 'TC_Landscape', tool: 'Flatten' },
57
+ expected: 'success or LOAD_FAILED'
58
+ },
59
+ {
60
+ scenario: 'Sculpt landscape - noise',
61
+ toolName: 'build_environment',
62
+ arguments: { action: 'sculpt', name: 'TC_Landscape', tool: 'Noise', strength: 0.3 },
63
+ expected: 'success or LOAD_FAILED'
64
+ },
65
+ {
66
+ scenario: 'Sculpt landscape (alias)',
67
+ toolName: 'build_environment',
68
+ arguments: { action: 'sculpt_landscape', landscapeName: 'TC_Landscape', tool: 'Raise', strength: 0.5 },
69
+ expected: 'success or LOAD_FAILED'
70
+ },
71
+
72
+ // === PAINT LANDSCAPE ===
73
+ {
74
+ scenario: 'Paint landscape layer',
75
+ toolName: 'build_environment',
76
+ arguments: {
77
+ action: 'paint_landscape',
78
+ landscapeName: 'TC_Landscape',
79
+ layerName: 'Grass',
80
+ position: { x: 0, y: 0, z: 0 },
81
+ brushSize: 100,
82
+ strength: 0.8
83
+ },
84
+ expected: 'success or LOAD_FAILED'
85
+ },
86
+ {
87
+ scenario: 'Paint landscape layer (alias)',
88
+ toolName: 'build_environment',
89
+ arguments: {
90
+ action: 'paint_landscape_layer',
91
+ landscapeName: 'TC_Landscape',
92
+ layerName: 'Rock',
93
+ brushSize: 50,
94
+ strength: 1.0
95
+ },
96
+ expected: 'success or LOAD_FAILED'
97
+ },
98
+
99
+ // === MODIFY HEIGHTMAP ===
100
+ {
101
+ scenario: 'Modify heightmap',
102
+ toolName: 'build_environment',
103
+ arguments: {
104
+ action: 'modify_heightmap',
105
+ landscapeName: 'TC_Landscape',
106
+ heightData: [100, 110, 105, 95],
107
+ updateNormals: true
108
+ },
109
+ expected: 'success or LOAD_FAILED'
110
+ },
111
+
112
+ // === SET LANDSCAPE MATERIAL ===
113
+ {
114
+ scenario: 'Set landscape material',
115
+ toolName: 'build_environment',
116
+ arguments: {
117
+ action: 'set_landscape_material',
118
+ name: 'TC_Landscape',
119
+ materialPath: '/Engine/EngineMaterials/WorldGridMaterial.WorldGridMaterial'
120
+ },
121
+ expected: 'success or LOAD_FAILED'
122
+ },
123
+
124
+ // === GRASS TYPE ===
125
+ {
126
+ scenario: 'Create landscape grass type',
127
+ toolName: 'build_environment',
128
+ arguments: {
129
+ action: 'create_landscape_grass_type',
130
+ name: 'TC_GrassType',
131
+ meshPath: '/Engine/BasicShapes/Cube.Cube'
132
+ },
133
+ expected: 'success - grass type created'
134
+ },
135
+
136
+ // === FOLIAGE ===
137
+ {
138
+ scenario: 'Add foliage type',
139
+ toolName: 'build_environment',
140
+ arguments: {
141
+ action: 'add_foliage',
142
+ foliageType: 'TC_Tree',
143
+ meshPath: '/Engine/BasicShapes/Cube.Cube',
144
+ density: 0.1,
145
+ minScale: 0.8,
146
+ maxScale: 1.2
147
+ },
148
+ expected: 'success - foliage added'
149
+ },
150
+ {
151
+ scenario: 'Paint foliage',
152
+ toolName: 'build_environment',
153
+ arguments: {
154
+ action: 'paint_foliage',
155
+ foliageType: 'TC_Tree',
156
+ position: { x: 0, y: 0, z: 0 },
157
+ brushSize: 100,
158
+ density: 0.5
159
+ },
160
+ expected: 'success - foliage painted'
161
+ },
162
+ {
163
+ scenario: 'Add foliage instances',
164
+ toolName: 'build_environment',
165
+ arguments: {
166
+ action: 'add_foliage_instances',
167
+ foliageType: 'TC_Tree',
168
+ locations: [{ x: 0, y: 0, z: 0 }, { x: 100, y: 0, z: 0 }, { x: 200, y: 0, z: 0 }],
169
+ randomYaw: true,
170
+ alignToNormal: true
171
+ },
172
+ expected: 'success - instances added'
173
+ },
174
+ {
175
+ scenario: 'Get foliage instances',
176
+ toolName: 'build_environment',
177
+ arguments: {
178
+ action: 'get_foliage_instances',
179
+ foliageType: 'TC_Tree',
180
+ bounds: { minX: -1000, maxX: 1000, minY: -1000, maxY: 1000 }
181
+ },
182
+ expected: 'success'
183
+ },
184
+ {
185
+ scenario: 'Remove foliage instances',
186
+ toolName: 'build_environment',
187
+ arguments: {
188
+ action: 'remove_foliage',
189
+ foliageType: 'TC_Tree',
190
+ eraseMode: true,
191
+ radius: 200,
192
+ position: { x: 0, y: 0, z: 0 }
193
+ },
194
+ expected: 'success'
195
+ },
196
+
197
+ // === PROCEDURAL TERRAIN ===
198
+ {
199
+ scenario: 'Create procedural terrain',
200
+ toolName: 'build_environment',
201
+ arguments: {
202
+ action: 'create_procedural_terrain',
203
+ name: 'TC_ProcTerrain',
204
+ location: { x: 5000, y: 0, z: 0 },
205
+ seed: 12345,
206
+ sizeX: 200,
207
+ sizeY: 200
208
+ },
209
+ expected: 'success - procedural terrain created'
210
+ },
211
+
212
+ // === PROCEDURAL FOLIAGE ===
213
+ {
214
+ scenario: 'Create procedural foliage volume',
215
+ toolName: 'build_environment',
216
+ arguments: {
217
+ action: 'create_procedural_foliage',
218
+ volumeName: 'TC_ProcFoliage',
219
+ bounds: { location: { x: 0, y: 0, z: 0 }, size: { x: 1000, y: 1000, z: 100 } },
220
+ seed: 42,
221
+ foliageTypes: []
222
+ },
223
+ expected: 'success - procedural foliage created'
224
+ },
225
+
226
+ // === LODS ===
227
+ {
228
+ scenario: 'Generate LODs',
229
+ toolName: 'build_environment',
230
+ arguments: {
231
+ action: 'generate_lods',
232
+ meshPath: '/Engine/BasicShapes/Cube',
233
+ lodCount: 3,
234
+ cullDistance: 5000
235
+ },
236
+ expected: 'success or ASSET_NOT_FOUND'
237
+ },
238
+
239
+ // === LIGHTMAP ===
240
+ {
241
+ scenario: 'Bake lightmap (preview)',
242
+ toolName: 'build_environment',
243
+ arguments: { action: 'bake_lightmap', quality: 'Preview' },
244
+ expected: 'success - lightmap bake requested'
245
+ },
246
+
247
+ // === SNAPSHOTS ===
248
+ {
249
+ scenario: 'Export environment snapshot',
250
+ toolName: 'build_environment',
251
+ arguments: { action: 'export_snapshot', filename: 'tc_env_snapshot.json' },
252
+ expected: 'success - snapshot exported'
253
+ },
254
+ {
255
+ scenario: 'Import environment snapshot',
256
+ toolName: 'build_environment',
257
+ arguments: { action: 'import_snapshot', filename: 'tc_env_snapshot.json' },
258
+ expected: 'success - import handled'
259
+ },
260
+
261
+ // === ERROR CASES ===
262
+ {
263
+ scenario: 'Error: Invalid sculpt tool',
264
+ toolName: 'build_environment',
265
+ arguments: { action: 'sculpt', tool: 'InvalidTool' },
266
+ expected: 'error'
267
+ },
268
+ {
269
+ scenario: 'Error: Landscape size 0',
270
+ toolName: 'build_environment',
271
+ arguments: { action: 'create_landscape', sizeX: 0, sizeY: 0 },
272
+ expected: 'error|validation|required'
273
+ },
274
+ {
275
+ scenario: 'Error: Invalid mesh path for foliage',
276
+ toolName: 'build_environment',
277
+ arguments: { action: 'add_foliage', meshPath: '/Game/Invalid/Mesh', density: 0.5 },
278
+ expected: 'LOAD_FAILED|ASSET_NOT_FOUND|INVALID_ARGUMENT'
279
+ },
280
+
281
+ // === EDGE CASES ===
282
+ {
283
+ scenario: 'Edge: Zero density foliage',
284
+ toolName: 'build_environment',
285
+ arguments: { action: 'add_foliage', meshPath: '/Engine/BasicShapes/Cube', density: 0 },
286
+ expected: 'success|no_instances|LOAD_FAILED|ASSET_NOT_FOUND|INVALID_ARGUMENT'
287
+ },
288
+ {
289
+ scenario: 'Edge: Empty foliage types',
290
+ toolName: 'build_environment',
291
+ arguments: { action: 'create_procedural_foliage', foliageTypes: [] },
292
+ expected: 'success|no_op'
293
+ },
294
+ {
295
+ scenario: 'Edge: Negative seed',
296
+ toolName: 'build_environment',
297
+ arguments: { action: 'create_procedural_terrain', name: 'TC_NegSeed', seed: -1 },
298
+ expected: 'success'
299
+ },
300
+
301
+ // === CLEANUP ===
302
+ {
303
+ scenario: 'Cleanup landscapes',
304
+ toolName: 'build_environment',
305
+ arguments: { action: 'delete', names: ['TC_Landscape', 'TC_Landscape_Med', 'TC_ProcTerrain'] },
306
+ expected: 'success or DELETE_PARTIAL'
307
+ },
308
+ {
309
+ scenario: 'Cleanup grass type asset',
310
+ toolName: 'manage_asset',
311
+ arguments: { action: 'delete', assetPaths: ['/Game/TC_GrassType'] },
312
+ expected: 'success|not_found'
57
313
  }
58
314
  ];
59
315