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.
Files changed (290) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +5 -1
  3. package/.codex-plugin/plugin.json +5 -1
  4. package/.cursor-plugin/plugin.json +5 -1
  5. package/.factory-plugin/plugin.json +5 -1
  6. package/.opencode/INSTALL.md +8 -8
  7. package/.opencode/plugins/summer.js +2 -2
  8. package/AGENTS.md +7 -7
  9. package/CHANGELOG.md +37 -0
  10. package/GEMINI.md +1 -1
  11. package/NOTICE +1 -1
  12. package/README.md +35 -35
  13. package/assets/autopilot/run.sh +2 -2
  14. package/assets/navigation/web-routes.json +1 -1
  15. package/commands/gameskill.md +2 -2
  16. package/commands/summer.md +25 -25
  17. package/dist/cli/commands/open.d.ts +1 -1
  18. package/dist/cli/commands/run.d.ts +1 -1
  19. package/dist/cli/commands/run.js +1 -1
  20. package/dist/cli/commands/setup.js +24 -4
  21. package/dist/cli/commands/skills.js +2 -2
  22. package/dist/core/api-client.d.ts +5 -6
  23. package/dist/core/api-client.js +12 -15
  24. package/dist/core/auth.js +2 -2
  25. package/dist/core/capabilities/asset-import.d.ts +0 -1
  26. package/dist/core/capabilities/camera-view.d.ts +1 -1
  27. package/dist/core/capabilities/camera-view.js +2 -2
  28. package/dist/core/capabilities/capture-gameplay.d.ts +72 -7
  29. package/dist/core/capabilities/capture-gameplay.js +386 -25
  30. package/dist/core/capabilities/connect-signal.d.ts +1 -2
  31. package/dist/core/capabilities/connect-signal.js +1 -2
  32. package/dist/core/capabilities/console-read.d.ts +2 -2
  33. package/dist/core/capabilities/console-read.js +2 -2
  34. package/dist/core/capabilities/engine-receipt.d.ts +5 -7
  35. package/dist/core/capabilities/engine-receipt.js +7 -9
  36. package/dist/core/capabilities/export-engine-version.d.ts +7 -0
  37. package/dist/core/capabilities/export-engine-version.js +9 -0
  38. package/dist/core/capabilities/export-game.d.ts +4 -0
  39. package/dist/core/capabilities/export-game.js +53 -10
  40. package/dist/core/capabilities/export-presets.d.ts +1 -1
  41. package/dist/core/capabilities/export-presets.js +1 -1
  42. package/dist/core/capabilities/fabricate-mesh.d.ts +2 -3
  43. package/dist/core/capabilities/fabricate-mesh.js +2 -3
  44. package/dist/core/capabilities/frame-quality.d.ts +4 -4
  45. package/dist/core/capabilities/frame-quality.js +4 -4
  46. package/dist/core/capabilities/grep.d.ts +1 -1
  47. package/dist/core/capabilities/grep.js +1 -1
  48. package/dist/core/capabilities/image-generation.d.ts +12 -2
  49. package/dist/core/capabilities/image-generation.js +31 -2
  50. package/dist/core/capabilities/navigation/open.d.ts +1 -1
  51. package/dist/core/capabilities/navigation/open.js +1 -1
  52. package/dist/core/capabilities/navigation/render-product-map.js +1 -1
  53. package/dist/core/capabilities/navigation/targets.js +2 -2
  54. package/dist/core/capabilities/placement-batch.d.ts +1 -1
  55. package/dist/core/capabilities/placement-batch.js +2 -2
  56. package/dist/core/capabilities/play-determinism.d.ts +1 -1
  57. package/dist/core/capabilities/play-determinism.js +1 -1
  58. package/dist/core/capabilities/publish-build.d.ts +1 -1
  59. package/dist/core/capabilities/publish-build.js +21 -9
  60. package/dist/core/capabilities/publish-download.d.ts +1 -2
  61. package/dist/core/capabilities/publish-download.js +2 -3
  62. package/dist/core/capabilities/replace-node.d.ts +1 -3
  63. package/dist/core/capabilities/replace-node.js +1 -3
  64. package/dist/core/capabilities/runtime-control.d.ts +5 -7
  65. package/dist/core/capabilities/runtime-control.js +7 -9
  66. package/dist/core/capabilities/scene-batch.d.ts +1 -1
  67. package/dist/core/capabilities/scene-batch.js +1 -1
  68. package/dist/core/capabilities/scene-kind.js +1 -1
  69. package/dist/core/capabilities/scene-readback.d.ts +3 -4
  70. package/dist/core/capabilities/scene-readback.js +3 -4
  71. package/dist/core/capabilities/scene-script.d.ts +2 -2
  72. package/dist/core/capabilities/scene-script.js +2 -2
  73. package/dist/core/capabilities/seeing/shot-store.d.ts +1 -1
  74. package/dist/core/capabilities/seeing/shot-store.js +1 -1
  75. package/dist/core/capabilities/summer-bundle.d.ts +11 -3
  76. package/dist/core/capabilities/summer-bundle.js +21 -3
  77. package/dist/core/capabilities/surface-snap.d.ts +1 -1
  78. package/dist/core/capabilities/surface-snap.js +1 -1
  79. package/dist/core/capabilities/tool-dispatch.js +14 -3
  80. package/dist/core/capabilities/ui-control.d.ts +1 -2
  81. package/dist/core/capabilities/ui-control.js +1 -2
  82. package/dist/core/capabilities/world-snapshot.d.ts +1 -1
  83. package/dist/core/capabilities/world-snapshot.js +1 -1
  84. package/dist/core/capability-skew.d.ts +2 -3
  85. package/dist/core/capability-skew.js +4 -5
  86. package/dist/core/feedback/client.js +1 -1
  87. package/dist/core/launch-posture.d.ts +3 -3
  88. package/dist/core/launch-posture.js +3 -3
  89. package/dist/core/library-read.d.ts +7 -0
  90. package/dist/core/library-read.js +60 -9
  91. package/dist/core/library-search.d.ts +2 -0
  92. package/dist/core/templates.d.ts +1 -2
  93. package/dist/core/templates.js +1 -2
  94. package/dist/installer/agent-config.d.ts +25 -0
  95. package/dist/installer/agent-config.js +114 -3
  96. package/dist/installer/agent-table.d.ts +12 -0
  97. package/dist/installer/agent-table.js +9 -0
  98. package/dist/mcp/server.d.ts +2 -2
  99. package/dist/mcp/server.js +2 -2
  100. package/dist/mcp/tools/creator-tools.js +33 -4
  101. package/dist/mcp/tools/debug-tools.js +1 -1
  102. package/dist/mcp/tools/generate-tools.js +18 -37
  103. package/dist/mcp/tools/library-tools.d.ts +2 -1
  104. package/dist/mcp/tools/library-tools.js +1 -0
  105. package/dist/mcp/tools/navigation-tools.d.ts +1 -1
  106. package/dist/mcp/tools/navigation-tools.js +1 -1
  107. package/dist/mcp/tools/spatial-tools.js +1 -1
  108. package/dist/mcp/tools/visual-tools.js +2 -2
  109. package/dist/mcp/tools/with-engine.d.ts +1 -2
  110. package/dist/mcp/tools/with-engine.js +1 -2
  111. package/gemini-extension.json +5 -1
  112. package/hooks/session-start.sh +2 -2
  113. package/integrations/README.md +70 -76
  114. package/integrations/claude/README.md +0 -3
  115. package/integrations/codex/README.md +1 -2
  116. package/integrations/copilot-jetbrains/README.md +1 -1
  117. package/integrations/cursor/README.md +1 -2
  118. package/integrations/factory/README.md +15 -11
  119. package/integrations/mistral-vibe/README.md +1 -1
  120. package/integrations/opencode/README.md +1 -1
  121. package/integrations/roo-code/README.md +1 -1
  122. package/integrations/rovo-dev/README.md +1 -1
  123. package/integrations/trae/README.md +1 -1
  124. package/integrations/windsurf/README.md +3 -3
  125. package/library/references/collaborative-protocol/collaborative-protocol.md +5 -5
  126. package/library/references/gd-style/gd-style.md +4 -6
  127. package/library/references/godot-version/godot-version.md +3 -3
  128. package/library/references/headless-routing/headless-routing.md +2 -2
  129. package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +2 -2
  130. package/library/references/mcp-tools-reference/mcp-tools-reference.md +16 -15
  131. package/library/references/product-map/product-map.md +1 -1
  132. package/library/references/public-surface-language/public-surface-language.md +1 -1
  133. package/library/references/summer-folder/summer-folder.md +1 -1
  134. package/library/skills/3d-lighting/SKILL.md +4 -4
  135. package/library/skills/README.md +16 -6
  136. package/library/skills/adaptive-music/SKILL.md +7 -7
  137. package/library/skills/ai-characters-in-games/SKILL.md +1 -1
  138. package/library/skills/ambient-bed/SKILL.md +12 -14
  139. package/library/skills/animated-loop/SKILL.md +42 -42
  140. package/library/skills/animation-tree/SKILL.md +6 -6
  141. package/library/skills/art-direction/SKILL.md +8 -11
  142. package/library/skills/asset-strategy/SKILL.md +3 -3
  143. package/library/skills/audio-direction/SKILL.md +8 -10
  144. package/library/skills/auto-fire-targeting/SKILL.md +4 -3
  145. package/library/skills/bounded-engine-runs/SKILL.md +6 -7
  146. package/library/skills/brainstorm-game/SKILL.md +5 -5
  147. package/library/skills/brainstorming/SKILL.md +9 -15
  148. package/library/skills/celeste-momentum-platforming/SKILL.md +8 -13
  149. package/library/skills/celeste-momentum-platforming/resource.yaml +1 -1
  150. package/library/skills/character-animation-wiring/SKILL.md +2 -2
  151. package/library/skills/character-model/SKILL.md +15 -26
  152. package/library/skills/character-movement/SKILL.md +1 -1
  153. package/library/skills/character-movement/references/movement-3d.md +1 -1
  154. package/library/skills/character-portrait/SKILL.md +4 -4
  155. package/library/skills/cinematic-cutscene/SKILL.md +38 -38
  156. package/library/skills/combat-basics/SKILL.md +1 -1
  157. package/library/skills/compatibility-renderer-traps/SKILL.md +2 -2
  158. package/library/skills/concept-art/SKILL.md +3 -3
  159. package/library/skills/create-asset-sheet/SKILL.md +12 -31
  160. package/library/skills/debug/SKILL.md +5 -4
  161. package/library/skills/debugging-game-feel/SKILL.md +1 -4
  162. package/library/skills/debugging-game-feel/resource.yaml +1 -1
  163. package/library/skills/design-level/SKILL.md +5 -5
  164. package/library/skills/design-mechanic/SKILL.md +6 -6
  165. package/library/skills/design-npc/SKILL.md +8 -15
  166. package/library/skills/diagnosing-perf-regressions/SKILL.md +5 -10
  167. package/library/skills/dispatching-parallel-agents/SKILL.md +1 -19
  168. package/library/skills/environment-kit/SKILL.md +5 -5
  169. package/library/skills/export-and-ship/SKILL.md +24 -25
  170. package/library/skills/export-and-ship/resource.yaml +2 -1
  171. package/library/skills/fabricating-assets/SKILL.md +1 -1
  172. package/library/skills/facial-and-lipsync/SKILL.md +5 -5
  173. package/library/skills/fps-controller/SKILL.md +17 -16
  174. package/library/skills/fps-controller/resource.yaml +0 -2
  175. package/library/skills/game-feel/SKILL.md +6 -7
  176. package/library/skills/gameskill/SKILL.md +3 -3
  177. package/library/skills/gdscript-patterns/SKILL.md +3 -3
  178. package/library/skills/generate-motion/SKILL.md +5 -22
  179. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +72 -90
  180. package/library/skills/godogen-visual-proof-game-generation/resource.yaml +0 -1
  181. package/library/skills/grow-analytics/SKILL.md +21 -0
  182. package/library/skills/grow-analytics/resource.yaml +27 -0
  183. package/library/skills/headless-scripting/SKILL.md +8 -8
  184. package/library/skills/instantiate-asset-pack/SKILL.md +7 -3
  185. package/library/skills/investigating-bugs/SKILL.md +3 -11
  186. package/library/skills/investigating-bugs/condition-based-waiting.md +0 -10
  187. package/library/skills/investigating-bugs/root-cause-tracing.md +0 -8
  188. package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +15 -15
  189. package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +0 -1
  190. package/library/skills/make-game/SKILL.md +3 -5
  191. package/library/skills/make-game/references/2d-platformer.md +1 -1
  192. package/library/skills/multiplayer-project/SKILL.md +1 -1
  193. package/library/skills/multiplayer-testing/SKILL.md +4 -4
  194. package/library/skills/music-track/SKILL.md +40 -38
  195. package/library/skills/new-project/SKILL.md +4 -6
  196. package/library/skills/organic-model/SKILL.md +9 -9
  197. package/library/skills/pixel-art/SKILL.md +6 -6
  198. package/library/skills/play/SKILL.md +3 -4
  199. package/library/skills/playtesting-a-feature/SKILL.md +4 -6
  200. package/library/skills/procedural-animation/SKILL.md +10 -11
  201. package/library/skills/prop-model/SKILL.md +4 -4
  202. package/library/skills/psx-retro-rendering/SKILL.md +20 -20
  203. package/library/skills/psx-retro-rendering/resource.yaml +2 -3
  204. package/library/skills/publish-your-game/SKILL.md +21 -0
  205. package/library/skills/publish-your-game/resource.yaml +29 -0
  206. package/library/skills/realtime-wet-surfaces/SKILL.md +15 -15
  207. package/library/skills/realtime-wet-surfaces/resource.yaml +1 -2
  208. package/library/skills/remote-deploy/SKILL.md +20 -21
  209. package/library/skills/retarget/SKILL.md +19 -23
  210. package/library/skills/running-in-the-cloud/SKILL.md +5 -5
  211. package/library/skills/scene-composition/SKILL.md +5 -5
  212. package/library/skills/scene-hierarchy-design/SKILL.md +3 -3
  213. package/library/skills/scene-hierarchy-design/resource.yaml +0 -1
  214. package/library/skills/scene-scripting/SKILL.md +3 -3
  215. package/library/skills/scene-to-level/SKILL.md +28 -31
  216. package/library/skills/skill-create/SKILL.md +1 -1
  217. package/library/skills/skill-improve/SKILL.md +9 -9
  218. package/library/skills/skill-test/SKILL.md +10 -10
  219. package/library/skills/skintokens-auto-rigging/SKILL.md +18 -18
  220. package/library/skills/skintokens-auto-rigging/resource.yaml +3 -3
  221. package/library/skills/skybox-panorama/SKILL.md +8 -9
  222. package/library/skills/sound-effect/SKILL.md +19 -19
  223. package/library/skills/spatial-placement/SKILL.md +2 -2
  224. package/library/skills/spatial-placement/references/kit-placement-tools.md +12 -22
  225. package/library/skills/sprite-sheet/SKILL.md +10 -10
  226. package/library/skills/store-art/SKILL.md +23 -0
  227. package/library/skills/store-art/resource.yaml +30 -0
  228. package/library/skills/store-listing/SKILL.md +21 -0
  229. package/library/skills/store-listing/resource.yaml +25 -0
  230. package/library/skills/summer-analytics/SKILL.md +3 -3
  231. package/library/skills/summer-analytics/resource.yaml +1 -0
  232. package/library/skills/summer-friends/SKILL.md +10 -10
  233. package/library/skills/summer-leaderboards/SKILL.md +6 -6
  234. package/library/skills/summer-match-results/SKILL.md +13 -13
  235. package/library/skills/summer-matchmaking/SKILL.md +11 -11
  236. package/library/skills/summer-parties/SKILL.md +9 -9
  237. package/library/skills/summer-player-data/SKILL.md +12 -12
  238. package/library/skills/summer-store/SKILL.md +6 -6
  239. package/library/skills/summer-world-chat/SKILL.md +9 -9
  240. package/library/skills/summer-world-saves/SKILL.md +7 -7
  241. package/library/skills/text-to-motion/rigging-for-text-motion.md +1 -1
  242. package/library/skills/tileable-texture/SKILL.md +1 -1
  243. package/library/skills/trailer-shot/SKILL.md +36 -36
  244. package/library/skills/tune-performance/SKILL.md +13 -13
  245. package/library/skills/tune-performance/resource.yaml +1 -1
  246. package/library/skills/ui-graphics/SKILL.md +7 -7
  247. package/library/skills/use-widget-asset/SKILL.md +7 -7
  248. package/library/skills/using-summer/SKILL.md +5 -7
  249. package/library/skills/vehicle-model/SKILL.md +6 -7
  250. package/library/skills/vehicle-model/resource.yaml +2 -2
  251. package/library/skills/verification-before-completion/SKILL.md +5 -6
  252. package/library/skills/vfx-dissolve/SKILL.md +4 -4
  253. package/library/skills/vfx-fire/SKILL.md +6 -6
  254. package/library/skills/vfx-fire/_building-blocks/additive-billboard-particles.md +3 -3
  255. package/library/skills/vfx-hit-spark/SKILL.md +4 -4
  256. package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +3 -3
  257. package/library/skills/vfx-lightning/SKILL.md +5 -5
  258. package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +3 -3
  259. package/library/skills/vfx-lightning/_building-blocks/trauma-shake-snippet.md +9 -3
  260. package/library/skills/vfx-magic-glow/SKILL.md +4 -4
  261. package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +3 -3
  262. package/library/skills/vfx-muzzle-flash/SKILL.md +5 -5
  263. package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +3 -3
  264. package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +9 -3
  265. package/library/skills/vfx-smoke/SKILL.md +5 -5
  266. package/library/skills/vfx-water-ripple/SKILL.md +2 -2
  267. package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +3 -3
  268. package/library/skills/voice-line/SKILL.md +9 -9
  269. package/library/skills/world-building-3d/references/spatial-tools.md +2 -2
  270. package/library/skills/writing-plans/SKILL.md +4 -4
  271. package/library/skills/writing-skills/SKILL.md +8 -8
  272. package/library/tools/capture-gameplay/resource.yaml +66 -1
  273. package/library/tools/creator-publish/resource.yaml +4 -4
  274. package/library/tools/creator-releases/resource.yaml +5 -5
  275. package/library/tools/export-game/resource.yaml +3 -0
  276. package/library/tools/generate-image/resource.yaml +4 -2
  277. package/library/tools/publish-build/resource.yaml +5 -1
  278. package/package.json +1 -1
  279. package/registry/generated/counts.json +2 -2
  280. package/registry/generated/gemini-extension.json +5 -1
  281. package/registry/generated/index.json +280 -137
  282. package/registry/generated/marketplace.claude.json +1 -1
  283. package/registry/generated/plugin.claude.json +5 -1
  284. package/registry/generated/plugin.codex.json +5 -1
  285. package/registry/generated/plugin.cursor.json +5 -1
  286. package/registry/generated/plugin.factory.json +5 -1
  287. package/registry/generated/skills-index.md +16 -6
  288. package/registry/generated/skills-registry.json +57 -5
  289. package/registry/schemas/domains.json +1 -1
  290. package/registry/schemas/skill.schema.json +5 -0
