summer-engine 3.4.0 → 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.
- 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/.opencode/INSTALL.md +8 -8
- package/.opencode/plugins/summer.js +2 -2
- package/AGENTS.md +7 -7
- package/CHANGELOG.md +37 -0
- package/GEMINI.md +1 -1
- package/NOTICE +1 -1
- package/README.md +35 -35
- package/assets/autopilot/run.sh +2 -2
- package/assets/navigation/web-routes.json +1 -1
- package/commands/gameskill.md +2 -2
- package/commands/summer.md +25 -25
- package/dist/cli/commands/open.d.ts +1 -1
- package/dist/cli/commands/run.d.ts +1 -1
- package/dist/cli/commands/run.js +1 -1
- package/dist/cli/commands/setup.js +24 -4
- package/dist/cli/commands/skills.js +2 -2
- package/dist/core/api-client.d.ts +5 -6
- package/dist/core/api-client.js +12 -15
- package/dist/core/auth.js +2 -2
- package/dist/core/capabilities/asset-import.d.ts +0 -1
- package/dist/core/capabilities/camera-view.d.ts +1 -1
- package/dist/core/capabilities/camera-view.js +2 -2
- package/dist/core/capabilities/capture-gameplay.d.ts +72 -7
- package/dist/core/capabilities/capture-gameplay.js +386 -25
- package/dist/core/capabilities/connect-signal.d.ts +1 -2
- package/dist/core/capabilities/connect-signal.js +1 -2
- package/dist/core/capabilities/console-read.d.ts +2 -2
- package/dist/core/capabilities/console-read.js +2 -2
- package/dist/core/capabilities/engine-receipt.d.ts +5 -7
- package/dist/core/capabilities/engine-receipt.js +7 -9
- 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 +53 -10
- package/dist/core/capabilities/export-presets.d.ts +1 -1
- package/dist/core/capabilities/export-presets.js +1 -1
- package/dist/core/capabilities/fabricate-mesh.d.ts +2 -3
- package/dist/core/capabilities/fabricate-mesh.js +2 -3
- package/dist/core/capabilities/frame-quality.d.ts +4 -4
- package/dist/core/capabilities/frame-quality.js +4 -4
- package/dist/core/capabilities/grep.d.ts +1 -1
- package/dist/core/capabilities/grep.js +1 -1
- package/dist/core/capabilities/image-generation.d.ts +12 -2
- package/dist/core/capabilities/image-generation.js +31 -2
- package/dist/core/capabilities/navigation/open.d.ts +1 -1
- package/dist/core/capabilities/navigation/open.js +1 -1
- package/dist/core/capabilities/navigation/render-product-map.js +1 -1
- package/dist/core/capabilities/navigation/targets.js +2 -2
- package/dist/core/capabilities/placement-batch.d.ts +1 -1
- package/dist/core/capabilities/placement-batch.js +2 -2
- package/dist/core/capabilities/play-determinism.d.ts +1 -1
- package/dist/core/capabilities/play-determinism.js +1 -1
- package/dist/core/capabilities/publish-build.d.ts +1 -1
- package/dist/core/capabilities/publish-build.js +21 -9
- package/dist/core/capabilities/publish-download.d.ts +1 -2
- package/dist/core/capabilities/publish-download.js +2 -3
- package/dist/core/capabilities/replace-node.d.ts +1 -3
- package/dist/core/capabilities/replace-node.js +1 -3
- package/dist/core/capabilities/runtime-control.d.ts +5 -7
- package/dist/core/capabilities/runtime-control.js +7 -9
- package/dist/core/capabilities/scene-batch.d.ts +1 -1
- package/dist/core/capabilities/scene-batch.js +1 -1
- package/dist/core/capabilities/scene-kind.js +1 -1
- package/dist/core/capabilities/scene-readback.d.ts +3 -4
- package/dist/core/capabilities/scene-readback.js +3 -4
- package/dist/core/capabilities/scene-script.d.ts +2 -2
- package/dist/core/capabilities/scene-script.js +2 -2
- package/dist/core/capabilities/seeing/shot-store.d.ts +1 -1
- package/dist/core/capabilities/seeing/shot-store.js +1 -1
- package/dist/core/capabilities/summer-bundle.d.ts +11 -3
- package/dist/core/capabilities/summer-bundle.js +21 -3
- package/dist/core/capabilities/surface-snap.d.ts +1 -1
- package/dist/core/capabilities/surface-snap.js +1 -1
- package/dist/core/capabilities/tool-dispatch.js +14 -3
- package/dist/core/capabilities/ui-control.d.ts +1 -2
- package/dist/core/capabilities/ui-control.js +1 -2
- package/dist/core/capabilities/world-snapshot.d.ts +1 -1
- package/dist/core/capabilities/world-snapshot.js +1 -1
- package/dist/core/capability-skew.d.ts +2 -3
- package/dist/core/capability-skew.js +4 -5
- package/dist/core/feedback/client.js +1 -1
- package/dist/core/launch-posture.d.ts +3 -3
- package/dist/core/launch-posture.js +3 -3
- package/dist/core/library-read.d.ts +7 -0
- package/dist/core/library-read.js +60 -9
- package/dist/core/library-search.d.ts +2 -0
- package/dist/core/templates.d.ts +1 -2
- package/dist/core/templates.js +1 -2
- package/dist/installer/agent-config.d.ts +25 -0
- package/dist/installer/agent-config.js +114 -3
- package/dist/installer/agent-table.d.ts +12 -0
- package/dist/installer/agent-table.js +9 -0
- package/dist/mcp/server.d.ts +2 -2
- package/dist/mcp/server.js +2 -2
- package/dist/mcp/tools/creator-tools.js +33 -4
- package/dist/mcp/tools/debug-tools.js +1 -1
- package/dist/mcp/tools/generate-tools.js +18 -37
- package/dist/mcp/tools/library-tools.d.ts +2 -1
- package/dist/mcp/tools/library-tools.js +1 -0
- package/dist/mcp/tools/navigation-tools.d.ts +1 -1
- package/dist/mcp/tools/navigation-tools.js +1 -1
- package/dist/mcp/tools/spatial-tools.js +1 -1
- package/dist/mcp/tools/visual-tools.js +2 -2
- package/dist/mcp/tools/with-engine.d.ts +1 -2
- package/dist/mcp/tools/with-engine.js +1 -2
- package/gemini-extension.json +5 -1
- package/hooks/session-start.sh +2 -2
- package/integrations/README.md +70 -76
- package/integrations/claude/README.md +0 -3
- package/integrations/codex/README.md +1 -2
- package/integrations/copilot-jetbrains/README.md +1 -1
- package/integrations/cursor/README.md +1 -2
- package/integrations/factory/README.md +15 -11
- package/integrations/mistral-vibe/README.md +1 -1
- package/integrations/opencode/README.md +1 -1
- package/integrations/roo-code/README.md +1 -1
- package/integrations/rovo-dev/README.md +1 -1
- package/integrations/trae/README.md +1 -1
- package/integrations/windsurf/README.md +3 -3
- package/library/references/collaborative-protocol/collaborative-protocol.md +5 -5
- package/library/references/gd-style/gd-style.md +4 -6
- package/library/references/godot-version/godot-version.md +3 -3
- package/library/references/headless-routing/headless-routing.md +2 -2
- package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +2 -2
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +16 -15
- package/library/references/product-map/product-map.md +1 -1
- package/library/references/public-surface-language/public-surface-language.md +1 -1
- package/library/references/summer-folder/summer-folder.md +1 -1
- package/library/skills/3d-lighting/SKILL.md +4 -4
- package/library/skills/README.md +16 -6
- package/library/skills/adaptive-music/SKILL.md +7 -7
- package/library/skills/ai-characters-in-games/SKILL.md +1 -1
- package/library/skills/ambient-bed/SKILL.md +12 -14
- package/library/skills/animated-loop/SKILL.md +42 -42
- package/library/skills/animation-tree/SKILL.md +6 -6
- package/library/skills/art-direction/SKILL.md +8 -11
- package/library/skills/asset-strategy/SKILL.md +3 -3
- package/library/skills/audio-direction/SKILL.md +8 -10
- package/library/skills/auto-fire-targeting/SKILL.md +4 -3
- package/library/skills/bounded-engine-runs/SKILL.md +6 -7
- package/library/skills/brainstorm-game/SKILL.md +5 -5
- package/library/skills/brainstorming/SKILL.md +9 -15
- package/library/skills/celeste-momentum-platforming/SKILL.md +8 -13
- package/library/skills/celeste-momentum-platforming/resource.yaml +1 -1
- package/library/skills/character-animation-wiring/SKILL.md +2 -2
- package/library/skills/character-model/SKILL.md +15 -26
- package/library/skills/character-movement/SKILL.md +1 -1
- package/library/skills/character-movement/references/movement-3d.md +1 -1
- package/library/skills/character-portrait/SKILL.md +4 -4
- package/library/skills/cinematic-cutscene/SKILL.md +38 -38
- package/library/skills/combat-basics/SKILL.md +1 -1
- package/library/skills/compatibility-renderer-traps/SKILL.md +2 -2
- package/library/skills/concept-art/SKILL.md +3 -3
- package/library/skills/create-asset-sheet/SKILL.md +12 -31
- package/library/skills/debug/SKILL.md +5 -4
- package/library/skills/debugging-game-feel/SKILL.md +1 -4
- package/library/skills/debugging-game-feel/resource.yaml +1 -1
- package/library/skills/design-level/SKILL.md +5 -5
- package/library/skills/design-mechanic/SKILL.md +6 -6
- package/library/skills/design-npc/SKILL.md +8 -15
- package/library/skills/diagnosing-perf-regressions/SKILL.md +5 -10
- package/library/skills/dispatching-parallel-agents/SKILL.md +1 -19
- package/library/skills/environment-kit/SKILL.md +5 -5
- package/library/skills/export-and-ship/SKILL.md +24 -25
- package/library/skills/export-and-ship/resource.yaml +2 -1
- package/library/skills/fabricating-assets/SKILL.md +1 -1
- package/library/skills/facial-and-lipsync/SKILL.md +5 -5
- package/library/skills/fps-controller/SKILL.md +17 -16
- package/library/skills/fps-controller/resource.yaml +0 -2
- package/library/skills/game-feel/SKILL.md +6 -7
- package/library/skills/gameskill/SKILL.md +3 -3
- package/library/skills/gdscript-patterns/SKILL.md +3 -3
- package/library/skills/generate-motion/SKILL.md +5 -22
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +72 -90
- package/library/skills/godogen-visual-proof-game-generation/resource.yaml +0 -1
- package/library/skills/grow-analytics/SKILL.md +21 -0
- package/library/skills/grow-analytics/resource.yaml +27 -0
- package/library/skills/headless-scripting/SKILL.md +8 -8
- package/library/skills/instantiate-asset-pack/SKILL.md +7 -3
- package/library/skills/investigating-bugs/SKILL.md +3 -11
- package/library/skills/investigating-bugs/condition-based-waiting.md +0 -10
- package/library/skills/investigating-bugs/root-cause-tracing.md +0 -8
- package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +15 -15
- package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +0 -1
- package/library/skills/make-game/SKILL.md +3 -5
- package/library/skills/make-game/references/2d-platformer.md +1 -1
- package/library/skills/multiplayer-project/SKILL.md +1 -1
- package/library/skills/multiplayer-testing/SKILL.md +4 -4
- package/library/skills/music-track/SKILL.md +40 -38
- package/library/skills/new-project/SKILL.md +4 -6
- package/library/skills/organic-model/SKILL.md +9 -9
- package/library/skills/pixel-art/SKILL.md +6 -6
- package/library/skills/play/SKILL.md +3 -4
- package/library/skills/playtesting-a-feature/SKILL.md +4 -6
- package/library/skills/procedural-animation/SKILL.md +10 -11
- package/library/skills/prop-model/SKILL.md +4 -4
- package/library/skills/psx-retro-rendering/SKILL.md +20 -20
- package/library/skills/psx-retro-rendering/resource.yaml +2 -3
- package/library/skills/publish-your-game/SKILL.md +21 -0
- package/library/skills/publish-your-game/resource.yaml +29 -0
- package/library/skills/realtime-wet-surfaces/SKILL.md +15 -15
- package/library/skills/realtime-wet-surfaces/resource.yaml +1 -2
- package/library/skills/remote-deploy/SKILL.md +20 -21
- package/library/skills/retarget/SKILL.md +19 -23
- package/library/skills/running-in-the-cloud/SKILL.md +5 -5
- package/library/skills/scene-composition/SKILL.md +5 -5
- package/library/skills/scene-hierarchy-design/SKILL.md +3 -3
- package/library/skills/scene-hierarchy-design/resource.yaml +0 -1
- package/library/skills/scene-scripting/SKILL.md +3 -3
- package/library/skills/scene-to-level/SKILL.md +28 -31
- package/library/skills/skill-create/SKILL.md +1 -1
- package/library/skills/skill-improve/SKILL.md +9 -9
- package/library/skills/skill-test/SKILL.md +10 -10
- package/library/skills/skintokens-auto-rigging/SKILL.md +18 -18
- package/library/skills/skintokens-auto-rigging/resource.yaml +3 -3
- package/library/skills/skybox-panorama/SKILL.md +8 -9
- package/library/skills/sound-effect/SKILL.md +19 -19
- package/library/skills/spatial-placement/SKILL.md +2 -2
- package/library/skills/spatial-placement/references/kit-placement-tools.md +12 -22
- package/library/skills/sprite-sheet/SKILL.md +10 -10
- 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/SKILL.md +3 -3
- package/library/skills/summer-analytics/resource.yaml +1 -0
- package/library/skills/summer-friends/SKILL.md +10 -10
- package/library/skills/summer-leaderboards/SKILL.md +6 -6
- package/library/skills/summer-match-results/SKILL.md +13 -13
- package/library/skills/summer-matchmaking/SKILL.md +11 -11
- package/library/skills/summer-parties/SKILL.md +9 -9
- package/library/skills/summer-player-data/SKILL.md +12 -12
- package/library/skills/summer-store/SKILL.md +6 -6
- package/library/skills/summer-world-chat/SKILL.md +9 -9
- package/library/skills/summer-world-saves/SKILL.md +7 -7
- package/library/skills/text-to-motion/rigging-for-text-motion.md +1 -1
- package/library/skills/tileable-texture/SKILL.md +1 -1
- package/library/skills/trailer-shot/SKILL.md +36 -36
- package/library/skills/tune-performance/SKILL.md +13 -13
- package/library/skills/tune-performance/resource.yaml +1 -1
- package/library/skills/ui-graphics/SKILL.md +7 -7
- package/library/skills/use-widget-asset/SKILL.md +7 -7
- package/library/skills/using-summer/SKILL.md +5 -7
- package/library/skills/vehicle-model/SKILL.md +6 -7
- package/library/skills/vehicle-model/resource.yaml +2 -2
- package/library/skills/verification-before-completion/SKILL.md +5 -6
- package/library/skills/vfx-dissolve/SKILL.md +4 -4
- package/library/skills/vfx-fire/SKILL.md +6 -6
- package/library/skills/vfx-fire/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-hit-spark/SKILL.md +4 -4
- package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-lightning/SKILL.md +5 -5
- package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-lightning/_building-blocks/trauma-shake-snippet.md +9 -3
- package/library/skills/vfx-magic-glow/SKILL.md +4 -4
- package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-muzzle-flash/SKILL.md +5 -5
- package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +9 -3
- package/library/skills/vfx-smoke/SKILL.md +5 -5
- package/library/skills/vfx-water-ripple/SKILL.md +2 -2
- package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/voice-line/SKILL.md +9 -9
- package/library/skills/world-building-3d/references/spatial-tools.md +2 -2
- package/library/skills/writing-plans/SKILL.md +4 -4
- package/library/skills/writing-skills/SKILL.md +8 -8
- package/library/tools/capture-gameplay/resource.yaml +66 -1
- package/library/tools/creator-publish/resource.yaml +4 -4
- package/library/tools/creator-releases/resource.yaml +5 -5
- package/library/tools/export-game/resource.yaml +3 -0
- package/library/tools/generate-image/resource.yaml +4 -2
- package/library/tools/publish-build/resource.yaml +5 -1
- 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 +280 -137
- 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 +16 -6
- package/registry/generated/skills-registry.json +57 -5
- package/registry/schemas/domains.json +1 -1
- package/registry/schemas/skill.schema.json +5 -0
package/commands/gameskill.md
CHANGED
|
@@ -5,10 +5,10 @@ allowed-tools: Read Write Edit Glob Grep Bash Skill
|
|
|
5
5
|
|
|
6
6
|
# /gameskill — capture session learnings
|
|
7
7
|
|
|
8
|
-
Activate the library skill `
|
|
8
|
+
Activate the library skill `gameskill` and follow it exactly; this command is only the entry point. If the `Skill` tool cannot find it, read `library/skills/gameskill/SKILL.md` from the Summer package (the plugin root, or `node_modules/summer-engine/`) and follow that file.
|
|
9
9
|
|
|
10
10
|
Ground rules the skill enforces, so you do not drift while it loads:
|
|
11
11
|
|
|
12
|
-
- Default home is the game project's own skills directory for the agent you are in (`.claude/skills/<slug>/`, `.agents/skills/<slug
|
|
12
|
+
- Default home is the game project's own skills directory for the agent you are in (`.claude/skills/<slug>/`, `.agents/skills/<slug>/`). Only inside a checkout of the Summer repo (`summerengine/summer`) do you add to `library/skills/<slug>/` (`resource.yaml` + `SKILL.md`, flat slugs); everything in `registry/generated/` and every plugin manifest is generated from it, so run `npm run generate:registry` after editing and never hand-edit those files. From anywhere else, send general lessons through `summer_library_feedback`.
|
|
13
13
|
- Capture only learnings that are non-obvious AND general. Lead with the why. Real working code from the active project beats invented examples. VFX is shader + GDScript + node setup, never an image-generation pipeline.
|
|
14
14
|
- It is fine to report "session was tactical, no durable learnings." Do not manufacture skills.
|
package/commands/summer.md
CHANGED
|
@@ -20,43 +20,43 @@ You know the engine cold. Scenes are `.tscn`, resources are `.tres`, scripts are
|
|
|
20
20
|
|
|
21
21
|
You are opinionated about scope. When the user describes three features in one sentence, ask which one is the playable demo and defer the other two. "Wouldn't it be cool if" gets "yes, after the core loop runs." Get the core loop into the player's hands by the end of the session, then iterate. Polish happens after the game is playable, not before.
|
|
22
22
|
|
|
23
|
-
You speak game-dev shorthand (PCs, NPCs, juice, hit-stop, root motion, blendspace, navmesh, kinematic vs rigid) and assume the user knows it.
|
|
23
|
+
You speak game-dev shorthand (PCs, NPCs, juice, hit-stop, root motion, blendspace, navmesh, kinematic vs rigid) and assume the user knows it. Asset generation spends the user's credits, so you say what you will generate before you spend them.
|
|
24
24
|
|
|
25
25
|
## What to do
|
|
26
26
|
|
|
27
27
|
1. Detect the request shape (new game / new feature / new asset / bug / discussion / build).
|
|
28
|
-
2. Confirm Summer Engine context. Call `summer_get_project_context` if available. If it returns nothing, the user is not in a Summer project yet — route to `
|
|
28
|
+
2. Confirm Summer Engine context. Call `summer_get_project_context` if available. If it returns nothing, the user is not in a Summer project yet — route to the `brainstorm-game` skill.
|
|
29
29
|
3. Invoke the right Summer skill with the `Skill` tool. Do not paraphrase the skill; let the specialist run and follow it exactly.
|
|
30
|
-
4.
|
|
30
|
+
4. Before any generation call, say what you will generate and roughly how long it takes, and wait for an OK.
|
|
31
31
|
|
|
32
32
|
## Routing
|
|
33
33
|
|
|
34
|
-
Skills are
|
|
34
|
+
Skills are invoked by their bare slug, such as `brainstorm-game`. There is no `summer:` prefix and there are no category paths.
|
|
35
35
|
|
|
36
36
|
| Request shape | First skill |
|
|
37
37
|
|---|---|
|
|
38
|
-
| brainstorm a [genre] game / let's make a [genre] / I'm stuck / what should I work on | `
|
|
39
|
-
| start a new project | `
|
|
40
|
-
| make me a game from scratch | `
|
|
41
|
-
| add a [character / enemy / NPC / prop / vehicle] | `
|
|
42
|
-
| add a sound for [event] | `
|
|
43
|
-
| add ambient music | `
|
|
44
|
-
| make me fire / smoke / lightning / muzzle flash / magic glow / hit spark / dissolve / water ripple | `
|
|
45
|
-
| build the FPS controller | `
|
|
46
|
-
| debug / the game crashes when [X] / broken behavior / cloud or Codex failure / send this to support | `
|
|
47
|
-
| add an animation to [character] | `
|
|
48
|
-
| wire up a state machine for [character] | `
|
|
49
|
-
| the game feels mushy / add juice | `
|
|
50
|
-
| ship a trailer | `
|
|
51
|
-
| cutscene for [X] | `
|
|
52
|
-
| let me play it | `
|
|
53
|
-
|
|
54
|
-
If nothing fits, activate `
|
|
38
|
+
| brainstorm a [genre] game / let's make a [genre] / I'm stuck / what should I work on | `brainstorm-game` |
|
|
39
|
+
| start a new project | `new-project` |
|
|
40
|
+
| make me a game from scratch | `make-game` |
|
|
41
|
+
| add a [character / enemy / NPC / prop / vehicle] | `asset-strategy` |
|
|
42
|
+
| add a sound for [event] | `sound-effect` |
|
|
43
|
+
| add ambient music | `music-track` |
|
|
44
|
+
| make me fire / smoke / lightning / muzzle flash / magic glow / hit spark / dissolve / water ripple | `vfx-fire`, `vfx-smoke`, `vfx-lightning`, `vfx-muzzle-flash`, `vfx-magic-glow`, `vfx-hit-spark`, `vfx-dissolve`, `vfx-water-ripple` |
|
|
45
|
+
| build the FPS controller | `fps-controller` |
|
|
46
|
+
| debug / the game crashes when [X] / broken behavior / cloud or Codex failure / send this to support | `debug` (support-report mode first: call `summer_create_debug_report` when available and tell the user where the Markdown report was written; keep fixing only if they also asked for a fix) |
|
|
47
|
+
| add an animation to [character] | `generate-motion` |
|
|
48
|
+
| wire up a state machine for [character] | `animation-tree` |
|
|
49
|
+
| the game feels mushy / add juice | `game-feel` |
|
|
50
|
+
| ship a trailer | `trailer-shot` |
|
|
51
|
+
| cutscene for [X] | `cinematic-cutscene` |
|
|
52
|
+
| let me play it | `play` |
|
|
53
|
+
|
|
54
|
+
If nothing fits, activate `using-summer` and call `summer_search_library` (then `summer_read_library`) to find the closest skill. Never invent a skill name; verify it exists first.
|
|
55
55
|
|
|
56
56
|
## Tone rules
|
|
57
57
|
|
|
58
58
|
- No corporate hedging. "I'd recommend" becomes "do this." "It might be worth considering" becomes "next step is."
|
|
59
|
-
-
|
|
59
|
+
- Ask before spending: "Generating a 5s clip with kling, about 3 minutes. OK?" Never "I'll generate a video now."
|
|
60
60
|
- Scope-aware: the cut list goes in `.summer/GameSoul.md`, not in V1.
|
|
61
61
|
- Confirm before destructive moves: replacing nodes, deleting assets, regenerating expensive outputs.
|
|
62
62
|
- Do not redirect users to external docs; solve it in-conversation.
|
|
@@ -70,12 +70,12 @@ If nothing fits, activate `summer:using-summer` and call `summer_search_library`
|
|
|
70
70
|
|
|
71
71
|
> User: /summer make a knight
|
|
72
72
|
>
|
|
73
|
-
> Summer: Knight character. asset-strategy first to lock the look (concept image), then character-model for the rigged mesh.
|
|
73
|
+
> Summer: Knight character. asset-strategy first to lock the look (concept image), then character-model for the rigged mesh. Two generations. OK?
|
|
74
74
|
>
|
|
75
|
-
> [invokes `
|
|
75
|
+
> [invokes `asset-strategy`]
|
|
76
76
|
|
|
77
77
|
> User: /summer the game crashes when I pick up the sword
|
|
78
78
|
>
|
|
79
79
|
> Summer: Going to debug. Writing the support report first, then the fix.
|
|
80
80
|
>
|
|
81
|
-
> [invokes `
|
|
81
|
+
> [invokes `debug`]
|
|
@@ -7,7 +7,7 @@ import { type OpenDeps, type OpenResult, type OpenSurface } from "../../core/cap
|
|
|
7
7
|
* Summer Engine (launching it when it is not running). Any argument that is
|
|
8
8
|
* an existing directory or looks like a filesystem path takes this branch,
|
|
9
9
|
* so nothing that worked before changes.
|
|
10
|
-
* 2. `summer open <target>` — navigation
|
|
10
|
+
* 2. `summer open <target>` — navigation:
|
|
11
11
|
* a product-map id ("billing"), an intent phrase ("change my plan"), a
|
|
12
12
|
* res:// path, or a summerengine.com path. Same behavior as the
|
|
13
13
|
* summer_open MCP tool and `summer tool open` (core/capabilities/navigation).
|
|
@@ -13,7 +13,7 @@ export type RunBinaryResolution = {
|
|
|
13
13
|
* (findEngineBinary, which also honours the older SUMMER_ENGINE_BINARY).
|
|
14
14
|
* An explicit override is never silently swapped for the installed engine:
|
|
15
15
|
* a missing path or a bare `.app` bundle is an error, because the caller
|
|
16
|
-
* asked for THAT build
|
|
16
|
+
* asked for THAT build.
|
|
17
17
|
*/
|
|
18
18
|
export declare function resolveRunBinary(binFlag: string | undefined, env?: NodeJS.ProcessEnv): RunBinaryResolution;
|
|
19
19
|
export declare const runCommand: Command;
|
package/dist/cli/commands/run.js
CHANGED
|
@@ -79,7 +79,7 @@ async function withLaunchLock(fn) {
|
|
|
79
79
|
* (findEngineBinary, which also honours the older SUMMER_ENGINE_BINARY).
|
|
80
80
|
* An explicit override is never silently swapped for the installed engine:
|
|
81
81
|
* a missing path or a bare `.app` bundle is an error, because the caller
|
|
82
|
-
* asked for THAT build
|
|
82
|
+
* asked for THAT build.
|
|
83
83
|
*/
|
|
84
84
|
export function resolveRunBinary(binFlag, env = process.env) {
|
|
85
85
|
const fromEnv = engineBinaryOverride(env);
|
|
@@ -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) {
|
|
@@ -340,7 +340,7 @@ skillsCommand
|
|
|
340
340
|
console.log(previewIncludedLine(previewIncluded));
|
|
341
341
|
if (previewSkipped > 0)
|
|
342
342
|
console.log(previewSkippedLine(previewSkipped));
|
|
343
|
-
// Claude Code: also install slash commands (`
|
|
343
|
+
// Claude Code: also install slash commands (`commands/*.md`)
|
|
344
344
|
// into `~/.claude/commands/`. Other agents don't have an equivalent today.
|
|
345
345
|
if (agent === "claude-code") {
|
|
346
346
|
const commandResults = installClaudeCommands(scope, Boolean(opts.force));
|
|
@@ -352,7 +352,7 @@ skillsCommand
|
|
|
352
352
|
printInstallSummary(skills.length, agent, scope, location);
|
|
353
353
|
});
|
|
354
354
|
/**
|
|
355
|
-
* Copy every `.md` file in `
|
|
355
|
+
* Copy every `.md` file in the package's `commands/` to the user's
|
|
356
356
|
* `~/.claude/commands/` directory so the slash commands (e.g. `/gameskill`)
|
|
357
357
|
* are available on every machine that runs `summer skills install`.
|
|
358
358
|
*
|
|
@@ -22,7 +22,7 @@ export type EngineSnapshot = {
|
|
|
22
22
|
/** Structured failure classifier the engine returns on a game snapshot over
|
|
23
23
|
* local HTTP (409 `bridge_required`) — surfaced verbatim so the tool can give
|
|
24
24
|
* an honest, actionable message instead of a truncated generic 409 string.
|
|
25
|
-
*
|
|
25
|
+
* Once game snapshots answer 200/202 over HTTP this simply
|
|
26
26
|
* never fires and the tool works. */
|
|
27
27
|
failureReason?: string;
|
|
28
28
|
/** Scene-preview confession fields (P4.3). Populated only for target:"scene".
|
|
@@ -194,8 +194,8 @@ export declare class EngineApiClient {
|
|
|
194
194
|
private _parseSnapshotResponse;
|
|
195
195
|
/**
|
|
196
196
|
* Turn a 409 from /api/snapshot/game into a structured failure. The engine's
|
|
197
|
-
* structural refusal carries `bridge_required` / `unsupported_transport
|
|
198
|
-
*
|
|
197
|
+
* structural refusal carries `bridge_required` / `unsupported_transport`;
|
|
198
|
+
* a 409 without that shape is surfaced as a
|
|
199
199
|
* plain error rather than silently claiming "bridge required".
|
|
200
200
|
*/
|
|
201
201
|
private _bridgeRequiredFromResponse;
|
|
@@ -246,9 +246,8 @@ export declare class EngineApiClient {
|
|
|
246
246
|
getPort(): number;
|
|
247
247
|
/**
|
|
248
248
|
* Cheap drift probe for the MCP client cache. The engine mints a fresh
|
|
249
|
-
* api-token on every launch
|
|
250
|
-
*
|
|
251
|
-
* the old socket lingers), so a client built before an engine restart holds
|
|
249
|
+
* api-token on every launch and can bind a different port (it increments
|
|
250
|
+
* 6550..6565 when the old socket lingers), so a client built before an engine restart holds
|
|
252
251
|
* dead credentials. Re-read the on-disk creds and report whether they no longer
|
|
253
252
|
* match this client's snapshot.
|
|
254
253
|
*
|
package/dist/core/api-client.js
CHANGED
|
@@ -492,8 +492,7 @@ export class EngineApiClient {
|
|
|
492
492
|
async getSceneState(scenePath, options) {
|
|
493
493
|
// depth/limit/root only take effect on targeted (scene=) reads: the engine
|
|
494
494
|
// routes those through the live command queue and forwards every query
|
|
495
|
-
// param into
|
|
496
|
-
// _parse_state_args). An UNtargeted read is answered from a pre-published
|
|
495
|
+
// param into the engine's scene-state reader. An UNtargeted read is answered from a pre-published
|
|
497
496
|
// snapshot built with the defaults (depth 2, limit 200) and its query
|
|
498
497
|
// params are ignored — callers who need depth/limit must pass scenePath
|
|
499
498
|
// (summer_get_scene_tree resolves the current scene path for this).
|
|
@@ -515,9 +514,8 @@ export class EngineApiClient {
|
|
|
515
514
|
async getProjectState(prefix) {
|
|
516
515
|
// ?prefix= is sent for forward-compatibility, but current engine builds
|
|
517
516
|
// IGNORE it: /api/state/project is always served from the snapshot, which
|
|
518
|
-
// is published with empty args
|
|
519
|
-
//
|
|
520
|
-
// query. Callers that need a prefix subset must also filter client-side
|
|
517
|
+
// is published with empty args, so the engine's project-state reader never
|
|
518
|
+
// sees the query. Callers that need a prefix subset must also filter client-side
|
|
521
519
|
// (summer_get_project_context does).
|
|
522
520
|
const query = prefix ? `?prefix=${encodeURIComponent(prefix)}` : "";
|
|
523
521
|
return this.request("GET", `/api/state/project${query}`);
|
|
@@ -542,13 +540,13 @@ export class EngineApiClient {
|
|
|
542
540
|
if (pins) {
|
|
543
541
|
// Determinism params (seed / fixed_fps / time_scale) — the /api/play rung
|
|
544
542
|
// copies ONLY `scene` from options into the PlayGame op
|
|
545
|
-
// (
|
|
543
|
+
// (the engine's /api/play handler), so a pinned launch travels as an
|
|
546
544
|
// explicit PlayGame op through /api/ops. executeOps stamps the bound
|
|
547
545
|
// identity like every other op. An engine that predates the params
|
|
548
546
|
// ignores the extra keys and answers the v1 result (no `determinism`).
|
|
549
547
|
return this.executeOps([{ op: "PlayGame", ...(scene ? { scene } : {}), ...pins }], undefined, 60_000);
|
|
550
548
|
}
|
|
551
|
-
// The engine reads play params from body.options
|
|
549
|
+
// The engine reads play params from body.options,
|
|
552
550
|
// and the play handler reads options["scene"] — a top-level { scene } is
|
|
553
551
|
// dropped, so the scene MUST be nested inside options. The bound identity
|
|
554
552
|
// rides in the same options dict so play is refused on a mismatched project.
|
|
@@ -593,10 +591,10 @@ export class EngineApiClient {
|
|
|
593
591
|
// with the same payload shape — _requestQueued resolves both.
|
|
594
592
|
//
|
|
595
593
|
// Game capture over local HTTP structurally 409s today with a STRUCTURED
|
|
596
|
-
// reason (`failure_reason:"unsupported_transport"`, `bridge_required:true
|
|
597
|
-
//
|
|
594
|
+
// reason (`failure_reason:"unsupported_transport"`, `bridge_required:true`).
|
|
595
|
+
// Detect that specific shape and return it
|
|
598
596
|
// verbatim so the tool can give an honest message — do NOT hardcode "game
|
|
599
|
-
// always fails": once the engine answers 200/202
|
|
597
|
+
// always fails": once the engine answers 200/202, the same response
|
|
600
598
|
// flows into the normal queued path. ONE request either way: a probe that
|
|
601
599
|
// discarded a 200 (or orphaned an accepted 202 requestId) and then asked
|
|
602
600
|
// again would capture the game twice.
|
|
@@ -681,8 +679,8 @@ export class EngineApiClient {
|
|
|
681
679
|
}
|
|
682
680
|
/**
|
|
683
681
|
* Turn a 409 from /api/snapshot/game into a structured failure. The engine's
|
|
684
|
-
* structural refusal carries `bridge_required` / `unsupported_transport
|
|
685
|
-
*
|
|
682
|
+
* structural refusal carries `bridge_required` / `unsupported_transport`;
|
|
683
|
+
* a 409 without that shape is surfaced as a
|
|
686
684
|
* plain error rather than silently claiming "bridge required".
|
|
687
685
|
*/
|
|
688
686
|
async _bridgeRequiredFromResponse(res) {
|
|
@@ -777,9 +775,8 @@ export class EngineApiClient {
|
|
|
777
775
|
}
|
|
778
776
|
/**
|
|
779
777
|
* Cheap drift probe for the MCP client cache. The engine mints a fresh
|
|
780
|
-
* api-token on every launch
|
|
781
|
-
*
|
|
782
|
-
* the old socket lingers), so a client built before an engine restart holds
|
|
778
|
+
* api-token on every launch and can bind a different port (it increments
|
|
779
|
+
* 6550..6565 when the old socket lingers), so a client built before an engine restart holds
|
|
783
780
|
* dead credentials. Re-read the on-disk creds and report whether they no longer
|
|
784
781
|
* match this client's snapshot.
|
|
785
782
|
*
|
package/dist/core/auth.js
CHANGED
|
@@ -161,8 +161,8 @@ export async function saveLoginSession(session) {
|
|
|
161
161
|
// those exact files. credential-metadata.json adds audience/scope information
|
|
162
162
|
// without changing or duplicating the secret.
|
|
163
163
|
// Write order: user.json, then auth-token, then the advisory metadata. The
|
|
164
|
-
// desktop engine cross-checks token.sub against user.json's id
|
|
165
|
-
//
|
|
164
|
+
// desktop engine cross-checks token.sub against user.json's id when it
|
|
165
|
+
// adopts the CLI credential, so a
|
|
166
166
|
// write interrupted between the first two files fails closed instead of
|
|
167
167
|
// adopting a mismatched identity. The metadata write is last and is NOT a
|
|
168
168
|
// gate: the token is already live by then, and its contents are re-derived
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* Asset import into the engine-bound project (Kenney texture pairing + path
|
|
3
3
|
* inference + optional scene placement). ONE copy shared by the MCP asset tools
|
|
4
4
|
* and the CLI dispatch table.
|
|
5
|
-
* See: publicsummerengine/Docs/ASSET_IMPORT_END_TO_END.md
|
|
6
5
|
*/
|
|
7
6
|
import type { EngineApiClient } from "../api-client.js";
|
|
8
7
|
/** An asset record as returned by the Summer gateway asset APIs. */
|
|
@@ -4,7 +4,7 @@ export type CameraBookmarkAction = (typeof CAMERA_BOOKMARK_ACTIONS)[number];
|
|
|
4
4
|
export declare const CAMERA_BOOKMARK_OPS: Record<CameraBookmarkAction, string>;
|
|
5
5
|
/** What the engine_lacks_op result tells the model to do instead. */
|
|
6
6
|
export declare const CAMERA_BOOKMARK_FALLBACK = "pass the pose explicitly on every capture with summer_screenshot framing:\"free\" (camera_position + camera_look_at), or render through a Camera3D placed in the scene with framing:\"camera\"";
|
|
7
|
-
/** Bookmark name grammar (
|
|
7
|
+
/** Bookmark name grammar (same as the engine's): 1-64 of [A-Za-z0-9_-]. */
|
|
8
8
|
export declare const BOOKMARK_NAME_PATTERN: RegExp;
|
|
9
9
|
export interface CameraBookmarkArgs {
|
|
10
10
|
action: CameraBookmarkAction;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* and the CLI dispatcher so both faces validate the same way and send the same
|
|
5
5
|
* op.
|
|
6
6
|
*
|
|
7
|
-
* Engine contract
|
|
7
|
+
* Engine contract:
|
|
8
8
|
* SaveCameraBookmark { name, position?, look_at?, fov? } -> pose_source
|
|
9
9
|
* ListCameraBookmarks {} -> names, bookmarks
|
|
10
10
|
* DeleteCameraBookmark { name } -> remaining
|
|
@@ -25,7 +25,7 @@ export const CAMERA_BOOKMARK_OPS = {
|
|
|
25
25
|
};
|
|
26
26
|
/** What the engine_lacks_op result tells the model to do instead. */
|
|
27
27
|
export const CAMERA_BOOKMARK_FALLBACK = "pass the pose explicitly on every capture with summer_screenshot framing:\"free\" (camera_position + camera_look_at), or render through a Camera3D placed in the scene with framing:\"camera\"";
|
|
28
|
-
/** Bookmark name grammar (
|
|
28
|
+
/** Bookmark name grammar (same as the engine's): 1-64 of [A-Za-z0-9_-]. */
|
|
29
29
|
export const BOOKMARK_NAME_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
|
|
30
30
|
function requireBookmarkName(name, action) {
|
|
31
31
|
const trimmed = name?.trim() ?? "";
|
|
@@ -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>;
|