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
|
@@ -1,22 +1,47 @@
|
|
|
1
|
+
import { spawnSync } from "child_process";
|
|
2
|
+
import { existsSync, readFileSync } from "fs";
|
|
3
|
+
import { relative } from "path";
|
|
1
4
|
import { Command, Option } from "commander";
|
|
2
5
|
import { configureAgentMcp, configureSummerGamesMcp, resolveAgentSelection, resolveConfigScope, supportedAgents, } from "../../installer/agent-config.js";
|
|
3
6
|
import { previewNote, setupSkills } from "../../installer/setup.js";
|
|
4
7
|
import { printDoctorResult, runDoctor } from "../../core/capabilities/doctor.js";
|
|
5
8
|
import { brandLine, c, sym, tildeify } from "../../core/format.js";
|
|
6
9
|
import { TOOLKIT_VERSION as cliVersion } from "../../core/version.js";
|
|
7
|
-
import { resolveDefaultChannel } from "../../installer/version-check.js";
|
|
8
|
-
import { agentLabel } from "../../installer/agent-table.js";
|
|
10
|
+
import { listsSummerEngine, resolveDefaultChannel } from "../../installer/version-check.js";
|
|
11
|
+
import { agentLabel, agentSpec, cliSetupRefusal, defaultPathContext } from "../../installer/agent-table.js";
|
|
12
|
+
import { addAllowRules, allowRulesPath, removeAllowRules, supportsAllowRules } from "../../installer/cli-permissions.js";
|
|
13
|
+
import { PROFILES, parseProfile } from "../../core/tool-profiles.js";
|
|
14
|
+
import { findSetupProjectRoot, writeAgentInstructions } from "../../project-memory/agent-instructions.js";
|
|
15
|
+
const PROFILE_NOTES = {
|
|
16
|
+
full: "Every Summer tool.",
|
|
17
|
+
engine: "Engine, generation and store tools. Every tool: summer setup <agent> --profile full",
|
|
18
|
+
assets: "Generation and asset tools, no engine tools. Every tool: summer setup <agent> --profile full",
|
|
19
|
+
};
|
|
20
|
+
/** The options that only shape the MCP entry, which --cli does not write. */
|
|
21
|
+
const MCP_ENTRY_FLAGS = [
|
|
22
|
+
["print", "--print"],
|
|
23
|
+
["localDev", "--local-dev"],
|
|
24
|
+
["channel", "--channel"],
|
|
25
|
+
["profile", "--profile"],
|
|
26
|
+
];
|
|
9
27
|
export const setupCommand = new Command("setup")
|
|
10
|
-
.description("Configure Summer Engine for an AI agent and run diagnostics. For agents that can sign in to it, it also adds Summer Games (summer-games).")
|
|
28
|
+
.description("Configure Summer Engine for an AI agent and run diagnostics. For agents that can sign in to it, it also adds Summer Games (summer-games). --cli installs the skills only: the agent runs summer commands in its shell, with no MCP server.")
|
|
11
29
|
.argument("[agent]", `Agent to configure: ${supportedAgents.join(", ")}`)
|
|
12
30
|
.option("--agent <agent>", `Agent to configure: ${supportedAgents.join(", ")}`)
|
|
13
31
|
.option("--scope <scope>", "Configuration scope: user or project", "user")
|
|
14
32
|
.option("--dry-run", "Show planned changes without writing files")
|
|
15
33
|
.option("--print", "Print the MCP config snippet instead of writing files")
|
|
16
34
|
.option("--local-dev", "Point the agent at this checkout's built CLI (node <repo>/dist/bin/summer.js mcp) instead of npx summer-engine@latest — for testing unpublished builds. SUMMER_DEV=1 does the same.")
|
|
17
|
-
.option("--channel <dist-tag>", "npm dist-tag the agent's MCP entry runs: npx -y summer-engine@<dist-tag> mcp (default latest;
|
|
35
|
+
.option("--channel <dist-tag>", "npm dist-tag or exact version the agent's MCP entry runs: npx -y summer-engine@<dist-tag> mcp (default latest; a CLI newer than npm latest pins next when next is this version, else this version). SUMMER_CHANNEL does the same.")
|
|
18
36
|
.option("--yes", "Apply practical setup steps without prompting")
|
|
19
37
|
.option("--no-games", "Do not add the Summer Games MCP (summer-games: friends, parties and messages as you, signed in through summer.games)")
|
|
38
|
+
.option("--profile <profile>", "MCP tool profile: full (every tool, the default), engine (engine, generation and the store; under 128 tools; the default for VS Code Copilot), assets (generation and the asset library, no engine tools)")
|
|
39
|
+
.option("--assets-only", "Set up for making assets without Summer Engine: the assets profile, only the asset skills, and no Summer Games")
|
|
40
|
+
.option("--cli", "CLI only: install the skills and no MCP server (and no Summer Games). The agent runs Summer as summer <area> <action> commands in its shell; the summer-cli skill teaches it")
|
|
41
|
+
.option("--no-mcp", "Same as --cli")
|
|
42
|
+
.option("--allow-rules", "With --cli, for Claude Code and Codex: let the agent run read-only summer commands, and dry runs of spends, without asking. Prints every rule; written only with --yes")
|
|
43
|
+
.option("--remove-allow-rules", "Remove the allow rules --allow-rules added (Claude Code, Codex), and nothing else")
|
|
44
|
+
.option("--no-project-files", "Inside a Summer project, do not add the Summer instructions to its AGENTS.md and CLAUDE.md (added with --yes by default)")
|
|
20
45
|
.option("--json", "Print setup result as JSON")
|
|
21
46
|
.option("--force", "Overwrite existing skill content (passes --force through to skills install)")
|
|
22
47
|
.option("--recommended", "Install only the recommended skill subset instead of the whole library")
|
|
@@ -26,6 +51,18 @@ export const setupCommand = new Command("setup")
|
|
|
26
51
|
.action(async (agentArg, opts) => {
|
|
27
52
|
const agent = resolveAgentSelection(agentArg, opts.agent);
|
|
28
53
|
const scope = resolveConfigScope(opts.scope);
|
|
54
|
+
if (opts.removeAllowRules) {
|
|
55
|
+
await removeCliAllowRules(agent, scope, opts);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (opts.cli || opts.mcp === false) {
|
|
59
|
+
await setupCliOnly(agent, scope, opts);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
// On stderr, so --json output stays one JSON document.
|
|
63
|
+
if (opts.allowRules)
|
|
64
|
+
console.error(` ${sym.warn()} ${c.yellow("--allow-rules works with --cli only (the MCP server asks through the agent's own tool approvals); no rules were added.")}`);
|
|
65
|
+
const profile = resolveSetupProfile(opts);
|
|
29
66
|
const defaultChannel = await resolveDefaultChannel(cliVersion);
|
|
30
67
|
const config = await configureAgentMcp({
|
|
31
68
|
agent,
|
|
@@ -34,8 +71,9 @@ export const setupCommand = new Command("setup")
|
|
|
34
71
|
print: opts.print,
|
|
35
72
|
localDev: Boolean(opts.localDev) || process.env.SUMMER_DEV === "1",
|
|
36
73
|
channel: opts.channel ?? process.env.SUMMER_CHANNEL ?? defaultChannel.channel,
|
|
74
|
+
profile,
|
|
37
75
|
});
|
|
38
|
-
const games = opts.games === false || opts.print
|
|
76
|
+
const games = opts.games === false || opts.assetsOnly || opts.print
|
|
39
77
|
? null
|
|
40
78
|
: await configureSummerGamesMcp({ agent, scope, dryRun: opts.dryRun });
|
|
41
79
|
if (!opts.channel && !process.env.SUMMER_CHANNEL && defaultChannel.note && !opts.print) {
|
|
@@ -48,7 +86,9 @@ export const setupCommand = new Command("setup")
|
|
|
48
86
|
scope,
|
|
49
87
|
recommended: Boolean(opts.recommended),
|
|
50
88
|
stableOnly: Boolean(opts.stableOnly),
|
|
89
|
+
assetsOnly: Boolean(opts.assetsOnly),
|
|
51
90
|
});
|
|
91
|
+
const projectFiles = setupProjectInstructions(opts);
|
|
52
92
|
const doctor = await runDoctor({ quiet: true });
|
|
53
93
|
if (opts.json) {
|
|
54
94
|
console.log(JSON.stringify({
|
|
@@ -56,17 +96,198 @@ export const setupCommand = new Command("setup")
|
|
|
56
96
|
config,
|
|
57
97
|
games,
|
|
58
98
|
skills,
|
|
99
|
+
projectFiles,
|
|
59
100
|
doctor,
|
|
60
101
|
}, null, 2));
|
|
61
102
|
}
|
|
62
103
|
else {
|
|
63
|
-
printSetupResult(config, games, skills, doctor);
|
|
104
|
+
printSetupResult(config, games, skills, doctor, projectFiles);
|
|
64
105
|
}
|
|
65
106
|
if (!doctor.ok || skills.status === "failed") {
|
|
66
107
|
process.exit(1);
|
|
67
108
|
}
|
|
68
109
|
});
|
|
69
|
-
|
|
110
|
+
/**
|
|
111
|
+
* `summer setup <agent> --cli`: the skills (the asset skills with --assets-only)
|
|
112
|
+
* and no MCP server, so the agent runs Summer as `summer <area> <action>` in its
|
|
113
|
+
* shell. Writes no agent config file; an existing summer-engine entry from an
|
|
114
|
+
* earlier setup is left as it is and named in a warning.
|
|
115
|
+
*/
|
|
116
|
+
async function setupCliOnly(agent, scope, opts) {
|
|
117
|
+
const spec = agentSpec(agent);
|
|
118
|
+
const mcpFlags = MCP_ENTRY_FLAGS.filter(([key]) => opts[key] !== undefined && opts[key] !== false).map(([, flag]) => flag);
|
|
119
|
+
if (mcpFlags.length > 0) {
|
|
120
|
+
throw new Error(`${mcpFlags.join(", ")} sets up the MCP entry, and --cli writes none. Leave ${mcpFlags.length === 1 ? "it" : "them"} out, or leave out --cli.`);
|
|
121
|
+
}
|
|
122
|
+
const refusal = cliSetupRefusal(spec);
|
|
123
|
+
if (refusal)
|
|
124
|
+
throw new Error(refusal);
|
|
125
|
+
const warnings = spec.status === "legacy" && spec.legacyNote ? [spec.legacyNote] : [];
|
|
126
|
+
const existing = await recordedMcpEntry(agent, scope);
|
|
127
|
+
if (existing) {
|
|
128
|
+
warnings.push(`${tildeify(existing)} still lists the summer-engine MCP server from an earlier setup. Remove that entry to use the CLI only.`);
|
|
129
|
+
}
|
|
130
|
+
const dryRun = Boolean(opts.dryRun);
|
|
131
|
+
const skills = setupSkills(agent, {
|
|
132
|
+
dryRun,
|
|
133
|
+
yes: Boolean(opts.yes),
|
|
134
|
+
force: Boolean(opts.force),
|
|
135
|
+
scope,
|
|
136
|
+
recommended: Boolean(opts.recommended),
|
|
137
|
+
stableOnly: Boolean(opts.stableOnly),
|
|
138
|
+
assetsOnly: Boolean(opts.assetsOnly),
|
|
139
|
+
commands: false,
|
|
140
|
+
});
|
|
141
|
+
// Read-only and dry-run summer commands run without asking, where the agent has clean allow rules.
|
|
142
|
+
// Opt-in: the flag is in the command the person approves.
|
|
143
|
+
let allowRules = null;
|
|
144
|
+
if (opts.allowRules && !supportsAllowRules(agent)) {
|
|
145
|
+
warnings.push(`--allow-rules is for Claude Code and Codex; ${agentLabel(agent)} manages command approvals in its own settings.`);
|
|
146
|
+
}
|
|
147
|
+
else if (opts.allowRules) {
|
|
148
|
+
try {
|
|
149
|
+
allowRules = await addAllowRules(agent, allowRulesPath(agent, scope, defaultPathContext()), Boolean(opts.yes) && !dryRun);
|
|
150
|
+
const shared = agent === "claude-code" && scope === "project" ? notGitIgnored(allowRules.path) : false;
|
|
151
|
+
if (shared)
|
|
152
|
+
warnings.push(`${tildeify(allowRules.path)} is not in .gitignore, so git would share these personal allow rules. Add .claude/settings.local.json to .gitignore.`);
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
warnings.push(error instanceof Error ? error.message : String(error));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const projectFiles = setupProjectInstructions(opts);
|
|
159
|
+
const doctor = await runDoctor({ quiet: true });
|
|
160
|
+
const ok = doctor.ok && skills.status !== "failed";
|
|
161
|
+
if (opts.json) {
|
|
162
|
+
console.log(JSON.stringify({ ok, mcp: false, agent, scope, config: null, games: null, existingMcpEntry: existing, skills, allowRules, projectFiles, doctor, warnings }, null, 2));
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
const label = agentLabel(agent);
|
|
166
|
+
console.log("");
|
|
167
|
+
console.log(brandLine(cliVersion));
|
|
168
|
+
console.log("");
|
|
169
|
+
console.log(` ${dryRun ? c.dim("(dry run)") : sym.ok()} ${c.bold(`CLI only for ${label}`)}: no MCP server`);
|
|
170
|
+
console.log(` ${c.dim("The agent runs Summer in its shell: summer <area> <action>, or npx -y summer-engine@latest <area> <action>. The summer-cli skill teaches it.")}`);
|
|
171
|
+
printSkillsLine(skills, dryRun);
|
|
172
|
+
if (allowRules)
|
|
173
|
+
printAllowRules(allowRules, label, Boolean(opts.yes) && !dryRun);
|
|
174
|
+
else if (supportsAllowRules(agent) && !opts.allowRules) {
|
|
175
|
+
console.log(` ${sym.arrow()} ${c.dim(`${label} asks before each summer command. To run read-only and dry-run ones without asking: summer setup ${agent} --cli --allow-rules --yes (it prints every rule).`)}`);
|
|
176
|
+
}
|
|
177
|
+
printProjectFiles(projectFiles);
|
|
178
|
+
for (const warning of warnings)
|
|
179
|
+
console.log(` ${sym.warn()} ${c.yellow(warning)}`);
|
|
180
|
+
console.log("");
|
|
181
|
+
printDoctorResult(doctor);
|
|
182
|
+
if (ok && !dryRun)
|
|
183
|
+
printTryIt(label, Boolean(opts.assetsOnly));
|
|
184
|
+
}
|
|
185
|
+
if (!ok)
|
|
186
|
+
process.exit(1);
|
|
187
|
+
}
|
|
188
|
+
/** The allow rules, each on its line: what the agent now runs without asking, or would with --yes. */
|
|
189
|
+
function printAllowRules(result, label, write) {
|
|
190
|
+
const where = c.dim(tildeify(result.path));
|
|
191
|
+
if (!write) {
|
|
192
|
+
console.log(` ${sym.arrow()} ${label} would run these summer commands without asking. Add them: run the same command with --yes. ${where}`);
|
|
193
|
+
}
|
|
194
|
+
else if (result.changed.length === 0) {
|
|
195
|
+
console.log(` ${sym.ok()} ${label} already runs read-only and dry-run summer commands without asking ${where}`);
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
console.log(` ${sym.ok()} ${label} runs these summer commands without asking (${result.changed.length} rules added) ${where}`);
|
|
200
|
+
}
|
|
201
|
+
for (const rule of result.rules)
|
|
202
|
+
console.log(` ${c.dim(rule)}`);
|
|
203
|
+
console.log(` ${c.dim("Changes, publishing, prices, deletes and messages still ask. jobs wait and assets get save the files they name. Put --dry-run right after the action: summer assets generate-image --dry-run --prompt ... Undo: --remove-allow-rules")}`);
|
|
204
|
+
}
|
|
205
|
+
/** True when `path` sits in a git repository that does not ignore it (false outside git, or without git). */
|
|
206
|
+
export function notGitIgnored(path, cwd = process.cwd()) {
|
|
207
|
+
const run = (args) => spawnSync("git", args, { cwd, stdio: "ignore" }).status;
|
|
208
|
+
if (run(["rev-parse", "--is-inside-work-tree"]) !== 0)
|
|
209
|
+
return false;
|
|
210
|
+
return run(["check-ignore", "-q", relative(cwd, path)]) === 1;
|
|
211
|
+
}
|
|
212
|
+
/** `summer setup <agent> --remove-allow-rules`: take out exactly the rules --allow-rules added. */
|
|
213
|
+
async function removeCliAllowRules(agent, scope, opts) {
|
|
214
|
+
if (!supportsAllowRules(agent))
|
|
215
|
+
throw new Error(`--remove-allow-rules is for Claude Code and Codex; Summer adds no allow rules for ${agentLabel(agent)}.`);
|
|
216
|
+
const result = await removeAllowRules(agent, allowRulesPath(agent, scope, defaultPathContext()), !opts.dryRun);
|
|
217
|
+
if (opts.json) {
|
|
218
|
+
console.log(JSON.stringify({ ok: true, agent, scope, allowRules: result }, null, 2));
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
const where = c.dim(tildeify(result.path));
|
|
222
|
+
if (result.changed.length === 0)
|
|
223
|
+
console.log(` ${sym.ok()} No Summer allow rules for ${agentLabel(agent)} ${where}`);
|
|
224
|
+
else
|
|
225
|
+
console.log(` ${opts.dryRun ? c.dim("(dry run)") : sym.ok()} ${opts.dryRun ? "Would remove" : "Removed"} ${result.changed.length} Summer allow rules for ${agentLabel(agent)} ${where}`);
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Inside a Summer project (findSetupProjectRoot: project.godot at or above the
|
|
229
|
+
* working directory, no higher than the git top level, never home): its
|
|
230
|
+
* AGENTS.md and CLAUDE.md, added when missing and never overwritten
|
|
231
|
+
* (project-memory/agent-instructions.ts). Like the skills, they are only
|
|
232
|
+
* planned without --yes. Null outside a project, with --no-project-files,
|
|
233
|
+
* --print, and --assets-only (the block is about building in Summer Engine).
|
|
234
|
+
*/
|
|
235
|
+
function setupProjectInstructions(opts) {
|
|
236
|
+
if (opts.projectFiles === false || opts.print || opts.assetsOnly)
|
|
237
|
+
return null;
|
|
238
|
+
const root = findSetupProjectRoot();
|
|
239
|
+
if (!root)
|
|
240
|
+
return null;
|
|
241
|
+
const dryRun = Boolean(opts.dryRun);
|
|
242
|
+
const written = Boolean(opts.yes) && !dryRun;
|
|
243
|
+
return { root, written, dryRun, files: writeAgentInstructions(root, { dryRun: !written }) };
|
|
244
|
+
}
|
|
245
|
+
function printProjectFiles(project) {
|
|
246
|
+
if (!project)
|
|
247
|
+
return;
|
|
248
|
+
const changed = project.files.filter((file) => file.action === "created" || file.action === "added" || file.action === "updated");
|
|
249
|
+
if (changed.length) {
|
|
250
|
+
const where = c.dim(changed.map((file) => tildeify(file.path)).join(", "));
|
|
251
|
+
if (project.written)
|
|
252
|
+
console.log(` ${sym.ok()} Added the Summer instructions for agents ${where}`);
|
|
253
|
+
else if (project.dryRun)
|
|
254
|
+
console.log(` ${c.dim("(dry run)")} Would add the Summer instructions for agents ${where}`);
|
|
255
|
+
else
|
|
256
|
+
console.log(` ${sym.warn()} Instructions for agents not added. Run the same setup command again with --yes to add them ${where}`);
|
|
257
|
+
}
|
|
258
|
+
for (const file of project.files) {
|
|
259
|
+
if (!file.reason)
|
|
260
|
+
continue;
|
|
261
|
+
const what = file.action === "skipped" ? "not written" : "left as it is";
|
|
262
|
+
console.log(` ${sym.warn()} ${c.yellow(`${tildeify(file.path)} ${what}: ${file.reason}`)}`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/** The config file that already lists summer-engine for this agent and scope, or null. */
|
|
266
|
+
async function recordedMcpEntry(agent, scope) {
|
|
267
|
+
try {
|
|
268
|
+
const target = await configureAgentMcp({ agent, scope, print: true });
|
|
269
|
+
if (!existsSync(target.path))
|
|
270
|
+
return null;
|
|
271
|
+
return listsSummerEngine(readFileSync(target.path, "utf-8"), target.format) ? target.path : null;
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/** --assets-only means the assets profile; --profile must name a profile and agree with it. */
|
|
278
|
+
function resolveSetupProfile(opts) {
|
|
279
|
+
const profile = opts.profile === undefined ? undefined : parseProfile(opts.profile);
|
|
280
|
+
if (profile === null) {
|
|
281
|
+
throw new Error(`Unknown --profile "${opts.profile}". Use one of: ${Object.keys(PROFILES).join(", ")}.`);
|
|
282
|
+
}
|
|
283
|
+
if (opts.assetsOnly) {
|
|
284
|
+
if (profile && profile !== "assets")
|
|
285
|
+
throw new Error("--assets-only uses the assets profile; leave out --profile.");
|
|
286
|
+
return "assets";
|
|
287
|
+
}
|
|
288
|
+
return profile;
|
|
289
|
+
}
|
|
290
|
+
function printSetupResult(config, games, skills, doctor, projectFiles) {
|
|
70
291
|
if (config.print) {
|
|
71
292
|
console.log(config.snippet.trimEnd());
|
|
72
293
|
return;
|
|
@@ -90,6 +311,9 @@ function printSetupResult(config, games, skills, doctor) {
|
|
|
90
311
|
else if (config.channel !== "latest") {
|
|
91
312
|
console.log(` ${c.dim(`(channel ${config.channel})`)} MCP server command: ${c.dim(`${config.server.command} ${config.server.args.join(" ")}`)}`);
|
|
92
313
|
}
|
|
314
|
+
if (config.profile !== "full") {
|
|
315
|
+
console.log(` ${c.dim(`(profile ${config.profile})`)} ${c.dim(PROFILE_NOTES[config.profile])}`);
|
|
316
|
+
}
|
|
93
317
|
if (games) {
|
|
94
318
|
const name = c.bold("Summer Games");
|
|
95
319
|
const url = c.dim(games.url);
|
|
@@ -105,6 +329,22 @@ function printSetupResult(config, games, skills, doctor) {
|
|
|
105
329
|
if (!config.dryRun)
|
|
106
330
|
console.log(` ${c.dim(`Sign in once: ${games.signIn}`)}`);
|
|
107
331
|
}
|
|
332
|
+
printSkillsLine(skills, config.dryRun);
|
|
333
|
+
printProjectFiles(projectFiles);
|
|
334
|
+
for (const warning of config.warnings) {
|
|
335
|
+
console.log(` ${sym.warn()} ${c.yellow(warning)}`);
|
|
336
|
+
}
|
|
337
|
+
console.log("");
|
|
338
|
+
printDoctorResult(doctor);
|
|
339
|
+
if (doctor.ok && skills.status !== "failed" && !config.dryRun)
|
|
340
|
+
printTryIt(label, config.profile === "assets");
|
|
341
|
+
}
|
|
342
|
+
function printTryIt(label, assets) {
|
|
343
|
+
console.log("");
|
|
344
|
+
const ask = assets ? "make a sword clash sound effect" : "add a DirectionalLight3D and Camera3D to my scene";
|
|
345
|
+
console.log(`${c.dim("Try it:")} open ${label} and ask: ${c.bold(`"${ask}"`)}`);
|
|
346
|
+
}
|
|
347
|
+
function printSkillsLine(skills, dryRun) {
|
|
108
348
|
if (skills.status === "installed") {
|
|
109
349
|
const installed = parseInstalledSkills(skills.stdout);
|
|
110
350
|
if (installed.length > 0) {
|
|
@@ -114,21 +354,13 @@ function printSetupResult(config, games, skills, doctor) {
|
|
|
114
354
|
? c.dim(` (${skills.installed.added} new, ${skills.installed.updated} updated${note ? `; ${note}` : ""})`)
|
|
115
355
|
: "";
|
|
116
356
|
console.log(` ${sym.ok()} Installed ${c.bold(String(installed.length) + " skills")}${tally} ${where ? c.dim(tildeify(where)) : ""}`);
|
|
117
|
-
|
|
118
|
-
const row = Math.floor(i / 3);
|
|
119
|
-
rows[row] = rows[row] ?? [];
|
|
120
|
-
rows[row].push(name);
|
|
121
|
-
return rows;
|
|
122
|
-
}, []);
|
|
123
|
-
for (const row of grouped) {
|
|
124
|
-
console.log(` ${c.dim(row.join(" · "))}`);
|
|
125
|
-
}
|
|
357
|
+
console.log(` ${c.dim(skillNamesSample(installed))}`);
|
|
126
358
|
}
|
|
127
359
|
else {
|
|
128
360
|
console.log(` ${sym.ok()} ${skills.message}`);
|
|
129
361
|
}
|
|
130
362
|
}
|
|
131
|
-
else if (skills.status === "planned" &&
|
|
363
|
+
else if (skills.status === "planned" && dryRun) {
|
|
132
364
|
const note = previewNote(skills);
|
|
133
365
|
console.log(` ${c.dim("(dry run)")} Would install ${c.bold(String(skills.count ?? "?") + " skills")}${note ? c.dim(` (${note})`) : ""} ${c.dim(skills.destination ?? "")}`);
|
|
134
366
|
}
|
|
@@ -140,15 +372,11 @@ function printSetupResult(config, games, skills, doctor) {
|
|
|
140
372
|
if (skills.stderr)
|
|
141
373
|
console.log(` ${c.dim(skills.stderr)}`);
|
|
142
374
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
if (doctor.ok && skills.status !== "failed" && !config.dryRun) {
|
|
149
|
-
console.log("");
|
|
150
|
-
console.log(`${c.dim("Try it:")} open ${label} and ask: ${c.bold("\"add a DirectionalLight3D and Camera3D to my scene\"")}`);
|
|
151
|
-
}
|
|
375
|
+
}
|
|
376
|
+
/** One line instead of a row per three skills: the first few names and how many more. `--json` keeps the full list. */
|
|
377
|
+
export function skillNamesSample(names, max = 8) {
|
|
378
|
+
const shown = names.slice(0, max).join(" · ");
|
|
379
|
+
return names.length > max ? `${shown} · and ${names.length - max} more` : shown;
|
|
152
380
|
}
|
|
153
381
|
function parseInstalledSkills(stdout) {
|
|
154
382
|
if (!stdout)
|
|
@@ -62,25 +62,26 @@ function previewIncludedLine(count) {
|
|
|
62
62
|
return ` ${count} preview skill${count === 1 ? "" : "s"} included — labelled in ${count === 1 ? "its" : "each skill's"} guidance; add --stable-only to skip.`;
|
|
63
63
|
}
|
|
64
64
|
function selectSkills(name, opts) {
|
|
65
|
-
if (opts.all
|
|
66
|
-
die("Use only one bulk option: --all or --
|
|
65
|
+
if ([opts.all, opts.recommended, opts.assets].filter(Boolean).length > 1) {
|
|
66
|
+
die("Use only one bulk option: --all, --recommended or --assets.");
|
|
67
67
|
}
|
|
68
|
-
if (name && (opts.all || opts.recommended)) {
|
|
68
|
+
if (name && (opts.all || opts.recommended || opts.assets)) {
|
|
69
69
|
die("Specify either a skill name or a bulk option, not both.");
|
|
70
70
|
}
|
|
71
71
|
const skills = getBuiltinSkills();
|
|
72
|
-
if (opts.all || opts.recommended) {
|
|
72
|
+
if (opts.all || opts.recommended || opts.assets) {
|
|
73
73
|
// Bulk installs take stable and preview skills (preview is a label, not a
|
|
74
74
|
// gate); --stable-only skips preview. An explicit name below installs
|
|
75
75
|
// regardless of status.
|
|
76
76
|
const { selected, previewIncluded, previewSkipped } = selectSkillsForBulkInstall(skills, {
|
|
77
77
|
recommended: Boolean(opts.recommended),
|
|
78
78
|
stableOnly: Boolean(opts.stableOnly),
|
|
79
|
+
assetsOnly: Boolean(opts.assets),
|
|
79
80
|
});
|
|
80
81
|
return { skills: selected, previewIncluded, previewSkipped };
|
|
81
82
|
}
|
|
82
83
|
if (!name) {
|
|
83
|
-
console.error("Specify a skill name, --recommended, or --all.");
|
|
84
|
+
console.error("Specify a skill name, --recommended, --assets, or --all.");
|
|
84
85
|
printAvailableSkillNames();
|
|
85
86
|
process.exit(1);
|
|
86
87
|
}
|
|
@@ -233,8 +234,13 @@ skillsCommand
|
|
|
233
234
|
.command("list")
|
|
234
235
|
.description("List available skills")
|
|
235
236
|
.option("--by-domain", "Group skills by their primary domain (same grouping as library/skills/README.md)")
|
|
237
|
+
.option("--json", "Print the skills as JSON")
|
|
236
238
|
.action((opts) => {
|
|
237
239
|
const skills = getBuiltinSkills();
|
|
240
|
+
if (opts.json) {
|
|
241
|
+
console.log(JSON.stringify({ skills }));
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
238
244
|
if (skills.length === 0) {
|
|
239
245
|
console.log("No skills found.");
|
|
240
246
|
return;
|
|
@@ -276,7 +282,8 @@ skillsCommand
|
|
|
276
282
|
.description("Install Summer skills for a target agent")
|
|
277
283
|
.option("--all", "Install all available skills")
|
|
278
284
|
.option("--recommended", "Install only the recommended skill subset (summer setup installs all by default)")
|
|
279
|
-
.option("--
|
|
285
|
+
.option("--assets", "Install only the asset skills (sound, music, voice, images, 3D, animation, video) for agents that make assets without the engine")
|
|
286
|
+
.option("--stable-only", "With --all / --recommended / --assets, skip preview skills (installed by default; labelled preview in their guidance)")
|
|
280
287
|
.option("--agent <agent>", `Target agent: ${AGENT_CLIENTS.join("|")}`)
|
|
281
288
|
.option("--scope <scope>", "Install scope: user or project")
|
|
282
289
|
// Legacy aliases: still accepted for old scripts, hidden from --help.
|
|
@@ -285,6 +292,7 @@ skillsCommand
|
|
|
285
292
|
// Pre-reversal opt-in, kept one release as a hidden no-op so old scripts still parse.
|
|
286
293
|
.addOption(new Option("--include-preview", "No-op: preview skills install by default").hideHelp())
|
|
287
294
|
.option("--force", "Overwrite existing skill files (wipe stale skill dirs before copying)")
|
|
295
|
+
.option("--no-commands", "Claude Code: skip the slash commands (/summer, /gameskill, /start), which start work through the MCP tools")
|
|
288
296
|
.action((name, opts) => {
|
|
289
297
|
const agent = orDie(() => resolveSkillAgent(opts));
|
|
290
298
|
const scope = orDie(() => resolveSkillScope(agent, opts));
|
|
@@ -342,13 +350,16 @@ skillsCommand
|
|
|
342
350
|
console.log(previewSkippedLine(previewSkipped));
|
|
343
351
|
// Claude Code: also install slash commands (`commands/*.md`)
|
|
344
352
|
// into `~/.claude/commands/`. Other agents don't have an equivalent today.
|
|
345
|
-
|
|
353
|
+
// The commands start and route game work in the engine through the MCP
|
|
354
|
+
// tools, so the asset skills (--assets, setup --assets-only) and a setup
|
|
355
|
+
// without MCP (--no-commands, setup --cli) leave them out.
|
|
356
|
+
if (agent === "claude-code" && !opts.assets && opts.commands !== false) {
|
|
346
357
|
const commandResults = installClaudeCommands(scope, Boolean(opts.force));
|
|
347
358
|
for (const r of commandResults) {
|
|
348
359
|
console.log(` ${r.action} command ${r.name} -> ${r.path}`);
|
|
349
360
|
}
|
|
350
361
|
}
|
|
351
|
-
writeMarkerForLocation(location);
|
|
362
|
+
writeMarkerForLocation(location, skills.map((skill) => skill.name));
|
|
352
363
|
printInstallSummary(skills.length, agent, scope, location);
|
|
353
364
|
});
|
|
354
365
|
/**
|
|
@@ -386,12 +397,13 @@ function installClaudeCommands(scope, force) {
|
|
|
386
397
|
* `skills-version-stale` check can detect drift later. Devin Desktop (formerly Windsurf) writes a
|
|
387
398
|
* single rules file with no surrounding dir, so we skip it there.
|
|
388
399
|
*/
|
|
389
|
-
function writeMarkerForLocation(location) {
|
|
400
|
+
function writeMarkerForLocation(location, installed) {
|
|
390
401
|
if (location.kind === "windsurf-rule-file")
|
|
391
402
|
return;
|
|
392
403
|
try {
|
|
393
404
|
mkdirSync(location.path, { recursive: true });
|
|
394
|
-
|
|
405
|
+
// Skills the upgrade refresh left stay protected, unless this install just replaced them.
|
|
406
|
+
writeSkillMarker(location.path, cliVersion, new Date(), installed);
|
|
395
407
|
}
|
|
396
408
|
catch {
|
|
397
409
|
// Marker is purely informational. If the FS rejects it (e.g. permission
|
|
@@ -401,7 +413,8 @@ function writeMarkerForLocation(location) {
|
|
|
401
413
|
skillsCommand
|
|
402
414
|
.command("info <name>")
|
|
403
415
|
.description("Show skill description and preview")
|
|
404
|
-
.
|
|
416
|
+
.option("--json", "Print the skill and its full SKILL.md body as JSON")
|
|
417
|
+
.action((name, opts) => {
|
|
405
418
|
const meta = getSkillMeta(name);
|
|
406
419
|
if (!meta) {
|
|
407
420
|
console.error(`Unknown skill: ${name}`);
|
|
@@ -412,6 +425,10 @@ skillsCommand
|
|
|
412
425
|
die(`Skill files missing: ${name}`);
|
|
413
426
|
const skillPath = join(src, "SKILL.md");
|
|
414
427
|
const content = readFileSync(skillPath, "utf-8");
|
|
428
|
+
if (opts.json) {
|
|
429
|
+
console.log(JSON.stringify({ ...meta, file: skillPath, body: content.replace(/^---\s*\n[\s\S]*?\n---\s*\n/, "") }));
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
415
432
|
console.log(`\n${meta.name}`);
|
|
416
433
|
console.log("-".repeat(40));
|
|
417
434
|
console.log(meta.description);
|
|
@@ -1,3 +1,29 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
export declare const statusCommand: Command;
|
|
3
|
+
/** What `summer status` reports; `--json` prints exactly this. */
|
|
4
|
+
export interface StatusReport {
|
|
5
|
+
auth: {
|
|
6
|
+
signedIn: false;
|
|
7
|
+
loginUrl: string;
|
|
8
|
+
} | {
|
|
9
|
+
signedIn: true;
|
|
10
|
+
source: "env";
|
|
11
|
+
} | {
|
|
12
|
+
signedIn: true;
|
|
13
|
+
source: "stored";
|
|
14
|
+
email?: string;
|
|
15
|
+
identityError?: string;
|
|
16
|
+
};
|
|
17
|
+
engine: {
|
|
18
|
+
state: "not_running";
|
|
19
|
+
} | {
|
|
20
|
+
state: "not_responding";
|
|
21
|
+
port: number;
|
|
22
|
+
} | {
|
|
23
|
+
state: "running";
|
|
24
|
+
port: number;
|
|
25
|
+
version: string;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export declare function readStatus(): Promise<StatusReport>;
|
|
3
29
|
export declare function runStatus(log: (message: string) => void): Promise<void>;
|
|
@@ -4,52 +4,67 @@ import { resolveGatewayUrl } from "../../core/config.js";
|
|
|
4
4
|
import { getApiToken, getApiPort, checkEngineHealth } from "../../core/engine.js";
|
|
5
5
|
export const statusCommand = new Command("status")
|
|
6
6
|
.description("Check Summer Engine status, connection, and auth state")
|
|
7
|
-
.
|
|
8
|
-
|
|
7
|
+
.option("--json", "Print the status as JSON")
|
|
8
|
+
.action(async (opts) => {
|
|
9
|
+
if (opts.json)
|
|
10
|
+
console.log(JSON.stringify(await readStatus()));
|
|
11
|
+
else
|
|
12
|
+
await runStatus(console.log);
|
|
9
13
|
});
|
|
14
|
+
export async function readStatus() {
|
|
15
|
+
const authToken = await getAuthToken();
|
|
16
|
+
// The env credential is what every gateway call uses; a stored identity
|
|
17
|
+
// (if any) is not the one in effect, so it is not reported.
|
|
18
|
+
const auth = !authToken
|
|
19
|
+
? { signedIn: false, loginUrl: await loginPageHint() }
|
|
20
|
+
: hasEnvAuthToken()
|
|
21
|
+
? { signedIn: true, source: "env" }
|
|
22
|
+
: { signedIn: true, source: "stored", ...(await storedIdentity()) };
|
|
23
|
+
if (!(await getApiToken()))
|
|
24
|
+
return { auth, engine: { state: "not_running" } };
|
|
25
|
+
const port = await getApiPort();
|
|
26
|
+
const health = await checkEngineHealth(port);
|
|
27
|
+
// /api/health carries no project name/path/scene (see EngineHealth in
|
|
28
|
+
// core/engine.ts); summer_get_project_context is the read for those.
|
|
29
|
+
return { auth, engine: health ? { state: "running", port, version: health.version } : { state: "not_responding", port } };
|
|
30
|
+
}
|
|
10
31
|
export async function runStatus(log) {
|
|
32
|
+
const { auth, engine } = await readStatus();
|
|
11
33
|
log("Summer Engine Status\n");
|
|
12
|
-
|
|
13
|
-
if (!authToken) {
|
|
34
|
+
if (!auth.signedIn) {
|
|
14
35
|
log(" Auth: Not logged in");
|
|
15
36
|
log(" Run: npx -y summer-engine@latest login");
|
|
16
|
-
log(` Or: ${
|
|
37
|
+
log(` Or: ${auth.loginUrl}`);
|
|
17
38
|
}
|
|
18
|
-
else if (
|
|
19
|
-
// The env credential is what every gateway call uses; a stored identity
|
|
20
|
-
// (if any) is not the one in effect, so it is not printed.
|
|
39
|
+
else if (auth.source === "env") {
|
|
21
40
|
log(" Auth: SUMMER_TOKEN (env) — logout does not affect it");
|
|
22
41
|
}
|
|
23
42
|
else {
|
|
24
|
-
|
|
43
|
+
const identity = auth.identityError ? ` (identity unreadable: ${auth.identityError})` : auth.email ? ` as ${auth.email}` : "";
|
|
44
|
+
log(` Auth: Logged in${identity}`);
|
|
25
45
|
}
|
|
26
|
-
|
|
27
|
-
const port = await getApiPort();
|
|
28
|
-
if (!apiToken) {
|
|
46
|
+
if (engine.state === "not_running") {
|
|
29
47
|
log(" Engine: Not running (no api-token found)");
|
|
30
48
|
log("\n To start: summer run");
|
|
31
49
|
return;
|
|
32
50
|
}
|
|
33
51
|
log(" API Token: Found (~/.summer/api-token)");
|
|
34
|
-
log(` Port: ${port}`);
|
|
35
|
-
|
|
36
|
-
if (!health) {
|
|
52
|
+
log(` Port: ${engine.port}`);
|
|
53
|
+
if (engine.state === "not_responding") {
|
|
37
54
|
log(" Engine: Not responding (may have closed since last launch)");
|
|
38
55
|
log("\n To start: summer run");
|
|
39
56
|
return;
|
|
40
57
|
}
|
|
41
|
-
|
|
42
|
-
// core/engine.ts); summer_get_project_context is the read for those.
|
|
43
|
-
log(` Engine: Running (v${health.version})`);
|
|
58
|
+
log(` Engine: Running (v${engine.version})`);
|
|
44
59
|
}
|
|
45
60
|
/** A corrupt user.json must not take `summer status` down with it. */
|
|
46
|
-
async function
|
|
61
|
+
async function storedIdentity() {
|
|
47
62
|
try {
|
|
48
63
|
const userInfo = await getUserInfo();
|
|
49
|
-
return userInfo?.email ?
|
|
64
|
+
return userInfo?.email ? { email: userInfo.email } : {};
|
|
50
65
|
}
|
|
51
66
|
catch (error) {
|
|
52
|
-
return
|
|
67
|
+
return { identityError: error instanceof Error ? error.message : String(error) };
|
|
53
68
|
}
|
|
54
69
|
}
|
|
55
70
|
async function loginPageHint() {
|
package/dist/cli/index.js
CHANGED
|
@@ -16,9 +16,11 @@ import { debugCommand } from "./commands/debug.js";
|
|
|
16
16
|
import { configCommand } from "./commands/config.js";
|
|
17
17
|
import { eventsCommand } from "./commands/events.js";
|
|
18
18
|
import { toolCommand } from "./commands/tool.js";
|
|
19
|
+
import { opsCliCommands } from "./commands/ops.js";
|
|
19
20
|
import { getBanner } from "./banner.js";
|
|
20
21
|
import { runRootAction } from "./root-action.js";
|
|
21
22
|
import { c, sym } from "../core/format.js";
|
|
23
|
+
import { resolveSurface } from "../core/tool-profiles.js";
|
|
22
24
|
import { TOOLKIT_VERSION as version } from "../core/version.js";
|
|
23
25
|
/**
|
|
24
26
|
* Build and run the summer CLI. The `mcp` command is injected by the bin
|
|
@@ -51,6 +53,11 @@ export function runCli(mcpCommand) {
|
|
|
51
53
|
program.addCommand(configCommand);
|
|
52
54
|
program.addCommand(eventsCommand);
|
|
53
55
|
program.addCommand(toolCommand);
|
|
56
|
+
// The 4.0 operation catalog (`summer <area> <action>`); SUMMER_SURFACE=v3 leaves it out.
|
|
57
|
+
if (resolveSurface(undefined) === "v4") {
|
|
58
|
+
for (const command of opsCliCommands())
|
|
59
|
+
program.addCommand(command);
|
|
60
|
+
}
|
|
54
61
|
program.parseAsync().catch((err) => {
|
|
55
62
|
console.error(err instanceof Error ? err.message : String(err));
|
|
56
63
|
process.exit(1);
|