summer-engine 3.3.0 → 3.4.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.
Files changed (293) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +4 -2
  3. package/.codex-plugin/plugin.json +5 -3
  4. package/.cursor-plugin/plugin.json +4 -2
  5. package/.factory-plugin/plugin.json +4 -2
  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 +50 -0
  10. package/GEMINI.md +1 -1
  11. package/NOTICE +1 -1
  12. package/README.md +32 -35
  13. package/assets/api-docs.json.gz +0 -0
  14. package/assets/autopilot/run.sh +2 -2
  15. package/assets/navigation/web-routes.json +1 -1
  16. package/commands/gameskill.md +2 -2
  17. package/commands/summer.md +25 -25
  18. package/dist/cli/commands/install.d.ts +10 -0
  19. package/dist/cli/commands/install.js +55 -10
  20. package/dist/cli/commands/open.d.ts +1 -1
  21. package/dist/cli/commands/run.d.ts +1 -1
  22. package/dist/cli/commands/run.js +1 -1
  23. package/dist/cli/commands/skills.js +2 -2
  24. package/dist/cli/commands/tool.d.ts +7 -0
  25. package/dist/cli/commands/tool.js +36 -1
  26. package/dist/core/api-client.d.ts +5 -6
  27. package/dist/core/api-client.js +12 -15
  28. package/dist/core/auth.js +2 -2
  29. package/dist/core/capabilities/asset-import.d.ts +0 -1
  30. package/dist/core/capabilities/camera-view.d.ts +1 -1
  31. package/dist/core/capabilities/camera-view.js +2 -2
  32. package/dist/core/capabilities/capture-gameplay.d.ts +69 -0
  33. package/dist/core/capabilities/capture-gameplay.js +283 -0
  34. package/dist/core/capabilities/connect-signal.d.ts +1 -2
  35. package/dist/core/capabilities/connect-signal.js +1 -2
  36. package/dist/core/capabilities/console-read.d.ts +2 -2
  37. package/dist/core/capabilities/console-read.js +2 -2
  38. package/dist/core/capabilities/creator.js +1 -1
  39. package/dist/core/capabilities/doctor.d.ts +9 -1
  40. package/dist/core/capabilities/doctor.js +47 -4
  41. package/dist/core/capabilities/engine-receipt.d.ts +5 -7
  42. package/dist/core/capabilities/engine-receipt.js +7 -9
  43. package/dist/core/capabilities/engine-run.d.ts +4 -0
  44. package/dist/core/capabilities/engine-run.js +33 -5
  45. package/dist/core/capabilities/export-engine-version.d.ts +15 -0
  46. package/dist/core/capabilities/export-engine-version.js +24 -0
  47. package/dist/core/capabilities/export-game.d.ts +9 -1
  48. package/dist/core/capabilities/export-game.js +115 -39
  49. package/dist/core/capabilities/export-presets.d.ts +1 -1
  50. package/dist/core/capabilities/export-presets.js +1 -1
  51. package/dist/core/capabilities/fabricate-mesh.d.ts +2 -3
  52. package/dist/core/capabilities/fabricate-mesh.js +2 -3
  53. package/dist/core/capabilities/frame-quality.d.ts +4 -4
  54. package/dist/core/capabilities/frame-quality.js +4 -4
  55. package/dist/core/capabilities/grep.d.ts +1 -1
  56. package/dist/core/capabilities/grep.js +1 -1
  57. package/dist/core/capabilities/image-generation.d.ts +9 -0
  58. package/dist/core/capabilities/image-generation.js +19 -1
  59. package/dist/core/capabilities/navigation/open.d.ts +1 -1
  60. package/dist/core/capabilities/navigation/open.js +1 -1
  61. package/dist/core/capabilities/navigation/render-product-map.js +1 -1
  62. package/dist/core/capabilities/navigation/targets.js +2 -2
  63. package/dist/core/capabilities/placement-batch.d.ts +1 -1
  64. package/dist/core/capabilities/placement-batch.js +2 -2
  65. package/dist/core/capabilities/play-determinism.d.ts +1 -1
  66. package/dist/core/capabilities/play-determinism.js +1 -1
  67. package/dist/core/capabilities/publish-build.d.ts +15 -2
  68. package/dist/core/capabilities/publish-build.js +78 -28
  69. package/dist/core/capabilities/publish-download.d.ts +1 -2
  70. package/dist/core/capabilities/publish-download.js +2 -3
  71. package/dist/core/capabilities/replace-node.d.ts +1 -3
  72. package/dist/core/capabilities/replace-node.js +1 -3
  73. package/dist/core/capabilities/runtime-control.d.ts +5 -7
  74. package/dist/core/capabilities/runtime-control.js +7 -9
  75. package/dist/core/capabilities/scene-batch.d.ts +1 -1
  76. package/dist/core/capabilities/scene-batch.js +1 -1
  77. package/dist/core/capabilities/scene-kind.js +1 -1
  78. package/dist/core/capabilities/scene-readback.d.ts +3 -4
  79. package/dist/core/capabilities/scene-readback.js +3 -4
  80. package/dist/core/capabilities/scene-script.d.ts +2 -2
  81. package/dist/core/capabilities/scene-script.js +2 -2
  82. package/dist/core/capabilities/seeing/shot-store.d.ts +1 -1
  83. package/dist/core/capabilities/seeing/shot-store.js +1 -1
  84. package/dist/core/capabilities/summer-bundle.d.ts +2 -3
  85. package/dist/core/capabilities/summer-bundle.js +2 -3
  86. package/dist/core/capabilities/surface-snap.d.ts +1 -1
  87. package/dist/core/capabilities/surface-snap.js +1 -1
  88. package/dist/core/capabilities/tool-dispatch.js +11 -1
  89. package/dist/core/capabilities/ui-control.d.ts +1 -2
  90. package/dist/core/capabilities/ui-control.js +1 -2
  91. package/dist/core/capabilities/world-snapshot.d.ts +1 -1
  92. package/dist/core/capabilities/world-snapshot.js +1 -1
  93. package/dist/core/capability-skew.d.ts +2 -3
  94. package/dist/core/capability-skew.js +4 -5
  95. package/dist/core/config.js +2 -2
  96. package/dist/core/engine-install.d.ts +16 -0
  97. package/dist/core/engine-install.js +32 -2
  98. package/dist/core/feedback/client.js +1 -1
  99. package/dist/core/hosted-mcp.d.ts +115 -0
  100. package/dist/core/hosted-mcp.js +164 -0
  101. package/dist/core/launch-posture.d.ts +6 -3
  102. package/dist/core/launch-posture.js +18 -5
  103. package/dist/core/library-read.js +1 -2
  104. package/dist/core/templates.d.ts +1 -2
  105. package/dist/core/templates.js +1 -2
  106. package/dist/mcp/hosted-mount.d.ts +13 -59
  107. package/dist/mcp/hosted-mount.js +24 -30
  108. package/dist/mcp/server.d.ts +2 -2
  109. package/dist/mcp/server.js +5 -4
  110. package/dist/mcp/tools/creator-tools.js +14 -4
  111. package/dist/mcp/tools/debug-tools.js +1 -1
  112. package/dist/mcp/tools/generate-tools.js +19 -9
  113. package/dist/mcp/tools/navigation-tools.d.ts +1 -1
  114. package/dist/mcp/tools/navigation-tools.js +1 -1
  115. package/dist/mcp/tools/spatial-tools.js +1 -1
  116. package/dist/mcp/tools/visual-tools.js +2 -2
  117. package/dist/mcp/tools/with-engine.d.ts +1 -2
  118. package/dist/mcp/tools/with-engine.js +1 -2
  119. package/gemini-extension.json +3 -1
  120. package/hooks/session-start.sh +2 -2
  121. package/integrations/README.md +70 -76
  122. package/integrations/claude/README.md +0 -3
  123. package/integrations/codex/README.md +1 -2
  124. package/integrations/copilot-jetbrains/README.md +1 -1
  125. package/integrations/cursor/README.md +1 -2
  126. package/integrations/factory/README.md +15 -11
  127. package/integrations/mistral-vibe/README.md +1 -1
  128. package/integrations/opencode/README.md +1 -1
  129. package/integrations/roo-code/README.md +1 -1
  130. package/integrations/rovo-dev/README.md +1 -1
  131. package/integrations/trae/README.md +1 -1
  132. package/integrations/windsurf/README.md +3 -3
  133. package/library/references/collaborative-protocol/collaborative-protocol.md +5 -5
  134. package/library/references/gd-style/gd-style.md +4 -6
  135. package/library/references/godot-version/godot-version.md +3 -3
  136. package/library/references/headless-routing/headless-routing.md +2 -2
  137. package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +2 -2
  138. package/library/references/mcp-tools-reference/mcp-tools-reference.md +18 -16
  139. package/library/references/product-map/product-map.md +1 -1
  140. package/library/references/public-surface-language/public-surface-language.md +1 -1
  141. package/library/references/summer-folder/summer-folder.md +1 -1
  142. package/library/skills/3d-lighting/SKILL.md +4 -4
  143. package/library/skills/README.md +11 -9
  144. package/library/skills/adaptive-music/SKILL.md +7 -7
  145. package/library/skills/ai-characters-in-games/SKILL.md +1 -1
  146. package/library/skills/ambient-bed/SKILL.md +12 -14
  147. package/library/skills/animated-loop/SKILL.md +42 -42
  148. package/library/skills/animation-tree/SKILL.md +6 -6
  149. package/library/skills/art-direction/SKILL.md +8 -11
  150. package/library/skills/asset-strategy/SKILL.md +3 -3
  151. package/library/skills/audio-direction/SKILL.md +8 -10
  152. package/library/skills/auto-fire-targeting/SKILL.md +4 -3
  153. package/library/skills/bounded-engine-runs/SKILL.md +95 -0
  154. package/library/skills/bounded-engine-runs/resource.yaml +29 -0
  155. package/library/skills/brainstorm-game/SKILL.md +5 -5
  156. package/library/skills/brainstorming/SKILL.md +9 -15
  157. package/library/skills/celeste-momentum-platforming/SKILL.md +8 -13
  158. package/library/skills/celeste-momentum-platforming/resource.yaml +1 -1
  159. package/library/skills/character-animation-wiring/SKILL.md +2 -2
  160. package/library/skills/character-model/SKILL.md +15 -26
  161. package/library/skills/character-movement/SKILL.md +1 -1
  162. package/library/skills/character-movement/references/movement-3d.md +1 -1
  163. package/library/skills/character-portrait/SKILL.md +4 -4
  164. package/library/skills/cinematic-cutscene/SKILL.md +38 -38
  165. package/library/skills/combat-basics/SKILL.md +1 -1
  166. package/library/skills/compatibility-renderer-traps/SKILL.md +78 -0
  167. package/library/skills/compatibility-renderer-traps/resource.yaml +28 -0
  168. package/library/skills/concept-art/SKILL.md +4 -4
  169. package/library/skills/create-asset-sheet/SKILL.md +12 -31
  170. package/library/skills/debug/SKILL.md +5 -4
  171. package/library/skills/debugging-game-feel/SKILL.md +1 -4
  172. package/library/skills/debugging-game-feel/resource.yaml +1 -1
  173. package/library/skills/design-level/SKILL.md +5 -5
  174. package/library/skills/design-mechanic/SKILL.md +6 -6
  175. package/library/skills/design-npc/SKILL.md +8 -15
  176. package/library/skills/diagnosing-perf-regressions/SKILL.md +5 -10
  177. package/library/skills/dispatching-parallel-agents/SKILL.md +1 -19
  178. package/library/skills/environment-kit/SKILL.md +5 -5
  179. package/library/skills/export-and-ship/SKILL.md +25 -24
  180. package/library/skills/fabricating-assets/SKILL.md +1 -1
  181. package/library/skills/facial-and-lipsync/SKILL.md +5 -5
  182. package/library/skills/fps-controller/SKILL.md +17 -16
  183. package/library/skills/fps-controller/resource.yaml +0 -2
  184. package/library/skills/game-feel/SKILL.md +6 -7
  185. package/library/skills/gameskill/SKILL.md +3 -3
  186. package/library/skills/gdscript-patterns/SKILL.md +3 -3
  187. package/library/skills/generate-motion/SKILL.md +5 -22
  188. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +72 -90
  189. package/library/skills/godogen-visual-proof-game-generation/resource.yaml +0 -1
  190. package/library/skills/headless-scripting/SKILL.md +8 -8
  191. package/library/skills/headless-scripting/resource.yaml +1 -0
  192. package/library/skills/in-game-purchases/SKILL.md +123 -118
  193. package/library/skills/in-game-purchases/resource.yaml +2 -2
  194. package/library/skills/instantiate-asset-pack/SKILL.md +7 -3
  195. package/library/skills/investigating-bugs/SKILL.md +3 -11
  196. package/library/skills/investigating-bugs/condition-based-waiting.md +0 -10
  197. package/library/skills/investigating-bugs/root-cause-tracing.md +0 -8
  198. package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +15 -15
  199. package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +0 -1
  200. package/library/skills/make-game/SKILL.md +3 -5
  201. package/library/skills/make-game/references/2d-platformer.md +1 -1
  202. package/library/skills/multiplayer-project/SKILL.md +1 -1
  203. package/library/skills/multiplayer-testing/SKILL.md +4 -4
  204. package/library/skills/music-track/SKILL.md +40 -38
  205. package/library/skills/new-project/SKILL.md +4 -6
  206. package/library/skills/organic-model/SKILL.md +9 -9
  207. package/library/skills/pixel-art/SKILL.md +6 -6
  208. package/library/skills/play/SKILL.md +3 -4
  209. package/library/skills/playtesting-a-feature/SKILL.md +4 -6
  210. package/library/skills/procedural-animation/SKILL.md +10 -11
  211. package/library/skills/prop-model/SKILL.md +4 -4
  212. package/library/skills/psx-retro-rendering/SKILL.md +20 -20
  213. package/library/skills/psx-retro-rendering/resource.yaml +2 -3
  214. package/library/skills/realtime-wet-surfaces/SKILL.md +15 -15
  215. package/library/skills/realtime-wet-surfaces/resource.yaml +1 -2
  216. package/library/skills/remote-deploy/SKILL.md +20 -21
  217. package/library/skills/retarget/SKILL.md +19 -23
  218. package/library/skills/running-in-the-cloud/SKILL.md +5 -5
  219. package/library/skills/scene-composition/SKILL.md +5 -5
  220. package/library/skills/scene-hierarchy-design/SKILL.md +3 -3
  221. package/library/skills/scene-hierarchy-design/resource.yaml +0 -1
  222. package/library/skills/scene-scripting/SKILL.md +3 -3
  223. package/library/skills/scene-to-level/SKILL.md +28 -31
  224. package/library/skills/skill-create/SKILL.md +1 -1
  225. package/library/skills/skill-improve/SKILL.md +9 -9
  226. package/library/skills/skill-test/SKILL.md +10 -10
  227. package/library/skills/skintokens-auto-rigging/SKILL.md +18 -18
  228. package/library/skills/skintokens-auto-rigging/resource.yaml +3 -3
  229. package/library/skills/skybox-panorama/SKILL.md +8 -9
  230. package/library/skills/sound-effect/SKILL.md +19 -19
  231. package/library/skills/spatial-placement/SKILL.md +2 -2
  232. package/library/skills/spatial-placement/references/kit-placement-tools.md +12 -22
  233. package/library/skills/sprite-sheet/SKILL.md +10 -10
  234. package/library/skills/summer-analytics/SKILL.md +3 -3
  235. package/library/skills/summer-friends/SKILL.md +10 -10
  236. package/library/skills/summer-leaderboards/SKILL.md +6 -6
  237. package/library/skills/summer-match-results/SKILL.md +13 -13
  238. package/library/skills/summer-matchmaking/SKILL.md +11 -11
  239. package/library/skills/summer-parties/SKILL.md +9 -9
  240. package/library/skills/summer-player-data/SKILL.md +12 -12
  241. package/library/skills/summer-store/SKILL.md +6 -6
  242. package/library/skills/summer-world-chat/SKILL.md +9 -9
  243. package/library/skills/summer-world-saves/SKILL.md +7 -7
  244. package/library/skills/text-to-motion/rigging-for-text-motion.md +1 -1
  245. package/library/skills/tileable-texture/SKILL.md +1 -1
  246. package/library/skills/trailer-shot/SKILL.md +36 -36
  247. package/library/skills/tune-performance/SKILL.md +13 -13
  248. package/library/skills/tune-performance/resource.yaml +1 -1
  249. package/library/skills/ui-graphics/SKILL.md +7 -7
  250. package/library/skills/use-widget-asset/SKILL.md +7 -7
  251. package/library/skills/using-summer/SKILL.md +5 -7
  252. package/library/skills/vehicle-model/SKILL.md +6 -7
  253. package/library/skills/vehicle-model/resource.yaml +2 -2
  254. package/library/skills/verification-before-completion/SKILL.md +5 -6
  255. package/library/skills/vfx-dissolve/SKILL.md +4 -4
  256. package/library/skills/vfx-fire/SKILL.md +6 -6
  257. package/library/skills/vfx-fire/_building-blocks/additive-billboard-particles.md +3 -3
  258. package/library/skills/vfx-hit-spark/SKILL.md +4 -4
  259. package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +3 -3
  260. package/library/skills/vfx-lightning/SKILL.md +5 -5
  261. package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +3 -3
  262. package/library/skills/vfx-lightning/_building-blocks/trauma-shake-snippet.md +9 -3
  263. package/library/skills/vfx-magic-glow/SKILL.md +4 -4
  264. package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +3 -3
  265. package/library/skills/vfx-muzzle-flash/SKILL.md +5 -5
  266. package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +3 -3
  267. package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +9 -3
  268. package/library/skills/vfx-smoke/SKILL.md +5 -5
  269. package/library/skills/vfx-water-ripple/SKILL.md +2 -2
  270. package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +3 -3
  271. package/library/skills/voice-line/SKILL.md +9 -9
  272. package/library/skills/web-compatibility-look/resource.yaml +1 -0
  273. package/library/skills/world-building-3d/references/spatial-tools.md +2 -2
  274. package/library/skills/writing-plans/SKILL.md +4 -4
  275. package/library/skills/writing-skills/SKILL.md +8 -8
  276. package/library/tools/capture-gameplay/resource.yaml +73 -0
  277. package/library/tools/creator-publish/resource.yaml +4 -4
  278. package/library/tools/creator-releases/resource.yaml +5 -5
  279. package/library/tools/generate-image/resource.yaml +15 -1
  280. package/library/tools/publish-build/resource.yaml +6 -2
  281. package/package.json +1 -1
  282. package/registry/generated/aliases.json +1 -0
  283. package/registry/generated/counts.json +3 -3
  284. package/registry/generated/gemini-extension.json +3 -1
  285. package/registry/generated/index.json +248 -135
  286. package/registry/generated/marketplace.claude.json +2 -2
  287. package/registry/generated/plugin.claude.json +4 -2
  288. package/registry/generated/plugin.codex.json +5 -3
  289. package/registry/generated/plugin.cursor.json +4 -2
  290. package/registry/generated/plugin.factory.json +4 -2
  291. package/registry/generated/skills-index.md +11 -9
  292. package/registry/generated/skills-registry.json +33 -6
  293. package/registry/schemas/domains.json +1 -1
