Skip to content

Commit 8d6e715

Browse files
committed
Release GABS 1.0.6
1 parent 762762e commit 8d6e715

57 files changed

Lines changed: 2412 additions & 2248 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

AGENTS.md

Lines changed: 80 additions & 1094 deletions
Large diffs are not rendered by default.

README.md

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
Compatible with **GABP v1.1** on wire major **`gabp/1`**.
44

55
GABS lets MCP-capable AI tools start games, check status, and call tools exposed
6-
by GABP-compatible game mods.
6+
by GABP-compatible game integrations.
77

88
If you are installing GABS from a release archive, start with **Quick Start**
99
below. If you want the full copy-paste setup guide, read the
@@ -18,7 +18,7 @@ to real games.
1818
- Keep everything local by default
1919
- Work with Claude Desktop, Codex CLI, and other MCP clients
2020
- Support direct executables, Steam App IDs, Epic App IDs, and custom commands
21-
- Mirror game-specific mod tools into MCP when the mod connects
21+
- Mirror game-specific tools into MCP when the bridge connects
2222

2323
## Quick Start
2424

@@ -58,13 +58,13 @@ chmod +x gabs
5858

5959
```bash
6060
# Interactive setup
61-
gabs games add minecraft
61+
gabs games add factory
6262

6363
# See saved game IDs
6464
gabs games list
6565

6666
# Show one game's saved config
67-
gabs games show minecraft
67+
gabs games show factory
6868
```
6969

7070
The setup is interactive. In most cases you only need to answer:
@@ -76,7 +76,7 @@ The setup is interactive. In most cases you only need to answer:
7676
`games.kill`
7777

7878
For Steam and Epic games, `stopProcessName` is required. Example values:
79-
`RimWorldWin64.exe`, `RimWorld`, or `java`.
79+
`GameName.exe`, `AdventureGame`, or `java`.
8080

8181
### 3. Add GABS to your AI client
8282

@@ -117,16 +117,16 @@ If your client disconnects after `tools/list` because it rejects a public tool's
117117
[Configuration Guide](docs/CONFIGURATION.md). Mirrored game tools are discovered
118118
through `games_tool_names` and are not advertised in the public `tools/list`
119119
response.
120-
If a game or mod starts slowly, you can also tune startup waits with the
120+
If a game or bridge starts slowly, you can also tune startup waits with the
121121
`timeouts.startup` section described in the
122122
[Configuration Guide](docs/CONFIGURATION.md).
123123

124124
### 4. Try these prompts
125125

126126
- "List my games"
127-
- "Start RimWorld"
127+
- "Start AdventureGame"
128128
- "Show the status of all games"
129-
- "Stop Minecraft"
129+
- "Stop FactorySim"
130130

131131
If you want a download-to-working walkthrough, use the
132132
[AI Client Setup Guide](docs/AI_CLIENT_SETUP.md).
@@ -138,28 +138,31 @@ If you want a download-to-working walkthrough, use the
138138
- **More than one AI session**: that is fine. GABS coordinates ownership per
139139
game so two live sessions do not both launch or attach to the same game by
140140
accident.
141-
- **Game mod cannot find bridge config**: the mod should first read
141+
- **Game bridge cannot find bridge config**: the game-side bridge should first read
142142
`GABP_SERVER_PORT`, `GABP_TOKEN`, and `GABS_GAME_ID`, and only fall back to
143143
`GABS_BRIDGE_PATH` or `~/.gabs/<gameId>/bridge.json`.
144+
- **Confusing bridge state**: start with `games_status`. It compares the
145+
runtime file, bridge file, passive listener evidence, and process environment
146+
where the OS allows it, then returns diagnosis details and next actions.
144147

145148
## How It Works
146149

147150
Most users only need this mental model:
148151

149152
- Your AI client starts `gabs server`
150153
- GABS starts or attaches to your game
151-
- If the game mod speaks GABP, GABS mirrors that mod's tools into MCP
154+
- If the game-side bridge speaks GABP, GABS mirrors that bridge's tools into MCP
152155

153-
Architecture details matter mainly if you are writing a mod or debugging a
156+
Architecture details matter mainly if you are writing a game-side bridge or debugging a
154157
bridge issue.
155158

