summer-engine 3.7.0 → 4.0.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 (501) hide show
  1. package/.claude-plugin/marketplace.json +2 -13
  2. package/.claude-plugin/plugin.json +25 -22
  3. package/.codex-plugin/plugin.json +8 -14
  4. package/.cursor-plugin/plugin.json +7 -13
  5. package/.factory-plugin/plugin.json +7 -13
  6. package/AGENTS.md +19 -12
  7. package/CHANGELOG.md +112 -0
  8. package/GEMINI.md +3 -3
  9. package/README.md +111 -31
  10. package/assets/icon.png +0 -0
  11. package/commands/start.md +71 -0
  12. package/commands/summer.md +5 -3
  13. package/dist/cli/banner.js +3 -0
  14. package/dist/cli/commands/login.d.ts +27 -0
  15. package/dist/cli/commands/login.js +58 -12
  16. package/dist/cli/commands/ops.d.ts +47 -0
  17. package/dist/cli/commands/ops.js +301 -0
  18. package/dist/cli/commands/setup.d.ts +2 -0
  19. package/dist/cli/commands/setup.js +37 -12
  20. package/dist/cli/commands/skills.js +11 -7
  21. package/dist/cli/index.js +7 -0
  22. package/dist/core/agent-host.d.ts +65 -0
  23. package/dist/core/agent-host.js +193 -0
  24. package/dist/core/capabilities/agent-playbook.d.ts +3 -0
  25. package/dist/core/capabilities/agent-playbook.js +54 -2
  26. package/dist/core/capabilities/apps.d.ts +341 -0
  27. package/dist/core/capabilities/apps.js +353 -0
  28. package/dist/core/capabilities/doctor.d.ts +3 -0
  29. package/dist/core/capabilities/doctor.js +20 -15
  30. package/dist/core/capabilities/enable-plugin.d.ts +27 -0
  31. package/dist/core/capabilities/enable-plugin.js +75 -0
  32. package/dist/core/capabilities/fabricate-mesh.d.ts +2 -2
  33. package/dist/core/capabilities/game-task-plan.d.ts +12 -6
  34. package/dist/core/capabilities/game-task-plan.js +80 -5
  35. package/dist/core/capabilities/motion-generation.js +2 -2
  36. package/dist/core/capabilities/navigation/open.d.ts +6 -2
  37. package/dist/core/capabilities/navigation/open.js +3 -0
  38. package/dist/core/capabilities/publish-build.js +2 -0
  39. package/dist/core/capabilities/runtime-control.d.ts +4 -4
  40. package/dist/core/capabilities/scene-script-target.d.ts +17 -0
  41. package/dist/core/capabilities/scene-script-target.js +70 -0
  42. package/dist/core/capabilities/sfx-choices.d.ts +4 -0
  43. package/dist/core/capabilities/sfx-choices.js +13 -6
  44. package/dist/core/capabilities/tool-dispatch.d.ts +12 -3
  45. package/dist/core/capabilities/tool-dispatch.js +130 -46
  46. package/dist/core/capability-skew.js +4 -0
  47. package/dist/core/embeddings.d.ts +2 -0
  48. package/dist/core/embeddings.js +1 -1
  49. package/dist/core/error-codes.d.ts +62 -0
  50. package/dist/core/error-codes.js +97 -0
  51. package/dist/core/format.d.ts +2 -0
  52. package/dist/core/format.js +2 -1
  53. package/dist/core/hosted-mcp.d.ts +22 -0
  54. package/dist/core/hosted-mcp.js +56 -1
  55. package/dist/core/library-read.js +5 -0
  56. package/dist/core/library-search.js +2 -1
  57. package/dist/core/oauth.js +4 -0
  58. package/dist/core/ops/catalog.d.ts +41 -0
  59. package/dist/core/ops/catalog.js +145 -0
  60. package/dist/core/ops/cloud.d.ts +56 -0
  61. package/dist/core/ops/cloud.js +175 -0
  62. package/dist/core/ops/contract.d.ts +119 -0
  63. package/dist/core/ops/contract.js +142 -0
  64. package/dist/core/ops/engine-answer.d.ts +25 -0
  65. package/dist/core/ops/engine-answer.js +117 -0
  66. package/dist/core/ops/engine.d.ts +55 -0
  67. package/dist/core/ops/engine.js +649 -0
  68. package/dist/core/ops/save-files.d.ts +78 -0
  69. package/dist/core/ops/save-files.js +419 -0
  70. package/dist/core/ops/search.d.ts +9 -0
  71. package/dist/core/ops/search.js +55 -0
  72. package/dist/core/skills-registry.d.ts +16 -1
  73. package/dist/core/skills-registry.js +35 -2
  74. package/dist/core/telemetry.d.ts +32 -0
  75. package/dist/core/telemetry.js +38 -10
  76. package/dist/core/tool-profiles.d.ts +25 -0
  77. package/dist/core/tool-profiles.js +41 -0
  78. package/dist/installer/agent-config.d.ts +17 -4
  79. package/dist/installer/agent-config.js +22 -6
  80. package/dist/installer/agent-table.d.ts +3 -0
  81. package/dist/installer/agent-table.js +10 -7
  82. package/dist/installer/setup.d.ts +2 -0
  83. package/dist/installer/setup.js +9 -4
  84. package/dist/installer/version-check.d.ts +29 -9
  85. package/dist/installer/version-check.js +81 -28
  86. package/dist/mcp/command.js +7 -0
  87. package/dist/mcp/hosted-mount.d.ts +27 -2
  88. package/dist/mcp/hosted-mount.js +66 -24
  89. package/dist/mcp/legacy-toolset.d.ts +27 -0
  90. package/dist/mcp/legacy-toolset.js +43 -0
  91. package/dist/mcp/ops-surface.d.ts +59 -0
  92. package/dist/mcp/ops-surface.js +443 -0
  93. package/dist/mcp/server.d.ts +35 -11
  94. package/dist/mcp/server.js +236 -89
  95. package/dist/mcp/tool-results.d.ts +26 -0
  96. package/dist/mcp/tool-results.js +81 -0
  97. package/dist/mcp/tool-surface.d.ts +65 -0
  98. package/dist/mcp/tool-surface.js +317 -0
  99. package/dist/mcp/tools/app-tools.d.ts +2 -0
  100. package/dist/mcp/tools/app-tools.js +71 -0
  101. package/dist/mcp/tools/asset-tools.js +55 -53
  102. package/dist/mcp/tools/audit-tools.js +21 -21
  103. package/dist/mcp/tools/debug-tools.js +6 -6
  104. package/dist/mcp/tools/fabricate-tools.js +6 -6
  105. package/dist/mcp/tools/generate-tools.js +76 -70
  106. package/dist/mcp/tools/project-tools.d.ts +9 -4
  107. package/dist/mcp/tools/project-tools.js +16 -10
  108. package/dist/mcp/tools/scene-tools.js +12 -23
  109. package/dist/mcp/tools/script-tools.js +9 -5
  110. package/dist/mcp/tools/with-engine.d.ts +6 -0
  111. package/dist/mcp/tools/with-engine.js +19 -0
  112. package/gemini-extension.json +6 -12
  113. package/hooks/pre-commit-doctor.sh +5 -4
  114. package/hooks/session-start.sh +24 -28
  115. package/integrations/claude-desktop/README.md +1 -1
  116. package/integrations/copilot-jetbrains/README.md +1 -1
  117. package/integrations/junie/README.md +1 -1
  118. package/integrations/lm-studio/README.md +1 -1
  119. package/integrations/trae/README.md +1 -1
  120. package/integrations/visual-studio/README.md +1 -1
  121. package/library/references/mcp-tools-reference/mcp-tools-reference.md +85 -35
  122. package/library/references/mcp-tools-reference/resource.yaml +1 -1
  123. package/library/references/product-map/resource.yaml +2 -2
  124. package/library/skills/3d-lighting/SKILL.md +53 -28
  125. package/library/skills/3d-lighting/resource.yaml +1 -1
  126. package/library/skills/README.md +126 -116
  127. package/library/skills/adaptive-music/SKILL.md +19 -23
  128. package/library/skills/adaptive-music/resource.yaml +1 -1
  129. package/library/skills/agent-playtesting/SKILL.md +1 -1
  130. package/library/skills/agent-playtesting/resource.yaml +1 -1
  131. package/library/skills/ai-characters-in-games/SKILL.md +1 -1
  132. package/library/skills/ai-characters-in-games/resource.yaml +1 -1
  133. package/library/skills/ambient-bed/SKILL.md +22 -13
  134. package/library/skills/ambient-bed/resource.yaml +1 -1
  135. package/library/skills/animated-loop/SKILL.md +41 -32
  136. package/library/skills/animated-loop/resource.yaml +1 -1
  137. package/library/skills/animation-tree/SKILL.md +1 -1
  138. package/library/skills/animation-tree/resource.yaml +1 -1
  139. package/library/skills/art-direction/SKILL.md +3 -3
  140. package/library/skills/art-direction/resource.yaml +1 -1
  141. package/library/skills/asset-strategy/SKILL.md +21 -4
  142. package/library/skills/asset-strategy/resource.yaml +2 -1
  143. package/library/skills/audio-direction/SKILL.md +10 -10
  144. package/library/skills/audio-direction/resource.yaml +1 -1
  145. package/library/skills/auto-fire-targeting/SKILL.md +1 -1
  146. package/library/skills/auto-fire-targeting/resource.yaml +1 -1
  147. package/library/skills/bounded-engine-runs/SKILL.md +1 -1
  148. package/library/skills/bounded-engine-runs/resource.yaml +1 -1
  149. package/library/skills/brainstorm-game/SKILL.md +1 -1
  150. package/library/skills/brainstorm-game/resource.yaml +1 -1
  151. package/library/skills/brainstorming/SKILL.md +1 -1
  152. package/library/skills/brainstorming/resource.yaml +1 -1
  153. package/library/skills/browse-templates/SKILL.md +1 -1
  154. package/library/skills/browse-templates/resource.yaml +1 -1
  155. package/library/skills/camera-rigs/SKILL.md +2 -2
  156. package/library/skills/camera-rigs/resource.yaml +1 -1
  157. package/library/skills/celeste-momentum-platforming/resource.yaml +1 -0
  158. package/library/skills/character-animation-wiring/SKILL.md +4 -4
  159. package/library/skills/character-animation-wiring/resource.yaml +1 -1
  160. package/library/skills/character-model/SKILL.md +55 -47
  161. package/library/skills/character-model/resource.yaml +1 -1
  162. package/library/skills/character-movement/SKILL.md +3 -3
  163. package/library/skills/character-movement/resource.yaml +1 -1
  164. package/library/skills/character-portrait/SKILL.md +24 -19
  165. package/library/skills/character-portrait/resource.yaml +1 -1
  166. package/library/skills/cinematic-cutscene/SKILL.md +58 -46
  167. package/library/skills/cinematic-cutscene/resource.yaml +1 -1
  168. package/library/skills/combat-basics/SKILL.md +1 -1
  169. package/library/skills/combat-basics/resource.yaml +1 -1
  170. package/library/skills/compatibility-renderer-traps/SKILL.md +1 -1
  171. package/library/skills/compatibility-renderer-traps/resource.yaml +1 -1
  172. package/library/skills/concept-art/SKILL.md +16 -12
  173. package/library/skills/concept-art/resource.yaml +1 -1
  174. package/library/skills/concept-to-level/SKILL.md +239 -0
  175. package/library/skills/concept-to-level/references/technical-rules.md +150 -0
  176. package/library/skills/concept-to-level/resource.yaml +44 -0
  177. package/library/skills/create-asset-sheet/SKILL.md +19 -13
  178. package/library/skills/create-asset-sheet/resource.yaml +1 -1
  179. package/library/skills/debug/SKILL.md +2 -2
  180. package/library/skills/debug/resource.yaml +1 -1
  181. package/library/skills/debugging-game-feel/SKILL.md +1 -1
  182. package/library/skills/debugging-game-feel/resource.yaml +1 -1
  183. package/library/skills/design-level/SKILL.md +23 -35
  184. package/library/skills/design-level/resource.yaml +1 -1
  185. package/library/skills/design-mechanic/SKILL.md +1 -1
  186. package/library/skills/design-mechanic/resource.yaml +1 -1
  187. package/library/skills/design-npc/SKILL.md +22 -24
  188. package/library/skills/design-npc/resource.yaml +1 -1
  189. package/library/skills/diagnosing-perf-regressions/SKILL.md +1 -1
  190. package/library/skills/diagnosing-perf-regressions/resource.yaml +1 -1
  191. package/library/skills/driving-the-editor-ui/SKILL.md +1 -1
  192. package/library/skills/driving-the-editor-ui/resource.yaml +1 -1
  193. package/library/skills/environment-kit/SKILL.md +20 -16
  194. package/library/skills/environment-kit/resource.yaml +1 -1
  195. package/library/skills/export-and-ship/SKILL.md +6 -6
  196. package/library/skills/export-and-ship/resource.yaml +1 -1
  197. package/library/skills/fabricating-assets/SKILL.md +7 -7
  198. package/library/skills/fabricating-assets/resource.yaml +3 -3
  199. package/library/skills/facial-and-lipsync/SKILL.md +14 -15
  200. package/library/skills/facial-and-lipsync/resource.yaml +1 -1
  201. package/library/skills/fps-controller/SKILL.md +33 -41
  202. package/library/skills/fps-controller/resource.yaml +1 -1
  203. package/library/skills/game-feel/SKILL.md +8 -8
  204. package/library/skills/game-feel/resource.yaml +1 -1
  205. package/library/skills/gameskill/SKILL.md +4 -4
  206. package/library/skills/gameskill/resource.yaml +1 -1
  207. package/library/skills/gdscript-patterns/SKILL.md +1 -1
  208. package/library/skills/gdscript-patterns/resource.yaml +1 -1
  209. package/library/skills/generate-motion/SKILL.md +30 -21
  210. package/library/skills/generate-motion/resource.yaml +1 -1
  211. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +1 -1
  212. package/library/skills/godogen-visual-proof-game-generation/resource.yaml +1 -0
  213. package/library/skills/grow-analytics/SKILL.md +3 -3
  214. package/library/skills/grow-analytics/resource.yaml +1 -1
  215. package/library/skills/headless-scripting/SKILL.md +1 -1
  216. package/library/skills/headless-scripting/resource.yaml +1 -1
  217. package/library/skills/in-game-purchases/SKILL.md +1 -1
  218. package/library/skills/in-game-purchases/resource.yaml +1 -1
  219. package/library/skills/instantiate-asset-pack/SKILL.md +2 -2
  220. package/library/skills/instantiate-asset-pack/resource.yaml +1 -1
  221. package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +1 -0
  222. package/library/skills/make-game/SKILL.md +4 -4
  223. package/library/skills/make-game/references/2d-platformer.md +1 -1
  224. package/library/skills/make-game/references/3d-fps.md +1 -1
  225. package/library/skills/make-game/references/3d-horror.md +1 -1
  226. package/library/skills/make-game/references/3d-third-person.md +2 -2
  227. package/library/skills/make-game/resource.yaml +1 -1
  228. package/library/skills/multiplayer/SKILL.md +1 -1
  229. package/library/skills/multiplayer/resource.yaml +1 -1
  230. package/library/skills/multiplayer-movement/SKILL.md +1 -1
  231. package/library/skills/multiplayer-movement/resource.yaml +1 -1
  232. package/library/skills/multiplayer-project/SKILL.md +1 -1
  233. package/library/skills/multiplayer-project/resource.yaml +1 -1
  234. package/library/skills/multiplayer-publish/SKILL.md +8 -7
  235. package/library/skills/multiplayer-publish/resource.yaml +3 -3
  236. package/library/skills/multiplayer-state/SKILL.md +1 -1
  237. package/library/skills/multiplayer-state/resource.yaml +1 -1
  238. package/library/skills/multiplayer-testing/SKILL.md +1 -1
  239. package/library/skills/multiplayer-testing/resource.yaml +1 -1
  240. package/library/skills/music-track/SKILL.md +22 -13
  241. package/library/skills/music-track/resource.yaml +1 -1
  242. package/library/skills/navigate-summer/SKILL.md +11 -9
  243. package/library/skills/navigate-summer/resource.yaml +1 -1
  244. package/library/skills/new-project/SKILL.md +1 -1
  245. package/library/skills/new-project/resource.yaml +1 -1
  246. package/library/skills/organic-model/SKILL.md +24 -18
  247. package/library/skills/organic-model/resource.yaml +1 -1
  248. package/library/skills/pixel-art/SKILL.md +27 -23
  249. package/library/skills/pixel-art/resource.yaml +1 -1
  250. package/library/skills/play/SKILL.md +1 -1
  251. package/library/skills/play/resource.yaml +1 -1
  252. package/library/skills/playtesting-a-feature/SKILL.md +1 -1
  253. package/library/skills/playtesting-a-feature/resource.yaml +1 -1
  254. package/library/skills/procedural-animation/SKILL.md +20 -16
  255. package/library/skills/procedural-animation/resource.yaml +1 -1
  256. package/library/skills/prop-model/SKILL.md +25 -19
  257. package/library/skills/prop-model/resource.yaml +1 -1
  258. package/library/skills/psx-retro-rendering/resource.yaml +1 -0
  259. package/library/skills/publish-your-game/SKILL.md +16 -6
  260. package/library/skills/publish-your-game/resource.yaml +3 -3
  261. package/library/skills/realtime-wet-surfaces/resource.yaml +1 -0
  262. package/library/skills/release-readiness/SKILL.md +1 -1
  263. package/library/skills/release-readiness/resource.yaml +1 -1
  264. package/library/skills/remote-deploy/SKILL.md +1 -1
  265. package/library/skills/remote-deploy/resource.yaml +1 -1
  266. package/library/skills/retarget/SKILL.md +23 -20
  267. package/library/skills/retarget/resource.yaml +1 -1
  268. package/library/skills/running-in-the-cloud/SKILL.md +1 -1
  269. package/library/skills/running-in-the-cloud/resource.yaml +1 -1
  270. package/library/skills/save-load/SKILL.md +1 -1
  271. package/library/skills/save-load/resource.yaml +1 -1
  272. package/library/skills/scene-composition/SKILL.md +1 -1
  273. package/library/skills/scene-composition/resource.yaml +1 -1
  274. package/library/skills/scene-hierarchy-design/SKILL.md +2 -2
  275. package/library/skills/scene-hierarchy-design/resource.yaml +1 -1
  276. package/library/skills/scene-scripting/SKILL.md +66 -636
  277. package/library/skills/scene-scripting/references/ctx-api.md +184 -0
  278. package/library/skills/scene-scripting/references/recipes-2d-ui.md +193 -0
  279. package/library/skills/scene-scripting/references/recipes-3d.md +280 -0
  280. package/library/skills/scene-scripting/resource.yaml +4 -4
  281. package/library/skills/scene-to-level/SKILL.md +2 -2
  282. package/library/skills/scene-to-level/resource.yaml +1 -1
  283. package/library/skills/skill-create/resource.yaml +1 -0
  284. package/library/skills/skill-improve/resource.yaml +1 -0
  285. package/library/skills/skill-test/SKILL.md +2 -2
  286. package/library/skills/skill-test/resource.yaml +1 -0
  287. package/library/skills/skintokens-auto-rigging/resource.yaml +1 -0
  288. package/library/skills/skybox-panorama/SKILL.md +27 -21
  289. package/library/skills/skybox-panorama/resource.yaml +1 -1
  290. package/library/skills/sound-effect/SKILL.md +31 -20
  291. package/library/skills/sound-effect/resource.yaml +1 -1
  292. package/library/skills/spatial-placement/SKILL.md +14 -9
  293. package/library/skills/spatial-placement/resource.yaml +1 -1
  294. package/library/skills/sprite-sheet/SKILL.md +32 -27
  295. package/library/skills/sprite-sheet/resource.yaml +1 -1
  296. package/library/skills/store-art/SKILL.md +3 -3
  297. package/library/skills/store-art/resource.yaml +2 -2
  298. package/library/skills/store-listing/SKILL.md +3 -3
  299. package/library/skills/store-listing/resource.yaml +2 -2
  300. package/library/skills/summer-analytics/SKILL.md +7 -5
  301. package/library/skills/summer-analytics/resource.yaml +2 -2
  302. package/library/skills/summer-apps/SKILL.md +168 -0
  303. package/library/skills/summer-apps/manifest.md +57 -0
  304. package/library/skills/summer-apps/minimal-app.md +183 -0
  305. package/library/skills/summer-apps/resource.yaml +36 -0
  306. package/library/skills/summer-apps/sdk-reference.md +135 -0
  307. package/library/skills/summer-apps-design/SKILL.md +197 -0
  308. package/library/skills/summer-apps-design/resource.yaml +23 -0
  309. package/library/skills/summer-assets/SKILL.md +56 -0
  310. package/library/skills/summer-assets/resource.yaml +34 -0
  311. package/library/skills/summer-store/SKILL.md +1 -1
  312. package/library/skills/text-to-motion/SKILL.md +30 -23
  313. package/library/skills/text-to-motion/prompts-and-controls.md +5 -5
  314. package/library/skills/text-to-motion/resource.yaml +1 -1
  315. package/library/skills/text-to-motion/rigging-for-text-motion.md +2 -2
  316. package/library/skills/tileable-texture/SKILL.md +19 -15
  317. package/library/skills/tileable-texture/resource.yaml +1 -1
  318. package/library/skills/trailer-shot/SKILL.md +28 -24
  319. package/library/skills/trailer-shot/resource.yaml +1 -1
  320. package/library/skills/tune-performance/SKILL.md +6 -6
  321. package/library/skills/tune-performance/resource.yaml +1 -1
  322. package/library/skills/ui-basics/SKILL.md +41 -36
  323. package/library/skills/ui-basics/resource.yaml +1 -1
  324. package/library/skills/ui-graphics/SKILL.md +47 -38
  325. package/library/skills/ui-graphics/resource.yaml +1 -1
  326. package/library/skills/use-widget-asset/SKILL.md +1 -1
  327. package/library/skills/use-widget-asset/resource.yaml +1 -1
  328. package/library/skills/using-summer/SKILL.md +7 -5
  329. package/library/skills/using-summer/resource.yaml +1 -1
  330. package/library/skills/vehicle-model/SKILL.md +65 -57
  331. package/library/skills/vehicle-model/resource.yaml +1 -1
  332. package/library/skills/verification-before-completion/SKILL.md +1 -1
  333. package/library/skills/verification-before-completion/resource.yaml +1 -1
  334. package/library/skills/verifying-scenes/SKILL.md +2 -2
  335. package/library/skills/verifying-scenes/resource.yaml +1 -1
  336. package/library/skills/vfx-dissolve/SKILL.md +2 -2
  337. package/library/skills/vfx-dissolve/resource.yaml +1 -1
  338. package/library/skills/vfx-fire/SKILL.md +15 -41
  339. package/library/skills/vfx-fire/resource.yaml +1 -1
  340. package/library/skills/vfx-hit-spark/SKILL.md +1 -1
  341. package/library/skills/vfx-hit-spark/resource.yaml +1 -1
  342. package/library/skills/vfx-lightning/SKILL.md +7 -16
  343. package/library/skills/vfx-lightning/resource.yaml +1 -1
  344. package/library/skills/vfx-magic-glow/SKILL.md +23 -32
  345. package/library/skills/vfx-magic-glow/resource.yaml +1 -1
  346. package/library/skills/vfx-muzzle-flash/SKILL.md +20 -35
  347. package/library/skills/vfx-muzzle-flash/resource.yaml +1 -1
  348. package/library/skills/vfx-smoke/SKILL.md +13 -31
  349. package/library/skills/vfx-smoke/resource.yaml +1 -1
  350. package/library/skills/vfx-water-ripple/SKILL.md +12 -31
  351. package/library/skills/vfx-water-ripple/resource.yaml +1 -1
  352. package/library/skills/voice-line/SKILL.md +71 -40
  353. package/library/skills/voice-line/resource.yaml +1 -1
  354. package/library/skills/web-and-touch-input/SKILL.md +1 -1
  355. package/library/skills/web-and-touch-input/resource.yaml +1 -1
  356. package/library/skills/web-compatibility-look/SKILL.md +1 -1
  357. package/library/skills/web-compatibility-look/resource.yaml +1 -1
  358. package/library/skills/world-building-3d/SKILL.md +1 -1
  359. package/library/skills/world-building-3d/resource.yaml +1 -1
  360. package/library/skills/writing-skills/resource.yaml +1 -0
  361. package/library/tools/add-node/GUIDE.md +14 -0
  362. package/library/tools/align-distribute-3d/GUIDE.md +7 -0
  363. package/library/tools/app-call/resource.yaml +59 -0
  364. package/library/tools/app-create/resource.yaml +67 -0
  365. package/library/tools/app-data/resource.yaml +74 -0
  366. package/library/tools/app-dock/resource.yaml +59 -0
  367. package/library/tools/app-events/resource.yaml +68 -0
  368. package/library/tools/app-get/resource.yaml +46 -0
  369. package/library/tools/app-guide/resource.yaml +55 -0
  370. package/library/tools/app-list/resource.yaml +48 -0
  371. package/library/tools/app-page/resource.yaml +74 -0
  372. package/library/tools/app-publish/resource.yaml +90 -0
  373. package/library/tools/app-report-gap/resource.yaml +58 -0
  374. package/library/tools/app-screenshot/resource.yaml +103 -0
  375. package/library/tools/app-tools/resource.yaml +46 -0
  376. package/library/tools/app-update/resource.yaml +68 -0
  377. package/library/tools/attach-to-surface/GUIDE.md +15 -0
  378. package/library/tools/batch/GUIDE.md +27 -0
  379. package/library/tools/camera-bookmark/GUIDE.md +12 -0
  380. package/library/tools/capture-gameplay/GUIDE.md +3 -0
  381. package/library/tools/capture-gameplay/resource.yaml +3 -3
  382. package/library/tools/check-job/resource.yaml +1 -1
  383. package/library/tools/clear-console/GUIDE.md +3 -0
  384. package/library/tools/connect-ports/GUIDE.md +9 -0
  385. package/library/tools/connect-signal/GUIDE.md +14 -0
  386. package/library/tools/create-debug-report/GUIDE.md +10 -0
  387. package/library/tools/create-scene/GUIDE.md +10 -0
  388. package/library/tools/debug-views/GUIDE.md +7 -0
  389. package/library/tools/enable-plugin/GUIDE.md +3 -0
  390. package/library/tools/enable-plugin/resource.yaml +53 -0
  391. package/library/tools/export-game/GUIDE.md +3 -0
  392. package/library/tools/export-game/resource.yaml +3 -3
  393. package/library/tools/export-templates/GUIDE.md +3 -0
  394. package/library/tools/fabricate-3d/GUIDE.md +19 -0
  395. package/library/tools/frame-nodes/GUIDE.md +9 -0
  396. package/library/tools/frame-shot/GUIDE.md +9 -0
  397. package/library/tools/game-control/GUIDE.md +9 -0
  398. package/library/tools/game-input/GUIDE.md +9 -0
  399. package/library/tools/game-probe/GUIDE.md +9 -0
  400. package/library/tools/generate-3d/resource.yaml +3 -3
  401. package/library/tools/generate-motion/resource.yaml +2 -2
  402. package/library/tools/get-console/GUIDE.md +9 -0
  403. package/library/tools/get-console/resource.yaml +5 -0
  404. package/library/tools/get-debugger-errors/GUIDE.md +7 -0
  405. package/library/tools/get-debugger-errors/resource.yaml +5 -0
  406. package/library/tools/get-debugger-warnings/GUIDE.md +7 -0
  407. package/library/tools/get-debugger-warnings/resource.yaml +5 -0
  408. package/library/tools/get-diagnostics/GUIDE.md +13 -0
  409. package/library/tools/get-project-context/GUIDE.md +25 -0
  410. package/library/tools/get-runtime-tree/GUIDE.md +7 -0
  411. package/library/tools/get-runtime-tree/resource.yaml +5 -0
  412. package/library/tools/get-scene-tree/GUIDE.md +11 -0
  413. package/library/tools/get-scene-tree/resource.yaml +5 -0
  414. package/library/tools/get-script-errors/GUIDE.md +5 -0
  415. package/library/tools/grep/GUIDE.md +11 -0
  416. package/library/tools/import-asset/GUIDE.md +8 -0
  417. package/library/tools/import-asset-by-id/GUIDE.md +12 -0
  418. package/library/tools/import-from-url/GUIDE.md +10 -0
  419. package/library/tools/import-from-url-batch/GUIDE.md +3 -0
  420. package/library/tools/import-hdri/GUIDE.md +16 -0
  421. package/library/tools/input-map-bind/GUIDE.md +11 -0
  422. package/library/tools/inspect-asset/GUIDE.md +14 -0
  423. package/library/tools/inspect-asset/resource.yaml +5 -0
  424. package/library/tools/inspect-node/GUIDE.md +11 -0
  425. package/library/tools/inspect-node/resource.yaml +5 -0
  426. package/library/tools/inspect-resource/GUIDE.md +7 -0
  427. package/library/tools/inspect-resource/resource.yaml +5 -0
  428. package/library/tools/inspect-runtime-node/GUIDE.md +7 -0
  429. package/library/tools/inspect-runtime-node/resource.yaml +5 -0
  430. package/library/tools/instantiate-scene/GUIDE.md +12 -0
  431. package/library/tools/is-running/GUIDE.md +3 -0
  432. package/library/tools/measure/GUIDE.md +8 -0
  433. package/library/tools/navigation-probe/GUIDE.md +9 -0
  434. package/library/tools/open/resource.yaml +2 -2
  435. package/library/tools/open-main-scene/GUIDE.md +6 -0
  436. package/library/tools/open-scene/GUIDE.md +8 -0
  437. package/library/tools/place-adjacent/GUIDE.md +7 -0
  438. package/library/tools/play/GUIDE.md +13 -0
  439. package/library/tools/project-setting/GUIDE.md +9 -0
  440. package/library/tools/publish-build/resource.yaml +6 -6
  441. package/library/tools/raycast/GUIDE.md +7 -0
  442. package/library/tools/read-file/GUIDE.md +10 -0
  443. package/library/tools/read-library/resource.yaml +5 -0
  444. package/library/tools/recent-events/GUIDE.md +7 -0
  445. package/library/tools/remove-node/GUIDE.md +3 -0
  446. package/library/tools/repeat-along/GUIDE.md +5 -0
  447. package/library/tools/replace-node/GUIDE.md +9 -0
  448. package/library/tools/replace-text/GUIDE.md +5 -0
  449. package/library/tools/run-editor-script/GUIDE.md +16 -0
  450. package/library/tools/run-script/GUIDE.md +30 -0
  451. package/library/tools/run-script/resource.yaml +6 -3
  452. package/library/tools/runtime-animate/GUIDE.md +7 -0
  453. package/library/tools/runtime-call/GUIDE.md +7 -0
  454. package/library/tools/runtime-set/GUIDE.md +9 -0
  455. package/library/tools/runtime-spawn/GUIDE.md +9 -0
  456. package/library/tools/save-scene/GUIDE.md +3 -0
  457. package/library/tools/scene-audit/GUIDE.md +29 -0
  458. package/library/tools/screenshot/GUIDE.md +17 -0
  459. package/library/tools/select-node/GUIDE.md +3 -0
  460. package/library/tools/set-prop/GUIDE.md +23 -0
  461. package/library/tools/set-resource-property/GUIDE.md +8 -0
  462. package/library/tools/shot-sheet/GUIDE.md +7 -0
  463. package/library/tools/snap-to-surface/GUIDE.md +17 -0
  464. package/library/tools/snapshot-diff/GUIDE.md +7 -0
  465. package/library/tools/starcast/GUIDE.md +12 -0
  466. package/library/tools/stop/GUIDE.md +3 -0
  467. package/library/tools/test-placement/GUIDE.md +7 -0
  468. package/library/tools/ui-actions/GUIDE.md +12 -0
  469. package/library/tools/ui-activate/GUIDE.md +11 -0
  470. package/library/tools/ui-screenshot/GUIDE.md +9 -0
  471. package/library/tools/ui-tree/GUIDE.md +10 -0
  472. package/library/tools/wait-for-event/GUIDE.md +11 -0
  473. package/library/tools/world-snapshot/GUIDE.md +9 -0
  474. package/library/tools/write-file/GUIDE.md +5 -0
  475. package/library/tools/zoom/GUIDE.md +5 -0
  476. package/package.json +6 -4
  477. package/registry/generated/aliases.json +15 -0
  478. package/registry/generated/counts.json +3 -3
  479. package/registry/generated/gemini-extension.json +6 -12
  480. package/registry/generated/index.json +1155 -408
  481. package/registry/generated/marketplace.claude.json +2 -13
  482. package/registry/generated/plugin.claude.json +25 -22
  483. package/registry/generated/plugin.codex.json +8 -14
  484. package/registry/generated/plugin.cursor.json +7 -13
  485. package/registry/generated/plugin.factory.json +7 -13
  486. package/registry/generated/server.json +34 -0
  487. package/registry/generated/skills-index.md +126 -116
  488. package/registry/generated/skills-registry.json +178 -113
  489. package/registry/operations/fixtures/invalid-deprecated-without-replacement.json +60 -0
  490. package/registry/operations/fixtures/invalid-name.json +60 -0
  491. package/registry/operations/fixtures/invalid-publish-without-owner.json +82 -0
  492. package/registry/operations/fixtures/invalid-spend-without-estimate.json +42 -0
  493. package/registry/operations/fixtures/invalid-unknown-field.json +61 -0
  494. package/registry/operations/fixtures/valid-player-facing.json +82 -0
  495. package/registry/operations/fixtures/valid-read.json +60 -0
  496. package/registry/operations/fixtures/valid-spend.json +43 -0
  497. package/registry/operations/legacy-names.json +1206 -0
  498. package/registry/schemas/allowed-hosts.json +4 -2
  499. package/registry/schemas/operation.schema.json +318 -0
  500. package/registry/schemas/skill.schema.json +4 -0
  501. package/CLAUDE.md +0 -7
