Skip to main content
Glama
README.md
# Wallpaper Engine MCP

Windows 本地 STDIO MCP 服务,用于制作可保存的 Wallpaper Engine 源工程,并通过官方引擎获取运行反馈。支持 Web 创作、基础 Scene 模板、CEF 和自有原生窗口截图;复杂 Scene 作者能力仍待开发。

## 启动

要求 Windows、Node.js 24 或更高版本,以及正在运行的官方 Wallpaper Engine。工程管理和自动测试可脱离引擎运行。

```powershell
npm.cmd ci
npm.cmd test
Copy-Item we.config.example.json we.config.json
# 按本机环境编辑 we.config.json
node dist/index.js --probe
node dist/index.js
```

服务的 stdout 只用于 MCP 协议,日志写入 stderr。`--probe` 是单独的诊断模式,会输出 JSON 后退出。

任意支持 STDIO 的 MCP 客户端可使用以下启动参数;将路径替换为实际仓库目录:

```json
{
  "command": "node",
  "args": [
    "D:/CodeX Workstation/MCP for Wallpaper Engine/main/dist/index.js",
    "--config",
    "D:/CodeX Workstation/MCP for Wallpaper Engine/main/we.config.json"
  ]
}
```

默认配置位于程序所在仓库的 `we.config.json`,相对路径基于配置文件所在目录解析。不会依赖 MCP 客户端当前目录。

| 配置 | 含义 |
| --- | --- |
| `installDir` | 官方引擎安装目录,包含 wallpaper32.exe 或 wallpaper64.exe |
| `workspace` | 受管工程、检查点、预览副本、截图和发布暂存目录;默认 `.we-mcp` |
| `projectRoots` | 额外只读工程目录;可以是工程本身或其父目录;不扫描整盘 |
| `assetRoots` | 允许读取图片、音频和视频素材的目录列表,默认 `[]`;素材工具使用目录索引和相对路径,不扫描整盘 |
| `devtoolsPort` | 手动配置的本机 CEF 调试端口;`null` 时仍可使用 CLI、工程管理和已构建的原生截图后端 |
| `timeoutMs` | 单次操作等待上限,1000–30000 毫秒 |

本机集成测试要求在正常用户权限下访问引擎。受限沙箱可能使 CEF 无法写入自身配置目录,出现 `ProcessSingleton ... Error code: 5`;这是实际遇到的环境限制。

图片检查与原字节导入需配置 `assetRoots`。支持静态 PNG/JPEG/WebP、源哈希核对、显式覆盖和检查点恢复;完整调用示例、开源选型、预算及未验收范围见[图片导入说明](docs/image-import.md)。该功能尚未执行超分。

### 工作区锁诊断

诊断结果的 `startupIssue` 会保留本会话启动时受阻的原因,例如锁已存在、互斥忙或协调环境不可用;它是启动记录,当前锁状态仍应以本次诊断为准。当前会话持有锁时该字段为 `null`。

一个工作区只允许一个持有锁的服务会话。锁冲突时,服务仍可完成 MCP 握手;调用 `we_workspace_diagnose`,参数为 `{}`:

```json
{"name":"we_workspace_diagnose","arguments":{}}
```

返回 `workspace`、`mode`、`lock`、`holder` 和 `recovery`。`mode: "owner"` 表示当前会话仍持有原锁;`"diagnostic"` 表示仅可诊断及尝试受控恢复,其余 19 个工具均返回 `WORKSPACE_LOCKED`。原锁发生变化或不可读时,原持有会话的普通操作返回 `WORKSPACE_OWNERSHIP_LOST`,不会自动解锁。

新锁在 `server.lock/owner.json` 记录 PID、主机、平台、随机会话标识和进程启动身份。Windows 使用系统自带 PowerShell 只读查询 `Process.StartTime`,无需截图 helper;查询有 3 秒期限。旧空锁、记录损坏、异地主机、权限不足或查询失败均保持 `holder.state: "unknown"`。`"alive"`、`"exited"`、`"pid-reused"` 是采样时的身份核对结果;其中 PID 复用表示启动时间不匹配,不是只凭 PID 推断。`lock.fingerprint` 可用于识别两次诊断间的变化,不授予解锁权限。