@@ -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
 
@@ -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
@@ -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
@@ -20,7 +20,7 @@ groups searching players, reserves a server for them, and every player's
20
20
  The authority then reads each player's team from the verified Session.
21
21
 
22
22
  There is no lobby object, invite code or server browser. Friends who want to
23
- play together use a party (`skill/summer-parties`), which enters a queue as one group.
23
+ play together use a party (`summer-parties`), which enters a queue as one group.
24
24
 
25
25
  Where it works:
26
26
 
@@ -31,8 +31,8 @@ Where it works:
31
31
  | Accept/Decline prompt | No: no proposal happens | Yes, when the queue declares `acceptance` |
32
32
  | Rating-based grouping | No | Yes |
33
33
 
34
- This skill extends the Courtyard game from `skill/multiplayer-project` and
35
- `skill/multiplayer-state`. Its client already joins `Game.QUEUE` and sends a
34
+ This skill extends the Courtyard game from `multiplayer-project` and
35
+ `multiplayer-state`. Its client already joins `Game.QUEUE` and sends a
36
36
  `join` Command; its authority publishes `match_doc`.
37
37
 
38
38
  ## Steps
@@ -64,7 +64,7 @@ The fields Summer accepts, and their rules:
64
64
  | `minPlayers` / `maxPlayers` | Players per match | `minPlayers` ≥ 1, `maxPlayers` ≥ `minPlayers`. Measured support is up to 16 per match |