@@ -1,7 +1,7 @@
1
1
  id: skill/sound-effect
2
2
  kind: skill
3
3
  version: 1.1.0
4
- summary: "Make SFX one-shots and timed sequences (swings, hits, whooshes, reloads, UI) - offer three model versions to pick from, then wire them as AudioStreamPlayers."
4
+ summary: "Make sound effects (swings, hits, whooshes, reloads, UI): three versions to pick from, then wire them."
5
5
  use_when:
6
6
  - generating short SFX one-shots — footsteps, weapon swings, UI clicks, hit impacts, environmental cues
7
7
  - an action, impact, or UI interaction is silent and needs a short one-shot sound wired to it
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: spatial-placement
3
- description: "Place 3D objects and modular kit pieces from measured geometry — inspect, place, starcast, measure, correct; floor, wall, facade, pipe and alcove recipes."
3
+ description: "Place 3D objects and modular kit pieces from measured geometry: floors, walls, facades, pipes, alcoves."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: scene-and-project
@@ -108,17 +108,25 @@ with its back `-z` and open loops at both ends; `wall_lamp` has its back `-z`;
108
108
  `wall_clamp` is small with its back `-z`. Scene `res://facade_test.tscn` with a
109
109
  `Facade` Node3D at the origin.
110
110
 
