summer-engine 3.8.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (485) hide show
  1. package/.claude-plugin/marketplace.json +2 -13
  2. package/.claude-plugin/plugin.json +23 -22
  3. package/.codex-plugin/plugin.json +4 -12
  4. package/.cursor-plugin/plugin.json +4 -12
  5. package/.factory-plugin/plugin.json +4 -12
  6. package/AGENTS.md +19 -12
  7. package/CHANGELOG.md +96 -0
  8. package/GEMINI.md +3 -3
  9. package/README.md +103 -33
  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/login.d.ts +27 -0
  15. package/dist/cli/commands/login.js +58 -12
  16. package/dist/cli/commands/ops.d.ts +47 -0
  17. package/dist/cli/commands/ops.js +301 -0
  18. package/dist/cli/commands/setup.d.ts +2 -0
  19. package/dist/cli/commands/setup.js +37 -12
  20. package/dist/cli/commands/skills.js +11 -7
  21. package/dist/cli/index.js +7 -0
  22. package/dist/core/agent-host.d.ts +65 -0
  23. package/dist/core/agent-host.js +193 -0
  24. package/dist/core/capabilities/agent-playbook.d.ts +3 -0
  25. package/dist/core/capabilities/agent-playbook.js +54 -2
  26. package/dist/core/capabilities/apps.d.ts +25 -2
  27. package/dist/core/capabilities/apps.js +25 -12
  28. package/dist/core/capabilities/doctor.d.ts +3 -0
  29. package/dist/core/capabilities/doctor.js +20 -15
  30. package/dist/core/capabilities/fabricate-mesh.d.ts +2 -2
  31. package/dist/core/capabilities/game-task-plan.d.ts +12 -6
  32. package/dist/core/capabilities/game-task-plan.js +80 -5
  33. package/dist/core/capabilities/motion-generation.js +2 -2
  34. package/dist/core/capabilities/navigation/open.d.ts +6 -2
  35. package/dist/core/capabilities/navigation/open.js +3 -0
  36. package/dist/core/capabilities/publish-build.js +2 -0
  37. package/dist/core/capabilities/runtime-control.d.ts +4 -4
  38. package/dist/core/capabilities/scene-script-target.d.ts +17 -0
  39. package/dist/core/capabilities/scene-script-target.js +70 -0
  40. package/dist/core/capabilities/sfx-choices.d.ts +4 -0
  41. package/dist/core/capabilities/sfx-choices.js +13 -6
  42. package/dist/core/capabilities/tool-dispatch.d.ts +12 -3
  43. package/dist/core/capabilities/tool-dispatch.js +81 -46
  44. package/dist/core/embeddings.d.ts +2 -0
  45. package/dist/core/embeddings.js +1 -1
  46. package/dist/core/error-codes.d.ts +62 -0
  47. package/dist/core/error-codes.js +97 -0
  48. package/dist/core/format.d.ts +2 -0
  49. package/dist/core/format.js +2 -1
  50. package/dist/core/hosted-mcp.d.ts +22 -0
  51. package/dist/core/hosted-mcp.js +56 -1
  52. package/dist/core/library-read.js +5 -0
  53. package/dist/core/library-search.js +2 -1
  54. package/dist/core/oauth.js +4 -0
  55. package/dist/core/ops/catalog.d.ts +41 -0
  56. package/dist/core/ops/catalog.js +145 -0
  57. package/dist/core/ops/cloud.d.ts +56 -0
  58. package/dist/core/ops/cloud.js +175 -0
  59. package/dist/core/ops/contract.d.ts +119 -0
  60. package/dist/core/ops/contract.js +142 -0
  61. package/dist/core/ops/engine-answer.d.ts +25 -0
  62. package/dist/core/ops/engine-answer.js +117 -0
  63. package/dist/core/ops/engine.d.ts +55 -0
  64. package/dist/core/ops/engine.js +649 -0
  65. package/dist/core/ops/save-files.d.ts +78 -0
  66. package/dist/core/ops/save-files.js +419 -0
  67. package/dist/core/ops/search.d.ts +9 -0
  68. package/dist/core/ops/search.js +55 -0
  69. package/dist/core/skills-registry.d.ts +16 -1
  70. package/dist/core/skills-registry.js +35 -2
  71. package/dist/core/telemetry.d.ts +32 -0
  72. package/dist/core/telemetry.js +38 -10
  73. package/dist/core/tool-profiles.d.ts +25 -0
  74. package/dist/core/tool-profiles.js +41 -0
  75. package/dist/installer/agent-config.d.ts +17 -4
  76. package/dist/installer/agent-config.js +22 -6
  77. package/dist/installer/agent-table.d.ts +3 -0
  78. package/dist/installer/agent-table.js +10 -7
  79. package/dist/installer/setup.d.ts +2 -0
  80. package/dist/installer/setup.js +9 -4
  81. package/dist/installer/version-check.d.ts +29 -9
  82. package/dist/installer/version-check.js +81 -28
  83. package/dist/mcp/command.js +7 -0
  84. package/dist/mcp/hosted-mount.d.ts +27 -2
  85. package/dist/mcp/hosted-mount.js +53 -23
  86. package/dist/mcp/legacy-toolset.d.ts +27 -0
  87. package/dist/mcp/legacy-toolset.js +43 -0
  88. package/dist/mcp/ops-surface.d.ts +59 -0
  89. package/dist/mcp/ops-surface.js +443 -0
  90. package/dist/mcp/server.d.ts +35 -11
  91. package/dist/mcp/server.js +234 -89
  92. package/dist/mcp/tool-results.d.ts +26 -0
  93. package/dist/mcp/tool-results.js +81 -0
  94. package/dist/mcp/tool-surface.d.ts +65 -0
  95. package/dist/mcp/tool-surface.js +317 -0
  96. package/dist/mcp/tools/app-tools.js +9 -2
  97. package/dist/mcp/tools/asset-tools.js +55 -53
  98. package/dist/mcp/tools/audit-tools.js +21 -21
  99. package/dist/mcp/tools/debug-tools.js +6 -6
  100. package/dist/mcp/tools/fabricate-tools.js +6 -6
  101. package/dist/mcp/tools/generate-tools.js +76 -70
  102. package/dist/mcp/tools/project-tools.d.ts +9 -4
  103. package/dist/mcp/tools/project-tools.js +16 -10
  104. package/dist/mcp/tools/scene-tools.js +12 -23
  105. package/dist/mcp/tools/script-tools.js +9 -5
  106. package/dist/mcp/tools/with-engine.d.ts +6 -0
  107. package/dist/mcp/tools/with-engine.js +19 -0
  108. package/gemini-extension.json +4 -12
  109. package/hooks/pre-commit-doctor.sh +5 -4
  110. package/hooks/session-start.sh +24 -28
  111. package/integrations/claude-desktop/README.md +1 -1
  112. package/integrations/copilot-jetbrains/README.md +1 -1
  113. package/integrations/junie/README.md +1 -1
  114. package/integrations/lm-studio/README.md +1 -1
  115. package/integrations/trae/README.md +1 -1
  116. package/integrations/visual-studio/README.md +1 -1
  117. package/library/references/mcp-tools-reference/mcp-tools-reference.md +79 -51
  118. package/library/references/mcp-tools-reference/resource.yaml +1 -1
  119. package/library/references/product-map/resource.yaml +2 -2
  120. package/library/skills/3d-lighting/SKILL.md +53 -28
  121. package/library/skills/3d-lighting/resource.yaml +1 -1
  122. package/library/skills/README.md +119 -117
  123. package/library/skills/adaptive-music/SKILL.md +19 -23
  124. package/library/skills/adaptive-music/resource.yaml +1 -1
  125. package/library/skills/agent-playtesting/SKILL.md +1 -1
  126. package/library/skills/agent-playtesting/resource.yaml +1 -1
  127. package/library/skills/ai-characters-in-games/SKILL.md +1 -1
  128. package/library/skills/ai-characters-in-games/resource.yaml +1 -1
  129. package/library/skills/ambient-bed/SKILL.md +22 -13
  130. package/library/skills/ambient-bed/resource.yaml +1 -1
  131. package/library/skills/animated-loop/SKILL.md +41 -32
  132. package/library/skills/animated-loop/resource.yaml +1 -1
  133. package/library/skills/animation-tree/SKILL.md +1 -1
  134. package/library/skills/animation-tree/resource.yaml +1 -1
  135. package/library/skills/art-direction/SKILL.md +3 -3
  136. package/library/skills/art-direction/resource.yaml +1 -1
  137. package/library/skills/asset-strategy/SKILL.md +21 -4
  138. package/library/skills/asset-strategy/resource.yaml +2 -1
  139. package/library/skills/audio-direction/SKILL.md +10 -10
  140. package/library/skills/audio-direction/resource.yaml +1 -1
  141. package/library/skills/auto-fire-targeting/SKILL.md +1 -1
  142. package/library/skills/auto-fire-targeting/resource.yaml +1 -1
  143. package/library/skills/bounded-engine-runs/SKILL.md +1 -1
  144. package/library/skills/bounded-engine-runs/resource.yaml +1 -1
  145. package/library/skills/brainstorm-game/SKILL.md +1 -1
  146. package/library/skills/brainstorm-game/resource.yaml +1 -1
  147. package/library/skills/brainstorming/SKILL.md +1 -1
  148. package/library/skills/brainstorming/resource.yaml +1 -1
  149. package/library/skills/browse-templates/SKILL.md +1 -1
  150. package/library/skills/browse-templates/resource.yaml +1 -1
  151. package/library/skills/camera-rigs/SKILL.md +2 -2
  152. package/library/skills/camera-rigs/resource.yaml +1 -1
  153. package/library/skills/celeste-momentum-platforming/resource.yaml +1 -0
  154. package/library/skills/character-animation-wiring/SKILL.md +4 -4
  155. package/library/skills/character-animation-wiring/resource.yaml +1 -1
  156. package/library/skills/character-model/SKILL.md +55 -47
  157. package/library/skills/character-model/resource.yaml +1 -1
  158. package/library/skills/character-movement/SKILL.md +3 -3
  159. package/library/skills/character-movement/resource.yaml +1 -1
  160. package/library/skills/character-portrait/SKILL.md +24 -19
  161. package/library/skills/character-portrait/resource.yaml +1 -1
  162. package/library/skills/cinematic-cutscene/SKILL.md +58 -46
  163. package/library/skills/cinematic-cutscene/resource.yaml +1 -1
  164. package/library/skills/combat-basics/SKILL.md +1 -1
  165. package/library/skills/combat-basics/resource.yaml +1 -1
  166. package/library/skills/compatibility-renderer-traps/SKILL.md +1 -1
  167. package/library/skills/compatibility-renderer-traps/resource.yaml +1 -1
  168. package/library/skills/concept-art/SKILL.md +16 -12
  169. package/library/skills/concept-art/resource.yaml +1 -1
  170. package/library/skills/concept-to-level/SKILL.md +239 -0
  171. package/library/skills/concept-to-level/references/technical-rules.md +150 -0
  172. package/library/skills/concept-to-level/resource.yaml +44 -0
  173. package/library/skills/create-asset-sheet/SKILL.md +19 -13
  174. package/library/skills/create-asset-sheet/resource.yaml +1 -1
  175. package/library/skills/debug/SKILL.md +2 -2
  176. package/library/skills/debug/resource.yaml +1 -1
  177. package/library/skills/debugging-game-feel/SKILL.md +1 -1
  178. package/library/skills/debugging-game-feel/resource.yaml +1 -1
  179. package/library/skills/design-level/SKILL.md +23 -35
  180. package/library/skills/design-level/resource.yaml +1 -1
  181. package/library/skills/design-mechanic/SKILL.md +1 -1
  182. package/library/skills/design-mechanic/resource.yaml +1 -1
  183. package/library/skills/design-npc/SKILL.md +22 -24
  184. package/library/skills/design-npc/resource.yaml +1 -1
  185. package/library/skills/diagnosing-perf-regressions/SKILL.md +1 -1
  186. package/library/skills/diagnosing-perf-regressions/resource.yaml +1 -1
  187. package/library/skills/driving-the-editor-ui/SKILL.md +1 -1
  188. package/library/skills/driving-the-editor-ui/resource.yaml +1 -1
  189. package/library/skills/environment-kit/SKILL.md +20 -16
  190. package/library/skills/environment-kit/resource.yaml +1 -1
  191. package/library/skills/export-and-ship/SKILL.md +6 -6
  192. package/library/skills/export-and-ship/resource.yaml +1 -1
  193. package/library/skills/fabricating-assets/SKILL.md +7 -7
  194. package/library/skills/fabricating-assets/resource.yaml +3 -3
  195. package/library/skills/facial-and-lipsync/SKILL.md +14 -15
  196. package/library/skills/facial-and-lipsync/resource.yaml +1 -1
  197. package/library/skills/fps-controller/SKILL.md +33 -41
  198. package/library/skills/fps-controller/resource.yaml +1 -1
  199. package/library/skills/game-feel/SKILL.md +8 -8
  200. package/library/skills/game-feel/resource.yaml +1 -1
  201. package/library/skills/gameskill/SKILL.md +4 -4
  202. package/library/skills/gameskill/resource.yaml +1 -1
  203. package/library/skills/gdscript-patterns/SKILL.md +1 -1
  204. package/library/skills/gdscript-patterns/resource.yaml +1 -1
  205. package/library/skills/generate-motion/SKILL.md +30 -21
  206. package/library/skills/generate-motion/resource.yaml +1 -1
  207. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +1 -1
  208. package/library/skills/godogen-visual-proof-game-generation/resource.yaml +1 -0
  209. package/library/skills/grow-analytics/SKILL.md +3 -3
  210. package/library/skills/grow-analytics/resource.yaml +1 -1
  211. package/library/skills/headless-scripting/SKILL.md +1 -1
  212. package/library/skills/headless-scripting/resource.yaml +1 -1
  213. package/library/skills/in-game-purchases/SKILL.md +1 -1
  214. package/library/skills/in-game-purchases/resource.yaml +1 -1
  215. package/library/skills/instantiate-asset-pack/SKILL.md +2 -2
  216. package/library/skills/instantiate-asset-pack/resource.yaml +1 -1
  217. package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +1 -0
  218. package/library/skills/make-game/SKILL.md +4 -4
  219. package/library/skills/make-game/references/2d-platformer.md +1 -1
  220. package/library/skills/make-game/references/3d-fps.md +1 -1
  221. package/library/skills/make-game/references/3d-horror.md +1 -1
  222. package/library/skills/make-game/references/3d-third-person.md +2 -2
  223. package/library/skills/make-game/resource.yaml +1 -1
  224. package/library/skills/multiplayer/SKILL.md +1 -1
  225. package/library/skills/multiplayer/resource.yaml +1 -1
  226. package/library/skills/multiplayer-movement/SKILL.md +1 -1
  227. package/library/skills/multiplayer-movement/resource.yaml +1 -1
  228. package/library/skills/multiplayer-project/SKILL.md +1 -1
  229. package/library/skills/multiplayer-project/resource.yaml +1 -1
  230. package/library/skills/multiplayer-publish/SKILL.md +8 -7
  231. package/library/skills/multiplayer-publish/resource.yaml +3 -3
  232. package/library/skills/multiplayer-state/SKILL.md +1 -1
  233. package/library/skills/multiplayer-state/resource.yaml +1 -1
  234. package/library/skills/multiplayer-testing/SKILL.md +1 -1
  235. package/library/skills/multiplayer-testing/resource.yaml +1 -1
  236. package/library/skills/music-track/SKILL.md +22 -13
  237. package/library/skills/music-track/resource.yaml +1 -1
  238. package/library/skills/navigate-summer/SKILL.md +11 -9
  239. package/library/skills/navigate-summer/resource.yaml +1 -1
  240. package/library/skills/new-project/SKILL.md +1 -1
  241. package/library/skills/new-project/resource.yaml +1 -1
  242. package/library/skills/organic-model/SKILL.md +24 -18
  243. package/library/skills/organic-model/resource.yaml +1 -1
  244. package/library/skills/pixel-art/SKILL.md +27 -23
  245. package/library/skills/pixel-art/resource.yaml +1 -1
  246. package/library/skills/play/SKILL.md +1 -1
  247. package/library/skills/play/resource.yaml +1 -1
  248. package/library/skills/playtesting-a-feature/SKILL.md +1 -1
  249. package/library/skills/playtesting-a-feature/resource.yaml +1 -1
  250. package/library/skills/procedural-animation/SKILL.md +20 -16
  251. package/library/skills/procedural-animation/resource.yaml +1 -1
  252. package/library/skills/prop-model/SKILL.md +25 -19
  253. package/library/skills/prop-model/resource.yaml +1 -1
  254. package/library/skills/psx-retro-rendering/resource.yaml +1 -0
  255. package/library/skills/publish-your-game/SKILL.md +16 -6
  256. package/library/skills/publish-your-game/resource.yaml +3 -3
  257. package/library/skills/realtime-wet-surfaces/resource.yaml +1 -0
  258. package/library/skills/release-readiness/SKILL.md +1 -1
  259. package/library/skills/release-readiness/resource.yaml +1 -1
  260. package/library/skills/remote-deploy/SKILL.md +1 -1
  261. package/library/skills/remote-deploy/resource.yaml +1 -1
  262. package/library/skills/retarget/SKILL.md +23 -20
  263. package/library/skills/retarget/resource.yaml +1 -1
  264. package/library/skills/running-in-the-cloud/SKILL.md +1 -1
  265. package/library/skills/running-in-the-cloud/resource.yaml +1 -1
  266. package/library/skills/save-load/SKILL.md +1 -1
  267. package/library/skills/save-load/resource.yaml +1 -1
  268. package/library/skills/scene-composition/SKILL.md +1 -1
  269. package/library/skills/scene-composition/resource.yaml +1 -1
  270. package/library/skills/scene-hierarchy-design/SKILL.md +2 -2
  271. package/library/skills/scene-hierarchy-design/resource.yaml +1 -1
  272. package/library/skills/scene-scripting/SKILL.md +66 -636
  273. package/library/skills/scene-scripting/references/ctx-api.md +184 -0
  274. package/library/skills/scene-scripting/references/recipes-2d-ui.md +193 -0
  275. package/library/skills/scene-scripting/references/recipes-3d.md +280 -0
  276. package/library/skills/scene-scripting/resource.yaml +4 -4
  277. package/library/skills/scene-to-level/SKILL.md +2 -2
  278. package/library/skills/scene-to-level/resource.yaml +1 -1
  279. package/library/skills/skill-create/resource.yaml +1 -0
  280. package/library/skills/skill-improve/resource.yaml +1 -0
  281. package/library/skills/skill-test/SKILL.md +2 -2
  282. package/library/skills/skill-test/resource.yaml +1 -0
  283. package/library/skills/skintokens-auto-rigging/resource.yaml +1 -0
  284. package/library/skills/skybox-panorama/SKILL.md +27 -21
  285. package/library/skills/skybox-panorama/resource.yaml +1 -1
  286. package/library/skills/sound-effect/SKILL.md +29 -20
  287. package/library/skills/sound-effect/resource.yaml +1 -1
  288. package/library/skills/spatial-placement/SKILL.md +14 -9
  289. package/library/skills/spatial-placement/resource.yaml +1 -1
  290. package/library/skills/sprite-sheet/SKILL.md +32 -27
  291. package/library/skills/sprite-sheet/resource.yaml +1 -1
  292. package/library/skills/store-art/SKILL.md +3 -3
  293. package/library/skills/store-art/resource.yaml +2 -2
  294. package/library/skills/store-listing/SKILL.md +3 -3
  295. package/library/skills/store-listing/resource.yaml +2 -2
  296. package/library/skills/summer-analytics/SKILL.md +7 -5
  297. package/library/skills/summer-analytics/resource.yaml +2 -2
  298. package/library/skills/summer-apps/SKILL.md +48 -32
  299. package/library/skills/summer-apps/manifest.md +1 -1
  300. package/library/skills/summer-apps/minimal-app.md +7 -7
  301. package/library/skills/summer-apps/resource.yaml +1 -1
  302. package/library/skills/summer-apps/sdk-reference.md +5 -5
  303. package/library/skills/summer-apps-design/SKILL.md +1 -1
  304. package/library/skills/summer-apps-design/resource.yaml +1 -1
  305. package/library/skills/summer-assets/SKILL.md +56 -0
  306. package/library/skills/summer-assets/resource.yaml +34 -0
  307. package/library/skills/summer-store/SKILL.md +1 -1
  308. package/library/skills/text-to-motion/SKILL.md +30 -23
  309. package/library/skills/text-to-motion/prompts-and-controls.md +5 -5
  310. package/library/skills/text-to-motion/resource.yaml +1 -1
  311. package/library/skills/text-to-motion/rigging-for-text-motion.md +2 -2
  312. package/library/skills/tileable-texture/SKILL.md +19 -15
  313. package/library/skills/tileable-texture/resource.yaml +1 -1
  314. package/library/skills/trailer-shot/SKILL.md +28 -24
  315. package/library/skills/trailer-shot/resource.yaml +1 -1
  316. package/library/skills/tune-performance/SKILL.md +6 -6
  317. package/library/skills/tune-performance/resource.yaml +1 -1
  318. package/library/skills/ui-basics/SKILL.md +41 -36
  319. package/library/skills/ui-basics/resource.yaml +1 -1
  320. package/library/skills/ui-graphics/SKILL.md +47 -38
  321. package/library/skills/ui-graphics/resource.yaml +1 -1
  322. package/library/skills/use-widget-asset/SKILL.md +1 -1
  323. package/library/skills/use-widget-asset/resource.yaml +1 -1
  324. package/library/skills/using-summer/SKILL.md +6 -5
  325. package/library/skills/using-summer/resource.yaml +1 -1
  326. package/library/skills/vehicle-model/SKILL.md +65 -57
  327. package/library/skills/vehicle-model/resource.yaml +1 -1
  328. package/library/skills/verification-before-completion/SKILL.md +1 -1
  329. package/library/skills/verification-before-completion/resource.yaml +1 -1
  330. package/library/skills/verifying-scenes/SKILL.md +2 -2
  331. package/library/skills/verifying-scenes/resource.yaml +1 -1
  332. package/library/skills/vfx-dissolve/SKILL.md +2 -2
  333. package/library/skills/vfx-dissolve/resource.yaml +1 -1
  334. package/library/skills/vfx-fire/SKILL.md +15 -41
  335. package/library/skills/vfx-fire/resource.yaml +1 -1
  336. package/library/skills/vfx-hit-spark/SKILL.md +1 -1
  337. package/library/skills/vfx-hit-spark/resource.yaml +1 -1
  338. package/library/skills/vfx-lightning/SKILL.md +7 -16
  339. package/library/skills/vfx-lightning/resource.yaml +1 -1
  340. package/library/skills/vfx-magic-glow/SKILL.md +23 -32
  341. package/library/skills/vfx-magic-glow/resource.yaml +1 -1
  342. package/library/skills/vfx-muzzle-flash/SKILL.md +20 -35
  343. package/library/skills/vfx-muzzle-flash/resource.yaml +1 -1
  344. package/library/skills/vfx-smoke/SKILL.md +13 -31
  345. package/library/skills/vfx-smoke/resource.yaml +1 -1
  346. package/library/skills/vfx-water-ripple/SKILL.md +12 -31
  347. package/library/skills/vfx-water-ripple/resource.yaml +1 -1
  348. package/library/skills/voice-line/SKILL.md +71 -40
  349. package/library/skills/voice-line/resource.yaml +1 -1
  350. package/library/skills/web-and-touch-input/SKILL.md +1 -1
  351. package/library/skills/web-and-touch-input/resource.yaml +1 -1
  352. package/library/skills/web-compatibility-look/SKILL.md +1 -1
  353. package/library/skills/web-compatibility-look/resource.yaml +1 -1
  354. package/library/skills/world-building-3d/SKILL.md +1 -1
  355. package/library/skills/world-building-3d/resource.yaml +1 -1
  356. package/library/skills/writing-skills/resource.yaml +1 -0
  357. package/library/tools/add-node/GUIDE.md +14 -0
  358. package/library/tools/align-distribute-3d/GUIDE.md +7 -0
  359. package/library/tools/app-call/resource.yaml +1 -1
  360. package/library/tools/app-guide/resource.yaml +2 -2
  361. package/library/tools/app-page/resource.yaml +1 -1
  362. package/library/tools/app-screenshot/resource.yaml +19 -1
  363. package/library/tools/app-tools/resource.yaml +1 -1
  364. package/library/tools/attach-to-surface/GUIDE.md +15 -0
  365. package/library/tools/batch/GUIDE.md +27 -0
  366. package/library/tools/camera-bookmark/GUIDE.md +12 -0
  367. package/library/tools/capture-gameplay/GUIDE.md +3 -0
  368. package/library/tools/capture-gameplay/resource.yaml +3 -3
  369. package/library/tools/check-job/resource.yaml +1 -1
  370. package/library/tools/clear-console/GUIDE.md +3 -0
  371. package/library/tools/connect-ports/GUIDE.md +9 -0
  372. package/library/tools/connect-signal/GUIDE.md +14 -0
  373. package/library/tools/create-debug-report/GUIDE.md +10 -0
  374. package/library/tools/create-scene/GUIDE.md +10 -0
  375. package/library/tools/debug-views/GUIDE.md +7 -0
  376. package/library/tools/enable-plugin/GUIDE.md +3 -0
  377. package/library/tools/export-game/GUIDE.md +3 -0
  378. package/library/tools/export-game/resource.yaml +3 -3
  379. package/library/tools/export-templates/GUIDE.md +3 -0
  380. package/library/tools/fabricate-3d/GUIDE.md +19 -0
  381. package/library/tools/frame-nodes/GUIDE.md +9 -0
  382. package/library/tools/frame-shot/GUIDE.md +9 -0
  383. package/library/tools/game-control/GUIDE.md +9 -0
  384. package/library/tools/game-input/GUIDE.md +9 -0
  385. package/library/tools/game-probe/GUIDE.md +9 -0
  386. package/library/tools/generate-3d/resource.yaml +3 -3
  387. package/library/tools/generate-motion/resource.yaml +2 -2
  388. package/library/tools/get-console/GUIDE.md +9 -0
  389. package/library/tools/get-console/resource.yaml +5 -0
  390. package/library/tools/get-debugger-errors/GUIDE.md +7 -0
  391. package/library/tools/get-debugger-errors/resource.yaml +5 -0
  392. package/library/tools/get-debugger-warnings/GUIDE.md +7 -0
  393. package/library/tools/get-debugger-warnings/resource.yaml +5 -0
  394. package/library/tools/get-diagnostics/GUIDE.md +13 -0
  395. package/library/tools/get-project-context/GUIDE.md +25 -0
  396. package/library/tools/get-runtime-tree/GUIDE.md +7 -0
  397. package/library/tools/get-runtime-tree/resource.yaml +5 -0
  398. package/library/tools/get-scene-tree/GUIDE.md +11 -0
  399. package/library/tools/get-scene-tree/resource.yaml +5 -0
  400. package/library/tools/get-script-errors/GUIDE.md +5 -0
  401. package/library/tools/grep/GUIDE.md +11 -0
  402. package/library/tools/import-asset/GUIDE.md +8 -0
  403. package/library/tools/import-asset-by-id/GUIDE.md +12 -0
  404. package/library/tools/import-from-url/GUIDE.md +10 -0
  405. package/library/tools/import-from-url-batch/GUIDE.md +3 -0
  406. package/library/tools/import-hdri/GUIDE.md +16 -0
  407. package/library/tools/input-map-bind/GUIDE.md +11 -0
  408. package/library/tools/inspect-asset/GUIDE.md +14 -0
  409. package/library/tools/inspect-asset/resource.yaml +5 -0
  410. package/library/tools/inspect-node/GUIDE.md +11 -0
  411. package/library/tools/inspect-node/resource.yaml +5 -0
  412. package/library/tools/inspect-resource/GUIDE.md +7 -0
  413. package/library/tools/inspect-resource/resource.yaml +5 -0
  414. package/library/tools/inspect-runtime-node/GUIDE.md +7 -0
  415. package/library/tools/inspect-runtime-node/resource.yaml +5 -0
  416. package/library/tools/instantiate-scene/GUIDE.md +12 -0
  417. package/library/tools/is-running/GUIDE.md +3 -0
  418. package/library/tools/measure/GUIDE.md +8 -0
  419. package/library/tools/navigation-probe/GUIDE.md +9 -0
  420. package/library/tools/open/resource.yaml +2 -2
  421. package/library/tools/open-main-scene/GUIDE.md +6 -0
  422. package/library/tools/open-scene/GUIDE.md +8 -0
  423. package/library/tools/place-adjacent/GUIDE.md +7 -0
  424. package/library/tools/play/GUIDE.md +13 -0
  425. package/library/tools/project-setting/GUIDE.md +9 -0
  426. package/library/tools/publish-build/resource.yaml +6 -6
  427. package/library/tools/raycast/GUIDE.md +7 -0
  428. package/library/tools/read-file/GUIDE.md +10 -0
  429. package/library/tools/read-library/resource.yaml +5 -0
  430. package/library/tools/recent-events/GUIDE.md +7 -0
  431. package/library/tools/remove-node/GUIDE.md +3 -0
  432. package/library/tools/repeat-along/GUIDE.md +5 -0
  433. package/library/tools/replace-node/GUIDE.md +9 -0
  434. package/library/tools/replace-text/GUIDE.md +5 -0
  435. package/library/tools/run-editor-script/GUIDE.md +16 -0
  436. package/library/tools/run-script/GUIDE.md +30 -0
  437. package/library/tools/run-script/resource.yaml +6 -3
  438. package/library/tools/runtime-animate/GUIDE.md +7 -0
  439. package/library/tools/runtime-call/GUIDE.md +7 -0
  440. package/library/tools/runtime-set/GUIDE.md +9 -0
  441. package/library/tools/runtime-spawn/GUIDE.md +9 -0
  442. package/library/tools/save-scene/GUIDE.md +3 -0
  443. package/library/tools/scene-audit/GUIDE.md +29 -0
  444. package/library/tools/screenshot/GUIDE.md +17 -0
  445. package/library/tools/select-node/GUIDE.md +3 -0
  446. package/library/tools/set-prop/GUIDE.md +23 -0
  447. package/library/tools/set-resource-property/GUIDE.md +8 -0
  448. package/library/tools/shot-sheet/GUIDE.md +7 -0
  449. package/library/tools/snap-to-surface/GUIDE.md +17 -0
  450. package/library/tools/snapshot-diff/GUIDE.md +7 -0
  451. package/library/tools/starcast/GUIDE.md +12 -0
  452. package/library/tools/stop/GUIDE.md +3 -0
  453. package/library/tools/test-placement/GUIDE.md +7 -0
  454. package/library/tools/ui-actions/GUIDE.md +12 -0
  455. package/library/tools/ui-activate/GUIDE.md +11 -0
  456. package/library/tools/ui-screenshot/GUIDE.md +9 -0
  457. package/library/tools/ui-tree/GUIDE.md +10 -0
  458. package/library/tools/wait-for-event/GUIDE.md +11 -0
  459. package/library/tools/world-snapshot/GUIDE.md +9 -0
  460. package/library/tools/write-file/GUIDE.md +5 -0
  461. package/library/tools/zoom/GUIDE.md +5 -0
  462. package/package.json +6 -4
  463. package/registry/generated/counts.json +2 -2
  464. package/registry/generated/gemini-extension.json +4 -12
  465. package/registry/generated/index.json +433 -339
  466. package/registry/generated/marketplace.claude.json +2 -13
  467. package/registry/generated/plugin.claude.json +23 -22
  468. package/registry/generated/plugin.codex.json +4 -12
  469. package/registry/generated/plugin.cursor.json +4 -12
  470. package/registry/generated/plugin.factory.json +4 -12
  471. package/registry/generated/server.json +34 -0
  472. package/registry/generated/skills-index.md +119 -117
  473. package/registry/generated/skills-registry.json +153 -115
  474. package/registry/operations/fixtures/invalid-deprecated-without-replacement.json +60 -0
  475. package/registry/operations/fixtures/invalid-name.json +60 -0
  476. package/registry/operations/fixtures/invalid-publish-without-owner.json +82 -0
  477. package/registry/operations/fixtures/invalid-spend-without-estimate.json +42 -0
  478. package/registry/operations/fixtures/invalid-unknown-field.json +61 -0
  479. package/registry/operations/fixtures/valid-player-facing.json +82 -0
  480. package/registry/operations/fixtures/valid-read.json +60 -0
  481. package/registry/operations/fixtures/valid-spend.json +43 -0
  482. package/registry/operations/legacy-names.json +1206 -0
  483. package/registry/schemas/operation.schema.json +318 -0
  484. package/registry/schemas/skill.schema.json +4 -0
  485. package/CLAUDE.md +0 -7
