summer-engine 3.6.0 → 3.7.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.
Files changed (46) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/.codex-plugin/plugin.json +3 -3
  4. package/.cursor-plugin/plugin.json +2 -2
  5. package/.factory-plugin/plugin.json +2 -2
  6. package/CHANGELOG.md +8 -0
  7. package/README.md +0 -4
  8. package/dist/cli/commands/login.d.ts +0 -10
  9. package/dist/cli/commands/login.js +2 -82
  10. package/dist/cli/index.js +0 -4
  11. package/dist/core/auth.d.ts +0 -8
  12. package/dist/core/auth.js +5 -35
  13. package/dist/core/capabilities/seeing/args.d.ts +2 -2
  14. package/dist/core/capabilities/seeing/seeing.d.ts +1 -1
  15. package/dist/core/capabilities/sfx-choices.d.ts +2 -15
  16. package/dist/core/capabilities/sfx-choices.js +26 -64
  17. package/dist/core/capabilities/tool-dispatch.js +2 -54
  18. package/dist/core/config.d.ts +1 -7
  19. package/dist/core/config.js +5 -75
  20. package/dist/mcp/server.d.ts +2 -1
  21. package/dist/mcp/server.js +6 -5
  22. package/dist/mcp/tools/creator-tools.js +0 -71
  23. package/dist/mcp/tools/generate-tools.js +3 -4
  24. package/gemini-extension.json +1 -1
  25. package/library/references/mcp-tools-reference/mcp-tools-reference.md +2 -5
  26. package/library/skills/publish-your-game/SKILL.md +2 -0
  27. package/library/tools/generate-sfx-choices/resource.yaml +2 -2
  28. package/package.json +1 -1
  29. package/registry/generated/aliases.json +0 -3
  30. package/registry/generated/counts.json +2 -2
  31. package/registry/generated/gemini-extension.json +1 -1
  32. package/registry/generated/index.json +4 -107
  33. package/registry/generated/marketplace.claude.json +2 -2
  34. package/registry/generated/plugin.claude.json +2 -2
  35. package/registry/generated/plugin.codex.json +3 -3
  36. package/registry/generated/plugin.cursor.json +2 -2
  37. package/registry/generated/plugin.factory.json +2 -2
  38. package/dist/cli/commands/publish.d.ts +0 -2
  39. package/dist/cli/commands/publish.js +0 -21
  40. package/dist/cli/commands/releases.d.ts +0 -2
  41. package/dist/cli/commands/releases.js +0 -20
  42. package/dist/core/capabilities/creator.d.ts +0 -65
  43. package/dist/core/capabilities/creator.js +0 -374
  44. package/library/tools/creator-config/resource.yaml +0 -63
  45. package/library/tools/creator-publish/resource.yaml +0 -74
  46. package/library/tools/creator-releases/resource.yaml +0 -53
@@ -30,7 +30,7 @@ import { lookupApiDocs } from "./api-docs.js";
30
30
  import { BOARD_ENDPOINT, boardArgsSchema, boardQuery } from "./board.js";
31
31
  import { IMAGE_GENERATION_TIMEOUT_MS, imageGenerationArgsSchema, saveGeneratedImage } from "./image-generation.js";
32
32
  import { buildMotionRequestBody, motionGenerationArgsSchema } from "./motion-generation.js";
33
- import { defaultCanOpenBrowser, generateSfxChoices, getChoices, getChoicesArgsSchema, openInStudioTab, sfxChoicesArgsSchema, } from "./sfx-choices.js";
33
+ import { defaultCanOpenBrowser, generateSfxChoices, getChoices, getChoicesArgsSchema, sfxChoicesArgsSchema, } from "./sfx-choices.js";
34
34
  import { ImportHdriError, importHdriArgsSchema, importPolyHavenHdri } from "./hdri-import.js";
35
35
  import { FABRICATE_FALLBACK, buildFabricateMeshOp, fabricateArgsSchema } from "./fabricate-mesh.js";
36
36
  import { buildUiActionsOp, buildUiActivateOp, buildUiScreenshotOp, buildUiTreeOp, executeUiOp, uiActionsArgsSchema, uiActivateArgsSchema, uiScreenshotArgsSchema, uiScreenshotCaption, uiScreenshotImage, uiTreeArgsSchema, withUiFailureDetails, } from "./ui-control.js";
@@ -47,12 +47,11 @@ import { getAuthToken } from "../auth.js";
47
47
  import open from "open";
48
48
  import { openArgsSchema, runOpen } from "./navigation/open.js";
49
49
  import { shapeEngineLogResponse } from "../log-filters.js";
50
- import { listCreatorReleases, publishCreator, } from "./creator.js";
51
50
  import { exportGame } from "./export-game.js";
52
51
  import { exportTemplates } from "./export-templates.js";
53
52
  import { captureGameplay } from "./capture-gameplay.js";
54
53
  import { publishBuild } from "./publish-build.js";
55
- import { CONFIG_KEYS, getConfigValue, isConfigKey, readSummerConfig, resolveGatewayUrl, setConfigValue, unsetConfigValue, } from "../config.js";
54
+ import { resolveGatewayUrl } from "../config.js";
56
55
  import { createDebugReportArtifact } from "./debug-report.js";
