roblox-opencode 1.0.0 → 1.0.2
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 +112 -122
- package/commands/setup-game.md +108 -108
- package/commands/sync-check.md +53 -53
- package/core/roblox-core.md +93 -93
- package/dist/server.js +189 -167
- package/package.json +35 -35
- package/skills/roblox-analytics/SKILL.md +277 -277
- package/skills/roblox-analytics/references/event-batcher.luau +75 -75
- package/skills/roblox-animation-vfx/SKILL.md +1325 -1325
- package/skills/roblox-architecture/SKILL.md +877 -863
- package/skills/roblox-architecture/references/combat-systems.md +1381 -1381
- package/skills/roblox-code-review/SKILL.md +686 -686
- package/skills/roblox-data/SKILL.md +889 -889
- package/skills/roblox-data/references/inventory-systems.md +1729 -1729
- package/skills/roblox-debug/SKILL.md +98 -98
- package/skills/roblox-gui/SKILL.md +1103 -1103
- package/skills/roblox-gui-fusion/SKILL.md +150 -150
- package/skills/roblox-gui-fusion/references/inventory.luau +427 -427
- package/skills/roblox-gui-fusion/references/settings-menu.luau +579 -579
- package/skills/roblox-gui-fusion/references/shop.luau +411 -411
- package/skills/roblox-luau-mastery/SKILL.md +1618 -1519
- package/skills/roblox-monetization/SKILL.md +1084 -1084
- package/skills/roblox-monetization/references/process-receipt.luau +131 -131
- package/skills/roblox-networking/SKILL.md +669 -669
- package/skills/roblox-networking/references/remote-validator.luau +193 -193
- package/skills/roblox-publish-checklist/SKILL.md +127 -127
- package/skills/roblox-runtime/SKILL.md +753 -753
- package/skills/roblox-sharp-edges/SKILL.md +294 -294
- package/skills/roblox-sync/SKILL.md +126 -126
- package/skills/roblox-testing/SKILL.md +943 -943
- package/skills/roblox-tooling/SKILL.md +149 -149
- package/vendor/LICENSES/ProfileStore-LICENSE +201 -201
- package/vendor/LICENSES/RbxUtil-LICENSE +7 -7
- package/vendor/LICENSES/promise-LICENSE +20 -20
- package/vendor/LICENSES/t-LICENSE +21 -21
- package/vendor/LICENSES/testez-LICENSE +200 -200
- package/vendor/README.md +83 -83
- package/vendor/fusion/Animation/ExternalTime.luau +83 -83
- package/vendor/fusion/Animation/Spring.luau +321 -321
- package/vendor/fusion/Animation/Stopwatch.luau +127 -127
- package/vendor/fusion/Animation/Tween.luau +187 -187
- package/vendor/fusion/Animation/getTweenDuration.luau +27 -27
- package/vendor/fusion/Animation/getTweenRatio.luau +47 -47
- package/vendor/fusion/Animation/lerpType.luau +163 -163
- package/vendor/fusion/Animation/packType.luau +99 -99
- package/vendor/fusion/Animation/springCoefficients.luau +80 -80
- package/vendor/fusion/Animation/unpackType.luau +102 -102
- package/vendor/fusion/Colour/Oklab.luau +70 -70
- package/vendor/fusion/Colour/sRGB.luau +54 -54
- package/vendor/fusion/External.luau +167 -167
- package/vendor/fusion/ExternalDebug.luau +69 -69
- package/vendor/fusion/Graph/Observer.luau +113 -113
- package/vendor/fusion/Graph/castToGraph.luau +28 -28
- package/vendor/fusion/Graph/change.luau +80 -80
- package/vendor/fusion/Graph/depend.luau +32 -32
- package/vendor/fusion/Graph/evaluate.luau +55 -55
- package/vendor/fusion/Instances/Attribute.luau +57 -57
- package/vendor/fusion/Instances/AttributeChange.luau +46 -46
- package/vendor/fusion/Instances/AttributeOut.luau +63 -63
- package/vendor/fusion/Instances/Child.luau +21 -21
- package/vendor/fusion/Instances/Children.luau +147 -147
- package/vendor/fusion/Instances/Hydrate.luau +32 -32
- package/vendor/fusion/Instances/New.luau +52 -52
- package/vendor/fusion/Instances/OnChange.luau +49 -49
- package/vendor/fusion/Instances/OnEvent.luau +53 -53
- package/vendor/fusion/Instances/Out.luau +69 -69
- package/vendor/fusion/Instances/applyInstanceProps.luau +148 -148
- package/vendor/fusion/Instances/defaultProps.luau +194 -194
- package/vendor/fusion/LICENSE +21 -21
- package/vendor/fusion/Logging/formatError.luau +48 -48
- package/vendor/fusion/Logging/messages.luau +51 -51
- package/vendor/fusion/Logging/parseError.luau +24 -24
- package/vendor/fusion/Memory/checkLifetime.luau +133 -133
- package/vendor/fusion/Memory/deriveScope.luau +23 -23
- package/vendor/fusion/Memory/deriveScopeImpl.luau +44 -44
- package/vendor/fusion/Memory/doCleanup.luau +78 -78
- package/vendor/fusion/Memory/innerScope.luau +33 -33
- package/vendor/fusion/Memory/legacyCleanup.luau +17 -17
- package/vendor/fusion/Memory/needsDestruction.luau +16 -16
- package/vendor/fusion/Memory/poisonScope.luau +33 -33
- package/vendor/fusion/Memory/scopePool.luau +54 -54
- package/vendor/fusion/Memory/scoped.luau +26 -26
- package/vendor/fusion/Memory/whichLivesLonger.luau +74 -74
- package/vendor/fusion/RobloxExternal.luau +97 -97
- package/vendor/fusion/State/Computed.luau +138 -138
- package/vendor/fusion/State/For/Disassembly.luau +210 -210
- package/vendor/fusion/State/For/ForTypes.luau +30 -30
- package/vendor/fusion/State/For/init.luau +109 -109
- package/vendor/fusion/State/ForKeys.luau +93 -93
- package/vendor/fusion/State/ForPairs.luau +96 -96
- package/vendor/fusion/State/ForValues.luau +93 -93
- package/vendor/fusion/State/Value.luau +87 -87
- package/vendor/fusion/State/castToState.luau +25 -25
- package/vendor/fusion/State/peek.luau +30 -30
- package/vendor/fusion/Types.luau +314 -314
- package/vendor/fusion/Utility/Contextual.luau +90 -90
- package/vendor/fusion/Utility/Safe.luau +22 -22
- package/vendor/fusion/Utility/isSimilar.luau +29 -29
- package/vendor/fusion/Utility/merge.luau +35 -35
- package/vendor/fusion/Utility/nameOf.luau +34 -34
- package/vendor/fusion/Utility/never.luau +13 -13
- package/vendor/fusion/Utility/nicknames.luau +10 -10
- package/vendor/fusion/Utility/xtypeof.luau +26 -26
- package/vendor/fusion/init.luau +82 -82
- package/vendor/profilestore/init.luau +2242 -2242
- package/vendor/promise/init.luau +1982 -1982
- package/vendor/rbxutil/buffer-util/Buffer.test.luau +25 -25
- package/vendor/rbxutil/buffer-util/BufferReader.luau +228 -228
- package/vendor/rbxutil/buffer-util/BufferWriter.luau +269 -269
- package/vendor/rbxutil/buffer-util/DataTypeBuffer.luau +223 -223
- package/vendor/rbxutil/buffer-util/Types.luau +60 -60
- package/vendor/rbxutil/buffer-util/index.d.ts +153 -153
- package/vendor/rbxutil/buffer-util/init.luau +41 -41
- package/vendor/rbxutil/buffer-util/package.json +16 -16
- package/vendor/rbxutil/buffer-util/wally.toml +9 -9
- package/vendor/rbxutil/comm/Client/ClientComm.luau +232 -232
- package/vendor/rbxutil/comm/Client/ClientRemoteProperty.luau +156 -156
- package/vendor/rbxutil/comm/Client/ClientRemoteSignal.luau +109 -109
- package/vendor/rbxutil/comm/Client/init.luau +135 -135
- package/vendor/rbxutil/comm/Server/RemoteProperty.luau +295 -295
- package/vendor/rbxutil/comm/Server/RemoteSignal.luau +211 -211
- package/vendor/rbxutil/comm/Server/ServerComm.luau +211 -211
- package/vendor/rbxutil/comm/Server/init.luau +140 -140
- package/vendor/rbxutil/comm/Types.luau +18 -18
- package/vendor/rbxutil/comm/Util.luau +27 -27
- package/vendor/rbxutil/comm/init.luau +35 -35
- package/vendor/rbxutil/comm/wally.toml +13 -13
- package/vendor/rbxutil/component/init.luau +759 -759
- package/vendor/rbxutil/component/init.test.luau +311 -311
- package/vendor/rbxutil/component/wally.toml +14 -14
- package/vendor/rbxutil/concur/init.luau +542 -542
- package/vendor/rbxutil/concur/init.test.luau +364 -364
- package/vendor/rbxutil/concur/wally.toml +8 -8
- package/vendor/rbxutil/enum-list/init.luau +101 -101
- package/vendor/rbxutil/enum-list/init.test.luau +91 -91
- package/vendor/rbxutil/enum-list/wally.toml +8 -8
- package/vendor/rbxutil/find/index.d.ts +20 -20
- package/vendor/rbxutil/find/init.luau +44 -44
- package/vendor/rbxutil/find/package.json +17 -17
- package/vendor/rbxutil/find/wally.toml +8 -8
- package/vendor/rbxutil/input/Gamepad.luau +559 -559
- package/vendor/rbxutil/input/Keyboard.luau +124 -124
- package/vendor/rbxutil/input/Mouse.luau +278 -278
- package/vendor/rbxutil/input/PreferredInput.luau +91 -91
- package/vendor/rbxutil/input/Touch.luau +120 -120
- package/vendor/rbxutil/input/init.luau +33 -33
- package/vendor/rbxutil/input/wally.toml +12 -12
- package/vendor/rbxutil/loader/index.d.ts +15 -15
- package/vendor/rbxutil/loader/init.luau +137 -137
- package/vendor/rbxutil/loader/wally.toml +8 -8
- package/vendor/rbxutil/log/index.d.ts +38 -38
- package/vendor/rbxutil/log/init.luau +746 -746
- package/vendor/rbxutil/log/wally.toml +8 -8
- package/vendor/rbxutil/net/init.luau +190 -190
- package/vendor/rbxutil/net/wally.toml +8 -8
- package/vendor/rbxutil/option/index.d.ts +44 -44
- package/vendor/rbxutil/option/init.luau +489 -489
- package/vendor/rbxutil/option/init.test.luau +342 -342
- package/vendor/rbxutil/option/wally.toml +8 -8
- package/vendor/rbxutil/pid/index.d.ts +53 -53
- package/vendor/rbxutil/pid/init.luau +195 -195
- package/vendor/rbxutil/pid/package.json +16 -16
- package/vendor/rbxutil/pid/wally.toml +9 -9
- package/vendor/rbxutil/quaternion/index.d.ts +117 -117
- package/vendor/rbxutil/quaternion/init.luau +570 -570
- package/vendor/rbxutil/quaternion/package.json +16 -16
- package/vendor/rbxutil/quaternion/wally.toml +9 -9
- package/vendor/rbxutil/query/index.d.ts +43 -43
- package/vendor/rbxutil/query/init.luau +117 -117
- package/vendor/rbxutil/query/package.json +18 -18
- package/vendor/rbxutil/query/wally.toml +9 -9
- package/vendor/rbxutil/sequent/index.d.ts +28 -28
- package/vendor/rbxutil/sequent/init.luau +340 -340
- package/vendor/rbxutil/sequent/package.json +16 -16
- package/vendor/rbxutil/sequent/wally.toml +9 -9
- package/vendor/rbxutil/ser/init.luau +175 -175
- package/vendor/rbxutil/ser/init.test.luau +50 -50
- package/vendor/rbxutil/ser/wally.toml +11 -11
- package/vendor/rbxutil/shake/index.d.ts +36 -36
- package/vendor/rbxutil/shake/init.luau +532 -532
- package/vendor/rbxutil/shake/init.test.luau +267 -267
- package/vendor/rbxutil/shake/package.json +16 -16
- package/vendor/rbxutil/shake/wally.toml +9 -9
- package/vendor/rbxutil/signal/index.d.ts +100 -100
- package/vendor/rbxutil/signal/init.luau +432 -432
- package/vendor/rbxutil/signal/init.test.luau +190 -190
- package/vendor/rbxutil/signal/package.json +17 -17
- package/vendor/rbxutil/signal/wally.toml +9 -9
- package/vendor/rbxutil/silo/TableWatcher.luau +65 -65
- package/vendor/rbxutil/silo/Util.luau +55 -55
- package/vendor/rbxutil/silo/init.luau +338 -338
- package/vendor/rbxutil/silo/init.test.luau +215 -215
- package/vendor/rbxutil/silo/wally.toml +8 -8
- package/vendor/rbxutil/spring/index.d.ts +40 -40
- package/vendor/rbxutil/spring/init.luau +97 -97
- package/vendor/rbxutil/spring/package.json +17 -17
- package/vendor/rbxutil/spring/wally.toml +8 -8
- package/vendor/rbxutil/stream/index.d.ts +88 -88
- package/vendor/rbxutil/stream/init.luau +597 -597
- package/vendor/rbxutil/stream/package.json +18 -18
- package/vendor/rbxutil/stream/wally.toml +9 -9
- package/vendor/rbxutil/streamable/Streamable.luau +202 -202
- package/vendor/rbxutil/streamable/StreamableUtil.luau +80 -80
- package/vendor/rbxutil/streamable/init.luau +8 -8
- package/vendor/rbxutil/streamable/wally.toml +12 -12
- package/vendor/rbxutil/symbol/init.luau +56 -56
- package/vendor/rbxutil/symbol/init.test.luau +37 -37
- package/vendor/rbxutil/symbol/wally.toml +8 -8
- package/vendor/rbxutil/table-util/init.luau +938 -938
- package/vendor/rbxutil/table-util/init.test.luau +439 -439
- package/vendor/rbxutil/task-queue/index.d.ts +27 -27
- package/vendor/rbxutil/task-queue/init.luau +97 -97
- package/vendor/rbxutil/task-queue/wally.toml +8 -8
- package/vendor/rbxutil/timer/index.d.ts +81 -81
- package/vendor/rbxutil/timer/init.luau +249 -249
- package/vendor/rbxutil/timer/init.test.luau +73 -73
- package/vendor/rbxutil/timer/wally.toml +11 -11
- package/vendor/rbxutil/tree/index.d.ts +15 -15
- package/vendor/rbxutil/tree/init.luau +137 -137
- package/vendor/rbxutil/tree/wally.toml +8 -8
- package/vendor/rbxutil/trove/index.d.ts +46 -46
- package/vendor/rbxutil/trove/init.luau +787 -787
- package/vendor/rbxutil/trove/init.test.luau +203 -203
- package/vendor/rbxutil/trove/wally.toml +8 -8
- package/vendor/rbxutil/typed-remote/init.luau +196 -196
- package/vendor/rbxutil/typed-remote/wally.toml +8 -8
- package/vendor/rbxutil/wait-for/index.d.ts +17 -17
- package/vendor/rbxutil/wait-for/init.luau +257 -257
- package/vendor/rbxutil/wait-for/init.test.luau +182 -182
- package/vendor/rbxutil/wait-for/wally.toml +11 -11
- package/vendor/t/t.lua +1350 -1350
- package/vendor/testez/Context.lua +26 -26
- package/vendor/testez/Expectation.lua +311 -311
- package/vendor/testez/ExpectationContext.lua +38 -38
- package/vendor/testez/LifecycleHooks.lua +89 -89
- package/vendor/testez/Reporters/TeamCityReporter.lua +101 -101
- package/vendor/testez/Reporters/TextReporter.lua +105 -105
- package/vendor/testez/Reporters/TextReporterQuiet.lua +96 -96
- package/vendor/testez/TestBootstrap.lua +146 -146
- package/vendor/testez/TestEnum.lua +27 -27
- package/vendor/testez/TestPlan.lua +304 -304
- package/vendor/testez/TestPlanner.lua +39 -39
- package/vendor/testez/TestResults.lua +111 -111
- package/vendor/testez/TestRunner.lua +188 -188
- package/vendor/testez/TestSession.lua +243 -243
- package/vendor/testez/init.lua +39 -39
|
@@ -1,150 +1,150 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: roblox-tooling
|
|
3
|
-
description: >
|
|
4
|
-
Built-in Studio MCP orchestration, luau-lsp integration, mcp-roblox-docs usage.
|
|
5
|
-
How the AI drives Studio directly.
|
|
6
|
-
last_reviewed: 2026-05-22
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
<!-- Source: brockmartin/roblox-game-skill (MIT), rewritten for built-in MCP only -->
|
|
10
|
-
|
|
11
|
-
# Roblox Tooling Reference
|
|
12
|
-
|
|
13
|
-
## Overview
|
|
14
|
-
|
|
15
|
-
Load this reference when:
|
|
16
|
-
|
|
17
|
-
- Performing MCP operations (executing Luau, reading/writing instances, managing assets)
|
|
18
|
-
- Autonomous building (scaffolding game structure, generating systems, iterating)
|
|
19
|
-
- Debugging via Studio (reading console output, tracing errors, applying fixes)
|
|
20
|
-
- Project exploration (understanding an existing place file's architecture)
|
|
21
|
-
|
|
22
|
-
This covers the built-in Studio MCP server, mcp-roblox-docs for API lookup, luau-lsp for diagnostics, and offline workflows.
|
|
23
|
-
|
|
24
|
-
## luau-lsp (Agent-Side Diagnostics)
|
|
25
|
-
|
|
26
|
-
The internal `luau-check` extension hooks `.luau` file writes and runs `luau-lsp analyze` automatically. Diagnostics inject into the next agent turn.
|
|
27
|
-
|
|
28
|
-
Agent uses the CLI binary. The VS Code extension and Studio Companion Plugin are for humans, not agent onboarding.
|
|
29
|
-
|
|
30
|
-
```
|
|
31
|
-
luau-lsp analyze path/to/file.luau --formatter plain
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
Output format: `path.luau:line:col severity: message`
|
|
35
|
-
|
|
36
|
-
Soft gate at handoff: do not claim "done" with unresolved error-level diagnostics.
|
|
37
|
-
|
|
38
|
-
## mcp-roblox-docs (API Reference)
|
|
39
|
-
|
|
40
|
-
Live API lookup via MCP. Registered during /setup if `uvx` is available.
|
|
41
|
-
|
|
42
|
-
Use for: class members, properties, methods, events, enums, FastFlags. Never enumerate these in skills.
|
|
43
|
-
|
|
44
|
-
## Built-in Studio MCP (6 Tools)
|
|
45
|
-
|
|
46
|
-
The official Roblox MCP server ships with Studio. No install required. Enable via the Assistant widget (View → Assistant → MCP toggle).
|
|
47
|
-
|
|
48
|
-
| Tool | Purpose | Notes |
|
|
49
|
-
|------|---------|-------|
|
|
50
|
-
| `run_code` | Execute Luau inside Studio | Primary workhorse for all operations |
|
|
51
|
-
| `insert_model` | Insert a model from Creator Store | Takes asset ID, inserts into Workspace |
|
|
52
|
-
| `get_console_output` | Read Studio output/console log | Error detection and debug loops |
|
|
53
|
-
| `start_stop_play` | Toggle playtest mode | Single tool handles both start and stop |
|
|
54
|
-
| `run_script_in_play_mode` | Execute code during playtest | Stops playtest when script finishes |
|
|
55
|
-
| `get_studio_mode` | Check Edit vs Play mode | Always call before mode-sensitive ops |
|
|
56
|
-
|
|
57
|
-
### Workflow Adaptations
|
|
58
|
-
|
|
59
|
-
Since the built-in server lacks exploration tools (`get_file_tree`, `grep_scripts`), compensate with `run_code`:
|
|
60
|
-
|
|
61
|
-
```luau
|
|
62
|
-
-- Traverse DataModel and print structure
|
|
63
|
-
local function printTree(instance, depth)
|
|
64
|
-
depth = depth or 0
|
|
65
|
-
local indent = string.rep(" ", depth)
|
|
66
|
-
print(`{indent}{instance.Name} [{instance.ClassName}]`)
|
|
67
|
-
for _, child in instance:GetChildren() do
|
|
68
|
-
printTree(child, depth + 1)
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
printTree(game:GetService("ServerScriptService"), 0)
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
Read results via `get_console_output`. Build search logic inline via `run_code` instead of relying on dedicated search tools.
|
|
75
|
-
|
|
76
|
-
## Offline Mode
|
|
77
|
-
|
|
78
|
-
When no MCP server is connected, generate self-contained Luau code blocks for copy-paste into Studio.
|
|
79
|
-
|
|
80
|
-
### Conventions
|
|
81
|
-
|
|
82
|
-
- Label every script block with its target service/folder and script type
|
|
83
|
-
- Group related scripts with section headers
|
|
84
|
-
- Provide a setup checklist listing manual steps (e.g., "Create a RemoteEvent named 'DamageEvent' in ReplicatedStorage")
|
|
85
|
-
|
|
86
|
-
## Orchestration Patterns
|
|
87
|
-
|
|
88
|
-
### Autonomous Build
|
|
89
|
-
|
|
90
|
-
1. **SCAFFOLD** - `run_code` to print current hierarchy → plan structure → `run_code` to create folders/instances
|
|
91
|
-
2. **GENERATE** - For each system: `run_code` to create Script/LocalScript/ModuleScript instances, wire RemoteEvents
|
|
92
|
-
3. **INSERT ASSETS** - `insert_model` for Creator Store assets, position via `run_code`
|
|
93
|
-
4. **TEST** - `start_stop_play` → `get_console_output` → `start_stop_play` to stop
|
|
94
|
-
5. **ITERATE** - Fix errors → return to step 4 (max 5 iterations)
|
|
95
|
-
|
|
96
|
-
### Debug Loop
|
|
97
|
-
|
|
98
|
-
Bounded retries (max 5 iterations):
|
|
99
|
-
|
|
100
|
-
1. **DETECT** - `get_console_output` → parse for script name, line, error type
|
|
101
|
-
2. **LOCATE** - `run_code` to print script source → analyze root cause
|
|
102
|
-
3. **FIX** - Generate corrected code → `run_code` to replace script source (create undo waypoint first)
|
|
103
|
-
4. **VERIFY** - `start_stop_play` → `get_console_output` → check if error persists
|
|
104
|
-
5. **ITERATE** - If persists and attempts < 5 → step 2; if resolved → report; if ≥ 5 → report findings
|
|
105
|
-
|
|
106
|
-
### Project Exploration
|
|
107
|
-
|
|
108
|
-
1. **STRUCTURE** - `run_code` to traverse and print full hierarchy
|
|
109
|
-
2. **SCRIPTS** - `run_code` to find all Script/LocalScript/ModuleScript instances, print sources of key scripts
|
|
110
|
-
3. **ARCHITECTURE** - Map module dependencies, remotes, data flow from printed output
|
|
111
|
-
4. **REPORT** - Summarize services, script count, architecture, potential issues
|
|
112
|
-
|
|
113
|
-
## Safety Guidelines
|
|
114
|
-
|
|
115
|
-
### Pre-Operation Checks
|
|
116
|
-
|
|
117
|
-
1. **Check Studio mode** - call `get_studio_mode` before any operation. Do not modify DataModel during playtest.
|
|
118
|
-
2. **Create undo waypoints** before bulk or destructive operations:
|
|
119
|
-
```luau
|
|
120
|
-
game:GetService("ChangeHistoryService"):SetWaypoint("Before: description")
|
|
121
|
-
```
|
|
122
|
-
3. **Read before write** - inspect script source before overwriting.
|
|
123
|
-
4. **Verify instance existence** - check target path resolves before modifying.
|
|
124
|
-
|
|
125
|
-
### Destructive Operation Safeguards
|
|
126
|
-
|
|
127
|
-
- Deleting instances: confirm with user before `:Destroy()` on named/significant instances.
|
|
128
|
-
- Overwriting scripts: log previous source before replacing.
|
|
129
|
-
- Clearing containers: never `:ClearAllChildren()` on services without explicit user confirmation.
|
|
130
|
-
|
|
131
|
-
### Playtest Safety
|
|
132
|
-
|
|
133
|
-
- Do not modify DataModel while playtest is active (changes lost when playtest ends).
|
|
134
|
-
- Use `run_script_in_play_mode` for runtime testing during play mode.
|
|
135
|
-
- Always stop playtest before applying fixes.
|
|
136
|
-
|
|
137
|
-
## Best Practices
|
|
138
|
-
|
|
139
|
-
- Batch related reads/writes in a single `run_code` call to minimize round-trips.
|
|
140
|
-
- Always read script source before modifying; apply targeted changes, not blind overwrites.
|
|
141
|
-
- After modification, verify with `get_console_output` or a playtest.
|
|
142
|
-
- Create `ChangeHistoryService:SetWaypoint()` before batches or experimental changes.
|
|
143
|
-
|
|
144
|
-
## Anti-Patterns
|
|
145
|
-
|
|
146
|
-
- Running code without checking Studio state → always `get_studio_mode` first
|
|
147
|
-
- Bulk changes without undo points → set waypoint before any destructive operation
|
|
148
|
-
- Blind script overwrites → read source first, merge or confirm replacement
|
|
149
|
-
- Ignoring error output → always check console, enter debug loop on errors
|
|
1
|
+
---
|
|
2
|
+
name: roblox-tooling
|
|
3
|
+
description: >
|
|
4
|
+
Built-in Studio MCP orchestration, luau-lsp integration, mcp-roblox-docs usage.
|
|
5
|
+
How the AI drives Studio directly.
|
|
6
|
+
last_reviewed: 2026-05-22
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
<!-- Source: brockmartin/roblox-game-skill (MIT), rewritten for built-in MCP only -->
|
|
10
|
+
|
|
11
|
+
# Roblox Tooling Reference
|
|
12
|
+
|
|
13
|
+
## Overview
|
|
14
|
+
|
|
15
|
+
Load this reference when:
|
|
16
|
+
|
|
17
|
+
- Performing MCP operations (executing Luau, reading/writing instances, managing assets)
|
|
18
|
+
- Autonomous building (scaffolding game structure, generating systems, iterating)
|
|
19
|
+
- Debugging via Studio (reading console output, tracing errors, applying fixes)
|
|
20
|
+
- Project exploration (understanding an existing place file's architecture)
|
|
21
|
+
|
|
22
|
+
This covers the built-in Studio MCP server, mcp-roblox-docs for API lookup, luau-lsp for diagnostics, and offline workflows.
|
|
23
|
+
|
|
24
|
+
## luau-lsp (Agent-Side Diagnostics)
|
|
25
|
+
|
|
26
|
+
The internal `luau-check` extension hooks `.luau` file writes and runs `luau-lsp analyze` automatically. Diagnostics inject into the next agent turn.
|
|
27
|
+
|
|
28
|
+
Agent uses the CLI binary. The VS Code extension and Studio Companion Plugin are for humans, not agent onboarding.
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
luau-lsp analyze path/to/file.luau --formatter plain
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Output format: `path.luau:line:col severity: message`
|
|
35
|
+
|
|
36
|
+
Soft gate at handoff: do not claim "done" with unresolved error-level diagnostics.
|
|
37
|
+
|
|
38
|
+
## mcp-roblox-docs (API Reference)
|
|
39
|
+
|
|
40
|
+
Live API lookup via MCP. Registered during /setup if `uvx` is available.
|
|
41
|
+
|
|
42
|
+
Use for: class members, properties, methods, events, enums, FastFlags. Never enumerate these in skills.
|
|
43
|
+
|
|
44
|
+
## Built-in Studio MCP (6 Tools)
|
|
45
|
+
|
|
46
|
+
The official Roblox MCP server ships with Studio. No install required. Enable via the Assistant widget (View → Assistant → MCP toggle).
|
|
47
|
+
|
|
48
|
+
| Tool | Purpose | Notes |
|
|
49
|
+
|------|---------|-------|
|
|
50
|
+
| `run_code` | Execute Luau inside Studio | Primary workhorse for all operations |
|
|
51
|
+
| `insert_model` | Insert a model from Creator Store | Takes asset ID, inserts into Workspace |
|
|
52
|
+
| `get_console_output` | Read Studio output/console log | Error detection and debug loops |
|
|
53
|
+
| `start_stop_play` | Toggle playtest mode | Single tool handles both start and stop |
|
|
54
|
+
| `run_script_in_play_mode` | Execute code during playtest | Stops playtest when script finishes |
|
|
55
|
+
| `get_studio_mode` | Check Edit vs Play mode | Always call before mode-sensitive ops |
|
|
56
|
+
|
|
57
|
+
### Workflow Adaptations
|
|
58
|
+
|
|
59
|
+
Since the built-in server lacks exploration tools (`get_file_tree`, `grep_scripts`), compensate with `run_code`:
|
|
60
|
+
|
|
61
|
+
```luau
|
|
62
|
+
-- Traverse DataModel and print structure
|
|
63
|
+
local function printTree(instance, depth)
|
|
64
|
+
depth = depth or 0
|
|
65
|
+
local indent = string.rep(" ", depth)
|
|
66
|
+
print(`{indent}{instance.Name} [{instance.ClassName}]`)
|
|
67
|
+
for _, child in instance:GetChildren() do
|
|
68
|
+
printTree(child, depth + 1)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
printTree(game:GetService("ServerScriptService"), 0)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Read results via `get_console_output`. Build search logic inline via `run_code` instead of relying on dedicated search tools.
|
|
75
|
+
|
|
76
|
+
## Offline Mode
|
|
77
|
+
|
|
78
|
+
When no MCP server is connected, generate self-contained Luau code blocks for copy-paste into Studio.
|
|
79
|
+
|
|
80
|
+
### Conventions
|
|
81
|
+
|
|
82
|
+
- Label every script block with its target service/folder and script type
|
|
83
|
+
- Group related scripts with section headers
|
|
84
|
+
- Provide a setup checklist listing manual steps (e.g., "Create a RemoteEvent named 'DamageEvent' in ReplicatedStorage")
|
|
85
|
+
|
|
86
|
+
## Orchestration Patterns
|
|
87
|
+
|
|
88
|
+
### Autonomous Build
|
|
89
|
+
|
|
90
|
+
1. **SCAFFOLD** - `run_code` to print current hierarchy → plan structure → `run_code` to create folders/instances
|
|
91
|
+
2. **GENERATE** - For each system: `run_code` to create Script/LocalScript/ModuleScript instances, wire RemoteEvents
|
|
92
|
+
3. **INSERT ASSETS** - `insert_model` for Creator Store assets, position via `run_code`
|
|
93
|
+
4. **TEST** - `start_stop_play` → `get_console_output` → `start_stop_play` to stop
|
|
94
|
+
5. **ITERATE** - Fix errors → return to step 4 (max 5 iterations)
|
|
95
|
+
|
|
96
|
+
### Debug Loop
|
|
97
|
+
|
|
98
|
+
Bounded retries (max 5 iterations):
|
|
99
|
+
|
|
100
|
+
1. **DETECT** - `get_console_output` → parse for script name, line, error type
|
|
101
|
+
2. **LOCATE** - `run_code` to print script source → analyze root cause
|
|
102
|
+
3. **FIX** - Generate corrected code → `run_code` to replace script source (create undo waypoint first)
|
|
103
|
+
4. **VERIFY** - `start_stop_play` → `get_console_output` → check if error persists
|
|
104
|
+
5. **ITERATE** - If persists and attempts < 5 → step 2; if resolved → report; if ≥ 5 → report findings
|
|
105
|
+
|
|
106
|
+
### Project Exploration
|
|
107
|
+
|
|
108
|
+
1. **STRUCTURE** - `run_code` to traverse and print full hierarchy
|
|
109
|
+
2. **SCRIPTS** - `run_code` to find all Script/LocalScript/ModuleScript instances, print sources of key scripts
|
|
110
|
+
3. **ARCHITECTURE** - Map module dependencies, remotes, data flow from printed output
|
|
111
|
+
4. **REPORT** - Summarize services, script count, architecture, potential issues
|
|
112
|
+
|
|
113
|
+
## Safety Guidelines
|
|
114
|
+
|
|
115
|
+
### Pre-Operation Checks
|
|
116
|
+
|
|
117
|
+
1. **Check Studio mode** - call `get_studio_mode` before any operation. Do not modify DataModel during playtest.
|
|
118
|
+
2. **Create undo waypoints** before bulk or destructive operations:
|
|
119
|
+
```luau
|
|
120
|
+
game:GetService("ChangeHistoryService"):SetWaypoint("Before: description")
|
|
121
|
+
```
|
|
122
|
+
3. **Read before write** - inspect script source before overwriting.
|
|
123
|
+
4. **Verify instance existence** - check target path resolves before modifying.
|
|
124
|
+
|
|
125
|
+
### Destructive Operation Safeguards
|
|
126
|
+
|
|
127
|
+
- Deleting instances: confirm with user before `:Destroy()` on named/significant instances.
|
|
128
|
+
- Overwriting scripts: log previous source before replacing.
|
|
129
|
+
- Clearing containers: never `:ClearAllChildren()` on services without explicit user confirmation.
|
|
130
|
+
|
|
131
|
+
### Playtest Safety
|
|
132
|
+
|
|
133
|
+
- Do not modify DataModel while playtest is active (changes lost when playtest ends).
|
|
134
|
+
- Use `run_script_in_play_mode` for runtime testing during play mode.
|
|
135
|
+
- Always stop playtest before applying fixes.
|
|
136
|
+
|
|
137
|
+
## Best Practices
|
|
138
|
+
|
|
139
|
+
- Batch related reads/writes in a single `run_code` call to minimize round-trips.
|
|
140
|
+
- Always read script source before modifying; apply targeted changes, not blind overwrites.
|
|
141
|
+
- After modification, verify with `get_console_output` or a playtest.
|
|
142
|
+
- Create `ChangeHistoryService:SetWaypoint()` before batches or experimental changes.
|
|
143
|
+
|
|
144
|
+
## Anti-Patterns
|
|
145
|
+
|
|
146
|
+
- Running code without checking Studio state → always `get_studio_mode` first
|
|
147
|
+
- Bulk changes without undo points → set waypoint before any destructive operation
|
|
148
|
+
- Blind script overwrites → read source first, merge or confirm replacement
|
|
149
|
+
- Ignoring error output → always check console, enter debug loop on errors
|
|
150
150
|
- Using third-party MCP servers → built-in only, no boshyxd or community servers
|