65
65
  | `worldDefinition` | The WorldDefinition's `definition_id` | Required; every WorldDefinition must be used by a queue |
66
66
  | `policy` | `fifo` (first come) or `rating` (group by skill) | `rating` needs `ratingSystemRef`; `fifo` must not declare one |
67
- | `ratingSystemRef` | `elo_v1` (Summer rates two sides) or `authority_v1` (your authority reports rating moves) | See `skill/summer-leaderboards` |
67
+ | `ratingSystemRef` | `elo_v1` (Summer rates two sides) or `authority_v1` (your authority reports rating moves) | See `summer-leaderboards` |
68
68
  | `teams` | `{count, size}`: fixed sides, such as 2v2 = `{2, 2}` | `count` 2..64, `size` 1..16, `minPlayers` = `maxPlayers` = count × size; `elo_v1` needs exactly 2 teams |
69
69
  | `acceptance` | `{"mode": "all", "ttl": "20s"}` asks every player to accept; `{"mode": "none"}` skips it | `ttl` required with `all`, forbidden with `none` |
70
70
  | `searchTtl` | `{min, default, max}` search lifetime | Go durations (`30s`, `2m`); min ≤ default ≤ max |
@@ -249,8 +249,8 @@ one you name. In the editor and with `summer_play`, name it with the
249
249
  `summer/local_play/queue` project setting:
