summer-engine 3.8.0 → 4.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 (527) hide show
  1. package/.claude-plugin/marketplace.json +2 -13
  2. package/.claude-plugin/plugin.json +24 -22
  3. package/.codex-plugin/plugin.json +18 -22
  4. package/.cursor-plugin/plugin.json +8 -14
  5. package/.factory-plugin/plugin.json +6 -13
  6. package/AGENTS.md +19 -12
  7. package/CHANGELOG.md +133 -0
  8. package/GEMINI.md +3 -3
  9. package/README.md +118 -37
  10. package/assets/icon.png +0 -0
  11. package/commands/start.md +71 -0
  12. package/commands/summer.md +3 -2
  13. package/dist/cli/banner.js +3 -0
  14. package/dist/cli/commands/config.js +3 -2
  15. package/dist/cli/commands/create.js +12 -3
  16. package/dist/cli/commands/list.d.ts +5 -0
  17. package/dist/cli/commands/list.js +30 -13
  18. package/dist/cli/commands/login.d.ts +27 -0
  19. package/dist/cli/commands/login.js +58 -12
  20. package/dist/cli/commands/memory.js +6 -2
  21. package/dist/cli/commands/ops.d.ts +64 -0
  22. package/dist/cli/commands/ops.js +329 -0
  23. package/dist/cli/commands/setup.d.ts +4 -0
  24. package/dist/cli/commands/setup.js +254 -26
  25. package/dist/cli/commands/skills.js +28 -11
  26. package/dist/cli/commands/status.d.ts +26 -0
  27. package/dist/cli/commands/status.js +36 -21
  28. package/dist/cli/index.js +7 -0
  29. package/dist/core/agent-host.d.ts +65 -0
  30. package/dist/core/agent-host.js +193 -0
  31. package/dist/core/capabilities/agent-playbook.d.ts +3 -0
  32. package/dist/core/capabilities/agent-playbook.js +54 -2
  33. package/dist/core/capabilities/apps.d.ts +33 -10
  34. package/dist/core/capabilities/apps.js +25 -12
  35. package/dist/core/capabilities/audit/args.d.ts +6 -6
  36. package/dist/core/capabilities/doctor.d.ts +3 -0
  37. package/dist/core/capabilities/doctor.js +20 -15
  38. package/dist/core/capabilities/fabricate-mesh.d.ts +4 -4
  39. package/dist/core/capabilities/game-task-plan.d.ts +12 -6
  40. package/dist/core/capabilities/game-task-plan.js +80 -5
  41. package/dist/core/capabilities/hdri-import.d.ts +2 -2
  42. package/dist/core/capabilities/motion-generation.d.ts +2 -2
  43. package/dist/core/capabilities/motion-generation.js +2 -2
  44. package/dist/core/capabilities/navigation/open.d.ts +6 -2
  45. package/dist/core/capabilities/navigation/open.js +3 -0
  46. package/dist/core/capabilities/placement.d.ts +23 -23
  47. package/dist/core/capabilities/publish-build.js +2 -0
  48. package/dist/core/capabilities/runtime-control.d.ts +42 -42
  49. package/dist/core/capabilities/scene-script-target.d.ts +17 -0
  50. package/dist/core/capabilities/scene-script-target.js +70 -0
  51. package/dist/core/capabilities/seeing/args.d.ts +16 -16
  52. package/dist/core/capabilities/sfx-choices.d.ts +4 -0
  53. package/dist/core/capabilities/sfx-choices.js +13 -6
  54. package/dist/core/capabilities/tool-dispatch.d.ts +12 -3
  55. package/dist/core/capabilities/tool-dispatch.js +81 -46
  56. package/dist/core/capabilities/ui-control.d.ts +2 -2
  57. package/dist/core/capabilities/world-snapshot.d.ts +4 -4
  58. package/dist/core/embeddings.d.ts +2 -0
  59. package/dist/core/embeddings.js +1 -1
  60. package/dist/core/error-codes.d.ts +62 -0
  61. package/dist/core/error-codes.js +97 -0
  62. package/dist/core/format.d.ts +2 -0
  63. package/dist/core/format.js +2 -1
  64. package/dist/core/hosted-mcp.d.ts +22 -0
  65. package/dist/core/hosted-mcp.js +56 -1
  66. package/dist/core/library-read.js +5 -0
  67. package/dist/core/library-search.d.ts +2 -2
  68. package/dist/core/library-search.js +2 -1
  69. package/dist/core/oauth.js +4 -0
  70. package/dist/core/ops/areas.d.ts +11 -0
  71. package/dist/core/ops/areas.js +24 -0
  72. package/dist/core/ops/catalog.d.ts +45 -0
  73. package/dist/core/ops/catalog.js +157 -0
  74. package/dist/core/ops/cloud.d.ts +64 -0
  75. package/dist/core/ops/cloud.js +198 -0
  76. package/dist/core/ops/contract.d.ts +120 -0
  77. package/dist/core/ops/contract.js +134 -0
  78. package/dist/core/ops/engine-answer.d.ts +25 -0
  79. package/dist/core/ops/engine-answer.js +117 -0
  80. package/dist/core/ops/engine.d.ts +55 -0
  81. package/dist/core/ops/engine.js +649 -0
  82. package/dist/core/ops/public-catalog.d.ts +48 -0
  83. package/dist/core/ops/public-catalog.js +56 -0
  84. package/dist/core/ops/save-files.d.ts +78 -0
  85. package/dist/core/ops/save-files.js +419 -0
  86. package/dist/core/ops/search.d.ts +8 -0
  87. package/dist/core/ops/search.js +187 -0
  88. package/dist/core/skills-registry.d.ts +16 -1
  89. package/dist/core/skills-registry.js +35 -2
  90. package/dist/core/telemetry.d.ts +32 -0
  91. package/dist/core/telemetry.js +38 -10
  92. package/dist/core/tool-profiles.d.ts +25 -0
  93. package/dist/core/tool-profiles.js +41 -0
  94. package/dist/installer/agent-config.d.ts +17 -4
  95. package/dist/installer/agent-config.js +27 -6
  96. package/dist/installer/agent-table.d.ts +12 -0
  97. package/dist/installer/agent-table.js +33 -9
  98. package/dist/installer/cli-permissions.d.ts +65 -0
  99. package/dist/installer/cli-permissions.js +182 -0
  100. package/dist/installer/setup.d.ts +4 -0
  101. package/dist/installer/setup.js +12 -4
  102. package/dist/installer/skills-refresh.d.ts +29 -0
  103. package/dist/installer/skills-refresh.js +261 -0
  104. package/dist/installer/version-check.d.ts +51 -11
  105. package/dist/installer/version-check.js +147 -37
  106. package/dist/mcp/command.js +7 -0
  107. package/dist/mcp/hosted-mount.d.ts +27 -2
  108. package/dist/mcp/hosted-mount.js +53 -23
  109. package/dist/mcp/legacy-toolset.d.ts +27 -0
  110. package/dist/mcp/legacy-toolset.js +43 -0
  111. package/dist/mcp/ops-surface.d.ts +59 -0
  112. package/dist/mcp/ops-surface.js +453 -0
  113. package/dist/mcp/server.d.ts +45 -11
  114. package/dist/mcp/server.js +263 -89
  115. package/dist/mcp/tool-results.d.ts +26 -0
  116. package/dist/mcp/tool-results.js +81 -0
  117. package/dist/mcp/tool-surface.d.ts +65 -0
  118. package/dist/mcp/tool-surface.js +317 -0
  119. package/dist/mcp/tools/app-tools.js +9 -2
  120. package/dist/mcp/tools/asset-tools.js +55 -53
  121. package/dist/mcp/tools/audit-tools.js +21 -21
  122. package/dist/mcp/tools/debug-tools.js +6 -6
  123. package/dist/mcp/tools/fabricate-tools.js +6 -6
  124. package/dist/mcp/tools/generate-tools.js +76 -70
  125. package/dist/mcp/tools/project-tools.d.ts +9 -4
  126. package/dist/mcp/tools/project-tools.js +16 -10
  127. package/dist/mcp/tools/scene-tools.js +12 -23
  128. package/dist/mcp/tools/script-tools.js +9 -5
  129. package/dist/mcp/tools/with-engine.d.ts +6 -0
  130. package/dist/mcp/tools/with-engine.js +19 -0
  131. package/dist/project-memory/agent-instructions.d.ts +47 -0
  132. package/dist/project-memory/agent-instructions.js +226 -0
  133. package/gemini-extension.json +6 -13
  134. package/hooks/pre-commit-doctor.sh +5 -4
  135. package/hooks/session-start.sh +24 -28
  136. package/integrations/README.md +1 -1
  137. package/integrations/claude/README.md +6 -0
  138. package/integrations/claude/manifest-target.json +4 -0
  139. package/integrations/claude-desktop/README.md +1 -1
  140. package/integrations/copilot-jetbrains/README.md +1 -1
  141. package/integrations/gemini/README.md +11 -0
  142. package/integrations/junie/README.md +1 -1
  143. package/integrations/lm-studio/README.md +1 -1
  144. package/integrations/trae/README.md +1 -1
  145. package/integrations/visual-studio/README.md +1 -1
  146. package/integrations/windsurf/README.md +1 -1
  147. package/library/references/mcp-tools-reference/mcp-tools-reference.md +79 -51
  148. package/library/references/mcp-tools-reference/resource.yaml +1 -1
  149. package/library/references/product-map/resource.yaml +2 -2
  150. package/library/skills/3d-lighting/SKILL.md +69 -28
  151. package/library/skills/3d-lighting/resource.yaml +1 -1
  152. package/library/skills/README.md +121 -118
  153. package/library/skills/adaptive-music/SKILL.md +40 -23
  154. package/library/skills/adaptive-music/resource.yaml +1 -1
  155. package/library/skills/agent-playtesting/SKILL.md +23 -1
  156. package/library/skills/agent-playtesting/resource.yaml +1 -1
  157. package/library/skills/ai-characters-in-games/SKILL.md +16 -1
  158. package/library/skills/ai-characters-in-games/resource.yaml +1 -1
  159. package/library/skills/ambient-bed/SKILL.md +38 -13
  160. package/library/skills/ambient-bed/resource.yaml +1 -1
  161. package/library/skills/animated-loop/SKILL.md +60 -32
  162. package/library/skills/animated-loop/resource.yaml +1 -1
  163. package/library/skills/animation-tree/SKILL.md +27 -1
  164. package/library/skills/animation-tree/resource.yaml +1 -1
  165. package/library/skills/art-direction/SKILL.md +17 -3
  166. package/library/skills/art-direction/resource.yaml +1 -1
  167. package/library/skills/asset-strategy/SKILL.md +51 -4
  168. package/library/skills/asset-strategy/resource.yaml +2 -1
  169. package/library/skills/audio-direction/SKILL.md +26 -10
  170. package/library/skills/audio-direction/resource.yaml +1 -1
  171. package/library/skills/auto-fire-targeting/SKILL.md +15 -1
  172. package/library/skills/auto-fire-targeting/resource.yaml +1 -1
  173. package/library/skills/bounded-engine-runs/SKILL.md +1 -1
  174. package/library/skills/bounded-engine-runs/resource.yaml +1 -1
  175. package/library/skills/brainstorm-game/SKILL.md +14 -1
  176. package/library/skills/brainstorm-game/resource.yaml +1 -1
  177. package/library/skills/brainstorming/SKILL.md +1 -1
  178. package/library/skills/brainstorming/resource.yaml +1 -1
  179. package/library/skills/browse-templates/SKILL.md +11 -1
  180. package/library/skills/browse-templates/resource.yaml +1 -1
  181. package/library/skills/camera-rigs/SKILL.md +22 -2
  182. package/library/skills/camera-rigs/resource.yaml +1 -1
  183. package/library/skills/celeste-momentum-platforming/resource.yaml +1 -0
  184. package/library/skills/character-animation-wiring/SKILL.md +28 -4
  185. package/library/skills/character-animation-wiring/resource.yaml +1 -1
  186. package/library/skills/character-model/SKILL.md +83 -47
  187. package/library/skills/character-model/resource.yaml +1 -1
  188. package/library/skills/character-movement/SKILL.md +27 -3
  189. package/library/skills/character-movement/resource.yaml +1 -1
  190. package/library/skills/character-portrait/SKILL.md +39 -19
  191. package/library/skills/character-portrait/resource.yaml +1 -1
  192. package/library/skills/cinematic-cutscene/SKILL.md +79 -46
  193. package/library/skills/cinematic-cutscene/resource.yaml +1 -1
  194. package/library/skills/combat-basics/SKILL.md +20 -1
  195. package/library/skills/combat-basics/resource.yaml +1 -1
  196. package/library/skills/compatibility-renderer-traps/SKILL.md +12 -1
  197. package/library/skills/compatibility-renderer-traps/resource.yaml +1 -1
  198. package/library/skills/concept-art/SKILL.md +29 -12
  199. package/library/skills/concept-art/resource.yaml +1 -1
  200. package/library/skills/concept-to-level/SKILL.md +258 -0
  201. package/library/skills/concept-to-level/references/technical-rules.md +150 -0
  202. package/library/skills/concept-to-level/resource.yaml +44 -0
  203. package/library/skills/create-asset-sheet/SKILL.md +37 -13
  204. package/library/skills/create-asset-sheet/resource.yaml +1 -1
  205. package/library/skills/debug/SKILL.md +34 -2
  206. package/library/skills/debug/resource.yaml +1 -1
  207. package/library/skills/debugging-game-feel/SKILL.md +13 -1
  208. package/library/skills/debugging-game-feel/resource.yaml +1 -1
  209. package/library/skills/design-level/SKILL.md +40 -35
  210. package/library/skills/design-level/resource.yaml +1 -1
  211. package/library/skills/design-mechanic/SKILL.md +18 -1
  212. package/library/skills/design-mechanic/resource.yaml +1 -1
  213. package/library/skills/design-npc/SKILL.md +43 -24
  214. package/library/skills/design-npc/resource.yaml +1 -1
  215. package/library/skills/diagnosing-perf-regressions/SKILL.md +13 -1
  216. package/library/skills/diagnosing-perf-regressions/resource.yaml +1 -1
  217. package/library/skills/driving-the-editor-ui/SKILL.md +24 -1
  218. package/library/skills/driving-the-editor-ui/resource.yaml +1 -1
  219. package/library/skills/environment-kit/SKILL.md +43 -16
  220. package/library/skills/environment-kit/resource.yaml +1 -1
  221. package/library/skills/export-and-ship/SKILL.md +29 -6
  222. package/library/skills/export-and-ship/resource.yaml +1 -1
  223. package/library/skills/fabricating-assets/SKILL.md +30 -7
  224. package/library/skills/fabricating-assets/resource.yaml +3 -3
  225. package/library/skills/facial-and-lipsync/SKILL.md +36 -15
  226. package/library/skills/facial-and-lipsync/resource.yaml +1 -1
  227. package/library/skills/fps-controller/SKILL.md +50 -41
  228. package/library/skills/fps-controller/resource.yaml +1 -1
  229. package/library/skills/game-feel/SKILL.md +34 -8
  230. package/library/skills/game-feel/resource.yaml +1 -1
  231. package/library/skills/gameskill/SKILL.md +15 -4
  232. package/library/skills/gameskill/resource.yaml +1 -1
  233. package/library/skills/gdscript-patterns/SKILL.md +16 -1
  234. package/library/skills/gdscript-patterns/resource.yaml +1 -1
  235. package/library/skills/generate-motion/SKILL.md +51 -21
  236. package/library/skills/generate-motion/resource.yaml +1 -1
  237. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +18 -1
  238. package/library/skills/godogen-visual-proof-game-generation/resource.yaml +1 -0
  239. package/library/skills/grow-analytics/SKILL.md +13 -3
  240. package/library/skills/grow-analytics/resource.yaml +1 -1
  241. package/library/skills/headless-scripting/SKILL.md +14 -1
  242. package/library/skills/headless-scripting/resource.yaml +1 -1
  243. package/library/skills/in-game-purchases/SKILL.md +12 -1
  244. package/library/skills/in-game-purchases/resource.yaml +1 -1
  245. package/library/skills/instantiate-asset-pack/SKILL.md +19 -2
  246. package/library/skills/instantiate-asset-pack/resource.yaml +1 -1
  247. package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +1 -0
  248. package/library/skills/make-game/SKILL.md +33 -4
  249. package/library/skills/make-game/references/2d-platformer.md +1 -1
  250. package/library/skills/make-game/references/3d-fps.md +1 -1
  251. package/library/skills/make-game/references/3d-horror.md +1 -1
  252. package/library/skills/make-game/references/3d-third-person.md +2 -2
  253. package/library/skills/make-game/resource.yaml +1 -1
  254. package/library/skills/multiplayer/SKILL.md +13 -1
  255. package/library/skills/multiplayer/resource.yaml +1 -1
  256. package/library/skills/multiplayer-movement/SKILL.md +19 -1
  257. package/library/skills/multiplayer-movement/resource.yaml +1 -1
  258. package/library/skills/multiplayer-project/SKILL.md +18 -1
  259. package/library/skills/multiplayer-project/resource.yaml +1 -1
  260. package/library/skills/multiplayer-publish/SKILL.md +25 -7
  261. package/library/skills/multiplayer-publish/resource.yaml +3 -3
  262. package/library/skills/multiplayer-state/SKILL.md +17 -1
  263. package/library/skills/multiplayer-state/resource.yaml +1 -1
  264. package/library/skills/multiplayer-testing/SKILL.md +16 -1
  265. package/library/skills/multiplayer-testing/resource.yaml +1 -1
  266. package/library/skills/music-track/SKILL.md +38 -13
  267. package/library/skills/music-track/resource.yaml +1 -1
  268. package/library/skills/navigate-summer/SKILL.md +26 -9
  269. package/library/skills/navigate-summer/resource.yaml +1 -1
  270. package/library/skills/new-project/SKILL.md +12 -1
  271. package/library/skills/new-project/resource.yaml +1 -1
  272. package/library/skills/organic-model/SKILL.md +48 -18
  273. package/library/skills/organic-model/resource.yaml +1 -1
  274. package/library/skills/pixel-art/SKILL.md +42 -23
  275. package/library/skills/pixel-art/resource.yaml +1 -1
  276. package/library/skills/play/SKILL.md +19 -1
  277. package/library/skills/play/resource.yaml +1 -1
  278. package/library/skills/playtesting-a-feature/SKILL.md +24 -1
  279. package/library/skills/playtesting-a-feature/resource.yaml +1 -1
  280. package/library/skills/procedural-animation/SKILL.md +38 -16
  281. package/library/skills/procedural-animation/resource.yaml +1 -1
  282. package/library/skills/prop-model/SKILL.md +48 -19
  283. package/library/skills/prop-model/resource.yaml +1 -1
  284. package/library/skills/psx-retro-rendering/resource.yaml +1 -0
  285. package/library/skills/publish-your-game/SKILL.md +43 -6
  286. package/library/skills/publish-your-game/resource.yaml +3 -3
  287. package/library/skills/realtime-wet-surfaces/resource.yaml +1 -0
  288. package/library/skills/release-readiness/SKILL.md +13 -1
  289. package/library/skills/release-readiness/resource.yaml +1 -1
  290. package/library/skills/remote-deploy/SKILL.md +15 -1
  291. package/library/skills/remote-deploy/resource.yaml +1 -1
  292. package/library/skills/retarget/SKILL.md +43 -20
  293. package/library/skills/retarget/resource.yaml +1 -1
  294. package/library/skills/running-in-the-cloud/SKILL.md +11 -1
  295. package/library/skills/running-in-the-cloud/resource.yaml +1 -1
  296. package/library/skills/save-load/SKILL.md +16 -1
  297. package/library/skills/save-load/resource.yaml +1 -1
  298. package/library/skills/scene-composition/SKILL.md +18 -1
  299. package/library/skills/scene-composition/resource.yaml +1 -1
  300. package/library/skills/scene-hierarchy-design/SKILL.md +26 -2
  301. package/library/skills/scene-hierarchy-design/resource.yaml +1 -1
  302. package/library/skills/scene-scripting/SKILL.md +96 -636
  303. package/library/skills/scene-scripting/references/ctx-api.md +184 -0
  304. package/library/skills/scene-scripting/references/recipes-2d-ui.md +193 -0
  305. package/library/skills/scene-scripting/references/recipes-3d.md +280 -0
  306. package/library/skills/scene-scripting/resource.yaml +4 -4
  307. package/library/skills/scene-to-level/SKILL.md +24 -2
  308. package/library/skills/scene-to-level/resource.yaml +1 -1
  309. package/library/skills/skill-create/resource.yaml +1 -0
  310. package/library/skills/skill-improve/resource.yaml +1 -0
  311. package/library/skills/skill-test/SKILL.md +12 -2
  312. package/library/skills/skill-test/resource.yaml +1 -0
  313. package/library/skills/skintokens-auto-rigging/resource.yaml +1 -0
  314. package/library/skills/skybox-panorama/SKILL.md +47 -21
  315. package/library/skills/skybox-panorama/resource.yaml +1 -1
  316. package/library/skills/sound-effect/SKILL.md +52 -20
  317. package/library/skills/sound-effect/resource.yaml +1 -1
  318. package/library/skills/spatial-placement/SKILL.md +44 -9
  319. package/library/skills/spatial-placement/resource.yaml +1 -1
  320. package/library/skills/sprite-sheet/SKILL.md +55 -27
  321. package/library/skills/sprite-sheet/resource.yaml +1 -1
  322. package/library/skills/store-art/SKILL.md +14 -3
  323. package/library/skills/store-art/resource.yaml +2 -2
  324. package/library/skills/store-listing/SKILL.md +13 -3
  325. package/library/skills/store-listing/resource.yaml +2 -2
  326. package/library/skills/summer-analytics/SKILL.md +22 -5
  327. package/library/skills/summer-analytics/resource.yaml +2 -2
  328. package/library/skills/summer-apps/SKILL.md +77 -32
  329. package/library/skills/summer-apps/manifest.md +1 -1
  330. package/library/skills/summer-apps/minimal-app.md +7 -7
  331. package/library/skills/summer-apps/resource.yaml +1 -1
  332. package/library/skills/summer-apps/sdk-reference.md +5 -5
  333. package/library/skills/summer-apps-design/SKILL.md +1 -1
  334. package/library/skills/summer-apps-design/resource.yaml +1 -1
  335. package/library/skills/summer-assets/SKILL.md +86 -0
  336. package/library/skills/summer-assets/resource.yaml +34 -0
  337. package/library/skills/summer-cli/SKILL.md +133 -0
  338. package/library/skills/summer-cli/resource.yaml +31 -0
  339. package/library/skills/summer-friends/SKILL.md +14 -0
  340. package/library/skills/summer-leaderboards/SKILL.md +16 -0
  341. package/library/skills/summer-match-results/SKILL.md +17 -0
  342. package/library/skills/summer-matchmaking/SKILL.md +17 -0
  343. package/library/skills/summer-parties/SKILL.md +14 -0
  344. package/library/skills/summer-player-data/SKILL.md +14 -0
  345. package/library/skills/summer-store/SKILL.md +16 -1
  346. package/library/skills/summer-world-chat/SKILL.md +14 -0
  347. package/library/skills/summer-world-saves/SKILL.md +14 -0
  348. package/library/skills/text-to-motion/SKILL.md +45 -23
  349. package/library/skills/text-to-motion/prompts-and-controls.md +5 -5
  350. package/library/skills/text-to-motion/resource.yaml +1 -1
  351. package/library/skills/text-to-motion/rigging-for-text-motion.md +2 -2
  352. package/library/skills/tileable-texture/SKILL.md +37 -15
  353. package/library/skills/tileable-texture/resource.yaml +1 -1
  354. package/library/skills/trailer-shot/SKILL.md +46 -24
  355. package/library/skills/trailer-shot/resource.yaml +1 -1
  356. package/library/skills/tune-performance/SKILL.md +32 -6
  357. package/library/skills/tune-performance/resource.yaml +1 -1
  358. package/library/skills/ui-basics/SKILL.md +55 -36
  359. package/library/skills/ui-basics/resource.yaml +1 -1
  360. package/library/skills/ui-graphics/SKILL.md +64 -38
  361. package/library/skills/ui-graphics/resource.yaml +1 -1
  362. package/library/skills/use-widget-asset/SKILL.md +15 -1
  363. package/library/skills/use-widget-asset/resource.yaml +1 -1
  364. package/library/skills/using-summer/SKILL.md +32 -5
  365. package/library/skills/using-summer/resource.yaml +3 -2
  366. package/library/skills/vehicle-model/SKILL.md +92 -57
  367. package/library/skills/vehicle-model/resource.yaml +1 -1
  368. package/library/skills/verification-before-completion/SKILL.md +1 -1
  369. package/library/skills/verification-before-completion/resource.yaml +1 -1
  370. package/library/skills/verifying-scenes/SKILL.md +31 -2
  371. package/library/skills/verifying-scenes/resource.yaml +1 -1
  372. package/library/skills/vfx-dissolve/SKILL.md +21 -2
  373. package/library/skills/vfx-dissolve/resource.yaml +1 -1
  374. package/library/skills/vfx-fire/SKILL.md +41 -41
  375. package/library/skills/vfx-fire/resource.yaml +1 -1
  376. package/library/skills/vfx-hit-spark/SKILL.md +24 -1
  377. package/library/skills/vfx-hit-spark/resource.yaml +1 -1
  378. package/library/skills/vfx-lightning/SKILL.md +30 -16
  379. package/library/skills/vfx-lightning/resource.yaml +1 -1
  380. package/library/skills/vfx-magic-glow/SKILL.md +46 -32
  381. package/library/skills/vfx-magic-glow/resource.yaml +1 -1
  382. package/library/skills/vfx-muzzle-flash/SKILL.md +43 -35
  383. package/library/skills/vfx-muzzle-flash/resource.yaml +1 -1
  384. package/library/skills/vfx-smoke/SKILL.md +39 -31
  385. package/library/skills/vfx-smoke/resource.yaml +1 -1
  386. package/library/skills/vfx-water-ripple/SKILL.md +35 -31
  387. package/library/skills/vfx-water-ripple/resource.yaml +1 -1
  388. package/library/skills/voice-line/SKILL.md +87 -40
  389. package/library/skills/voice-line/resource.yaml +1 -1
  390. package/library/skills/web-and-touch-input/SKILL.md +20 -1
  391. package/library/skills/web-and-touch-input/resource.yaml +1 -1
  392. package/library/skills/web-compatibility-look/SKILL.md +21 -1
  393. package/library/skills/web-compatibility-look/resource.yaml +1 -1
  394. package/library/skills/world-building-3d/SKILL.md +29 -1
  395. package/library/skills/world-building-3d/resource.yaml +1 -1
  396. package/library/skills/writing-skills/resource.yaml +1 -0
  397. package/library/tools/add-node/GUIDE.md +14 -0
  398. package/library/tools/align-distribute-3d/GUIDE.md +7 -0
  399. package/library/tools/app-call/resource.yaml +1 -1
  400. package/library/tools/app-guide/resource.yaml +2 -2
  401. package/library/tools/app-page/resource.yaml +1 -1
  402. package/library/tools/app-screenshot/resource.yaml +19 -1
  403. package/library/tools/app-tools/resource.yaml +1 -1
  404. package/library/tools/attach-to-surface/GUIDE.md +15 -0
  405. package/library/tools/batch/GUIDE.md +27 -0
  406. package/library/tools/camera-bookmark/GUIDE.md +12 -0
  407. package/library/tools/capture-gameplay/GUIDE.md +3 -0
  408. package/library/tools/capture-gameplay/resource.yaml +3 -3
  409. package/library/tools/check-job/resource.yaml +1 -1
  410. package/library/tools/clear-console/GUIDE.md +3 -0
  411. package/library/tools/connect-ports/GUIDE.md +9 -0
  412. package/library/tools/connect-signal/GUIDE.md +14 -0
  413. package/library/tools/create-debug-report/GUIDE.md +10 -0
  414. package/library/tools/create-scene/GUIDE.md +10 -0
  415. package/library/tools/debug-views/GUIDE.md +7 -0
  416. package/library/tools/enable-plugin/GUIDE.md +3 -0
  417. package/library/tools/export-game/GUIDE.md +3 -0
  418. package/library/tools/export-game/resource.yaml +3 -3
  419. package/library/tools/export-templates/GUIDE.md +3 -0
  420. package/library/tools/fabricate-3d/GUIDE.md +19 -0
  421. package/library/tools/frame-nodes/GUIDE.md +9 -0
  422. package/library/tools/frame-shot/GUIDE.md +9 -0
  423. package/library/tools/game-control/GUIDE.md +9 -0
  424. package/library/tools/game-input/GUIDE.md +9 -0
  425. package/library/tools/game-probe/GUIDE.md +9 -0
  426. package/library/tools/generate-3d/resource.yaml +3 -3
  427. package/library/tools/generate-motion/resource.yaml +2 -2
  428. package/library/tools/get-console/GUIDE.md +9 -0
  429. package/library/tools/get-console/resource.yaml +5 -0
  430. package/library/tools/get-debugger-errors/GUIDE.md +7 -0
  431. package/library/tools/get-debugger-errors/resource.yaml +5 -0
  432. package/library/tools/get-debugger-warnings/GUIDE.md +7 -0
  433. package/library/tools/get-debugger-warnings/resource.yaml +5 -0
  434. package/library/tools/get-diagnostics/GUIDE.md +13 -0
  435. package/library/tools/get-project-context/GUIDE.md +25 -0
  436. package/library/tools/get-runtime-tree/GUIDE.md +7 -0
  437. package/library/tools/get-runtime-tree/resource.yaml +5 -0
  438. package/library/tools/get-scene-tree/GUIDE.md +11 -0
  439. package/library/tools/get-scene-tree/resource.yaml +5 -0
  440. package/library/tools/get-script-errors/GUIDE.md +5 -0
  441. package/library/tools/grep/GUIDE.md +11 -0
  442. package/library/tools/import-asset/GUIDE.md +8 -0
  443. package/library/tools/import-asset-by-id/GUIDE.md +12 -0
  444. package/library/tools/import-from-url/GUIDE.md +10 -0
  445. package/library/tools/import-from-url-batch/GUIDE.md +3 -0
  446. package/library/tools/import-hdri/GUIDE.md +16 -0
  447. package/library/tools/input-map-bind/GUIDE.md +11 -0
  448. package/library/tools/inspect-asset/GUIDE.md +14 -0
  449. package/library/tools/inspect-asset/resource.yaml +5 -0
  450. package/library/tools/inspect-node/GUIDE.md +11 -0
  451. package/library/tools/inspect-node/resource.yaml +5 -0
  452. package/library/tools/inspect-resource/GUIDE.md +7 -0
  453. package/library/tools/inspect-resource/resource.yaml +5 -0
  454. package/library/tools/inspect-runtime-node/GUIDE.md +7 -0
  455. package/library/tools/inspect-runtime-node/resource.yaml +5 -0
  456. package/library/tools/instantiate-scene/GUIDE.md +12 -0
  457. package/library/tools/is-running/GUIDE.md +3 -0
  458. package/library/tools/measure/GUIDE.md +8 -0
  459. package/library/tools/navigation-probe/GUIDE.md +9 -0
  460. package/library/tools/open/resource.yaml +2 -2
  461. package/library/tools/open-main-scene/GUIDE.md +6 -0
  462. package/library/tools/open-scene/GUIDE.md +8 -0
  463. package/library/tools/place-adjacent/GUIDE.md +7 -0
  464. package/library/tools/play/GUIDE.md +13 -0
  465. package/library/tools/project-setting/GUIDE.md +9 -0
  466. package/library/tools/publish-build/resource.yaml +6 -6
  467. package/library/tools/raycast/GUIDE.md +7 -0
  468. package/library/tools/read-file/GUIDE.md +10 -0
  469. package/library/tools/read-library/resource.yaml +5 -0
  470. package/library/tools/recent-events/GUIDE.md +7 -0
  471. package/library/tools/remove-node/GUIDE.md +3 -0
  472. package/library/tools/repeat-along/GUIDE.md +5 -0
  473. package/library/tools/replace-node/GUIDE.md +9 -0
  474. package/library/tools/replace-text/GUIDE.md +5 -0
  475. package/library/tools/run-editor-script/GUIDE.md +16 -0
  476. package/library/tools/run-script/GUIDE.md +30 -0
  477. package/library/tools/run-script/resource.yaml +6 -3
  478. package/library/tools/runtime-animate/GUIDE.md +7 -0
  479. package/library/tools/runtime-call/GUIDE.md +7 -0
  480. package/library/tools/runtime-set/GUIDE.md +9 -0
  481. package/library/tools/runtime-spawn/GUIDE.md +9 -0
  482. package/library/tools/save-scene/GUIDE.md +3 -0
  483. package/library/tools/scene-audit/GUIDE.md +29 -0
  484. package/library/tools/screenshot/GUIDE.md +17 -0
  485. package/library/tools/select-node/GUIDE.md +3 -0
  486. package/library/tools/set-prop/GUIDE.md +23 -0
  487. package/library/tools/set-resource-property/GUIDE.md +8 -0
  488. package/library/tools/shot-sheet/GUIDE.md +7 -0
  489. package/library/tools/snap-to-surface/GUIDE.md +17 -0
  490. package/library/tools/snapshot-diff/GUIDE.md +7 -0
  491. package/library/tools/starcast/GUIDE.md +12 -0
  492. package/library/tools/stop/GUIDE.md +3 -0
  493. package/library/tools/test-placement/GUIDE.md +7 -0
  494. package/library/tools/ui-actions/GUIDE.md +12 -0
  495. package/library/tools/ui-activate/GUIDE.md +11 -0
  496. package/library/tools/ui-screenshot/GUIDE.md +9 -0
  497. package/library/tools/ui-tree/GUIDE.md +10 -0
  498. package/library/tools/wait-for-event/GUIDE.md +11 -0
  499. package/library/tools/world-snapshot/GUIDE.md +9 -0
  500. package/library/tools/write-file/GUIDE.md +5 -0
  501. package/library/tools/zoom/GUIDE.md +5 -0
  502. package/package.json +8 -5
  503. package/registry/generated/counts.json +2 -2
  504. package/registry/generated/gemini-extension.json +6 -13
  505. package/registry/generated/index.json +482 -349
  506. package/registry/generated/marketplace.claude.json +2 -13
  507. package/registry/generated/plugin.claude-directory.json +168 -0
  508. package/registry/generated/plugin.claude.json +24 -22
  509. package/registry/generated/plugin.codex.json +18 -22
  510. package/registry/generated/plugin.cursor.json +8 -14
  511. package/registry/generated/plugin.factory.json +6 -13
  512. package/registry/generated/server.json +43 -0
  513. package/registry/generated/skills-index.md +121 -118
  514. package/registry/generated/skills-registry.json +167 -115
  515. package/registry/operations/fixtures/invalid-deprecated-without-replacement.json +60 -0
  516. package/registry/operations/fixtures/invalid-name.json +60 -0
  517. package/registry/operations/fixtures/invalid-publish-without-owner.json +82 -0
  518. package/registry/operations/fixtures/invalid-spend-without-estimate.json +42 -0
  519. package/registry/operations/fixtures/invalid-unknown-field.json +61 -0
  520. package/registry/operations/fixtures/valid-player-facing.json +82 -0
  521. package/registry/operations/fixtures/valid-read.json +60 -0
  522. package/registry/operations/fixtures/valid-spend.json +43 -0
  523. package/registry/operations/legacy-names.json +1241 -0
  524. package/registry/operations/public-catalog.json +33160 -0
  525. package/registry/schemas/operation.schema.json +318 -0
  526. package/registry/schemas/skill.schema.json +4 -0
  527. package/CLAUDE.md +0 -7