156159
![GABS Architecture](docs/architecture-flow.svg)
157160

158161
```
159-
AI Agent ← MCP → GABS ← GABP Client → GABP Server (Game Mod) ← Game API → Game
162+
AI Agent ← MCP → GABS ← GABP Client → GABP Server (Game Bridge) ← Game API → Game
160163
```
161164

162-
In the GABP layer, your mod is the server and GABS is the client.
165+
In the GABP layer, your game-side bridge is the server and GABS is the client.
163166

164167
## Common MCP Tools
165168

@@ -172,8 +175,8 @@ tool names by default because some clients reject dots in tool names:
172175
- **`games_stop`** - Stop a game gracefully
173176
- **`games_kill`** - Force stop a game
174177
- **`games_status`** - Check if a game is running
175-
- **`games_connect`** - Reconnect to a running game's mod bridge
176-
- **`games_tool_names`** - List mirrored game-specific tools after a mod connects
178+
- **`games_connect`** - Reconnect to a running game's game-side bridge
179+
- **`games_tool_names`** - List mirrored game-specific tools after a bridge connects
177180
- **`games_tool_detail`** - Show the schema for one mirrored tool
178181
- **`games_call_tool`** - Call a connected game tool through the stable core surface
179182

@@ -184,11 +187,11 @@ explicitly disable normalization in config.
184187
For the full MCP surface and advanced behavior, see the
185188
[AI Integration Guide](docs/INTEGRATION.md).
186189

187-
## Game-Specific Tools from Mods
190+
## Game-Specific Tools from Bridges
188191

189-
When a GABP-compatible mod connects, GABS mirrors the mod's canonical
192+
When a GABP-compatible bridge connects, GABS mirrors the bridge's canonical
190193
slash-delimited GABP tool names into strict-safe names such as
191-
`minecraft_inventory_get` or `rimworld_crafting_build`. The public `tools/list`
194+
`factory_inventory_get` or `adventure_crafting_build`. The public `tools/list`
192195
response stays core-only so clients do not churn on large game-specific tool
193196
sets. Use `games_tool_names` for discovery, `games_tool_detail` for one schema,
194197
and `games_call_tool` for the actual call. Direct mirrored MCP tools may still
@@ -197,10 +200,10 @@ dynamic `tools/list` refreshes.
197200

198201
The usual discovery flow is:
199202
```
200-
AI: "Reconnect to RimWorld and show me its mod tools"
201-
GABS: games_connect {"gameId": "rimworld"}
202-
GABS: games_tool_names {"gameId": "rimworld", "brief": true}
203-
GABS: games_tool_detail {"tool": "rimworld_crafting_build"}
203+
AI: "Reconnect to AdventureGame and show me its game-specific tools"
204+
GABS: games_connect {"gameId": "adventure"}
205+
GABS: games_tool_names {"gameId": "adventure", "brief": true}
206+
GABS: games_tool_detail {"tool": "adventure_crafting_build"}
204207
```
205208

206209
Most users can ignore attention gating, resource mirroring, and protocol
@@ -211,28 +214,31 @@ details until they need them. Those topics are covered in the dedicated docs.
211214
- **[AI Client Setup Guide](docs/AI_CLIENT_SETUP.md)** - Install a release bundle and connect Claude Desktop, Codex CLI, or generic MCP clients
212215
- **[Configuration Guide](docs/CONFIGURATION.md)** - Detailed setup for different game types and tool normalization
213216
- **[AI Integration Guide](docs/INTEGRATION.md)** - Connect GABS to different AI tools and deployment scenarios
214-
- **[Mod Development Guide](docs/MOD_DEVELOPMENT.md)** - Add GABP support to your game mods
217+
- **[GABP Bridge Development Guide](docs/GABP_BRIDGE_DEVELOPMENT.md)** - Add GABP support to your game integrations
215218
- **[Advanced Usage Guide](docs/ADVANCED_USAGE.md)** - Multiple instances, HTTP mode, scripting, and more
216219
- **[Deployment Guide](docs/DEPLOYMENT.md)** - Production deployments and cloud setups
217220
- **[OpenAI Tool Normalization](docs/OPENAI_TOOL_NORMALIZATION.md)** - Configure tool name compatibility for OpenAI API
218221
- **[Dynamic Tools Guide](docs/DYNAMIC_TOOLS_GUIDE.md)** - How AI agents handle expanding tool sets
219222
- **[AI Dynamic Tools FAQ](docs/AI_DYNAMIC_TOOLS_FAQ.md)** - Common questions about dynamic tool discovery
220223

