rbxstudio-mcp 2.3.1 → 2.4.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 (175) hide show
  1. package/README.md +67 -14
  2. package/dist/__tests__/bridge-service.test.js +25 -13
  3. package/dist/__tests__/bridge-service.test.js.map +1 -1
  4. package/dist/__tests__/bridge-session.test.d.ts +2 -0
  5. package/dist/__tests__/bridge-session.test.d.ts.map +1 -0
  6. package/dist/__tests__/bridge-session.test.js +171 -0
  7. package/dist/__tests__/bridge-session.test.js.map +1 -0
  8. package/dist/__tests__/chunker.test.d.ts +2 -0
  9. package/dist/__tests__/chunker.test.d.ts.map +1 -0
  10. package/dist/__tests__/chunker.test.js +201 -0
  11. package/dist/__tests__/chunker.test.js.map +1 -0
  12. package/dist/__tests__/docs-core.test.d.ts +2 -0
  13. package/dist/__tests__/docs-core.test.d.ts.map +1 -0
  14. package/dist/__tests__/docs-core.test.js +137 -0
  15. package/dist/__tests__/docs-core.test.js.map +1 -0
  16. package/dist/__tests__/docs-fetcher.test.d.ts +2 -0
  17. package/dist/__tests__/docs-fetcher.test.d.ts.map +1 -0
  18. package/dist/__tests__/docs-fetcher.test.js +173 -0
  19. package/dist/__tests__/docs-fetcher.test.js.map +1 -0
  20. package/dist/__tests__/helpers.d.ts +8 -0
  21. package/dist/__tests__/helpers.d.ts.map +1 -0
  22. package/dist/__tests__/helpers.js +23 -0
  23. package/dist/__tests__/helpers.js.map +1 -0
  24. package/dist/__tests__/http-routes.test.d.ts +2 -0
  25. package/dist/__tests__/http-routes.test.d.ts.map +1 -0
  26. package/dist/__tests__/http-routes.test.js +233 -0
  27. package/dist/__tests__/http-routes.test.js.map +1 -0
  28. package/dist/__tests__/http-server.test.js +13 -6
  29. package/dist/__tests__/http-server.test.js.map +1 -1
  30. package/dist/__tests__/integration.test.js +9 -4
  31. package/dist/__tests__/integration.test.js.map +1 -1
  32. package/dist/__tests__/semantic-search.test.d.ts +2 -0
  33. package/dist/__tests__/semantic-search.test.d.ts.map +1 -0
  34. package/dist/__tests__/semantic-search.test.js +202 -0
  35. package/dist/__tests__/semantic-search.test.js.map +1 -0
  36. package/dist/__tests__/smoke.test.js +7 -3
  37. package/dist/__tests__/smoke.test.js.map +1 -1
  38. package/dist/__tests__/studio-client.test.d.ts +2 -0
  39. package/dist/__tests__/studio-client.test.d.ts.map +1 -0
  40. package/dist/__tests__/studio-client.test.js +25 -0
  41. package/dist/__tests__/studio-client.test.js.map +1 -0
  42. package/dist/__tests__/tool-nudges.test.d.ts +2 -0
  43. package/dist/__tests__/tool-nudges.test.d.ts.map +1 -0
  44. package/dist/__tests__/tool-nudges.test.js +60 -0
  45. package/dist/__tests__/tool-nudges.test.js.map +1 -0
  46. package/dist/__tests__/tool-registry.test.d.ts +2 -0
  47. package/dist/__tests__/tool-registry.test.d.ts.map +1 -0
  48. package/dist/__tests__/tool-registry.test.js +365 -0
  49. package/dist/__tests__/tool-registry.test.js.map +1 -0
  50. package/dist/__tests__/tools-bridge.test.d.ts +2 -0
  51. package/dist/__tests__/tools-bridge.test.d.ts.map +1 -0
  52. package/dist/__tests__/tools-bridge.test.js +396 -0
  53. package/dist/__tests__/tools-bridge.test.js.map +1 -0
  54. package/dist/__tests__/tools-docs.test.d.ts +2 -0
  55. package/dist/__tests__/tools-docs.test.d.ts.map +1 -0
  56. package/dist/__tests__/tools-docs.test.js +112 -0
  57. package/dist/__tests__/tools-docs.test.js.map +1 -0
  58. package/dist/__tests__/tools-guards.test.d.ts +2 -0
  59. package/dist/__tests__/tools-guards.test.d.ts.map +1 -0
  60. package/dist/__tests__/tools-guards.test.js +131 -0
  61. package/dist/__tests__/tools-guards.test.js.map +1 -0
  62. package/dist/__tests__/tools-runtime.test.d.ts +2 -0
  63. package/dist/__tests__/tools-runtime.test.d.ts.map +1 -0
  64. package/dist/__tests__/tools-runtime.test.js +214 -0
  65. package/dist/__tests__/tools-runtime.test.js.map +1 -0
  66. package/dist/__tests__/tools-visual.test.d.ts +2 -0
  67. package/dist/__tests__/tools-visual.test.d.ts.map +1 -0
  68. package/dist/__tests__/tools-visual.test.js +149 -0
  69. package/dist/__tests__/tools-visual.test.js.map +1 -0
  70. package/dist/bridge-service.d.ts +99 -12
  71. package/dist/bridge-service.d.ts.map +1 -1
  72. package/dist/bridge-service.js +238 -21
  73. package/dist/bridge-service.js.map +1 -1
  74. package/dist/docs/cache.d.ts +50 -0
  75. package/dist/docs/cache.d.ts.map +1 -0
  76. package/dist/docs/cache.js +123 -0
  77. package/dist/docs/cache.js.map +1 -0
  78. package/dist/docs/embeddings/chunker.d.ts +120 -0
  79. package/dist/docs/embeddings/chunker.d.ts.map +1 -0
  80. package/dist/docs/embeddings/chunker.js +395 -0
  81. package/dist/docs/embeddings/chunker.js.map +1 -0
  82. package/dist/docs/embeddings/embedder.d.ts +41 -0
  83. package/dist/docs/embeddings/embedder.d.ts.map +1 -0
  84. package/dist/docs/embeddings/embedder.js +113 -0
  85. package/dist/docs/embeddings/embedder.js.map +1 -0
  86. package/dist/docs/embeddings/index.d.ts +102 -0
  87. package/dist/docs/embeddings/index.d.ts.map +1 -0
  88. package/dist/docs/embeddings/index.js +250 -0
  89. package/dist/docs/embeddings/index.js.map +1 -0
  90. package/dist/docs/embeddings/manager.d.ts +68 -0
  91. package/dist/docs/embeddings/manager.d.ts.map +1 -0
  92. package/dist/docs/embeddings/manager.js +97 -0
  93. package/dist/docs/embeddings/manager.js.map +1 -0
  94. package/dist/docs/fetcher.d.ts +29 -0
  95. package/dist/docs/fetcher.d.ts.map +1 -0
  96. package/dist/docs/fetcher.js +244 -0
  97. package/dist/docs/fetcher.js.map +1 -0
  98. package/dist/docs/reference.d.ts +37 -0
  99. package/dist/docs/reference.d.ts.map +1 -0
  100. package/dist/docs/reference.js +108 -0
  101. package/dist/docs/reference.js.map +1 -0
  102. package/dist/docs/search.d.ts +194 -0
  103. package/dist/docs/search.d.ts.map +1 -0
  104. package/dist/docs/search.js +733 -0
  105. package/dist/docs/search.js.map +1 -0
  106. package/dist/http-server.d.ts.map +1 -1
  107. package/dist/http-server.js +52 -5
  108. package/dist/http-server.js.map +1 -1
  109. package/dist/index.d.ts +8 -9
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +35 -1035
  112. package/dist/index.js.map +1 -1
  113. package/dist/instructions.d.ts +15 -0
  114. package/dist/instructions.d.ts.map +1 -0
  115. package/dist/instructions.js +26 -0
  116. package/dist/instructions.js.map +1 -0
  117. package/dist/tools/defs/attributes.d.ts +6 -0
  118. package/dist/tools/defs/attributes.d.ts.map +1 -0
  119. package/dist/tools/defs/attributes.js +85 -0
  120. package/dist/tools/defs/attributes.js.map +1 -0
  121. package/dist/tools/defs/docs.d.ts +17 -0
  122. package/dist/tools/defs/docs.d.ts.map +1 -0
  123. package/dist/tools/defs/docs.js +151 -0
  124. package/dist/tools/defs/docs.js.map +1 -0
  125. package/dist/tools/defs/execute.d.ts +6 -0
  126. package/dist/tools/defs/execute.d.ts.map +1 -0
  127. package/dist/tools/defs/execute.js +21 -0
  128. package/dist/tools/defs/execute.js.map +1 -0
  129. package/dist/tools/defs/inspection.d.ts +7 -0
  130. package/dist/tools/defs/inspection.d.ts.map +1 -0
  131. package/dist/tools/defs/inspection.js +202 -0
  132. package/dist/tools/defs/inspection.js.map +1 -0
  133. package/dist/tools/defs/objects.d.ts +6 -0
  134. package/dist/tools/defs/objects.d.ts.map +1 -0
  135. package/dist/tools/defs/objects.js +111 -0
  136. package/dist/tools/defs/objects.js.map +1 -0
  137. package/dist/tools/defs/properties.d.ts +6 -0
  138. package/dist/tools/defs/properties.d.ts.map +1 -0
  139. package/dist/tools/defs/properties.js +71 -0
  140. package/dist/tools/defs/properties.js.map +1 -0
  141. package/dist/tools/defs/runtime.d.ts +6 -0
  142. package/dist/tools/defs/runtime.d.ts.map +1 -0
  143. package/dist/tools/defs/runtime.js +145 -0
  144. package/dist/tools/defs/runtime.js.map +1 -0
  145. package/dist/tools/defs/scripts.d.ts +18 -0
  146. package/dist/tools/defs/scripts.d.ts.map +1 -0
  147. package/dist/tools/defs/scripts.js +163 -0
  148. package/dist/tools/defs/scripts.js.map +1 -0
  149. package/dist/tools/defs/tags.d.ts +6 -0
  150. package/dist/tools/defs/tags.d.ts.map +1 -0
  151. package/dist/tools/defs/tags.js +74 -0
  152. package/dist/tools/defs/tags.js.map +1 -0
  153. package/dist/tools/defs/visual.d.ts +7 -0
  154. package/dist/tools/defs/visual.d.ts.map +1 -0
  155. package/dist/tools/defs/visual.js +208 -0
  156. package/dist/tools/defs/visual.js.map +1 -0
  157. package/dist/tools/index.d.ts +101 -25
  158. package/dist/tools/index.d.ts.map +1 -1
  159. package/dist/tools/index.js +580 -63
  160. package/dist/tools/index.js.map +1 -1
  161. package/dist/tools/nudges.d.ts +25 -0
  162. package/dist/tools/nudges.d.ts.map +1 -0
  163. package/dist/tools/nudges.js +34 -0
  164. package/dist/tools/nudges.js.map +1 -0
  165. package/dist/tools/registry.d.ts +20 -0
  166. package/dist/tools/registry.d.ts.map +1 -0
  167. package/dist/tools/registry.js +65 -0
  168. package/dist/tools/registry.js.map +1 -0
  169. package/dist/tools/types.d.ts +24 -0
  170. package/dist/tools/types.d.ts.map +1 -0
  171. package/dist/tools/types.js +2 -0
  172. package/dist/tools/types.js.map +1 -0
  173. package/package.json +7 -6
  174. package/studio-plugin/MCPPlugin.rbxmx +3 -238
  175. package/studio-plugin/plugin.luau +2041 -365
