summer-engine 3.1.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 (366) 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 +102 -0
  8. package/README.md +18 -3
  9. package/assets/audit/scene_audit.gd +4136 -0
  10. package/assets/seeing/seeing_probe.gd +1873 -0
  11. package/dist/cli/commands/skills.js +20 -2
  12. package/dist/core/api-client.d.ts +9 -1
  13. package/dist/core/api-client.js +21 -4
  14. package/dist/core/capabilities/agent-playbook.js +46 -0
  15. package/dist/core/capabilities/audit/accept.d.ts +55 -0
  16. package/dist/core/capabilities/audit/accept.js +147 -0
  17. package/dist/core/capabilities/audit/args.d.ts +95 -0
  18. package/dist/core/capabilities/audit/args.js +89 -0
  19. package/dist/core/capabilities/audit/audit.d.ts +56 -0
  20. package/dist/core/capabilities/audit/audit.js +287 -0
  21. package/dist/core/capabilities/audit/frame.d.ts +14 -0
  22. package/dist/core/capabilities/audit/frame.js +35 -0
  23. package/dist/core/capabilities/audit/gaps.d.ts +96 -0
  24. package/dist/core/capabilities/audit/gaps.js +257 -0
  25. package/dist/core/capabilities/audit/judge.d.ts +162 -0
  26. package/dist/core/capabilities/audit/judge.js +1134 -0
  27. package/dist/core/capabilities/audit/math.d.ts +110 -0
  28. package/dist/core/capabilities/audit/math.js +263 -0
  29. package/dist/core/capabilities/audit/summary.d.ts +74 -0
  30. package/dist/core/capabilities/audit/summary.js +212 -0
  31. package/dist/core/capabilities/board.d.ts +31 -0
  32. package/dist/core/capabilities/board.js +43 -0
  33. package/dist/core/capabilities/camera-view.d.ts +4 -2
  34. package/dist/core/capabilities/camera-view.js +6 -3
  35. package/dist/core/capabilities/connect-signal.d.ts +85 -0
  36. package/dist/core/capabilities/connect-signal.js +285 -0
  37. package/dist/core/capabilities/engine-fallbacks.d.ts +5 -0
  38. package/dist/core/capabilities/engine-fallbacks.js +5 -0
  39. package/dist/core/capabilities/engine-ops.d.ts +5 -1
  40. package/dist/core/capabilities/engine-ops.js +0 -3
  41. package/dist/core/capabilities/engine-receipt.d.ts +12 -0
  42. package/dist/core/capabilities/engine-receipt.js +26 -0
  43. package/dist/core/capabilities/file-read.d.ts +64 -0
  44. package/dist/core/capabilities/file-read.js +325 -0
  45. package/dist/core/capabilities/game-task-plan.js +4 -2
  46. package/dist/core/capabilities/grep.d.ts +60 -0
  47. package/dist/core/capabilities/grep.js +190 -0
  48. package/dist/core/capabilities/inspect-node.d.ts +56 -0
  49. package/dist/core/capabilities/inspect-node.js +225 -0
  50. package/dist/core/capabilities/inspect-resource.d.ts +61 -0
  51. package/dist/core/capabilities/inspect-resource.js +376 -0
  52. package/dist/core/capabilities/math3d.d.ts +28 -0
  53. package/dist/core/capabilities/math3d.js +88 -0
  54. package/dist/core/capabilities/motion-generation.d.ts +62 -0
  55. package/dist/core/capabilities/motion-generation.js +138 -0
  56. package/dist/core/capabilities/placement-batch.d.ts +102 -0
  57. package/dist/core/capabilities/placement-batch.js +483 -0
  58. package/dist/core/capabilities/placement-math.d.ts +70 -0
  59. package/dist/core/capabilities/placement-math.js +209 -0
  60. package/dist/core/capabilities/placement-script.d.ts +42 -0
  61. package/dist/core/capabilities/placement-script.js +1096 -0
  62. package/dist/core/capabilities/placement.d.ts +485 -0
  63. package/dist/core/capabilities/placement.js +1731 -0
  64. package/dist/core/capabilities/project-context.d.ts +33 -2
  65. package/dist/core/capabilities/project-context.js +87 -4
  66. package/dist/core/capabilities/replace-node.d.ts +91 -0
  67. package/dist/core/capabilities/replace-node.js +423 -0
  68. package/dist/core/capabilities/runtime-control.d.ts +18 -2
  69. package/dist/core/capabilities/runtime-control.js +67 -2
  70. package/dist/core/capabilities/scene-batch.d.ts +63 -0
  71. package/dist/core/capabilities/scene-batch.js +394 -0
  72. package/dist/core/capabilities/scene-readback.d.ts +36 -0
  73. package/dist/core/capabilities/scene-readback.js +54 -0
  74. package/dist/core/capabilities/seeing/args.d.ts +348 -0
  75. package/dist/core/capabilities/seeing/args.js +178 -0
  76. package/dist/core/capabilities/seeing/candidates.d.ts +127 -0
  77. package/dist/core/capabilities/seeing/candidates.js +282 -0
  78. package/dist/core/capabilities/seeing/math.d.ts +134 -0
  79. package/dist/core/capabilities/seeing/math.js +269 -0
  80. package/dist/core/capabilities/seeing/probe.d.ts +62 -0
  81. package/dist/core/capabilities/seeing/probe.js +188 -0
  82. package/dist/core/capabilities/seeing/scoring.d.ts +235 -0
  83. package/dist/core/capabilities/seeing/scoring.js +639 -0
  84. package/dist/core/capabilities/seeing/seeing.d.ts +233 -0
  85. package/dist/core/capabilities/seeing/seeing.js +1341 -0
  86. package/dist/core/capabilities/seeing/shot-store.d.ts +52 -0
  87. package/dist/core/capabilities/seeing/shot-store.js +204 -0
  88. package/dist/core/capabilities/surface-snap-mesh.d.ts +88 -0
  89. package/dist/core/capabilities/surface-snap-mesh.js +425 -0
  90. package/dist/core/capabilities/surface-snap.d.ts +77 -0
  91. package/dist/core/capabilities/surface-snap.js +461 -0
  92. package/dist/core/capabilities/tool-dispatch.js +231 -72
  93. package/dist/core/capabilities/tscn.d.ts +85 -0
  94. package/dist/core/capabilities/tscn.js +391 -0
  95. package/dist/core/capabilities/world-snapshot.d.ts +58 -0
  96. package/dist/core/capabilities/world-snapshot.js +150 -0
  97. package/dist/core/capability-skew.d.ts +5 -5
  98. package/dist/core/capability-skew.js +14 -6
  99. package/dist/core/headless/worker-engine-client.d.ts +1 -1
  100. package/dist/core/headless/worker-engine-client.js +2 -2
  101. package/dist/core/library-read.d.ts +37 -5
  102. package/dist/core/library-read.js +264 -33
  103. package/dist/core/library-search.d.ts +2 -2
  104. package/dist/installer/agent-config.js +5 -3
  105. package/dist/installer/agent-table.d.ts +16 -0
  106. package/dist/installer/agent-table.js +52 -17
  107. package/dist/mcp/server.js +9 -3
  108. package/dist/mcp/tools/asset-tools.js +21 -3
  109. package/dist/mcp/tools/audit-tools.d.ts +23 -0
  110. package/dist/mcp/tools/audit-tools.js +60 -0
  111. package/dist/mcp/tools/debug-tools.js +3 -1
  112. package/dist/mcp/tools/file-tools.js +17 -4
  113. package/dist/mcp/tools/generate-tools.js +74 -66
  114. package/dist/mcp/tools/library-tools.js +2 -0
  115. package/dist/mcp/tools/perception-tools.js +6 -19
  116. package/dist/mcp/tools/placement-tools.d.ts +24 -0
  117. package/dist/mcp/tools/placement-tools.js +91 -0
  118. package/dist/mcp/tools/project-tools.js +18 -15
  119. package/dist/mcp/tools/scene-tools.js +71 -83
  120. package/dist/mcp/tools/seeing-tools.d.ts +24 -0
  121. package/dist/mcp/tools/seeing-tools.js +64 -0
  122. package/dist/mcp/tools/spatial-tools.js +17 -9
  123. package/dist/mcp/tools/visual-tools.js +59 -7
  124. package/gemini-extension.json +26 -4
  125. package/integrations/amp/README.md +1 -1
  126. package/integrations/crush/README.md +1 -1
  127. package/integrations/grok-build/README.md +1 -1
  128. package/integrations/hermes/README.md +1 -1
  129. package/integrations/kimi-code/README.md +1 -1
  130. package/integrations/mistral-vibe/README.md +1 -1
  131. package/integrations/opencode/README.md +1 -1
  132. package/integrations/rovo-dev/README.md +1 -1
  133. package/integrations/vscode-copilot/README.md +1 -1
  134. package/integrations/warp/README.md +1 -1
  135. package/integrations/windsurf/README.md +1 -1
  136. package/library/references/mcp-tools-reference/mcp-tools-reference.md +59 -15
  137. package/library/references/mcp-tools-reference/resource.yaml +1 -1
  138. package/library/references/summer-folder/resource.yaml +1 -1
  139. package/library/references/summer-folder/summer-folder.md +1 -1
  140. package/library/skills/3d-lighting/SKILL.md +1 -1
  141. package/library/skills/README.md +36 -14
  142. package/library/skills/adaptive-music/SKILL.md +1 -1
  143. package/library/skills/agent-playtesting/SKILL.md +1 -1
  144. package/library/skills/ai-characters-in-games/SKILL.md +220 -0
  145. package/library/skills/ai-characters-in-games/resource.yaml +30 -0
  146. package/library/skills/ambient-bed/SKILL.md +1 -1
  147. package/library/skills/animated-loop/SKILL.md +1 -1
  148. package/library/skills/animation-tree/SKILL.md +1 -1
  149. package/library/skills/art-direction/SKILL.md +1 -1
  150. package/library/skills/asset-strategy/SKILL.md +2 -1
  151. package/library/skills/asset-strategy/resource.yaml +2 -1
  152. package/library/skills/audio-direction/SKILL.md +1 -1
  153. package/library/skills/auto-fire-targeting/SKILL.md +1 -1
  154. package/library/skills/brainstorm-game/SKILL.md +1 -1
  155. package/library/skills/brainstorming/SKILL.md +1 -1
  156. package/library/skills/browse-templates/SKILL.md +3 -3
  157. package/library/skills/browse-templates/resource.yaml +1 -1
  158. package/library/skills/camera-rigs/SKILL.md +128 -0
  159. package/library/skills/camera-rigs/resource.yaml +29 -0
  160. package/library/skills/celeste-momentum-platforming/SKILL.md +1 -1
  161. package/library/skills/character-animation-wiring/SKILL.md +1 -1
  162. package/library/skills/character-model/SKILL.md +1 -1
  163. package/library/skills/character-movement/SKILL.md +326 -0
  164. package/library/skills/character-movement/references/default-third-person-controller.gd +201 -0
  165. package/library/skills/character-movement/references/default-third-person-verification-probe.gd +154 -0
  166. package/library/skills/character-movement/references/movement-3d.md +136 -0
  167. package/library/skills/character-movement/references/platformer-feel.md +83 -0
  168. package/library/skills/character-movement/resource.yaml +40 -0
  169. package/library/skills/character-portrait/SKILL.md +1 -1
  170. package/library/skills/cinematic-cutscene/SKILL.md +1 -1
  171. package/library/skills/combat-basics/SKILL.md +159 -0
  172. package/library/skills/combat-basics/references/projectiles-and-aoe.md +100 -0
  173. package/library/skills/combat-basics/resource.yaml +34 -0
  174. package/library/skills/concept-art/SKILL.md +1 -1
  175. package/library/skills/create-asset-sheet/SKILL.md +1 -1
  176. package/library/skills/debug/SKILL.md +1 -1
  177. package/library/skills/debugging-game-feel/SKILL.md +1 -1
  178. package/library/skills/design-level/SKILL.md +1 -1
  179. package/library/skills/design-mechanic/SKILL.md +1 -1
  180. package/library/skills/design-npc/SKILL.md +1 -1
  181. package/library/skills/diagnosing-perf-regressions/SKILL.md +1 -1
  182. package/library/skills/dispatching-parallel-agents/SKILL.md +1 -1
  183. package/library/skills/driving-the-editor-ui/SKILL.md +1 -1
  184. package/library/skills/environment-kit/SKILL.md +1 -1
  185. package/library/skills/export-and-ship/SKILL.md +1 -1
  186. package/library/skills/fabricating-assets/SKILL.md +1 -1
  187. package/library/skills/facial-and-lipsync/SKILL.md +1 -1
  188. package/library/skills/fps-controller/SKILL.md +9 -7
  189. package/library/skills/fps-controller/resource.yaml +4 -1
  190. package/library/skills/game-feel/SKILL.md +1 -1
  191. package/library/skills/gameskill/SKILL.md +1 -1
  192. package/library/skills/gdscript-patterns/SKILL.md +1 -1
  193. package/library/skills/generate-motion/SKILL.md +9 -9
  194. package/library/skills/generate-motion/resource.yaml +2 -1
  195. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +1 -1
  196. package/library/skills/headless-scripting/SKILL.md +1 -1
  197. package/library/skills/in-game-purchases/SKILL.md +254 -0
  198. package/library/skills/in-game-purchases/resource.yaml +29 -0
  199. package/library/skills/instantiate-asset-pack/SKILL.md +1 -1
  200. package/library/skills/investigating-bugs/SKILL.md +1 -1
  201. package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +1 -1
  202. package/library/skills/make-game/SKILL.md +25 -3
  203. package/library/skills/make-game/references/2d-platformer-polish.md +93 -0
  204. package/library/skills/make-game/references/2d-platformer.md +117 -0
  205. package/library/skills/make-game/references/2d-rpg-content.md +234 -0
  206. package/library/skills/make-game/references/2d-rpg.md +241 -0
  207. package/library/skills/make-game/references/2d-survivors-progression.md +201 -0
  208. package/library/skills/make-game/references/2d-survivors.md +237 -0
  209. package/library/skills/make-game/references/3d-fps-systems.md +216 -0
  210. package/library/skills/make-game/references/3d-fps.md +177 -0
  211. package/library/skills/make-game/references/3d-horror-systems.md +186 -0
  212. package/library/skills/make-game/references/3d-horror.md +201 -0
  213. package/library/skills/make-game/references/3d-third-person-systems.md +220 -0
  214. package/library/skills/make-game/references/3d-third-person.md +215 -0
  215. package/library/skills/make-game/resource.yaml +6 -1
  216. package/library/skills/multiplayer/SKILL.md +150 -0
  217. package/library/skills/multiplayer/resource.yaml +33 -0
  218. package/library/skills/multiplayer-movement/SKILL.md +510 -0
  219. package/library/skills/multiplayer-movement/files.md +501 -0
  220. package/library/skills/multiplayer-movement/resource.yaml +30 -0
  221. package/library/skills/multiplayer-project/SKILL.md +521 -0
  222. package/library/skills/multiplayer-project/files.md +448 -0
  223. package/library/skills/multiplayer-project/resource.yaml +36 -0
  224. package/library/skills/multiplayer-publish/SKILL.md +229 -0
  225. package/library/skills/multiplayer-publish/export-errors.md +89 -0
  226. package/library/skills/multiplayer-publish/resource.yaml +28 -0
  227. package/library/skills/multiplayer-state/SKILL.md +438 -0
  228. package/library/skills/multiplayer-state/files.md +592 -0
  229. package/library/skills/multiplayer-state/resource.yaml +35 -0
  230. package/library/skills/multiplayer-testing/SKILL.md +236 -0
  231. package/library/skills/multiplayer-testing/resource.yaml +39 -0
  232. package/library/skills/music-track/SKILL.md +1 -1
  233. package/library/skills/navigate-summer/SKILL.md +1 -1
  234. package/library/skills/new-project/SKILL.md +1 -1
  235. package/library/skills/organic-model/SKILL.md +1 -1
  236. package/library/skills/pixel-art/SKILL.md +1 -1
  237. package/library/skills/play/SKILL.md +1 -1
  238. package/library/skills/playtesting-a-feature/SKILL.md +1 -1
  239. package/library/skills/procedural-animation/SKILL.md +2 -2
  240. package/library/skills/procedural-animation/resource.yaml +1 -1
  241. package/library/skills/prop-model/SKILL.md +1 -1
  242. package/library/skills/psx-retro-rendering/SKILL.md +1 -1
  243. package/library/skills/realtime-wet-surfaces/SKILL.md +2 -2
  244. package/library/skills/remote-deploy/SKILL.md +1 -1
  245. package/library/skills/retarget/SKILL.md +1 -1
  246. package/library/skills/running-in-the-cloud/SKILL.md +1 -1
  247. package/library/skills/save-load/SKILL.md +156 -0
  248. package/library/skills/save-load/resource.yaml +27 -0
  249. package/library/skills/scene-composition/SKILL.md +1 -1
  250. package/library/skills/scene-hierarchy-design/SKILL.md +1 -1
  251. package/library/skills/scene-scripting/SKILL.md +1 -1
  252. package/library/skills/scene-to-level/SKILL.md +1 -1
  253. package/library/skills/skill-create/SKILL.md +1 -1
  254. package/library/skills/skill-improve/SKILL.md +1 -1
  255. package/library/skills/skill-test/SKILL.md +1 -1
  256. package/library/skills/skintokens-auto-rigging/SKILL.md +1 -1
  257. package/library/skills/skybox-panorama/SKILL.md +1 -1
  258. package/library/skills/sound-effect/SKILL.md +1 -1
  259. package/library/skills/spatial-placement/SKILL.md +134 -3
  260. package/library/skills/spatial-placement/references/kit-placement-tools.md +364 -0
  261. package/library/skills/spatial-placement/resource.yaml +16 -2
  262. package/library/skills/sprite-sheet/SKILL.md +1 -1
  263. package/library/skills/summer-analytics/SKILL.md +147 -0
  264. package/library/skills/summer-analytics/resource.yaml +28 -0
  265. package/library/skills/summer-friends/SKILL.md +226 -0
  266. package/library/skills/summer-friends/resource.yaml +28 -0
  267. package/library/skills/summer-leaderboards/SKILL.md +231 -0
  268. package/library/skills/summer-leaderboards/resource.yaml +30 -0
  269. package/library/skills/summer-match-results/SKILL.md +286 -0
  270. package/library/skills/summer-match-results/resource.yaml +32 -0
  271. package/library/skills/summer-matchmaking/SKILL.md +301 -0
  272. package/library/skills/summer-matchmaking/resource.yaml +32 -0
  273. package/library/skills/summer-parties/SKILL.md +253 -0
  274. package/library/skills/summer-parties/resource.yaml +30 -0
  275. package/library/skills/summer-player-data/SKILL.md +322 -0
  276. package/library/skills/summer-player-data/resource.yaml +30 -0
  277. package/library/skills/summer-store/SKILL.md +271 -0
  278. package/library/skills/summer-store/resource.yaml +29 -0
  279. package/library/skills/summer-world-chat/SKILL.md +195 -0
  280. package/library/skills/summer-world-chat/resource.yaml +30 -0
  281. package/library/skills/summer-world-saves/SKILL.md +284 -0
  282. package/library/skills/summer-world-saves/resource.yaml +29 -0
  283. package/library/skills/text-to-motion/SKILL.md +99 -0
  284. package/library/skills/text-to-motion/prompts-and-controls.md +34 -0
  285. package/library/skills/text-to-motion/resource.yaml +41 -0
  286. package/library/skills/text-to-motion/rigging-for-text-motion.md +54 -0
  287. package/library/skills/tileable-texture/SKILL.md +1 -1
  288. package/library/skills/trailer-shot/SKILL.md +1 -1
  289. package/library/skills/tune-performance/SKILL.md +1 -1
  290. package/library/skills/ui-basics/SKILL.md +10 -1
  291. package/library/skills/ui-graphics/SKILL.md +1 -1
  292. package/library/skills/use-widget-asset/SKILL.md +1 -1
  293. package/library/skills/using-summer/SKILL.md +2 -2
  294. package/library/skills/using-summer/resource.yaml +2 -2
  295. package/library/skills/vehicle-model/SKILL.md +1 -1
  296. package/library/skills/verification-before-completion/SKILL.md +1 -1
  297. package/library/skills/verifying-scenes/SKILL.md +76 -2
  298. package/library/skills/verifying-scenes/resource.yaml +13 -2
  299. package/library/skills/vfx-dissolve/SKILL.md +1 -1
  300. package/library/skills/vfx-fire/SKILL.md +1 -1
  301. package/library/skills/vfx-hit-spark/SKILL.md +1 -1
  302. package/library/skills/vfx-lightning/SKILL.md +1 -1
  303. package/library/skills/vfx-magic-glow/SKILL.md +1 -1
  304. package/library/skills/vfx-muzzle-flash/SKILL.md +1 -1
  305. package/library/skills/vfx-smoke/SKILL.md +1 -1
  306. package/library/skills/vfx-water-ripple/SKILL.md +1 -1
  307. package/library/skills/voice-line/SKILL.md +1 -1
  308. package/library/skills/web-and-touch-input/SKILL.md +38 -0
  309. package/library/skills/web-and-touch-input/resource.yaml +28 -0
  310. package/library/skills/web-compatibility-look/SKILL.md +62 -0
  311. package/library/skills/web-compatibility-look/resource.yaml +30 -0
  312. package/library/skills/world-building-3d/SKILL.md +8 -1
  313. package/library/skills/world-building-3d/references/spatial-tools.md +1 -1
  314. package/library/skills/world-building-3d/resource.yaml +2 -1
  315. package/library/skills/writing-plans/SKILL.md +1 -1
  316. package/library/skills/writing-skills/SKILL.md +1 -1
  317. package/library/templates/3d-lan-multiplayer-starter/resource.yaml +2 -2
  318. package/library/tools/attach-to-surface/resource.yaml +142 -0
  319. package/library/tools/batch/resource.yaml +9 -3
  320. package/library/tools/connect-ports/resource.yaml +120 -0
  321. package/library/tools/connect-signal/resource.yaml +3 -2
  322. package/library/tools/debug-views/resource.yaml +94 -0
  323. package/library/tools/frame-nodes/resource.yaml +104 -0
  324. package/library/tools/frame-shot/resource.yaml +134 -0
  325. package/library/tools/generate-motion/resource.yaml +44 -9
  326. package/library/tools/get-board/resource.yaml +50 -0
  327. package/library/tools/get-project-context/resource.yaml +13 -2
  328. package/library/tools/grep/resource.yaml +77 -0
  329. package/library/tools/inspect-asset/resource.yaml +71 -0
  330. package/library/tools/inspect-node/resource.yaml +9 -2
  331. package/library/tools/inspect-resource/resource.yaml +16 -5
  332. package/library/tools/instantiate-scene/resource.yaml +27 -2
  333. package/library/tools/measure/resource.yaml +96 -0
  334. package/library/tools/place-adjacent/resource.yaml +113 -0
  335. package/library/tools/play/resource.yaml +15 -2
  336. package/library/tools/raycast/resource.yaml +101 -0
  337. package/library/tools/read-file/resource.yaml +36 -2
  338. package/library/tools/read-library/resource.yaml +2 -2
  339. package/library/tools/repeat-along/resource.yaml +129 -0
  340. package/library/tools/replace-node/resource.yaml +11 -5
  341. package/library/tools/scene-audit/resource.yaml +144 -0
  342. package/library/tools/screenshot/resource.yaml +13 -2
  343. package/library/tools/search-assets/resource.yaml +18 -0
  344. package/library/tools/shot-sheet/resource.yaml +110 -0
  345. package/library/tools/snap-to-surface/resource.yaml +4 -1
  346. package/library/tools/world-snapshot/resource.yaml +24 -3
  347. package/library/tools/zoom/resource.yaml +105 -0
  348. package/package.json +1 -1
  349. package/registry/generated/aliases.json +17 -3
  350. package/registry/generated/counts.json +3 -3
  351. package/registry/generated/gemini-extension.json +26 -4
  352. package/registry/generated/index.json +2154 -469
  353. package/registry/generated/marketplace.claude.json +2 -2
  354. package/registry/generated/plugin.claude.json +27 -5
  355. package/registry/generated/plugin.codex.json +28 -6
  356. package/registry/generated/plugin.cursor.json +27 -5
  357. package/registry/generated/plugin.factory.json +27 -5
  358. package/registry/generated/skills-index.md +36 -14
  359. package/registry/generated/skills-registry.json +421 -124
  360. package/registry/generated/templates-registry.json +2 -2
  361. package/library/skills/host-authoritative-state/SKILL.md +0 -332
  362. package/library/skills/host-authoritative-state/resource.yaml +0 -28
  363. package/library/skills/peer-to-peer-multiplayer/SKILL.md +0 -373
  364. package/library/skills/peer-to-peer-multiplayer/resource.yaml +0 -28
  365. package/library/skills/setup-multiplayer/SKILL.md +0 -336
  366. package/library/skills/setup-multiplayer/resource.yaml +0 -28
