navigate-summer is a skill from the Summer skill library: a guide your AI agent reads when the task matches, so it builds the good version on the first try. Open a Summer web page or editor surface for the user (billing, their games, a scene) with studio.open.
When your agent uses it
- The user asks to see, check, or decide something — “show me my billing”, “where do I change my plan”, “open my games”, “let me look at the scene”, “take me to the MCP guide for Cursor”
- Deciding whether to open a surface for the user or to do the work through Summer tools
- Handing the user a link (headless, remote, or the user prefers a link) instead of launching a browser
Install
summer setup installs every skill for your agent. To add only this one:
claude-code for your agent, such as codex or cursor. See Skills for every option.
The skill
Overview
Summer has two surfaces the user looks at: summerengine.com (Studio, games, billing, templates, guides, docs) and the Summer Engine editor (scenes, nodes, docks).studio.open — the same behavior as summer open <target> in a shell, run by the Summer MCP on this computer — takes an intent (“billing”, “my games”, “the scene I’m editing”, “res://player.gd”) and opens the exact page or panel, or prints the URL / engine op so you can hand it over. The product map reference (summer_docs_read id reference/product-map) is the full table of destinations with their intent phrases, required context, and what the user will see.
A call written studio.open({...}) is summer_call({ op: "studio.open", input: {...} }) (3.x name: summer_open). The fields below are in the answer’s result.
Rigid skill: follow the rules below exactly.
The one decision: open a surface, or act?
Never open a browser or switch the editor’s tab as a side effect of building. Opening is a user-visible action — do it because the user asked to look, and say what will open before it opens.
How to call it
- Resolve first when unsure.
studio.open({ target: "change my plan", open: false })returns the matched target, the URL (andlogin_urlif login is required), or the engine op — nothing opens. Ifactionisambiguous, pick frommatchesand call again with theid. - Open.
studio.open({ target: "billing" })opens the browser at Studio → Billing.studio.open({ target: "scene", params: { path: "res://levels/level_1.tscn" } })opens the scene in the running editor.studio.open({ target: "node", params: { node: "Player/Camera3D" } })selects the node.studio.open({ target: "res://player.gd" })routes by extension. - Fill the slots the target declares.
gameneedsparams.gameId(and an optionalsectionsuch asbuilds,releases,store-page,analytics);mcp-guidetakesparams.guideas an agent name (cursor,claude-code,codex,gemini, …);profiletakesusername;changelogtakesversion. - List when you do not know the id.
studio.open({})returns every target withsurface,status, andrequires. In a shell:summer open --list.
Read the result honestly
action: "opened"— say what opened, in one line (“Opened Studio → Billing in your browser.”).logged_in: falsewithlogin_url— the login page opened withreturnUrlset; tell the user the destination loads after sign-in.action: "engine_not_running"— nothing opened. Tell the user to start Summer Engine (summer run <project>) or open the project in the desktop app, then offer to retry. Do not fall back to editing files.action: "unsupported"(failure_reason: engine_lacks_op) — this Summer Engine build cannot open that surface (it predates theNavigateop, or does not advertise that id). Say so plainly, tell the user to update Summer Engine, and describe what to open by hand. Never claim it opened.action: "ambiguous"— show the top matches by title and ask, or pick the obvious one and say which you picked.action: "not_found"— the intent is not a Summer destination (or ares://path tried to escape the project). Do not invent a URL; the tool only opens summerengine.com and its subdomains.action: "open_failed"— this machine could not launch a browser (headless, no display). Nothing opened; paste theurlfor the user.action: "blocked_origin"— the configured gateway is not a Summer origin; nothing opened. Tell the user to checkgateway.url/SUMMER_GATEWAY_URL.
When to hand over a link instead
Useopen: false (CLI: --print) and paste the url (or login_url) when the session has no browser (headless, remote, CI), when the user asked for a link, or when opening would interrupt what the user is doing. A link the user clicks is always acceptable; a browser window that appears unasked is not.
Editor targets
The editor owns its own table of destinations (theNavigate op) and tells the tool which ids it can open. studio.open({}) lists every editor id with availability: available (Navigate op), legacy (an older engine serving it through its original op), unavailable (update Summer Engine), unknown (engine not running). Ids: scene (default = the project’s main scene), main-scene, node, script (with line), file, files, scene-tree, inspector, import-dock, signals-dock, changes-dock, screen-2d/3d/script/game/assetlib, viewport-show/hide, assistant, project-settings, editor-settings, output, debugger, editor-window. On a legacy engine, script opens without taking focus — mention it if the user does not see it.
Anti-patterns
- Opening
billingorpricingwhen the user asked about a feature, not money. - Opening the scene in the editor before the change landed (“show me” comes after the mutation and its screenshot).
- Guessing a
gameId. Openmy-gamesand let the user pick, or read the id from a URL they gave you. - Describing a page you did not open. If
okis false, the user saw nothing.
From a shell
No Summer MCP tools in this session? Run each one as a command; whensummer --version is missing or below 4.0, use npx -y summer-engine@latest in place of summer. Fields are flags in kebab-case (--scene-path res://main.tscn) or one --input '<json>', and summer ops describe <op> prints the exact input. The summer-cli skill has the rest.
Related skills
using-summer: Session bootstrap: how to find and use Summer skills and the summer-engine MCP before any response.
Source:
library/skills/navigate-summer/SKILL.md, rendered from summer-engine@4.3.0 on npm.