221-
## For Mod Developers
224+
## For Bridge Developers
222225

223-
Want your game to work with GABS? Add GABP support to your mod:
226+
Want your game to work with GABS? Add GABP support to your game-side bridge:
224227

225228
1. **Read GABP configuration** from environment variables when your game starts:
226229
- `GABS_GAME_ID` - Your game's identifier
227-
- `GABP_SERVER_PORT` - Port your mod should listen on
230+
- `GABP_SERVER_PORT` - Port your game-side bridge should listen on
228231
- `GABP_TOKEN` - Authentication token for GABS connections
229232
- `GABS_BRIDGE_PATH` - Optional `bridge.json` fallback/debug path
230-
2. **Start a local GABP server** to listen for GABS connections (your mod = server, GABS = client)
233+
Environment values are authoritative when present. `bridge.json` is a
234+
fallback/debug file so agents can recover or inspect state, not an override
235+
for fresh `GABP_*` values.
236+
2. **Start a local GABP server** to listen for GABS connections (your game-side bridge = server, GABS = client)
231237
3. **Implement the current GABP runtime methods** (`session/hello`, `tools/list`, `tools/call`) or use the official `gabp-runtime` library so your schemas match what GABS expects
232238
- For GABP v1.1 bridges, advertise optional attention support through capabilities before exposing `attention/current`, `attention/ack`, and the attention lifecycle channels
233239
4. **Expose game features** as tools, resources, and events using canonical GABP tool names such as `inventory/get` or `core/ping`
234240

235-
See the [Mod Development Guide](docs/MOD_DEVELOPMENT.md) for complete examples in C#, Java, and Python.
241+
See the [GABP Bridge Development Guide](docs/GABP_BRIDGE_DEVELOPMENT.md) for complete examples in C#, Java, and Python.
236242

237243
## Build from Source
238244

