summer-engine 2.8.2 → 3.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 (742) hide show
  1. package/.claude-plugin/marketplace.json +27 -7
  2. package/.claude-plugin/plugin.json +99 -83
  3. package/.codex-plugin/plugin.json +112 -82
  4. package/.cursor-plugin/plugin.json +119 -83
  5. package/.factory-plugin/plugin.json +100 -3
  6. package/.mcp.json +6 -1
  7. package/.opencode/INSTALL.md +7 -4
  8. package/.opencode/plugins/summer.js +31 -18
  9. package/AGENTS.md +107 -34
  10. package/CHANGELOG.md +131 -44
  11. package/CLAUDE.md +4 -2
  12. package/GEMINI.md +7 -53
  13. package/NOTICE +31 -0
  14. package/README.md +159 -391
  15. package/assets/api-docs.json.gz +0 -0
  16. package/assets/autopilot/README.md +20 -6
  17. package/assets/autopilot/autopilot.gd +80 -26
  18. package/assets/autopilot/run.sh +132 -7
  19. package/assets/navigation/web-routes.json +719 -0
  20. package/commands/gameskill.md +10 -108
  21. package/commands/summer.md +72 -4
  22. package/dist/bin/summer.js +6 -87
  23. package/dist/cli/banner.d.ts +1 -0
  24. package/dist/cli/banner.js +33 -0
  25. package/dist/{commands → cli/commands}/config.js +1 -1
  26. package/dist/cli/commands/create.d.ts +30 -0
  27. package/dist/cli/commands/create.js +212 -0
  28. package/dist/{commands → cli/commands}/debug.js +2 -2
  29. package/dist/cli/commands/doctor.d.ts +2 -0
  30. package/dist/cli/commands/doctor.js +18 -0
  31. package/dist/cli/commands/events.d.ts +57 -0
  32. package/dist/cli/commands/events.js +158 -0
  33. package/dist/cli/commands/install.d.ts +50 -0
  34. package/dist/cli/commands/install.js +447 -0
  35. package/dist/cli/commands/list.js +72 -0
  36. package/dist/{commands → cli/commands}/login.js +33 -17
  37. package/dist/{commands → cli/commands}/logout.d.ts +1 -0
  38. package/dist/cli/commands/logout.js +19 -0
  39. package/dist/{commands → cli/commands}/memory.d.ts +1 -8
  40. package/dist/{commands → cli/commands}/memory.js +20 -11
  41. package/dist/cli/commands/open.d.ts +45 -0
  42. package/dist/cli/commands/open.js +216 -0
  43. package/dist/{commands → cli/commands}/plan.js +2 -2
  44. package/dist/{commands → cli/commands}/publish.js +1 -1
  45. package/dist/{commands → cli/commands}/releases.js +1 -1
  46. package/dist/cli/commands/run.d.ts +19 -0
  47. package/dist/cli/commands/run.js +255 -0
  48. package/dist/{commands → cli/commands}/setup.js +43 -89
  49. package/dist/{commands → cli/commands}/skills.js +85 -222
  50. package/dist/{commands → cli/commands}/status.d.ts +1 -0
  51. package/dist/cli/commands/status.js +62 -0
  52. package/dist/cli/commands/tool.d.ts +11 -0
  53. package/dist/cli/commands/tool.js +121 -0
  54. package/dist/cli/index.d.ts +6 -0
  55. package/dist/cli/index.js +89 -0
  56. package/dist/cli/root-action.d.ts +7 -0
  57. package/dist/cli/root-action.js +15 -0
  58. package/dist/{lib → core}/api-client.d.ts +106 -15
  59. package/dist/{lib → core}/api-client.js +267 -75
  60. package/dist/{lib → core}/async-op-lifecycle.d.ts +3 -4
  61. package/dist/{lib → core}/async-op-lifecycle.js +3 -4
  62. package/dist/{lib → core}/auth.d.ts +14 -6
  63. package/dist/{lib → core}/auth.js +56 -40
  64. package/dist/core/capabilities/agent-playbook.d.ts +20 -0
  65. package/dist/core/capabilities/agent-playbook.js +218 -0
  66. package/dist/core/capabilities/api-docs.d.ts +36 -0
  67. package/dist/core/capabilities/api-docs.js +118 -0
  68. package/dist/core/capabilities/asset-import.d.ts +49 -0
  69. package/dist/core/capabilities/asset-import.js +134 -0
  70. package/dist/core/capabilities/camera-view.d.ts +98 -0
  71. package/dist/core/capabilities/camera-view.js +222 -0
  72. package/dist/core/capabilities/capture.d.ts +63 -0
  73. package/dist/core/capabilities/capture.js +67 -0
  74. package/dist/core/capabilities/console-read.d.ts +17 -0
  75. package/dist/core/capabilities/console-read.js +21 -0
  76. package/dist/{lib → core/capabilities}/creator.d.ts +1 -29
  77. package/dist/{lib → core/capabilities}/creator.js +14 -33
  78. package/dist/{lib → core/capabilities}/debug-report.d.ts +1 -1
  79. package/dist/{lib → core/capabilities}/debug-report.js +12 -31
  80. package/dist/{commands → core/capabilities}/doctor.d.ts +7 -2
  81. package/dist/{commands → core/capabilities}/doctor.js +47 -73
  82. package/dist/core/capabilities/engine-fallbacks.d.ts +26 -0
  83. package/dist/core/capabilities/engine-fallbacks.js +36 -0
  84. package/dist/core/capabilities/engine-ops.d.ts +33 -0
  85. package/dist/core/capabilities/engine-ops.js +145 -0
  86. package/dist/core/capabilities/engine-receipt.d.ts +53 -0
  87. package/dist/core/capabilities/engine-receipt.js +134 -0
  88. package/dist/core/capabilities/events.d.ts +200 -0
  89. package/dist/core/capabilities/events.js +383 -0
  90. package/dist/core/capabilities/fabricate-mesh.d.ts +111 -0
  91. package/dist/core/capabilities/fabricate-mesh.js +165 -0
  92. package/dist/core/capabilities/frame-quality.d.ts +71 -0
  93. package/dist/core/capabilities/frame-quality.js +449 -0
  94. package/dist/core/capabilities/game-task-plan.d.ts +66 -0
  95. package/dist/{lib → core/capabilities}/game-task-plan.js +59 -8
  96. package/dist/core/capabilities/hdri-import.d.ts +90 -0
  97. package/dist/core/capabilities/hdri-import.js +250 -0
  98. package/dist/core/capabilities/image-generation.d.ts +24 -0
  99. package/dist/core/capabilities/image-generation.js +22 -0
  100. package/dist/core/capabilities/navigation/open.d.ts +156 -0
  101. package/dist/core/capabilities/navigation/open.js +567 -0
  102. package/dist/core/capabilities/navigation/render-product-map.d.ts +1 -0
  103. package/dist/core/capabilities/navigation/render-product-map.js +84 -0
  104. package/dist/core/capabilities/navigation/targets.d.ts +87 -0
  105. package/dist/core/capabilities/navigation/targets.js +250 -0
  106. package/dist/core/capabilities/play-determinism.d.ts +35 -0
  107. package/dist/core/capabilities/play-determinism.js +86 -0
  108. package/dist/core/capabilities/project-context.d.ts +114 -0
  109. package/dist/core/capabilities/project-context.js +249 -0
  110. package/dist/core/capabilities/runtime-control.d.ts +540 -0
  111. package/dist/core/capabilities/runtime-control.js +1011 -0
  112. package/dist/core/capabilities/scene-kind.d.ts +19 -0
  113. package/dist/core/capabilities/scene-kind.js +137 -0
  114. package/dist/core/capabilities/scene-script.d.ts +38 -0
  115. package/dist/core/capabilities/scene-script.js +45 -0
  116. package/dist/core/capabilities/tool-dispatch.d.ts +42 -0
  117. package/dist/core/capabilities/tool-dispatch.js +1490 -0
  118. package/dist/core/capabilities/ui-control.d.ts +179 -0
  119. package/dist/core/capabilities/ui-control.js +423 -0
  120. package/dist/core/capabilities/variant-types.d.ts +22 -0
  121. package/dist/core/capabilities/variant-types.js +101 -0
  122. package/dist/core/capability-skew.d.ts +205 -0
  123. package/dist/core/capability-skew.js +386 -0
  124. package/dist/{lib → core}/config.d.ts +11 -1
  125. package/dist/{lib → core}/config.js +13 -2
  126. package/dist/core/embeddings.d.ts +78 -0
  127. package/dist/core/embeddings.js +166 -0
  128. package/dist/core/engine-install.d.ts +105 -0
  129. package/dist/core/engine-install.js +190 -0
  130. package/dist/core/engine.d.ts +94 -0
  131. package/dist/{lib → core}/engine.js +74 -28
  132. package/dist/core/feedback/client.d.ts +88 -0
  133. package/dist/core/feedback/client.js +182 -0
  134. package/dist/{lib → core}/format.d.ts +0 -1
  135. package/dist/{lib → core}/format.js +1 -1
  136. package/dist/core/headless/connection.d.ts +86 -0
  137. package/dist/core/headless/connection.js +97 -0
  138. package/dist/core/headless/editor-connection.d.ts +26 -0
  139. package/dist/core/headless/editor-connection.js +81 -0
  140. package/dist/core/headless/mcp-routing.d.ts +38 -0
  141. package/dist/core/headless/mcp-routing.js +83 -0
  142. package/dist/core/headless/registry.d.ts +91 -0
  143. package/dist/core/headless/registry.js +226 -0
  144. package/dist/core/headless/resolve.d.ts +46 -0
  145. package/dist/core/headless/resolve.js +75 -0
  146. package/dist/core/headless/spawn.d.ts +46 -0
  147. package/dist/core/headless/spawn.js +205 -0
  148. package/dist/core/headless/worker-connection.d.ts +96 -0
  149. package/dist/core/headless/worker-connection.js +353 -0
  150. package/dist/core/headless/worker-engine-client.d.ts +58 -0
  151. package/dist/core/headless/worker-engine-client.js +246 -0
  152. package/dist/core/launch-posture.d.ts +170 -0
  153. package/dist/core/launch-posture.js +317 -0
  154. package/dist/core/library-read.d.ts +73 -0
  155. package/dist/core/library-read.js +279 -0
  156. package/dist/core/library-search.d.ts +143 -0
  157. package/dist/core/library-search.js +301 -0
  158. package/dist/{lib → core}/log-filters.js +4 -2
  159. package/dist/{lib → core}/mcp-log.js +2 -17
  160. package/dist/core/package-root.d.ts +9 -0
  161. package/dist/core/package-root.js +11 -0
  162. package/dist/core/redact.d.ts +20 -0
  163. package/dist/core/redact.js +64 -0
  164. package/dist/core/registry-search.d.ts +167 -0
  165. package/dist/core/registry-search.js +358 -0
  166. package/dist/core/skills-registry.d.ts +47 -0
  167. package/dist/core/skills-registry.js +83 -0
  168. package/dist/{lib → core}/store.js +11 -7
  169. package/dist/{lib → core}/summer-compatibility.js +3 -3
  170. package/dist/{lib → core}/telemetry.js +5 -2
  171. package/dist/core/templates.d.ts +98 -0
  172. package/dist/core/templates.js +241 -0
  173. package/dist/core/tool-errors.d.ts +30 -0
  174. package/dist/core/tool-errors.js +40 -0
  175. package/dist/core/trajectory.d.ts +80 -0
  176. package/dist/core/trajectory.js +307 -0
  177. package/dist/core/util/http.d.ts +13 -0
  178. package/dist/core/util/http.js +28 -0
  179. package/dist/core/util/json.d.ts +12 -0
  180. package/dist/core/util/json.js +21 -0
  181. package/dist/core/util/process.d.ts +3 -0
  182. package/dist/core/util/process.js +13 -0
  183. package/dist/core/util/sleep.d.ts +1 -0
  184. package/dist/core/util/sleep.js +3 -0
  185. package/dist/core/version.d.ts +3 -0
  186. package/dist/core/version.js +5 -0
  187. package/dist/{lib → installer}/agent-config.d.ts +20 -1
  188. package/dist/{lib → installer}/agent-config.js +138 -24
  189. package/dist/installer/legacy-skills.d.ts +26 -0
  190. package/dist/installer/legacy-skills.js +53 -0
  191. package/dist/installer/setup.d.ts +76 -0
  192. package/dist/installer/setup.js +146 -0
  193. package/dist/installer/skill-locations.d.ts +45 -0
  194. package/dist/installer/skill-locations.js +170 -0
  195. package/dist/installer/version-check.d.ts +174 -0
  196. package/dist/{lib → installer}/version-check.js +173 -42
  197. package/dist/{lib/mcp-boot-notice.d.ts → mcp/boot-notice.d.ts} +1 -1
  198. package/dist/{commands/mcp.js → mcp/command.js} +18 -6
  199. package/dist/mcp/server.d.ts +23 -3
  200. package/dist/mcp/server.js +122 -28
  201. package/dist/mcp/tools/asset-tools.js +62 -142
  202. package/dist/mcp/tools/creator-tools.js +5 -23
  203. package/dist/mcp/tools/debug-tools.js +61 -18
  204. package/dist/mcp/tools/event-tools.d.ts +14 -0
  205. package/dist/mcp/tools/event-tools.js +41 -0
  206. package/dist/mcp/tools/fabricate-tools.d.ts +2 -0
  207. package/dist/mcp/tools/fabricate-tools.js +28 -0
  208. package/dist/mcp/tools/feedback-tools.d.ts +77 -0
  209. package/dist/mcp/tools/feedback-tools.js +88 -0
  210. package/dist/mcp/tools/file-tools.js +6 -53
  211. package/dist/mcp/tools/generate-tools.js +37 -63
  212. package/dist/mcp/tools/library-tools.d.ts +11 -0
  213. package/dist/mcp/tools/library-tools.js +42 -0
  214. package/dist/mcp/tools/navigation-tools.d.ts +7 -0
  215. package/dist/mcp/tools/navigation-tools.js +37 -0
  216. package/dist/mcp/tools/perception-tools.d.ts +20 -0
  217. package/dist/mcp/tools/perception-tools.js +146 -0
  218. package/dist/mcp/tools/project-tools.d.ts +14 -0
  219. package/dist/mcp/tools/project-tools.js +72 -281
  220. package/dist/mcp/tools/runtime-tools.d.ts +2 -0
  221. package/dist/mcp/tools/runtime-tools.js +92 -0
  222. package/dist/mcp/tools/scene-tools.d.ts +3 -0
  223. package/dist/mcp/tools/scene-tools.js +68 -119
  224. package/dist/mcp/tools/script-tools.d.ts +3 -0
  225. package/dist/mcp/tools/script-tools.js +118 -0
  226. package/dist/mcp/tools/spatial-tools.d.ts +2 -0
  227. package/dist/mcp/tools/spatial-tools.js +485 -0
  228. package/dist/mcp/tools/text-json.d.ts +8 -0
  229. package/dist/mcp/tools/text-json.js +12 -0
  230. package/dist/mcp/tools/{cloud-tools.d.ts → ui-tools.d.ts} +1 -1
  231. package/dist/mcp/tools/ui-tools.js +82 -0
  232. package/dist/mcp/tools/visual-tools.d.ts +2 -7
  233. package/dist/mcp/tools/visual-tools.js +383 -101
  234. package/dist/mcp/tools/with-engine.d.ts +9 -15
  235. package/dist/mcp/tools/with-engine.js +60 -96
  236. package/dist/project-memory/project-manifest.d.ts +36 -0
  237. package/dist/project-memory/project-manifest.js +50 -0
  238. package/dist/project-memory/project-memory.d.ts +57 -0
  239. package/dist/{lib → project-memory}/project-memory.js +46 -0
  240. package/gemini-extension.json +103 -2
  241. package/hooks/hooks-cursor.json +2 -2
  242. package/hooks/hooks.json +2 -1
  243. package/hooks/pre-commit-doctor.sh +45 -39
  244. package/hooks/run-hook.cmd +30 -23
  245. package/hooks/run-hook.sh +20 -0
  246. package/hooks/session-start.sh +18 -7
  247. package/integrations/README.md +70 -0
  248. package/integrations/claude/README.md +19 -0
  249. package/integrations/claude/manifest-target.json +16 -0
  250. package/integrations/cline/README.md +13 -0
  251. package/integrations/cline/manifest-target.json +3 -0
  252. package/integrations/codex/README.md +15 -0
  253. package/integrations/codex/manifest-target.json +5 -0
  254. package/integrations/cursor/README.md +16 -0
  255. package/integrations/cursor/manifest-target.json +5 -0
  256. package/integrations/factory/README.md +26 -0
  257. package/integrations/factory/manifest-target.json +5 -0
  258. package/integrations/gemini/README.md +26 -0
  259. package/integrations/gemini/manifest-target.json +5 -0
  260. package/integrations/github-copilot/README.md +12 -0
  261. package/integrations/github-copilot/manifest-target.json +3 -0
  262. package/integrations/kilo-code/README.md +16 -0
  263. package/integrations/kilo-code/manifest-target.json +3 -0
  264. package/integrations/lm-studio/README.md +12 -0
  265. package/integrations/lm-studio/manifest-target.json +3 -0
  266. package/integrations/opencode/README.md +15 -0
  267. package/integrations/opencode/manifest-target.json +3 -0
  268. package/integrations/roo-code/README.md +13 -0
  269. package/integrations/roo-code/manifest-target.json +3 -0
  270. package/integrations/vscode-copilot/README.md +12 -0
  271. package/integrations/vscode-copilot/manifest-target.json +3 -0
  272. package/integrations/windsurf/README.md +13 -0
  273. package/integrations/windsurf/manifest-target.json +3 -0
  274. package/library/references/collaborative-protocol/resource.yaml +24 -0
  275. package/library/references/gd-style/resource.yaml +24 -0
  276. package/{references → library/references/godot-version}/godot-version.md +6 -6
  277. package/library/references/godot-version/resource.yaml +22 -0
  278. package/library/references/headless-routing/headless-routing.md +46 -0
  279. package/library/references/headless-routing/resource.yaml +24 -0
  280. package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +49 -0
  281. package/library/references/mcp-fresh-chat-playbook/resource.yaml +23 -0
  282. package/library/references/mcp-tools-reference/mcp-tools-reference.md +271 -0
  283. package/library/references/mcp-tools-reference/resource.yaml +17 -0
  284. package/library/references/product-map/product-map.md +103 -0
  285. package/library/references/product-map/resource.yaml +33 -0
  286. package/{references → library/references/public-surface-language}/public-surface-language.md +5 -7
  287. package/library/references/public-surface-language/resource.yaml +17 -0
  288. package/library/references/summer-folder/resource.yaml +20 -0
  289. package/{references → library/references/summer-folder}/summer-folder.md +22 -21
  290. package/{skills/rendering-and-lighting → library/skills}/3d-lighting/SKILL.md +15 -11
  291. package/library/skills/3d-lighting/resource.yaml +27 -0
  292. package/{skills/audio → library/skills}/adaptive-music/SKILL.md +1 -1
  293. package/library/skills/adaptive-music/resource.yaml +28 -0
  294. package/library/skills/agent-playtesting/SKILL.md +148 -0
  295. package/library/skills/agent-playtesting/resource.yaml +52 -0
  296. package/library/skills/ambient-bed/resource.yaml +24 -0
  297. package/{skills/video → library/skills}/animated-loop/SKILL.md +1 -1
  298. package/library/skills/animated-loop/resource.yaml +27 -0
  299. package/{skills/animation → library/skills}/animation-tree/SKILL.md +29 -14
  300. package/library/skills/animation-tree/resource.yaml +33 -0
  301. package/{skills/rendering-and-lighting → library/skills}/art-direction/SKILL.md +3 -3
  302. package/library/skills/art-direction/resource.yaml +29 -0
  303. package/{skills/asset-pipeline → library/skills}/asset-strategy/SKILL.md +44 -44
  304. package/library/skills/asset-strategy/resource.yaml +63 -0
  305. package/{skills/audio → library/skills}/audio-direction/SKILL.md +7 -7
  306. package/library/skills/audio-direction/resource.yaml +32 -0
  307. package/library/skills/auto-fire-targeting/resource.yaml +22 -0
  308. package/{skills/scene-and-project → library/skills}/brainstorm-game/SKILL.md +8 -8
  309. package/library/skills/brainstorm-game/resource.yaml +30 -0
  310. package/{skills/workflow → library/skills}/brainstorming/SKILL.md +2 -22
  311. package/library/skills/brainstorming/resource.yaml +23 -0
  312. package/{skills/workflow → library/skills}/brainstorming/spec-document-reviewer-prompt.md +1 -1
  313. package/{skills/scene-and-project → library/skills}/browse-templates/SKILL.md +18 -18
  314. package/library/skills/browse-templates/resource.yaml +23 -0
  315. package/library/skills/celeste-momentum-platforming/SKILL.md +366 -0
  316. package/library/skills/celeste-momentum-platforming/resource.yaml +33 -0
  317. package/library/skills/character-animation-wiring/SKILL.md +249 -0
  318. package/library/skills/character-animation-wiring/resource.yaml +39 -0
  319. package/{skills/3d-assets → library/skills}/character-model/SKILL.md +25 -25
  320. package/library/skills/character-model/resource.yaml +36 -0
  321. package/{skills/2d-assets → library/skills}/character-portrait/SKILL.md +14 -14
  322. package/library/skills/character-portrait/resource.yaml +30 -0
  323. package/{skills/video → library/skills}/cinematic-cutscene/SKILL.md +2 -2
  324. package/library/skills/cinematic-cutscene/resource.yaml +29 -0
  325. package/{skills/2d-assets → library/skills}/concept-art/SKILL.md +15 -15
  326. package/library/skills/concept-art/resource.yaml +34 -0
  327. package/{skills/2d-assets → library/skills}/create-asset-sheet/SKILL.md +8 -8
  328. package/library/skills/create-asset-sheet/resource.yaml +33 -0
  329. package/{skills/debugging → library/skills}/debug/SKILL.md +3 -3
  330. package/library/skills/debug/resource.yaml +31 -0
  331. package/{skills/workflow → library/skills}/debugging-game-feel/SKILL.md +11 -11
  332. package/library/skills/debugging-game-feel/resource.yaml +25 -0
  333. package/{skills/level-design → library/skills}/design-level/SKILL.md +6 -6
  334. package/library/skills/design-level/resource.yaml +31 -0
  335. package/{skills/gameplay-mechanics → library/skills}/design-mechanic/SKILL.md +3 -3
  336. package/library/skills/design-mechanic/resource.yaml +31 -0
  337. package/{skills/ai-and-npcs → library/skills}/design-npc/SKILL.md +7 -3
  338. package/library/skills/design-npc/resource.yaml +29 -0
  339. package/{skills/workflow → library/skills}/diagnosing-perf-regressions/SKILL.md +10 -10
  340. package/library/skills/diagnosing-perf-regressions/resource.yaml +25 -0
  341. package/{skills/workflow → library/skills}/dispatching-parallel-agents/SKILL.md +8 -8
  342. package/library/skills/dispatching-parallel-agents/resource.yaml +23 -0
  343. package/library/skills/driving-the-editor-ui/SKILL.md +85 -0
  344. package/library/skills/driving-the-editor-ui/resource.yaml +46 -0
  345. package/{skills/3d-assets → library/skills}/environment-kit/SKILL.md +11 -11
  346. package/library/skills/environment-kit/resource.yaml +29 -0
  347. package/{skills/deployment → library/skills}/export-and-ship/SKILL.md +5 -5
  348. package/library/skills/export-and-ship/resource.yaml +32 -0
  349. package/library/skills/fabricating-assets/SKILL.md +195 -0
  350. package/library/skills/fabricating-assets/resource.yaml +52 -0
  351. package/{skills/animation → library/skills}/facial-and-lipsync/SKILL.md +23 -11
  352. package/library/skills/facial-and-lipsync/resource.yaml +36 -0
  353. package/{skills/character-controllers → library/skills}/fps-controller/SKILL.md +8 -4
  354. package/library/skills/fps-controller/resource.yaml +29 -0
  355. package/{skills/visual-effects → library/skills}/game-feel/SKILL.md +7 -7
  356. package/library/skills/game-feel/resource.yaml +27 -0
  357. package/library/skills/gameskill/SKILL.md +64 -0
  358. package/library/skills/gameskill/resource.yaml +22 -0
  359. package/library/skills/gdscript-patterns/resource.yaml +23 -0
  360. package/{skills/animation → library/skills}/generate-motion/SKILL.md +16 -16
  361. package/library/skills/generate-motion/resource.yaml +34 -0
  362. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +223 -0
  363. package/library/skills/godogen-visual-proof-game-generation/resource.yaml +33 -0
  364. package/{skills/workflow → library/skills}/headless-scripting/SKILL.md +14 -7
  365. package/library/skills/headless-scripting/resource.yaml +26 -0
  366. package/library/skills/host-authoritative-state/resource.yaml +28 -0
  367. package/{skills/2d-assets → library/skills}/instantiate-asset-pack/SKILL.md +10 -12
  368. package/library/skills/instantiate-asset-pack/resource.yaml +29 -0
  369. package/{skills/workflow → library/skills}/investigating-bugs/SKILL.md +4 -4
  370. package/{skills/workflow → library/skills}/investigating-bugs/condition-based-waiting.md +8 -8
  371. package/library/skills/investigating-bugs/resource.yaml +24 -0
  372. package/{skills/workflow → library/skills}/investigating-bugs/root-cause-tracing.md +1 -7
  373. package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +164 -0
  374. package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +35 -0
  375. package/{skills/scene-and-project → library/skills}/make-game/SKILL.md +22 -22
  376. package/library/skills/make-game/resource.yaml +35 -0
  377. package/library/skills/music-track/resource.yaml +28 -0
  378. package/library/skills/navigate-summer/SKILL.md +61 -0
  379. package/library/skills/navigate-summer/resource.yaml +35 -0
  380. package/{skills/scene-and-project → library/skills}/new-project/SKILL.md +10 -10
  381. package/library/skills/new-project/resource.yaml +28 -0
  382. package/{skills/3d-assets → library/skills}/organic-model/SKILL.md +16 -16
  383. package/library/skills/organic-model/resource.yaml +32 -0
  384. package/{skills/multiplayer-and-networking → library/skills}/peer-to-peer-multiplayer/SKILL.md +2 -2
  385. package/library/skills/peer-to-peer-multiplayer/resource.yaml +28 -0
  386. package/{skills/2d-assets → library/skills}/pixel-art/SKILL.md +13 -13
  387. package/library/skills/pixel-art/resource.yaml +31 -0
  388. package/library/skills/play/resource.yaml +26 -0
  389. package/{skills/workflow → library/skills}/playtesting-a-feature/SKILL.md +41 -22
  390. package/library/skills/playtesting-a-feature/resource.yaml +31 -0
  391. package/{skills/animation → library/skills}/procedural-animation/SKILL.md +25 -10
  392. package/library/skills/procedural-animation/resource.yaml +33 -0
  393. package/{skills/3d-assets → library/skills}/prop-model/SKILL.md +13 -13
  394. package/library/skills/prop-model/resource.yaml +33 -0
  395. package/library/skills/psx-retro-rendering/SKILL.md +416 -0
  396. package/library/skills/psx-retro-rendering/resource.yaml +36 -0
  397. package/library/skills/realtime-wet-surfaces/SKILL.md +189 -0
  398. package/library/skills/realtime-wet-surfaces/resource.yaml +31 -0
  399. package/{skills/deployment → library/skills}/remote-deploy/SKILL.md +3 -3
  400. package/library/skills/remote-deploy/resource.yaml +23 -0
  401. package/{skills/animation → library/skills}/retarget/SKILL.md +15 -14
  402. package/library/skills/retarget/resource.yaml +33 -0
  403. package/library/skills/running-in-the-cloud/SKILL.md +103 -0
  404. package/library/skills/running-in-the-cloud/resource.yaml +33 -0
  405. package/{skills/scene-and-project → library/skills}/scene-composition/SKILL.md +8 -0
  406. package/library/skills/scene-composition/resource.yaml +27 -0
  407. package/library/skills/scene-hierarchy-design/SKILL.md +102 -0
  408. package/library/skills/scene-hierarchy-design/resource.yaml +31 -0
  409. package/library/skills/scene-scripting/SKILL.md +764 -0
  410. package/library/skills/scene-scripting/resource.yaml +58 -0
  411. package/{skills/level-design → library/skills}/scene-to-level/SKILL.md +16 -17
  412. package/library/skills/scene-to-level/resource.yaml +33 -0
  413. package/library/skills/setup-multiplayer/resource.yaml +28 -0
  414. package/library/skills/skill-create/SKILL.md +138 -0
  415. package/library/skills/skill-create/resource.yaml +25 -0
  416. package/{skills/workflow → library/skills}/skill-improve/SKILL.md +2 -2
  417. package/library/skills/skill-improve/resource.yaml +25 -0
  418. package/{skills/workflow → library/skills}/skill-test/SKILL.md +4 -4
  419. package/library/skills/skill-test/resource.yaml +26 -0
  420. package/library/skills/skintokens-auto-rigging/SKILL.md +200 -0
  421. package/library/skills/skintokens-auto-rigging/resource.yaml +38 -0
  422. package/{skills/2d-assets → library/skills}/skybox-panorama/SKILL.md +8 -8
  423. package/library/skills/skybox-panorama/resource.yaml +28 -0
  424. package/{skills/audio → library/skills}/sound-effect/SKILL.md +2 -2
  425. package/library/skills/sound-effect/resource.yaml +27 -0
  426. package/library/skills/spatial-placement/SKILL.md +74 -0
  427. package/library/skills/spatial-placement/resource.yaml +42 -0
  428. package/library/skills/spatial-placement/tests/spec.md +65 -0
  429. package/{skills/2d-assets → library/skills}/sprite-sheet/SKILL.md +12 -12
  430. package/library/skills/sprite-sheet/resource.yaml +32 -0
  431. package/{skills/2d-assets → library/skills}/tileable-texture/SKILL.md +9 -9
  432. package/library/skills/tileable-texture/resource.yaml +31 -0
  433. package/{skills/video → library/skills}/trailer-shot/SKILL.md +1 -1
  434. package/library/skills/trailer-shot/resource.yaml +27 -0
  435. package/{skills/performance → library/skills}/tune-performance/SKILL.md +6 -6
  436. package/library/skills/tune-performance/resource.yaml +31 -0
  437. package/library/skills/ui-basics/resource.yaml +25 -0
  438. package/{skills/2d-assets → library/skills}/ui-graphics/SKILL.md +11 -11
  439. package/library/skills/ui-graphics/resource.yaml +29 -0
  440. package/{skills/2d-assets → library/skills}/use-widget-asset/SKILL.md +4 -4
  441. package/library/skills/use-widget-asset/resource.yaml +29 -0
  442. package/{skills/workflow → library/skills}/using-summer/SKILL.md +12 -9
  443. package/library/skills/using-summer/resource.yaml +41 -0
  444. package/{skills/3d-assets → library/skills}/vehicle-model/SKILL.md +18 -18
  445. package/library/skills/vehicle-model/resource.yaml +34 -0
  446. package/{skills/workflow → library/skills}/verification-before-completion/SKILL.md +10 -10
  447. package/library/skills/verification-before-completion/resource.yaml +23 -0
  448. package/library/skills/verifying-scenes/SKILL.md +98 -0
  449. package/library/skills/verifying-scenes/resource.yaml +42 -0
  450. package/{skills/visual-effects/recipes/dissolve → library/skills/vfx-dissolve}/SKILL.md +31 -11
  451. package/library/skills/vfx-dissolve/resource.yaml +33 -0
  452. package/{skills/visual-effects/recipes/fire → library/skills/vfx-fire}/SKILL.md +43 -12
  453. package/library/skills/vfx-fire/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
  454. package/library/skills/vfx-fire/resource.yaml +35 -0
  455. package/{skills/visual-effects/recipes/hit-spark → library/skills/vfx-hit-spark}/SKILL.md +16 -10
  456. package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +37 -0
  457. package/library/skills/vfx-hit-spark/resource.yaml +34 -0
  458. package/{skills/visual-effects/recipes/lightning → library/skills/vfx-lightning}/SKILL.md +24 -11
  459. package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +37 -0
  460. package/library/skills/vfx-lightning/resource.yaml +33 -0
  461. package/{skills/visual-effects/recipes/magic-glow → library/skills/vfx-magic-glow}/SKILL.md +31 -11
  462. package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +37 -0
  463. package/library/skills/vfx-magic-glow/resource.yaml +34 -0
  464. package/{skills/visual-effects/recipes/muzzle-flash → library/skills/vfx-muzzle-flash}/SKILL.md +29 -9
  465. package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +37 -0
  466. package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +53 -0
  467. package/library/skills/vfx-muzzle-flash/resource.yaml +35 -0
  468. package/{skills/visual-effects/recipes/smoke → library/skills/vfx-smoke}/SKILL.md +35 -9
  469. package/library/skills/vfx-smoke/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
  470. package/library/skills/vfx-smoke/resource.yaml +32 -0
  471. package/{skills/visual-effects/recipes/water-ripple → library/skills/vfx-water-ripple}/SKILL.md +31 -9
  472. package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +37 -0
  473. package/library/skills/vfx-water-ripple/resource.yaml +31 -0
  474. package/library/skills/voice-line/resource.yaml +27 -0
  475. package/library/skills/world-building-3d/SKILL.md +105 -0
  476. package/library/skills/world-building-3d/references/spatial-tools.md +50 -0
  477. package/library/skills/world-building-3d/resource.yaml +44 -0
  478. package/library/skills/world-building-3d/tests/spec.md +48 -0
  479. package/{skills/workflow → library/skills}/writing-plans/SKILL.md +19 -14
  480. package/library/skills/writing-plans/resource.yaml +23 -0
  481. package/{skills/workflow → library/skills}/writing-skills/SKILL.md +38 -44
  482. package/library/skills/writing-skills/resource.yaml +29 -0
  483. package/{skills/workflow → library/skills}/writing-skills/testing-skills-with-subagents.md +13 -14
  484. package/library/templates/2d-brario-platformer/resource.yaml +21 -0
  485. package/library/templates/2d-dungeon-roguelike/resource.yaml +23 -0
  486. package/library/templates/2d-grid-puzzle/resource.yaml +21 -0
  487. package/library/templates/2d-plants-and-zombies-tower-defense/resource.yaml +21 -0
  488. package/library/templates/2d-platformer/resource.yaml +24 -0
  489. package/library/templates/2d-rpg/resource.yaml +21 -0
  490. package/library/templates/2d-vampire-survivor-roguelike/resource.yaml +21 -0
  491. package/library/templates/3d-basic/resource.yaml +16 -0
  492. package/library/templates/3d-city-kit/resource.yaml +24 -0
  493. package/library/templates/3d-fps-old-school/resource.yaml +21 -0
  494. package/library/templates/3d-fps-simple-animated-npc/resource.yaml +21 -0
  495. package/library/templates/3d-lan-multiplayer-starter/resource.yaml +22 -0
  496. package/library/templates/3d-open-world-explore-tps/resource.yaml +21 -0
  497. package/library/templates/3d-procedural-road-world/resource.yaml +21 -0
  498. package/library/templates/3d-racing-game/resource.yaml +21 -0
  499. package/library/templates/3d-royale-clash-type/resource.yaml +21 -0
  500. package/library/templates/3d-third-person-controller/resource.yaml +21 -0
  501. package/library/templates/3d-voxel-sandbox/resource.yaml +24 -0
  502. package/library/templates/README.md +94 -0
  503. package/library/templates/empty/resource.yaml +16 -0
  504. package/library/tools/add-node/resource.yaml +60 -0
  505. package/library/tools/align-distribute-3d/resource.yaml +87 -0
  506. package/library/tools/api-docs/resource.yaml +57 -0
  507. package/library/tools/batch/resource.yaml +52 -0
  508. package/library/tools/camera-bookmark/resource.yaml +73 -0
  509. package/library/tools/check-job/resource.yaml +45 -0
  510. package/library/tools/clear-console/resource.yaml +40 -0
  511. package/library/tools/connect-signal/resource.yaml +63 -0
  512. package/library/tools/create-debug-report/resource.yaml +67 -0
  513. package/library/tools/create-scene/resource.yaml +59 -0
  514. package/library/tools/creator-config/resource.yaml +63 -0
  515. package/library/tools/creator-publish/resource.yaml +73 -0
  516. package/library/tools/creator-releases/resource.yaml +53 -0
  517. package/library/tools/fabricate-3d/resource.yaml +108 -0
  518. package/library/tools/game-control/resource.yaml +84 -0
  519. package/library/tools/game-input/resource.yaml +159 -0
  520. package/library/tools/game-probe/resource.yaml +90 -0
  521. package/library/tools/generate-3d/resource.yaml +112 -0
  522. package/library/tools/generate-audio/resource.yaml +80 -0
  523. package/library/tools/generate-image/resource.yaml +62 -0
  524. package/library/tools/generate-motion/resource.yaml +66 -0
  525. package/library/tools/generate-video/resource.yaml +66 -0
  526. package/library/tools/get-agent-playbook/resource.yaml +40 -0
  527. package/library/tools/get-asset/resource.yaml +42 -0
  528. package/library/tools/get-asset-download-url/resource.yaml +52 -0
  529. package/library/tools/get-console/resource.yaml +69 -0
  530. package/library/tools/get-debugger-errors/resource.yaml +56 -0
  531. package/library/tools/get-debugger-warnings/resource.yaml +52 -0
  532. package/library/tools/get-diagnostics/resource.yaml +42 -0
  533. package/library/tools/get-project-context/resource.yaml +45 -0
  534. package/library/tools/get-runtime-tree/resource.yaml +62 -0
  535. package/library/tools/get-scene-tree/resource.yaml +52 -0
  536. package/library/tools/get-script-errors/resource.yaml +45 -0
  537. package/library/tools/get-studio-workflow/resource.yaml +43 -0
  538. package/library/tools/import-asset/resource.yaml +73 -0
  539. package/library/tools/import-asset-by-id/resource.yaml +56 -0
  540. package/library/tools/import-from-url/resource.yaml +51 -0
  541. package/library/tools/import-from-url-batch/resource.yaml +60 -0
  542. package/library/tools/import-hdri/resource.yaml +69 -0
  543. package/library/tools/input-map-bind/resource.yaml +52 -0
  544. package/library/tools/inspect-node/resource.yaml +46 -0
  545. package/library/tools/inspect-resource/resource.yaml +45 -0
  546. package/library/tools/inspect-runtime-node/resource.yaml +54 -0
  547. package/library/tools/instantiate-scene/resource.yaml +62 -0
  548. package/library/tools/is-running/resource.yaml +40 -0
  549. package/library/tools/library-feedback/resource.yaml +89 -0
  550. package/library/tools/list-my-assets/resource.yaml +56 -0
  551. package/library/tools/navigation-probe/resource.yaml +85 -0
  552. package/library/tools/open/resource.yaml +80 -0
  553. package/library/tools/open-main-scene/resource.yaml +40 -0
  554. package/library/tools/open-scene/resource.yaml +46 -0
  555. package/library/tools/play/resource.yaml +91 -0
  556. package/library/tools/project-setting/resource.yaml +53 -0
  557. package/library/tools/read-file/resource.yaml +47 -0
  558. package/library/tools/read-library/resource.yaml +67 -0
  559. package/library/tools/recent-events/resource.yaml +71 -0
  560. package/library/tools/remove-node/resource.yaml +51 -0
  561. package/library/tools/replace-node/resource.yaml +57 -0
  562. package/library/tools/replace-text/resource.yaml +61 -0
  563. package/library/tools/run-editor-script/resource.yaml +61 -0
  564. package/library/tools/run-script/resource.yaml +73 -0
  565. package/library/tools/runtime-animate/resource.yaml +140 -0
  566. package/library/tools/runtime-call/resource.yaml +74 -0
  567. package/library/tools/runtime-set/resource.yaml +80 -0
  568. package/library/tools/runtime-spawn/resource.yaml +95 -0
  569. package/library/tools/save-scene/resource.yaml +50 -0
  570. package/library/tools/screenshot/resource.yaml +112 -0
  571. package/library/tools/search-assets/resource.yaml +67 -0
  572. package/library/tools/search-library/resource.yaml +81 -0
  573. package/library/tools/select-node/resource.yaml +48 -0
  574. package/library/tools/set-prop/resource.yaml +64 -0
  575. package/library/tools/set-resource-property/resource.yaml +66 -0
  576. package/library/tools/slice-asset-sheet/resource.yaml +47 -0
  577. package/library/tools/snap-to-surface/resource.yaml +90 -0
  578. package/library/tools/snapshot-diff/resource.yaml +58 -0
  579. package/library/tools/starcast/resource.yaml +120 -0
  580. package/library/tools/start-game-task/resource.yaml +91 -0
  581. package/library/tools/stop/resource.yaml +51 -0
  582. package/library/tools/test-placement/resource.yaml +109 -0
  583. package/library/tools/ui-actions/resource.yaml +77 -0
  584. package/library/tools/ui-activate/resource.yaml +88 -0
  585. package/library/tools/ui-screenshot/resource.yaml +63 -0
  586. package/library/tools/ui-tree/resource.yaml +69 -0
  587. package/library/tools/wait-for-event/resource.yaml +84 -0
  588. package/library/tools/world-snapshot/resource.yaml +60 -0
  589. package/library/tools/write-file/resource.yaml +54 -0
  590. package/package.json +22 -16
  591. package/registry/generated/aliases.json +207 -0
  592. package/registry/generated/counts.json +12 -0
  593. package/registry/generated/gemini-extension.json +122 -0
  594. package/registry/generated/index.json +7709 -0
  595. package/registry/generated/marketplace.claude.json +44 -0
  596. package/registry/generated/mcp.json +13 -0
  597. package/registry/generated/plugin.claude.json +135 -0
  598. package/registry/generated/plugin.codex.json +144 -0
  599. package/registry/generated/plugin.cursor.json +134 -0
  600. package/registry/generated/plugin.factory.json +117 -0
  601. package/registry/generated/skills-registry.json +851 -0
  602. package/registry/generated/templates-registry.json +455 -0
  603. package/registry/schemas/allowed-hosts.json +19 -0
  604. package/registry/schemas/collection.schema.json +68 -0
  605. package/registry/schemas/domains.json +96 -0
  606. package/registry/schemas/example.schema.json +11 -0
  607. package/registry/schemas/reference.schema.json +10 -0
  608. package/registry/schemas/resource.schema.json +154 -0
  609. package/registry/schemas/skill.schema.json +14 -0
  610. package/registry/schemas/template.schema.json +46 -0
  611. package/registry/schemas/tool.schema.json +61 -0
  612. package/_persona/summer/SKILL.md +0 -113
  613. package/dist/bin/postinstall.d.ts +0 -2
  614. package/dist/bin/postinstall.js +0 -3
  615. package/dist/commands/cloud.d.ts +0 -2
  616. package/dist/commands/cloud.js +0 -80
  617. package/dist/commands/create.d.ts +0 -3
  618. package/dist/commands/create.js +0 -171
  619. package/dist/commands/install.d.ts +0 -19
  620. package/dist/commands/install.js +0 -194
  621. package/dist/commands/list.js +0 -67
  622. package/dist/commands/logout.js +0 -13
  623. package/dist/commands/logs.d.ts +0 -2
  624. package/dist/commands/logs.js +0 -19
  625. package/dist/commands/open.d.ts +0 -2
  626. package/dist/commands/open.js +0 -32
  627. package/dist/commands/orchestrator.d.ts +0 -8
  628. package/dist/commands/orchestrator.js +0 -143
  629. package/dist/commands/run.d.ts +0 -2
  630. package/dist/commands/run.js +0 -167
  631. package/dist/commands/status.js +0 -46
  632. package/dist/lib/banner.d.ts +0 -4
  633. package/dist/lib/banner.js +0 -122
  634. package/dist/lib/cloud/api.d.ts +0 -79
  635. package/dist/lib/cloud/api.js +0 -107
  636. package/dist/lib/cloud/apply.d.ts +0 -32
  637. package/dist/lib/cloud/apply.js +0 -294
  638. package/dist/lib/cloud/checkpoint.d.ts +0 -26
  639. package/dist/lib/cloud/checkpoint.js +0 -142
  640. package/dist/lib/cloud/conflicts.d.ts +0 -55
  641. package/dist/lib/cloud/conflicts.js +0 -131
  642. package/dist/lib/cloud/containment.d.ts +0 -8
  643. package/dist/lib/cloud/containment.js +0 -52
  644. package/dist/lib/cloud/diff.d.ts +0 -39
  645. package/dist/lib/cloud/diff.js +0 -138
  646. package/dist/lib/cloud/engine-bridge.d.ts +0 -34
  647. package/dist/lib/cloud/engine-bridge.js +0 -139
  648. package/dist/lib/cloud/hash-cache.d.ts +0 -23
  649. package/dist/lib/cloud/hash-cache.js +0 -44
  650. package/dist/lib/cloud/hash.d.ts +0 -10
  651. package/dist/lib/cloud/hash.js +0 -111
  652. package/dist/lib/cloud/http.d.ts +0 -17
  653. package/dist/lib/cloud/http.js +0 -47
  654. package/dist/lib/cloud/lock-path.d.ts +0 -1
  655. package/dist/lib/cloud/lock-path.js +0 -5
  656. package/dist/lib/cloud/lock.d.ts +0 -14
  657. package/dist/lib/cloud/lock.js +0 -143
  658. package/dist/lib/cloud/manifest.d.ts +0 -6
  659. package/dist/lib/cloud/manifest.js +0 -41
  660. package/dist/lib/cloud/paths.d.ts +0 -20
  661. package/dist/lib/cloud/paths.js +0 -90
  662. package/dist/lib/cloud/project-godot-merge.d.ts +0 -32
  663. package/dist/lib/cloud/project-godot-merge.js +0 -185
  664. package/dist/lib/cloud/rules.d.ts +0 -39
  665. package/dist/lib/cloud/rules.js +0 -159
  666. package/dist/lib/cloud/sync.d.ts +0 -21
  667. package/dist/lib/cloud/sync.js +0 -518
  668. package/dist/lib/cloud/transfer.d.ts +0 -23
  669. package/dist/lib/cloud/transfer.js +0 -184
  670. package/dist/lib/cloud/types.d.ts +0 -62
  671. package/dist/lib/cloud/types.js +0 -1
  672. package/dist/lib/cloud/validate-path.d.ts +0 -23
  673. package/dist/lib/cloud/validate-path.js +0 -103
  674. package/dist/lib/engine.d.ts +0 -51
  675. package/dist/lib/game-task-plan.d.ts +0 -42
  676. package/dist/lib/project-memory.d.ts +0 -33
  677. package/dist/lib/public-surface-paths.d.ts +0 -13
  678. package/dist/lib/public-surface-paths.js +0 -42
  679. package/dist/lib/remote-templates.d.ts +0 -25
  680. package/dist/lib/remote-templates.js +0 -86
  681. package/dist/lib/skills-registry.d.ts +0 -572
  682. package/dist/lib/skills-registry.js +0 -1061
  683. package/dist/lib/version-check.d.ts +0 -106
  684. package/dist/mcp/tools/cloud-tools.js +0 -42
  685. package/references/mcp-tools-reference.md +0 -199
  686. package/references/template-registry.md +0 -73
  687. package/skills/README.md +0 -103
  688. package/skills/scene-and-project/summer-cloud/SKILL.md +0 -92
  689. package/skills/workflow/brainstorming/scripts/frame-template.html +0 -214
  690. package/skills/workflow/brainstorming/scripts/helper.js +0 -88
  691. package/skills/workflow/brainstorming/scripts/server.cjs +0 -354
  692. package/skills/workflow/brainstorming/scripts/start-server.sh +0 -148
  693. package/skills/workflow/brainstorming/scripts/stop-server.sh +0 -56
  694. package/skills/workflow/brainstorming/visual-companion.md +0 -287
  695. package/skills/workflow/gameskill/SKILL.md +0 -120
  696. package/skills/workflow/investigating-bugs/CREATION-LOG.md +0 -119
  697. package/skills/workflow/investigating-bugs/condition-based-waiting-example.ts +0 -158
  698. package/skills/workflow/investigating-bugs/find-polluter.sh +0 -63
  699. package/skills/workflow/investigating-bugs/test-academic.md +0 -14
  700. package/skills/workflow/investigating-bugs/test-pressure-1.md +0 -58
  701. package/skills/workflow/investigating-bugs/test-pressure-2.md +0 -68
  702. package/skills/workflow/investigating-bugs/test-pressure-3.md +0 -69
  703. package/skills/workflow/mcpupdate/SKILL.md +0 -134
  704. package/skills/workflow/skill-create/SKILL.md +0 -153
  705. package/skills/workflow/writing-skills/anthropic-best-practices.md +0 -1150
  706. package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +0 -189
  707. package/skills/workflow/writing-skills/graphviz-conventions.dot +0 -172
  708. package/skills/workflow/writing-skills/persuasion-principles.md +0 -187
  709. package/skills/workflow/writing-skills/render-graphs.js +0 -168
  710. /package/dist/{commands → cli/commands}/config.d.ts +0 -0
  711. /package/dist/{commands → cli/commands}/debug.d.ts +0 -0
  712. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  713. /package/dist/{commands → cli/commands}/login.d.ts +0 -0
  714. /package/dist/{commands → cli/commands}/plan.d.ts +0 -0
  715. /package/dist/{commands → cli/commands}/publish.d.ts +0 -0
  716. /package/dist/{commands → cli/commands}/releases.d.ts +0 -0
  717. /package/dist/{commands → cli/commands}/setup.d.ts +0 -0
  718. /package/dist/{commands → cli/commands}/skills.d.ts +0 -0
  719. /package/dist/{lib → core}/log-filters.d.ts +0 -0
  720. /package/dist/{lib → core}/mcp-log.d.ts +0 -0
  721. /package/dist/{lib → core}/store.d.ts +0 -0
  722. /package/dist/{lib → core}/summer-compatibility.d.ts +0 -0
  723. /package/dist/{lib → core}/telemetry.d.ts +0 -0
  724. /package/dist/{lib/mcp-boot-notice.js → mcp/boot-notice.js} +0 -0
  725. /package/dist/{commands/mcp.d.ts → mcp/command.d.ts} +0 -0
  726. /package/{references → library/references/collaborative-protocol}/collaborative-protocol.md +0 -0
  727. /package/{references → library/references/gd-style}/gd-style.md +0 -0
  728. /package/{skills/audio → library/skills}/ambient-bed/SKILL.md +0 -0
  729. /package/{skills/gameplay-mechanics → library/skills}/auto-fire-targeting/SKILL.md +0 -0
  730. /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/SKILL.md +0 -0
  731. /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/reference.md +0 -0
  732. /package/{skills/multiplayer-and-networking → library/skills}/host-authoritative-state/SKILL.md +0 -0
  733. /package/{skills/workflow → library/skills}/investigating-bugs/defense-in-depth.md +0 -0
  734. /package/{skills/audio → library/skills}/music-track/SKILL.md +0 -0
  735. /package/{skills/scene-and-project → library/skills}/play/SKILL.md +0 -0
  736. /package/{skills/multiplayer-and-networking → library/skills}/setup-multiplayer/SKILL.md +0 -0
  737. /package/{skills/ui-and-ux → library/skills}/ui-basics/SKILL.md +0 -0
  738. /package/{skills/visual-effects → library/skills/vfx-dissolve}/_building-blocks/noise-3d-fbm.gdshaderinc +0 -0
  739. /package/{skills/visual-effects → library/skills/vfx-fire}/_building-blocks/additive-billboard-particles.md +0 -0
  740. /package/{skills/visual-effects → library/skills/vfx-lightning}/_building-blocks/trauma-shake-snippet.md +0 -0
  741. /package/{skills/audio → library/skills}/voice-line/SKILL.md +0 -0
  742. /package/{skills/workflow → library/skills}/writing-plans/plan-document-reviewer-prompt.md +0 -0
