summer-engine 2.8.2 → 3.1.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.
- package/.claude-plugin/marketplace.json +27 -7
- package/.claude-plugin/plugin.json +99 -83
- package/.codex-plugin/plugin.json +112 -82
- package/.cursor-plugin/plugin.json +119 -83
- package/.factory-plugin/plugin.json +100 -3
- package/.mcp.json +6 -1
- package/.opencode/INSTALL.md +7 -4
- package/.opencode/plugins/summer.js +31 -18
- package/AGENTS.md +107 -34
- package/CHANGELOG.md +149 -44
- package/CLAUDE.md +4 -2
- package/GEMINI.md +7 -53
- package/NOTICE +31 -0
- package/README.md +161 -393
- package/assets/api-docs.json.gz +0 -0
- package/assets/autopilot/README.md +20 -6
- package/assets/autopilot/autopilot.gd +80 -26
- package/assets/autopilot/run.sh +132 -7
- package/assets/navigation/web-routes.json +719 -0
- package/commands/gameskill.md +10 -108
- package/commands/summer.md +72 -4
- package/dist/bin/summer.js +6 -87
- package/dist/cli/banner.d.ts +1 -0
- package/dist/cli/banner.js +33 -0
- package/dist/{commands → cli/commands}/config.js +1 -1
- package/dist/cli/commands/create.d.ts +30 -0
- package/dist/cli/commands/create.js +212 -0
- package/dist/{commands → cli/commands}/debug.js +2 -2
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.js +18 -0
- package/dist/cli/commands/events.d.ts +57 -0
- package/dist/cli/commands/events.js +158 -0
- package/dist/cli/commands/install.d.ts +50 -0
- package/dist/cli/commands/install.js +447 -0
- package/dist/cli/commands/list.js +72 -0
- package/dist/{commands → cli/commands}/login.js +33 -17
- package/dist/{commands → cli/commands}/logout.d.ts +1 -0
- package/dist/cli/commands/logout.js +19 -0
- package/dist/{commands → cli/commands}/memory.d.ts +1 -8
- package/dist/{commands → cli/commands}/memory.js +20 -11
- package/dist/cli/commands/open.d.ts +45 -0
- package/dist/cli/commands/open.js +216 -0
- package/dist/{commands → cli/commands}/plan.js +2 -2
- package/dist/{commands → cli/commands}/publish.js +1 -1
- package/dist/{commands → cli/commands}/releases.js +1 -1
- package/dist/cli/commands/run.d.ts +19 -0
- package/dist/cli/commands/run.js +255 -0
- package/dist/cli/commands/setup.js +158 -0
- package/dist/{commands → cli/commands}/skills.js +121 -251
- package/dist/{commands → cli/commands}/status.d.ts +1 -0
- package/dist/cli/commands/status.js +62 -0
- package/dist/cli/commands/tool.d.ts +11 -0
- package/dist/cli/commands/tool.js +121 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.js +89 -0
- package/dist/cli/root-action.d.ts +7 -0
- package/dist/cli/root-action.js +15 -0
- package/dist/{lib → core}/api-client.d.ts +106 -15
- package/dist/{lib → core}/api-client.js +267 -75
- package/dist/{lib → core}/async-op-lifecycle.d.ts +3 -4
- package/dist/{lib → core}/async-op-lifecycle.js +3 -4
- package/dist/{lib → core}/auth.d.ts +14 -6
- package/dist/{lib → core}/auth.js +56 -40
- package/dist/core/capabilities/agent-playbook.d.ts +20 -0
- package/dist/core/capabilities/agent-playbook.js +218 -0
- package/dist/core/capabilities/api-docs.d.ts +36 -0
- package/dist/core/capabilities/api-docs.js +118 -0
- package/dist/core/capabilities/asset-import.d.ts +49 -0
- package/dist/core/capabilities/asset-import.js +134 -0
- package/dist/core/capabilities/camera-view.d.ts +98 -0
- package/dist/core/capabilities/camera-view.js +222 -0
- package/dist/core/capabilities/capture.d.ts +63 -0
- package/dist/core/capabilities/capture.js +67 -0
- package/dist/core/capabilities/console-read.d.ts +17 -0
- package/dist/core/capabilities/console-read.js +21 -0
- package/dist/{lib → core/capabilities}/creator.d.ts +1 -29
- package/dist/{lib → core/capabilities}/creator.js +14 -33
- package/dist/{lib → core/capabilities}/debug-report.d.ts +1 -1
- package/dist/{lib → core/capabilities}/debug-report.js +12 -31
- package/dist/{commands → core/capabilities}/doctor.d.ts +7 -2
- package/dist/{commands → core/capabilities}/doctor.js +47 -73
- package/dist/core/capabilities/engine-fallbacks.d.ts +26 -0
- package/dist/core/capabilities/engine-fallbacks.js +36 -0
- package/dist/core/capabilities/engine-ops.d.ts +33 -0
- package/dist/core/capabilities/engine-ops.js +145 -0
- package/dist/core/capabilities/engine-receipt.d.ts +53 -0
- package/dist/core/capabilities/engine-receipt.js +134 -0
- package/dist/core/capabilities/events.d.ts +200 -0
- package/dist/core/capabilities/events.js +383 -0
- package/dist/core/capabilities/fabricate-mesh.d.ts +111 -0
- package/dist/core/capabilities/fabricate-mesh.js +165 -0
- package/dist/core/capabilities/frame-quality.d.ts +71 -0
- package/dist/core/capabilities/frame-quality.js +449 -0
- package/dist/core/capabilities/game-task-plan.d.ts +66 -0
- package/dist/{lib → core/capabilities}/game-task-plan.js +59 -8
- package/dist/core/capabilities/hdri-import.d.ts +90 -0
- package/dist/core/capabilities/hdri-import.js +250 -0
- package/dist/core/capabilities/image-generation.d.ts +24 -0
- package/dist/core/capabilities/image-generation.js +22 -0
- package/dist/core/capabilities/navigation/open.d.ts +156 -0
- package/dist/core/capabilities/navigation/open.js +567 -0
- package/dist/core/capabilities/navigation/render-product-map.d.ts +1 -0
- package/dist/core/capabilities/navigation/render-product-map.js +84 -0
- package/dist/core/capabilities/navigation/targets.d.ts +87 -0
- package/dist/core/capabilities/navigation/targets.js +250 -0
- package/dist/core/capabilities/play-determinism.d.ts +35 -0
- package/dist/core/capabilities/play-determinism.js +86 -0
- package/dist/core/capabilities/project-context.d.ts +114 -0
- package/dist/core/capabilities/project-context.js +249 -0
- package/dist/core/capabilities/runtime-control.d.ts +540 -0
- package/dist/core/capabilities/runtime-control.js +1011 -0
- package/dist/core/capabilities/scene-kind.d.ts +19 -0
- package/dist/core/capabilities/scene-kind.js +137 -0
- package/dist/core/capabilities/scene-script.d.ts +38 -0
- package/dist/core/capabilities/scene-script.js +45 -0
- package/dist/core/capabilities/tool-dispatch.d.ts +42 -0
- package/dist/core/capabilities/tool-dispatch.js +1490 -0
- package/dist/core/capabilities/ui-control.d.ts +179 -0
- package/dist/core/capabilities/ui-control.js +423 -0
- package/dist/core/capabilities/variant-types.d.ts +22 -0
- package/dist/core/capabilities/variant-types.js +101 -0
- package/dist/core/capability-skew.d.ts +205 -0
- package/dist/core/capability-skew.js +386 -0
- package/dist/{lib → core}/config.d.ts +11 -1
- package/dist/{lib → core}/config.js +13 -2
- package/dist/core/embeddings.d.ts +78 -0
- package/dist/core/embeddings.js +166 -0
- package/dist/core/engine-install.d.ts +105 -0
- package/dist/core/engine-install.js +190 -0
- package/dist/core/engine.d.ts +94 -0
- package/dist/{lib → core}/engine.js +74 -28
- package/dist/core/feedback/client.d.ts +88 -0
- package/dist/core/feedback/client.js +182 -0
- package/dist/{lib → core}/format.d.ts +0 -1
- package/dist/{lib → core}/format.js +1 -1
- package/dist/core/headless/connection.d.ts +86 -0
- package/dist/core/headless/connection.js +97 -0
- package/dist/core/headless/editor-connection.d.ts +26 -0
- package/dist/core/headless/editor-connection.js +81 -0
- package/dist/core/headless/mcp-routing.d.ts +38 -0
- package/dist/core/headless/mcp-routing.js +83 -0
- package/dist/core/headless/registry.d.ts +91 -0
- package/dist/core/headless/registry.js +226 -0
- package/dist/core/headless/resolve.d.ts +46 -0
- package/dist/core/headless/resolve.js +75 -0
- package/dist/core/headless/spawn.d.ts +46 -0
- package/dist/core/headless/spawn.js +205 -0
- package/dist/core/headless/worker-connection.d.ts +96 -0
- package/dist/core/headless/worker-connection.js +353 -0
- package/dist/core/headless/worker-engine-client.d.ts +58 -0
- package/dist/core/headless/worker-engine-client.js +246 -0
- package/dist/core/launch-posture.d.ts +170 -0
- package/dist/core/launch-posture.js +317 -0
- package/dist/core/library-read.d.ts +73 -0
- package/dist/core/library-read.js +279 -0
- package/dist/core/library-search.d.ts +143 -0
- package/dist/core/library-search.js +301 -0
- package/dist/{lib → core}/log-filters.js +4 -2
- package/dist/{lib → core}/mcp-log.js +2 -17
- package/dist/core/package-root.d.ts +9 -0
- package/dist/core/package-root.js +11 -0
- package/dist/core/redact.d.ts +20 -0
- package/dist/core/redact.js +64 -0
- package/dist/core/registry-search.d.ts +167 -0
- package/dist/core/registry-search.js +358 -0
- package/dist/core/skills-registry.d.ts +55 -0
- package/dist/core/skills-registry.js +106 -0
- package/dist/{lib → core}/store.js +11 -7
- package/dist/{lib → core}/summer-compatibility.js +3 -3
- package/dist/{lib → core}/telemetry.js +5 -2
- package/dist/core/templates.d.ts +98 -0
- package/dist/core/templates.js +241 -0
- package/dist/core/tool-errors.d.ts +30 -0
- package/dist/core/tool-errors.js +40 -0
- package/dist/core/trajectory.d.ts +80 -0
- package/dist/core/trajectory.js +307 -0
- package/dist/core/util/http.d.ts +13 -0
- package/dist/core/util/http.js +28 -0
- package/dist/core/util/json.d.ts +12 -0
- package/dist/core/util/json.js +21 -0
- package/dist/core/util/process.d.ts +3 -0
- package/dist/core/util/process.js +13 -0
- package/dist/core/util/sleep.d.ts +1 -0
- package/dist/core/util/sleep.js +3 -0
- package/dist/core/version.d.ts +3 -0
- package/dist/core/version.js +5 -0
- package/dist/installer/agent-config.d.ts +63 -0
- package/dist/installer/agent-config.js +540 -0
- package/dist/installer/agent-table.d.ts +103 -0
- package/dist/installer/agent-table.js +584 -0
- package/dist/installer/legacy-skills.d.ts +26 -0
- package/dist/installer/legacy-skills.js +53 -0
- package/dist/installer/setup.d.ts +76 -0
- package/dist/installer/setup.js +148 -0
- package/dist/installer/skill-locations.d.ts +36 -0
- package/dist/installer/skill-locations.js +91 -0
- package/dist/installer/version-check.d.ts +178 -0
- package/dist/installer/version-check.js +479 -0
- package/dist/{lib/mcp-boot-notice.d.ts → mcp/boot-notice.d.ts} +1 -1
- package/dist/{commands/mcp.js → mcp/command.js} +18 -6
- package/dist/mcp/server.d.ts +23 -3
- package/dist/mcp/server.js +122 -28
- package/dist/mcp/tools/asset-tools.js +62 -142
- package/dist/mcp/tools/creator-tools.js +5 -23
- package/dist/mcp/tools/debug-tools.js +61 -18
- package/dist/mcp/tools/event-tools.d.ts +14 -0
- package/dist/mcp/tools/event-tools.js +41 -0
- package/dist/mcp/tools/fabricate-tools.d.ts +2 -0
- package/dist/mcp/tools/fabricate-tools.js +28 -0
- package/dist/mcp/tools/feedback-tools.d.ts +77 -0
- package/dist/mcp/tools/feedback-tools.js +88 -0
- package/dist/mcp/tools/file-tools.js +6 -53
- package/dist/mcp/tools/generate-tools.js +37 -63
- package/dist/mcp/tools/library-tools.d.ts +11 -0
- package/dist/mcp/tools/library-tools.js +42 -0
- package/dist/mcp/tools/navigation-tools.d.ts +7 -0
- package/dist/mcp/tools/navigation-tools.js +37 -0
- package/dist/mcp/tools/perception-tools.d.ts +20 -0
- package/dist/mcp/tools/perception-tools.js +146 -0
- package/dist/mcp/tools/project-tools.d.ts +14 -0
- package/dist/mcp/tools/project-tools.js +72 -281
- package/dist/mcp/tools/runtime-tools.d.ts +2 -0
- package/dist/mcp/tools/runtime-tools.js +92 -0
- package/dist/mcp/tools/scene-tools.d.ts +3 -0
- package/dist/mcp/tools/scene-tools.js +68 -119
- package/dist/mcp/tools/script-tools.d.ts +3 -0
- package/dist/mcp/tools/script-tools.js +118 -0
- package/dist/mcp/tools/spatial-tools.d.ts +2 -0
- package/dist/mcp/tools/spatial-tools.js +485 -0
- package/dist/mcp/tools/text-json.d.ts +8 -0
- package/dist/mcp/tools/text-json.js +12 -0
- package/dist/mcp/tools/{cloud-tools.d.ts → ui-tools.d.ts} +1 -1
- package/dist/mcp/tools/ui-tools.js +82 -0
- package/dist/mcp/tools/visual-tools.d.ts +2 -7
- package/dist/mcp/tools/visual-tools.js +383 -101
- package/dist/mcp/tools/with-engine.d.ts +9 -15
- package/dist/mcp/tools/with-engine.js +60 -96
- package/dist/project-memory/project-manifest.d.ts +36 -0
- package/dist/project-memory/project-manifest.js +50 -0
- package/dist/project-memory/project-memory.d.ts +57 -0
- package/dist/{lib → project-memory}/project-memory.js +46 -0
- package/gemini-extension.json +103 -2
- package/hooks/hooks-cursor.json +2 -2
- package/hooks/hooks.json +2 -1
- package/hooks/pre-commit-doctor.sh +45 -39
- package/hooks/run-hook.cmd +30 -23
- package/hooks/run-hook.sh +20 -0
- package/hooks/session-start.sh +18 -7
- package/integrations/README.md +99 -0
- package/integrations/amp/README.md +12 -0
- package/integrations/amp/manifest-target.json +3 -0
- package/integrations/antigravity/README.md +12 -0
- package/integrations/antigravity/manifest-target.json +3 -0
- package/integrations/claude/README.md +19 -0
- package/integrations/claude/manifest-target.json +16 -0
- package/integrations/claude-desktop/README.md +12 -0
- package/integrations/claude-desktop/manifest-target.json +3 -0
- package/integrations/cline/README.md +12 -0
- package/integrations/cline/manifest-target.json +3 -0
- package/integrations/cline-cli/README.md +12 -0
- package/integrations/cline-cli/manifest-target.json +3 -0
- package/integrations/codex/README.md +15 -0
- package/integrations/codex/manifest-target.json +5 -0
- package/integrations/copilot-jetbrains/README.md +12 -0
- package/integrations/copilot-jetbrains/manifest-target.json +3 -0
- package/integrations/crush/README.md +12 -0
- package/integrations/crush/manifest-target.json +3 -0
- package/integrations/cursor/README.md +16 -0
- package/integrations/cursor/manifest-target.json +5 -0
- package/integrations/factory/README.md +26 -0
- package/integrations/factory/manifest-target.json +5 -0
- package/integrations/gemini/README.md +26 -0
- package/integrations/gemini/manifest-target.json +5 -0
- package/integrations/github-copilot/README.md +12 -0
- package/integrations/github-copilot/manifest-target.json +3 -0
- package/integrations/goose/README.md +12 -0
- package/integrations/goose/manifest-target.json +3 -0
- package/integrations/grok-build/README.md +12 -0
- package/integrations/grok-build/manifest-target.json +3 -0
- package/integrations/hermes/README.md +12 -0
- package/integrations/hermes/manifest-target.json +3 -0
- package/integrations/junie/README.md +12 -0
- package/integrations/junie/manifest-target.json +3 -0
- package/integrations/kilo-code/README.md +12 -0
- package/integrations/kilo-code/manifest-target.json +3 -0
- package/integrations/kimi-code/README.md +12 -0
- package/integrations/kimi-code/manifest-target.json +3 -0
- package/integrations/kiro/README.md +12 -0
- package/integrations/kiro/manifest-target.json +3 -0
- package/integrations/lm-studio/README.md +12 -0
- package/integrations/lm-studio/manifest-target.json +3 -0
- package/integrations/mistral-vibe/README.md +12 -0
- package/integrations/mistral-vibe/manifest-target.json +3 -0
- package/integrations/opencode/README.md +12 -0
- package/integrations/opencode/manifest-target.json +3 -0
- package/integrations/qoder/README.md +12 -0
- package/integrations/qoder/manifest-target.json +3 -0
- package/integrations/qwen-code/README.md +12 -0
- package/integrations/qwen-code/manifest-target.json +3 -0
- package/integrations/roo-code/README.md +14 -0
- package/integrations/roo-code/manifest-target.json +3 -0
- package/integrations/rovo-dev/README.md +12 -0
- package/integrations/rovo-dev/manifest-target.json +3 -0
- package/integrations/trae/README.md +12 -0
- package/integrations/trae/manifest-target.json +3 -0
- package/integrations/visual-studio/README.md +12 -0
- package/integrations/visual-studio/manifest-target.json +3 -0
- package/integrations/vscode-copilot/README.md +12 -0
- package/integrations/vscode-copilot/manifest-target.json +3 -0
- package/integrations/warp/README.md +12 -0
- package/integrations/warp/manifest-target.json +3 -0
- package/integrations/windsurf/README.md +12 -0
- package/integrations/windsurf/manifest-target.json +3 -0
- package/integrations/zed/README.md +12 -0
- package/integrations/zed/manifest-target.json +3 -0
- package/library/references/collaborative-protocol/resource.yaml +24 -0
- package/library/references/gd-style/resource.yaml +24 -0
- package/{references → library/references/godot-version}/godot-version.md +6 -6
- package/library/references/godot-version/resource.yaml +22 -0
- package/library/references/headless-routing/headless-routing.md +46 -0
- package/library/references/headless-routing/resource.yaml +24 -0
- package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +49 -0
- package/library/references/mcp-fresh-chat-playbook/resource.yaml +23 -0
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +271 -0
- package/library/references/mcp-tools-reference/resource.yaml +17 -0
- package/library/references/product-map/product-map.md +103 -0
- package/library/references/product-map/resource.yaml +33 -0
- package/{references → library/references/public-surface-language}/public-surface-language.md +5 -7
- package/library/references/public-surface-language/resource.yaml +17 -0
- package/library/references/summer-folder/resource.yaml +20 -0
- package/{references → library/references/summer-folder}/summer-folder.md +22 -21
- package/{skills/rendering-and-lighting → library/skills}/3d-lighting/SKILL.md +15 -11
- package/library/skills/3d-lighting/resource.yaml +27 -0
- package/library/skills/README.md +242 -0
- package/{skills/audio → library/skills}/adaptive-music/SKILL.md +1 -1
- package/library/skills/adaptive-music/resource.yaml +28 -0
- package/library/skills/agent-playtesting/SKILL.md +148 -0
- package/library/skills/agent-playtesting/resource.yaml +52 -0
- package/library/skills/ambient-bed/resource.yaml +24 -0
- package/{skills/video → library/skills}/animated-loop/SKILL.md +1 -1
- package/library/skills/animated-loop/resource.yaml +27 -0
- package/{skills/animation → library/skills}/animation-tree/SKILL.md +29 -14
- package/library/skills/animation-tree/resource.yaml +33 -0
- package/{skills/rendering-and-lighting → library/skills}/art-direction/SKILL.md +3 -3
- package/library/skills/art-direction/resource.yaml +29 -0
- package/{skills/asset-pipeline → library/skills}/asset-strategy/SKILL.md +44 -44
- package/library/skills/asset-strategy/resource.yaml +63 -0
- package/{skills/audio → library/skills}/audio-direction/SKILL.md +7 -7
- package/library/skills/audio-direction/resource.yaml +32 -0
- package/library/skills/auto-fire-targeting/resource.yaml +22 -0
- package/{skills/scene-and-project → library/skills}/brainstorm-game/SKILL.md +8 -8
- package/library/skills/brainstorm-game/resource.yaml +30 -0
- package/{skills/workflow → library/skills}/brainstorming/SKILL.md +2 -22
- package/library/skills/brainstorming/resource.yaml +23 -0
- package/{skills/workflow → library/skills}/brainstorming/spec-document-reviewer-prompt.md +1 -1
- package/{skills/scene-and-project → library/skills}/browse-templates/SKILL.md +18 -18
- package/library/skills/browse-templates/resource.yaml +23 -0
- package/library/skills/celeste-momentum-platforming/SKILL.md +366 -0
- package/library/skills/celeste-momentum-platforming/resource.yaml +33 -0
- package/library/skills/character-animation-wiring/SKILL.md +249 -0
- package/library/skills/character-animation-wiring/resource.yaml +39 -0
- package/{skills/3d-assets → library/skills}/character-model/SKILL.md +25 -25
- package/library/skills/character-model/resource.yaml +36 -0
- package/{skills/2d-assets → library/skills}/character-portrait/SKILL.md +14 -14
- package/library/skills/character-portrait/resource.yaml +30 -0
- package/{skills/video → library/skills}/cinematic-cutscene/SKILL.md +2 -2
- package/library/skills/cinematic-cutscene/resource.yaml +29 -0
- package/{skills/2d-assets → library/skills}/concept-art/SKILL.md +15 -15
- package/library/skills/concept-art/resource.yaml +34 -0
- package/{skills/2d-assets → library/skills}/create-asset-sheet/SKILL.md +8 -8
- package/library/skills/create-asset-sheet/resource.yaml +33 -0
- package/{skills/debugging → library/skills}/debug/SKILL.md +3 -3
- package/library/skills/debug/resource.yaml +31 -0
- package/{skills/workflow → library/skills}/debugging-game-feel/SKILL.md +11 -11
- package/library/skills/debugging-game-feel/resource.yaml +25 -0
- package/{skills/level-design → library/skills}/design-level/SKILL.md +6 -6
- package/library/skills/design-level/resource.yaml +31 -0
- package/{skills/gameplay-mechanics → library/skills}/design-mechanic/SKILL.md +3 -3
- package/library/skills/design-mechanic/resource.yaml +31 -0
- package/{skills/ai-and-npcs → library/skills}/design-npc/SKILL.md +7 -3
- package/library/skills/design-npc/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/diagnosing-perf-regressions/SKILL.md +10 -10
- package/library/skills/diagnosing-perf-regressions/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/dispatching-parallel-agents/SKILL.md +8 -8
- package/library/skills/dispatching-parallel-agents/resource.yaml +23 -0
- package/library/skills/driving-the-editor-ui/SKILL.md +85 -0
- package/library/skills/driving-the-editor-ui/resource.yaml +46 -0
- package/{skills/3d-assets → library/skills}/environment-kit/SKILL.md +11 -11
- package/library/skills/environment-kit/resource.yaml +29 -0
- package/{skills/deployment → library/skills}/export-and-ship/SKILL.md +5 -5
- package/library/skills/export-and-ship/resource.yaml +32 -0
- package/library/skills/fabricating-assets/SKILL.md +195 -0
- package/library/skills/fabricating-assets/resource.yaml +52 -0
- package/{skills/animation → library/skills}/facial-and-lipsync/SKILL.md +23 -11
- package/library/skills/facial-and-lipsync/resource.yaml +36 -0
- package/{skills/character-controllers → library/skills}/fps-controller/SKILL.md +8 -4
- package/library/skills/fps-controller/resource.yaml +29 -0
- package/{skills/visual-effects → library/skills}/game-feel/SKILL.md +7 -7
- package/library/skills/game-feel/resource.yaml +27 -0
- package/library/skills/gameskill/SKILL.md +64 -0
- package/library/skills/gameskill/resource.yaml +22 -0
- package/library/skills/gdscript-patterns/resource.yaml +23 -0
- package/{skills/animation → library/skills}/generate-motion/SKILL.md +16 -16
- package/library/skills/generate-motion/resource.yaml +34 -0
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +223 -0
- package/library/skills/godogen-visual-proof-game-generation/resource.yaml +33 -0
- package/{skills/workflow → library/skills}/headless-scripting/SKILL.md +14 -7
- package/library/skills/headless-scripting/resource.yaml +26 -0
- package/library/skills/host-authoritative-state/resource.yaml +28 -0
- package/{skills/2d-assets → library/skills}/instantiate-asset-pack/SKILL.md +10 -12
- package/library/skills/instantiate-asset-pack/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/investigating-bugs/SKILL.md +4 -4
- package/{skills/workflow → library/skills}/investigating-bugs/condition-based-waiting.md +8 -8
- package/library/skills/investigating-bugs/resource.yaml +24 -0
- package/{skills/workflow → library/skills}/investigating-bugs/root-cause-tracing.md +1 -7
- package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +164 -0
- package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +35 -0
- package/{skills/scene-and-project → library/skills}/make-game/SKILL.md +22 -22
- package/library/skills/make-game/resource.yaml +35 -0
- package/library/skills/music-track/resource.yaml +28 -0
- package/library/skills/navigate-summer/SKILL.md +61 -0
- package/library/skills/navigate-summer/resource.yaml +35 -0
- package/{skills/scene-and-project → library/skills}/new-project/SKILL.md +10 -10
- package/library/skills/new-project/resource.yaml +28 -0
- package/{skills/3d-assets → library/skills}/organic-model/SKILL.md +16 -16
- package/library/skills/organic-model/resource.yaml +32 -0
- package/{skills/multiplayer-and-networking → library/skills}/peer-to-peer-multiplayer/SKILL.md +2 -2
- package/library/skills/peer-to-peer-multiplayer/resource.yaml +28 -0
- package/{skills/2d-assets → library/skills}/pixel-art/SKILL.md +13 -13
- package/library/skills/pixel-art/resource.yaml +31 -0
- package/library/skills/play/resource.yaml +26 -0
- package/{skills/workflow → library/skills}/playtesting-a-feature/SKILL.md +41 -22
- package/library/skills/playtesting-a-feature/resource.yaml +31 -0
- package/{skills/animation → library/skills}/procedural-animation/SKILL.md +25 -10
- package/library/skills/procedural-animation/resource.yaml +33 -0
- package/{skills/3d-assets → library/skills}/prop-model/SKILL.md +13 -13
- package/library/skills/prop-model/resource.yaml +33 -0
- package/library/skills/psx-retro-rendering/SKILL.md +416 -0
- package/library/skills/psx-retro-rendering/resource.yaml +36 -0
- package/library/skills/realtime-wet-surfaces/SKILL.md +189 -0
- package/library/skills/realtime-wet-surfaces/resource.yaml +31 -0
- package/{skills/deployment → library/skills}/remote-deploy/SKILL.md +3 -3
- package/library/skills/remote-deploy/resource.yaml +23 -0
- package/{skills/animation → library/skills}/retarget/SKILL.md +15 -14
- package/library/skills/retarget/resource.yaml +33 -0
- package/library/skills/running-in-the-cloud/SKILL.md +103 -0
- package/library/skills/running-in-the-cloud/resource.yaml +33 -0
- package/{skills/scene-and-project → library/skills}/scene-composition/SKILL.md +8 -0
- package/library/skills/scene-composition/resource.yaml +27 -0
- package/library/skills/scene-hierarchy-design/SKILL.md +102 -0
- package/library/skills/scene-hierarchy-design/resource.yaml +31 -0
- package/library/skills/scene-scripting/SKILL.md +764 -0
- package/library/skills/scene-scripting/resource.yaml +58 -0
- package/{skills/level-design → library/skills}/scene-to-level/SKILL.md +16 -17
- package/library/skills/scene-to-level/resource.yaml +33 -0
- package/library/skills/setup-multiplayer/resource.yaml +28 -0
- package/library/skills/skill-create/SKILL.md +138 -0
- package/library/skills/skill-create/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/skill-improve/SKILL.md +2 -2
- package/library/skills/skill-improve/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/skill-test/SKILL.md +4 -4
- package/library/skills/skill-test/resource.yaml +26 -0
- package/library/skills/skintokens-auto-rigging/SKILL.md +200 -0
- package/library/skills/skintokens-auto-rigging/resource.yaml +38 -0
- package/{skills/2d-assets → library/skills}/skybox-panorama/SKILL.md +8 -8
- package/library/skills/skybox-panorama/resource.yaml +28 -0
- package/{skills/audio → library/skills}/sound-effect/SKILL.md +2 -2
- package/library/skills/sound-effect/resource.yaml +27 -0
- package/library/skills/spatial-placement/SKILL.md +74 -0
- package/library/skills/spatial-placement/resource.yaml +42 -0
- package/library/skills/spatial-placement/tests/spec.md +65 -0
- package/{skills/2d-assets → library/skills}/sprite-sheet/SKILL.md +12 -12
- package/library/skills/sprite-sheet/resource.yaml +32 -0
- package/{skills/2d-assets → library/skills}/tileable-texture/SKILL.md +9 -9
- package/library/skills/tileable-texture/resource.yaml +31 -0
- package/{skills/video → library/skills}/trailer-shot/SKILL.md +1 -1
- package/library/skills/trailer-shot/resource.yaml +27 -0
- package/{skills/performance → library/skills}/tune-performance/SKILL.md +6 -6
- package/library/skills/tune-performance/resource.yaml +31 -0
- package/library/skills/ui-basics/resource.yaml +25 -0
- package/{skills/2d-assets → library/skills}/ui-graphics/SKILL.md +11 -11
- package/library/skills/ui-graphics/resource.yaml +29 -0
- package/{skills/2d-assets → library/skills}/use-widget-asset/SKILL.md +4 -4
- package/library/skills/use-widget-asset/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/using-summer/SKILL.md +12 -9
- package/library/skills/using-summer/resource.yaml +41 -0
- package/{skills/3d-assets → library/skills}/vehicle-model/SKILL.md +18 -18
- package/library/skills/vehicle-model/resource.yaml +34 -0
- package/{skills/workflow → library/skills}/verification-before-completion/SKILL.md +10 -10
- package/library/skills/verification-before-completion/resource.yaml +23 -0
- package/library/skills/verifying-scenes/SKILL.md +98 -0
- package/library/skills/verifying-scenes/resource.yaml +42 -0
- package/{skills/visual-effects/recipes/dissolve → library/skills/vfx-dissolve}/SKILL.md +31 -11
- package/library/skills/vfx-dissolve/resource.yaml +33 -0
- package/{skills/visual-effects/recipes/fire → library/skills/vfx-fire}/SKILL.md +43 -12
- package/library/skills/vfx-fire/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
- package/library/skills/vfx-fire/resource.yaml +35 -0
- package/{skills/visual-effects/recipes/hit-spark → library/skills/vfx-hit-spark}/SKILL.md +16 -10
- package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-hit-spark/resource.yaml +34 -0
- package/{skills/visual-effects/recipes/lightning → library/skills/vfx-lightning}/SKILL.md +24 -11
- package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-lightning/resource.yaml +33 -0
- package/{skills/visual-effects/recipes/magic-glow → library/skills/vfx-magic-glow}/SKILL.md +31 -11
- package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-magic-glow/resource.yaml +34 -0
- package/{skills/visual-effects/recipes/muzzle-flash → library/skills/vfx-muzzle-flash}/SKILL.md +29 -9
- package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +53 -0
- package/library/skills/vfx-muzzle-flash/resource.yaml +35 -0
- package/{skills/visual-effects/recipes/smoke → library/skills/vfx-smoke}/SKILL.md +35 -9
- package/library/skills/vfx-smoke/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
- package/library/skills/vfx-smoke/resource.yaml +32 -0
- package/{skills/visual-effects/recipes/water-ripple → library/skills/vfx-water-ripple}/SKILL.md +31 -9
- package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-water-ripple/resource.yaml +31 -0
- package/library/skills/voice-line/resource.yaml +27 -0
- package/library/skills/world-building-3d/SKILL.md +105 -0
- package/library/skills/world-building-3d/references/spatial-tools.md +50 -0
- package/library/skills/world-building-3d/resource.yaml +44 -0
- package/library/skills/world-building-3d/tests/spec.md +48 -0
- package/{skills/workflow → library/skills}/writing-plans/SKILL.md +19 -14
- package/library/skills/writing-plans/resource.yaml +23 -0
- package/{skills/workflow → library/skills}/writing-skills/SKILL.md +38 -44
- package/library/skills/writing-skills/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/writing-skills/testing-skills-with-subagents.md +13 -14
- package/library/templates/2d-brario-platformer/resource.yaml +21 -0
- package/library/templates/2d-dungeon-roguelike/resource.yaml +23 -0
- package/library/templates/2d-grid-puzzle/resource.yaml +21 -0
- package/library/templates/2d-plants-and-zombies-tower-defense/resource.yaml +21 -0
- package/library/templates/2d-platformer/resource.yaml +24 -0
- package/library/templates/2d-rpg/resource.yaml +21 -0
- package/library/templates/2d-vampire-survivor-roguelike/resource.yaml +21 -0
- package/library/templates/3d-basic/resource.yaml +16 -0
- package/library/templates/3d-city-kit/resource.yaml +24 -0
- package/library/templates/3d-fps-old-school/resource.yaml +21 -0
- package/library/templates/3d-fps-simple-animated-npc/resource.yaml +21 -0
- package/library/templates/3d-lan-multiplayer-starter/resource.yaml +22 -0
- package/library/templates/3d-open-world-explore-tps/resource.yaml +21 -0
- package/library/templates/3d-procedural-road-world/resource.yaml +21 -0
- package/library/templates/3d-racing-game/resource.yaml +21 -0
- package/library/templates/3d-royale-clash-type/resource.yaml +21 -0
- package/library/templates/3d-third-person-controller/resource.yaml +21 -0
- package/library/templates/3d-voxel-sandbox/resource.yaml +24 -0
- package/library/templates/README.md +94 -0
- package/library/templates/empty/resource.yaml +16 -0
- package/library/tools/add-node/resource.yaml +60 -0
- package/library/tools/align-distribute-3d/resource.yaml +87 -0
- package/library/tools/api-docs/resource.yaml +57 -0
- package/library/tools/batch/resource.yaml +52 -0
- package/library/tools/camera-bookmark/resource.yaml +73 -0
- package/library/tools/check-job/resource.yaml +45 -0
- package/library/tools/clear-console/resource.yaml +40 -0
- package/library/tools/connect-signal/resource.yaml +63 -0
- package/library/tools/create-debug-report/resource.yaml +67 -0
- package/library/tools/create-scene/resource.yaml +59 -0
- package/library/tools/creator-config/resource.yaml +63 -0
- package/library/tools/creator-publish/resource.yaml +73 -0
- package/library/tools/creator-releases/resource.yaml +53 -0
- package/library/tools/fabricate-3d/resource.yaml +108 -0
- package/library/tools/game-control/resource.yaml +84 -0
- package/library/tools/game-input/resource.yaml +159 -0
- package/library/tools/game-probe/resource.yaml +90 -0
- package/library/tools/generate-3d/resource.yaml +112 -0
- package/library/tools/generate-audio/resource.yaml +80 -0
- package/library/tools/generate-image/resource.yaml +62 -0
- package/library/tools/generate-motion/resource.yaml +66 -0
- package/library/tools/generate-video/resource.yaml +66 -0
- package/library/tools/get-agent-playbook/resource.yaml +40 -0
- package/library/tools/get-asset/resource.yaml +42 -0
- package/library/tools/get-asset-download-url/resource.yaml +52 -0
- package/library/tools/get-console/resource.yaml +69 -0
- package/library/tools/get-debugger-errors/resource.yaml +56 -0
- package/library/tools/get-debugger-warnings/resource.yaml +52 -0
- package/library/tools/get-diagnostics/resource.yaml +42 -0
- package/library/tools/get-project-context/resource.yaml +45 -0
- package/library/tools/get-runtime-tree/resource.yaml +62 -0
- package/library/tools/get-scene-tree/resource.yaml +52 -0
- package/library/tools/get-script-errors/resource.yaml +45 -0
- package/library/tools/get-studio-workflow/resource.yaml +43 -0
- package/library/tools/import-asset/resource.yaml +73 -0
- package/library/tools/import-asset-by-id/resource.yaml +56 -0
- package/library/tools/import-from-url/resource.yaml +51 -0
- package/library/tools/import-from-url-batch/resource.yaml +60 -0
- package/library/tools/import-hdri/resource.yaml +69 -0
- package/library/tools/input-map-bind/resource.yaml +52 -0
- package/library/tools/inspect-node/resource.yaml +46 -0
- package/library/tools/inspect-resource/resource.yaml +45 -0
- package/library/tools/inspect-runtime-node/resource.yaml +54 -0
- package/library/tools/instantiate-scene/resource.yaml +62 -0
- package/library/tools/is-running/resource.yaml +40 -0
- package/library/tools/library-feedback/resource.yaml +89 -0
- package/library/tools/list-my-assets/resource.yaml +56 -0
- package/library/tools/navigation-probe/resource.yaml +85 -0
- package/library/tools/open/resource.yaml +80 -0
- package/library/tools/open-main-scene/resource.yaml +40 -0
- package/library/tools/open-scene/resource.yaml +46 -0
- package/library/tools/play/resource.yaml +91 -0
- package/library/tools/project-setting/resource.yaml +53 -0
- package/library/tools/read-file/resource.yaml +47 -0
- package/library/tools/read-library/resource.yaml +67 -0
- package/library/tools/recent-events/resource.yaml +71 -0
- package/library/tools/remove-node/resource.yaml +51 -0
- package/library/tools/replace-node/resource.yaml +57 -0
- package/library/tools/replace-text/resource.yaml +61 -0
- package/library/tools/run-editor-script/resource.yaml +61 -0
- package/library/tools/run-script/resource.yaml +73 -0
- package/library/tools/runtime-animate/resource.yaml +140 -0
- package/library/tools/runtime-call/resource.yaml +74 -0
- package/library/tools/runtime-set/resource.yaml +80 -0
- package/library/tools/runtime-spawn/resource.yaml +95 -0
- package/library/tools/save-scene/resource.yaml +50 -0
- package/library/tools/screenshot/resource.yaml +112 -0
- package/library/tools/search-assets/resource.yaml +67 -0
- package/library/tools/search-library/resource.yaml +81 -0
- package/library/tools/select-node/resource.yaml +48 -0
- package/library/tools/set-prop/resource.yaml +64 -0
- package/library/tools/set-resource-property/resource.yaml +66 -0
- package/library/tools/slice-asset-sheet/resource.yaml +47 -0
- package/library/tools/snap-to-surface/resource.yaml +90 -0
- package/library/tools/snapshot-diff/resource.yaml +58 -0
- package/library/tools/starcast/resource.yaml +120 -0
- package/library/tools/start-game-task/resource.yaml +91 -0
- package/library/tools/stop/resource.yaml +51 -0
- package/library/tools/test-placement/resource.yaml +109 -0
- package/library/tools/ui-actions/resource.yaml +77 -0
- package/library/tools/ui-activate/resource.yaml +88 -0
- package/library/tools/ui-screenshot/resource.yaml +63 -0
- package/library/tools/ui-tree/resource.yaml +69 -0
- package/library/tools/wait-for-event/resource.yaml +84 -0
- package/library/tools/world-snapshot/resource.yaml +60 -0
- package/library/tools/write-file/resource.yaml +54 -0
- package/package.json +21 -15
- package/registry/generated/aliases.json +207 -0
- package/registry/generated/counts.json +12 -0
- package/registry/generated/gemini-extension.json +122 -0
- package/registry/generated/index.json +7709 -0
- package/registry/generated/marketplace.claude.json +44 -0
- package/registry/generated/mcp.json +13 -0
- package/registry/generated/plugin.claude.json +135 -0
- package/registry/generated/plugin.codex.json +144 -0
- package/registry/generated/plugin.cursor.json +134 -0
- package/registry/generated/plugin.factory.json +117 -0
- package/registry/generated/skills-index.md +242 -0
- package/registry/generated/skills-registry.json +1249 -0
- package/registry/generated/templates-registry.json +455 -0
- package/registry/schemas/allowed-hosts.json +19 -0
- package/registry/schemas/collection.schema.json +68 -0
- package/registry/schemas/domains.json +96 -0
- package/registry/schemas/example.schema.json +11 -0
- package/registry/schemas/reference.schema.json +10 -0
- package/registry/schemas/resource.schema.json +154 -0
- package/registry/schemas/skill.schema.json +14 -0
- package/registry/schemas/template.schema.json +46 -0
- package/registry/schemas/tool.schema.json +61 -0
- package/_persona/summer/SKILL.md +0 -113
- package/dist/bin/postinstall.d.ts +0 -2
- package/dist/bin/postinstall.js +0 -3
- package/dist/commands/cloud.d.ts +0 -2
- package/dist/commands/cloud.js +0 -80
- package/dist/commands/create.d.ts +0 -3
- package/dist/commands/create.js +0 -171
- package/dist/commands/install.d.ts +0 -19
- package/dist/commands/install.js +0 -194
- package/dist/commands/list.js +0 -67
- package/dist/commands/logout.js +0 -13
- package/dist/commands/logs.d.ts +0 -2
- package/dist/commands/logs.js +0 -19
- package/dist/commands/open.d.ts +0 -2
- package/dist/commands/open.js +0 -32
- package/dist/commands/orchestrator.d.ts +0 -8
- package/dist/commands/orchestrator.js +0 -143
- package/dist/commands/run.d.ts +0 -2
- package/dist/commands/run.js +0 -167
- package/dist/commands/setup.js +0 -217
- package/dist/commands/status.js +0 -46
- package/dist/lib/agent-config.d.ts +0 -39
- package/dist/lib/agent-config.js +0 -626
- package/dist/lib/banner.d.ts +0 -4
- package/dist/lib/banner.js +0 -122
- package/dist/lib/cloud/api.d.ts +0 -79
- package/dist/lib/cloud/api.js +0 -107
- package/dist/lib/cloud/apply.d.ts +0 -32
- package/dist/lib/cloud/apply.js +0 -294
- package/dist/lib/cloud/checkpoint.d.ts +0 -26
- package/dist/lib/cloud/checkpoint.js +0 -142
- package/dist/lib/cloud/conflicts.d.ts +0 -55
- package/dist/lib/cloud/conflicts.js +0 -131
- package/dist/lib/cloud/containment.d.ts +0 -8
- package/dist/lib/cloud/containment.js +0 -52
- package/dist/lib/cloud/diff.d.ts +0 -39
- package/dist/lib/cloud/diff.js +0 -138
- package/dist/lib/cloud/engine-bridge.d.ts +0 -34
- package/dist/lib/cloud/engine-bridge.js +0 -139
- package/dist/lib/cloud/hash-cache.d.ts +0 -23
- package/dist/lib/cloud/hash-cache.js +0 -44
- package/dist/lib/cloud/hash.d.ts +0 -10
- package/dist/lib/cloud/hash.js +0 -111
- package/dist/lib/cloud/http.d.ts +0 -17
- package/dist/lib/cloud/http.js +0 -47
- package/dist/lib/cloud/lock-path.d.ts +0 -1
- package/dist/lib/cloud/lock-path.js +0 -5
- package/dist/lib/cloud/lock.d.ts +0 -14
- package/dist/lib/cloud/lock.js +0 -143
- package/dist/lib/cloud/manifest.d.ts +0 -6
- package/dist/lib/cloud/manifest.js +0 -41
- package/dist/lib/cloud/paths.d.ts +0 -20
- package/dist/lib/cloud/paths.js +0 -90
- package/dist/lib/cloud/project-godot-merge.d.ts +0 -32
- package/dist/lib/cloud/project-godot-merge.js +0 -185
- package/dist/lib/cloud/rules.d.ts +0 -39
- package/dist/lib/cloud/rules.js +0 -159
- package/dist/lib/cloud/sync.d.ts +0 -21
- package/dist/lib/cloud/sync.js +0 -518
- package/dist/lib/cloud/transfer.d.ts +0 -23
- package/dist/lib/cloud/transfer.js +0 -184
- package/dist/lib/cloud/types.d.ts +0 -62
- package/dist/lib/cloud/types.js +0 -1
- package/dist/lib/cloud/validate-path.d.ts +0 -23
- package/dist/lib/cloud/validate-path.js +0 -103
- package/dist/lib/engine.d.ts +0 -51
- package/dist/lib/game-task-plan.d.ts +0 -42
- package/dist/lib/project-memory.d.ts +0 -33
- package/dist/lib/public-surface-paths.d.ts +0 -13
- package/dist/lib/public-surface-paths.js +0 -42
- package/dist/lib/remote-templates.d.ts +0 -25
- package/dist/lib/remote-templates.js +0 -86
- package/dist/lib/skills-registry.d.ts +0 -572
- package/dist/lib/skills-registry.js +0 -1061
- package/dist/lib/version-check.d.ts +0 -106
- package/dist/lib/version-check.js +0 -338
- package/dist/mcp/tools/cloud-tools.js +0 -42
- package/references/mcp-tools-reference.md +0 -199
- package/references/template-registry.md +0 -73
- package/skills/README.md +0 -103
- package/skills/scene-and-project/summer-cloud/SKILL.md +0 -92
- package/skills/workflow/brainstorming/scripts/frame-template.html +0 -214
- package/skills/workflow/brainstorming/scripts/helper.js +0 -88
- package/skills/workflow/brainstorming/scripts/server.cjs +0 -354
- package/skills/workflow/brainstorming/scripts/start-server.sh +0 -148
- package/skills/workflow/brainstorming/scripts/stop-server.sh +0 -56
- package/skills/workflow/brainstorming/visual-companion.md +0 -287
- package/skills/workflow/gameskill/SKILL.md +0 -120
- package/skills/workflow/investigating-bugs/CREATION-LOG.md +0 -119
- package/skills/workflow/investigating-bugs/condition-based-waiting-example.ts +0 -158
- package/skills/workflow/investigating-bugs/find-polluter.sh +0 -63
- package/skills/workflow/investigating-bugs/test-academic.md +0 -14
- package/skills/workflow/investigating-bugs/test-pressure-1.md +0 -58
- package/skills/workflow/investigating-bugs/test-pressure-2.md +0 -68
- package/skills/workflow/investigating-bugs/test-pressure-3.md +0 -69
- package/skills/workflow/mcpupdate/SKILL.md +0 -134
- package/skills/workflow/skill-create/SKILL.md +0 -153
- package/skills/workflow/writing-skills/anthropic-best-practices.md +0 -1150
- package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +0 -189
- package/skills/workflow/writing-skills/graphviz-conventions.dot +0 -172
- package/skills/workflow/writing-skills/persuasion-principles.md +0 -187
- package/skills/workflow/writing-skills/render-graphs.js +0 -168
- /package/dist/{commands → cli/commands}/config.d.ts +0 -0
- /package/dist/{commands → cli/commands}/debug.d.ts +0 -0
- /package/dist/{commands → cli/commands}/list.d.ts +0 -0
- /package/dist/{commands → cli/commands}/login.d.ts +0 -0
- /package/dist/{commands → cli/commands}/plan.d.ts +0 -0
- /package/dist/{commands → cli/commands}/publish.d.ts +0 -0
- /package/dist/{commands → cli/commands}/releases.d.ts +0 -0
- /package/dist/{commands → cli/commands}/setup.d.ts +0 -0
- /package/dist/{commands → cli/commands}/skills.d.ts +0 -0
- /package/dist/{lib → core}/log-filters.d.ts +0 -0
- /package/dist/{lib → core}/mcp-log.d.ts +0 -0
- /package/dist/{lib → core}/store.d.ts +0 -0
- /package/dist/{lib → core}/summer-compatibility.d.ts +0 -0
- /package/dist/{lib → core}/telemetry.d.ts +0 -0
- /package/dist/{lib/mcp-boot-notice.js → mcp/boot-notice.js} +0 -0
- /package/dist/{commands/mcp.d.ts → mcp/command.d.ts} +0 -0
- /package/{references → library/references/collaborative-protocol}/collaborative-protocol.md +0 -0
- /package/{references → library/references/gd-style}/gd-style.md +0 -0
- /package/{skills/audio → library/skills}/ambient-bed/SKILL.md +0 -0
- /package/{skills/gameplay-mechanics → library/skills}/auto-fire-targeting/SKILL.md +0 -0
- /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/SKILL.md +0 -0
- /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/reference.md +0 -0
- /package/{skills/multiplayer-and-networking → library/skills}/host-authoritative-state/SKILL.md +0 -0
- /package/{skills/workflow → library/skills}/investigating-bugs/defense-in-depth.md +0 -0
- /package/{skills/audio → library/skills}/music-track/SKILL.md +0 -0
- /package/{skills/scene-and-project → library/skills}/play/SKILL.md +0 -0
- /package/{skills/multiplayer-and-networking → library/skills}/setup-multiplayer/SKILL.md +0 -0
- /package/{skills/ui-and-ux → library/skills}/ui-basics/SKILL.md +0 -0
- /package/{skills/visual-effects → library/skills/vfx-dissolve}/_building-blocks/noise-3d-fbm.gdshaderinc +0 -0
- /package/{skills/visual-effects → library/skills/vfx-fire}/_building-blocks/additive-billboard-particles.md +0 -0
- /package/{skills/visual-effects → library/skills/vfx-lightning}/_building-blocks/trauma-shake-snippet.md +0 -0
- /package/{skills/audio → library/skills}/voice-line/SKILL.md +0 -0
- /package/{skills/workflow → library/skills}/writing-plans/plan-document-reviewer-prompt.md +0 -0
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "fs";
|
|
2
|
+
import { copyFile, mkdir, readFile, writeFile } from "fs/promises";
|
|
3
|
+
import { dirname, join, resolve } from "path";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
import { isMap, parseDocument } from "yaml";
|
|
6
|
+
import { PACKAGE_ROOT } from "../core/package-root.js";
|
|
7
|
+
import { agentAliasMap, agentSpec, defaultPathContext, resolveMcpPath, supportedAgents, } from "./agent-table.js";
|
|
8
|
+
export { supportedAgents } from "./agent-table.js";
|
|
9
|
+
export const SUMMER_MCP_SERVER_NAME = "summer-engine";
|
|
10
|
+
const agentAliases = agentAliasMap();
|
|
11
|
+
export function parseAgent(value) {
|
|
12
|
+
if (!value)
|
|
13
|
+
return null;
|
|
14
|
+
return agentAliases[value.trim().toLowerCase()] ?? null;
|
|
15
|
+
}
|
|
16
|
+
export function parseScope(value) {
|
|
17
|
+
if (!value)
|
|
18
|
+
return "user";
|
|
19
|
+
const normalized = value.trim().toLowerCase();
|
|
20
|
+
if (normalized === "user" || normalized === "project")
|
|
21
|
+
return normalized;
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
/** `summer setup [agent] --agent <agent>`: positional and option must agree;
|
|
25
|
+
* throws with a user-facing message when neither names a supported agent. */
|
|
26
|
+
export function resolveAgentSelection(agentArg, agentOpt) {
|
|
27
|
+
if (agentArg && agentOpt && parseAgent(agentArg) !== parseAgent(agentOpt)) {
|
|
28
|
+
throw new Error("Specify the agent either positionally or with --agent, not both.");
|
|
29
|
+
}
|
|
30
|
+
const parsed = parseAgent(agentOpt ?? agentArg);
|
|
31
|
+
if (!parsed) {
|
|
32
|
+
throw new Error(`Specify an agent: ${supportedAgents.join(", ")}`);
|
|
33
|
+
}
|
|
34
|
+
return parsed;
|
|
35
|
+
}
|
|
36
|
+
/** `--scope` with a user-facing error; absent means "user". */
|
|
37
|
+
export function resolveConfigScope(scopeOpt) {
|
|
38
|
+
const parsed = parseScope(scopeOpt);
|
|
39
|
+
if (!parsed) {
|
|
40
|
+
throw new Error("Invalid --scope. Use user or project.");
|
|
41
|
+
}
|
|
42
|
+
return parsed;
|
|
43
|
+
}
|
|
44
|
+
export async function configureAgentMcp(options) {
|
|
45
|
+
const env = options.env ?? process.env;
|
|
46
|
+
const cwd = resolve(options.cwd ?? process.cwd());
|
|
47
|
+
const channel = normalizeChannel(options.channel);
|
|
48
|
+
const server = createSummerMcpServerConfig(Boolean(options.localDev), process.platform, channel);
|
|
49
|
+
const spec = agentSpec(options.agent);
|
|
50
|
+
const target = resolveConfigTarget(spec, options.scope, cwd, env);
|
|
51
|
+
const snippet = renderConfigSnippet(options.agent, server);
|
|
52
|
+
const dryRun = Boolean(options.dryRun);
|
|
53
|
+
const print = Boolean(options.print);
|
|
54
|
+
const shouldWrite = !dryRun && !print;
|
|
55
|
+
const update = print
|
|
56
|
+
? { changed: true }
|
|
57
|
+
: await upsertConfig(spec.format, target.path, server, shouldWrite);
|
|
58
|
+
return {
|
|
59
|
+
agent: options.agent,
|
|
60
|
+
scope: options.scope,
|
|
61
|
+
path: target.path,
|
|
62
|
+
serverName: SUMMER_MCP_SERVER_NAME,
|
|
63
|
+
server,
|
|
64
|
+
format: spec.format,
|
|
65
|
+
snippet,
|
|
66
|
+
changed: update.changed,
|
|
67
|
+
wrote: shouldWrite && update.changed,
|
|
68
|
+
dryRun,
|
|
69
|
+
print,
|
|
70
|
+
localDev: Boolean(options.localDev),
|
|
71
|
+
channel,
|
|
72
|
+
warnings: target.warnings,
|
|
73
|
+
nextSteps: [`Updated ${target.path}.`, spec.restart],
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async function upsertConfig(format, path, server, write) {
|
|
77
|
+
switch (format) {
|
|
78
|
+
case "toml":
|
|
79
|
+
return upsertCodexConfig(path, server, write);
|
|
80
|
+
case "toml-array":
|
|
81
|
+
return upsertTomlArrayConfig(path, server, write);
|
|
82
|
+
case "json-gemini":
|
|
83
|
+
return upsertGeminiExtension(path, server, write);
|
|
84
|
+
case "yaml-goose":
|
|
85
|
+
case "yaml-hermes":
|
|
86
|
+
return upsertYamlConfig(path, [topLevelKey(format), SUMMER_MCP_SERVER_NAME], mcpEntry(format, server), write);
|
|
87
|
+
default:
|
|
88
|
+
return upsertJsonEntry(path, format, server, write);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export const DEFAULT_CHANNEL = "latest";
|
|
92
|
+
/** npm dist-tags are lowercase words like `latest`, `next`, `beta`, `v3-preview`;
|
|
93
|
+
* anything that could be read as a version or a path is refused (a bare
|
|
94
|
+
* version belongs in a version bump, not a channel). */
|
|
95
|
+
export function normalizeChannel(channel) {
|
|
96
|
+
const value = (channel ?? "").trim();
|
|
97
|
+
if (value === "")
|
|
98
|
+
return DEFAULT_CHANNEL;
|
|
99
|
+
if (!/^[a-z][a-z0-9-]*$/.test(value) || /^v?\d/.test(value)) {
|
|
100
|
+
throw new Error(`Invalid channel "${channel}": use an npm dist-tag such as latest or next (lowercase letters, digits, hyphens).`);
|
|
101
|
+
}
|
|
102
|
+
return value;
|
|
103
|
+
}
|
|
104
|
+
export function createSummerMcpServerConfig(localDev, platform = process.platform, channel = DEFAULT_CHANNEL) {
|
|
105
|
+
const spec = `summer-engine@${normalizeChannel(channel)}`;
|
|
106
|
+
if (localDev) {
|
|
107
|
+
// node is a real executable on every platform; spawn("node") resolves fine.
|
|
108
|
+
return {
|
|
109
|
+
command: "node",
|
|
110
|
+
args: [resolveLocalCliPath(), "mcp"],
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
// On Windows, npx is a .cmd/.ps1 shim, and Node's spawn() does not do PATHEXT
|
|
114
|
+
// resolution — hosts that spawn("npx") directly (Claude Code, Kimi Code,
|
|
115
|
+
// Cursor, ...) fail with ENOENT even though npx works in a terminal. Route
|
|
116
|
+
// through cmd.exe so the shim resolves. (User-reported: Imitater967, 2026-09-01.)
|
|
117
|
+
if (platform === "win32") {
|
|
118
|
+
return {
|
|
119
|
+
command: "cmd.exe",
|
|
120
|
+
args: ["/c", "npx", "-y", spec, "mcp"],
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
command: "npx",
|
|
125
|
+
args: ["-y", spec, "mcp"],
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
export function renderConfigSnippet(agent, server) {
|
|
129
|
+
const format = agentSpec(agent).format;
|
|
130
|
+
if (format === "toml")
|
|
131
|
+
return renderCodexServerTable(server);
|
|
132
|
+
if (format === "toml-array")
|
|
133
|
+
return renderTomlArrayEntry(server);
|
|
134
|
+
if (format === "json-gemini") {
|
|
135
|
+
return renderJsonFile(geminiExtensionManifest(server, readBundledGeminiManifestSync()));
|
|
136
|
+
}
|
|
137
|
+
if (format === "yaml-goose" || format === "yaml-hermes") {
|
|
138
|
+
const doc = parseDocument("{}");
|
|
139
|
+
doc.setIn([topLevelKey(format), SUMMER_MCP_SERVER_NAME], doc.createNode(mcpEntry(format, server)));
|
|
140
|
+
return doc.toString();
|
|
141
|
+
}
|
|
142
|
+
const file = {};
|
|
143
|
+
if (format === "json-opencode" && agent === "opencode")
|
|
144
|
+
file.$schema = OPENCODE_SCHEMA;
|
|
145
|
+
file[topLevelKey(format)] = { [SUMMER_MCP_SERVER_NAME]: mcpEntry(format, server) };
|
|
146
|
+
return renderJsonFile(file);
|
|
147
|
+
}
|
|
148
|
+
const OPENCODE_SCHEMA = "https://opencode.ai/config.json";
|
|
149
|
+
/** The key under which the file lists MCP servers (see McpFormat in agent-table.ts). */
|
|
150
|
+
export function topLevelKey(format) {
|
|
151
|
+
switch (format) {
|
|
152
|
+
case "json-vscode":
|
|
153
|
+
case "json-servers":
|
|
154
|
+
return "servers";
|
|
155
|
+
case "json-opencode":
|
|
156
|
+
case "json-crush":
|
|
157
|
+
return "mcp";
|
|
158
|
+
case "json-zed":
|
|
159
|
+
return "context_servers";
|
|
160
|
+
case "json-amp":
|
|
161
|
+
return "amp.mcpServers";
|
|
162
|
+
case "yaml-goose":
|
|
163
|
+
return "extensions";
|
|
164
|
+
case "yaml-hermes":
|
|
165
|
+
case "toml":
|
|
166
|
+
case "toml-array":
|
|
167
|
+
return "mcp_servers";
|
|
168
|
+
default:
|
|
169
|
+
return "mcpServers";
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/** One server entry in the shape the agent's file expects. */
|
|
173
|
+
export function mcpEntry(format, server) {
|
|
174
|
+
const env = server.env && Object.keys(server.env).length > 0 ? { ...server.env } : undefined;
|
|
175
|
+
switch (format) {
|
|
176
|
+
case "json-opencode":
|
|
177
|
+
return {
|
|
178
|
+
type: "local",
|
|
179
|
+
command: [server.command, ...server.args],
|
|
180
|
+
enabled: true,
|
|
181
|
+
...(env ? { environment: env } : {}),
|
|
182
|
+
};
|
|
183
|
+
case "json-copilot":
|
|
184
|
+
return { type: "local", command: server.command, args: server.args, tools: ["*"], ...(env ? { env } : {}) };
|
|
185
|
+
case "json-vscode":
|
|
186
|
+
case "json-stdio":
|
|
187
|
+
case "json-crush":
|
|
188
|
+
return { type: "stdio", command: server.command, args: server.args, ...(env ? { env } : {}) };
|
|
189
|
+
case "json-zed":
|
|
190
|
+
return { command: server.command, args: server.args, env: env ?? {} };
|
|
191
|
+
case "json-transport":
|
|
192
|
+
return { command: server.command, args: server.args, transport: "stdio", ...(env ? { env } : {}) };
|
|
193
|
+
case "toml-array":
|
|
194
|
+
return { name: SUMMER_MCP_SERVER_NAME, transport: "stdio", command: server.command, args: server.args, ...(env ? { env } : {}) };
|
|
195
|
+
case "yaml-goose":
|
|
196
|
+
return {
|
|
197
|
+
type: "stdio",
|
|
198
|
+
name: SUMMER_MCP_SERVER_NAME,
|
|
199
|
+
description: "Summer Engine: scenes, scripts, play mode and diagnostics over MCP",
|
|
200
|
+
cmd: server.command,
|
|
201
|
+
args: server.args,
|
|
202
|
+
enabled: true,
|
|
203
|
+
timeout: 300,
|
|
204
|
+
env_keys: [],
|
|
205
|
+
envs: env ?? {},
|
|
206
|
+
};
|
|
207
|
+
default:
|
|
208
|
+
return { command: server.command, args: server.args, ...(env ? { env } : {}) };
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
function resolveLocalCliPath() {
|
|
212
|
+
const thisFile = fileURLToPath(import.meta.url);
|
|
213
|
+
return resolve(dirname(thisFile), "..", "bin", "summer.js");
|
|
214
|
+
}
|
|
215
|
+
/** Installed package root (dist/ and src/ alike). */
|
|
216
|
+
export function resolvePackageRoot() {
|
|
217
|
+
return PACKAGE_ROOT;
|
|
218
|
+
}
|
|
219
|
+
/** Directory name Gemini expects the extension under; the manifest `name` must match it. */
|
|
220
|
+
export const GEMINI_EXTENSION_DIR_NAME = "summer-engine";
|
|
221
|
+
/** Files copied next to the extension manifest so `contextFileName` (GEMINI.md, which imports AGENTS.md) resolves. */
|
|
222
|
+
const GEMINI_CONTEXT_FILES = ["GEMINI.md", "AGENTS.md"];
|
|
223
|
+
function resolveConfigTarget(spec, scope, cwd, env) {
|
|
224
|
+
const resolved = resolveMcpPath(spec, scope, defaultPathContext(env, cwd));
|
|
225
|
+
const override = env[spec.envOverride];
|
|
226
|
+
return { path: override ? resolve(override) : resolved.path, warnings: resolved.warnings };
|
|
227
|
+
}
|
|
228
|
+
/** Merge one server entry into a JSON config file under the format's top-level key. */
|
|
229
|
+
async function upsertJsonEntry(path, format, server, write) {
|
|
230
|
+
const current = await readJsonConfig(path);
|
|
231
|
+
const next = copyJsonObject(current);
|
|
232
|
+
const key = topLevelKey(format);
|
|
233
|
+
// OpenCode's file carries its schema; Kilo shares the shape but has its own.
|
|
234
|
+
if (format === "json-opencode" && typeof next.$schema !== "string" && /opencode\.json$/.test(path)) {
|
|
235
|
+
next.$schema = OPENCODE_SCHEMA;
|
|
236
|
+
}
|
|
237
|
+
next[key] = mergeNamedObject(next[key], SUMMER_MCP_SERVER_NAME, mcpEntry(format, server), key);
|
|
238
|
+
const currentRendered = renderJsonFile(current);
|
|
239
|
+
const nextRendered = renderJsonFile(next);
|
|
240
|
+
const changed = currentRendered !== nextRendered;
|
|
241
|
+
if (write && changed) {
|
|
242
|
+
await writeTextFile(path, nextRendered);
|
|
243
|
+
}
|
|
244
|
+
return { changed };
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Merge one server entry into a YAML config (Goose, Hermes). Uses the yaml
|
|
248
|
+
* Document API so the user's comments and ordering survive; only the
|
|
249
|
+
* summer-engine node is replaced.
|
|
250
|
+
*/
|
|
251
|
+
async function upsertYamlConfig(path, keyPath, entry, write) {
|
|
252
|
+
const current = await readTextFileIfExists(path);
|
|
253
|
+
const doc = parseDocument(current.trim() === "" ? "{}" : current);
|
|
254
|
+
if (doc.errors.length > 0) {
|
|
255
|
+
throw new Error(`Could not parse YAML in ${path}: ${doc.errors[0].message}`);
|
|
256
|
+
}
|
|
257
|
+
if (!isMap(doc.contents)) {
|
|
258
|
+
throw new Error(`Expected ${path} to contain a YAML mapping.`);
|
|
259
|
+
}
|
|
260
|
+
const parent = doc.getIn(keyPath.slice(0, -1));
|
|
261
|
+
if (parent !== undefined && parent !== null && !isMap(parent)) {
|
|
262
|
+
throw new Error(`Existing ${keyPath[0]} value in ${path} must be a mapping.`);
|
|
263
|
+
}
|
|
264
|
+
doc.setIn(keyPath, doc.createNode(entry));
|
|
265
|
+
const next = doc.toString();
|
|
266
|
+
const changed = current !== next;
|
|
267
|
+
if (write && changed) {
|
|
268
|
+
await writeTextFile(path, next);
|
|
269
|
+
}
|
|
270
|
+
return { changed };
|
|
271
|
+
}
|
|
272
|
+
async function readJsonConfig(path) {
|
|
273
|
+
if (!existsSync(path))
|
|
274
|
+
return {};
|
|
275
|
+
let content;
|
|
276
|
+
try {
|
|
277
|
+
content = await readFile(path, "utf-8");
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
throw new Error(`Could not read ${path}: ${formatError(error)}`);
|
|
281
|
+
}
|
|
282
|
+
if (content.trim() === "")
|
|
283
|
+
return {};
|
|
284
|
+
let parsed;
|
|
285
|
+
try {
|
|
286
|
+
parsed = JSON.parse(content);
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
throw new Error(`Could not parse JSON in ${path}: ${formatError(error)}`);
|
|
290
|
+
}
|
|
291
|
+
if (!isJsonObject(parsed)) {
|
|
292
|
+
throw new Error(`Expected ${path} to contain a JSON object.`);
|
|
293
|
+
}
|
|
294
|
+
return parsed;
|
|
295
|
+
}
|
|
296
|
+
async function upsertCodexConfig(path, server, write) {
|
|
297
|
+
const current = await readTextFileIfExists(path);
|
|
298
|
+
const next = upsertTomlTable(current, renderCodexServerTable(server));
|
|
299
|
+
const changed = current !== next;
|
|
300
|
+
if (write && changed) {
|
|
301
|
+
await writeTextFile(path, next);
|
|
302
|
+
}
|
|
303
|
+
return { changed };
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Mistral Vibe lists servers as a TOML array of tables:
|
|
307
|
+
* [[mcp_servers]]
|
|
308
|
+
* name = "summer-engine"
|
|
309
|
+
* ...
|
|
310
|
+
* Replace the block whose name is ours, else append one.
|
|
311
|
+
*/
|
|
312
|
+
async function upsertTomlArrayConfig(path, server, write) {
|
|
313
|
+
const current = await readTextFileIfExists(path);
|
|
314
|
+
const next = upsertTomlArrayBlock(current, renderTomlArrayEntry(server));
|
|
315
|
+
const changed = current !== next;
|
|
316
|
+
if (write && changed) {
|
|
317
|
+
await writeTextFile(path, next);
|
|
318
|
+
}
|
|
319
|
+
return { changed };
|
|
320
|
+
}
|
|
321
|
+
export function upsertTomlArrayBlock(content, block) {
|
|
322
|
+
const lines = content.split(/\r?\n/);
|
|
323
|
+
const header = /^\s*\[\[mcp_servers\]\]\s*(?:#.*)?$/;
|
|
324
|
+
const nameLine = new RegExp(`^\\s*name\\s*=\\s*"${SUMMER_MCP_SERVER_NAME}"\\s*(?:#.*)?$`);
|
|
325
|
+
let start = -1;
|
|
326
|
+
let end = lines.length;
|
|
327
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
328
|
+
if (!header.test(lines[index]))
|
|
329
|
+
continue;
|
|
330
|
+
let blockEnd = lines.length;
|
|
331
|
+
for (let inner = index + 1; inner < lines.length; inner += 1) {
|
|
332
|
+
if (/^\s*\[/.test(lines[inner])) {
|
|
333
|
+
blockEnd = inner;
|
|
334
|
+
break;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
if (lines.slice(index + 1, blockEnd).some((line) => nameLine.test(line))) {
|
|
338
|
+
start = index;
|
|
339
|
+
end = blockEnd;
|
|
340
|
+
break;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
if (start === -1) {
|
|
344
|
+
const trimmed = content.endsWith("\n") || content === "" ? content : `${content}\n`;
|
|
345
|
+
return `${trimmed}${trimmed === "" ? "" : "\n"}${block}`;
|
|
346
|
+
}
|
|
347
|
+
const replacement = block.trimEnd().split("\n");
|
|
348
|
+
if (lines[end] && lines[end].trim() !== "")
|
|
349
|
+
replacement.push("");
|
|
350
|
+
return ensureTrailingNewline([...lines.slice(0, start), ...replacement, ...lines.slice(end)].join("\n"));
|
|
351
|
+
}
|
|
352
|
+
function renderTomlArrayEntry(server) {
|
|
353
|
+
const lines = [
|
|
354
|
+
"[[mcp_servers]]",
|
|
355
|
+
`name = ${tomlString(SUMMER_MCP_SERVER_NAME)}`,
|
|
356
|
+
`transport = "stdio"`,
|
|
357
|
+
`command = ${tomlString(server.command)}`,
|
|
358
|
+
`args = [${server.args.map(tomlString).join(", ")}]`,
|
|
359
|
+
];
|
|
360
|
+
if (server.env && Object.keys(server.env).length > 0) {
|
|
361
|
+
lines.push(`env = { ${Object.entries(server.env)
|
|
362
|
+
.map(([key, value]) => `${key} = ${tomlString(value)}`)
|
|
363
|
+
.join(", ")} }`);
|
|
364
|
+
}
|
|
365
|
+
return `${lines.join("\n")}\n`;
|
|
366
|
+
}
|
|
367
|
+
async function upsertGeminiExtension(path, server, write) {
|
|
368
|
+
const current = await readJsonConfig(path);
|
|
369
|
+
const bundled = await readBundledGeminiManifest();
|
|
370
|
+
const next = geminiExtensionManifest(server, bundled, current);
|
|
371
|
+
const currentRendered = renderJsonFile(current);
|
|
372
|
+
const nextRendered = renderJsonFile(next);
|
|
373
|
+
let changed = currentRendered !== nextRendered;
|
|
374
|
+
if (write && changed) {
|
|
375
|
+
await writeTextFile(path, nextRendered);
|
|
376
|
+
}
|
|
377
|
+
// GEMINI.md (the declared contextFileName) and AGENTS.md (which it imports)
|
|
378
|
+
// must sit next to the manifest or Gemini has no context file to load.
|
|
379
|
+
const extensionDir = dirname(path);
|
|
380
|
+
const packageRoot = resolvePackageRoot();
|
|
381
|
+
for (const name of GEMINI_CONTEXT_FILES) {
|
|
382
|
+
const src = join(packageRoot, name);
|
|
383
|
+
if (!existsSync(src))
|
|
384
|
+
continue;
|
|
385
|
+
const dest = join(extensionDir, name);
|
|
386
|
+
const srcText = await readFile(src, "utf-8");
|
|
387
|
+
const destText = existsSync(dest) ? await readFile(dest, "utf-8") : null;
|
|
388
|
+
if (destText === srcText)
|
|
389
|
+
continue;
|
|
390
|
+
changed = true;
|
|
391
|
+
if (write) {
|
|
392
|
+
await mkdir(extensionDir, { recursive: true, mode: 0o700 });
|
|
393
|
+
await copyFile(src, dest);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
return { changed };
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* The GENERATED gemini-extension.json shipped at the package root
|
|
400
|
+
* (registry/generated/gemini-extension.json -> gemini-extension.json). Absent
|
|
401
|
+
* only in broken installs; the installer then falls back to a minimal manifest.
|
|
402
|
+
*/
|
|
403
|
+
async function readBundledGeminiManifest() {
|
|
404
|
+
const path = join(resolvePackageRoot(), "gemini-extension.json");
|
|
405
|
+
if (!existsSync(path))
|
|
406
|
+
return {};
|
|
407
|
+
try {
|
|
408
|
+
return await readJsonConfig(path);
|
|
409
|
+
}
|
|
410
|
+
catch {
|
|
411
|
+
return {};
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
function readBundledGeminiManifestSync() {
|
|
415
|
+
const path = join(resolvePackageRoot(), "gemini-extension.json");
|
|
416
|
+
if (!existsSync(path))
|
|
417
|
+
return {};
|
|
418
|
+
try {
|
|
419
|
+
const parsed = JSON.parse(readFileSync(path, "utf-8"));
|
|
420
|
+
return isJsonObject(parsed) ? parsed : {};
|
|
421
|
+
}
|
|
422
|
+
catch {
|
|
423
|
+
return {};
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Manifest written to ~/.gemini/extensions/summer-engine/gemini-extension.json.
|
|
428
|
+
*
|
|
429
|
+
* Starts from the generated package manifest (version, description, settings,
|
|
430
|
+
* contextFileName, ...) so the installed copy never drifts from the registry,
|
|
431
|
+
* then overrides what only makes sense at install time:
|
|
432
|
+
* - `name` = the extension directory name (Gemini requires them to match;
|
|
433
|
+
* geminicli.com/docs/extensions/reference), which is "summer-engine".
|
|
434
|
+
* - `mcpServers` = the same launcher every other host gets (npx -y ...@latest,
|
|
435
|
+
* cmd.exe-wrapped on Windows). The bundled entry runs from `${extensionPath}`
|
|
436
|
+
* where no package is installed, and that only works inside the npm layout.
|
|
437
|
+
* - `skills` is dropped: Gemini has no such manifest field; it discovers
|
|
438
|
+
* <extension>/skills/<name>/SKILL.md, which `summer skills install --agent
|
|
439
|
+
* gemini` writes.
|
|
440
|
+
* - the `_generated` banner is dropped: this file is written by the installer.
|
|
441
|
+
* Unknown keys already present in the user's file (`base`) are preserved.
|
|
442
|
+
*/
|
|
443
|
+
function geminiExtensionManifest(server, bundled, base = {}) {
|
|
444
|
+
const { _generated: _banner, skills: _skills, ...fromPackage } = bundled;
|
|
445
|
+
const manifest = { ...base, ...fromPackage };
|
|
446
|
+
manifest.name = GEMINI_EXTENSION_DIR_NAME;
|
|
447
|
+
if (typeof manifest.description !== "string") {
|
|
448
|
+
manifest.description =
|
|
449
|
+
"Agent tooling for Summer Engine: MCP bridge, context primer, and game-dev skills.";
|
|
450
|
+
}
|
|
451
|
+
manifest.contextFileName = "GEMINI.md";
|
|
452
|
+
manifest.mcpServers = {
|
|
453
|
+
[SUMMER_MCP_SERVER_NAME]: {
|
|
454
|
+
command: server.command,
|
|
455
|
+
args: server.args,
|
|
456
|
+
...(server.env && Object.keys(server.env).length > 0 ? { env: { ...server.env } } : {}),
|
|
457
|
+
},
|
|
458
|
+
};
|
|
459
|
+
return manifest;
|
|
460
|
+
}
|
|
461
|
+
async function readTextFileIfExists(path) {
|
|
462
|
+
if (!existsSync(path))
|
|
463
|
+
return "";
|
|
464
|
+
try {
|
|
465
|
+
return await readFile(path, "utf-8");
|
|
466
|
+
}
|
|
467
|
+
catch (error) {
|
|
468
|
+
throw new Error(`Could not read ${path}: ${formatError(error)}`);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
function upsertTomlTable(content, table) {
|
|
472
|
+
const lines = content.split(/\r?\n/);
|
|
473
|
+
const serverHeader = /^\s*\[mcp_servers\.(?:"summer-engine"|summer-engine)(?:\.|\])/;
|
|
474
|
+
const start = lines.findIndex((line) => /^\s*\[mcp_servers\.(?:"summer-engine"|summer-engine)\]\s*(?:#.*)?$/.test(line));
|
|
475
|
+
if (start === -1) {
|
|
476
|
+
const trimmed = content.endsWith("\n") || content === "" ? content : `${content}\n`;
|
|
477
|
+
return `${trimmed}${trimmed === "" ? "" : "\n"}${table}`;
|
|
478
|
+
}
|
|
479
|
+
let end = lines.length;
|
|
480
|
+
for (let index = start + 1; index < lines.length; index += 1) {
|
|
481
|
+
if (/^\s*\[/.test(lines[index]) && !serverHeader.test(lines[index])) {
|
|
482
|
+
end = index;
|
|
483
|
+
break;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
const replacement = table.trimEnd().split("\n");
|
|
487
|
+
if (lines[end] && lines[end].trim() !== "") {
|
|
488
|
+
replacement.push("");
|
|
489
|
+
}
|
|
490
|
+
const nextLines = [
|
|
491
|
+
...lines.slice(0, start),
|
|
492
|
+
...replacement,
|
|
493
|
+
...lines.slice(end),
|
|
494
|
+
];
|
|
495
|
+
return ensureTrailingNewline(nextLines.join("\n"));
|
|
496
|
+
}
|
|
497
|
+
function renderCodexServerTable(server) {
|
|
498
|
+
const lines = [
|
|
499
|
+
`[mcp_servers.${SUMMER_MCP_SERVER_NAME}]`,
|
|
500
|
+
`command = ${tomlString(server.command)}`,
|
|
501
|
+
`args = [${server.args.map(tomlString).join(", ")}]`,
|
|
502
|
+
];
|
|
503
|
+
if (server.env && Object.keys(server.env).length > 0) {
|
|
504
|
+
lines.push(`env = { ${Object.entries(server.env)
|
|
505
|
+
.map(([key, value]) => `${key} = ${tomlString(value)}`)
|
|
506
|
+
.join(", ")} }`);
|
|
507
|
+
}
|
|
508
|
+
return `${lines.join("\n")}\n`;
|
|
509
|
+
}
|
|
510
|
+
function tomlString(value) {
|
|
511
|
+
return JSON.stringify(value);
|
|
512
|
+
}
|
|
513
|
+
function renderJsonFile(value) {
|
|
514
|
+
return `${JSON.stringify(value, null, 2)}\n`;
|
|
515
|
+
}
|
|
516
|
+
function copyJsonObject(value) {
|
|
517
|
+
return JSON.parse(JSON.stringify(value));
|
|
518
|
+
}
|
|
519
|
+
function mergeNamedObject(value, key, entry, label) {
|
|
520
|
+
if (value !== undefined && !isJsonObject(value)) {
|
|
521
|
+
throw new Error(`Existing ${label} value must be a JSON object.`);
|
|
522
|
+
}
|
|
523
|
+
return {
|
|
524
|
+
...(isJsonObject(value) ? value : {}),
|
|
525
|
+
[key]: entry,
|
|
526
|
+
};
|
|
527
|
+
}
|
|
528
|
+
function isJsonObject(value) {
|
|
529
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
530
|
+
}
|
|
531
|
+
async function writeTextFile(path, content) {
|
|
532
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
533
|
+
await writeFile(path, content, { encoding: "utf-8", mode: 0o600 });
|
|
534
|
+
}
|
|
535
|
+
function ensureTrailingNewline(value) {
|
|
536
|
+
return value.endsWith("\n") ? value : `${value}\n`;
|
|
537
|
+
}
|
|
538
|
+
function formatError(error) {
|
|
539
|
+
return error instanceof Error ? error.message : String(error);
|
|
540
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/** Ids `summer setup <agent>` accepts. Legacy ids stay so old commands and
|
|
2
|
+
* configs keep resolving, but they are hidden from help and warn on use. */
|
|
3
|
+
export declare const AGENT_IDS: readonly ["claude-code", "claude-desktop", "codex", "cursor", "windsurf", "antigravity", "gemini", "cline", "cline-cli", "roo-code", "kilo-code", "github-copilot", "vscode-copilot", "visual-studio", "copilot-jetbrains", "opencode", "zed", "kiro", "goose", "hermes", "trae", "qwen-code", "kimi-code", "crush", "amp", "factory", "junie", "warp", "rovo-dev", "qoder", "grok-build", "mistral-vibe", "lm-studio"];
|
|
4
|
+
export type SupportedAgent = (typeof AGENT_IDS)[number];
|
|
5
|
+
export type ConfigScope = "user" | "project";
|
|
6
|
+
/**
|
|
7
|
+
* File shapes the installer can write. One writer per shape in agent-config.ts.
|
|
8
|
+
* json { mcpServers: { <name>: { command, args, env? } } }
|
|
9
|
+
* json-stdio { mcpServers: { <name>: { type: "stdio", command, args, env? } } }
|
|
10
|
+
* json-vscode { servers: { <name>: { type: "stdio", command, args, env? } } }
|
|
11
|
+
* json-copilot { mcpServers: { <name>: { type: "local", command, args, tools: ["*"], env? } } }
|
|
12
|
+
* json-opencode { mcp: { <name>: { type: "local", command: [..], enabled: true, environment? } } }
|
|
13
|
+
* json-servers { servers: { <name>: { command, args, env? } } } (Copilot in JetBrains)
|
|
14
|
+
* json-zed { context_servers: { <name>: { command, args, env } } }
|
|
15
|
+
* json-amp { "amp.mcpServers": { <name>: { command, args, env? } } }
|
|
16
|
+
* json-crush { mcp: { <name>: { type: "stdio", command, args, env? } } }
|
|
17
|
+
* json-transport{ mcpServers: { <name>: { command, args, transport: "stdio", env? } } } (Rovo Dev)
|
|
18
|
+
* toml [mcp_servers.<name>] command/args/env (Codex, Grok Build)
|
|
19
|
+
* toml-array [[mcp_servers]] name/transport/command/args (Mistral Vibe)
|
|
20
|
+
* yaml-goose extensions: <name>: { type: stdio, name, cmd, args, enabled, timeout, envs }
|
|
21
|
+
* yaml-hermes mcp_servers: <name>: { command, args, env? }
|
|
22
|
+
* json-gemini the Gemini extension manifest (legacy)
|
|
23
|
+
*/
|
|
24
|
+
export type McpFormat = "json" | "json-stdio" | "json-vscode" | "json-copilot" | "json-opencode" | "json-servers" | "json-zed" | "json-amp" | "json-crush" | "json-transport" | "toml" | "toml-array" | "yaml-goose" | "yaml-hermes" | "json-gemini";
|
|
25
|
+
export type SkillLocationKind = "skill-dir" | "cursor-rule-dir" | "windsurf-rule-file" | "cline-rule-dir" | "opencode-skill-dir";
|
|
26
|
+
export interface PathContext {
|
|
27
|
+
home: string;
|
|
28
|
+
os: NodeJS.Platform;
|
|
29
|
+
env: NodeJS.ProcessEnv;
|
|
30
|
+
cwd: string;
|
|
31
|
+
}
|
|
32
|
+
export interface SkillHome {
|
|
33
|
+
kind: SkillLocationKind;
|
|
34
|
+
user: (ctx: PathContext) => string;
|
|
35
|
+
/** null: the agent reads skills from one user-level place only. */
|
|
36
|
+
project: ((ctx: PathContext) => string) | null;
|
|
37
|
+
/** `summer skills install --agent <id>` without --scope uses this (default "user"). */
|
|
38
|
+
defaultScope?: ConfigScope;
|
|
39
|
+
/** Printed after a skills install when the agent needs a nudge to reload. */
|
|
40
|
+
reloadHint?: string;
|
|
41
|
+
/**
|
|
42
|
+
* Where Summer versions before 3.1 wrote this agent's skills as generated
|
|
43
|
+
* rule files. `skills install --force` deletes the `summer-<skill>` files it
|
|
44
|
+
* finds there so the agent does not load a rule and a skill for the same slug.
|
|
45
|
+
*/
|
|
46
|
+
legacyRules?: {
|
|
47
|
+
user: (ctx: PathContext) => string;
|
|
48
|
+
project: ((ctx: PathContext) => string) | null;
|
|
49
|
+
suffix: string;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export interface AgentSpec {
|
|
53
|
+
id: SupportedAgent;
|
|
54
|
+
label: string;
|
|
55
|
+
/** Extra spellings `summer setup` accepts (the id itself always resolves). */
|
|
56
|
+
aliases: readonly string[];
|
|
57
|
+
/** legacy: product retired or renamed; still writes, but warns and is hidden from help. */
|
|
58
|
+
status: "active" | "legacy";
|
|
59
|
+
legacyNote?: string;
|
|
60
|
+
/** Env var that overrides the MCP config path (tests, unusual installs). */
|
|
61
|
+
envOverride: string;
|
|
62
|
+
format: McpFormat;
|
|
63
|
+
mcp: {
|
|
64
|
+
/** null: user-level servers are managed in the app's UI; a user request writes the project file with a warning. */
|
|
65
|
+
user: ((ctx: PathContext) => string) | null;
|
|
66
|
+
/** null: user-only config; a project request falls back to user with a warning. */
|
|
67
|
+
project: ((ctx: PathContext) => string) | null;
|
|
68
|
+
/** Extra warning printed when project scope is requested (also when it is honoured). */
|
|
69
|
+
projectNote?: string;
|
|
70
|
+
};
|
|
71
|
+
/** What to do after the config is written. */
|
|
72
|
+
restart: string;
|
|
73
|
+
/** null: no skills/rules mechanism — MCP only. */
|
|
74
|
+
skills: SkillHome | null;
|
|
75
|
+
noSkillsNote?: string;
|
|
76
|
+
}
|
|
77
|
+
export declare function agentSpec(id: SupportedAgent): AgentSpec;
|
|
78
|
+
export declare function allAgentSpecs(): readonly AgentSpec[];
|
|
79
|
+
/** Ids shown in help and error messages (legacy ids still parse). */
|
|
80
|
+
export declare const supportedAgents: readonly SupportedAgent[];
|
|
81
|
+
/** Ids with a skills/rules home; `AGENT_CLIENTS` in core mirrors this plus "summer". */
|
|
82
|
+
export declare const skillCapableAgents: readonly SupportedAgent[];
|
|
83
|
+
/** Every spelling → canonical id. Aliases must be unique across the table. */
|
|
84
|
+
export declare function agentAliasMap(): Record<string, SupportedAgent>;
|
|
85
|
+
export declare function agentLabel(id: SupportedAgent): string;
|
|
86
|
+
export declare function defaultPathContext(env?: NodeJS.ProcessEnv, cwd?: string): PathContext;
|
|
87
|
+
export interface ResolvedMcpPath {
|
|
88
|
+
path: string;
|
|
89
|
+
/** The scope actually written (project requests fall back to user when the agent has no project config). */
|
|
90
|
+
scope: ConfigScope;
|
|
91
|
+
warnings: string[];
|
|
92
|
+
}
|
|
93
|
+
/** Where the MCP config goes for an agent and requested scope, with the warnings to show. */
|
|
94
|
+
export declare function resolveMcpPath(spec: AgentSpec, scope: ConfigScope, ctx: PathContext): ResolvedMcpPath;
|
|
95
|
+
/** Rule files a pre-3.1 Summer wrote for this agent at this scope; `null` when the agent never had any. */
|
|
96
|
+
export declare function legacyRuleFiles(spec: AgentSpec, scope: ConfigScope, ctx: PathContext, skillNames: Iterable<string>): string[] | null;
|
|
97
|
+
export interface ResolvedSkillPath {
|
|
98
|
+
kind: SkillLocationKind;
|
|
99
|
+
path: string;
|
|
100
|
+
scope: ConfigScope;
|
|
101
|
+
}
|
|
102
|
+
/** Where skills go for an agent with a skills home. */
|
|
103
|
+
export declare function resolveSkillPath(spec: AgentSpec, scope: ConfigScope, ctx: PathContext): ResolvedSkillPath | null;
|