summer-engine 2.5.0 → 2.6.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 +2 -2
- package/.claude-plugin/plugin.json +5 -4
- package/.codex-plugin/plugin.json +5 -4
- package/.cursor-plugin/plugin.json +4 -3
- package/.factory-plugin/plugin.json +3 -3
- package/AGENTS.md +6 -4
- package/CHANGELOG.md +20 -2
- package/GEMINI.md +3 -3
- package/README.md +113 -100
- package/dist/bin/summer.js +6 -1
- package/dist/commands/cloud.d.ts +2 -0
- package/dist/commands/cloud.js +80 -0
- package/dist/commands/doctor.js +19 -0
- package/dist/commands/login.js +4 -1
- package/dist/commands/logout.js +1 -1
- package/dist/commands/open.js +1 -1
- package/dist/commands/plan.d.ts +2 -0
- package/dist/commands/plan.js +60 -0
- package/dist/commands/run.js +132 -35
- package/dist/lib/api-client.js +4 -1
- package/dist/lib/auth.d.ts +2 -0
- package/dist/lib/auth.js +13 -0
- package/dist/lib/cloud/api.d.ts +79 -0
- package/dist/lib/cloud/api.js +107 -0
- package/dist/lib/cloud/apply.d.ts +32 -0
- package/dist/lib/cloud/apply.js +294 -0
- package/dist/lib/cloud/checkpoint.d.ts +26 -0
- package/dist/lib/cloud/checkpoint.js +142 -0
- package/dist/lib/cloud/conflicts.d.ts +55 -0
- package/dist/lib/cloud/conflicts.js +131 -0
- package/dist/lib/cloud/containment.d.ts +8 -0
- package/dist/lib/cloud/containment.js +52 -0
- package/dist/lib/cloud/diff.d.ts +39 -0
- package/dist/lib/cloud/diff.js +138 -0
- package/dist/lib/cloud/engine-bridge.d.ts +21 -0
- package/dist/lib/cloud/engine-bridge.js +105 -0
- package/dist/lib/cloud/hash-cache.d.ts +23 -0
- package/dist/lib/cloud/hash-cache.js +44 -0
- package/dist/lib/cloud/hash.d.ts +10 -0
- package/dist/lib/cloud/hash.js +111 -0
- package/dist/lib/cloud/http.d.ts +17 -0
- package/dist/lib/cloud/http.js +47 -0
- package/dist/lib/cloud/lock-path.d.ts +1 -0
- package/dist/lib/cloud/lock-path.js +5 -0
- package/dist/lib/cloud/lock.d.ts +14 -0
- package/dist/lib/cloud/lock.js +143 -0
- package/dist/lib/cloud/manifest.d.ts +6 -0
- package/dist/lib/cloud/manifest.js +41 -0
- package/dist/lib/cloud/paths.d.ts +20 -0
- package/dist/lib/cloud/paths.js +90 -0
- package/dist/lib/cloud/project-godot-merge.d.ts +32 -0
- package/dist/lib/cloud/project-godot-merge.js +185 -0
- package/dist/lib/cloud/rules.d.ts +39 -0
- package/dist/lib/cloud/rules.js +159 -0
- package/dist/lib/cloud/sync.d.ts +21 -0
- package/dist/lib/cloud/sync.js +518 -0
- package/dist/lib/cloud/transfer.d.ts +23 -0
- package/dist/lib/cloud/transfer.js +184 -0
- package/dist/lib/cloud/types.d.ts +62 -0
- package/dist/lib/cloud/types.js +1 -0
- package/dist/lib/cloud/validate-path.d.ts +23 -0
- package/dist/lib/cloud/validate-path.js +103 -0
- package/dist/lib/engine.d.ts +6 -0
- package/dist/lib/engine.js +36 -1
- package/dist/lib/game-task-plan.d.ts +42 -0
- package/dist/lib/game-task-plan.js +376 -0
- package/dist/mcp/server.js +2 -0
- package/dist/mcp/tools/asset-tools.js +265 -45
- package/dist/mcp/tools/cloud-tools.d.ts +2 -0
- package/dist/mcp/tools/cloud-tools.js +42 -0
- package/dist/mcp/tools/generate-tools.js +101 -13
- package/dist/mcp/tools/project-tools.js +59 -16
- package/gemini-extension.json +3 -3
- package/package.json +16 -5
- package/skills/3d-assets/character-model/SKILL.md +27 -5
- package/skills/3d-assets/environment-kit/SKILL.md +7 -2
- package/skills/3d-assets/organic-model/SKILL.md +4 -3
- package/skills/3d-assets/prop-model/SKILL.md +16 -8
- package/skills/3d-assets/vehicle-model/SKILL.md +4 -3
- package/skills/animation/animation-tree/SKILL.md +2 -0
- package/skills/animation/generate-motion/SKILL.md +25 -4
- package/skills/asset-pipeline/asset-strategy/SKILL.md +3 -2
- package/skills/workflow/mcpupdate/SKILL.md +134 -0
package/gemini-extension.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "summer",
|
|
3
|
-
"version": "2.5.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "2.5.1",
|
|
4
|
+
"description": "Agent tooling for Summer Engine: MCP bridge, context primer, and game-dev skills. Use with the npm CLI for skill files on disk.",
|
|
5
5
|
"contextFileName": "GEMINI.md",
|
|
6
6
|
"mcpServers": {
|
|
7
7
|
"summer-engine": {
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"settings": [
|
|
14
14
|
{
|
|
15
15
|
"name": "enable_pre_commit_doctor",
|
|
16
|
-
"description": "Block git commits
|
|
16
|
+
"description": "Block git commits when summer doctor needs attention (off by default)",
|
|
17
17
|
"envVar": "SUMMER_PRE_COMMIT_DOCTOR",
|
|
18
18
|
"sensitive": false
|
|
19
19
|
}
|
package/package.json
CHANGED
|
@@ -1,20 +1,31 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "summer-engine",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"description": "Summer
|
|
3
|
+
"version": "2.6.1",
|
|
4
|
+
"description": "Summer CLI and MCP server for Summer Engine, the AI game engine. Install the engine, connect Claude Code, Cursor, Codex, Gemini, and other agents, and build real games. Skills, hooks, and plugins included.",
|
|
5
5
|
"keywords": [
|
|
6
|
+
"summer-engine",
|
|
7
|
+
"summer-cli",
|
|
8
|
+
"summer-mcp",
|
|
9
|
+
"summer-agent",
|
|
10
|
+
"summer-engine-agent",
|
|
6
11
|
"game-engine",
|
|
12
|
+
"ai-game-engine",
|
|
7
13
|
"godot",
|
|
8
|
-
"ai",
|
|
14
|
+
"godot-ai",
|
|
9
15
|
"mcp",
|
|
16
|
+
"mcp-server",
|
|
17
|
+
"claude-code",
|
|
18
|
+
"cursor",
|
|
19
|
+
"codex",
|
|
10
20
|
"gamedev",
|
|
21
|
+
"game-development",
|
|
11
22
|
"3d",
|
|
12
|
-
"
|
|
23
|
+
"ai"
|
|
13
24
|
],
|
|
14
25
|
"homepage": "https://summerengine.com",
|
|
15
26
|
"repository": {
|
|
16
27
|
"type": "git",
|
|
17
|
-
"url": "git+https://github.com/SummerEngine/summer.git"
|
|
28
|
+
"url": "git+https://github.com/SummerEngine/summer-engine-agent.git"
|
|
18
29
|
},
|
|
19
30
|
"license": "MIT",
|
|
20
31
|
"author": "Summer Engine <founders@summerengine.com>",
|
|
@@ -5,7 +5,7 @@ license: MIT
|
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: 3d-assets
|
|
7
7
|
user-invocable: true
|
|
8
|
-
allowed-tools: Read Grep summer_search_assets summer_generate_image summer_generate_3d summer_import_from_url summer_add_node summer_set_prop summer_set_resource_property summer_inspect_node summer_inspect_resource summer_get_scene_tree summer_save_scene summer_check_job summer_generate_motion
|
|
8
|
+
allowed-tools: Read Grep summer_search_assets summer_list_my_assets summer_get_asset summer_import_asset_by_id summer_generate_image summer_generate_3d summer_import_from_url summer_add_node summer_set_prop summer_set_resource_property summer_inspect_node summer_inspect_resource summer_get_scene_tree summer_save_scene summer_check_job summer_generate_motion
|
|
9
9
|
paths: ["assets/characters/**", "assets/models/**", "**/*.tscn", "**/*.gd"]
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -26,6 +26,16 @@ The whole flow:
|
|
|
26
26
|
|
|
27
27
|
The animation skill (`summer:animation/generate-motion`) requires a rigged humanoid; a static `.glb` won't drive motion.
|
|
28
28
|
|
|
29
|
+
## Web Chat / Public Orchestrator Equivalent
|
|
30
|
+
|
|
31
|
+
When this skill is running inside the PublicSummerEngine chat orchestrator, use the chat-native tools directly instead of sending the user to Studio:
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
generateImage -> createCharacter -> checkGenerationStatus/meshyJobStatus -> listUserAssets readiness -> rigModel if needed -> generateAnimation -> meshyJobStatus -> importAssets -> import-character
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Use Studio only when the user explicitly asks for visual/manual picking or when chat-side generation fails. The recovered working flow used `createCharacter`, confirmed the rig had `hasMeshyRigTask` or `animationsReady:true`, then generated `idle`, `walk`, `run`, `jump`, and `attack`, imported the rig plus child animation GLBs into `res://characters/<slug>/`, then wired playback from the imported GLB AnimationPlayers/libraries. If `generateAnimation` returns `animations_preparing`, wait, poll/list the rig asset again, and retry instead of routing to Studio. Keep this path repeatable for "animated character", "3D character with animations", "walking enemy", and similar prompts.
|
|
38
|
+
|
|
29
39
|
## When to use
|
|
30
40
|
|
|
31
41
|
- "Make a knight character for the player to control."
|
|
@@ -94,10 +104,15 @@ summer_generate_3d(
|
|
|
94
104
|
)
|
|
95
105
|
```
|
|
96
106
|
|
|
97
|
-
Returns
|
|
107
|
+
Returns a job result with `assetId` and `fileUrl` — an un-rigged static `.glb`.
|
|
108
|
+
Use the asset ID as the stable handle. Import it for preview only:
|
|
98
109
|
|
|
99
110
|
```
|
|
100
|
-
|
|
111
|
+
summer_get_asset(assetId="<assetId>")
|
|
112
|
+
summer_import_asset_by_id(
|
|
113
|
+
assetId="<assetId>",
|
|
114
|
+
path="res://assets/characters/knight_unrigged.glb"
|
|
115
|
+
)
|
|
101
116
|
```
|
|
102
117
|
|
|
103
118
|
### 3. ⛔ USER REVIEW GATE — DO NOT SKIP
|
|
@@ -122,12 +137,19 @@ summer_generate_3d({
|
|
|
122
137
|
})
|
|
123
138
|
```
|
|
124
139
|
|
|
125
|
-
Returns a job whose result includes `
|
|
140
|
+
Returns a job whose result includes `assetId`, `fileUrl`, and `rigAssetId`.
|
|
141
|
+
If you ran with `wait: false`, poll via `summer_check_job(jobId)`. The
|
|
142
|
+
`rigAssetId` is the handle `summer:animation/generate-motion` needs — store it.
|
|
143
|
+
Resolve it before import so the agent has the viewer/download metadata:
|
|
126
144
|
|
|
127
145
|
Import the rigged version, replacing the un-rigged file:
|
|
128
146
|
|
|
129
147
|
```
|
|
130
|
-
|
|
148
|
+
summer_get_asset(assetId="<rigAssetId>")
|
|
149
|
+
summer_import_asset_by_id(
|
|
150
|
+
assetId="<rigAssetId>",
|
|
151
|
+
path="res://assets/characters/knight.glb"
|
|
152
|
+
)
|
|
131
153
|
```
|
|
132
154
|
|
|
133
155
|
### 5. ⚠️ Restart the editor
|
|
@@ -5,7 +5,7 @@ license: MIT
|
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: 3d-assets
|
|
7
7
|
user-invocable: true
|
|
8
|
-
allowed-tools: Read Grep summer_search_assets summer_generate_3d summer_generate_image summer_import_from_url summer_add_node summer_set_prop summer_inspect_node summer_get_scene_tree summer_save_scene
|
|
8
|
+
allowed-tools: Read Grep summer_search_assets summer_list_my_assets summer_get_asset summer_import_asset_by_id summer_generate_3d summer_generate_image summer_import_from_url summer_add_node summer_set_prop summer_inspect_node summer_get_scene_tree summer_save_scene
|
|
9
9
|
paths: ["assets/kits/**", "assets/models/**", "**/*.tscn", "**/*.gd"]
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -82,7 +82,8 @@ summer_generate_3d(
|
|
|
82
82
|
options={ target_polycount: 1500 },
|
|
83
83
|
wait=true
|
|
84
84
|
)
|
|
85
|
-
|
|
85
|
+
summer_get_asset(assetId="<assetId>")
|
|
86
|
+
summer_import_asset_by_id(assetId="<assetId>", path="res://assets/kits/dungeon/wall.glb")
|
|
86
87
|
```
|
|
87
88
|
|
|
88
89
|
Show the result to the user. **Iterate the anchor until approved** — every other piece copies its style.
|
|
@@ -101,6 +102,10 @@ summer_generate_3d(prompt="A 3 meter tall stone dungeon pillar, square base, flu
|
|
|
101
102
|
# Door, Corner, Arch — same pattern.
|
|
102
103
|
```
|
|
103
104
|
|
|
105
|
+
For each completed generation, capture the returned `assetId`, then import that
|
|
106
|
+
exact ID with `summer_import_asset_by_id`. Do not search for generated pieces by
|
|
107
|
+
name after creating them; exact IDs are the production path.
|
|
108
|
+
|
|
104
109
|
Polycount targets per kit piece: walls/floors 800–1500 tris (placed dozens of times), decorative (pillar, arch) 1500–3000, doors 2000–3000.
|
|
105
110
|
|
|
106
111
|
### 4. Import and stage in a kit scene
|
|
@@ -5,7 +5,7 @@ license: MIT
|
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: 3d-assets
|
|
7
7
|
user-invocable: true
|
|
8
|
-
allowed-tools: Read Grep summer_search_assets summer_generate_3d summer_generate_image summer_import_from_url summer_add_node summer_set_prop summer_inspect_node summer_get_scene_tree summer_save_scene
|
|
8
|
+
allowed-tools: Read Grep summer_search_assets summer_list_my_assets summer_get_asset summer_import_asset_by_id summer_generate_3d summer_generate_image summer_import_from_url summer_add_node summer_set_prop summer_inspect_node summer_get_scene_tree summer_save_scene
|
|
9
9
|
paths: ["assets/organic/**", "assets/models/**", "**/*.tscn", "**/*.gd"]
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -55,7 +55,7 @@ Generating a forest? Make 3 hero trees + 5 background trees + 3 rocks at low pol
|
|
|
55
55
|
### 1. Search before generating
|
|
56
56
|
|
|
57
57
|
```
|
|
58
|
-
summer_search_assets(query="<organic type>",
|
|
58
|
+
summer_search_assets(query="<organic type>", assetType="3d_model", source="all")
|
|
59
59
|
```
|
|
60
60
|
|
|
61
61
|
### 2. Build the prompt
|
|
@@ -97,7 +97,8 @@ summer_generate_3d(
|
|
|
97
97
|
options={ target_polycount: 2000 },
|
|
98
98
|
wait=true
|
|
99
99
|
)
|
|
100
|
-
|
|
100
|
+
summer_get_asset(assetId="<assetId>")
|
|
101
|
+
summer_import_asset_by_id(assetId="<assetId>", path="res://assets/organic/pine_tree_01.glb")
|
|
101
102
|
```
|
|
102
103
|
|
|
103
104
|
### 4. Generate variation, not duplication
|
|
@@ -5,7 +5,7 @@ license: MIT
|
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: 3d-assets
|
|
7
7
|
user-invocable: true
|
|
8
|
-
allowed-tools: Read Grep summer_search_assets summer_generate_3d summer_generate_image summer_import_from_url summer_add_node summer_set_prop summer_inspect_node summer_get_scene_tree summer_save_scene
|
|
8
|
+
allowed-tools: Read Grep summer_search_assets summer_list_my_assets summer_get_asset summer_import_asset_by_id summer_generate_3d summer_generate_image summer_import_from_url summer_add_node summer_set_prop summer_inspect_node summer_get_scene_tree summer_save_scene
|
|
9
9
|
paths: ["assets/models/**", "**/*.tscn", "**/*.gd"]
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -37,7 +37,7 @@ The backing tool is `summer_generate_3d`. Default model is `hunyuan` (Hunyuan 3D
|
|
|
37
37
|
### 1. Search before generating
|
|
38
38
|
|
|
39
39
|
```
|
|
40
|
-
summer_search_assets(query="<prop name>",
|
|
40
|
+
summer_search_assets(query="<prop name>", assetType="3d_model", source="all")
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
If a fitting model exists, propose reuse:
|
|
@@ -83,25 +83,33 @@ summer_generate_3d(
|
|
|
83
83
|
)
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
-
Returns `
|
|
86
|
+
Returns a job result with `assetId` and `fileUrl`. Treat `assetId` as the
|
|
87
|
+
stable handle and `fileUrl` as a fallback preview/import URL.
|
|
87
88
|
|
|
88
89
|
### 5. Import and wire
|
|
89
90
|
|
|
90
91
|
```
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
92
|
+
summer_get_asset(assetId="<assetId>")
|
|
93
|
+
summer_import_asset_by_id(
|
|
94
|
+
assetId="<assetId>",
|
|
95
|
+
path="res://assets/models/viking_axe.glb",
|
|
96
|
+
parent="./World/Props",
|
|
97
|
+
name="VikingAxe"
|
|
98
|
+
)
|
|
94
99
|
summer_save_scene
|
|
95
100
|
```
|
|
96
101
|
|
|
97
|
-
For interactive props (chest the player opens, lantern the player picks up),
|
|
102
|
+
For interactive props (chest the player opens, lantern the player picks up),
|
|
103
|
+
wrap the instantiated model in a `StaticBody3D` (or `RigidBody3D` for physics
|
|
104
|
+
props) with a `CollisionShape3D` sibling — see `summer:scene-composition` for
|
|
105
|
+
the parent-shape pattern.
|
|
98
106
|
|
|
99
107
|
## Anti-patterns
|
|
100
108
|
|
|
101
109
|
- **Scene context in the prompt.** "A sword lying on a wooden table" → the table becomes geometry. Always say `isolated object`.
|
|
102
110
|
- **Multi-object prompts.** "A sword and a shield" → fused single mesh. Generate separately.
|
|
103
111
|
- **Skipping `target_polycount` for background props.** A 30k-tri barrel in the background tanks frame rate when the level has 50 of them.
|
|
104
|
-
- **Forgetting to import.** `fileUrl` from `summer_generate_3d` is a remote URL — you MUST `summer_import_from_url` before referencing it as `res://...`.
|
|
112
|
+
- **Forgetting to import.** `fileUrl` from `summer_generate_3d` is a remote URL — you MUST `summer_import_asset_by_id` or `summer_import_from_url` before referencing it as `res://...`.
|
|
105
113
|
- **Generating before searching.** Reuse beats regenerate every time.
|
|
106
114
|
- **Picking `meshy` by default.** It's legacy. `hunyuan` is better; `trellis` is faster.
|
|
107
115
|
|
|
@@ -5,7 +5,7 @@ license: MIT
|
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: 3d-assets
|
|
7
7
|
user-invocable: true
|
|
8
|
-
allowed-tools: Read Grep summer_search_assets summer_generate_3d summer_generate_image summer_import_from_url summer_add_node summer_set_prop summer_inspect_node summer_inspect_resource summer_get_scene_tree summer_save_scene
|
|
8
|
+
allowed-tools: Read Grep summer_search_assets summer_list_my_assets summer_get_asset summer_import_asset_by_id summer_generate_3d summer_generate_image summer_import_from_url summer_add_node summer_set_prop summer_inspect_node summer_inspect_resource summer_get_scene_tree summer_save_scene
|
|
9
9
|
paths: ["assets/vehicles/**", "assets/models/**", "**/*.tscn", "**/*.gd"]
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -69,7 +69,7 @@ If the user has reference images already (concept art, photos), prefer those —
|
|
|
69
69
|
### 1. Search before generating
|
|
70
70
|
|
|
71
71
|
```
|
|
72
|
-
summer_search_assets(query="<vehicle type>",
|
|
72
|
+
summer_search_assets(query="<vehicle type>", assetType="3d_model", source="all")
|
|
73
73
|
```
|
|
74
74
|
|
|
75
75
|
### 2. Pick model and polycount
|
|
@@ -101,7 +101,8 @@ summer_generate_3d(
|
|
|
101
101
|
options={ target_polycount: 25000 },
|
|
102
102
|
wait=true
|
|
103
103
|
)
|
|
104
|
-
|
|
104
|
+
summer_get_asset(assetId="<assetId>")
|
|
105
|
+
summer_import_asset_by_id(assetId="<assetId>", path="res://assets/vehicles/race_car.glb")
|
|
105
106
|
```
|
|
106
107
|
|
|
107
108
|
### 5. Inspect for hard-surface artifacts
|
|
@@ -22,6 +22,8 @@ Character (CharacterBody3D)
|
|
|
22
22
|
└── AnimationTree # references AnimationPlayer, drives behavior
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
+
Before adding the tree, prove direct `AnimationPlayer.play()` visibly moves the rig. Godot may import animation GLBs as `AnimationLibrary` resources or as `PackedScene`s with embedded `AnimationPlayer`s. If a copied clip appears in the list but the mesh T-poses, its tracks probably target a different root/skeleton path. Use the embedded player that came with the matching GLB, or remap/copy tracks only after confirming they target the active `Skeleton3D`. An inactive AnimationTree is also a no-op, so always set `AnimationTree.active = true`.
|
|
26
|
+
|
|
25
27
|
## When to use this skill
|
|
26
28
|
|
|
27
29
|
- Character has 3+ clips and switching between them via `AnimationPlayer.play("walk")` is causing pops, T-poses, or "starts halfway through".
|
|
@@ -5,7 +5,7 @@ license: MIT
|
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: animation
|
|
7
7
|
user-invocable: false
|
|
8
|
-
allowed-tools: Read Grep summer_search_assets summer_generate_motion summer_inspect_resource summer_get_scene_tree summer_add_node summer_set_prop summer_set_resource_property summer_save_scene
|
|
8
|
+
allowed-tools: Read Grep summer_search_assets summer_list_my_assets summer_get_asset summer_get_asset_download_url summer_generate_motion summer_inspect_resource summer_get_scene_tree summer_add_node summer_set_prop summer_set_resource_property summer_save_scene
|
|
9
9
|
paths: ["**/*.tscn", "**/*.tres", "**/*.gd"]
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -17,6 +17,22 @@ The target must be a **Meshy-rigged humanoid** — a `rigAssetId` from a prior `
|
|
|
17
17
|
|
|
18
18
|
> **Custom prompt-driven motion** (e.g. "drops to one knee, draws bow") is on the roadmap but not shipped yet. For one-off signature moves not on the curated list, fall back to hand-authoring in the Godot editor or importing from Mixamo. See the Edge cases section.
|
|
19
19
|
|
|
20
|
+
## Web Chat / Public Orchestrator Equivalent
|
|
21
|
+
|
|
22
|
+
In PublicSummerEngine chat, the equivalent direct tools are:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
rigModel({ modelAssetId })
|
|
26
|
+
generateAnimation({ rigAssetId, animationName })
|
|
27
|
+
meshyJobStatus({ jobId })
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
If the character came from `createCharacter`, it may already be rigged and have `metadata.meshyRigTaskId`; generate animations directly against that rig asset. Verified animation names from the recovered production flow are `idle`, `walk`, `run`, `jump`, and `attack`. `fall` returned `invalid_animation`, so do not present it as a default.
|
|
31
|
+
|
|
32
|
+
Before generating clips in PublicSummerEngine chat, confirm the rig asset listing/status exposes `hasMeshyRigTask` or `animationsReady:true`. If `generateAnimation` returns `animations_preparing`, wait, poll/list the rig again, and retry; this is the post-rig setup catching up, not a reason to send the user to Studio.
|
|
33
|
+
|
|
34
|
+
After animation jobs complete, import the rig plus child animation assets together and wire them through `import-character`. Do not hand off to Studio unless the user asked for Studio/manual control or the direct chat tools fail.
|
|
35
|
+
|
|
20
36
|
## When to use this skill
|
|
21
37
|
|
|
22
38
|
- "Add a walk animation to the goblin."
|
|
@@ -38,7 +54,7 @@ The target must be a **Meshy-rigged humanoid** — a `rigAssetId` from a prior `
|
|
|
38
54
|
### 1. Verify the target is a rigged humanoid
|
|
39
55
|
|
|
40
56
|
```
|
|
41
|
-
summer_search_assets(query="<character name>",
|
|
57
|
+
summer_search_assets(query="<character name>", assetType="3d_model", source="my_assets")
|
|
42
58
|
```
|
|
43
59
|
|
|
44
60
|
The result must include `rigAssetId: <id>` on a Meshy rig. If it shows `rigAssetId: null`, the model isn't rigged — stop, propose `summer_generate_3d({ kind: "image-to-3d", imageUrl: "...", options: { rig: true } })` first (the result includes `rigAssetId`), or route to `summer:asset-pipeline/asset-strategy`.
|
|
@@ -57,7 +73,12 @@ summer_generate_motion(
|
|
|
57
73
|
)
|
|
58
74
|
```
|
|
59
75
|
|
|
60
|
-
Returns `
|
|
76
|
+
Returns `animationAssetId`, `durationSeconds`, and `previewUrl`. Resolve the
|
|
77
|
+
asset before handoff so you have the stable file/download metadata:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
summer_get_asset(assetId="<animationAssetId>")
|
|
81
|
+
```
|
|
61
82
|
|
|
62
83
|
### 4. Attach to the character's AnimationPlayer
|
|
63
84
|
|
|
@@ -99,7 +120,7 @@ The full list is ~70 names. If the user asks for something not on the top-30, tr
|
|
|
99
120
|
## Anti-patterns
|
|
100
121
|
|
|
101
122
|
- Calling `summer_generate_motion` on a `.glb` that wasn't rigged — wastes a generation; the API errors but only after 30s.
|
|
102
|
-
- Generating the same clip twice because you forgot to save the `animationAssetId` from the first call. Search the asset library first: `summer_search_assets(query: "goblin run",
|
|
123
|
+
- Generating the same clip twice because you forgot to save the `animationAssetId` from the first call. Search the asset library first: `summer_search_assets(query: "goblin run", assetType: "animation", source: "my_assets")`.
|
|
103
124
|
- Wiring clips into an AnimationTree inside this skill. That's the next skill's job. Generate, attach, hand off.
|
|
104
125
|
- Asking the model to invent a `motionName` that isn't on the list. Quote from the list verbatim, or fall back to manual authoring.
|
|
105
126
|
|
|
@@ -5,7 +5,7 @@ license: MIT
|
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: asset-pipeline
|
|
7
7
|
user-invocable: false
|
|
8
|
-
allowed-tools: Read Grep Skill summer_search_assets
|
|
8
|
+
allowed-tools: Read Grep Skill summer_search_assets summer_list_my_assets summer_get_asset summer_import_asset_by_id
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Asset Strategy — Meta-Router for Asset Creation
|
|
@@ -117,7 +117,8 @@ VFX is **code, not generative** — recipes are shader + GDScript + node setup,
|
|
|
117
117
|
|
|
118
118
|
- The user already named the specific skill — go straight there.
|
|
119
119
|
- The user is debugging or running the game — route to `summer:debug` or `summer:play`.
|
|
120
|
-
- The asset is
|
|
120
|
+
- The asset is an existing Summer asset ID — call `summer_get_asset`, then `summer_import_asset_by_id`.
|
|
121
|
+
- The asset is being imported from a non-Summer URL (`.glb` / `.wav` from Sketchfab, Quaternius, AmbientCG) — call `summer_import_from_url` directly.
|
|
121
122
|
- The user wants to plan the whole game's asset list — `summer:brainstorm-game` first, then this router on each item.
|
|
122
123
|
|
|
123
124
|
## Anti-patterns
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mcpupdate
|
|
3
|
+
description: Use when improving or maintaining the Summer Engine CLI, its MCP tools (summer_* / "ops"), or its prompt-engineering skills based on a real working session. Examples: the user types /mcpupdate, says "mcpskillify this", "log this as a skill/example", "this <feature> feels great, capture it", or notes that an agent went down a bad path with the Summer tools/skills and the prompts should be fixed. Works from ANY chat, not just inside the summer-cli repo.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# mcpupdate: turn a session into improvements to the Summer CLI / MCP / skills
|
|
7
|
+
|
|
8
|
+
## What this is
|
|
9
|
+
A bridge from *using* Summer Engine (in any game-project chat) back to *improving* it.
|
|
10
|
+
When a session reveals something, such as a pattern that worked beautifully or prompt-engineering
|
|
11
|
+
that sent the agent down a bad path, capture it into the CLI's tools, skills, or docs so the
|
|
12
|
+
next agent benefits. Invokable from any chat; it jumps to the right repo files directly.
|
|
13
|
+
|
|
14
|
+
## Where everything lives (skip the scanning)
|
|
15
|
+
This skill lives in the **summer-cli** repo (the CLI + MCP + skills), normally at
|
|
16
|
+
`<SummerEngine checkout>/tools/summer-cli/`. Paths below are relative to that repo root.
|
|
17
|
+
|
|
18
|
+
- `src/mcp/tools/*.ts`: the `summer_*` MCP tool definitions ("ops": scene/asset/project/etc.)
|
|
19
|
+
- `references/mcp-tools-reference.md`: human-readable tool reference
|
|
20
|
+
- `src/mcp/tools/project-tools.ts` + `docs/MCP_FRESH_CHAT_PLAYBOOK.md`: the **agent playbook** returned by `summer_get_agent_playbook` (startup flow / defaults that steer agents)
|
|
21
|
+
- `src/lib/skills-registry.ts`: how skills are discovered/surfaced to the agent
|
|
22
|
+
- `skills/<category>/<name>/SKILL.md`: the **prompt-engineering skills** (e.g. `character-controllers/fps-controller`, `scene-and-project/make-game`, `level-design/design-level`, `visual-effects/*`)
|
|
23
|
+
- `_persona/summer/SKILL.md`: the Summer persona
|
|
24
|
+
- `skills/workflow/{skill-create,skill-improve,skill-test,gameskill,writing-skills}/`: **use these** to author/edit Summer skills
|
|
25
|
+
- `commands/`, `hooks/`, `AGENTS.md`/`CLAUDE.md`/`GEMINI.md`: slash commands, hooks, agent instructions
|
|
26
|
+
- `dist/` is built output: edit `src/` and `skills/`, not `dist/`
|
|
27
|
+
|
|
28
|
+
**Public docs (separate Mintlify repo, the org `docs` repo, often a sibling checkout):** `docs.json` (nav), `cli/overview.mdx`, `ai-tools/operations.mdx`, `ai-tools/rag-search.mdx`, plus `guides/`, `api-reference/`, `art-system/`.
|
|
29
|
+
|
|
30
|
+
> summer-cli changes are committed in **this repo** (the SummerEngine checkout), not in a game-project repo.
|
|
31
|
+
|
|
32
|
+
## Public surface sync checklist
|
|
33
|
+
|
|
34
|
+
Run this checklist when a tool, skill, setup target, license sentence, or count changes. Public trust is damaged more by obvious drift than by modest numbers.
|
|
35
|
+
|
|
36
|
+
1. Count MCP tools from source:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
rg "server\\.tool\\(" src/mcp/tools -g '*.ts' -g '!*.test.ts' | wc -l
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
2. Count skill surfaces separately. Do not collapse them into one public claim unless the sentence explains which surface it means:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
find skills -name SKILL.md | wc -l
|
|
46
|
+
npm run build
|
|
47
|
+
node -e "import('./dist/lib/skills-registry.js').then(m=>{const r=m.SKILL_REGISTRY||[]; console.log({registry:r.length,recommended:r.filter(s=>s.recommended).length})})"
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
3. Update the CLI repo surfaces that readers and agents scan:
|
|
51
|
+
- `README.md`
|
|
52
|
+
- `.claude-plugin/plugin.json`
|
|
53
|
+
- `.codex-plugin/plugin.json`
|
|
54
|
+
- `AGENTS.md`
|
|
55
|
+
- `GEMINI.md`
|
|
56
|
+
- `references/mcp-tools-reference.md`
|
|
57
|
+
- `docs/DEVELOPMENT.md`
|
|
58
|
+
- `docs/SKILLS.md`
|
|
59
|
+
|
|
60
|
+
4. Update sibling public docs and website surfaces when present:
|
|
61
|
+
- `docs` Mintlify pages, especially `cli/overview.mdx`, `ai-tools/operations.mdx`, `api-reference/`, and setup guides
|
|
62
|
+
- `PublicSummerEngine` guide data, `llms.txt` routes, README, and any blog post that mentions counts or openness
|
|
63
|
+
- `summer-strategy` if the change affects positioning, licensing, or launch strategy
|
|
64
|
+
|
|
65
|
+
5. Prefer durable copy:
|
|
66
|
+
- Say "Summer agent layer" for this repo in prose.
|
|
67
|
+
- Say "`summer-engine` npm package" for the package.
|
|
68
|
+
- Say "Summer Engine app" for the closed desktop engine.
|
|
69
|
+
- Avoid brittle skill totals in public copy unless generated in the same change.
|
|
70
|
+
- Avoid red-looking doctor payloads in public README examples. Explain remediation without showing a scary JSON blob.
|
|
71
|
+
|
|
72
|
+
## How to run it
|
|
73
|
+
1. **Confirm the target.** Restate in one line what should change and which bucket it is:
|
|
74
|
+
1) **CLI / MCP tool behavior**, 2) **a skill (prompt-engineering)**, or 3) **logging a session learning** (good pattern to example, or bad path to fix). Ask only if genuinely ambiguous.
|
|
75
|
+
2. **Open the exact file from the map above**. Do not scan the tree.
|
|
76
|
+
3. **Make the change** using the existing maintenance skills:
|
|
77
|
+
- New skill: `skills/workflow/skill-create`. Edit/append: `skills/workflow/skill-improve`. Game-dev win: `skills/workflow/gameskill`.
|
|
78
|
+
- Tool behavior / playbook: edit `src/mcp/tools/*.ts` and/or `docs/MCP_FRESH_CHAT_PLAYBOOK.md`; keep `references/mcp-tools-reference.md` in sync. Check `src/mcp/tools/project-tools.test.ts` still passes.
|
|
79
|
+
- Public-facing change: update the matching file in the `docs` repo.
|
|
80
|
+
4. **Keep it concrete**. Every captured pattern gets a real, runnable code block (below), not prose.
|
|
81
|
+
5. **Verify + commit.** If you touched `src/`, run `npm test`. Commit on a branch and summarize.
|
|
82
|
+
|
|
83
|
+
## "mcpskillify": capture a working pattern as an example
|
|
84
|
+
Trigger: *"this player movement feels great, mcpskillify it"*, *"log this as how to do X"*.
|
|
85
|
+
|
|
86
|
+
1. Identify the smallest self-contained code that produced the good result (the actual GDScript/C# from the session).
|
|
87
|
+
2. Find the matching skill via the map (movement to `character-controllers/fps-controller`; a mechanic to `gameplay-mechanics/design-mechanic`; none fits to `skill-create` a new one in the right category).
|
|
88
|
+
3. Append a focused example: what it does, the code, and *why it feels good* (the tunables). Shape:
|
|
89
|
+
|
|
90
|
+
````markdown
|
|
91
|
+
## Example: snappy first-person movement (proven)
|
|
92
|
+
WHY it feels good: instant accel + short coyote time + air control; no float.
|
|
93
|
+
|
|
94
|
+
```gdscript
|
|
95
|
+
const SPEED := 6.0
|
|
96
|
+
const ACCEL := 60.0 # high accel = snappy, no slide
|
|
97
|
+
const COYOTE := 0.12 # forgiving jump after leaving a ledge
|
|
98
|
+
func _physics_process(delta):
|
|
99
|
+
var dir := (transform.basis * Vector3(input.x, 0, input.y)).normalized()
|
|
100
|
+
velocity.x = move_toward(velocity.x, dir.x * SPEED, ACCEL * delta)
|
|
101
|
+
velocity.z = move_toward(velocity.z, dir.z * SPEED, ACCEL * delta)
|
|
102
|
+
move_and_slide()
|
|
103
|
+
```
|
|
104
|
+
````
|
|
105
|
+
|
|
106
|
+
Keep one excellent example per pattern. Port it, don't pile on variants.
|
|
107
|
+
|
|
108
|
+
## The behavior the skills/playbook should teach (the doctrine)
|
|
109
|
+
Target agent workflow for building in a Summer project. When `/mcpupdate` reviews the playbook
|
|
110
|
+
and skills, make them teach this, and flag where they don't:
|
|
111
|
+
|
|
112
|
+
1. **Understand** what the user wants (one pass, no tool spelunking first).
|
|
113
|
+
2. **Outline** the plan fast and briefly; proceed once it's clearly right.
|
|
114
|
+
3. **Execute in pure code**. Write GDScript by default (C# only if the project already uses it). Edit `.gd`/`.tscn`/`.tres` as **text files**; that's the default medium.
|
|
115
|
+
4. **Play & auto-iterate**. Run the scene/game, read console + script/debugger errors, fix, repeat until clean. Crucially: **play the scene you just made first**, so boot/parse crashes surface immediately instead of after the user navigates to the feature.
|
|
116
|
+
|
|
117
|
+
## Known bad path to fix first (from real sessions)
|
|
118
|
+
The MCP playbook over-steered agents into **ops-first** scene editing (open/save-as/inspect/
|
|
119
|
+
instantiate) when plain **file editing** is simpler and safer for a headless agent, causing
|
|
120
|
+
wasted turns, scene "rename"/save-as churn, and editor-tab clobbering. Keep these fixed:
|
|
121
|
+
|
|
122
|
+
- **File-first for `.tscn`/`.tres`:** edit scene/resource files as text by default; use scene-ops
|
|
123
|
+
only for live-engine needs (navmesh/light bake, play/observe, runtime inspect) or instancing
|
|
124
|
+
into an already-open scene. The MCP `WriteFile` refusing `.tscn` means "use host file tools," not "use scene ops."
|
|
125
|
+
- **Clobber gotcha:** a `.tscn` open in the editor can be overwritten by the editor's tab on save.
|
|
126
|
+
reload/close the tab after external writes.
|
|
127
|
+
- **Constraint-based flow:** the playbook's flow is conditional (`buildFlow` for the default,
|
|
128
|
+
`liveEngineFlow` only when you need the running engine), not a prescriptive always-open-the-editor loop.
|
|
129
|
+
|
|
130
|
+
## Red flags this skill is being skipped
|
|
131
|
+
- You started scanning the engine repo to find the CLI: use the map above.
|
|
132
|
+
- You captured a "great" pattern as prose with no runnable code: add the code block.
|
|
133
|
+
- You edited `dist/`: edit `src/`/`skills/` instead.
|
|
134
|
+
- You committed CLI changes in a game-project repo: commit in the SummerEngine checkout.
|