summer-engine 3.4.1 → 3.5.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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +5 -1
- package/.codex-plugin/plugin.json +5 -1
- package/.cursor-plugin/plugin.json +5 -1
- package/.factory-plugin/plugin.json +5 -1
- package/CHANGELOG.md +31 -0
- package/README.md +5 -1
- package/dist/cli/commands/setup.js +24 -4
- package/dist/core/capabilities/capture-gameplay.d.ts +72 -7
- package/dist/core/capabilities/capture-gameplay.js +386 -25
- package/dist/core/capabilities/export-engine-version.d.ts +7 -0
- package/dist/core/capabilities/export-engine-version.js +9 -0
- package/dist/core/capabilities/export-game.d.ts +4 -0
- package/dist/core/capabilities/export-game.js +50 -7
- package/dist/core/capabilities/image-generation.d.ts +12 -2
- package/dist/core/capabilities/image-generation.js +31 -2
- package/dist/core/capabilities/publish-build.d.ts +4 -0
- package/dist/core/capabilities/publish-build.js +84 -37
- package/dist/core/capabilities/runtime-control.d.ts +2 -2
- package/dist/core/capabilities/summer-bundle.d.ts +9 -0
- package/dist/core/capabilities/summer-bundle.js +19 -0
- package/dist/core/capabilities/tool-dispatch.js +13 -2
- package/dist/core/library-read.d.ts +7 -0
- package/dist/core/library-read.js +59 -7
- package/dist/core/library-search.d.ts +2 -0
- package/dist/installer/agent-config.d.ts +26 -1
- package/dist/installer/agent-config.js +180 -5
- package/dist/installer/agent-table.d.ts +13 -0
- package/dist/installer/agent-table.js +120 -0
- package/dist/mcp/tools/creator-tools.js +32 -3
- package/dist/mcp/tools/generate-tools.js +11 -30
- package/dist/mcp/tools/library-tools.d.ts +2 -1
- package/dist/mcp/tools/library-tools.js +1 -0
- package/gemini-extension.json +5 -1
- package/integrations/README.md +6 -0
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +1 -1
- package/library/skills/README.md +11 -1
- package/library/skills/export-and-ship/SKILL.md +1 -1
- package/library/skills/export-and-ship/resource.yaml +2 -1
- package/library/skills/grow-analytics/SKILL.md +21 -0
- package/library/skills/grow-analytics/resource.yaml +27 -0
- package/library/skills/publish-your-game/SKILL.md +21 -0
- package/library/skills/publish-your-game/resource.yaml +29 -0
- package/library/skills/store-art/SKILL.md +23 -0
- package/library/skills/store-art/resource.yaml +30 -0
- package/library/skills/store-listing/SKILL.md +21 -0
- package/library/skills/store-listing/resource.yaml +25 -0
- package/library/skills/summer-analytics/resource.yaml +1 -0
- package/library/tools/capture-gameplay/resource.yaml +66 -1
- package/library/tools/export-game/resource.yaml +3 -0
- package/library/tools/generate-image/resource.yaml +4 -2
- package/package.json +1 -1
- package/registry/generated/counts.json +2 -2
- package/registry/generated/gemini-extension.json +5 -1
- package/registry/generated/index.json +153 -10
- package/registry/generated/marketplace.claude.json +1 -1
- package/registry/generated/plugin.claude.json +5 -1
- package/registry/generated/plugin.codex.json +5 -1
- package/registry/generated/plugin.cursor.json +5 -1
- package/registry/generated/plugin.factory.json +5 -1
- package/registry/generated/skills-index.md +11 -1
- package/registry/generated/skills-registry.json +52 -0
- package/registry/schemas/skill.schema.json +5 -0
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
{
|
|
12
12
|
"name": "summer",
|
|
13
13
|
"source": "./",
|
|
14
|
-
"version": "3.
|
|
14
|
+
"version": "3.5.1",
|
|
15
15
|
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 105-tool MCP bridge to the local desktop app.",
|
|
16
16
|
"author": {
|
|
17
17
|
"name": "Summer Engine",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
3
|
"_generated": "GENERATED from integrations/claude — do not edit; npm run generate:registry",
|
|
4
4
|
"name": "summer",
|
|
5
|
-
"version": "3.
|
|
5
|
+
"version": "3.5.1",
|
|
6
6
|
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 105-tool MCP bridge to the local desktop app.",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "Summer Engine",
|
|
@@ -71,6 +71,7 @@
|
|
|
71
71
|
"./library/skills/gdscript-patterns/",
|
|
72
72
|
"./library/skills/generate-motion/",
|
|
73
73
|
"./library/skills/godogen-visual-proof-game-generation/",
|
|
74
|
+
"./library/skills/grow-analytics/",
|
|
74
75
|
"./library/skills/headless-scripting/",
|
|
75
76
|
"./library/skills/in-game-purchases/",
|
|
76
77
|
"./library/skills/instantiate-asset-pack/",
|
|
@@ -93,6 +94,7 @@
|
|
|
93
94
|
"./library/skills/procedural-animation/",
|
|
94
95
|
"./library/skills/prop-model/",
|
|
95
96
|
"./library/skills/psx-retro-rendering/",
|
|
97
|
+
"./library/skills/publish-your-game/",
|
|
96
98
|
"./library/skills/realtime-wet-surfaces/",
|
|
97
99
|
"./library/skills/remote-deploy/",
|
|
98
100
|
"./library/skills/retarget/",
|
|
@@ -110,6 +112,8 @@
|
|
|
110
112
|
"./library/skills/sound-effect/",
|
|
111
113
|
"./library/skills/spatial-placement/",
|
|
112
114
|
"./library/skills/sprite-sheet/",
|
|
115
|
+
"./library/skills/store-art/",
|
|
116
|
+
"./library/skills/store-listing/",
|
|
113
117
|
"./library/skills/summer-analytics/",
|
|
114
118
|
"./library/skills/summer-friends/",
|
|
115
119
|
"./library/skills/summer-leaderboards/",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_generated": "GENERATED from integrations/codex — do not edit; npm run generate:registry",
|
|
3
3
|
"name": "summer",
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.5.1",
|
|
5
5
|
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 105-tool MCP bridge. Build games by talking.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Summer Engine",
|
|
@@ -66,6 +66,7 @@
|
|
|
66
66
|
"./library/skills/gdscript-patterns/",
|
|
67
67
|
"./library/skills/generate-motion/",
|
|
68
68
|
"./library/skills/godogen-visual-proof-game-generation/",
|
|
69
|
+
"./library/skills/grow-analytics/",
|
|
69
70
|
"./library/skills/headless-scripting/",
|
|
70
71
|
"./library/skills/in-game-purchases/",
|
|
71
72
|
"./library/skills/instantiate-asset-pack/",
|
|
@@ -88,6 +89,7 @@
|
|
|
88
89
|
"./library/skills/procedural-animation/",
|
|
89
90
|
"./library/skills/prop-model/",
|
|
90
91
|
"./library/skills/psx-retro-rendering/",
|
|
92
|
+
"./library/skills/publish-your-game/",
|
|
91
93
|
"./library/skills/realtime-wet-surfaces/",
|
|
92
94
|
"./library/skills/remote-deploy/",
|
|
93
95
|
"./library/skills/retarget/",
|
|
@@ -105,6 +107,8 @@
|
|
|
105
107
|
"./library/skills/sound-effect/",
|
|
106
108
|
"./library/skills/spatial-placement/",
|
|
107
109
|
"./library/skills/sprite-sheet/",
|
|
110
|
+
"./library/skills/store-art/",
|
|
111
|
+
"./library/skills/store-listing/",
|
|
108
112
|
"./library/skills/summer-analytics/",
|
|
109
113
|
"./library/skills/summer-friends/",
|
|
110
114
|
"./library/skills/summer-leaderboards/",
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"_generated": "GENERATED from integrations/cursor — do not edit; npm run generate:registry",
|
|
4
4
|
"name": "summer",
|
|
5
5
|
"displayName": "Summer",
|
|
6
|
-
"version": "3.
|
|
6
|
+
"version": "3.5.1",
|
|
7
7
|
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 105-tool MCP bridge to the local desktop app.",
|
|
8
8
|
"author": {
|
|
9
9
|
"name": "Summer Engine",
|
|
@@ -78,6 +78,7 @@
|
|
|
78
78
|
"./library/skills/gdscript-patterns/",
|
|
79
79
|
"./library/skills/generate-motion/",
|
|
80
80
|
"./library/skills/godogen-visual-proof-game-generation/",
|
|
81
|
+
"./library/skills/grow-analytics/",
|
|
81
82
|
"./library/skills/headless-scripting/",
|
|
82
83
|
"./library/skills/in-game-purchases/",
|
|
83
84
|
"./library/skills/instantiate-asset-pack/",
|
|
@@ -100,6 +101,7 @@
|
|
|
100
101
|
"./library/skills/procedural-animation/",
|
|
101
102
|
"./library/skills/prop-model/",
|
|
102
103
|
"./library/skills/psx-retro-rendering/",
|
|
104
|
+
"./library/skills/publish-your-game/",
|
|
103
105
|
"./library/skills/realtime-wet-surfaces/",
|
|
104
106
|
"./library/skills/remote-deploy/",
|
|
105
107
|
"./library/skills/retarget/",
|
|
@@ -117,6 +119,8 @@
|
|
|
117
119
|
"./library/skills/sound-effect/",
|
|
118
120
|
"./library/skills/spatial-placement/",
|
|
119
121
|
"./library/skills/sprite-sheet/",
|
|
122
|
+
"./library/skills/store-art/",
|
|
123
|
+
"./library/skills/store-listing/",
|
|
120
124
|
"./library/skills/summer-analytics/",
|
|
121
125
|
"./library/skills/summer-friends/",
|
|
122
126
|
"./library/skills/summer-leaderboards/",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"_generated": "GENERATED from integrations/factory — do not edit; npm run generate:registry",
|
|
3
3
|
"name": "summer",
|
|
4
4
|
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 105-tool MCP bridge to the local desktop app.",
|
|
5
|
-
"version": "3.
|
|
5
|
+
"version": "3.5.1",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Summer Engine",
|
|
8
8
|
"email": "founders@summerengine.com",
|
|
@@ -63,6 +63,7 @@
|
|
|
63
63
|
"./library/skills/gdscript-patterns/",
|
|
64
64
|
"./library/skills/generate-motion/",
|
|
65
65
|
"./library/skills/godogen-visual-proof-game-generation/",
|
|
66
|
+
"./library/skills/grow-analytics/",
|
|
66
67
|
"./library/skills/headless-scripting/",
|
|
67
68
|
"./library/skills/in-game-purchases/",
|
|
68
69
|
"./library/skills/instantiate-asset-pack/",
|
|
@@ -85,6 +86,7 @@
|
|
|
85
86
|
"./library/skills/procedural-animation/",
|
|
86
87
|
"./library/skills/prop-model/",
|
|
87
88
|
"./library/skills/psx-retro-rendering/",
|
|
89
|
+
"./library/skills/publish-your-game/",
|
|
88
90
|
"./library/skills/realtime-wet-surfaces/",
|
|
89
91
|
"./library/skills/remote-deploy/",
|
|
90
92
|
"./library/skills/retarget/",
|
|
@@ -102,6 +104,8 @@
|
|
|
102
104
|
"./library/skills/sound-effect/",
|
|
103
105
|
"./library/skills/spatial-placement/",
|
|
104
106
|
"./library/skills/sprite-sheet/",
|
|
107
|
+
"./library/skills/store-art/",
|
|
108
|
+
"./library/skills/store-listing/",
|
|
105
109
|
"./library/skills/summer-analytics/",
|
|
106
110
|
"./library/skills/summer-friends/",
|
|
107
111
|
"./library/skills/summer-leaderboards/",
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,37 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to summer-engine will be documented here. Following [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and [Semantic Versioning](https://semver.org/).
|
|
4
4
|
|
|
5
|
+
## [Unreleased]
|
|
6
|
+
|
|
7
|
+
## [3.5.1] - 2026-10-10
|
|
8
|
+
|
|
9
|
+
Summer Games now connects from almost every agent setup supports, and large store uploads finish.
|
|
10
|
+
|
|
11
|
+
- **Summer Games in more agents.** `summer setup` now adds `summer-games` (`https://mcp.summer.games/mcp`: friends, parties and messages as you) for Cursor, GitHub Copilot in VS Code, the Copilot CLI and Copilot in JetBrains, Zed, Cline and Cline CLI, Kilo Code, OpenCode, Devin Desktop (Windsurf), Antigravity, Kiro, Trae, Warp, Goose, Hermes, Crush, Amp, Factory Droid, Junie, Qwen Code, Kimi Code, Grok Build and Mistral Vibe, as well as Claude Code and Codex. Each gets the entry in its own format, and setup prints the one sign-in step for that agent. As in 3.5.0, setup adds no second entry when the same address is already listed under another name, and `--no-games` skips it.
|
|
12
|
+
- Not included, because they cannot sign in to it from their config file: Claude Desktop (add Summer Games as a custom connector in its settings), Roo Code and Rovo Dev (no sign-in for remote servers), and Visual Studio, Qoder and LM Studio (sign-in not yet checked).
|
|
13
|
+
- `summer_publish_build` and `summer_publish_download` no longer fail an upload of 3 or more parts with `store_sign_failed: The store did not sign part N` when the store signed every part. Each sign now asks for every part still to upload, a part counts as unsigned only when the store was asked for it and left it out, a signing error is retried like a failed part upload, and the first failure stops the other parts' uploads.
|
|
14
|
+
|
|
15
|
+
## [3.5.0] - 2026-10-10
|
|
16
|
+
|
|
17
|
+
Setup now connects Summer Games too, and agents that publish a game get further on their own. 3.4.2 was never published; its changes ship here.
|
|
18
|
+
|
|
19
|
+
- **Summer Games in your agent.** `summer setup claude-code` and `summer setup codex` also add `summer-games`, the Summer Games MCP at `https://mcp.summer.games/mcp`. Your agent can then see your friends and who is online, start a party, invite friends to a game and send messages, as you. You sign in once through summer.games: run `/mcp` in Claude Code and choose `summer-games`, or `/mcp login summer-games` in Codex. Your browser opens summer.games; sign in and choose Allow. No key or password is written to your config.
|
|
20
|
+
- If you already added the same address under another name (for example `summer`), setup keeps yours and adds no second entry. Running setup again changes nothing.
|
|
21
|
+
- `--no-games` skips it. To remove it: `claude mcp remove summer-games -s user` or `codex mcp remove summer-games`.
|
|
22
|
+
- Cursor does not get it yet: Cursor's sign-in can use a `cursor://` return address that summer.games does not accept yet. A later release adds it.
|
|
23
|
+
- `summer_publish_build` refused with `template_set_unavailable` no longer only says "update Summer Engine": with the newest engine, Summer Games may still be turning that Summer version on, so retry the same upload later (the same clientVersion works). It shows the store's own reason when there is one.
|
|
24
|
+
- `summer_search_library` and `summer_read_library` now find `skill/publish-your-game`, `skill/store-listing`, `skill/store-art` and `skill/grow-analytics`. Before, they were only hosted MCP resources and a read returned not_found.
|
|
25
|
+
- A read loads the current text from the hosted Summer Engine MCP with the store sign-in (`summer login --store`). Without the sign-in it shows a short summary, the reason, and how to load the rest. The entries also load by their `summer://skills/<slug>` URI.
|
|
26
|
+
- `summer_capture_gameplay` gets past the title screen. `args` passes the game's own flags after `--` (for example `["--autostart"]`). `steps` play like a player before and between frames: press a button by its text, a key, an input action, a click, a drag, a wait, and a shot. The run always passes `--summer-offscreen`.
|
|
27
|
+
- `summer_capture_gameplay` no longer stops at about half the requested time: the run is capped at 60 fps (`--max-fps 60`) because the engine's time limit counts frames, and it gets twice its planned time. The probe is fully typed, so projects that treat GDScript warnings as errors load it. The project is imported again when an asset is new or its content changed since the last import (a pull, or Git LFS files fetched later), and files that are still LFS pointers are named in a warning.
|
|
28
|
+
- `summer_generate_image` sends no model unless you name one, so width 1920 with height 1080 gets a model that reaches it instead of `size_unreachable`. It waits up to 3 minutes for the larger models. The new `out` parameter (a folder or a .png/.jpg/.webp path) says where to save the image; without it, it goes to `<TMPDIR>/summer-gen/`.
|
|
29
|
+
- `summer_export_game` exports the targets the installed engine can build: Android on 0.7.0 is left out with a warning (it needs 0.7.1), and the other targets still export. `skippedTargets` names what was left out.
|
|
30
|
+
- `summer_publish_build` checks a game with a server's Build declaration before anything is uploaded: when `summer.build.json` declares other platforms than the export holds, the preview and the upload stop with `declaration_mismatch`, so no version is spent. `summer_export_game` warns about the same mismatch, and `alignDeclaration: true` sets `summer.build.json` targetPlatforms to the exported targets.
|
|
31
|
+
|
|
32
|
+
### Added
|
|
33
|
+
- Skill field `hosted_resource` in `resource.yaml`: the skill's body comes from that hosted MCP resource (#90).
|
|
34
|
+
- `summer_capture_gameplay` `args` and `steps`; a step that cannot run (no such button, key or action) is a warning, not a failure.
|
|
35
|
+
|
|
5
36
|
## [3.4.1] - 2026-10-10
|
|
6
37
|
|
|
7
38
|
Agents that publish a game find the right tools:
|
package/README.md
CHANGED
|
@@ -57,6 +57,8 @@ The first run will:
|
|
|
57
57
|
4. Open your browser for one-click sign-in.
|
|
58
58
|
5. Scaffold a starter project and open the engine.
|
|
59
59
|
|
|
60
|
+
In most agents (Claude Code, Codex, Cursor, GitHub Copilot (VS Code, CLI, JetBrains), Zed, Cline, Kilo Code, OpenCode, Devin Desktop, Antigravity, Kiro, Trae, Warp, Goose, Hermes, Crush, Amp, Factory, Junie, Qwen Code, Kimi Code, Grok Build and Mistral Vibe), setup also connects Summer Games (`summer-games`), so the agent can see your friends, start parties and send messages as you. You sign in once; setup prints the step for your agent (Claude Code: `/mcp`, choose `summer-games`; Codex: `/mcp login summer-games`; Cursor: Connect next to `summer-games` in its MCP settings). A summer.games page opens in your browser; sign in and choose Allow.
|
|
61
|
+
|
|
60
62
|
Then ask the agent to build something.
|
|
61
63
|
|
|
62
64
|
---
|
|
@@ -123,6 +125,8 @@ npx -y summer-engine@latest setup claude-code --yes --force
|
|
|
123
125
|
|
|
124
126
|
Replace `claude-code` with the user's actual agent: `claude-desktop`, `codex`, `cursor`, `windsurf`, `antigravity`, `cline`, `cline-cli`, `kilo-code`, `github-copilot`, `vscode-copilot`, `visual-studio`, `copilot-jetbrains`, `opencode`, `zed`, `kiro`, `goose`, `hermes`, `trae`, `qwen-code`, `kimi-code`, `crush`, `amp`, `factory`, `junie`, `warp`, `rovo-dev`, `qoder`, `grok-build`, `mistral-vibe`, `lm-studio`. Use `github-copilot` for Copilot CLI, `vscode-copilot` for GitHub Copilot Chat/Agent in VS Code, `visual-studio` for Copilot in Visual Studio, and `copilot-jetbrains` for Copilot in JetBrains IDEs. Legacy targets `gemini` and `roo-code` still work; for Google's agent use `antigravity`. This installs **every skill in the library** to `~/.claude/skills/<slug>/SKILL.md` (or the agent's own skill directory), writes the MCP server config, runs doctor, and prints what it installed and where. Preview skills are included and labelled; `--stable-only` skips them. `--force` wipes stale skill copies first. Don't use `--recommended` from this playbook; it installs only a subset.
|
|
125
127
|
|
|
128
|
+
**Summer Games:** for every agent whose sign-in summer.games accepts (all targets except `claude-desktop`, `visual-studio`, `qoder`, `rovo-dev`, `lm-studio` and the legacy ones), setup also adds the remote `summer-games` MCP (`https://mcp.summer.games/mcp`) and prints a `Sign in once:` line. Tell the user that line once, in plain words. Their browser opens summer.games; they sign in and choose Allow. Do not wait for it; continue the playbook. If the user already added the same URL under another name (for example `summer`), setup keeps theirs and adds no second entry.
|
|
129
|
+
|
|
126
130
|
**First-install detection:** if `~/.claude/skills/` didn't exist before this command, Claude Code wasn't watching it and won't auto-detect the new files this session. Tell the user **once**: "Skills installed - restart your agent so they load." On subsequent installs (directory already existed), skills auto-detect mid-session and no restart is needed. **You can detect first-install vs upgrade by checking if `~/.claude/skills/` existed before Step 1; record the result before running setup.**
|
|
127
131
|
|
|
128
132
|
**Do NOT run `/plugin install` or any slash command.** The CLI is the supported install path; the plugin marketplace is only for users who ask for it.
|
|
@@ -370,7 +374,7 @@ matchmaking are not promised by this package.
|
|
|
370
374
|
| `summer tool <name> --args '<json>'` | Run any Summer tool from the shell — the same implementation the MCP tool uses. `summer tool --list` prints them all. |
|
|
371
375
|
| `summer mcp [--project <path> \| --instance <id>]` | Start MCP; normally auto-binds from the agent's project directory. |
|
|
372
376
|
| `summer mcp setup <agent>` | Deprecated alias of `summer setup <agent>`. |
|
|
373
|
-
| `summer setup <agent> [--yes] [--force] [--recommended] [--stable-only]` | One shot: MCP config + all skills, preview included (`--recommended` for the subset, `--stable-only` to skip preview) + doctor. Idempotent. |
|
|
377
|
+
| `summer setup <agent> [--yes] [--force] [--recommended] [--stable-only] [--no-games]` | One shot: MCP config + all skills, preview included (`--recommended` for the subset, `--stable-only` to skip preview) + doctor. Idempotent. For most agents (not Claude Desktop, Visual Studio, Qoder, Rovo Dev, LM Studio or the legacy targets) it also adds `summer-games` (`https://mcp.summer.games/mcp`: friends, parties and messages as you) unless the same URL is already listed; you sign in once through summer.games. `--no-games` skips it. |
|
|
374
378
|
|
|
375
379
|
Agents: `claude-code`, `claude-desktop`, `codex`, `cursor`, `windsurf`, `antigravity`, `cline`, `cline-cli`, `kilo-code`, `github-copilot`, `vscode-copilot`, `visual-studio`, `copilot-jetbrains`, `opencode`, `zed`, `kiro`, `goose`, `hermes`, `trae`, `qwen-code`, `kimi-code`, `crush`, `amp`, `factory`, `junie`, `warp`, `rovo-dev`, `qoder`, `grok-build`, `mistral-vibe`, `lm-studio`. Legacy (still accepted, warn on use): `gemini`, `roo-code`. Aliases: `devin`/`devin-desktop` → `windsurf`, `agy` → `antigravity`, `droid` → `factory`, `copilot` → `github-copilot`, `vscode` → `vscode-copilot`, `kilo` → `kilo-code`, `qwen` → `qwen-code`, `kimi` → `kimi-code`. Scopes: `--scope user` (default), `--scope project`.
|
|
376
380
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Command, Option } from "commander";
|
|
2
|
-
import { configureAgentMcp, resolveAgentSelection, resolveConfigScope, supportedAgents, } from "../../installer/agent-config.js";
|
|
2
|
+
import { configureAgentMcp, configureSummerGamesMcp, resolveAgentSelection, resolveConfigScope, supportedAgents, } from "../../installer/agent-config.js";
|
|
3
3
|
import { previewNote, setupSkills } from "../../installer/setup.js";
|
|
4
4
|
import { printDoctorResult, runDoctor } from "../../core/capabilities/doctor.js";
|
|
5
5
|
import { brandLine, c, sym, tildeify } from "../../core/format.js";
|
|
@@ -7,7 +7,7 @@ import { TOOLKIT_VERSION as cliVersion } from "../../core/version.js";
|
|
|
7
7
|
import { resolveDefaultChannel } from "../../installer/version-check.js";
|
|
8
8
|
import { agentLabel } from "../../installer/agent-table.js";
|
|
9
9
|
export const setupCommand = new Command("setup")
|
|
10
|
-
.description("Configure Summer Engine for an AI agent and run diagnostics")
|
|
10
|
+
.description("Configure Summer Engine for an AI agent and run diagnostics. For agents that can sign in to it, it also adds Summer Games (summer-games).")
|
|
11
11
|
.argument("[agent]", `Agent to configure: ${supportedAgents.join(", ")}`)
|
|
12
12
|
.option("--agent <agent>", `Agent to configure: ${supportedAgents.join(", ")}`)
|
|
13
13
|
.option("--scope <scope>", "Configuration scope: user or project", "user")
|
|
@@ -16,6 +16,7 @@ export const setupCommand = new Command("setup")
|
|
|
16
16
|
.option("--local-dev", "Point the agent at this checkout's built CLI (node <repo>/dist/bin/summer.js mcp) instead of npx summer-engine@latest — for testing unpublished builds. SUMMER_DEV=1 does the same.")
|
|
17
17
|
.option("--channel <dist-tag>", "npm dist-tag the agent's MCP entry runs: npx -y summer-engine@<dist-tag> mcp (default latest; use next while a release soaks on the next tag). SUMMER_CHANNEL does the same.")
|
|
18
18
|
.option("--yes", "Apply practical setup steps without prompting")
|
|
19
|
+
.option("--no-games", "Do not add the Summer Games MCP (summer-games: friends, parties and messages as you, signed in through summer.games)")
|
|
19
20
|
.option("--json", "Print setup result as JSON")
|
|
20
21
|
.option("--force", "Overwrite existing skill content (passes --force through to skills install)")
|
|
21
22
|
.option("--recommended", "Install only the recommended skill subset instead of the whole library")
|
|
@@ -34,6 +35,9 @@ export const setupCommand = new Command("setup")
|
|
|
34
35
|
localDev: Boolean(opts.localDev) || process.env.SUMMER_DEV === "1",
|
|
35
36
|
channel: opts.channel ?? process.env.SUMMER_CHANNEL ?? defaultChannel.channel,
|
|
36
37
|
});
|
|
38
|
+
const games = opts.games === false || opts.print
|
|
39
|
+
? null
|
|
40
|
+
: await configureSummerGamesMcp({ agent, scope, dryRun: opts.dryRun });
|
|
37
41
|
if (!opts.channel && !process.env.SUMMER_CHANNEL && defaultChannel.note && !opts.print) {
|
|
38
42
|
console.log(` ${c.dim(defaultChannel.note)}`);
|
|
39
43
|
}
|
|
@@ -50,18 +54,19 @@ export const setupCommand = new Command("setup")
|
|
|
50
54
|
console.log(JSON.stringify({
|
|
51
55
|
ok: doctor.ok && skills.status !== "failed",
|
|
52
56
|
config,
|
|
57
|
+
games,
|
|
53
58
|
skills,
|
|
54
59
|
doctor,
|
|
55
60
|
}, null, 2));
|
|
56
61
|
}
|
|
57
62
|
else {
|
|
58
|
-
printSetupResult(config, skills, doctor);
|
|
63
|
+
printSetupResult(config, games, skills, doctor);
|
|
59
64
|
}
|
|
60
65
|
if (!doctor.ok || skills.status === "failed") {
|
|
61
66
|
process.exit(1);
|
|
62
67
|
}
|
|
63
68
|
});
|
|
64
|
-
function printSetupResult(config, skills, doctor) {
|
|
69
|
+
function printSetupResult(config, games, skills, doctor) {
|
|
65
70
|
if (config.print) {
|
|
66
71
|
console.log(config.snippet.trimEnd());
|
|
67
72
|
return;
|
|
@@ -85,6 +90,21 @@ function printSetupResult(config, skills, doctor) {
|
|
|
85
90
|
else if (config.channel !== "latest") {
|
|
86
91
|
console.log(` ${c.dim(`(channel ${config.channel})`)} MCP server command: ${c.dim(`${config.server.command} ${config.server.args.join(" ")}`)}`);
|
|
87
92
|
}
|
|
93
|
+
if (games) {
|
|
94
|
+
const name = c.bold("Summer Games");
|
|
95
|
+
const url = c.dim(games.url);
|
|
96
|
+
if (games.existingName) {
|
|
97
|
+
console.log(` ${sym.ok()} ${name} already added as ${c.bold(games.existingName)} ${url}`);
|
|
98
|
+
}
|
|
99
|
+
else if (config.dryRun) {
|
|
100
|
+
console.log(` ${c.dim("(dry run)")} ${games.changed ? "Would add" : "Already added"} ${name} ${url}`);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
console.log(` ${sym.ok()} ${games.wrote ? "Added" : "Already added"} ${name} ${url}`);
|
|
104
|
+
}
|
|
105
|
+
if (!config.dryRun)
|
|
106
|
+
console.log(` ${c.dim(`Sign in once: ${games.signIn}`)}`);
|
|
107
|
+
}
|
|
88
108
|
if (skills.status === "installed") {
|
|
89
109
|
const installed = parseInstalledSkills(skills.stdout);
|
|
90
110
|
if (installed.length > 0) {
|
|
@@ -7,12 +7,15 @@ import { type EngineRun } from "./engine-run.js";
|
|
|
7
7
|
* focus, so it never shows on screen, unlike --headless, which has no pixels.
|
|
8
8
|
*
|
|
9
9
|
* <engine> --disable-crash-handler --summer-no-api --path <project> --resolution WxH
|
|
10
|
-
* [--scene res://...] --summer-verify <probe.gd>
|
|
11
|
-
* --summer-verify-out <dir> --summer-verify-max <s>
|
|
10
|
+
* [--scene res://...] --summer-offscreen --summer-verify <probe.gd>
|
|
11
|
+
* --summer-verify-out <dir> --summer-verify-max <s> [-- <args>]
|
|
12
12
|
*
|
|
13
|
-
* The stock probe waits for the scene to draw and settle,
|
|
14
|
-
*
|
|
15
|
-
*
|
|
13
|
+
* The stock probe waits for the scene to draw and settle, runs the steps (press
|
|
14
|
+
* a button, a key or an input action, click, drag, wait, shot) from inside the
|
|
15
|
+
* game, saves PNG frames of the game viewport, and writes results.json. The
|
|
16
|
+
* frames are what the game really draws, HUD included: use them as store
|
|
17
|
+
* screenshots. `args` reach the game as OS.get_cmdline_user_args(), so a game
|
|
18
|
+
* that skips its title screen on a flag starts in play.
|
|
16
19
|
*/
|
|
17
20
|
export interface CaptureGameplayInput {
|
|
18
21
|
/** Project root (has project.godot). Defaults to the MCP's --project, then the working directory. */
|
|
@@ -29,6 +32,49 @@ export interface CaptureGameplayInput {
|
|
|
29
32
|
intervalSeconds?: number;
|
|
30
33
|
/** Output folder. Default <project>/.summer/captures/<time>/. */
|
|
31
34
|
out?: string;
|
|
35
|
+
/** The game's own command-line args, passed after "--" (OS.get_cmdline_user_args()). */
|
|
36
|
+
args?: string[];
|
|
37
|
+
/** What to do after waitSeconds, in order. With a shot step, only shot steps save frames. */
|
|
38
|
+
steps?: CaptureStep[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* One capture step, run from inside the game. Coordinates are frame pixels
|
|
42
|
+
* (the saved PNG's space). press finds a visible, enabled button by its text,
|
|
43
|
+
* then its node name, then a partial match, waiting up to timeoutSeconds for
|
|
44
|
+
* it to appear; it clicks the button's centre, and emits pressed when the
|
|
45
|
+
* click did not reach it. key takes Godot key names (Space, Enter, Escape, A).
|
|
46
|
+
*/
|
|
47
|
+
export type CaptureStep = {
|
|
48
|
+
press: string;
|
|
49
|
+
timeoutSeconds?: number;
|
|
50
|
+
} | {
|
|
51
|
+
key: string;
|
|
52
|
+
holdMs?: number;
|
|
53
|
+
} | {
|
|
54
|
+
action: string;
|
|
55
|
+
holdMs?: number;
|
|
56
|
+
} | {
|
|
57
|
+
click: [number, number];
|
|
58
|
+
} | {
|
|
59
|
+
drag: {
|
|
60
|
+
from: [number, number];
|
|
61
|
+
to: [number, number];
|
|
62
|
+
ms?: number;
|
|
63
|
+
};
|
|
64
|
+
} | {
|
|
65
|
+
wait: number;
|
|
66
|
+
} | {
|
|
67
|
+
shot: true;
|
|
68
|
+
};
|
|
69
|
+
/** A step as the probe reads it (one shape, all fields named). */
|
|
70
|
+
export interface ProbeStep {
|
|
71
|
+
type: "press" | "key" | "action" | "click" | "drag" | "wait" | "shot";
|
|
72
|
+
text?: string;
|
|
73
|
+
timeout?: number;
|
|
74
|
+
hold_ms?: number;
|
|
75
|
+
at?: [number, number];
|
|
76
|
+
to?: [number, number];
|
|
77
|
+
ms?: number;
|
|
32
78
|
}
|
|
33
79
|
export interface CapturedFrame {
|
|
34
80
|
path: string;
|
|
@@ -44,6 +90,8 @@ export interface CaptureGameplayResult {
|
|
|
44
90
|
out: string;
|
|
45
91
|
engine: string;
|
|
46
92
|
imported: boolean;
|
|
93
|
+
/** Why the project was imported before the capture. */
|
|
94
|
+
importReason?: string;
|
|
47
95
|
durationMs: number;
|
|
48
96
|
warnings?: string[];
|
|
49
97
|
next: string;
|
|
@@ -53,6 +101,20 @@ export interface CaptureGameplayDependencies {
|
|
|
53
101
|
run: (binary: string, args: string[], timeoutMs: number) => Promise<EngineRun>;
|
|
54
102
|
now: () => Date;
|
|
55
103
|
}
|
|
104
|
+
/** Validate the steps and turn them into the probe's one shape. */
|
|
105
|
+
export declare function probeSteps(steps: unknown): ProbeStep[];
|
|
106
|
+
/**
|
|
107
|
+
* Whether the project's import caches are stale: an imported file (texture,
|
|
108
|
+
* model, sound, font) that has no .import sidecar or cache yet, or whose
|
|
109
|
+
* content changed since it was imported (a pull, or LFS files fetched after
|
|
110
|
+
* the first import). Also names files that are still Git LFS pointers, which no
|
|
111
|
+
* import can fix.
|
|
112
|
+
*/
|
|
113
|
+
export declare function importState(project: string): {
|
|
114
|
+
needed: boolean;
|
|
115
|
+
reason?: string;
|
|
116
|
+
lfsPointers: string[];
|
|
117
|
+
};
|
|
56
118
|
/** Width and height from a PNG's IHDR chunk, or null when the file is not a PNG. */
|
|
57
119
|
export declare function pngSize(bytes: Buffer): {
|
|
58
120
|
width: number;
|
|
@@ -63,7 +125,10 @@ export declare function pngSize(bytes: Buffer): {
|
|
|
63
125
|
* project); follows the verify-instance contract of assets/autopilot/probe_base.gd:
|
|
64
126
|
* the engine sets summer_out_dir and summer_max_seconds before _ready(), the
|
|
65
127
|
* first frames are empty until the scene has drawn twice, results.json is
|
|
66
|
-
* always written.
|
|
128
|
+
* always written. The steps are generated as typed calls, and nothing reads a
|
|
129
|
+
* Variant, so projects that treat every GDScript warning as an error
|
|
130
|
+
* (untyped_declaration, unsafe_call_argument, unsafe_cast, integer_division)
|
|
131
|
+
* still load it.
|
|
67
132
|
*/
|
|
68
|
-
export declare function captureProbeSource(frames: number, waitSeconds: number, intervalSeconds: number): string;
|
|
133
|
+
export declare function captureProbeSource(frames: number, waitSeconds: number, intervalSeconds: number, steps?: ProbeStep[]): string;
|
|
69
134
|
export declare function captureGameplay(input: CaptureGameplayInput, overrides?: Partial<CaptureGameplayDependencies>): Promise<CaptureGameplayResult>;
|