summer-engine 3.4.1 → 3.5.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.
Files changed (60) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +5 -1
  3. package/.codex-plugin/plugin.json +5 -1
  4. package/.cursor-plugin/plugin.json +5 -1
  5. package/.factory-plugin/plugin.json +5 -1
  6. package/CHANGELOG.md +23 -0
  7. package/README.md +5 -1
  8. package/dist/cli/commands/setup.js +24 -4
  9. package/dist/core/capabilities/capture-gameplay.d.ts +72 -7
  10. package/dist/core/capabilities/capture-gameplay.js +386 -25
  11. package/dist/core/capabilities/export-engine-version.d.ts +7 -0
  12. package/dist/core/capabilities/export-engine-version.js +9 -0
  13. package/dist/core/capabilities/export-game.d.ts +4 -0
  14. package/dist/core/capabilities/export-game.js +50 -7
  15. package/dist/core/capabilities/image-generation.d.ts +12 -2
  16. package/dist/core/capabilities/image-generation.js +31 -2
  17. package/dist/core/capabilities/publish-build.js +17 -3
  18. package/dist/core/capabilities/summer-bundle.d.ts +9 -0
  19. package/dist/core/capabilities/summer-bundle.js +19 -0
  20. package/dist/core/capabilities/tool-dispatch.js +13 -2
  21. package/dist/core/library-read.d.ts +7 -0
  22. package/dist/core/library-read.js +59 -7
  23. package/dist/core/library-search.d.ts +2 -0
  24. package/dist/installer/agent-config.d.ts +25 -0
  25. package/dist/installer/agent-config.js +114 -3
  26. package/dist/installer/agent-table.d.ts +12 -0
  27. package/dist/installer/agent-table.js +9 -0
  28. package/dist/mcp/tools/creator-tools.js +32 -3
  29. package/dist/mcp/tools/generate-tools.js +11 -30
  30. package/dist/mcp/tools/library-tools.d.ts +2 -1
  31. package/dist/mcp/tools/library-tools.js +1 -0
  32. package/gemini-extension.json +5 -1
  33. package/library/references/mcp-tools-reference/mcp-tools-reference.md +1 -1
  34. package/library/skills/README.md +11 -1
  35. package/library/skills/export-and-ship/SKILL.md +1 -1
  36. package/library/skills/export-and-ship/resource.yaml +2 -1
  37. package/library/skills/grow-analytics/SKILL.md +21 -0
  38. package/library/skills/grow-analytics/resource.yaml +27 -0
  39. package/library/skills/publish-your-game/SKILL.md +21 -0
  40. package/library/skills/publish-your-game/resource.yaml +29 -0
  41. package/library/skills/store-art/SKILL.md +23 -0
  42. package/library/skills/store-art/resource.yaml +30 -0
  43. package/library/skills/store-listing/SKILL.md +21 -0
  44. package/library/skills/store-listing/resource.yaml +25 -0
  45. package/library/skills/summer-analytics/resource.yaml +1 -0
  46. package/library/tools/capture-gameplay/resource.yaml +66 -1
  47. package/library/tools/export-game/resource.yaml +3 -0
  48. package/library/tools/generate-image/resource.yaml +4 -2
  49. package/package.json +1 -1
  50. package/registry/generated/counts.json +2 -2
  51. package/registry/generated/gemini-extension.json +5 -1
  52. package/registry/generated/index.json +153 -10
  53. package/registry/generated/marketplace.claude.json +1 -1
  54. package/registry/generated/plugin.claude.json +5 -1
  55. package/registry/generated/plugin.codex.json +5 -1
  56. package/registry/generated/plugin.cursor.json +5 -1
  57. package/registry/generated/plugin.factory.json +5 -1
  58. package/registry/generated/skills-index.md +11 -1
  59. package/registry/generated/skills-registry.json +52 -0
  60. package/registry/schemas/skill.schema.json +5 -0
@@ -11,7 +11,7 @@
11
11
  {
12
12
  "name": "summer",
13
13
  "source": "./",
14
- "version": "3.4.1",
14
+ "version": "3.5.0",
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.4.1",
5
+ "version": "3.5.0",
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.1",
4
+ "version": "3.5.0",
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.4.1",
6
+ "version": "3.5.0",
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.4.1",
5
+ "version": "3.5.0",
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,29 @@
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.0] - 2026-10-10
8
+
9
+ 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.
10
+
11
+ - **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.
12
+ - 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.
13
+ - `--no-games` skips it. To remove it: `claude mcp remove summer-games -s user` or `codex mcp remove summer-games`.
14
+ - 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.
15
+ - `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.
16
+ - `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.
17
+ - 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.
18
+ - `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`.
19
+ - `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.
20
+ - `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/`.
21
+ - `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.
22
+ - `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.
23
+
24
+ ### Added
25
+ - Skill field `hosted_resource` in `resource.yaml`: the skill's body comes from that hosted MCP resource (#90).
26
+ - `summer_capture_gameplay` `args` and `steps`; a step that cannot run (no such button, key or action) is a warning, not a failure.
27
+
5
28
  ## [3.4.1] - 2026-10-10
6
29
 
7
30
  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 Claude Code and Codex, 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: Claude Code `/mcp`, choose `summer-games`; Codex `/mcp login summer-games`. 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 `claude-code` and `codex`, 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: in Claude Code, run `/mcp`, choose `summer-games` and sign in; in Codex, run `/mcp login summer-games`. 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 Claude Code and Codex 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 Claude Code and Codex 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; Claude Code and Codex)")
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, saves PNG frames of
14
- * the game viewport, and writes results.json. The frames are what the game
15
- * really draws, HUD included: use them as store screenshots.
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>;