@@ -5,7 +5,7 @@ license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: audio
7
7
  user-invocable: true
8
- allowed-tools: Read Grep Glob Write Edit summer_generate_audio summer_search_assets summer_import_from_url summer_add_node summer_set_prop summer_inspect_node summer_get_scene_tree
8
+ allowed-tools: Read Grep Glob Write Edit summer_generate_audio summer_search_assets summer_import_from_url summer_add_node summer_set_prop summer_instantiate_scene summer_inspect_node summer_get_scene_tree
9
9
  paths: ["audio/sfx/**", "scripts/**", "**/*.tscn"]
10
10
  ---
11
11
 
@@ -13,22 +13,22 @@ paths: ["audio/sfx/**", "scripts/**", "**/*.tscn"]
13
13
 
14
14
  ## Overview
15
15
 
16
- This skill produces one named SFX clip aligned with the audio bible's vocabulary, then wires it into the scene as an AudioStreamPlayer that plays once and frees its parent (or stops cleanly if it's a looped texture). The shape of the prompt is what makes the difference between "metal sword swing whoosh, dry, sharp, 250ms" returning the right clip on the first try and "epic battle sound" returning twenty seconds of musical noise.
16
+ This skill produces one named SFX clip that follows the audio bible's vocabulary, then wires it into the scene as an AudioStreamPlayer that plays once and frees itself (or stops cleanly if it is a short loop). The prompt shape decides the result: "metal sword swing whoosh, dry, sharp, 250ms" returns the right clip on the first try; "epic battle sound" returns twenty seconds of musical noise.
17
17
 
