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,220 @@
1
+ ---
2
+ name: ai-characters-in-games
3
+ description: "Safe AI characters in published games: no keys in the build, replies via Summer's player AI gateway, moderation, spend caps, offline brain and a report button."
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: ai-and-npcs
7
+ user-invocable: true
8
+ allowed-tools: Read Grep Edit Write summer_get_scene_tree summer_add_node summer_set_prop summer_connect_signal summer_save_scene summer_get_script_errors
9
+ paths: ["**/*.gd", "**/*.tscn"]
10
+ ---
11
+
12
+ # AI Characters in Games
13
+
14
+ ## Overview
15
+
16
+ A talking flower, a shopkeeper who answers questions, a companion who reacts to what the player says. Players, often children, type or speak to it and it answers in character.
17
+
18
+ **Core principle:** the game never talks to an AI provider. It asks Summer, as the signed-in player, for a reply from a persona the developer declared. Summer holds the keys (you never bring your own), moderates both directions, charges the cost to the developer's Summer credits and can switch the feature off per game. The game treats every AI answer as optional flavour on top of an offline brain that always works.
19
+
20
+ **Status: preview.** `Summer.client.ai` ships with an upcoming Summer Engine release. The example checks for it at runtime and reads the `capabilities` of `status()` before using a call, and uses the offline brain whenever either is missing, so a game written this way ships today and gains AI replies when the platform turns them on.
21
+
22
+ ## When to use
23
+
24
+ - A character, creature or object answers free-form player text or speech.
25
+ - You are about to put a model name, a provider SDK or a key into a game project. Stop and use this instead.
26
+
27
+ Not for scripted dialogue trees (design-npc) or for enemy behaviour.
28
+
29
+ ## The rules, and why
30
+
31
+ | Rule | Why |
32
+ | --- | --- |
33
+ | No provider key, provider URL or provider SDK in the project | Anything in a build can be extracted. A leaked key is spent by strangers on your account, and there is no way to take it back from builds already installed. |
34
+ | Call the Summer gateway as the player | The player's own credential identifies who is talking, so limits, age policy and reports attach to a real person, not to the game. |
35
+ | Personas live in the game's AI settings; the game sends only a persona id | If the client could send system text, anyone could turn your flower into a general chatbot. Persona text is moderated when the developer saves it. |
36
+ | History is kept by the gateway | A client that sends its own history can forge what the character "said" before. Send a conversation id instead. |
37
+ | Moderation runs on player text and on the reply, and fails closed | Young audience. A flagged turn returns the persona's safe line (`moderated: true`); show it like any other reply. |
38
+ | Handle every refusal code by falling back, never by retrying in a loop | The limit and the kill switch are how cost and incidents are contained. A retry loop turns them into spend and noise. |
39
+ | Hold-to-talk plus a typed box | Many players cannot or will not use a microphone. Speech is transcribed to text and then goes through the same reply path. |
40
+ | Offline brain always present | The gateway can be off, over its limit, unavailable for the player's age or unreachable. The game must still be good. |
41
+ | AI replies never change game state directly | A model can be talked into anything. If a reply should matter (a mood, a gift), derive a small bounded effect from the player's words on the authority, the same way the offline brain does. |
42
+ | A report button on every AI reply | App store rules for user-facing generated content. The report names the exchange id, so the stored text is the evidence, not a screenshot. |
43
+ | Never ask for or keep personal details | Summer strips contact details before the model sees them; do not store transcripts in saves either. |
44
+ | Label AI characters as AI | Players must know they are talking to generated replies (EU AI Act transparency duties apply from August 2026). A small "AI" tag on the bubble is enough; store listings such as Steam also ask you to disclose live-generated content. |
45
+ | Ask before using the microphone, and say audio is not stored | Consent is expected, and it is true: Summer transcribes and discards the clip. |
46
+ | No voice cloning or speaker identification on player audio | Biometric laws (for example Illinois BIPA) treat voiceprints as protected data. Characters speak only in voices you chose. |
47
+ | Keep characters off mental health, self-harm and romance | Companion-chatbot rules (for example California SB 243) target exactly these. Write it into the persona description and rely on the safe line. |
48
+
49
+ ## Top up and set limits
50
+
51
+ AI characters are paid from the Summer credits of the developer who turned them on: usage is billed from your Summer credits. Cost depends on the models and voices you choose. Your dashboard shows spend as it happens, and your limits cap it. Players never pay. There is nothing to configure in the game project.
52
+
53
+ 1. In Summer Studio, open the game and its **AI characters** section.
54
+ 2. Add a persona per character: name, a plain-words description, an optional voice, reply length, a safe line in character, and the model (from the models the game allows, each marked fast or smart).
55
+ 3. Set limits per player per day, per game per day and per month, optional per-model caps, and the refill amount; see your dashboard for the ranges.
56
+ 4. Turn **Enable** on. Saving makes you the funding developer: Summer moves your credits into the game's AI balance in refill-sized chunks as it runs low.
57
+ 5. Top up credits from the billing page when the balance is low. **Withdraw unused AI credits** returns what no call has reserved.
58
+
59
+ When credits or a limit run out, players get `credits_exhausted` or `limit_exceeded` and the game falls back to its offline brain; nothing crashes. **Enable** off is the kill switch and applies to the next request. Children and players who have not declared an age are excluded.
60
+
61
+ ## The SDK
62
+
63
+ `Summer.client.ai` exists only on engines that include it; everywhere else it is `null`. Every method returns a `SummerOperation`. Await it race-free:
64
+
65
+ ```gdscript
66
+ var op: Object = ai.reply(persona_id, text)
67
+ var r: SummerResult = await op.get_result_or_completed_signal()
68
+ ```
69
+
70
+ `r.ok`, `r.code` and `r.retryable` say how it went; the answer itself is on the operation, a `SummerAIOperation` (`op.text`, `op.audio`, ...), because replies and voice clips are larger than a result's `details`. Type it as `Object` so the script still parses on engines without that class. The engine creates request ids itself.
71
+
72
+ | Call | Set on the operation on success |
73
+ | --- | --- |
74
+ | `status()` | `available: bool`, `reason: String` (`""` or one of the failure codes below: `ai_disabled`, `age_policy`, `credits_exhausted`, `limit_exceeded`, `unavailable`, `unsupported`), `personas: Array` of `{id, name, has_voice}`, `capabilities: PackedStringArray` (`"reply"`, `"transcribe"`, `"speak"`, `"report"`), `version: String`. `status` never fails for policy reasons. |
75
+ | `reply(persona_id, text, conversation_id = "")` | `exchange_id`, `persona_id`, `text`, `moderated: bool`. `text` is 1 to 500 characters. |
76
+ | `transcribe(audio: PackedByteArray, mime_type, language = "")` | `text`. At most 240 KiB and 15 seconds (compressed `audio/ogg` or `audio/webm` fits more speech than WAV), as `audio/wav`, `audio/ogg`, `audio/mpeg`, `audio/webm` or `audio/mp4`. Audio is not stored. |
77
+ | `speak(exchange_id)` | `exchange_id`, `mime_type` (`audio/mpeg`), `audio: PackedByteArray`. Only the player's own reply, within an hour of it. Voice is the largest cost: speak only for personas with `has_voice`, and consider voicing on tap. |
78
+ | `report(exchange_id, reason, details = "")` | `report_id`, `status`. The player's own reply, within 30 days. |
79
+
80
+ `moderated: true` is not an error: the persona's safe line replaced the answer. Show it like any reply. Names are snake_case in GDScript (`op.exchange_id`, `persona.has_voice`). After `limit_exceeded` or `rate_limited`, `op.retry_after_seconds` says when asking again can succeed.
81
+
82
+ In multiplayer, never broadcast text a client sent you. The dedicated authority verifies the exchange and broadcasts the text Summer returns:
83
+
84
+ ```gdscript
85
+ var ai: Object = Summer.authority.get("ai")
86
+ var check: Object = ai.verify_exchange(session, exchange_id)
87
+ var r: SummerResult = await check.get_result_or_completed_signal()
88
+ if r.ok:
89
+ broadcast_line(check.persona_id, check.text) # exactly what that player was shown; check.player_id said it
90
+ # not_found: forged, another player's, or older than an hour. Drop it.
91
+ ```
92
+
93
+ Failure codes (`r.ok == false`):
94
+
95
+ | Code | Meaning | Game does |
96
+ | --- | --- | --- |
97
+ | `ai_disabled` | AI is switched off for this game | Offline brain for the session |
98
+ | `age_policy` | Child or undeclared age | Offline brain for the session |
99
+ | `credits_exhausted` | The developer's AI credits ran out | Offline brain for the session |
100
+ | `limit_exceeded` | A player, game or model limit is used up | Offline brain for the session |
101
+ | `provider_error`, `unavailable`, `rate_limited` | Transient (`retryable` is true) | Offline brain for this line |
102
+ | `not_signed_in`, `unsupported` | No player session, or no AI in this build | Offline brain |
103
+ | `persona_unknown`, `invalid_request` | Bug: the persona id or the input | Fix the game or the settings |
104
+ | `not_found` | `report` or `speak` named an exchange that is not the player's own, or is too old | Hide the button |
105
+
106
+ ## Steps
107
+
108
+ 1. **Write the offline brain first.** Keyword intents plus a few lines per personality, deterministic per (character, text) so every client agrees. This is the shipped experience when AI is unavailable.
109
+ 2. **Declare personas in the game's AI characters settings** (see Top up and set limits), not in scripts: one per character, a short description in plain words, a safe line in character ("Let's talk about sunshine instead!").
110
+ 3. **Add the talk UI**: a typed box, a hold-to-talk button that only appears when the microphone is allowed, the reply bubble, and a small report button on every AI reply.
111
+ 4. **Route through one character script** (below): gateway when `status` says available, offline brain otherwise and on every refusal.
112
+ 5. **Keep effects on the authority.** If talking changes something, the authority computes it from the player's words with the offline rules and clamps it.
113
+ 6. **Verify** (below).
114
+
115
+ ## Example
116
+
117
+ ```gdscript
118
+ class_name TalkingCharacter
119
+ extends Node
120
+ ## One AI character. Answers through Summer's player AI gateway when it is
121
+ ## available and falls back to the offline brain for everything else.
122
+
123
+ signal replied(text: String, exchange_id: String, from_ai: bool)
124
+
125
+ ## Codes after which asking again this session only wastes calls.
126
+ const STOP_CODES := [&"ai_disabled", &"age_policy", &"credits_exhausted", &"limit_exceeded", &"not_signed_in", &"unsupported"]
127
+
128
+ @export var persona_id := "cheerful"
129
+ @export var personality := "cheerful"
130
+
131
+ var _conversation_id := ""
132
+ var _ai_ready := false
133
+ var _can_speak := false
134
+
135
+ func _ready() -> void:
136
+ _conversation_id = "c%d" % (Time.get_ticks_usec() % 1000000000)
137
+ _ai_ready = await _gateway_available()
138
+
139
+ func say(player_text: String) -> void:
140
+ var text := player_text.strip_edges().left(500)
141
+ if text.is_empty():
142
+ return
143
+ var ai := _gateway()
144
+ if _ai_ready and ai != null:
145
+ var op: Object = ai.reply(persona_id, text, _conversation_id)
146
+ var r: SummerResult = await op.get_result_or_completed_signal()
147
+ if r.ok:
148
+ replied.emit(op.text, op.exchange_id, true)
149
+ return
150
+ # Transient codes (provider_error, unavailable, rate_limited) fall through
151
+ # for this line only.
152
+ if r.code in STOP_CODES:
153
+ _ai_ready = false
154
+ replied.emit(OfflineBrain.answer(personality, text), "", false)
155
+
156
+ ## Voice a reply, for example when the player taps the bubble.
157
+ func speak(exchange_id: String, player: AudioStreamPlayer) -> void:
158
+ var ai := _gateway()
159
+ if not _can_speak or ai == null or exchange_id == "":
160
+ return
161
+ var op: Object = ai.speak(exchange_id)
162
+ var r: SummerResult = await op.get_result_or_completed_signal()
163
+ if r.ok:
164
+ var stream := AudioStreamMP3.new()
165
+ stream.data = op.audio
166
+ player.stream = stream
167
+ player.play()
168
+
169
+ func report(exchange_id: String) -> void:
170
+ var ai := _gateway()
171
+ if exchange_id != "" and ai != null:
172
+ await ai.report(exchange_id, "inappropriate").get_result_or_completed_signal()
173
+
174
+ func _gateway_available() -> bool:
175
+ var ai := _gateway()
176
+ if ai == null:
177
+ return false
178
+ var op: Object = ai.status()
179
+ var r: SummerResult = await op.get_result_or_completed_signal()
180
+ if not r.ok or not op.available or not "reply" in op.capabilities:
181
+ return false
182
+ for p in op.personas:
183
+ if p.id == persona_id:
184
+ _can_speak = p.has_voice and "speak" in op.capabilities
185
+ return true
186
+
187
+ ## The only place that knows how the engine exposes the gateway. Engines
188
+ ## without it return null and the character stays offline.
189
+ func _gateway() -> Object:
190
+ if not Engine.has_singleton("Summer") or Summer.client == null:
191
+ return null
192
+ var ai: Object = Summer.client.get("ai")
193
+ if ai == null or not ai.has_method("reply") or not ai.has_method("status"):
194
+ return null
195
+ return ai
196
+ ```
197
+
198
+ `OfflineBrain.answer(personality, text)` is your step 1 script. Keep the report button visible only when `exchange_id` is not empty, since offline lines are your own text.
199
+
200
+ ## Verify
201
+
202
+ - `grep` the project for provider names, model ids and anything key-shaped: none.
203
+ - With the gateway absent (every engine today), every character answers from the offline brain and no error is shown.
204
+ - Typed input works with the microphone denied.
205
+ - Each failure code in the table leads to an offline answer, and the session-level codes stop further gateway calls.
206
+ - With Enable off, or the game's AI credits withdrawn, the game still plays and every character answers offline.
207
+ - `credits_exhausted` leads to an offline answer with no error shown.
208
+ - A reply marked `moderated` shows the safe line.
209
+ - AI replies carry an "AI" label, and the microphone is only used after the player agreed.
210
+ - In multiplayer, the authority broadcasts only text returned by `verify_exchange`.
211
+ - A reply never grants items, currency or progress by itself; the authority applies any effect.
212
+ - Every AI reply shows a report button that sends its exchange id.
213
+
214
+ ## Common mistakes
215
+
216
+ - Sending the persona description from the client "just for testing". It ships.
217
+ - Treating `moderated: true` as an error. It is a normal reply.
218
+ - Retrying on `limit_exceeded` or `credits_exhausted`. The limit is the product working.
219
+ - Putting a provider key in the project "until Summer is live". There is no bring-your-own-key path; keys in builds leak.
220
+ - Letting the model decide rewards because "it only suggests". It will be talked into suggesting everything.
@@ -0,0 +1,30 @@
1
+ id: skill/ai-characters-in-games
2
+ kind: skill
3
+ version: 0.3.0
4
+ summary: "Safe AI characters in published games: no keys in the build, replies via Summer's player AI gateway, moderation, spend caps, offline brain and a report button."
5
+ use_when:
6
+ - a character, creature or object should answer free-form player text or speech in a published game (talking flowers, shopkeepers, companions)
7
+ - about to put a model name, a provider SDK or a provider key into a game project
8
+ - handling AI refusals (ai_disabled, age_policy, credits_exhausted, limit_exceeded) or adding the report button for AI replies
9
+ - topping up Summer credits, setting AI limits or the kill switch for a game's AI characters
10
+ do_not_use_when:
11
+ - scripted dialogue trees or enemy behaviour — design-npc
12
+ facets:
13
+ lifecycle:
14
+ - build
15
+ domains:
16
+ - ai
17
+ - npc
18
+ modalities:
19
+ - scripts
20
+ - scenes
21
+ compatibility:
22
+ engine: ">=4.6"
23
+ related:
24
+ skills:
25
+ - skill/design-npc
26
+ - skill/multiplayer-state
27
+ source: official
28
+ license: MIT
29
+ status: preview
30
+ recommended: false
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ambient-bed
3
- description: Use when generating a long looping location ambience — forest at dawn, dungeon air, city street, spaceship hum, cave drip. Non-melodic, low-energy, never draws attention. Wires as a looping AudioStreamPlayer on the Ambient bus with a marked seamless loop. Trigger on "ambient bed", "room tone", "background ambience", "forest ambience", "dungeon air", "make it sound like a cave".
3
+ description: "Generate a long looping location ambience — forest, dungeon, city, spaceship, cave — a looping AudioStreamPlayer on the Ambient bus with a seamless loop."
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: animated-loop
3
- description: Use when generating a short looping video clip — splash screen background, animated logo backdrop, idle title-screen footage, looping environment ambience. Output must loop seamlessly and is wired as a VideoStreamPlayer with autoplay and loop set true. Trigger on "looping background", "splash loop", "title screen video", "animated backdrop", "menu background loop", "ambient loop video", "looping clip", "seamless loop".
3
+ description: "Generate a short seamlessly-looping video clip — splash background, animated logo backdrop, idle title-screen footage — wired as a looping VideoStreamPlayer."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: video
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: animation-tree
3
- description: Use when the user has clips on a character and needs them to play in response to gameplay — idle/walk/run blend, attacks that interrupt locomotion, hit reactions that override everything. Designs and wires Summer Engine AnimationTree state machines and blend trees. Trigger on "AnimationTree", "state machine", "blend tree", "transition", "play animation when", "character keeps T-posing", "wire animations".
3
+ description: "Design and wire AnimationTree state machines and blend trees so clips respond to gameplay — locomotion blends, attack interrupts, hit reactions."
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: art-direction
3
- description: Use when defining the visual style of the game — references, palette, mood, lighting plan, post-processing, do/don't list. Outputs an art bible at `.summer/art-bible.md`. Trigger on "art direction", "art bible", "visual style", "color palette", "what should it look like", "the look".
3
+ description: "Define the game's visual style — references, palette, mood, lighting plan, post-processing, do/don't list — output as an art bible at .summer/art-bible.md."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: rendering-and-lighting
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: asset-strategy
3
- description: Use when planning asset creation, picking an asset pipeline, or routing an "I need a [thing]" request to the right specialist skill. Disambiguates between 2D / 3D / audio / video / VFX / animation pipelines and dispatches via the Skill tool. Trigger on "assets", "asset pipeline", "make a model", "I need a sound", "create concept art", "generate something", broad creative requests.
3
+ description: "Route any 'I need a [thing]' asset request to the right specialist skill — disambiguates 2D / 3D / audio / video / VFX / animation pipelines."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: asset-pipeline
@@ -84,6 +84,7 @@ Polycount targets (hero 8k–15k, grunt 3k–6k, mobile 1k–3k, cinematic 20k
84
84
  | Request | Skill |
85
85
  |---|---|
86
86
  | Idle / walk / run / attack — new clip | `generate-motion` |
87
+ | Custom action or non-humanoid rig (flower, creature, prop) — clip from text | `text-to-motion` |
87
88
  | Apply library to a different character | `retarget` |
88
89
  | Blend tree / state machine | `animation-tree` |
89
90
  | Look-at / IK / foot placement | `procedural-animation` |
@@ -1,6 +1,6 @@
1
1
  id: skill/asset-strategy
2
2
  kind: skill
3
- version: 1.0.2
3
+ version: 1.0.3
4
4
  summary: Route any 'I need a [thing]' asset request to the right specialist skill — disambiguates 2D / 3D / audio / video / VFX / animation pipelines.
5
5
  use_when:
6
6
  - planning asset creation, picking an asset pipeline, or routing an 'I need a [thing]' request to the right specialist skill
@@ -35,6 +35,7 @@ related:
35
35
  - skill/animation-tree
36
36
  - skill/facial-and-lipsync
37
37
  - skill/generate-motion
38
+ - skill/text-to-motion
38
39
  - skill/procedural-animation
39
40
  - skill/retarget
40
41
  - skill/adaptive-music
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: audio-direction
3
- description: Use when defining the sonic identity — music style, instruments, SFX vocabulary, dynamic music plan. Outputs an audio bible at `.summer/audio-bible.md`. Trigger on "audio direction", "audio bible", "music style", "sound design", "what should it sound like", "dynamic music".
3
+ description: "Define the game's sonic identity — music style, instruments, SFX vocabulary, dynamic music plan — output as an audio bible at .summer/audio-bible.md."
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: auto-fire-targeting
3
- description: Use when designing or fixing the targeting system for an auto-fire weapon (survivors-genre, top-down ARPG, tower-defense). Covers the pending-damage pattern that prevents over-commit when bullet flight time is longer than fire rate. Trigger on "auto-fire", "auto-aim", "weapon targeting", "targeting", "wasted bullets", "overkill", "damage prediction", "survivors weapon".
3
+ description: "Design or fix auto-fire weapon targeting (survivors, top-down ARPG, tower defense) — the pending-damage pattern that prevents over-commit and overkill."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: gameplay-mechanics
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: brainstorm-game
3
- description: Use when the user wants help deciding what game to make, scoping a new project, or turning a vague idea into a buildable plan. Walks through genre, scope, core loop, mechanics, and art direction, then writes a 1-page brief to `.summer/GameSoul.md`. Trigger on "brainstorm a game", "what should I make", "I want to make a game", "help me scope", "new game idea".
3
+ description: "Turn a vague idea into a buildable plan — genre, scope, core loop, mechanics, art direction — written as a 1-page brief to .summer/GameSoul.md."
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: brainstorming
3
- description: "Use when starting creative work — designing a game, picking a mechanic, building features or components, modifying behavior. Explores user intent, requirements, and design before implementation. MUST run before any creative work."
3
+ description: "Explore user intent, requirements, and design before implementation — must run before any creative work: features, components, mechanics, behavior."
4
4
  ---
5
5
 
6
6
  # Brainstorming Ideas Into Designs
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: browse-templates
3
- description: Use when the user wants to see available Summer Engine project templates, start from an existing template, or asks "what templates exist?" — lists the pinned template registry via `summer list templates`, presents the choices, and creates a project from the chosen template via `summer create <slug> <project-name>`. Trigger on "templates", "starter", "boilerplate", "from a template", "what's available", "show me templates", "third-person", "platformer", "multiplayer starter".
3
+ description: "List available Summer Engine project templates, present the choices, and create a project from the chosen one via summer create."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Codex, Windsurf, Gemini, OpenCode]
6
6
  category: scene-and-project
@@ -11,7 +11,7 @@ paths: ["**/project.godot"]
11
11
 
12
12
  # /browse-templates — Pick a registry template and create a project from it
13
13
 
14
- Summer's templates are the pin manifests in `library/templates/<slug>/resource.yaml`, compiled into `registry/generated/templates-registry.json`: `3d-third-person-controller`, `3d-lan-multiplayer-starter`, `2d-platformer`, and so on. Each pinned template names a repo, an exact commit, and a tree digest; the two built-ins (`empty`, `3d-basic`) are generated locally. They're working starter projects — open in Summer Engine and play immediately.
14
+ Summer's templates are the pin manifests in `library/templates/<slug>/resource.yaml`, compiled into `registry/generated/templates-registry.json`: `3d-third-person-controller`, `2d-platformer`, and so on. Each pinned template names a repo, an exact commit, and a tree digest; the two built-ins (`empty`, `3d-basic`) are generated locally. They're working starter projects — open in Summer Engine and play immediately.
15
15
 
16
16
  ## When to use this skill
17
17
 
@@ -99,7 +99,7 @@ Confirm it opens. Then invoke `play` to verify the template runs as expected bef
99
99
  Once the project is created and running, hand off cleanly. The next skill that fires depends on the template:
100
100
 
101
101
  - Third-person controller → likely `scene-composition` or `gdscript-patterns` next.