@@ -1,9 +1,9 @@
1
- import { existsSync, readFileSync, statSync } from "node:fs";
1
+ import { existsSync, readFileSync, realpathSync, statSync } from "node:fs";
2
2
  import { dirname, isAbsolute, join, relative, resolve } from "node:path";
3
3
  import { Command } from "commander";
4
- import { checkEngineHealth, getApiPort } from "../lib/engine.js";
5
- import { getProjectMemorySummary, } from "../lib/project-memory.js";
6
- import { c, pad, tildeify } from "../lib/format.js";
4
+ import { checkEngineHealth, getApiPort } from "../../core/engine.js";
5
+ import { getProjectMemorySummary, } from "../../project-memory/project-memory.js";
6
+ import { c, pad, tildeify } from "../../core/format.js";
7
7
  export const memoryCommand = new Command("memory")
8
8
  .description("Inspect project memory in .summer")
9
9
  .option("--project <path>", "Project directory to inspect")
@@ -59,7 +59,7 @@ memoryCommand
59
59
  }
60
60
  console.log(join(resolvedProject.projectPath, ".summer"));
61
61
  });
62
- export async function resolveMemoryProject(projectOption) {
62
+ async function resolveMemoryProject(projectOption) {
63
63
  if (projectOption) {
64
64
  const projectPath = resolve(projectOption);
65
65
  if (!existsSync(projectPath)) {
@@ -105,17 +105,26 @@ export function findProjectRoot(startDir) {
105
105
  }
106
106
  export function resolveMemoryFilePath(projectPath, requested) {
107
107
  const summerDir = resolve(projectPath, ".summer");
108
- const rawPath = requested.startsWith(".summer/")
109
- ? resolve(projectPath, requested)
110
- : resolve(summerDir, requested);
111
- const withinSummer = isPathInside(summerDir, rawPath);
112
- if (!withinSummer) {
108
+ // Accept Windows-style separators in the requested name on every platform;
109
+ // memory file names never legitimately contain a backslash.
110
+ const normalized = requested.replace(/\\/g, "/");
111
+ const rawPath = normalized.startsWith(".summer/")
112
+ ? resolve(projectPath, normalized)
113
+ : resolve(summerDir, normalized);
114
+ if (!isPathInside(summerDir, rawPath)) {
113
115
  throw new Error("Memory files must be inside the project's .summer directory.");
114
116
  }
115
117
  if (!existsSync(rawPath)) {
116
118
  throw new Error(`Memory file not found: ${requested}`);
117
119
  }
118
- if (!statSync(rawPath).isFile()) {
120
+ // The lexical check above follows nothing; a symlink placed inside .summer
121
+ // can point anywhere. Compare real paths on BOTH sides so a link that leaves
122
+ // .summer is refused (and a legitimately symlinked .summer still works).
123
+ const realPath = realpathSync(rawPath);
124
+ if (!isPathInside(realpathSync(summerDir), realPath)) {
125
+ throw new Error("Memory files must be inside the project's .summer directory (a symlink that leaves it is refused).");
126
+ }
127
+ if (!statSync(realPath).isFile()) {
119
128
  throw new Error(`Memory path is not a file: ${requested}`);
120
129
  }
121
130
  return rawPath;
@@ -0,0 +1,45 @@
1
+ import { Command } from "commander";
2
+ import { type OpenDeps, type OpenResult, type OpenSurface } from "../../core/capabilities/navigation/open.js";
3
+ /**
4
+ * `summer open` has two jobs that share one verb:
5
+ *
6
+ * 1. `summer open <project-dir>` — the original command: open a project in
7
+ * Summer Engine (launching it when it is not running). Any argument that is
8
+ * an existing directory or looks like a filesystem path takes this branch,
9
+ * so nothing that worked before changes.
10
+ * 2. `summer open <target>` — navigation (docs/design/NAVIGATION-DESIGN.md):
11
+ * a product-map id ("billing"), an intent phrase ("change my plan"), a
12
+ * res:// path, or a summerengine.com path. Same behavior as the
13
+ * summer_open MCP tool and `summer tool open` (core/capabilities/navigation).
14
+ */
15
+ export interface OpenNavigationOptions {
16
+ print?: boolean;
17
+ list?: boolean;
18
+ web?: boolean;
19
+ editor?: boolean;
20
+ json?: boolean;
21
+ path?: string;
22
+ node?: string;
23
+ scene?: string;
24
+ param?: string[];
25
+ }
26
+ /**
27
+ * Which branch does `summer open <arg>` take?
28
+ * - An exact product-map id or alias (`billing`, `inspector`) is ALWAYS a
29
+ * navigation target, even if a directory of that name exists in cwd — use
30
+ * `./billing` to open a project folder that happens to share a name.
31
+ * - `./x`, `../x`, `~/x`, `.`, `..`, Windows drive paths: project directory.
32
+ * - `/x`: a project directory when it exists on disk; otherwise a
33
+ * summerengine.com path (`/pricing`) when the map knows it; otherwise the
34
+ * project-directory branch, which reports "Directory not found".
35
+ * - Anything else: a project directory only when it exists as one.
36
+ */
37
+ export declare function looksLikeProjectPath(arg: string): boolean;
38
+ export declare function parseParamOptions(options: OpenNavigationOptions): Record<string, string>;
39
+ export declare function surfaceFromOptions(options: OpenNavigationOptions): OpenSurface;
40
+ export declare function formatOpenResult(result: OpenResult): string;
41
+ export declare function defaultOpenDeps(): OpenDeps;
42
+ /** The navigation branch. Returns the result so tests can assert without a
43
+ * process exit; sets exitCode 1 when nothing could be opened. */
44
+ export declare function runOpenNavigation(target: string | undefined, options: OpenNavigationOptions, deps?: OpenDeps, log?: (line: string) => void): Promise<OpenResult>;
45
+ export declare const openCommand: Command;
@@ -0,0 +1,216 @@
1
+ import { Command } from "commander";
2
+ import { existsSync, statSync } from "fs";
3
+ import { resolve } from "path";
4
+ import open from "open";
5
+ import { getApiPort, checkEngineHealth } from "../../core/engine.js";
6
+ import { getAuthToken } from "../../core/auth.js";
7
+ import { resolveGatewayUrl } from "../../core/config.js";
8
+ import { EngineApiClient } from "../../core/api-client.js";
9
+ import { resolveTarget, runOpen, } from "../../core/capabilities/navigation/open.js";
10
+ import { getNavTarget } from "../../core/capabilities/navigation/targets.js";
11
+ import { c, sym } from "../../core/format.js";
12
+ /**
13
+ * Which branch does `summer open <arg>` take?
14
+ * - An exact product-map id or alias (`billing`, `inspector`) is ALWAYS a
15
+ * navigation target, even if a directory of that name exists in cwd — use
16
+ * `./billing` to open a project folder that happens to share a name.
17
+ * - `./x`, `../x`, `~/x`, `.`, `..`, Windows drive paths: project directory.
18
+ * - `/x`: a project directory when it exists on disk; otherwise a
19
+ * summerengine.com path (`/pricing`) when the map knows it; otherwise the
20
+ * project-directory branch, which reports "Directory not found".
21
+ * - Anything else: a project directory only when it exists as one.
22
+ */
23
+ export function looksLikeProjectPath(arg) {
24
+ const trimmed = arg.trim();
25
+ if (getNavTarget(trimmed.toLowerCase().replace(/\s+/g, "-")))
26
+ return false;
27
+ if (/^(\.\/|\.\.\/|~)/.test(trimmed) || /^[A-Za-z]:[\\/]/.test(trimmed) || trimmed === "." || trimmed === "..")
28
+ return true;
29
+ if (trimmed.startsWith("/")) {
30
+ if (isDirectory(trimmed))
31
+ return true;
32
+ const resolution = resolveTarget(trimmed, {}, "web");
33
+ return !(resolution.kind === "target");
34
+ }
35
+ return isDirectory(trimmed);
36
+ }
37
+ function isDirectory(path) {
38
+ try {
39
+ return statSync(resolve(path)).isDirectory();
40
+ }
41
+ catch {
42
+ return false;
43
+ }
44
+ }
45
+ export function parseParamOptions(options) {
46
+ const params = {};
47
+ for (const pair of options.param ?? []) {
48
+ const eq = pair.indexOf("=");
49
+ if (eq <= 0)
50
+ throw new Error(`--param expects key=value, got "${pair}"`);
51
+ params[pair.slice(0, eq).trim()] = pair.slice(eq + 1).trim();
52
+ }
53
+ if (options.path)
54
+ params.path = options.path;
55
+ if (options.node)
56
+ params.node = options.node;
57
+ if (options.scene)
58
+ params.scene = options.scene;
59
+ return params;
60
+ }
61
+ export function surfaceFromOptions(options) {
62
+ if (options.web && options.editor)
63
+ throw new Error("--web and --editor are mutually exclusive");
64
+ return options.web ? "web" : options.editor ? "editor" : "auto";
65
+ }
66
+ export function formatOpenResult(result) {
67
+ const lines = [];
68
+ switch (result.action) {
69
+ case "listed": {
70
+ const targets = result.targets ?? [];
71
+ const width = Math.max(...targets.map((t) => t.id.length), 2);
72
+ lines.push(c.bold(`Summer destinations (${targets.length})`));
73
+ for (const t of targets) {
74
+ const req = t.requires.login ? c.dim(" [login]") : "";
75
+ const avail = t.availability === "available"
76
+ ? c.green("available ")
77
+ : t.availability === "legacy"
78
+ ? c.dim("legacy op ")
79
+ : t.availability === "unavailable"
80
+ ? c.yellow("unavailable")
81
+ : t.availability === "unknown"
82
+ ? c.dim("unknown ")
83
+ : c.dim("web ");
84
+ lines.push(` ${t.id.padEnd(width)} ${avail} ${t.title}${req}`);
85
+ }
86
+ lines.push("");
87
+ lines.push(c.dim("Editor availability comes from the connected engine (unknown = engine not running; unavailable = update Summer Engine)."));
88
+ lines.push(c.dim("Open one: summer open <id> Print instead: summer open <id> --print Phrases work too: summer open \"change my plan\""));
89
+ break;
90
+ }
91
+ case "opened":
92
+ lines.push(`${sym.ok()} Opened ${result.target?.title ?? result.url ?? "destination"}`);
93
+ if (result.opened_url)
94
+ lines.push(` ${result.opened_url}`);
95
+ if (result.op)
96
+ lines.push(` ${c.dim(JSON.stringify(result.op))}`);
97
+ if (result.hint)
98
+ lines.push(` ${c.dim(result.hint)}`);
99
+ break;
100
+ case "printed":
101
+ if (result.url)
102
+ lines.push(result.url);
103
+ if (result.login_url && result.logged_in === false)
104
+ lines.push(c.dim(`not logged in here — through login: ${result.login_url}`));
105
+ if (result.op)
106
+ lines.push(JSON.stringify(result.op));
107
+ if (result.target)
108
+ lines.push(c.dim(`${result.target.title} — ${result.target.description}`));
109
+ if (result.engine && !result.engine.running)
110
+ lines.push(c.dim("(engine not running; nothing was sent)"));
111
+ break;
112
+ case "ambiguous":
113
+ lines.push(`${sym.warn()} ${result.hint ?? "Several destinations match."}`);
114
+ for (const m of result.matches ?? [])
115
+ lines.push(` ${m.id.padEnd(18)} ${m.surface.padEnd(6)} ${m.title}`);
116
+ break;
117
+ case "unsupported":
118
+ lines.push(`${sym.warn()} ${result.target?.title ?? result.target?.id} is not available on this Summer Engine build.`);
119
+ if (result.hint)
120
+ lines.push(` ${result.hint}`);
121
+ if (result.op)
122
+ lines.push(` would send: ${JSON.stringify(result.op)}`);
123
+ break;
124
+ case "open_failed":
125
+ case "blocked_origin":
126
+ lines.push(c.red(result.hint ?? result.action));
127
+ if (result.url)
128
+ lines.push(` ${result.url}`);
129
+ break;
130
+ case "engine_not_running":
131
+ lines.push(c.red("Summer Engine is not running (or no project is open) — nothing was opened."));
132
+ if (result.op)
133
+ lines.push(` would send: ${JSON.stringify(result.op)}`);
134
+ lines.push(" Start it with 'summer run <project>' or open the project in the Summer desktop app, then retry.");
135
+ break;
136
+ default:
137
+ lines.push(c.red(result.hint ?? result.action));
138
+ for (const m of result.matches ?? [])
139
+ lines.push(` ${m.id.padEnd(18)} ${m.title}`);
140
+ }
141
+ return lines.join("\n");
142
+ }
143
+ export function defaultOpenDeps() {
144
+ return {
145
+ engine: () => EngineApiClient.connect(),
146
+ openUrl: (url) => open(url),
147
+ isLoggedIn: async () => (await getAuthToken()) !== null,
148
+ gatewayUrl: resolveGatewayUrl,
149
+ };
150
+ }
151
+ /** The navigation branch. Returns the result so tests can assert without a
152
+ * process exit; sets exitCode 1 when nothing could be opened. */
153
+ export async function runOpenNavigation(target, options, deps = defaultOpenDeps(), log = console.log) {
154
+ const result = await runOpen({
155
+ target: options.list ? undefined : target,
156
+ params: parseParamOptions(options),
157
+ surface: surfaceFromOptions(options),
158
+ open: options.print !== true,
159
+ }, deps);
160
+ log(options.json ? JSON.stringify(result, null, 2) : formatOpenResult(result));
161
+ if (!result.ok)
162
+ process.exitCode = 1;
163
+ return result;
164
+ }
165
+ async function openProjectPath(projectPath) {
166
+ const fullPath = resolve(projectPath);
167
+ if (!existsSync(fullPath)) {
168
+ console.error(`Directory not found: ${fullPath}`);
169
+ process.exit(1);
170
+ }
171
+ if (!existsSync(`${fullPath}/project.godot`)) {
172
+ console.error(`No project.godot found in ${fullPath}\n` +
173
+ "This doesn't look like a Summer Engine project.\n" +
174
+ "Create one with: summer create 3d-basic my-game");
175
+ process.exit(1);
176
+ }
177
+ const port = await getApiPort();
178
+ const health = await checkEngineHealth(port);
179
+ if (!health) {
180
+ console.log("Engine not running. Launching with this project...");
181
+ // Import dynamically to avoid circular deps. `from: "user"` means the
182
+ // array holds ONLY user arguments — no node/script prefix — otherwise
183
+ // commander binds `[path]` to "node".
184
+ const { runCommand } = await import("./run.js");
185
+ await runCommand.parseAsync([fullPath], { from: "user" });
186
+ return;
187
+ }
188
+ console.log(`Opening project: ${fullPath}`);
189
+ console.log("Note: To switch projects, close the current one in Summer Engine first,\n" +
190
+ "then run: summer run " + fullPath);
191
+ }
192
+ export const openCommand = new Command("open")
193
+ .description("Open a project in Summer Engine, or open a Summer destination by name — a summerengine.com page (billing, my-games, pricing, mcp-guide …) or an editor surface (scene, node, script, inspector …)")
194
+ .argument("[target]", "Project directory (contains project.godot), or a destination: id, phrase, res:// path, or summerengine.com path")
195
+ .option("--print", "Resolve only: print the URL or engine op, open nothing")
196
+ .option("--list", "List every destination with surface and status")
197
+ .option("--web", "Only match website destinations")
198
+ .option("--editor", "Only match editor destinations")
199
+ .option("--json", "Print the full result as JSON")
200
+ .option("--path <res>", "res:// path for scene / script / file targets")
201
+ .option("--node <path>", "Node path for the node target, e.g. Player/Camera3D")
202
+ .option("--scene <res>", "Scene to open before selecting a node")
203
+ .option("--param <key=value>", "Slot value (gameId, section, username, version, guide); repeatable", (value, previous = []) => [...previous, value])
204
+ .action(async (target, options) => {
205
+ if (target !== undefined && !options.list && looksLikeProjectPath(target)) {
206
+ await openProjectPath(target);
207
+ return;
208
+ }
209
+ try {
210
+ await runOpenNavigation(target, options);
211
+ }
212
+ catch (error) {
213
+ console.error(error instanceof Error ? error.message : String(error));
214
+ process.exitCode = 1;
215
+ }
216
+ });
@@ -1,6 +1,6 @@
1
1
  import { Command } from "commander";
2
- import { ASSET_POLICIES, GAME_TASK_MODES, GAME_TASK_TARGETS, VERIFICATION_LEVELS, buildGameTaskPlan, } from "../lib/game-task-plan.js";
3
- import { c } from "../lib/format.js";
2
+ import { ASSET_POLICIES, GAME_TASK_MODES, GAME_TASK_TARGETS, VERIFICATION_LEVELS, buildGameTaskPlan, } from "../../core/capabilities/game-task-plan.js";
3
+ import { c } from "../../core/format.js";
4
4
  function parseChoice(value, choices, label) {
5
5
  if (!value)
6
6
  return undefined;
@@ -1,5 +1,5 @@
1
1
  import { Command } from "commander";
2
- import { publishCreator } from "../lib/creator.js";
2
+ import { publishCreator } from "../../core/capabilities/creator.js";
3
3
  export const publishCommand = new Command("publish")
4
4
  .description("Publish a confirmed creator release")
5
5
  .argument("[project]", "Project root. Defaults to the current directory.")
@@ -1,5 +1,5 @@
1
1
  import { Command } from "commander";
2
- import { listCreatorReleases } from "../lib/creator.js";
2
+ import { listCreatorReleases } from "../../core/capabilities/creator.js";
3
3
  export const releasesCommand = new Command("releases")
4
4
  .description("List creator releases for a project")
5
5
  .option("--project-id <id>", "Creator project ID")
@@ -0,0 +1,19 @@
1
+ import { Command } from "commander";
2
+ import { ENGINE_BIN_ENV } from "../../core/engine-install.js";
3
+ export type RunBinaryResolution = {
4
+ binary: string;
5
+ source: "--bin" | typeof ENGINE_BIN_ENV | "installed";
6
+ } | {
7
+ binary: null;
8
+ error: string;
9
+ };
10
+ /**
11
+ * Which engine executable `summer run` launches (and probes with --help):
12
+ * `--bin <path>`, else SUMMER_BIN, else the installed engine
13
+ * (findEngineBinary, which also honours the older SUMMER_ENGINE_BINARY).
14
+ * An explicit override is never silently swapped for the installed engine:
15
+ * a missing path or a bare `.app` bundle is an error, because the caller
16
+ * asked for THAT build (docs/design/archive/TK-VS-FOLD-2026-09-07.md, gap 5).
17
+ */
18
+ export declare function resolveRunBinary(binFlag: string | undefined, env?: NodeJS.ProcessEnv): RunBinaryResolution;
19
+ export declare const runCommand: Command;
@@ -0,0 +1,255 @@
1
+ import { Command } from "commander";
2
+ import { spawn } from "child_process";
3
+ import { existsSync } from "fs";
4
+ import { mkdir, readFile, rm, writeFile } from "fs/promises";
5
+ import { join, resolve } from "path";
6
+ import { getSummerDir } from "../../core/auth.js";
7
+ import { getApiPort, checkEngineHealth } from "../../core/engine.js";
8
+ import { describeEngineExecutableProblem, ENGINE_BIN_ENV, engineBinaryOverride, findEngineBinary, } from "../../core/engine-install.js";
9
+ import { advertisedBackgroundPosture, backgroundLaunchSupport, detectBackgroundLaunchSupport, planLaunch, resolveLaunchPosture, BACKGROUND_LAUNCH_FLAG, BACKGROUND_LAUNCH_MIN_ENGINE_VERSION, } from "../../core/launch-posture.js";
10
+ import { sleep } from "../../core/util/sleep.js";
11
+ const LAUNCH_LOCK_STALE_MS = 60_000;
12
+ const LAUNCH_LOCK_WAIT_MS = 15_000;
13
+ function isProcessAlive(pid) {
14
+ if (!Number.isInteger(pid) || pid <= 0)
15
+ return false;
16
+ try {
17
+ process.kill(pid, 0);
18
+ return true;
19
+ }
20
+ catch (error) {
21
+ const code = error.code;
22
+ return code === "EPERM";
23
+ }
24
+ }
25
+ async function removeStaleLaunchLock(lockDir) {
26
+ const ownerPath = join(lockDir, "owner.json");
27
+ try {
28
+ const raw = await readFile(ownerPath, "utf-8");
29
+ const owner = JSON.parse(raw);
30
+ const pid = typeof owner.pid === "number" ? owner.pid : 0;
31
+ const createdAt = typeof owner.createdAt === "number" ? owner.createdAt : 0;
32
+ const staleByTime = Date.now() - createdAt > LAUNCH_LOCK_STALE_MS;
33
+ const staleByPid = !isProcessAlive(pid);
34
+ if (!staleByTime && !staleByPid) {
35
+ return false;
36
+ }
37
+ }
38
+ catch {
39
+ // Broken owner metadata should not permanently block launches.
40
+ }
41
+ await rm(lockDir, { recursive: true, force: true });
42
+ return true;
43
+ }
44
+ async function withLaunchLock(fn) {
45
+ const summerDir = getSummerDir();
46
+ await mkdir(summerDir, { recursive: true, mode: 0o700 });
47
+ const lockDir = join(summerDir, "launch.lock");
48
+ const ownerPath = join(lockDir, "owner.json");
49
+ const startedAt = Date.now();
50
+ while (true) {
51
+ try {
52
+ await mkdir(lockDir, { mode: 0o700 });
53
+ try {
54
+ await writeFile(ownerPath, JSON.stringify({ pid: process.pid, createdAt: Date.now() }, null, 2), { encoding: "utf-8", mode: 0o600 });
55
+ return await fn();
56
+ }
57
+ finally {
58
+ await rm(lockDir, { recursive: true, force: true });
59
+ }
60
+ }
61
+ catch (error) {
62
+ const code = error.code;
63
+ if (code !== "EEXIST") {
64
+ throw error;
65
+ }
66
+ if (await removeStaleLaunchLock(lockDir)) {
67
+ continue;
68
+ }
69
+ if (Date.now() - startedAt > LAUNCH_LOCK_WAIT_MS) {
70
+ throw new Error("Another `summer run` launch is still in progress. Try again in a few seconds.");
71
+ }
72
+ await sleep(100);
73
+ }
74
+ }
75
+ }
76
+ /**
77
+ * Which engine executable `summer run` launches (and probes with --help):
78
+ * `--bin <path>`, else SUMMER_BIN, else the installed engine
79
+ * (findEngineBinary, which also honours the older SUMMER_ENGINE_BINARY).
80
+ * An explicit override is never silently swapped for the installed engine:
81
+ * a missing path or a bare `.app` bundle is an error, because the caller
82
+ * asked for THAT build (docs/design/archive/TK-VS-FOLD-2026-09-07.md, gap 5).
83
+ */
84
+ export function resolveRunBinary(binFlag, env = process.env) {
85
+ const fromEnv = engineBinaryOverride(env);
86
+ const explicit = binFlag?.trim()
87
+ ? { source: "--bin", path: binFlag.trim() }
88
+ : fromEnv?.name === ENGINE_BIN_ENV
89
+ ? { source: ENGINE_BIN_ENV, path: fromEnv.path }
90
+ : null;
91
+ if (explicit) {
92
+ const path = resolve(explicit.path);
93
+ const problem = describeEngineExecutableProblem(path, explicit.source);
94
+ return problem ? { binary: null, error: problem } : { binary: path, source: explicit.source };
95
+ }
96
+ const installed = findEngineBinary();
97
+ if (!installed) {
98
+ return {
99
+ binary: null,
100
+ error: "Summer Engine not found. Install it first:\n" +
101
+ " summer install\n" +
102
+ " or download from https://summerengine.com/download\n" +
103
+ `To launch a build that is not installed, pass --bin <executable> or set ${ENGINE_BIN_ENV}.`,
104
+ };
105
+ }
106
+ return { binary: installed, source: "installed" };
107
+ }
108
+ export const runCommand = new Command("run")
109
+ .description("Launch Summer Engine with a project. Without a path it launches a bare " +
110
+ "detached editor (project manager), which requires --no-project.")
111
+ .argument("[path]", "Path to a project directory (must contain project.godot)")
112
+ .option("--no-project", "Launch a bare detached editor (project manager) without opening a project")
113
+ .option("--background", "Launch without taking focus: the window exists but stays behind until clicked " +
114
+ "(default when stdout is not a terminal, i.e. an agent is driving)")
115
+ .option("--focus", "Launch and bring the editor to the front (default when a human runs this in a terminal)")
116
+ .option("--bin <path>", `Engine executable to launch instead of the installed one (env: ${ENGINE_BIN_ENV}). ` +
117
+ "On macOS this is the executable inside the bundle, e.g. /path/Summer.app/Contents/MacOS/Summer, never the .app itself")
118
+ .action(async (projectPath, opts) => {
119
+ // Posture is decided up front so a bad flag combination fails before any
120
+ // filesystem or engine work. Why the TTY heuristic: a human at a terminal
121
+ // typed `summer run` to SEE the editor; an agent (no TTY on stdout) is
122
+ // launching it as a means to an end while the user works on something else
123
+ // and must not be interrupted. See src/core/launch-posture.ts.
124
+ let posture;
125
+ try {
126
+ posture = resolveLaunchPosture({ focus: opts.focus, background: opts.background }, { stdoutIsTTY: process.stdout.isTTY === true });
127
+ }
128
+ catch (error) {
129
+ console.error(error.message);
130
+ process.exitCode = 1;
131
+ return;
132
+ }
133
+ const fullProjectPath = projectPath ? resolve(projectPath) : null;
134
+ if (!fullProjectPath && opts.project !== false) {
135
+ console.error("summer run needs a project path (a directory containing project.godot).\n" +
136
+ "To launch a bare editor without a project, pass --no-project.");
137
+ process.exitCode = 1;
138
+ return;
139
+ }
140
+ if (fullProjectPath) {
141
+ if (!existsSync(fullProjectPath)) {
142
+ console.error(`Directory not found: ${fullProjectPath}`);
143
+ process.exit(1);
144
+ }
145
+ if (!existsSync(join(fullProjectPath, "project.godot"))) {
146
+ console.error(`No project.godot found in ${fullProjectPath}\n` +
147
+ "This doesn't look like a Summer Engine project.");
148
+ process.exit(1);
149
+ }
150
+ }
151
+ await withLaunchLock(async () => {
152
+ const port = await getApiPort();
153
+ const health = await checkEngineHealth(port);
154
+ if (health) {
155
+ const runningProjectPath = health.project_path
156
+ ? resolve(health.project_path)
157
+ : null;
158
+ if (!fullProjectPath || runningProjectPath === fullProjectPath) {
159
+ console.log(`Summer Engine is already running (v${health.version}) on port ${port}`);
160
+ if (health.project_name) {
161
+ console.log(` Project: ${health.project_name}`);
162
+ }
163
+ if (health.project_path) {
164
+ console.log(` Path: ${health.project_path}`);
165
+ }
166
+ return;
167
+ }
168
+ console.log(`Summer Engine is already running (v${health.version}) on port ${port}`);
169
+ console.log(` Current project: ${health.project_path ?? health.project_name ?? "unknown"}`);
170
+ console.error(`Refusing to launch a second editor for: ${fullProjectPath}\n` +
171
+ "Close or switch the current Summer Engine project first, then run this command again.");
172
+ process.exitCode = 1;
173
+ return;
174
+ }
175
+ const resolved = resolveRunBinary(opts.bin);
176
+ if (resolved.binary === null) {
177
+ console.error(resolved.error);
178
+ process.exitCode = 1;
179
+ return;
180
+ }
181
+ const binary = resolved.binary;
182
+ if (resolved.source !== "installed") {
183
+ console.log(`Using engine from ${resolved.source}: ${binary}`);
184
+ }
185
+ // The engine is not running yet, so /api/health cannot tell us whether
186
+ // it honours --summer-background. Ask THAT binary itself (`--help`, which
187
+ // exits headless before any window exists; cached per install) with the
188
+ // installed version as pre-check and fallback; pass the flag only when
189
+ // the engine is known to support it. Focus launches have nothing to decide.
190
+ const support = posture === "background" ? await detectBackgroundLaunchSupport(binary) : backgroundLaunchSupport(null);
191
+ const plan = planLaunch(posture, support);
192
+ const args = ["--editor", ...plan.extraArgs];
193
+ if (fullProjectPath) {
194
+ args.unshift("--path", fullProjectPath);
195
+ }
196
+ if (plan.note)
197
+ console.log(plan.note);
198
+ console.log(plan.background
199
+ ? "Launching Summer Engine in the background (the window will not take focus until you click it)..."
200
+ : "Launching Summer Engine...");
201
+ // Direct executable, never `open -a`: LaunchServices activates whatever
202
+ // it opens and would defeat --summer-background regardless of flags.
203
+ const child = spawn(binary, args, { detached: true, stdio: "ignore" });
204
+ // A stale or non-executable binary surfaces as an async "error" event
205
+ // (ENOENT/EACCES). Without a listener Node raises it as an uncaught
206
+ // exception with a raw stack; catch it and report the path instead.
207
+ const spawnState = { error: null };
208
+ child.on("error", (error) => {
209
+ spawnState.error = error;
210
+ });
211
+ child.unref();
212
+ // Wait for engine to start responding
213
+ const startTime = Date.now();
214
+ const timeout = 20000;
215
+ while (Date.now() - startTime < timeout) {
216
+ await sleep(500);
217
+ if (spawnState.error) {
218
+ reportSpawnFailure(spawnState.error, binary);
219
+ return;
220
+ }
221
+ const newPort = await getApiPort();
222
+ const h = await checkEngineHealth(newPort);
223
+ if (h) {
224
+ console.log(`Summer Engine running (v${h.version}) on port ${newPort}`);
225
+ if (h.project_name) {
226
+ console.log(` Project: ${h.project_name}`);
227
+ }
228
+ // Background was wanted but the flag was withheld, and the running
229
+ // engine now says (capabilities.launchPostures, else its version)
230
+ // that it would have honoured it: say so, so the next launch can be
231
+ // fixed rather than silently repeating a focus launch.
232
+ if (posture === "background" && !plan.background) {
233
+ const advert = advertisedBackgroundPosture(h.capabilities);
234
+ const wouldHonour = advert ?? backgroundLaunchSupport(h.version).supported;
235
+ if (wouldHonour) {
236
+ console.log(` Note: this engine (v${h.version}) ${advert ? "advertises" : "should support"} background launches (${BACKGROUND_LAUNCH_FLAG}, ${BACKGROUND_LAUNCH_MIN_ENGINE_VERSION}+), but that could not be confirmed before launch on this platform.`);
237
+ }
238
+ }
239
+ return;
240
+ }
241
+ }
242
+ if (spawnState.error) {
243
+ reportSpawnFailure(spawnState.error, binary);
244
+ return;
245
+ }
246
+ console.log("Summer Engine launched but API not responding yet.\n" +
247
+ "It may still be loading. Run 'summer status' to check.");
248
+ });
249
+ });
250
+ function reportSpawnFailure(error, binary) {
251
+ const code = error.code ?? error.message;
252
+ console.error(`Summer Engine binary failed to start: ${code} (${binary})\n` +
253
+ "Re-run 'summer install' to repair the installation, or check the binary path.");
254
+ process.exitCode = 1;
255
+ }