57
56
  import { buildGameTaskPlan, gameTaskPlanInputSchema } from "./game-task-plan.js";
58
57
  import { buildProjectContext, projectContextInputSchema, projectSettingValue, } from "./project-context.js";
@@ -409,7 +408,6 @@ function sfxChoicesDeps() {
409
408
  return {
410
409
  post: (endpoint, body, timeoutMs) => gatewayReply(() => gatewayPost(endpoint, body, timeoutMs)),
411
410
  get: (endpoint, params, timeoutMs) => gatewayReply(() => gatewayGet(endpoint, params, timeoutMs)),
412
- studioOpen: (path, reviewUrl) => openInStudioTab(path, reviewUrl),
413
411
  openUrl: (url) => open(url),
414
412
  canOpenBrowser: () => defaultCanOpenBrowser(),
415
413
  };
@@ -674,56 +672,6 @@ export const TOOL_DISPATCH = [
674
672
  ...(typeof args.waitSeconds === "number" ? { waitSeconds: args.waitSeconds } : {}),
675
673
  face: "cli",
676
674
  })),
677
- entry("summer_creator_publish", "Deprecated: publish a .pck to the legacy creator API; use publish-build", false, (args) => publishCreator({
678
- project: optStr(args, "project"),
679
- artifact: optStr(args, "artifact"),
680
- version: optStr(args, "version"),
681
- manifest: optStr(args, "manifest"),
682
- projectId: optStr(args, "projectId"),
683
- channel: optStr(args, "channel"),
684
- notes: optStr(args, "notes"),
685
- confirm: args.confirm === true,
686
- face: "cli",
687
- })),
688
- entry("summer_creator_releases", "Deprecated: list releases on the legacy creator API; use summer_store_releases", false, (args) => listCreatorReleases({
689
- projectId: optStr(args, "projectId"),
690
- limit: typeof args.limit === "number" ? args.limit : 20,
691
- cursor: optStr(args, "cursor"),
692
- face: "cli",
693
- })),
694
- entry("summer_creator_config", "Read or update the shared non-secret Summer configuration", false, async (args) => {
695
- const action = str(args, "action");
696
- if (action === "list") {
697
- const config = await readSummerConfig();
698
- return {
699
- ok: true,
700
- values: Object.fromEntries(CONFIG_KEYS.map((name) => [name, getConfigValue(config, name) ?? null])),
701
- };
702
- }
703
- const key = optStr(args, "key");
704
- if (!key || !isConfigKey(key)) {
705
- throw new ToolDispatchError(`A valid key is required. Use one of ${CONFIG_KEYS.join(", ")}.`);
706
- }
707
- if (action === "get") {
708
- return { ok: true, key, value: getConfigValue(await readSummerConfig(), key) ?? null };
709
- }
710
- if (args.confirm !== true) {
711
- throw new ToolDispatchError(`Changing ${key} requires confirmation. Retry with "confirm": true after the user approves the exact change.`);
712
- }
713
- if (action === "set") {
714
- const value = optStr(args, "value");
715
- if (value === undefined) {
716
- throw new ToolDispatchError(`A value is required for ${key}.`);
717
- }
718
- const config = await setConfigValue(key, value);
719
- return { ok: true, key, value: getConfigValue(config, key) };
720
- }
721
- if (action === "unset") {
722
- const config = await unsetConfigValue(key);
723
- return { ok: true, key, value: getConfigValue(config, key) ?? null };
724
- }
725
- throw new ToolDispatchError(`Unknown action "${action}". Use list, get, set, or unset.`);
726
- }),
727
675
  // --- debug ---
728
676
  entry("summer_get_diagnostics", "Overview of editor console and runtime debugger errors/warnings", true, async (args, ctx) => requireEngineSuccess(await (await ctx.engine()).getDiagnostics())),
