Release v0.4.0
This commit is contained in:
+62
-1
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user