golem-bridge 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,24 +13,28 @@ modify the user's open place in real time: browse the Explorer tree, read and
13
13
  write scripts, create and edit instances and properties, run Lua inside
14
14
  Studio, manage the selection, and set undo checkpoints.
15
15
 
16
- Your connection (already configured, nothing to change):
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).
17
20
 
18
- - Relay database: `__DB_URL__`
19
- - Your private channel: `__CHANNEL_ID__`
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.
20
25
 
21
- The channel is a SESSION token: Studio mints a fresh one on every start
22
- and wipes the old channel. If commands suddenly start timing out mid-task,
23
- the user probably restarted Studio. Ask them for the new line from the
24
- plugin widget and run `npx golem-bridge reconnect <newId>`.
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>`.
25
29
 
26
30
  ## 0. The turn rule — read this first
27
31
 
28
32
  Every task that uses tools follows one ritual. No exceptions.
29
33
 
30
34
  ```
31
- python3 ./.golem/golem.py turn begin
35
+ npx golem-bridge turn begin
32
36
  ... your work (tree, read, script, create, ...) ...
33
- python3 ./.golem/golem.py turn end --note "short reply the user reads"
37
+ npx golem-bridge turn end --note "short reply the user reads"
34
38
  ```
35
39
 
36
40
  What this does: `turn begin` opens a group in the user's Studio chat, every
@@ -62,16 +66,18 @@ Rules:
62
66
  No tools needed for a reply (a greeting, a question, an explanation)? Then
63
67
  no turn is needed either. Just reply normally.
64
68
 
65
- ## 1. The helper
69
+ ## 1. The command
66
70
 
67
- All Studio commands go through one script: `./.golem/golem.py`
68
- (zero-dependency Python 3, your channel already baked in). Below,
69
- `golem.py ...` always means:
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:
70
74
 
71
- python3 ./.golem/golem.py ...
75
+ npx golem-bridge ...
72
76
 
73
- Keep it in `./.golem/`. If it is ever missing, ask the user for their
74
- channel ID (shown in the Golem plugin widget) and re-run:
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:
75
81
 
76
82
  npx golem-bridge connect <channelId>
77
83
 
@@ -82,7 +88,7 @@ new session with the fresh line from the widget:
82
88
 
83
89
  Then check the connection:
84
90
 
85
- golem.py ping
91
+ npx golem-bridge ping
86
92
 
87
93
  `ping` must return `"ok": true` plus the place name. If it times out,
88
94
  Roblox Studio is not running. Tell the user and retry when they confirm
@@ -90,8 +96,9 @@ it is open. **Studio must stay open while you work.** Commands sent while
90
96
  it is closed are dropped (only commands from the ~45 s before startup may
91
97
  still run).
92
98
 
93
- Every command takes ~1-3 s (relay latency). That is normal. Do not retry
94
- faster; the helper already waits. Every result is JSON:
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:
95
102
 
96
103
  {"ok": true, "result": {...}, "turnOpen": false}
97
104
 
@@ -144,49 +151,49 @@ contain any UTF-8 text (odd bytes are sanitized automatically).
144
151
  command on a fresh setup, and the "is Studio open?" test whenever commands
145
152
  start timing out.
146
153
 
147
- golem.py ping
154
+ npx golem-bridge ping
148
155
 
149
156
  **status** — is the plugin alive? Reads the channel's recent beacons, no
150
157
  Studio round-trip needed. Use it when `ping` times out to tell "Studio is
151
158
  closed" apart from "the relay is broken".
152
159
 
153
- golem.py status
160
+ npx golem-bridge status
154
161
 
155
162
  **debug** — full diagnostics: relay round-trip, versions, commands served,
156
163
  error count. Use when something behaves strangely.
157
164
 
158
- golem.py debug
165
+ npx golem-bridge debug
159
166
 
160
167
  ### 4.2 Exploring — start every task here
161
168
 
162
169
  **tree** — nested instance tree. The fastest way to learn a place's layout.
163
170
  Defaults: path `game`, depth 2. Keep depth small on big places.
164
171
 
165
- golem.py tree game --depth 2
166
- golem.py tree Workspace --depth 3
172
+ npx golem-bridge tree game --depth 2
173
+ npx golem-bridge tree Workspace --depth 3
167
174
 
168
175
  **list** — children of one instance. Add `--recursive` for all descendants
169
176
  and `--max N` to cap them.
170
177
 
171
- golem.py list ServerScriptService
172
- golem.py list game --recursive --max 1000
178
+ npx golem-bridge list ServerScriptService
179
+ npx golem-bridge list game --recursive --max 1000
173
180
 
174
181
  **count** — cheap instance count, no payload. Good for orientation ("how big
175
182
  is this place?") and before/after checks.
176
183
 
177
- golem.py count Workspace --class Part
184
+ npx golem-bridge count Workspace --class Part
178
185
 
179
186
  **find** — find instances by name substring (case-sensitive) or by
180
187
  CollectionService tag. `--exact` matches the full name; `--class` and
181
188
  `--scope` narrow the search.
182
189
 
183
- golem.py find Coin --class Part --scope Workspace
184
- golem.py find --tag Choppable
190
+ npx golem-bridge find Coin --class Part --scope Workspace
191
+ npx golem-bridge find --tag Choppable
185
192
 
186
193
  **grep** — search inside script sources. Plain text, case-sensitive unless
187
194
  `-i`. Returns path, line number, and matching text.
188
195
 
189
- golem.py grep applyDamage --scope ServerScriptService
196
+ npx golem-bridge grep applyDamage --scope ServerScriptService
190
197
 
191
198
  ### 4.3 Reading instances
192
199
 
@@ -194,8 +201,8 @@ CollectionService tag. `--exact` matches the full name; `--class` and
194
201
  `--json` prints the whole record (properties, attributes, children);
195
202
  `--props A,B` adds extra properties.
196
203
 
197
- golem.py read ServerScriptService/Main
198
- golem.py read Workspace/Spawn --json
204
+ npx golem-bridge read ServerScriptService/Main
205
+ npx golem-bridge read Workspace/Spawn --json
199
206
 
200
207
  ### 4.4 Scripts and Lua
201
208
 
@@ -204,7 +211,7 @@ call. Source comes from stdin (heredoc) or `--source`. Modes: `create`
204
211
  (fails if the name exists), `update` (keeps the instance, replaces the
205
212
  source), `replace` (deletes and recreates).
206
213
 
207
- golem.py script ServerScriptService Main --class Script --mode create <<'EOF'
214
+ npx golem-bridge script ServerScriptService Main --class Script --mode create <<'EOF'
208
215
  print("hello")
209
216
  EOF
210
217
 
@@ -213,44 +220,44 @@ as an argument or pipe it in (`-`). Return plain values or tables; returned
213
220
  instances come back as records. Yields like `task.wait(1)` are fine. Never
214
221
  loop forever (see rule 2).
215
222
 
216
- golem.py lua 'return 1+1'
217
- golem.py lua - < code.lua
223
+ npx golem-bridge lua 'return 1+1'
224
+ npx golem-bridge lua - < code.lua
218
225
 
219
226
  **exec** — raw op call for anything without a dedicated command. Takes one
220
227
  JSON object with `op` and `args` (see §5).
221
228
 
222
- golem.py exec '{"op":"list","args":{"path":"game"}}'
229
+ npx golem-bridge exec '{"op":"list","args":{"path":"game"}}'
223
230
 
224
231
  ### 4.5 Organizing
225
232
 
226
233
  **delete** — delete one or more instances. Destructive: confirm with the
227
234
  user first.
228
235
 
229
- golem.py delete Workspace/OldPart Workspace/OldModel
236
+ npx golem-bridge delete Workspace/OldPart Workspace/OldModel
230
237
 
231
238
  **move** — reparent an instance.
232
239
 
233
- golem.py move Workspace/Part ServerStorage
240
+ npx golem-bridge move Workspace/Part ServerStorage
234
241
 
235
242
  **rename** — rename an instance. The new name must not contain `/`.
236
243
 
237
- golem.py rename Workspace/Part1 FrontDoor
244
+ npx golem-bridge rename Workspace/Part1 FrontDoor
238
245
 
239
246
  **group** — wrap instances into a new Model. After grouping, set the pivot
240
247
  (see `pivot`) before rotating the group.
241
248
 
242
- golem.py group Workspace/Trunk Workspace/Canopy --name Tree
249
+ npx golem-bridge group Workspace/Trunk Workspace/Canopy --name Tree
243
250
 
244
251
  **duplicate** — clone an instance, optionally N times. `--offset x,y,z`
245
252
  shifts each copy (copy i gets offset x i), so rows and grids are one
246
253
  command.
247
254
 
248
- golem.py duplicate Workspace/Fence --count 5 --offset 4,0,0
255
+ npx golem-bridge duplicate Workspace/Fence --count 5 --offset 4,0,0
249
256
 
250
257
  **selection** — read the Studio selection, or set it (highlights instances
251
258
  for the user), or clear it.
252
259
 
253
- golem.py selection --set Workspace/PartA,Workspace/PartB
260
+ npx golem-bridge selection --set Workspace/PartA,Workspace/PartB
254
261
 
255
262
  ### 4.6 Moving and rotating — use these, never raw CFrames
256
263
 
@@ -258,34 +265,34 @@ for the user), or clear it.
258
265
  teleports to coordinates. Optional `--orientation` sets absolute rotation
259
266
  in degrees.
260
267
 
261
- golem.py place Workspace/Crate 10,5,0
268
+ npx golem-bridge place Workspace/Crate 10,5,0
262
269
 
263
270
  **shift** — move by an offset in studs, in world space (default) or the
264
271
  part's own space (`--space local`).
265
272
 
266
- golem.py shift Workspace/Crate 0,5,0
273
+ npx golem-bridge shift Workspace/Crate 0,5,0
267
274
 
268
275
  **rotate** — THE way to rotate. Relative mode spins in place around an axis
269
276
  (`x`, `y`, `z`, or `up`, `right`, `forward`, or an `x,y,z` vector) in world
270
277
  or local space. Absolute mode (`--set`) writes the orientation in degrees.
271
278
 
272
- golem.py rotate Workspace/Door --axis y --degrees 90
273
- golem.py rotate Workspace/Door --set 0,90,0
279
+ npx golem-bridge rotate Workspace/Door --axis y --degrees 90
280
+ npx golem-bridge rotate Workspace/Door --set 0,90,0
274
281
 
275
282
  **face** — aim an instance at a world point, keeping its position. Good for
276
283
  branches, signs, cannons. `--axis` picks which side points at the target.
277
284
 
278
- golem.py face Workspace/Cannon 0,5,30
285
+ npx golem-bridge face Workspace/Cannon 0,5,30
279
286
 
280
287
  **scale** — resize by a relative multiplier. Models scale as a whole.
281
288
 
282
- golem.py scale Workspace/Tree 1.5
289
+ npx golem-bridge scale Workspace/Tree 1.5
283
290
 
284
291
  **pivot** — move a model or part pivot (the point it rotates around). Give
285
292
  `--position`, `--orientation`, or both. After grouping a build, put the
286
293
  pivot at its base so rotations look right.
287
294
 
288
- golem.py pivot Workspace/Tree --position 0,0,0
295
+ npx golem-bridge pivot Workspace/Tree --position 0,0,0
289
296
 
290
297
  ### 4.7 Surfaces, terrain, and physics
291
298
 
@@ -293,95 +300,95 @@ pivot at its base so rotations look right.
293
300
  `SmoothPlastic`, ...), transparency, and reflectance on parts. Models: all
294
301
  their parts. Combine flags freely.
295
302
 
296
- golem.py paint Workspace/Wall --color #B0B0B0 --material SmoothPlastic
303
+ npx golem-bridge paint Workspace/Wall --color #B0B0B0 --material SmoothPlastic
297
304
 
298
305
  **match** — copy color, material, transparency, and reflectance from one
299
306
  part onto others. Keeps builds visually consistent.
300
307
 
301
- golem.py match Workspace/WallA Workspace/WallB Workspace/WallC
308
+ npx golem-bridge match Workspace/WallA Workspace/WallB Workspace/WallC
302
309
 
303
310
  **anchor** — anchor parts so physics never moves them (models: all parts).
304
311
  `--off` unanchors. Static builds should always be anchored.
305
312
 
306
- golem.py anchor Workspace/House
313
+ npx golem-bridge anchor Workspace/House
307
314
 
308
315
  **collide** — collision on or off (models: all parts). `--off` makes parts
309
316
  walk-through.
310
317
 
311
- golem.py collide Workspace/GhostWall --off
318
+ npx golem-bridge collide Workspace/GhostWall --off
312
319
 
313
320
  **terrain** — fill or carve terrain. `--position` is required; blocks need
314
321
  `--size`, balls need `--radius`. `--action clear` carves (fills with Air).
315
322
 
316
- golem.py terrain --action fill --shape block --position 0,-4,0 --size 128,8,128 --material Grass
323
+ npx golem-bridge terrain --action fill --shape block --position 0,-4,0 --size 128,8,128 --material Grass
317
324
 
318
325
  ### 4.8 Gameplay helpers
319
326
 
320
327
  **light** — add or update a light inside a part. Types: `point`, `spot`,
321
328
  `surface`.
322
329
 
323
- golem.py light Workspace/Lamp --type point --color #FFD9A0 --range 30 --brightness 2
330
+ npx golem-bridge light Workspace/Lamp --type point --color #FFD9A0 --range 30 --brightness 2
324
331
 
325
332
  **sound** — add a Sound to a parent. `--play` previews it immediately,
326
333
  `--loop` loops it.
327
334
 
328
- golem.py sound Workspace Radio 1837879082 --volume 0.5 --play
335
+ npx golem-bridge sound Workspace Radio 1837879082 --volume 0.5 --play
329
336
 
330
337
  **scatter** — clone a template into a random disc around it. Trees, rocks,
331
338
  grass: build one, scatter the rest.
332
339
 
333
- golem.py scatter Workspace/Tree --count 20 --radius 60 --y-jitter 2
340
+ npx golem-bridge scatter Workspace/Tree --count 20 --radius 60 --y-jitter 2
334
341
 
335
342
  **weld** — join a model's parts with WeldConstraints so the whole build
336
343
  moves as one.
337
344
 
338
- golem.py weld Workspace/Cart
345
+ npx golem-bridge weld Workspace/Cart
339
346
 
340
347
  **hitbox** — invisible part sized to the target's bounding box. Click and
341
348
  chop targets, interaction zones. `--collide` makes it solid.
342
349
 
343
- golem.py hitbox Workspace/Tree --padding 1
350
+ npx golem-bridge hitbox Workspace/Tree --padding 1
344
351
 
345
352
  **prompt** — ProximityPrompt ("Press E to ...") on a part. `--object` is
346
353
  the title above it, `--hold` the hold time in seconds.
347
354
 
348
- golem.py prompt Workspace/Tree "Chop" --object Tree --hold 0.5
355
+ npx golem-bridge prompt Workspace/Tree "Chop" --object Tree --hold 0.5
349
356
 
350
357
  **particles** — attach a ParticleEmitter with a preset: `leaves`, `sparks`,
351
358
  `smoke`, `magic`, `fire`, `snow`, `rain`, `bubbles`, `dust`, `confetti`,
352
359
  `fireflies`.
353
360
 
354
- golem.py particles Workspace/Torch fire --rate 40
361
+ npx golem-bridge particles Workspace/Torch fire --rate 40
355
362
 
356
363
  **sign** — a readable wooden sign: board part with text on its face.
357
364
 
358
- golem.py sign "Camp rules: no griefing" --position 0,6,10
365
+ npx golem-bridge sign "Camp rules: no griefing" --position 0,6,10
359
366
 
360
367
  **attr** — Studio attributes: typed config on instances without scripts.
361
368
  `--set` repeats; values parse as integer, float, `true`/`false`, or string.
362
369
 
363
- golem.py attr Workspace/Door --set Open=false --set LockLevel=3
370
+ npx golem-bridge attr Workspace/Door --set Open=false --set LockLevel=3
364
371
 
365
372
  **tag** — add or remove CollectionService tags. Find tagged instances later
366
373
  with `find --tag`.
367
374
 
368
- golem.py tag Workspace/Tree --add Choppable
375
+ npx golem-bridge tag Workspace/Tree --add Choppable
369
376
 
370
377
  ### 4.9 VFX
371
378
 
372
379
  **beam** — glowing beam between two parts. Lasers, tethers, energy links.
373
380
 
374
- golem.py beam Workspace/TowerA Workspace/TowerB --color #78B4FF --width 0.4
381
+ npx golem-bridge beam Workspace/TowerA Workspace/TowerB --color #78B4FF --width 0.4
375
382
 
376
383
  **trail** — motion trail on a part. Shows when the part moves: sword
377
384
  swipes, comet tails.
378
385
 
379
- golem.py trail Workspace/Sword --lifetime 0.6
386
+ npx golem-bridge trail Workspace/Sword --lifetime 0.6
380
387
 
381
388
  **explosion** — one-shot visual explosion. Harmless by default: no physics
382
389
  damage.
383
390
 
384
- golem.py explosion --position 0,10,0 --radius 8
391
+ npx golem-bridge explosion --position 0,10,0 --radius 8
385
392
 
386
393
  ### 4.10 UI — build interfaces as instances, not code
387
394
 
@@ -405,32 +412,32 @@ Positions and sizes use `"xs,xo,ys,yo"` (scale/offset pairs); anchors use
405
412
 
406
413
  **ui_screen** — ScreenGui under StarterGui. The root of every interface.
407
414
 
408
- golem.py ui_screen MainMenu
415
+ npx golem-bridge ui_screen MainMenu
409
416
 
410
417
  **ui_frame** — rounded panel, the backbone of screens.
411
418
 
412
- golem.py ui_frame StarterGui/MainMenu Panel --size 0.8,0,0.6,0 --radius 12
419
+ npx golem-bridge ui_frame StarterGui/MainMenu Panel --size 0.8,0,0.6,0 --radius 12
413
420
 
414
421
  **ui_label** — text label. Fonts: `regular`, `medium`, `semibold`, `bold`,
415
422
  `mono`.
416
423
 
417
- golem.py ui_label StarterGui/MainMenu/Panel Title --text "Item Shop" --font semibold --text-size 20
424
+ npx golem-bridge ui_label StarterGui/MainMenu/Panel Title --text "Item Shop" --font semibold --text-size 20
418
425
 
419
426
  **ui_button** — text button with hover feedback built in.
420
427
 
421
- golem.py ui_button StarterGui/MainMenu/Panel Buy --text "Buy"
428
+ npx golem-bridge ui_button StarterGui/MainMenu/Panel Buy --text "Buy"
422
429
 
423
430
  **ui_input** — TextBox the player can type into.
424
431
 
425
- golem.py ui_input StarterGui/MainMenu/Panel Name --placeholder "Your name..."
432
+ npx golem-bridge ui_input StarterGui/MainMenu/Panel Name --placeholder "Your name..."
426
433
 
427
434
  **ui_image** — ImageLabel showing a Roblox asset id.
428
435
 
429
- golem.py ui_image StarterGui/MainMenu/Panel Icon --asset 123456 --scale fit
436
+ npx golem-bridge ui_image StarterGui/MainMenu/Panel Icon --asset 123456 --scale fit
430
437
 
431
438
  **ui_list** — UIListLayout that auto-arranges a container's children.
432
439
 
433
- golem.py ui_list StarterGui/MainMenu/Panel --direction vertical --padding 8
440
+ npx golem-bridge ui_list StarterGui/MainMenu/Panel --direction vertical --padding 8
434
441
 
435
442
  ### 4.11 Marketplace — browse and add assets
436
443
 
@@ -443,23 +450,23 @@ Do not call them in a loop; cache results and page with `--cursor`.
443
450
  price, and a thumbnail URL. Open the thumbnail to judge the asset before
444
451
  inserting.
445
452
 
446
- golem.py search castle --category model --limit 5
453
+ npx golem-bridge search castle --category model --limit 5
447
454
 
448
455
  **info** — details plus thumbnail for one asset.
449
456
 
450
- golem.py info 487667385
457
+ npx golem-bridge info 487667385
451
458
 
452
459
  **insert** — place an asset into the open place. ONLY free assets
453
460
  (`priceInRobux` null or 0) or assets the user owns. Paid or restricted
454
461
  assets fail with "Asset is not trusted". If that happens, pick a different
455
462
  result.
456
463
 
457
- golem.py insert 487667385 Workspace --name "Castle Wall"
464
+ npx golem-bridge insert 487667385 Workspace --name "Castle Wall"
458
465
 
459
466
  **apply** — set an asset-backed property: `Image`, `Texture`, `SoundId`,
460
467
  `MeshId`, and similar.
461
468
 
462
- golem.py apply 123456 Workspace/Sign/Decal Texture
469
+ npx golem-bridge apply 123456 Workspace/Sign/Decal Texture
463
470
 
464
471
  Workflow: search, open thumbnails, `info` the shortlist, `insert`, verify
465
472
  with `tree`/`read`, set a `waypoint`. Tell the user what you added and
@@ -479,22 +486,22 @@ AND the client, live while the test runs. `--all` adds prints.
479
486
  Workflow: build, Ctrl+S, `play`, wait 10-20 s so scripts can run and fail,
480
487
  `logs`, fix every error, `stop`, save, re-test until clean.
481
488
 
482
- golem.py play
483
- golem.py logs
484
- golem.py stop
489
+ npx golem-bridge play
490
+ npx golem-bridge logs
491
+ npx golem-bridge stop
485
492
 
486
493
  ### 4.13 Session and talking to the user
487
494
 
488
495
  **waypoint** — named undo checkpoint ("one clean undo away"). Set one
489
496
  before risky edits and at every milestone.
490
497
 
491
- golem.py waypoint "before refactor"
498
+ npx golem-bridge waypoint "before refactor"
492
499
 
493
500
  **undo** — one Studio undo step. Edit mode only.
494
501
 
495
502
  **look** — aim the user's editor camera at your work so they see it.
496
503
 
497
- golem.py look Workspace/Castle --distance 60
504
+ npx golem-bridge look Workspace/Castle --distance 60
498
505
 
499
506
  **say** — post a message to the Studio chat AND close the turn. Only for
500
507
  finished chunks of work (see §0).
@@ -596,7 +603,7 @@ length along the X axis.** A vertical trunk needs `Orientation (0, 0, 90)`.
596
603
  Always set orientation when creating such parts. `create` accepts top-level
597
604
  `position` {x,y,z} and `orientation` {x,y,z} in degrees:
598
605
 
599
- golem.py 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}}}}'
606
+ 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}}}}'
600
607
 
601
608
  (Height 12 runs along X, so orientation (0,0,90) stands it up. Ball canopies
602
609
  need no orientation.)
@@ -667,6 +674,10 @@ become records). Yields like `task.wait(1)` are fine; never loop forever.
667
674
  - The channel id is a shared secret. Treat it like a password: anyone
668
675
  holding it can drive this Studio session through the relay. It rotates
669
676
  on every Studio restart, so a leaked line dies with the session.
677
+ - Results come back through the same relay. If a result ever looks
678
+ forged or nonsensical (data that contradicts what you just wrote),
679
+ stop and ask the user to rotate the channel (Settings > END SESSION
680
+ AND ROTATE CHANNEL) before acting on it.
670
681
 
671
682
  ## 10. End-of-reply checklist
672
683
 
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "golem-bridge",
3
- "version": "2.0.0",
3
+ "version": "3.0.0",
4
4
  "description": "Connects an AI coding agent to a running Roblox Studio session via the Golem plugin.",
5
5
  "bin": {
6
6
  "golem-bridge": "./cli.js"
7
7
  },
8
8
  "type": "commonjs",
9
- "files": ["cli.js", "golem.py", "golem.md", "README.md"],
9
+ "files": ["cli.js", "golem-tools.md", "README.md"],
10
10
  "keywords": ["roblox", "roblox-studio", "ai", "cli"],
11
11
  "engines": {
12
12
  "node": ">=18"