@@ -1,11 +1,12 @@
1
1
  import { z } from "zod";
2
2
  import { withEngine, missingEngineOpResult, withOldEngineHint } from "./with-engine.js";
3
3
  import { lookupApiDocs } from "../../core/capabilities/api-docs.js";
4
- import { RUN_EDITOR_SCRIPT_FALLBACK, RUN_SCRIPT_FALLBACK, buildRunEditorScriptOp, buildRunSceneScriptOp, } from "../../core/capabilities/scene-script.js";
4
+ import { RUN_EDITOR_SCRIPT_FALLBACK, RUN_SCRIPT_FALLBACK, buildRunEditorScriptOp, } from "../../core/capabilities/scene-script.js";
5
+ import { runSceneScriptOn } from "../../core/capabilities/scene-script-target.js";
5
6
  // Re-exported so existing tests keep importing the lookup from the tool module.
6
7
  export { API_DOCS_NOT_INSTALLED, isApiDocsBundleInstalled, lookupApiDocs, resetApiDocsForTests, } from "../../core/capabilities/api-docs.js";
7
8
  export function registerScriptTools(server) {
8
- server.tool("summer_run_script", `Run a GDScript snippet INSIDE the live editor, against the currently OPEN scene. This is the scene-scripting workhorse: one script replaces long chains of add-node/set-prop calls, and it can compute (loops, randomness, math, procedural meshes) what individual CRUD ops cannot.
9
+ server.tool("summer_run_script", `Run a GDScript snippet INSIDE the live editor, against the scene named by scenePath (opened first when it is not the edited one; the person's tab comes back after the run). Without scenePath it runs against the currently OPEN scene. This is the scene-scripting workhorse: one script replaces long chains of add-node/set-prop calls, and it can compute (loops, randomness, math, procedural meshes) what individual CRUD ops cannot.
9
10
 
10
11
  SCRIPT CONTRACT — write ONLY the body below; do not add extends/@tool lines (missing ones are prepended and reported in 'normalizations'):
11
12
 
@@ -33,6 +34,10 @@ WHEN TO USE: 3+ related ops, anything with computed placement (scatter, grids, r
33
34
  THE LOOP: summer_world_snapshot (keep snapshot_id) -> summer_run_script -> summer_snapshot_diff + summer_screenshot -> inspect -> iterate. Never claim visual success without the screenshot.
34
35
 
35
36
  Returns {ok, ran, result, reports, output, errors, duration_ms, checkpoint} — newer engines add rolled_back (a runtime error rolled the whole undo action back; the scene is untouched) and budget_enforced (max_seconds was a HARD deadline; when the budget hits, the script errors with "Summer script budget exceeded" — split the work into smaller scripts, never resubmit the same oversized one). Read 'errors' even when ok — with undo:'none', a partially-failed script may have mutated the scene. If this engine build predates RunSceneScript, the result is a structured engine_lacks_op failure (nothing is sent): use summer_run_editor_script or update Summer Engine.`, {
37
+ scenePath: z
38
+ .string()
39
+ .optional()
40
+ .describe("The scene to run against, e.g. 'res://main.tscn'. Opened first when it is not the edited scene, then the person's tab is restored. Omit only to run against whatever scene is open."),
36
41
  source: z.string().describe("GDScript source containing `func run(ctx):`. No extends/@tool line — just the function (plus any helpers)."),
37
42
  max_seconds: z
38
43
  .number()
@@ -46,12 +51,11 @@ Returns {ok, ran, result, reports, output, errors, duration_ms, checkpoint} —
46
51
  .enum(["action", "none"])
47
52
  .optional()
48
53
  .describe("Transaction mode (newer engines). 'action' (engine default): the whole run is ONE named undo action, and a mid-script runtime error rolls it back before returning (result rolled_back:true) — no half-mutated scene. 'none': v1 behavior, checkpoint only. Older engines ignore this."),
49
- }, async ({ source, max_seconds, checkpoint, undo }) => withEngine(async (client) => {
54
+ }, async ({ scenePath, source, max_seconds, checkpoint, undo }) => withEngine(async (client) => {
50
55
  const missing = missingEngineOpResult(client, "RunSceneScript", RUN_SCRIPT_FALLBACK);
51
56
  if (missing)
52
57
  return missing;
53
- const { op, timeoutMs } = buildRunSceneScriptOp({ source, max_seconds, checkpoint, undo });
54
- const result = await client.executeIdentityBoundOps([op], undefined, timeoutMs);
58
+ const result = await runSceneScriptOn(client, { scenePath, source, max_seconds, checkpoint, undo });
55
59
  return withOldEngineHint(result, "RunSceneScript", "use summer_run_editor_script instead");
56
60
  }));
57
61
  server.tool("summer_run_editor_script", `Run a GDScript EditorScript in a FRESH HEADLESS editor spawned against the ON-DISK project. Cold path: a whole child editor boots, runs your script once, and exits — seconds to tens of seconds depending on the project and the script (about 2 s end to end on a small template project; large projects can spend 30 s+ just booting).
@@ -1,4 +1,5 @@
1
1
  import { getClient } from "../server.js";
2
+ import { EngineNotRunningError } from "../../core/error-codes.js";
2
3
  import { extractOpError, withOldEngineHint } from "../../core/capabilities/engine-receipt.js";
3
4
  export { extractOpError, withOldEngineHint };
4
5
  export { missingEngineOpResult, type CapabilityAdvertisingClient, } from "../../core/capability-skew.js";
@@ -57,6 +58,11 @@ export interface WithEngineOptions<T> {
57
58
  */
58
59
  export declare function isAuthError(err: unknown): boolean;
59
60
  export declare function withEngine<T>(fn: (client: Awaited<ReturnType<typeof getClient>>) => Promise<T>, opts?: WithEngineOptions<T>): Promise<ToolResult>;
61
+ /** No editor reachable: `{ok:false, code:"engine_not_running", error,
62
+ * recovery, hint}` as JSON, so agents branch on the code instead of
63
+ * scraping the sentence. Exported for the tools that call getClient()
64
+ * outside withEngine. */
65
+ export declare function engineNotRunningResult(error: EngineNotRunningError): ToolResult;
60
66
  /** Every transport-level failure must TEACH recovery, not just name the error.
61
67
  * getClient()'s connect failure already carries its own instructions; anything
62
68
  * else (fetch failed / abort / HTTP status thrown mid-call) gets the generic
@@ -1,6 +1,7 @@
1
1
  import { getClient, resetClient } from "../server.js";
2
2
  import { recordMcpSession } from "../../core/telemetry.js";
3
3
  import { thrownErrorClass } from "../../core/tool-errors.js";
4
+ import { codedFailure, ENGINE_FREE_NOTE, EngineNotRunningError } from "../../core/error-codes.js";
4
5
  import { extractOpError, getFailureReason, withOldEngineHint, } from "../../core/capabilities/engine-receipt.js";
5
6
  export { extractOpError, withOldEngineHint };
6
7
  export { missingEngineOpResult, } from "../../core/capability-skew.js";
@@ -143,9 +144,27 @@ export async function withEngine(fn, opts) {
143
144
  break;
144
145
  }
145
146
  }
147
+ if (lastError instanceof EngineNotRunningError) {
148
+ return attachMeta(engineNotRunningResult(lastError), {
149
+ errorClass: "transport",
150
+ failureReason: "engine_not_running",
151
+ retried,
152
+ boundProjectIdHash,
153
+ });
154
+ }
146
155
  const msg = lastError instanceof Error ? lastError.message : String(lastError);
147
156
  return attachMeta({ content: [{ type: "text", text: withTransportRecovery(msg) }], isError: true }, { errorClass: "transport", retried, boundProjectIdHash });
148
157
  }
158
+ /** No editor reachable: `{ok:false, code:"engine_not_running", error,
159
+ * recovery, hint}` as JSON, so agents branch on the code instead of
160
+ * scraping the sentence. Exported for the tools that call getClient()
161
+ * outside withEngine. */
162
+ export function engineNotRunningResult(error) {
163
+ return {
164
+ isError: true,
165
+ content: [{ type: "text", text: JSON.stringify(codedFailure(error.code, error.message, { hint: ENGINE_FREE_NOTE }), null, 2) }],
166
+ };
167
+ }
149
168
  const PRE_APPLY_FAILURE_REASON = {
150
169
  input: "invalid_input",
151
170
  unsupported: "unsupported_operation",
@@ -0,0 +1,47 @@
1
+ /**
2
+ * AGENTS.md and CLAUDE.md in a Summer project. AGENTS.md is the one file
3
+ * Codex, Cursor, Copilot, Amp and other agents read in every session;
4
+ * Claude Code reads CLAUDE.md, which here only imports AGENTS.md.
5
+ * `summer create` writes both; `summer setup --yes` inside a project adds
6
+ * them when missing.
7
+ *
8
+ * An existing file is never overwritten: Summer adds one marked block once,
9
+ * and later runs replace only that block. A link is followed only to a file
10
+ * inside the project, and a CLAUDE.md that is the same file as AGENTS.md
11
+ * gets the AGENTS.md block only. The five commands are the list in the
12
+ * summer-cli skill (between its project-commands markers), so the two
13
+ * cannot drift; the skill's test runs every command both of them teach.
14
+ */
15
+ export declare const SUMMER_BLOCK_START = "<!-- summer-engine:start. summer setup updates only this block; write your own notes outside it. -->";
16
+ export declare const SUMMER_BLOCK_END = "<!-- summer-engine:end -->";
17
+ /** The numbered command list from the summer-cli skill. */
18
+ export declare function projectCommands(skill?: string): string;
19
+ /** The Summer block of AGENTS.md, markers included. */
20
+ export declare function renderAgentsBlock(commands?: string): string;
21
+ export type InstructionAction = "created" | "added" | "updated" | "unchanged" | "skipped";
22
+ export interface InstructionFileResult {
23
+ file: "AGENTS.md" | "CLAUDE.md";
24
+ path: string;
25
+ action: InstructionAction;
26
+ /** Why a file was skipped or left as it is. */
27
+ reason?: string;
28
+ }
29
+ /**
30
+ * Write or update AGENTS.md and CLAUDE.md in the project root. A new
31
+ * AGENTS.md is the Summer block; a new CLAUDE.md is `@AGENTS.md` only. An
32
+ * existing CLAUDE.md that already imports AGENTS.md is left as it is. Each
33
+ * file is its own step: a file that cannot be read or written is skipped
34
+ * with the reason, and the other is still done.
35
+ */
36
+ export declare function writeAgentInstructions(projectDir: string, options?: {
37
+ dryRun?: boolean;
38
+ block?: string;
39
+ }): InstructionFileResult[];
40
+ /**
41
+ * The Summer project the working directory is in, for `summer setup`: the
42
+ * nearest folder with project.godot, looking up no further than the git
43
+ * top level, and never the home folder or the filesystem root (a stray
44
+ * project.godot there must not put an AGENTS.md or CLAUDE.md in every
45
+ * session). Null when there is none.
46
+ */
47
+ export declare function findSetupProjectRoot(cwd?: string): string | null;
@@ -0,0 +1,226 @@
1
+ import { existsSync, lstatSync, readFileSync, readlinkSync, realpathSync, writeFileSync } from "fs";
2
+ import { homedir } from "os";
3
+ import { basename, dirname, join, parse, relative, resolve, isAbsolute } from "path";
4
+ import { PACKAGE_ROOT } from "../core/package-root.js";
5
+ /**
6
+ * AGENTS.md and CLAUDE.md in a Summer project. AGENTS.md is the one file
7
+ * Codex, Cursor, Copilot, Amp and other agents read in every session;
8
+ * Claude Code reads CLAUDE.md, which here only imports AGENTS.md.
9
+ * `summer create` writes both; `summer setup --yes` inside a project adds
10
+ * them when missing.
11
+ *
12
+ * An existing file is never overwritten: Summer adds one marked block once,
13
+ * and later runs replace only that block. A link is followed only to a file
14
+ * inside the project, and a CLAUDE.md that is the same file as AGENTS.md
15
+ * gets the AGENTS.md block only. The five commands are the list in the
16
+ * summer-cli skill (between its project-commands markers), so the two
17
+ * cannot drift; the skill's test runs every command both of them teach.
18
+ */
19
+ export const SUMMER_BLOCK_START = "<!-- summer-engine:start. summer setup updates only this block; write your own notes outside it. -->";
20
+ export const SUMMER_BLOCK_END = "<!-- summer-engine:end -->";
21
+ const CLAUDE_IMPORTS = new Set(["@AGENTS.md", "@./AGENTS.md"]);
22
+ const SKILL_PATH = ["library", "skills", "summer-cli", "SKILL.md"];
23
+ const COMMANDS = /<!-- project-commands[^>]*-->\n([\s\S]*?)\n<!-- \/project-commands -->/;
24
+ /** The numbered command list from the summer-cli skill. */
25
+ export function projectCommands(skill = readFileSync(join(PACKAGE_ROOT, ...SKILL_PATH), "utf-8")) {
26
+ const match = COMMANDS.exec(skill);
27
+ if (!match)
28
+ throw new Error("The summer-cli skill has no project-commands list.");
29
+ return match[1].trim();
30
+ }
31
+ /** The Summer block of AGENTS.md, markers included. */
32
+ export function renderAgentsBlock(commands = projectCommands()) {
33
+ return [
34
+ SUMMER_BLOCK_START,
35
+ "# Summer Engine game",
36
+ "",
37
+ "This is a game made with Summer Engine, the game engine built for AI. Game code is GDScript (`.gd`), scenes are `.tscn`, resources are `.tres`, and `project.godot` is the project file.",
38
+ "",
39
+ "## How to work on it",
40
+ "",
41
+ "- Change scenes through Summer while Summer Engine has the project open. The editor rewrites `.tscn` files when it saves, so hand edits get lost.",
42
+ "- With Summer's MCP server, call the `summer_*` tools and start with `summer_get_project_context`. Without it, run the same operations as `summer` commands in the shell (the `summer-cli` skill). If `summer` is missing or older than 4.0, use `npx -y summer-engine@latest` in its place.",
43
+ "- Summer's skills teach each part of a game. `npx -y summer-engine@latest setup <agent> --yes` installs them for your agent (add `--cli` for no MCP server). Start with `using-summer`, and find the right one with `summer docs search --query \"<the task>\"`.",
44
+ "- `.summer/` is the project's memory: `GameSoul.md` says what the game is, `memory/` holds the decisions to keep. Read them before you change the game's look, sound or story.",
45
+ "- Check your own work: script errors, a screenshot, a play run. Ask the person to play only for feel and fun.",
46
+ "",
47
+ "## The five commands",
48
+ "",
49
+ commands,
50
+ "",
51
+ "## Publishing",
52
+ "",
53
+ "The `publish-your-game` skill has the steps; `summer ops search \"publish my game\"` finds each operation. `summer store publish` sends the game to Summer's store review, and the game's owner approves it: give them the link it prints. Nothing goes live until they approve.",
54
+ SUMMER_BLOCK_END,
55
+ ].join("\n");
56
+ }
57
+ /** The text with `block` as its Summer block: replaced where it is, else appended. Keeps the file's line endings. */
58
+ function withBlock(text, block) {
59
+ const eol = text.includes("\r\n") ? "\r\n" : "\n";
60
+ const ours = block.replace(/\r?\n/g, eol);
61
+ const start = text.indexOf(SUMMER_BLOCK_START);
62
+ if (start === -1) {
63
+ // Only trailing line breaks change outside the block; an empty file is the block alone.
64
+ return { text: text.trim() ? `${text.replace(/(\r?\n)*$/, eol)}${eol}${ours}${eol}` : `${ours}${eol}`, action: "added" };
65
+ }
66
+ const end = text.indexOf(SUMMER_BLOCK_END, start);
67
+ if (end === -1)
68
+ return { text, action: "skipped", reason: "its Summer block has no end marker" };
69
+ // Two blocks (a merge, or the markers quoted in the person's text): which
70
+ // one is Summer's is not knowable, so the person picks; nothing is deleted.
71
+ if (text.indexOf(SUMMER_BLOCK_START, end) !== -1)
72
+ return { text, action: "skipped", reason: "it has two Summer blocks; delete one and run setup again" };
73
+ const next = `${text.slice(0, start)}${ours}${text.slice(end + SUMMER_BLOCK_END.length)}`;
74
+ return { text: next, action: next === text ? "unchanged" : "updated" };
75
+ }
76
+ /** Does the text import AGENTS.md on a line of its own, outside code fences? */
77
+ function importsAgents(text) {
78
+ let fence = false;
79
+ for (const line of text.split(/\r?\n/)) {
80
+ const trimmed = line.trim();
81
+ if (/^(```|~~~)/.test(trimmed))
82
+ fence = !fence;
83
+ else if (!fence && CLAUDE_IMPORTS.has(trimmed))
84
+ return true;
85
+ }
86
+ return false;
87
+ }
88
+ function inside(root, path) {
89
+ const rel = relative(root, path);
90
+ return rel === "" || (!rel.startsWith("..") && !isAbsolute(rel));
91
+ }
92
+ /**
93
+ * Where a file may be written, and `real`, the file a write lands in:
94
+ * "missing" (create it: here, or the missing target of a link inside the
95
+ * project), "file" (a file, or a link to one inside the project), or a
96
+ * reason to leave it alone (a link that points nowhere or out of the
97
+ * project). `real` is known before anything is written, so a link from one
98
+ * name to the other counts as one file even when its target is missing.
99
+ */
100
+ function locate(path, realRoot) {
101
+ let isLink = false;
102
+ try {
103
+ isLink = lstatSync(path).isSymbolicLink();
104
+ }
105
+ catch {
106
+ return { kind: "missing", real: join(realRoot, basename(path)) };
107
+ }
108
+ let real;
109
+ try {
110
+ real = realpathSync(path);
111
+ }
112
+ catch {
113
+ const target = resolve(realRoot, readlinkSync(path));
114
+ return inside(realRoot, target) ? { kind: "missing", real: target } : { kind: "skip", reason: "it is a link to a file that does not exist" };
115
+ }
116
+ if (isLink && !inside(realRoot, real))
117
+ return { kind: "skip", reason: "it is a link to a file outside the project" };
118
+ return { kind: "file", real };
119
+ }
120
+ /**
121
+ * Write or update AGENTS.md and CLAUDE.md in the project root. A new
122
+ * AGENTS.md is the Summer block; a new CLAUDE.md is `@AGENTS.md` only. An
123
+ * existing CLAUDE.md that already imports AGENTS.md is left as it is. Each
124
+ * file is its own step: a file that cannot be read or written is skipped
125
+ * with the reason, and the other is still done.
126
+ */
127
+ export function writeAgentInstructions(projectDir, options = {}) {
128
+ const agents = join(projectDir, "AGENTS.md");
129
+ const claude = join(projectDir, "CLAUDE.md");
130
+ let block;
131
+ let realRoot;
132
+ try {
133
+ block = options.block ?? renderAgentsBlock();
134
+ realRoot = realpathSync(projectDir);
135
+ }
136
+ catch (error) {
137
+ const reason = messageOf(error);
138
+ return [
139
+ { file: "AGENTS.md", path: agents, action: "skipped", reason },
140
+ { file: "CLAUDE.md", path: claude, action: "skipped", reason },
141
+ ];
142
+ }
143
+ const write = (path, text) => {
144
+ if (!options.dryRun)
145
+ writeFileSync(path, text, "utf-8");
146
+ };
147
+ const step = (file, path, run) => {
148
+ try {
149
+ return { file, path, ...run() };
150
+ }
151
+ catch (error) {
152
+ return { file, path, action: "skipped", reason: messageOf(error) };
153
+ }
154
+ };
155
+ const agentsAt = locate(agents, realRoot);
156
+ const agentsResult = step("AGENTS.md", agents, () => {
157
+ if (agentsAt.kind === "skip")
158
+ return { action: "skipped", reason: agentsAt.reason };
159
+ if (agentsAt.kind === "missing") {
160
+ write(agents, `${block}\n`);
161
+ return { action: "created" };
162
+ }
163
+ const next = withBlock(readFileSync(agents, "utf-8"), block);
164
+ if (next.action === "added" || next.action === "updated")
165
+ write(agents, next.text);
166
+ return { action: next.action, ...(next.reason ? { reason: next.reason } : {}) };
167
+ });
168
+ const claudeAt = locate(claude, realRoot);
169
+ const claudeResult = step("CLAUDE.md", claude, () => {
170
+ if (claudeAt.kind === "skip")
171
+ return { action: "skipped", reason: claudeAt.reason };
172
+ // CLAUDE.md -> AGENTS.md (or the reverse): one file, which already has the AGENTS.md block.
173
+ if (agentsAt.kind !== "skip" && claudeAt.real === agentsAt.real) {
174
+ return { action: "unchanged", reason: "it is the same file as AGENTS.md" };
175
+ }
176
+ if (claudeAt.kind === "missing") {
177
+ write(claude, "@AGENTS.md\n");
178
+ return { action: "created" };
179
+ }
180
+ const text = readFileSync(claude, "utf-8");
181
+ if (importsAgents(text) && !text.includes(SUMMER_BLOCK_START))
182
+ return { action: "unchanged" };
183
+ const next = withBlock(text, `${SUMMER_BLOCK_START}\n@AGENTS.md\n${SUMMER_BLOCK_END}`);
184
+ if (next.action === "added" || next.action === "updated")
185
+ write(claude, next.text);
186
+ return { action: next.action, ...(next.reason ? { reason: next.reason } : {}) };
187
+ });
188
+ return [agentsResult, claudeResult];
189
+ }
190
+ /**
191
+ * The Summer project the working directory is in, for `summer setup`: the
192
+ * nearest folder with project.godot, looking up no further than the git
193
+ * top level, and never the home folder or the filesystem root (a stray
194
+ * project.godot there must not put an AGENTS.md or CLAUDE.md in every
195
+ * session). Null when there is none.
196
+ */
197
+ export function findSetupProjectRoot(cwd = process.cwd()) {
198
+ let current;
199
+ try {
200
+ current = realpathSync(resolve(cwd));
201
+ }
202
+ catch {
203
+ return null;
204
+ }
205
+ let home;
206
+ try {
207
+ home = realpathSync(homedir());
208
+ }
209
+ catch {
210
+ home = homedir();
211
+ }
212
+ while (current !== home && current !== parse(current).root) {
213
+ if (existsSync(join(current, "project.godot")))
214
+ return current;
215
+ if (existsSync(join(current, ".git")))
216
+ return null;
217
+ const parent = dirname(current);
218
+ if (parent === current)
219
+ return null;
220
+ current = parent;
221
+ }
222
+ return null;
223
+ }
224
+ function messageOf(error) {
225
+ return error instanceof Error ? error.message : String(error);
226
+ }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "_generated": "GENERATED from integrations/gemini — do not edit; npm run generate:registry",
3
3
  "name": "summer",
4
- "version": "3.8.0",
5
- "description": "Agent tooling for Summer Engine: MCP bridge, context primer, and game-dev skills. Use with the npm CLI for skill files on disk.",
4
+ "version": "4.2.0",
5
+ "description": "The game engine built for AI. Any agent makes a multiplayer game and publishes it. The Summer Engine MCP server, context primer and game-dev skills.",
6
6
  "contextFileName": "GEMINI.md",
7
7
  "mcpServers": {
8
8
  "summer-engine": {
@@ -40,7 +40,6 @@
40
40
  "./library/skills/brainstorming/",
41
41
  "./library/skills/browse-templates/",
42
42
  "./library/skills/camera-rigs/",
43
- "./library/skills/celeste-momentum-platforming/",
44
43
  "./library/skills/character-animation-wiring/",
45
44
  "./library/skills/character-model/",
46
45
  "./library/skills/character-movement/",
@@ -49,6 +48,7 @@
49
48
  "./library/skills/combat-basics/",
50
49
  "./library/skills/compatibility-renderer-traps/",
51
50
  "./library/skills/concept-art/",
51
+ "./library/skills/concept-to-level/",
52
52
  "./library/skills/create-asset-sheet/",
53
53
  "./library/skills/debug/",
54
54
  "./library/skills/debugging-game-feel/",
@@ -67,13 +67,11 @@
67
67
  "./library/skills/gameskill/",
68
68
  "./library/skills/gdscript-patterns/",
69
69
  "./library/skills/generate-motion/",
70
- "./library/skills/godogen-visual-proof-game-generation/",
71
70
  "./library/skills/grow-analytics/",
72
71
  "./library/skills/headless-scripting/",
73
72
  "./library/skills/in-game-purchases/",
74
73
  "./library/skills/instantiate-asset-pack/",
75
74
  "./library/skills/investigating-bugs/",
76
- "./library/skills/lumera-single-image-scene-reconstruction/",
77
75
  "./library/skills/make-game/",
78
76
  "./library/skills/multiplayer/",
79
77
  "./library/skills/multiplayer-movement/",
@@ -90,9 +88,7 @@
90
88
  "./library/skills/playtesting-a-feature/",
91
89
  "./library/skills/procedural-animation/",
92
90
  "./library/skills/prop-model/",
93
- "./library/skills/psx-retro-rendering/",
94
91
  "./library/skills/publish-your-game/",
95
- "./library/skills/realtime-wet-surfaces/",
96
92
  "./library/skills/release-readiness/",
97
93
  "./library/skills/remote-deploy/",
98
94
  "./library/skills/retarget/",
@@ -102,10 +98,6 @@
102
98
  "./library/skills/scene-hierarchy-design/",
103
99
  "./library/skills/scene-scripting/",
104
100
  "./library/skills/scene-to-level/",
105
- "./library/skills/skill-create/",
106
- "./library/skills/skill-improve/",
107
- "./library/skills/skill-test/",
108
- "./library/skills/skintokens-auto-rigging/",
109
101
  "./library/skills/skybox-panorama/",
110
102
  "./library/skills/sound-effect/",
111
103
  "./library/skills/spatial-placement/",
@@ -115,6 +107,8 @@
115
107
  "./library/skills/summer-analytics/",
116
108
  "./library/skills/summer-apps/",
117
109
  "./library/skills/summer-apps-design/",
110
+ "./library/skills/summer-assets/",
111
+ "./library/skills/summer-cli/",
118
112
  "./library/skills/summer-friends/",
119
113
  "./library/skills/summer-leaderboards/",
120
114
  "./library/skills/summer-match-results/",
@@ -147,7 +141,6 @@
147
141
  "./library/skills/web-and-touch-input/",
148
142
  "./library/skills/web-compatibility-look/",
149
143
  "./library/skills/world-building-3d/",
150
- "./library/skills/writing-plans/",
151
- "./library/skills/writing-skills/"
144
+ "./library/skills/writing-plans/"
152
145
  ]
153
146
  }
@@ -9,9 +9,10 @@
9
9
  # Status: OPT-IN. The hook is always registered but exits 0 immediately
10
10
  # unless one of these is set:
11
11
  # CLAUDE_PLUGIN_OPTION_ENABLE_PRE_COMMIT_DOCTOR=true
12
- # Claude Code exports every plugin userConfig value to hook
13
- # processes as CLAUDE_PLUGIN_OPTION_<KEY>; this is the
14
- # `enable_pre_commit_doctor` toggle from plugin.json.
12
+ # The `enable_pre_commit_doctor` plugin option of older
13
+ # plugin versions (Claude Code exports userConfig values to
14
+ # hooks as CLAUDE_PLUGIN_OPTION_<KEY>). The plugin no longer
15
+ # declares it: every option opens a dialog on enable.
15
16
  # SUMMER_PRE_COMMIT_DOCTOR=1
16
17
  # Manual / other-host opt-in (also the envVar Gemini's
17
18
  # gemini-extension.json `settings` entry maps to).
@@ -111,7 +112,7 @@ if [ "$HAS_FAIL" -eq 1 ]; then
111
112
  echo "$FAIL_MSGS"
112
113
  echo ""
113
114
  echo "Fix the failures above, or run: summer doctor"
114
- echo "To bypass: turn off the plugin option enable_pre_commit_doctor (or unset SUMMER_PRE_COMMIT_DOCTOR)."
115
+ echo "To bypass: unset SUMMER_PRE_COMMIT_DOCTOR (or turn off the enable_pre_commit_doctor option where your host has it)."
115
116
  echo "============================================"
116
117
  } >&2
117
118
  exit 2
@@ -3,8 +3,8 @@
3
3
  #
4
4
  # Event: SessionStart (matcher: startup|clear|compact)
5
5
  # Purpose: Orient Claude on every fresh Summer-enabled session.
6
- # Detect Summer project + GameSoul + doctor health and surface a short
7
- # greeting as additional context.
6
+ # Detect Summer project + GameSoul + first-run state and surface a
7
+ # short greeting as additional context.
8
8
  #
9
9
  # Input: JSON on stdin with { session_id, source, model, cwd, ... }
10
10
  # Common Claude Code env vars: $CLAUDE_PROJECT_DIR, $CLAUDE_PLUGIN_ROOT
@@ -13,8 +13,8 @@
13
13
  # Exit: Always 0 — never block session start.
14
14
  #
15
15
  # Portability: bash 3.2+ (macOS default), POSIX-friendly, works on Git Bash.
16
- # Uses `grep -E` not `grep -P`. Falls back gracefully when jq
17
- # and `summer` are missing.
16
+ # Uses `grep -E` not `grep -P`. File checks only: no network,
17
+ # no child processes beyond grep/awk/find, so it returns at once.
18
18
 
19
19
  set +e # Hooks must never kill the session.
20
20
 
@@ -64,30 +64,26 @@ if [ -f "${PROJECT_DIR}/project.godot" ]; then
64
64
  fi
65
65
  fi
66
66
 
67
- # Line 3: doctor fail one-liner (only on status "fail" — silent on ok/warning).
68
- # Doctor JSON (src/core/capabilities/doctor.ts): checks[].status is lowercase
69
- # "ok" | "warning" | "fail". Only runs when a `summer` CLI is on PATH: the
70
- # documented npx install never puts one there, and a cold `npx summer-engine`
71
- # fetch would exceed the 10s SessionStart budget, so we degrade silently.
72
- if command -v summer >/dev/null 2>&1; then
73
- DOCTOR_OUT=$(summer doctor --json 2>/dev/null)
74
- if [ -n "$DOCTOR_OUT" ]; then
75
- FAIL_REASON=""
76
- if command -v jq >/dev/null 2>&1; then
77
- FAIL_REASON=$(printf '%s' "$DOCTOR_OUT" \
78
- | jq -r 'first(.checks[]? | select((.status // "" | ascii_downcase) == "fail") | .message) // empty' 2>/dev/null)
79
- else
80
- # Crude fallback: first "message" near a "fail"
81
- FAIL_REASON=$(printf '%s' "$DOCTOR_OUT" \
82
- | grep -oE '"status"[[:space:]]*:[[:space:]]*"(FAIL|fail)"[^}]*"message"[[:space:]]*:[[:space:]]*"[^"]*"' \
83
- | head -1 \
84
- | grep -oE '"message"[[:space:]]*:[[:space:]]*"[^"]*"' \
85
- | sed 's/.*"message"[[:space:]]*:[[:space:]]*"//;s/"$//')
86
- fi
87
- if [ -n "$FAIL_REASON" ]; then
88
- LINES+=("Summer setup needs attention: ${FAIL_REASON}. Run: summer doctor")
89
- fi
90
- fi
67
+ # Line 3: first-run / sign-in hint, from local files only. No network and no
68
+ # `summer doctor` here: SessionStart blocks the session until it returns, and a
69
+ # doctor run (npm registry, engine probe, MCP boot) can take seconds. The full
70
+ # check is one call away (`summer doctor`, or /summer:start on a first run).
71
+ SUMMER_HOME="${HOME}/.summer"
72
+ ENGINE_FOUND=""
73
+ for candidate in "/Applications/Summer.app" "${HOME}/Applications/Summer.app" \
74
+ "${LOCALAPPDATA:-}/Programs/Summer" "${LOCALAPPDATA:-}/SummerEngine" "${HOME}/.local/share/summer-engine"; do
75
+ if [ -e "$candidate" ]; then ENGINE_FOUND=1; break; fi
76
+ done
77
+ if [ -n "${SUMMER_BIN:-}${SUMMER_ENGINE_BINARY:-}" ]; then ENGINE_FOUND=1; fi
78
+ # /summer:start is the Claude Code plugin command; other hosts get the CLI.
79
+ START_HINT="run: npx -y summer-engine@latest setup"
80
+ if [ -n "${CLAUDE_PLUGIN_ROOT:-}" ] && [ -z "${CURSOR_PLUGIN_ROOT:-}" ]; then
81
+ START_HINT="suggest /summer:start (sets up Summer and makes a first playable game in about five minutes)"
82
+ fi
83
+ if [ ! -d "$SUMMER_HOME" ] && [ -z "$ENGINE_FOUND" ] && [ -z "${SUMMER_TOKEN:-}" ]; then
84
+ LINES+=("Summer is not set up on this machine yet. When the user wants to make a game, ${START_HINT}.")
85
+ elif [ ! -f "${SUMMER_HOME}/auth-token" ] && [ -z "${SUMMER_TOKEN:-}" ]; then
86
+ LINES+=("Summer CLI is not signed in: asset and publishing tools need \`summer login\` (or sign in to the summer-cloud server in /mcp).")
91
87
  fi
92
88
 
93
89
  # ---------- Compose context ----------
@@ -58,7 +58,7 @@ are listed where they differ.
58
58
  | claude-desktop | — | MCP: `~/Library/Application Support/Claude/claude_desktop_config.json`; Linux `~/.config/Claude/claude_desktop_config.json`; Windows `%APPDATA%/Claude/claude_desktop_config.json`; no skills folder (MCP only) |
59
59
  | codex | `.codex-plugin/plugin.json` | MCP: `~/.codex/config.toml`; project `.codex/config.toml`; skills: `~/.agents/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
60
60
  | cursor | `.cursor-plugin/plugin.json` | MCP: `~/.cursor/mcp.json`; project `.cursor/mcp.json`; skills: `~/.agents/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
61
- | windsurf | — | MCP: `~/.codeium/windsurf/mcp_config.json`; skills: `~/.agents/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
61
+ | windsurf | — | MCP: `~/.config/devin/mcp_config.json`; Windows `%APPDATA%/devin/mcp_config.json`; skills: `~/.agents/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
62
62
  | antigravity | — | MCP: `~/.gemini/config/mcp_config.json`; project `.agents/mcp_config.json`; skills: `~/.gemini/config/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
63
63
  | gemini (legacy) | `gemini-extension.json` | MCP: `~/.gemini/extensions/summer-engine/gemini-extension.json`; skills: `~/.gemini/extensions/summer-engine/skills` (`<skill>/SKILL.md`) |
64
64
  | cline | — | MCP: `~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`; Linux `~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`; Windows `%APPDATA%/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`; skills: `~/.cline/skills`; project `.cline/skills` (`<skill>/SKILL.md`) |
@@ -8,6 +8,12 @@ Generated by `scripts/generate-registry` from `library/**/resource.yaml`:
8
8
  - `registry/generated/marketplace.claude.json` -> `.claude-plugin/marketplace.json`
9
9
  (marketplace listing wrapper).
10
10
 
11
+ - `registry/generated/plugin.claude-directory.json` -> `plugins/claude/.claude-plugin/plugin.json`,
12
+ plus the rest of `plugins/claude/` (`scripts/generate-registry/mirrors.ts`): the same
13
+ plugin for Anthropic's plugin directory, from a folder of its own (under 512 files,
14
+ no symlinks), with the server and every `summer-engine@latest` pinned to this
15
+ version. Submit `plugins/claude` as the plugin path.
16
+
11
17
  The MCP pointer `./.mcp.json` these manifests reference is generated as
12
18
  well (`registry/generated/mcp.json -> .mcp.json`, owned by the claude target).
13
19
 
@@ -11,6 +11,10 @@
11
11
  {
12
12
  "generated": "mcp.json",
13
13
  "destination": ".mcp.json"
14
+ },
15
+ {
16
+ "generated": "plugin.claude-directory.json",
17
+ "destination": "plugins/claude/.claude-plugin/plugin.json"
14
18
  }
15
19
  ]
16
20
  }
@@ -6,7 +6,7 @@ is intentionally empty. Support is delivered at install time by
6
6
 
7
7
  - MCP config: `~/Library/Application Support/Claude/claude_desktop_config.json`; Linux `~/.config/Claude/claude_desktop_config.json`; Windows `%APPDATA%/Claude/claude_desktop_config.json` (user); user scope only (project requests fall back with a warning).
8
8
  Shape: `mcpServers.summer-engine = { command, args }`.
9
- - Skills: none. Claude Desktop has no skills folder. The MCP server ships summer_get_agent_playbook, so the model can pull Summer guidance in-chat.
9
+ - Skills: none. Claude Desktop has no skills folder. The MCP server ships summer_docs_search and summer_docs_read, so the model can pull Summer guidance in-chat.
10
10
  - After: Quit and reopen Claude Desktop; the summer-engine tools appear under the tools menu in a new chat.
11
11
 
12
12
  Source of truth: `src/installer/agent-table.ts` (one row per agent).
@@ -6,7 +6,7 @@ is intentionally empty. Support is delivered at install time by
6
6
 
7
7
  - MCP config: `~/.config/github-copilot/intellij/mcp.json`; Windows `%APPDATA%/github-copilot/intellij/mcp.json` (user); user scope only (project requests fall back with a warning).
8
8
  Shape: `servers.summer-engine = { command, args }`.
9
- - Skills: none. Copilot in JetBrains documents no skills folder; the MCP server ships summer_get_agent_playbook for in-chat guidance.
9
+ - Skills: none. Copilot in JetBrains documents no skills folder; the MCP server ships summer_docs_search and summer_docs_read for in-chat guidance.
10
10
  - After: Restart the JetBrains IDE and open Copilot Chat in Agent mode; summer-engine shows in the tools list.
11
11
 
12
12
  Source of truth: `src/installer/agent-table.ts` (one row per agent).
@@ -21,6 +21,17 @@ Generated by `scripts/generate-registry` from `library/**/resource.yaml`:
21
21
  `skills install --all --agent gemini`); Gemini extensions are user-scoped, so
22
22
  `--scope project` falls back to user with a warning.
23
23
 
24
+ `gemini extensions install https://github.com/SummerEngine/summer` (and the
25
+ Gemini CLI gallery) installs a GitHub Release's only asset when it has one.
26
+ `.github/workflows/gemini-extension.yml` attaches `summer-gemini-extension.tar.gz`
27
+ to every release (`scripts/build-gemini-extension.ts`): the manifest without `settings` (no hooks ship) and without
28
+ `skills`, `GEMINI.md`, `AGENTS.md` and `skills/<slug>/` for every bundled skill.
29
+ Keep it the release's only asset, or Gemini falls back to the source tarball,
30
+ which has no `skills/` folder: the workflow leaves a release that already has it
31
+ alone and stops with an error on one that has other assets. Every packaged file
32
+ comes from the tag itself (only the script comes from the workflow's commit), so
33
+ dispatching it for an older tag packages that release as it was.
34
+
24
35
  Never edit the destination file by hand — edit `library/` resources or
25
36
  `scripts/generate-registry/manifests.ts`, then run
26
37
  `npm run generate:registry`. CI `--check` fails on any drift.