@@ -1,3 +1,20 @@
1
+ /**
2
+ * Usage beacons for the local MCP server. Fire-and-forget, never blocks, never throws.
3
+ *
4
+ * - One session ping per MCP server lifetime (mcp_session_start), on the
5
+ * first tool call, with the host app's name from the MCP handshake.
6
+ * - One line per local tool call (mcp_tool_call): the tool name, the
7
+ * Summer operation it ran, success, duration, the host app's name from the
8
+ * MCP handshake, and the tool surface and profile. Nothing else: no
9
+ * arguments, no results, no project or file names.
10
+ *
11
+ * Both go to /api/mcp/log-local-call, only when signed in (the account token
12
+ * attributes them), and never when SUMMER_NO_TELEMETRY=1 or DO_NOT_TRACK=1.
13
+ * The endpoint always returns allowed:true and never gates; the response is
14
+ * ignored.
15
+ */
16
+ import { isTelemetryDisabled } from "./agent-host.js";
17
+ export { isTelemetryDisabled };
1
18
  /**
2
19
  * Ping the telemetry endpoint once per MCP server lifetime.
3
20
  *
@@ -7,6 +24,21 @@
7
24
  * - Skips entirely if no auth token is on disk (anonymous users still work).
8
25
  */
9
26
  export declare function recordMcpSession(): void;
