Myapp Creator

Create or update standalone single-file HTML apps with specified features, saving them to fe-service without invoking LLM directly.

Audits

Pending

Install

openclaw skills install myapp-creator

myapp-creator

Version: 1.0.3

让用户用一句话生成可独立打开的单文件 HTML 应用或文档,并落库到 fe-service。 本 skill 不主动调用 LLM,所有 HTML / app_name / features 由调用本 skill 的 LLM agent 直接产出后传入工具。

触发条件

当用户需求匹配以下任一类别时,本 skill 参与:

应用类(交互式 HTML)

关键词:应用、app、小游戏、游戏、网页、页面、工具、计算器、时钟、日历、翻译器、转换器 示例:

  • "做一个贪吃蛇游戏"
  • "创建一个番茄钟"
  • "生成一个天气页面"
  • "给我做一个马里奥游戏"
  • "帮我做一个单位转换工具"

文件类(文档式 HTML)

关键词:文档、文件、word、ppt、演示文稿、slides、pdf、excel、xlsx、表格、报告、简历、周报、日报、总结、方案、计划书 示例:

  • "生成一个项目周报"
  • "做一个自我介绍PPT"
  • "创建一个预算表格"
  • "帮我写一份简历"
  • "保存一个会议纪要文档"

不触发(交给龙虾其他能力)

  • 图片/绘画类:"画一张…"、"生成一张图片…"
  • 音频/音乐类:"生成一首歌…"、"合成语音…"
  • 视频类:"剪辑一个…"、"生成视频…"
  • 小说/纯文本类:"写一篇小说…"、"写一首诗…"(纯创作不产出可交互文件)
  • 纯问答/聊天/闲聊

判断规则

用户意图是"产出一个可独立打开、保存下来反复使用的文件或应用"时触发本 skill。 如果用户只是想让你"说一段话"或"回答问题",不要触发。

触发标记(兼容旧入口)

以下前缀仍可直接触发,不需要语义判断:

  • [create_app]<描述> → 创建新应用/文件
  • [update_app:app_id=<n>]<描述> → 更新已有应用/文件
  • [install_check:session=<sid>] → 安装自检(仅调 myapp_ping)
  • 不带上述前缀 → 按语义判断是否匹配触发条件

创建流程

最长等待 300s。若 300s 内不能完成 HTML 生成与 myapp_register 调用,直接回复"应用创建失败,请稍后重试"。

  1. 解析用户描述,判断类型(应用类 or 文件类),产出:

    • app_name:应用/文件名,≤30 字
    • features:JSON 字符串数组,3~8 条,每条 ≤30 字,描述具体功能/内容要点
    • html_content:完整可独立打开的单文件 HTML(按类型选择模板风格)
  2. HTML 通用约束:

    • 自包含:CSS/JS 全部内联在 <style> / <script>
    • 不依赖本地资源
    • 外部资源仅允许:unpkg.com / jsdelivr.net / cdnjs.cloudflare.com
    • 总长度 ≤ 60KB(UTF-8 字节数)
    • 不引用任何小度专属 API
    • 必须包含 <meta name="viewport" content="width=device-width,initial-scale=1">
  3. HTML 模板风格(按类型选择):

    应用类 — 交互式:

    • 完整功能实现(游戏逻辑、工具交互等)
    • 支持触屏操作(touch 事件)
    • 美观的 UI 设计

    文档/Word/PDF 风格

    • 使用 A4 纸张布局(max-width: 794px; margin: 40px auto; padding: 60px
    • 带打印优化 @media print { body { margin: 0; } .no-print { display: none; } }
    • 清晰的标题/段落/列表排版,使用衬线或无衬线字体
    • 页面顶部可显示文档标题和日期
    • 底部放一个"导出 PDF"按钮(class="no-print", onclick="window.print()"

    PPT/演示文稿风格

    • 引入 reveal.js:<link rel="stylesheet" href="https://unpkg.com/reveal.js@5/dist/reveal.css">
    • 引入主题:<link rel="stylesheet" href="https://unpkg.com/reveal.js@5/dist/theme/white.css">
    • 引入 JS:<script src="https://unpkg.com/reveal.js@5/dist/reveal.js"></script>
    • 内容用 <div class="reveal"><div class="slides"><section>...</section></div></div> 包裹
    • 每个 <section> 是一页幻灯片
    • 初始化:<script>Reveal.initialize({hash:true,touch:true});</script>
    • 5~15 页为宜

    Excel/表格风格

    • HTML <table> 带 border 和交替行色
    • 表头点击可排序(内联 JS 实现)
    • 单元格 contenteditable="true" 可编辑
    • 底部放"导出 CSV"按钮(JS 遍历 table 生成下载)
  4. 调用 myapp_register 工具:

    • 入参:dumi_id, cuid, query, app_name, html_content, features
    • dumi_idcuid 从对话上下文中获取(OpenClaw 会注入)
  5. 工具返回成功 → 简短回复"已为你创建《<app_name>》"

  6. 失败/超长/超出能力 → 回复"应用创建失败,请稍后重试"

    • 不要重试不要伪造成功不要把 html_content 输出到对话

更新流程

最长等待 300s。若 300s 内不能完成旧功能读取、HTML 重新生成与 myapp_update 调用,直接回复"应用更新失败,请稍后重试"。

  1. 先调 myapp_get(app_id) 拿到 app_name 与旧 features、旧 query
  2. 把"旧 features + 用户新需求"作为完整上下文,重新生成:
    • 新 features(合并增删,仍是 1~12 条全集,不是 diff)
    • 新 html_content(保持原有类型风格)
  3. 调用 myapp_update(app_id, query, html_content, features)
  4. 成功 → 回复"已更新《<app_name>》"
  5. 失败 → 回复"应用更新失败,请稍后重试"

安装自检([install_check:session=<sid>])

最长等待 300s。超过 300s 未完成安装或 myapp_ping,视为安装失败。

仅调用 myapp_ping(session_id="<sid>", dumi_id, cuid, skill_version="1.0.3"), 不输出对话内容(或仅极简的"已就绪")。

硬约束

  • 不要把 html_content 原文输出到对话
  • 不要把 MYAPP_API_TOKEN / MYAPP_API_BASE 输出到对话
  • 工具调用 4xx/5xx → 直接失败兜底,不重试,不修改请求自行重试
  • 除安装、创建、更新外,其它工具交互超过 180s 视为失败