111
+ Place every piece at a rough pose in one `summer_batch`, then let the measured
112
+ tools seat each one:
113
+
111
114
  ```text
112
- summer_instantiate_scene {scenePath:"res://facade_test.tscn", parent:"./Facade",
113
- scene:"res://kit/wall_double.tscn", name:"G1", position:[0,0,0]}
114
- summer_instantiate_scene {..., scene:"res://kit/window_double.tscn", name:"G2", position:[2,0,0]}
115
+ summer_batch {scenePath:"res://facade_test.tscn", receipt:"summary", ops:[
116
+ {op:"InstantiateScene", parent:"./Facade", scene:"res://kit/wall_double.tscn", name:"G1", position:[0,0,0]},
117
+ {op:"InstantiateScene", parent:"./Facade", scene:"res://kit/window_double.tscn", name:"G2", position:[2,0,0]},
118
+ {op:"InstantiateScene", parent:"./Facade", scene:"res://kit/window_double.tscn", name:"U1", position:[0,3,0]},
119
+ {op:"InstantiateScene", parent:"./Facade", scene:"res://kit/window_double.tscn", name:"U2", position:[2,3,0]},
120
+ {op:"InstantiateScene", parent:"./Facade", scene:"res://kit/gutter_section.tscn", name:"Pipe_1", position:[2.15,0.1,0.5]},
121
+ {op:"InstantiateScene", parent:"./Facade", scene:"res://kit/gutter_section.tscn", name:"Pipe_2", position:[2.15,1.1,0.1]},
122
+ {op:"InstantiateScene", parent:"./Facade", scene:"res://kit/wall_lamp.tscn", name:"Lamp", position:[1,2.6,0.5]}]}
123
+ -> one compact receipt: the seven nodes and their poses
124
+
115
125
  summer_place_adjacent {scenePath:"res://facade_test.tscn", subject:"./Facade/G2",
116
126
  reference:"./Facade/G1", axis:"x", side:"max", alignOtherAxes:{y:"min", z:"max"}}
117
127
  -> verify {gap:0, residuals:{y:0, z:0}}
118
- summer_instantiate_scene {..., scene:"res://kit/window_double.tscn", name:"U1", position:[0,3,0]}
119
128
  summer_place_adjacent {..., subject:"./Facade/U1", reference:"./Facade/G1",
120
129
  axis:"y", side:"max", alignOtherAxes:{x:"min", z:"max"}}
121
- summer_instantiate_scene {..., scene:"res://kit/window_double.tscn", name:"U2", position:[2,3,0]}
122
130
  summer_place_adjacent {..., subject:"./Facade/U2", reference:"./Facade/U1",
123
131
  axis:"x", side:"max", alignOtherAxes:{y:"min", z:"max"}}
124
132
  summer_measure {scenePath:"res://facade_test.tscn", mode:"plane",
@@ -127,11 +135,9 @@ summer_measure {scenePath:"res://facade_test.tscn", mode:"plane",
127
135
 
128
136
  summer_raycast {scenePath:"res://facade_test.tscn", origin:[2.15,0.5,1], direction:[0,0,-1]}
129
137
  -> hit ./Facade/G2, normal [0,0,1]: the wall front, by physics
130
- summer_instantiate_scene {..., scene:"res://kit/gutter_section.tscn", name:"Pipe_1", position:[2.15,0.1,0.5]}
131
138
  summer_attach_to_surface {scenePath:"res://facade_test.tscn", subject:"./Facade/Pipe_1",
132
139
  ray:{origin:[2.15,0.5,1], direction:[0,0,-1]}, backAxis:"-z", upAxis:"+y", standoff:0.02}
133
140
  -> seated_on "Facade/G2", final_gap 0.02, back_face_gap 0.02; the pipe keeps y 0.1
134
- summer_instantiate_scene {..., scene:"res://kit/gutter_section.tscn", name:"Pipe_2", position:[2.15,1.1,0.1]}
135
141
  summer_connect_ports {scenePath:"res://facade_test.tscn", subject:"./Facade/Pipe_2", subjectPort:"-Y",
136
142
  target:"./Facade/Pipe_1", targetPort:"+Y"}
137
143
  -> tilt_degrees 0, verify {distance:0, angle_degrees:0}, other_ports [{id:"+Y", direction:[0,1,0]}]
@@ -139,7 +145,6 @@ summer_repeat_along {scenePath:"res://facade_test.tscn", template:"res://kit/wal
139
145
  parent:"./Facade", start:[2.15,0.3,0.02], end:[2.15,1.9,0.02], spacing:0.45}
140
146
  -> count 4, created ["Facade/wall_clamp_1", ...]
141
147
 
142
- summer_instantiate_scene {..., scene:"res://kit/wall_lamp.tscn", name:"Lamp", position:[1,2.6,0.5]}
143
148
  summer_attach_to_surface {scenePath:"res://facade_test.tscn", subject:"./Facade/Lamp",
144
149
  surface:"./Facade/G1", backAxis:"-z", standoff:0}
145
150
  summer_starcast {scenePath:"res://facade_test.tscn", path:"./Facade/Lamp", directionSpace:"local"}
@@ -1,7 +1,7 @@
1
1
  id: skill/spatial-placement
2
2
  kind: skill
3
3
  version: 1.1.0
4
- summary: Place 3D objects and modular kit pieces from measured geometry — inspect, place, starcast, measure, correct; floor, wall, facade, pipe and alcove recipes.
4
+ summary: "Place 3D objects and modular kit pieces from measured geometry: floors, walls, facades, pipes, alcoves."
5
5
  use_when:
6
6
  - positioning a prop, character, collider, or platform so it sits flush, avoids overlap, or keeps clearance
7
7
  - placing something against a wall, inside an alcove, or on a shelf and needing to know which side is blocked and by how much
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: sprite-sheet
3
- description: "Generate animated 2D character sprites laid out as a sprite sheet — walk cycle, attack, idle, death — wired into AnimatedSprite2D / SpriteFrames."
3
+ description: "Generate animated 2D character sprite sheets (walk, attack, idle, death) for AnimatedSprite2D."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: 2d-assets
7
7
  user-invocable: true
8
- allowed-tools: Read Grep Glob Write Edit summer_generate_image summer_slice_asset_sheet summer_get_studio_workflow summer_search_assets summer_import_from_url summer_import_asset_by_id summer_set_resource_property summer_write_file summer_add_node summer_set_prop summer_save_scene
8
+ allowed-tools: Read Grep Glob Write Edit summer_assets_generate_image summer_assets_slice_sheet summer_assets_search summer_import_from_url summer_import_from_url_batch summer_import_asset_by_id summer_set_resource_property summer_write_file summer_add_node summer_set_prop summer_save_scene summer_call
9
9
  paths: ["assets/**", "sprites/**", "art/sprites/**"]
10
10
  ---
11
11
 
@@ -18,10 +18,10 @@ Sprite-sheet generation from a single text-to-image call is **unreliable**. Mode
18
18
  This skill therefore offers **three paths**, ranked by reliability:
19
19
 
20
20
  1. **Per-frame img2img** (most reliable) — generate the base pose, then generate each subsequent frame via `referenceImageUrl` with a small pose delta. Composite the frames into a sheet externally or wire each as a separate `SpriteFrames` entry.
21
- 2. **Single-call sheet + auto-slice** (fast; sheet coherence is the gamble, not the cutting) — one prompt asks for the grid, then `summer_slice_asset_sheet` cuts it into individual frame assets server-side. Worth trying once for short cycles (4 frames or fewer) before falling back to (1).
21
+ 2. **Single-call sheet + auto-slice** (fast; sheet coherence is the gamble, not the cutting) — one prompt asks for the grid, then `assets.slice_sheet` cuts it into individual frames server-side. Worth trying once for short cycles (4 frames or fewer) before falling back to (1).
22
22
  3. **Manual authoring** (most reliable, slowest) — hand-author in **Aseprite** or **Piskel**. For pixel art at 32×32, this is often faster than fixing AI generations.
23
23
 
24
- There is no single "generate a sprite sheet" tool, but there **is** a shared two-tool sheet pipeline, and it is the same one Studio's Guided "sprite-sheet" workflow runs: `summer_generate_image` produces one sheet, then `summer_slice_asset_sheet({ assetId })` runs the server-side vision slicer that removes the background, detects each frame's bounding box, crops, and uploads every frame as its own asset. Call `summer_get_studio_workflow({ workflowId: "sprite-sheet" })` for the current ordered recipe and its stated limitations. Only Studio's frame-preview and visual timing-review UI is unreachable from MCP — the generation and the slicing both are reachable.
24
+ There is no single "generate a sprite sheet" operation, but there **is** a shared two-step sheet pipeline, and it is the same one Studio's Guided "sprite-sheet" workflow runs: `assets.generate_image` produces one sheet, then `assets.slice_sheet({ assetId })` runs the server-side vision slicer that removes the background, detects each frame's bounding box, crops, and uploads every frame as its own image (one URL per slice). Call `summer_call({ op: "docs.workflows", input: { workflowId: "sprite-sheet" } })` for the current ordered recipe and its stated limitations. Only Studio's frame-preview and visual timing-review UI is unreachable from MCP — the generation and the slicing both are reachable.
25
25
 
26
26
  So do not tell the user to cut a generated sheet by hand or in ImageMagick. The cutting is automated; what is unreliable is inter-frame *consistency* inside the generated sheet.
27
27
 
@@ -38,7 +38,7 @@ So do not tell the user to cut a generated sheet by hand or in ImageMagick. The
38
38
  - The character is 3D — use `generate-motion` for skeletal animation.
39
39
  - The user wants a single static sprite → `pixel-art` or `character-portrait`.
40
40
  - The user wants UI animation (loading spinner, button hover) — animate via `AnimationPlayer` rotating/tweening a static texture instead. Don't sprite-sheet UI.
41
- - The user has 12+ frames per animation and 4+ animations. That is dozens to hundreds of generations, each using credits. Pause and agree on scope first.
41
+ - The user has 12+ frames per animation and 4+ animations. That is dozens to hundreds of generations, each using credits. Pause and agree on scope first; `dryRun: true` on one frame's call shows its credits.
42
42
 
43
43
  ## Steps
44
44
 
@@ -69,16 +69,16 @@ State the path before starting: "I'll do per-frame img2img: 6 generations. The f
69
69
  Generate frame 1 (or use existing base). For each subsequent frame, prompt the pose delta and pass the previous frame as `referenceImageUrl`:
70
70
 
71
71
  ```