27
+ export interface LocalToolCall {
28
+ tool: string;
29
+ ok: boolean;
30
+ durationMs: number;
31
+ /** The host app's name from the MCP handshake (clientInfo.name). */
32
+ mcpClient?: string;
33
+ /** The Summer operation the call ran (core/ops/contract.ts opForToolCall). */
34
+ op?: string | null;
35
+ /** The tool surface: v3 (3.x names) or v4 (the operation catalog). */
36
+ surfaceVersion?: "v3" | "v4";
37
+ /** The MCP profile: full, engine, assets or custom. */
38
+ profile?: string;
39
+ }
40
+ /** Report one local tool call: tool name, success, duration, host app name. */
41
+ export declare function recordLocalToolCall(call: LocalToolCall): void;
10
42
  /**
11
43
  * Reset the once-per-session guard. Test-only.
12
44
  */
@@ -1,15 +1,25 @@
1
1
  /**
2
- * Pure-telemetry beacon for MCP usage. Fire-and-forget, never blocks, never throws.
3
- * One ping per MCP server lifetime — counts daily-active users, not per-tool calls.
2
+ * Usage beacons for the local MCP server. Fire-and-forget, never blocks, never throws.
4
3
  *
5
- * The endpoint /api/mcp/log-local-call always returns allowed:true and never gates.
6
- * No quota. The user account is the only thing being attributed; the response is
7
- * ignored entirely on the CLI side.
4
+ * - One session ping per MCP server lifetime (mcp_session_start), on the
5
+ * first tool call, with the host app's name from the MCP handshake.
6
+ * - One line per local tool call (mcp_tool_call): the tool name, the
7
+ * Summer operation it ran, success, duration, the host app's name from the
8
+ * MCP handshake, and the tool surface and profile. Nothing else: no
9
+ * arguments, no results, no project or file names.
10
+ *
11
+ * Both go to /api/mcp/log-local-call, only when signed in (the account token
12
+ * attributes them), and never when SUMMER_NO_TELEMETRY=1 or DO_NOT_TRACK=1.
13
+ * The endpoint always returns allowed:true and never gates; the response is
14
+ * ignored.
8
15
  */
16
+ import { currentMcpClient, isTelemetryDisabled, summerRequestHeaders } from "./agent-host.js";
9
17
  import { getAuthToken } from "./auth.js";
10
18
  import { resolveGatewayUrl } from "./config.js";
19
+ export { isTelemetryDisabled };
11
20
  const TELEMETRY_PATH = "/api/mcp/log-local-call";
12
21
  const TIMEOUT_MS = 5000;
22
+ const TOOL_NAME = /^summer_[a-z0-9_]{1,64}$/;
13
23
  let pinged = false;
14
24
  /**
15
25
  * Ping the telemetry endpoint once per MCP server lifetime.
@@ -20,9 +30,29 @@ let pinged = false;
20
30
  * - Skips entirely if no auth token is on disk (anonymous users still work).
21
31
  */
22
32
  export function recordMcpSession() {
23
- if (pinged)
33
+ if (pinged || isTelemetryDisabled())
24
34
  return;
25
35
  pinged = true;
36
+ const mcpClient = currentMcpClient()?.name;
37
+ send({ client: "summer-cli", event: "mcp_session_start", ...(mcpClient ? { mcpClient: mcpClient.slice(0, 64) } : {}) });
38
+ }
39
+ /** Report one local tool call: tool name, success, duration, host app name. */
40
+ export function recordLocalToolCall(call) {
41
+ if (isTelemetryDisabled() || !TOOL_NAME.test(call.tool))
42
+ return;
43
+ send({
44
+ client: "summer-cli",
45
+ event: "mcp_tool_call",
46
+ ...(call.mcpClient ? { mcpClient: call.mcpClient.slice(0, 64) } : {}),
47
+ tool: call.tool,
48
+ ...(call.op ? { op: call.op } : {}),
49
+ ...(call.surfaceVersion ? { surfaceVersion: call.surfaceVersion } : {}),
50
+ ...(call.profile ? { profile: call.profile } : {}),
51
+ ok: call.ok,
52
+ durationMs: Math.max(0, Math.round(call.durationMs)),
53
+ });
54
+ }
55
+ function send(body) {
26
56
  // Wrap the entire async pipeline in a void-discarded promise so the caller
27
57
  // never accidentally awaits us.
28
58
  void (async () => {
@@ -40,13 +70,11 @@ export function recordMcpSession() {
40
70
  method: "POST",
41
71
  signal: ctrl.signal,
42
72
  headers: {
73
+ ...summerRequestHeaders(),
43
74
  Authorization: `Bearer ${token}`,
44
75
  "Content-Type": "application/json",
45
76
  },
46
- body: JSON.stringify({
47
- client: "summer-cli",
48
- event: "mcp_session_start",
49
- }),
77
+ body: JSON.stringify(body),
50
78
  });
51
79
  }
52
80
  finally {
@@ -0,0 +1,25 @@
1
+ /**
2
+ * MCP tool profiles (`summer mcp --profile`, SUMMER_PROFILE) and the toolsets
3
+ * they pick. Shared by the MCP server (src/mcp/tool-surface.ts) and setup,
4
+ * which writes a profile into an agent's MCP entry. `full` is today's
5
+ * surface exactly and the default, so existing configs keep it.
6
+ */
7
+ export declare const TOOLSETS: readonly ["core", "assets", "tools", "engine", "ui", "ship", "uploads", "apps", "board", "grow", "studio", "cloud", "other"];
8
+ export type Toolset = (typeof TOOLSETS)[number];
9
+ export declare const PROFILES: {
10
+ /** Every tool, local and hosted (today's surface). */
11
+ readonly full: readonly ["core", "assets", "tools", "engine", "ui", "ship", "uploads", "apps", "board", "grow", "studio", "cloud", "other"];
12
+ /** Summer Engine creators: engine, generation and the store. Fits clients with a 128-tool limit. */
13
+ readonly engine: readonly ["core", "assets", "engine", "ship"];
14
+ /** Any engine or none: generation, the asset library, account and library search. No engine tools. */
15
+ readonly assets: readonly ["core", "assets", "tools"];
16
+ };
17
+ export type Profile = keyof typeof PROFILES;
18
+ /** Non-full profiles never register more tools than this (VS Code Copilot's per-request limit). */
19
+ export declare const PROFILE_TOOL_LIMIT = 128;
20
+ /** A profile name, or null when the value names none. */
21
+ export declare function parseProfile(value: string | undefined): Profile | null;
22
+ /** v4: the operation catalog (summer_search, summer_call, `summer <area> <action>`); v3: the 3.x tools. */
23
+ export type SurfaceVersion = "v3" | "v4";
24
+ /** `--surface` / SUMMER_SURFACE: v4 is the default since 4.0; v3 keeps the 3.x tools. */
25
+ export declare function resolveSurface(value: string | undefined, env?: NodeJS.ProcessEnv): SurfaceVersion;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * MCP tool profiles (`summer mcp --profile`, SUMMER_PROFILE) and the toolsets
3
+ * they pick. Shared by the MCP server (src/mcp/tool-surface.ts) and setup,
4
+ * which writes a profile into an agent's MCP entry. `full` is today's
5
+ * surface exactly and the default, so existing configs keep it.
6
+ */
7
+ export const TOOLSETS = [
8
+ "core",
9
+ "assets",
10
+ "tools",
11
+ "engine",
12
+ "ui",
13
+ "ship",
14
+ "uploads",
15
+ "apps",
16
+ "board",
17
+ "grow",
18
+ "studio",
19
+ "cloud",
20
+ "other",
21
+ ];
22
+ export const PROFILES = {
23
+ /** Every tool, local and hosted (today's surface). */
24
+ full: TOOLSETS,
25
+ /** Summer Engine creators: engine, generation and the store. Fits clients with a 128-tool limit. */
26
+ engine: ["core", "assets", "engine", "ship"],
27
+ /** Any engine or none: generation, the asset library, account and library search. No engine tools. */
28
+ assets: ["core", "assets", "tools"],
29
+ };
30
+ /** Non-full profiles never register more tools than this (VS Code Copilot's per-request limit). */
31
+ export const PROFILE_TOOL_LIMIT = 128;
32
+ /** A profile name, or null when the value names none. */
33
+ export function parseProfile(value) {
34
+ const name = (value ?? "").trim().toLowerCase();
35
+ return Object.hasOwn(PROFILES, name) ? name : null;
36
+ }
37
+ /** `--surface` / SUMMER_SURFACE: v4 is the default since 4.0; v3 keeps the 3.x tools. */
38
+ export function resolveSurface(value, env = process.env) {
39
+ const asked = (value ?? env.SUMMER_SURFACE ?? "").trim().toLowerCase();
40
+ return asked === "v3" || asked === "3" ? "v3" : "v4";
41
+ }
@@ -1,3 +1,4 @@
1
+ import type { Profile } from "../core/tool-profiles.js";
1
2
  import { type ConfigScope, type McpFormat, type SupportedAgent } from "./agent-table.js";
2
3
  export { supportedAgents, type ConfigScope, type SupportedAgent } from "./agent-table.js";
3
4
  export declare const SUMMER_MCP_SERVER_NAME = "summer-engine";
@@ -12,9 +13,11 @@ export interface AgentConfigOptions {
12
13
  dryRun?: boolean;
13
14
  print?: boolean;
14
15
  localDev?: boolean;
15
- /** npm dist-tag the generated MCP entry runs (`npx -y summer-engine@<channel> mcp`).
16
+ /** npm dist-tag or exact version the generated MCP entry runs (`npx -y summer-engine@<channel> mcp`).
16
17
  * Default "latest"; "next" while a release soaks on the next tag. Ignored with localDev. */
17
18
  channel?: string;
19
+ /** MCP tool profile written as SUMMER_PROFILE; default the agent's own (full for most). */
20
+ profile?: Profile;
18
21
  cwd?: string;
19
22
  env?: NodeJS.ProcessEnv;
20
23
  }
@@ -31,8 +34,11 @@ export interface AgentConfigResult {
31
34
  dryRun: boolean;
32
35
  print: boolean;
33
36
  localDev: boolean;
34
- /** The dist-tag the written entry runs ("latest" unless --channel / SUMMER_CHANNEL). */
37
+ /** The dist-tag or exact version the written entry runs ("latest" unless --channel /
38
+ * SUMMER_CHANNEL, or a CLI ahead of npm latest: see resolveDefaultChannel). */
35
39
  channel: string;
40
+ /** The MCP tool profile the entry runs (full = every tool, no SUMMER_PROFILE written). */
41
+ profile: Profile;
36
42
  warnings: string[];
37
43
  nextSteps: string[];
38
44
  }
@@ -72,9 +78,16 @@ export interface RemoteMcpResult {
72
78
  export declare function configureSummerGamesMcp(options: Pick<AgentConfigOptions, "agent" | "scope" | "dryRun" | "cwd" | "env">): Promise<RemoteMcpResult | null>;
73
79
  export declare const DEFAULT_CHANNEL = "latest";
74
80
  /** npm dist-tags are lowercase words like `latest`, `next`, `beta`, `v3-preview`;
75
- * anything that could be read as a version or a path is refused (a bare
76
- * version belongs in a version bump, not a channel). */
81
+ * an exact version (`3.9.1`, `3.9.1-rc.1`) pins the entry to that release, which
82
+ * setup does for a CLI that is ahead of npm latest. Anything else, partial
83
+ * versions and paths included, is refused. */
77
84
  export declare function normalizeChannel(channel: string | undefined): string;
85
+ /**
86
+ * The profile rides in the entry's env, not its args: an older summer-engine
87
+ * that an agent still runs ignores the variable and serves every tool, where
88
+ * an unknown --profile flag would stop it from starting.
89
+ */
90
+ export declare function withProfile(server: StdioMcpServerConfig, profile: Profile): StdioMcpServerConfig;
78
91
  export declare function createSummerMcpServerConfig(localDev: boolean, platform?: NodeJS.Platform, channel?: string): StdioMcpServerConfig;
79
92
  export declare function renderConfigSnippet(agent: SupportedAgent, server: StdioMcpServerConfig): string;
80
93
  /** The key under which the file lists MCP servers (see McpFormat in agent-table.ts). */
@@ -27,9 +27,12 @@ export function resolveAgentSelection(agentArg, agentOpt) {
27
27
  if (agentArg && agentOpt && parseAgent(agentArg) !== parseAgent(agentOpt)) {
28
28
  throw new Error("Specify the agent either positionally or with --agent, not both.");
29
29
  }
30
- const parsed = parseAgent(agentOpt ?? agentArg);
30
+ const name = agentOpt ?? agentArg;
31
+ const parsed = parseAgent(name);
31
32
  if (!parsed) {
32
- throw new Error(`Specify an agent: ${supportedAgents.join(", ")}`);
33
+ throw new Error(name
34
+ ? `Unknown agent "${name}". Supported: ${supportedAgents.join(", ")}`
35
+ : `Specify an agent: ${supportedAgents.join(", ")}`);
33
36
  }
34
37
  return parsed;
35
38
  }
@@ -45,8 +48,9 @@ export async function configureAgentMcp(options) {
45
48
  const env = options.env ?? process.env;
46
49
  const cwd = resolve(options.cwd ?? process.cwd());
47
50
  const channel = normalizeChannel(options.channel);
48
- const server = createSummerMcpServerConfig(Boolean(options.localDev), process.platform, channel);
49
51
  const spec = agentSpec(options.agent);
52
+ const profile = options.profile ?? spec.mcpProfile ?? "full";
53
+ const server = withProfile(createSummerMcpServerConfig(Boolean(options.localDev), process.platform, channel), profile);
50
54
  const target = resolveConfigTarget(spec, options.scope, cwd, env);
51
55
  const snippet = renderConfigSnippet(options.agent, server);
52
56
  const dryRun = Boolean(options.dryRun);
@@ -69,6 +73,7 @@ export async function configureAgentMcp(options) {
69
73
  print,
70
74
  localDev: Boolean(options.localDev),
71
75
  channel,
76
+ profile,
72
77
  warnings: target.warnings,
73
78
  nextSteps: [`Updated ${target.path}.`, spec.restart],
74
79
  };
@@ -264,17 +269,28 @@ async function upsertConfig(format, path, server, write) {
264
269
  }
265
270
  export const DEFAULT_CHANNEL = "latest";
266
271
  /** npm dist-tags are lowercase words like `latest`, `next`, `beta`, `v3-preview`;
267
- * anything that could be read as a version or a path is refused (a bare
268
- * version belongs in a version bump, not a channel). */
272
+ * an exact version (`3.9.1`, `3.9.1-rc.1`) pins the entry to that release, which
273
+ * setup does for a CLI that is ahead of npm latest. Anything else, partial
274
+ * versions and paths included, is refused. */
269
275
  export function normalizeChannel(channel) {
270
276
  const value = (channel ?? "").trim();
271
277
  if (value === "")
272
278
  return DEFAULT_CHANNEL;
279
+ if (/^\d+\.\d+\.\d+(?:-[0-9a-z][0-9a-z.-]*)?$/.test(value))
280
+ return value;
273
281
  if (!/^[a-z][a-z0-9-]*$/.test(value) || /^v?\d/.test(value)) {
274
- throw new Error(`Invalid channel "${channel}": use an npm dist-tag such as latest or next (lowercase letters, digits, hyphens).`);
282
+ throw new Error(`Invalid channel "${channel}": use an npm dist-tag such as latest or next (lowercase letters, digits, hyphens), or an exact version such as 4.0.0.`);
275
283
  }
276
284
  return value;
277
285
  }
286
+ /**
287
+ * The profile rides in the entry's env, not its args: an older summer-engine
288
+ * that an agent still runs ignores the variable and serves every tool, where
289
+ * an unknown --profile flag would stop it from starting.
290
+ */
291
+ export function withProfile(server, profile) {
292
+ return profile === "full" ? server : { ...server, env: { ...server.env, SUMMER_PROFILE: profile } };
293
+ }
278
294
  export function createSummerMcpServerConfig(localDev, platform = process.platform, channel = DEFAULT_CHANNEL) {
279
295
  const spec = `summer-engine@${normalizeChannel(channel)}`;
280
296
  if (localDev) {
@@ -1,3 +1,4 @@
1
+ import type { Profile } from "../core/tool-profiles.js";
1
2
  /** Ids `summer setup <agent>` accepts. Legacy ids stay so old commands and
2
3
  * configs keep resolving, but they are hidden from help and warn on use. */
3
4
  export declare const AGENT_IDS: readonly ["claude-code", "claude-desktop", "codex", "cursor", "windsurf", "antigravity", "gemini", "cline", "cline-cli", "roo-code", "kilo-code", "github-copilot", "vscode-copilot", "visual-studio", "copilot-jetbrains", "opencode", "zed", "kiro", "goose", "hermes", "trae", "qwen-code", "kimi-code", "crush", "amp", "factory", "junie", "warp", "rovo-dev", "qoder", "grok-build", "mistral-vibe", "lm-studio"];
@@ -70,6 +71,8 @@ export interface AgentSpec {
70
71
  /** Env var that overrides the MCP config path (tests, unusual installs). */
71
72
  envOverride: string;
72
73
  format: McpFormat;
74
+ /** MCP tool profile setup writes without --profile (default full: every tool). */
75
+ mcpProfile?: Profile;
73
76
  /**
74
77
  * The Summer Games player MCP (a remote server that signs in with OAuth on
75
78
  * its own) in this agent's file, under the same key as summer-engine.
@@ -130,7 +130,7 @@ const SPECS = [
130
130
  },
131
131
  restart: "Quit and reopen Claude Desktop; the summer-engine tools appear under the tools menu in a new chat.",
132
132
  skills: null,
133
- noSkillsNote: "Claude Desktop has no skills folder. The MCP server ships summer_get_agent_playbook, so the model can pull Summer guidance in-chat.",
133
+ noSkillsNote: "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.",
134
134
  },
135
135
  {
136
136
  id: "codex",
@@ -144,7 +144,8 @@ const SPECS = [
144
144
  signIn: (name) => `In Codex, run /mcp login ${name} (or \`codex mcp login ${name}\` in a terminal) and sign in.`,
145
145
  },
146
146
  mcp: {
147
- user: home(".codex", "config.toml"),
147
+ // Codex reads its config from $CODEX_HOME (default ~/.codex).
148
+ user: (ctx) => join(ctx.env.CODEX_HOME || join(ctx.home, ".codex"), "config.toml"),
148
149
  project: project(".codex", "config.toml"),
149
150
  projectNote: "Codex only loads project .codex/config.toml from trusted projects.",
150
151
  },
@@ -316,6 +317,8 @@ const SPECS = [
316
317
  status: "active",
317
318
  envOverride: "SUMMER_VSCODE_COPILOT_CONFIG_FILE",
318
319
  format: "json-vscode",
320
+ // VS Code Copilot sends at most 128 tools per request; the full surface is over that.
321
+ mcpProfile: "engine",
319
322
  remoteMcp: {
320
323
  entry: (url) => ({ type: "http", url }),
321
324
  signIn: (name) => `In VS Code, click Allow when ${name} asks to authenticate, then sign in on summer.games.`,
@@ -335,7 +338,7 @@ const SPECS = [
335
338
  mcp: { user: home(".mcp.json"), project: project(".mcp.json") },
336
339
  restart: "Restart Visual Studio, open Copilot Chat in Agent mode, and enable summer-engine in the tools picker.",
337
340
  skills: null,
338
- noSkillsNote: "Visual Studio's Copilot has no skills folder yet; the MCP server ships summer_get_agent_playbook for in-chat guidance.",
341
+ noSkillsNote: "Visual Studio's Copilot has no skills folder yet; the MCP server ships summer_docs_search and summer_docs_read for in-chat guidance.",
339
342
  },
340
343
  {
341
344
  id: "copilot-jetbrains",
@@ -354,7 +357,7 @@ const SPECS = [
354
357
  },
355
358
  restart: "Restart the JetBrains IDE and open Copilot Chat in Agent mode; summer-engine shows in the tools list.",
356
359
  skills: null,
357
- noSkillsNote: "Copilot in JetBrains documents no skills folder; the MCP server ships summer_get_agent_playbook for in-chat guidance.",
360
+ noSkillsNote: "Copilot in JetBrains documents no skills folder; the MCP server ships summer_docs_search and summer_docs_read for in-chat guidance.",
358
361
  },
359
362
  {
360
363
  id: "opencode",
@@ -476,7 +479,7 @@ const SPECS = [
476
479
  },
477
480
  restart: "Restart Trae and open the MCP settings; summer-engine should show as connected.",
478
481
  skills: null,
479
- noSkillsNote: "Trae documents no skills folder; the MCP server ships summer_get_agent_playbook for in-chat guidance.",
482
+ noSkillsNote: "Trae documents no skills folder; the MCP server ships summer_docs_search and summer_docs_read for in-chat guidance.",
480
483
  },
481
484
  {
482
485
  id: "qwen-code",
@@ -570,7 +573,7 @@ const SPECS = [
570
573
  mcp: { user: home(".junie", "mcp", "mcp.json"), project: project(".junie", "mcp", "mcp.json") },
571
574
  restart: "Restart the JetBrains IDE so Junie reloads its MCP config.",
572
575
  skills: null,
573
- noSkillsNote: "Junie has no skills folder; put project guidance in .junie/guidelines.md. The MCP server ships summer_get_agent_playbook for in-chat guidance.",
576
+ noSkillsNote: "Junie has no skills folder; put project guidance in .junie/guidelines.md. The MCP server ships summer_docs_search and summer_docs_read for in-chat guidance.",
574
577
  },
575
578
  {
576
579
  id: "warp",
@@ -652,7 +655,7 @@ const SPECS = [
652
655
  mcp: { user: home(".lmstudio", "mcp.json"), project: null },
653
656
  restart: "Open LM Studio, toggle on the summer-engine MCP server in the Program tab, and raise the loaded model's context length to 32k or higher.",
654
657
  skills: null,
655
- noSkillsNote: "LM Studio has no rules or skills folder. The MCP server ships summer_get_agent_playbook, so the model can pull Summer guidance in-chat.",
658
+ noSkillsNote: "LM Studio has no rules or skills folder. The MCP server ships summer_docs_search and summer_docs_read, so the model can pull Summer guidance in-chat.",
656
659
  },
657
660
  ];
658
661
  const BY_ID = new Map(SPECS.map((spec) => [spec.id, spec]));
@@ -36,6 +36,8 @@ export interface SkillSetupOptions {
36
36
  /** Skip `status: preview` skills. By default they install like any other
37
37
  * skill — preview is a label carried in the skill's guidance, not a gate. */
38
38
  stableOnly?: boolean;
39
+ /** Install only the asset skills (`setup --assets-only`). */
40
+ assetsOnly?: boolean;
39
41
  }
40
42
  /**
41
43
  * The preview clause of the setup summary — one wording for the result message
@@ -37,11 +37,13 @@ export function setupSkills(agent, options) {
37
37
  const scope = options.scope ?? "user";
38
38
  const recommended = Boolean(options.recommended);
39
39
  const stableOnly = Boolean(options.stableOnly);
40
+ const assetsOnly = Boolean(options.assetsOnly);
40
41
  const invocation = skillInstallInvocation(agent, {
41
42
  force: options.force,
42
43
  scope,
43
44
  recommended,
44
45
  stableOnly,
46
+ assetsOnly,
45
47
  });
46
48
  if (!invocation) {
47
49
  return {
@@ -49,14 +51,15 @@ export function setupSkills(agent, options) {
49
51
  message: "No automatic skill installer is available for this agent yet. Run `summer skills install --all` and point the agent at the installed SKILL.md files.",
50
52
  };
51
53
  }
52
- const { selected, previewIncluded, previewSkipped } = selectSkillsForBulkInstall(getSkillRegistry(), { recommended, stableOnly });
54
+ const { selected, previewIncluded, previewSkipped } = selectSkillsForBulkInstall(getSkillRegistry(), { recommended, stableOnly, assetsOnly });
53
55
  const count = selected.length;
54
56
  const note = previewNote({ previewIncluded, previewSkipped });
55
57
  const destination = isAgentClient(agent)
56
58
  ? describeInstallLocation(resolveInstallLocation(agent, scope))
57
59
  : undefined;
58
- const subset = recommended ? "recommended " : "";
60
+ const subset = assetsOnly ? "asset " : recommended ? "recommended " : "";
59
61
  if (options.dryRun || !options.yes) {
62
+ const where = destination ?? "the agent's skills directory";
60
63
  return {
61
64
  status: "planned",
62
65
  command: invocation.display,
@@ -64,7 +67,9 @@ export function setupSkills(agent, options) {
64
67
  previewIncluded,
65
68
  previewSkipped,
66
69
  destination,
67
- message: `Would install ${count} ${subset}skills${note ? ` (${note})` : ""} to ${destination ?? "the agent's skills directory"} with: ${invocation.display.join(" ")}`,
70
+ message: options.dryRun
71
+ ? `Would install ${count} ${subset}skills${note ? ` (${note})` : ""} to ${where} with: ${invocation.display.join(" ")}`
72
+ : `Not installed. Run the same setup command again with --yes to install ${count} ${subset}skills${note ? ` (${note})` : ""} to ${where}.`,
68
73
  };
69
74
  }
70
75
  const result = spawnSync(invocation.command, invocation.args, {
@@ -130,7 +135,7 @@ function skillInstallInvocation(agent, opts) {
130
135
  const baseArgs = [
131
136
  "skills",
132
137
  "install",
133
- opts.recommended ? "--recommended" : "--all",
138
+ opts.assetsOnly ? "--assets" : opts.recommended ? "--recommended" : "--all",
134
139
  "--agent",
135
140
  agent,
136
141
  "--scope",
@@ -52,6 +52,15 @@ export interface RegistryFetchFailure {
52
52
  message?: string;
53
53
  }
54
54
  export declare function fetchLatestRegistryVersion(options?: RegistryFetchOptions): Promise<RegistryFetchResult | RegistryFetchFailure>;
55
+ export interface RegistryDistTagsResult {
56
+ ok: true;
57
+ /** dist-tag -> version, e.g. { latest: "3.8.0", next: "3.1.0" }. */
58
+ tags: Record<string, string>;
59
+ }
60
+ export declare function fetchRegistryDistTags(options?: RegistryFetchOptions): Promise<RegistryDistTagsResult | RegistryFetchFailure>;
61
+ /** Whether npm has this exact version: true, false (registry says 404), or
62
+ * null when the registry could not be asked. */
63
+ export declare function isRegistryVersionPublished(version: string, options?: RegistryFetchOptions): Promise<boolean | null>;
55
64
  /**
56
65
  * Build the `cli-version-current` doctor check. Pure helper so tests can drive
57
66
  * registry responses through `fetchImpl` rather than touching the network.
@@ -100,16 +109,25 @@ export interface RecordedInstall {
100
109
  * no readable Summer entry — the nature of the CLI running this check. */
101
110
  source: "agent-config" | "running-cli";
102
111
  }
103
- export type RefreshChannel = "latest" | "next";
104
- /** The npm dist-tag a refresh command should name. A CLI that is AHEAD of
105
- * npm `latest` was installed from `next` (a soaking release); telling that
106
- * user to run `summer-engine@latest` would silently downgrade the MCP server
107
- * while leaving the newer skills in place (release review P1-3). */
108
- export declare function refreshChannel(installedVersion: string, latestVersion: string | undefined): RefreshChannel;
112
+ /** An npm dist-tag (`latest`, `next`) or an exact version (`3.9.1`). */
113
+ export type RefreshChannel = string;
114
+ /** The npm spec a refresh command or a new MCP entry should name, so the agent
115
+ * never runs an older release than this CLI (release review P1-3). `latest`
116
+ * unless this CLI is AHEAD of npm latest; then `next` only when the next
117
+ * dist-tag is this exact version, else this exact version. A CLI that is ahead
118
+ * is not always on `next`: `next` stayed on 3.1.0 while latest moved to 3.8.0,
119
+ * and pinning it dropped every option newer than 3.1.0 (SUMMER_PROFILE). */
120
+ export declare function refreshChannel(installedVersion: string, latestVersion: string | undefined, nextVersion?: string): RefreshChannel;
121
+ export interface DefaultChannelDeps {
122
+ fetchDistTags?: typeof fetchRegistryDistTags;
123
+ isPublished?: typeof isRegistryVersionPublished;
124
+ }
109
125
  /** Default `summer setup` channel when neither --channel nor SUMMER_CHANNEL is
110
- * given: `next` while this CLI is ahead of npm latest, else `latest`. Network
111
- * failure means `latest` (never blocks setup). */
112
- export declare function resolveDefaultChannel(installedVersion: string): Promise<{
126
+ * given: `latest`, unless this CLI is ahead of npm latest. Then `next` when
127
+ * next is this exact version, this exact version when npm has it, and
128
+ * otherwise (a checkout that was never published) `latest` with a note that
129
+ * points at --local-dev. Network failure means `latest` (never blocks setup). */
130
+ export declare function resolveDefaultChannel(installedVersion: string, deps?: DefaultChannelDeps): Promise<{
113
131
  channel: RefreshChannel;
114
132
  note?: string;
115
133
  }>;
@@ -118,6 +136,8 @@ export interface SkillsVersionCheckInput {
118
136
  candidates: SkillMarkerCandidate[];
119
137
  /** npm latest, when known, so the refresh command names the right dist-tag. */
120
138
  latestRegistryVersion?: string;
139
+ /** npm next, when known: the refresh names `next` only when it is this CLI. */
140
+ nextRegistryVersion?: string;
121
141
  /** Resolves how the stale agent's MCP entry was recorded; defaults to
122
142
  * detectRecordedInstall. Seam for tests. */
123
143
  recordedInstall?: (agent: string) => Promise<RecordedInstall | null> | RecordedInstall | null;