18
- ElevenLabs SFX (the `sound_effects` capability of `summer_generate_audio`) is *literal*. It treats the prompt as a description of a real sound, not as a vibe. Concrete material + action + intensity beats adjectives every time.
18
+ ElevenLabs SFX (the `sound_effects` capability of `summer_generate_audio`) is literal. It treats the prompt as a description of a real sound. Concrete material, action and intensity beat adjectives.
19
19
 
20
20
  ## When to use
21
21
 
22
22
  - One-shot SFX: footstep, swing, click, hit, impact, pickup, jump, land, door, breath.
23
- - Short loops < 2s: hum, drone snippet, rain texture (for very short looping ambients prefer `audio/ambient-bed`).
23
+ - Short loops < 2s: hum, drone snippet, rain texture (for longer looping ambience use `ambient-bed`).
24
24
  - Replacing a placeholder beep with something on-bible.
25
25
 
26
26
  ## When NOT to use
27
27
 
28
- - Music or musical stings → `audio/music-track`.
29
- - Long location ambience (>5s) → `audio/ambient-bed`.
30
- - Voice / dialogue → `audio/voice-line`.
31
- - Defining the *vocabulary* of SFX — that's `audio/audio-direction`. This skill executes against an existing bible.
28
+ - Music or musical stings → `music-track`.
29
+ - Long location ambience (>5s) → `ambient-bed`.
30
+ - Voice / dialogue → `voice-line`.
31
+ - Defining the *vocabulary* of SFX → `audio-direction`. This skill executes against an existing bible.
32
32
 
33
33
  ## Steps
34
34
 
@@ -46,7 +46,7 @@ The bible defines an SFX *class* (UI, Pickup positive, Damage, Footstep, Attack,
46
46
 
47
47
  ### 2. Search for an existing clip first
48
48
 
49
- Generation is metered. Reuse beats regenerate.
49
+ Generation uses credits. Reuse an existing clip when one fits.
50
50
 
51
51
  ```
52
52
  summer_search_assets(query="<class> <subject>", assetType="audio", source="all")
@@ -64,7 +64,7 @@ ElevenLabs SFX responds to literal sound descriptions. Pattern:
64
64
  <subject> <material> <action>, <intensity>, <character>, <duration cue>
65
65
  ```
66
66
 
67
- Working examples (these produce the right clip on the first try):
67
+ Working examples:
68
68
 
69
69
  | Goal | Prompt that works | Why |
70
70
  |---|---|---|
@@ -91,7 +91,7 @@ Prompts that DON'T work (and why):
91
91
 
92
92
  Show the prompt and the call before running:
93
93
 
94
- > Prompt: `metal sword swing whoosh, dry, sharp, 250ms`. Duration 0.5s (model floor). Model: ElevenLabs SFX. Cost: ~1 credit. Generate?
94
+ > Prompt: `metal sword swing whoosh, dry, sharp, 250ms`. Duration 0.5s (model floor). Model: ElevenLabs SFX. Generate?
95
95
 
96
96
  The `sound_effects` capability reads the description from **`text`**, not `prompt`. Passing `prompt` here is a 400 `text_required` — `prompt` is only for the `music` capability.
97
97
 
@@ -155,7 +155,7 @@ func _ready() -> void:
155
155
  play()
156
156
  ```
157
157
 
158
- Save it as a `.tscn`, then `summer_instantiate_scene(scenePath, parent, scene, name)` to place it. Note this only wires the node into a scene at author time — spawning one per event at the emitter's runtime position is a job for GDScript (`preload(...).instantiate()` + `add_child`), not for an MCP call. The node frees itself when the stream finishes — no leaks.
158
+ Save it as a `.tscn`, then `summer_instantiate_scene(scenePath, parent, scene, name)` to place it. That only places the node at author time. To spawn one per event at the emitter's position at runtime, use GDScript (`preload(...).instantiate()` + `add_child`). The node frees itself when the stream finishes.
159
159
 
160
160
  ### 8. Volume calibration
161
161
 
@@ -170,7 +170,7 @@ If it comes back too loud (rare): negative `volume_db`, or trim attack in an edi
170
170
  ### 9. Confirm in scene
171
171
 
172
172
  ```
173
- summer_inspect_node(path="/root/Game/Player/SwingSFX")
173
+ summer_inspect_node(path="Player/SwingSFX")
174
174
  ```
175
175
 
176
176
  Verify `stream`, `bus`, `volume_db`. Trigger it via `summer_play` if the user wants to hear it now.
@@ -199,7 +199,7 @@ Stinger event: short triumphant brass stinger, 1.5s, hall reverb
199
199
 
200
200
  - **Adjective-only prompts.** `epic`, `cool`, `realistic`, `professional` — meaningless to the model.
201
201
  - **Multiple events in one prompt.** Split into two generations.
202
- - **Looping a non-loop-clean clip.** Will click. Use `audio/ambient-bed` for actual loops.
202
+ - **Looping a non-loop-clean clip.** It clicks. Use `ambient-bed` for real loops.
203
203
  - **Skipping the bus.** Default bus is `Master`. SFX must route to the `SFX` bus or the mix breaks.
204
204
  - **Generating before searching.** Reuse before regenerate.
205
205
  - **Generating before reading the bible.** The clip will fight the rest of the audio.
@@ -230,13 +230,13 @@ After the SFX is wired:
230
230
  > SFX `sword_swing_01.wav` wired to `Player/SwingSFX` on the `SFX` bus. Next:
231
231
  > - Trigger it from your attack animation's `Call Method Track` → `play()`.
232
232
  > - Generate the parry / clash counterpart with `/sound-effect` again.
233
- > - For a full footstep system across surfaces, see `audio/footstep-systems`.
233
+ > - For footsteps across surfaces, generate one clip per material and switch on the floor's `physics_material` (see Edge cases).
234
234
 
235
235
  ## See also
236
236
 
237
- - `audio/audio-direction` — defines the vocabulary this skill obeys
238
- - `audio/ambient-bed` — long looping textures
239
- - `audio/music-track` — music
240
- - `audio/voice-line` — TTS
237
+ - `audio-direction` — defines the vocabulary this skill obeys
238
+ - `ambient-bed` — long looping textures
239
+ - `music-track` — music
240
+ - `voice-line` — TTS
241
241
  - `../../references/mcp-tools-reference/mcp-tools-reference.md`
242
242
  - `../../references/godot-version/godot-version.md` — Summer compatibility for audio nodes
@@ -59,7 +59,7 @@ defined relative to a rotated subject; then use `directionSpace="local"`.
59
59
  - `grounded: true` means downward support was detected. It does not mean the
60
60
  object is centered or otherwise well placed.
61
61
  - `contactStatus` and `contacts` identify touching or overlapping colliders.
62
- Godot's shape query cannot distinguish touching from penetration here.
62
+ The physics shape query cannot distinguish touching from penetration here.
63
63
  - `directions.<label>.status` is `blocked` when clearance is below the tool's
64
64
  threshold; `distance` is measured from the subject bounds.
65
65
  - `evidence: "physics"` is exact collider-query evidence.
@@ -93,7 +93,7 @@ defined relative to a rotated subject; then use `directionSpace="local"`.
93
93
  5. Check: `summer_measure` plane mode on each facade line (every front on one
94
94
  plane), pair mode on joints you doubt, `summer_starcast` with
95
95
  `directionSpace: "local"` on mounted pieces, `summer_test_placement` before
96
- committing a piece in a tight spot. Starcast's local names follow Godot:
96
+ committing a piece in a tight spot. Starcast's local names follow the engine:
97
97
  `forward` is -Z, `back` is +Z. A piece with a -Z back should read
98
98
  `forward` blocked by the wall at about the standoff (or the wall in
99
99
  `contacts` when flush) and `back` open.
@@ -30,7 +30,7 @@ Read it before the first call in a task. The workflow that uses them is in
30
30
  declared in `truncated: {list: {shown, total}}`.
31
31
  - **No silent fallback.** A missing op answers `engine_lacks_op`; a measurement
32
32
  that cannot be made answers a named `failure_reason`.
33
- - **Engine ops.** No new engine op. Reads run one read-only GDScript probe
33
+ - **Engine ops.** Reads run one read-only GDScript probe
34
34
  through `RunSceneScript` (the op behind `summer_run_script`: in-process, no
35
35
  child editor, `undo: "none"`, no checkpoint). Mutations are ordinary
36
36
  `SetProp`, `SnapToSurface` and `InstantiateScene` ops: one undo step per
@@ -52,11 +52,11 @@ Read it before the first call in a task. The workflow that uses them is in
52
52
  | Pipe or duct end to end | `summer_connect_ports` |
53
53
  | What is in front of this point, and its normal? | `summer_raycast` |
54
54
  | Gap or overlap between two pieces; is the facade front flat? | `summer_measure` |
55
- | What surrounds a placed piece, which side is blocked? | `summer_starcast` (existing) |
56
- | Will a pose fit before I commit it in a tight spot? | `summer_test_placement` (existing) |
57
- | Seat a prop on a floor, table or ledge | `summer_snap_to_surface` (existing) |
58
- | Line up or equally space 2-16 placed pieces on one axis | `summer_align_distribute_3d` (existing) |
59
- | Did exactly that change, and does it look right? | `summer_world_snapshot` + `summer_snapshot_diff`, then `summer_screenshot` (existing) |
55
+ | What surrounds a placed piece, which side is blocked? | `summer_starcast` |
56
+ | Will a pose fit before I commit it in a tight spot? | `summer_test_placement` |
57
+ | Seat a prop on a floor, table or ledge | `summer_snap_to_surface` |
58
+ | Line up or equally space 2-16 placed pieces on one axis | `summer_align_distribute_3d` |
59
+ | Did exactly that change, and does it look right? | `summer_world_snapshot` + `summer_snapshot_diff`, then `summer_screenshot` |
60
60
 
61
61
  ## `summer_inspect_asset`
62
62
 
@@ -133,20 +133,20 @@ instances it off the scene tree, measures, and frees it.
133
133
 
134
134
  ## `summer_instantiate_scene` (placed)
135
135
 
136
- - **Arguments added:** `position`, `rotation_degrees`, `scale` (`[x, y, z]`,
136
+ - **Placement arguments:** `position`, `rotation_degrees`, `scale` (`[x, y, z]`,
137
137
  parent-local) or `transform` (`"Transform3D(xx, xy, xz, yx, yy, yz, zx, zy,
138
138
  zz, ox, oy, oz)"`). Not `transform` with the others; not `scale` or