250
250
 
251
251
  ```
252
- summer_project_setting name="summer/local_play/queue" value="duel"
253
- summer_project_setting name="summer/local_play/players" value=2
252
+ summer_project_setting key="summer/local_play/queue" value="duel"
253
+ summer_project_setting key="summer/local_play/players" value=2
254
254
  summer_play
255
255
  summer_get_diagnostics
256
256
  summer_stop
@@ -294,8 +294,8 @@ Test the accept prompt and rating-based grouping on a hosted staging build.
294
294
 
295
295
  ## See also
296
296
 
297
- - `skill/multiplayer` — how Summer multiplayer fits together
298
- - `skill/summer-match-results` — ending a match and reporting who won
299
- - `skill/summer-leaderboards` — ratings and leaderboards for rated queues
300
- - `skill/summer-parties` — friends entering a queue together
301
- - `skill/multiplayer-testing` — Local Play options and bots
297
+ - `multiplayer` — how Summer multiplayer fits together
298
+ - `summer-match-results` — ending a match and reporting who won
299
+ - `summer-leaderboards` — ratings and leaderboards for rated queues
300
+ - `summer-parties` — friends entering a queue together
301
+ - `multiplayer-testing` — Local Play options and bots
@@ -39,7 +39,7 @@ Outside a party, or when parties are unavailable, getters are empty and
39
39
  `is_in_party()` is `false`. So the same Play button works everywhere: no party
40
40
  means an ordinary `SummerJoinTarget.queue(...)` join. Build that path first.
41
41
 
42
- This skill extends the Courtyard game from `skill/multiplayer-project`
42
+ This skill extends the Courtyard game from `multiplayer-project`
43
43
  (`network/game.gd` as `Game`, `client/main.gd` with `command()`).
44
44
 
45
45
  ## Steps
@@ -48,7 +48,7 @@ This skill extends the Courtyard game from `skill/multiplayer-project`
48
48
 
49
49
  A party member must not join on their own the moment the game starts. Move the
50
50
  join out of `client/main.gd`'s `_ready` into `enter(target)`, and keep every
51
- signal connection from `skill/multiplayer-movement` and `skill/multiplayer-state`:
51
+ signal connection from `multiplayer-movement` and `multiplayer-state`:
52
52
 
53
53
  ```gdscript
54
54
  func _ready() -> void:
@@ -87,7 +87,7 @@ func enter(target: SummerJoinTarget) -> bool:
87
87
  return true
88
88
  ```
89
89
 
90
- Move the Local Play bot hook from `skill/multiplayer-testing` into `enter()`,
90
+ Move the Local Play bot hook from `multiplayer-testing` into `enter()`,
91
91
  after the joined line.
92
92
 
93
93
  ### 2. Add the party node
@@ -193,7 +193,7 @@ fails with retryable `party_version_conflict`. React to `data_changed(key)` and
193
193
  `member_data_changed(member, key)`, or just re-render on `changed`.
194
194
 
195
195
  Party data is a lobby convenience, not game state. Once the match starts, the
196
- authority owns everything (`skill/multiplayer-state`). It never sees party data;
196
+ authority owns everything (`multiplayer-state`). It never sees party data;
197
197
  send choices that matter in your `join` Command and validate them there.
198
198
 
199
199
  ### 4. Handle join failures
@@ -217,7 +217,7 @@ client joins solo from `_ready`. Test that path locally, then the party path
217
217
  on Summer staging with real accounts.
218
218
 
219
219
  ```
220
- summer_project_setting name="summer/local_play/players" value=2
220
+ summer_project_setting key="summer/local_play/players" value=2
221
221
  summer_play
