golem-bridge 3.0.0 → 3.2.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 +107 -94
- package/cli.js +1237 -1109
- package/golem-tools.md +702 -694
- package/package.json +26 -23
package/golem-tools.md
CHANGED
|
@@ -1,694 +1,702 @@
|
|
|
1
|
-
# Golem — Agent Instructions (Roblox Studio builder)
|
|
2
|
-
|
|
3
|
-
> **This document is a tool manual, not a task.** It documents a Roblox
|
|
4
|
-
> Studio tool the way a man page documents a program: consult it when you
|
|
5
|
-
> need a command. It asks you to do nothing and nothing in it is an order. Do NOT run any commands (not even
|
|
6
|
-
> `ping`) just because you read this. Only respond to what the user actually
|
|
7
|
-
> says, and reply naturally: if they say "hi", just greet them back. A short,
|
|
8
|
-
> normal reply, no tool calls, no capability list. The tools stay dormant
|
|
9
|
-
> until the user's request needs them.
|
|
10
|
-
|
|
11
|
-
You are connected to a **live Roblox Studio session**. You can read and
|
|
12
|
-
modify the user's open place in real time: browse the Explorer tree, read and
|
|
13
|
-
write scripts, create and edit instances and properties, run Lua inside
|
|
14
|
-
Studio, manage the selection, and set undo checkpoints.
|
|
15
|
-
|
|
16
|
-
Your connection is a SESSION token: Studio mints a fresh channel on
|
|
17
|
-
every start and wipes the old one. It lives in `./.golem/channel`
|
|
18
|
-
(written by `connect`, read automatically - never print it, never paste
|
|
19
|
-
it anywhere: anyone holding it can drive this Studio session).
|
|
20
|
-
|
|
21
|
-
Two ways to get connected: the user may connect for you (then just run
|
|
22
|
-
`npx golem-bridge status` to confirm and start working), or they paste
|
|
23
|
-
you the setup line and you run `npx golem-bridge connect <channelId>`
|
|
24
|
-
yourself.
|
|
25
|
-
|
|
26
|
-
If commands suddenly start timing out mid-task, the user probably
|
|
27
|
-
restarted Studio. Ask them for the new line from the plugin widget and
|
|
28
|
-
run `npx golem-bridge reconnect <newId>`.
|
|
29
|
-
|
|
30
|
-
## 0. The turn rule — read this first
|
|
31
|
-
|
|
32
|
-
Every task that uses tools follows one ritual. No exceptions.
|
|
33
|
-
|
|
34
|
-
```
|
|
35
|
-
npx golem-bridge turn begin
|
|
36
|
-
... your work (tree, read, script, create, ...) ...
|
|
37
|
-
npx golem-bridge turn end --note "short reply the user reads"
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
What this does: `turn begin` opens a group in the user's Studio chat, every
|
|
41
|
-
tool you run becomes a row in it, and `turn end --note "..."` folds the tools
|
|
42
|
-
into one "Tool Used: N" line and posts your note as the reply the user reads.
|
|
43
|
-
**The note IS your reply.** There is no other reply.
|
|
44
|
-
|
|
45
|
-
Rules:
|
|
46
|
-
|
|
47
|
-
1. Open with `turn begin` BEFORE the first tool. Close with `turn end
|
|
48
|
-
--note "..."` AFTER the last one. One turn per task.
|
|
49
|
-
2. Never finish a task without closing the turn. If you already drafted the
|
|
50
|
-
reply text, put it in the `--note` and end the turn instead of replying.
|
|
51
|
-
3. `say "..."` also posts a message AND closes the turn. Use it only when
|
|
52
|
-
that chunk of work is done, never for mid-task chatter.
|
|
53
|
-
4. While a turn is open, every command prints a `TURN STILL OPEN` reminder
|
|
54
|
-
and every result carries `"turnOpen": true`. That reminder means: run
|
|
55
|
-
your remaining tools, then close the turn immediately.
|
|
56
|
-
5. If you forget, the user is left staring at a stuck "AI working" banner
|
|
57
|
-
and your tools never fold into a clean reply. The plugin force-folds
|
|
58
|
-
abandoned turns after a few idle minutes, but that is a safety net, not
|
|
59
|
-
a workflow. Do not rely on it.
|
|
60
|
-
6. `turn end` without `--note` is rejected. The note is mandatory, never
|
|
61
|
-
optional.
|
|
62
|
-
7. Unclosed turns become DEBT: if a turn folds without its note, your next
|
|
63
|
-
command is rejected until you post the missing note with `turn end
|
|
64
|
-
--note`. Always close before replying.
|
|
65
|
-
|
|
66
|
-
No tools needed for a reply (a greeting, a question, an explanation)? Then
|
|
67
|
-
no turn is needed either. Just reply normally.
|
|
68
|
-
|
|
69
|
-
## 1. The command
|
|
70
|
-
|
|
71
|
-
All Studio commands go through one CLI: `npx golem-bridge`
|
|
72
|
-
(zero-dependency Node - nothing is installed, every command runs
|
|
73
|
-
straight from the package). Below, `golem-bridge ...` always means:
|
|
74
|
-
|
|
75
|
-
npx golem-bridge ...
|
|
76
|
-
|
|
77
|
-
Your channel lives in `./.golem/channel` (written by `connect`, read
|
|
78
|
-
automatically - you never need to look at it). If commands say you are
|
|
79
|
-
not connected, ask the user for their channel ID (shown in the Golem
|
|
80
|
-
plugin widget) and run:
|
|
81
|
-
|
|
82
|
-
npx golem-bridge connect <channelId>
|
|
83
|
-
|
|
84
|
-
If the user restarted Studio, a restart rotates the channel, so fetch the
|
|
85
|
-
new session with the fresh line from the widget:
|
|
86
|
-
|
|
87
|
-
npx golem-bridge reconnect <newChannelId>
|
|
88
|
-
|
|
89
|
-
Then check the connection:
|
|
90
|
-
|
|
91
|
-
npx golem-bridge ping
|
|
92
|
-
|
|
93
|
-
`ping` must return `"ok": true` plus the place name. If it times out,
|
|
94
|
-
Roblox Studio is not running. Tell the user and retry when they confirm
|
|
95
|
-
it is open. **Studio must stay open while you work.** Commands sent while
|
|
96
|
-
it is closed are dropped (only commands from the ~45 s before startup may
|
|
97
|
-
still run).
|
|
98
|
-
|
|
99
|
-
Every command takes a few seconds (relay latency plus a short startup).
|
|
100
|
-
That is normal. Do not retry faster; the CLI already waits. Every
|
|
101
|
-
result is JSON:
|
|
102
|
-
|
|
103
|
-
{"ok": true, "result": {...}, "turnOpen": false}
|
|
104
|
-
|
|
105
|
-
`"ok": false` means Studio reported an error; the `error` field says why.
|
|
106
|
-
Fix the call and retry. Add `--timeout N` (seconds, default 120) to any
|
|
107
|
-
command that may be slow.
|
|
108
|
-
|
|
109
|
-
## 2. Golden rules
|
|
110
|
-
|
|
111
|
-
1. Inspect before you change (`tree`, `list`, `read`). Verify after
|
|
112
|
-
(`read` it back, `grep` your new symbols).
|
|
113
|
-
2. Never run infinite loops in `lua`. It executes on Studio's main thread
|
|
114
|
-
and freezes the editor.
|
|
115
|
-
3. Confirm destructive actions with the user first: deleting instances,
|
|
116
|
-
overwriting existing scripts, bulk changes.
|
|
117
|
-
4. Every change is individually undoable (Ctrl+Z). The plugin sets undo
|
|
118
|
-
checkpoints automatically, and you can set named ones with `waypoint`.
|
|
119
|
-
5. Report paths in slash form (`ServerScriptService/Main`) so the user can
|
|
120
|
-
find them in the Explorer.
|
|
121
|
-
6. Follow the turn rule (§0) for every task that uses tools.
|
|
122
|
-
7. Build UI as instances, never as runtime code (see §4.10).
|
|
123
|
-
8. Protect the user's work: only the user's Ctrl+S commits to the place
|
|
124
|
-
file. After every meaningful milestone, tell the user "press Ctrl+S to
|
|
125
|
-
keep my work" and wait for their confirmation before moving on.
|
|
126
|
-
|
|
127
|
-
## 3. Paths
|
|
128
|
-
|
|
129
|
-
Services: `Workspace`, `ReplicatedStorage`, `ServerScriptService`,
|
|
130
|
-
`ServerStorage`, `StarterGui`, `StarterPlayer/StarterPlayerScripts`,
|
|
131
|
-
`StarterPack`, `Lighting`, `SoundService`.
|
|
132
|
-
|
|
133
|
-
| Form | Example |
|
|
134
|
-
|---|---|
|
|
135
|
-
| root | `game` |
|
|
136
|
-
| slash form (preferred; dots in names OK) | `ReplicatedStorage/My.Module/Helper` |
|
|
137
|
-
| dotted form (no slashes) | `game.ReplicatedStorage.Modules` |
|
|
138
|
-
| session ref from a previous reply | `I:17` |
|
|
139
|
-
|
|
140
|
-
**Symbols you must not use in instance NAMES:** `/` (it is the path
|
|
141
|
-
separator, a name with `/` breaks every path). Also avoid `.` `[` `]`
|
|
142
|
-
`#` `$` in names, use `-` or `_` instead. Everywhere else symbols are
|
|
143
|
-
fine: `lua` results may contain any table keys, and script sources can
|
|
144
|
-
contain any UTF-8 text (odd bytes are sanitized automatically).
|
|
145
|
-
|
|
146
|
-
## 4. Tools
|
|
147
|
-
|
|
148
|
-
### 4.1 Connection and diagnostics
|
|
149
|
-
|
|
150
|
-
**ping** — health check. Expect `"ok": true` plus the place name. The first
|
|
151
|
-
command on a fresh setup, and the "is Studio open?" test whenever commands
|
|
152
|
-
start timing out.
|
|
153
|
-
|
|
154
|
-
npx golem-bridge ping
|
|
155
|
-
|
|
156
|
-
**status** — is the plugin alive? Reads the channel's recent beacons, no
|
|
157
|
-
Studio round-trip needed. Use it when `ping` times out to tell "Studio is
|
|
158
|
-
closed" apart from "the relay is broken".
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
npx golem-bridge tree
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
npx golem-bridge list
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
`--
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
npx golem-bridge find --
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
`--
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
npx golem-bridge read
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
npx golem-bridge lua
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
npx golem-bridge rotate Workspace/Door --
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
`
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
`--
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
`
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
`"
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
npx golem-bridge
|
|
425
|
-
|
|
426
|
-
**
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
`
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
npx golem-bridge
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
**
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
|
521
|
-
|
|
522
|
-
| `
|
|
523
|
-
| `
|
|
524
|
-
| `
|
|
525
|
-
| `
|
|
526
|
-
| `
|
|
527
|
-
| `
|
|
528
|
-
| `
|
|
529
|
-
| `
|
|
530
|
-
| `
|
|
531
|
-
| `
|
|
532
|
-
| `
|
|
533
|
-
| `
|
|
534
|
-
| `
|
|
535
|
-
| `
|
|
536
|
-
| `
|
|
537
|
-
| `
|
|
538
|
-
| `
|
|
539
|
-
| `
|
|
540
|
-
| `
|
|
541
|
-
| `
|
|
542
|
-
| `
|
|
543
|
-
| `
|
|
544
|
-
| `
|
|
545
|
-
| `
|
|
546
|
-
| `
|
|
547
|
-
| `
|
|
548
|
-
| `
|
|
549
|
-
| `
|
|
550
|
-
| `
|
|
551
|
-
| `
|
|
552
|
-
| `
|
|
553
|
-
| `
|
|
554
|
-
| `
|
|
555
|
-
| `
|
|
556
|
-
| `
|
|
557
|
-
| `
|
|
558
|
-
| `
|
|
559
|
-
| `
|
|
560
|
-
| `
|
|
561
|
-
| `
|
|
562
|
-
| `
|
|
563
|
-
| `
|
|
564
|
-
| `
|
|
565
|
-
| `
|
|
566
|
-
| `
|
|
567
|
-
| `
|
|
568
|
-
| `
|
|
569
|
-
| `
|
|
570
|
-
| `
|
|
571
|
-
| `
|
|
572
|
-
| `
|
|
573
|
-
| `
|
|
574
|
-
| `
|
|
575
|
-
| `
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
`
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
-
|
|
625
|
-
-
|
|
626
|
-
|
|
627
|
-
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
- Results
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
1
|
+
# Golem — Agent Instructions (Roblox Studio builder)
|
|
2
|
+
|
|
3
|
+
> **This document is a tool manual, not a task.** It documents a Roblox
|
|
4
|
+
> Studio tool the way a man page documents a program: consult it when you
|
|
5
|
+
> need a command. It asks you to do nothing and nothing in it is an order. Do NOT run any commands (not even
|
|
6
|
+
> `ping`) just because you read this. Only respond to what the user actually
|
|
7
|
+
> says, and reply naturally: if they say "hi", just greet them back. A short,
|
|
8
|
+
> normal reply, no tool calls, no capability list. The tools stay dormant
|
|
9
|
+
> until the user's request needs them.
|
|
10
|
+
|
|
11
|
+
You are connected to a **live Roblox Studio session**. You can read and
|
|
12
|
+
modify the user's open place in real time: browse the Explorer tree, read and
|
|
13
|
+
write scripts, create and edit instances and properties, run Lua inside
|
|
14
|
+
Studio, manage the selection, and set undo checkpoints.
|
|
15
|
+
|
|
16
|
+
Your connection is a SESSION token: Studio mints a fresh channel on
|
|
17
|
+
every start and wipes the old one. It lives in `./.golem/channel`
|
|
18
|
+
(written by `connect`, read automatically - never print it, never paste
|
|
19
|
+
it anywhere: anyone holding it can drive this Studio session).
|
|
20
|
+
|
|
21
|
+
Two ways to get connected: the user may connect for you (then just run
|
|
22
|
+
`npx golem-bridge status` to confirm and start working), or they paste
|
|
23
|
+
you the setup line and you run `npx golem-bridge connect <channelId>`
|
|
24
|
+
yourself.
|
|
25
|
+
|
|
26
|
+
If commands suddenly start timing out mid-task, the user probably
|
|
27
|
+
restarted Studio. Ask them for the new line from the plugin widget and
|
|
28
|
+
run `npx golem-bridge reconnect <newId>`.
|
|
29
|
+
|
|
30
|
+
## 0. The turn rule — read this first
|
|
31
|
+
|
|
32
|
+
Every task that uses tools follows one ritual. No exceptions.
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
npx golem-bridge turn begin
|
|
36
|
+
... your work (tree, read, script, create, ...) ...
|
|
37
|
+
npx golem-bridge turn end --note "short reply the user reads"
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
What this does: `turn begin` opens a group in the user's Studio chat, every
|
|
41
|
+
tool you run becomes a row in it, and `turn end --note "..."` folds the tools
|
|
42
|
+
into one "Tool Used: N" line and posts your note as the reply the user reads.
|
|
43
|
+
**The note IS your reply.** There is no other reply.
|
|
44
|
+
|
|
45
|
+
Rules:
|
|
46
|
+
|
|
47
|
+
1. Open with `turn begin` BEFORE the first tool. Close with `turn end
|
|
48
|
+
--note "..."` AFTER the last one. One turn per task.
|
|
49
|
+
2. Never finish a task without closing the turn. If you already drafted the
|
|
50
|
+
reply text, put it in the `--note` and end the turn instead of replying.
|
|
51
|
+
3. `say "..."` also posts a message AND closes the turn. Use it only when
|
|
52
|
+
that chunk of work is done, never for mid-task chatter.
|
|
53
|
+
4. While a turn is open, every command prints a `TURN STILL OPEN` reminder
|
|
54
|
+
and every result carries `"turnOpen": true`. That reminder means: run
|
|
55
|
+
your remaining tools, then close the turn immediately.
|
|
56
|
+
5. If you forget, the user is left staring at a stuck "AI working" banner
|
|
57
|
+
and your tools never fold into a clean reply. The plugin force-folds
|
|
58
|
+
abandoned turns after a few idle minutes, but that is a safety net, not
|
|
59
|
+
a workflow. Do not rely on it.
|
|
60
|
+
6. `turn end` without `--note` is rejected. The note is mandatory, never
|
|
61
|
+
optional.
|
|
62
|
+
7. Unclosed turns become DEBT: if a turn folds without its note, your next
|
|
63
|
+
command is rejected until you post the missing note with `turn end
|
|
64
|
+
--note`. Always close before replying.
|
|
65
|
+
|
|
66
|
+
No tools needed for a reply (a greeting, a question, an explanation)? Then
|
|
67
|
+
no turn is needed either. Just reply normally.
|
|
68
|
+
|
|
69
|
+
## 1. The command
|
|
70
|
+
|
|
71
|
+
All Studio commands go through one CLI: `npx golem-bridge`
|
|
72
|
+
(zero-dependency Node - nothing is installed, every command runs
|
|
73
|
+
straight from the package). Below, `golem-bridge ...` always means:
|
|
74
|
+
|
|
75
|
+
npx golem-bridge ...
|
|
76
|
+
|
|
77
|
+
Your channel lives in `./.golem/channel` (written by `connect`, read
|
|
78
|
+
automatically - you never need to look at it). If commands say you are
|
|
79
|
+
not connected, ask the user for their channel ID (shown in the Golem
|
|
80
|
+
plugin widget) and run:
|
|
81
|
+
|
|
82
|
+
npx golem-bridge connect <channelId>
|
|
83
|
+
|
|
84
|
+
If the user restarted Studio, a restart rotates the channel, so fetch the
|
|
85
|
+
new session with the fresh line from the widget:
|
|
86
|
+
|
|
87
|
+
npx golem-bridge reconnect <newChannelId>
|
|
88
|
+
|
|
89
|
+
Then check the connection:
|
|
90
|
+
|
|
91
|
+
npx golem-bridge ping
|
|
92
|
+
|
|
93
|
+
`ping` must return `"ok": true` plus the place name. If it times out,
|
|
94
|
+
Roblox Studio is not running. Tell the user and retry when they confirm
|
|
95
|
+
it is open. **Studio must stay open while you work.** Commands sent while
|
|
96
|
+
it is closed are dropped (only commands from the ~45 s before startup may
|
|
97
|
+
still run).
|
|
98
|
+
|
|
99
|
+
Every command takes a few seconds (relay latency plus a short startup).
|
|
100
|
+
That is normal. Do not retry faster; the CLI already waits. Every
|
|
101
|
+
result is JSON:
|
|
102
|
+
|
|
103
|
+
{"ok": true, "result": {...}, "turnOpen": false}
|
|
104
|
+
|
|
105
|
+
`"ok": false` means Studio reported an error; the `error` field says why.
|
|
106
|
+
Fix the call and retry. Add `--timeout N` (seconds, default 120) to any
|
|
107
|
+
command that may be slow.
|
|
108
|
+
|
|
109
|
+
## 2. Golden rules
|
|
110
|
+
|
|
111
|
+
1. Inspect before you change (`tree`, `list`, `read`). Verify after
|
|
112
|
+
(`read` it back, `grep` your new symbols).
|
|
113
|
+
2. Never run infinite loops in `lua`. It executes on Studio's main thread
|
|
114
|
+
and freezes the editor.
|
|
115
|
+
3. Confirm destructive actions with the user first: deleting instances,
|
|
116
|
+
overwriting existing scripts, bulk changes.
|
|
117
|
+
4. Every change is individually undoable (Ctrl+Z). The plugin sets undo
|
|
118
|
+
checkpoints automatically, and you can set named ones with `waypoint`.
|
|
119
|
+
5. Report paths in slash form (`ServerScriptService/Main`) so the user can
|
|
120
|
+
find them in the Explorer.
|
|
121
|
+
6. Follow the turn rule (§0) for every task that uses tools.
|
|
122
|
+
7. Build UI as instances, never as runtime code (see §4.10).
|
|
123
|
+
8. Protect the user's work: only the user's Ctrl+S commits to the place
|
|
124
|
+
file. After every meaningful milestone, tell the user "press Ctrl+S to
|
|
125
|
+
keep my work" and wait for their confirmation before moving on.
|
|
126
|
+
|
|
127
|
+
## 3. Paths
|
|
128
|
+
|
|
129
|
+
Services: `Workspace`, `ReplicatedStorage`, `ServerScriptService`,
|
|
130
|
+
`ServerStorage`, `StarterGui`, `StarterPlayer/StarterPlayerScripts`,
|
|
131
|
+
`StarterPack`, `Lighting`, `SoundService`.
|
|
132
|
+
|
|
133
|
+
| Form | Example |
|
|
134
|
+
|---|---|
|
|
135
|
+
| root | `game` |
|
|
136
|
+
| slash form (preferred; dots in names OK) | `ReplicatedStorage/My.Module/Helper` |
|
|
137
|
+
| dotted form (no slashes) | `game.ReplicatedStorage.Modules` |
|
|
138
|
+
| session ref from a previous reply | `I:17` |
|
|
139
|
+
|
|
140
|
+
**Symbols you must not use in instance NAMES:** `/` (it is the path
|
|
141
|
+
separator, a name with `/` breaks every path). Also avoid `.` `[` `]`
|
|
142
|
+
`#` `$` in names, use `-` or `_` instead. Everywhere else symbols are
|
|
143
|
+
fine: `lua` results may contain any table keys, and script sources can
|
|
144
|
+
contain any UTF-8 text (odd bytes are sanitized automatically).
|
|
145
|
+
|
|
146
|
+
## 4. Tools
|
|
147
|
+
|
|
148
|
+
### 4.1 Connection and diagnostics
|
|
149
|
+
|
|
150
|
+
**ping** — health check. Expect `"ok": true` plus the place name. The first
|
|
151
|
+
command on a fresh setup, and the "is Studio open?" test whenever commands
|
|
152
|
+
start timing out.
|
|
153
|
+
|
|
154
|
+
npx golem-bridge ping
|
|
155
|
+
|
|
156
|
+
**status** — is the plugin alive? Reads the channel's recent beacons, no
|
|
157
|
+
Studio round-trip needed. Use it when `ping` times out to tell "Studio is
|
|
158
|
+
closed" apart from "the relay is broken". If the channel was rotated,
|
|
159
|
+
`status` says so outright — fetch the fresh line and `reconnect`.
|
|
160
|
+
|
|
161
|
+
npx golem-bridge status
|
|
162
|
+
|
|
163
|
+
**debug** — full diagnostics: relay round-trip, versions, commands served,
|
|
164
|
+
error count. Use when something behaves strangely.
|
|
165
|
+
|
|
166
|
+
npx golem-bridge debug
|
|
167
|
+
|
|
168
|
+
### 4.2 Exploring — start every task here
|
|
169
|
+
|
|
170
|
+
**tree** — nested instance tree. The fastest way to learn a place's layout.
|
|
171
|
+
Defaults: path `game`, depth 2. Keep depth small on big places.
|
|
172
|
+
|
|
173
|
+
npx golem-bridge tree game --depth 2
|
|
174
|
+
npx golem-bridge tree Workspace --depth 3
|
|
175
|
+
|
|
176
|
+
**list** — children of one instance. Add `--recursive` for all descendants
|
|
177
|
+
and `--max N` to cap them.
|
|
178
|
+
|
|
179
|
+
npx golem-bridge list ServerScriptService
|
|
180
|
+
npx golem-bridge list game --recursive --max 1000
|
|
181
|
+
|
|
182
|
+
**count** — cheap instance count, no payload. Good for orientation ("how big
|
|
183
|
+
is this place?") and before/after checks.
|
|
184
|
+
|
|
185
|
+
npx golem-bridge count Workspace --class Part
|
|
186
|
+
|
|
187
|
+
**find** — find instances by name substring (case-sensitive) or by
|
|
188
|
+
CollectionService tag. `--exact` matches the full name; `--class` and
|
|
189
|
+
`--scope` narrow the search.
|
|
190
|
+
|
|
191
|
+
npx golem-bridge find Coin --class Part --scope Workspace
|
|
192
|
+
npx golem-bridge find --tag Choppable
|
|
193
|
+
|
|
194
|
+
**grep** — search inside script sources. Plain text, case-sensitive unless
|
|
195
|
+
`-i`. Returns path, line number, and matching text.
|
|
196
|
+
|
|
197
|
+
npx golem-bridge grep applyDamage --scope ServerScriptService
|
|
198
|
+
|
|
199
|
+
### 4.3 Reading instances
|
|
200
|
+
|
|
201
|
+
**read** — full record of one instance. Scripts print raw source by default;
|
|
202
|
+
`--json` prints the whole record (properties, attributes, children);
|
|
203
|
+
`--props A,B` adds extra properties.
|
|
204
|
+
|
|
205
|
+
npx golem-bridge read ServerScriptService/Main
|
|
206
|
+
npx golem-bridge read Workspace/Spawn --json
|
|
207
|
+
|
|
208
|
+
### 4.4 Scripts and Lua
|
|
209
|
+
|
|
210
|
+
**script** — create or rewrite a Script, LocalScript, or ModuleScript in one
|
|
211
|
+
call. Source comes from stdin (heredoc) or `--source`. Modes: `create`
|
|
212
|
+
(fails if the name exists), `update` (keeps the instance, replaces the
|
|
213
|
+
source), `replace` (deletes and recreates).
|
|
214
|
+
|
|
215
|
+
npx golem-bridge script ServerScriptService Main --class Script --mode create <<'EOF'
|
|
216
|
+
print("hello")
|
|
217
|
+
EOF
|
|
218
|
+
|
|
219
|
+
**lua** — run arbitrary Lua inside Studio with plugin permissions. Pass code
|
|
220
|
+
as an argument or pipe it in (`-`). Return plain values or tables; returned
|
|
221
|
+
instances come back as records. Yields like `task.wait(1)` are fine. Never
|
|
222
|
+
loop forever (see rule 2).
|
|
223
|
+
|
|
224
|
+
npx golem-bridge lua 'return 1+1'
|
|
225
|
+
npx golem-bridge lua - < code.lua
|
|
226
|
+
|
|
227
|
+
**exec** — raw op call for anything without a dedicated command. Takes one
|
|
228
|
+
JSON object with `op` and `args` (see §5).
|
|
229
|
+
|
|
230
|
+
npx golem-bridge exec '{"op":"list","args":{"path":"game"}}'
|
|
231
|
+
|
|
232
|
+
### 4.5 Organizing
|
|
233
|
+
|
|
234
|
+
**delete** — delete one or more instances. Destructive: confirm with the
|
|
235
|
+
user first.
|
|
236
|
+
|
|
237
|
+
npx golem-bridge delete Workspace/OldPart Workspace/OldModel
|
|
238
|
+
|
|
239
|
+
**move** — reparent an instance.
|
|
240
|
+
|
|
241
|
+
npx golem-bridge move Workspace/Part ServerStorage
|
|
242
|
+
|
|
243
|
+
**rename** — rename an instance. The new name must not contain `/`.
|
|
244
|
+
|
|
245
|
+
npx golem-bridge rename Workspace/Part1 FrontDoor
|
|
246
|
+
|
|
247
|
+
**group** — wrap instances into a new Model. After grouping, set the pivot
|
|
248
|
+
(see `pivot`) before rotating the group.
|
|
249
|
+
|
|
250
|
+
npx golem-bridge group Workspace/Trunk Workspace/Canopy --name Tree
|
|
251
|
+
|
|
252
|
+
**duplicate** — clone an instance, optionally N times. `--offset x,y,z`
|
|
253
|
+
shifts each copy (copy i gets offset x i), so rows and grids are one
|
|
254
|
+
command.
|
|
255
|
+
|
|
256
|
+
npx golem-bridge duplicate Workspace/Fence --count 5 --offset 4,0,0
|
|
257
|
+
|
|
258
|
+
**selection** — read the Studio selection, or set it (highlights instances
|
|
259
|
+
for the user), or clear it.
|
|
260
|
+
|
|
261
|
+
npx golem-bridge selection --set Workspace/PartA,Workspace/PartB
|
|
262
|
+
|
|
263
|
+
### 4.6 Moving and rotating — use these, never raw CFrames
|
|
264
|
+
|
|
265
|
+
**place** — absolute position (parts and models). The only command that
|
|
266
|
+
teleports to coordinates. Optional `--orientation` sets absolute rotation
|
|
267
|
+
in degrees.
|
|
268
|
+
|
|
269
|
+
npx golem-bridge place Workspace/Crate 10,5,0
|
|
270
|
+
|
|
271
|
+
**shift** — move by an offset in studs, in world space (default) or the
|
|
272
|
+
part's own space (`--space local`).
|
|
273
|
+
|
|
274
|
+
npx golem-bridge shift Workspace/Crate 0,5,0
|
|
275
|
+
|
|
276
|
+
**rotate** — THE way to rotate. Relative mode spins in place around an axis
|
|
277
|
+
(`x`, `y`, `z`, or `up`, `right`, `forward`, or an `x,y,z` vector) in world
|
|
278
|
+
or local space. Absolute mode (`--set`) writes the orientation in degrees.
|
|
279
|
+
|
|
280
|
+
npx golem-bridge rotate Workspace/Door --axis y --degrees 90
|
|
281
|
+
npx golem-bridge rotate Workspace/Door --set 0,90,0
|
|
282
|
+
|
|
283
|
+
**face** — aim an instance at a world point, keeping its position. Good for
|
|
284
|
+
branches, signs, cannons. `--axis` picks which side points at the target.
|
|
285
|
+
|
|
286
|
+
npx golem-bridge face Workspace/Cannon 0,5,30
|
|
287
|
+
|
|
288
|
+
**scale** — resize by a relative multiplier. Models scale as a whole.
|
|
289
|
+
|
|
290
|
+
npx golem-bridge scale Workspace/Tree 1.5
|
|
291
|
+
|
|
292
|
+
**pivot** — move a model or part pivot (the point it rotates around). Give
|
|
293
|
+
`--position`, `--orientation`, or both. After grouping a build, put the
|
|
294
|
+
pivot at its base so rotations look right.
|
|
295
|
+
|
|
296
|
+
npx golem-bridge pivot Workspace/Tree --position 0,0,0
|
|
297
|
+
|
|
298
|
+
### 4.7 Surfaces, terrain, and physics
|
|
299
|
+
|
|
300
|
+
**paint** — set color (`#RRGGBB`), material (`Grass`, `Neon`, `WoodPlanks`,
|
|
301
|
+
`SmoothPlastic`, ...), transparency, and reflectance on parts. Models: all
|
|
302
|
+
their parts. Combine flags freely.
|
|
303
|
+
|
|
304
|
+
npx golem-bridge paint Workspace/Wall --color #B0B0B0 --material SmoothPlastic
|
|
305
|
+
|
|
306
|
+
**match** — copy color, material, transparency, and reflectance from one
|
|
307
|
+
part onto others. Keeps builds visually consistent.
|
|
308
|
+
|
|
309
|
+
npx golem-bridge match Workspace/WallA Workspace/WallB Workspace/WallC
|
|
310
|
+
|
|
311
|
+
**anchor** — anchor parts so physics never moves them (models: all parts).
|
|
312
|
+
`--off` unanchors. Static builds should always be anchored.
|
|
313
|
+
|
|
314
|
+
npx golem-bridge anchor Workspace/House
|
|
315
|
+
|
|
316
|
+
**collide** — collision on or off (models: all parts). `--off` makes parts
|
|
317
|
+
walk-through.
|
|
318
|
+
|
|
319
|
+
npx golem-bridge collide Workspace/GhostWall --off
|
|
320
|
+
|
|
321
|
+
**terrain** — fill or carve terrain. `--position` is required; blocks need
|
|
322
|
+
`--size`, balls need `--radius`. `--action clear` carves (fills with Air).
|
|
323
|
+
|
|
324
|
+
npx golem-bridge terrain --action fill --shape block --position 0,-4,0 --size 128,8,128 --material Grass
|
|
325
|
+
|
|
326
|
+
### 4.8 Gameplay helpers
|
|
327
|
+
|
|
328
|
+
**light** — add or update a light inside a part. Types: `point`, `spot`,
|
|
329
|
+
`surface`.
|
|
330
|
+
|
|
331
|
+
npx golem-bridge light Workspace/Lamp --type point --color #FFD9A0 --range 30 --brightness 2
|
|
332
|
+
|
|
333
|
+
**sound** — add a Sound to a parent. `--play` previews it immediately,
|
|
334
|
+
`--loop` loops it.
|
|
335
|
+
|
|
336
|
+
npx golem-bridge sound Workspace 1837879082 --name Radio --volume 0.5 --play
|
|
337
|
+
|
|
338
|
+
**scatter** — clone a template into a random disc around it. Trees, rocks,
|
|
339
|
+
grass: build one, scatter the rest.
|
|
340
|
+
|
|
341
|
+
npx golem-bridge scatter Workspace/Tree --count 20 --radius 60 --y-jitter 2
|
|
342
|
+
|
|
343
|
+
**weld** — join a model's parts with WeldConstraints so the whole build
|
|
344
|
+
moves as one.
|
|
345
|
+
|
|
346
|
+
npx golem-bridge weld Workspace/Cart
|
|
347
|
+
|
|
348
|
+
**hitbox** — invisible part sized to the target's bounding box. Click and
|
|
349
|
+
chop targets, interaction zones. `--collide` makes it solid.
|
|
350
|
+
|
|
351
|
+
npx golem-bridge hitbox Workspace/Tree --padding 1
|
|
352
|
+
|
|
353
|
+
**prompt** — ProximityPrompt ("Press E to ...") on a part. `--object` is
|
|
354
|
+
the title above it, `--hold` the hold time in seconds.
|
|
355
|
+
|
|
356
|
+
npx golem-bridge prompt Workspace/Tree "Chop" --object Tree --hold 0.5
|
|
357
|
+
|
|
358
|
+
**particles** — attach a ParticleEmitter with a preset: `leaves`, `sparks`,
|
|
359
|
+
`smoke`, `magic`, `fire`, `snow`, `rain`, `bubbles`, `dust`, `confetti`,
|
|
360
|
+
`fireflies`.
|
|
361
|
+
|
|
362
|
+
npx golem-bridge particles Workspace/Torch fire --rate 40
|
|
363
|
+
|
|
364
|
+
**sign** — a readable wooden sign: board part with text on its face.
|
|
365
|
+
|
|
366
|
+
npx golem-bridge sign "Camp rules: no griefing" --position 0,6,10
|
|
367
|
+
|
|
368
|
+
**attr** — Studio attributes: typed config on instances without scripts.
|
|
369
|
+
`--set` repeats; values parse as integer, float, `true`/`false`, or string.
|
|
370
|
+
|
|
371
|
+
npx golem-bridge attr Workspace/Door --set Open=false --set LockLevel=3
|
|
372
|
+
|
|
373
|
+
**tag** — add or remove CollectionService tags. Find tagged instances later
|
|
374
|
+
with `find --tag`.
|
|
375
|
+
|
|
376
|
+
npx golem-bridge tag Workspace/Tree --add Choppable
|
|
377
|
+
|
|
378
|
+
### 4.9 VFX
|
|
379
|
+
|
|
380
|
+
**beam** — glowing beam between two parts. Lasers, tethers, energy links.
|
|
381
|
+
|
|
382
|
+
npx golem-bridge beam Workspace/TowerA Workspace/TowerB --color #78B4FF --width 0.4
|
|
383
|
+
|
|
384
|
+
**trail** — motion trail on a part. Shows when the part moves: sword
|
|
385
|
+
swipes, comet tails.
|
|
386
|
+
|
|
387
|
+
npx golem-bridge trail Workspace/Sword --lifetime 0.6
|
|
388
|
+
|
|
389
|
+
**explosion** — one-shot visual explosion. Harmless by default: no physics
|
|
390
|
+
damage.
|
|
391
|
+
|
|
392
|
+
npx golem-bridge explosion --position 0,10,0 --radius 8
|
|
393
|
+
|
|
394
|
+
### 4.10 UI — build interfaces as instances, not code
|
|
395
|
+
|
|
396
|
+
When the user asks for any UI (shop, HUD, menu, popup, note):
|
|
397
|
+
|
|
398
|
+
1. Build it with the `ui_*` tools below: real instances under `StarterGui`,
|
|
399
|
+
visible in the Explorer so the user can select, move, and restyle them.
|
|
400
|
+
2. NEVER write a LocalScript that builds the UI when the game runs.
|
|
401
|
+
Runtime-generated UI is invisible in Studio. LocalScripts may only wire
|
|
402
|
+
behavior to UI that already exists, or fill data-driven content (like a
|
|
403
|
+
shop list from a config).
|
|
404
|
+
3. Keep one style across the game: same fonts, corner radius, paddings,
|
|
405
|
+
palette. Before building a new screen, `read` an existing screen and
|
|
406
|
+
copy its fonts, sizes, and colors exactly. A different font is allowed
|
|
407
|
+
only as a deliberate choice (a parchment note, a decorative title).
|
|
408
|
+
4. Prefer changing state over rebuilding: toggle visibility, update `Text`,
|
|
409
|
+
tween positions. Do not destroy and recreate screens.
|
|
410
|
+
|
|
411
|
+
Positions and sizes use `"xs,xo,ys,yo"` (scachment note, a decorative title).
|
|
412
|
+
4. Prefer changing state over rebuilding: toggle visibility, update `Text`,
|
|
413
|
+
tween positions. Do not destroy and recreate screens.
|
|
414
|
+
|
|
415
|
+
Positions and sizes use `"xs,xo,ys,yo"` (scale/offset pairs); anchors use
|
|
416
|
+
`"x,y"`.
|
|
417
|
+
|
|
418
|
+
**ui_screen** — ScreenGui under StarterGui. The root of every interface.
|
|
419
|
+
|
|
420
|
+
npx golem-bridge ui_screen MainMenu
|
|
421
|
+
|
|
422
|
+
**ui_frame** — rounded panel, the backbone of screens.
|
|
423
|
+
|
|
424
|
+
npx golem-bridge ui_frame StarterGui/MainMenu Panel --size 0.8,0,0.6,0 --radius 12
|
|
425
|
+
|
|
426
|
+
**ui_label** — text label. Fonts: `regular`, `medium`, `semibold`, `bold`,
|
|
427
|
+
`mono`.
|
|
428
|
+
|
|
429
|
+
npx golem-bridge ui_label StarterGui/MainMenu/Panel Title --text "Item Shop" --font semibold --text-size 20
|
|
430
|
+
|
|
431
|
+
**ui_button** — text button with hover feedback built in.
|
|
432
|
+
|
|
433
|
+
npx golem-bridge ui_button StarterGui/MainMenu/Panel Buy --text "Buy"
|
|
434
|
+
|
|
435
|
+
**ui_input** — TextBox the player can type into.
|
|
436
|
+
|
|
437
|
+
npx golem-bridge ui_input StarterGui/MainMenu/Panel Name --placeholder "Your name..."
|
|
438
|
+
|
|
439
|
+
**ui_image** — ImageLabel showing a Roblox asset id.
|
|
440
|
+
|
|
441
|
+
npx golem-bridge ui_image StarterGui/MainMenu/Panel Icon --asset 123456 --scale fit
|
|
442
|
+
|
|
443
|
+
**ui_list** — UIListLayout that auto-arranges a container's children.
|
|
444
|
+
|
|
445
|
+
npx golem-bridge ui_list StarterGui/MainMenu/Panel --direction vertical --padding 8
|
|
446
|
+
|
|
447
|
+
### 4.11 Marketplace — browse and add assets
|
|
448
|
+
|
|
449
|
+
`search` and `info` run on YOUR machine (Studio itself is blocked from
|
|
450
|
+
roblox.com), so they work even while Studio is closed. Each takes ~5-15 s.
|
|
451
|
+
Do not call them in a loop; cache results and page with `--cursor`.
|
|
452
|
+
|
|
453
|
+
**search** — search the Creator Store. Categories: `model`, `mesh`,
|
|
454
|
+
`image`, `audio`, `video`, `plugin`. Results carry id, name, creator,
|
|
455
|
+
price, and a thumbnail URL. Open the thumbnail to judge the asset before
|
|
456
|
+
inserting.
|
|
457
|
+
|
|
458
|
+
npx golem-bridge search castle --category model --limit 5
|
|
459
|
+
|
|
460
|
+
**info** — details plus thumbnail for one asset.
|
|
461
|
+
|
|
462
|
+
npx golem-bridge info 487667385
|
|
463
|
+
|
|
464
|
+
**insert** — place an asset into the open place. ONLY free assets
|
|
465
|
+
(`priceInRobux` null or 0) or assets the user owns. Paid or restricted
|
|
466
|
+
assets fail with "Asset is not trusted". If that happens, pick a different
|
|
467
|
+
result.
|
|
468
|
+
|
|
469
|
+
npx golem-bridge insert 487667385 Workspace --name "Castle Wall"
|
|
470
|
+
|
|
471
|
+
**apply** — set an asset-backed property: `Image`, `Texture`, `SoundId`,
|
|
472
|
+
`MeshId`, and similar.
|
|
473
|
+
|
|
474
|
+
npx golem-bridge apply 123456 Workspace/Sign/Decal Texture
|
|
475
|
+
|
|
476
|
+
Workflow: search, open thumbnails, `info` the shortlist, `insert`, verify
|
|
477
|
+
with `tree`/`read`, set a `waypoint`. Tell the user what you added and
|
|
478
|
+
where it landed.
|
|
479
|
+
|
|
480
|
+
### 4.12 Playtesting
|
|
481
|
+
|
|
482
|
+
**play** — start a play test (`play` = full client when Studio allows it,
|
|
483
|
+
`run` = server simulation). The bridge keeps serving your commands while
|
|
484
|
+
the game runs.
|
|
485
|
+
|
|
486
|
+
**logs** — Studio output: errors and warnings by default, from the server
|
|
487
|
+
AND the client, live while the test runs. `--all` adds prints.
|
|
488
|
+
|
|
489
|
+
**stop** — end the running test. Always stop it when you are done.
|
|
490
|
+
|
|
491
|
+
Workflow: build, Ctrl+S, `play`, wait 10-20 s so scripts can run and fail,
|
|
492
|
+
`logs`, fix every error, `stop`, save, re-test until clean.
|
|
493
|
+
|
|
494
|
+
npx golem-bridge play
|
|
495
|
+
npx golem-bridge logs
|
|
496
|
+
npx golem-bridge stop
|
|
497
|
+
|
|
498
|
+
### 4.13 Session and talking to the user
|
|
499
|
+
|
|
500
|
+
**waypoint** — named undo checkpoint ("one clean undo away"). Set one
|
|
501
|
+
before risky edits and at every milestone.
|
|
502
|
+
|
|
503
|
+
npx golem-bridge waypoint "before refactor"
|
|
504
|
+
|
|
505
|
+
**undo** — one Studio undo step. Edit mode only.
|
|
506
|
+
|
|
507
|
+
**look** — aim the user's editor camera at your work so they see it.
|
|
508
|
+
|
|
509
|
+
npx golem-bridge look Workspace/Castle --distance 60
|
|
510
|
+
|
|
511
|
+
**say** — post a message to the Studio chat AND close the turn. Only for
|
|
512
|
+
finished chunks of work (see §0).
|
|
513
|
+
|
|
514
|
+
**turn** — the ritual (§0). `turn begin` opens the turn; `turn end --note
|
|
515
|
+
"..."` closes it and posts the note as the reply the user reads. A turn
|
|
516
|
+
left unclosed blocks your next command until the note is posted.
|
|
517
|
+
|
|
518
|
+
## 5. Op reference (for `exec`)
|
|
519
|
+
|
|
520
|
+
| op (aliases) | args | returns |
|
|
521
|
+
|---|---|---|
|
|
522
|
+
| `ping` | — | plugin/Studio/place info |
|
|
523
|
+
| `debug` | — | relay round-trip, versions, commands served, error count |
|
|
524
|
+
| `turn_begin` | — | opens a turn group in the Studio chat (via `turn begin`) |
|
|
525
|
+
| `turn_end` | `note` (required) | folds the turn and posts the note as the reply (via `turn end --note`) |
|
|
526
|
+
| `run` (`eval`,`exec`) | `code` | `{returnCount, values}` — runs Lua with plugin permissions |
|
|
527
|
+
| `list` (`ls`) | `path`, `recursive`, `max` | children (or descendants) records |
|
|
528
|
+
| `tree` | `path`, `depth`, `maxChildren`, `maxNodes` | nested tree |
|
|
529
|
+
| `read` (`cat`,`stat`) | `path`, `props` | properties, `source?`, `attributes?`, children |
|
|
530
|
+
| `create` | `class`, `parent`, `name?`, `source?`, `props?` | record of the new instance |
|
|
531
|
+
| `write` | `path`, `source?`, `props?` | record of the updated instance |
|
|
532
|
+
| `script` | `parent`, `name`, `class?` (Script/LocalScript/ModuleScript), `mode?` (create/update/replace), `source` | record of the script |
|
|
533
|
+
| `place` | `path`, `position` {x,y,z}, `orientation?` {x,y,z} degrees | absolute reposition (parts AND models, via pivot) |
|
|
534
|
+
| `paint` | `path`/`paths`, `color?` "#RRGGBB", `material?`, `transparency?`, `reflectance?` | `{count}` — parts painted (models: all their parts) |
|
|
535
|
+
| `rename` | `path`, `name` (no `/` in names!) | `{path, name, old}` |
|
|
536
|
+
| `look` | `path` or `position`, `distance?` | aims the editor camera so the user sees the work |
|
|
537
|
+
| `count` | `scope?`, `class?` | `{count}` — cheap totals, no payloads |
|
|
538
|
+
| `undo` | — | one Studio undo step (reverts the last change) |
|
|
539
|
+
| `anchor` | `path`/`paths`, `anchored?` (default true) | `{count}` — parts anchored (models: all parts) |
|
|
540
|
+
| `collide` | `path`/`paths`, `canCollide?` (default true) | `{count}` — collision toggled |
|
|
541
|
+
| `light` | `path`, `type?` point/spot/surface, `color?` "#RRGGBB", `range?` 0-60, `brightness?`, `shadows?` | the light's record |
|
|
542
|
+
| `sound` | `parent`, `id`, `volume?`, `looped?`, `play?`, `name?` | the sound's record (plays immediately with `play`) |
|
|
543
|
+
| `scatter` | `path`, `count` (max 200), `radius`, `yJitter?`, `parent?`, `name?` | `{count, copies}` — random disc placement of clones |
|
|
544
|
+
| `weld` | `path`/`paths` | `{count}` — WeldConstraints joining every part to the first |
|
|
545
|
+
| `hitbox` | `path`, `padding?`, `name?`, `canCollide?`, `anchored?` | invisible hitbox part sized to the target's bounding box |
|
|
546
|
+
| `prompt` | `path`, `action`, `object?`, `hold?`, `distance?` | ProximityPrompt ("Press E to ...") on the part |
|
|
547
|
+
| `particles` | `path`, `preset` leaves/sparks/smoke/magic/fire/snow/rain/bubbles/dust/confetti/fireflies, `rate?`, `color?` | ParticleEmitter with the preset applied |
|
|
548
|
+
| `sign` | `text`, `position?`, `parent?`, `size?`, `name?` | a wooden sign part with readable text (SurfaceGui) |
|
|
549
|
+
| `attributes` (`attr`) | `path`, `set?` {k: string/number/boolean/{x,y,z}}, `clear?` [k] | the instance's attributes |
|
|
550
|
+
| `tag` | `path`/`paths`, `add?` [tag], `remove?` [tag] | tags applied; find them again with `find --tag <tag>` |
|
|
551
|
+
| `match` | `from` (a part), `paths`/`to` | copies color/material/transparency/reflectance onto targets |
|
|
552
|
+
| `beam` | `from`, `to` (two parts), `color?`, `width?`, `curve?`, `name?` | glowing beam between the parts |
|
|
553
|
+
| `trail` | `path` (a part), `color?`, `lifetime?`, `name?` | motion Trail, visible when the part moves |
|
|
554
|
+
| `explosion` | `position?` {x,y,z}, `radius?` | one-shot Explosion, visual only, harmless by default |
|
|
555
|
+
| `ui_screen` | `name`, `parent?` (default StarterGui), `order?` | ScreenGui container, the root of every interface |
|
|
556
|
+
| `ui_frame` | `parent`, `name`, `position?`/`size?` ("xs,xo,ys,yo"), `color?`, `radius?`, `anchor?` ("x,y"), `transparency?`, `clip?` | rounded panel |
|
|
557
|
+
| `ui_label` | `parent`, `name`, `text`, `align?`, `wrap?`, `color?`, `font?` (regular/medium/semibold/bold/mono), `text_size?` | text label |
|
|
558
|
+
| `ui_button` | `parent`, `name`, `text`, `color?`, `text_color?`, `radius?`, `size?` | TextButton with hover feedback |
|
|
559
|
+
| `ui_input` | `parent`, `name`, `placeholder?`, `text?`, `background?` | TextBox the player can type into |
|
|
560
|
+
| `ui_image` | `parent`, `name`, `asset` (id), `scale?` (fit/stretch/tile), `size?` | ImageLabel showing a Roblox asset |
|
|
561
|
+
| `ui_list` | `parent`, `direction?` (vertical/horizontal), `padding?`, `halign?`, `valign?` | UIListLayout, auto-arranges the container's children |
|
|
562
|
+
| `play` | `mode?` (play = full client when Studio allows it, run = server simulation) | starts a play test; the bridge keeps serving while the game runs |
|
|
563
|
+
| `stop` | — | stops the running play test |
|
|
564
|
+
| `logs` | `filter?` (errors = default, all), `limit?`, `since?` (unix ts; defaults to the test's start) | Studio output, server AND client, live during the test |
|
|
565
|
+
| `delete` (`rm`) | `path` or `paths` | `{deleted: [...]}` |
|
|
566
|
+
| `move` (`mv`) | `path`, `parent` | record |
|
|
567
|
+
| `find` | `query`, `class?`, `scope?`, `max?`, `exact?`, `caseSensitive?` | `{results: [...]}` |
|
|
568
|
+
| `grep` | `pattern`, `scope?`, `max?`, `plain?`, `caseSensitive?` | `{matches: [{path, line, text}]}` |
|
|
569
|
+
| `selection` | `set?` (array of paths), `clear?` | `{selection: [...]}` |
|
|
570
|
+
| `search` | `query`, `category?` (model/mesh/image/audio/video/plugin), `limit?`, `cursor?` | runs on your machine: `{results: [{id, name, creator, priceInRobux, thumbnail, ...}], nextPageCursor?}` |
|
|
571
|
+
| `info` | `id` | runs on your machine: name, description, creator, price, thumbnail |
|
|
572
|
+
| `insert_asset` (`insert`) | `id`, `parent?` (default Workspace), `name?` | records of inserted instances |
|
|
573
|
+
| `apply_asset` (`apply`) | `id`, `path`, `prop` | record + `appliedProperty`/`appliedValue` |
|
|
574
|
+
| `say` | `text` | posts a chat message AND closes the turn |
|
|
575
|
+
| `rotate` (`rot`) | relative: `axis` ("x"/"y"/"z"/"up"/"right"/"forward" or {x,y,z}) + `degrees`, `space?` world/local — rotates IN PLACE; absolute: `orientation` {x,y,z} degrees | rotated records |
|
|
576
|
+
| `face` | `path`, `target` {x,y,z} (or `direction`), `axis?` forward/up/right | aims it, keeps position |
|
|
577
|
+
| `shift` | `path`/`paths`, `offset` {x,y,z} studs, `space?` world/local | moved paths |
|
|
578
|
+
| `scale` | `path`, `factor` (relative multiplier) | record |
|
|
579
|
+
| `duplicate` (`dup`) | `path`, `count?`, `offset?` (per copy), `parent?`, `name?` | records of copies |
|
|
580
|
+
| `group` | `paths`, `name?`, `parent?` | new Model record |
|
|
581
|
+
| `set_pivot` (`pivot`) | `path`, `position?` and/or `orientation?` {x,y,z} degrees | pivot info |
|
|
582
|
+
| `terrain` | `action` fill/clear, `shape` block/ball, `position`, `size`/`radius`, `material?` | region filled |
|
|
583
|
+
| `waypoint` | `label?` | `{ok}` — an undo checkpoint in Studio's history |
|
|
584
|
+
|
|
585
|
+
Instance records look like
|
|
586
|
+
`{"name":"Main","className":"Script","ref":"I:12","path":"ServerScriptService/Main","children":0}`.
|
|
587
|
+
|
|
588
|
+
## 6. Property value formats (JSON to Roblox)
|
|
589
|
+
|
|
590
|
+
| Roblox type | JSON |
|
|
591
|
+
|---|---|
|
|
592
|
+
| number/string/bool | `1.5`, `"text"`, `true` |
|
|
593
|
+
| Vector3 | `{"type":"Vector3","x":0,"y":10,"z":0}` |
|
|
594
|
+
| Color3 | `"#FF7700"` or `{"type":"Color3","r":1,"g":0.5,"b":0}` |
|
|
595
|
+
| CFrame | `{"type":"CFrame","position":{...},"lookAt":{...}}` |
|
|
596
|
+
| UDim2 | `{"type":"UDim2","xScale":0,"xOffset":10,"yScale":0,"yOffset":20}` |
|
|
597
|
+
| EnumItem | `"Enum.Material.Neon"` |
|
|
598
|
+
| Instance | a path string or `{"type":"Instance","ref":"I:3"}` |
|
|
599
|
+
| Orientation (Vector3, degrees) | `{"type":"Vector3","x":0,"y":90,"z":0}` — rotates in place, keeps position |
|
|
600
|
+
|
|
601
|
+
The marker key is `type`, never `$type`: the relay rejects any key starting
|
|
602
|
+
with `$`, which would kill the entire command. Values you read back already
|
|
603
|
+
use `type`, so they can be copied straight into `props`.
|
|
604
|
+
|
|
605
|
+
## 7. Building and orientation — read before placing parts
|
|
606
|
+
|
|
607
|
+
Coordinates: **+Y is up**, one unit = one stud, rotations are degrees.
|
|
608
|
+
|
|
609
|
+
**The #1 trap: cylinders (and most trunk or branch-like meshes) have their
|
|
610
|
+
length along the X axis.** A vertical trunk needs `Orientation (0, 0, 90)`.
|
|
611
|
+
Always set orientation when creating such parts. `create` accepts top-level
|
|
612
|
+
`position` {x,y,z} and `orientation` {x,y,z} in degrees:
|
|
613
|
+
|
|
614
|
+
npx golem-bridge exec '{"op":"create","args":{"class":"Part","parent":"Workspace","name":"Trunk","position":{"x":0,"y":6,"z":0},"orientation":{"x":0,"y":0,"z":90},"props":{"Shape":"Enum.PartType.Cylinder","Anchored":true,"Material":"Enum.Material.Wood","Color":"#8B5A2B","Size":{"type":"Vector3","x":12,"y":2,"z":2}}}}'
|
|
615
|
+
|
|
616
|
+
(Height 12 runs along X, so orientation (0,0,90) stands it up. Ball canopies
|
|
617
|
+
need no orientation.)
|
|
618
|
+
|
|
619
|
+
**Rotating: use the tools, never raw CFrames.**
|
|
620
|
+
|
|
621
|
+
- relative: `rotate <path> --axis y --degrees 90` (world axis); `--space
|
|
622
|
+
local` uses the part's own axis (tilt a branch: `--axis z --degrees 30
|
|
623
|
+
--space local`)
|
|
624
|
+
- absolute: `rotate <path> --set 0,90,0` (sets Orientation exactly)
|
|
625
|
+
- aim at a point: `face <path> 10,5,0` (forward axis by default, `--axis up`
|
|
626
|
+
to point its top at something). Great for branches, signs, cannons.
|
|
627
|
+
- never write a bare CFrame without a position. It teleports the part to
|
|
628
|
+
the origin.
|
|
629
|
+
|
|
630
|
+
**Positioning and copying:**
|
|
631
|
+
|
|
632
|
+
- move by offset: `shift <path> 0,5,0` (world) or `--space local`
|
|
633
|
+
- copy in a line: `duplicate <path> --count 5 --offset 4,0,0`
|
|
634
|
+
- resize: `scale <path> 1.5` (relative; models scale as a whole)
|
|
635
|
+
- wrap into a Model: `group <partA> <partB> --name Tree`
|
|
636
|
+
|
|
637
|
+
**Rotating models correctly:** models rotate around their **pivot**. After
|
|
638
|
+
grouping, put the pivot where the rotation center should be (usually the
|
|
639
|
+
base): `pivot Workspace/Tree --position 0,0,0`. Now `rotate Workspace/Tree
|
|
640
|
+
--axis y --degrees 45` spins the whole tree around its base.
|
|
641
|
+
|
|
642
|
+
**Verify:** `read` the part afterwards and check `Orientation`/`Position`.
|
|
643
|
+
Wrong? Fix with `rotate --set` or `shift`. Cheap, and every change is an
|
|
644
|
+
undo checkpoint.
|
|
645
|
+
|
|
646
|
+
**Terrain:** `terrain --action fill --shape block --position 0,-4,0 --size
|
|
647
|
+
128,8,128 --material Grass`; `--shape ball --radius 20` for blobs;
|
|
648
|
+
`--action clear` carves (fills with Air).
|
|
649
|
+
|
|
650
|
+
## 8. `lua` examples (the escape hatch — full Studio plugin API)
|
|
651
|
+
|
|
652
|
+
-- count parts
|
|
653
|
+
local n = 0
|
|
654
|
+
for _, inst in ipairs(workspace:GetDescendants()) do
|
|
655
|
+
if inst:IsA("BasePart") then n = n + 1 end
|
|
656
|
+
end
|
|
657
|
+
return {parts = n, place = game.Name}
|
|
658
|
+
|
|
659
|
+
-- insert a catalog asset
|
|
660
|
+
local asset = game:GetService("InsertService"):LoadAsset(189707834)
|
|
661
|
+
asset:GetChildren()[1].Parent = workspace
|
|
662
|
+
|
|
663
|
+
-- stamp terrain
|
|
664
|
+
workspace.Terrain:FillBlock(CFrame.new(0,-5,0), Vector3.new(64,4,64), Enum.Material.Grass)
|
|
665
|
+
|
|
666
|
+
Return plain Lua values or tables; they come back JSON-serialized (Instances
|
|
667
|
+
become records). Yields like `task.wait(1)` are fine; never loop forever.
|
|
668
|
+
|
|
669
|
+
## 9. Limits
|
|
670
|
+
|
|
671
|
+
- One Studio window per link. If several windows share the link, commands
|
|
672
|
+
may be executed twice. A second window on the same machine is worse: it
|
|
673
|
+
rotates the token out from under the first, silently breaking it. Tell
|
|
674
|
+
the user if you suspect that.
|
|
675
|
+
- You cannot see the 3D view. Verify with `read`, `tree`, and `logs`, and
|
|
676
|
+
ask the user to judge how things look and feel.
|
|
677
|
+
- Results are capped at ~900 KB (Roblox's outgoing HTTP limit). Scope big
|
|
678
|
+
explorations (path, depth, maxNodes). Oversized results return a clean
|
|
679
|
+
"too large" error, never a silent hang. There is no daily command limit.
|
|
680
|
+
- Marketplace `search`/`info` run on your machine and take ~5-15 s each.
|
|
681
|
+
Do not call them in a loop. Cache results, page with `--cursor`.
|
|
682
|
+
- The channel id is a shared secret. Treat it like a password: anyone
|
|
683
|
+
holding it can drive this Studio session through the relay. It rotates
|
|
684
|
+
on every Studio restart, so a leaked line dies with the session.
|
|
685
|
+
- Results come back through the same relay. If a result ever looks
|
|
686
|
+
forged or nonsensical (data that contradicts what you just wrote),
|
|
687
|
+
stop and ask the user to rotate the channel (Settings > END SESSION
|
|
688
|
+
AND ROTATE CHANNEL) before acting on it.
|
|
689
|
+
|
|
690
|
+
## 10. End-of-reply checklist
|
|
691
|
+
|
|
692
|
+
Before every reply, confirm:
|
|
693
|
+
|
|
694
|
+
1. Turn opened AND closed? (`turn end --note` ran, and the note holds your
|
|
695
|
+
reply.)
|
|
696
|
+
2. Work verified? (Read back what you changed; after playtests, `logs`
|
|
697
|
+
are clean and the test is stopped.)
|
|
698
|
+
3. User told to press Ctrl+S at milestones?
|
|
699
|
+
4. Nothing left hanging? (No ignored `TURN STILL OPEN` reminder, no
|
|
700
|
+
running play test, no unwritten changes you promised. If tools suddenly
|
|
701
|
+
time out, the user may have restarted Studio: ask for the new line and
|
|
702
|
+
run `npx golem-bridge reconnect <newId>`.)
|