Sno Station
Sno Station은 AI 에이전트를 하나의 팀으로 묶는 오픈소스 워크스테이션으로, 로컬 머신에서 에이전트 협업을 가능하게 함
WPF 뷰를 PNG로 렌더링해 AI 에이전트가 UI와 바인딩 오류를 확인하도록 합니다
Render WPF views to PNG for AI agents to verify UI and binding errors
AI가 요약 · README에서
플러그인PowerShell · C#GitHub @ayueryi직접 설치운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
설치형 프로젝트는 배포 도메인 없이도 확인할 수 있습니다. 개인 저장소는 GitHub 로그인으로, 조직 저장소는 위의 저장소 확인 파일로 직접 확인해 주세요.
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
让 AI 编码代理(Codex、Claude Code 等)亲眼看到自己改出来的 WPF 界面:在独立的临时进程里把真实的 UserControl / Page / Window 渲染成 PNG,并给出解析好的绑定错误和布局问题。 Render real WPF views offscreen to PNG, with parsed binding errors and layout checks — packaged as a Claude Code / Codex plugin with an MCP server. 以上是仓库自带样例视图的真实渲染结果。 • 真实界面:用业务程序集里的真实控件、样式和资源渲染,不是手绘 mock;不启动业务程序,不抢焦点,不弹窗口。 • 结论可直接使用:绑定错误解析成一行结论(如 TextBlock.Text。布局问题只是线索,不影响 status,由代理对照截图确认。完整字段见 references/cli.md。 不接入也能用(代理传程序集路径和视图类型即可)。接入后代理可以按名称渲染页面,并在结束前自动验证:README 전문 보기 ↗
给 AI 一双看 WPF 的眼睛 Give your agent eyes on WPF.
让 AI 编码代理(Antigravity、Codex、Claude Code 等)改完就能看见自己写出来的 WPF 界面:在独立的临时进程里把真实的 UserControl / Page / Window 渲染成 PNG,并给出解析好的绑定错误和布局问题。
Render real WPF views offscreen to PNG, with parsed binding errors and layout checks — packaged as an Antigravity / Claude Code / Codex plugin with an MCP server.
| light | dark |
|---|---|
以上是仓库自带样例视图的真实渲染结果。
TextBlock.Text <- Path=CustomerNmae(数据源 OrderVm));自动检查文本截断、被裁切、文本重叠、尺寸为 0、超出视口。适用范围:只能在 Windows 上渲染(云端 Linux 容器中的代理会话用不了)。快照不包含 Popup / ToolTip、HwndHost、WebView 等原生内容,也不能证明性能;交互只覆盖能用代码确定性驱动的部分(见交互步骤,默认主题的鼠标悬停 / 按下样式截不到,拖拽、手势等真实输入不在范围内)。不适用于 WinUI、UWP、Avalonia、MAUI。
前提:Windows 本机,已安装 PowerShell 7(pwsh)与 .NET 8 或更高版本的 SDK(只装了 .NET 9 / 10 也可以,MCP 服务器与内置样例会前滚到已安装的版本)。MCP 服务器首次启动时会编译到 %LOCALAPPDATA%\wpf-offscreen-render\mcp,之后直接启动。冷启动的首次编译(含 NuGet 还原)可能超过客户端的 MCP 启动超时,建议安装后先预热一次:pwsh -ExecutionPolicy Bypass -File <插件目录>\mcp\start.ps1 -BuildOnly(Claude Code 也可以用环境变量 MCP_TIMEOUT 调大超时;Codex 插件已把启动与工具调用超时设为 180 秒 / 30 分钟)。首次编译需要访问 NuGet;离线或内网环境的做法见 verification.md。
把下面的提示词原样发给对应的代理即可:它会检查环境、安装或更新插件、预编译 MCP 服务器并自检。安装或更新后需要重启会话插件才生效。命令需要联网(GitHub、NuGet),并会写入用户目录(插件缓存、%LOCALAPPDATA%\wpf-offscreen-render):Codex 的沙箱默认禁止这些操作,出现授权请求时批准即可。
请帮我安装 wpf-offscreen-render 插件(WPF 离屏渲染,仓库 ayueryi/wpf-offscreen-render):
1. 确认本机是 Windows,`pwsh -v` 为 7.x,`dotnet --list-sdks` 中有 8.0 或更高版本的 SDK;不满足时停下来告诉我缺什么,不要自行安装。
2. 运行 `claude plugin marketplace add ayueryi/wpf-offscreen-render`(提示已存在时跳过),再运行 `claude plugin install wpf-offscreen-render@wpf-offscreen-render`。
3. 从 `claude plugin list --json` 中取该插件的 installPath,运行 `pwsh -NoProfile -ExecutionPolicy Bypass -File "<installPath>\mcp\start.ps1" -BuildOnly` 预编译 MCP 服务器(首次需要访问 NuGet,可能要一分钟左右)。
4. 运行 `pwsh -NoProfile -ExecutionPolicy Bypass -File "<installPath>\tests\run-tests.ps1" -Quick`,确认输出 `2 通过,0 失败`。
5. 告诉我安装的版本、installPath 和自检结果,并提醒我重启 Claude Code 会话。
请把 wpf-offscreen-render 插件更新到最新版本:
1. 先用 `claude plugin list --json` 记下当前版本,然后运行 `claude plugin marketplace update wpf-offscreen-render` 和 `claude plugin update wpf-offscreen-render@wpf-offscreen-render`。
2. 版本有变化时,从 `claude plugin list --json` 取新的 installPath,运行 `pwsh -NoProfile -ExecutionPolicy Bypass -File "<installPath>\mcp\start.ps1" -BuildOnly` 预编译新版本的 MCP 服务器,再运行 `pwsh -NoProfile -ExecutionPolicy Bypass -File "<installPath>\tests\run-tests.ps1" -Quick` 自检(应输出 `2 通过,0 失败`)。
3. 告诉我更新前后的版本号,根据 `<installPath>\CHANGELOG.md` 概括这之间的变化,并提醒我重启 Claude Code 会话。
请帮我安装 wpf-offscreen-render 插件(WPF 离屏渲染,仓库 ayueryi/wpf-offscreen-render):
1. 确认本机是 Windows,`pwsh -v` 为 7.x,`dotnet --list-sdks` 中有 8.0 或更高版本的 SDK;不满足时停下来告诉我缺什么,不要自行安装。
2. 运行 `codex plugin marketplace add ayueryi/wpf-offscreen-render`(提示已存在时跳过),再运行 `codex plugin add wpf-offscreen-render@wpf-offscreen-render`,输出中的 “Installed plugin root” 就是插件目录。这些命令需要联网,被沙箱拦截时请求我批准。
3. 运行 `pwsh -NoProfile -ExecutionPolicy Bypass -File "<插件目录>\mcp\start.ps1" -BuildOnly` 预编译 MCP 服务器(首次需要访问 NuGet,可能要一分钟左右)。
4. 运行 `pwsh -NoProfile -ExecutionPolicy Bypass -File "<插件目录>\tests\run-tests.ps1" -Quick`,确认输出 `2 通过,0 失败`。
5. 告诉我安装的版本、插件目录和自检结果,并提醒我重启 Codex 会话。
请把 wpf-offscreen-render 插件更新到最新版本:
1. 先用 `codex plugin list` 记下当前版本,然后运行 `codex plugin marketplace upgrade wpf-offscreen-render` 刷新插件市场,再运行 `codex plugin add wpf-offscreen-render@wpf-offscreen-render` 安装新版本(只刷新市场不会更新已安装的插件)。这些命令需要联网,被沙箱拦截时请求我批准。
2. 版本有变化时,对输出中新的 “Installed plugin root” 运行 `pwsh -NoProfile -ExecutionPolicy Bypass -File "<插件目录>\mcp\start.ps1" -BuildOnly` 预编译 MCP 服务器,再运行 `pwsh -NoProfile -ExecutionPolicy Bypass -File "<插件目录>\tests\run-tests.ps1" -Quick` 自检(应输出 `2 通过,0 失败`)。
3. 告诉我更新前后的版本号,根据 `<插件目录>\CHANGELOG.md` 概括这之间的变化,并提醒我重启 Codex 会话。
请帮我接入 wpf-offscreen-render(WPF 离屏渲染工具,仓库 https://github.com/ayueryi/wpf-offscreen-render):
1. 确认本机是 Windows,`pwsh -v` 为 7.x,`dotnet --list-sdks` 中有 8.0 或更高版本的 SDK;不满足时停下来告诉我。
2. 若 `%USERPROFILE%\tools\wpf-offscreen-render` 不存在,把仓库克隆到那里;已存在时在该目录运行 `git pull --ff-only` 更新(有本地改动时停下来问我)。
3. 在你的 MCP 配置中登记服务器 wpf-offscreen-render:command 为 `pwsh`,args 为 `-NoProfile -NonInteractive -ExecutionPolicy Bypass -File <仓库目录>\mcp\start.ps1`;你支持 skills 时,优先把整个插件目录安装或链接到代理可访问的位置。若只能单独复制 `skills\wpf-offscreen-render`,在代理环境中设置 `WPF_RENDER_ROOT=<仓库目录>`,不要按 SKILL.md 的目录层级猜路径。
4. 运行 `pwsh -NoProfile -ExecutionPolicy Bypass -File "<仓库目录>\mcp\start.ps1" -BuildOnly` 预编译,再运行 `pwsh -NoProfile -ExecutionPolicy Bypass -File "<仓库目录>\tests\run-tests.ps1" -Quick` 自检(应输出 `2 通过,0 失败`)。
5. 告诉我版本(`<仓库目录>\VERSION`)和自检结果,并说明需要重启会话。
/plugin marketplace add ayueryi/wpf-offscreen-render
/plugin install wpf-offscreen-render@wpf-offscreen-render
Claude Code 2.1.275 及以上也可以一步安装:/plugin install wpf-offscreen-render --marketplace ayueryi/wpf-offscreen-render。插件包含 skill、MCP 服务器和结束前自动验证的 Stop hook。在终端中可以用对应的 CLI:claude plugin marketplace add …、claude plugin install …;更新用 claude plugin marketplace update wpf-offscreen-render 加 claude plugin update wpf-offscreen-render@wpf-offscreen-render,重启会话后生效。
codex plugin marketplace add ayueryi/wpf-offscreen-render
codex plugin add wpf-offscreen-render@wpf-offscreen-render
也可以在 Codex 的插件列表中安装。更新:codex plugin marketplace upgrade wpf-offscreen-render 刷新市场后,再运行一次 codex plugin add wpf-offscreen-render@wpf-offscreen-render(只刷新市场不会更新已安装的插件),重启会话后生效。
一键安装(推荐):
在仓库根目录下运行自动化安装脚本,自动检测环境并配置全局 MCP 服务器与 Skill:
pwsh -File .\scripts\install-antigravity.ps1 -Test
pwsh -File .\scripts\install-antigravity.ps1 -Scope Workspacepwsh -File .\scripts\install-antigravity.ps1 -Uninstall作为 Antigravity Plugin 安装:
本仓库根目录自带 Antigravity 标准的 plugin.json 与 mcp_config.json,可直接将仓库目录链接或放置于插件目录:
~/.gemini/config/plugins/wpf-offscreen-render.agents/plugins/wpf-offscreen-render手动配置 MCP:
在 ~/.gemini/config/mcp_config.json 中添加:
{
"mcpServers": {
"wpf-offscreen-render": {
"command": "pwsh",
"args": ["-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", "-File", "C:\\tools\\wpf-offscreen-render\\mcp\\start.ps1"]
}
}
}
并将 skills/wpf-offscreen-render 复制或联接(Junction)到 ~/.gemini/config/skills/wpf-offscreen-render 或工作区的 .agents/skills/wpf-offscreen-render。
把仓库克隆到固定位置(下例为 C:\tools\wpf-offscreen-render),在代理的 MCP 配置中添加:
{
"mcpServers": {
"wpf-offscreen-render": {
"command": "pwsh",
"args": ["-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", "-File", "C:\\tools\\wpf-offscreen-render\\mcp\\start.ps1"]
}
}
}
Codex 不装插件时也可以执行 codex mcp add wpf-offscreen-render -- pwsh -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\tools\wpf-offscreen-render\mcp\start.ps1。需要工作流说明时,优先把整个仓库作为插件目录使用;若只能把 skills\wpf-offscreen-render 复制到代理的 skills 目录(Claude Code:.claude\skills\;Codex / Antigravity:.agents\skills\),请在代理环境中设置 WPF_RENDER_ROOT=C:\tools\wpf-offscreen-render。
让代理调用 self_test 工具,或者直接运行 .\tests\run-tests.ps1 -Quick,通过时输出 2 通过,0 失败。
| MCP 工具 | 用途 |
|---|---|
render_view | 渲染一个视图(或预设),返回 JSON 摘要和截图;传 element 时另附该元素的截图;传 steps 时依次执行交互步骤,返回每步摘要和步骤总览图 |
render_matrix | 一次渲染多个主题 × 尺寸 × DPI,返回汇总和总览图 |
compare_snapshots | 对比两次渲染,返回变化区域和差异图(变化像素标红) |
get_layout | 按元素名、文本或问题类型查询某次渲染的布局树 |
list_views | 列出业务项目 wpf-render.json 中登记的视图 |
self_test | 环境自检 |
代理拿到的摘要示例(渲染一个绑定写错了的视图):
{
"status": "binding-issues",
"sourceViewType": "MyUi.Views.OrderView",
"mode": "layout-only",
"theme": "light",
"pixelSize": "1280x800",
"bindingIssueCount": 1,
"bindingIssues": [
"TextBlock.Text <- Path=CustomerNmae(数据源 OrderPreviewVm):BindingExpression path error: 'CustomerNmae' property not found on 'object' ''OrderPreviewVm''"
],
"layoutIssueCount": 1,
"layoutIssues": [
"[text-truncated] TextBlock#OrderTitle「订单 #1024 · Contoso 有限公司…」:文本需要宽度 237.5,可用 180"
],
"outDir": "C:\\Users\\me\\AppData\\Local\\Temp\\wpf-render-cache\\…\\render-…",
"snapshot": "…\\snapshot.png"
}
status 为 ok / binding-issues / failed:<阶段>(多组合渲染的汇总为 ok / binding-issues / failed)。布局问题只是线索,不影响 status,由代理对照截图确认。完整字段见 references/cli.md。
不接入也能用(代理传程序集路径和视图类型即可)。接入后代理可以按名称渲染页面,并在结束前自动验证:
登记视图:把 templates/wpf-render.json 复制到业务仓库根目录,填写程序集、视图类型、主题 / 尺寸、构建命令,以及每个视图对应的源文件(watch)。
约定规则:把 templates/agent-rules.md 的内容加入业务仓库的 AGENTS.md(Codex)或 CLAUDE.md(Claude Code),要求修改界面后渲染验证并在回复中给出结论。
结束前自动验证:wpf-render.json 里设置 "verifyOnStop": true,然后在本机授权这个项目:
pwsh -ExecutionPolicy Bypass -File <插件或克隆目录>\scripts\trust-project.ps1 -Path C:\work\MyApp
Claude Code 插件自带的 Stop hook 会在代理结束本轮前,渲染 watch 命中改动的视图;有渲染失败或绑定错误时阻止结束,让代理继续修复。同一份改动只验证一次。hook 会执行配置中的 build 命令并运行业务程序集,所以只对授权过的项目生效;授权记录保存在本机(不在仓库里),wpf-render.json 被修改后需要重新授权,未授权时 hook 只提示一次如何授权。Codex 需要按 templates/codex-hooks.json 自行配置(尚未在真实 Codex 中验证)。
装了插件后,每轮结束都会启动一次 hook 进程(约 1 秒),没有 wpf-render.json 的项目会立即退出。
ViewModel 需要构造参数或 stub 服务时,在预设中用 dataContextFactory 指定一个无参静态工厂方法;还需要配置资源、等待异步加载完成时,用 factoryFile 指向业务仓库中的 ViewFactory.cs。字段说明见 integration.md。
不通过代理时,也可以直接调用 scripts/ 下的 PowerShell 脚本(MCP 工具内部调用的就是它们):
git clone https://github.com/ayueryi/wpf-offscreen-render.git
cd wpf-offscreen-render
$ui = 'C:\work\MyApp\bin\Debug\net8.0-windows\MyApp.dll' # 换成你的业务程序集
# 渲染内置样例,确认环境可用
.\scripts\render.ps1
# 渲染业务视图:TFM 与位数自动推断;同一组程序集第二次起跳过构建
$out = .\scripts\render.ps1 -AssemblyPath $ui -ViewType MyUi.Views.OrderView -DataContextType MyUi.Preview.OrderPreviewVm -Theme dark
Invoke-Item (Join-Path $out 'snapshot.png')
# 多主题 × 多尺寸,返回含 matrix.json 与 overview.png 的目录
.\scripts\render.ps1 -AssemblyPath $ui -ViewType MyUi.Views.OrderView -Theme light, dark -Size 1280x800, 800x600
# 只截某个 x:Name 元素(另存 element.png)
.\scripts\render.ps1 -AssemblyPath $ui -ViewType MyUi.Views.OrderView -Element OrderGrid
# 修改前后对比:先渲染一次作为基线,改完再渲染一次
$before = .\scripts\render.ps1 -AssemblyPath $ui -ViewType MyUi.Views.OrderView
# …修改并重新构建业务项目…
$after = .\scripts\render.ps1 -AssemblyPath $ui -ViewType MyUi.Views.OrderView
.\scripts\compare-snapshots.ps1 -Before $before -After $after
# 按业务项目的预设渲染(先执行预设中的构建命令)
.\scripts\render.ps1 -Config C:\work\MyApp -Preset OrderList -Build
需要一次性定制视图创建过程时,可以用两步脚本:new-wpf-harness.ps1 生成临时工程,修改其中的 ViewFactory.cs,再用 invoke-wpf-render.ps1 渲染。全部参数、输出文件与退出码见 references/cli.md。
环境要求:
| 项目 | 要求 |
|---|---|
| 系统与 Shell | Windows;PowerShell 7+。-WindowHost 模式还需要交互式桌面会话 |
| .NET SDK | 能构建目标框架的 SDK,例如 .NET 8 / 9 / 10 SDK(也能构建 .NET Framework 目标) |
| 运行时 | .NET 宿主需要对应版本的 Microsoft.WindowsDesktop.App;.NET Framework 宿主需要对应版本的 .NET Framework(Windows 10 / 11 自带 4.8 / 4.8.1) |
| .NET Framework 引用程序集 | 已安装 Developer Pack,或可以访问 NuGet(SDK 会自动还原) |
| 目标程序 | .NET Framework 4.7.2 / 4.8 / 4.8.1 或 .NET 5 – 10 的 WPF;更早的 .NET Framework 程序集用 net472 宿主。不支持 .NET Core 3.x |
自查:dotnet --list-sdks、dotnet --list-runtimes | Select-String WindowsDesktop、$PSVersionTable.PSVersion。
flowchart LR
A["代理<br/>Codex / Claude Code"] -->|MCP 工具| B["MCP 服务器<br/>mcp/"]
U["命令行"] --> C
B --> C["scripts/render.ps1<br/>预设 · 缓存 · 多组合"]
C -->|生成或复用| D["临时宿主工程<br/>%TEMP%"]
D -->|独立 STA 进程| E["加载业务程序集<br/>创建视图 · 布局"]
E --> F["RenderTargetBitmap → PNG"]
E --> G["绑定监听 · 布局检查"]
F --> H["summary.json<br/>截图 · 结论"]
G --> H
H --> A
每次渲染都在一个新的临时进程中完成:
Application,挂上绑定监听,并用一条故意写错的绑定自检,确认监听确实有效。ViewFactory.cs),按模式完成布局:默认直接 Measure / Arrange;-WindowHost 时放进屏幕外、不激活、不显示在任务栏的窗口。RenderTargetBitmap 输出 PNG,遍历视觉树做布局检查,汇总成 summary.json。Application 使用 ShutdownMode.OnExplicitShutdown,所有工作在 Dispatcher 消息循环中异步执行,await 不阻塞 UI 线程。PresentationTraceSources.DataBindingSource 级别设为 Warning 并挂自定义 TraceListener;自检探针绑定到唯一标记路径 WpfRenderSelfCheck_<GUID>,只过滤这一条,其余告警全部记录。window-host 模式:窗口位于 (-20000, -20000),ShowActivated=false、ShowInTaskbar=false、WindowStyle=None、ResizeMode=NoResize,截取 Window.Content。ViewFactory.WaitUntilReadyAsync 返回后再执行一轮 ContextIdle + UpdateLayout,然后渲染 ceil(W×DPI/96) × ceil(H×DPI/96) 像素的位图。snapshot.png、manifest.json、layout.json、binding-errors.txt / .json、summary.json,以及构建与渲染日志。| 文档 | 内容 |
|---|---|
| SKILL.md | 代理工作流:何时用、怎么调用、如何读结果与报告 |
| references/cli.md | 全部脚本参数、渲染模式、输出文件与字段、退出码、尺寸与 DPI |
| references/integration.md | 接入业务界面:wpf-render.json、程序集与框架推断、DataContext 与 ViewFactory.cs、资源与主题、异步就绪 |
| references/steps.md | 交互步骤与动画取帧:动作类型、元素定位、等待、结果与限制 |
| references/verification.md | 产物验收、布局检查解读、视觉基线比较、故障定位、已知限制、性能验证边界 |
| CHANGELOG.md | 版本记录 |
.\tests\run-tests.ps1 # 全部端到端用例(需要 .NET 8 与 .NET 10 SDK)
.\tests\run-tests.ps1 -Quick # 只跑内置样例与松散 XAML
.\tests\run-tests.ps1 -Filter 'net472*' # 按名称筛选;-KeepArtifacts 保留产物
.\tests\validate-plugins.ps1 # 插件清单、版本号与 skill 链接一致性
dotnet run --project mcp/WpfRenderMcp.Tests -- --root . # MCP 客户端测试(非 Windows 上只测协议)
CI 在 Windows 上运行全部端到端用例(含 MCP),在 Linux 上运行 MCP 协议测试、插件清单检查与 claude plugin validate --strict。
修改行为时同步更新 SKILL.md、references/ 与本 README;SKILL.md 的 description 决定代理何时加载此 skill。发布新版本时同时修改 VERSION、两份插件清单与 mcp/WpfRenderMcp/WpfRenderMcp.csproj 中的版本号,并更新 CHANGELOG.md。
| 覆盖范围 | 用例 |
|---|---|
| 渲染模式、主题、DPI、衬底 | sample-light、sample-dark-dpi144、sample-window-host、sample-transparent |
| 免代码接入 | xaml-ok、net8-view、net472-view |
| 绑定错误检出与解析 | xaml-binding-error、net8-broken-binding、net472-broken-binding |
| 布局检查:五类问题全部检出、正常布局零误报 | net8-layout-problems、net472-layout-problems、net8-scroll-no-false-positive |
| 缓存、多组合、元素截图、前后对比 | render-cache、render-matrix、net8-element、net8-element-missing、compare-snapshots |
| DataContext 工厂与预设 | factory-method、factory-file、preset |
| MCP 服务器与 Stop hook | mcp-server、stop-hook |
| 框架 / 位数推断与拒绝 | net472-x86-view、sample-net10、reject-mixed-runtimes、reject-lower-tfm、reject-platform-conflict |
wpf-offscreen-render/
├── .claude-plugin/ # Claude Code 插件清单与市场清单
├── .codex-plugin/plugin.json # Codex 插件清单
├── .agents/plugins/ # Codex 市场清单
├── codex.mcp.json # Codex 插件的 MCP 服务器配置(不用 .mcp.json,避免打开本仓库时被当作项目 MCP 配置加载)
├── skills/wpf-offscreen-render/ # Agent Skill(两家共用)与 Codex 元数据
├── hooks/ # Stop hook:结束前渲染受影响视图
├── mcp/ # MCP 服务器、启动器、桥接脚本与客户端测试
├── scripts/ # render / compare / 生成器 / 执行器 / 图像工具 / 项目授权(trust-project)
├── assets/ # 渲染宿主模板(Program、ConfiguredView、Diagnostics、Json、ViewFactory)
├── templates/ # 业务项目接入模板
├── references/ # 详细文档
├── tests/ # 端到端测试、插件清单检查与样例程序集
├── docs/images/ # README 截图
└── VERSION / CHANGELOG.md
assets/ 是宿主模板,不要在仓库里改成某个业务页面;业务定制放在业务仓库(factoryFile)或生成出来的临时工程里。
Loaded 中的副作用。%TEMP%,不写入业务仓库;缓存超过 7 天未使用会自动清理。build 是参数数组,不经过 shell;只在调用方显式要求构建时执行。trust-project.ps1 授权过的配置生效,配置修改后授权自动失效。render_view、render_matrix、compare_snapshots、self_test)不声明只读,代理客户端会按正常的工具审批流程处理。