72
- summer_generate_image(
73
- prompt="goblin warrior, walk cycle frame 2 of 6, right leg forward, slight bob upward, identical character, same costume, same palette. Not a different character, not a different costume, no scene background.",
74
- referenceImageUrl="<frame 1 fileUrl>",
75
- model="nano-banana-2",
76
- style="<same as base>",
77
- removeBackground=true
78
- )
72
+ assets.generate_image({
73
+ prompt: "goblin warrior, walk cycle frame 2 of 6, right leg forward, slight bob upward, identical character, same costume, same palette. Not a different character, not a different costume, no scene background.",
74
+ referenceImageUrl: "<frame 1 fileUrl>",
75
+ model: "nano-banana-2",
76
+ style: "<same as base>",
77
+ removeBackground: true
78
+ })
79
79
  ```
80
80
 
81
- `summer_generate_image` has no size argument; put negations in the prompt text. `removeBackground: true` gives you real alpha instead of a prompted "transparent background" that the model may paint as a literal checkerboard. `referenceImageUrl` only works on edit-capable models (`nano-banana-2`, `seedream-5-pro`, `nano-banana-lite`, `gpt-image-2`, `gemini-flash`, `flux-2`); `grok-imagine` has no edit endpoint and returns `edit_not_supported`.
81
+ Keep `aspectRatio` (and `width` / `height`, if you set them) the same for every frame; put negations in the prompt text. `removeBackground: true` gives you real alpha instead of a prompted "transparent background" that the model may paint as a literal checkerboard. `referenceImageUrl` only works on edit-capable models (`nano-banana-2`, `seedream-5-pro`, `nano-banana-lite`, `gpt-image-2`, `gemini-flash`, `flux-2`); `grok-imagine` has no edit endpoint and returns `edit_not_supported`.
82
82
 
83
83
  Repeat for each frame. Save each as `goblin_walk_01.png`, `goblin_walk_02.png`, etc.
84
84
 
@@ -89,23 +89,24 @@ composite them into one sheet image.
89
89
  ### 3b. Path 2 — Single-call sheet, then auto-slice
90
90
 
91
91
  ```