cmd/gabs/main.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ Examples:
204204
gabs server --http localhost:8080
205205
206206
# Add a new game configuration
207-
gabs games add minecraft
207+
gabs games add factory
208208
209209
# List configured games (shows only game IDs)
210210
gabs games list
@@ -410,7 +410,7 @@ func addGame(log util.Logger, gameID string, configDir string) int {
410410
for stopProcessName == "" {
411411
fmt.Printf("⚠️ Stop Process Name is required for %s games to enable proper game termination.\n", game.LaunchMode)
412412
fmt.Printf(" Without it, GABS can only stop the launcher process, not the actual game.\n")
413-
fmt.Printf(" Examples: 'RimWorldWin64.exe' for RimWorld, 'java' for Minecraft\n")
413+
fmt.Printf(" Examples: 'GameName.exe' for AdventureGame, 'java' for FactorySim\n")
414414
stopProcessName = promptString(fmt.Sprintf("Stop Process Name (REQUIRED for %s games)", game.LaunchMode), "")
415415
}
416416
} else {
@@ -504,9 +504,9 @@ func showGamesUsage() {
504504
505505
Examples:
506506
gabs games list # See game IDs only (AI-friendly)
507-
gabs games add minecraft # Add a new game called 'minecraft'
508-
gabs games show minecraft # View configuration for 'minecraft'
509-
gabs games remove minecraft # Remove the 'minecraft' configuration
507+
gabs games add factory # Add a new game called 'factory'
508+
gabs games show factory # View configuration for 'factory'
509+
gabs games remove factory # Remove the 'factory' configuration
510510
`)
511511
}
512512

docs/ADVANCED_USAGE.md

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,23 @@ This guide covers advanced GABS features for power users and complex setups.
99
You can run multiple copies of the same game with different configurations:
1010

1111
```bash
12-
# Configure multiple Minecraft servers
13-
gabs games add minecraft-survival
14-
gabs games add minecraft-creative
15-
gabs games add minecraft-test
12+
# Configure multiple FactorySim servers
13+
gabs games add factory-survival
14+
gabs games add factory-creative
15+
gabs games add factory-test
1616

1717
# Start GABS server
1818
gabs server
1919
```
2020

2121
AI can then control each instance separately:
2222
- "Start the creative server but keep survival server running"
23-
- "Check status of all minecraft instances"
23+
- "Check status of all factory instances"
2424
- "Stop the test server and start survival"
2525

2626
### Use Cases
2727
- **Testing**: Run test servers alongside production
28-
- **Multiple worlds**: Different game modes or worlds
28+
- **Multiple worlds**: Different game-side bridges or worlds
2929
- **Load balancing**: Switch between servers based on player count
3030

3131
## Advanced Launch Configurations
@@ -52,7 +52,7 @@ Point to scripts that handle complex startup logic:
5252

5353
```bash
5454
# DirectPath pointing to a script:
55-
# /home/user/game-scripts/start-minecraft.sh
55+
# /home/user/game-scripts/start-factory.sh
5656
```
5757

5858
## HTTP Mode Deep Dive
@@ -107,7 +107,7 @@ curl -X POST http://localhost:8080/mcp \
107107
# Start a game
108108
curl -X POST http://localhost:8080/mcp \
109109
-H "Content-Type: application/json" \
110-
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"games.start","arguments":{"gameId":"minecraft"}}}'
110+
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"games.start","arguments":{"gameId":"factory"}}}'
111111
```
112112

113113
#### Python Integration
@@ -152,7 +152,7 @@ client = GABSClient()
152152
games = client.list_games()
153153
print("Available games:", games)
154154

155-
result = client.start_game("minecraft")
155+
result = client.start_game("factory")
156156
print("Start result:", result)
157157
```
158158

@@ -211,11 +211,11 @@ async function manageGames() {
211211
const games = await client.listGames();
212212
console.log('Available games:', games);
213213

214-
await client.startGame('minecraft');
215-
console.log('Started minecraft');
214+
await client.startGame('factory');
215+
console.log('Started factory');
216216

217-
const status = await client.getGameStatus('minecraft');
218-
console.log('Minecraft status:', status);
217+
const status = await client.getGameStatus('factory');
218+
console.log('FactorySim status:', status);
219219

220220
} catch (error) {
221221
console.error('Error managing games:', error);
@@ -249,7 +249,7 @@ the GABP protocol version.
249249
```
250250
251251
This feature:
252-
- Converts dotted names (`minecraft.inventory.get`) to underscored names (`minecraft_inventory_get`)
252+
- Converts dotted names (`factory.inventory.get`) to underscored names (`factory_inventory_get`)
253253
- Enforces character limits for API compatibility
254254
- Preserves original names in descriptions for user clarity
255255
@@ -277,7 +277,7 @@ subcommand:
277277
278278
```bash
279279
gabs games list
280-
gabs games show minecraft
280+
gabs games show factory
281281
```
282282
283283
## Security Considerations
@@ -353,11 +353,11 @@ sleep 5
353353
# Start games via API
354354
curl -X POST http://localhost:8080/mcp \
355355
-H "Content-Type: application/json" \
356-
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"games.start","arguments":{"gameId":"minecraft"}}}'
356+
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"games.start","arguments":{"gameId":"factory"}}}'
357357

358358
curl -X POST http://localhost:8080/mcp \
359359
-H "Content-Type: application/json" \
360-
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"games.start","arguments":{"gameId":"rimworld"}}}'
360+
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"games.start","arguments":{"gameId":"adventure"}}}'
361361

362362
echo "Game servers started. GABS PID: $GABS_PID"
363363
```
@@ -405,7 +405,7 @@ gabs server --http :8081
405405
top -p $(pgrep gabs)
406406
407407
# Check game process memory
408-
ps aux | grep -E "(minecraft|rimworld|gabs)"
408+
ps aux | grep -E "(factory|adventure|gabs)"
409409
```
410410
411411
### Network Issues

0 commit comments

Comments
 (0)