summer-engine 2.5.0 → 2.6.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 (82) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +5 -4
  3. package/.codex-plugin/plugin.json +5 -4
  4. package/.cursor-plugin/plugin.json +4 -3
  5. package/.factory-plugin/plugin.json +3 -3
  6. package/AGENTS.md +6 -4
  7. package/CHANGELOG.md +20 -2
  8. package/GEMINI.md +3 -3
  9. package/README.md +83 -97
  10. package/dist/bin/summer.js +6 -1
  11. package/dist/commands/cloud.d.ts +2 -0
  12. package/dist/commands/cloud.js +80 -0
  13. package/dist/commands/doctor.js +19 -0
  14. package/dist/commands/login.js +4 -1
  15. package/dist/commands/logout.js +1 -1
  16. package/dist/commands/open.js +1 -1
  17. package/dist/commands/plan.d.ts +2 -0
  18. package/dist/commands/plan.js +60 -0
  19. package/dist/commands/run.js +132 -35
  20. package/dist/lib/auth.d.ts +2 -0
  21. package/dist/lib/auth.js +13 -0
  22. package/dist/lib/cloud/api.d.ts +79 -0
  23. package/dist/lib/cloud/api.js +107 -0
  24. package/dist/lib/cloud/apply.d.ts +32 -0
  25. package/dist/lib/cloud/apply.js +294 -0
  26. package/dist/lib/cloud/checkpoint.d.ts +26 -0
  27. package/dist/lib/cloud/checkpoint.js +142 -0
  28. package/dist/lib/cloud/conflicts.d.ts +55 -0
  29. package/dist/lib/cloud/conflicts.js +131 -0
  30. package/dist/lib/cloud/containment.d.ts +8 -0
  31. package/dist/lib/cloud/containment.js +52 -0
  32. package/dist/lib/cloud/diff.d.ts +39 -0
  33. package/dist/lib/cloud/diff.js +138 -0
  34. package/dist/lib/cloud/engine-bridge.d.ts +21 -0
  35. package/dist/lib/cloud/engine-bridge.js +105 -0
  36. package/dist/lib/cloud/hash-cache.d.ts +23 -0
  37. package/dist/lib/cloud/hash-cache.js +44 -0
  38. package/dist/lib/cloud/hash.d.ts +10 -0
  39. package/dist/lib/cloud/hash.js +111 -0
  40. package/dist/lib/cloud/http.d.ts +17 -0
  41. package/dist/lib/cloud/http.js +47 -0
  42. package/dist/lib/cloud/lock-path.d.ts +1 -0
  43. package/dist/lib/cloud/lock-path.js +5 -0
  44. package/dist/lib/cloud/lock.d.ts +14 -0
  45. package/dist/lib/cloud/lock.js +143 -0
  46. package/dist/lib/cloud/manifest.d.ts +6 -0
  47. package/dist/lib/cloud/manifest.js +41 -0
  48. package/dist/lib/cloud/paths.d.ts +20 -0
  49. package/dist/lib/cloud/paths.js +90 -0
  50. package/dist/lib/cloud/project-godot-merge.d.ts +32 -0
  51. package/dist/lib/cloud/project-godot-merge.js +185 -0
  52. package/dist/lib/cloud/rules.d.ts +39 -0
  53. package/dist/lib/cloud/rules.js +159 -0
  54. package/dist/lib/cloud/sync.d.ts +21 -0
  55. package/dist/lib/cloud/sync.js +518 -0
  56. package/dist/lib/cloud/transfer.d.ts +23 -0
  57. package/dist/lib/cloud/transfer.js +184 -0
  58. package/dist/lib/cloud/types.d.ts +62 -0
  59. package/dist/lib/cloud/types.js +1 -0
  60. package/dist/lib/cloud/validate-path.d.ts +23 -0
  61. package/dist/lib/cloud/validate-path.js +103 -0
  62. package/dist/lib/engine.d.ts +6 -0
  63. package/dist/lib/engine.js +36 -1
  64. package/dist/lib/game-task-plan.d.ts +42 -0
  65. package/dist/lib/game-task-plan.js +376 -0
  66. package/dist/mcp/server.js +2 -0
  67. package/dist/mcp/tools/asset-tools.js +265 -45
  68. package/dist/mcp/tools/cloud-tools.d.ts +2 -0
  69. package/dist/mcp/tools/cloud-tools.js +42 -0
  70. package/dist/mcp/tools/generate-tools.js +101 -13
  71. package/dist/mcp/tools/project-tools.js +59 -16
  72. package/gemini-extension.json +3 -3
  73. package/package.json +16 -5
  74. package/skills/3d-assets/character-model/SKILL.md +27 -5
  75. package/skills/3d-assets/environment-kit/SKILL.md +7 -2
  76. package/skills/3d-assets/organic-model/SKILL.md +4 -3
  77. package/skills/3d-assets/prop-model/SKILL.md +16 -8
  78. package/skills/3d-assets/vehicle-model/SKILL.md +4 -3
  79. package/skills/animation/animation-tree/SKILL.md +2 -0
  80. package/skills/animation/generate-motion/SKILL.md +25 -4
  81. package/skills/asset-pipeline/asset-strategy/SKILL.md +3 -2
  82. package/skills/workflow/mcpupdate/SKILL.md +134 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "summer",
3
- "version": "2.5.0",
4
- "description": "Superpowers for AI game dev. MCP bridge to the local Summer Engine plus a context primer that teaches Gemini the 60 Summer skills. Use with the npm CLI for skill files on disk.",
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 on summer doctor FAIL (off by default)",
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.5.0",
4
- "description": "Summer — superpowers for AI game dev. CLI, skills, and MCP tools for Summer Engine.",
3
+ "version": "2.6.0",
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
- "summer-engine"
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 `{ asset: { fileUrl } }` — an un-rigged static `.glb`. Import it for preview only:
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
- summer_import_from_url(url="<fileUrl>", path="res://assets/characters/knight_unrigged.glb")
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 `{ asset: { fileUrl }, rigAssetId }`. If you ran with `wait: false`, poll via `summer_check_job(jobId)`. The `rigAssetId` is the handle `summer:animation/generate-motion` needs — store it.
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
- summer_import_from_url(url="<rigged fileUrl>", path="res://assets/characters/knight.glb")
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
- summer_import_from_url(url="<fileUrl>", path="res://assets/kits/dungeon/wall.glb")
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>", filter={ kind: "model" })
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
- summer_import_from_url(url="<fileUrl>", path="res://assets/organic/pine_tree_01.glb")
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>", filter={ kind: "model" })
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 `{ asset: { fileUrl }, ... }`.
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
- summer_import_from_url(url="<fileUrl>", path="res://assets/models/viking_axe.glb")
92
- summer_add_node(parent="./World/Props", type="MeshInstance3D", name="VikingAxe")
93
- summer_set_prop(path="./World/Props/VikingAxe", property="mesh", value="res://assets/models/viking_axe.glb")
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), wrap the MeshInstance3D in a `StaticBody3D` (or `RigidBody3D` for physics props) with a `CollisionShape3D` sibling — see `summer:scene-composition` for the parent-shape pattern.
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>", filter={ kind: "model" })
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
- summer_import_from_url(url="<fileUrl>", path="res://assets/vehicles/race_car.glb")
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>", kind="model")
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 `{ animationAssetId, durationSeconds, previewUrl }`.
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", kind: "animation")`.
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 being imported, not generated (existing `.glb` / `.wav` from Sketchfab, Quaternius, AmbientCG) — call `summer_import_from_url` directly.
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.