92
- summer_generate_image(
93
- prompt="goblin warrior walk cycle, sprite sheet, 6 frames in a horizontal row, identical character across frames, side view, frames clearly separated with empty space between them, consistent lighting, consistent palette. No scene background, no varying lighting, not a different character per frame.",
94
- model="nano-banana-2",
95
- style="none",
96
- removeBackground=true
97
- )
92
+ assets.generate_image({
93
+ prompt: "goblin warrior walk cycle, sprite sheet, 6 frames in a horizontal row, identical character across frames, side view, frames clearly separated with empty space between them, consistent lighting, consistent palette. No scene background, no varying lighting, not a different character per frame.",
94
+ model: "nano-banana-2",
95
+ style: "none",
96
+ aspectRatio: "21:9",
97
+ removeBackground: true
98
+ })
98
99
  ```
99
100
 
100
- There is no `"pixel"` style preset (`style` is `realistic | cartoon | anime | none`; anything else is coerced to `none`) and no size argument; the layout and the negations have to be in the prompt.
101
+ There is no `"pixel"` style preset (`style` is `realistic | cartoon | anime | none`). A wide `aspectRatio` gives a row of frames room; the layout and the negations have to be in the prompt.
101
102
 
102
103
  Then cut it with the same server-side slicer Studio uses, passing the asset id the generation returned:
103
104
 
104
105
  ```