`recovery.available:true` 表示采样时满足候选条件,**不代表已经恢复或预留了锁**。只有当前 Windows 协议创建的 `version:2`、`coordination:"windows-pipe-v1"` 锁,持有者已明确退出,且工作区在本机固定 NTFS 磁盘上,才能尝试恢复。活跃持有者、PID 启动身份不匹配、未知状态、旧空锁、上一版 version:1 记录、网络/其他文件系统均拒绝。旧记录不会被自动升级,也没有 force 参数。

取得新诊断的 `lock.fingerprint` 后,在 MCP 中明确调用以下工具(替换指纹占位符):

```json
{"name":"we_workspace_recover","arguments":{"expectedFingerprint":"<lock.fingerprint>","confirm":true}}
```

获取、正常释放和恢复共用一个 Windows 命名管道互斥,按工作区目录的文件系统身份区分;进程崩溃后由 OS 释放,不留下新的 guard 文件。竞争时最多等待约 1 秒取得互斥,之后返回 `WORKSPACE_COORDINATION_BUSY`,应重新诊断再重试。每次进程/卷查询另有 3 秒期限。恢复在互斥内重核全部条件,先将旧锁和最多 1 MiB 的旧预览注册表保存到 `lock-recoveries/<UUID>/`,再为当前会话取得新锁;成功返回 `state:"recovered"`、归档路径和 `mode:"owner"`,无需重启即可调用普通工具。

`WORKSPACE_LOCK_CHANGED` 表示指纹不再匹配;`WORKSPACE_RECOVERY_REFUSED` 表示条件不满足。`WORKSPACE_RECOVERY_INCOMPLETE` 表示中途停止,应先诊断并检查返回的 `phase`、`mode` 和归档;此时可能已取得新锁,不能盲目重试。恢复不会回滚工程、接管旧窗口或改写当前预览注册表;源工程需重新 inspect/validate,检查点恢复是另一项操作。原持有者正常退出、锁已不存在时,应启动新会话获取锁,不能用旧指纹强行恢复。