222
222
  summer_get_diagnostics
223
223
  summer_stop
@@ -247,7 +247,7 @@ summer_stop
247
247
 
248
248
  ## See also
249
249
 
250
- - `skill/summer-matchmaking`: queues, sizes, teams and the accept prompt
251
- - `skill/summer-friends`: friends list, profiles and messages
252
- - `skill/multiplayer-project`: the client entry scene this extends
253
- - `skill/multiplayer-testing`: Local Play, and what needs staging
250
+ - `summer-matchmaking`: queues, sizes, teams and the accept prompt
251
+ - `summer-friends`: friends list, profiles and messages
252
+ - `multiplayer-project`: the client entry scene this extends
253
+ - `multiplayer-testing`: Local Play, and what needs staging
@@ -39,8 +39,8 @@ Local Play's store keeps the latest value plus five earlier revisions, with
39
39
  the same validation and `save_id` rules as hosted. Delete a persona's folder
40
40
  to start that player fresh. Only hosted play proves durability.
41
41
 
42
- This skill extends the game from `skill/multiplayer-project` and
43
- `skill/multiplayer-state`: the authority's `_join` Command handler, the
42
+ This skill extends the game from `multiplayer-project` and
43
+ `multiplayer-state`: the authority's `_join` Command handler, the
44
44
  private `mine` State group, and the `wallets` it keeps.