729
677
  entry("summer_get_console", "Read recent editor Output panel messages (deduplicated)", true, async (args, ctx) => {
@@ -3,13 +3,8 @@ export interface SummerConfig {
3
3
  gateway?: {
4
4
  url?: string;
5
5
  };
6
- creator?: {
7
- apiUrl?: string;
8
- projectId?: string;
9
- channel?: string;
10
- };
11
6
  }
12
- export declare const CONFIG_KEYS: readonly ["gateway.url", "creator.apiUrl", "creator.projectId", "creator.channel"];
7
+ export declare const CONFIG_KEYS: readonly ["gateway.url"];
13
8
  export type ConfigKey = (typeof CONFIG_KEYS)[number];
14
9
  export declare function readSummerConfig(): Promise<SummerConfig>;
15
10
  export declare function getConfigValue(config: SummerConfig, key: ConfigKey): string | undefined;
@@ -27,4 +22,3 @@ export declare function isConfigKey(value: string): value is ConfigKey;
27
22
  * Returns an origin-like base without a trailing slash.
28
23
  */
29
24
  export declare function resolveGatewayUrl(): Promise<string>;
30
- export declare function getCreatorApiUrl(): Promise<string>;
@@ -1,13 +1,7 @@
1
1
  import { readStoreJson, writeStoreJson } from "./store.js";
2
2
  const CONFIG_FILE = "config.json";
3
3
  const DEFAULT_GATEWAY_URL = "https://www.summerengine.com";
4
- const DEFAULT_CREATOR_API_URL = "https://summercraft.ai";
5
- export const CONFIG_KEYS = [
6
- "gateway.url",
7
- "creator.apiUrl",
8
- "creator.projectId",
9
- "creator.channel",
10
- ];
4
+ export const CONFIG_KEYS = ["gateway.url"];
11
5
  function emptyConfig() {
12
6
  return { schemaVersion: 1 };
13
7
  }
@@ -39,90 +33,30 @@ function validateGatewayUrl(value) {
39
33
  }
40
34
  return parsed.toString().replace(/\/+$/, "");
41
35
  }
42
- function validateCreatorApiUrl(value) {
43
- let parsed;
44
- try {
45
- parsed = new URL(value);
46
- }
47
- catch {
48
- throw new Error('creator.apiUrl must be a complete URL. Recovery: use "summer config set creator.apiUrl https://summercraft.ai".');
49
- }
50
- const local = parsed.hostname === "localhost" ||
51
- parsed.hostname === "127.0.0.1" ||
52
- parsed.hostname === "[::1]";
53
- if (parsed.protocol !== "https:" && !(local && parsed.protocol === "http:")) {
54
- throw new Error("creator.apiUrl must use HTTPS (HTTP is allowed only for localhost). Recovery: set an HTTPS URL and retry.");
55
- }
56
- if (parsed.username ||
57
- parsed.password ||
58
- parsed.pathname !== "/" ||
59
- parsed.search ||
60
- parsed.hash) {
61
- throw new Error("creator.apiUrl must be an origin without credentials, a path, query parameters, or fragments.");
62
- }
63
- return parsed.origin;
64
- }
65
36
  function validateValue(key, value) {
66
37
  const clean = value.trim();
67
38
  if (!clean) {
68
39
  throw new Error(`Cannot set ${key} to an empty value. Recovery: provide a value, or run "summer config unset ${key}".`);
69
40
  }
70
- if (key === "gateway.url")
71
- return validateGatewayUrl(clean);
72
- if (key === "creator.apiUrl")
73
- return validateCreatorApiUrl(clean);
74
- if (key === "creator.channel" && !/^[a-z0-9][a-z0-9._-]{0,63}$/i.test(clean)) {
75
- throw new Error("creator.channel may contain letters, numbers, dots, underscores, and hyphens. Recovery: choose a channel such as production or preview.");
76
- }
77
- if (key === "creator.projectId" && clean.length > 128) {
78
- throw new Error("creator.projectId is too long. Recovery: copy the project ID from the Summer creator dashboard and retry.");
79
- }
80
- return clean;
41
+ return validateGatewayUrl(clean);
81
42
  }
82
43
  export function getConfigValue(config, key) {
83
- if (key === "gateway.url")
84
- return config.gateway?.url;
85
- if (key === "creator.apiUrl")
86
- return config.creator?.apiUrl;
87
- if (key === "creator.projectId")
88
- return config.creator?.projectId;
89
- return config.creator?.channel;
44
+ return config.gateway?.url;
90
45
  }
91
46
  export async function setConfigValue(key, rawValue) {
92
47
  const config = await readSummerConfig();
93
48
  const value = validateValue(key, rawValue);
94
- if (key === "gateway.url") {
95
- config.gateway = { ...config.gateway, url: value };
96
- }
97
- else if (key === "creator.apiUrl") {
98
- config.creator = { ...config.creator, apiUrl: value };
99
- }
100
- else if (key === "creator.projectId") {
101
- config.creator = { ...config.creator, projectId: value };
102
- }
103
- else {
104
- config.creator = { ...config.creator, channel: value };
105
- }
49
+ config.gateway = { ...config.gateway, url: value };
106
50
  await writeStoreJson(CONFIG_FILE, config);
107
51
  return config;
108
52
  }
109
53
  export async function unsetConfigValue(key) {
110
54
  const config = await readSummerConfig();
111
- if (key === "gateway.url" && config.gateway)
55
+ if (config.gateway)
112
56
  delete config.gateway.url;
113
- if (key === "creator.apiUrl" && config.creator)
114
- delete config.creator.apiUrl;
115
- if (key === "creator.projectId" && config.creator) {
116
- delete config.creator.projectId;
117
- }
118
- if (key === "creator.channel" && config.creator)
119
- delete config.creator.channel;
120
57
  if (config.gateway && Object.keys(config.gateway).length === 0) {
121
58
  delete config.gateway;
122
59
  }
123
- if (config.creator && Object.keys(config.creator).length === 0) {
124
- delete config.creator;
125
- }
126
60
  await writeStoreJson(CONFIG_FILE, config);
127
61
  return config;
128
62
  }
@@ -147,7 +81,3 @@ export async function resolveGatewayUrl() {
147
81
  const configured = config.gateway?.url?.trim();
148
82
  return configured ? validateGatewayUrl(configured) : DEFAULT_GATEWAY_URL;
149
83
  }
150
- export async function getCreatorApiUrl() {
151
- const config = await readSummerConfig();
152
- return config.creator?.apiUrl ?? DEFAULT_CREATOR_API_URL;
153
- }
@@ -11,7 +11,8 @@ export declare const getCachedBootDriftNotice: typeof getCachedNotice;
11
11
  * turn and would otherwise learn the hard way. Kept under 600 characters so
12
12
  * it costs a few hundred tokens once; the full operating guide stays in the
13
13
  * summer_agent_playbook prompt / summer_get_agent_playbook tool. The last
14
- * sentence names the publishing path and the owner-approval rule.
14
+ * sentence names the publishing path, the owner-approval rule and where
15
+ * review feedback is read.
15
16
  */
16
17
  export declare const SUMMER_MCP_INSTRUCTIONS: string;
17
18
  export declare function configureMcpEngineSelection(selection?: EngineSelection): void;
@@ -40,14 +40,15 @@ export const getCachedBootDriftNotice = getCachedNotice;
40
40
  * turn and would otherwise learn the hard way. Kept under 600 characters so
41
41
  * it costs a few hundred tokens once; the full operating guide stays in the
42
42
  * summer_agent_playbook prompt / summer_get_agent_playbook tool. The last
43
- * sentence names the publishing path and the owner-approval rule.
43
+ * sentence names the publishing path, the owner-approval rule and where
44
+ * review feedback is read.
44
45
  */
45
- export const SUMMER_MCP_INSTRUCTIONS = "Summer Engine MCP. Call summer_get_project_context first: it binds the open project and returns mainScene, projectMemory and any capabilitySkewWarning. " +
46
+ export const SUMMER_MCP_INSTRUCTIONS = "Summer Engine MCP. Call summer_get_project_context first: it binds the open project, returns mainScene, projectMemory, any capabilitySkewWarning. " +
46
47
  "Before building or fixing, summer_search_library then summer_read_library the hit. " +
47
- "After a playthrough read summer_get_diagnostics, not summer_get_console alone. " +
48
- "An all-black screenshot means the viewport had not redrawn: recapture. " +
48
+ "After play, read summer_get_diagnostics, not summer_get_console alone. " +
49
+ "An all-black screenshot means no redraw yet: recapture. " +
49
50
  "Report verified entries via summer_library_feedback. " +
50
- "Publishing: summer_export_game, summer_publish_build, summer_store_*; an agent never publishes alone: summer_store_submit returns the owner's approval link.";
51
+ "Publishing: summer_export_game, summer_publish_build, summer_store_*; agents never publish alone: summer_store_submit returns the owner's approval link; summer_store_review, feedback to fix.";
51
52
  /**
52
53
  * Fire-and-forget probe of the npm registry on MCP boot. Caches the result for
53
54
  * the session. We never await this in startup so a slow / offline registry
@@ -1,27 +1,16 @@
1
1
  import { z } from "zod";
2
- import { CreatorOperationError, listCreatorReleases, publishCreator, } from "../../core/capabilities/creator.js";
3
2
  import { captureGameplay } from "../../core/capabilities/capture-gameplay.js";
4
3
  import { exportGame } from "../../core/capabilities/export-game.js";
5
4
  import { STORE_TARGETS } from "../../core/capabilities/export-presets.js";
6
5
  import { exportTemplates, TEMPLATE_PLATFORMS } from "../../core/capabilities/export-templates.js";
7
6
  import { publishBuild } from "../../core/capabilities/publish-build.js";
8
7
  import { BuildToolError } from "../../core/capabilities/summer-bundle.js";
9
- import { CONFIG_KEYS, getConfigValue, isConfigKey, readSummerConfig, setConfigValue, unsetConfigValue, } from "../../core/config.js";
10
8
  import { textJson } from "./text-json.js";
11
9
  async function creatorResult(operation) {
12
10
  try {
13
11
  return textJson(await operation());
14
12
  }
15
13
  catch (error) {
16
- if (error instanceof CreatorOperationError) {
17
- return textJson({
18
- ok: false,
19
- code: error.code,
20
- operation: error.operation,
21
- message: error.message,
22
- recovery: error.recovery,
23
- }, true);
24
- }
25
14
  if (error instanceof BuildToolError) {
26
15
  return textJson({
27
16
  ok: false,
@@ -116,64 +105,4 @@ export function registerCreatorTools(server) {
116
105
  confirm: z.boolean().default(false).describe("Set true only after the user approves the exact upload."),
117
106
  waitSeconds: z.number().int().min(0).max(1800).optional().describe("How long to wait for Summer to make the Build (default 600). On timeout, call again to keep waiting."),
118
107
  }, async (args) => creatorResult(() => publishBuild({ ...args, face: "mcp" })));
119
- server.tool("summer_creator_publish", "Deprecated: use summer_export_game, then summer_publish_build, which upload the summer.games .zip to the game's store listing. This old path publishes a .pck to the legacy Summercraft creator API with a separate sc_ token and will be removed. First call with confirm=false and present the returned project, version, digest, size, artifact path, channel, and notes; set confirm only after the user approves that exact target. The server independently verifies token scope, ownership, bytes, and review state.", {
120
- project: z.string().optional().describe("Project root. Defaults to the current working directory."),
121
- artifact: z.string().describe("Exact path to the exported Summer .pck artifact."),
122
- version: z.string().describe("Immutable release version."),
123
- manifest: z.string().optional().describe("Optional path to a JSON release manifest."),
124
- projectId: z.string().optional().describe("Creator project ID. Defaults to ~/.summer/config.json."),
125
- channel: z.string().optional().describe("Release channel. Defaults to the configured channel or production."),
126
- notes: z.string().optional().describe("Release notes shown during confirmation and recorded in the local audit."),
127
- confirm: z.boolean().default(false).describe("Set true only after the user approves the exact release target."),
128
- }, async (args) => creatorResult(() => publishCreator({
129
- ...args,
130
- face: "mcp",
131
- })));
132
- server.tool("summer_creator_releases", "Deprecated: lists releases on the legacy Summercraft creator API (separate sc_ token), not summer.games. For what players get on summer.games, and which upload can be released, use summer_store_releases.", {
133
- projectId: z.string().optional().describe("Creator project ID. Defaults to ~/.summer/config.json."),
134
- limit: z.number().int().min(1).max(100).default(20),
135
- cursor: z.string().optional().describe("Opaque nextCursor from the previous page."),
136
- }, async (args) => creatorResult(() => listCreatorReleases({
137
- ...args,
138
- face: "mcp",
139
- })));
140
- server.tool("summer_creator_config", "Read or update the shared non-secret ~/.summer configuration used by the CLI and this MCP. Mutations require confirm=true. Tokens are never returned or accepted by this tool.", {
141
- action: z.enum(["list", "get", "set", "unset"]),
142
- key: z.enum(CONFIG_KEYS).optional(),
143
- value: z.string().optional(),
144
- confirm: z.boolean().default(false),
145
- }, async ({ action, key, value, confirm }) => creatorResult(async () => {
146
- if (action === "list") {
147
- const config = await readSummerConfig();
148
- return {
149
- ok: true,
150
- values: Object.fromEntries(CONFIG_KEYS.map((name) => [
151
- name,
152
- getConfigValue(config, name) ?? null,
153
- ])),
154
- };
155
- }
156
- if (!key || !isConfigKey(key)) {
157
- throw new Error(`A valid key is required. Recovery: use one of ${CONFIG_KEYS.join(", ")}.`);
158
- }
159
- if (action === "get") {
160
- return {
161
- ok: true,
162
- key,
163
- value: getConfigValue(await readSummerConfig(), key) ?? null,
164
- };
165
- }
166
- if (!confirm) {
167
- throw new Error(`Changing ${key} requires confirmation. Recovery: show the exact change to the user, then retry with confirm=true.`);
168
- }
169
- if (action === "set") {
170
- if (value === undefined) {
171
- throw new Error(`A value is required for ${key}. Recovery: provide value and retry with confirm=true.`);
172
- }
173
- const config = await setConfigValue(key, value);
174
- return { ok: true, key, value: getConfigValue(config, key) };
175
- }
176
- const config = await unsetConfigValue(key);
177
- return { ok: true, key, value: getConfigValue(config, key) ?? null };
178
- }));
179
108
  }
@@ -2,7 +2,7 @@ import { z } from "zod";
2
2
  import { BOARD_ENDPOINT, boardArgsSchema, boardContent, boardQuery } from "../../core/capabilities/board.js";
3
3
  import { IMAGE_GENERATION_TIMEOUT_MS, imageGenerationArgsSchema, saveGeneratedImage } from "../../core/capabilities/image-generation.js";
4
4
  import { buildMotionRequestBody, motionErrorHint, motionGenerationArgsSchema, motionJobFailureHint, } from "../../core/capabilities/motion-generation.js";
5
- import { MAX_CHOICES_WAIT_SECONDS, defaultCanOpenBrowser, generateSfxChoices, getChoices, getChoicesArgsSchema, openInStudioTab, sfxChoicesArgsSchema, SFX_CHOICES_ENDPOINT, } from "../../core/capabilities/sfx-choices.js";
5
+ import { MAX_CHOICES_WAIT_SECONDS, defaultCanOpenBrowser, generateSfxChoices, getChoices, getChoicesArgsSchema, sfxChoicesArgsSchema, SFX_CHOICES_ENDPOINT, } from "../../core/capabilities/sfx-choices.js";
6
6
  import open from "open";
7
7
  import { getAuthToken } from "../../core/auth.js";
8
8
  import { resolveGatewayUrl } from "../../core/config.js";
@@ -453,7 +453,6 @@ Requires authentication: run 'npx -y summer-engine@latest login' first.`, {
453
453
  const sfxChoicesDeps = {
454
454
  post: (endpoint, body, timeoutMs) => mcpGenerate(endpoint, body, timeoutMs),
455
455
  get: (endpoint, params, timeoutMs) => mcpGet(endpoint, params, timeoutMs),
456
- studioOpen: (path, reviewUrl) => openInStudioTab(path, reviewUrl),
457
456
  openUrl: (url) => open(url),
458
457
  canOpenBrowser: () => defaultCanOpenBrowser(),
459
458
  };
@@ -463,8 +462,8 @@ one or more. The approved model becomes their default for sound effects.
463
462
 
464
463
  Use it for the first sound effect in a chat after the person said yes to
465
464
  "three versions to pick from", or whenever they want to compare. The page
466
- opens in their open Summer Studio tab when there is one (needs the store
467
- sign-in), else in the browser; open:false only returns reviewUrl.
465
+ opens in their open Summer Studio tab when there is one, else in the browser
466
+ (open:false skips the browser and only returns reviewUrl).
468
467
 
469
468
  Then tell the person the returned "say" text and call summer_get_choices
470
469
  with the choiceSetId. Do not pick for them.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "_generated": "GENERATED from integrations/gemini — do not edit; npm run generate:registry",
3
3
  "name": "summer",
4
- "version": "3.6.0",
4
+ "version": "3.7.0",
5
5
  "description": "Agent tooling for Summer Engine: MCP bridge, context primer, and game-dev skills. Use with the npm CLI for skill files on disk.",
6
6
  "contextFileName": "GEMINI.md",
7
7
  "mcpServers": {
@@ -17,7 +17,7 @@
17
17
 
18
18
  **Rule of thumb:** project reads/writes go through Summer; live hierarchy/inspector changes use scene tools; process-level work remains with the host.
19
19
 
20
- ## Tool surface (107 tools)
20
+ ## Tool surface (104 tools)
21
21
 
22
22
  ### Project files (4)
23
23
 
@@ -240,16 +240,13 @@ Preview. One fast, read-only call that walks every node of a 3D scene and lists
240
240
  | `summer_get_agent_playbook` | Daily operating contract (observe-first loop, content routing, invariants, verification ritual) — call at start of session. Also served natively as the `summer_agent_playbook` MCP prompt. |
241
241
  | `summer_get_board` | Read the person's approved planning board (look, characters, place, storyboard, picks), with the look and picked cards as images to compare screenshots against. Needs the project id from the build brief; works without the engine. |
242
242
 
243
- ### Creator platform (7)
243
+ ### Creator platform (4)
244
244
 
245
245
  | Tool | Use |
246
246
  |---|---|
247
247
  | `summer_export_game` | Export the game in the file the Summer Games store takes, headless (no window), no running editor needed. `format:"bundle"` (default): the `summer.games` `.zip` the Summer apps run; `targets` picks `ios`, `android`, `macos`, `windows` (a game without a server: phones only) through a named `summer.games <targets>` preset in `export_presets.cfg`. `format:"download"` with one target: `web` (HTML5 `.zip` on Summer's WebGPU Forward+ template; refuses Compatibility projects), `macos` (ad hoc signed `.app` zip, `macos-universal`) or `windows` (`.exe` with embedded pack, zipped, `windows-x64`). Returns path, sha256, size, bundle manifest or store platform, warnings. |
248
248
  | `summer_export_templates` | `list` or `install` export templates from Summer's CDN (`downloads.summer.games/engine-templates/<summerVersion>/manifest.json`) into the engine's user template folder (`<data>/Godot/export_templates/<FULL_CONFIG>/`), sha256-checked. Only download exports need them; store bundles need none. `summerVersion` is read on macOS, passed elsewhere. |
249
249
  | `summer_publish_build` | Upload that `.zip` to the creator's game through Studio's store upload: confirm-gated preview first, then declare, part upload from disk, seal, wait for the Build, name its client pack; `publish:true` also approves it. Needs `summer login --store`; a retry with the same file and version continues the same upload. |
250
- | `summer_creator_publish` | **Deprecated** (use the two tools above). Compute the exact `.pck` digest and size, require user confirmation, then run versioned prepare → write-once upload → finalize. The server independently verifies `publish` scope, ownership, bytes, and review state. |
251
- | `summer_creator_releases` | **Deprecated.** Lists releases on the legacy creator API. For summer.games use `summer_store_releases` (hosted, mounted after `summer login --store`). |
252
- | `summer_creator_config` | Read or confirm updates to the shared non-secret `~/.summer/config.json`. It never accepts or returns tokens. |
253
250
  | `summer_capture_gameplay` | Real gameplay frames without a running editor: starts the game (main scene or `scene`) in the engine's offscreen verify instance (`--summer-verify`, real renderer, window parked offscreen, no focus) (`--summer-offscreen`) at `resolution` (default `1920x1080`), waits `waitSeconds`, runs `steps` (`press` a button by text, `key`, `action`, `click`, `drag`, `wait`, `shot`), saves `frames` PNGs (HUD included; with a `shot` step, one per shot) to `<project>/.summer/captures/<time>/`. `args` are the game's own flags, passed after `--` (e.g. `["--autostart"]` to skip the title screen). Imports the project first when `.godot/` is missing. Returns each path with its real width and height; warns when the stretch settings render another size. For store screenshots. |
254
251
 
255
252
  ### Library search (2)
@@ -21,3 +21,5 @@ Its current text lives on the hosted Summer Engine MCP, the same text the Studio
21
21
  Before the build upload, run `release-readiness` on the exact `.zip` you upload, and report each check to the owner; a hosted game's upload checks can pass while every online join fails.
22
22
 
23
23
  The one rule to keep even before you load it: Submitting does not publish. `summer_store_submit` returns an approval link; only the owner's click sends the game to review, and review comes before live.
24
+
25
+ After the review: `summer_store_review` (hosted) returns Summer's decision, the reviewer's feedback and the next step. When Summer asks for changes or does not approve the game, fix every point in the feedback, then call `summer_store_submit` again; the owner approves the resubmission. If there is no written feedback, say so and ask the owner instead of guessing. The game is not live until Summer approves it.
@@ -1,6 +1,6 @@
1
1
  id: tool/generate-sfx-choices
2
2
  kind: tool
3
- version: 1.0.0
3
+ version: 1.0.1
4
4
  summary: "Make one sound effect with several models and show the versions in Summer Studio; the person approves one or more and that model becomes their default."
5
5
  use_when:
6
6
  - the first sound effect in a chat, after the person said yes to three versions to pick from
@@ -55,7 +55,7 @@ input_schema:
55
55
  description: "2-4 model ids to compare. Default: eleven_text_to_sound_v2, sonilo-sfx-1.1, stable-audio-3-sfx"
56
56
  open:
57
57
  type: boolean
58
- description: "Show the choices page to the person (their open Studio tab, else the browser). false: only return the URL"
58
+ description: "Show the choices page in the browser when no open Studio tab took it. false: no browser, only return the URL"
59
59
  required:
60
60
  - text
61
61
  additionalProperties: false
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "summer-engine",
3
- "version": "3.6.0",
3
+ "version": "3.7.0",
4
4
  "description": "Local Summer CLI and MCP server for Summer Engine. Install and run the engine, connect Claude Code, Cursor, Codex, Gemini, and other agents, and build real games with bundled skills, hooks, and plugins.",
5
5
  "keywords": [
6
6
  "summer-engine",
@@ -110,9 +110,6 @@
110
110
  "summer_connect_signal": "tool/connect-signal",
111
111
  "summer_create_debug_report": "tool/create-debug-report",
112
112
  "summer_create_scene": "tool/create-scene",
113
- "summer_creator_config": "tool/creator-config",
114
- "summer_creator_publish": "tool/creator-publish",
115
- "summer_creator_releases": "tool/creator-releases",
116
113
  "summer_debug_views": "tool/debug-views",
117
114
  "summer_export_game": "tool/export-game",
118
115
  "summer_export_templates": "tool/export-templates",
@@ -6,7 +6,7 @@
6
6
  "reference": 9,
7
7
  "skill": 123,
8
8
  "template": 19,
9
- "tool": 107
9
+ "tool": 104
10
10
  },
11
- "total": 258
11
+ "total": 255
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "_generated": "GENERATED from integrations/gemini — do not edit; npm run generate:registry",
3
3
  "name": "summer",
4
- "version": "3.6.0",
4
+ "version": "3.7.0",
5
5
  "description": "Agent tooling for Summer Engine: MCP bridge, context primer, and game-dev skills. Use with the npm CLI for skill files on disk.",
6
6
  "contextFileName": "GEMINI.md",
7
7
  "mcpServers": {
@@ -148,7 +148,7 @@
148
148
  "id": "reference/mcp-tools-reference",
149
149
  "kind": "reference",
150
150
  "version": "1.4.1",
151
- "content_hash": "87742ed2af1190af6d5bda79b4fe0cde1973fcd74c0cd4a5763e1bdcc23b4fb9",
151
+ "content_hash": "ee626e6bac5ff34eb4a69ad44ef1c93c0c26d4b57783cc1068dd5ad4d280d473",
152
152
  "summary": "Canonical reference for which Summer MCP tool to call — skills should reference tool names exactly as written here.",
153
153
  "use_when": [
154
154
  "choosing between Summer MCP tools and host tools for an operation",
@@ -2828,7 +2828,7 @@
2828
2828
  "id": "skill/publish-your-game",
2829
2829
  "kind": "skill",
2830
2830
  "version": "1.0.0",
2831
- "content_hash": "0328c6d71f662059cc2514864e005c2e71cf90811553ef2a2ecabbbf9cb4305f",
2831
+ "content_hash": "c2ed78b67c43fbcea5792ec31b97daff0ded3e0fe63e8d676ecdc8da7527de4d",
2832
2832
  "summary": "Publish a Summer game on Summer Games through MCP: store page, art, build upload, submit, and one approval link for the owner.",
2833
2833
  "use_when": [
2834
2834
  "the user says 'publish my game', 'put it on summer.games', 'launch it on the store' or 'submit it for review'",
@@ -5964,109 +5964,6 @@
5964
5964
  "publish": false
5965
5965
  }
5966
5966
  },
5967
- {
5968
- "id": "tool/creator-config",
5969
- "kind": "tool",
5970
- "version": "1.0.2",
5971
- "content_hash": "1449083d5fef74d8bdb5fcfe88d5a8dc0ab80824c4fec51fa4dcb24c5c5bfef6",
5972
- "summary": "Read or update the shared non-secret Summer configuration; mutations require confirm, and tokens are never returned or accepted.",
5973
- "use_when": [
5974
- "inspecting or changing shared CLI and MCP configuration values",
5975
- "\"which creator project id / channel is this CLI pointed at?\"",
5976
- "switching the default publish channel"
5977
- ],
5978
- "facets": {
5979
- "lifecycle": [
5980
- "launch"
5981
- ],
5982
- "domains": [
5983
- "creator",
5984
- "deployment"
5985
- ]
5986
- },
5987
- "compatibility": {
5988
- "engine": ">=4.6"
5989
- },
5990
- "status": "stable",
5991
- "mcp_tool_name": "summer_creator_config",
5992
- "remote": false,
5993
- "cli_command": "summer config",
5994
- "authority": {
5995
- "filesystem": true,
5996
- "editor_mutation": false,
5997
- "network": false,
5998
- "credentials": false,
5999
- "publish": false
6000
- }
6001
- },
6002
- {
6003
- "id": "tool/creator-publish",
6004
- "kind": "tool",
6005
- "version": "1.1.0",
6006
- "content_hash": "48ee4dbe8810da6ae327ebf9e80b3e2a352daad18fe7e7061d53db17110a06fe",
6007
- "summary": "Deprecated: publishes a .pck to the legacy creator API. Use summer_export_game, then summer_publish_build, to upload to summer.games.",
6008
- "use_when": [
6009
- "an old project that still publishes a .pck to the legacy Summercraft creator channel with an sc_ creator token",
6010
- "a ~/.summer/config.json that names a legacy creator projectId and channel"
6011
- ],
6012
- "facets": {
6013
- "lifecycle": [
6014
- "launch"
6015
- ],
6016
- "domains": [
6017
- "creator",
6018
- "deployment"
6019
- ]
6020
- },
6021
- "compatibility": {
6022
- "engine": ">=4.6"
6023
- },
6024
- "status": "deprecated",
6025
- "mcp_tool_name": "summer_creator_publish",
6026
- "remote": false,
6027
- "cli_command": "summer publish",
6028
- "authority": {
6029
- "filesystem": true,
6030
- "editor_mutation": false,
6031
- "network": true,
6032
- "credentials": false,
6033
- "publish": true
6034
- }
6035
- },
6036
- {
6037
- "id": "tool/creator-releases",
6038
- "kind": "tool",
6039
- "version": "1.0.2",
6040
- "content_hash": "8abe66c592d1d0f45db5106179f390a4d43cff8d72834c7029aefbaec57e628e",
6041
- "summary": "Deprecated: lists releases on the legacy creator API. For summer.games use summer_store_releases.",
6042
- "use_when": [
6043
- "an old project that published a .pck to the legacy Summercraft creator channel with an sc_ creator token",
6044
- "paging legacy creator releases by projectId and cursor"
6045
- ],
6046
- "facets": {
6047
- "lifecycle": [
6048
- "launch"
6049
- ],
6050
- "domains": [
6051
- "creator",
6052
- "deployment"
6053
- ]
6054
- },
6055
- "compatibility": {
6056
- "engine": ">=4.6"
6057
- },
6058
- "status": "deprecated",
6059
- "mcp_tool_name": "summer_creator_releases",
6060
- "remote": true,
6061
- "cli_command": "summer releases",
6062
- "authority": {
6063
- "filesystem": false,
6064
- "editor_mutation": false,
6065
- "network": true,
6066
- "credentials": false,
6067
- "publish": false
6068
- }
6069
- },
6070
5967
  {
6071
5968
  "id": "tool/debug-views",
6072
5969
  "kind": "tool",
@@ -6650,8 +6547,8 @@
6650
6547
  {
6651
6548
  "id": "tool/generate-sfx-choices",
6652
6549
  "kind": "tool",
6653
- "version": "1.0.0",
6654
- "content_hash": "463a73530a24eb8a3379715b5c487cffa056bfca031c5ff3206971038b2df715",
6550
+ "version": "1.0.1",
6551
+ "content_hash": "cc583f4378e6fa60a864a5bbae0b7d3ddb5b30962a443432d5bc4a7581fd5fb3",
6655
6552
  "summary": "Make one sound effect with several models and show the versions in Summer Studio; the person approves one or more and that model becomes their default.",
6656
6553
  "use_when": [
6657
6554
  "the first sound effect in a chat, after the person said yes to three versions to pick from",
@@ -11,8 +11,8 @@
11
11
  {
12
12
  "name": "summer",
13
13
  "source": "./",
14
- "version": "3.6.0",
15
- "description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 107-tool MCP bridge to the local desktop app.",
14
+ "version": "3.7.0",
15
+ "description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 104-tool MCP bridge to the local desktop app.",
16
16
  "author": {
17
17
  "name": "Summer Engine",
18
18
  "email": "founders@summerengine.com"