@@ -0,0 +1,396 @@
1
+ import { RobloxStudioTools } from '../tools/index';
2
+ import { parseToolText } from './helpers';
3
+ function setup(response = { success: true, value: 'studio-response' }) {
4
+ const bridge = {
5
+ sendRequest: jest.fn().mockResolvedValue(response),
6
+ };
7
+ const tools = new RobloxStudioTools(bridge);
8
+ return { bridge, tools };
9
+ }
10
+ const forwardCases = [
11
+ {
12
+ name: 'getFileTree',
13
+ call: (tools) => tools.getFileTree('game.Workspace'),
14
+ endpoint: '/api/file-tree',
15
+ payload: { path: 'game.Workspace' },
16
+ },
17
+ {
18
+ name: 'searchFiles',
19
+ call: (tools) => tools.searchFiles('Enemy', 'source'),
20
+ endpoint: '/api/search-files',
21
+ payload: { query: 'Enemy', searchType: 'source' },
22
+ },
23
+ {
24
+ name: 'getPlaceInfo',
25
+ call: (tools) => tools.getPlaceInfo(),
26
+ endpoint: '/api/place-info',
27
+ payload: {},
28
+ },
29
+ {
30
+ name: 'getServices',
31
+ call: (tools) => tools.getServices('Workspace'),
32
+ endpoint: '/api/services',
33
+ payload: { serviceName: 'Workspace' },
34
+ },
35
+ {
36
+ name: 'searchObjects',
37
+ call: (tools) => tools.searchObjects('Part', 'className', 'Name'),
38
+ endpoint: '/api/search-objects',
39
+ payload: { query: 'Part', searchType: 'className', propertyName: 'Name' },
40
+ },
41
+ {
42
+ name: 'getInstanceProperties',
43
+ call: (tools) => tools.getInstanceProperties('game.Workspace.Part'),
44
+ endpoint: '/api/instance-properties',
45
+ payload: { instancePath: 'game.Workspace.Part' },
46
+ },
47
+ {
48
+ name: 'getInstanceChildren',
49
+ call: (tools) => tools.getInstanceChildren('game.Workspace'),
50
+ endpoint: '/api/instance-children',
51
+ payload: { instancePath: 'game.Workspace' },
52
+ },
53
+ {
54
+ name: 'searchByProperty',
55
+ call: (tools) => tools.searchByProperty('Name', 'Part'),
56
+ endpoint: '/api/search-by-property',
57
+ payload: { propertyName: 'Name', propertyValue: 'Part' },
58
+ },
59
+ {
60
+ name: 'getClassInfo',
61
+ call: (tools) => tools.getClassInfo('Part'),
62
+ endpoint: '/api/class-info',
63
+ payload: { className: 'Part' },
64
+ },
65
+ {
66
+ name: 'getProjectStructure',
67
+ call: (tools) => tools.getProjectStructure('game', 5, true),
68
+ endpoint: '/api/project-structure',
69
+ payload: { path: 'game', maxDepth: 5, scriptsOnly: true },
70
+ },
71
+ {
72
+ name: 'grep',
73
+ call: (tools) => tools.grep('require', {
74
+ path: 'game.ServerScriptService',
75
+ glob: 'Main.*',
76
+ type: ['Script'],
77
+ caseInsensitive: true,
78
+ after: 1,
79
+ before: 2,
80
+ context: 3,
81
+ outputMode: 'content',
82
+ headLimit: 4,
83
+ multiline: true,
84
+ }),
85
+ endpoint: '/api/grep',
86
+ payload: {
87
+ pattern: 'require',
88
+ path: 'game.ServerScriptService',
89
+ glob: 'Main.*',
90
+ type: ['Script'],
91
+ caseInsensitive: true,
92
+ after: 1,
93
+ before: 2,
94
+ context: 3,
95
+ outputMode: 'content',
96
+ headLimit: 4,
97
+ multiline: true,
98
+ },
99
+ },
100
+ {
101
+ name: 'setProperty',
102
+ call: (tools) => tools.setProperty('game.Workspace.Part', 'Anchored', true),
103
+ endpoint: '/api/set-property',
104
+ payload: { instancePath: 'game.Workspace.Part', propertyName: 'Anchored', propertyValue: true },
105
+ },
106
+ {
107
+ name: 'massSetProperty',
108
+ call: (tools) => tools.massSetProperty(['a', 'b'], 'Transparency', 0.5),
109
+ endpoint: '/api/mass-set-property',
110
+ payload: { paths: ['a', 'b'], propertyName: 'Transparency', propertyValue: 0.5 },
111
+ },
112
+ {
113
+ name: 'massGetProperty',
114
+ call: (tools) => tools.massGetProperty(['a', 'b'], 'Name'),
115
+ endpoint: '/api/mass-get-property',
116
+ payload: { paths: ['a', 'b'], propertyName: 'Name' },
117
+ },
118
+ {
119
+ name: 'createObject',
120
+ call: (tools) => tools.createObject('Part', 'game.Workspace', 'Block'),
121
+ endpoint: '/api/create-object',
122
+ payload: { className: 'Part', parent: 'game.Workspace', name: 'Block' },
123
+ },
124
+ {
125
+ name: 'createObjectWithProperties',
126
+ call: (tools) => tools.createObjectWithProperties('Part', 'game.Workspace', 'Block', { Anchored: true }),
127
+ endpoint: '/api/create-object',
128
+ payload: {
129
+ className: 'Part',
130
+ parent: 'game.Workspace',
131
+ name: 'Block',
132
+ properties: { Anchored: true },
133
+ },
134
+ },
135
+ {
136
+ name: 'massCreateObjects',
137
+ call: (tools) => tools.massCreateObjects([{ className: 'Part', parent: 'game.Workspace' }]),
138
+ endpoint: '/api/mass-create-objects',
139
+ payload: { objects: [{ className: 'Part', parent: 'game.Workspace' }] },
140
+ },
141
+ {
142
+ name: 'massCreateObjectsWithProperties',
143
+ call: (tools) => tools.massCreateObjectsWithProperties([
144
+ { className: 'Part', parent: 'game.Workspace', properties: { Anchored: true } },
145
+ ]),
146
+ endpoint: '/api/mass-create-objects-with-properties',
147
+ payload: {
148
+ objects: [{ className: 'Part', parent: 'game.Workspace', properties: { Anchored: true } }],
149
+ },
150
+ },
151
+ {
152
+ name: 'deleteObject',
153
+ call: (tools) => tools.deleteObject('game.Workspace.Block'),
154
+ endpoint: '/api/delete-object',
155
+ payload: { instancePath: 'game.Workspace.Block' },
156
+ },
157
+ {
158
+ name: 'smartDuplicate',
159
+ call: (tools) => tools.smartDuplicate('game.Workspace.Block', 3, { namePattern: 'Block{n}' }),
160
+ endpoint: '/api/smart-duplicate',
161
+ payload: { instancePath: 'game.Workspace.Block', count: 3, options: { namePattern: 'Block{n}' } },
162
+ },
163
+ {
164
+ name: 'massDuplicate',
165
+ call: (tools) => tools.massDuplicate([{ instancePath: 'game.Workspace.Block', count: 2 }]),
166
+ endpoint: '/api/mass-duplicate',
167
+ payload: { duplications: [{ instancePath: 'game.Workspace.Block', count: 2 }] },
168
+ },
169
+ {
170
+ name: 'setCalculatedProperty',
171
+ call: (tools) => tools.setCalculatedProperty(['a'], 'Size', 'x * 2', { x: 3 }),
172
+ endpoint: '/api/set-calculated-property',
173
+ payload: { paths: ['a'], propertyName: 'Size', formula: 'x * 2', variables: { x: 3 } },
174
+ },
175
+ {
176
+ name: 'setRelativeProperty',
177
+ call: (tools) => tools.setRelativeProperty(['a'], 'Position', 'add', 5, 'X'),
178
+ endpoint: '/api/set-relative-property',
179
+ payload: { paths: ['a'], propertyName: 'Position', operation: 'add', value: 5, component: 'X' },
180
+ },
181
+ {
182
+ name: 'getScriptSource',
183
+ call: (tools) => tools.getScriptSource('game.ServerScriptService.Main', 2, 4),
184
+ endpoint: '/api/get-script-source',
185
+ payload: { instancePath: 'game.ServerScriptService.Main', startLine: 2, endLine: 4 },
186
+ },
187
+ {
188
+ name: 'setScriptSource',
189
+ call: (tools) => tools.setScriptSource('game.ServerScriptService.Main', 'print("hi")'),
190
+ endpoint: '/api/set-script-source',
191
+ payload: { instancePath: 'game.ServerScriptService.Main', source: 'print("hi")' },
192
+ },
193
+ {
194
+ name: 'editScript',
195
+ call: (tools) => tools.editScript('game.ServerScriptService.Main', 'old', 'new', true, false),
196
+ endpoint: '/api/edit-script',
197
+ payload: {
198
+ instancePath: 'game.ServerScriptService.Main',
199
+ oldString: 'old',
200
+ newString: 'new',
201
+ replaceAll: true,
202
+ validateAfter: false,
203
+ },
204
+ },
205
+ {
206
+ name: 'searchScript',
207
+ call: (tools) => tools.searchScript('game.ServerScriptService.Main', 'foo', true, 2),
208
+ endpoint: '/api/search-script',
209
+ payload: {
210
+ instancePath: 'game.ServerScriptService.Main',
211
+ pattern: 'foo',
212
+ useRegex: true,
213
+ contextLines: 2,
214
+ },
215
+ },
216
+ {
217
+ name: 'getScriptFunction',
218
+ call: (tools) => tools.getScriptFunction('game.ServerScriptService.Main', 'init'),
219
+ endpoint: '/api/get-script-function',
220
+ payload: { instancePath: 'game.ServerScriptService.Main', functionName: 'init' },
221
+ },
222
+ {
223
+ name: 'findAndReplaceInScripts',
224
+ call: (tools) => tools.findAndReplaceInScripts(['a', 'b'], 'old', 'new', false),
225
+ endpoint: '/api/find-and-replace-in-scripts',
226
+ payload: { paths: ['a', 'b'], oldString: 'old', newString: 'new', validateAfter: false },
227
+ },
228
+ {
229
+ name: 'getAttribute',
230
+ call: (tools) => tools.getAttribute('game.Workspace.Part', 'Health'),
231
+ endpoint: '/api/get-attribute',
232
+ payload: { instancePath: 'game.Workspace.Part', attributeName: 'Health' },
233
+ },
234
+ {
235
+ name: 'setAttribute',
236
+ call: (tools) => tools.setAttribute('game.Workspace.Part', 'Health', 100, 'number'),
237
+ endpoint: '/api/set-attribute',
238
+ payload: {
239
+ instancePath: 'game.Workspace.Part',
240
+ attributeName: 'Health',
241
+ attributeValue: 100,
242
+ valueType: 'number',
243
+ },
244
+ },
245
+ {
246
+ name: 'getAttributes',
247
+ call: (tools) => tools.getAttributes('game.Workspace.Part'),
248
+ endpoint: '/api/get-attributes',
249
+ payload: { instancePath: 'game.Workspace.Part' },
250
+ },
251
+ {
252
+ name: 'deleteAttribute',
253
+ call: (tools) => tools.deleteAttribute('game.Workspace.Part', 'Health'),
254
+ endpoint: '/api/delete-attribute',
255
+ payload: { instancePath: 'game.Workspace.Part', attributeName: 'Health' },
256
+ },
257
+ {
258
+ name: 'getTags',
259
+ call: (tools) => tools.getTags('game.Workspace.Part'),
260
+ endpoint: '/api/get-tags',
261
+ payload: { instancePath: 'game.Workspace.Part' },
262
+ },
263
+ {
264
+ name: 'addTag',
265
+ call: (tools) => tools.addTag('game.Workspace.Part', 'Enemy'),
266
+ endpoint: '/api/add-tag',
267
+ payload: { instancePath: 'game.Workspace.Part', tagName: 'Enemy' },
268
+ },
269
+ {
270
+ name: 'removeTag',
271
+ call: (tools) => tools.removeTag('game.Workspace.Part', 'Enemy'),
272
+ endpoint: '/api/remove-tag',
273
+ payload: { instancePath: 'game.Workspace.Part', tagName: 'Enemy' },
274
+ },
275
+ {
276
+ name: 'getTagged',
277
+ call: (tools) => tools.getTagged('Enemy'),
278
+ endpoint: '/api/get-tagged',
279
+ payload: { tagName: 'Enemy' },
280
+ },
281
+ {
282
+ name: 'getSelection',
283
+ call: (tools) => tools.getSelection(),
284
+ endpoint: '/api/get-selection',
285
+ payload: {},
286
+ },
287
+ {
288
+ name: 'getOutput',
289
+ call: (tools) => tools.getOutput(10, 123, ['MessageWarning'], true),
290
+ endpoint: '/api/get-output',
291
+ payload: { limit: 10, since: 123, messageTypes: ['MessageWarning'], clear: true },
292
+ },
293
+ {
294
+ name: 'cloneInstance',
295
+ call: (tools) => tools.cloneInstance('game.Workspace.Block', 'game.Workspace', 'Copy'),
296
+ endpoint: '/api/clone-instance',
297
+ payload: { sourcePath: 'game.Workspace.Block', targetParent: 'game.Workspace', newName: 'Copy' },
298
+ },
299
+ {
300
+ name: 'moveInstance',
301
+ call: (tools) => tools.moveInstance('game.Workspace.Block', 'game.ReplicatedStorage'),
302
+ endpoint: '/api/move-instance',
303
+ payload: { instancePath: 'game.Workspace.Block', newParent: 'game.ReplicatedStorage' },
304
+ },
305
+ {
306
+ name: 'validateScript',
307
+ call: (tools) => tools.validateScript(undefined, 'print("ok")'),
308
+ endpoint: '/api/validate-script',
309
+ payload: { instancePath: undefined, source: 'print("ok")' },
310
+ },
311
+ {
312
+ name: 'insertAsset',
313
+ call: (tools) => tools.insertAsset(123, 'Assets', 'game.Workspace'),
314
+ endpoint: '/api/insert-asset',
315
+ payload: { assetId: 123, folderName: 'Assets', targetParent: 'game.Workspace' },
316
+ },
317
+ {
318
+ name: 'focusCamera',
319
+ call: (tools) => tools.focusCamera('game.Workspace.Block', { angle: 'front', distance: 20, autoDistance: false }),
320
+ endpoint: '/api/focus-camera',
321
+ payload: {
322
+ instancePath: 'game.Workspace.Block',
323
+ angle: 'front',
324
+ distance: 20,
325
+ autoDistance: false,
326
+ },
327
+ },
328
+ {
329
+ name: 'executeLua',
330
+ call: (tools) => tools.executeLua('print("hi")'),
331
+ endpoint: '/api/execute-lua',
332
+ payload: { code: 'print("hi")' },
333
+ },
334
+ ];
335
+ describe('RobloxStudioTools bridge forwarding', () => {
336
+ test.each(forwardCases)('$name forwards exact endpoint and payload', async (testCase) => {
337
+ const { bridge, tools } = setup();
338
+ const result = await testCase.call(tools);
339
+ expect(bridge.sendRequest).toHaveBeenCalledWith(testCase.endpoint, testCase.payload);
340
+ expect(parseToolText(result)).toEqual({ success: true, value: 'studio-response' });
341
+ });
342
+ test('grep fills Studio-side defaults', async () => {
343
+ const { bridge, tools } = setup();
344
+ await tools.grep('Enemy');
345
+ expect(bridge.sendRequest).toHaveBeenCalledWith('/api/grep', {
346
+ pattern: 'Enemy',
347
+ path: 'game',
348
+ glob: undefined,
349
+ type: ['LuaSourceContainer'],
350
+ caseInsensitive: false,
351
+ after: 0,
352
+ before: 0,
353
+ context: 0,
354
+ outputMode: 'files_with_matches',
355
+ headLimit: 0,
356
+ multiline: false,
357
+ });
358
+ });
359
+ test('undo, redo, and history clamp counts before crossing the bridge', async () => {
360
+ const { bridge, tools } = setup();
361
+ await tools.undo(250.9);
362
+ await tools.redo(0);
363
+ await tools.getHistory(-5, true);
364
+ expect(bridge.sendRequest).toHaveBeenNthCalledWith(1, '/api/undo', { count: 100 });
365
+ expect(bridge.sendRequest).toHaveBeenNthCalledWith(2, '/api/redo', { count: 1 });
366
+ expect(bridge.sendRequest).toHaveBeenNthCalledWith(3, '/api/get-history', {
367
+ limit: 1,
368
+ includeDetails: true,
369
+ });
370
+ });
371
+ test('captureScreenshot and renderObjectView forward defaults for non-image responses', async () => {
372
+ const { bridge, tools } = setup({ success: false, error: 'not available' });
373
+ expect(parseToolText(await tools.captureScreenshot())).toEqual({
374
+ success: false,
375
+ error: 'not available',
376
+ });
377
+ expect(parseToolText(await tools.renderObjectView('game.Workspace.Block'))).toEqual({
378
+ success: false,
379
+ error: 'not available',
380
+ });
381
+ expect(bridge.sendRequest).toHaveBeenNthCalledWith(1, '/api/capture-screenshot', {
382
+ maxWidth: 768,
383
+ maxHeight: 768,
384
+ returnBase64: true,
385
+ });
386
+ expect(bridge.sendRequest).toHaveBeenNthCalledWith(2, '/api/render-object-view', {
387
+ instancePath: 'game.Workspace.Block',
388
+ angle: 'iso',
389
+ resolution: { width: 768, height: 768 },
390
+ lighting: 'bright',
391
+ background: 'transparent',
392
+ autoDistance: true,
393
+ });
394
+ });
395
+ });
396
+ //# sourceMappingURL=tools-bridge.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-bridge.test.js","sourceRoot":"","sources":["../../src/__tests__/tools-bridge.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tools-docs.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-docs.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tools-docs.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,112 @@
1
+ import { promises as fs } from 'fs';
2
+ import * as os from 'os';
3
+ import * as path from 'path';
4
+ import { BridgeService } from '../bridge-service';
5
+ import { RobloxStudioTools } from '../tools/index';
6
+ import { parseToolText } from './helpers';
7
+ describe('Roblox documentation tools', () => {
8
+ let cacheDir;
9
+ let tools;
10
+ beforeAll(async () => {
11
+ cacheDir = await fs.mkdtemp(path.join(os.tmpdir(), 'rbxstudio-doc-tools-'));
12
+ process.env.RBXSTUDIO_DOCS_DIR = cacheDir;
13
+ const root = path.join(cacheDir, 'content', 'en-us');
14
+ await fs.mkdir(path.join(root, 'reference', 'engine', 'classes'), { recursive: true });
15
+ await fs.mkdir(path.join(root, 'reference', 'engine', 'datatypes'), { recursive: true });
16
+ await fs.mkdir(path.join(root, 'animation'), { recursive: true });
17
+ await fs.writeFile(path.join(root, 'reference', 'engine', 'classes', 'Part.yaml'), `name: Part
18
+ type: class
19
+ summary: |
20
+ A basic 3D object.
21
+ properties:
22
+ - name: Anchored
23
+ summary: |
24
+ Determines whether physics moves the part.
25
+ type: boolean
26
+ `, 'utf8');
27
+ await fs.writeFile(path.join(root, 'reference', 'engine', 'datatypes', 'CFrame.yaml'), `name: CFrame
28
+ type: datatype
29
+ summary: Coordinate frame value.
30
+ `, 'utf8');
31
+ await fs.writeFile(path.join(root, 'animation', 'rigging.md'), `# Rigging
32
+ Motor6D joints are used to connect body parts in Roblox rigs.
33
+ `, 'utf8');
34
+ await fs.writeFile(path.join(cacheDir, 'meta.json'), JSON.stringify({
35
+ repo: 'Roblox/creator-docs',
36
+ branch: 'main',
37
+ sha: 'fixture-sha',
38
+ downloadedAt: new Date().toISOString(),
39
+ lastCheckedAt: new Date().toISOString(),
40
+ fileCount: 3,
41
+ bytesOnDisk: 1,
42
+ schemaVersion: 1,
43
+ }, null, 2), 'utf8');
44
+ tools = new RobloxStudioTools(new BridgeService());
45
+ });
46
+ afterAll(async () => {
47
+ delete process.env.RBXSTUDIO_DOCS_DIR;
48
+ if (cacheDir)
49
+ await fs.rm(cacheDir, { recursive: true, force: true });
50
+ });
51
+ test('searchRobloxDocs searches the fresh local docs cache', async () => {
52
+ const body = parseToolText(await tools.searchRobloxDocs('Anchored', {
53
+ semantic: false,
54
+ maxHits: 10,
55
+ }));
56
+ expect(body).toMatchObject({
57
+ mode: 'literal',
58
+ totalHits: 1,
59
+ filesScanned: 3,
60
+ });
61
+ expect(body.hits[0]).toMatchObject({
62
+ path: 'en-us/reference/engine/classes/Part.yaml',
63
+ text: ' - name: Anchored',
64
+ });
65
+ });
66
+ test('getRobloxDoc reads a single docs file by relative path', async () => {
67
+ const body = parseToolText(await tools.getRobloxDoc('en-us/animation/rigging.md'));
68
+ expect(body).toMatchObject({
69
+ path: 'en-us/animation/rigging.md',
70
+ });
71
+ expect(body.content).toContain('Motor6D joints');
72
+ });
73
+ test('listRobloxDocs returns paginated directory entries', async () => {
74
+ const body = parseToolText(await tools.listRobloxDocs('en-us/reference/engine', { limit: 1 }));
75
+ expect(body).toMatchObject({
76
+ path: 'en-us/reference/engine',
77
+ totalEntries: 2,
78
+ limit: 1,
79
+ truncated: true,
80
+ });
81
+ expect(body.entries[0]).toEqual({ name: 'classes', type: 'dir' });
82
+ });
83
+ test('getRobloxApiReference resolves names case-insensitively and parses YAML', async () => {
84
+ const body = parseToolText(await tools.getRobloxApiReference('part'));
85
+ expect(body).toMatchObject({
86
+ category: 'class',
87
+ name: 'Part',
88
+ path: 'en-us/reference/engine/classes/Part.yaml',
89
+ });
90
+ expect(body.data).toMatchObject({
91
+ name: 'Part',
92
+ type: 'class',
93
+ properties: [{ name: 'Anchored' }],
94
+ });
95
+ expect(body.raw).toContain('name: Part');
96
+ });
97
+ test('docs tools return structured not-found responses', async () => {
98
+ expect(parseToolText(await tools.getRobloxDoc('../secret'))).toMatchObject({
99
+ error: expect.stringContaining('Doc not found'),
100
+ cache: { sha: 'fixture-sha', fileCount: 3 },
101
+ });
102
+ expect(parseToolText(await tools.listRobloxDocs('../secret'))).toMatchObject({
103
+ error: expect.stringContaining('Path not found'),
104
+ cache: { sha: 'fixture-sha', fileCount: 3 },
105
+ });
106
+ expect(parseToolText(await tools.getRobloxApiReference('Nope'))).toMatchObject({
107
+ error: expect.stringContaining('No API reference found'),
108
+ cache: { sha: 'fixture-sha', fileCount: 3 },
109
+ });
110
+ });
111
+ });
112
+ //# sourceMappingURL=tools-docs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-docs.test.js","sourceRoot":"","sources":["../../src/__tests__/tools-docs.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tools-guards.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-guards.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tools-guards.test.ts"],"names":[],"mappings":""}