45
45
 
46
46
  ## Steps
@@ -70,7 +70,7 @@ var profiles := {}
70
70
  ```
71
71
 
72
72
  In `_ready()`, next to the other `world` signals, before `Summer.initialize`
73
- (connect `session_joined` only once if `skill/summer-match-results` already
73
+ (connect `session_joined` only once if `summer-match-results` already
74
74
  did):
75
75
 
76
76
  ```gdscript
@@ -83,7 +83,7 @@ did):
83
83
  autosave.start()
84
84
  ```
85
85
 
86
- If `_on_session_joined` already exists (`skill/summer-match-results` adds
86
+ If `_on_session_joined` already exists (`summer-match-results` adds
87
87
  one), put this body at its end instead of defining it twice.
88
88
 
89
89
  ```gdscript
@@ -254,7 +254,7 @@ func _show_saved_progress() -> void:
254
254
 
255
255
  ### 6. Keep the publish checks passing
256
256
 
257
- The source-graph check in `skill/multiplayer-publish` (step 4b) flags every
257
+ The source-graph check in `multiplayer-publish` (step 4b) flags every
258
258
  call ending in `load(` without a string literal inside, so
259
259
  `Summer.authority.player_data.load(session)` and
260
260
  `Summer.client.player_data.load()` report
@@ -274,7 +274,7 @@ Run the same session twice. Local Play personas (`player-1`, `player-2`)
274
274
  keep their files between runs, so run 2 must start where run 1 ended.
275
275
 
276
276
  ```
277
- summer_project_setting name="summer/local_play/players" value=2
277
+ summer_project_setting key="summer/local_play/players" value=2
278
278
  summer_play
279
279
  summer_get_diagnostics
280
280
  summer_stop
@@ -284,7 +284,7 @@ summer_stop
284
284
  ```
285
285
 
286
286
  From a terminal: `<summer> --path . --summer-local-play 2 --summer-local-play-headless --summer-local-play-timeout 20 -- --bot={client}`,
287
- twice (see `skill/multiplayer-testing` for bot mode). Print markers such as
287
+ twice (see `multiplayer-testing` for bot mode). Print markers such as
288
288
  `print("PROFILE_LOADED coins=", ...)` and `print("SAVED ", save_id, " revision=", commit.revision)` while testing, then check them.
289
289
 
290
290
  Files: `~/Library/Application Support/Godot/app_userdata/<project name>/summer_local_player_data/<game id>/<persona>/public.json`
@@ -311,12 +311,12 @@ folder to start over.
311
311
  | Start a second commit while one is pending | One commit per player and slot at a time | The second fails with `operation_in_progress` |
312
312
  | Keep retrying after `player_data_superseded` | Stop saving through that Session | A newer World owns the player now |
313
313
  | Store `Vector3`, `Color` or `null` | Plain JSON: numbers, strings, arrays, dictionaries | Unsupported types fail with `player_data_unsupported_type` |
314
- | Save the match (positions, round score) | Save only what outlives the match | The World ends; `skill/summer-world-saves` covers Worlds that persist |
314
+ | Save the match (positions, round score) | Save only what outlives the match | The World ends; `summer-world-saves` covers Worlds that persist |
315
315
  | Truncate data that grew past 64 KiB | Refuse to grow; test the maximum size | `player_data_too_large` rejects the whole commit |
316
316
 
317
317
  ## See also
318
318
 
