summer-engine 3.0.0 → 3.2.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 (413) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +27 -5
  3. package/.codex-plugin/plugin.json +28 -6
  4. package/.cursor-plugin/plugin.json +27 -5
  5. package/.factory-plugin/plugin.json +27 -5
  6. package/.opencode/plugins/summer.js +1 -1
  7. package/CHANGELOG.md +120 -0
  8. package/README.md +22 -7
  9. package/assets/audit/scene_audit.gd +4136 -0
  10. package/assets/seeing/seeing_probe.gd +1873 -0
  11. package/dist/cli/commands/setup.js +6 -19
  12. package/dist/cli/commands/skills.js +57 -32
  13. package/dist/core/api-client.d.ts +9 -1
  14. package/dist/core/api-client.js +21 -4
  15. package/dist/core/capabilities/agent-playbook.js +46 -0
  16. package/dist/core/capabilities/audit/accept.d.ts +55 -0
  17. package/dist/core/capabilities/audit/accept.js +147 -0
  18. package/dist/core/capabilities/audit/args.d.ts +95 -0
  19. package/dist/core/capabilities/audit/args.js +89 -0
  20. package/dist/core/capabilities/audit/audit.d.ts +56 -0
  21. package/dist/core/capabilities/audit/audit.js +287 -0
  22. package/dist/core/capabilities/audit/frame.d.ts +14 -0
  23. package/dist/core/capabilities/audit/frame.js +35 -0
  24. package/dist/core/capabilities/audit/gaps.d.ts +96 -0
  25. package/dist/core/capabilities/audit/gaps.js +257 -0
  26. package/dist/core/capabilities/audit/judge.d.ts +162 -0
  27. package/dist/core/capabilities/audit/judge.js +1134 -0
  28. package/dist/core/capabilities/audit/math.d.ts +110 -0
  29. package/dist/core/capabilities/audit/math.js +263 -0
  30. package/dist/core/capabilities/audit/summary.d.ts +74 -0
  31. package/dist/core/capabilities/audit/summary.js +212 -0
  32. package/dist/core/capabilities/board.d.ts +31 -0
  33. package/dist/core/capabilities/board.js +43 -0
  34. package/dist/core/capabilities/camera-view.d.ts +4 -2
  35. package/dist/core/capabilities/camera-view.js +6 -3
  36. package/dist/core/capabilities/connect-signal.d.ts +85 -0
  37. package/dist/core/capabilities/connect-signal.js +285 -0
  38. package/dist/core/capabilities/engine-fallbacks.d.ts +5 -0
  39. package/dist/core/capabilities/engine-fallbacks.js +5 -0
  40. package/dist/core/capabilities/engine-ops.d.ts +5 -1
  41. package/dist/core/capabilities/engine-ops.js +0 -3
  42. package/dist/core/capabilities/engine-receipt.d.ts +12 -0
  43. package/dist/core/capabilities/engine-receipt.js +26 -0
  44. package/dist/core/capabilities/file-read.d.ts +64 -0
  45. package/dist/core/capabilities/file-read.js +325 -0
  46. package/dist/core/capabilities/game-task-plan.js +4 -2
  47. package/dist/core/capabilities/grep.d.ts +60 -0
  48. package/dist/core/capabilities/grep.js +190 -0
  49. package/dist/core/capabilities/inspect-node.d.ts +56 -0
  50. package/dist/core/capabilities/inspect-node.js +225 -0
  51. package/dist/core/capabilities/inspect-resource.d.ts +61 -0
  52. package/dist/core/capabilities/inspect-resource.js +376 -0
  53. package/dist/core/capabilities/math3d.d.ts +28 -0
  54. package/dist/core/capabilities/math3d.js +88 -0
  55. package/dist/core/capabilities/motion-generation.d.ts +62 -0
  56. package/dist/core/capabilities/motion-generation.js +138 -0
  57. package/dist/core/capabilities/placement-batch.d.ts +102 -0
  58. package/dist/core/capabilities/placement-batch.js +483 -0
  59. package/dist/core/capabilities/placement-math.d.ts +70 -0
  60. package/dist/core/capabilities/placement-math.js +209 -0
  61. package/dist/core/capabilities/placement-script.d.ts +42 -0
  62. package/dist/core/capabilities/placement-script.js +1096 -0
  63. package/dist/core/capabilities/placement.d.ts +485 -0
  64. package/dist/core/capabilities/placement.js +1731 -0
  65. package/dist/core/capabilities/project-context.d.ts +33 -2
  66. package/dist/core/capabilities/project-context.js +87 -4
  67. package/dist/core/capabilities/replace-node.d.ts +91 -0
  68. package/dist/core/capabilities/replace-node.js +423 -0
  69. package/dist/core/capabilities/runtime-control.d.ts +20 -4
  70. package/dist/core/capabilities/runtime-control.js +67 -2
  71. package/dist/core/capabilities/scene-batch.d.ts +63 -0
  72. package/dist/core/capabilities/scene-batch.js +394 -0
  73. package/dist/core/capabilities/scene-readback.d.ts +36 -0
  74. package/dist/core/capabilities/scene-readback.js +54 -0
  75. package/dist/core/capabilities/seeing/args.d.ts +348 -0
  76. package/dist/core/capabilities/seeing/args.js +178 -0
  77. package/dist/core/capabilities/seeing/candidates.d.ts +127 -0
  78. package/dist/core/capabilities/seeing/candidates.js +282 -0
  79. package/dist/core/capabilities/seeing/math.d.ts +134 -0
  80. package/dist/core/capabilities/seeing/math.js +269 -0
  81. package/dist/core/capabilities/seeing/probe.d.ts +62 -0
  82. package/dist/core/capabilities/seeing/probe.js +188 -0
  83. package/dist/core/capabilities/seeing/scoring.d.ts +235 -0
  84. package/dist/core/capabilities/seeing/scoring.js +639 -0
  85. package/dist/core/capabilities/seeing/seeing.d.ts +233 -0
  86. package/dist/core/capabilities/seeing/seeing.js +1341 -0
  87. package/dist/core/capabilities/seeing/shot-store.d.ts +52 -0
  88. package/dist/core/capabilities/seeing/shot-store.js +204 -0
  89. package/dist/core/capabilities/surface-snap-mesh.d.ts +88 -0
  90. package/dist/core/capabilities/surface-snap-mesh.js +425 -0
  91. package/dist/core/capabilities/surface-snap.d.ts +77 -0
  92. package/dist/core/capabilities/surface-snap.js +461 -0
  93. package/dist/core/capabilities/tool-dispatch.js +231 -72
  94. package/dist/core/capabilities/tscn.d.ts +85 -0
  95. package/dist/core/capabilities/tscn.js +391 -0
  96. package/dist/core/capabilities/world-snapshot.d.ts +58 -0
  97. package/dist/core/capabilities/world-snapshot.js +150 -0
  98. package/dist/core/capability-skew.d.ts +5 -5
  99. package/dist/core/capability-skew.js +14 -6
  100. package/dist/core/headless/worker-engine-client.d.ts +1 -1
  101. package/dist/core/headless/worker-engine-client.js +2 -2
  102. package/dist/core/library-read.d.ts +37 -5
  103. package/dist/core/library-read.js +264 -33
  104. package/dist/core/library-search.d.ts +2 -2
  105. package/dist/core/skills-registry.d.ts +9 -1
  106. package/dist/core/skills-registry.js +25 -2
  107. package/dist/installer/agent-config.d.ts +9 -4
  108. package/dist/installer/agent-config.js +194 -392
  109. package/dist/installer/agent-table.d.ts +119 -0
  110. package/dist/installer/agent-table.js +619 -0
  111. package/dist/installer/setup.js +4 -2
  112. package/dist/installer/skill-locations.d.ts +8 -17
  113. package/dist/installer/skill-locations.js +22 -101
  114. package/dist/installer/version-check.d.ts +5 -1
  115. package/dist/installer/version-check.js +38 -28
  116. package/dist/mcp/server.js +9 -3
  117. package/dist/mcp/tools/asset-tools.js +21 -3
  118. package/dist/mcp/tools/audit-tools.d.ts +23 -0
  119. package/dist/mcp/tools/audit-tools.js +60 -0
  120. package/dist/mcp/tools/debug-tools.js +3 -1
  121. package/dist/mcp/tools/file-tools.js +17 -4
  122. package/dist/mcp/tools/generate-tools.js +74 -66
  123. package/dist/mcp/tools/library-tools.js +2 -0
  124. package/dist/mcp/tools/perception-tools.js +6 -19
  125. package/dist/mcp/tools/placement-tools.d.ts +24 -0
  126. package/dist/mcp/tools/placement-tools.js +91 -0
  127. package/dist/mcp/tools/project-tools.js +18 -15
  128. package/dist/mcp/tools/scene-tools.js +71 -83
  129. package/dist/mcp/tools/seeing-tools.d.ts +24 -0
  130. package/dist/mcp/tools/seeing-tools.js +64 -0
  131. package/dist/mcp/tools/spatial-tools.js +17 -9
  132. package/dist/mcp/tools/visual-tools.js +59 -7
  133. package/gemini-extension.json +26 -4
  134. package/integrations/README.md +48 -19
  135. package/integrations/amp/README.md +12 -0
  136. package/integrations/amp/manifest-target.json +3 -0
  137. package/integrations/antigravity/README.md +12 -0
  138. package/integrations/antigravity/manifest-target.json +3 -0
  139. package/integrations/claude-desktop/README.md +12 -0
  140. package/integrations/claude-desktop/manifest-target.json +3 -0
  141. package/integrations/cline/README.md +8 -9
  142. package/integrations/cline-cli/README.md +12 -0
  143. package/integrations/cline-cli/manifest-target.json +3 -0
  144. package/integrations/copilot-jetbrains/README.md +12 -0
  145. package/integrations/copilot-jetbrains/manifest-target.json +3 -0
  146. package/integrations/crush/README.md +12 -0
  147. package/integrations/crush/manifest-target.json +3 -0
  148. package/integrations/github-copilot/README.md +8 -8
  149. package/integrations/goose/README.md +12 -0
  150. package/integrations/goose/manifest-target.json +3 -0
  151. package/integrations/grok-build/README.md +12 -0
  152. package/integrations/grok-build/manifest-target.json +3 -0
  153. package/integrations/hermes/README.md +12 -0
  154. package/integrations/hermes/manifest-target.json +3 -0
  155. package/integrations/junie/README.md +12 -0
  156. package/integrations/junie/manifest-target.json +3 -0
  157. package/integrations/kilo-code/README.md +6 -10
  158. package/integrations/kimi-code/README.md +12 -0
  159. package/integrations/kimi-code/manifest-target.json +3 -0
  160. package/integrations/kiro/README.md +12 -0
  161. package/integrations/kiro/manifest-target.json +3 -0
  162. package/integrations/lm-studio/README.md +8 -8
  163. package/integrations/mistral-vibe/README.md +12 -0
  164. package/integrations/mistral-vibe/manifest-target.json +3 -0
  165. package/integrations/opencode/README.md +9 -12
  166. package/integrations/qoder/README.md +12 -0
  167. package/integrations/qoder/manifest-target.json +3 -0
  168. package/integrations/qwen-code/README.md +12 -0
  169. package/integrations/qwen-code/manifest-target.json +3 -0
  170. package/integrations/roo-code/README.md +8 -7
  171. package/integrations/rovo-dev/README.md +12 -0
  172. package/integrations/rovo-dev/manifest-target.json +3 -0
  173. package/integrations/trae/README.md +12 -0
  174. package/integrations/trae/manifest-target.json +3 -0
  175. package/integrations/visual-studio/README.md +12 -0
  176. package/integrations/visual-studio/manifest-target.json +3 -0
  177. package/integrations/vscode-copilot/README.md +9 -9
  178. package/integrations/warp/README.md +12 -0
  179. package/integrations/warp/manifest-target.json +3 -0
  180. package/integrations/windsurf/README.md +8 -9
  181. package/integrations/zed/README.md +12 -0
  182. package/integrations/zed/manifest-target.json +3 -0
  183. package/library/references/mcp-tools-reference/mcp-tools-reference.md +59 -15
  184. package/library/references/mcp-tools-reference/resource.yaml +1 -1
  185. package/library/references/summer-folder/resource.yaml +1 -1
  186. package/library/references/summer-folder/summer-folder.md +1 -1
  187. package/library/skills/3d-lighting/SKILL.md +1 -1
  188. package/library/skills/README.md +264 -0
  189. package/library/skills/adaptive-music/SKILL.md +1 -1
  190. package/library/skills/agent-playtesting/SKILL.md +1 -1
  191. package/library/skills/ai-characters-in-games/SKILL.md +220 -0
  192. package/library/skills/ai-characters-in-games/resource.yaml +30 -0
  193. package/library/skills/ambient-bed/SKILL.md +1 -1
  194. package/library/skills/animated-loop/SKILL.md +1 -1
  195. package/library/skills/animation-tree/SKILL.md +1 -1
  196. package/library/skills/art-direction/SKILL.md +1 -1
  197. package/library/skills/asset-strategy/SKILL.md +2 -1
  198. package/library/skills/asset-strategy/resource.yaml +2 -1
  199. package/library/skills/audio-direction/SKILL.md +1 -1
  200. package/library/skills/auto-fire-targeting/SKILL.md +1 -1
  201. package/library/skills/brainstorm-game/SKILL.md +1 -1
  202. package/library/skills/brainstorming/SKILL.md +1 -1
  203. package/library/skills/browse-templates/SKILL.md +3 -3
  204. package/library/skills/browse-templates/resource.yaml +1 -1
  205. package/library/skills/camera-rigs/SKILL.md +128 -0
  206. package/library/skills/camera-rigs/resource.yaml +29 -0
  207. package/library/skills/celeste-momentum-platforming/SKILL.md +1 -1
  208. package/library/skills/character-animation-wiring/SKILL.md +1 -1
  209. package/library/skills/character-model/SKILL.md +1 -1
  210. package/library/skills/character-movement/SKILL.md +326 -0
  211. package/library/skills/character-movement/references/default-third-person-controller.gd +201 -0
  212. package/library/skills/character-movement/references/default-third-person-verification-probe.gd +154 -0
  213. package/library/skills/character-movement/references/movement-3d.md +136 -0
  214. package/library/skills/character-movement/references/platformer-feel.md +83 -0
  215. package/library/skills/character-movement/resource.yaml +40 -0
  216. package/library/skills/character-portrait/SKILL.md +1 -1
  217. package/library/skills/cinematic-cutscene/SKILL.md +1 -1
  218. package/library/skills/combat-basics/SKILL.md +159 -0
  219. package/library/skills/combat-basics/references/projectiles-and-aoe.md +100 -0
  220. package/library/skills/combat-basics/resource.yaml +34 -0
  221. package/library/skills/concept-art/SKILL.md +1 -1
  222. package/library/skills/create-asset-sheet/SKILL.md +1 -1
  223. package/library/skills/debug/SKILL.md +1 -1
  224. package/library/skills/debugging-game-feel/SKILL.md +1 -1
  225. package/library/skills/design-level/SKILL.md +1 -1
  226. package/library/skills/design-mechanic/SKILL.md +1 -1
  227. package/library/skills/design-npc/SKILL.md +1 -1
  228. package/library/skills/diagnosing-perf-regressions/SKILL.md +1 -1
  229. package/library/skills/dispatching-parallel-agents/SKILL.md +1 -1
  230. package/library/skills/driving-the-editor-ui/SKILL.md +1 -1
  231. package/library/skills/environment-kit/SKILL.md +1 -1
  232. package/library/skills/export-and-ship/SKILL.md +1 -1
  233. package/library/skills/fabricating-assets/SKILL.md +1 -1
  234. package/library/skills/facial-and-lipsync/SKILL.md +1 -1
  235. package/library/skills/fps-controller/SKILL.md +9 -7
  236. package/library/skills/fps-controller/resource.yaml +4 -1
  237. package/library/skills/game-feel/SKILL.md +1 -1
  238. package/library/skills/gameskill/SKILL.md +1 -1
  239. package/library/skills/gdscript-patterns/SKILL.md +1 -1
  240. package/library/skills/generate-motion/SKILL.md +9 -9
  241. package/library/skills/generate-motion/resource.yaml +2 -1
  242. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +1 -1
  243. package/library/skills/headless-scripting/SKILL.md +1 -1
  244. package/library/skills/in-game-purchases/SKILL.md +254 -0
  245. package/library/skills/in-game-purchases/resource.yaml +29 -0
  246. package/library/skills/instantiate-asset-pack/SKILL.md +1 -1
  247. package/library/skills/investigating-bugs/SKILL.md +1 -1
  248. package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +1 -1
  249. package/library/skills/make-game/SKILL.md +25 -3
  250. package/library/skills/make-game/references/2d-platformer-polish.md +93 -0
  251. package/library/skills/make-game/references/2d-platformer.md +117 -0
  252. package/library/skills/make-game/references/2d-rpg-content.md +234 -0
  253. package/library/skills/make-game/references/2d-rpg.md +241 -0
  254. package/library/skills/make-game/references/2d-survivors-progression.md +201 -0
  255. package/library/skills/make-game/references/2d-survivors.md +237 -0
  256. package/library/skills/make-game/references/3d-fps-systems.md +216 -0
  257. package/library/skills/make-game/references/3d-fps.md +177 -0
  258. package/library/skills/make-game/references/3d-horror-systems.md +186 -0
  259. package/library/skills/make-game/references/3d-horror.md +201 -0
  260. package/library/skills/make-game/references/3d-third-person-systems.md +220 -0
  261. package/library/skills/make-game/references/3d-third-person.md +215 -0
  262. package/library/skills/make-game/resource.yaml +6 -1
  263. package/library/skills/multiplayer/SKILL.md +150 -0
  264. package/library/skills/multiplayer/resource.yaml +33 -0
  265. package/library/skills/multiplayer-movement/SKILL.md +510 -0
  266. package/library/skills/multiplayer-movement/files.md +501 -0
  267. package/library/skills/multiplayer-movement/resource.yaml +30 -0
  268. package/library/skills/multiplayer-project/SKILL.md +521 -0
  269. package/library/skills/multiplayer-project/files.md +448 -0
  270. package/library/skills/multiplayer-project/resource.yaml +36 -0
  271. package/library/skills/multiplayer-publish/SKILL.md +229 -0
  272. package/library/skills/multiplayer-publish/export-errors.md +89 -0
  273. package/library/skills/multiplayer-publish/resource.yaml +28 -0
  274. package/library/skills/multiplayer-state/SKILL.md +438 -0
  275. package/library/skills/multiplayer-state/files.md +592 -0
  276. package/library/skills/multiplayer-state/resource.yaml +35 -0
  277. package/library/skills/multiplayer-testing/SKILL.md +236 -0
  278. package/library/skills/multiplayer-testing/resource.yaml +39 -0
  279. package/library/skills/music-track/SKILL.md +1 -1
  280. package/library/skills/navigate-summer/SKILL.md +1 -1
  281. package/library/skills/new-project/SKILL.md +1 -1
  282. package/library/skills/organic-model/SKILL.md +1 -1
  283. package/library/skills/pixel-art/SKILL.md +1 -1
  284. package/library/skills/play/SKILL.md +1 -1
  285. package/library/skills/playtesting-a-feature/SKILL.md +1 -1
  286. package/library/skills/procedural-animation/SKILL.md +2 -2
  287. package/library/skills/procedural-animation/resource.yaml +1 -1
  288. package/library/skills/prop-model/SKILL.md +1 -1
  289. package/library/skills/psx-retro-rendering/SKILL.md +1 -1
  290. package/library/skills/realtime-wet-surfaces/SKILL.md +2 -2
  291. package/library/skills/remote-deploy/SKILL.md +1 -1
  292. package/library/skills/retarget/SKILL.md +1 -1
  293. package/library/skills/running-in-the-cloud/SKILL.md +1 -1
  294. package/library/skills/save-load/SKILL.md +156 -0
  295. package/library/skills/save-load/resource.yaml +27 -0
  296. package/library/skills/scene-composition/SKILL.md +1 -1
  297. package/library/skills/scene-hierarchy-design/SKILL.md +1 -1
  298. package/library/skills/scene-scripting/SKILL.md +1 -1
  299. package/library/skills/scene-to-level/SKILL.md +1 -1
  300. package/library/skills/skill-create/SKILL.md +1 -1
  301. package/library/skills/skill-improve/SKILL.md +1 -1
  302. package/library/skills/skill-test/SKILL.md +1 -1
  303. package/library/skills/skintokens-auto-rigging/SKILL.md +1 -1
  304. package/library/skills/skybox-panorama/SKILL.md +1 -1
  305. package/library/skills/sound-effect/SKILL.md +1 -1
  306. package/library/skills/spatial-placement/SKILL.md +134 -3
  307. package/library/skills/spatial-placement/references/kit-placement-tools.md +364 -0
  308. package/library/skills/spatial-placement/resource.yaml +16 -2
  309. package/library/skills/sprite-sheet/SKILL.md +1 -1
  310. package/library/skills/summer-analytics/SKILL.md +147 -0
  311. package/library/skills/summer-analytics/resource.yaml +28 -0
  312. package/library/skills/summer-friends/SKILL.md +226 -0
  313. package/library/skills/summer-friends/resource.yaml +28 -0
  314. package/library/skills/summer-leaderboards/SKILL.md +231 -0
  315. package/library/skills/summer-leaderboards/resource.yaml +30 -0
  316. package/library/skills/summer-match-results/SKILL.md +286 -0
  317. package/library/skills/summer-match-results/resource.yaml +32 -0
  318. package/library/skills/summer-matchmaking/SKILL.md +301 -0
  319. package/library/skills/summer-matchmaking/resource.yaml +32 -0
  320. package/library/skills/summer-parties/SKILL.md +253 -0
  321. package/library/skills/summer-parties/resource.yaml +30 -0
  322. package/library/skills/summer-player-data/SKILL.md +322 -0
  323. package/library/skills/summer-player-data/resource.yaml +30 -0
  324. package/library/skills/summer-store/SKILL.md +271 -0
  325. package/library/skills/summer-store/resource.yaml +29 -0
  326. package/library/skills/summer-world-chat/SKILL.md +195 -0
  327. package/library/skills/summer-world-chat/resource.yaml +30 -0
  328. package/library/skills/summer-world-saves/SKILL.md +284 -0
  329. package/library/skills/summer-world-saves/resource.yaml +29 -0
  330. package/library/skills/text-to-motion/SKILL.md +99 -0
  331. package/library/skills/text-to-motion/prompts-and-controls.md +34 -0
  332. package/library/skills/text-to-motion/resource.yaml +41 -0
  333. package/library/skills/text-to-motion/rigging-for-text-motion.md +54 -0
  334. package/library/skills/tileable-texture/SKILL.md +1 -1
  335. package/library/skills/trailer-shot/SKILL.md +1 -1
  336. package/library/skills/tune-performance/SKILL.md +1 -1
  337. package/library/skills/ui-basics/SKILL.md +10 -1
  338. package/library/skills/ui-graphics/SKILL.md +1 -1
  339. package/library/skills/use-widget-asset/SKILL.md +1 -1
  340. package/library/skills/using-summer/SKILL.md +2 -2
  341. package/library/skills/using-summer/resource.yaml +2 -2
  342. package/library/skills/vehicle-model/SKILL.md +1 -1
  343. package/library/skills/verification-before-completion/SKILL.md +1 -1
  344. package/library/skills/verifying-scenes/SKILL.md +76 -2
  345. package/library/skills/verifying-scenes/resource.yaml +13 -2
  346. package/library/skills/vfx-dissolve/SKILL.md +1 -1
  347. package/library/skills/vfx-fire/SKILL.md +1 -1
  348. package/library/skills/vfx-hit-spark/SKILL.md +1 -1
  349. package/library/skills/vfx-lightning/SKILL.md +1 -1
  350. package/library/skills/vfx-magic-glow/SKILL.md +1 -1
  351. package/library/skills/vfx-muzzle-flash/SKILL.md +1 -1
  352. package/library/skills/vfx-smoke/SKILL.md +1 -1
  353. package/library/skills/vfx-water-ripple/SKILL.md +1 -1
  354. package/library/skills/voice-line/SKILL.md +1 -1
  355. package/library/skills/web-and-touch-input/SKILL.md +38 -0
  356. package/library/skills/web-and-touch-input/resource.yaml +28 -0
  357. package/library/skills/web-compatibility-look/SKILL.md +62 -0
  358. package/library/skills/web-compatibility-look/resource.yaml +30 -0
  359. package/library/skills/world-building-3d/SKILL.md +8 -1
  360. package/library/skills/world-building-3d/references/spatial-tools.md +1 -1
  361. package/library/skills/world-building-3d/resource.yaml +2 -1
  362. package/library/skills/writing-plans/SKILL.md +1 -1
  363. package/library/skills/writing-skills/SKILL.md +1 -1
  364. package/library/templates/3d-lan-multiplayer-starter/resource.yaml +2 -2
  365. package/library/tools/attach-to-surface/resource.yaml +142 -0
  366. package/library/tools/batch/resource.yaml +9 -3
  367. package/library/tools/connect-ports/resource.yaml +120 -0
  368. package/library/tools/connect-signal/resource.yaml +3 -2
  369. package/library/tools/debug-views/resource.yaml +94 -0
  370. package/library/tools/frame-nodes/resource.yaml +104 -0
  371. package/library/tools/frame-shot/resource.yaml +134 -0
  372. package/library/tools/generate-motion/resource.yaml +44 -9
  373. package/library/tools/get-board/resource.yaml +50 -0
  374. package/library/tools/get-project-context/resource.yaml +13 -2
  375. package/library/tools/grep/resource.yaml +77 -0
  376. package/library/tools/inspect-asset/resource.yaml +71 -0
  377. package/library/tools/inspect-node/resource.yaml +9 -2
  378. package/library/tools/inspect-resource/resource.yaml +16 -5
  379. package/library/tools/instantiate-scene/resource.yaml +27 -2
  380. package/library/tools/measure/resource.yaml +96 -0
  381. package/library/tools/place-adjacent/resource.yaml +113 -0
  382. package/library/tools/play/resource.yaml +15 -2
  383. package/library/tools/raycast/resource.yaml +101 -0
  384. package/library/tools/read-file/resource.yaml +36 -2
  385. package/library/tools/read-library/resource.yaml +2 -2
  386. package/library/tools/repeat-along/resource.yaml +129 -0
  387. package/library/tools/replace-node/resource.yaml +11 -5
  388. package/library/tools/scene-audit/resource.yaml +144 -0
  389. package/library/tools/screenshot/resource.yaml +13 -2
  390. package/library/tools/search-assets/resource.yaml +18 -0
  391. package/library/tools/shot-sheet/resource.yaml +110 -0
  392. package/library/tools/snap-to-surface/resource.yaml +4 -1
  393. package/library/tools/world-snapshot/resource.yaml +24 -3
  394. package/library/tools/zoom/resource.yaml +105 -0
  395. package/package.json +3 -3
  396. package/registry/generated/aliases.json +17 -3
  397. package/registry/generated/counts.json +3 -3
  398. package/registry/generated/gemini-extension.json +26 -4
  399. package/registry/generated/index.json +2154 -469
  400. package/registry/generated/marketplace.claude.json +2 -2
  401. package/registry/generated/plugin.claude.json +27 -5
  402. package/registry/generated/plugin.codex.json +28 -6
  403. package/registry/generated/plugin.cursor.json +27 -5
  404. package/registry/generated/plugin.factory.json +27 -5
  405. package/registry/generated/skills-index.md +264 -0
  406. package/registry/generated/skills-registry.json +901 -206
  407. package/registry/generated/templates-registry.json +2 -2
  408. package/library/skills/host-authoritative-state/SKILL.md +0 -332
  409. package/library/skills/host-authoritative-state/resource.yaml +0 -28
  410. package/library/skills/peer-to-peer-multiplayer/SKILL.md +0 -373
  411. package/library/skills/peer-to-peer-multiplayer/resource.yaml +0 -28
  412. package/library/skills/setup-multiplayer/SKILL.md +0 -336
  413. package/library/skills/setup-multiplayer/resource.yaml +0 -28
