summer-engine 3.3.0 → 3.4.1

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 (293) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +4 -2
  3. package/.codex-plugin/plugin.json +5 -3
  4. package/.cursor-plugin/plugin.json +4 -2
  5. package/.factory-plugin/plugin.json +4 -2
  6. package/.opencode/INSTALL.md +8 -8
  7. package/.opencode/plugins/summer.js +2 -2
  8. package/AGENTS.md +7 -7
  9. package/CHANGELOG.md +50 -0
  10. package/GEMINI.md +1 -1
  11. package/NOTICE +1 -1
  12. package/README.md +32 -35
  13. package/assets/api-docs.json.gz +0 -0
  14. package/assets/autopilot/run.sh +2 -2
  15. package/assets/navigation/web-routes.json +1 -1
  16. package/commands/gameskill.md +2 -2
  17. package/commands/summer.md +25 -25
  18. package/dist/cli/commands/install.d.ts +10 -0
  19. package/dist/cli/commands/install.js +55 -10
  20. package/dist/cli/commands/open.d.ts +1 -1
  21. package/dist/cli/commands/run.d.ts +1 -1
  22. package/dist/cli/commands/run.js +1 -1
  23. package/dist/cli/commands/skills.js +2 -2
  24. package/dist/cli/commands/tool.d.ts +7 -0
  25. package/dist/cli/commands/tool.js +36 -1
  26. package/dist/core/api-client.d.ts +5 -6
  27. package/dist/core/api-client.js +12 -15
  28. package/dist/core/auth.js +2 -2
  29. package/dist/core/capabilities/asset-import.d.ts +0 -1
  30. package/dist/core/capabilities/camera-view.d.ts +1 -1
  31. package/dist/core/capabilities/camera-view.js +2 -2
  32. package/dist/core/capabilities/capture-gameplay.d.ts +69 -0
  33. package/dist/core/capabilities/capture-gameplay.js +283 -0
  34. package/dist/core/capabilities/connect-signal.d.ts +1 -2
  35. package/dist/core/capabilities/connect-signal.js +1 -2
  36. package/dist/core/capabilities/console-read.d.ts +2 -2
  37. package/dist/core/capabilities/console-read.js +2 -2
  38. package/dist/core/capabilities/creator.js +1 -1
  39. package/dist/core/capabilities/doctor.d.ts +9 -1
  40. package/dist/core/capabilities/doctor.js +47 -4
  41. package/dist/core/capabilities/engine-receipt.d.ts +5 -7
  42. package/dist/core/capabilities/engine-receipt.js +7 -9
  43. package/dist/core/capabilities/engine-run.d.ts +4 -0
  44. package/dist/core/capabilities/engine-run.js +33 -5
  45. package/dist/core/capabilities/export-engine-version.d.ts +15 -0
  46. package/dist/core/capabilities/export-engine-version.js +24 -0
  47. package/dist/core/capabilities/export-game.d.ts +9 -1
  48. package/dist/core/capabilities/export-game.js +115 -39
  49. package/dist/core/capabilities/export-presets.d.ts +1 -1
  50. package/dist/core/capabilities/export-presets.js +1 -1
  51. package/dist/core/capabilities/fabricate-mesh.d.ts +2 -3
  52. package/dist/core/capabilities/fabricate-mesh.js +2 -3
  53. package/dist/core/capabilities/frame-quality.d.ts +4 -4
  54. package/dist/core/capabilities/frame-quality.js +4 -4
  55. package/dist/core/capabilities/grep.d.ts +1 -1
  56. package/dist/core/capabilities/grep.js +1 -1
  57. package/dist/core/capabilities/image-generation.d.ts +9 -0
  58. package/dist/core/capabilities/image-generation.js +19 -1
  59. package/dist/core/capabilities/navigation/open.d.ts +1 -1
  60. package/dist/core/capabilities/navigation/open.js +1 -1
  61. package/dist/core/capabilities/navigation/render-product-map.js +1 -1
  62. package/dist/core/capabilities/navigation/targets.js +2 -2
  63. package/dist/core/capabilities/placement-batch.d.ts +1 -1
  64. package/dist/core/capabilities/placement-batch.js +2 -2
  65. package/dist/core/capabilities/play-determinism.d.ts +1 -1
  66. package/dist/core/capabilities/play-determinism.js +1 -1
  67. package/dist/core/capabilities/publish-build.d.ts +15 -2
  68. package/dist/core/capabilities/publish-build.js +78 -28
  69. package/dist/core/capabilities/publish-download.d.ts +1 -2
  70. package/dist/core/capabilities/publish-download.js +2 -3
  71. package/dist/core/capabilities/replace-node.d.ts +1 -3
  72. package/dist/core/capabilities/replace-node.js +1 -3
  73. package/dist/core/capabilities/runtime-control.d.ts +5 -7
  74. package/dist/core/capabilities/runtime-control.js +7 -9
  75. package/dist/core/capabilities/scene-batch.d.ts +1 -1
  76. package/dist/core/capabilities/scene-batch.js +1 -1
  77. package/dist/core/capabilities/scene-kind.js +1 -1
  78. package/dist/core/capabilities/scene-readback.d.ts +3 -4
  79. package/dist/core/capabilities/scene-readback.js +3 -4
  80. package/dist/core/capabilities/scene-script.d.ts +2 -2
  81. package/dist/core/capabilities/scene-script.js +2 -2
  82. package/dist/core/capabilities/seeing/shot-store.d.ts +1 -1
  83. package/dist/core/capabilities/seeing/shot-store.js +1 -1
  84. package/dist/core/capabilities/summer-bundle.d.ts +2 -3
  85. package/dist/core/capabilities/summer-bundle.js +2 -3
  86. package/dist/core/capabilities/surface-snap.d.ts +1 -1
  87. package/dist/core/capabilities/surface-snap.js +1 -1
  88. package/dist/core/capabilities/tool-dispatch.js +11 -1
  89. package/dist/core/capabilities/ui-control.d.ts +1 -2
  90. package/dist/core/capabilities/ui-control.js +1 -2
  91. package/dist/core/capabilities/world-snapshot.d.ts +1 -1
  92. package/dist/core/capabilities/world-snapshot.js +1 -1
  93. package/dist/core/capability-skew.d.ts +2 -3
  94. package/dist/core/capability-skew.js +4 -5
  95. package/dist/core/config.js +2 -2
  96. package/dist/core/engine-install.d.ts +16 -0
  97. package/dist/core/engine-install.js +32 -2
  98. package/dist/core/feedback/client.js +1 -1
  99. package/dist/core/hosted-mcp.d.ts +115 -0
  100. package/dist/core/hosted-mcp.js +164 -0
  101. package/dist/core/launch-posture.d.ts +6 -3
  102. package/dist/core/launch-posture.js +18 -5
  103. package/dist/core/library-read.js +1 -2
  104. package/dist/core/templates.d.ts +1 -2
  105. package/dist/core/templates.js +1 -2
  106. package/dist/mcp/hosted-mount.d.ts +13 -59
  107. package/dist/mcp/hosted-mount.js +24 -30
  108. package/dist/mcp/server.d.ts +2 -2
  109. package/dist/mcp/server.js +5 -4
  110. package/dist/mcp/tools/creator-tools.js +14 -4
  111. package/dist/mcp/tools/debug-tools.js +1 -1
  112. package/dist/mcp/tools/generate-tools.js +19 -9
  113. package/dist/mcp/tools/navigation-tools.d.ts +1 -1
  114. package/dist/mcp/tools/navigation-tools.js +1 -1
  115. package/dist/mcp/tools/spatial-tools.js +1 -1
  116. package/dist/mcp/tools/visual-tools.js +2 -2
  117. package/dist/mcp/tools/with-engine.d.ts +1 -2
  118. package/dist/mcp/tools/with-engine.js +1 -2
  119. package/gemini-extension.json +3 -1
  120. package/hooks/session-start.sh +2 -2
  121. package/integrations/README.md +70 -76
  122. package/integrations/claude/README.md +0 -3
  123. package/integrations/codex/README.md +1 -2
  124. package/integrations/copilot-jetbrains/README.md +1 -1
  125. package/integrations/cursor/README.md +1 -2
  126. package/integrations/factory/README.md +15 -11
  127. package/integrations/mistral-vibe/README.md +1 -1
  128. package/integrations/opencode/README.md +1 -1
  129. package/integrations/roo-code/README.md +1 -1
  130. package/integrations/rovo-dev/README.md +1 -1
  131. package/integrations/trae/README.md +1 -1
  132. package/integrations/windsurf/README.md +3 -3
  133. package/library/references/collaborative-protocol/collaborative-protocol.md +5 -5
  134. package/library/references/gd-style/gd-style.md +4 -6
  135. package/library/references/godot-version/godot-version.md +3 -3
  136. package/library/references/headless-routing/headless-routing.md +2 -2
  137. package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +2 -2
  138. package/library/references/mcp-tools-reference/mcp-tools-reference.md +18 -16
  139. package/library/references/product-map/product-map.md +1 -1
  140. package/library/references/public-surface-language/public-surface-language.md +1 -1
  141. package/library/references/summer-folder/summer-folder.md +1 -1
  142. package/library/skills/3d-lighting/SKILL.md +4 -4
  143. package/library/skills/README.md +11 -9
  144. package/library/skills/adaptive-music/SKILL.md +7 -7
  145. package/library/skills/ai-characters-in-games/SKILL.md +1 -1
  146. package/library/skills/ambient-bed/SKILL.md +12 -14
  147. package/library/skills/animated-loop/SKILL.md +42 -42
  148. package/library/skills/animation-tree/SKILL.md +6 -6
  149. package/library/skills/art-direction/SKILL.md +8 -11
  150. package/library/skills/asset-strategy/SKILL.md +3 -3
  151. package/library/skills/audio-direction/SKILL.md +8 -10
  152. package/library/skills/auto-fire-targeting/SKILL.md +4 -3
  153. package/library/skills/bounded-engine-runs/SKILL.md +95 -0
  154. package/library/skills/bounded-engine-runs/resource.yaml +29 -0
  155. package/library/skills/brainstorm-game/SKILL.md +5 -5
  156. package/library/skills/brainstorming/SKILL.md +9 -15
  157. package/library/skills/celeste-momentum-platforming/SKILL.md +8 -13
  158. package/library/skills/celeste-momentum-platforming/resource.yaml +1 -1
  159. package/library/skills/character-animation-wiring/SKILL.md +2 -2
  160. package/library/skills/character-model/SKILL.md +15 -26
  161. package/library/skills/character-movement/SKILL.md +1 -1
  162. package/library/skills/character-movement/references/movement-3d.md +1 -1
  163. package/library/skills/character-portrait/SKILL.md +4 -4
  164. package/library/skills/cinematic-cutscene/SKILL.md +38 -38
  165. package/library/skills/combat-basics/SKILL.md +1 -1
  166. package/library/skills/compatibility-renderer-traps/SKILL.md +78 -0
  167. package/library/skills/compatibility-renderer-traps/resource.yaml +28 -0
  168. package/library/skills/concept-art/SKILL.md +4 -4
  169. package/library/skills/create-asset-sheet/SKILL.md +12 -31
  170. package/library/skills/debug/SKILL.md +5 -4
  171. package/library/skills/debugging-game-feel/SKILL.md +1 -4
  172. package/library/skills/debugging-game-feel/resource.yaml +1 -1
  173. package/library/skills/design-level/SKILL.md +5 -5
  174. package/library/skills/design-mechanic/SKILL.md +6 -6
  175. package/library/skills/design-npc/SKILL.md +8 -15
  176. package/library/skills/diagnosing-perf-regressions/SKILL.md +5 -10
  177. package/library/skills/dispatching-parallel-agents/SKILL.md +1 -19
  178. package/library/skills/environment-kit/SKILL.md +5 -5
  179. package/library/skills/export-and-ship/SKILL.md +25 -24
  180. package/library/skills/fabricating-assets/SKILL.md +1 -1
  181. package/library/skills/facial-and-lipsync/SKILL.md +5 -5
  182. package/library/skills/fps-controller/SKILL.md +17 -16
  183. package/library/skills/fps-controller/resource.yaml +0 -2
  184. package/library/skills/game-feel/SKILL.md +6 -7
  185. package/library/skills/gameskill/SKILL.md +3 -3
  186. package/library/skills/gdscript-patterns/SKILL.md +3 -3
  187. package/library/skills/generate-motion/SKILL.md +5 -22
  188. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +72 -90
  189. package/library/skills/godogen-visual-proof-game-generation/resource.yaml +0 -1
  190. package/library/skills/headless-scripting/SKILL.md +8 -8
  191. package/library/skills/headless-scripting/resource.yaml +1 -0
  192. package/library/skills/in-game-purchases/SKILL.md +123 -118
  193. package/library/skills/in-game-purchases/resource.yaml +2 -2
  194. package/library/skills/instantiate-asset-pack/SKILL.md +7 -3
  195. package/library/skills/investigating-bugs/SKILL.md +3 -11
  196. package/library/skills/investigating-bugs/condition-based-waiting.md +0 -10
  197. package/library/skills/investigating-bugs/root-cause-tracing.md +0 -8
  198. package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +15 -15
  199. package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +0 -1
  200. package/library/skills/make-game/SKILL.md +3 -5
  201. package/library/skills/make-game/references/2d-platformer.md +1 -1
  202. package/library/skills/multiplayer-project/SKILL.md +1 -1
  203. package/library/skills/multiplayer-testing/SKILL.md +4 -4
  204. package/library/skills/music-track/SKILL.md +40 -38
  205. package/library/skills/new-project/SKILL.md +4 -6
  206. package/library/skills/organic-model/SKILL.md +9 -9
  207. package/library/skills/pixel-art/SKILL.md +6 -6
  208. package/library/skills/play/SKILL.md +3 -4
  209. package/library/skills/playtesting-a-feature/SKILL.md +4 -6
  210. package/library/skills/procedural-animation/SKILL.md +10 -11
  211. package/library/skills/prop-model/SKILL.md +4 -4
  212. package/library/skills/psx-retro-rendering/SKILL.md +20 -20
  213. package/library/skills/psx-retro-rendering/resource.yaml +2 -3
  214. package/library/skills/realtime-wet-surfaces/SKILL.md +15 -15
  215. package/library/skills/realtime-wet-surfaces/resource.yaml +1 -2
  216. package/library/skills/remote-deploy/SKILL.md +20 -21
  217. package/library/skills/retarget/SKILL.md +19 -23
  218. package/library/skills/running-in-the-cloud/SKILL.md +5 -5
  219. package/library/skills/scene-composition/SKILL.md +5 -5
  220. package/library/skills/scene-hierarchy-design/SKILL.md +3 -3
  221. package/library/skills/scene-hierarchy-design/resource.yaml +0 -1
  222. package/library/skills/scene-scripting/SKILL.md +3 -3
  223. package/library/skills/scene-to-level/SKILL.md +28 -31
  224. package/library/skills/skill-create/SKILL.md +1 -1
  225. package/library/skills/skill-improve/SKILL.md +9 -9
  226. package/library/skills/skill-test/SKILL.md +10 -10
  227. package/library/skills/skintokens-auto-rigging/SKILL.md +18 -18
  228. package/library/skills/skintokens-auto-rigging/resource.yaml +3 -3
  229. package/library/skills/skybox-panorama/SKILL.md +8 -9
  230. package/library/skills/sound-effect/SKILL.md +19 -19
  231. package/library/skills/spatial-placement/SKILL.md +2 -2
  232. package/library/skills/spatial-placement/references/kit-placement-tools.md +12 -22
  233. package/library/skills/sprite-sheet/SKILL.md +10 -10
  234. package/library/skills/summer-analytics/SKILL.md +3 -3
  235. package/library/skills/summer-friends/SKILL.md +10 -10
  236. package/library/skills/summer-leaderboards/SKILL.md +6 -6
  237. package/library/skills/summer-match-results/SKILL.md +13 -13
  238. package/library/skills/summer-matchmaking/SKILL.md +11 -11
  239. package/library/skills/summer-parties/SKILL.md +9 -9
  240. package/library/skills/summer-player-data/SKILL.md +12 -12
  241. package/library/skills/summer-store/SKILL.md +6 -6
  242. package/library/skills/summer-world-chat/SKILL.md +9 -9
  243. package/library/skills/summer-world-saves/SKILL.md +7 -7
  244. package/library/skills/text-to-motion/rigging-for-text-motion.md +1 -1
  245. package/library/skills/tileable-texture/SKILL.md +1 -1
  246. package/library/skills/trailer-shot/SKILL.md +36 -36
  247. package/library/skills/tune-performance/SKILL.md +13 -13
  248. package/library/skills/tune-performance/resource.yaml +1 -1
  249. package/library/skills/ui-graphics/SKILL.md +7 -7
  250. package/library/skills/use-widget-asset/SKILL.md +7 -7
  251. package/library/skills/using-summer/SKILL.md +5 -7
  252. package/library/skills/vehicle-model/SKILL.md +6 -7
  253. package/library/skills/vehicle-model/resource.yaml +2 -2
  254. package/library/skills/verification-before-completion/SKILL.md +5 -6
  255. package/library/skills/vfx-dissolve/SKILL.md +4 -4
  256. package/library/skills/vfx-fire/SKILL.md +6 -6
  257. package/library/skills/vfx-fire/_building-blocks/additive-billboard-particles.md +3 -3
  258. package/library/skills/vfx-hit-spark/SKILL.md +4 -4
  259. package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +3 -3
  260. package/library/skills/vfx-lightning/SKILL.md +5 -5
  261. package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +3 -3
  262. package/library/skills/vfx-lightning/_building-blocks/trauma-shake-snippet.md +9 -3
  263. package/library/skills/vfx-magic-glow/SKILL.md +4 -4
  264. package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +3 -3
  265. package/library/skills/vfx-muzzle-flash/SKILL.md +5 -5
  266. package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +3 -3
  267. package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +9 -3
  268. package/library/skills/vfx-smoke/SKILL.md +5 -5
  269. package/library/skills/vfx-water-ripple/SKILL.md +2 -2
  270. package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +3 -3
  271. package/library/skills/voice-line/SKILL.md +9 -9
  272. package/library/skills/web-compatibility-look/resource.yaml +1 -0
  273. package/library/skills/world-building-3d/references/spatial-tools.md +2 -2
  274. package/library/skills/writing-plans/SKILL.md +4 -4
  275. package/library/skills/writing-skills/SKILL.md +8 -8
  276. package/library/tools/capture-gameplay/resource.yaml +73 -0
  277. package/library/tools/creator-publish/resource.yaml +4 -4
  278. package/library/tools/creator-releases/resource.yaml +5 -5
  279. package/library/tools/generate-image/resource.yaml +15 -1
  280. package/library/tools/publish-build/resource.yaml +6 -2
  281. package/package.json +1 -1
  282. package/registry/generated/aliases.json +1 -0
  283. package/registry/generated/counts.json +3 -3
  284. package/registry/generated/gemini-extension.json +3 -1
  285. package/registry/generated/index.json +248 -135
  286. package/registry/generated/marketplace.claude.json +2 -2
  287. package/registry/generated/plugin.claude.json +4 -2
  288. package/registry/generated/plugin.codex.json +5 -3
  289. package/registry/generated/plugin.cursor.json +4 -2
  290. package/registry/generated/plugin.factory.json +4 -2
  291. package/registry/generated/skills-index.md +11 -9
  292. package/registry/generated/skills-registry.json +33 -6
  293. package/registry/schemas/domains.json +1 -1