319
- - `skill/multiplayer-state` — the wallet and private State group this skill saves
320
- - `skill/summer-world-saves` — saving a whole persistent World instead of one player
321
- - `skill/multiplayer-testing` — bots and repeated Local Play runs
322
- - `skill/summer-leaderboards` — scores other players can see
319
+ - `multiplayer-state` — the wallet and private State group this skill saves
320
+ - `summer-world-saves` — saving a whole persistent World instead of one player
321
+ - `multiplayer-testing` — bots and repeated Local Play runs
322
+ - `summer-leaderboards` — scores other players can see
@@ -45,8 +45,8 @@ proves nothing.
45
45
  Items and offers are created in your game's Studio pages (`summer_open` target
46
46
  `game`). Code never creates items.
47
47
 
48
- This skill extends the Courtyard game from `skill/multiplayer-project` and
49
- `skill/multiplayer-state`.
48
+ This skill extends the Courtyard game from `multiplayer-project` and
49
+ `multiplayer-state`.
50
50
 
51
51
  ## Steps
52
52
 
@@ -265,7 +265,7 @@ Walk through every outcome:
265
265
 
266
266
  ## See also
267
267
 
268
- - `skill/multiplayer-state`: Commands and the match document used for equipped items
269
- - `skill/multiplayer-testing`: Local Play fixtures and personas
270
- - `skill/summer-player-data`: saving a player's loadout between matches
271
- - `skill/summer-analytics`: measuring the shop
268
+ - `multiplayer-state`: Commands and the match document used for equipped items
269
+ - `multiplayer-testing`: Local Play fixtures and personas
270
+ - `summer-player-data`: saving a player's loadout between matches
271
+ - `summer-analytics`: measuring the shop
@@ -32,7 +32,7 @@ composition, and the authority neither sees nor writes them.
32
32
  | Channel keys | 1–64 of `A-Z a-z 0-9 _ . -`, starting with a letter or digit; at most 64 channels per World |
33
33
  | History | Best effort, not a full log. A new handle shows the newest 2 messages; `load_older()` grows the window to at most 16 |
34
34
  | Lifetime | A handle belongs to one World admission. After leaving or joining another World, open a new one |
35
- | Not included | Direct messages (`skill/summer-friends`), party chat (the Summer app) and messages written by your server |
35
+ | Not included | Direct messages (`summer-friends`), party chat (the Summer app) and messages written by your server |
36
36
 
37
37
  **Hosted only.** Chat needs a joined hosted World and a Summer app whose Player
38
38
  Host offers `player.channels`. A queue reservation is not enough: open the
@@ -40,8 +40,8 @@ channel after `enter()` succeeds. In Local Play and editor runs,
40
40
  `check_open_readiness()` and `open_world_channel()` fail with `unavailable`.
41
41
  Build the "chat hidden" path first.
42
42
 
43
- This skill extends the Courtyard game from `skill/multiplayer-project` and
44
- `skill/multiplayer-state`.
43
+ This skill extends the Courtyard game from `multiplayer-project` and
44
+ `multiplayer-state`.
45
45
 
46
46
  ## Steps
47
47
 
@@ -49,7 +49,7 @@ This skill extends the Courtyard game from `skill/multiplayer-project` and
49
49
 
50
50
  Messages carry the author's Summer user id (`player_id`), not a name. The
51
51
  authority already knows every verified name. Publish them in the shared match
52
- document (`skill/multiplayer-state`): in `authority/main.gd`'s `_join`, before
52
+ document (`multiplayer-state`): in `authority/main.gd`'s `_join`, before
53
53
  accepting, add
54
54
 
55
55
  ```gdscript
@@ -158,7 +158,7 @@ Call `$Chat.open()` after `enter()` returns `true`. Wire it into the UI:
158
158
  Locally, check that the hidden path works and nothing errors:
159
159
 
160
160
  ```
161
- summer_project_setting name="summer/local_play/players" value=2
161
+ summer_project_setting key="summer/local_play/players" value=2
162
162
  summer_play
163
163
  summer_get_diagnostics
164
164
  summer_stop
@@ -189,7 +189,7 @@ Then test real chat on Summer staging with two accounts in one match.
189
189
 
190
190
  ## See also
191
191
 
192
- - `skill/multiplayer-state`: the match document that carries player names
193
- - `skill/summer-friends`: direct messages with friends
194
- - `skill/summer-parties`: party chat lives in the Summer app
195
- - `skill/multiplayer-testing`: what Local Play can and can't test
192
+ - `multiplayer-state`: the match document that carries player names
193
+ - `summer-friends`: direct messages with friends
194
+ - `summer-parties`: party chat lives in the Summer app
195
+ - `multiplayer-testing`: what Local Play can and can't test