mirror of
https://github.com/HappyLifeOk/cc-3-8-x-mcp.git
synced 2026-06-10 17:56:47 +00:00
跨平台化:移除 AppleScript + 去 macOS 硬编码
- 删除浏览器交互的 AppleScript(osascript 控 Chrome/Safari 做截图/eval/刷新/打开), 改由外部 playwright MCP 承担;保留走 Editor.Message 的跨平台编辑器操作 - openDevDir 打开命令按平台分支(mac=open / win=explorer / linux=xdg-open) - execPath 解析弱化靠注册表/进程查询,删掉 /Applications macOS 硬编码兜底 - editor-control 去 macOS-only 假设,ps 进程查询按平台分支(win 用 wmic) - build-cmd Cocos 安装路径按平台拼 Win 特定逻辑(wmic、CocosDashboard 安装路径)标 TODO[win-verify],待 Windows 实测补全。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+2
-73
@@ -32,11 +32,9 @@ exports.template = /* html */ `
|
||||
<section class="actions">
|
||||
<header>快捷动作</header>
|
||||
<div class="btn-grid">
|
||||
<ui-button id="btnRefresh">刷新(资源+场景+预览)</ui-button>
|
||||
<ui-button id="btnRefresh">刷新(资源+场景)</ui-button>
|
||||
<ui-button id="btnSoftReload">仅软重载场景</ui-button>
|
||||
<ui-button id="btnOpenPreview">打开预览浏览器</ui-button>
|
||||
<ui-button id="btnQueryUrl">查询预览地址</ui-button>
|
||||
<ui-button id="btnScreenshot">截图 → 复制路径</ui-button>
|
||||
<ui-button id="btnOpenDev">打开 .dev 目录</ui-button>
|
||||
<ui-button id="btnClean">清理 .dev 临时文件</ui-button>
|
||||
<ui-button id="btnRefreshStatus" class="secondary">刷新状态</ui-button>
|
||||
@@ -48,17 +46,6 @@ exports.template = /* html */ `
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="debug">
|
||||
<header>Debug 注入</header>
|
||||
<div class="eval-row">
|
||||
<ui-input id="evalInput" placeholder='console.log(app.userMod.getUserValue(0))' class="grow"></ui-input>
|
||||
<ui-button id="btnEval">执行</ui-button>
|
||||
</div>
|
||||
<pre id="evalResult" class="eval-result"></pre>
|
||||
<div id="debugButtons" class="debug-buttons"></div>
|
||||
<div class="hint-small">自定义按钮配置:<code>.dev/cc-mcp-panel.json</code>(或旧名 <code>.dev/dev-reload-panel.json</code>)→ <code>{ "buttons": [{ "label": "...", "code": "..." }] }</code></div>
|
||||
</section>
|
||||
|
||||
<section class="worktrees">
|
||||
<header>同机 Worktree</header>
|
||||
<div id="worktreeList" class="wt-list">-</div>
|
||||
@@ -129,18 +116,12 @@ exports.$ = {
|
||||
probeDot: '#probeDot',
|
||||
btnRefresh: '#btnRefresh',
|
||||
btnSoftReload: '#btnSoftReload',
|
||||
btnOpenPreview: '#btnOpenPreview',
|
||||
btnQueryUrl: '#btnQueryUrl',
|
||||
btnScreenshot: '#btnScreenshot',
|
||||
btnOpenDev: '#btnOpenDev',
|
||||
btnClean: '#btnClean',
|
||||
btnRefreshStatus: '#btnRefreshStatus',
|
||||
btnReimport: '#btnReimport',
|
||||
reimportInput: '#reimportInput',
|
||||
evalInput: '#evalInput',
|
||||
btnEval: '#btnEval',
|
||||
evalResult: '#evalResult',
|
||||
debugButtons: '#debugButtons',
|
||||
worktreeList: '#worktreeList',
|
||||
logList: '#logList',
|
||||
toast: '#toast',
|
||||
@@ -203,7 +184,6 @@ exports.methods = {
|
||||
this.showToast('状态获取失败: ' + (e.message || e));
|
||||
}
|
||||
this.refreshWorktrees();
|
||||
this.refreshDebugButtons();
|
||||
},
|
||||
|
||||
async probePreview(url) {
|
||||
@@ -237,43 +217,11 @@ exports.methods = {
|
||||
} catch (e) { /* ignore */ }
|
||||
},
|
||||
|
||||
async refreshDebugButtons() {
|
||||
try {
|
||||
const btns = await Editor.Message.request('cc-3-8-x-mcp', 'get-debug-buttons');
|
||||
if (!Array.isArray(btns) || !btns.length) {
|
||||
this.$.debugButtons.innerHTML = '';
|
||||
return;
|
||||
}
|
||||
this.$.debugButtons.innerHTML = '';
|
||||
btns.forEach(cfg => {
|
||||
if (!cfg || !cfg.label || !cfg.code) return;
|
||||
const btn = document.createElement('ui-button');
|
||||
btn.textContent = cfg.label;
|
||||
btn.addEventListener('confirm', () => this.runEval(cfg.code, cfg.label));
|
||||
this.$.debugButtons.appendChild(btn);
|
||||
});
|
||||
} catch (e) { /* ignore */ }
|
||||
},
|
||||
|
||||
async runEval(code, label) {
|
||||
this.showToast('执行: ' + (label || code.slice(0, 30)));
|
||||
try {
|
||||
const r = await Editor.Message.request('cc-3-8-x-mcp', 'eval-in-preview', code);
|
||||
if (r && r.ok) {
|
||||
this.$.evalResult.textContent = '✓ ' + (r.result || '(no return)');
|
||||
} else {
|
||||
this.$.evalResult.textContent = '✗ ' + ((r && r.error) || 'unknown');
|
||||
}
|
||||
} catch (e) {
|
||||
this.$.evalResult.textContent = '✗ ' + (e.message || e);
|
||||
}
|
||||
},
|
||||
|
||||
async onRefreshClick() {
|
||||
this.showToast('刷新中…');
|
||||
try {
|
||||
await Editor.Message.request('cc-3-8-x-mcp', 'trigger-refresh');
|
||||
this.showToast('已刷新资源+场景+预览');
|
||||
this.showToast('已刷新资源+场景');
|
||||
this.refreshStatus();
|
||||
} catch (e) { this.showToast('失败: ' + (e.message || e)); }
|
||||
},
|
||||
@@ -281,10 +229,6 @@ exports.methods = {
|
||||
try { await Editor.Message.request('cc-3-8-x-mcp', 'soft-reload-scene'); this.showToast('场景已软重载'); }
|
||||
catch (e) { this.showToast('失败: ' + (e.message || e)); }
|
||||
},
|
||||
async onOpenPreviewClick() {
|
||||
try { await Editor.Message.request('cc-3-8-x-mcp', 'open-preview'); this.showToast('已在浏览器打开预览'); }
|
||||
catch (e) { this.showToast('失败: ' + (e.message || e)); }
|
||||
},
|
||||
async onQueryUrlClick() {
|
||||
try {
|
||||
const url = await Editor.Message.request('cc-3-8-x-mcp', 'query-preview-url');
|
||||
@@ -292,13 +236,6 @@ exports.methods = {
|
||||
this.refreshStatus();
|
||||
} catch (e) { this.showToast('失败: ' + (e.message || e)); }
|
||||
},
|
||||
async onScreenshotClick() {
|
||||
this.showToast('截图中…');
|
||||
try {
|
||||
const p = await Editor.Message.request('cc-3-8-x-mcp', 'screenshot-copy');
|
||||
this.showToast('截图路径已复制: ' + p);
|
||||
} catch (e) { this.showToast('失败: ' + (e.message || e)); }
|
||||
},
|
||||
async onOpenDevClick() {
|
||||
try { await Editor.Message.request('cc-3-8-x-mcp', 'open-dev-dir'); this.showToast('已打开 .dev'); }
|
||||
catch (e) { this.showToast('失败: ' + (e.message || e)); }
|
||||
@@ -341,11 +278,6 @@ exports.methods = {
|
||||
this.refreshStatus();
|
||||
} catch (e) { this.showToast('失败: ' + (e.message || e)); }
|
||||
},
|
||||
async onEvalClick() {
|
||||
const code = (this.$.evalInput.value || '').trim();
|
||||
if (!code) { this.showToast('请输入 JS 代码'); return; }
|
||||
await this.runEval(code);
|
||||
},
|
||||
};
|
||||
|
||||
function escapeHtml(s) {
|
||||
@@ -357,14 +289,11 @@ function escapeHtml(s) {
|
||||
exports.ready = function () {
|
||||
this.$.btnRefresh.addEventListener('confirm', () => this.onRefreshClick());
|
||||
this.$.btnSoftReload.addEventListener('confirm', () => this.onSoftReloadClick());
|
||||
this.$.btnOpenPreview.addEventListener('confirm', () => this.onOpenPreviewClick());
|
||||
this.$.btnQueryUrl.addEventListener('confirm', () => this.onQueryUrlClick());
|
||||
this.$.btnScreenshot.addEventListener('confirm', () => this.onScreenshotClick());
|
||||
this.$.btnOpenDev.addEventListener('confirm', () => this.onOpenDevClick());
|
||||
this.$.btnClean.addEventListener('confirm', () => this.onCleanClick());
|
||||
this.$.btnRefreshStatus.addEventListener('confirm', () => this.refreshStatus());
|
||||
this.$.btnReimport.addEventListener('confirm', () => this.onReimportClick());
|
||||
this.$.btnEval.addEventListener('confirm', () => this.onEvalClick());
|
||||
this.$.btnCopyMcpUrl.addEventListener('confirm', () => this.onCopyMcpUrl());
|
||||
this.$.btnCopyCli.addEventListener('confirm', () => this.onCopyCli());
|
||||
this.$.btnRestartMcp.addEventListener('confirm', () => this.onRestartMcp());
|
||||
|
||||
Reference in New Issue
Block a user