102
- - Multiplayer starter → `setup-multiplayer` or `host-authoritative-state`.
102
+ - Multiplayer starter → `multiplayer` (it routes to `multiplayer-project`).
103
103
  - 2D platformer → `design-mechanic` for the platforming feel, then `design-level`.
104
104
 
105
105
  Don't auto-fire the next skill — wait for the user to say what they want to change first.
@@ -1,6 +1,6 @@
1
1
  id: skill/browse-templates
2
2
  kind: skill
3
- version: 1.0.4
3
+ version: 1.0.5
4
4
  summary: List available Summer Engine project templates, present the choices, and create a project from the chosen one via summer create.
5
5
  use_when:
6
6
  - the user wants to see available Summer Engine project templates, start from an existing template, or asks what templates exist
@@ -0,0 +1,128 @@
1
+ ---
2
+ name: camera-rigs
3
+ description: "Camera rigs for 2D and 3D: Camera2D follow with limits, first-person head camera, SpringArm3D third-person, orthographic top-down, FOV guidance."
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Codex, Windsurf, Gemini, OpenCode]
6
+ category: scene-and-project
7
+ user-invocable: false
8
+ allowed-tools: Read Grep summer_get_scene_tree summer_inspect_node summer_add_node summer_set_prop summer_batch summer_save_scene summer_screenshot summer_play summer_stop summer_get_diagnostics
9
+ paths: ["**/*.tscn", "**/*.gd"]
10
+ ---
11
+
12
+ # Camera Rigs
13
+
14
+ One rule above all: exactly ONE camera is active. In 3D that is the single
15
+ `Camera3D` with `current = true`; two current cameras = flicker or the wrong
16
+ view, and a scene with no current camera renders nothing in the game. In 2D a
17
+ `Camera2D` is active when `enabled = true` (the default) and it is in the tree;
18
+ with several enabled cameras, call `make_current()` on the one you want.
19
+
20
+ Trigger phrases: "black screen on play", "camera shows past the level edge",
21
+ "jerky follow", "wrong FOV", "I need a top-down / isometric / orbit camera".
22
+
23
+ Ops use engine variant strings (`"Vector3(0, 5, 10)"`), never JSON objects
24
+ (`{x: 0, y: 5, z: 10}` fails). Every mutation names its scene: pass the exact
25
+ `scenePath` (e.g. `res://main.tscn`). One `summer_batch` per rig saves the scene
26
+ once; the examples below use it.
27
+
28
+ ## 2D follow camera
29
+
30
+ Add the `Camera2D` as a CHILD of the player so it follows for free, then smooth
31
+ it and clamp it to the level.
32
+
33
+ ```
34
+ summer_batch(scenePath="res://main.tscn", ops=[
35
+ {"op": "AddNode", "parent": "./Player", "type": "Camera2D", "name": "Camera"},
36
+ {"op": "SetProp", "path": "./Player/Camera", "key": "position_smoothing_enabled", "value": true},
37
+ {"op": "SetProp", "path": "./Player/Camera", "key": "position_smoothing_speed", "value": 6.0},
38
+ {"op": "SetProp", "path": "./Player/Camera", "key": "limit_left", "value": 0},
39
+ {"op": "SetProp", "path": "./Player/Camera", "key": "limit_right", "value": 1920},
40
+ {"op": "SetProp", "path": "./Player/Camera", "key": "limit_top", "value": 0},
41
+ {"op": "SetProp", "path": "./Player/Camera", "key": "limit_bottom", "value": 1080}
42
+ ])
43
+ ```
44
+
45
+ - Smoothing speed 5-8 feels responsive; higher = tighter, lower = drifty.
46
+ - Set limits to the actual level bounds (the numbers above are placeholders).
47
+ `limit_smoothing_enabled = true` avoids a hard stop at the edge.
48
+ - Zoom `Vector2(2, 2)` zooms IN (bigger), `Vector2(0.5, 0.5)` zooms OUT (top-down).
49
+
50
+ ## 2D top-down camera
51
+
52
+ Same as above minus the platformer edge-lock urgency. Zoom out to show the field
53
+ (`Vector2(0.5, 0.5)`). Keep it centered on the player; no vertical bias.
54
+
55
+ ## 3D first-person camera
56
+
57
+ Camera is a child of a `Head` node on the player. Body yaws, Head pitches. See
58
+ the `character-movement` skill (its `../character-movement/references/movement-3d.md`) or
59
+ `fps-controller` for the look script. FOV 70-75, near 0.05.
60
+
61
+ ```
62
+ summer_batch(scenePath="res://main.tscn", ops=[
63
+ {"op": "AddNode", "parent": "./Player/Head", "type": "Camera3D", "name": "Camera"},
64
+ {"op": "SetProp", "path": "./Player/Head/Camera", "key": "fov", "value": 72.0},
65
+ {"op": "SetProp", "path": "./Player/Head/Camera", "key": "near", "value": 0.05},
66
+ {"op": "SetProp", "path": "./Player/Head/Camera", "key": "current", "value": true}
67
+ ])
68
+ ```
69
+
70
+ ## 3D third-person camera (spring arm)
71
+
72
+ The `SpringArm3D` pushes the camera in when a wall is behind the player, so it
73
+ never clips through geometry. This is the correct third-person rig - do not just
74
+ park a Camera3D behind the player.
75
+
76
+ ```
77
+ summer_batch(scenePath="res://main.tscn", ops=[
78
+ {"op": "AddNode", "parent": "./Player", "type": "SpringArm3D", "name": "SpringArm"},
79
+ {"op": "SetProp", "path": "./Player/SpringArm", "key": "position", "value": "Vector3(0, 2, 0)"},
80
+ {"op": "SetProp", "path": "./Player/SpringArm", "key": "spring_length", "value": 4.5},
81
+ {"op": "SetProp", "path": "./Player/SpringArm", "key": "collision_mask", "value": 2},
82
+ {"op": "AddNode", "parent": "./Player/SpringArm", "type": "Camera3D", "name": "Camera"},
83
+ {"op": "SetProp", "path": "./Player/SpringArm/Camera", "key": "current", "value": true}
84
+ ])
85
+ ```
86
+
87
+ Set `collision_mask` to the LEVEL layer only. If it includes the player layer the
88
+ arm collapses to length 0 and you see inside the character (a controller script
89
+ can also call `add_excluded_object(get_rid())` on the arm).
90
+
91
+ ## Orthographic top-down 3D (twin-stick, strategy, isometric)
92
+
93
+ ```
94
+ summer_batch(scenePath="res://main.tscn", ops=[
95
+ {"op": "SetProp", "path": "./Camera", "key": "projection", "value": 1},
96
+ {"op": "SetProp", "path": "./Camera", "key": "size", "value": 20.0},
97
+ {"op": "SetProp", "path": "./Camera", "key": "position", "value": "Vector3(0, 20, 0)"},
98
+ {"op": "SetProp", "path": "./Camera", "key": "rotation_degrees", "value": "Vector3(-90, 0, 0)"}
99
+ ])
100
+ ```
101
+
102
+ `projection = 1` is orthogonal. `size` is the vertical world units shown - bigger
103
+ = more zoomed out. For isometric, rotate ~(-30, 45, 0) instead of straight down.
104
+
105
+ ## FOV guidance
106
+
107
+ - 60-75: most 3D games. 90+: fast FPS (feels faster, more peripheral).
108
+ - Under 40 or over 110 distorts. Never animate FOV wildly; a small kick (+8 on
109
+ sprint, tweened back) reads as speed.
110
+
111
+ ## Verify
112
+
113
+ A camera is only proven by a frame. After the rig is in, `summer_play`, then
114
+ `summer_screenshot` with `target: "game"`, then `summer_stop`; or save frames
115
+ from a `RunVerification` probe while the player moves (see
116
+ `playtesting-a-feature`). An editor `viewport` screenshot shows the editor's
117
+ camera, not the game's.
118
+
119
+ ## Troubleshooting
120
+
121
+ | Symptom | Cause | Fix |
122
+ |---------|-------|-----|
123
+ | Black screen | No current/enabled camera | 3D: `current = true` on exactly one; 2D: one enabled Camera2D in the tree |
124
+ | Camera inside geometry | Spawned inside a wall/player | Move it out; spring arm for 3P |
125
+ | Jerky follow | Smoothing off/too slow | Enable smoothing, speed 6-10 |
126
+ | Shows past level edge | No 2D limits | Set `limit_*` to level bounds |
127
+ | Wrong facing (3D) | rotation.y off | y: 0 = forward, 180 = backward |
128
+ | Everything tiny/huge (ortho) | `size` wrong | Tune `size`, not `position.y` |
@@ -0,0 +1,29 @@
1
+ id: skill/camera-rigs
2
+ kind: skill
3
+ version: 1.0.0
4
+ summary: "Camera rigs for 2D and 3D: Camera2D follow with limits, first-person head camera, SpringArm3D third-person, orthographic top-down, FOV guidance."
5
+ use_when:
6
+ - black screen on play, or the camera shows past the level edge
7
+ - jerky camera follow, wrong FOV, or the third-person camera clips into walls
8
+ - need a top-down, isometric, orthographic, orbit, or spring-arm camera
9
+ facets:
10
+ lifecycle:
11
+ - build
12
+ domains:
13
+ - scenes
14
+ - 3d
15
+ - 2d
16
+ modalities:
17
+ - scenes
18
+ - scripts
19
+ compatibility:
20
+ engine: ">=4.6"
21
+ related:
22
+ skills:
23
+ - skill/make-game
24
+ - skill/character-movement
25
+ - skill/fps-controller
26
+ source: official
27
+ license: MIT
28
+ status: preview
29
+ recommended: false
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: celeste-momentum-platforming
3
- description: "Use when building or tuning Celeste-style momentum-based precision platformer movement in SummerEngine (Godot 4): tuned gravity/fall, run acceleration, variable-height jumps with coyote time, dashes, wall jumps/slides, climb stamina, and pixel-scale corner correction, using the exact tuning constants extracted from Celeste's open-source Player class."
3
+ description: "Celeste-style 2D precision platformer movement — momentum running, coyote time, variable jumps, dash, wall jump/slide, climb stamina, pixel corner correction."
4
4
  license: MIT