@@ -1,10 +1,8 @@
1
- import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
- import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
3
1
  import { ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
4
2
  import { z } from "zod";
3
+ import { connectHostedMcp } from "../core/hosted-mcp.js";
5
4
  import { getStoreAccessToken, OAuthError, resolveMcpResourceUrl } from "../core/oauth.js";
6
5
  import { appendMcpLogEvent } from "../core/mcp-log.js";
7
- import { TOOLKIT_VERSION } from "../core/version.js";
8
6
  /**
9
7
  * One Summer Engine MCP. The cloud tools a creator's agent needs to publish
10
8
  * (projects, store page, build upload, submit for the owner's approval, the
@@ -16,38 +14,20 @@ import { TOOLKIT_VERSION } from "../core/version.js";
16
14
  * that server). A name the local MCP already has stays local (the engine and
17
15
  * generation tools keep their CLI-token path).
18
16
  *
19
- * Mounting is lazy: the server answers with the engine tools at once, and the
20
- * hosted tools appear when the mount finishes (tools/list_changed). Without a
21
- * store sign-in one tool, summer_store_tools, says how to sign in and mounts
22
- * on the next call.
17
+ * Mounting runs after connect. The first tools/list waits for a mount in
18
+ * progress (up to FIRST_LIST_WAIT_MS), so a host that lists tools once still
19
+ * sees the store tools; a slower mount adds them later (tools/list_changed).
20
+ * Without a store sign-in the mount fails at once, and one tool,
21
+ * summer_store_tools, says how to sign in and mounts on the next call.
23
22
  */
24
23
  export const STORE_TOOLS_STATUS = "summer_store_tools";
25
- const CALL_TIMEOUT_MS = 120_000;
24
+ /** How long the first tools/list waits for a mount in progress, so hosts that list once see the store tools. */
25
+ export const FIRST_LIST_WAIT_MS = 5_000;
26
26
  const passthroughArgs = z.object({}).passthrough();
27
27
  export const defaultHostedMountDependencies = {
28
28
  url: () => resolveMcpResourceUrl(),
29
29
  token: () => getStoreAccessToken(),
30
- connect: async (url, token) => {
31
- const transport = new StreamableHTTPClientTransport(new URL(url), {
32
- // A fresh (refreshed when near expiry) token on every request.
33
- fetch: async (input, init) => {
34
- const headers = new Headers(init?.headers);
35
- headers.set("authorization", `Bearer ${await token()}`);
36
- return fetch(input, { ...init, headers });
37
- },
38
- });
39
- const client = new Client({ name: "summer-engine-local", version: TOOLKIT_VERSION });
40
- await client.connect(transport);
41
- const timeout = { timeout: CALL_TIMEOUT_MS };
42
- return {
43
- listTools: (params) => client.listTools(params),
44
- callTool: (params) => client.callTool(params, undefined, timeout),
45
- listPrompts: (params) => client.listPrompts(params),
46
- getPrompt: (params) => client.getPrompt(params),
47
- listResources: (params) => client.listResources(params),
48
- readResource: (params) => client.readResource(params),
49
- };
50
- },
30
+ connect: connectHostedMcp,
51
31
  };
52
32
  async function listAll(page, key) {
53
33
  const out = [];
@@ -70,7 +50,9 @@ function errorText(error) {
70
50
  * reports each mounted tool's own JSON Schema rather than the passthrough one.
71
51
  * Returns mount(), which callers run after connect without awaiting it.
72
52
  */
73
- export function prepareHostedMount(server, deps = defaultHostedMountDependencies) {
53
+ export function prepareHostedMount(server, deps = defaultHostedMountDependencies, options = {}) {
54
+ const firstListWaitMs = options.firstListWaitMs ?? FIRST_LIST_WAIT_MS;
55
+ let listed = false;
74
56
  const state = { status: "idle", tools: [], prompts: [], resources: [], collisions: [] };
75
57
  const schemas = new Map();
76
58
  const registries = server;
@@ -82,6 +64,10 @@ export function prepareHostedMount(server, deps = defaultHostedMountDependencies
82
64
  const listTools = handlers.get("tools/list");
83
65
  if (listTools) {
84
66
  server.server.setRequestHandler(ListToolsRequestSchema, async (request, extra) => {
67
+ if (!listed) {
68
+ listed = true;
69
+ await waitForMount(firstListWaitMs);
70
+ }
85
71
  const result = await listTools(request, extra);
86
72
  return {
87
73
  ...result,
@@ -94,6 +80,14 @@ export function prepareHostedMount(server, deps = defaultHostedMountDependencies
94
80
  }
95
81
  let statusTool = null;
96
82
  let running = null;
83
+ /** Wait for a mount in progress, at most ms; returns at once when none runs. */
84
+ async function waitForMount(ms) {
85
+ if (!running || ms <= 0)
86
+ return;
87
+ let timer;
88
+ await Promise.race([running, new Promise((done) => (timer = setTimeout(done, ms)))]);
89
+ clearTimeout(timer);
90
+ }
97
91
  const showStatusTool = () => {
98
92
  if (statusTool || STORE_TOOLS_STATUS in registries._registeredTools)
99
93
  return;
@@ -6,8 +6,8 @@ export declare const getCachedBootDriftNotice: typeof getCachedNotice;
6
6
  /**
7
7
  * Server `instructions` in the MCP initialize response (SDK ServerOptions,
8
8
  * @modelcontextprotocol/sdk >= 1.x). Hosts hand this to the model once per
9
- * session, before any tool call — the place for the five habits the E2E run
10
- * (docs/design/archive/E2E-2026-09-03.md, F-17) showed an agent needs on the first
9
+ * session, before any tool call — the place for the five habits an end-to-end run
10
+ * showed an agent needs on the first
11
11
  * turn and would otherwise learn the hard way. Kept under 600 characters so
12
12
  * it costs a few hundred tokens once; the full operating guide stays in the
13
13
  * summer_agent_playbook prompt / summer_get_agent_playbook tool. The last
@@ -34,8 +34,8 @@ export const getCachedBootDriftNotice = getCachedNotice;
34
34
  /**
35
35
  * Server `instructions` in the MCP initialize response (SDK ServerOptions,
36
36
  * @modelcontextprotocol/sdk >= 1.x). Hosts hand this to the model once per
37
- * session, before any tool call — the place for the five habits the E2E run
38
- * (docs/design/archive/E2E-2026-09-03.md, F-17) showed an agent needs on the first
37
+ * session, before any tool call — the place for the five habits an end-to-end run
38
+ * showed an agent needs on the first
39
39
  * turn and would otherwise learn the hard way. Kept under 600 characters so
40
40
  * it costs a few hundred tokens once; the full operating guide stays in the
41
41
  * summer_agent_playbook prompt / summer_get_agent_playbook tool. The last
@@ -356,8 +356,9 @@ export async function startMcpServer(options = {}) {
356
356
  appendMcpLogEvent("mcp:boot_drift_probe_failed", errorDetails(error));
357
357
  });
358
358
  // Hosted Summer Engine MCP tools (store, publishing, board, Grow): ready
359
- // before connect, mounted after it without blocking the engine tools.
360
- const hosted = prepareHostedMount(server);
359
+ // before connect, mounted after it. The first tools/list waits a few
360
+ // seconds for the mount (not under summer doctor, which times the list).
361
+ const hosted = prepareHostedMount(server, undefined, process.env.SUMMER_MCP_DOCTOR === "1" ? { firstListWaitMs: 0 } : {});
361
362
  const transport = new StdioServerTransport();
362
363
  await server.connect(transport);
363
364
  void hosted.mount();
@@ -1,5 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { CreatorOperationError, listCreatorReleases, publishCreator, } from "../../core/capabilities/creator.js";
3
+ import { captureGameplay } from "../../core/capabilities/capture-gameplay.js";
3
4
  import { exportGame } from "../../core/capabilities/export-game.js";
4
5
  import { STORE_TARGETS } from "../../core/capabilities/export-presets.js";
5
6
  import { exportTemplates, TEMPLATE_PLATFORMS } from "../../core/capabilities/export-templates.js";
@@ -39,7 +40,7 @@ async function creatorResult(operation) {
39
40
  }
40
41
  }
41
42
  export function registerCreatorTools(server) {
42
- server.tool("summer_export_game", "Export the game in the exact file the Summer Games store takes, with the installed Summer Engine headless (no window). format \"bundle\" (default): the summer.games .zip the Summer apps run on iPhone, Android, macOS and Windows; targets picks the platforms (a game without a server: ios and android only); upload it with summer_publish_build. format \"download\" with one target: web (an HTML5 .zip on Summer's WebGPU Forward+ web template, played on summer.games), macos (.app zip, macos-universal) or windows (.exe zip, windows-x64); these need the export template from summer_export_templates and are uploaded as store versions. Works without the editor running. Returns path, sha256, size, the manifest or store platform, and warnings.", {
43
+ server.tool("summer_export_game", "Export the game in the exact file the Summer Games store takes, with the installed Summer Engine headless (no window). format \"bundle\" (default): the summer.games .zip the Summer apps run on iPhone, Android, macOS and Windows; targets picks the platforms (a game without a server: ios and android only); upload it with summer_publish_build. format \"download\" with one target: web (an HTML5 .zip on Summer's WebGPU Forward+ web template, played on summer.games), macos (.app zip, macos-universal) or windows (.exe zip, windows-x64); these need the export template from summer_export_templates and are uploaded as store versions. Needs Summer Engine 0.7.0 or newer: an older engine is refused before anything is written (code engine_too_old). Works without the editor running. Returns path, sha256, size, the manifest or store platform, and warnings.", {
43
44
  project: z.string().optional().describe("Project folder with project.godot. Defaults to the MCP's bound project, then the working directory."),
44
45
  out: z.string().optional().describe("Output .zip path. Defaults to <project>/.summer/exports/."),
45
46
  targets: z
@@ -65,8 +66,17 @@ export function registerCreatorTools(server) {
65
66
  .optional()
66
67
  .describe("The installed Summer Engine version (Help > About, e.g. 0.7.1). Read automatically on macOS; needed on Windows and Linux."),
67
68
  }, async ({ action, platforms, includeDebug, summerVersion }) => creatorResult(() => exportTemplates({ action, platforms, includeDebug, summerVersion })));
68
- server.tool("summer_publish_build", "Upload an export from summer_export_game to the creator's game on summer.games, through the same store upload Studio uses, straight from disk. A store bundle (format bundle): declare, upload parts, seal, wait until Summer makes the Build, name its client pack, and with publish=true approve it. A web build or native download (format download): upload it as the game's store version for its platform (web, macos-universal, windows-x64, linux-x64; read from the last export) and wait until Summer has checked it. First call with confirm=false and show the user the returned target; set confirm only after they approve. Needs \"summer login --store\". A retry with the same file and clientVersion continues the same upload. Nothing here makes a game live: the owner approves publishing (summer_store_submit).", {
69
- gameId: z.string().optional().describe("The store game id (Studio store page URL). Omit to get the list of your games."),
69
+ server.tool("summer_capture_gameplay", "Capture real gameplay frames without a running editor: starts the game in Summer Engine's offscreen verify instance (a real renderer, a window parked offscreen with no focus, never on screen), lets it run waitSeconds, and saves PNG frames of what the game draws, HUD included. Use for store screenshots (1920x1080 landscape or 1080x1920 portrait). With an editor open, summer_screenshot target game also works. Returns each frame's path, width and height; look at them before using them.", {
70
+ project: z.string().optional().describe("Project folder with project.godot. Defaults to the MCP's bound project, then the working directory."),
71
+ scene: z.string().optional().describe("Scene to start (res://... or uid://...). Default: the project's main scene, which is often a title menu; pass the gameplay scene for gameplay frames."),
72
+ resolution: z.string().optional().describe("Window size WIDTHxHEIGHT (default 1920x1080; 1080x1920 for portrait)."),
73
+ frames: z.number().int().min(1).max(10).optional().describe("Frames to save (default 1)."),
74
+ waitSeconds: z.number().min(0).max(120).optional().describe("Seconds the game runs before the first frame (default 3)."),
75
+ intervalSeconds: z.number().min(0.1).max(60).optional().describe("Seconds between frames (default 1)."),
76
+ out: z.string().optional().describe("Output folder. Defaults to <project>/.summer/captures/<time>/ (ignored by git)."),
77
+ }, async (args) => creatorResult(() => captureGameplay(args)));
78
+ server.tool("summer_publish_build", "Upload an export from summer_export_game to the creator's game on summer.games, through the same store upload Studio uses, straight from disk. A store bundle (format bundle): declare, upload parts, seal, wait until Summer makes the Build, name its client pack, and with publish=true approve it. A web build or native download (format download): upload it as the game's store version for its platform (web, macos-universal, windows-x64, linux-x64; read from the last export) and wait until Summer has checked it. First call with confirm=false: it checks that the game exists for this account and warns when its store page does not list the export's platforms, then returns the target (game name and id, file, digest, size, version) to show the user; set confirm only after they approve. Needs \"summer login --store\". A retry with the same file and clientVersion continues the same upload. Nothing here makes a game live: the owner approves publishing (summer_store_submit).", {
79
+ gameId: z.string().optional().describe("The store game id (from summer_store_list_games, or the Studio store page URL). Without it the call fails with game_required and lists your store games, or says why the store did not list them."),
70
80
  file: z.string().optional().describe("Exported .zip. Defaults to the last summer_export_game result."),
71
81
  clientVersion: z.string().describe("Build version, vMAJOR.MINOR.PATCH (e.g. v1.0.0); a new upload needs a new version."),
72
82
  publish: z.boolean().default(false).describe("Bundles only: also approve the Build for players. A game that has not passed review keeps it as a preview; an agent needs the owner's approval."),
@@ -90,7 +100,7 @@ export function registerCreatorTools(server) {
90
100
  ...args,
91
101
  face: "mcp",
92
102
  })));
93
- server.tool("summer_creator_releases", "List real creator-owned releases from the versioned Summer Platform creator API. The server independently verifies the exact publish scope and project ownership.", {
103
+ server.tool("summer_creator_releases", "Deprecated: lists releases on the legacy Summercraft creator API (separate sc_ token), not summer.games. For what players get on summer.games, and which upload can be released, use summer_store_releases.", {
94
104
  projectId: z.string().optional().describe("Creator project ID. Defaults to ~/.summer/config.json."),
95
105
  limit: z.number().int().min(1).max(100).default(20),
96
106
  cursor: z.string().optional().describe("Opaque nextCursor from the previous page."),
@@ -178,7 +178,7 @@ Use this when summer_get_diagnostics shows a non-zero \`debugger.warnings\` coun
178
178
  }, async ({ max_warnings, include_stack, raw }) => withEngine(async (client) => {
179
179
  // Reuses the existing GetDebuggerErrors op with type: "warning" filter.
180
180
  // Engine-side change: ScriptEditorDebugger::get_errors_data() supports
181
- // include_warnings; debug_ops::get_debugger_errors honours `type` to
181
+ // include_warnings; the engine's GetDebuggerErrors honours `type` to
182
182
  // return warnings only. Diagnostics also exposes `warnings_data`.
183
183
  const op = {
184
184
  op: "GetDebuggerErrors",
@@ -297,19 +297,29 @@ Style presets: "realistic" (default), "cartoon", "anime", "none"
297
297
  For an alpha PNG, set removeBackground: true. Prompt wording alone does not
298
298
  guarantee transparency; background removal runs server-side after generation.
299
299
 
300
- The 'options' object is passed directly to the AI provider for full control.
300
+ Size: aspectRatio (1:1, 16:9, 9:16, 4:3, 3:4, ...) or width + height (the
301
+ smallest size you need). For store art ask width 1920 height 1080 (key art)
302
+ or width 1080 height 1920 (tall cover): the server picks a model that reaches
303
+ that size, or refuses a named model that cannot, before anything is spent.
304
+ Each result reports the real width and height and the model that ran.
305
+
306
+ 'options' carries extra model params (seed, negative_prompt, ...); the result
307
+ lists any the server did not use in ignoredOptions.
301
308
 
302
309
  Returns the asset with fileUrl (hosted) and localPath (temp file on disk).
303
310
  Use the Read tool on localPath to show the image to the user for approval.
304
311
 
305
312
  Cloud tool — runs on Summer's servers and works WITHOUT the Summer Engine app open.
306
- Requires authentication: run 'npx -y summer-engine@latest login' first.`, imageGenerationArgsSchema.shape, async ({ prompt, model, style, referenceImageUrl, removeBackground, options }) => {
313
+ Requires authentication: run 'npx -y summer-engine@latest login' first.`, imageGenerationArgsSchema.shape, async ({ prompt, model, style, referenceImageUrl, removeBackground, aspectRatio, width, height, options }) => {
307
314
  const result = await mcpGenerate("/api/mcp/generate/image", {
308
315
  prompt,
309
316
  model,
310
317
  style,
311
318
  referenceImageUrl,
312
319
  removeBackground,
320
+ aspectRatio,
321
+ width,
322
+ height,
313
323
  options,
314
324
  });
315
325
  if (result.error) {
@@ -457,7 +467,7 @@ Optional rig pass (image-to-3d only):
457
467
  Set options.rig = true to add an auto-rig pass via Meshy v6. The result
458
468
  job (poll via summer_check_job) will include rigAssetId — the asset ID
459
469
  of the rigged glb. Use that rigAssetId with summer_generate_motion to
460
- add animation clips. Adds ~$0.30 and ~60s to the job.
470
+ add animation clips. Adds ~60s to the job.
461
471
 
462
472
  Example:
463
473
  summer_generate_3d({
@@ -583,11 +593,11 @@ Requires authentication: run 'npx -y summer-engine@latest login' first.`, {
583
593
  server.tool("summer_generate_video", `Generate a video using AI models via Summer Engine Studio.
584
594
 
585
595
  Known models (text-to-video):
586
- - "ltx" (default) — LTX Video, fast (~$0.10)
587
- - "kling" — Kling 2 Master, high quality (~$0.50)
588
- - "kling-turbo" — Kling 2.5 Turbo Pro (~$0.30)
589
- - "minimax" — MiniMax (~$0.25)
590
- - "veo3" — Google Veo 3, premium (~$1.00)
596
+ - "ltx" (default) — LTX Video, fast
597
+ - "kling" — Kling 2 Master, high quality
598
+ - "kling-turbo" — Kling 2.5 Turbo Pro
599
+ - "minimax" — MiniMax
600
+ - "veo3" — Google Veo 3, premium
591
601
 
592
602
  Known models (image-to-video, when imageUrl provided):
593
603
  - "ltx" (default), "kling", "minimax"
@@ -688,7 +698,7 @@ Requires authentication: run 'npx -y summer-engine@latest login' first.`, {
688
698
  Backends (pick one):
689
699
  - "meshy-library" (default) — a curated mocap clip by motionName on a
690
700
  Summer-rigged humanoid (rigAssetId from summer_generate_3d with
691
- options.rig=true). Fast (~30s), cheap (~$0.10), real mocap quality.
701
+ options.rig=true). Fast (~30s), real mocap quality.
692
702
  Names that always work: idle, walk, run, jump, attack; anything else must
693
703
  be an exact library name.
694
704
  - "text-to-motion" — custom 2-second clips (60 frames) from text prompts on
@@ -2,6 +2,6 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  /**
3
3
  * summer_open — the MCP face of `summer open`. Same behavior as the CLI
4
4
  * (src/core/capabilities/navigation/open.ts runOpen); this file only supplies
5
- * the engine client and the browser launcher. Design: docs/design/NAVIGATION-DESIGN.md §3.
5
+ * the engine client and the browser launcher.
6
6
  */
7
7
  export declare function registerNavigationTools(server: McpServer): void;
@@ -6,7 +6,7 @@ import { openArgsShape, runOpen } from "../../core/capabilities/navigation/open.
6
6
  /**
7
7
  * summer_open — the MCP face of `summer open`. Same behavior as the CLI
8
8
  * (src/core/capabilities/navigation/open.ts runOpen); this file only supplies
9
- * the engine client and the browser launcher. Design: docs/design/NAVIGATION-DESIGN.md §3.
9
+ * the engine client and the browser launcher.
10
10
  */
11
11
  export function registerNavigationTools(server) {
12
12
  server.tool("summer_open", `Open the exact summerengine.com page or Summer Engine editor surface the user wants to LOOK at, by intent name — or, with open:false, return the URL / engine op without opening anything. The result ALWAYS carries the resolved url or op, also after opening, so you can tell the user where they landed.
@@ -16,7 +16,7 @@ const NODE_PATH_LIMIT_BYTES = 256;
16
16
  const MIN_PLACEMENT_FLOOR_DISTANCE = 0.001;
17
17
  /** Mirrors the engine's SnapToSurface direction guard (length² > 1e-5). */
18
18
  const MIN_SNAP_DIRECTION_LENGTH_SQUARED = 0.00001;
19
- /** Starcast's own ceilings (engine spatial_ops.cpp starcast_3d): the engine
19
+ /** Starcast's own ceilings in the engine: the engine
20
20
  * measures the compact receipt as UTF-8 JSON, downgrades full -> summary
21
21
  * above 12 KiB, and strips secondary paths above 5 KiB, so a receipt past the
22
22
  * ceiling for its returnedDetail is one this CLI does not understand. Unlike
@@ -353,8 +353,8 @@ Static frame only — one moment, not motion. For a SEQUENCE of frames over time
353
353
  if (snap.sceneHadLight === false) {
354
354
  warnings.push("WARNING: this scene has no light — lit materials may appear black when played.");
355
355
  }
356
- // The engine ALWAYS synthesizes the preview camera (preview_ops.cpp
357
- // sets used_synthetic_camera unconditionally) — the flag says nothing
356
+ // The engine ALWAYS synthesizes the preview camera (it sets
357
+ // used_synthetic_camera unconditionally) — the flag says nothing
358
358
  // about the scene's own cameras. sceneHasCamera above is the
359
359
  // authoritative "does this scene have a camera" answer.
360
360
  if (snap.usedSyntheticCamera) {
@@ -41,8 +41,7 @@ export interface WithEngineOptions<T> {
41
41
  }
42
42
  /**
43
43
  * An auth failure is the ONE class of thrown error that is provably pre-apply:
44
- * the engine rejects on the Bearer-token check (tool_net_thread.cpp::_validate_auth)
45
- * BEFORE the op is queued or applied, so reconnecting with the fresh api-token and
44
+ * the engine rejects on the Bearer-token check BEFORE the op is queued or applied, so reconnecting with the fresh api-token and
46
45
  * retrying cannot double-apply a mutation. This is exactly the stale-token case
47
46
  * after the engine rotates its api-token on relaunch.
48
47
  *
@@ -30,8 +30,7 @@ function readClassifiers(result) {
30
30
  }
31
31
  /**
32
32
  * An auth failure is the ONE class of thrown error that is provably pre-apply:
33
- * the engine rejects on the Bearer-token check (tool_net_thread.cpp::_validate_auth)
34
- * BEFORE the op is queued or applied, so reconnecting with the fresh api-token and
33
+ * the engine rejects on the Bearer-token check BEFORE the op is queued or applied, so reconnecting with the fresh api-token and
35
34
  * retrying cannot double-apply a mutation. This is exactly the stale-token case
36
35
  * after the engine rotates its api-token on relaunch.
37
36
  *
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "_generated": "GENERATED from integrations/gemini — do not edit; npm run generate:registry",
3
3
  "name": "summer",
4
- "version": "3.3.0",
4
+ "version": "3.4.1",
5
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.",
6
6
  "contextFileName": "GEMINI.md",
7
7
  "mcpServers": {
@@ -35,6 +35,7 @@
35
35
  "./library/skills/asset-strategy/",
36
36
  "./library/skills/audio-direction/",
37
37
  "./library/skills/auto-fire-targeting/",
38
+ "./library/skills/bounded-engine-runs/",
38
39
  "./library/skills/brainstorm-game/",
39
40
  "./library/skills/brainstorming/",
40
41
  "./library/skills/browse-templates/",
@@ -46,6 +47,7 @@
46
47
  "./library/skills/character-portrait/",
47
48
  "./library/skills/cinematic-cutscene/",
48
49
  "./library/skills/combat-basics/",
50
+ "./library/skills/compatibility-renderer-traps/",
49
51
  "./library/skills/concept-art/",
50
52
  "./library/skills/create-asset-sheet/",
51
53
  "./library/skills/debug/",
@@ -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, surface a one-line
7
- # Bob-style greeting as additional context.
6
+ # Detect Summer project + GameSoul + doctor health and surface a short
7
+ # 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
@@ -1,94 +1,88 @@
1
- # integrations/ — the complete, honest map of agent support
1
+ # integrations/: which agents Summer supports
2
2
 
3
- One folder per supported client. This directory is the single place that
4
- says which agents Summer supports and how each one consumes the library.
5
- Adding a new agent = one row in `src/installer/agent-table.ts` + one folder
6
- here + an empty entry in `scripts/generate-registry/targets.ts` (plus, if it
7
- has a manifest file, a builder in `scripts/generate-registry/manifests.ts`) +
8
- `npm run generate:registry` — never hand-editing root files. Tests fail when
9
- the table, this directory, and targets.ts disagree.
3
+ One folder per supported client. Each folder says how that client consumes
4
+ the library.
5
+
6
+ Adding an agent: one row in `src/installer/agent-table.ts`, one folder here,
7
+ an empty entry in `scripts/generate-registry/targets.ts` (plus a builder in
8
+ `scripts/generate-registry/manifests.ts` if the client has a manifest file),
9
+ then `npm run generate:registry`. Never hand-edit root files. Tests fail when
10
+ the table, this directory and `targets.ts` disagree.
10
11
 
11
12
  Each folder contains:
12
13
 
13
- - `README.md` — what gets generated where, or (for clients with no manifest
14
- file in this repo) exactly what `summer setup <client>` writes at install
15
- time: MCP config path and skills destination.
14
+ - `README.md`: what gets generated where, or (for clients with no manifest
15
+ file in this repo) what `summer setup <client>` writes at install time.
16
+ - `manifest-target.json`: generated file -> repo-root destination (empty when
17
+ nothing is generated). Mirrors `scripts/generate-registry/targets.ts`; a test
18
+ fails if they drift.
16
19
 
17
- `summer setup <client>` (default `--scope user`) writes the MCP config AND
18
- installs every skill (`skills install --all`, preview included; `--stable-only`
19
- skips preview) in the SAME scope,
20
- so a user-scope MCP config never ends up beside project-scope skills.
21
- `--scope project` moves both; `--recommended` installs only the recommended
22
- subset. Clients whose MCP config is user-only (see the table) fall back to user
23
- scope with a warning. `.mcp.json` at the repo root
24
- (the MCP pointer the claude / codex / cursor / factory manifests share) is
25
- generated too — `registry/generated/mcp.json -> .mcp.json`.
26
- - `manifest-target.json` — mapping of generated file -> repo-root destination
27
- (empty when nothing is generated). Mirrors
28
- `scripts/generate-registry/targets.ts`; a test fails if they drift.
20
+ `summer setup <client>` (default `--scope user`) writes the MCP config and
21
+ installs every skill (`skills install --all`, preview included;
22
+ `--stable-only` skips preview) in the same scope, so a user-scope MCP config
23
+ never sits beside project-scope skills. `--scope project` moves both;
24
+ `--recommended` installs only the recommended subset. Clients whose MCP config
25
+ is user-only fall back to user scope with a warning.
29
26
 
30
- Generated root dot-files (`.claude-plugin/plugin.json`, `gemini-extension.json`,
31
- …) are build artifacts of `integrations/<agent>` + `library/` — their
32
- `_generated` banner says so ("GENERATED from integrations/<agent> — do not
33
- edit; npm run generate:registry"). CI `--check` fails on any drift between
34
- `library/`, `registry/generated/`, and the applied root files.
27
+ Generated root files (`.claude-plugin/plugin.json`, `gemini-extension.json`,
28
+ `.mcp.json`, …) are build artifacts of `integrations/<agent>` + `library/`.
29
+ Their `_generated` banner says so. CI `--check` fails on any drift between
30
+ `library/`, `registry/generated/` and the applied root files.
35
31
 
36
32
  How the plugin manifests reference skills, and what is verified:
37
33
 
38
- - **Claude Code** — the plugin-manifest `skills` field accepts a string or an
39
- array of `./`-relative directory paths and *extends* the default `skills/`
40
- scan (Claude Code plugins reference, "Plugin manifest schema"). The
41
- generated `.claude-plugin/plugin.json` lists one entry per skill
42
- (`./library/skills/<slug>/`). The docs do not say whether a listed
43
- directory is loaded as one skill or scanned for skill subfolders, and this
44
- repo has not yet loaded the generated manifest through the real plugin
45
- path (the smoke tests exercise the `summer setup` install path, not the
46
- marketplace one) — treat the marketplace install as unverified until that
47
- run exists.
48
- - **Codex** — `.codex-plugin/plugin.json` carries the same per-skill `skills`
49
- array. Whether Codex reads that field, and with which type, is
50
- **unverified**; the v2 manifest carried it and nobody has confirmed a load.
51
- - **Factory** — reads skills only from a root `skills/` directory; the
52
- manifest's `skills` array is not read (open gap, see the table).
34
+ - **Claude Code**: the plugin-manifest `skills` field accepts a string or an
35
+ array of `./`-relative directory paths and extends the default `skills/`
36
+ scan. The generated `.claude-plugin/plugin.json` lists one entry per skill
37
+ (`./library/skills/<slug>/`). The docs do not say whether a listed directory
38
+ loads as one skill or is scanned for skill subfolders, and the smoke tests
39
+ cover the `summer setup` path, not the marketplace one. Treat the
40
+ marketplace install as unverified.
41
+ - **Codex**: `.codex-plugin/plugin.json` carries the same `skills` array.
42
+ Whether Codex reads that field is **unverified**.
43
+ - **Factory**: a plugin install reads skills only from a root `skills/`
44
+ directory, so it exposes no skills. `summer setup factory` installs them.
45
+
46
+ Paths below are for macOS; `~` is `%USERPROFILE%` on Windows. Other OS paths
47
+ are listed where they differ.
53
48
 
54
49
  | Client | Manifest generated in this repo | `summer setup` writes |
55
50
  |---|---|---|
56
- | claude | `.claude-plugin/plugin.json`, `.claude-plugin/marketplace.json`, `.mcp.json` | MCP: `~/.claude.json`; Windows `%USERPROFILE%/.claude.json` / `.mcp.json`; skills: `~/.claude/skills` / `.claude/skills` (`<skill>/SKILL.md`) |
51
+ | claude | `.claude-plugin/plugin.json`, `.claude-plugin/marketplace.json`, `.mcp.json` | MCP: `~/.claude.json`; project `.mcp.json`; skills: `~/.claude/skills`; project `.claude/skills` (`<skill>/SKILL.md`) |
57
52
  | 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) |
58
- | codex | `.codex-plugin/plugin.json` | MCP: `~/.codex/config.toml`; Windows `%USERPROFILE%/.codex/config.toml` / `.codex/config.toml`; skills: `~/.agents/skills` / `.agents/skills` (`<skill>/SKILL.md`) |
59
- | cursor | `.cursor-plugin/plugin.json` | MCP: `~/.cursor/mcp.json`; Windows `%USERPROFILE%/.cursor/mcp.json` / `.cursor/mcp.json`; skills: `~/.cursor/skills` / `.cursor/skills` (`<skill>/SKILL.md`) |
60
- | windsurf | — | MCP: `~/.codeium/windsurf/mcp_config.json`; Windows `%USERPROFILE%/.codeium/windsurf/mcp_config.json`; skills: `~/.codeium/windsurf/skills` / `.windsurf/skills` (`<skill>/SKILL.md`) |
61
- | antigravity | — | MCP: `~/.gemini/config/mcp_config.json`; Windows `%USERPROFILE%/.gemini/config/mcp_config.json` / `.agents/mcp_config.json`; skills: `~/.gemini/config/skills` / `.agents/skills` (`<skill>/SKILL.md`) |
62
- | gemini (legacy) | `gemini-extension.json` | MCP: `~/.gemini/extensions/summer-engine/gemini-extension.json`; Windows `%USERPROFILE%/.gemini/extensions/summer-engine/gemini-extension.json`; skills: `~/.gemini/extensions/summer-engine/skills` (`<skill>/SKILL.md`) |
63
- | 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` / `.cline/skills` (`<skill>/SKILL.md`) |
64
- | cline-cli | — | MCP: `~/.cline/data/settings/cline_mcp_settings.json`; Windows `%USERPROFILE%/.cline/data/settings/cline_mcp_settings.json`; skills: `~/.cline/skills` / `.cline/skills` (`<skill>/SKILL.md`) |
65
- | roo-code (legacy) | — | MCP: `~/Library/Application Support/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/cline_mcp_settings.json`; Linux `~/.config/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/cline_mcp_settings.json`; Windows `%APPDATA%/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/cline_mcp_settings.json`; skills: `~/Documents/Roo/Rules` / `.clinerules` (rule files `summer-<skill>.md`) |
66
- | kilo-code | — | MCP: `~/.config/kilo/kilo.json`; Windows `%APPDATA%/kilo/kilo.json` / `kilo.json`; skills: `~/.kilo/skills` / `.kilo/skills` (`<skill>/SKILL.md`) |
67
- | github-copilot | — | MCP: `~/.copilot/mcp-config.json`; Windows `%USERPROFILE%/.copilot/mcp-config.json` / `.mcp.json`; skills: `~/.copilot/skills` / `.github/skills` (`<skill>/SKILL.md`) |
68
- | vscode-copilot | — | MCP: `~/Library/Application Support/Code/User/mcp.json`; Linux `~/.config/Code/User/mcp.json`; Windows `%APPDATA%/Code/User/mcp.json` / `.vscode/mcp.json`; skills: `~/.copilot/skills` / `.github/skills` (`<skill>/SKILL.md`) |
69
- | visual-studio | — | MCP: `~/.mcp.json`; Windows `%USERPROFILE%/.mcp.json` / `.mcp.json`; no skills folder (MCP only) |
53
+ | codex | `.codex-plugin/plugin.json` | MCP: `~/.codex/config.toml`; project `.codex/config.toml`; skills: `~/.agents/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
54
+ | cursor | `.cursor-plugin/plugin.json` | MCP: `~/.cursor/mcp.json`; project `.cursor/mcp.json`; skills: `~/.agents/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
55
+ | windsurf | — | MCP: `~/.codeium/windsurf/mcp_config.json`; skills: `~/.agents/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
56
+ | antigravity | — | MCP: `~/.gemini/config/mcp_config.json`; project `.agents/mcp_config.json`; skills: `~/.gemini/config/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
57
+ | gemini (legacy) | `gemini-extension.json` | MCP: `~/.gemini/extensions/summer-engine/gemini-extension.json`; skills: `~/.gemini/extensions/summer-engine/skills` (`<skill>/SKILL.md`) |
58
+ | 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`) |
59
+ | cline-cli | — | MCP: `~/.cline/data/settings/cline_mcp_settings.json`; skills: `~/.cline/skills`; project `.cline/skills` (`<skill>/SKILL.md`) |
60
+ | roo-code (legacy) | — | MCP: `~/Library/Application Support/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/cline_mcp_settings.json`; Linux `~/.config/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/cline_mcp_settings.json`; Windows `%APPDATA%/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/cline_mcp_settings.json`; skills: `~/Documents/Roo/Rules`; project `.clinerules` (rule files `summer-<skill>.md`) |
61
+ | kilo-code | — | MCP: `~/.config/kilo/kilo.json`; Windows `%APPDATA%/kilo/kilo.json`; project `kilo.json`; skills: `~/.kilo/skills`; project `.kilo/skills` (`<skill>/SKILL.md`) |
62
+ | github-copilot | — | MCP: `~/.copilot/mcp-config.json`; project `.mcp.json`; skills: `~/.copilot/skills`; project `.github/skills` (`<skill>/SKILL.md`) |
63
+ | vscode-copilot | — | MCP: `~/Library/Application Support/Code/User/mcp.json`; Linux `~/.config/Code/User/mcp.json`; Windows `%APPDATA%/Code/User/mcp.json`; project `.vscode/mcp.json`; skills: `~/.agents/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
64
+ | visual-studio | — | MCP: `~/.mcp.json`; project `.mcp.json`; no skills folder (MCP only) |
70
65
  | copilot-jetbrains | — | MCP: `~/.config/github-copilot/intellij/mcp.json`; Windows `%APPDATA%/github-copilot/intellij/mcp.json`; no skills folder (MCP only) |
71
- | opencode | — | MCP: `~/.config/opencode/opencode.json`; Windows `%APPDATA%/opencode/opencode.json` / `opencode.json`; skills: `~/.config/opencode/skills` / `.opencode/skills` (`<skill>/SKILL.md`) |
72
- | zed | — | MCP: `~/.config/zed/settings.json`; Windows `%APPDATA%/zed/settings.json`; skills: `~/.agents/skills` / `.agents/skills` (`<skill>/SKILL.md`) |
73
- | kiro | — | MCP: `~/.kiro/settings/mcp.json`; Windows `%USERPROFILE%/.kiro/settings/mcp.json` / `.kiro/settings/mcp.json`; skills: `~/.kiro/skills` / `.kiro/skills` (`<skill>/SKILL.md`) |
74
- | goose | — | MCP: `~/.config/goose/config.yaml`; Windows `%APPDATA%/Block/goose/config/config.yaml`; skills: `~/.config/agents/skills` / `.agents/skills` (`<skill>/SKILL.md`) |
75
- | hermes | — | MCP: `~/.hermes/config.yaml`; Windows `%USERPROFILE%/.hermes/config.yaml`; skills: `~/.hermes/skills` / `.hermes/skills` (`<skill>/SKILL.md`) |
76
- | trae | — | MCP: `.trae/mcp.json` / `.trae/mcp.json`; no skills folder (MCP only) |
77
- | qwen-code | — | MCP: `~/.qwen/settings.json`; Windows `%USERPROFILE%/.qwen/settings.json` / `.qwen/settings.json`; skills: `~/.qwen/skills` / `.qwen/skills` (`<skill>/SKILL.md`) |
78
- | kimi-code | — | MCP: `~/.kimi-code/mcp.json`; Windows `%USERPROFILE%/.kimi-code/mcp.json` / `.kimi-code/mcp.json`; skills: `~/.kimi-code/skills` / `.kimi-code/skills` (`<skill>/SKILL.md`) |
79
- | crush | — | MCP: `~/.config/crush/crushrc`; Windows `%USERPROFILE%/.config/crush/crushrc` / `.crushrc`; skills: `~/.config/crush/skills` / `.crush/skills` (`<skill>/SKILL.md`) |
80
- | amp | — | MCP: `~/.config/amp/settings.json`; Windows `%APPDATA%/amp/settings.json`; skills: `~/.config/amp/skills` / `.agents/skills` (`<skill>/SKILL.md`) |
81
- | factory | `.factory-plugin/plugin.json` | MCP: `~/.factory/mcp.json`; Windows `%USERPROFILE%/.factory/mcp.json` / `.factory/mcp.json`; skills: `~/.factory/skills` / `.factory/skills` (`<skill>/SKILL.md`) |
82
- | junie | — | MCP: `~/.junie/mcp/mcp.json`; Windows `%USERPROFILE%/.junie/mcp/mcp.json` / `.junie/mcp/mcp.json`; no skills folder (MCP only) |
83
- | warp | — | MCP: `~/.warp/.mcp.json`; Windows `%USERPROFILE%/.warp/.mcp.json` / `.warp/.mcp.json`; skills: `~/.warp/skills` / `.warp/skills` (`<skill>/SKILL.md`) |
84
- | rovo-dev | — | MCP: `~/.rovodev/mcp.json`; Windows `%USERPROFILE%/.rovodev/mcp.json`; skills: `~/.rovodev/skills` / `.rovodev/skills` (`<skill>/SKILL.md`) |
85
- | qoder | — | MCP: `~/.qoder/settings.json`; Windows `%USERPROFILE%/.qoder/settings.json` / `.mcp.json`; skills: `~/.qoder/skills` / `.qoder/skills` (`<skill>/SKILL.md`) |
86
- | grok-build | — | MCP: `~/.grok/config.toml`; Windows `%USERPROFILE%/.grok/config.toml` / `.grok/config.toml`; skills: `~/.grok/skills` / `.grok/skills` (`<skill>/SKILL.md`) |
87
- | mistral-vibe | — | MCP: `~/.vibe/config.toml`; Windows `%USERPROFILE%/.vibe/config.toml` / `.vibe/config.toml`; skills: `~/.vibe/skills` / `.vibe/skills` (`<skill>/SKILL.md`) |
88
- | lm-studio | — | MCP: `~/.lmstudio/mcp.json`; Windows `%USERPROFILE%/.lmstudio/mcp.json`; no skills folder (MCP only) |
66
+ | opencode | — | MCP: `~/.config/opencode/opencode.json`; Windows `%APPDATA%/opencode/opencode.json`; project `opencode.json`; skills: `~/.agents/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
67
+ | zed | — | MCP: `~/.config/zed/settings.json`; Windows `%APPDATA%/zed/settings.json`; skills: `~/.agents/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
68
+ | kiro | — | MCP: `~/.kiro/settings/mcp.json`; project `.kiro/settings/mcp.json`; skills: `~/.kiro/skills`; project `.kiro/skills` (`<skill>/SKILL.md`) |
69
+ | goose | — | MCP: `~/.config/goose/config.yaml`; Windows `%APPDATA%/Block/goose/config/config.yaml`; skills: `~/.config/agents/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
70
+ | hermes | — | MCP: `~/.hermes/config.yaml`; skills: `~/.hermes/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
71
+ | trae | — | MCP: `.trae/mcp.json` (project only); no skills folder (MCP only) |
72
+ | qwen-code | — | MCP: `~/.qwen/settings.json`; project `.qwen/settings.json`; skills: `~/.qwen/skills`; project `.qwen/skills` (`<skill>/SKILL.md`) |
73
+ | kimi-code | — | MCP: `~/.kimi-code/mcp.json`; project `.kimi-code/mcp.json`; skills: `~/.agents/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
74
+ | crush | — | MCP: `~/.config/crush/crushrc`; project `.crushrc`; skills: `~/.agents/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
75
+ | amp | — | MCP: `~/.config/amp/settings.json`; Windows `%APPDATA%/amp/settings.json`; skills: `~/.agents/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
76
+ | factory | `.factory-plugin/plugin.json` | MCP: `~/.factory/mcp.json`; project `.factory/mcp.json`; skills: `~/.agents/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
77
+ | junie | — | MCP: `~/.junie/mcp/mcp.json`; project `.junie/mcp/mcp.json`; no skills folder (MCP only) |
78
+ | warp | — | MCP: `~/.warp/.mcp.json`; project `.warp/.mcp.json`; skills: `~/.agents/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
79
+ | rovo-dev | — | MCP: `~/.rovodev/mcp.json`; skills: `~/.agents/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
80
+ | qoder | — | MCP: `~/.qoder/settings.json`; project `.mcp.json`; skills: `~/.qoder/skills`; project `.qoder/skills` (`<skill>/SKILL.md`) |
81
+ | grok-build | — | MCP: `~/.grok/config.toml`; project `.grok/config.toml`; skills: `~/.agents/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
82
+ | mistral-vibe | — | MCP: `~/.vibe/config.toml`; project `.vibe/config.toml`; skills: `~/.vibe/skills`; project `.agents/skills` (`<skill>/SKILL.md`) |
83
+ | lm-studio | — | MCP: `~/.lmstudio/mcp.json`; no skills folder (MCP only) |
89
84
 
90
- Source of truth for the setup paths: `src/installer/agent-config.ts` and
91
- `src/cli/commands/skills.ts`.
85
+ Source of truth for the setup paths: `src/installer/agent-table.ts`.
92
86
 
93
87
  Not supported on purpose (checked 2026-09-11): OpenHands CLI (its `[mcp] stdio_servers`
94
88
  inline-table array has a known upstream write bug), Xcode's agent folders (Apple
@@ -11,9 +11,6 @@ Generated by `scripts/generate-registry` from `library/**/resource.yaml`:
11
11
  The MCP pointer `./.mcp.json` these manifests reference is generated as
12
12
  well (`registry/generated/mcp.json -> .mcp.json`, owned by the claude target).
13
13
 
14
- The MCP pointer `./.mcp.json` these manifests reference is generated as
15
- well (`registry/generated/mcp.json -> .mcp.json`).
16
-
17
14
  Never edit the destination files by hand — edit `library/` resources or the
18
15
  manifest builders in `scripts/generate-registry/manifests.ts`, then run
19
16
  `npm run generate:registry`. CI `--check` fails on any drift.
@@ -4,8 +4,7 @@ Generated by `scripts/generate-registry` from `library/**/resource.yaml`:
4
4
 
5
5
  - `registry/generated/plugin.codex.json` -> `.codex-plugin/plugin.json`
6
6
  (plugin manifest with the Codex app-store `interface` block; full skill
7
- list at `./library/skills/<slug>/` — the pre-v3 four-skill gap was a bug and
8
- is fixed by generation; version stamped from `package.json`).
7
+ list at `./library/skills/<slug>/`; version stamped from `package.json`).
9
8
 
10
9
  The MCP pointer `./.mcp.json` these manifests reference is generated as
11
10
  well (`registry/generated/mcp.json -> .mcp.json`, owned by the claude target).
@@ -5,7 +5,7 @@ is intentionally empty. Support is delivered at install time by
5
5
  `summer setup copilot-jetbrains` (aliases: `jetbrains-copilot`, `intellij-copilot`, `copilot-intellij`), which writes:
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
- Shape: undefined.
8
+ Shape: `servers.summer-engine = { command, args }`.
9
9
  - Skills: none. Copilot in JetBrains documents no skills folder; the MCP server ships summer_get_agent_playbook 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
 
@@ -5,8 +5,7 @@ Generated by `scripts/generate-registry` from `library/**/resource.yaml`:
5
5
  - `registry/generated/plugin.cursor.json` -> `.cursor-plugin/plugin.json`
6
6
  (Cursor plugin manifest: displayName/publisher/category, cursor-specific
7
7
  hooks file `./hooks/hooks-cursor.json`, full skill list at
8
- `./library/skills/<slug>/` — the pre-v3 four-skill gap was a bug and is fixed
9
- by generation; version stamped from `package.json`).
8
+ `./library/skills/<slug>/`; version stamped from `package.json`).
10
9
 
11
10
  The MCP pointer `./.mcp.json` these manifests reference is generated as
12
11
  well (`registry/generated/mcp.json -> .mcp.json`, owned by the claude target).