summer-engine 3.8.0 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -13
- package/.claude-plugin/plugin.json +24 -22
- package/.codex-plugin/plugin.json +18 -22
- package/.cursor-plugin/plugin.json +8 -14
- package/.factory-plugin/plugin.json +6 -13
- package/AGENTS.md +19 -12
- package/CHANGELOG.md +133 -0
- package/GEMINI.md +3 -3
- package/README.md +118 -37
- package/assets/icon.png +0 -0
- package/commands/start.md +71 -0
- package/commands/summer.md +3 -2
- package/dist/cli/banner.js +3 -0
- package/dist/cli/commands/config.js +3 -2
- package/dist/cli/commands/create.js +12 -3
- package/dist/cli/commands/list.d.ts +5 -0
- package/dist/cli/commands/list.js +30 -13
- package/dist/cli/commands/login.d.ts +27 -0
- package/dist/cli/commands/login.js +58 -12
- package/dist/cli/commands/memory.js +6 -2
- package/dist/cli/commands/ops.d.ts +64 -0
- package/dist/cli/commands/ops.js +329 -0
- package/dist/cli/commands/setup.d.ts +4 -0
- package/dist/cli/commands/setup.js +254 -26
- package/dist/cli/commands/skills.js +28 -11
- package/dist/cli/commands/status.d.ts +26 -0
- package/dist/cli/commands/status.js +36 -21
- package/dist/cli/index.js +7 -0
- package/dist/core/agent-host.d.ts +65 -0
- package/dist/core/agent-host.js +193 -0
- package/dist/core/capabilities/agent-playbook.d.ts +3 -0
- package/dist/core/capabilities/agent-playbook.js +54 -2
- package/dist/core/capabilities/apps.d.ts +33 -10
- package/dist/core/capabilities/apps.js +25 -12
- package/dist/core/capabilities/audit/args.d.ts +6 -6
- package/dist/core/capabilities/doctor.d.ts +3 -0
- package/dist/core/capabilities/doctor.js +20 -15
- package/dist/core/capabilities/fabricate-mesh.d.ts +4 -4
- package/dist/core/capabilities/game-task-plan.d.ts +12 -6
- package/dist/core/capabilities/game-task-plan.js +80 -5
- package/dist/core/capabilities/hdri-import.d.ts +2 -2
- package/dist/core/capabilities/motion-generation.d.ts +2 -2
- package/dist/core/capabilities/motion-generation.js +2 -2
- package/dist/core/capabilities/navigation/open.d.ts +6 -2
- package/dist/core/capabilities/navigation/open.js +3 -0
- package/dist/core/capabilities/placement.d.ts +23 -23
- package/dist/core/capabilities/publish-build.js +2 -0
- package/dist/core/capabilities/runtime-control.d.ts +42 -42
- package/dist/core/capabilities/scene-script-target.d.ts +17 -0
- package/dist/core/capabilities/scene-script-target.js +70 -0
- package/dist/core/capabilities/seeing/args.d.ts +16 -16
- package/dist/core/capabilities/sfx-choices.d.ts +4 -0
- package/dist/core/capabilities/sfx-choices.js +13 -6
- package/dist/core/capabilities/tool-dispatch.d.ts +12 -3
- package/dist/core/capabilities/tool-dispatch.js +81 -46
- package/dist/core/capabilities/ui-control.d.ts +2 -2
- package/dist/core/capabilities/world-snapshot.d.ts +4 -4
- package/dist/core/embeddings.d.ts +2 -0
- package/dist/core/embeddings.js +1 -1
- package/dist/core/error-codes.d.ts +62 -0
- package/dist/core/error-codes.js +97 -0
- package/dist/core/format.d.ts +2 -0
- package/dist/core/format.js +2 -1
- package/dist/core/hosted-mcp.d.ts +22 -0
- package/dist/core/hosted-mcp.js +56 -1
- package/dist/core/library-read.js +5 -0
- package/dist/core/library-search.d.ts +2 -2
- package/dist/core/library-search.js +2 -1
- package/dist/core/oauth.js +4 -0
- package/dist/core/ops/areas.d.ts +11 -0
- package/dist/core/ops/areas.js +24 -0
- package/dist/core/ops/catalog.d.ts +45 -0
- package/dist/core/ops/catalog.js +157 -0
- package/dist/core/ops/cloud.d.ts +64 -0
- package/dist/core/ops/cloud.js +198 -0
- package/dist/core/ops/contract.d.ts +120 -0
- package/dist/core/ops/contract.js +134 -0
- package/dist/core/ops/engine-answer.d.ts +25 -0
- package/dist/core/ops/engine-answer.js +117 -0
- package/dist/core/ops/engine.d.ts +55 -0
- package/dist/core/ops/engine.js +649 -0
- package/dist/core/ops/public-catalog.d.ts +48 -0
- package/dist/core/ops/public-catalog.js +56 -0
- package/dist/core/ops/save-files.d.ts +78 -0
- package/dist/core/ops/save-files.js +419 -0
- package/dist/core/ops/search.d.ts +8 -0
- package/dist/core/ops/search.js +187 -0
- package/dist/core/skills-registry.d.ts +16 -1
- package/dist/core/skills-registry.js +35 -2
- package/dist/core/telemetry.d.ts +32 -0
- package/dist/core/telemetry.js +38 -10
- package/dist/core/tool-profiles.d.ts +25 -0
- package/dist/core/tool-profiles.js +41 -0
- package/dist/installer/agent-config.d.ts +17 -4
- package/dist/installer/agent-config.js +27 -6
- package/dist/installer/agent-table.d.ts +12 -0
- package/dist/installer/agent-table.js +33 -9
- package/dist/installer/cli-permissions.d.ts +65 -0
- package/dist/installer/cli-permissions.js +182 -0
- package/dist/installer/setup.d.ts +4 -0
- package/dist/installer/setup.js +12 -4
- package/dist/installer/skills-refresh.d.ts +29 -0
- package/dist/installer/skills-refresh.js +261 -0
- package/dist/installer/version-check.d.ts +51 -11
- package/dist/installer/version-check.js +147 -37
- package/dist/mcp/command.js +7 -0
- package/dist/mcp/hosted-mount.d.ts +27 -2
- package/dist/mcp/hosted-mount.js +53 -23
- package/dist/mcp/legacy-toolset.d.ts +27 -0
- package/dist/mcp/legacy-toolset.js +43 -0
- package/dist/mcp/ops-surface.d.ts +59 -0
- package/dist/mcp/ops-surface.js +453 -0
- package/dist/mcp/server.d.ts +45 -11
- package/dist/mcp/server.js +263 -89
- package/dist/mcp/tool-results.d.ts +26 -0
- package/dist/mcp/tool-results.js +81 -0
- package/dist/mcp/tool-surface.d.ts +65 -0
- package/dist/mcp/tool-surface.js +317 -0
- package/dist/mcp/tools/app-tools.js +9 -2
- package/dist/mcp/tools/asset-tools.js +55 -53
- package/dist/mcp/tools/audit-tools.js +21 -21
- package/dist/mcp/tools/debug-tools.js +6 -6
- package/dist/mcp/tools/fabricate-tools.js +6 -6
- package/dist/mcp/tools/generate-tools.js +76 -70
- package/dist/mcp/tools/project-tools.d.ts +9 -4
- package/dist/mcp/tools/project-tools.js +16 -10
- package/dist/mcp/tools/scene-tools.js +12 -23
- package/dist/mcp/tools/script-tools.js +9 -5
- package/dist/mcp/tools/with-engine.d.ts +6 -0
- package/dist/mcp/tools/with-engine.js +19 -0
- package/dist/project-memory/agent-instructions.d.ts +47 -0
- package/dist/project-memory/agent-instructions.js +226 -0
- package/gemini-extension.json +6 -13
- package/hooks/pre-commit-doctor.sh +5 -4
- package/hooks/session-start.sh +24 -28
- package/integrations/README.md +1 -1
- package/integrations/claude/README.md +6 -0
- package/integrations/claude/manifest-target.json +4 -0
- package/integrations/claude-desktop/README.md +1 -1
- package/integrations/copilot-jetbrains/README.md +1 -1
- package/integrations/gemini/README.md +11 -0
- package/integrations/junie/README.md +1 -1
- package/integrations/lm-studio/README.md +1 -1
- package/integrations/trae/README.md +1 -1
- package/integrations/visual-studio/README.md +1 -1
- package/integrations/windsurf/README.md +1 -1
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +79 -51
- package/library/references/mcp-tools-reference/resource.yaml +1 -1
- package/library/references/product-map/resource.yaml +2 -2
- package/library/skills/3d-lighting/SKILL.md +69 -28
- package/library/skills/3d-lighting/resource.yaml +1 -1
- package/library/skills/README.md +121 -118
- package/library/skills/adaptive-music/SKILL.md +40 -23
- package/library/skills/adaptive-music/resource.yaml +1 -1
- package/library/skills/agent-playtesting/SKILL.md +23 -1
- package/library/skills/agent-playtesting/resource.yaml +1 -1
- package/library/skills/ai-characters-in-games/SKILL.md +16 -1
- package/library/skills/ai-characters-in-games/resource.yaml +1 -1
- package/library/skills/ambient-bed/SKILL.md +38 -13
- package/library/skills/ambient-bed/resource.yaml +1 -1
- package/library/skills/animated-loop/SKILL.md +60 -32
- package/library/skills/animated-loop/resource.yaml +1 -1
- package/library/skills/animation-tree/SKILL.md +27 -1
- package/library/skills/animation-tree/resource.yaml +1 -1
- package/library/skills/art-direction/SKILL.md +17 -3
- package/library/skills/art-direction/resource.yaml +1 -1
- package/library/skills/asset-strategy/SKILL.md +51 -4
- package/library/skills/asset-strategy/resource.yaml +2 -1
- package/library/skills/audio-direction/SKILL.md +26 -10
- package/library/skills/audio-direction/resource.yaml +1 -1
- package/library/skills/auto-fire-targeting/SKILL.md +15 -1
- package/library/skills/auto-fire-targeting/resource.yaml +1 -1
- package/library/skills/bounded-engine-runs/SKILL.md +1 -1
- package/library/skills/bounded-engine-runs/resource.yaml +1 -1
- package/library/skills/brainstorm-game/SKILL.md +14 -1
- package/library/skills/brainstorm-game/resource.yaml +1 -1
- package/library/skills/brainstorming/SKILL.md +1 -1
- package/library/skills/brainstorming/resource.yaml +1 -1
- package/library/skills/browse-templates/SKILL.md +11 -1
- package/library/skills/browse-templates/resource.yaml +1 -1
- package/library/skills/camera-rigs/SKILL.md +22 -2
- package/library/skills/camera-rigs/resource.yaml +1 -1
- package/library/skills/celeste-momentum-platforming/resource.yaml +1 -0
- package/library/skills/character-animation-wiring/SKILL.md +28 -4
- package/library/skills/character-animation-wiring/resource.yaml +1 -1
- package/library/skills/character-model/SKILL.md +83 -47
- package/library/skills/character-model/resource.yaml +1 -1
- package/library/skills/character-movement/SKILL.md +27 -3
- package/library/skills/character-movement/resource.yaml +1 -1
- package/library/skills/character-portrait/SKILL.md +39 -19
- package/library/skills/character-portrait/resource.yaml +1 -1
- package/library/skills/cinematic-cutscene/SKILL.md +79 -46
- package/library/skills/cinematic-cutscene/resource.yaml +1 -1
- package/library/skills/combat-basics/SKILL.md +20 -1
- package/library/skills/combat-basics/resource.yaml +1 -1
- package/library/skills/compatibility-renderer-traps/SKILL.md +12 -1
- package/library/skills/compatibility-renderer-traps/resource.yaml +1 -1
- package/library/skills/concept-art/SKILL.md +29 -12
- package/library/skills/concept-art/resource.yaml +1 -1
- package/library/skills/concept-to-level/SKILL.md +258 -0
- package/library/skills/concept-to-level/references/technical-rules.md +150 -0
- package/library/skills/concept-to-level/resource.yaml +44 -0
- package/library/skills/create-asset-sheet/SKILL.md +37 -13
- package/library/skills/create-asset-sheet/resource.yaml +1 -1
- package/library/skills/debug/SKILL.md +34 -2
- package/library/skills/debug/resource.yaml +1 -1
- package/library/skills/debugging-game-feel/SKILL.md +13 -1
- package/library/skills/debugging-game-feel/resource.yaml +1 -1
- package/library/skills/design-level/SKILL.md +40 -35
- package/library/skills/design-level/resource.yaml +1 -1
- package/library/skills/design-mechanic/SKILL.md +18 -1
- package/library/skills/design-mechanic/resource.yaml +1 -1
- package/library/skills/design-npc/SKILL.md +43 -24
- package/library/skills/design-npc/resource.yaml +1 -1
- package/library/skills/diagnosing-perf-regressions/SKILL.md +13 -1
- package/library/skills/diagnosing-perf-regressions/resource.yaml +1 -1
- package/library/skills/driving-the-editor-ui/SKILL.md +24 -1
- package/library/skills/driving-the-editor-ui/resource.yaml +1 -1
- package/library/skills/environment-kit/SKILL.md +43 -16
- package/library/skills/environment-kit/resource.yaml +1 -1
- package/library/skills/export-and-ship/SKILL.md +29 -6
- package/library/skills/export-and-ship/resource.yaml +1 -1
- package/library/skills/fabricating-assets/SKILL.md +30 -7
- package/library/skills/fabricating-assets/resource.yaml +3 -3
- package/library/skills/facial-and-lipsync/SKILL.md +36 -15
- package/library/skills/facial-and-lipsync/resource.yaml +1 -1
- package/library/skills/fps-controller/SKILL.md +50 -41
- package/library/skills/fps-controller/resource.yaml +1 -1
- package/library/skills/game-feel/SKILL.md +34 -8
- package/library/skills/game-feel/resource.yaml +1 -1
- package/library/skills/gameskill/SKILL.md +15 -4
- package/library/skills/gameskill/resource.yaml +1 -1
- package/library/skills/gdscript-patterns/SKILL.md +16 -1
- package/library/skills/gdscript-patterns/resource.yaml +1 -1
- package/library/skills/generate-motion/SKILL.md +51 -21
- package/library/skills/generate-motion/resource.yaml +1 -1
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +18 -1
- package/library/skills/godogen-visual-proof-game-generation/resource.yaml +1 -0
- package/library/skills/grow-analytics/SKILL.md +13 -3
- package/library/skills/grow-analytics/resource.yaml +1 -1
- package/library/skills/headless-scripting/SKILL.md +14 -1
- package/library/skills/headless-scripting/resource.yaml +1 -1
- package/library/skills/in-game-purchases/SKILL.md +12 -1
- package/library/skills/in-game-purchases/resource.yaml +1 -1
- package/library/skills/instantiate-asset-pack/SKILL.md +19 -2
- package/library/skills/instantiate-asset-pack/resource.yaml +1 -1
- package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +1 -0
- package/library/skills/make-game/SKILL.md +33 -4
- package/library/skills/make-game/references/2d-platformer.md +1 -1
- package/library/skills/make-game/references/3d-fps.md +1 -1
- package/library/skills/make-game/references/3d-horror.md +1 -1
- package/library/skills/make-game/references/3d-third-person.md +2 -2
- package/library/skills/make-game/resource.yaml +1 -1
- package/library/skills/multiplayer/SKILL.md +13 -1
- package/library/skills/multiplayer/resource.yaml +1 -1
- package/library/skills/multiplayer-movement/SKILL.md +19 -1
- package/library/skills/multiplayer-movement/resource.yaml +1 -1
- package/library/skills/multiplayer-project/SKILL.md +18 -1
- package/library/skills/multiplayer-project/resource.yaml +1 -1
- package/library/skills/multiplayer-publish/SKILL.md +25 -7
- package/library/skills/multiplayer-publish/resource.yaml +3 -3
- package/library/skills/multiplayer-state/SKILL.md +17 -1
- package/library/skills/multiplayer-state/resource.yaml +1 -1
- package/library/skills/multiplayer-testing/SKILL.md +16 -1
- package/library/skills/multiplayer-testing/resource.yaml +1 -1
- package/library/skills/music-track/SKILL.md +38 -13
- package/library/skills/music-track/resource.yaml +1 -1
- package/library/skills/navigate-summer/SKILL.md +26 -9
- package/library/skills/navigate-summer/resource.yaml +1 -1
- package/library/skills/new-project/SKILL.md +12 -1
- package/library/skills/new-project/resource.yaml +1 -1
- package/library/skills/organic-model/SKILL.md +48 -18
- package/library/skills/organic-model/resource.yaml +1 -1
- package/library/skills/pixel-art/SKILL.md +42 -23
- package/library/skills/pixel-art/resource.yaml +1 -1
- package/library/skills/play/SKILL.md +19 -1
- package/library/skills/play/resource.yaml +1 -1
- package/library/skills/playtesting-a-feature/SKILL.md +24 -1
- package/library/skills/playtesting-a-feature/resource.yaml +1 -1
- package/library/skills/procedural-animation/SKILL.md +38 -16
- package/library/skills/procedural-animation/resource.yaml +1 -1
- package/library/skills/prop-model/SKILL.md +48 -19
- package/library/skills/prop-model/resource.yaml +1 -1
- package/library/skills/psx-retro-rendering/resource.yaml +1 -0
- package/library/skills/publish-your-game/SKILL.md +43 -6
- package/library/skills/publish-your-game/resource.yaml +3 -3
- package/library/skills/realtime-wet-surfaces/resource.yaml +1 -0
- package/library/skills/release-readiness/SKILL.md +13 -1
- package/library/skills/release-readiness/resource.yaml +1 -1
- package/library/skills/remote-deploy/SKILL.md +15 -1
- package/library/skills/remote-deploy/resource.yaml +1 -1
- package/library/skills/retarget/SKILL.md +43 -20
- package/library/skills/retarget/resource.yaml +1 -1
- package/library/skills/running-in-the-cloud/SKILL.md +11 -1
- package/library/skills/running-in-the-cloud/resource.yaml +1 -1
- package/library/skills/save-load/SKILL.md +16 -1
- package/library/skills/save-load/resource.yaml +1 -1
- package/library/skills/scene-composition/SKILL.md +18 -1
- package/library/skills/scene-composition/resource.yaml +1 -1
- package/library/skills/scene-hierarchy-design/SKILL.md +26 -2
- package/library/skills/scene-hierarchy-design/resource.yaml +1 -1
- package/library/skills/scene-scripting/SKILL.md +96 -636
- package/library/skills/scene-scripting/references/ctx-api.md +184 -0
- package/library/skills/scene-scripting/references/recipes-2d-ui.md +193 -0
- package/library/skills/scene-scripting/references/recipes-3d.md +280 -0
- package/library/skills/scene-scripting/resource.yaml +4 -4
- package/library/skills/scene-to-level/SKILL.md +24 -2
- package/library/skills/scene-to-level/resource.yaml +1 -1
- package/library/skills/skill-create/resource.yaml +1 -0
- package/library/skills/skill-improve/resource.yaml +1 -0
- package/library/skills/skill-test/SKILL.md +12 -2
- package/library/skills/skill-test/resource.yaml +1 -0
- package/library/skills/skintokens-auto-rigging/resource.yaml +1 -0
- package/library/skills/skybox-panorama/SKILL.md +47 -21
- package/library/skills/skybox-panorama/resource.yaml +1 -1
- package/library/skills/sound-effect/SKILL.md +52 -20
- package/library/skills/sound-effect/resource.yaml +1 -1
- package/library/skills/spatial-placement/SKILL.md +44 -9
- package/library/skills/spatial-placement/resource.yaml +1 -1
- package/library/skills/sprite-sheet/SKILL.md +55 -27
- package/library/skills/sprite-sheet/resource.yaml +1 -1
- package/library/skills/store-art/SKILL.md +14 -3
- package/library/skills/store-art/resource.yaml +2 -2
- package/library/skills/store-listing/SKILL.md +13 -3
- package/library/skills/store-listing/resource.yaml +2 -2
- package/library/skills/summer-analytics/SKILL.md +22 -5
- package/library/skills/summer-analytics/resource.yaml +2 -2
- package/library/skills/summer-apps/SKILL.md +77 -32
- package/library/skills/summer-apps/manifest.md +1 -1
- package/library/skills/summer-apps/minimal-app.md +7 -7
- package/library/skills/summer-apps/resource.yaml +1 -1
- package/library/skills/summer-apps/sdk-reference.md +5 -5
- package/library/skills/summer-apps-design/SKILL.md +1 -1
- package/library/skills/summer-apps-design/resource.yaml +1 -1
- package/library/skills/summer-assets/SKILL.md +86 -0
- package/library/skills/summer-assets/resource.yaml +34 -0
- package/library/skills/summer-cli/SKILL.md +133 -0
- package/library/skills/summer-cli/resource.yaml +31 -0
- package/library/skills/summer-friends/SKILL.md +14 -0
- package/library/skills/summer-leaderboards/SKILL.md +16 -0
- package/library/skills/summer-match-results/SKILL.md +17 -0
- package/library/skills/summer-matchmaking/SKILL.md +17 -0
- package/library/skills/summer-parties/SKILL.md +14 -0
- package/library/skills/summer-player-data/SKILL.md +14 -0
- package/library/skills/summer-store/SKILL.md +16 -1
- package/library/skills/summer-world-chat/SKILL.md +14 -0
- package/library/skills/summer-world-saves/SKILL.md +14 -0
- package/library/skills/text-to-motion/SKILL.md +45 -23
- package/library/skills/text-to-motion/prompts-and-controls.md +5 -5
- package/library/skills/text-to-motion/resource.yaml +1 -1
- package/library/skills/text-to-motion/rigging-for-text-motion.md +2 -2
- package/library/skills/tileable-texture/SKILL.md +37 -15
- package/library/skills/tileable-texture/resource.yaml +1 -1
- package/library/skills/trailer-shot/SKILL.md +46 -24
- package/library/skills/trailer-shot/resource.yaml +1 -1
- package/library/skills/tune-performance/SKILL.md +32 -6
- package/library/skills/tune-performance/resource.yaml +1 -1
- package/library/skills/ui-basics/SKILL.md +55 -36
- package/library/skills/ui-basics/resource.yaml +1 -1
- package/library/skills/ui-graphics/SKILL.md +64 -38
- package/library/skills/ui-graphics/resource.yaml +1 -1
- package/library/skills/use-widget-asset/SKILL.md +15 -1
- package/library/skills/use-widget-asset/resource.yaml +1 -1
- package/library/skills/using-summer/SKILL.md +32 -5
- package/library/skills/using-summer/resource.yaml +3 -2
- package/library/skills/vehicle-model/SKILL.md +92 -57
- package/library/skills/vehicle-model/resource.yaml +1 -1
- package/library/skills/verification-before-completion/SKILL.md +1 -1
- package/library/skills/verification-before-completion/resource.yaml +1 -1
- package/library/skills/verifying-scenes/SKILL.md +31 -2
- package/library/skills/verifying-scenes/resource.yaml +1 -1
- package/library/skills/vfx-dissolve/SKILL.md +21 -2
- package/library/skills/vfx-dissolve/resource.yaml +1 -1
- package/library/skills/vfx-fire/SKILL.md +41 -41
- package/library/skills/vfx-fire/resource.yaml +1 -1
- package/library/skills/vfx-hit-spark/SKILL.md +24 -1
- package/library/skills/vfx-hit-spark/resource.yaml +1 -1
- package/library/skills/vfx-lightning/SKILL.md +30 -16
- package/library/skills/vfx-lightning/resource.yaml +1 -1
- package/library/skills/vfx-magic-glow/SKILL.md +46 -32
- package/library/skills/vfx-magic-glow/resource.yaml +1 -1
- package/library/skills/vfx-muzzle-flash/SKILL.md +43 -35
- package/library/skills/vfx-muzzle-flash/resource.yaml +1 -1
- package/library/skills/vfx-smoke/SKILL.md +39 -31
- package/library/skills/vfx-smoke/resource.yaml +1 -1
- package/library/skills/vfx-water-ripple/SKILL.md +35 -31
- package/library/skills/vfx-water-ripple/resource.yaml +1 -1
- package/library/skills/voice-line/SKILL.md +87 -40
- package/library/skills/voice-line/resource.yaml +1 -1
- package/library/skills/web-and-touch-input/SKILL.md +20 -1
- package/library/skills/web-and-touch-input/resource.yaml +1 -1
- package/library/skills/web-compatibility-look/SKILL.md +21 -1
- package/library/skills/web-compatibility-look/resource.yaml +1 -1
- package/library/skills/world-building-3d/SKILL.md +29 -1
- package/library/skills/world-building-3d/resource.yaml +1 -1
- package/library/skills/writing-skills/resource.yaml +1 -0
- package/library/tools/add-node/GUIDE.md +14 -0
- package/library/tools/align-distribute-3d/GUIDE.md +7 -0
- package/library/tools/app-call/resource.yaml +1 -1
- package/library/tools/app-guide/resource.yaml +2 -2
- package/library/tools/app-page/resource.yaml +1 -1
- package/library/tools/app-screenshot/resource.yaml +19 -1
- package/library/tools/app-tools/resource.yaml +1 -1
- package/library/tools/attach-to-surface/GUIDE.md +15 -0
- package/library/tools/batch/GUIDE.md +27 -0
- package/library/tools/camera-bookmark/GUIDE.md +12 -0
- package/library/tools/capture-gameplay/GUIDE.md +3 -0
- package/library/tools/capture-gameplay/resource.yaml +3 -3
- package/library/tools/check-job/resource.yaml +1 -1
- package/library/tools/clear-console/GUIDE.md +3 -0
- package/library/tools/connect-ports/GUIDE.md +9 -0
- package/library/tools/connect-signal/GUIDE.md +14 -0
- package/library/tools/create-debug-report/GUIDE.md +10 -0
- package/library/tools/create-scene/GUIDE.md +10 -0
- package/library/tools/debug-views/GUIDE.md +7 -0
- package/library/tools/enable-plugin/GUIDE.md +3 -0
- package/library/tools/export-game/GUIDE.md +3 -0
- package/library/tools/export-game/resource.yaml +3 -3
- package/library/tools/export-templates/GUIDE.md +3 -0
- package/library/tools/fabricate-3d/GUIDE.md +19 -0
- package/library/tools/frame-nodes/GUIDE.md +9 -0
- package/library/tools/frame-shot/GUIDE.md +9 -0
- package/library/tools/game-control/GUIDE.md +9 -0
- package/library/tools/game-input/GUIDE.md +9 -0
- package/library/tools/game-probe/GUIDE.md +9 -0
- package/library/tools/generate-3d/resource.yaml +3 -3
- package/library/tools/generate-motion/resource.yaml +2 -2
- package/library/tools/get-console/GUIDE.md +9 -0
- package/library/tools/get-console/resource.yaml +5 -0
- package/library/tools/get-debugger-errors/GUIDE.md +7 -0
- package/library/tools/get-debugger-errors/resource.yaml +5 -0
- package/library/tools/get-debugger-warnings/GUIDE.md +7 -0
- package/library/tools/get-debugger-warnings/resource.yaml +5 -0
- package/library/tools/get-diagnostics/GUIDE.md +13 -0
- package/library/tools/get-project-context/GUIDE.md +25 -0
- package/library/tools/get-runtime-tree/GUIDE.md +7 -0
- package/library/tools/get-runtime-tree/resource.yaml +5 -0
- package/library/tools/get-scene-tree/GUIDE.md +11 -0
- package/library/tools/get-scene-tree/resource.yaml +5 -0
- package/library/tools/get-script-errors/GUIDE.md +5 -0
- package/library/tools/grep/GUIDE.md +11 -0
- package/library/tools/import-asset/GUIDE.md +8 -0
- package/library/tools/import-asset-by-id/GUIDE.md +12 -0
- package/library/tools/import-from-url/GUIDE.md +10 -0
- package/library/tools/import-from-url-batch/GUIDE.md +3 -0
- package/library/tools/import-hdri/GUIDE.md +16 -0
- package/library/tools/input-map-bind/GUIDE.md +11 -0
- package/library/tools/inspect-asset/GUIDE.md +14 -0
- package/library/tools/inspect-asset/resource.yaml +5 -0
- package/library/tools/inspect-node/GUIDE.md +11 -0
- package/library/tools/inspect-node/resource.yaml +5 -0
- package/library/tools/inspect-resource/GUIDE.md +7 -0
- package/library/tools/inspect-resource/resource.yaml +5 -0
- package/library/tools/inspect-runtime-node/GUIDE.md +7 -0
- package/library/tools/inspect-runtime-node/resource.yaml +5 -0
- package/library/tools/instantiate-scene/GUIDE.md +12 -0
- package/library/tools/is-running/GUIDE.md +3 -0
- package/library/tools/measure/GUIDE.md +8 -0
- package/library/tools/navigation-probe/GUIDE.md +9 -0
- package/library/tools/open/resource.yaml +2 -2
- package/library/tools/open-main-scene/GUIDE.md +6 -0
- package/library/tools/open-scene/GUIDE.md +8 -0
- package/library/tools/place-adjacent/GUIDE.md +7 -0
- package/library/tools/play/GUIDE.md +13 -0
- package/library/tools/project-setting/GUIDE.md +9 -0
- package/library/tools/publish-build/resource.yaml +6 -6
- package/library/tools/raycast/GUIDE.md +7 -0
- package/library/tools/read-file/GUIDE.md +10 -0
- package/library/tools/read-library/resource.yaml +5 -0
- package/library/tools/recent-events/GUIDE.md +7 -0
- package/library/tools/remove-node/GUIDE.md +3 -0
- package/library/tools/repeat-along/GUIDE.md +5 -0
- package/library/tools/replace-node/GUIDE.md +9 -0
- package/library/tools/replace-text/GUIDE.md +5 -0
- package/library/tools/run-editor-script/GUIDE.md +16 -0
- package/library/tools/run-script/GUIDE.md +30 -0
- package/library/tools/run-script/resource.yaml +6 -3
- package/library/tools/runtime-animate/GUIDE.md +7 -0
- package/library/tools/runtime-call/GUIDE.md +7 -0
- package/library/tools/runtime-set/GUIDE.md +9 -0
- package/library/tools/runtime-spawn/GUIDE.md +9 -0
- package/library/tools/save-scene/GUIDE.md +3 -0
- package/library/tools/scene-audit/GUIDE.md +29 -0
- package/library/tools/screenshot/GUIDE.md +17 -0
- package/library/tools/select-node/GUIDE.md +3 -0
- package/library/tools/set-prop/GUIDE.md +23 -0
- package/library/tools/set-resource-property/GUIDE.md +8 -0
- package/library/tools/shot-sheet/GUIDE.md +7 -0
- package/library/tools/snap-to-surface/GUIDE.md +17 -0
- package/library/tools/snapshot-diff/GUIDE.md +7 -0
- package/library/tools/starcast/GUIDE.md +12 -0
- package/library/tools/stop/GUIDE.md +3 -0
- package/library/tools/test-placement/GUIDE.md +7 -0
- package/library/tools/ui-actions/GUIDE.md +12 -0
- package/library/tools/ui-activate/GUIDE.md +11 -0
- package/library/tools/ui-screenshot/GUIDE.md +9 -0
- package/library/tools/ui-tree/GUIDE.md +10 -0
- package/library/tools/wait-for-event/GUIDE.md +11 -0
- package/library/tools/world-snapshot/GUIDE.md +9 -0
- package/library/tools/write-file/GUIDE.md +5 -0
- package/library/tools/zoom/GUIDE.md +5 -0
- package/package.json +8 -5
- package/registry/generated/counts.json +2 -2
- package/registry/generated/gemini-extension.json +6 -13
- package/registry/generated/index.json +482 -349
- package/registry/generated/marketplace.claude.json +2 -13
- package/registry/generated/plugin.claude-directory.json +168 -0
- package/registry/generated/plugin.claude.json +24 -22
- package/registry/generated/plugin.codex.json +18 -22
- package/registry/generated/plugin.cursor.json +8 -14
- package/registry/generated/plugin.factory.json +6 -13
- package/registry/generated/server.json +43 -0
- package/registry/generated/skills-index.md +121 -118
- package/registry/generated/skills-registry.json +167 -115
- package/registry/operations/fixtures/invalid-deprecated-without-replacement.json +60 -0
- package/registry/operations/fixtures/invalid-name.json +60 -0
- package/registry/operations/fixtures/invalid-publish-without-owner.json +82 -0
- package/registry/operations/fixtures/invalid-spend-without-estimate.json +42 -0
- package/registry/operations/fixtures/invalid-unknown-field.json +61 -0
- package/registry/operations/fixtures/valid-player-facing.json +82 -0
- package/registry/operations/fixtures/valid-read.json +60 -0
- package/registry/operations/fixtures/valid-spend.json +43 -0
- package/registry/operations/legacy-names.json +1241 -0
- package/registry/operations/public-catalog.json +33160 -0
- package/registry/schemas/operation.schema.json +318 -0
- package/registry/schemas/skill.schema.json +4 -0
- package/CLAUDE.md +0 -7
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { stem } from "../registry-search.js";
|
|
2
|
+
/**
|
|
3
|
+
* Plain-words ranking over operations. cloud.ts ranks the local rows, the
|
|
4
|
+
* shipped cloud catalog and the server's live rows together here, so a query
|
|
5
|
+
* ranks the same signed in or out.
|
|
6
|
+
*
|
|
7
|
+
* - A query word scores by the best place it meets a row: the action (the
|
|
8
|
+
* name after the dot) 7, the area or the title 4, a short tag 3, a 3.x name
|
|
9
|
+
* 2, the summary or a long use-when line 1. An exact word counts whole, a
|
|
10
|
+
* stemmed one 0.9, a prefix half, a plain-English synonym (SYNONYMS) 0.7.
|
|
11
|
+
* - Rare words weigh more (idf over the rows searched) and everyday verbs
|
|
12
|
+
* half: in "publish my game" publish decides, in "add multiplayer"
|
|
13
|
+
* multiplayer does.
|
|
14
|
+
* - A row that meets every word in its name, title or short tags keeps its
|
|
15
|
+
* score; one that meets none of them there keeps half. One whose whole
|
|
16
|
+
* action the query names gains a quarter: "publish" is store.publish
|
|
17
|
+
* before store.cancel_publish.
|
|
18
|
+
* - A title or tag the query says nearly word for word, articles aside
|
|
19
|
+
* ("how is my game doing" for "how did my game do"), adds 2 per word.
|
|
20
|
+
*/
|
|
21
|
+
const STOP = new Set([
|
|
22
|
+
"a", "an", "the", "my", "of", "for", "to", "in", "on", "and", "or", "with", "is", "it", "me", "i", "please", "how", "do", "what",
|
|
23
|
+
"did", "does", "doing", "done", "am", "are", "was", "were", "be", "have", "has", "had", "can", "could", "would", "should", "will",
|
|
24
|
+
"want", "need", "this", "that", "these", "those", "some", "any", "many", "much", "why", "where", "when", "which", "there", "you",
|
|
25
|
+
"your", "we", "our", "us", "at", "by", "from", "as", "so", "just", "s",
|
|
26
|
+
]);
|
|
27
|
+
/** Verbs that say what to do but rarely which operation: the object does. */
|
|
28
|
+
const EVERYDAY_VERBS = new Set(["add", "make", "create", "set", "get", "change", "update", "edit", "run", "start", "put", "take", "show", "read", "list", "use", "give", "check", "find", "see", "turn", "open"]);
|
|
29
|
+
/** Left out of phrase matching: "put my game on sale" says "Put a game on sale". */
|
|
30
|
+
const ARTICLES = new Set(["a", "an", "the", "my", "your", "our", "their", "its", "this", "that"]);
|
|
31
|
+
/** Irregular forms, so "how did my game do" meets "how is my game doing". */
|
|
32
|
+
const IRREGULAR = { did: "do", does: "do", doing: "do", done: "do", is: "be", are: "be", was: "be", were: "be", am: "be", has: "have", had: "have" };
|
|
33
|
+
/** Plain English to the catalog's words (stemmed keys). */
|
|
34
|
+
const SYNONYMS = {
|
|
35
|
+
make: ["generate", "create"],
|
|
36
|
+
create: ["generate", "make"],
|
|
37
|
+
picture: ["image"],
|
|
38
|
+
drawing: ["image"],
|
|
39
|
+
photo: ["image"],
|
|
40
|
+
model: ["3d"],
|
|
41
|
+
mesh: ["3d"],
|
|
42
|
+
sound: ["audio"],
|
|
43
|
+
music: ["audio"],
|
|
44
|
+
song: ["audio"],
|
|
45
|
+
clip: ["video"],
|
|
46
|
+
movie: ["video"],
|
|
47
|
+
film: ["video"],
|
|
48
|
+
animate: ["motion"],
|
|
49
|
+
animation: ["motion"],
|
|
50
|
+
run: ["play", "start"],
|
|
51
|
+
cost: ["price"],
|
|
52
|
+
teammate: ["member"],
|
|
53
|
+
character: ["model"],
|
|
54
|
+
game: ["store"],
|
|
55
|
+
error: ["diagnostic"],
|
|
56
|
+
bug: ["error", "diagnostic"],
|
|
57
|
+
};
|
|
58
|
+
const norm = (word) => IRREGULAR[word] ?? stem(word);
|
|
59
|
+
const tokens = (text) => text
|
|
60
|
+
.toLowerCase()
|
|
61
|
+
.replace(/\ba\/b\b/g, "ab")
|
|
62
|
+
.split(/[^a-z0-9]+/)
|
|
63
|
+
.filter(Boolean)
|
|
64
|
+
.map((raw) => ({ raw, normed: norm(raw) }));
|
|
65
|
+
export function words(text) {
|
|
66
|
+
return tokens(text)
|
|
67
|
+
.filter(({ raw }) => raw.length > 1 && !STOP.has(raw))
|
|
68
|
+
.map(({ raw }) => raw);
|
|
69
|
+
}
|
|
70
|
+
const indexCache = new WeakMap();
|
|
71
|
+
function indexed(entry) {
|
|
72
|
+
const cached = indexCache.get(entry);
|
|
73
|
+
if (cached)
|
|
74
|
+
return cached;
|
|
75
|
+
const [area, action] = entry.name.includes(".") ? entry.name.split(".") : ["", entry.name];
|
|
76
|
+
const kept = (text) => tokens(text).filter(({ raw }) => raw.length > 1 && !STOP.has(raw));
|
|
77
|
+
const tags = entry.tags ?? [];
|
|
78
|
+
// A tag of a few words is a keyword; a long one (a use-when line) reads like the summary.
|
|
79
|
+
const short = (tag) => tokens(tag).length <= 3;
|
|
80
|
+
const fields = [
|
|
81
|
+
{ weight: 7, words: kept(action.replace(/_/g, " ")) },
|
|
82
|
+
{ weight: 4, words: kept(area) },
|
|
83
|
+
{ weight: 4, words: kept(entry.title) },
|
|
84
|
+
{ weight: 3, words: [...tags.filter(short), ...(entry.topics ?? [])].flatMap(kept) },
|
|
85
|
+
{ weight: 2, words: (entry.legacy ?? []).flatMap((name) => kept(name.replace(/^summer_/, "").replace(/[#_]/g, " "))) },
|
|
86
|
+
{ weight: 1, words: [entry.summary, ...tags.filter((tag) => !short(tag))].flatMap(kept) },
|
|
87
|
+
];
|
|
88
|
+
const phrases = [entry.title, ...tags].map((text) => tokens(text).filter(({ raw }) => !ARTICLES.has(raw))).filter((phrase) => phrase.length >= 2);
|
|
89
|
+
const result = { fields, phrases, action: kept(action.replace(/_/g, " ")), area: kept(area) };
|
|
90
|
+
indexCache.set(entry, result);
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
/** How well one query word meets one row word: exact 1, same stem 0.9, a prefix 0.5 ("anim" in animation; not "play" in players). */
|
|
94
|
+
function meets(term, word) {
|
|
95
|
+
if (word.raw === term.raw)
|
|
96
|
+
return 1;
|
|
97
|
+
if (word.normed === term.normed)
|
|
98
|
+
return 0.9;
|
|
99
|
+
const [a, b] = [term.normed, word.normed];
|
|
100
|
+
return (a.length >= 4 && b.startsWith(a)) || (b.length >= 5 && a.startsWith(b)) ? 0.5 : 0;
|
|
101
|
+
}
|
|
102
|
+
const alternatesOf = (term) => (SYNONYMS[term.normed] ?? []).map((synonym) => ({ raw: synonym, normed: norm(synonym) }));
|
|
103
|
+
/** A query word's best weight in a row, and whether it met a strong field (weight 3 or more). */
|
|
104
|
+
function best(term, entry, synonyms = true) {
|
|
105
|
+
const alternates = synonyms ? alternatesOf(term) : [];
|
|
106
|
+
let score = 0;
|
|
107
|
+
let strong = false;
|
|
108
|
+
for (const field of indexed(entry).fields) {
|
|
109
|
+
for (const word of field.words) {
|
|
110
|
+
const quality = Math.max(meets(term, word), ...alternates.map((alternate) => 0.7 * meets(alternate, word)));
|
|
111
|
+
if (quality === 0)
|
|
112
|
+
continue;
|
|
113
|
+
score = Math.max(score, field.weight * quality);
|
|
114
|
+
if (field.weight >= 3)
|
|
115
|
+
strong = true;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return { score, strong };
|
|
119
|
+
}
|
|
120
|
+
/** The best title or tag the query says nearly word for word: 2 per word met. */
|
|
121
|
+
function phraseBonus(entry, all) {
|
|
122
|
+
const query = all.filter(({ raw }) => !ARTICLES.has(raw));
|
|
123
|
+
let bonus = 0;
|
|
124
|
+
for (const phrase of indexed(entry).phrases) {
|
|
125
|
+
const met = phrase.map((word) => Math.max(0, ...query.map((term) => (term.raw === word.raw ? 1 : term.normed === word.normed ? 0.9 : alternatesOf(term).some((alternate) => alternate.normed === word.normed) ? 0.7 : 0))));
|
|
126
|
+
const count = met.filter((quality) => quality > 0).length;
|
|
127
|
+
const meaningful = phrase.some((word, index) => met[index] > 0 && !STOP.has(word.raw));
|
|
128
|
+
if (meaningful && count >= 2 && count / phrase.length >= 0.75)
|
|
129
|
+
bonus = Math.max(bonus, 2 * met.reduce((sum, quality) => sum + quality, 0));
|
|
130
|
+
}
|
|
131
|
+
return bonus;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* The query names the row's whole action, and its area too when the action
|
|
135
|
+
* is only an everyday verb: "list my games" names games.list, "run my game"
|
|
136
|
+
* does not name engine.is_running.
|
|
137
|
+
*/
|
|
138
|
+
function namesAction(entry, terms) {
|
|
139
|
+
const { action, area } = indexed(entry);
|
|
140
|
+
const met = (word) => terms.some((term) => meets(term, word) >= 0.9);
|
|
141
|
+
return action.length > 0 && action.every(met) && (action.some((word) => !EVERYDAY_VERBS.has(word.normed)) || area.some(met));
|
|
142
|
+
}
|
|
143
|
+
function scoreAll(entries, query) {
|
|
144
|
+
const exact = query.trim().toLowerCase();
|
|
145
|
+
const all = tokens(query);
|
|
146
|
+
const terms = all.filter(({ raw }) => raw.length > 1 && !STOP.has(raw));
|
|
147
|
+
if (!terms.length)
|
|
148
|
+
return entries.map(() => 0);
|
|
149
|
+
// Rarer words weigh more: idf over the rows searched; everyday verbs count half.
|
|
150
|
+
const weightOf = terms.map((term) => {
|
|
151
|
+
const df = entries.filter((entry) => best(term, entry, false).score > 0).length;
|
|
152
|
+
return Math.log(1 + entries.length / (1 + df)) * (EVERYDAY_VERBS.has(term.normed) ? 0.5 : 1);
|
|
153
|
+
});
|
|
154
|
+
return entries.map((entry) => {
|
|
155
|
+
if (exact === entry.name || entry.legacy?.some((name) => name.split("#")[0] === exact))
|
|
156
|
+
return 1000;
|
|
157
|
+
let total = 0;
|
|
158
|
+
let strong = 0;
|
|
159
|
+
let missed = false;
|
|
160
|
+
terms.forEach((term, index) => {
|
|
161
|
+
const hit = best(term, entry);
|
|
162
|
+
total += weightOf[index] * hit.score;
|
|
163
|
+
if (hit.strong)
|
|
164
|
+
strong += 1;
|
|
165
|
+
if (hit.score === 0)
|
|
166
|
+
missed = true;
|
|
167
|
+
});
|
|
168
|
+
if (total === 0)
|
|
169
|
+
return 0;
|
|
170
|
+
return total * (0.5 + (0.5 * strong) / terms.length) * (!missed && namesAction(entry, terms) ? 1.25 : 1) + phraseBonus(entry, all);
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
const STATUS_RANK = { stable: 0, preview: 1, deprecated: 2 };
|
|
174
|
+
export function searchEntries(entries, query, filters) {
|
|
175
|
+
const hasTerms = words(query).length > 0;
|
|
176
|
+
const kept = entries
|
|
177
|
+
.filter((entry) => entry.status !== "deprecated")
|
|
178
|
+
.filter((entry) => !filters.area || entry.name === filters.area || entry.name.startsWith(`${filters.area}.`))
|
|
179
|
+
.filter((entry) => !filters.effect || entry.effect === filters.effect);
|
|
180
|
+
const scores = scoreAll(kept, query);
|
|
181
|
+
return kept
|
|
182
|
+
.map((entry, index) => ({ entry, score: scores[index] }))
|
|
183
|
+
.filter(({ score }) => score > 0 || !hasTerms)
|
|
184
|
+
.sort((a, b) => b.score - a.score || STATUS_RANK[a.entry.status] - STATUS_RANK[b.entry.status] || Number(b.entry.available) - Number(a.entry.available) || a.entry.name.localeCompare(b.entry.name))
|
|
185
|
+
.slice(0, filters.limit)
|
|
186
|
+
.map(({ entry }) => entry);
|
|
187
|
+
}
|
|
@@ -25,6 +25,10 @@ export interface SkillRegistryEntry {
|
|
|
25
25
|
path: string;
|
|
26
26
|
/** facets.domains from resource.yaml; the first is the primary domain. Empty on old registries. */
|
|
27
27
|
domains: string[];
|
|
28
|
+
/** Bulk installs and the plugin manifests take it. false = library only
|
|
29
|
+
* (library-author tools, research digests): readable with
|
|
30
|
+
* summer_read_library and installable by name. Absent reads as true. */
|
|
31
|
+
bundled?: boolean;
|
|
28
32
|
}
|
|
29
33
|
/**
|
|
30
34
|
* Load the generated skill registry (cached after first read).
|
|
@@ -34,18 +38,29 @@ export interface SkillRegistryEntry {
|
|
|
34
38
|
export declare function getSkillRegistry(): readonly SkillRegistryEntry[];
|
|
35
39
|
/** Shape-tolerant parse of skills-registry.json. Exported for unit tests. */
|
|
36
40
|
export declare function parseSkillRegistry(json: unknown): SkillRegistryEntry[];
|
|
41
|
+
/**
|
|
42
|
+
* The assets-only install (`summer setup --assets-only`, `skills install
|
|
43
|
+
* --assets`): skills that make sounds, music, voices, images, models,
|
|
44
|
+
* animation and video on Summer's servers, plus `summer-assets`, the session
|
|
45
|
+
* skill for that profile. Each says what to do without Summer Engine. The
|
|
46
|
+
* engine session skill `using-summer` and skills that wire assets into a
|
|
47
|
+
* running engine stay out.
|
|
48
|
+
*/
|
|
49
|
+
export declare function isAssetSkill(skill: Pick<SkillRegistryEntry, "name" | "domains">): boolean;
|
|
37
50
|
/**
|
|
38
51
|
* The one bulk-install rule (`skills install --all/--recommended` and
|
|
39
52
|
* `summer setup` both use it): `stable` and `preview` skills install —
|
|
40
53
|
* preview is a label ("not yet exercised in-engine by the Summer team"),
|
|
41
54
|
* carried in each skill's own guidance, not a reason to hide contributed work;
|
|
42
|
-
* `deprecated` never installs in bulk
|
|
55
|
+
* `deprecated` never installs in bulk, and neither does a library-only skill
|
|
56
|
+
* (`bundled: false`). `stableOnly` opts out of preview.
|
|
43
57
|
* The counts let the caller say how many preview skills it installed (or, with
|
|
44
58
|
* stableOnly, left out) instead of printing a bare total.
|
|
45
59
|
*/
|
|
46
60
|
export declare function selectSkillsForBulkInstall(skills: readonly SkillRegistryEntry[], options: {
|
|
47
61
|
recommended?: boolean;
|
|
48
62
|
stableOnly?: boolean;
|
|
63
|
+
assetsOnly?: boolean;
|
|
49
64
|
}): {
|
|
50
65
|
selected: SkillRegistryEntry[];
|
|
51
66
|
previewIncluded: number;
|
|
@@ -78,19 +78,52 @@ export function parseSkillRegistry(json) {
|
|
|
78
78
|
status: s.status === "preview" || s.status === "deprecated" ? s.status : "stable",
|
|
79
79
|
path: s.path,
|
|
80
80
|
domains: Array.isArray(s.domains) ? s.domains.filter((d) => typeof d === "string") : [],
|
|
81
|
+
bundled: s.bundled !== false,
|
|
81
82
|
}));
|
|
82
83
|
}
|
|
84
|
+
/** Skills that handle assets but need more than the assets profile: they wire
|
|
85
|
+
* assets into a scene, or (store-art) make art for a Summer Games listing. */
|
|
86
|
+
const NOT_ASSETS_ONLY_SKILLS = new Set([
|
|
87
|
+
"instantiate-asset-pack",
|
|
88
|
+
"use-widget-asset",
|
|
89
|
+
"skintokens-auto-rigging",
|
|
90
|
+
"fabricating-assets",
|
|
91
|
+
"lumera-single-image-scene-reconstruction",
|
|
92
|
+
"store-art",
|
|
93
|
+
]);
|
|
94
|
+
/**
|
|
95
|
+
* The assets-only install (`summer setup --assets-only`, `skills install
|
|
96
|
+
* --assets`): skills that make sounds, music, voices, images, models,
|
|
97
|
+
* animation and video on Summer's servers, plus `summer-assets`, the session
|
|
98
|
+
* skill for that profile. Each says what to do without Summer Engine. The
|
|
99
|
+
* engine session skill `using-summer` and skills that wire assets into a
|
|
100
|
+
* running engine stay out.
|
|
101
|
+
*/
|
|
102
|
+
export function isAssetSkill(skill) {
|
|
103
|
+
if (skill.name === "generate-motion")
|
|
104
|
+
return true;
|
|
105
|
+
if (NOT_ASSETS_ONLY_SKILLS.has(skill.name))
|
|
106
|
+
return false;
|
|
107
|
+
const domains = skill.domains ?? [];
|
|
108
|
+
return domains.includes("assets") || domains.includes("generate");
|
|
109
|
+
}
|
|
83
110
|
/**
|
|
84
111
|
* The one bulk-install rule (`skills install --all/--recommended` and
|
|
85
112
|
* `summer setup` both use it): `stable` and `preview` skills install —
|
|
86
113
|
* preview is a label ("not yet exercised in-engine by the Summer team"),
|
|
87
114
|
* carried in each skill's own guidance, not a reason to hide contributed work;
|
|
88
|
-
* `deprecated` never installs in bulk
|
|
115
|
+
* `deprecated` never installs in bulk, and neither does a library-only skill
|
|
116
|
+
* (`bundled: false`). `stableOnly` opts out of preview.
|
|
89
117
|
* The counts let the caller say how many preview skills it installed (or, with
|
|
90
118
|
* stableOnly, left out) instead of printing a bare total.
|
|
91
119
|
*/
|
|
92
120
|
export function selectSkillsForBulkInstall(skills, options) {
|
|
93
|
-
const
|
|
121
|
+
const bundled = skills.filter((skill) => skill.bundled !== false);
|
|
122
|
+
const candidates = options.assetsOnly
|
|
123
|
+
? bundled.filter(isAssetSkill)
|
|
124
|
+
: options.recommended
|
|
125
|
+
? bundled.filter((skill) => skill.recommended)
|
|
126
|
+
: bundled;
|
|
94
127
|
const stableOnly = options.stableOnly === true;
|
|
95
128
|
const selected = candidates.filter((skill) => skill.status === "stable" || (!stableOnly && skill.status === "preview"));
|
|
96
129
|
const preview = candidates.filter((skill) => skill.status === "preview").length;
|
package/dist/core/telemetry.d.ts
CHANGED
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage beacons for the local MCP server. Fire-and-forget, never blocks, never throws.
|
|
3
|
+
*
|
|
4
|
+
* - One session ping per MCP server lifetime (mcp_session_start), on the
|
|
5
|
+
* first tool call, with the host app's name from the MCP handshake.
|
|
6
|
+
* - One line per local tool call (mcp_tool_call): the tool name, the
|
|
7
|
+
* Summer operation it ran, success, duration, the host app's name from the
|
|
8
|
+
* MCP handshake, and the tool surface and profile. Nothing else: no
|
|
9
|
+
* arguments, no results, no project or file names.
|
|
10
|
+
*
|
|
11
|
+
* Both go to /api/mcp/log-local-call, only when signed in (the account token
|
|
12
|
+
* attributes them), and never when SUMMER_NO_TELEMETRY=1 or DO_NOT_TRACK=1.
|
|
13
|
+
* The endpoint always returns allowed:true and never gates; the response is
|
|
14
|
+
* ignored.
|
|
15
|
+
*/
|
|
16
|
+
import { isTelemetryDisabled } from "./agent-host.js";
|
|
17
|
+
export { isTelemetryDisabled };
|
|
1
18
|
/**
|
|
2
19
|
* Ping the telemetry endpoint once per MCP server lifetime.
|
|
3
20
|
*
|
|
@@ -7,6 +24,21 @@
|
|
|
7
24
|
* - Skips entirely if no auth token is on disk (anonymous users still work).
|
|
8
25
|
*/
|
|
9
26
|
export declare function recordMcpSession(): void;
|
|
27
|
+
export interface LocalToolCall {
|
|
28
|
+
tool: string;
|
|
29
|
+
ok: boolean;
|
|
30
|
+
durationMs: number;
|
|
31
|
+
/** The host app's name from the MCP handshake (clientInfo.name). */
|
|
32
|
+
mcpClient?: string;
|
|
33
|
+
/** The Summer operation the call ran (core/ops/contract.ts opForToolCall). */
|
|
34
|
+
op?: string | null;
|
|
35
|
+
/** The tool surface: v3 (3.x names) or v4 (the operation catalog). */
|
|
36
|
+
surfaceVersion?: "v3" | "v4";
|
|
37
|
+
/** The MCP profile: full, engine, assets or custom. */
|
|
38
|
+
profile?: string;
|
|
39
|
+
}
|
|
40
|
+
/** Report one local tool call: tool name, success, duration, host app name. */
|
|
41
|
+
export declare function recordLocalToolCall(call: LocalToolCall): void;
|
|
10
42
|
/**
|
|
11
43
|
* Reset the once-per-session guard. Test-only.
|
|
12
44
|
*/
|
package/dist/core/telemetry.js
CHANGED
|
@@ -1,15 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* One ping per MCP server lifetime — counts daily-active users, not per-tool calls.
|
|
2
|
+
* Usage beacons for the local MCP server. Fire-and-forget, never blocks, never throws.
|
|
4
3
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* - One session ping per MCP server lifetime (mcp_session_start), on the
|
|
5
|
+
* first tool call, with the host app's name from the MCP handshake.
|
|
6
|
+
* - One line per local tool call (mcp_tool_call): the tool name, the
|
|
7
|
+
* Summer operation it ran, success, duration, the host app's name from the
|
|
8
|
+
* MCP handshake, and the tool surface and profile. Nothing else: no
|
|
9
|
+
* arguments, no results, no project or file names.
|
|
10
|
+
*
|
|
11
|
+
* Both go to /api/mcp/log-local-call, only when signed in (the account token
|
|
12
|
+
* attributes them), and never when SUMMER_NO_TELEMETRY=1 or DO_NOT_TRACK=1.
|
|
13
|
+
* The endpoint always returns allowed:true and never gates; the response is
|
|
14
|
+
* ignored.
|
|
8
15
|
*/
|
|
16
|
+
import { currentMcpClient, isTelemetryDisabled, summerRequestHeaders } from "./agent-host.js";
|
|
9
17
|
import { getAuthToken } from "./auth.js";
|
|
10
18
|
import { resolveGatewayUrl } from "./config.js";
|
|
19
|
+
export { isTelemetryDisabled };
|
|
11
20
|
const TELEMETRY_PATH = "/api/mcp/log-local-call";
|
|
12
21
|
const TIMEOUT_MS = 5000;
|
|
22
|
+
const TOOL_NAME = /^summer_[a-z0-9_]{1,64}$/;
|
|
13
23
|
let pinged = false;
|
|
14
24
|
/**
|
|
15
25
|
* Ping the telemetry endpoint once per MCP server lifetime.
|
|
@@ -20,9 +30,29 @@ let pinged = false;
|
|
|
20
30
|
* - Skips entirely if no auth token is on disk (anonymous users still work).
|
|
21
31
|
*/
|
|
22
32
|
export function recordMcpSession() {
|
|
23
|
-
if (pinged)
|
|
33
|
+
if (pinged || isTelemetryDisabled())
|
|
24
34
|
return;
|
|
25
35
|
pinged = true;
|
|
36
|
+
const mcpClient = currentMcpClient()?.name;
|
|
37
|
+
send({ client: "summer-cli", event: "mcp_session_start", ...(mcpClient ? { mcpClient: mcpClient.slice(0, 64) } : {}) });
|
|
38
|
+
}
|
|
39
|
+
/** Report one local tool call: tool name, success, duration, host app name. */
|
|
40
|
+
export function recordLocalToolCall(call) {
|
|
41
|
+
if (isTelemetryDisabled() || !TOOL_NAME.test(call.tool))
|
|
42
|
+
return;
|
|
43
|
+
send({
|
|
44
|
+
client: "summer-cli",
|
|
45
|
+
event: "mcp_tool_call",
|
|
46
|
+
...(call.mcpClient ? { mcpClient: call.mcpClient.slice(0, 64) } : {}),
|
|
47
|
+
tool: call.tool,
|
|
48
|
+
...(call.op ? { op: call.op } : {}),
|
|
49
|
+
...(call.surfaceVersion ? { surfaceVersion: call.surfaceVersion } : {}),
|
|
50
|
+
...(call.profile ? { profile: call.profile } : {}),
|
|
51
|
+
ok: call.ok,
|
|
52
|
+
durationMs: Math.max(0, Math.round(call.durationMs)),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function send(body) {
|
|
26
56
|
// Wrap the entire async pipeline in a void-discarded promise so the caller
|
|
27
57
|
// never accidentally awaits us.
|
|
28
58
|
void (async () => {
|
|
@@ -40,13 +70,11 @@ export function recordMcpSession() {
|
|
|
40
70
|
method: "POST",
|
|
41
71
|
signal: ctrl.signal,
|
|
42
72
|
headers: {
|
|
73
|
+
...summerRequestHeaders(),
|
|
43
74
|
Authorization: `Bearer ${token}`,
|
|
44
75
|
"Content-Type": "application/json",
|
|
45
76
|
},
|
|
46
|
-
body: JSON.stringify(
|
|
47
|
-
client: "summer-cli",
|
|
48
|
-
event: "mcp_session_start",
|
|
49
|
-
}),
|
|
77
|
+
body: JSON.stringify(body),
|
|
50
78
|
});
|
|
51
79
|
}
|
|
52
80
|
finally {
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool profiles (`summer mcp --profile`, SUMMER_PROFILE) and the toolsets
|
|
3
|
+
* they pick. Shared by the MCP server (src/mcp/tool-surface.ts) and setup,
|
|
4
|
+
* which writes a profile into an agent's MCP entry. `full` is today's
|
|
5
|
+
* surface exactly and the default, so existing configs keep it.
|
|
6
|
+
*/
|
|
7
|
+
export declare const TOOLSETS: readonly ["core", "assets", "tools", "engine", "ui", "ship", "uploads", "apps", "board", "grow", "studio", "cloud", "other"];
|
|
8
|
+
export type Toolset = (typeof TOOLSETS)[number];
|
|
9
|
+
export declare const PROFILES: {
|
|
10
|
+
/** Every tool, local and hosted (today's surface). */
|
|
11
|
+
readonly full: readonly ["core", "assets", "tools", "engine", "ui", "ship", "uploads", "apps", "board", "grow", "studio", "cloud", "other"];
|
|
12
|
+
/** Summer Engine creators: engine, generation and the store. Fits clients with a 128-tool limit. */
|
|
13
|
+
readonly engine: readonly ["core", "assets", "engine", "ship"];
|
|
14
|
+
/** Any engine or none: generation, the asset library, account and library search. No engine tools. */
|
|
15
|
+
readonly assets: readonly ["core", "assets", "tools"];
|
|
16
|
+
};
|
|
17
|
+
export type Profile = keyof typeof PROFILES;
|
|
18
|
+
/** Non-full profiles never register more tools than this (VS Code Copilot's per-request limit). */
|
|
19
|
+
export declare const PROFILE_TOOL_LIMIT = 128;
|
|
20
|
+
/** A profile name, or null when the value names none. */
|
|
21
|
+
export declare function parseProfile(value: string | undefined): Profile | null;
|
|
22
|
+
/** v4: the operation catalog (summer_search, summer_call, `summer <area> <action>`); v3: the 3.x tools. */
|
|
23
|
+
export type SurfaceVersion = "v3" | "v4";
|
|
24
|
+
/** `--surface` / SUMMER_SURFACE: v4 is the default since 4.0; v3 keeps the 3.x tools. */
|
|
25
|
+
export declare function resolveSurface(value: string | undefined, env?: NodeJS.ProcessEnv): SurfaceVersion;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool profiles (`summer mcp --profile`, SUMMER_PROFILE) and the toolsets
|
|
3
|
+
* they pick. Shared by the MCP server (src/mcp/tool-surface.ts) and setup,
|
|
4
|
+
* which writes a profile into an agent's MCP entry. `full` is today's
|
|
5
|
+
* surface exactly and the default, so existing configs keep it.
|
|
6
|
+
*/
|
|
7
|
+
export const TOOLSETS = [
|
|
8
|
+
"core",
|
|
9
|
+
"assets",
|
|
10
|
+
"tools",
|
|
11
|
+
"engine",
|
|
12
|
+
"ui",
|
|
13
|
+
"ship",
|
|
14
|
+
"uploads",
|
|
15
|
+
"apps",
|
|
16
|
+
"board",
|
|
17
|
+
"grow",
|
|
18
|
+
"studio",
|
|
19
|
+
"cloud",
|
|
20
|
+
"other",
|
|
21
|
+
];
|
|
22
|
+
export const PROFILES = {
|
|
23
|
+
/** Every tool, local and hosted (today's surface). */
|
|
24
|
+
full: TOOLSETS,
|
|
25
|
+
/** Summer Engine creators: engine, generation and the store. Fits clients with a 128-tool limit. */
|
|
26
|
+
engine: ["core", "assets", "engine", "ship"],
|
|
27
|
+
/** Any engine or none: generation, the asset library, account and library search. No engine tools. */
|
|
28
|
+
assets: ["core", "assets", "tools"],
|
|
29
|
+
};
|
|
30
|
+
/** Non-full profiles never register more tools than this (VS Code Copilot's per-request limit). */
|
|
31
|
+
export const PROFILE_TOOL_LIMIT = 128;
|
|
32
|
+
/** A profile name, or null when the value names none. */
|
|
33
|
+
export function parseProfile(value) {
|
|
34
|
+
const name = (value ?? "").trim().toLowerCase();
|
|
35
|
+
return Object.hasOwn(PROFILES, name) ? name : null;
|
|
36
|
+
}
|
|
37
|
+
/** `--surface` / SUMMER_SURFACE: v4 is the default since 4.0; v3 keeps the 3.x tools. */
|
|
38
|
+
export function resolveSurface(value, env = process.env) {
|
|
39
|
+
const asked = (value ?? env.SUMMER_SURFACE ?? "").trim().toLowerCase();
|
|
40
|
+
return asked === "v3" || asked === "3" ? "v3" : "v4";
|
|
41
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Profile } from "../core/tool-profiles.js";
|
|
1
2
|
import { type ConfigScope, type McpFormat, type SupportedAgent } from "./agent-table.js";
|
|
2
3
|
export { supportedAgents, type ConfigScope, type SupportedAgent } from "./agent-table.js";
|
|
3
4
|
export declare const SUMMER_MCP_SERVER_NAME = "summer-engine";
|
|
@@ -12,9 +13,11 @@ export interface AgentConfigOptions {
|
|
|
12
13
|
dryRun?: boolean;
|
|
13
14
|
print?: boolean;
|
|
14
15
|
localDev?: boolean;
|
|
15
|
-
/** npm dist-tag the generated MCP entry runs (`npx -y summer-engine@<channel> mcp`).
|
|
16
|
+
/** npm dist-tag or exact version the generated MCP entry runs (`npx -y summer-engine@<channel> mcp`).
|
|
16
17
|
* Default "latest"; "next" while a release soaks on the next tag. Ignored with localDev. */
|
|
17
18
|
channel?: string;
|
|
19
|
+
/** MCP tool profile written as SUMMER_PROFILE; default the agent's own (full for most). */
|
|
20
|
+
profile?: Profile;
|
|
18
21
|
cwd?: string;
|
|
19
22
|
env?: NodeJS.ProcessEnv;
|
|
20
23
|
}
|
|
@@ -31,8 +34,11 @@ export interface AgentConfigResult {
|
|
|
31
34
|
dryRun: boolean;
|
|
32
35
|
print: boolean;
|
|
33
36
|
localDev: boolean;
|
|
34
|
-
/** The dist-tag the written entry runs ("latest" unless --channel /
|
|
37
|
+
/** The dist-tag or exact version the written entry runs ("latest" unless --channel /
|
|
38
|
+
* SUMMER_CHANNEL, or a CLI ahead of npm latest: see resolveDefaultChannel). */
|
|
35
39
|
channel: string;
|
|
40
|
+
/** The MCP tool profile the entry runs (full = every tool, no SUMMER_PROFILE written). */
|
|
41
|
+
profile: Profile;
|
|
36
42
|
warnings: string[];
|
|
37
43
|
nextSteps: string[];
|
|
38
44
|
}
|
|
@@ -72,9 +78,16 @@ export interface RemoteMcpResult {
|
|
|
72
78
|
export declare function configureSummerGamesMcp(options: Pick<AgentConfigOptions, "agent" | "scope" | "dryRun" | "cwd" | "env">): Promise<RemoteMcpResult | null>;
|
|
73
79
|
export declare const DEFAULT_CHANNEL = "latest";
|
|
74
80
|
/** npm dist-tags are lowercase words like `latest`, `next`, `beta`, `v3-preview`;
|
|
75
|
-
*
|
|
76
|
-
*
|
|
81
|
+
* an exact version (`3.9.1`, `3.9.1-rc.1`) pins the entry to that release, which
|
|
82
|
+
* setup does for a CLI that is ahead of npm latest. Anything else, partial
|
|
83
|
+
* versions and paths included, is refused. */
|
|
77
84
|
export declare function normalizeChannel(channel: string | undefined): string;
|
|
85
|
+
/**
|
|
86
|
+
* The profile rides in the entry's env, not its args: an older summer-engine
|
|
87
|
+
* that an agent still runs ignores the variable and serves every tool, where
|
|
88
|
+
* an unknown --profile flag would stop it from starting.
|
|
89
|
+
*/
|
|
90
|
+
export declare function withProfile(server: StdioMcpServerConfig, profile: Profile): StdioMcpServerConfig;
|
|
78
91
|
export declare function createSummerMcpServerConfig(localDev: boolean, platform?: NodeJS.Platform, channel?: string): StdioMcpServerConfig;
|
|
79
92
|
export declare function renderConfigSnippet(agent: SupportedAgent, server: StdioMcpServerConfig): string;
|
|
80
93
|
/** The key under which the file lists MCP servers (see McpFormat in agent-table.ts). */
|
|
@@ -27,9 +27,12 @@ export function resolveAgentSelection(agentArg, agentOpt) {
|
|
|
27
27
|
if (agentArg && agentOpt && parseAgent(agentArg) !== parseAgent(agentOpt)) {
|
|
28
28
|
throw new Error("Specify the agent either positionally or with --agent, not both.");
|
|
29
29
|
}
|
|
30
|
-
const
|
|
30
|
+
const name = agentOpt ?? agentArg;
|
|
31
|
+
const parsed = parseAgent(name);
|
|
31
32
|
if (!parsed) {
|
|
32
|
-
throw new Error(
|
|
33
|
+
throw new Error(name
|
|
34
|
+
? `Unknown agent "${name}". Supported: ${supportedAgents.join(", ")}`
|
|
35
|
+
: `Specify an agent: ${supportedAgents.join(", ")}`);
|
|
33
36
|
}
|
|
34
37
|
return parsed;
|
|
35
38
|
}
|
|
@@ -45,9 +48,15 @@ export async function configureAgentMcp(options) {
|
|
|
45
48
|
const env = options.env ?? process.env;
|
|
46
49
|
const cwd = resolve(options.cwd ?? process.cwd());
|
|
47
50
|
const channel = normalizeChannel(options.channel);
|
|
48
|
-
const server = createSummerMcpServerConfig(Boolean(options.localDev), process.platform, channel);
|
|
49
51
|
const spec = agentSpec(options.agent);
|
|
52
|
+
const profile = options.profile ?? spec.mcpProfile ?? "full";
|
|
53
|
+
const server = withProfile(createSummerMcpServerConfig(Boolean(options.localDev), process.platform, channel), profile);
|
|
50
54
|
const target = resolveConfigTarget(spec, options.scope, cwd, env);
|
|
55
|
+
// An entry an earlier setup wrote where the agent no longer reads (Devin Desktop moved from ~/.codeium/windsurf).
|
|
56
|
+
const moved = spec.mcp.movedFrom ? spec.mcp.movedFrom(defaultPathContext(env, cwd)) : null;
|
|
57
|
+
if (moved && moved !== target.path && (await readTextFileIfExists(moved)).includes(`"${SUMMER_MCP_SERVER_NAME}"`)) {
|
|
58
|
+
target.warnings.push(`${moved} still lists ${SUMMER_MCP_SERVER_NAME} from an earlier setup. ${spec.label} now reads ${target.path}, so setup writes it there; the old entry stays for older builds.`);
|
|
59
|
+
}
|
|
51
60
|
const snippet = renderConfigSnippet(options.agent, server);
|
|
52
61
|
const dryRun = Boolean(options.dryRun);
|
|
53
62
|
const print = Boolean(options.print);
|
|
@@ -69,6 +78,7 @@ export async function configureAgentMcp(options) {
|
|
|
69
78
|
print,
|
|
70
79
|
localDev: Boolean(options.localDev),
|
|
71
80
|
channel,
|
|
81
|
+
profile,
|
|
72
82
|
warnings: target.warnings,
|
|
73
83
|
nextSteps: [`Updated ${target.path}.`, spec.restart],
|
|
74
84
|
};
|
|
@@ -264,17 +274,28 @@ async function upsertConfig(format, path, server, write) {
|
|
|
264
274
|
}
|
|
265
275
|
export const DEFAULT_CHANNEL = "latest";
|
|
266
276
|
/** npm dist-tags are lowercase words like `latest`, `next`, `beta`, `v3-preview`;
|
|
267
|
-
*
|
|
268
|
-
*
|
|
277
|
+
* an exact version (`3.9.1`, `3.9.1-rc.1`) pins the entry to that release, which
|
|
278
|
+
* setup does for a CLI that is ahead of npm latest. Anything else, partial
|
|
279
|
+
* versions and paths included, is refused. */
|
|
269
280
|
export function normalizeChannel(channel) {
|
|
270
281
|
const value = (channel ?? "").trim();
|
|
271
282
|
if (value === "")
|
|
272
283
|
return DEFAULT_CHANNEL;
|
|
284
|
+
if (/^\d+\.\d+\.\d+(?:-[0-9a-z][0-9a-z.-]*)?$/.test(value))
|
|
285
|
+
return value;
|
|
273
286
|
if (!/^[a-z][a-z0-9-]*$/.test(value) || /^v?\d/.test(value)) {
|
|
274
|
-
throw new Error(`Invalid channel "${channel}": use an npm dist-tag such as latest or next (lowercase letters, digits, hyphens).`);
|
|
287
|
+
throw new Error(`Invalid channel "${channel}": use an npm dist-tag such as latest or next (lowercase letters, digits, hyphens), or an exact version such as 4.0.0.`);
|
|
275
288
|
}
|
|
276
289
|
return value;
|
|
277
290
|
}
|
|
291
|
+
/**
|
|
292
|
+
* The profile rides in the entry's env, not its args: an older summer-engine
|
|
293
|
+
* that an agent still runs ignores the variable and serves every tool, where
|
|
294
|
+
* an unknown --profile flag would stop it from starting.
|
|
295
|
+
*/
|
|
296
|
+
export function withProfile(server, profile) {
|
|
297
|
+
return profile === "full" ? server : { ...server, env: { ...server.env, SUMMER_PROFILE: profile } };
|
|
298
|
+
}
|
|
278
299
|
export function createSummerMcpServerConfig(localDev, platform = process.platform, channel = DEFAULT_CHANNEL) {
|
|
279
300
|
const spec = `summer-engine@${normalizeChannel(channel)}`;
|
|
280
301
|
if (localDev) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Profile } from "../core/tool-profiles.js";
|
|
1
2
|
/** Ids `summer setup <agent>` accepts. Legacy ids stay so old commands and
|
|
2
3
|
* configs keep resolving, but they are hidden from help and warn on use. */
|
|
3
4
|
export declare const AGENT_IDS: readonly ["claude-code", "claude-desktop", "codex", "cursor", "windsurf", "antigravity", "gemini", "cline", "cline-cli", "roo-code", "kilo-code", "github-copilot", "vscode-copilot", "visual-studio", "copilot-jetbrains", "opencode", "zed", "kiro", "goose", "hermes", "trae", "qwen-code", "kimi-code", "crush", "amp", "factory", "junie", "warp", "rovo-dev", "qoder", "grok-build", "mistral-vibe", "lm-studio"];
|
|
@@ -70,6 +71,8 @@ export interface AgentSpec {
|
|
|
70
71
|
/** Env var that overrides the MCP config path (tests, unusual installs). */
|
|
71
72
|
envOverride: string;
|
|
72
73
|
format: McpFormat;
|
|
74
|
+
/** MCP tool profile setup writes without --profile (default full: every tool). */
|
|
75
|
+
mcpProfile?: Profile;
|
|
73
76
|
/**
|
|
74
77
|
* The Summer Games player MCP (a remote server that signs in with OAuth on
|
|
75
78
|
* its own) in this agent's file, under the same key as summer-engine.
|
|
@@ -90,6 +93,8 @@ export interface AgentSpec {
|
|
|
90
93
|
project: ((ctx: PathContext) => string) | null;
|
|
91
94
|
/** Extra warning printed when project scope is requested (also when it is honoured). */
|
|
92
95
|
projectNote?: string;
|
|
96
|
+
/** The user file the agent read before it moved: setup names an earlier summer-engine entry left there. */
|
|
97
|
+
movedFrom?: (ctx: PathContext) => string;
|
|
93
98
|
};
|
|
94
99
|
/** What to do after the config is written. */
|
|
95
100
|
restart: string;
|
|
@@ -109,6 +114,13 @@ export declare const supportedAgents: readonly SupportedAgent[];
|
|
|
109
114
|
export declare const skillCapableAgents: readonly SupportedAgent[];
|
|
110
115
|
/** Every spelling → canonical id. Aliases must be unique across the table. */
|
|
111
116
|
export declare function agentAliasMap(): Record<string, SupportedAgent>;
|
|
117
|
+
/**
|
|
118
|
+
* Why `summer setup <agent> --cli` cannot set this agent up, or null. --cli
|
|
119
|
+
* installs the skills and no MCP server, so the agent needs a skills folder,
|
|
120
|
+
* and one that takes SKILL.md files: rule files (Roo Code) and the Gemini
|
|
121
|
+
* extension assume the MCP tools.
|
|
122
|
+
*/
|
|
123
|
+
export declare function cliSetupRefusal(spec: AgentSpec): string | null;
|
|
112
124
|
export declare function agentLabel(id: SupportedAgent): string;
|
|
113
125
|
export declare function defaultPathContext(env?: NodeJS.ProcessEnv, cwd?: string): PathContext;
|
|
114
126
|
export interface ResolvedMcpPath {
|