@blazium-games/skills 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +34 -0
- package/package.json +23 -0
- package/skills/blazium-games-analytics/SKILL.md +57 -0
- package/skills/blazium-games-crash-reporting/SKILL.md +133 -0
- package/skills/blazium-games-debug-crash/SKILL.md +75 -0
- package/skills/blazium-games-deploy/SKILL.md +185 -0
- package/skills/blazium-games-get-started/SKILL.md +97 -0
- package/skills/blazium-games-get-started/references/auth.md +54 -0
- package/skills/blazium-games-get-started/references/prompts.md +18 -0
- package/skills/blazium-games-get-started/references/resources.md +33 -0
- package/skills/blazium-games-get-started/references/tools.md +160 -0
- package/skills/blazium-games-keys/SKILL.md +78 -0
- package/skills/blazium-games-player/SKILL.md +76 -0
- package/skills/blazium-games-player/references/tools.md +67 -0
- package/skills/blazium-games-purchases/SKILL.md +106 -0
- package/skills/blazium-games-store-page/SKILL.md +98 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Divine Games, Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Blazium Games skills
|
|
2
|
+
|
|
3
|
+
Agent skills for [Blazium Games](https://blazium.games), the store operated by Divine Games, Inc. They cover store pages, deploys, crash reporting, analytics, keys, and playing or buying games.
|
|
4
|
+
|
|
5
|
+
This package is the store. It is not the engine skills at [`@blazium-engine/skills`](https://www.npmjs.com/package/@blazium-engine/skills), and it does not install Hub, the engine CLI, or the toolchain. A game on Blazium Games does not have to be made with the Blazium engine.
|
|
6
|
+
|
|
7
|
+
The guide and the in-repo Cursor plugin source stay in [games_docs](https://github.com/blazium-games/games_docs). This repo is the versioned release.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install @blazium-games/skills
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Cursor: add `blazium-games/games_skill` from **Cursor Settings > Plugins**.
|
|
16
|
+
|
|
17
|
+
The catalog is [https://cdn.blazium.app/games-skills/skills.json](https://cdn.blazium.app/games-skills/skills.json).
|
|
18
|
+
|
|
19
|
+
## Plugins
|
|
20
|
+
|
|
21
|
+
| Plugin | What it covers |
|
|
22
|
+
|--------|----------------|
|
|
23
|
+
| `blazium-games-developer` | Get started, store page, deploy, crash reporting, debug crash, analytics, keys |
|
|
24
|
+
| `blazium-games-player` | Get started, player, purchases |
|
|
25
|
+
| `blazium-games` | Every skill, plus `mcp.json` |
|
|
26
|
+
|
|
27
|
+
`mcp.json` points at `https://mcp.blazium.games/mcp` and `https://mcp.blazium.games/player`. A token belongs to one server.
|
|
28
|
+
|
|
29
|
+
## Hosts
|
|
30
|
+
|
|
31
|
+
- Claude Code reads `.claude-plugin/marketplace.json`.
|
|
32
|
+
- Cursor reads `.cursor-plugin/marketplace.json`.
|
|
33
|
+
- Codex reads `.agents/plugins/marketplace.json`.
|
|
34
|
+
- Grok reads the Claude marketplace and `./.grok/skills/`. See [GROK.md](GROK.md).
|
package/package.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@blazium-games/skills",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Agent skills for the Blazium Games platform.",
|
|
5
|
+
"repository": "https://github.com/blazium-games/games_skill",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"files": [
|
|
8
|
+
"skills",
|
|
9
|
+
"README.md",
|
|
10
|
+
"LICENSE"
|
|
11
|
+
],
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"access": "public"
|
|
14
|
+
},
|
|
15
|
+
"homepage": "https://blazium.games",
|
|
16
|
+
"bugs": "https://github.com/blazium-games/games_skill/issues",
|
|
17
|
+
"author": "Blazium Games",
|
|
18
|
+
"keywords": [
|
|
19
|
+
"blazium",
|
|
20
|
+
"blazium-games",
|
|
21
|
+
"skills"
|
|
22
|
+
]
|
|
23
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: blazium-games-analytics
|
|
3
|
+
description: Read and summarize Blazium Games visitor analytics for a game page, including views, unique visitors, countries, and tracked actions. Use when the user asks how their game page is doing, for traffic numbers, or for a weekly analytics summary.
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Blazium Games: Analytics
|
|
8
|
+
|
|
9
|
+
Summarize store page traffic for one game.
|
|
10
|
+
|
|
11
|
+
## Invoke This Skill When
|
|
12
|
+
|
|
13
|
+
- "How is my game page doing?", "how many visitors this week?"
|
|
14
|
+
- "Which countries are my players from?"
|
|
15
|
+
- The user runs the `analytics_summary` prompt
|
|
16
|
+
|
|
17
|
+
## Prerequisites
|
|
18
|
+
|
|
19
|
+
- The `blazium-games` MCP server is connected (read access is enough)
|
|
20
|
+
|
|
21
|
+
## 1. Fetch
|
|
22
|
+
|
|
23
|
+
1. Resolve the game with `list_games` if the user did not give a `uid`.
|
|
24
|
+
2. Call `get_game_analytics` with `uid` (or read `blazium-games://games/{uid}/analytics`).
|
|
25
|
+
|
|
26
|
+
## 2. Interpret
|
|
27
|
+
|
|
28
|
+
| Field | Meaning |
|
|
29
|
+
|-------|---------|
|
|
30
|
+
| `total_views` | Page visits (`visited` actions) |
|
|
31
|
+
| `unique_visitors` | Distinct sessions |
|
|
32
|
+
| `country_breakdown.countries[]` | `country`, `count`, `percent` |
|
|
33
|
+
| `per_game[]` | Visitors and actions per game |
|
|
34
|
+
| `actions[]` | Tracked actions such as visits and downloads |
|
|
35
|
+
| `downloads.total` | Downloads that went through in the last 30 days |
|
|
36
|
+
| `downloads.anonymous` | Downloads with no account (anonymous downloads on) |
|
|
37
|
+
| `downloads.by_source[]` | `website`, `asset_library` (Godot or Blazium editor), `api`, `mcp_player`, `mcp_dev` |
|
|
38
|
+
| `downloads.by_access[]` | `anonymous`, `owner`, `free`, `purchase`, `grant`, `key`, `bundle` |
|
|
39
|
+
| `downloads.by_outcome[]` | Every attempt, including refusals such as `sign_in_required` and `payment_required` |
|
|
40
|
+
|
|
41
|
+
Analytics are aggregate. Individual visitors are not identifiable through the MCP.
|
|
42
|
+
|
|
43
|
+
## 3. Summarize
|
|
44
|
+
|
|
45
|
+
Report in a few sentences:
|
|
46
|
+
|
|
47
|
+
- Views and unique visitors
|
|
48
|
+
- Top three countries with percentages
|
|
49
|
+
- Notable actions (for example downloads compared with views)
|
|
50
|
+
- Downloads by source, and refusals worth fixing (many `payment_required` or `sign_in_required` attempts from the editor asset library, for example)
|
|
51
|
+
- One suggestion, such as improving the tagline if views are high but downloads are low
|
|
52
|
+
|
|
53
|
+
For crash trends, use `blazium-games-debug-crash` instead.
|
|
54
|
+
|
|
55
|
+
## Docs
|
|
56
|
+
|
|
57
|
+
https://docs.blazium.games/docs/mcp/reference
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: blazium-games-crash-reporting
|
|
3
|
+
description: Send crash reports, standard launch events, and custom events from a game to Blazium Games. Configures the Blazium Engine crash reporter or a custom HTTP reporter with X-App-Id and X-Build-Id, adds the session_start, boot_ok, first_input, session_end, and quit events that rate launch health, uploads Breakpad symbols with chauffeur, and verifies reports arrive. Use when the user wants crash reporting, crash dumps, symbols, launch health, error telemetry, or gameplay events for a Blazium Games project.
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Blazium Games: Crash Reporting
|
|
8
|
+
|
|
9
|
+
Wire a game to `POST https://api.blazium.online/api/v1/public/crashes` so crashes show up in `list_game_crashes`.
|
|
10
|
+
|
|
11
|
+
## Invoke This Skill When
|
|
12
|
+
|
|
13
|
+
- "Add crash reporting", "send crash dumps to Blazium Games", "why aren't my crashes showing up?"
|
|
14
|
+
- The user wants custom gameplay or telemetry events
|
|
15
|
+
- A build was just deployed and needs its `build_id` wired in
|
|
16
|
+
|
|
17
|
+
## Prerequisites
|
|
18
|
+
|
|
19
|
+
- The `blazium-games` MCP server is connected
|
|
20
|
+
- At least one registered build (see `blazium-games-deploy`)
|
|
21
|
+
|
|
22
|
+
## 1. Resolve identity
|
|
23
|
+
|
|
24
|
+
1. Call `get_deploy_info` with the game `uid`. Read `auth.crash_headers`:
|
|
25
|
+
- `X-App-Id`: the game uid
|
|
26
|
+
- `X-Build-Id`: the latest build's `build_id`
|
|
27
|
+
2. If the user ships several platforms or channels, call `list_game_builds` and pick the `build_id` matching the exact version, OS, arch, and channel. Every combination is its own build.
|
|
28
|
+
|
|
29
|
+
`X-Build-Id` is a build UID, never a version string. Crash ingest needs no secret, so these values are safe to ship inside the game.
|
|
30
|
+
|
|
31
|
+
## 2a. Blazium Engine games
|
|
32
|
+
|
|
33
|
+
Set these in Project Settings under `application/crash_reporter/`:
|
|
34
|
+
|
|
35
|
+
| Setting | Value |
|
|
36
|
+
|---------|-------|
|
|
37
|
+
| `enabled` | `true` |
|
|
38
|
+
| `upload_mode` | `InEngine`, `Sidecar`, or `Both` |
|
|
39
|
+
| `endpoint` | `https://api.blazium.online/api/v1/public/crashes` |
|
|
40
|
+
| `app_id` | the game uid (`X-App-Id`) |
|
|
41
|
+
| `build_id` | the build UID (`X-Build-Id`) |
|
|
42
|
+
| `app_version` | the build version |
|
|
43
|
+
| `build_channel` | `stable`, `beta`, etc. |
|
|
44
|
+
| `require_user_consent` | `true` (recommended) |
|
|
45
|
+
| `privacy_policy_url` | `https://blazium.games/privacy-policy` or your own |
|
|
46
|
+
|
|
47
|
+
For the sidecar UI, place the [crash_reporter](https://github.com/blazium-games/blazium_crash_reporter) binary next to the game executable. Never put secrets in Project Settings.
|
|
48
|
+
|
|
49
|
+
In CI, write `build_id` into the project before exporting, so each exported binary reports against its own build.
|
|
50
|
+
|
|
51
|
+
## 2b. Custom reporter
|
|
52
|
+
|
|
53
|
+
1. Create the report:
|
|
54
|
+
|
|
55
|
+
```http
|
|
56
|
+
POST https://api.blazium.online/api/v1/public/crashes
|
|
57
|
+
X-App-Id: <game uid>
|
|
58
|
+
X-Build-Id: <build_id>
|
|
59
|
+
Content-Type: application/json
|
|
60
|
+
|
|
61
|
+
{ "has_dump": true, "has_log": true, "app_name": "My Game", "app_version": "1.0.0",
|
|
62
|
+
"engine_version": "4.8", "os": "windows", "arch": "x86_64",
|
|
63
|
+
"user_message": "It froze on level 3", "anonymous": true, "metadata": {} }
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
The response is `201` with `id` and an `uploads` object containing `dump` and/or `log` entries: `url`, `method` (`PUT`), `expires_at` (24 hours), `max_bytes` (64 MB), and `filename` (`dump.dmp` or `log.txt`).
|
|
67
|
+
|
|
68
|
+
2. Upload each file to its `url` with `PUT`, sending the raw bytes (or a multipart `file` part). Each URL works once.
|
|
69
|
+
|
|
70
|
+
| Error code | Meaning |
|
|
71
|
+
|------------|---------|
|
|
72
|
+
| `4001` | Invalid JSON body |
|
|
73
|
+
| `4010` | Missing `X-App-Id` or `X-Build-Id` |
|
|
74
|
+
| `4030` | Unknown app id, or a `build_id` that doesn't belong to that app. Use the `build_id` from `list_game_builds`, not a version string |
|
|
75
|
+
| `4130` | `metadata` has more than 64 keys (`413`) |
|
|
76
|
+
| `4290` | The game hit its daily crash report limit (`429`); retry tomorrow |
|
|
77
|
+
|
|
78
|
+
Past the daily upload limit the report is still stored but `uploads` is empty.
|
|
79
|
+
|
|
80
|
+
## 3. Standard events (always add these)
|
|
81
|
+
|
|
82
|
+
Every game should send the six standard events so its builds get a launch health band on the store page and new games can reach the Unheard of shelf. Add them without being asked whenever you wire crash reporting, and tell the user you did.
|
|
83
|
+
|
|
84
|
+
| Event | When | Fields |
|
|
85
|
+
|-------|------|--------|
|
|
86
|
+
| `session_start` | Process started | |
|
|
87
|
+
| `boot_ok` | First frame of the main menu or first scene | `device_uid` (required), `ms` since start (optional, 0 to 600000) |
|
|
88
|
+
| `first_input` | First key, click, touch or gamepad button | `ms` (optional, 0 to 600000) |
|
|
89
|
+
| `session_end` | Normal close | `seconds` (required, whole number 0 to 86400) |
|
|
90
|
+
| `quit` | The player chose Quit | |
|
|
91
|
+
| `crash` | Crash reporter, or next launch after an unclean exit | `device_uid` (required) |
|
|
92
|
+
|
|
93
|
+
Send them to the events endpoint below with the same random per-install `device_uid` on every event (store it in `user://`). Clamp `ms` and `seconds` to their ranges: one invalid standard event refuses the whole request with `4158`.
|
|
94
|
+
|
|
95
|
+
For Blazium and Godot, add an autoload (for example `res://autoload/blazium_events.gd`, registered in Project Settings > Autoload) that sends `session_start` in `_ready`, `boot_ok` after the first processed frame, `first_input` from `_input` once, and `session_end` on `NOTIFICATION_WM_CLOSE_REQUEST`, and exposes a `quit_game()` that sends `quit` and `session_end` before quitting. A complete script is in https://docs.blazium.games/docs/crash-reporting#standard-events. Use the same `app_id` and `build_id` as the crash reporter. For other engines, send the same events at the same moments.
|
|
96
|
+
|
|
97
|
+
Ask before adding them if the game has no privacy policy or the user needs player consent for telemetry.
|
|
98
|
+
|
|
99
|
+
## 4. Custom events (optional)
|
|
100
|
+
|
|
101
|
+
```http
|
|
102
|
+
POST https://api.blazium.online/api/v1/public/events
|
|
103
|
+
X-App-Id: <game uid>
|
|
104
|
+
X-Build-Id: <build_id>
|
|
105
|
+
Content-Type: application/json
|
|
106
|
+
|
|
107
|
+
{ "events": [ { "event": "level_complete", "anonymous": true, "device_uid": "<random per install>" } ] }
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Up to 100 events per request (more returns `4130`); the response is `202`. Use a random per-install id, not hardware identifiers.
|
|
111
|
+
|
|
112
|
+
## 5. Symbols
|
|
113
|
+
|
|
114
|
+
Stacks from minidumps only show addresses until Breakpad symbols are uploaded for that build. Symbols can only be uploaded with the chauffeur CLI and the game's deploy key:
|
|
115
|
+
|
|
116
|
+
1. Export with debug symbols (the `.pdb` on Windows, an unstripped binary or `.debug` file on Linux, the `.dSYM` on macOS).
|
|
117
|
+
2. Make `.sym` files: `cargo install dump_syms`, then `dump_syms <pdb|binary|dSYM> > symbols/<name>.sym`.
|
|
118
|
+
3. Upload: `chauffeur symbols --build-id <build_id> symbols/`, or `--symbols symbols/` on `chauffeur addfiles`. `upload_symbols_info` returns the exact command.
|
|
119
|
+
|
|
120
|
+
Check with `list_build_symbols`. Details: https://docs.blazium.games/docs/cli/symbols
|
|
121
|
+
|
|
122
|
+
## 6. Verify
|
|
123
|
+
|
|
124
|
+
1. Trigger a test crash (or send the JSON above with `curl`).
|
|
125
|
+
2. Call `list_game_crashes` and confirm the new report and its `build_id`.
|
|
126
|
+
3. Run the game once and check that the events arrive with `get_game_analytics`. `get_build_health` rates a build once enough devices have launched it.
|
|
127
|
+
4. Hand off to `blazium-games-debug-crash` to read the crash.
|
|
128
|
+
|
|
129
|
+
If nothing arrives, check that `X-Build-Id` belongs to this game (`get_game_build`) and that the endpoint is the `crash_ingest` URL from `get_deploy_info`.
|
|
130
|
+
|
|
131
|
+
## Docs
|
|
132
|
+
|
|
133
|
+
https://docs.blazium.games/docs/crash-reporting
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: blazium-games-debug-crash
|
|
3
|
+
description: Investigate Blazium Games crash reports. Lists recent crashes, reads the stack excerpt and metadata, downloads dumps, logs, or stackwalk output, maps the crash to a build and source code, and proposes a fix. Use when the user asks to look at crashes, debug a crash, or triage crash reports for a Blazium Games project.
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Blazium Games: Debug a Crash
|
|
8
|
+
|
|
9
|
+
Go from "players are crashing" to a root cause and a fix in the user's code.
|
|
10
|
+
|
|
11
|
+
## Invoke This Skill When
|
|
12
|
+
|
|
13
|
+
- "What are my latest crashes?", "debug this crash", "why is my game crashing?"
|
|
14
|
+
- The user pastes a crash id from https://blazium.games
|
|
15
|
+
- After `blazium-games-crash-reporting` verifies reports arrive
|
|
16
|
+
|
|
17
|
+
## Prerequisites
|
|
18
|
+
|
|
19
|
+
- The `blazium-games` MCP server is connected (read access is enough)
|
|
20
|
+
- The game's source code is open in the workspace (for step 4, Map to code)
|
|
21
|
+
|
|
22
|
+
## 1. Find the crash
|
|
23
|
+
|
|
24
|
+
1. Call `list_crash_groups` with the game `uid`. Each group is one cause (top stack frames, or the crash message and platform before a stackwalk), most recently seen first (up to 100 groups), with counts per build and a `sample_crash_id`.
|
|
25
|
+
2. A group whose reports all come from the newest build usually means a regression in that build.
|
|
26
|
+
3. Pick the crash the user named, or the `sample_crash_id` of the group with the highest count. `list_game_crashes` lists individual reports when you need more than the sample.
|
|
27
|
+
4. Call `list_bug_tickets` for the player's side: what they were doing, in their words. A ticket with an attached dump or log has a `crash_id` you can read like any other crash.
|
|
28
|
+
|
|
29
|
+
## 2. Read the report
|
|
30
|
+
|
|
31
|
+
Call `get_crash` with `uid` and `crash_id`. Key fields:
|
|
32
|
+
|
|
33
|
+
| Field | Meaning |
|
|
34
|
+
|-------|---------|
|
|
35
|
+
| `build_id`, `os`, `arch` | Which build and platform crashed |
|
|
36
|
+
| `user_message` | What the player said they were doing |
|
|
37
|
+
| `has_dump`, `has_log`, `has_stack` | Which artifacts can be downloaded |
|
|
38
|
+
| `analysis` | Server-side analysis, if already run |
|
|
39
|
+
| `metadata` | Reporter metadata (engine version, custom fields) |
|
|
40
|
+
|
|
41
|
+
Call `get_game_build` with the `build_id` to get the version and channel.
|
|
42
|
+
|
|
43
|
+
## 3. Download artifacts
|
|
44
|
+
|
|
45
|
+
Call `request_crash_download` with `kind`:
|
|
46
|
+
|
|
47
|
+
- `stack`: symbolicated stackwalk output. Start here.
|
|
48
|
+
- `log`: the log tail (`log.txt`).
|
|
49
|
+
- `dump`: the minidump (`dump.dmp`) for a native debugger.
|
|
50
|
+
|
|
51
|
+
Each call returns a private `url` valid for 1 hour (`expires_in: 3600`). Fetch it promptly; do not share it or paste it into public places.
|
|
52
|
+
|
|
53
|
+
## 4. Map to code
|
|
54
|
+
|
|
55
|
+
1. Take the top frames from the stack that belong to the user's code (skip engine and OS frames).
|
|
56
|
+
2. Search the workspace for those functions and files.
|
|
57
|
+
3. Check out or inspect the commit matching the build version when possible, so line numbers line up.
|
|
58
|
+
4. Read the log tail for the last actions before the crash.
|
|
59
|
+
|
|
60
|
+
## 5. Report
|
|
61
|
+
|
|
62
|
+
Give the user:
|
|
63
|
+
|
|
64
|
+
- One sentence root cause
|
|
65
|
+
- The file and function, with a code reference
|
|
66
|
+
- The builds and platforms affected, and how many reports
|
|
67
|
+
- A proposed fix, and a test or reproduction step
|
|
68
|
+
- If the build is live on `stable` and crashing badly, offer `rollback_channel` (needs write access). Players go back to the previous build and nothing is deleted
|
|
69
|
+
- Once a fix ships, offer to mark the matching bug tickets with `update_bug_ticket` (`status` `fixed`, or `closed` if it won't be fixed). `open` reopens one
|
|
70
|
+
|
|
71
|
+
If the dump has no symbols, say so and suggest exporting with debug symbols for the next build.
|
|
72
|
+
|
|
73
|
+
## Docs
|
|
74
|
+
|
|
75
|
+
https://docs.blazium.games/docs/crash-reporting#reading-crashes
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: blazium-games-deploy
|
|
3
|
+
description: Ship game builds to Blazium Games from CI or the command line. Issues rotated deploy keys, registers a build and uploads its zipped files and Breakpad symbols with the chauffeur CLI (or the upload API), and wires the build_id into crash reporting. Use when the user wants to deploy, upload, publish a build, upload symbols or store images, or set up GitHub Actions or GitLab CI for Blazium Games.
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Blazium Games: Deploy Builds
|
|
8
|
+
|
|
9
|
+
Register a build, upload its files, and keep the returned `build_id` for crash reporting. Builds and symbols only upload through the chauffeur CLI or the upload API with the game's deploy key. Store images upload through chauffeur or the game's edit page on the website. MCP can list and delete them but never uploads.
|
|
10
|
+
|
|
11
|
+
## Invoke This Skill When
|
|
12
|
+
|
|
13
|
+
- "Deploy my game to Blazium Games", "upload a build", "set up CI for Blazium Games"
|
|
14
|
+
- "Upload my debug symbols", "upload my screenshots"
|
|
15
|
+
- The user has a built game folder and a Blazium Games store page
|
|
16
|
+
- A CI job needs `BLAZIUM_ACCESS_TOKEN` / `BLAZIUM_SECRET_KEY`
|
|
17
|
+
|
|
18
|
+
## Prerequisites
|
|
19
|
+
|
|
20
|
+
- The `blazium-games` MCP server is connected with write access (see `blazium-games-get-started`)
|
|
21
|
+
- A store page exists. If not, run `blazium-games-store-page` first
|
|
22
|
+
- The game owner's email is verified. Uploads for an unverified owner fail with code `4096`. Check with `get_account` (`email_verified`); if needed, call `request_email_code`, ask the human for the code, and call `verify_email`. A game admin cannot verify for the owner
|
|
23
|
+
- chauffeur, from `https://cdn.blazium.online/tools/chauffeur/<platform>/latest/archive/default` where `<platform>` is `windows-amd64`, `linux-amd64`, `linux-arm64`, `darwin-amd64`, or `darwin-arm64`. The zip contains the `chauffeur` binary
|
|
24
|
+
|
|
25
|
+
## 1. Read deploy info
|
|
26
|
+
|
|
27
|
+
Call `get_deploy_info` with the game's `uid` or vanity name. It returns (no secrets):
|
|
28
|
+
|
|
29
|
+
| Field | Use |
|
|
30
|
+
|-------|-----|
|
|
31
|
+
| `endpoints.upload_build` | `https://api.blazium.online/api/v1/tool/upload/build` |
|
|
32
|
+
| `endpoints.crash_ingest` | Crash reporter endpoint |
|
|
33
|
+
| `endpoints.events_ingest` | Events endpoint |
|
|
34
|
+
| `builds[]`, `latest_build_id` | Existing builds and their `build_id` |
|
|
35
|
+
| `keys[]` | Prefixes of existing deploy keys |
|
|
36
|
+
| `env` | Env var names to set in CI (`BLAZIUM_ACCESS_TOKEN`, `BLAZIUM_SECRET_KEY`, `BLAZIUM_API_URL`, `BLAZIUM_UPLOAD_URL`) plus `BLAZIUM_GAMES_APP_ID` and the latest `BLAZIUM_GAMES_BUILD_ID` for crash reporting |
|
|
37
|
+
|
|
38
|
+
## 2. Get deploy credentials
|
|
39
|
+
|
|
40
|
+
If the user already has an access token and secret stored in CI, skip this step.
|
|
41
|
+
|
|
42
|
+
Issuing a key needs developer mode on the account; `4105` means the human must turn it on at https://blazium.games/settings first.
|
|
43
|
+
|
|
44
|
+
Otherwise **warn first**: `request_deploy_key` immediately invalidates every previous deploy key for that game, which breaks any pipeline still using an old key. After the user confirms, call `request_deploy_key` with the `uid`. It returns `access_token` and `secret_key` once.
|
|
45
|
+
|
|
46
|
+
Tell the user to store them as CI secrets (for example GitHub Actions secrets `BLAZIUM_ACCESS_TOKEN` and `BLAZIUM_SECRET_KEY`) or in their shell environment. Do not write them into files that are committed. Do not repeat them after they are stored, and don't pass the secret with `--secret` (other processes can see it).
|
|
47
|
+
|
|
48
|
+
## 3a. Upload with chauffeur (recommended)
|
|
49
|
+
|
|
50
|
+
chauffeur reads `BLAZIUM_ACCESS_TOKEN` and `BLAZIUM_SECRET_KEY` from the environment (or `--access` and `--secret-stdin`). `chauffeur info` confirms which game the key belongs to.
|
|
51
|
+
|
|
52
|
+
1. Generate `build.yml` once: `chauffeur genbuild --version 1.0.0`
|
|
53
|
+
2. Optionally add changelog entries: `chauffeur addchangelog --title "..." --description "..."`
|
|
54
|
+
3. Register the build: `chauffeur build --asset build.yml --os windows --arch x86_64`. It prints `BLAZIUM_GAMES_APP_ID` and `BLAZIUM_GAMES_BUILD_ID`
|
|
55
|
+
4. Generate `addfiles.yml`: `chauffeur setfiles --version 1.0.0 --os windows --arch x86_64 --files ./export/windows`
|
|
56
|
+
5. Upload the files, and symbols if the user has them: `chauffeur addfiles --asset addfiles.yml --symbols ./symbols`
|
|
57
|
+
|
|
58
|
+
`addfiles` reuses the build with the same version, type, OS, arch, and channel (keeping its notes), zips the files, checksums them, and uploads them, in 16 MB chunks that resume after a dropped connection when over 64 MB. Keep `version` the same in both YAML files.
|
|
59
|
+
|
|
60
|
+
Example `build.yml`:
|
|
61
|
+
|
|
62
|
+
```yaml
|
|
63
|
+
version: v1
|
|
64
|
+
spec: build
|
|
65
|
+
asset:
|
|
66
|
+
title: "1.0.0"
|
|
67
|
+
type: "game"
|
|
68
|
+
description: "First release"
|
|
69
|
+
version: 1.0.0
|
|
70
|
+
engine_version: "4.3"
|
|
71
|
+
platforms:
|
|
72
|
+
- os: windows
|
|
73
|
+
arch: x86_64
|
|
74
|
+
channel: stable
|
|
75
|
+
changelog:
|
|
76
|
+
- title: "Launch"
|
|
77
|
+
description: "First public build"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Set `engine_version` so mods can show whether they work with the build.
|
|
81
|
+
|
|
82
|
+
### Several apps (dedicated server, editor, launcher)
|
|
83
|
+
|
|
84
|
+
A project can ship more than one app, each with its own builds and channels. Add an `app` block to both YAML files, or pass `--app server --app-name "Dedicated Server"` to `build`, `addfiles`, `genbuild`, and `setfiles`:
|
|
85
|
+
|
|
86
|
+
```yaml
|
|
87
|
+
asset:
|
|
88
|
+
app:
|
|
89
|
+
id: server
|
|
90
|
+
name: Dedicated Server
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
`id` is 1-32 lowercase letters, digits, or dashes; leave the block out for the main app. The store page groups downloads by app, and clean files of a non-main app are stored as `<game>-<app>-<channel>-<os>-<arch>.zip`. A build is only reused within its own app.
|
|
94
|
+
|
|
95
|
+
Other chauffeur commands:
|
|
96
|
+
|
|
97
|
+
| Task | Command |
|
|
98
|
+
|------|---------|
|
|
99
|
+
| Symbols for an existing build | `chauffeur symbols --build-id <build_id> ./symbols` (`upload_symbols_info` returns it) |
|
|
100
|
+
| Store images | `chauffeur media cover art/cover.png`, `chauffeur media thumbnail art/thumb.png`, `chauffeur media add shots/*.png`, `chauffeur media list` |
|
|
101
|
+
| List builds, files, and symbol counts | `chauffeur builds list` |
|
|
102
|
+
| Machine-readable output | Add `--json`; exit codes are 0 ok, 1 usage, 2 API error, 3 network |
|
|
103
|
+
|
|
104
|
+
Errors print the API code with a hint. See https://docs.blazium.games/docs/cli/troubleshooting
|
|
105
|
+
|
|
106
|
+
## 3b. Upload API directly
|
|
107
|
+
|
|
108
|
+
Use this only when chauffeur can't run.
|
|
109
|
+
|
|
110
|
+
1. `POST https://api.blazium.online/api/v1/tool/upload/build` with headers `X-Access-Token` and `X-Secret-Key` and JSON:
|
|
111
|
+
|
|
112
|
+
```json
|
|
113
|
+
{ "version": "1.0.0", "build_type": "game", "os": "windows", "arch": "x86_64",
|
|
114
|
+
"channel": "stable", "title": "1.0.0", "description": "First release",
|
|
115
|
+
"changelog_items": [{ "title": "Launch", "description": "First public build" }] }
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
The same version, type, OS, arch, and channel update one build instead of creating another, replacing its title, description, and changelog. The response includes `build_id`.
|
|
119
|
+
|
|
120
|
+
2. `POST https://uploader.blazium.online/api/v1/tool/upload/files` (multipart, same headers) with fields `build_id`, `os`, `arch`, `channel`, `checksum` (SHA-256 hex of the zip), and `file` (a `.zip`, max 5 GB). Folders inside the zip are kept.
|
|
121
|
+
|
|
122
|
+
- `os`: `windows`, `macos`, `linux`, `android`, `ios`, or `web`
|
|
123
|
+
- `arch`: `x86_64`, `x86`, `arm64`, `arm32`, `arm`, `universal`, `wasm32`, or `wasm`
|
|
124
|
+
- `channel`: lowercase letters, digits, `-`, `_`; starts with a letter or digit; up to 32 characters
|
|
125
|
+
- `app` (optional, on both calls): the app id for a second app such as a dedicated server, with `app_name` for its display name
|
|
126
|
+
|
|
127
|
+
3. For large files, open a session first: `POST https://uploader.blazium.online/api/v1/tool/upload/sessions` (same headers, form fields `filename`, `total_size`, `checksum`, `os`, `arch`, `channel`, and `build_id`). The `201` response has `session_id`, `expected_size`, `current_size`, and `expires_at` (6 hours). Send the chunks in order to `/tool/upload/files` as multipart `file` parts with `X-Upload-Session-ID` and `Content-Range: bytes <start>-<end>/<total>`. Each returns `202` until the last one finishes the upload. On an error, resume from its `current_size`.
|
|
128
|
+
|
|
129
|
+
| Error code | Meaning |
|
|
130
|
+
|------------|---------|
|
|
131
|
+
| `4020`-`4023` | Missing, unknown, or revoked deploy key headers |
|
|
132
|
+
| `4026` | Missing or too-long field on build registration |
|
|
133
|
+
| `4037` | Missing `file`, or a form that could not be read |
|
|
134
|
+
| `4038` | Missing build identification on file upload |
|
|
135
|
+
| `4039` | Build not found (register it first) |
|
|
136
|
+
| `4041` | Invalid `checksum`, `os`, `arch`, or `channel`, or the file is not a `.zip` |
|
|
137
|
+
| `4043` | Over 5 GB, or larger than the chunk's `Content-Range` (`413`) |
|
|
138
|
+
| `4044` | Missing or invalid session headers, or a chunk that doesn't continue the session (resume from `current_size`) |
|
|
139
|
+
| `4045` | Upload session not found or expired; open a new one |
|
|
140
|
+
| `4046` | Checksum mismatch; recompute the SHA-256 of the zip |
|
|
141
|
+
| `4047` | Another chunk for this session is still uploading; wait and retry |
|
|
142
|
+
| `4096` | The project owner must verify their email before uploading |
|
|
143
|
+
| `4290` / `4291` | Too many uploads or open sessions for this game; wait and retry |
|
|
144
|
+
|
|
145
|
+
Uploaded build files are private. Players download them through short-lived links after verifying their email, and paid games also need a license.
|
|
146
|
+
|
|
147
|
+
## 4. GitHub Actions
|
|
148
|
+
|
|
149
|
+
```yaml
|
|
150
|
+
name: Deploy to Blazium Games
|
|
151
|
+
on:
|
|
152
|
+
push:
|
|
153
|
+
tags: ["v*"]
|
|
154
|
+
jobs:
|
|
155
|
+
deploy:
|
|
156
|
+
runs-on: ubuntu-latest
|
|
157
|
+
env:
|
|
158
|
+
BLAZIUM_ACCESS_TOKEN: ${{ secrets.BLAZIUM_ACCESS_TOKEN }}
|
|
159
|
+
BLAZIUM_SECRET_KEY: ${{ secrets.BLAZIUM_SECRET_KEY }}
|
|
160
|
+
steps:
|
|
161
|
+
- uses: actions/checkout@v4
|
|
162
|
+
- name: Install chauffeur
|
|
163
|
+
run: |
|
|
164
|
+
curl -fsSL -o chauffeur.zip https://cdn.blazium.online/tools/chauffeur/linux-amd64/latest/archive/default
|
|
165
|
+
unzip -o chauffeur.zip chauffeur && chmod +x chauffeur
|
|
166
|
+
- name: Register build
|
|
167
|
+
run: ./chauffeur build --asset build.yml --os linux --arch x86_64 --json > build.json
|
|
168
|
+
# Export your game into ./export/linux here, with the build_id from build.json
|
|
169
|
+
# (jq -r '.builds[0].build_id' build.json) in the crash reporter settings.
|
|
170
|
+
- name: Upload files and symbols
|
|
171
|
+
run: |
|
|
172
|
+
./chauffeur setfiles --version "${GITHUB_REF_NAME#v}" --os linux --arch x86_64 --files ./export/linux
|
|
173
|
+
./chauffeur addfiles --asset addfiles.yml --symbols ./symbols
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
`build.yml` must use the tag's version without the `v`. For several platforms use a matrix, and for GitLab CI see https://docs.blazium.games/docs/cli/ci
|
|
177
|
+
|
|
178
|
+
## 5. Hand off to crash reporting
|
|
179
|
+
|
|
180
|
+
Give the new `build_id` to the crash reporter as `X-Build-Id`: in Blazium Engine, write it into the export's `application/crash_reporter/build_id` project setting. `chauffeur build` prints it as `BLAZIUM_GAMES_BUILD_ID` so CI can pass it to the export step; `list_game_builds` and `get_deploy_info` return it too. Continue with `blazium-games-crash-reporting`, which also adds the standard launch events.
|
|
181
|
+
|
|
182
|
+
## Docs
|
|
183
|
+
|
|
184
|
+
- https://docs.blazium.games/docs/deploy
|
|
185
|
+
- https://docs.blazium.games/docs/cli
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: blazium-games-get-started
|
|
3
|
+
description: Connect Cursor to Blazium Games and route to the right skill. Blazium Games is the platform for playing and publishing games, applications, mods, and assets. The developer server (mcp.blazium.games/mcp) publishes pages, builds, crashes, analytics, and keys. The player server (mcp.blazium.games/player) finds, reviews, installs, and buys. Use when the user mentions Blazium Games for the first time, asks how to connect, or is unsure whether they want to play or publish.
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Blazium Games: Get Started
|
|
8
|
+
|
|
9
|
+
Blazium Games is the platform for playing and publishing games, applications, mods, and assets. A token belongs to one server:
|
|
10
|
+
|
|
11
|
+
- Developer server `https://mcp.blazium.games/mcp` (`blazium-games`, keys `bgames_mcp_`): pages, builds, crashes, analytics, and keys. Needs developer mode.
|
|
12
|
+
- Player server `https://mcp.blazium.games/player` (`blazium-games-player`, keys `bgames_play_`): find, review, install, and buy. Works for every account.
|
|
13
|
+
|
|
14
|
+
Never send a player token to the developer server, or a developer token to the player server. Verify the account, then hand off to the skill that matches the user's goal.
|
|
15
|
+
|
|
16
|
+
## Read this first
|
|
17
|
+
|
|
18
|
+
Use these instead of browsing the website. Signed-in pages do not have facts the tools already return.
|
|
19
|
+
|
|
20
|
+
- Docs map: https://docs.blazium.games/llms.txt
|
|
21
|
+
- Platform map: https://blazium.games/llms.txt
|
|
22
|
+
- One project's public facts: `https://<username>.blazium.games/<vanity_name>/llms.txt`
|
|
23
|
+
- Developer server card: https://mcp.blazium.games/.well-known/mcp/server-card.json
|
|
24
|
+
- Player server card: https://mcp.blazium.games/.well-known/mcp/player-server-card.json
|
|
25
|
+
- Which files exist, and which do not: https://docs.blazium.games/docs/discovery
|
|
26
|
+
|
|
27
|
+
## Invoke This Skill When
|
|
28
|
+
|
|
29
|
+
- The user says "set up Blazium Games", "connect Blazium Games", or "what can the Blazium Games MCP do?"
|
|
30
|
+
- A Blazium Games tool call fails with an authentication error
|
|
31
|
+
- The user wants to publish, deploy, or monitor a game on https://blazium.games but has not said which part
|
|
32
|
+
|
|
33
|
+
## Prerequisites
|
|
34
|
+
|
|
35
|
+
- A Blazium Games account (sign up at https://blazium.games/signup)
|
|
36
|
+
- The `blazium-games` MCP server enabled in Cursor (this plugin ships it in `mcp.json`)
|
|
37
|
+
|
|
38
|
+
## 1. Connect
|
|
39
|
+
|
|
40
|
+
The plugin registers the server as:
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"mcpServers": {
|
|
45
|
+
"blazium-games": {
|
|
46
|
+
"type": "http",
|
|
47
|
+
"url": "https://mcp.blazium.games/mcp"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
On first use Cursor opens a browser for OAuth. On the consent page the user chooses:
|
|
54
|
+
|
|
55
|
+
- **Account**: every game they own or admin, plus account tools such as `create_game` and `request_mcp_key`.
|
|
56
|
+
- **A single project**: only that game. Account-only tools return `403` with code `4030`.
|
|
57
|
+
- **A preset**: **Store page**, **CI**, **Crash triage**, **Keys**, **Money**, **Read-only**, or **Full access**. A tool outside the preset returns `4073`; a write with a read-only token returns `4031`.
|
|
58
|
+
|
|
59
|
+
For playing and buying as a player, the plugin also ships `blazium-games-player` at `https://mcp.blazium.games/player`, which has its own consent. See the `blazium-games-player` skill.
|
|
60
|
+
|
|
61
|
+
If OAuth is not possible (headless CI, remote agents), use an API key instead. See [references/auth.md](references/auth.md).
|
|
62
|
+
|
|
63
|
+
## 2. Verify
|
|
64
|
+
|
|
65
|
+
1. Call `get_profile`. A username confirms the connection.
|
|
66
|
+
2. Call `get_setup` to see the account, games, public URLs, and key prefixes. It never returns secrets.
|
|
67
|
+
3. If `get_setup` fails with `4030`, the token is bound to one project. Use `list_games` instead.
|
|
68
|
+
|
|
69
|
+
| Symptom | Cause | Fix |
|
|
70
|
+
|---------|-------|-----|
|
|
71
|
+
| `401` / auth prompt loops | Token expired or revoked | Reconnect the server in Cursor Settings > MCP |
|
|
72
|
+
| `403` code `4031` | Read-only token | Reconnect without "Read-only access" |
|
|
73
|
+
| `403` code `4030` | Project-bound token calling an account-level tool or another game | Reconnect choosing "Account" |
|
|
74
|
+
| `403` code `4073` | The preset doesn't cover this tool | Reconnect with a wider preset |
|
|
75
|
+
| `approval_required` (`4214`) | The action waits for the account owner | Ask the human to open the emailed link, then retry with the same `idempotency_key` |
|
|
76
|
+
| `API 404` on a game | Wrong uid or vanity name | Call `list_games` and use the `uid` |
|
|
77
|
+
|
|
78
|
+
## 3. Route
|
|
79
|
+
|
|
80
|
+
| Goal | Skill |
|
|
81
|
+
|------|-------|
|
|
82
|
+
| Create or edit a store page | `blazium-games-store-page` |
|
|
83
|
+
| Ship builds from CI or the CLI | `blazium-games-deploy` |
|
|
84
|
+
| Add crash reporting to a game | `blazium-games-crash-reporting` |
|
|
85
|
+
| Investigate a crash | `blazium-games-debug-crash` |
|
|
86
|
+
| Read visitor analytics | `blazium-games-analytics` |
|
|
87
|
+
| Rotate MCP or deploy keys | `blazium-games-keys` |
|
|
88
|
+
| Find, review, or play games as a player | `blazium-games-player` |
|
|
89
|
+
| Buy a game or donate | `blazium-games-purchases` |
|
|
90
|
+
|
|
91
|
+
## References
|
|
92
|
+
|
|
93
|
+
- [references/tools.md](references/tools.md): every tool, its inputs, the access it needs, and what it does
|
|
94
|
+
- [references/resources.md](references/resources.md): `blazium-games://` resources and templates
|
|
95
|
+
- [references/prompts.md](references/prompts.md): server prompts
|
|
96
|
+
- [references/auth.md](references/auth.md): OAuth, API keys, scopes, and project binding
|
|
97
|
+
- Full docs: https://docs.blazium.games/docs/mcp
|