139
139
  `transform` with `target_size`.
140
140
  - **Behaviour:** `InstantiateScene` (its own request, as the engine requires),
141
141
  then one `SetProp` request on the node path the receipt reports (a name
142
- collision rename is followed), then `SaveScene`. Without the new fields it is
143
- unchanged.
142
+ collision rename is followed), then `SaveScene`. Without these fields it only
143
+ instances the piece.
144
144
  - **Result:** the merged receipt (`results` holds every op; the per-request
145
145
  `receipts` copies are kept only when something failed) plus
146
146
  `placement {nodePath, applied, fields, space: "parent_local"}`.
147
147
  - **Ops:** `InstantiateScene`, `SetProp`, `SaveScene`.
148
148
 
149
- ## `summer_batch` additions
149
+ ## `summer_batch` placement
150
150
 
151
151
  - `InstantiateScene` ops may carry the same placement fields (arrays or
152
152
  `"Vector3(...)"` strings). Each piece is one op; its `SetProp`s are sent right
@@ -161,8 +161,7 @@ instances it off the scene tree, measures, and frees it.
161
161
  transforms of a run of `InstantiateScene` ops are held back and sent
162
162
  together (up to 200 `SetProp`s per request) just before the next op that is
163
163
  not an `InstantiateScene`, riding along with it when it can. A batch of N
164
- placed pieces is therefore about N + 2 requests and N + 2 undo steps (it was
165
- 2N + 1). Every later op in the list (a `SetProp`, `SnapToSurface`, a query,
164
+ placed pieces is therefore about N + 2 requests and N + 2 undo steps. Every later op in the list (a `SetProp`, `SnapToSurface`, a query,
166
165
  the save) runs after the transforms land. If an `InstantiateScene` fails,
167
166
  the pieces created before it still get their transforms; nothing is saved.
168
167
 
@@ -245,7 +244,7 @@ instances it off the scene tree, measures, and frees it.
245
244
  in front of the hit plane); `hit_normal_pointed_away_from_the_ray_flipped`
