summer-engine 3.8.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (527) hide show
  1. package/.claude-plugin/marketplace.json +2 -13
  2. package/.claude-plugin/plugin.json +24 -22
  3. package/.codex-plugin/plugin.json +18 -22
  4. package/.cursor-plugin/plugin.json +8 -14
  5. package/.factory-plugin/plugin.json +6 -13
  6. package/AGENTS.md +19 -12
  7. package/CHANGELOG.md +133 -0
  8. package/GEMINI.md +3 -3
  9. package/README.md +118 -37
  10. package/assets/icon.png +0 -0
  11. package/commands/start.md +71 -0
  12. package/commands/summer.md +3 -2
  13. package/dist/cli/banner.js +3 -0
  14. package/dist/cli/commands/config.js +3 -2
  15. package/dist/cli/commands/create.js +12 -3
  16. package/dist/cli/commands/list.d.ts +5 -0
  17. package/dist/cli/commands/list.js +30 -13
  18. package/dist/cli/commands/login.d.ts +27 -0
  19. package/dist/cli/commands/login.js +58 -12
  20. package/dist/cli/commands/memory.js +6 -2
  21. package/dist/cli/commands/ops.d.ts +64 -0
  22. package/dist/cli/commands/ops.js +329 -0
  23. package/dist/cli/commands/setup.d.ts +4 -0
  24. package/dist/cli/commands/setup.js +254 -26
  25. package/dist/cli/commands/skills.js +28 -11
  26. package/dist/cli/commands/status.d.ts +26 -0
  27. package/dist/cli/commands/status.js +36 -21
  28. package/dist/cli/index.js +7 -0
  29. package/dist/core/agent-host.d.ts +65 -0
  30. package/dist/core/agent-host.js +193 -0
  31. package/dist/core/capabilities/agent-playbook.d.ts +3 -0
  32. package/dist/core/capabilities/agent-playbook.js +54 -2
  33. package/dist/core/capabilities/apps.d.ts +33 -10
  34. package/dist/core/capabilities/apps.js +25 -12
  35. package/dist/core/capabilities/audit/args.d.ts +6 -6
  36. package/dist/core/capabilities/doctor.d.ts +3 -0
  37. package/dist/core/capabilities/doctor.js +20 -15
  38. package/dist/core/capabilities/fabricate-mesh.d.ts +4 -4
  39. package/dist/core/capabilities/game-task-plan.d.ts +12 -6
  40. package/dist/core/capabilities/game-task-plan.js +80 -5
  41. package/dist/core/capabilities/hdri-import.d.ts +2 -2
  42. package/dist/core/capabilities/motion-generation.d.ts +2 -2
  43. package/dist/core/capabilities/motion-generation.js +2 -2
  44. package/dist/core/capabilities/navigation/open.d.ts +6 -2
  45. package/dist/core/capabilities/navigation/open.js +3 -0
  46. package/dist/core/capabilities/placement.d.ts +23 -23
  47. package/dist/core/capabilities/publish-build.js +2 -0
  48. package/dist/core/capabilities/runtime-control.d.ts +42 -42
  49. package/dist/core/capabilities/scene-script-target.d.ts +17 -0
  50. package/dist/core/capabilities/scene-script-target.js +70 -0
  51. package/dist/core/capabilities/seeing/args.d.ts +16 -16
  52. package/dist/core/capabilities/sfx-choices.d.ts +4 -0
  53. package/dist/core/capabilities/sfx-choices.js +13 -6
  54. package/dist/core/capabilities/tool-dispatch.d.ts +12 -3
  55. package/dist/core/capabilities/tool-dispatch.js +81 -46
  56. package/dist/core/capabilities/ui-control.d.ts +2 -2
  57. package/dist/core/capabilities/world-snapshot.d.ts +4 -4
  58. package/dist/core/embeddings.d.ts +2 -0
  59. package/dist/core/embeddings.js +1 -1
  60. package/dist/core/error-codes.d.ts +62 -0
  61. package/dist/core/error-codes.js +97 -0
  62. package/dist/core/format.d.ts +2 -0
  63. package/dist/core/format.js +2 -1
  64. package/dist/core/hosted-mcp.d.ts +22 -0
  65. package/dist/core/hosted-mcp.js +56 -1
  66. package/dist/core/library-read.js +5 -0
  67. package/dist/core/library-search.d.ts +2 -2
  68. package/dist/core/library-search.js +2 -1
  69. package/dist/core/oauth.js +4 -0
  70. package/dist/core/ops/areas.d.ts +11 -0
  71. package/dist/core/ops/areas.js +24 -0
  72. package/dist/core/ops/catalog.d.ts +45 -0
  73. package/dist/core/ops/catalog.js +157 -0
  74. package/dist/core/ops/cloud.d.ts +64 -0
  75. package/dist/core/ops/cloud.js +198 -0
  76. package/dist/core/ops/contract.d.ts +120 -0
  77. package/dist/core/ops/contract.js +134 -0
  78. package/dist/core/ops/engine-answer.d.ts +25 -0
  79. package/dist/core/ops/engine-answer.js +117 -0
  80. package/dist/core/ops/engine.d.ts +55 -0
  81. package/dist/core/ops/engine.js +649 -0
  82. package/dist/core/ops/public-catalog.d.ts +48 -0
  83. package/dist/core/ops/public-catalog.js +56 -0
  84. package/dist/core/ops/save-files.d.ts +78 -0
  85. package/dist/core/ops/save-files.js +419 -0
  86. package/dist/core/ops/search.d.ts +8 -0
  87. package/dist/core/ops/search.js +187 -0
  88. package/dist/core/skills-registry.d.ts +16 -1
  89. package/dist/core/skills-registry.js +35 -2
  90. package/dist/core/telemetry.d.ts +32 -0
  91. package/dist/core/telemetry.js +38 -10
  92. package/dist/core/tool-profiles.d.ts +25 -0
  93. package/dist/core/tool-profiles.js +41 -0
  94. package/dist/installer/agent-config.d.ts +17 -4
  95. package/dist/installer/agent-config.js +27 -6
  96. package/dist/installer/agent-table.d.ts +12 -0
  97. package/dist/installer/agent-table.js +33 -9
  98. package/dist/installer/cli-permissions.d.ts +65 -0
  99. package/dist/installer/cli-permissions.js +182 -0
  100. package/dist/installer/setup.d.ts +4 -0
  101. package/dist/installer/setup.js +12 -4
  102. package/dist/installer/skills-refresh.d.ts +29 -0
  103. package/dist/installer/skills-refresh.js +261 -0
  104. package/dist/installer/version-check.d.ts +51 -11
  105. package/dist/installer/version-check.js +147 -37
  106. package/dist/mcp/command.js +7 -0
  107. package/dist/mcp/hosted-mount.d.ts +27 -2
  108. package/dist/mcp/hosted-mount.js +53 -23
  109. package/dist/mcp/legacy-toolset.d.ts +27 -0
  110. package/dist/mcp/legacy-toolset.js +43 -0
  111. package/dist/mcp/ops-surface.d.ts +59 -0
  112. package/dist/mcp/ops-surface.js +453 -0
  113. package/dist/mcp/server.d.ts +45 -11
  114. package/dist/mcp/server.js +263 -89
  115. package/dist/mcp/tool-results.d.ts +26 -0
  116. package/dist/mcp/tool-results.js +81 -0
  117. package/dist/mcp/tool-surface.d.ts +65 -0
  118. package/dist/mcp/tool-surface.js +317 -0
  119. package/dist/mcp/tools/app-tools.js +9 -2
  120. package/dist/mcp/tools/asset-tools.js +55 -53
  121. package/dist/mcp/tools/audit-tools.js +21 -21
  122. package/dist/mcp/tools/debug-tools.js +6 -6
  123. package/dist/mcp/tools/fabricate-tools.js +6 -6
  124. package/dist/mcp/tools/generate-tools.js +76 -70
  125. package/dist/mcp/tools/project-tools.d.ts +9 -4
  126. package/dist/mcp/tools/project-tools.js +16 -10
  127. package/dist/mcp/tools/scene-tools.js +12 -23
  128. package/dist/mcp/tools/script-tools.js +9 -5
  129. package/dist/mcp/tools/with-engine.d.ts +6 -0
  130. package/dist/mcp/tools/with-engine.js +19 -0
  131. package/dist/project-memory/agent-instructions.d.ts +47 -0
  132. package/dist/project-memory/agent-instructions.js +226 -0
  133. package/gemini-extension.json +6 -13
  134. package/hooks/pre-commit-doctor.sh +5 -4
  135. package/hooks/session-start.sh +24 -28
  136. package/integrations/README.md +1 -1
  137. package/integrations/claude/README.md +6 -0
  138. package/integrations/claude/manifest-target.json +4 -0
  139. package/integrations/claude-desktop/README.md +1 -1
  140. package/integrations/copilot-jetbrains/README.md +1 -1
  141. package/integrations/gemini/README.md +11 -0
  142. package/integrations/junie/README.md +1 -1
  143. package/integrations/lm-studio/README.md +1 -1
  144. package/integrations/trae/README.md +1 -1
  145. package/integrations/visual-studio/README.md +1 -1
  146. package/integrations/windsurf/README.md +1 -1
  147. package/library/references/mcp-tools-reference/mcp-tools-reference.md +79 -51
  148. package/library/references/mcp-tools-reference/resource.yaml +1 -1
  149. package/library/references/product-map/resource.yaml +2 -2
  150. package/library/skills/3d-lighting/SKILL.md +69 -28
  151. package/library/skills/3d-lighting/resource.yaml +1 -1
  152. package/library/skills/README.md +121 -118
  153. package/library/skills/adaptive-music/SKILL.md +40 -23
  154. package/library/skills/adaptive-music/resource.yaml +1 -1
  155. package/library/skills/agent-playtesting/SKILL.md +23 -1
  156. package/library/skills/agent-playtesting/resource.yaml +1 -1
  157. package/library/skills/ai-characters-in-games/SKILL.md +16 -1
  158. package/library/skills/ai-characters-in-games/resource.yaml +1 -1
  159. package/library/skills/ambient-bed/SKILL.md +38 -13
  160. package/library/skills/ambient-bed/resource.yaml +1 -1
  161. package/library/skills/animated-loop/SKILL.md +60 -32
  162. package/library/skills/animated-loop/resource.yaml +1 -1
  163. package/library/skills/animation-tree/SKILL.md +27 -1
  164. package/library/skills/animation-tree/resource.yaml +1 -1
  165. package/library/skills/art-direction/SKILL.md +17 -3
  166. package/library/skills/art-direction/resource.yaml +1 -1
  167. package/library/skills/asset-strategy/SKILL.md +51 -4
  168. package/library/skills/asset-strategy/resource.yaml +2 -1
  169. package/library/skills/audio-direction/SKILL.md +26 -10
  170. package/library/skills/audio-direction/resource.yaml +1 -1
  171. package/library/skills/auto-fire-targeting/SKILL.md +15 -1
  172. package/library/skills/auto-fire-targeting/resource.yaml +1 -1
  173. package/library/skills/bounded-engine-runs/SKILL.md +1 -1
  174. package/library/skills/bounded-engine-runs/resource.yaml +1 -1
  175. package/library/skills/brainstorm-game/SKILL.md +14 -1
  176. package/library/skills/brainstorm-game/resource.yaml +1 -1
  177. package/library/skills/brainstorming/SKILL.md +1 -1
  178. package/library/skills/brainstorming/resource.yaml +1 -1
  179. package/library/skills/browse-templates/SKILL.md +11 -1
  180. package/library/skills/browse-templates/resource.yaml +1 -1
  181. package/library/skills/camera-rigs/SKILL.md +22 -2
  182. package/library/skills/camera-rigs/resource.yaml +1 -1
  183. package/library/skills/celeste-momentum-platforming/resource.yaml +1 -0
  184. package/library/skills/character-animation-wiring/SKILL.md +28 -4
  185. package/library/skills/character-animation-wiring/resource.yaml +1 -1
  186. package/library/skills/character-model/SKILL.md +83 -47
  187. package/library/skills/character-model/resource.yaml +1 -1
  188. package/library/skills/character-movement/SKILL.md +27 -3
  189. package/library/skills/character-movement/resource.yaml +1 -1
  190. package/library/skills/character-portrait/SKILL.md +39 -19
  191. package/library/skills/character-portrait/resource.yaml +1 -1
  192. package/library/skills/cinematic-cutscene/SKILL.md +79 -46
  193. package/library/skills/cinematic-cutscene/resource.yaml +1 -1
  194. package/library/skills/combat-basics/SKILL.md +20 -1
  195. package/library/skills/combat-basics/resource.yaml +1 -1
  196. package/library/skills/compatibility-renderer-traps/SKILL.md +12 -1
  197. package/library/skills/compatibility-renderer-traps/resource.yaml +1 -1
  198. package/library/skills/concept-art/SKILL.md +29 -12
  199. package/library/skills/concept-art/resource.yaml +1 -1
  200. package/library/skills/concept-to-level/SKILL.md +258 -0
  201. package/library/skills/concept-to-level/references/technical-rules.md +150 -0
  202. package/library/skills/concept-to-level/resource.yaml +44 -0
  203. package/library/skills/create-asset-sheet/SKILL.md +37 -13
  204. package/library/skills/create-asset-sheet/resource.yaml +1 -1
  205. package/library/skills/debug/SKILL.md +34 -2
  206. package/library/skills/debug/resource.yaml +1 -1
  207. package/library/skills/debugging-game-feel/SKILL.md +13 -1
  208. package/library/skills/debugging-game-feel/resource.yaml +1 -1
  209. package/library/skills/design-level/SKILL.md +40 -35
  210. package/library/skills/design-level/resource.yaml +1 -1
  211. package/library/skills/design-mechanic/SKILL.md +18 -1
  212. package/library/skills/design-mechanic/resource.yaml +1 -1
  213. package/library/skills/design-npc/SKILL.md +43 -24
  214. package/library/skills/design-npc/resource.yaml +1 -1
  215. package/library/skills/diagnosing-perf-regressions/SKILL.md +13 -1
  216. package/library/skills/diagnosing-perf-regressions/resource.yaml +1 -1
  217. package/library/skills/driving-the-editor-ui/SKILL.md +24 -1
  218. package/library/skills/driving-the-editor-ui/resource.yaml +1 -1
  219. package/library/skills/environment-kit/SKILL.md +43 -16
  220. package/library/skills/environment-kit/resource.yaml +1 -1
  221. package/library/skills/export-and-ship/SKILL.md +29 -6
  222. package/library/skills/export-and-ship/resource.yaml +1 -1
  223. package/library/skills/fabricating-assets/SKILL.md +30 -7
  224. package/library/skills/fabricating-assets/resource.yaml +3 -3
  225. package/library/skills/facial-and-lipsync/SKILL.md +36 -15
  226. package/library/skills/facial-and-lipsync/resource.yaml +1 -1
  227. package/library/skills/fps-controller/SKILL.md +50 -41
  228. package/library/skills/fps-controller/resource.yaml +1 -1
  229. package/library/skills/game-feel/SKILL.md +34 -8
  230. package/library/skills/game-feel/resource.yaml +1 -1
  231. package/library/skills/gameskill/SKILL.md +15 -4
  232. package/library/skills/gameskill/resource.yaml +1 -1
  233. package/library/skills/gdscript-patterns/SKILL.md +16 -1
  234. package/library/skills/gdscript-patterns/resource.yaml +1 -1
  235. package/library/skills/generate-motion/SKILL.md +51 -21
  236. package/library/skills/generate-motion/resource.yaml +1 -1
  237. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +18 -1
  238. package/library/skills/godogen-visual-proof-game-generation/resource.yaml +1 -0
  239. package/library/skills/grow-analytics/SKILL.md +13 -3
  240. package/library/skills/grow-analytics/resource.yaml +1 -1
  241. package/library/skills/headless-scripting/SKILL.md +14 -1
  242. package/library/skills/headless-scripting/resource.yaml +1 -1
  243. package/library/skills/in-game-purchases/SKILL.md +12 -1
  244. package/library/skills/in-game-purchases/resource.yaml +1 -1
  245. package/library/skills/instantiate-asset-pack/SKILL.md +19 -2
  246. package/library/skills/instantiate-asset-pack/resource.yaml +1 -1
  247. package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +1 -0
  248. package/library/skills/make-game/SKILL.md +33 -4
  249. package/library/skills/make-game/references/2d-platformer.md +1 -1
  250. package/library/skills/make-game/references/3d-fps.md +1 -1
  251. package/library/skills/make-game/references/3d-horror.md +1 -1
  252. package/library/skills/make-game/references/3d-third-person.md +2 -2
  253. package/library/skills/make-game/resource.yaml +1 -1
  254. package/library/skills/multiplayer/SKILL.md +13 -1
  255. package/library/skills/multiplayer/resource.yaml +1 -1
  256. package/library/skills/multiplayer-movement/SKILL.md +19 -1
  257. package/library/skills/multiplayer-movement/resource.yaml +1 -1
  258. package/library/skills/multiplayer-project/SKILL.md +18 -1
  259. package/library/skills/multiplayer-project/resource.yaml +1 -1
  260. package/library/skills/multiplayer-publish/SKILL.md +25 -7
  261. package/library/skills/multiplayer-publish/resource.yaml +3 -3
  262. package/library/skills/multiplayer-state/SKILL.md +17 -1
  263. package/library/skills/multiplayer-state/resource.yaml +1 -1
  264. package/library/skills/multiplayer-testing/SKILL.md +16 -1
  265. package/library/skills/multiplayer-testing/resource.yaml +1 -1
  266. package/library/skills/music-track/SKILL.md +38 -13
  267. package/library/skills/music-track/resource.yaml +1 -1
  268. package/library/skills/navigate-summer/SKILL.md +26 -9
  269. package/library/skills/navigate-summer/resource.yaml +1 -1
  270. package/library/skills/new-project/SKILL.md +12 -1
  271. package/library/skills/new-project/resource.yaml +1 -1
  272. package/library/skills/organic-model/SKILL.md +48 -18
  273. package/library/skills/organic-model/resource.yaml +1 -1
  274. package/library/skills/pixel-art/SKILL.md +42 -23
  275. package/library/skills/pixel-art/resource.yaml +1 -1
  276. package/library/skills/play/SKILL.md +19 -1
  277. package/library/skills/play/resource.yaml +1 -1
  278. package/library/skills/playtesting-a-feature/SKILL.md +24 -1
  279. package/library/skills/playtesting-a-feature/resource.yaml +1 -1
  280. package/library/skills/procedural-animation/SKILL.md +38 -16
  281. package/library/skills/procedural-animation/resource.yaml +1 -1
  282. package/library/skills/prop-model/SKILL.md +48 -19
  283. package/library/skills/prop-model/resource.yaml +1 -1
  284. package/library/skills/psx-retro-rendering/resource.yaml +1 -0
  285. package/library/skills/publish-your-game/SKILL.md +43 -6
  286. package/library/skills/publish-your-game/resource.yaml +3 -3
  287. package/library/skills/realtime-wet-surfaces/resource.yaml +1 -0
  288. package/library/skills/release-readiness/SKILL.md +13 -1
  289. package/library/skills/release-readiness/resource.yaml +1 -1
  290. package/library/skills/remote-deploy/SKILL.md +15 -1
  291. package/library/skills/remote-deploy/resource.yaml +1 -1
  292. package/library/skills/retarget/SKILL.md +43 -20
  293. package/library/skills/retarget/resource.yaml +1 -1
  294. package/library/skills/running-in-the-cloud/SKILL.md +11 -1
  295. package/library/skills/running-in-the-cloud/resource.yaml +1 -1
  296. package/library/skills/save-load/SKILL.md +16 -1
  297. package/library/skills/save-load/resource.yaml +1 -1
  298. package/library/skills/scene-composition/SKILL.md +18 -1
  299. package/library/skills/scene-composition/resource.yaml +1 -1
  300. package/library/skills/scene-hierarchy-design/SKILL.md +26 -2
  301. package/library/skills/scene-hierarchy-design/resource.yaml +1 -1
  302. package/library/skills/scene-scripting/SKILL.md +96 -636
  303. package/library/skills/scene-scripting/references/ctx-api.md +184 -0
  304. package/library/skills/scene-scripting/references/recipes-2d-ui.md +193 -0
  305. package/library/skills/scene-scripting/references/recipes-3d.md +280 -0
  306. package/library/skills/scene-scripting/resource.yaml +4 -4
  307. package/library/skills/scene-to-level/SKILL.md +24 -2
  308. package/library/skills/scene-to-level/resource.yaml +1 -1
  309. package/library/skills/skill-create/resource.yaml +1 -0
  310. package/library/skills/skill-improve/resource.yaml +1 -0
  311. package/library/skills/skill-test/SKILL.md +12 -2
  312. package/library/skills/skill-test/resource.yaml +1 -0
  313. package/library/skills/skintokens-auto-rigging/resource.yaml +1 -0
  314. package/library/skills/skybox-panorama/SKILL.md +47 -21
  315. package/library/skills/skybox-panorama/resource.yaml +1 -1
  316. package/library/skills/sound-effect/SKILL.md +52 -20
  317. package/library/skills/sound-effect/resource.yaml +1 -1
  318. package/library/skills/spatial-placement/SKILL.md +44 -9
  319. package/library/skills/spatial-placement/resource.yaml +1 -1
  320. package/library/skills/sprite-sheet/SKILL.md +55 -27
  321. package/library/skills/sprite-sheet/resource.yaml +1 -1
  322. package/library/skills/store-art/SKILL.md +14 -3
  323. package/library/skills/store-art/resource.yaml +2 -2
  324. package/library/skills/store-listing/SKILL.md +13 -3
  325. package/library/skills/store-listing/resource.yaml +2 -2
  326. package/library/skills/summer-analytics/SKILL.md +22 -5
  327. package/library/skills/summer-analytics/resource.yaml +2 -2
  328. package/library/skills/summer-apps/SKILL.md +77 -32
  329. package/library/skills/summer-apps/manifest.md +1 -1
  330. package/library/skills/summer-apps/minimal-app.md +7 -7
  331. package/library/skills/summer-apps/resource.yaml +1 -1
  332. package/library/skills/summer-apps/sdk-reference.md +5 -5
  333. package/library/skills/summer-apps-design/SKILL.md +1 -1
  334. package/library/skills/summer-apps-design/resource.yaml +1 -1
  335. package/library/skills/summer-assets/SKILL.md +86 -0
  336. package/library/skills/summer-assets/resource.yaml +34 -0
  337. package/library/skills/summer-cli/SKILL.md +133 -0
  338. package/library/skills/summer-cli/resource.yaml +31 -0
  339. package/library/skills/summer-friends/SKILL.md +14 -0
  340. package/library/skills/summer-leaderboards/SKILL.md +16 -0
  341. package/library/skills/summer-match-results/SKILL.md +17 -0
  342. package/library/skills/summer-matchmaking/SKILL.md +17 -0
  343. package/library/skills/summer-parties/SKILL.md +14 -0
  344. package/library/skills/summer-player-data/SKILL.md +14 -0
  345. package/library/skills/summer-store/SKILL.md +16 -1
  346. package/library/skills/summer-world-chat/SKILL.md +14 -0
  347. package/library/skills/summer-world-saves/SKILL.md +14 -0
  348. package/library/skills/text-to-motion/SKILL.md +45 -23
  349. package/library/skills/text-to-motion/prompts-and-controls.md +5 -5
  350. package/library/skills/text-to-motion/resource.yaml +1 -1
  351. package/library/skills/text-to-motion/rigging-for-text-motion.md +2 -2
  352. package/library/skills/tileable-texture/SKILL.md +37 -15
  353. package/library/skills/tileable-texture/resource.yaml +1 -1
  354. package/library/skills/trailer-shot/SKILL.md +46 -24
  355. package/library/skills/trailer-shot/resource.yaml +1 -1
  356. package/library/skills/tune-performance/SKILL.md +32 -6
  357. package/library/skills/tune-performance/resource.yaml +1 -1
  358. package/library/skills/ui-basics/SKILL.md +55 -36
  359. package/library/skills/ui-basics/resource.yaml +1 -1
  360. package/library/skills/ui-graphics/SKILL.md +64 -38
  361. package/library/skills/ui-graphics/resource.yaml +1 -1
  362. package/library/skills/use-widget-asset/SKILL.md +15 -1
  363. package/library/skills/use-widget-asset/resource.yaml +1 -1
  364. package/library/skills/using-summer/SKILL.md +32 -5
  365. package/library/skills/using-summer/resource.yaml +3 -2
  366. package/library/skills/vehicle-model/SKILL.md +92 -57
  367. package/library/skills/vehicle-model/resource.yaml +1 -1
  368. package/library/skills/verification-before-completion/SKILL.md +1 -1
  369. package/library/skills/verification-before-completion/resource.yaml +1 -1
  370. package/library/skills/verifying-scenes/SKILL.md +31 -2
  371. package/library/skills/verifying-scenes/resource.yaml +1 -1
  372. package/library/skills/vfx-dissolve/SKILL.md +21 -2
  373. package/library/skills/vfx-dissolve/resource.yaml +1 -1
  374. package/library/skills/vfx-fire/SKILL.md +41 -41
  375. package/library/skills/vfx-fire/resource.yaml +1 -1
  376. package/library/skills/vfx-hit-spark/SKILL.md +24 -1
  377. package/library/skills/vfx-hit-spark/resource.yaml +1 -1
  378. package/library/skills/vfx-lightning/SKILL.md +30 -16
  379. package/library/skills/vfx-lightning/resource.yaml +1 -1
  380. package/library/skills/vfx-magic-glow/SKILL.md +46 -32
  381. package/library/skills/vfx-magic-glow/resource.yaml +1 -1
  382. package/library/skills/vfx-muzzle-flash/SKILL.md +43 -35
  383. package/library/skills/vfx-muzzle-flash/resource.yaml +1 -1
  384. package/library/skills/vfx-smoke/SKILL.md +39 -31
  385. package/library/skills/vfx-smoke/resource.yaml +1 -1
  386. package/library/skills/vfx-water-ripple/SKILL.md +35 -31
  387. package/library/skills/vfx-water-ripple/resource.yaml +1 -1
  388. package/library/skills/voice-line/SKILL.md +87 -40
  389. package/library/skills/voice-line/resource.yaml +1 -1
  390. package/library/skills/web-and-touch-input/SKILL.md +20 -1
  391. package/library/skills/web-and-touch-input/resource.yaml +1 -1
  392. package/library/skills/web-compatibility-look/SKILL.md +21 -1
  393. package/library/skills/web-compatibility-look/resource.yaml +1 -1
  394. package/library/skills/world-building-3d/SKILL.md +29 -1
  395. package/library/skills/world-building-3d/resource.yaml +1 -1
  396. package/library/skills/writing-skills/resource.yaml +1 -0
  397. package/library/tools/add-node/GUIDE.md +14 -0
  398. package/library/tools/align-distribute-3d/GUIDE.md +7 -0
  399. package/library/tools/app-call/resource.yaml +1 -1
  400. package/library/tools/app-guide/resource.yaml +2 -2
  401. package/library/tools/app-page/resource.yaml +1 -1
  402. package/library/tools/app-screenshot/resource.yaml +19 -1
  403. package/library/tools/app-tools/resource.yaml +1 -1
  404. package/library/tools/attach-to-surface/GUIDE.md +15 -0
  405. package/library/tools/batch/GUIDE.md +27 -0
  406. package/library/tools/camera-bookmark/GUIDE.md +12 -0
  407. package/library/tools/capture-gameplay/GUIDE.md +3 -0
  408. package/library/tools/capture-gameplay/resource.yaml +3 -3
  409. package/library/tools/check-job/resource.yaml +1 -1
  410. package/library/tools/clear-console/GUIDE.md +3 -0
  411. package/library/tools/connect-ports/GUIDE.md +9 -0
  412. package/library/tools/connect-signal/GUIDE.md +14 -0
  413. package/library/tools/create-debug-report/GUIDE.md +10 -0
  414. package/library/tools/create-scene/GUIDE.md +10 -0
  415. package/library/tools/debug-views/GUIDE.md +7 -0
  416. package/library/tools/enable-plugin/GUIDE.md +3 -0
  417. package/library/tools/export-game/GUIDE.md +3 -0
  418. package/library/tools/export-game/resource.yaml +3 -3
  419. package/library/tools/export-templates/GUIDE.md +3 -0
  420. package/library/tools/fabricate-3d/GUIDE.md +19 -0
  421. package/library/tools/frame-nodes/GUIDE.md +9 -0
  422. package/library/tools/frame-shot/GUIDE.md +9 -0
  423. package/library/tools/game-control/GUIDE.md +9 -0
  424. package/library/tools/game-input/GUIDE.md +9 -0
  425. package/library/tools/game-probe/GUIDE.md +9 -0
  426. package/library/tools/generate-3d/resource.yaml +3 -3
  427. package/library/tools/generate-motion/resource.yaml +2 -2
  428. package/library/tools/get-console/GUIDE.md +9 -0
  429. package/library/tools/get-console/resource.yaml +5 -0
  430. package/library/tools/get-debugger-errors/GUIDE.md +7 -0
  431. package/library/tools/get-debugger-errors/resource.yaml +5 -0
  432. package/library/tools/get-debugger-warnings/GUIDE.md +7 -0
  433. package/library/tools/get-debugger-warnings/resource.yaml +5 -0
  434. package/library/tools/get-diagnostics/GUIDE.md +13 -0
  435. package/library/tools/get-project-context/GUIDE.md +25 -0
  436. package/library/tools/get-runtime-tree/GUIDE.md +7 -0
  437. package/library/tools/get-runtime-tree/resource.yaml +5 -0
  438. package/library/tools/get-scene-tree/GUIDE.md +11 -0
  439. package/library/tools/get-scene-tree/resource.yaml +5 -0
  440. package/library/tools/get-script-errors/GUIDE.md +5 -0
  441. package/library/tools/grep/GUIDE.md +11 -0
  442. package/library/tools/import-asset/GUIDE.md +8 -0
  443. package/library/tools/import-asset-by-id/GUIDE.md +12 -0
  444. package/library/tools/import-from-url/GUIDE.md +10 -0
  445. package/library/tools/import-from-url-batch/GUIDE.md +3 -0
  446. package/library/tools/import-hdri/GUIDE.md +16 -0
  447. package/library/tools/input-map-bind/GUIDE.md +11 -0
  448. package/library/tools/inspect-asset/GUIDE.md +14 -0
  449. package/library/tools/inspect-asset/resource.yaml +5 -0
  450. package/library/tools/inspect-node/GUIDE.md +11 -0
  451. package/library/tools/inspect-node/resource.yaml +5 -0
  452. package/library/tools/inspect-resource/GUIDE.md +7 -0
  453. package/library/tools/inspect-resource/resource.yaml +5 -0
  454. package/library/tools/inspect-runtime-node/GUIDE.md +7 -0
  455. package/library/tools/inspect-runtime-node/resource.yaml +5 -0
  456. package/library/tools/instantiate-scene/GUIDE.md +12 -0
  457. package/library/tools/is-running/GUIDE.md +3 -0
  458. package/library/tools/measure/GUIDE.md +8 -0
  459. package/library/tools/navigation-probe/GUIDE.md +9 -0
  460. package/library/tools/open/resource.yaml +2 -2
  461. package/library/tools/open-main-scene/GUIDE.md +6 -0
  462. package/library/tools/open-scene/GUIDE.md +8 -0
  463. package/library/tools/place-adjacent/GUIDE.md +7 -0
  464. package/library/tools/play/GUIDE.md +13 -0
  465. package/library/tools/project-setting/GUIDE.md +9 -0
  466. package/library/tools/publish-build/resource.yaml +6 -6
  467. package/library/tools/raycast/GUIDE.md +7 -0
  468. package/library/tools/read-file/GUIDE.md +10 -0
  469. package/library/tools/read-library/resource.yaml +5 -0
  470. package/library/tools/recent-events/GUIDE.md +7 -0
  471. package/library/tools/remove-node/GUIDE.md +3 -0
  472. package/library/tools/repeat-along/GUIDE.md +5 -0
  473. package/library/tools/replace-node/GUIDE.md +9 -0
  474. package/library/tools/replace-text/GUIDE.md +5 -0
  475. package/library/tools/run-editor-script/GUIDE.md +16 -0
  476. package/library/tools/run-script/GUIDE.md +30 -0
  477. package/library/tools/run-script/resource.yaml +6 -3
  478. package/library/tools/runtime-animate/GUIDE.md +7 -0
  479. package/library/tools/runtime-call/GUIDE.md +7 -0
  480. package/library/tools/runtime-set/GUIDE.md +9 -0
  481. package/library/tools/runtime-spawn/GUIDE.md +9 -0
  482. package/library/tools/save-scene/GUIDE.md +3 -0
  483. package/library/tools/scene-audit/GUIDE.md +29 -0
  484. package/library/tools/screenshot/GUIDE.md +17 -0
  485. package/library/tools/select-node/GUIDE.md +3 -0
  486. package/library/tools/set-prop/GUIDE.md +23 -0
  487. package/library/tools/set-resource-property/GUIDE.md +8 -0
  488. package/library/tools/shot-sheet/GUIDE.md +7 -0
  489. package/library/tools/snap-to-surface/GUIDE.md +17 -0
  490. package/library/tools/snapshot-diff/GUIDE.md +7 -0
  491. package/library/tools/starcast/GUIDE.md +12 -0
  492. package/library/tools/stop/GUIDE.md +3 -0
  493. package/library/tools/test-placement/GUIDE.md +7 -0
  494. package/library/tools/ui-actions/GUIDE.md +12 -0
  495. package/library/tools/ui-activate/GUIDE.md +11 -0
  496. package/library/tools/ui-screenshot/GUIDE.md +9 -0
  497. package/library/tools/ui-tree/GUIDE.md +10 -0
  498. package/library/tools/wait-for-event/GUIDE.md +11 -0
  499. package/library/tools/world-snapshot/GUIDE.md +9 -0
  500. package/library/tools/write-file/GUIDE.md +5 -0
  501. package/library/tools/zoom/GUIDE.md +5 -0
  502. package/package.json +8 -5
  503. package/registry/generated/counts.json +2 -2
  504. package/registry/generated/gemini-extension.json +6 -13
  505. package/registry/generated/index.json +482 -349
  506. package/registry/generated/marketplace.claude.json +2 -13
  507. package/registry/generated/plugin.claude-directory.json +168 -0
  508. package/registry/generated/plugin.claude.json +24 -22
  509. package/registry/generated/plugin.codex.json +18 -22
  510. package/registry/generated/plugin.cursor.json +8 -14
  511. package/registry/generated/plugin.factory.json +6 -13
  512. package/registry/generated/server.json +43 -0
  513. package/registry/generated/skills-index.md +121 -118
  514. package/registry/generated/skills-registry.json +167 -115
  515. package/registry/operations/fixtures/invalid-deprecated-without-replacement.json +60 -0
  516. package/registry/operations/fixtures/invalid-name.json +60 -0
  517. package/registry/operations/fixtures/invalid-publish-without-owner.json +82 -0
  518. package/registry/operations/fixtures/invalid-spend-without-estimate.json +42 -0
  519. package/registry/operations/fixtures/invalid-unknown-field.json +61 -0
  520. package/registry/operations/fixtures/valid-player-facing.json +82 -0
  521. package/registry/operations/fixtures/valid-read.json +60 -0
  522. package/registry/operations/fixtures/valid-spend.json +43 -0
  523. package/registry/operations/legacy-names.json +1241 -0
  524. package/registry/operations/public-catalog.json +33160 -0
  525. package/registry/schemas/operation.schema.json +318 -0
  526. package/registry/schemas/skill.schema.json +4 -0
  527. package/CLAUDE.md +0 -7