5
5
  category: game-feel
6
6
  tags:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: character-animation-wiring
3
- description: Use when a rigged, animated character is in the scene (Meshy rig + generated clips, or an imported GLB) and needs to be wired end to end — inspect the clips and bones that actually arrived, build idle/walk/run locomotion with blend times, method-track footsteps and attack frames, still poses and head tracking, blend-shape facial keys, root motion. Trigger on "wire the character", "hook up the animations", "make it walk around", "the GLB has animations", "footstep events", "attack frame", "root motion", "character slides while walking".
3
+ description: "Wire a rigged, animated character end to end — inspect real clips and bones, locomotion state machine, method-track events, poses, blend shapes, root motion."
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: character-model
3
- description: Use when generating a humanoid character ready for animation — player avatar, NPC, enemy, boss, companion. Generates a T-pose reference image, gates an un-rigged preview past the user, then runs the Meshy auto-rig pass and wires the result as a CharacterBody3D (movement) or Node3D (cinematic). Trigger on "make a character", "generate the player", "I need an enemy model", "create an NPC", "rigged humanoid", "character with a skeleton", "model for animation".
3
+ description: "Generate a rigged humanoid — player, NPC, enemy, boss — via T-pose reference, user-gated preview, and Meshy auto-rig, wired as CharacterBody3D or Node3D."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: 3d-assets