Release v0.4.0

This commit is contained in:
winlifes
2026-06-10 20:26:09 -07:00
parent 03e5ab8dfe
commit 6405dced7d
27 changed files with 1983 additions and 52 deletions
+62 -1
View File
@@ -23,6 +23,7 @@ const {
} = require('./logs');
const { resolveProjectPath } = require('./path-safety');
const {
createCocosMcpProjectSkill,
createProjectSkill,
listProjectInstructions,
readProjectInstruction,
@@ -36,14 +37,22 @@ const {
revertPrefabInstance,
validatePrefabReferences,
} = require('./prefabs');
const { createAssetsAdvancedTools } = require('./tools/assets-advanced');
const { createCocosProjectTools } = require('./tools/cocos-project');
const { buildSnippet, createFileTools, refreshAssets } = require('./tools/files');
const { createSceneEventTools } = require('./tools/scene-events');
const { captureDesktopScreenshot, captureEditorWindowScreenshot, capturePanelScreenshot } = require('./screenshots');
const { checkForUpdate } = require('./update-checker');
const { assertJavascriptSafety } = require('./javascript-safety');
const { safeStringify } = require('./utils');
const IMAGE_DATA_URI_PREFIX = 'data:image/png;base64,';
const TOOL_CATEGORY_RULES = [
['project', /^(get_project_info|get_editor_state|get_tool_catalog)$/],
['build', /^(get_build_status|open_build_panel|run_project_preview|save_current_scene)$/],
['preferences', /preference/],
['broadcast', /broadcast/],
['events', /event|bind_button_click|button_click/],
['updates', /update/],
['logs', /log/],
['diagnostics', /diagnostic|validate/],
@@ -306,6 +315,30 @@ function toOutput(value) {
return safeStringify(value);
}
function useJavascriptSafetyChecks(args, runtimeContext) {
if (args && typeof args.safety_checks === 'boolean') {
return args.safety_checks;
}
if (args && typeof args.safetyChecks === 'boolean') {
return args.safetyChecks;
}
const config = runtimeContext && runtimeContext.config;
if (config && typeof config.executeJavascriptSafetyChecks === 'boolean') {
return config.executeJavascriptSafetyChecks;
}
return true;
}
function assertToolJavascriptSafety(args, runtimeContext) {
if (!useJavascriptSafetyChecks(args, runtimeContext)) {
return;
}
assertJavascriptSafety(args && args.code, {
projectPath: runtimeContext && runtimeContext.projectPath,
});
}
async function resolveNodeUuid(sceneBridge, args) {
if (args && args.uuid) {
return String(args.uuid);
@@ -328,11 +361,14 @@ function createToolRegistry({ getRuntimeContext, getStatus, interactionLog, runt
context: { type: 'string', description: 'Execution context: scene or editor.' },
code: { type: 'string', description: 'JavaScript code to execute. May directly return a value, define run(env), or export a function.' },
args: { type: 'object', description: 'Optional JSON object passed into the script.' },
safety_checks: { type: 'boolean', description: 'Override the project default JavaScript safety checks for this call.' },
},
['context', 'code']
),
handler: async (args) => {
const context = String(args.context || '').toLowerCase();
const runtimeContext = getRuntimeContext();
assertToolJavascriptSafety(args, runtimeContext);
if (context === 'scene') {
return sceneBridge.call('executeCode', { code: args.code, args: args.args || {} });
}
@@ -353,10 +389,14 @@ function createToolRegistry({ getRuntimeContext, getStatus, interactionLog, runt
{
code: { type: 'string', description: 'JavaScript code to execute inside the scene script context.' },
args: { type: 'object', description: 'Optional JSON object passed to the scene script.' },
safety_checks: { type: 'boolean', description: 'Override the project default JavaScript safety checks for this call.' },
},
['code']
),
handler: async (args) => sceneBridge.call('executeCode', { code: args.code, args: args.args || {} }),
handler: async (args) => {
assertToolJavascriptSafety(args, getRuntimeContext());
return sceneBridge.call('executeCode', { code: args.code, args: args.args || {} });
},
},
{
name: 'execute_editor_script',
@@ -366,10 +406,12 @@ function createToolRegistry({ getRuntimeContext, getStatus, interactionLog, runt
{
code: { type: 'string', description: 'JavaScript code to execute inside the editor context.' },
args: { type: 'object', description: 'Optional JSON object passed to the editor script.' },
safety_checks: { type: 'boolean', description: 'Override the project default JavaScript safety checks for this call.' },
},
['code']
),
handler: async (args) => {
assertToolJavascriptSafety(args, getRuntimeContext());
if (typeof editorExecutor !== 'function') {
throw new Error('Editor JavaScript execution is unavailable.');
}
@@ -512,6 +554,22 @@ function createToolRegistry({ getRuntimeContext, getStatus, interactionLog, runt
return createProjectSkill(projectPath, args);
},
},
{
name: 'create_cocos_mcp_project_skill',
profile: 'full',
description: '[core] Create a recommended local Codex project skill for Funplay Cocos MCP workflows.',
inputSchema: createSchema(
{
skillName: { type: 'string', description: 'Optional filesystem-safe project skill name.' },
overwrite: { type: 'boolean', description: 'Allow overwriting an existing skill. Defaults to true.' },
},
[]
),
handler: async (args) => {
const { projectPath } = getRuntimeContext();
return createCocosMcpProjectSkill(projectPath, args);
},
},
{
name: 'set_selection',
profile: 'core',
@@ -656,6 +714,7 @@ function createToolRegistry({ getRuntimeContext, getStatus, interactionLog, runt
inputSchema: createSchema({}, []),
handler: async () => getRuntimeContext(),
},
...createCocosProjectTools({ createSchema }),
{
name: 'list_scenes',
profile: 'core',
@@ -961,6 +1020,7 @@ function createToolRegistry({ getRuntimeContext, getStatus, interactionLog, runt
return selectAsset(info.uuid || args.target);
},
},
...createAssetsAdvancedTools({ createSchema, getRuntimeContext }),
{
name: 'get_editor_selection',
profile: 'full',
@@ -1463,6 +1523,7 @@ function createToolRegistry({ getRuntimeContext, getStatus, interactionLog, runt
),
handler: async (args) => sceneBridge.call('simulateButtonClick', args),
},
...createSceneEventTools({ createSchema, sceneBridge }),
{
name: 'invoke_component_method',
profile: 'full',