@@ -54,7 +54,8 @@ function appData(ctx) {
54
54
  return ctx.env.APPDATA ?? join(ctx.home, "AppData", "Roaming");
55
55
  }
56
56
  function xdgConfig(ctx) {
57
- return ctx.env.XDG_CONFIG_HOME ?? join(ctx.home, ".config");
57
+ // An empty XDG_CONFIG_HOME counts as unset (XDG Base Directory spec).
58
+ return ctx.env.XDG_CONFIG_HOME || join(ctx.home, ".config");
58
59
  }
59
60
  /** ~/.config on Linux, %APPDATA% on Windows, ~/Library/Application Support on macOS. */
60
61
  function appConfigRoot(ctx) {
@@ -130,7 +131,7 @@ const SPECS = [
130
131
  },
131
132
  restart: "Quit and reopen Claude Desktop; the summer-engine tools appear under the tools menu in a new chat.",
132
133
  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.",
134
+ 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
135
  },
135
136
  {
136
137
  id: "codex",
@@ -144,7 +145,8 @@ const SPECS = [
144
145
  signIn: (name) => `In Codex, run /mcp login ${name} (or \`codex mcp login ${name}\` in a terminal) and sign in.`,
145
146
  },
146
147
  mcp: {
147
- user: home(".codex", "config.toml"),
148
+ // Codex reads its config from $CODEX_HOME (default ~/.codex).
149
+ user: (ctx) => join(ctx.env.CODEX_HOME || join(ctx.home, ".codex"), "config.toml"),
148
150
  project: project(".codex", "config.toml"),
149
151
  projectNote: "Codex only loads project .codex/config.toml from trusted projects.",
150
152
  },
@@ -182,8 +184,10 @@ const SPECS = [
182
184
  signIn: (name) => `Devin Desktop opens summer.games in your browser the first time ${name} connects; sign in there.`,
183
185
  },
184
186
  mcp: {
185
- user: home(".codeium", "windsurf", "mcp_config.json"),
187
+ // docs.devin.ai/desktop/cascade/mcp (2026-10-16): ~/.config/devin (or $XDG_CONFIG_HOME/devin), %APPDATA%\devin on Windows.
188
+ user: (ctx) => join(xdgOrAppData(ctx), "devin", "mcp_config.json"),
186
189
  project: null,
190
+ movedFrom: home(".codeium", "windsurf", "mcp_config.json"),
187
191
  },
188
192
  restart: "Restart Devin Desktop (formerly Windsurf) and refresh MCP servers from the agent settings. Devin's docs say mcp_config.json configures the Cascade agent; for the Devin agent add the server in the app's MCP settings with the same command.",
189
193
  skills: sharedSkills({ legacyDirs: { user: home(".codeium", "windsurf", "skills"), project: project(".windsurf", "skills") } }),
@@ -316,6 +320,8 @@ const SPECS = [
316
320
  status: "active",
317
321
  envOverride: "SUMMER_VSCODE_COPILOT_CONFIG_FILE",
318
322
  format: "json-vscode",
323
+ // VS Code Copilot sends at most 128 tools per request; the full surface is over that.
324
+ mcpProfile: "engine",
319
325
  remoteMcp: {
320
326
  entry: (url) => ({ type: "http", url }),
321
327
  signIn: (name) => `In VS Code, click Allow when ${name} asks to authenticate, then sign in on summer.games.`,
@@ -335,7 +341,7 @@ const SPECS = [
335
341
  mcp: { user: home(".mcp.json"), project: project(".mcp.json") },
336
342
  restart: "Restart Visual Studio, open Copilot Chat in Agent mode, and enable summer-engine in the tools picker.",
337
343
  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.",
344
+ 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
345
  },
340
346
  {
341
347
  id: "copilot-jetbrains",
@@ -354,7 +360,7 @@ const SPECS = [
354
360
  },
355
361
  restart: "Restart the JetBrains IDE and open Copilot Chat in Agent mode; summer-engine shows in the tools list.",
356
362
  skills: null,
357
- noSkillsNote: "Copilot in JetBrains documents no skills folder; the MCP server ships summer_get_agent_playbook for in-chat guidance.",
363
+ noSkillsNote: "Copilot in JetBrains documents no skills folder; the MCP server ships summer_docs_search and summer_docs_read for in-chat guidance.",
358
364
  },
359
365
  {
360
366
  id: "opencode",
@@ -476,7 +482,7 @@ const SPECS = [
476
482
  },
477
483
  restart: "Restart Trae and open the MCP settings; summer-engine should show as connected.",
478
484
  skills: null,
479
- noSkillsNote: "Trae documents no skills folder; the MCP server ships summer_get_agent_playbook for in-chat guidance.",
485
+ noSkillsNote: "Trae documents no skills folder; the MCP server ships summer_docs_search and summer_docs_read for in-chat guidance.",
480
486
  },
481
487
  {
482
488
  id: "qwen-code",
@@ -570,7 +576,7 @@ const SPECS = [
570
576
  mcp: { user: home(".junie", "mcp", "mcp.json"), project: project(".junie", "mcp", "mcp.json") },
571
577
  restart: "Restart the JetBrains IDE so Junie reloads its MCP config.",
572
578
  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.",
579
+ 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
580
  },
575
581
  {
576
582
  id: "warp",
@@ -652,7 +658,7 @@ const SPECS = [
652
658
  mcp: { user: home(".lmstudio", "mcp.json"), project: null },
653
659
  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
660
  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.",
661
+ 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
662
  },
657
663
  ];
658
664
  const BY_ID = new Map(SPECS.map((spec) => [spec.id, spec]));
@@ -682,6 +688,24 @@ export function agentAliasMap() {
682
688
  }
683
689
  return map;
684
690
  }
691
+ /**
692
+ * Why `summer setup <agent> --cli` cannot set this agent up, or null. --cli
693
+ * installs the skills and no MCP server, so the agent needs a skills folder,
694
+ * and one that takes SKILL.md files: rule files (Roo Code) and the Gemini
695
+ * extension assume the MCP tools.
696
+ */
697
+ export function cliSetupRefusal(spec) {
698
+ if (!spec.skills) {
699
+ return `${spec.label} has no skills folder, so --cli has nothing to install. Run summer setup ${spec.id} without --cli for the MCP server.`;
700
+ }
701
+ if (spec.format === "json-gemini") {
702
+ return `Gemini CLI loads Summer's skills only through its extension, which runs the MCP server. Run summer setup ${spec.id} without --cli, or use antigravity.`;
703
+ }
704
+ if (spec.skills.kind !== "skill-dir" && spec.skills.kind !== "opencode-skill-dir") {
705
+ return `${spec.label} gets Summer's skills as rule files that tell it to use the MCP tools. Run summer setup ${spec.id} without --cli.`;
706
+ }
707
+ return null;
708
+ }
685
709
  export function agentLabel(id) {
686
710
  return agentSpec(id).label;
687
711
  }
@@ -0,0 +1,65 @@
1
+ import type { PathContext, SupportedAgent } from "./agent-table.js";
2
+ /**
3
+ * Allow rules for the CLI path, added only with `summer setup <agent> --cli
4
+ * --allow-rules --yes` (the flag is in the command the person approves), so
5
+ * the agent's read-only and dry-run summer commands do not each ask:
6
+ *
7
+ * - the reads in AUTO_ALLOWED_READS, as they are. The list is reviewed by
8
+ * hand: a new read operation in the catalog does not join it, and
9
+ * cli-permissions.test.ts fails until someone adds it on purpose;
10
+ * - every spend (generation and the rest) only as a dry run, `--dry-run`
11
+ * right after the action. A call with that flag is a dry run whatever else
12
+ * it says (parseCallFlags), so the rule cannot let a real spend through.
13
+ *
14
+ * Changes, publishing, prices, deletes and messages keep asking. Claude Code
15
+ * matches the command text (`Bash(summer jobs wait *)` matches the bare
16
+ * command and `summer jobs wait --job-id x`, not `summer jobs waitx`); Codex
17
+ * matches argument lists, in a rules file of Summer's own. Both get the
18
+ * `summer` and the `npx -y summer-engine@latest` forms.
19
+ */
20
+ /**
21
+ * Reads that run without asking. Each one reads Summer data or the open
22
+ * editor's state; `jobs wait` and `assets get` also save the files a finished
23
+ * job names (media files only, never over an existing file). Left out on
24
+ * purpose: `engine capture-gameplay` (it starts Summer Engine on a project, so
25
+ * the project's own code runs, and writes to any --out folder) and
26
+ * `studio open` (it opens a page in the browser).
27
+ */
28
+ export declare const AUTO_ALLOWED_READS: readonly string[];
29
+ export type CliCommand = {
30
+ words: string[];
31
+ dryRun: boolean;
32
+ };
33
+ /** The commands allowed without asking: `summer status`, the reviewed reads, and a dry run of every spend in the catalog. */
34
+ export declare function allowedCliCommands(): CliCommand[];
35
+ export declare const LAUNCHERS: ReadonlyArray<readonly string[]>;
36
+ /** Claude Code `permissions.allow` rules, for both launchers. */
37
+ export declare function claudeAllowRules(): string[];
38
+ /** Codex rules: one prefix_rule per launcher, area and kind, the actions as a union. */
39
+ export declare function codexRules(): string;
40
+ export interface AllowRulesResult {
41
+ agent: SupportedAgent;
42
+ path: string;
43
+ /** Every rule Summer wants there (Codex: its patterns); empty for a removal. */
44
+ rules: string[];
45
+ /** What this run added, or removed with --remove-allow-rules. */
46
+ changed: string[];
47
+ wrote: boolean;
48
+ }
49
+ /** The agents with clean per-command allow rules: Claude Code (settings.json) and Codex (rules files). */
50
+ export declare function supportsAllowRules(agent: SupportedAgent): boolean;
51
+ /**
52
+ * Where the rules go. Claude Code: the user's settings, or with --scope
53
+ * project the project's personal settings.local.json (never the shared file).
54
+ * Codex: always the user's rules folder; a project's .codex/rules is shared
55
+ * through git, so Summer does not write there.
56
+ */
57
+ export declare function allowRulesPath(agent: SupportedAgent, scope: "user" | "project", ctx: PathContext): string;
58
+ /**
59
+ * Add the allow rules. Claude Code: merged into `permissions.allow`, nothing
60
+ * removed, every other setting kept. Codex: Summer's own rules file,
61
+ * rewritten. Writes nothing unless `write`.
62
+ */
63
+ export declare function addAllowRules(agent: SupportedAgent, path: string, write: boolean): Promise<AllowRulesResult>;
64
+ /** Remove exactly the rules Summer adds (Claude Code), or Summer's own rules file (Codex). Writes nothing unless `write`. */
65
+ export declare function removeAllowRules(agent: SupportedAgent, path: string, write: boolean): Promise<AllowRulesResult>;
@@ -0,0 +1,182 @@
1
+ import { existsSync } from "node:fs";
2
+ import { chmod, mkdir, readFile, realpath, rename, rm, stat, writeFile } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import { CLI_AREAS } from "../core/ops/areas.js";
5
+ import { localEntries } from "../core/ops/catalog.js";
6
+ import { shippedCloudEntries } from "../core/ops/public-catalog.js";
7
+ /**
8
+ * Allow rules for the CLI path, added only with `summer setup <agent> --cli
9
+ * --allow-rules --yes` (the flag is in the command the person approves), so
10
+ * the agent's read-only and dry-run summer commands do not each ask:
11
+ *
12
+ * - the reads in AUTO_ALLOWED_READS, as they are. The list is reviewed by
13
+ * hand: a new read operation in the catalog does not join it, and
14
+ * cli-permissions.test.ts fails until someone adds it on purpose;
15
+ * - every spend (generation and the rest) only as a dry run, `--dry-run`
16
+ * right after the action. A call with that flag is a dry run whatever else
17
+ * it says (parseCallFlags), so the rule cannot let a real spend through.
18
+ *
19
+ * Changes, publishing, prices, deletes and messages keep asking. Claude Code
20
+ * matches the command text (`Bash(summer jobs wait *)` matches the bare
21
+ * command and `summer jobs wait --job-id x`, not `summer jobs waitx`); Codex
22
+ * matches argument lists, in a rules file of Summer's own. Both get the
23
+ * `summer` and the `npx -y summer-engine@latest` forms.
24
+ */
25
+ /**
26
+ * Reads that run without asking. Each one reads Summer data or the open
27
+ * editor's state; `jobs wait` and `assets get` also save the files a finished
28
+ * job names (media files only, never over an existing file). Left out on
29
+ * purpose: `engine capture-gameplay` (it starts Summer Engine on a project, so
30
+ * the project's own code runs, and writes to any --out folder) and
31
+ * `studio open` (it opens a page in the browser).
32
+ */
33
+ export const AUTO_ALLOWED_READS = [
34
+ "whoami", "ops.search", "ops.describe",
35
+ "docs.search", "docs.read", "docs.engine_api", "docs.plan",
36
+ "jobs.get", "jobs.list", "jobs.wait",
37
+ "account.permissions", "profile.get", "team.list", "chats.list", "plugins.search",
38
+ "games.get", "games.list", "games.members", "jams.list", "pricing.get",
39
+ "store.get_listing", "store.status", "experiments.list", "experiments.results",
40
+ "analytics.event_limit", "analytics.events", "analytics.funnel", "analytics.overview", "analytics.summary", "analytics.trend",
41
+ "assets.choices", "assets.get", "assets.get_icon_collection", "assets.get_pack", "assets.list_comments", "assets.list_folders", "assets.list_icon_collections", "assets.search",
42
+ "apps.events", "apps.get", "apps.guide", "apps.list", "apps.page", "apps.read_data", "apps.screenshot", "apps.tools",
43
+ "plans.changes", "plans.chat", "plans.directions", "plans.get", "plans.links", "plans.list", "plans.presence", "plans.show",
44
+ "projects.builds", "projects.get", "projects.list", "projects.open_in_engine", "projects.preview_build",
45
+ "stories.get", "stories.list", "studio.map", "studio.page", "studio.read_form",
46
+ "marketing.applications", "marketing.content_feed", "marketing.content_videos", "marketing.get_brand_pack", "marketing.list_content_games",
47
+ "engine.debug_views", "engine.game_probe", "engine.get_console", "engine.get_debugger_errors", "engine.get_debugger_warnings", "engine.get_diagnostics",
48
+ "engine.get_project_context", "engine.get_runtime_tree", "engine.get_scene_tree", "engine.get_script_errors", "engine.grep", "engine.inspect_asset",
49
+ "engine.inspect_node", "engine.inspect_resource", "engine.inspect_runtime_node", "engine.is_running", "engine.list_camera_bookmarks", "engine.list_ui_actions",
50
+ "engine.measure", "engine.navigation_probe", "engine.raycast", "engine.read_file", "engine.recent_events", "engine.scene_audit", "engine.screenshot",
51
+ "engine.shot_sheet", "engine.snapshot_diff", "engine.starcast", "engine.test_placement", "engine.ui_screenshot", "engine.ui_tree", "engine.wait_for_event",
52
+ "engine.world_snapshot", "engine.zoom",
53
+ ];
54
+ /** The shell words of a command, after the launcher: `assets.generate_image` -> `assets generate-image`. */
55
+ const wordsOf = (op) => (op.includes(".") ? [op.split(".")[0], op.split(".")[1].replace(/_/g, "-")] : [op]);
56
+ /** The commands allowed without asking: `summer status`, the reviewed reads, and a dry run of every spend in the catalog. */
57
+ export function allowedCliCommands() {
58
+ const known = new Map([...localEntries(), ...shippedCloudEntries()].map((entry) => [entry.name, entry]));
59
+ const reads = AUTO_ALLOWED_READS.filter((op) => known.get(op)?.effect === "read").map((op) => ({ words: wordsOf(op), dryRun: false }));
60
+ const areas = new Set(CLI_AREAS);
61
+ const spends = [...known.values()]
62
+ .filter((entry) => entry.effect === "spend" && entry.status !== "deprecated" && areas.has(entry.name.split(".")[0]))
63
+ .map((entry) => ({ words: wordsOf(entry.name), dryRun: true }));
64
+ return [{ words: ["status"], dryRun: false }, ...reads, ...spends].sort((a, b) => a.words.join(" ").localeCompare(b.words.join(" ")) || Number(a.dryRun) - Number(b.dryRun));
65
+ }
66
+ export const LAUNCHERS = [["summer"], ["npx", "-y", "summer-engine@latest"]];
67
+ /** Claude Code `permissions.allow` rules, for both launchers. */
68
+ export function claudeAllowRules() {
69
+ return LAUNCHERS.flatMap((launcher) => allowedCliCommands().map(({ words, dryRun }) => `Bash(${[...launcher, ...words, ...(dryRun ? ["--dry-run"] : [])].join(" ")} *)`));
70
+ }
71
+ const starlark = (value) => (typeof value === "string" ? JSON.stringify(value) : `[${value.map((item) => JSON.stringify(item)).join(", ")}]`);
72
+ const CODEX_HEADER = "# Written by summer setup codex --cli --allow-rules; setup rewrites this file and --remove-allow-rules deletes it.";
73
+ /** Codex rules: one prefix_rule per launcher, area and kind, the actions as a union. */
74
+ export function codexRules() {
75
+ const groups = new Map();
76
+ for (const launcher of LAUNCHERS) {
77
+ for (const { words, dryRun } of allowedCliCommands()) {
78
+ const head = words.length > 1 ? words.slice(0, 1) : [];
79
+ const key = `${launcher.join(" ")}|${head.join(" ")}|${dryRun}`;
80
+ const group = groups.get(key) ?? { launcher, head, actions: [], dryRun };
81
+ group.actions.push(words[words.length - 1]);
82
+ groups.set(key, group);
83
+ }
84
+ }
85
+ const rules = [...groups.values()].map(({ launcher, head, actions, dryRun }) => {
86
+ const pattern = [...launcher.map(starlark), ...head.map(starlark), starlark(actions.length === 1 ? actions[0] : actions), ...(dryRun ? [starlark("--dry-run")] : [])];
87
+ const example = [...launcher, ...head, actions[0], ...(dryRun ? ["--dry-run"] : [])].join(" ");
88
+ const why = dryRun ? "Summer dry run: checks the input, spends nothing" : "Summer read: changes no Summer data; jobs wait and assets get save the files they name";
89
+ return `prefix_rule(\n pattern = [${pattern.join(", ")}],\n decision = "allow",\n justification = ${starlark(why)},\n match = [${starlark(example)}],\n)`;
90
+ });
91
+ return `${CODEX_HEADER}\n# Reads, and spends only as dry runs. Changes, publishing, deletes and messages still ask.\n\n${rules.join("\n\n")}\n`;
92
+ }
93
+ /** The agents with clean per-command allow rules: Claude Code (settings.json) and Codex (rules files). */
94
+ export function supportsAllowRules(agent) {
95
+ return agent === "claude-code" || agent === "codex";
96
+ }
97
+ /**
98
+ * Where the rules go. Claude Code: the user's settings, or with --scope
99
+ * project the project's personal settings.local.json (never the shared file).
100
+ * Codex: always the user's rules folder; a project's .codex/rules is shared
101
+ * through git, so Summer does not write there.
102
+ */
103
+ export function allowRulesPath(agent, scope, ctx) {
104
+ if (agent === "codex")
105
+ return ctx.env.SUMMER_CODEX_RULES_FILE || join(ctx.env.CODEX_HOME || join(ctx.home, ".codex"), "rules", "summer.rules");
106
+ return ctx.env.SUMMER_CLAUDE_SETTINGS_FILE || (scope === "project" ? join(ctx.cwd, ".claude", "settings.local.json") : join(ctx.home, ".claude", "settings.json"));
107
+ }
108
+ /**
109
+ * Write next to the file, then rename over it, so Claude Code never reads
110
+ * half a file. A symlinked settings file (a dotfiles repo) is written through
111
+ * the link, in its real folder, and keeps its mode.
112
+ */
113
+ async function writeAtomically(path, text) {
114
+ const target = existsSync(path) ? await realpath(path) : path;
115
+ await mkdir(dirname(target), { recursive: true });
116
+ const mode = existsSync(target) ? (await stat(target)).mode & 0o7777 : undefined;
117
+ const temp = `${target}.summer-${process.pid}.tmp`;
118
+ await writeFile(temp, text, mode === undefined ? {} : { mode });
119
+ if (mode !== undefined)
120
+ await chmod(temp, mode);
121
+ await rename(temp, target);
122
+ }
123
+ async function readClaudeSettings(path) {
124
+ let settings = {};
125
+ if (existsSync(path)) {
126
+ try {
127
+ settings = JSON.parse(await readFile(path, "utf8"));
128
+ }
129
+ catch {
130
+ throw new Error(`${path} is not valid JSON, so Summer left its allow rules alone. Fix the file, then run setup again.`);
131
+ }
132
+ }
133
+ if (!settings || typeof settings !== "object" || Array.isArray(settings))
134
+ throw new Error(`${path} is not a JSON object, so Summer left its allow rules alone.`);
135
+ const record = settings;
136
+ const permissions = record.permissions ?? {};
137
+ if (!permissions || typeof permissions !== "object" || Array.isArray(permissions))
138
+ throw new Error(`${path}: permissions is not an object, so Summer left its allow rules alone.`);
139
+ const allow = permissions.allow ?? [];
140
+ if (!Array.isArray(allow))
141
+ throw new Error(`${path}: permissions.allow is not a list, so Summer left its allow rules alone.`);
142
+ return { settings: record, permissions: permissions, allow };
143
+ }
144
+ /**
145
+ * Add the allow rules. Claude Code: merged into `permissions.allow`, nothing
146
+ * removed, every other setting kept. Codex: Summer's own rules file,
147
+ * rewritten. Writes nothing unless `write`.
148
+ */
149
+ export async function addAllowRules(agent, path, write) {
150
+ if (agent === "codex") {
151
+ const text = codexRules();
152
+ const rules = text.split("\n").filter((line) => line.startsWith(" pattern = ")).map((line) => line.trim());
153
+ const changed = (existsSync(path) ? await readFile(path, "utf8") : "") !== text;
154
+ if (write && changed)
155
+ await writeAtomically(path, text);
156
+ return { agent, path, rules, changed: changed ? rules : [], wrote: write && changed };
157
+ }
158
+ const rules = claudeAllowRules();
159
+ const { settings, permissions, allow } = await readClaudeSettings(path);
160
+ const added = rules.filter((rule) => !allow.includes(rule));
161
+ if (write && added.length > 0)
162
+ await writeAtomically(path, `${JSON.stringify({ ...settings, permissions: { ...permissions, allow: [...allow, ...added] } }, null, 2)}\n`);
163
+ return { agent, path, rules, changed: added, wrote: write && added.length > 0 };
164
+ }
165
+ /** Remove exactly the rules Summer adds (Claude Code), or Summer's own rules file (Codex). Writes nothing unless `write`. */
166
+ export async function removeAllowRules(agent, path, write) {
167
+ if (agent === "codex") {
168
+ const ours = existsSync(path) && (await readFile(path, "utf8")).startsWith("# Written by summer setup codex");
169
+ if (write && ours)
170
+ await rm(path);
171
+ return { agent, path, rules: [], changed: ours ? [path] : [], wrote: write && ours };
172
+ }
173
+ if (!existsSync(path))
174
+ return { agent, path, rules: [], changed: [], wrote: false };
175
+ const ours = new Set(claudeAllowRules());
176
+ const { settings, permissions, allow } = await readClaudeSettings(path);
177
+ const removed = allow.filter((rule) => typeof rule === "string" && ours.has(rule));
178
+ if (write && removed.length > 0) {
179
+ await writeAtomically(path, `${JSON.stringify({ ...settings, permissions: { ...permissions, allow: allow.filter((rule) => !removed.includes(rule)) } }, null, 2)}\n`);
180
+ }
181
+ return { agent, path, rules: [], changed: removed, wrote: write && removed.length > 0 };
182
+ }
@@ -36,6 +36,10 @@ 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;
41
+ /** false: no Claude Code slash commands (`setup --cli`; they start work through the MCP tools). */
42
+ commands?: boolean;
39
43
  }
40
44
  /**
41
45
  * The preview clause of the setup summary — one wording for the result message
@@ -37,11 +37,14 @@ 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,
47
+ commands: options.commands !== false,
45
48
  });
46
49
  if (!invocation) {
47
50
  return {
@@ -49,14 +52,15 @@ export function setupSkills(agent, options) {
49
52
  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
53
  };
51
54
  }
52
- const { selected, previewIncluded, previewSkipped } = selectSkillsForBulkInstall(getSkillRegistry(), { recommended, stableOnly });
55
+ const { selected, previewIncluded, previewSkipped } = selectSkillsForBulkInstall(getSkillRegistry(), { recommended, stableOnly, assetsOnly });
53
56
  const count = selected.length;
54
57
  const note = previewNote({ previewIncluded, previewSkipped });
55
58
  const destination = isAgentClient(agent)
56
59
  ? describeInstallLocation(resolveInstallLocation(agent, scope))
57
60
  : undefined;
58
- const subset = recommended ? "recommended " : "";
61
+ const subset = assetsOnly ? "asset " : recommended ? "recommended " : "";
59
62
  if (options.dryRun || !options.yes) {
63
+ const where = destination ?? "the agent's skills directory";
60
64
  return {
61
65
  status: "planned",
62
66
  command: invocation.display,
@@ -64,7 +68,9 @@ export function setupSkills(agent, options) {
64
68
  previewIncluded,
65
69
  previewSkipped,
66
70
  destination,
67
- message: `Would install ${count} ${subset}skills${note ? ` (${note})` : ""} to ${destination ?? "the agent's skills directory"} with: ${invocation.display.join(" ")}`,
71
+ message: options.dryRun
72
+ ? `Would install ${count} ${subset}skills${note ? ` (${note})` : ""} to ${where} with: ${invocation.display.join(" ")}`
73
+ : `Not installed. Run the same setup command again with --yes to install ${count} ${subset}skills${note ? ` (${note})` : ""} to ${where}.`,
68
74
  };
69
75
  }
70
76
  const result = spawnSync(invocation.command, invocation.args, {
@@ -130,7 +136,7 @@ function skillInstallInvocation(agent, opts) {
130
136
  const baseArgs = [
131
137
  "skills",
132
138
  "install",
133
- opts.recommended ? "--recommended" : "--all",
139
+ opts.assetsOnly ? "--assets" : opts.recommended ? "--recommended" : "--all",
134
140
  "--agent",
135
141
  agent,
136
142
  "--scope",
@@ -140,6 +146,8 @@ function skillInstallInvocation(agent, opts) {
140
146
  baseArgs.push("--force");
141
147
  if (opts.stableOnly)
142
148
  baseArgs.push("--stable-only");
149
+ if (!opts.commands)
150
+ baseArgs.push("--no-commands");
143
151
  return {
144
152
  command,
145
153
  args: [...prefix, ...baseArgs],
@@ -0,0 +1,29 @@
1
+ import { type SkillRegistryEntry } from "../core/skills-registry.js";
2
+ export interface RefreshedFolder {
3
+ dir: string;
4
+ from: string;
5
+ to: string;
6
+ /** Skills replaced with this version's copy. */
7
+ updated: string[];
8
+ /** New library skills added to a full install. */
9
+ added: string[];
10
+ /** Summer's skills someone changed after install: left as they are. */
11
+ kept: string[];
12
+ }
13
+ export interface RefreshFailure {
14
+ dir: string;
15
+ skill?: string;
16
+ code: string;
17
+ }
18
+ export interface RefreshResult {
19
+ refreshed: RefreshedFolder[];
20
+ failures: RefreshFailure[];
21
+ }
22
+ /** User-scope skill folders with one folder per skill, each listed once. */
23
+ export declare function skillFolderLocations(): string[];
24
+ export declare function refreshInstalledSkills(cliVersion: string, options?: {
25
+ dirs?: string[];
26
+ registry?: readonly SkillRegistryEntry[];
27
+ }): RefreshResult;
28
+ /** The one message a person and their agent see after a refresh, or null when nothing changed. */
29
+ export declare function refreshNotice(refreshed: readonly RefreshedFolder[], failures?: readonly RefreshFailure[]): string | null;