@@ -0,0 +1,236 @@
1
+ ---
2
+ name: multiplayer-testing
3
+ description: "Test a Summer multiplayer game with Local Play: several players, a bad network, bots, and what a passing run shows."
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: multiplayer-and-networking
7
+ user-invocable: true
8
+ allowed-tools: Read Grep Edit Write summer_project_setting summer_play summer_stop summer_get_diagnostics summer_get_console summer_screenshot
9
+ paths: ["project.godot", "summer.build.json", "client/**", "authority/**", "network/**"]
10
+ ---
11
+
12
+ # /multiplayer-testing — prove it works before saying it works
13
+
14
+ Step 4 of the multiplayer sequence (`multiplayer` explains the model).
15
+
16
+ **Local Play** runs a Summer multiplayer game on one machine. It starts the
17
+ World's authority scene headless and N clients, and each client joins through
18
+ the game's own `Summer.client.join`. No account, server or extra tools are
19
+ needed. It can also make the network bad on purpose, which is where
20
+ multiplayer bugs show.
21
+
22
+ ## 1. Start Local Play
23
+
24
+ Pick whichever the session has.
25
+
26
+ **Summer MCP tools** (they set project settings, then play):
27
+
28
+ ```
29
+ summer_project_setting name="summer/local_play/players" value=2
30
+ summer_play
31
+ summer_get_diagnostics
32
+ summer_stop
33
+ ```
34
+
35
+ **Editor:** **Debug > Local Multiplayer**, pick the player count, press Play.
36
+ The client windows tile side by side.
37
+
38
+ **Terminal** (`<summer>` is the Summer editor executable). Import once after
39
+ adding scripts so their classes register:
40
+
41
+ ```sh
42
+ <summer> --headless --path . --import
43
+ <summer> --path . --summer-local-play 2 --summer-local-play-timeout 30
44
+ ```
45
+
46
+ | Setting | Terminal flag | Meaning |
47
+ |---|---|---|
48
+ | `summer/local_play/players` | `--summer-local-play <n>` | Players to start. `-1` uses the queue's `minPlayers`; `0` turns Local Play off |
49
+ | `summer/local_play/queue` | `--summer-local-play-queue <name>` | Which `summer.build.json` queue to stand in for (default: the first) |
50
+ | — | `--summer-local-play-headless` | Run the clients without windows too |
51
+ | — | `--summer-local-play-timeout <s>` | End the session after that many seconds |
52
+ | — | `--summer-local-play-smoke` | Headless clients; exit 0 once every client joined and stayed 3 s |
53
+ | — | `--summer-local-play-spectators <n>` | Also start spectator clients |
54
+ | — | `--summer-local-play-web` | Run the clients in a browser (the game's Web export) |
55
+
56
+ ## 2. Make the network bad
57
+
58
+ Loopback has no latency, so it hides every timing bug. Always run once with
59
+ these settings; they apply to every client:
60
+
61
+ ```
62
+ summer_project_setting name="summer/local_play/network/round_trip_msec" value=100
63
+ summer_project_setting name="summer/local_play/network/jitter_msec" value=10
64
+ summer_project_setting name="summer/local_play/network/loss_percent" value=1
65
+ ```
66
+
67
+ Or put them in `project.godot` while testing:
68
+
69
+ ```ini
70
+ [summer]
71
+
72
+ local_play/network/round_trip_msec=100
73
+ local_play/network/jitter_msec=10
74
+ local_play/network/loss_percent=1
75
+ ```
76
+
77
+ Ranges: round trip 0–2000 ms, jitter 0–1000 ms, loss 0–50 %. Each client
78
+ prints `NETWORK_EMULATION round_trip_ms=100 ...` when it applies. Try 200 ms
79
+ too: that is a player on another continent.
80
+
81
+ ## 3. Read the run
82
+
83
+ Every output line is prefixed by its process: `[authority]`, `[player-1]`,
84
+ `[player-2]`. The last line is the summary:
85
+
86
+ ```text
87
+ SUMMER_LOCAL_PLAY_RESULT {"ok":true,"players":2,"network":{...},"processes":[{"label":"authority","script_errors":0,...},{"label":"player-1","joined":true,"script_errors":0,...}],...}
88
+ ```
89
+
90
+ A run passes only when **all** of these hold:
91
+
92
+ - [ ] `"ok":true`, and every process has `"script_errors":0`.
93
+ - [ ] The game's own ready lines appear: the authority's, and one per client after its `join` Command (`COURTYARD_AUTHORITY_READY`, `COURTYARD_CLIENT_JOINED` in the Courtyard example). Print one in your game too.
94
+ - [ ] No `[SummerNetworkSpawner] cannot attach` warning on any process.
95
+ - [ ] No `SCRIPT ERROR` lines.
96
+
97
+ `"ok":true` alone only proves that clients got seats. If the composition is
98
+ invalid, the Spawner logs `cannot attach` as a warning and nothing networked
99
+ works, yet every client still counts as joined. The smoke flag
100
+ (`--summer-local-play-smoke`) proves the same thing and no more.
101
+
102
+ With MCP, `summer_get_diagnostics` reports runtime errors from the debugger.
103
+ Read it after every play; `summer_get_console` alone misses them.
104
+
105
+ ## 4. Drive the game with bots
106
+
107
+ To test gameplay without hands, give the game a bot mode. Arguments after
108
+ `--` reach every process, and `{client}` becomes 1, 2, ... for players and 0
109
+ for the authority:
110
+
111
+ ```sh
112
+ <summer> --path . --summer-local-play 2 --summer-local-play-headless --summer-local-play-timeout 20 -- --bot={client}
113
+ ```
114
+
115
+ Put the bot in `client/bot.gd`. It presses the same input actions a player
116
+ does, so it tests the real controls:
117
+
118
+ ```gdscript
119
+ extends Node
120
+ ## Test bot for Local Play, enabled with `-- --bot={client}`. It presses the
121
+ ## real input actions. Bot 1 walks to the first coin and collects it; every
122
+ ## bot prints what it sees, for the test run to check.
123
+
124
+ const COIN := "0"
125
+
126
+ var number := 0
127
+ var main: Node
128
+ var elapsed := 0.0
129
+ var step := 0
130
+
131
+
132
+ func _process(delta: float) -> void:
133
+ elapsed += delta
134
+ var me := _own_player()
135
+ if me == null:
136
+ return
137
+ if number == 1 and step == 0:
138
+ var at: Array = main.match_doc.get("coins", {}).get(COIN, [])
139
+ if at.is_empty():
140
+ return
141
+ var to_coin := Vector2(at[0] - me.global_position.x, at[2] - me.global_position.z)
142
+ if to_coin.length() > 0.5:
143
+ _steer(to_coin.normalized())
144
+ return
145
+ _steer(Vector2.ZERO)
146
+ step = 1
147
+ print("BOT_MOVED %s" % me.global_position)
148
+ var collected: Dictionary = await main.collect(COIN)
149
+ print("BOT_COLLECT %s" % JSON.stringify(collected))
150
+ if elapsed > 6.0 and step < 2:
151
+ step = 2
152
+ for node in main.get_node("Entities").get_children():
153
+ if node != me:
154
+ print("BOT_SAW %s" % node.global_position)
155
+ print("BOT_SCORES %s" % JSON.stringify(main.match_doc.get("scores", {})))
156
+
157
+
158
+ func _own_player() -> Node3D:
159
+ for node in main.get_node("Entities").get_children():
160
+ if node.get_script() == preload("res://client/player_owner.gd"):
161
+ return node
162
+ return null
163
+
164
+
165
+ func _steer(direction: Vector2) -> void:
166
+ for action in [&"ui_left", &"ui_right", &"ui_up", &"ui_down"]:
167
+ Input.action_release(action)
168
+ if direction.x > 0.0: Input.action_press(&"ui_right", direction.x)
169
+ if direction.x < 0.0: Input.action_press(&"ui_left", -direction.x)
170
+ if direction.y > 0.0: Input.action_press(&"ui_down", direction.y)
171
+ if direction.y < 0.0: Input.action_press(&"ui_up", -direction.y)
172
+ ```
173
+
174
+ Add it from `client/main.gd` only when the argument is there, after the
175
+ player has joined:
176
+
177
+ ```gdscript
178
+ # Local Play test bot: `-- --bot={client}` (see multiplayer-testing).
179
+ for arg in OS.get_cmdline_user_args():
180
+ if arg.begins_with("--bot="):
181
+ var bot := preload("res://client/bot.gd").new()
182
+ bot.number = int(arg.trim_prefix("--bot="))
183
+ bot.main = self
184
+ add_child(bot)
185
+ ```
186
+
187
+ Then check the lines it prints. The Courtyard bot walks player 1 to a coin
188
+ and collects it; player 2 watches:
189
+
190
+ - [ ] `[player-1] BOT_MOVED` and `[player-2] BOT_SAW` report the same position (the observer is up to 100 ms behind while moving, then equal).
191
+ - [ ] `[player-1] BOT_COLLECT {"ok":true...}` and both players print the new score.
192
+
193
+ Keep bot code in `client/`: files under `test/` or other debug folders are
194
+ left out of the players' pack, so the shipped game could not load them.
195
+
196
+ Headless clients have no real window. Guard calls that need one (mouse
197
+ capture, window size) with `DisplayServer.get_name() != "headless"`.
198
+
199
+ ## 5. What Local Play cannot show
200
+
201
+ - **Hosted-only services** answer with an error code locally: parties,
202
+ friends, World chat, the store, client leaderboards and analytics. Their
203
+ skills list the codes. Make the UI hide or explain them; never crash on them.
204
+ - **Matchmaking's accept prompt.** Local Play seats players directly: no
205
+ proposal, one World per queue.
206
+ - **A player leaving for good.** A client that quits or calls
207
+ `Summer.client.leave()` only disconnects. `session_disconnected` fires and
208
+ their seat is held. `session_left` arrives when the World ends; hosted, it
209
+ arrives when Summer ends the Session.
210
+ - **Real devices, real accounts, real distances.** Publish to staging for that
211
+ (`multiplayer-publish`).
212
+
213
+ ## Checklist for any multiplayer change
214
+
215
+ - [ ] Ran Local Play with at least 2 players, and once with 100 ms / 10 ms / 1 %.
216
+ - [ ] Every process: no `SCRIPT ERROR`, no `cannot attach`, `script_errors` 0.
217
+ - [ ] The game's own ready lines appear for the authority and every client.
218
+ - [ ] Your own player responds instantly and never snaps while moving normally.
219
+ - [ ] Other players move smoothly and end where their owners are.
220
+ - [ ] Shared state matches on every client; private state reaches only its owner.
221
+ - [ ] A refused Command changes nothing and shows its reason.
222
+
223
+ ## Common mistakes
224
+
225
+ | Don't | Do | Why |
226
+ |---|---|---|
227
+ | Test only on loopback | Add round trip, jitter and loss | Latency bugs are invisible at 0 ms |
228
+ | Read `"ok":true` as success | Also check your ready lines, `cannot attach` and `script_errors` | A broken composition still joins |
229
+ | Read only `summer_get_console` | `summer_get_diagnostics` after each play | Runtime errors live in the debugger |
230
+ | Put bot or test code under `test/` and load it from the game | Keep the bot in `client/`, enabled by `--bot` | Debug folders are left out of the players' pack |
231
+ | Wait for `session_left` in a local test | Watch `session_disconnected` | Local Play ends Sessions only when the World ends |
232
+ | Skip the import pass after adding scripts | `<summer> --headless --path . --import` first | New classes are unknown until imported |
233
+
234
+ ## Next
235
+
236
+ `multiplayer-publish`: export the summer.games bundle and upload it as a Build.
@@ -0,0 +1,39 @@
1
+ id: skill/multiplayer-testing
2
+ kind: skill
3
+ version: 1.0.0
4
+ summary: "Test a Summer multiplayer game with Local Play: several players, a bad network, bots, and what a passing run shows."
5
+ use_when:
6
+ - "running or testing a Summer multiplayer game locally with several players (Local Play)"
7
+ - "testing multiplayer under latency, jitter or packet loss, or with bots"
8
+ - "a multiplayer run says ok but nothing networked works, or deciding whether a multiplayer change is done"
9
+ facets:
10
+ lifecycle:
11
+ - build
12
+ - support
13
+ domains:
14
+ - multiplayer
15
+ - playtest
16
+ - verification
17
+ modalities:
18
+ - scripts
19
+ - project
20
+ compatibility:
21
+ engine: ">=4.6"
22
+ related:
23
+ skills:
24
+ - skill/multiplayer
25
+ - skill/multiplayer-project
26
+ - skill/multiplayer-movement
27
+ - skill/multiplayer-state
28
+ - skill/multiplayer-publish
29
+ - skill/summer-friends
30
+ - skill/summer-match-results
31
+ - skill/summer-matchmaking
32
+ - skill/summer-parties
33
+ - skill/summer-player-data
34
+ - skill/summer-store
35
+ - skill/summer-world-chat
36
+ source: official
37
+ license: MIT
38
+ status: stable
39
+ recommended: false
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: music-track
3
- description: Use when generating a looped or cinematic music track. Loops are authored at >=30s with a marked loop point; cinematic tracks at >=60s linear. Trigger on "generate music", "make a calm track", "boss music", "title screen music", "main theme", "exploration loop", "combat track".
3
+ description: "Generate a looped or cinematic music track — loops authored at >=30s with a marked loop point, cinematic tracks at >=60s linear."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: audio
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: navigate-summer
3
- description: Use when the user wants to SEE, CHECK, or DECIDE something — "show me my billing", "where do I change my plan", "open my games", "let me look at the scene", "open the MCP guide for Cursor". Decides whether to open a Summer web page or editor surface for the user or to act through the API, and lands exactly there with summer_open.
3
+ description: "When to open a Summer web page or editor surface FOR the user (billing, their games, the scene just built) versus acting through the API, using summer_open."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Codex, Windsurf, Gemini, OpenCode, Factory, Copilot]
6
6
  category: _meta
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: new-project
3
- description: Use when the user wants a fresh blank Summer Engine project — not from a template. Asks one question (project name) and runs `summer create empty <name>`. Trigger on "new project", "blank project", "empty project", "from scratch", "start fresh", "create new game", "blank canvas", "scaffold a project".
3
+ description: "Create a fresh blank Summer Engine project — asks one question (project name) and runs summer create empty."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Codex, Windsurf, Gemini, OpenCode]
6
6
  category: scene-and-project
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: organic-model
3
- description: Use when generating organic shapes — trees, rocks, mushrooms, coral, bushes, alien plants, vines, crystals, fruit, bones. The "easy mode" of 3D generation; AI artifacts read as natural irregularity. Trigger on "make a tree", "generate rocks", "I need foliage", "mushroom prop", "alien plants", "fill the scene with shrubs", "scatter some boulders".
3
+ description: "Generate organic 3D shapes — trees, rocks, mushrooms, coral, plants, vines, crystals — where AI artifacts read as natural irregularity."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: 3d-assets
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pixel-art
3
- description: Use when generating pixel-art assets — sprites, items, tiles, portraits in a pixel style at a specific resolution (32×32, 64×64, 128×128). Pixel-perfect grid, limited palette, retro feel. Trigger on "pixel art", "8-bit art", "16-bit sprite", "pixel sprite", "retro tileset", "pixel icon", "pixel portrait".
3
+ description: "Generate pixel-art assets — sprites, items, tiles, portraits — at a specific resolution with pixel-perfect grid, limited palette, retro feel."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: 2d-assets
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: play
3
- description: Use when the user says "play", "run it", "test it", "let me see it", or "start the game". Runs the project in Summer Engine, briefly waits, then reports what's happening — clean run, errors, or warnings.
3
+ description: "Run the project in Summer Engine, wait briefly, then report what's happening — clean run, errors, or warnings."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: scene-and-project
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: playtesting-a-feature
3
- description: Use when about to claim a gameplay feature is done, shipped, or working — requires actually running the game and walking through the feature before declaring completion. Static diagnostics and type checks do not count as playtesting.
3
+ description: "Before claiming a gameplay feature done: actually run the game and walk through the feature. Static diagnostics and type checks do not count."
4
4
  ---