246
245
  (the ray hit a back face; the piece still mounts on the ray's side).
247
246
  - **Check after:** `summer_starcast` with `directionSpace: "local"`. Its local
248
- names follow Godot (`forward` = -Z, `back` = +Z), so a -Z back reads
247
+ names follow the engine (`forward` = -Z, `back` = +Z), so a -Z back reads
249
248
  `forward` blocked (or the surface in `contacts` when seated flush) and `back`
250
249
  open.
251
250
  - **Limits:** the back face is the visible-mesh AABB in the piece's own axes;
@@ -353,12 +352,3 @@ instances it off the scene tree, measures, and frees it.
353
352
  - **Result, plane:** `{coplanar, plane, spread, off_plane_count, nodes [{path,
354
353
  face, deviation, off_plane: proud|recessed}], no_geometry?}`.
355
354
  - **Ops:** `RunSceneScript` (read-only).
356
-
357
- ## What belongs in the engine later
358
-
359
- These tools compose existing ops. Natively they would be faster and exact:
360
- an `InstantiateScene` that takes a transform (one request, one undo step per
361
- piece), a compact `summer_batch` receipt mode in the ops executor, a raycast and
362
- a measure op that need no script and do not mark the active tab unsaved, an
363
- asset-geometry op that reads the import cache without instancing, and an
364
- oriented-bounds (OBB) query so rotated pieces stop needing `space: "local"`.
@@ -5,7 +5,7 @@ license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: 2d-assets
7
7
  user-invocable: true
8
- allowed-tools: Read Grep Glob Write Edit summer_generate_image summer_slice_asset_sheet summer_get_studio_workflow summer_search_assets summer_import_from_url summer_import_asset_by_id summer_set_resource_property summer_add_node summer_set_prop
8
+ allowed-tools: Read Grep Glob Write Edit summer_generate_image summer_slice_asset_sheet summer_get_studio_workflow summer_search_assets summer_import_from_url summer_import_asset_by_id summer_set_resource_property summer_write_file summer_add_node summer_set_prop summer_save_scene
9
9
  paths: ["assets/**", "sprites/**", "art/sprites/**"]
10
10
  ---
11
11
 
@@ -13,7 +13,7 @@ paths: ["assets/**", "sprites/**", "art/sprites/**"]
13
13
 
14
14
  This skill produces a grid of animation frames for a 2D character — walk cycle, idle bob, attack swing, death sequence — and wires the result into an `AnimatedSprite2D` via a `SpriteFrames` resource.
15
15
 
16
- **Up-front honesty:** sprite-sheet generation from a single text-to-image call is **unreliable**. Models can render "a sprite sheet of a knight walking" and produce 8 frames, but the inter-frame consistency (same anatomy, same costume, same lighting) is poor. Limbs morph between frames. Pixel sprites get extra fingers in frame 3. The result usually looks worse than the static sprite did.
16
+ Sprite-sheet generation from a single text-to-image call is **unreliable**. Models can render "a sprite sheet of a knight walking" and produce 8 frames, but the inter-frame consistency (same anatomy, same costume, same lighting) is poor. Limbs morph between frames. Pixel sprites get extra fingers in frame 3. The result usually looks worse than the static sprite did.
17
17
 
18
18
  This skill therefore offers **three paths**, ranked by reliability:
19
19
 
@@ -38,7 +38,7 @@ So do not tell the user to cut a generated sheet by hand or in ImageMagick. The
38
38
  - The character is 3D — use `generate-motion` for skeletal animation.
39
39
  - The user wants a single static sprite → `pixel-art` or `character-portrait`.
40
40
  - The user wants UI animation (loading spinner, button hover) — animate via `AnimationPlayer` rotating/tweening a static texture instead. Don't sprite-sheet UI.
41
- - The user has 12+ frames per animation and 4+ animations — that's hundreds of generations at $0.02 each. Pause and discuss budget.
41
+ - The user has 12+ frames per animation and 4+ animations. That is dozens to hundreds of generations, each using credits. Pause and agree on scope first.
42
42
 
43
43
  ## Steps
44
44
 
@@ -62,7 +62,7 @@ Ask the user (or decide based on context):
62
62
  | Higher-res character (128px+), 6-12 frames | **Per-frame img2img** |
63
63
  | User wants exact-pixel consistency | **Aseprite manual** — AI cannot deliver exact pixels |
64
64
 
65
- State the path before starting: "I'll do per-frame img2img — 6 generations, ~$0.12. The first frame is the base; each next frame uses the previous as reference. OK?"
65
+ State the path before starting: "I'll do per-frame img2img: 6 generations. The first frame is the base; each next frame uses the previous one as reference. OK?"
66
66
 
67
67
  ### 3a. Path 1 — Per-frame img2img
68
68
 
@@ -74,11 +74,11 @@ summer_generate_image(
74
74
  referenceImageUrl="<frame 1 fileUrl>",
75
75
  model="nano-banana-2",
76
76
  style="<same as base>",
77
- options={ removeBackground: true }
77
+ removeBackground=true
78
78
  )
79
79
  ```
80
80
 
81
- `summer_generate_image` has no `image_size` and no `negative_prompt` — put negations in the prompt text; there is no size argument at all. `options.removeBackground: true` is real and gives you true alpha instead of a prompted "transparent background" the model may paint as a literal checkerboard. `referenceImageUrl` only works on edit-capable models (`nano-banana-2`, `seedream-5-pro`, `nano-banana-lite`, `gpt-image-2`, `gemini-flash`, `flux-2`); `grok-imagine` has no edit endpoint and returns `edit_not_supported`.
81
+ `summer_generate_image` has no size argument; put negations in the prompt text. `removeBackground: true` gives you real alpha instead of a prompted "transparent background" that the model may paint as a literal checkerboard. `referenceImageUrl` only works on edit-capable models (`nano-banana-2`, `seedream-5-pro`, `nano-banana-lite`, `gpt-image-2`, `gemini-flash`, `flux-2`); `grok-imagine` has no edit endpoint and returns `edit_not_supported`.
82
82
 
83
83
  Repeat for each frame. Save each as `goblin_walk_01.png`, `goblin_walk_02.png`, etc.
84
84
 
@@ -93,11 +93,11 @@ summer_generate_image(
93
93
  prompt="goblin warrior walk cycle, sprite sheet, 6 frames in a horizontal row, identical character across frames, side view, frames clearly separated with empty space between them, consistent lighting, consistent palette. No scene background, no varying lighting, not a different character per frame.",
94
94
  model="nano-banana-2",
95
95
  style="none",
96
- options={ removeBackground: true }
96
+ removeBackground=true
97
97
  )
98
98
  ```
99
99
 
100
- There is no `"pixel"` style preset (`style` is `realistic | cartoon | anime | none`; anything else is coerced to `none`), no `image_size`, and no `negative_prompt` — the layout and the negations have to be in the prompt.
100
+ There is no `"pixel"` style preset (`style` is `realistic | cartoon | anime | none`; anything else is coerced to `none`) and no size argument; the layout and the negations have to be in the prompt.
101
101
 
102
102
  Then cut it with the same server-side slicer Studio uses, passing the asset id the generation returned:
103
103
 
@@ -113,7 +113,7 @@ Inspect the result. If the frames are coherent and the count matches, proceed. I
113
113
 
114
114
  Tell the user:
115
115
 
116
- > AI sprite-sheet generation is unreliable — best path for clean pixel animation is to hand-author in Aseprite (or Piskel for free in-browser). Onion-skin frame-by-frame; ~10 minutes for a 4-frame walk cycle. Want me to generate a base reference image you can trace?
116
+ > AI sprite-sheet generation is unreliable. For clean pixel animation, hand-author it in Aseprite (or Piskel, free in the browser). Onion-skin frame-by-frame; ~10 minutes for a 4-frame walk cycle. Want me to generate a base reference image you can trace?
117
117
 
118
118
  If yes, generate the static base via `pixel-art` and stop here. The user takes it to Aseprite.
119
119
 
@@ -223,7 +223,7 @@ Frame 3: summer_generate_image(prompt="<base + delta>", referenceImageUrl="<fram
223
223
  ...
224
224
  ```
225
225
 
226
- Tell the user to run via the Summer dashboard. Or recommend Aseprite (paid, $20) / Piskel (free in-browser) for hand-authoring — for pixel art under 64×64, it is the faster path even with MCP available.
226
+ Tell the user to run via the Summer dashboard. Or recommend Aseprite (paid) or Piskel (free, in the browser) for hand-authoring — for pixel art under 64×64, it is the faster path even with MCP available.
227
227
 
228
228
  ## Handoff
229
229
 
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: store-art
3
+ description: "Make Summer Games store art per slot and flow: key art, covers, icons, screenshots, trailer: size, shape, text rules, fallbacks."
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: deployment
7
+ user-invocable: true
8
+ allowed-tools: summer_read_library
9
+ ---
10
+
11
+ # /store-art — store art
12
+
13
+ This skill covers every store art slot per flow (desktop and mobile): size, shape, text rules, fallbacks, and why each one matters.
14
+
15
+ Its current text lives on the hosted Summer Engine MCP, the same text the Studio agent reads, so it changes with the store and is never stale here. Load it before you act:
16
+
17
+ 1. `summer_read_library` with id `skill/store-art` returns the current text when this machine has a store sign-in (`summer login --store`).
18
+ 2. A host that shows MCP prompts or resources has it as the `store-art` prompt and the resource `summer://skills/store-art`.
19
+ 3. Without a store sign-in: https://docs.summerengine.com/llms.txt lists every docs page; fetch any page as .md.
20
+
21
+ Screenshots: `summer_capture_gameplay` takes them offscreen. Get past the title screen with the game's own flags in `args` or with `steps`, e.g. `{"args":["--autostart"],"steps":[{"wait":3000},{"shot":true},{"key":"Space"},{"wait":800},{"shot":true}]}`.
22
+
23
+ The one rule to keep even before you load it: Key art, covers and icons carry no text: the stores draw the title over them. Screenshots are real play.
@@ -0,0 +1,30 @@
1
+ id: skill/store-art
2
+ kind: skill
3
+ version: 1.0.0
4
+ summary: "Make Summer Games store art per slot and flow: key art, covers, icons, screenshots, trailer: size, shape, text rules, fallbacks."
5
+ use_when:
6
+ - "making or choosing store art for Summer Games: key art, cover, icon, screenshots, trailer"
7
+ - "summer_store_set_art rejects an image for its shape or size, or summer_store_get_listing says an art slot is missing"
8
+ - "deciding whether a store image may carry text, and which slot falls back to which"
9
+ facets:
10
+ lifecycle:
11
+ - launch
12
+ domains:
13
+ - creator
14
+ - assets
15
+ modalities:
16
+ - images
17
+ - video
18
+ related:
19
+ skills:
20
+ - skill/publish-your-game
21
+ - skill/store-listing
22
+ tools:
23
+ - tool/generate-image
24
+ - tool/capture-gameplay
25
+ - tool/list-my-assets
26
+ hosted_resource: "summer://skills/store-art"
27
+ source: official
28
+ license: MIT
29
+ status: stable
30
+ recommended: false
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: store-listing
3
+ description: "Write a Summer Games store page per flow (desktop, mobile): targets, title, tagline, descriptions, tags, and what never to write."
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: deployment
7
+ user-invocable: true
8
+ allowed-tools: summer_read_library
9
+ ---
10
+
11
+ # /store-listing — store listing
12
+
13
+ This skill covers the store page text per flow (desktop and mobile): targets, title, tagline, descriptions, tags, and what never to write.
14
+
15
+ Its current text lives on the hosted Summer Engine MCP, the same text the Studio agent reads, so it changes with the store and is never stale here. Load it before you act:
16
+
17
+ 1. `summer_read_library` with id `skill/store-listing` returns the current text when this machine has a store sign-in (`summer login --store`).
18
+ 2. A host that shows MCP prompts or resources has it as the `store-listing` prompt and the resource `summer://skills/store-listing`.
19
+ 3. Without a store sign-in: https://docs.summerengine.com/llms.txt lists every docs page; fetch any page as .md.
20
+
21
+ The one rule to keep even before you load it: Never invent features, modes, player counts, awards or prices.
@@ -0,0 +1,25 @@
1
+ id: skill/store-listing
2
+ kind: skill
3
+ version: 1.0.0
4
+ summary: "Write a Summer Games store page per flow (desktop, mobile): targets, title, tagline, descriptions, tags, and what never to write."
5
+ use_when:
6
+ - "writing or fixing a game's store page text on Summer Games: title, tagline, description, tags"
7
+ - "summer_store_update_listing or summer_store_get_listing says a text field is missing or wrong"
8
+ - "choosing the targets (web, Mac, Windows, Linux, iPhone, Android) that decide the desktop and mobile store flows"
9
+ facets:
10
+ lifecycle:
11
+ - launch
12
+ domains:
13
+ - creator
14
+ - product-language
15
+ modalities:
16
+ - docs
17
+ related:
18
+ skills:
19
+ - skill/publish-your-game
20
+ - skill/store-art
21
+ hosted_resource: "summer://skills/store-listing"
22
+ source: official
23
+ license: MIT
24
+ status: stable
25
+ recommended: false
@@ -142,6 +142,6 @@ Every failure is final: none of them asks you to capture again.
142
142
 
143
143
  ## See also
144
144
 
145
- - `skill/multiplayer` — where the client and the authority run
146
- - `skill/multiplayer-state` — the authority's Command handlers, where most events happen
147
- - `skill/summer-match-results` — results and ratings, which Summer records itself
145
+ - `multiplayer` — where the client and the authority run
146
+ - `multiplayer-state` — the authority's Command handlers, where most events happen
147
+ - `summer-match-results` — results and ratings, which Summer records itself
@@ -22,6 +22,7 @@ related:
22
22
  - skill/multiplayer-state
23
23
  - skill/summer-match-results
24
24
  - skill/summer-store
25
+ - skill/grow-analytics
25
26
  source: official
26
27
  license: MIT
27
28
  status: preview
@@ -42,7 +42,7 @@ Declining never blocks play. A game must work without these permissions.
42
42
 
43
43
  **Availability:**
44
44
 
45
- - **Engine release.** This needs an engine that includes Summer Engine PR #508. On engines without it, `Summer.client.friends` does not exist and scripts that use it fail to parse. Check the class reference for `SummerClientFriends` before using this skill.
45
+ - **Engine release.** This needs an engine release that includes `SummerClientFriends`. On older engines, `Summer.client.friends` does not exist and scripts that use it fail to parse. Check the class reference for `SummerClientFriends` before using this skill.
46
46
  - **Hosted only.** `is_available()` is `false` in Local Play and editor runs, for guests, for accounts the platform keeps out of social features (`age_restricted`, under 13), and in Summer apps without `player.friends@1` (friends) or `player.messaging@1` (messages).
47
47
  - **Overlays.** The screens need the Summer app to offer friends and parties; otherwise they fail with `capability_unavailable` or `ui_unavailable`.
48
48
 
@@ -133,8 +133,8 @@ How it behaves:
133
133
  - **When the list is read again.** With a handler on `changed`, the engine re-reads the list on every change hint, after a consent decision, on `refresh()`, and about every 60 seconds while the game is in front. Never poll yourself.
134
134
  - **Statuses.** Show `in_this_game` friends first. `unknown` means presence couldn't be read; it is not `offline`.
135
135
  - **Rows.** Key them by `user_id`; each read replaces the `SummerFriend` objects.
136
- - **Profiles of other players.** For the people in the current match, use the user ids your authority publishes (the `players` map in `skill/summer-world-chat`, step 1) and call `show_profile(user_id)`. Your own id fails with `invalid_argument`.
137
- - **Inviting a friend into a match.** Use the party invite sheet (`skill/summer-parties`).
136
+ - **Profiles of other players.** For the people in the current match, use the user ids your authority publishes (the `players` map in `summer-world-chat`, step 1) and call `show_profile(user_id)`. Your own id fails with `invalid_argument`.
137
+ - **Inviting a friend into a match.** Use the party invite sheet (`summer-parties`).
138
138
 
139
139
  ### 3. Direct messages (only if chat is central)
140
140
 
@@ -188,7 +188,7 @@ Local Play has no accounts, so check the hidden path locally:
188
188
  - there are no script errors.
189
189
 
190
190
  ```
191
- summer_project_setting name="summer/local_play/players" value=2
191
+ summer_project_setting key="summer/local_play/players" value=2
192
192
  summer_play
193
193
  summer_get_diagnostics
194
194
  summer_stop
@@ -199,7 +199,7 @@ and revoke access in the Summer app, and watch `access_changed`.
199
199
 
200
200
  ## Checklist
201
201
 
202
- - [ ] The engine's class reference lists `SummerClientFriends` (Summer Engine PR #508 or later).
202
+ - [ ] The engine's class reference lists `SummerClientFriends`.
203
203
  - [ ] `summer.build.json` declares exactly the permissions the code asks for.
204
204
  - [ ] Local Play: friends features are hidden, with no script errors.
205
205
  - [ ] Declining consent leaves the game fully playable, and the button can ask again later.
@@ -216,11 +216,11 @@ and revoke access in the Summer app, and watch `access_changed`.
216
216
  | Treat `unknown` as `offline` | Show it as unknown | It means presence couldn't be read |
217
217
  | Poll `refresh()` on a timer | Connect `changed` | The engine already re-reads while a handler is connected |
218
218
  | Declare every permission "just in case" | Declare only what you use | The consent sheet lists each declared permission |
219
- | Use friends to put players in one match | `skill/summer-parties` | Parties are how players play together |
219
+ | Use friends to put players in one match | `summer-parties` | Parties are how players play together |
220
220
 
221
221
  ## See also
222
222
 
223
- - `skill/summer-parties`: playing together, the invite sheet
224
- - `skill/summer-world-chat`: chat inside a match
225
- - `skill/multiplayer-publish`: `summer.build.json` and publishing a Build
226
- - `skill/multiplayer-testing`: what Local Play can and can't test
223
+ - `summer-parties`: playing together, the invite sheet
224
+ - `summer-world-chat`: chat inside a match
225
+ - `multiplayer-publish`: `summer.build.json` and publishing a Build
226
+ - `multiplayer-testing`: what Local Play can and can't test
@@ -31,7 +31,7 @@ Under Local Play they fail with a typed code (step 5); the authority's
31
31
  degrade gracefully, and check the real numbers on a hosted staging build.
32
32
 
33
33
  This skill extends the Courtyard game: its authority concludes matches as in
34
- `skill/summer-match-results`.
34
+ `summer-match-results`.
35
35
 
36
36
  ## Steps
37
37
 
@@ -104,7 +104,7 @@ func show_queue_board(queue: StringName) -> void:
104
104
  pending returns the same operation.
105
105
 
106
106
  After a match, `Summer.client.ratings.rating_committed` delivers the
107
- player's own before-and-after rating (see `skill/summer-match-results`).
107
+ player's own before-and-after rating (see `summer-match-results`).
108
108
 
109
109
  ### 3. Write a Game ranking from the authority
110
110
 
@@ -136,7 +136,7 @@ func _add_score(ranking: StringName, player_id: String, points: int) -> void:
136
136
  ```
137
137
 
138
138
  `sessions` maps each `session_id` to the `SummerSession` the authority keeps
139
- in `_on_session_joined` (`skill/summer-match-results`, step 1). The engine never
139
+ in `_on_session_joined` (`summer-match-results`, step 1). The engine never
140
140
  retries a write. After a failure other than a conflict, read the score before
141
141
  deciding to write again: the first write may have committed.
142
142
 
@@ -226,6 +226,6 @@ on them.
226
226
 
227
227
  ## See also
228
228
 
229
- - `skill/summer-match-results` — concluding matches, which moves ratings
230
- - `skill/summer-matchmaking` — declaring rated queues and teams
231
- - `skill/summer-player-data` — saving per-player progress that isn't a ranking
229
+ - `summer-match-results` — concluding matches, which moves ratings
230
+ - `summer-matchmaking` — declaring rated queues and teams
231
+ - `summer-player-data` — saving per-player progress that isn't a ranking
@@ -29,9 +29,9 @@ Where it works: all of this runs under Local Play with a deterministic
29
29
  settlement, so the whole flow is testable locally. Rating values are real only
30
30
  when hosted.
31
31
 
32
- This skill extends the Courtyard game (`skill/multiplayer-project` and
33
- `skill/multiplayer-state`): the first player to collect `WIN_COINS` coins wins.
34
- With a team queue (`skill/summer-matchmaking`), their whole team wins.
32
+ This skill extends the Courtyard game (`multiplayer-project` and
33
+ `multiplayer-state`): the first player to collect `WIN_COINS` coins wins.
34
+ With a team queue (`summer-matchmaking`), their whole team wins.
35
35
 
36
36
  ## Steps
37
37
 
@@ -48,7 +48,7 @@ var sessions := {} # session_id -> SummerSession
48
48
  ```
49
49
 
50
50
  In `_ready()`, next to the other World signals (skip this line if
51
- `skill/summer-player-data` already connected it):
51
+ `summer-player-data` already connected it):
52
52
 
53
53
  ```gdscript
54
54
  world.session_joined.connect(_on_session_joined)
@@ -61,7 +61,7 @@ func _on_session_joined(session: SummerSession) -> void:
61
61
  sessions[session.session_id] = session
62
62
  ```
63
63
 
64
- If the game already has `_on_session_joined` (`skill/summer-player-data`
64
+ If the game already has `_on_session_joined` (`summer-player-data`
65
65
  adds one), put the line at its start instead of defining it twice.
66
66
 
67
67
  At the top of `_on_session_left`:
@@ -159,7 +159,7 @@ The rules `conclude` enforces:
159
159
  refused. A rejected conclusion (`invalid_request`) commits nothing, so you
160
160
  may conclude again with corrected arguments.
161
161
  - `rating_deltas`, the third argument, is only for `authority_v1` queues
162
- (`skill/summer-leaderboards`).
162
+ (`summer-leaderboards`).
163
163
 
164
164
  The settlement lists each player's committed rating changes:
165
165
 
@@ -205,7 +205,7 @@ func _on_server_disconnected(code: String, _detail: String) -> void:
205
205
  show_status("The match has ended.")
206
206
  ```
207
207
 
208
- `show_status` and the `Hud/Status` label come from `skill/summer-matchmaking`.
208
+ `show_status` and the `Hud/Status` label come from `summer-matchmaking`.
209
209
 
210
210
  - `match_result` arrives when the authority concludes. Its `rating_state` is
211
211
  `RATING_STATE_PENDING` on a rated queue, or `RATING_STATE_NONE`.
@@ -232,7 +232,7 @@ func _on_server_disconnected(code: String, _detail: String) -> void:
232
232
  `world.complete()` on a World that should keep running.
233
233
  - `draining(deadline_unix)` on the World means Summer is shutting the server
234
234
  down (maintenance). Conclude or save before the deadline
235
- (`skill/summer-world-saves`).
235
+ (`summer-world-saves`).
236
236
 
237
237
  A match that never concludes holds its players until the World is stopped;
238
238
  every match needs an ending, including "everyone else left".
@@ -240,7 +240,7 @@ every match needs an ending, including "everyone else left".
240
240
  ### 5. Test it with Local Play
241
241
 
242
242
  ```
243
- summer_project_setting name="summer/local_play/players" value=2
243
+ summer_project_setting key="summer/local_play/players" value=2
244
244
  summer_play
245
245
  summer_get_diagnostics
246
246
  summer_stop
@@ -280,7 +280,7 @@ clients stay connected until they leave.
280
280
 
281
281
  ## See also
282
282
 
283
- - `skill/summer-matchmaking` — queues and teams that the outcome refers to
284
- - `skill/summer-leaderboards` — ratings and `authority_v1` rating moves
285
- - `skill/summer-world-saves` — persistent Worlds that outlive a match
286
- - `skill/multiplayer-testing` — running bots through a whole match
283
+ - `summer-matchmaking` — queues and teams that the outcome refers to
284
+ - `summer-leaderboards` — ratings and `authority_v1` rating moves
285
+ - `summer-world-saves` — persistent Worlds that outlive a match
286
+ - `multiplayer-testing` — running bots through a whole match