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
|
@@ -54,7 +54,8 @@ function appData(ctx) {
|
|
|
54
54
|
return ctx.env.APPDATA ?? join(ctx.home, "AppData", "Roaming");
|
|
55
55
|
}
|
|
56
56
|
function xdgConfig(ctx) {
|
|
57
|
-
|
|
57
|
+
// An empty XDG_CONFIG_HOME counts as unset (XDG Base Directory spec).
|
|
58
|
+
return ctx.env.XDG_CONFIG_HOME || join(ctx.home, ".config");
|
|
58
59
|
}
|
|
59
60
|
/** ~/.config on Linux, %APPDATA% on Windows, ~/Library/Application Support on macOS. */
|
|
60
61
|
function appConfigRoot(ctx) {
|
|
@@ -130,7 +131,7 @@ const SPECS = [
|
|
|
130
131
|
},
|
|
131
132
|
restart: "Quit and reopen Claude Desktop; the summer-engine tools appear under the tools menu in a new chat.",
|
|
132
133
|
skills: null,
|
|
133
|
-
noSkillsNote: "Claude Desktop has no skills folder. The MCP server ships
|
|
134
|
+
noSkillsNote: "Claude Desktop has no skills folder. The MCP server ships summer_docs_search and summer_docs_read, so the model can pull Summer guidance in-chat.",
|
|
134
135
|
},
|
|
135
136
|
{
|
|
136
137
|
id: "codex",
|
|
@@ -144,7 +145,8 @@ const SPECS = [
|
|
|
144
145
|
signIn: (name) => `In Codex, run /mcp login ${name} (or \`codex mcp login ${name}\` in a terminal) and sign in.`,
|
|
145
146
|
},
|
|
146
147
|
mcp: {
|
|
147
|
-
|
|
148
|
+
// Codex reads its config from $CODEX_HOME (default ~/.codex).
|
|
149
|
+
user: (ctx) => join(ctx.env.CODEX_HOME || join(ctx.home, ".codex"), "config.toml"),
|
|
148
150
|
project: project(".codex", "config.toml"),
|
|
149
151
|
projectNote: "Codex only loads project .codex/config.toml from trusted projects.",
|
|
150
152
|
},
|
|
@@ -182,8 +184,10 @@ const SPECS = [
|
|
|
182
184
|
signIn: (name) => `Devin Desktop opens summer.games in your browser the first time ${name} connects; sign in there.`,
|
|
183
185
|
},
|
|
184
186
|
mcp: {
|
|
185
|
-
|
|
187
|
+
// docs.devin.ai/desktop/cascade/mcp (2026-10-16): ~/.config/devin (or $XDG_CONFIG_HOME/devin), %APPDATA%\devin on Windows.
|
|
188
|
+
user: (ctx) => join(xdgOrAppData(ctx), "devin", "mcp_config.json"),
|
|
186
189
|
project: null,
|
|
190
|
+
movedFrom: home(".codeium", "windsurf", "mcp_config.json"),
|
|
187
191
|
},
|
|
188
192
|
restart: "Restart Devin Desktop (formerly Windsurf) and refresh MCP servers from the agent settings. Devin's docs say mcp_config.json configures the Cascade agent; for the Devin agent add the server in the app's MCP settings with the same command.",
|
|
189
193
|
skills: sharedSkills({ legacyDirs: { user: home(".codeium", "windsurf", "skills"), project: project(".windsurf", "skills") } }),
|
|
@@ -316,6 +320,8 @@ const SPECS = [
|
|
|
316
320
|
status: "active",
|
|
317
321
|
envOverride: "SUMMER_VSCODE_COPILOT_CONFIG_FILE",
|
|
318
322
|
format: "json-vscode",
|
|
323
|
+
// VS Code Copilot sends at most 128 tools per request; the full surface is over that.
|
|
324
|
+
mcpProfile: "engine",
|
|
319
325
|
remoteMcp: {
|
|
320
326
|
entry: (url) => ({ type: "http", url }),
|
|
321
327
|
signIn: (name) => `In VS Code, click Allow when ${name} asks to authenticate, then sign in on summer.games.`,
|
|
@@ -335,7 +341,7 @@ const SPECS = [
|
|
|
335
341
|
mcp: { user: home(".mcp.json"), project: project(".mcp.json") },
|
|
336
342
|
restart: "Restart Visual Studio, open Copilot Chat in Agent mode, and enable summer-engine in the tools picker.",
|
|
337
343
|
skills: null,
|
|
338
|
-
noSkillsNote: "Visual Studio's Copilot has no skills folder yet; the MCP server ships
|
|
344
|
+
noSkillsNote: "Visual Studio's Copilot has no skills folder yet; the MCP server ships summer_docs_search and summer_docs_read for in-chat guidance.",
|
|
339
345
|
},
|
|
340
346
|
{
|
|
341
347
|
id: "copilot-jetbrains",
|
|
@@ -354,7 +360,7 @@ const SPECS = [
|
|
|
354
360
|
},
|
|
355
361
|
restart: "Restart the JetBrains IDE and open Copilot Chat in Agent mode; summer-engine shows in the tools list.",
|
|
356
362
|
skills: null,
|
|
357
|
-
noSkillsNote: "Copilot in JetBrains documents no skills folder; the MCP server ships
|
|
363
|
+
noSkillsNote: "Copilot in JetBrains documents no skills folder; the MCP server ships summer_docs_search and summer_docs_read for in-chat guidance.",
|
|
358
364
|
},
|
|
359
365
|
{
|
|
360
366
|
id: "opencode",
|
|
@@ -476,7 +482,7 @@ const SPECS = [
|
|
|
476
482
|
},
|
|
477
483
|
restart: "Restart Trae and open the MCP settings; summer-engine should show as connected.",
|
|
478
484
|
skills: null,
|
|
479
|
-
noSkillsNote: "Trae documents no skills folder; the MCP server ships
|
|
485
|
+
noSkillsNote: "Trae documents no skills folder; the MCP server ships summer_docs_search and summer_docs_read for in-chat guidance.",
|
|
480
486
|
},
|
|
481
487
|
{
|
|
482
488
|
id: "qwen-code",
|
|
@@ -570,7 +576,7 @@ const SPECS = [
|
|
|
570
576
|
mcp: { user: home(".junie", "mcp", "mcp.json"), project: project(".junie", "mcp", "mcp.json") },
|
|
571
577
|
restart: "Restart the JetBrains IDE so Junie reloads its MCP config.",
|
|
572
578
|
skills: null,
|
|
573
|
-
noSkillsNote: "Junie has no skills folder; put project guidance in .junie/guidelines.md. The MCP server ships
|
|
579
|
+
noSkillsNote: "Junie has no skills folder; put project guidance in .junie/guidelines.md. The MCP server ships summer_docs_search and summer_docs_read for in-chat guidance.",
|
|
574
580
|
},
|
|
575
581
|
{
|
|
576
582
|
id: "warp",
|
|
@@ -652,7 +658,7 @@ const SPECS = [
|
|
|
652
658
|
mcp: { user: home(".lmstudio", "mcp.json"), project: null },
|
|
653
659
|
restart: "Open LM Studio, toggle on the summer-engine MCP server in the Program tab, and raise the loaded model's context length to 32k or higher.",
|
|
654
660
|
skills: null,
|
|
655
|
-
noSkillsNote: "LM Studio has no rules or skills folder. The MCP server ships
|
|
661
|
+
noSkillsNote: "LM Studio has no rules or skills folder. The MCP server ships summer_docs_search and summer_docs_read, so the model can pull Summer guidance in-chat.",
|
|
656
662
|
},
|
|
657
663
|
];
|
|
658
664
|
const BY_ID = new Map(SPECS.map((spec) => [spec.id, spec]));
|
|
@@ -682,6 +688,24 @@ export function agentAliasMap() {
|
|
|
682
688
|
}
|
|
683
689
|
return map;
|
|
684
690
|
}
|
|
691
|
+
/**
|
|
692
|
+
* Why `summer setup <agent> --cli` cannot set this agent up, or null. --cli
|
|
693
|
+
* installs the skills and no MCP server, so the agent needs a skills folder,
|
|
694
|
+
* and one that takes SKILL.md files: rule files (Roo Code) and the Gemini
|
|
695
|
+
* extension assume the MCP tools.
|
|
696
|
+
*/
|
|
697
|
+
export function cliSetupRefusal(spec) {
|
|
698
|
+
if (!spec.skills) {
|
|
699
|
+
return `${spec.label} has no skills folder, so --cli has nothing to install. Run summer setup ${spec.id} without --cli for the MCP server.`;
|
|
700
|
+
}
|
|
701
|
+
if (spec.format === "json-gemini") {
|
|
702
|
+
return `Gemini CLI loads Summer's skills only through its extension, which runs the MCP server. Run summer setup ${spec.id} without --cli, or use antigravity.`;
|
|
703
|
+
}
|
|
704
|
+
if (spec.skills.kind !== "skill-dir" && spec.skills.kind !== "opencode-skill-dir") {
|
|
705
|
+
return `${spec.label} gets Summer's skills as rule files that tell it to use the MCP tools. Run summer setup ${spec.id} without --cli.`;
|
|
706
|
+
}
|
|
707
|
+
return null;
|
|
708
|
+
}
|
|
685
709
|
export function agentLabel(id) {
|
|
686
710
|
return agentSpec(id).label;
|
|
687
711
|
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { PathContext, SupportedAgent } from "./agent-table.js";
|
|
2
|
+
/**
|
|
3
|
+
* Allow rules for the CLI path, added only with `summer setup <agent> --cli
|
|
4
|
+
* --allow-rules --yes` (the flag is in the command the person approves), so
|
|
5
|
+
* the agent's read-only and dry-run summer commands do not each ask:
|
|
6
|
+
*
|
|
7
|
+
* - the reads in AUTO_ALLOWED_READS, as they are. The list is reviewed by
|
|
8
|
+
* hand: a new read operation in the catalog does not join it, and
|
|
9
|
+
* cli-permissions.test.ts fails until someone adds it on purpose;
|
|
10
|
+
* - every spend (generation and the rest) only as a dry run, `--dry-run`
|
|
11
|
+
* right after the action. A call with that flag is a dry run whatever else
|
|
12
|
+
* it says (parseCallFlags), so the rule cannot let a real spend through.
|
|
13
|
+
*
|
|
14
|
+
* Changes, publishing, prices, deletes and messages keep asking. Claude Code
|
|
15
|
+
* matches the command text (`Bash(summer jobs wait *)` matches the bare
|
|
16
|
+
* command and `summer jobs wait --job-id x`, not `summer jobs waitx`); Codex
|
|
17
|
+
* matches argument lists, in a rules file of Summer's own. Both get the
|
|
18
|
+
* `summer` and the `npx -y summer-engine@latest` forms.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Reads that run without asking. Each one reads Summer data or the open
|
|
22
|
+
* editor's state; `jobs wait` and `assets get` also save the files a finished
|
|
23
|
+
* job names (media files only, never over an existing file). Left out on
|
|
24
|
+
* purpose: `engine capture-gameplay` (it starts Summer Engine on a project, so
|
|
25
|
+
* the project's own code runs, and writes to any --out folder) and
|
|
26
|
+
* `studio open` (it opens a page in the browser).
|
|
27
|
+
*/
|
|
28
|
+
export declare const AUTO_ALLOWED_READS: readonly string[];
|
|
29
|
+
export type CliCommand = {
|
|
30
|
+
words: string[];
|
|
31
|
+
dryRun: boolean;
|
|
32
|
+
};
|
|
33
|
+
/** The commands allowed without asking: `summer status`, the reviewed reads, and a dry run of every spend in the catalog. */
|
|
34
|
+
export declare function allowedCliCommands(): CliCommand[];
|
|
35
|
+
export declare const LAUNCHERS: ReadonlyArray<readonly string[]>;
|
|
36
|
+
/** Claude Code `permissions.allow` rules, for both launchers. */
|
|
37
|
+
export declare function claudeAllowRules(): string[];
|
|
38
|
+
/** Codex rules: one prefix_rule per launcher, area and kind, the actions as a union. */
|
|
39
|
+
export declare function codexRules(): string;
|
|
40
|
+
export interface AllowRulesResult {
|
|
41
|
+
agent: SupportedAgent;
|
|
42
|
+
path: string;
|
|
43
|
+
/** Every rule Summer wants there (Codex: its patterns); empty for a removal. */
|
|
44
|
+
rules: string[];
|
|
45
|
+
/** What this run added, or removed with --remove-allow-rules. */
|
|
46
|
+
changed: string[];
|
|
47
|
+
wrote: boolean;
|
|
48
|
+
}
|
|
49
|
+
/** The agents with clean per-command allow rules: Claude Code (settings.json) and Codex (rules files). */
|
|
50
|
+
export declare function supportsAllowRules(agent: SupportedAgent): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Where the rules go. Claude Code: the user's settings, or with --scope
|
|
53
|
+
* project the project's personal settings.local.json (never the shared file).
|
|
54
|
+
* Codex: always the user's rules folder; a project's .codex/rules is shared
|
|
55
|
+
* through git, so Summer does not write there.
|
|
56
|
+
*/
|
|
57
|
+
export declare function allowRulesPath(agent: SupportedAgent, scope: "user" | "project", ctx: PathContext): string;
|
|
58
|
+
/**
|
|
59
|
+
* Add the allow rules. Claude Code: merged into `permissions.allow`, nothing
|
|
60
|
+
* removed, every other setting kept. Codex: Summer's own rules file,
|
|
61
|
+
* rewritten. Writes nothing unless `write`.
|
|
62
|
+
*/
|
|
63
|
+
export declare function addAllowRules(agent: SupportedAgent, path: string, write: boolean): Promise<AllowRulesResult>;
|
|
64
|
+
/** Remove exactly the rules Summer adds (Claude Code), or Summer's own rules file (Codex). Writes nothing unless `write`. */
|
|
65
|
+
export declare function removeAllowRules(agent: SupportedAgent, path: string, write: boolean): Promise<AllowRulesResult>;
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { chmod, mkdir, readFile, realpath, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { CLI_AREAS } from "../core/ops/areas.js";
|
|
5
|
+
import { localEntries } from "../core/ops/catalog.js";
|
|
6
|
+
import { shippedCloudEntries } from "../core/ops/public-catalog.js";
|
|
7
|
+
/**
|
|
8
|
+
* Allow rules for the CLI path, added only with `summer setup <agent> --cli
|
|
9
|
+
* --allow-rules --yes` (the flag is in the command the person approves), so
|
|
10
|
+
* the agent's read-only and dry-run summer commands do not each ask:
|
|
11
|
+
*
|
|
12
|
+
* - the reads in AUTO_ALLOWED_READS, as they are. The list is reviewed by
|
|
13
|
+
* hand: a new read operation in the catalog does not join it, and
|
|
14
|
+
* cli-permissions.test.ts fails until someone adds it on purpose;
|
|
15
|
+
* - every spend (generation and the rest) only as a dry run, `--dry-run`
|
|
16
|
+
* right after the action. A call with that flag is a dry run whatever else
|
|
17
|
+
* it says (parseCallFlags), so the rule cannot let a real spend through.
|
|
18
|
+
*
|
|
19
|
+
* Changes, publishing, prices, deletes and messages keep asking. Claude Code
|
|
20
|
+
* matches the command text (`Bash(summer jobs wait *)` matches the bare
|
|
21
|
+
* command and `summer jobs wait --job-id x`, not `summer jobs waitx`); Codex
|
|
22
|
+
* matches argument lists, in a rules file of Summer's own. Both get the
|
|
23
|
+
* `summer` and the `npx -y summer-engine@latest` forms.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Reads that run without asking. Each one reads Summer data or the open
|
|
27
|
+
* editor's state; `jobs wait` and `assets get` also save the files a finished
|
|
28
|
+
* job names (media files only, never over an existing file). Left out on
|
|
29
|
+
* purpose: `engine capture-gameplay` (it starts Summer Engine on a project, so
|
|
30
|
+
* the project's own code runs, and writes to any --out folder) and
|
|
31
|
+
* `studio open` (it opens a page in the browser).
|
|
32
|
+
*/
|
|
33
|
+
export const AUTO_ALLOWED_READS = [
|
|
34
|
+
"whoami", "ops.search", "ops.describe",
|
|
35
|
+
"docs.search", "docs.read", "docs.engine_api", "docs.plan",
|
|
36
|
+
"jobs.get", "jobs.list", "jobs.wait",
|
|
37
|
+
"account.permissions", "profile.get", "team.list", "chats.list", "plugins.search",
|
|
38
|
+
"games.get", "games.list", "games.members", "jams.list", "pricing.get",
|
|
39
|
+
"store.get_listing", "store.status", "experiments.list", "experiments.results",
|
|
40
|
+
"analytics.event_limit", "analytics.events", "analytics.funnel", "analytics.overview", "analytics.summary", "analytics.trend",
|
|
41
|
+
"assets.choices", "assets.get", "assets.get_icon_collection", "assets.get_pack", "assets.list_comments", "assets.list_folders", "assets.list_icon_collections", "assets.search",
|
|
42
|
+
"apps.events", "apps.get", "apps.guide", "apps.list", "apps.page", "apps.read_data", "apps.screenshot", "apps.tools",
|
|
43
|
+
"plans.changes", "plans.chat", "plans.directions", "plans.get", "plans.links", "plans.list", "plans.presence", "plans.show",
|
|
44
|
+
"projects.builds", "projects.get", "projects.list", "projects.open_in_engine", "projects.preview_build",
|
|
45
|
+
"stories.get", "stories.list", "studio.map", "studio.page", "studio.read_form",
|
|
46
|
+
"marketing.applications", "marketing.content_feed", "marketing.content_videos", "marketing.get_brand_pack", "marketing.list_content_games",
|
|
47
|
+
"engine.debug_views", "engine.game_probe", "engine.get_console", "engine.get_debugger_errors", "engine.get_debugger_warnings", "engine.get_diagnostics",
|
|
48
|
+
"engine.get_project_context", "engine.get_runtime_tree", "engine.get_scene_tree", "engine.get_script_errors", "engine.grep", "engine.inspect_asset",
|
|
49
|
+
"engine.inspect_node", "engine.inspect_resource", "engine.inspect_runtime_node", "engine.is_running", "engine.list_camera_bookmarks", "engine.list_ui_actions",
|
|
50
|
+
"engine.measure", "engine.navigation_probe", "engine.raycast", "engine.read_file", "engine.recent_events", "engine.scene_audit", "engine.screenshot",
|
|
51
|
+
"engine.shot_sheet", "engine.snapshot_diff", "engine.starcast", "engine.test_placement", "engine.ui_screenshot", "engine.ui_tree", "engine.wait_for_event",
|
|
52
|
+
"engine.world_snapshot", "engine.zoom",
|
|
53
|
+
];
|
|
54
|
+
/** The shell words of a command, after the launcher: `assets.generate_image` -> `assets generate-image`. */
|
|
55
|
+
const wordsOf = (op) => (op.includes(".") ? [op.split(".")[0], op.split(".")[1].replace(/_/g, "-")] : [op]);
|
|
56
|
+
/** The commands allowed without asking: `summer status`, the reviewed reads, and a dry run of every spend in the catalog. */
|
|
57
|
+
export function allowedCliCommands() {
|
|
58
|
+
const known = new Map([...localEntries(), ...shippedCloudEntries()].map((entry) => [entry.name, entry]));
|
|
59
|
+
const reads = AUTO_ALLOWED_READS.filter((op) => known.get(op)?.effect === "read").map((op) => ({ words: wordsOf(op), dryRun: false }));
|
|
60
|
+
const areas = new Set(CLI_AREAS);
|
|
61
|
+
const spends = [...known.values()]
|
|
62
|
+
.filter((entry) => entry.effect === "spend" && entry.status !== "deprecated" && areas.has(entry.name.split(".")[0]))
|
|
63
|
+
.map((entry) => ({ words: wordsOf(entry.name), dryRun: true }));
|
|
64
|
+
return [{ words: ["status"], dryRun: false }, ...reads, ...spends].sort((a, b) => a.words.join(" ").localeCompare(b.words.join(" ")) || Number(a.dryRun) - Number(b.dryRun));
|
|
65
|
+
}
|
|
66
|
+
export const LAUNCHERS = [["summer"], ["npx", "-y", "summer-engine@latest"]];
|
|
67
|
+
/** Claude Code `permissions.allow` rules, for both launchers. */
|
|
68
|
+
export function claudeAllowRules() {
|
|
69
|
+
return LAUNCHERS.flatMap((launcher) => allowedCliCommands().map(({ words, dryRun }) => `Bash(${[...launcher, ...words, ...(dryRun ? ["--dry-run"] : [])].join(" ")} *)`));
|
|
70
|
+
}
|
|
71
|
+
const starlark = (value) => (typeof value === "string" ? JSON.stringify(value) : `[${value.map((item) => JSON.stringify(item)).join(", ")}]`);
|
|
72
|
+
const CODEX_HEADER = "# Written by summer setup codex --cli --allow-rules; setup rewrites this file and --remove-allow-rules deletes it.";
|
|
73
|
+
/** Codex rules: one prefix_rule per launcher, area and kind, the actions as a union. */
|
|
74
|
+
export function codexRules() {
|
|
75
|
+
const groups = new Map();
|
|
76
|
+
for (const launcher of LAUNCHERS) {
|
|
77
|
+
for (const { words, dryRun } of allowedCliCommands()) {
|
|
78
|
+
const head = words.length > 1 ? words.slice(0, 1) : [];
|
|
79
|
+
const key = `${launcher.join(" ")}|${head.join(" ")}|${dryRun}`;
|
|
80
|
+
const group = groups.get(key) ?? { launcher, head, actions: [], dryRun };
|
|
81
|
+
group.actions.push(words[words.length - 1]);
|
|
82
|
+
groups.set(key, group);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const rules = [...groups.values()].map(({ launcher, head, actions, dryRun }) => {
|
|
86
|
+
const pattern = [...launcher.map(starlark), ...head.map(starlark), starlark(actions.length === 1 ? actions[0] : actions), ...(dryRun ? [starlark("--dry-run")] : [])];
|
|
87
|
+
const example = [...launcher, ...head, actions[0], ...(dryRun ? ["--dry-run"] : [])].join(" ");
|
|
88
|
+
const why = dryRun ? "Summer dry run: checks the input, spends nothing" : "Summer read: changes no Summer data; jobs wait and assets get save the files they name";
|
|
89
|
+
return `prefix_rule(\n pattern = [${pattern.join(", ")}],\n decision = "allow",\n justification = ${starlark(why)},\n match = [${starlark(example)}],\n)`;
|
|
90
|
+
});
|
|
91
|
+
return `${CODEX_HEADER}\n# Reads, and spends only as dry runs. Changes, publishing, deletes and messages still ask.\n\n${rules.join("\n\n")}\n`;
|
|
92
|
+
}
|
|
93
|
+
/** The agents with clean per-command allow rules: Claude Code (settings.json) and Codex (rules files). */
|
|
94
|
+
export function supportsAllowRules(agent) {
|
|
95
|
+
return agent === "claude-code" || agent === "codex";
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Where the rules go. Claude Code: the user's settings, or with --scope
|
|
99
|
+
* project the project's personal settings.local.json (never the shared file).
|
|
100
|
+
* Codex: always the user's rules folder; a project's .codex/rules is shared
|
|
101
|
+
* through git, so Summer does not write there.
|
|
102
|
+
*/
|
|
103
|
+
export function allowRulesPath(agent, scope, ctx) {
|
|
104
|
+
if (agent === "codex")
|
|
105
|
+
return ctx.env.SUMMER_CODEX_RULES_FILE || join(ctx.env.CODEX_HOME || join(ctx.home, ".codex"), "rules", "summer.rules");
|
|
106
|
+
return ctx.env.SUMMER_CLAUDE_SETTINGS_FILE || (scope === "project" ? join(ctx.cwd, ".claude", "settings.local.json") : join(ctx.home, ".claude", "settings.json"));
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Write next to the file, then rename over it, so Claude Code never reads
|
|
110
|
+
* half a file. A symlinked settings file (a dotfiles repo) is written through
|
|
111
|
+
* the link, in its real folder, and keeps its mode.
|
|
112
|
+
*/
|
|
113
|
+
async function writeAtomically(path, text) {
|
|
114
|
+
const target = existsSync(path) ? await realpath(path) : path;
|
|
115
|
+
await mkdir(dirname(target), { recursive: true });
|
|
116
|
+
const mode = existsSync(target) ? (await stat(target)).mode & 0o7777 : undefined;
|
|
117
|
+
const temp = `${target}.summer-${process.pid}.tmp`;
|
|
118
|
+
await writeFile(temp, text, mode === undefined ? {} : { mode });
|
|
119
|
+
if (mode !== undefined)
|
|
120
|
+
await chmod(temp, mode);
|
|
121
|
+
await rename(temp, target);
|
|
122
|
+
}
|
|
123
|
+
async function readClaudeSettings(path) {
|
|
124
|
+
let settings = {};
|
|
125
|
+
if (existsSync(path)) {
|
|
126
|
+
try {
|
|
127
|
+
settings = JSON.parse(await readFile(path, "utf8"));
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
throw new Error(`${path} is not valid JSON, so Summer left its allow rules alone. Fix the file, then run setup again.`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (!settings || typeof settings !== "object" || Array.isArray(settings))
|
|
134
|
+
throw new Error(`${path} is not a JSON object, so Summer left its allow rules alone.`);
|
|
135
|
+
const record = settings;
|
|
136
|
+
const permissions = record.permissions ?? {};
|
|
137
|
+
if (!permissions || typeof permissions !== "object" || Array.isArray(permissions))
|
|
138
|
+
throw new Error(`${path}: permissions is not an object, so Summer left its allow rules alone.`);
|
|
139
|
+
const allow = permissions.allow ?? [];
|
|
140
|
+
if (!Array.isArray(allow))
|
|
141
|
+
throw new Error(`${path}: permissions.allow is not a list, so Summer left its allow rules alone.`);
|
|
142
|
+
return { settings: record, permissions: permissions, allow };
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Add the allow rules. Claude Code: merged into `permissions.allow`, nothing
|
|
146
|
+
* removed, every other setting kept. Codex: Summer's own rules file,
|
|
147
|
+
* rewritten. Writes nothing unless `write`.
|
|
148
|
+
*/
|
|
149
|
+
export async function addAllowRules(agent, path, write) {
|
|
150
|
+
if (agent === "codex") {
|
|
151
|
+
const text = codexRules();
|
|
152
|
+
const rules = text.split("\n").filter((line) => line.startsWith(" pattern = ")).map((line) => line.trim());
|
|
153
|
+
const changed = (existsSync(path) ? await readFile(path, "utf8") : "") !== text;
|
|
154
|
+
if (write && changed)
|
|
155
|
+
await writeAtomically(path, text);
|
|
156
|
+
return { agent, path, rules, changed: changed ? rules : [], wrote: write && changed };
|
|
157
|
+
}
|
|
158
|
+
const rules = claudeAllowRules();
|
|
159
|
+
const { settings, permissions, allow } = await readClaudeSettings(path);
|
|
160
|
+
const added = rules.filter((rule) => !allow.includes(rule));
|
|
161
|
+
if (write && added.length > 0)
|
|
162
|
+
await writeAtomically(path, `${JSON.stringify({ ...settings, permissions: { ...permissions, allow: [...allow, ...added] } }, null, 2)}\n`);
|
|
163
|
+
return { agent, path, rules, changed: added, wrote: write && added.length > 0 };
|
|
164
|
+
}
|
|
165
|
+
/** Remove exactly the rules Summer adds (Claude Code), or Summer's own rules file (Codex). Writes nothing unless `write`. */
|
|
166
|
+
export async function removeAllowRules(agent, path, write) {
|
|
167
|
+
if (agent === "codex") {
|
|
168
|
+
const ours = existsSync(path) && (await readFile(path, "utf8")).startsWith("# Written by summer setup codex");
|
|
169
|
+
if (write && ours)
|
|
170
|
+
await rm(path);
|
|
171
|
+
return { agent, path, rules: [], changed: ours ? [path] : [], wrote: write && ours };
|
|
172
|
+
}
|
|
173
|
+
if (!existsSync(path))
|
|
174
|
+
return { agent, path, rules: [], changed: [], wrote: false };
|
|
175
|
+
const ours = new Set(claudeAllowRules());
|
|
176
|
+
const { settings, permissions, allow } = await readClaudeSettings(path);
|
|
177
|
+
const removed = allow.filter((rule) => typeof rule === "string" && ours.has(rule));
|
|
178
|
+
if (write && removed.length > 0) {
|
|
179
|
+
await writeAtomically(path, `${JSON.stringify({ ...settings, permissions: { ...permissions, allow: allow.filter((rule) => !removed.includes(rule)) } }, null, 2)}\n`);
|
|
180
|
+
}
|
|
181
|
+
return { agent, path, rules: [], changed: removed, wrote: write && removed.length > 0 };
|
|
182
|
+
}
|
|
@@ -36,6 +36,10 @@ export interface SkillSetupOptions {
|
|
|
36
36
|
/** Skip `status: preview` skills. By default they install like any other
|
|
37
37
|
* skill — preview is a label carried in the skill's guidance, not a gate. */
|
|
38
38
|
stableOnly?: boolean;
|
|
39
|
+
/** Install only the asset skills (`setup --assets-only`). */
|
|
40
|
+
assetsOnly?: boolean;
|
|
41
|
+
/** false: no Claude Code slash commands (`setup --cli`; they start work through the MCP tools). */
|
|
42
|
+
commands?: boolean;
|
|
39
43
|
}
|
|
40
44
|
/**
|
|
41
45
|
* The preview clause of the setup summary — one wording for the result message
|
package/dist/installer/setup.js
CHANGED
|
@@ -37,11 +37,14 @@ export function setupSkills(agent, options) {
|
|
|
37
37
|
const scope = options.scope ?? "user";
|
|
38
38
|
const recommended = Boolean(options.recommended);
|
|
39
39
|
const stableOnly = Boolean(options.stableOnly);
|
|
40
|
+
const assetsOnly = Boolean(options.assetsOnly);
|
|
40
41
|
const invocation = skillInstallInvocation(agent, {
|
|
41
42
|
force: options.force,
|
|
42
43
|
scope,
|
|
43
44
|
recommended,
|
|
44
45
|
stableOnly,
|
|
46
|
+
assetsOnly,
|
|
47
|
+
commands: options.commands !== false,
|
|
45
48
|
});
|
|
46
49
|
if (!invocation) {
|
|
47
50
|
return {
|
|
@@ -49,14 +52,15 @@ export function setupSkills(agent, options) {
|
|
|
49
52
|
message: "No automatic skill installer is available for this agent yet. Run `summer skills install --all` and point the agent at the installed SKILL.md files.",
|
|
50
53
|
};
|
|
51
54
|
}
|
|
52
|
-
const { selected, previewIncluded, previewSkipped } = selectSkillsForBulkInstall(getSkillRegistry(), { recommended, stableOnly });
|
|
55
|
+
const { selected, previewIncluded, previewSkipped } = selectSkillsForBulkInstall(getSkillRegistry(), { recommended, stableOnly, assetsOnly });
|
|
53
56
|
const count = selected.length;
|
|
54
57
|
const note = previewNote({ previewIncluded, previewSkipped });
|
|
55
58
|
const destination = isAgentClient(agent)
|
|
56
59
|
? describeInstallLocation(resolveInstallLocation(agent, scope))
|
|
57
60
|
: undefined;
|
|
58
|
-
const subset = recommended ? "recommended " : "";
|
|
61
|
+
const subset = assetsOnly ? "asset " : recommended ? "recommended " : "";
|
|
59
62
|
if (options.dryRun || !options.yes) {
|
|
63
|
+
const where = destination ?? "the agent's skills directory";
|
|
60
64
|
return {
|
|
61
65
|
status: "planned",
|
|
62
66
|
command: invocation.display,
|
|
@@ -64,7 +68,9 @@ export function setupSkills(agent, options) {
|
|
|
64
68
|
previewIncluded,
|
|
65
69
|
previewSkipped,
|
|
66
70
|
destination,
|
|
67
|
-
message:
|
|
71
|
+
message: options.dryRun
|
|
72
|
+
? `Would install ${count} ${subset}skills${note ? ` (${note})` : ""} to ${where} with: ${invocation.display.join(" ")}`
|
|
73
|
+
: `Not installed. Run the same setup command again with --yes to install ${count} ${subset}skills${note ? ` (${note})` : ""} to ${where}.`,
|
|
68
74
|
};
|
|
69
75
|
}
|
|
70
76
|
const result = spawnSync(invocation.command, invocation.args, {
|
|
@@ -130,7 +136,7 @@ function skillInstallInvocation(agent, opts) {
|
|
|
130
136
|
const baseArgs = [
|
|
131
137
|
"skills",
|
|
132
138
|
"install",
|
|
133
|
-
opts.recommended ? "--recommended" : "--all",
|
|
139
|
+
opts.assetsOnly ? "--assets" : opts.recommended ? "--recommended" : "--all",
|
|
134
140
|
"--agent",
|
|
135
141
|
agent,
|
|
136
142
|
"--scope",
|
|
@@ -140,6 +146,8 @@ function skillInstallInvocation(agent, opts) {
|
|
|
140
146
|
baseArgs.push("--force");
|
|
141
147
|
if (opts.stableOnly)
|
|
142
148
|
baseArgs.push("--stable-only");
|
|
149
|
+
if (!opts.commands)
|
|
150
|
+
baseArgs.push("--no-commands");
|
|
143
151
|
return {
|
|
144
152
|
command,
|
|
145
153
|
args: [...prefix, ...baseArgs],
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type SkillRegistryEntry } from "../core/skills-registry.js";
|
|
2
|
+
export interface RefreshedFolder {
|
|
3
|
+
dir: string;
|
|
4
|
+
from: string;
|
|
5
|
+
to: string;
|
|
6
|
+
/** Skills replaced with this version's copy. */
|
|
7
|
+
updated: string[];
|
|
8
|
+
/** New library skills added to a full install. */
|
|
9
|
+
added: string[];
|
|
10
|
+
/** Summer's skills someone changed after install: left as they are. */
|
|
11
|
+
kept: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface RefreshFailure {
|
|
14
|
+
dir: string;
|
|
15
|
+
skill?: string;
|
|
16
|
+
code: string;
|
|
17
|
+
}
|
|
18
|
+
export interface RefreshResult {
|
|
19
|
+
refreshed: RefreshedFolder[];
|
|
20
|
+
failures: RefreshFailure[];
|
|
21
|
+
}
|
|
22
|
+
/** User-scope skill folders with one folder per skill, each listed once. */
|
|
23
|
+
export declare function skillFolderLocations(): string[];
|
|
24
|
+
export declare function refreshInstalledSkills(cliVersion: string, options?: {
|
|
25
|
+
dirs?: string[];
|
|
26
|
+
registry?: readonly SkillRegistryEntry[];
|
|
27
|
+
}): RefreshResult;
|
|
28
|
+
/** The one message a person and their agent see after a refresh, or null when nothing changed. */
|
|
29
|
+
export declare function refreshNotice(refreshed: readonly RefreshedFolder[], failures?: readonly RefreshFailure[]): string | null;
|