用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/SunnyBoy-y/LearnGraph --skill frontend-build-preview命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
沙箱子代理的编排与调用(sandbox_subagent / _status / _wait / _cancel / _retry)——何时委派、收益门、Context Pack、写集、结构化交付与主代理接管。
沙箱工作区文件的定位、检索、分页读取、精确编辑与安全删除(sandbox_* 文件工具)。
端到端 PPT 生成助手(LearnGraph 官方技能):把"人类顶级 PPT 团队"的工作流——需求调研→大纲→资料检索→策划稿→整页 SVG 设计——固化成流水线,产出可拖进 PowerPoint 编辑的 1280×720 整页 SVG 幻灯片 + 网页预览 + 原生 .pptx。 当用户想做/生成/制作一套 PPT、幻灯片、演示文稿、slides、deck,或要为汇报/答辩/路演/组会/ 课堂/产品介绍准备演示,或说"用 ppt-agent"、"帮我做个关于 X 的 PPT"、"把这个主题做成幻灯片" 时触发。全程两道人审关口(需求、大纲,用 canvas 确认卡交互),其余自动;调研走 LearnGraph 门控网页抓取 (fetch_web_page / 外部搜索通道)与 search_images,配图/示意图用 generate_image 生成并以 base64 内联, 出片在离线沙箱内执行 build_preview.py / build_pptx.py,视觉 QA 用 document-conversion 渲染逐页检查, 交付经 sandbox_publish_file 发布 .pptx 与 preview.html。确认后自动产出**每个色块/文字/线条都是原生 PowerPoint 形状、打开即可改字改色**的 .pptx;若起点是已有 .pptx 模板、或要做幻灯片级 OOXML 增删/ 文本提取,请改用 LearnGraph 内置 pptx-generation 技能。
正在显示 SKILL.md
| name | frontend-build-preview |
| description | 离线创建 Vite/React/Vue 项目、构建静态产物并渲染 PNG/PDF 预览;发布双向交互子应用(含官方 __lgSubapp SDK 埋点与数据分析契约)。 |
npm run build 出 dist/,再渲染 PNG/PDF 做视觉验收,或准备发布。sandbox_publish_web_app / sandbox_publish_file 分享。build_frontend.py 在项目目录执行构建(Vite/React/Vue/HTML 均可),产物在 dist/。scaffold_vite.py 生成最小可构建项目(react/vue/html 模板),再构建。render_preview.py 把 dist/index.html 渲染为 PNG/PDF 视觉验收。dist/ 打包或用 sandbox_publish_web_app 分享(本 Skill 只产出,发布由宿主工具完成)。当产物是多文件交互应用(表单、练习、行程/学习规划器、问卷、自测题)且需要"用户操作 → Agent 回写状态"的循环时,用 sandbox_publish_web_app 并携带 interaction_contract,让它成为双向交互子应用(不是静态预览)。
window.__lgSubapp 上报事件和读取状态;禁止手写 postMessage、禁止调用 window.component.event、禁止自定义 learngraph:* 消息协议。SDK 已由宿主在页面加载时自动注入(__lgSubapp),无需引入任何外部文件。event_schema 描述的是业务字段(如 {question_id, selected}),绝不包含 type 字段——事件类型由 SDK 的 emit(type, data) 第一个参数指定,宿主自动路由。answer.submitted)才允许配置 agent_triggers;高频埋点(输入、切换、滚动)只能进 analytics,永不触发 Agent。// 上报一条语义事件(返回 Promise,persisted ACK 后 resolve)
await __lgSubapp.submit('answer.submitted', { question_id: 'q1', selected: '链地址法' });
// 上报埋点(不触发 Agent)
__lgSubapp.track('field.changed', { field_id: 'q2', filled: true });
// 订阅 Agent 推送的状态(含版本号)
__lgSubapp.onState((state, version) => { /* 渲染反馈 */ });
// 订阅通道状态(ready / persisted / rejected / retrying)
__lgSubapp.onStatus((status, detail) => { /* 页面显示"正在发送/已提交/重试中" */ });
// 触发"数据分析"(内置分析入口,见第 4 节)
__lgSubapp.requestAnalysis('找出反复修改和停留最长的题目');
页面不要在 SDK 就绪前假装"已提交":只有 onStatus('persisted') 之后才能把按钮状态标绿;retrying 显示"正在重试",rejected 显示失败原因。
sandbox_validate_web_app(output_root, entry_path) 校验产物,拿到 validation_id。learngraph.subapp.json(见第 3 节示例),再 sandbox_validate_interaction_contract(path) 校验,拿到通过结果。sandbox_publish_web_app(validation_id, title, contract_path) —— 传 contract_path,不要把几百行的 JSON Schema 内联进工具参数(内联极易因转义/截断产生 invalid_tool_arguments,且无法给出精确错误位置)。subapp_mode:true 与 artifact_version_id,聊天卡片会实例化为隔离 iframe 的双向子应用。subapp_observe 观察事件(返回里含 session_state_version);用 subapp_patch_state(session_id, state, expected_version) 推送新状态(expected_version 用 subapp_observe 返回的 session_state_version,乐观锁冲突时重读重试)。learngraph.subapp.json 契约示例{
"event_schema": {
"type": "object",
"additionalProperties": false,
"required": ["question_id", "selected"],
"properties": {
"question_id": { "type": "string" },
"selected": { "type": "string" }
}
},
"state_schema": {
"type": "object",
"additionalProperties": false,
"required": ["view"
约束速查:event_schema / state_schema 必须是顶层闭包 object(additionalProperties:false),深度 ≤16、节点 ≤1000、体积 ≤64KiB;禁止外部 $ref、pattern、HTML/JS 内容字段(html/script/srcdoc 等);agent_triggers.event_type 是小写事件标识(^[a-z][a-z0-9_.-]{0,119}$),去重,mode 只能 explicit;analytics.privacy 取 session|workspace|none。
app.opened / view.changed / field.changed / choice.selected / step.completed / hint.requested / answer.submitted / analysis.requested / app.closed。不要用页面文案当事件名。answer.submitted 里只放结构化答案;不采集密码、token、cookie、DOM 全量、键盘逐键记录;自由文本只随显式提交发送。__lgSubapp.requestAnalysis(purpose) 或用户在卡片点"数据分析"按钮,都会以结构化消息发给 Agent;Agent 用 subapp_analyze_events 读取埋点并生成定制指导。普通埋点永不自动触发 Agent。__lgSubapp.*,无手写 postMessage / window.component.eventevent_schema 不含 type 字段agent_triggers 只列显式提交事件sandbox_validate_interaction_contract 且通过contract_path(或极简内联契约)persisted 前不显示"已提交"何时不用契约:静态展示页面、单文件网页/图片、下载型产物一律不带 interaction_contract——它们走静态预览或 sandbox_publish_file。
| 脚本 | 用途 |
|---|---|
scaffold_vite.py | 生成最小 Vite 项目(react/vue/plain-html) |
build_frontend.py | 在项目目录执行构建(自动选命令) |
render_preview.py | 把 dist/ 渲染为 PNG/PDF |
check_static_assets.py | 校验 dist/ 清单与无外链资源 |
scaffold_vite ──> 项目/ ──build_frontend──> dist/ ──render_preview──> preview.png
已有源码 ──build_frontend──> dist/ ──check_static_assets──> 清单.json
dist/ + lerarngraph.subapp.json ──(宿主 sandbox_publish_web_app contract_path)──> 双向子应用
npm install(依赖已预装进镜像的 /node_modules)、不下载字体/CDN。check_static_assets 会校验。__lgSubapp 通道;不信任任何 iframe 内自建的"上报通道"。组合配方见 references/best-combinations.md,输入/输出契约见 references/input-output-contract.md,常见失败见 references/troubleshooting.md。每个脚本的完整用法见 scripts/*.md。