恢复进程若被强制结束,归档审计可能落后于实际目录状态。应以新会话的锁诊断配合归档核对:当前锁不存在时可由新会话正常获取;有完整身份且原进程已退出时可重新显式恢复;空锁或半写身份仍会拒绝写入和恢复,须保留现场人工处理。十个文件操作中断点已验证保护行为,其中两个新锁身份未完成的中断点仍存在此可用性限制;不能把“安全拒绝”当作“可以自动恢复”。详见[恢复中断验收矩阵](docs/workspace-lock-incident.md#恢复各阶段的进程中断验收)。

不要按锁龄或空目录直接删锁。旧空锁缺少历史归属信息,本接口不能补造所有权证据。协调要求参与者遵守同一协议,不能防御外部程序强行替换目录。若运行环境设置了 `NODE_PENDING_PIPE_INSTANCES`,协调会保守拒绝,以避开 Node/libuv 已知的非默认配置竞态;服务不会改动该环境变量。

诊断只访问配置指定的工作区,不接受任意路径或 PID,不终止进程,不接管旧预览。元数据读取限制为 8 KiB,链接、额外硬链接及异常目录内容被拒绝或保守报告;非 Windows 的进程身份查询尚未实现。`--probe` 仍只用于引擎环境探测,不能代替此 MCP 工具。实测范围与后续恢复边界见 [锁诊断记录](docs/workspace-lock-incident.md)。

### 可选原生窗口截图

原生截图需要 Windows x64、.NET 10 x64 运行时;构建另需 .NET 10 SDK。本机验证使用 SDK 10.0.301、Windows 11 build 26100 和引擎 2.8.42。其他系统尚未实测。Windows SDK 投影版本固定为 10.0.19041.57。

```powershell
npm.cmd run build:native
```

脚本优先使用 `.we-mcp/tools/dotnet/dotnet.exe`,否则使用 PATH 中的 `dotnet`。首次恢复依赖需要访问官方 NuGet;缓存及构建产物均被 Git 忽略。构建后的 `native/WeCapture/bin/publish/` 是完整 helper 目录,部署时须连同 DLL、runtimeconfig 和许可证一起保留;无需在运行机器安装 SDK。服务不会自动下载或安装 SDK。

helper 存在时,预览启动、调参、截图和关闭均增加窗口归属校验:启动前 HWND 基线、唯一生成的窗口名、同一会话、引擎可执行文件路径、PID、创建时间和窗口类。身份不符即拒绝,关闭后还须确认原 HWND 和名称消失;失败保留记录。未构建 helper 时继续使用原有 CLI/CEF 能力,但关闭只报告命令已发送。

启动失败且尚未绑定窗口身份时,关闭会先短时确认窗口是否已不存在,避免退出时再次等待完整的窗口出现期限。若窗口仍存在,仍须先绑定并验证身份才能发送关闭命令;检查失败不会当作窗口消失。本机已复现并修复这一分支导致客户端关闭超时、留下工作区锁的问题;不保证任意挂起的 helper、执行中的工具或强制结束进程都能正常清理,详见[退出问题验收](docs/workspace-lock-incident.md#失败预览退出超时的修复)。

原生捕获不依赖 CEF,使用 Windows Graphics Capture,仅针对绑定窗口;没有桌面或显示器截图兜底。最小化、隐藏、尺寸变化、超时均有明确错误。采用每监视器 DPI 感知,返回实际物理像素尺寸及 DPI;原生图像包含标题栏和窗口边框,尺寸可大于请求的客户区尺寸。帧限制为 16777216 像素、单边 8192、PNG 20 MiB,图像内嵌总量限制为 8 MiB base64。

颜色路径为 SDR BGRA8;HDR 色彩保真、多屏混合 DPI、4K 和长时间压力场景尚未验收。PNG 成功或连续帧不同都不能独立证明画面正确或美观。Scene 的运行时脚本/素材健康也不能由原生截图推导。

复用说明:独立 helper 的 COM/D3D 互操作改编自 [Backdrop for Codex](https://github.com/TogawaSakiko-desuwa/backdrop-for-codex),保留 Apache-2.0 许可证与 NOTICE;单帧流程另参考 [Win32CaptureSample](https://github.com/robmikh/Win32CaptureSample)。详见 [helper 归属声明](native/WeCapture/THIRD-PARTY-NOTICES.md)。没有引入两者的完整应用或替代官方播放器。

## 工具

| 工具 | 行为 |
| --- | --- |
| `we_workspace_diagnose` | 即使锁冲突也可读取配置工作区的锁指纹、持有者记录和进程身份;不恢复、不删除锁 |
| `we_workspace_recover` | 明确确认并携带当前指纹,在跨进程互斥内验证、归档已退出持有者的兼容锁,再取得新锁;不杀进程、不接管旧预览 |
| `we_environment_probe` | 返回版本、CEF 发现状态和未验证能力,不修改引擎设置 |
| `we_project_list` | 在配置目录内有界发现工程,去重并分页 |
| `we_project_inspect` | 返回源码 revision、元数据、文件哈希;可用 `readFiles` 读取文本 |
| `we_project_create` | 用 `web-starfield` 或 `scene-orbit` 创建工程,或用 `sourceProjectId` 导入受管副本;移除旧 workshopid |
| `we_project_apply` | 按 `expectedRevision` 写入 UTF-8 文件或删除文件,先静态检查并保存检查点 |
| `we_project_restore` | 恢复指定检查点,校验归属、内容哈希和当前 revision |
| `we_project_validate` | 检查 JSON、入口、HTML/CSS 引用、Web JS 语法、音频开关及 Scene 本地图片层依赖;不冒充真实引擎验证 |
| `we_image_inspect` | 从 `assetRoots` 指定目录检查静态 PNG/JPEG/WebP,完整解码并返回尺寸、透明度、方向及 SHA256;仅返回文本 |
| `we_image_import` | 校验源哈希与工程 revision 后原字节导入,保存检查点;默认拒绝覆盖;不自动修改素材引用 |
| `we_media_inspect` | 从 `assetRoots` 探测 WAV/MP3/MP4/WebM,返回时长、轨道、尺寸、帧率、采样率与哈希;仅元数据,不证明可播放 |
| `we_media_import` | 校验源哈希与工程 revision 后原字节导入媒体,保存检查点、默认拒绝覆盖;不创建视频工程或转码 |
| `we_video_create` | 用已探测的 MP4/WebM 与源哈希创建新的原生视频工程;原字节复制、拒绝同名工程;创建成功仍不代表播放通过 |
| `we_scene_create` | 用已探测的图片及源哈希创建“原图背景+独立光点”Scene;保留原字节,调用已安装的官方编译器生成 rgba8888 纹理;提供速度、位移、大小、显示属性,不拆分人物 |
| `we_preview_open` | 从固定源码副本打开唯一命名窗口;每个服务会话最多登记一个 Web,Scene 可共存;返回就绪证据或未验证状态 |
| `we_preview_set_properties` | 校验类型及范围后修改该预览的公开参数,不修改源码默认值 |
| `we_preview_move_mouse` | 向自有 Web CEF 预览派发鼠标移动;`x/y` 为 0~1 的归一化坐标,左上 `(0,0)`、右下 `(1,1)`;不移动系统光标 |
| `we_preview_observe` | 采集 1–3 张 PNG;默认只返回文本诊断和文件路径;`includeImages:true` 才附带有界图像内容;`backend:auto/cef/native` 选择捕获路径 |
| `we_preview_close` | 只关闭本服务创建的预览窗口,不发送全局 stop 或 kill |
| `we_publish_prepare` | 复制运行工程到发布暂存目录并输出剩余步骤,不打包 `.pkg` 或上传 |

## 一次创作循环

媒体入口复用 `assetRoots`:先 inspect,再将返回哈希传给 import 或 `we_video_create`;支持纯文本客户端、解析期限、MCP 取消和退出清理。单文件最多 40 MiB,工程仍受 64 MiB / 2000 文件约束。示例和格式范围见[音视频素材入口](docs/media-import.md);原生 MP4/WebM、Web 中 WebM 及受控真实音频响应的本机验收见[视频与音频验收](docs/video-audio-acceptance.md)。不同格式、编码轨道仍需逐工程验证。

Web 音频监听器要求 `project.json` 中的 `general.supportsaudioprocessing: true`;根节点同名标记不起作用。旧模板生成的工程若只有根节点标记,现在校验会明确拒绝。受管工程可先 inspect,再通过带 revision 的 apply 修正 manifest,并重新打开预览。不会自动修改历史作品或检查点;静态校验通过仍需真实音频对照。

图片 Scene 先调用 `we_image_inspect`,再向 `we_scene_create` 传相同素材索引、相对路径及哈希。需要 Windows 和 `installDir/bin/resourcecompiler64.exe`;不下载或分发编译器,不开放任意编译参数。保留 `sources/original.*`,编译副本按 EXIF 方向转成 sRGB PNG,保持显示尺寸;固定 rgba8888、关闭 mipmap,单图最多 8388608 像素且须满足工程总预算。每个编译进程限 30 秒,输出/纹理文件有界;编译中的请求取消与 EOF 会终止该子进程,失败不保存新工程。完整范围、真实用户图片验收、失败记录和限制见[图片 Scene 报告](docs/image-scene-acceptance.md)。

Web JS 语法检查区分 HTML 中的普通脚本与模块,覆盖内联脚本及本地 `.js` / `.mjs`。错误包含文件与行列号;损坏脚本会阻止 apply、预览和发布准备。检查只解析、不执行脚本,保留 `engineVerification:unverified`;单文件 1 MiB、输入合计 8 MiB、最多 256 次脚本检查,解析子进程有 3 秒期限。详情与审计剩余任务见[能力审计跟进](docs/capability-audit-followup.md)。

1. 用 `we_project_create` 创建 `managed/my-wallpaper`。当前模板支持速度、密度、音频开关、星体颜色,运行文件无网络依赖。
2. 用 `we_project_inspect` 获取 revision 与源码;调用 `we_project_apply` 时传入该 revision。`content: null` 表示删除,其他值是文件的完整新内容。
3. 打开预览并调用 observe;默认只返回文本和原图路径,适合无多模态模型的 CLI。多模态客户端可显式传 `includeImages:true`。`backend:auto` 优先使用已连接 CEF,否则选择原生后端;没有可用后端则返回错误。
4. 临时调参后,把满意的值写入 `project.json` 的 `general.properties`,再打开新的预览;Web 须先关闭现有 Web 预览。已有预览始终指向原来的固定源码副本。
5. `we_preview_observe` 的 `reload: true` 会关闭并重开这个预览窗口,从同一源码副本重新初始化宿主。运行参数会恢复为该副本的源码默认值。
6. 通过多帧检查后执行发布准备,检查预览图、动态资源、素材权利和元数据,再用官方编辑器导入、发布。

版本冲突返回 `REVISION_CONFLICT`,应重新 inspect 后再修改。成功修改返回 `checkpointId`;无变化的调用返回 `checkpointId: null`。错误通过 MCP `isError` 和结构化错误代码返回。

鼠标移动使用当前页面 `innerWidth/innerHeight`(每边 1~8192 CSS 像素)按 `x*(width-1)`、`y*(height-1)` 换算,不使用含标题栏的原生截图尺寸。仅支持配置 CEF 调试的 Web 预览,Scene 或无调试端口返回 `MOUSE_INPUT_UNSUPPORTED`;目标缺失、歧义或跳转会拒绝。不提供点击、滚轮、键盘或系统光标回退。输入前后校验页面归属,并沿用可用的原生窗口身份校验。

返回 `confirmation: "event-dispatched"` 仅表示 CDP 命令已确认;`visualResponse: "unverified"` 提醒继续 observe 检查画面。检查和派发不是原子操作:期间跳转、调整大小或连接失败可能发生在事件已发出之后,此类错误带 `dispatchAttempted: true`,不保证事件未被接收。本机官方引擎 2.8.42 已通过命令冒烟检查和几何双眼样例验收:页面接收坐标、截图中的方向/幅度/遮罩边缘、原生窗口位移,以及每次调用前后的系统光标位置均有测量。样例通过不代表任意作品的视觉质量通过。调研依据见 [鼠标输入研究](docs/mouse-input-research.md)。

运行 `node scripts/verify-mouse.mjs` 可重现双眼验收,约一分钟保持系统鼠标不动;报告位于 `.we-mcp/mouse-verification/report.json`。脚本使用一个 Web 和一个静止 Scene 对照,顺序测试两种 Web 尺寸;详细范围见 [鼠标实机验收记录](docs/mouse-input-acceptance.md)。

**两个 Web 同时渲染的本机故障尚未修复**:绕过 MCP、改变等价 CLI 参数、关闭远程调试均未消除第二个 Web 渲染失败。现有证据最符合 CEF 根目录单例行为,但没有直接确认宿主内部实现。服务因此在 CLI 和快照写入之前返回 `WEB_PREVIEW_LIMIT`,列出须先关闭的 `activePreviewIds`;`we_environment_probe` 的 `webPreviewConcurrency` 也公开此限制。关闭失败时仍保留名额,正常关闭后可重开;Scene 可共存。这是**服务会话内限制,不是跨进程互斥**,不能防止其他服务或手动启动的 Web 触发同一引擎故障。服务不会自动更改 CEF 配置、关闭已有预览或退回系统鼠标。[对照证据与源码依据](docs/cef-concurrency-research.md)。

`node scripts/verify-web-limit.mjs` 验证第二个 Web 被拒绝后没有新快照或调试目标、第一个仍能接收鼠标输入,以及关闭后能在 Scene 仍打开时重开 Web。报告位于 `.we-mcp/web-limit-verification/report.json`;这验证限制行为,不代表并发 Web 已通过。

## 基础 Scene 模板

`we_project_create` 传入 `templateId: "scene-orbit"` 可创建 1280×720 Scene:一个原创青色图片层在深色背景上水平运动。`properties` 支持 `speed`(0–2,圈/秒)和 `amplitude`(0–400,场景像素);幅度为 0 时回到中点,速度为 0 时保持当前相位。图案 PNG、`.tex-json` 编译配置和 `.tex` 产物均随工程保存,没有网络素材依赖。

Scene 的 Origin 属性内联绑定 SceneScript,源码位于 `scene.json` 的 `objects[0].origin.script`。脚本通过 `engine.frametime` 累积相位,从 `engine.userProperties.speed/amplitude` 读取当前值,不逐帧叠加位置。不要把 Web 的 `window.wallpaperPropertyListener` 搬到 Scene 中。

模板结构已由本机官方编辑器 2.8.42 打开、保存并回读,最终脚本保持不变;官方引擎独立窗口已实测图片、连续运动、幅度归零/恢复和速度归零。当前实现使用直接属性读取,是因为本机实测仅依赖 `applyUserProperties` 回调时参数未生效;没有把该观察外推为所有版本的回调行为。

基础模板还已完成编辑、回滚与重开闭环验收:同时修改 `project.json` 的源码默认参数和 `scene.json` 的 Origin/脚本,实际画面从横向变为纵向运动;旧预览重载仍使用旧副本,源码回滚也不会改写运行中的新版副本。重新打开工程后,源码 revision、各源文件 SHA-256(包括 PNG/TEX)与原版一致,画面恢复横向运动。临时参数在同一副本重载后恢复源码默认值。检查的是原始源文件,渲染器在私有副本中新生成的 shader 缓存不属于该源码清单。

验收另覆盖过期 revision 的编辑/恢复拒绝、同时带新旧两个活动预览退出 MCP 服务后的窗口/锁回收,以及重启 MCP 服务后从持久检查点恢复两个源码版本。这里重启的是 MCP 服务进程;未覆盖强制杀进程、Wallpaper Engine 本体重启或整机重启后的恢复。

模板自带 TEX,创建和预览无需再次编译。修改源 PNG 或编译配置后,可重新生成模板纹理:

```powershell
npm.cmd run build:scene-assets
```

此开发脚本读取本机配置中的 `installDir`,调用官方 `bin/resourcecompiler64.exe -tex -i ... -o ...`。它在独立临时工程中编译,通过头部和尺寸限制检查后才替换模板 TEX,并输出编译器、源图与产物 SHA-256。松散 PNG 在本机曾使编译器超时,所以保留完整工程和 `materials` 目录布局。编译器未随仓库分发;该调用方式仅在当前安装版本验证。脚本更新的是仓库模板,不会自动更新已经创建的工程副本。

Scene 静态检查返回 `sceneDependencies`,遍历本地 `image → model.material → passes.textures → TEX`,检查危险路径、TEX 头部和“有源图但缺少编译纹理”的情况。安装目录共享资产无法仅从工程内容确认,因此未解析引用保留为警告;`valid: true` 不表示所有依赖完整或脚本正确。检查上限为 2000 对象/引用、每材质 64 pass、每 pass 32 纹理,超限明确告警。粒子、3D 模型、自定义 shader、动态资产和完整 TEX 解码尚不在静态检查范围内。

`scene-orbit` 使用引擎自带 `genericimage4` shader,离线运行仍依赖已安装的官方引擎。模板不含第三方壁纸图片、工坊 ID 或外部播放器代码。

## CEF 与当前版本差异

公开调试文档描述了端口设置入口,但本机 `2.8.42` 已把它换成内置 DevTools 按钮。本次经用户允许,在原有 `cefcommandline` 设置中配置以下参数并重启后,实测可连接:

```text
--remote-debugging-port=9223 --remote-debugging-address=127.0.0.1
```

服务本身不会改这些设置。`we.config.json` 的 `devtoolsPort` 必须与引擎实际端口一致。本机发现桌面 Web 与独立预览可分别监听同端口的 `127.0.0.1` 和 `[::1]`,即使配置中写了 IPv4 地址。服务查询两个回环地址,按自有工程路径选取唯一目标,并将 WebSocket 固定到发现它的地址;多个匹配目标仍拒绝连接。详见 [CEF 双地址修复与验收](docs/cef-loopback-acceptance.md)。

直接使用 `Page.reload` 在本机丢失了宿主属性和 FPS 回调,因此实现改为重建自有预览窗口。CLI 的 `RAW~(...)~END` JSON 需要保留 Windows 原始引号;实现仅对固定的属性命令使用原始参数模式,并拒绝保留分隔符,全程不经过 shell。

## 测试与状态数据

```powershell
npm.cmd test
# 下面会实际打开并回收独立预览;先配置安装目录和 CEF 端口
node scripts/verify-engine.mjs
node scripts/verify-cef.mjs
```

`verify-cef.mjs` 在隔离工作区验证 CEF 截图、实际鼠标事件、属性回读、控制台/运行异常收集和宿主重载;可传入现有 Web 工程目录以测试副本,并比较原工程前后哈希。该脚本要求工程提供本项目的 `__weDiagnostics` 和 `speed` 属性,不是任意第三方工程的通用验收器。报告保存在 `.we-mcp/cef-verification/<运行ID>/report.json`。它会在测试页注入固定错误验证收集,重载后应清空;不会写入原工程或提供公开任意执行接口。

普通测试覆盖路径边界、链接、只读来源、检查点、并发版本冲突、Windows 参数、属性回调、限帧、CEF 超时/断线/日志及真实 STDIO 握手。集成脚本另验证实际画面、多帧变化、参数接收、源码 revision、宿主重载和发布准备,详细报告写入 `.we-mcp/integration-report.json`。

构建原生 helper 后,运行 `node scripts/verify-native.mjs`,验证无 CEF 的原生截图、默认纯文本返回、显式图像块、多帧变化、重载、真实窗口消失,以及篡改身份、伪造同名窗口、最小化、窗口改名和查找超时的拒绝行为。报告位于 `.we-mcp/native-verification/report.json`。此脚本会短暂打开本轮创建的测试窗口,只操作这些窗口;必须在正常交互用户会话中运行。

`node scripts/verify-scene.mjs` 通过真实 STDIO MCP 创建新 Scene 工程,以纯文本模式采集原生截图,测量图案的青色像素位置,验证实际运动、参数响应、编辑/回滚/重开、固定副本隔离及服务重启后的持久检查点。它会启动两个先后运行的 MCP 服务,测试正常退出时的窗口和锁回收;异常清理失败也会令脚本失败。报告位于 `.we-mcp/scene-verification/report.json`,包含调用、测量、文件哈希校验与服务进程记录。检查图案位置而非仅比较整张 PNG,避免把标题栏变化当作动画;这仍不是通用画面质量评价或 Scene 错误收集。

`.we-mcp` 和本机配置不会进入 Git。应单独备份受管源工程;工坊上传不能替代源工程备份。锁冲突时先通过 `we_workspace_diagnose` 保留并核对证据;符合条件时可显式调用 `we_workspace_recover`,没有自动回收或强制解锁工具。`active-previews.json` 记录了预览窗口名称,便于异常退出后核对;它不证明窗口已不存在,也不授予新会话控制旧窗口的权限。

多文件写入不具备跨进程原子性:服务会序列化调用、检查写入前后的哈希,并保存 checkpoint 和 operation journal。中途遇到错误返回 `RECOVERY_REQUIRED`,保留现场;重新 inspect 后可用检查点恢复。外部编辑器不应同时写同一受管工程。

首版限制:工程上限 64 MiB / 2000 文件,单次文本读取 256 KiB,单文件文本修改 1 MiB。拒绝隐藏路径、node_modules、Windows 特殊文件名和符号链接/目录联接;因此应导入运行工程目录,而不是含开发依赖的仓库根目录。运行产生的历史副本和截图暂不自动清理。

早期四步目标(复用调研、原生捕获、基础 Scene 模板、Scene 编辑/回滚/重开闭环)已有本机验收。当前审计整改安排另见[能力审计跟进](docs/capability-audit-followup.md)。视频与受控系统音频已补首轮验收;复杂 Scene 工具、通用 Scene 脚本/素材错误收集、系统媒体会话、通用 UI 自动化及工坊上传仍未完成。基础模板通过不代表任意作者工作流通过;静态检查不能穷尽任意动态引用,发布准备仍需逐工程检查预览与依赖。

接口依据:[官方 CLI](https://help.wallpaperengine.io/en/functionality/cli.html)、[Web 属性](https://docs.wallpaperengine.io/en/web/customization/properties.html)、[音频](https://docs.wallpaperengine.io/en/web/audio/visualizer.html)、[调试入口](https://docs.wallpaperengine.io/en/web/debug/debug.html)、[官方 MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk)。版本兼容结论以本仓库的本机实测记录为准。

Scene 依据:[官方 SceneScript 引用与类型定义](https://docs.wallpaperengine.io/en/scene/scenescript/reference.html)、[IEngine 属性](https://docs.wallpaperengine.io/en/scene/scenescript/reference/class/IEngine.html)、[update 与帧时间](https://docs.wallpaperengine.io/en/scene/scenescript/reference/event/update.html)、[开发者公开的资源编译命令](https://steamcommunity.com/app/431960/discussions/2/340412122401455740/)。新增实现使用当前安装版编辑器保存结果与实际编译/运行证据,没有依赖第三方播放器的兼容性声明。

TDQS

A3.7/5.0

Scored across 12 tools

Disambiguation5/5

Tools split cleanly into project, preview, and environment concerns, with actions like inspect, validate, apply, and restore each having a distinct stated scope. Descriptions explicitly clarify what each tool does and does not do, so selection should be unambiguous.

Naming Consistency5/5

All names use snake_case with a consistent we_ prefix and object_action structure, such as we_project_apply and we_preview_open. There are no mixed conventions or vague verbs.

Tool Count5/5

12 tools is well-scoped for the domain, covering project lifecycle, preview control, and environment inspection without obvious redundancy or missing basic operations.

Completeness4/5

Core project and preview lifecycle is covered, including create, edit, restore, validate, and preview observation. However, there is no final publish/upload tool and no project deletion or checkpoint listing, leaving some end-to-end workflows incomplete or requiring external steps.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues