dominus-cli 2.0.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,195 @@
1
+ # Changelog
2
+
3
+ ## 2.1.1 (2026-07-13)
4
+
5
+ ### Studio connection reliability
6
+
7
+ - Made pending WebStream connection attempts cancellable so overlapping retries
8
+ cannot strand a waiting coroutine or deadlock future reconnects.
9
+ - Serialized reconnect attempts and reset failed open transports explicitly.
10
+ - Changed the Dominus 2 toolbar button to always force an immediate reconnect
11
+ instead of toggling automatic reconnection off.
12
+
13
+ ### Typed mutations and packaging
14
+
15
+ - Fixed valid Enum values such as `Slate`, `Wood`, `Glass`, and `Ball` being
16
+ rejected by resolving names against the live Enum type's items.
17
+ - Removed the stale binary `.rbxm` build artifact. The package and installer now
18
+ use the single canonical `.rbxmx` plugin build.
19
+ - Corrected documentation to describe the 16-tool MCP catalog and optional Studio
20
+ restart behavior.
21
+
22
+ ## 2.1.0 (2026-07-12)
23
+
24
+ Dominus has been rewritten as an MCP-first Roblox Studio engineering server.
25
+
26
+ ### MCP-native agent harness
27
+
28
+ - Removed the Ink/TUI command from the published binaries. Dominus now relies on
29
+ the MCP host's model, context, consent UI, and agent runtime.
30
+ - Replaced the monolithic legacy catalog with 16 focused tools for connection
31
+ management, inspection, transactional changes, UI, scripts, tests, and docs.
32
+ - Added strict input schemas, output schemas, `structuredContent`, text fallbacks,
33
+ `isError`, and accurate read-only/destructive/idempotent/open-world annotations.
34
+ - Added the `dominus-workflow` MCP prompt and `dominus://status` resource.
35
+ - Added explicit inspect, plan, apply, read-back, and test instructions, including
36
+ UI fidelity checks for fonts, UDim2 values, colors, strokes, and hierarchy.
37
+ - Updated the official MCP TypeScript SDK from 1.27.0 to 1.29.0.
38
+
39
+ ### Secure Studio bridge
40
+
41
+ - Bound the WebSocket bridge to `127.0.0.1` instead of every network interface.
42
+ - Added a persistent 256-bit bridge token that is provisioned directly into the
43
+ local plugin by `dominus-install-plugin`; users do not complete a pairing flow.
44
+ - Authenticated relay/controller processes as well as Studio plugin connections.
45
+ - Added one MiB payload limits, socket rate limits, handshake timeouts, bounded
46
+ request timeouts, and strict message-envelope validation.
47
+ - Removed arbitrary `run_code` from the MCP surface and removed the plugin's
48
+ `loadstring` executor from the packaged model.
49
+ - Isolated in-flight requests to the exact Studio WebSocket that owns them;
50
+ wrong-session responses are ignored and one disconnect cannot cancel another
51
+ session's work.
52
+
53
+ ### Multi-Studio correctness
54
+
55
+ - Replaced place-ID targeting with unique connection IDs. Multiple windows on the
56
+ same place ID are now safe and independently selectable.
57
+ - Relay clients carry their selected connection on each request, so separate MCP
58
+ processes cannot overwrite each other's active target.
59
+ - Added `dominus_status` and `dominus_select_studio`.
60
+
61
+ ### Studio plugin harness
62
+
63
+ - Replaced the broken ten-port scanner with one configurable loopback endpoint and
64
+ exponential reconnect backoff.
65
+ - `WsClient` now waits for the real `WebStreamClient.Opened` event and handles
66
+ `Error`, `Closed`, timeouts, stale attempts, and signal cleanup correctly.
67
+ - Added a strict command allowlist and bounded command router.
68
+ - Added session-scoped instance references with path-segment fallback. Dots and
69
+ duplicate sibling names are no longer silently misresolved.
70
+ - Updated ReflectionService integration to current `Type`, `Display`, and `Permits`
71
+ fields.
72
+ - Added typed Roblox value encoding/decoding with surfaced property failures.
73
+ - Added atomic mutation batches backed by ChangeHistoryService recordings. Failed
74
+ batches cancel and automatically undo in-progress work.
75
+ - UI trees are fully built and validated off-tree before an existing UI is
76
+ replaced. Ambiguous replacements and silent property failures are rejected.
77
+ - Script reads return a revision hash; writes require it and reject stale edits.
78
+ - Studio tests now use bounded Run, Play, or Multiplayer StudioTestService flows,
79
+ reject overlapping runs, and leave timed-out sessions.
80
+ - Output forwarding excludes all Dominus-prefixed messages, closing the previous
81
+ WebSocket warning feedback loop.
82
+
83
+ ### Packaging and tests
84
+
85
+ - Added the `dominus-install-plugin` executable and fixed the previously missing
86
+ installer implementation.
87
+ - The published runtime dependency set is MCP-only; old CLI dependencies are
88
+ development-only and excluded from the MCP bundle.
89
+ - Added transport tests for auth, credential rejection, relays, duplicate places, wrong-target
90
+ responses, and disconnect isolation.
91
+ - Added in-memory MCP conformance tests for the tool catalog, structured outputs,
92
+ resources, prompts, routing, and error results.
93
+ - Added static plugin hardening tests and Rojo package verification.
94
+
95
+ ### Breaking changes
96
+
97
+ - The `dominus` TUI command is removed. Configure `dominus-mcp` in an MCP host.
98
+ - Legacy tool names such as `run_code`, `set_properties`, and `create_ui` are
99
+ replaced by the v2 tool catalog.
100
+ - Dot-separated instance paths are replaced by instance refs containing
101
+ `instanceId` and/or `pathSegments`.
102
+ - Script updates require `expectedRevision` from `studio_read_script`.
103
+ - Existing UI is not replaced unless `replaceExisting: true` is supplied.
104
+
105
+ ## 0.5.5 (2026-04-23)
106
+
107
+ ### New MCP Tools (30 total, up from 24)
108
+
109
+ - **`move_instance`** — Reparent an instance preserving all descendants. Sets ChangeHistoryService waypoint.
110
+ - **`bulk_set_properties`** — Set properties on multiple instances in one call. Explicit paths or className filter mode.
111
+ - **`find_replace_scripts`** — Find and replace across all scripts with optional Lua pattern matching and dry run preview.
112
+ - **`undo`** — Undo last action (ChangeHistoryService). Like Ctrl+Z.
113
+ - **`redo`** — Redo last undone action. Like Ctrl+Y.
114
+
115
+ ### Improvements
116
+
117
+ - **`get_properties` now supports compact mode** — Same filtering as `get_descendants_properties`. Strips read-only, nil, deprecated, and default-valued properties by default. The previous version returned all ~50 properties per instance even though most were noise.
118
+ - **Fixed code injection in `clone_instance`, `group_instances`, `build_multiple`** — Instance names and paths with special characters (quotes, backslashes) no longer break generated Luau code.
119
+ - **`build_multiple` now supports `rgb()` colors and `canCollide`** — Previously only handled `#hex` and BrickColor names; `rgb(255,0,0)` would silently fail.
120
+ - **Better tool descriptions** — More specific descriptions help AI models pick the right tool. `get_properties` disambiguates vs `serialize_ui` and `get_descendants_properties`.
121
+ - **Shared `luaStr()` and `resolvePath()` helpers** — Centralized safe string generation for all code-gen tools.
122
+
123
+ ## 0.5.4 (2026-04-23)
124
+
125
+ ### Fixes
126
+
127
+ - **Rebuilt plugin** — 0.5.3 shipped a stale `Dominus.rbxm` missing the compact property filtering and protocol changes. This release includes the correctly built plugin.
128
+
129
+ ## 0.5.3 (2026-04-23)
130
+
131
+ ### Improvements
132
+
133
+ - **Compact `get_descendants_properties`** — Now strips read-only, nil, deprecated, and default-valued properties by default, reducing response size by ~80%. Pass `compact: false` for the full dump.
134
+ - **`serialize_ui` exposed as MCP tool** — Was previously only in the internal tool registry. Now available to all MCP clients (Copilot, Cursor, Claude, etc.) for converting existing Roblox UI into clean JSON trees.
135
+ - **UI → Roact/React conversion guidance** — System prompt and internal memory now teach the agent the full workflow: `serialize_ui` → JSON tree → Roact/React component with correct type mappings (UDim2, Color3, Vector2, enums, FontFace).
136
+ - **Smarter tool selection** — Agent now prefers `serialize_ui` over `get_descendants_properties` for UI conversion tasks, avoiding context bloat.
137
+
138
+ ## 0.2.1 (2026-02-24)
139
+
140
+ ### New
141
+
142
+ - **Auto-update checker** — On startup, Dominus checks npm for newer versions
143
+ and prints an upgrade notice. Cached for 4 hours, non-blocking, never throws.
144
+
145
+ ### Bug Fixes
146
+
147
+ - **MCP server crashes on EADDRINUSE** — `dominus mcp` would crash if port 18088
148
+ was already held by a running `dominus start` (or another MCP instance). The MCP
149
+ server now checks for an existing listener and connects as a relay client instead
150
+ of trying to bind the same port.
151
+
152
+ ### New MCP Tools (22 total, up from 14)
153
+
154
+ - **`get_class_info`** — Look up the full schema of any Roblox class via
155
+ ReflectionService (properties, methods, events with types).
156
+ - **`create_ui`** — Create an entire UI tree in one call with a declarative JSON
157
+ spec. Auto-coerces UDim2, Color3, Font, and enums. ~10x faster than `run_code`.
158
+ - **`create_part`** — One-call Part creation with position, size, color, material,
159
+ shape, transparency, anchored, and collision settings.
160
+ - **`clone_instance`** — Clone an instance with optional rename, reparent, and
161
+ position offset.
162
+ - **`group_instances`** — Group multiple instances into a Model or Folder.
163
+ - **`build_multiple`** — Batch-create many parts/instances in a single round-trip.
164
+ - **`execute_run_test`** — Enter Run mode via `StudioTestService:ExecuteRunModeAsync()`
165
+ with pass-through args and result capture.
166
+ - **`execute_play_test`** — Enter Play mode via `StudioTestService:ExecutePlayModeAsync()`
167
+ for full client-server simulation tests.
168
+
169
+ ### New CLI Features
170
+
171
+ - **`dominus mcp-install`** — Auto-install MCP config into Cursor, VS Code,
172
+ Claude Desktop, Windsurf, and Claude Code with one command.
173
+ - **`dominus mcp-setup`** — Print manual MCP configuration instructions.
174
+ - **Relay client architecture** — `dominus start` can now connect as a relay
175
+ client to an existing MCP-owned WebSocket server, allowing the TUI and MCP
176
+ to coexist on the same port.
177
+
178
+ ### Plugin Improvements
179
+
180
+ - Enhanced `Properties.lua` with broader property type support.
181
+ - Improved `Reflection.lua` for richer class metadata.
182
+ - Updated `TestRunner.lua` with Run/Play mode test support.
183
+ - New `UIBuilder.lua` module for server-side declarative UI construction.
184
+
185
+ ### Other Changes
186
+
187
+ - Multi-provider AI config improvements (OpenRouter, xAI, Gemini, custom).
188
+ - TUI setup wizard for first-run API key and provider configuration.
189
+ - Improved system prompt with builder-tool awareness.
190
+ - WebSocket server now supports controller relay connections.
191
+
192
+ ## 0.1.0 (2026-02-23)
193
+
194
+ - Initial release — 14 MCP tools, TUI agent, persistent memory, Roblox Studio
195
+ WebSocket bridge.
package/README.md CHANGED
@@ -1,248 +1,162 @@
1
- # Dominus
2
-
3
- **AI-powered autonomous agent for Roblox Studio development.**
4
-
5
- Dominus connects to Roblox Studio over WebSocket, giving you a terminal-based AI assistant that can read scripts, edit code, run Luau, browse the explorer tree, manage instances, upload assets, and run tests -- all in real-time.
6
-
7
- ```
8
- ◆ ◆ ◆
9
- ╔█╗ ╔█╗ ╔█╗
10
- ╔╝ ╚╗ ╔╝ ╚╗ ╔╝ ╚╗
11
- ╚████████████████████████████████╝
12
- D O M I N U S
13
- ```
14
-
15
- ## Features
16
-
17
- - **Autonomous AI Agent** -- Plans, executes, and verifies multi-step tasks using tool calls (not just chat)
18
- - **Real-time Studio Bridge** -- Bidirectional WebSocket connection to Roblox Studio via plugin
19
- - **Persistent Memory** -- SQLite-backed memory that learns your project across sessions
20
- - **15 Built-in Tools** -- Read/edit scripts, run code, browse explorer, manage instances, search, upload assets, run tests
21
- - **Beautiful TUI** -- Ink-powered terminal interface with explorer tree, chat, output log, and live tool indicators
22
- - **Multi-Model Support** -- Use any AI model via OpenRouter (Claude, GPT-4o, Gemini, Llama, DeepSeek, etc.)
23
- - **Open Cloud Integration** -- Upload images, models, and audio directly to Roblox
24
- - **Configurable Rules** -- Tell Dominus what to do and what not to do with persistent rules
25
- - **StudioTestService** -- Run tests directly from the terminal
26
- - **Plugin Auto-Install** -- One command to install the Studio plugin
27
-
28
- ## Quick Start
29
-
30
- ### 1. Install Dominus
31
-
32
- ```bash
33
- # With pnpm (recommended)
34
- pnpm add -g dominus-cli
35
-
36
- # Or with npm
37
- npm install -g dominus-cli
38
- ```
39
-
40
- ### 2. Set Your API Key
41
-
42
- Get an API key from [OpenRouter](https://openrouter.ai/settings/keys) (free tier available):
43
-
44
- ```bash
45
- dominus config set apiKey sk-or-v1-your-key-here
46
- ```
47
-
48
- Or use an environment variable:
49
-
50
- ```bash
51
- export OPENROUTER_API_KEY=sk-or-v1-your-key-here
52
- ```
53
-
54
- ### 3. Install the Studio Plugin
55
-
56
- ```bash
57
- dominus install-plugin
58
- ```
59
-
60
- This copies the Dominus plugin to your Roblox Studio plugins folder. Restart Studio to load it.
61
-
62
- ### 4. Launch Dominus
63
-
64
- ```bash
65
- dominus
66
- ```
67
-
68
- The TUI will start, open a WebSocket server on port 18088, and wait for Studio to connect. In Studio, click the **Dominus > Connect** button in the toolbar.
69
-
70
- ## Configuration
71
-
72
- All config is stored at `~/.dominus/config.json`.
73
-
74
- ```bash
75
- # Set your API key
76
- dominus config set apiKey <key>
77
-
78
- # Change the AI model
79
- dominus config set model openai/gpt-4o
80
-
81
- # Change the WebSocket port
82
- dominus config set port 9090
83
-
84
- # Set your display name
85
- dominus config set userName Eli
86
-
87
- # Set up Open Cloud for asset uploads
88
- dominus config set openCloudApiKey <your-open-cloud-key>
89
-
90
- # View all settings
91
- dominus config list
92
- ```
93
-
94
- ### Available Models
95
-
96
- Any model on [OpenRouter](https://openrouter.ai/models) works. Popular choices:
97
-
98
- | Model | ID |
99
- |---|---|
100
- | Claude Sonnet 4 | `anthropic/claude-sonnet-4` |
101
- | GPT-4o | `openai/gpt-4o` |
102
- | GPT-4o Mini | `openai/gpt-4o-mini` |
103
- | Gemini 2.0 Flash | `google/gemini-2.0-flash-001` |
104
- | DeepSeek V3 | `deepseek/deepseek-chat` |
105
- | Llama 3.3 70B | `meta-llama/llama-3.3-70b-instruct` |
106
-
107
- ## Agent Rules
108
-
109
- Tell Dominus what to do (and what NOT to do):
110
-
111
- ```bash
112
- # Add rules
113
- dominus rules add-do "Always use strict Luau type annotations"
114
- dominus rules add-do "Follow Knit framework patterns"
115
- dominus rules add-dont "Never use deprecated APIs like wait()"
116
- dominus rules add-dont "Don't modify the DataStore schema without asking"
117
-
118
- # View rules
119
- dominus rules list
120
- ```
121
-
122
- Rules persist across sessions at `~/.dominus/rules.json`.
123
-
124
- ## TUI Commands
125
-
126
- Inside the Dominus terminal:
127
-
128
- | Command | Description |
129
- |---|---|
130
- | (just type) | Chat with the AI agent |
131
- | `/help` | Show all commands |
132
- | `/run <code>` | Execute Luau in Studio |
133
- | `/model <id>` | Switch AI model |
134
- | `/clear` | Clear chat history |
135
- | `/status` | Show connection info |
136
- | `/index` | Re-index project scripts |
137
- | `/memory` | Show recalled facts |
138
-
139
- ## Architecture
140
-
141
- ```
142
- ┌─────────────────────────────────────────────────────┐
143
- │ Terminal │
144
- │ ┌─────────────────────────────────────────────────┐
145
- │ │ Dominus TUI (Ink/React) │ │
146
- │ │ ┌──────────┐ ┌───────────────────────────────┐ │ │
147
- │ │ │ Explorer │ │ AI Chat + Tool Indicators │ │ │
148
- │ │ │ │ │ │ │ │
149
- │ │ └──────────┘ └───────────────────────────────┘ │ │
150
- │ │ ┌─────────────────────────────────────────────┐ │ │
151
- │ │ │ Output Log │
152
- │ │ └─────────────────────────────────────────────┘ │ │
153
- │ │ ┌─────────────────────────────────────────────┐ │ │
154
- │ │ │ > Input │ │ │
155
- │ │ └─────────────────────────────────────────────┘ │ │
156
- │ └─────────────────────────────────────────────────┘ │
157
- │ │ │
158
- │ ┌──────────┴──────────┐ │
159
- │ │ Agent Loop │ │
160
- │ │ (Plan→Execute→ │ │
161
- │ │ Verify→Learn) │ │
162
- │ └──────────┬──────────┘ │
163
- │ │ │
164
- │ ┌───────────────────┼───────────────────┐ │
165
- │ │ │ │ │
166
- │ ┌──┴──┐ ┌─────┴─────┐ ┌────┴────┐ │
167
- │ │Tools│ │ Memory │ │ AI │ │
168
- │ │(15) │ │ (SQLite) │ │Provider │ │
169
- │ └──┬──┘ └───────────┘ └─────────┘ │
170
- │ │ │
171
- └─────┼────────────────────────────────────────────────┘
172
- │ WebSocket
173
-
174
- ┌─────┴────────────────────────────────────────────────┐
175
- │ Roblox Studio │
176
- │ ┌─────────────────────────────────────────────────┐ │
177
- │ │ Dominus Plugin │ │
178
- │ │ (WS Client → Explorer, Executor, Watcher, │ │
179
- │ │ Properties, Reflection, TestRunner) │ │
180
- │ └─────────────────────────────────────────────────┘ │
181
- └───────────────────────────────────────────────────────┘
182
- ```
183
-
184
- ## Studio Plugin
185
-
186
- The plugin uses the **WebSocket API** introduced in Roblox Studio (October 2025):
187
-
188
- ```lua
189
- HttpService:CreateWebStreamClient(Enum.WebStreamClientType.WebSocket, { Url = "ws://localhost:18088" })
190
- ```
191
-
192
- ### Building with Rojo
193
-
194
- If you have [Rojo](https://rojo.space/) installed:
195
-
196
- ```bash
197
- pnpm build:plugin
198
- ```
199
-
200
- This creates `plugin/Dominus.rbxm` that you can drag into Studio.
201
-
202
- ### Manual Install
203
-
204
- ```bash
205
- dominus install-plugin
206
- ```
207
-
208
- Copies the plugin Lua files directly to your Studio plugins folder.
209
-
210
- ## Development
211
-
212
- ```bash
213
- # Clone and install
214
- git clone https://github.com/eli/dominus.git
215
- cd dominus
216
- pnpm install
217
-
218
- # Run in dev mode
219
- pnpm dev
220
-
221
- # Run tests
222
- pnpm test
223
-
224
- # Type check
225
- pnpm typecheck
226
-
227
- # Build
228
- pnpm build
229
-
230
- # Format
231
- pnpm format
232
- ```
233
-
234
- ## Tech Stack
235
-
236
- - **TypeScript** + **Node.js 20+** -- Runtime
237
- - **Ink 5** (React for CLI) -- Terminal UI framework
238
- - **ws** -- WebSocket server
239
- - **OpenAI SDK** -- AI provider (OpenRouter-compatible)
240
- - **sql.js** -- SQLite in WASM (persistent memory)
241
- - **Commander** -- CLI argument parsing
242
- - **Vitest** -- Test runner
243
- - **tsup** -- Bundler
244
- - **Rojo** -- Roblox plugin builder
245
-
246
- ## License
247
-
248
- MIT
1
+ # Dominus 2
2
+
3
+ Dominus 2 is a secure, MCP-native engineering bridge for Roblox Studio. It gives
4
+ an MCP host direct, typed access to Studio instances, scripts, UI, reflection,
5
+ output, and tests without embedding a second chat model or exposing arbitrary
6
+ Luau execution.
7
+
8
+ ## What changed
9
+
10
+ - MCP-only product: the old Ink chat CLI is no longer published.
11
+ - 16 focused tools with input/output schemas, structured results, and risk hints.
12
+ - Stable instance refs survive dots in names, renames, reparenting, and duplicate
13
+ sibling names for the life of the Studio session.
14
+ - Script writes require a revision from `studio_read_script`.
15
+ - Mutation batches and UI replacement are undoable and roll back on failure.
16
+ - The installer provisions a private bridge token into the local Studio plugin.
17
+ - Multiple Studio windows are selected by unique connection ID, not place ID.
18
+ - Roblox Creator Docs API lookup is built in.
19
+
20
+ ## Requirements
21
+
22
+ - Node.js 20 or newer
23
+ - Roblox Studio with HTTP requests enabled for Studio/plugin use
24
+ - An MCP client such as Codex, Claude Desktop, Cursor, or VS Code
25
+
26
+ Dominus does not require its own AI API key. Your MCP host supplies the model.
27
+
28
+ ## Install
29
+
30
+ Install the npm package globally:
31
+
32
+ ```powershell
33
+ npm install -g dominus-cli@latest
34
+ ```
35
+
36
+ Install or update the Studio plugin:
37
+
38
+ ```powershell
39
+ dominus-install-plugin
40
+ ```
41
+
42
+ Roblox Studio normally reloads the local plugin automatically. Restart Studio
43
+ only if the Dominus 2 toolbar button does not appear or reconnect.
44
+
45
+ ## MCP configuration
46
+
47
+ Add Dominus to your MCP client's server configuration:
48
+
49
+ ```json
50
+ {
51
+ "mcpServers": {
52
+ "dominus": {
53
+ "command": "dominus-mcp"
54
+ }
55
+ }
56
+ }
57
+ ```
58
+
59
+ For a version-pinned configuration that does not require a global install:
60
+
61
+ ```json
62
+ {
63
+ "mcpServers": {
64
+ "dominus": {
65
+ "command": "npx",
66
+ "args": ["-y", "-p", "dominus-cli@2.1.1", "dominus-mcp"]
67
+ }
68
+ }
69
+ }
70
+ ```
71
+
72
+ Restart the MCP client after changing its configuration.
73
+
74
+ ## First connection
75
+
76
+ 1. Run `dominus-install-plugin`; restart Roblox Studio only if it does not reload.
77
+ 2. Start the MCP client so `dominus-mcp` is running.
78
+ 3. Open Roblox Studio. The plugin connects and authenticates automatically.
79
+
80
+ If several Studio windows are open, call `dominus_select_studio` with the exact
81
+ connection ID before editing. Two windows on the same place ID remain distinct.
82
+
83
+ ## Agent workflow
84
+
85
+ Dominus instructs MCP hosts to use this loop:
86
+
87
+ 1. Inspect the target tree, selection, instances, scripts, and API references.
88
+ 2. Plan the smallest coherent change and define acceptance checks.
89
+ 3. Apply a transactional mutation or revision-checked script update.
90
+ 4. Read the changed state back.
91
+ 5. Run a Studio test when behavior changed.
92
+
93
+ For UI fidelity work, use `studio_snapshot_ui` after `studio_build_ui` and compare
94
+ fonts, UDim2 values, colors, strokes, and hierarchy rather than relying on a
95
+ successful write response alone.
96
+
97
+ ## Tool catalog
98
+
99
+ Connection tools:
100
+
101
+ - `dominus_status`
102
+ - `dominus_select_studio`
103
+
104
+ Studio inspection:
105
+
106
+ - `studio_get_tree`
107
+ - `studio_inspect`
108
+ - `studio_get_selection`
109
+ - `studio_read_script`
110
+ - `studio_snapshot_ui`
111
+ - `studio_get_output`
112
+ - `studio_get_reflection`
113
+
114
+ Studio changes and verification:
115
+
116
+ - `studio_update_script`
117
+ - `studio_apply`
118
+ - `studio_delete_instances`
119
+ - `studio_build_ui`
120
+ - `studio_run_test`
121
+
122
+ Roblox documentation:
123
+
124
+ - `roblox_search_api`
125
+ - `roblox_get_api`
126
+
127
+ ## Security model
128
+
129
+ The MCP transport is stdio. The separate Studio WebSocket bridge binds only to
130
+ `127.0.0.1`, limits messages to one MiB, rate-limits sockets, times out incomplete
131
+ handshakes, and authenticates both Studio plugins and relay controllers. The local
132
+ installer injects a user-specific token into the plugin, so no manual pairing flow
133
+ is needed. The plugin only accepts an explicit command allowlist and contains no
134
+ `loadstring` executor.
135
+
136
+ The bridge token protects against accidental or opportunistic access by unrelated
137
+ local processes. Like other user-level credentials, it cannot protect against a
138
+ process that already has permission to read all files in the same user account.
139
+
140
+ ## Development
141
+
142
+ ```powershell
143
+ pnpm install
144
+ pnpm typecheck
145
+ pnpm test
146
+ pnpm build
147
+ pnpm build:plugin
148
+ npm pack --dry-run
149
+ ```
150
+
151
+ Run the MCP server in development:
152
+
153
+ ```powershell
154
+ pnpm dev:mcp
155
+ ```
156
+
157
+ The design and research notes are in
158
+ [`docs/DOMINUS_2_PLAN.md`](docs/DOMINUS_2_PLAN.md).
159
+
160
+ ## License
161
+
162
+ MIT