105
- summer_slice_asset_sheet(assetId="<generated sheet assetId>")
106
+ assets.slice_sheet({ assetId: "<generated sheet assetId>" })
106
107
  ```
107
108
 
108
- It returns the source dimensions plus per-slice URLs, names, categories, and bounding boxes. Import the frames you want by id with `summer_import_asset_by_id`.
109
+ It returns `source` (the sheet's width and height) and `slices`: each slice's `url`, `name`, `category` and `bbox`. The slices are image URLs, not assets: import the frames you want with `summer_import_from_url_batch`.
109
110
 
110
111
  Inspect the result. If the frames are coherent and the count matches, proceed. If anatomy morphs across the row, or the slicer returns one giant box (items touching / no gaps), fall back to Path 1 or Path 3 — re-prompting with more separation between frames is the first thing to try.
111
112
 
@@ -202,7 +203,7 @@ func _physics_process(delta):
202
203
  - **Wiring an inconsistent sheet anyway** because you don't want to regenerate. Ship the inconsistency and the player notices the morphing limbs immediately. Cut the frame count or hand-author instead.
203
204
  - **Sprite-sheeting things that don't need to be sprite-sheeted.** UI animation, simple bobs, fades — use `AnimationPlayer` to tween a static texture instead. Sprite sheets are for character animation specifically.
204
205
  - **Pretending Aseprite is a failure.** Hand-authoring 4 pixel-art frames takes 10 minutes and looks better than 8 AI generations. Don't oversell AI here.
205
- - **Sending the user to ImageMagick or Aseprite to *cut* a generated sheet.** `summer_slice_asset_sheet` does that server-side. Hand off the creative work, not the mechanical work.
206
+ - **Sending the user to ImageMagick or Aseprite to *cut* a generated sheet.** `assets.slice_sheet` does that server-side. Hand off the creative work, not the mechanical work.
206
207
 
207
208
  ## Edge cases
208
209
 
@@ -212,14 +213,18 @@ func _physics_process(delta):
212
213
  - **User wants a turn-around (rotating in place over 8 frames).** Same as 8-direction; generate single-frame per angle as anchor, accept that AI rotation won't be perfectly consistent.
213
214
  - **Animation needs to loop seamlessly.** Make frame N+1 explicitly bridge back to frame 1 in your prompt. Or generate one extra "bridge" frame and drop it.
214
215
 
216
+ ## Without Summer Engine
217
+
218
+ In a session without Summer Engine tools (the assets profile; the `summer-assets` skill has the whole loop), do steps 1-3 and skip steps 4-6 (import, `AnimatedSprite2D`, trigger code). Pass `out` with the person's folder for each frame, or slice a sheet with `assets.slice_sheet` and save each piece with `assets.get` and `out` (the `summer-assets` skill says how). Tell the person the frame order and the frame rate you planned.
219
+
215
220
  ## Fallback (no MCP)
216
221
 
217
222
  Print the per-frame call sequence:
218
223
 
219
224
  ```
220
- Frame 1: summer_generate_image(prompt="<base>", model="nano-banana-2", style="none", ...)
221
- Frame 2: summer_generate_image(prompt="<base + delta>", referenceImageUrl="<frame 1>", ...)
222
- Frame 3: summer_generate_image(prompt="<base + delta>", referenceImageUrl="<frame 2>", ...)
225
+ Frame 1: assets.generate_image({ prompt: "<base>", model: "nano-banana-2", style: "none", ... })
226
+ Frame 2: assets.generate_image({ prompt: "<base + delta>", referenceImageUrl: "<frame 1>", ... })
227
+ Frame 3: assets.generate_image({ prompt: "<base + delta>", referenceImageUrl: "<frame 2>", ... })
223
228
  ...
224
229
  ```
225
230
 
@@ -241,4 +246,4 @@ After the animation is wired:
241
246
  - `character-portrait` — base portrait for higher-res characters.
242
247
  - `generate-motion` — 3D-skeletal counterpart.
243
248
  - `sound-effect` — frame-synced SFX.
244
- - `../../references/mcp-tools-reference/mcp-tools-reference.md` — `summer_generate_image` schema.
249
+ - `summer_docs_read` id `reference/mcp-tools-reference` — how to call `assets.generate_image`.
@@ -1,7 +1,7 @@
1
1
  id: skill/sprite-sheet
2
2
  kind: skill
3
3
  version: 1.0.4
4
- summary: Generate animated 2D character sprites laid out as a sprite sheet — walk cycle, attack, idle, death — wired into AnimatedSprite2D / SpriteFrames.
4
+ summary: "Generate animated 2D character sprite sheets (walk, attack, idle, death) for AnimatedSprite2D."
5
5
  use_when:
6
6
  - generating animated 2D character sprites laid out as a grid of frames — walk cycle, attack frames, idle bob, death sequence
7
7
  - a 2D sprite needs its frames laid out as one grid image for AnimatedSprite2D or SpriteFrames
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: store-art
3
- description: "Make Summer Games store art per slot and flow: key art, covers, icons, screenshots, trailer: size, shape, text rules, fallbacks."
3
+ description: "Make Summer Games store art per slot: key art, covers, icons, screenshots, trailer, size and text rules."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: deployment
7
7
  user-invocable: true
8
- allowed-tools: summer_read_library
8
+ allowed-tools: summer_docs_read
9
9
  ---
10
10
 
11
11
  # /store-art — store art
@@ -14,7 +14,7 @@ This skill covers every store art slot per flow (desktop and mobile): size, shap
14
14
 
15
15
  Its current text lives on the hosted Summer Engine MCP, the same text the Studio agent reads, so it changes with the store and is never stale here. Load it before you act:
16
16
 
17
- 1. `summer_read_library` with id `skill/store-art` returns the current text when this machine has a store sign-in (`summer login --store`).
17
+ 1. `summer_docs_read` with id `skill/store-art` returns the current text when this machine is signed in (`summer login`).
18
18
  2. A host that shows MCP prompts or resources has it as the `store-art` prompt and the resource `summer://skills/store-art`.
19
19
  3. Without a store sign-in: https://docs.summerengine.com/llms.txt lists every docs page; fetch any page as .md.
20
20
 
@@ -1,10 +1,10 @@
1
1
  id: skill/store-art
2
2
  kind: skill
3
3
  version: 1.0.0
4
- summary: "Make Summer Games store art per slot and flow: key art, covers, icons, screenshots, trailer: size, shape, text rules, fallbacks."
4
+ summary: "Make Summer Games store art per slot: key art, covers, icons, screenshots, trailer, size and text rules."
5
5
  use_when:
6
6
  - "making or choosing store art for Summer Games: key art, cover, icon, screenshots, trailer"
7
- - "summer_store_set_art rejects an image for its shape or size, or summer_store_get_listing says an art slot is missing"
7
+ - "store.set_art rejects an image for its shape or size, or store.get_listing says an art slot is missing"
8
8
  - "deciding whether a store image may carry text, and which slot falls back to which"
9
9
  facets:
10
10
  lifecycle:
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: store-listing
3
- description: "Write a Summer Games store page per flow (desktop, mobile): targets, title, tagline, descriptions, tags, and what never to write."
3
+ description: "Write a Summer Games store page: title, tagline, descriptions, tags, per platform, and what never to write."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: deployment
7
7
  user-invocable: true
8
- allowed-tools: summer_read_library
8
+ allowed-tools: summer_docs_read
9
9
  ---
10
10
 
11
11
  # /store-listing — store listing
@@ -14,7 +14,7 @@ This skill covers the store page text per flow (desktop and mobile): targets, ti
14
14
 
15
15
  Its current text lives on the hosted Summer Engine MCP, the same text the Studio agent reads, so it changes with the store and is never stale here. Load it before you act:
16
16
 
17
- 1. `summer_read_library` with id `skill/store-listing` returns the current text when this machine has a store sign-in (`summer login --store`).
17
+ 1. `summer_docs_read` with id `skill/store-listing` returns the current text when this machine is signed in (`summer login`).
18
18
  2. A host that shows MCP prompts or resources has it as the `store-listing` prompt and the resource `summer://skills/store-listing`.
19
19
  3. Without a store sign-in: https://docs.summerengine.com/llms.txt lists every docs page; fetch any page as .md.
20
20
 
@@ -1,10 +1,10 @@
1
1
  id: skill/store-listing
2
2
  kind: skill
3
3
  version: 1.0.0
4
- summary: "Write a Summer Games store page per flow (desktop, mobile): targets, title, tagline, descriptions, tags, and what never to write."
4
+ summary: "Write a Summer Games store page: title, tagline, descriptions, tags, per platform, and what never to write."
5
5
  use_when:
6
6
  - "writing or fixing a game's store page text on Summer Games: title, tagline, description, tags"
7
- - "summer_store_update_listing or summer_store_get_listing says a text field is missing or wrong"
7
+ - "store.update_listing or store.get_listing says a text field is missing or wrong"
8
8
  - "choosing the targets (web, Mac, Windows, Linux, iPhone, Android) that decide the desktop and mobile store flows"
9
9
  facets:
10
10
  lifecycle:
@@ -5,11 +5,11 @@ license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: multiplayer-and-networking
7
7
  user-invocable: true
8
- allowed-tools: Read Grep Edit Write summer_get_script_errors summer_play summer_stop summer_get_diagnostics summer_open
8
+ allowed-tools: Read Grep Edit Write summer_get_script_errors summer_play summer_stop summer_get_diagnostics summer_call
9
9
  paths: ["**/*.gd"]
10
10
  ---
11
11
 
12
- # /summer-analytics — game events you can chart later
12
+ # /summer-analytics — game events you read in Grow
13
13
 
14
14
  ## Overview
15
15
 
@@ -105,9 +105,11 @@ On the client, after a menu choice:
105
105
 
106
106
  ### 4. Read the results
107
107
 