@@ -0,0 +1,448 @@
1
+ # multiplayer-project: complete files
2
+
3
+ Every file below ran as shown under Local Play. Compare against your project, or copy a file whole.
4
+
5
+ ## `authority/main.gd`
6
+
7
+ ```gdscript
8
+ extends Node
9
+ ## The match server. It runs headless and owns every rule.
10
+
11
+ const Game = preload("res://network/game.gd")
12
+ const PlayerArchetype = preload("res://authority/player_archetype.tres")
13
+
14
+ var spawner: SummerNetworkSpawner
15
+ var world: SummerNetworkWorld
16
+ var seat_of := {} # session_id -> seat, held until the Session leaves
17
+
18
+
19
+ func _ready() -> void:
20
+ spawner = Game.build_network(self, PlayerArchetype)
21
+ world = $World
22
+ spawner.entity_spawned.connect(_on_player_spawned)
23
+ spawner.command_received.connect(_on_command)
24
+ world.session_left.connect(_on_session_left)
25
+ var initialized: SummerResult = await Summer.initialize(Game.GAME_ID).get_result_or_completed_signal()
26
+ if not initialized.ok:
27
+ push_error(initialized.message)
28
+ return
29
+ if not world.is_ready():
30
+ await world.binding_ready
31
+ if not spawner.is_network_ready():
32
+ await spawner.network_ready
33
+ print("COURTYARD_AUTHORITY_READY")
34
+
35
+
36
+ ## A seat is a player's place in this World for their whole stay, across
37
+ ## reconnects. Returns -1 when the World is full.
38
+ func _seat(session: SummerSession) -> int:
39
+ if seat_of.has(session.session_id):
40
+ return seat_of[session.session_id]
41
+ var taken := seat_of.values()
42
+ for seat in Game.MAX_PLAYERS:
43
+ if seat not in taken:
44
+ seat_of[session.session_id] = seat
45
+ return seat
46
+ return -1
47
+
48
+
49
+ ## The Spawner spawns one player entity per joined player, once that player's
50
+ ## network is ready (and again after a reconnect).
51
+ func _on_player_spawned(entity: SummerNetworkEntity) -> void:
52
+ print("COURTYARD_PLAYER_SPAWNED seat=%d entity=%d" % [_seat(entity.session), entity.entity_id])
53
+
54
+
55
+ func _on_command(request: SummerNetworkCommandRequest) -> void:
56
+ var command := Game.unpack(request.payload)
57
+ match str(command.get("c", "")):
58
+ "join":
59
+ _join(request)
60
+ _:
61
+ request.refuse(&"unknown_command")
62
+
63
+
64
+ ## A client sends "join" once its network is ready.
65
+ func _join(request: SummerNetworkCommandRequest) -> void:
66
+ var seat := _seat(request.get_session())
67
+ if seat < 0:
68
+ request.refuse(&"match_full")
69
+ return
70
+ request.accept({}, Game.pack({"seat": seat}))
71
+ print("COURTYARD_PLAYER_JOINED seat=%d" % seat)
72
+
73
+
74
+ ## The Session ended for good: free the seat and everything the player had.
75
+ func _on_session_left(session: SummerSession, reason: String) -> void:
76
+ var seat: int = seat_of.get(session.session_id, -1)
77
+ seat_of.erase(session.session_id)
78
+ print("COURTYARD_PLAYER_LEFT seat=%d reason=%s" % [seat, reason])
79
+ ```
80
+
81
+ ## `authority/main.tscn`
82
+
83
+ ```ini
84
+ [gd_scene load_steps=2 format=3]
85
+
86
+ [ext_resource type="Script" path="res://authority/main.gd" id="1"]
87
+
88
+ [node name="Authority" type="Node"]
89
+ script = ExtResource("1")
90
+ ```
91
+
92
+ ## `authority/player_archetype.tres`
93
+
94
+ ```ini
95
+ [gd_resource type="SummerEntityArchetype" load_steps=3 format=3]
96
+
97
+ [ext_resource type="SummerNetworkSchema" path="res://network/player_schema.tres" id="1"]
98
+ [ext_resource type="PackedScene" path="res://authority/player_model.tscn" id="2"]
99
+
100
+ [resource]
101
+ archetype_id = &"player"
102
+ network_schema = ExtResource("1")
103
+ authority_model_scene = ExtResource("2")
104
+ ```
105
+
106
+ ## `authority/player_model.tscn`
107
+
108
+ ```ini
109
+ [gd_scene format=3]
110
+
111
+ [node name="PlayerModel" type="Node3D"]
112
+ ```
113
+
114
+ ## `client/main.gd`
115
+
116
+ ```gdscript
117
+ extends Node
118
+ ## What each player runs: joins the match and shows every player.
119
+
120
+ const Game = preload("res://network/game.gd")
121
+ const PlayerArchetype = preload("res://client/player_archetype.tres")
122
+
123
+ var spawner: SummerNetworkSpawner
124
+
125
+
126
+ func _ready() -> void:
127
+ spawner = Game.build_network(self, PlayerArchetype)
128
+ # Connect signals like state_group_created here, before joining, or values
129
+ # that arrive during the join go unseen (multiplayer-movement adds them).
130
+ var initialized: SummerResult = await Summer.initialize(Game.GAME_ID).get_result_or_completed_signal()
131
+ if not initialized.ok:
132
+ push_error(initialized.message)
133
+ return
134
+ var join := Summer.client.join(SummerJoinTarget.queue(Game.QUEUE))
135
+ # Hosted matchmaking may ask the player to accept a match.
136
+ join.acceptance_required.connect(func(proposal: SummerMatchmakingProposal) -> void: proposal.accept())
137
+ var joined: SummerResult = await join.get_result_or_completed_signal()
138
+ if not joined.ok:
139
+ push_error("join failed: %s %s" % [joined.code, joined.message])
140
+ return
141
+ if not spawner.is_network_ready():
142
+ await spawner.network_ready
143
+ var entered := await command({"c": "join"})
144
+ if not entered.ok:
145
+ push_error("could not enter the match: %s" % entered.error)
146
+ return
147
+ print("COURTYARD_CLIENT_JOINED")
148
+
149
+
150
+ ## Sends one Command and waits for the authority's answer.
151
+ func command(payload: Dictionary) -> Dictionary:
152
+ var admission := spawner.enqueue_command(Game.CMD, Game.pack(payload))
153
+ if not admission.is_enqueued():
154
+ return {"ok": false, "error": String(admission.get_code())}
155
+ var handle := admission.get_handle()
156
+ if not handle.is_terminal():
157
+ await handle.completed
158
+ if handle.get_outcome() == SummerNetworkCommandHandle.OUTCOME_ACCEPTED:
159
+ return {"ok": true, "error": "", "result": Game.unpack(handle.get_result())}
160
+ return {"ok": false, "error": String(handle.get_reason())}
161
+ ```
162
+
163
+ ## `client/main.tscn`
164
+
165
+ ```ini
166
+ [gd_scene load_steps=5 format=3]
167
+
168
+ [ext_resource type="Script" path="res://client/main.gd" id="1"]
169
+
170
+ [sub_resource type="BoxShape3D" id="FloorShape"]
171
+ size = Vector3(80, 1, 80)
172
+
173
+ [sub_resource type="BoxMesh" id="FloorMesh"]
174
+ size = Vector3(80, 1, 80)
175
+
176
+ [node name="Main" type="Node"]
177
+ script = ExtResource("1")
178
+
179
+ [node name="Floor" type="StaticBody3D" parent="."]
180
+ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0)
181
+
182
+ [node name="Shape" type="CollisionShape3D" parent="Floor"]
183
+ shape = SubResource("FloorShape")
184
+
185
+ [node name="Mesh" type="MeshInstance3D" parent="Floor"]
186
+ mesh = SubResource("FloorMesh")
187
+
188
+ [node name="Sun" type="DirectionalLight3D" parent="."]
189
+ transform = Transform3D(1, 0, 0, 0, 0.5, 0.866, 0, -0.866, 0.5, 0, 10, 0)
190
+ ```
191
+
192
+ ## `client/player_archetype.tres`
193
+
194
+ ```ini
195
+ [gd_resource type="SummerEntityArchetype" load_steps=4 format=3]
196
+
197
+ [ext_resource type="SummerNetworkSchema" path="res://network/player_schema.tres" id="1"]
198
+ [ext_resource type="PackedScene" path="res://client/player_owner.tscn" id="2"]
199
+ [ext_resource type="PackedScene" path="res://client/player_observer.tscn" id="3"]
200
+
201
+ [resource]
202
+ archetype_id = &"player"
203
+ network_schema = ExtResource("1")
204
+ owner_projection_scene = ExtResource("2")
205
+ observer_projection_scene = ExtResource("3")
206
+ ```
207
+
208
+ ## `client/player_observer.tscn`
209
+
210
+ ```ini
211
+ [gd_scene load_steps=2 format=3]
212
+
213
+ [sub_resource type="CapsuleMesh" id="Mesh"]
214
+
215
+ [node name="PlayerObserver" type="Node3D"]
216
+
217
+ [node name="Body" type="MeshInstance3D" parent="."]
218
+ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
219
+ mesh = SubResource("Mesh")
220
+ ```
221
+
222
+ ## `client/player_owner.tscn`
223
+
224
+ ```ini
225
+ [gd_scene load_steps=3 format=3]
226
+
227
+ [sub_resource type="CapsuleShape3D" id="Shape"]
228
+
229
+ [sub_resource type="CapsuleMesh" id="Mesh"]
230
+
231
+ [node name="PlayerOwner" type="CharacterBody3D"]
232
+
233
+ [node name="Shape" type="CollisionShape3D" parent="."]
234
+ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
235
+ shape = SubResource("Shape")
236
+
237
+ [node name="Body" type="MeshInstance3D" parent="."]
238
+ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
239
+ mesh = SubResource("Mesh")
240
+
241
+ [node name="Camera3D" type="Camera3D" parent="."]
242
+ transform = Transform3D(1, 0, 0, 0, 0.8, 0.6, 0, -0.6, 0.8, 0, 6, 8)
243
+ current = true
244
+ ```
245
+
246
+ ## `network/composition.tres`
247
+
248
+ ```ini
249
+ [gd_resource type="SummerNetworkComposition" load_steps=6 format=3]
250
+
251
+ [sub_resource type="SummerNetworkField" id="CommandBytes"]
252
+ field_name = &"b"
253
+ type = 20
254
+
255
+ [sub_resource type="SummerNetworkSchema" id="CommandSchema"]
256
+ schema_id = &"courtyard.cmd.v1"
257
+ state_fields = Array[SummerNetworkField]([SubResource("CommandBytes")])
258
+
259
+ [sub_resource type="SummerNetworkField" id="ResultBytes"]
260
+ field_name = &"b"
261
+ type = 20
262
+
263
+ [sub_resource type="SummerNetworkSchema" id="ResultSchema"]
264
+ schema_id = &"courtyard.cmd.result.v1"
265
+ state_fields = Array[SummerNetworkField]([SubResource("ResultBytes")])
266
+
267
+ [sub_resource type="SummerNetworkOccurrenceStream" id="Commands"]
268
+ stream_id = &"courtyard.cmd"
269
+ command_scope = 2
270
+ command_tick_dispatch = true
271
+ command_timeout_msec = 8000
272
+ payload_schema = SubResource("CommandSchema")
273
+ result_schema = SubResource("ResultSchema")
274
+
275
+ [resource]
276
+ network_version = "1.0.0"
277
+ occurrence_streams = Array[SummerNetworkOccurrenceStream]([SubResource("Commands")])
278
+ ```
279
+
280
+ ## `network/game.gd`
281
+
282
+ ```gdscript
283
+ extends RefCounted
284
+ ## Shared by the client and the authority: ids, streams and shared rules.
285
+
286
+ const GAME_ID := "game_courtyard"
287
+ const QUEUE := &"courtyard"
288
+ const CMD := &"courtyard.cmd"
289
+ const MAX_PLAYERS := 8
290
+ const COMPOSITION := preload("res://network/composition.tres")
291
+
292
+
293
+ ## Adds the World, an Entities root and the Spawner under `parent`. Both sides
294
+ ## pass their own player archetype; the composition is the same file.
295
+ static func build_network(parent: Node, player: SummerEntityArchetype) -> SummerNetworkSpawner:
296
+ var world := SummerNetworkWorld.new()
297
+ world.name = "World"
298
+ parent.add_child(world)
299
+ var entities := Node3D.new()
300
+ entities.name = "Entities"
301
+ parent.add_child(entities)
302
+ var spawner := SummerNetworkSpawner.new()
303
+ spawner.name = "Spawner"
304
+ spawner.network_world_path = NodePath("../World")
305
+ spawner.entities_root_path = NodePath("../Entities")
306
+ spawner.archetypes = [player]
307
+ spawner.player_archetype = &"player" # one entity per joined player
308
+ spawner.network_composition = COMPOSITION
309
+ parent.add_child(spawner)
310
+ return spawner
311
+
312
+
313
+ ## Commands and results travel as JSON bytes: a network String holds at most
314
+ ## 256 bytes.
315
+ static func pack(document: Dictionary) -> Dictionary:
316
+ return {"b": JSON.stringify(document).to_utf8_buffer()}
317
+
318
+
319
+ static func unpack(fields: Dictionary) -> Dictionary:
320
+ var parsed: Variant = JSON.parse_string((fields.get("b", PackedByteArray()) as PackedByteArray).get_string_from_utf8())
321
+ return parsed if parsed is Dictionary else {}
322
+ ```
323
+
324
+ ## `network/player_schema.tres`
325
+
326
+ ```ini
327
+ [gd_resource type="SummerNetworkSchema" format=3]
328
+
329
+ [resource]
330
+ schema_id = &"courtyard.player.v1"
331
+ ```
332
+
333
+ ## `project.godot`
334
+
335
+ ```ini
336
+ config_version=5
337
+
338
+ [application]
339
+
340
+ config/name="Courtyard"
341
+ run/main_scene="res://client/main.tscn"
342
+ run/main_scene.summer_client="res://client/main.tscn"
343
+ run/main_scene.summer_authority="res://authority/main.tscn"
344
+
345
+ [rendering]
346
+
347
+ textures/vram_compression/import_etc2_astc=true
348
+ ```
349
+
350
+ ## `runtime-manifest.json`
351
+
352
+ ```json
353
+ {
354
+ "profile": "headless_engine",
355
+ "entry_point": "authority/main.tscn",
356
+ "export_preset": "Courtyard Authority"
357
+ }
358
+ ```
359
+
360
+ ## `source-domains.json`
361
+
362
+ ```json
363
+ {
364
+ "schema": "summer.source-domain-graph.v1",
365
+ "roots": [
366
+ { "domain": "shared", "paths": ["project.godot", "network", "world.json", "runtime-manifest.json"] },
367
+ { "domain": "client", "paths": ["client"] },
368
+ { "domain": "authority_engine", "paths": ["authority"] }
369
+ ],
370
+ "dependencies": []
371
+ }
372
+ ```
373
+
374
+ ## `summer.build.json`
375
+
376
+ ```json
377
+ {
378
+ "schema": "summer.build.v2",
379
+ "gameId": "game_courtyard",
380
+ "executionMode": "hosted",
381
+ "targetPlatforms": ["ios", "macos"],
382
+ "project": { "directory": "." },
383
+ "server": { "exportPreset": "Courtyard Authority" },
384
+ "runtime": {
385
+ "protocolVersion": "1.0.0",
386
+ "interfaces": {
387
+ "multiplayer": 6, "session": 3, "lobby": 3, "presence": 3,
388
+ "config": 3, "party": 1, "matchSearch": 1
389
+ },
390
+ "scenes": ["res://client/main.tscn"],
391
+ "worldDefinitions": ["world.json"],
392
+ "queues": [
393
+ {
394
+ "name": "courtyard",
395
+ "minPlayers": 2,
396
+ "maxPlayers": 8,
397
+ "worldDefinition": "courtyard",
398
+ "policy": "fifo",
399
+ "transport": "enet"
400
+ }
401
+ ],
402
+ "tickRate": 60,
403
+ "config": { "keys": {} },
404
+ "presence": { "tokens": {} },
405
+ "lobby": { "fields": {} },
406
+ "server": { "tier": "small" }
407
+ }
408
+ }
409
+ ```
410
+
411
+ ## `world.json`
412
+
413
+ ```json
414
+ {
415
+ "schema": "summer.world-definition.v1",
416
+ "definition_id": "courtyard",
417
+ "lifetime": "match_scoped",
418
+ "topology": "dedicated",
419
+ "client_entry_point": "res://client/main.tscn",
420
+ "components": [
421
+ {
422
+ "component_id": "match",
423
+ "profile": "headless_engine",
424
+ "runtime_descriptor": "runtime-manifest.json",
425
+ "entry_point": "authority/main.tscn",
426
+ "owns": ["match"]
427
+ }
428
+ ],
429
+ "source_graph": "source-domains.json",
430
+ "network_compositions": ["res://network/composition.tres"],
431
+ "services": { "required": [], "optional": [] },
432
+ "settlement": { "mode": "required", "version": 1 },
433
+ "persistence": {
434
+ "mode": "none",
435
+ "recovery_point_seconds": 0,
436
+ "snapshot_schemas": [],
437
+ "migration_ids": []
438
+ },
439
+ "lifecycle": {
440
+ "reconnect_seconds": 30,
441
+ "drain_seconds": 5,
442
+ "transfer": "disabled",
443
+ "completion_owner": "world"
444
+ },
445
+ "placement": { "region_policy": "nearest" },
446
+ "limits_profile": "default"
447
+ }
448
+ ```
@@ -0,0 +1,36 @@
1
+ id: skill/multiplayer-project
2
+ kind: skill
3
+ version: 1.0.0
4
+ summary: "Set up a Summer multiplayer project: both entry scenes, World and queue files, joining, and a first Local Play run."
5
+ use_when:
6
+ - "making a Summer game playable online or co-op: the first multiplayer setup"
7
+ - "adding multiplayer to a Summer game: the client and authority scenes, summer.build.json, world.json and joining a queue"
8
+ - "a Summer multiplayer project has no summer.build.json or world.json yet, or Local Play cannot find the World"
9
+ - "laying out a multiplayer project in client/, authority/ and network/ folders"
10
+ facets:
11
+ lifecycle:
12
+ - build
13
+ domains:
14
+ - multiplayer
15
+ - project
16
+ - scripting
17
+ modalities:
18
+ - scripts
19
+ - scenes
20
+ - project
21
+ compatibility:
22
+ engine: ">=4.6"
23
+ related:
24
+ skills:
25
+ - skill/multiplayer
26
+ - skill/multiplayer-movement
27
+ - skill/multiplayer-state
28
+ - skill/multiplayer-testing
29
+ - skill/multiplayer-publish
30
+ - skill/summer-matchmaking
31
+ - skill/summer-parties
32
+ - skill/summer-world-saves
33
+ source: official
34
+ license: MIT
35
+ status: stable
36
+ recommended: false