5
5
 
6
6
  # Playtesting A Feature
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: procedural-animation
3
- description: Use when the user needs runtime-driven bone modification on top of clips — head look-at, foot IK on uneven ground, hand-grabs-prop, additive lean, hit-direction recoil. Code-and-modifier patterns, not generation. Trigger on "look at", "IK", "foot placement", "foot IK", "lean", "additive layer", "feet floating", "hand penetration", "head tracks player", "ragdoll".
3
+ description: "Runtime bone modification on top of clips — head look-at, foot IK, hand-grabs-prop, additive lean, recoil. Code-and-modifier patterns, not generation."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: animation
@@ -243,7 +243,7 @@ You need PhysicalBone3D children matching every major bone (set up once via the
243
243
  - **Character is mounted (riding a horse).** Disable foot IK on the rider; ride animation already sells the contact. Enable upper-body additive sway driven by horse acceleration.
244
244
  - **First-person hands.** Same modifier set, but only the arm chain is visible — disable head/spine modifiers, keep hand-on-prop IK.
245
245
  - **Character is a quadruped.** All four legs need foot IK. The bone names are different (`FrontLeftLeg`, `BackRightLeg`, etc.); inspect first.
246
- - **Network-synced ragdoll.** Don't simulate on every client. Simulate on the host, send bone transforms via `MultiplayerSynchronizer`, blend on receivers. Out of scope; see `setup-multiplayer`.
246
+ - **Network-synced ragdoll.** Don't simulate it on every client and don't sync bones with `MultiplayerSynchronizer`. In a Summer multiplayer game, send the few values that drive the ragdoll (the impulse, the moment it starts) as State or an Event and let each client simulate locally; see `multiplayer-state`.
247
247
 
248
248
  ## Fallback (no MCP)
249
249
 
@@ -1,6 +1,6 @@
1
1
  id: skill/procedural-animation
2
2
  kind: skill
3
- version: 1.0.3
3
+ version: 1.0.4
4
4
  summary: Runtime bone modification on top of clips — head look-at, foot IK, hand-grabs-prop, additive lean, recoil. Code-and-modifier patterns, not generation.
5
5
  use_when:
6
6
  - the user needs runtime-driven bone modification on top of clips — head look-at, foot IK on uneven ground, additive lean, hit recoil, ragdoll
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: prop-model
3
- description: Use when generating a single static 3D prop — sword, barrel, chest, lantern, throne, statue, crate, key, potion, banner. One isolated object, no rigging, wired into the scene as a MeshInstance3D. Trigger on "make a sword", "generate a chest", "I need a barrel", "add a lantern model", "give me a treasure prop", "create a statue".
3
+ description: "Generate a single static 3D prop — sword, barrel, chest, lantern, throne, statue — one isolated object, no rigging, wired as a MeshInstance3D."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: 3d-assets
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: psx-retro-rendering
3
- description: "Use when building or reviewing a hardware-informed PlayStation 1 rendering pipeline in Godot 4, including low-resolution output, RGB5 color and exact dithering, affine textures, screen-coordinate snapping, draw-order/depth approximation, vertex lighting, PS1 blend modes, and fog — when accuracy and the limits of each Godot approximation matter, not for a generic pixel-art filter."
3
+ description: "Hardware-informed PlayStation 1 rendering in Godot 4 — low-res output, RGB5 and exact dither, affine textures, vertex snapping, blend modes, fog; limits named."
4
4
  license: MIT
5
5
  category: shaders
6
6
  tags:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: realtime-wet-surfaces
3
- description: "Use when adding real-time wetness to existing Godot 4 materials while preserving their parameter values, mapping Unity's Lit-preserving wet ShaderGraph swap onto a value-copying shader conversion with a geometry-driven wet mask and instance-uniform control."
3
+ description: "Real-time wetness on existing Godot 4 materials without losing their values — value-copying wet shader, geometry-driven wet mask, instance-uniform wet amount."
4
4
  license: MIT
5
5
  category: shaders
6
6
  tags:
@@ -186,4 +186,4 @@ The source author states heightmap support so wetness flows along map bumps is *
186
186
 
187
187
  ## Evidence
188
188
 
189
- - [sources/x/tenmomo-unity-realtime-wet/source.md](../../../sources/x/tenmomo-unity-realtime-wet/source.md)
189
+ - Source record `sources/x/tenmomo-unity-realtime-wet/source.md`, kept outside this package (the evidence boundaries above summarise it).
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: remote-deploy
3
- description: Use when the user wants to run or test the game on a real target instead of the editor — a phone, tablet, or another computer ("deploy to my phone", "run on device", "test on Android/iOS", "remote deploy", "one-click deploy", "play on hardware"). Covers the topnav Remote Deploy button, runnable export presets, export templates, and on-device remote debugging. Use when the Remote Deploy button is greyed out and the user wants to know why.
3
+ description: "Run or test the game on a real device — phone, tablet, another computer — via the Remote Deploy button, runnable export presets, and on-device debugging."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: deployment
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: retarget
3
- description: Use when the user wants to apply existing animation clips from one rigged character to a different rigged character — same library, multiple models, no regeneration. Trigger on "retarget", "reuse animation", "apply to other character", "same animations on different model", "share animation library".
3
+ description: "Apply existing animation clips from one rigged character to a different rigged character — same library, multiple models, no regeneration."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: animation
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: running-in-the-cloud
3
- description: Use when Summer Engine runs in a cloud container, CI job, remote agent sandbox, or any Linux box with no desktop — installing the engine there, launching it headless, deciding when xvfb-run and software GL are required, and authenticating without a browser. Also use when a tool reports "engine not running" in an environment that has no display, or when SUMMER_ENGINE_BINARY / SUMMER_TOKEN come up.
3
+ description: "Run Summer Engine on a Linux box with no display — install it, launch headless, know when xvfb + software GL are needed, authenticate without a browser."
4
4
  ---
5
5
 
6
6
  # Running in the Cloud
@@ -0,0 +1,156 @@
1
+ ---
2
+ name: save-load
3
+ description: "Persist game state in Summer Engine: user:// paths, JSON progress vs ConfigFile settings, a versioned save schema with migration, autosave hooks."
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Codex, Windsurf, Gemini, OpenCode]
6
+ category: scripting-patterns
7
+ user-invocable: false
8
+ allowed-tools: Read Grep summer_read_file summer_write_file summer_replace_text summer_project_setting summer_get_script_errors summer_get_diagnostics
9
+ paths: ["**/*.gd", "project.godot"]
10
+ ---
11
+
12
+ # Save / Load
13
+
14
+ Trigger phrases: "save progress", "settings menu should remember", "high scores",
15
+ "checkpoints", "save slots", "JSON or ConfigFile?", "saves broke after the update".
16
+
17
+ Save what the player would be angry to lose, and nothing else. Persist DATA
18
+ (numbers, ids, flags), never live nodes or scene references.
19
+
20
+ ## Where saves go
21
+
22
+ Always `user://` - a writable per-user dir (`res://` is read-only in an export).
23
+
24
+ - `user://save_0.json` - progress
25
+ - `user://settings.cfg` - options
26
+
27
+ Never write gameplay saves to `res://`; it fails in the shipped game.
28
+
29
+ ## JSON vs ConfigFile
30
+
31
+ | Use JSON when | Use ConfigFile when |
32
+ |---------------|---------------------|
33
+ | Nested/structured game state (inventory, quests, world) | Flat key/value settings |
34
+ | One document you load whole | Sectioned options (audio, video, controls) |
35
+ | You want a schema + version field | You want human-editable ini-style |
36
+
37
+ Default to JSON for game progress, ConfigFile for settings.
38
+
39
+ ## Save schema (version it from day one)
40
+
41
+ A top-level `version` field is the difference between "old saves still load after
42
+ an update" and "everyone loses their progress on patch day".
43
+
44
+ ```gdscript
45
+ const SAVE_PATH := "user://save_0.json"
46
+ const SAVE_VERSION := 1
47
+
48
+ func build_save() -> Dictionary:
49
+ return {
50
+ "version": SAVE_VERSION,
51
+ "level": GameManager.current_level,
52
+ "player": {
53
+ "hp": GameManager.player_health,
54
+ "gold": GameManager.player_gold,
55
+ "pos": var_to_str(player.global_position), # Vector serialized as string
56
+ },
57
+ "inventory": GameManager.inventory, # array of item ids, not item nodes
58
+ "flags": GameManager.story_flags,
59
+ }
60
+ ```
61
+
62
+ Serialize Vectors/Colors with `var_to_str()` and restore with `str_to_var()` -
63
+ JSON has no native Vector2/3.
64
+
65
+ ## Write and read
66
+
67
+ ```gdscript
68
+ func save_game() -> void:
69
+ var f := FileAccess.open(SAVE_PATH, FileAccess.WRITE)
70
+ if f == null:
71
+ push_error("save failed: %s" % FileAccess.get_open_error())
72
+ return
73
+ f.store_string(JSON.stringify(build_save(), "\t")) # tab-indented, readable
74
+ f.close()
75
+
76
+ func load_game() -> bool:
77
+ if not FileAccess.file_exists(SAVE_PATH):
78
+ return false
79
+ var f := FileAccess.open(SAVE_PATH, FileAccess.READ)
80
+ var data: Variant = JSON.parse_string(f.get_as_text())
81
+ f.close()
82
+ if typeof(data) != TYPE_DICTIONARY:
83
+ return false # corrupt/partial file
84
+ data = _migrate(data) # bring old versions up to current
85
+ _apply_save(data)
86
+ return true
87
+ ```
88
+
89
+ ## Migration (do not skip)
90
+
91
+ When the schema changes, bump `SAVE_VERSION` and upgrade old saves instead of
92
+ rejecting them.
93
+
94
+ ```gdscript
95
+ func _migrate(data: Dictionary) -> Dictionary:
96
+ var v: int = data.get("version", 0)
97
+ if v < 1:
98
+ data["flags"] = data.get("flags", {}) # field added in v1
99
+ data["version"] = 1
100
+ return data
101
+ ```
102
+
103
+ ## Settings with ConfigFile
104
+
105
+ ```gdscript
106
+ func save_settings() -> void:
107
+ var cfg := ConfigFile.new()
108
+ cfg.set_value("audio", "master", master_volume)
109
+ cfg.set_value("video", "fullscreen", is_fullscreen)
110
+ cfg.save("user://settings.cfg")
111
+
112
+ func load_settings() -> void:
113
+ var cfg := ConfigFile.new()
114
+ if cfg.load("user://settings.cfg") != OK:
115
+ return # first run, use defaults
116
+ master_volume = cfg.get_value("audio", "master", 1.0)
117
+ ```
118
+
119
+ Always pass a default to `get_value` so a missing key never crashes.
120
+
121
+ ## Autosave hooks
122
+
123
+ - Save on meaningful checkpoints (level end, area transition, shop close), not
124
+ every frame. Disk writes stutter.
125
+ - Save on quit via `_notification`:
126
+
127
+ ```gdscript
128
+ func _notification(what: int) -> void:
129
+ if what == NOTIFICATION_WM_CLOSE_REQUEST:
130
+ save_game()
131
+ get_tree().quit()
132
+ ```
133
+
134
+ Set `get_tree().set_auto_accept_quit(false)` so you control the quit.
135
+
136
+ ## Traps
137
+
138
+ - Storing a node/`PackedScene`/callable in the save = unserializable or huge.
139
+ Store ids and rebuild.
140
+ - Writing to `res://` - read-only in exports; silently fails or errors.
141
+ - No `version` field - the first schema change wipes every player's save.
142
+ - `JSON.parse_string` returns `null` on bad input; type-check before using it.
143
+ - Floats round-trip fine; ints may load back as floats from JSON - cast on read
144
+ (`int(data["gold"])`).
145
+
146
+ ## Applying it in Summer Engine
147
+
148
+ - The save code is a script, usually an autoload (`res://scripts/autoloads/save_manager.gd`):
149
+ create it with `summer_write_file(path=..., content=..., create_only=true)`,
150
+ then register it with `summer_project_setting(key="autoload/SaveManager", value="*res://scripts/autoloads/save_manager.gd")`
151
+ (the leading `*` makes it a singleton). Check it with `summer_get_script_errors`.
152
+ - `user://` is the per-user data dir, outside the project, so do not expect
153
+ `summer_read_file` (a project-file reader) to show a save file. Prove a round trip from inside the game
154
+ instead: a `RunVerification` probe (see `playtesting-a-feature`) that calls
155
+ `save_game()`, changes a value, calls `load_game()`, and `report()`s the
156
+ restored value.
@@ -0,0 +1,27 @@
1
+ id: skill/save-load
2
+ kind: skill
3
+ version: 1.0.0
4
+ summary: "Persist game state in Summer Engine: user:// paths, JSON progress vs ConfigFile settings, a versioned save schema with migration, autosave hooks."
5
+ use_when:
6
+ - persisting progress, settings, high scores, checkpoints, or save slots
7
+ - deciding between JSON and ConfigFile for a save or settings file
8
+ - making saves survive game updates with a schema version and migration
9
+ facets:
10
+ lifecycle:
11
+ - build
12
+ domains:
13
+ - scripting
14
+ - gameplay
15
+ modalities:
16
+ - scripts
17
+ compatibility:
18
+ engine: ">=4.6"
19
+ related:
20
+ skills:
21
+ - skill/make-game
22
+ - skill/gdscript-patterns
23
+ - skill/ui-basics
24
+ source: official
25
+ license: MIT
26
+ status: preview
27
+ recommended: false
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: scene-composition
3
- description: "Use when building or organizing Summer Engine scenes: node hierarchy conventions, when to extract sub-scenes, reusable prefab patterns, and instance-versus-add-node decisions. Trigger on \"scene\", \"sub-scene\", \"instance\", \"prefab\", \"node hierarchy\", \"scene structure\", \"PackedScene\"."
3
+ description: "Scene structure conventions — node hierarchy, when to extract sub-scenes, reusable prefab patterns, and instance-versus-add-node decisions."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: scene-and-project
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: scene-hierarchy-design
3
- description: "Use when applying data-oriented hierarchy principles (from Sander Mertens' ECS hierarchies article) to structure Summer Engine scenes: split asset vs. live hierarchies, group by dominant access pattern, use sub-scenes for reuse, and keep logic path-agnostic via MCP scene tools."
3
+ description: "Structure Summer Engine scenes by access pattern — asset vs live hierarchies, wrapper nodes per operation, sub-scenes for reuse, path-agnostic logic."
4
4
  license: MIT
5
5
  category: workflow
6
6
  tags:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: scene-scripting
3
- description: Use when building or modifying a scene takes more than a couple of node/property calls — scattering instances, procedural meshes, booleans/lathe/sweep geometry, terrain, GridMap fills, lighting rigs, keyframe animation, shader FX, 2D levels (tilemaps, sprites, bodies, cameras, parallax), HUDs and Control trees, persisted signal wiring, attached scripts, prefabs, input actions/autoloads/main scene, or anything with computed placement. Runs one GDScript inside the live editor via summer_run_script instead of long CRUD chains, verifies with summer_snapshot_diff + summer_screenshot, and checks API names with summer_api_docs instead of guessing.
3
+ description: "One GDScript in the live editor (summer_run_script) builds scenes, 2D levels, HUDs and gameplay wiring instead of CRUD chains; verify with diff + screenshot."
4
4
  ---
5
5
 
6
6
  # Scene Scripting