108
- Open the game's analytics in Studio: `summer_open` with target `game` and
109
- params `gameId` (your game's id) and `section: "analytics"`. Events show up
110
- there after a short delay.
108
+ `analytics.summary` (hosted, after `summer login`) returns the
109
+ game's top custom events next to its store page views, launches and play
110
+ time; the `grow-analytics` skill says how to read them. In Studio:
111
+ `studio.open` with target `game`, params `gameId` (your game's id) and
112
+ `section: "analytics"`. Events show up after a short delay.
111
113
 
112
114
  ## Result codes
113
115
 
@@ -1,6 +1,6 @@
1
1
  id: skill/summer-analytics
2
2
  kind: skill
3
- version: 1.0.0
3
+ version: 1.0.1
4
4
  summary: "Send game events to Summer analytics from the authority or client: fire-and-forget, never blocking gameplay."
5
5
  use_when:
6
6
  - "adding analytics, telemetry or event tracking to a Summer game: level completed, coin collected, tutorial funnel"
@@ -25,5 +25,5 @@ related:
25
25
  - skill/grow-analytics
26
26
  source: official
27
27
  license: MIT
28
- status: preview
28
+ status: stable
29
29
  recommended: false
@@ -0,0 +1,168 @@
1
+ ---
2
+ name: summer-apps
3
+ description: "Build a Summer App, a team tool inside Summer Studio (balance table, quest editor, tracker), data and tools."
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: tools
7
+ user-invocable: true
8
+ allowed-tools: Read Write Edit Glob summer_apps_guide summer_apps_list summer_apps_create summer_apps_publish summer_apps_get summer_apps_update summer_apps_events summer_apps_page summer_apps_use_page summer_apps_screenshot summer_apps_read_data summer_apps_write_data summer_apps_tools summer_apps_call summer_apps_report_gap summer_call
9
+ ---
10
+
11
+ # Summer Apps
12
+
13
+ A Summer App is a tool the person's team uses inside Summer Studio: shared with
14
+ the workspace, live on its assets, game data and engine, dockable in the editor.
15
+ You build it in minutes; the team keeps it.
16
+
17
+ A call written `area.action({...})` is one operation: use the tool `summer_area_action` when
18
+ your client lists it, else `summer_call({ op: "area.action", input: {...} })`.
19
+ `summer_search` finds any operation and its exact input.
20
+
21
+ ## First: does Summer already do it?
22
+
23
+ A custom app is something the team has to maintain. Before you build one, check whether
24
+ Summer already does the job: Studio features (the asset library with its collections and
25
+ groups, Pick one and sound choices, Grow dashboards, Team) and the existing Summer
26
+ operations (`summer_search` finds them). If it does, use that and tell the person where it lives.
27
+
28
+ Build an app only when the need is real and Summer lacks it, or as a Scratch throwaway (a
29
+ quick asset review, a UI prototype) that you call throwaway when you make it, and archive
30
+ when it is done (`apps.update({ appId, status: "archived" })`). When
31
+ something is missing natively, report it with `apps.report_gap` (and
32
+ `summer_call` with `docs.feedback` when a library entry fell short), so Summer can build it for
33
+ everyone.
34
+
35
+ | Ask | Do |
36
+ | --- | --- |
37
+ | "Let me pick from these 12 sword sounds" | Pick one: `assets.generate_sfx_choices`, or put the sounds in a library collection. No app. |
38
+ | "Group our Studio assets into a moodboard for the forest level" | Organize them with the asset library's collections and groups. No app. |
39
+ | "A weapon balance table that writes res://data/weapons.json" | Build an app: nothing in Summer edits game data with the team's balance rules. |
40
+
41
+ ## When to build one
42
+
43
+ - The person asks for a tool ("build us a loot balance tool", "track every creature
44
+ from concept to in-engine", "a board to review playtest clips").
45
+ - They need a UI to decide or edit something they will come back to.
46
+ - Not for a one-off answer: reply in chat instead.
47
+ - Not when Summer already does it (above).
48
+
49
+ ## Layout or code
50
+
51
+ - **Layout** (`format: "layout"`): a JSON layout of kit nodes. Quick, throwaway,
52
+ always on brand. Use it to ask the person to pick, rate or fill something now.
53
+ - **Code** (default): `index.html` + JS/CSS with the Summer SDK and UI kit. Use it
54
+ for state, editing, shared data, generation or engine access.
55
+
56
+ ## Start from the working app
57
+
58
+ Read these before writing code; they are exact:
59
+
60
+ - [minimal-app.md](minimal-app.md): a complete working app (manifest, `index.html`,
61
+ `app.js`) built from kit components, using shared data, live changes, the viewer, `page.declare`, an
62
+ agent event, an agent tool and frame-move state. Copy it and change it.
63
+ - [sdk-reference.md](sdk-reference.md): every SDK call with its exact arguments and
64
+ return shape.
65
+ - [manifest.md](manifest.md): every manifest field.
66
+ - The kit's component catalog (every `<summer-*>` element with attributes, events and a
67
+ copyable example) is `apps.guide({ section: "kit" })`, also at `/summer-ui/v1/catalog.json`
68
+ on the app host. Copy its examples instead of inventing markup.
69
+
70
+ To see an app, publish it and call `apps.screenshot({ appId })`: Summer renders it headless
71
+ with the person's data and returns the picture plus the console, uncaught errors, refused calls
72
+ and the fields and buttons it declared. No Studio tab needed; the person sees it at
73
+ `/studio/apps/<appId>` (`apps.create` opens it for them). Opening `index.html` on its own
74
+ never connects. There is no offline host: do not build one or mock the SDK.
75
+
76
+ The app is served from its own host, apps.summerengine.app. Load the SDK and the kit as
77
+ ES modules with root paths: `<script type="module" src="/summer-sdk/v1.js">` and
78
+ `<script type="module" src="/summer-ui/v1/ui.js">`. Then `await summer.ready` before
79
+ the first call, and reach data only through `summer.data.collection(name)`.
80
+
81
+ ## The loop
82
+
83
+ 1. `apps.guide({ section: "overview" })` first, then `examples` and the sections the app needs.
84
+ Load the `summer-apps-design` skill for how it must look.
85
+ 2. `apps.create({ name, purpose, format })`. The person's Studio tab opens it.
86
+ 3. Write the files in a local folder, then `apps.publish({ appId, files, manifest, note })` with
87
+ every file as `{ path, content, encoding }` (`index.html` at the root; or `layout` for a layout
88
+ app). Each publish is an immutable version the tab boots. A publish error names the file or
89
+ rule: fix it and publish again.
90
+ 4. Seed starter data with `apps.write_data({ appId, ops, as: "seed" })` when the app should
91
+ start full. Seed rows belong to the team and show no author.
92
+ 5. Look at it: `apps.screenshot({ appId })`, then `width: 390` (phone) and `theme: "dark"`;
93
+ `steps: [{click: "#edit"}]` or `[{press: "<action id>"}]` shows a dialog or a second state.
94
+ Fix the publish `warnings` too.
95
+ Fix every error and console line it reports, publish again, look again. It is read-only:
96
+ writes, sends and paid calls are refused there and work in Studio.
97
+ 6. `apps.events({ appId, after })` waits for what the app sends you
98
+ (`summer.agent.send`), errors (uncaught and `console.error`) and feedback. Act on them;
99
+ pass the cursor on.
100
+ 7. Change the app by publishing again; `apps.get({ appId })` returns the current files.
101
+
102
+ ## Data is the API
103
+
104
+ Read an app's shared collections with `apps.read_data` and write them with `apps.write_data`. Both work with
105
+ no app open, and everyone in the app sees your edits live. "Nerf the bow in our
106
+ balance sheet" is a data write, not a click.
107
+
108
+ Declare each collection's record shape in the manifest `collections`; `apps.tools`
109
+ and `apps.read_data` return it, so any agent knows what a record looks like.
110
+
111
+ ```json
112
+ { "appId": "<id>", "ops": [
113
+ { "op": "patch", "collection": "items", "recordId": "bow", "patch": { "damage": 36 }, "ifRevision": 4 },
114
+ { "op": "put", "collection": "notes", "recordId": "n-17", "data": { "text": "Boss too long", "status": "open" } },
115
+ { "op": "remove", "collection": "notes", "recordId": "n-3" }
116
+ ] }
117
+ ```
118
+
119
+ That is the input of `apps.write_data`: up to 100 ops per call. Send an `idempotencyKey` and reuse it
120
+ only to retry the same write, so it applies once. `apps.read_data({ appId, collection, limit, cursor })`
121
+ reads records (`items`, then `nextCursor` for the next page); removed records are not returned. Your writes are recorded as `actor { kind: "agent" }` (and
122
+ as `createdBy` on records you create), so the app can show which rows an agent made. Add
123
+ `"as": "seed"` for starter data that belongs to the team (`kind: "seed"`, no author). `patch` merges keys
124
+ (`null` removes one); `ifRevision` guards against overwriting a newer change.
125
+
126
+ ## Agent tools
127
+
128
+ Logic that lives in the app (a balance formula, an export) can be exposed in the
129
+ manifest `agentTools` and implemented with `summer.agent.tool(name, handler)`.
130
+ `apps.tools` lists them; `apps.call({ appId, tool, input })` runs one inside the person's open
131
+ app and answers a `conflict` error when the app is not open (its `next` is the app's link for the
132
+ person). Prefer data for plain reads and edits. `apps.page` reads the fields and buttons an open app
133
+ declared, and `apps.use_page({ appId, fill, press })` fills and presses them; the ones the app marks
134
+ critical are the person's to press.
135
+
136
+ ## Rules
137
+
138
+ - Declare only the permissions the app uses; declare every `engineFiles` path and
139
+ every `agentEvents` name. A missing one fails at runtime with `permission_missing`.
140
+ - The app runs sandboxed (`allow-scripts allow-forms allow-popups allow-modals
141
+ allow-downloads`, never `allow-same-origin`): no cookies, no `localStorage`, no network
142
+ unless the workspace allows a domain. Keep state in `summer.data`.
143
+ - Paid SDK calls spend the credits of the person using the app. Say so before
144
+ building an app that generates.
145
+ - Use real data (`summer.data`, `summer.assets`, `summer.engine.readFile`), never
146
+ placeholder numbers.
147
+ - Studio moves an idle app to a fresh frame every few minutes. Keep UI state you care
148
+ about in shared data, or return it from `summer.app.onSnapshot(() => state)` (up to
149
+ 256 KB) and read it back from `(await summer.ready).restored`. Wrap Web Audio playback
150
+ in `summer.app.busy(true)` / `summer.app.busy(false)` so a long sound is not cut;
151
+ `<audio>` and `<video>` count on their own.
152
+ - Call `summer.page.declare` so agents can read and use the UI; mark delete,
153
+ publish, pay and send actions `critical`.
154
+ - When the SDK cannot do what the app needs, say so and call
155
+ `apps.report_gap`.
156
+ - `apps.dock` docks an app in the editor (it runs in the Summer MCP on this computer); on engines
157
+ without app docks it returns `engine_lacks_op`: open the app in the Studio tab instead.
158
+ - Keep, archive, restore, rename and pin with `apps.update` (`status`, `name`, `folder`, `pinned`);
159
+ copy one with `apps.duplicate`; add a starter app with `apps.add_starter`; send the makers a note
160
+ with `apps.feedback`. `apps.delete` asks the person, and `apps.rollback` (an older version goes
161
+ live) and `apps.update_starter` ask the app's owner: each answers `needs_approval` with a link to
162
+ give them, and nothing changes until they approve (`jobs.wait` on the job).
163
+
164
+ ## Done means
165
+
166
+ The app is published; `apps.screenshot` shows it with real data in light, dark and at
167
+ 390 px with no errors; its states (loading, empty, error) work; and the person knows what it
168
+ does and where its data goes.
@@ -0,0 +1,57 @@
1
+ # The Summer App manifest
2
+
3
+ Sent as `manifest` on every `apps.publish` and written into the app as
4
+ `summer.app.json`. Unknown keys and unknown permissions are refused with a message that
5
+ names them. Every field:
6
+
7
+ ```json
8
+ {
9
+ "name": "Loot table",
10
+ "purpose": "Balance item stats and write them to res://data/items.json",
11
+ "permissions": ["data", "assets:read", "generate", "ai", "team:read", "engine:read", "engine:write"],
12
+ "engineFiles": ["res://data/items.json"],
13
+ "collections": {
14
+ "items": {
15
+ "description": "One weapon or armour piece",
16
+ "fields": {
17
+ "name": { "type": "string", "required": true },
18
+ "damage": { "type": "number", "description": "Damage per hit" },
19
+ "speed": { "type": "number", "description": "Attacks per second" },
20
+ "tags": { "type": "array" }
21
+ }
22
+ }
23
+ },
24
+ "agentEvents": ["items.written"],
25
+ "agentTools": [
26
+ {
27
+ "name": "nerf_item",
28
+ "description": "Lower one item's damage by a percent",
29
+ "input": {
30
+ "type": "object",
31
+ "properties": { "id": { "type": "string" }, "percent": { "type": "number" } },
32
+ "required": ["id", "percent"]
33
+ }
34
+ }
35
+ ],
36
+ "surface": "both",
37
+ "dock": { "preferred": "bottom" },
38
+ "plugin": { "name": "loot_tools" }
39
+ }
40
+ ```
41
+
42
+ | Key | Rules |
43
+ |---|---|
44
+ | `name` | Required, 1-80 characters. |
45
+ | `purpose` | Up to 280 characters: what the tool does and where its data goes. |
46
+ | `permissions` | Only these: `data`, `assets:read`, `assets:write`, `generate`, `ai`, `projects:read`, `team:read`, `grow:read`, `engine:read`, `engine:write`, `choices`. `engine:write` includes `engine:read`; `assets:write` includes `assets:read`. No permission is needed for `app.*`, `agent.*`, `page.*` and `team.presence`. |
47
+ | `engineFiles` | Up to 50 `res://` paths `engine.readFile` / `writeFile` may touch. |
48
+ | `collections` | Up to 50, keyed by collection name (lowercase `a-z 0-9 _ . -`). Each: `description`, `fields` (up to 50, name `[A-Za-z_][A-Za-z0-9_]*`) with `type` (`string`, `number`, `integer`, `boolean`, `object`, `array`, `any`), `description`, `required`. Descriptive: agents and people read it; writes are not rejected for it. |
49
+ | `agentEvents` | Up to 50 names (`a-z 0-9 _ . -`) the app sends with `summer.agent.send`. |
50
+ | `agentTools` | Up to 20: `name` (`a-z 0-9 _`, max 64), `description` (max 1,000), `input` (JSON Schema, up to 8 KB). |
51
+ | `surface` | `page` (the Studio app page, default), `dock` (an editor dock) or `both`. A dock layout must work from 320 px wide; docked apps get selection and scene events (`summer.engine.onEvent`). |
52
+ | `dock` | `{ "preferred": "left" \| "right" \| "bottom" }`. |
53
+ | `plugin` | `{ "name": "<folder>" }`: the app may also write `res://addons/<folder>/`. |
54
+ | `entry` | Always `index.html` (you can leave it out). |
55
+
56
+ The whole manifest is at most 200 KB. A code app's bundle: `index.html` at the root, at most
57
+ 300 files, 10 MB, 5 MB per file.