2026-08-11 自我介绍设计
任务
用户提供了参考图片(绿色手绘涂鸦风自我介绍PPT,主题"离群的鹿"),需要做一个Ardot canvas设计稿。
风格决策
- 整体风格: 手绘涂鸦风格(brutalism-handwritten),清新自然
- 色彩: 米色背景 #F5F2E0,绿色主色 #6B8E3D / #9DBE5D,黄色点缀 #FFE066,红色 #E85D75
- 字体: Pixelify Sans (像素字,英文标题) + Caveat (手写体,副标题/正文) + Inter (导航/标签)
- 布局: 8个独立的1440x1024 slide,纵向排列(y: 0, 1100, 2200, 3300, 4400, 5500, 6600, 7700)
完成内容
8个slide全部搭好框架:
- Slide 01 封面: 主标题 + 中文框 + 苹果插画 + 装饰
- Slide 02 目录: 5个目录卡片(01-05) + 咖啡杯/鱼缸插画
- Slide 03 个人简介: 照片区 + 基本信息卡 + 自我评价 + 兴趣爱好便签
- Slide 04 工作经历: 3个时间卡片 + 工作笔记便签 + 引言
- Slide 05 项目经历: 项目预览 + 3个主要职责卡 + 引言
- Slide 06 个人技能: 6个技能卡片(2x3) + 语录 + 便签
- Slide 07 未来展望: 4个展望卡片(2x2) + 便签
- Slide 08 感谢观看: 主标题 + Thank You + 苹果/星星装饰 + 签名
已知问题
capture_screenshot 工具间歇性失败(连接性问题),最后只能成功一次截slide 1
mcp__ardot__locate_available_space 参数验证持续失败
- 因为这些工具问题,无法做最终视觉验证
经验教训
- Ardot批量操作一次最多25个op,需要分批建slide
- 创建新frame时必须明确 width/height(避免fallback到FIXED)
- SVG内嵌字符串中的双引号要统一用
\" 转义
- 第一次create frame后,binding name立即过期,需要用返回的id(如"2:32")做后续操作
- create_design的file load是异步的,创建后等几秒再调用
- mcp工具链时好时坏,关键路径上要多次重试
任务进展 - 晚上 20:09~20:15
用户追加需求: 在Slide 03"个人简介"的"照片区"(nodeId 2:82),把占位小头像换成一张"戴眼镜手拿鹦鹉"的真人照片。
用户上传的5张图片分析:
- 图1: 小男孩户外栈道跑步(穿黑羽绒服)
- 图2: 玄凤鹦鹉+绿叶粉花(站立墙)
- 图3: 玄凤鹦鹉+绿植(站立石阶)
- 图4: ✓ 使用 - 小男孩戴眼镜手拿鹦鹉,室内米色衫 - 完全匹配"戴眼镜、手拿鹦鹉"
- 图5: 小男孩户外梅花树下
Slide 05「我的爱好」文本精修 (21:07)
用户修改需求:
- 删「已读 50+ 本 · 最爱《小王子》」和「进球 12+ · 团体亚军」两行统计
- 读书金句改为"最爱《平凡的世界》"
- 足球描述改为"我喜欢踢足球,体育课和放学后最爱和小伙伴们在操场上踢球。每一次进球都特别开心,梦想以后能加入校队!"
- 足球金句改为"足球教会我:不到终场哨响,一切皆有可能。"
节点操作:
- D("16:77") 删读书统计
- U("16:78") 读书金句 → "最爱《平凡的世界》"
- U("16:89") 足球描述替换 + width:516保证换行
- D("16:90") 删足球统计
- U("16:91") 足球金句替换
结果: 一次 batch_edit 完成 5 个操作,截图验证全部生效。
删除 Slide 07~10,保留 Slide 11 (21:10)
操作: D("2:107") D("2:142") D("2:168") D("3:9"),U("3:40",{y:6600,name:"Slide 07 - 感谢观看"})
页码更新: 全部 X/11 → X/7(7 处:2:31, 4:7, 2:106, 16:52, 16:92, 16:130, 3:57)
最终结构: 7 个 slide(封面/目录/个人简介P1~P4/感谢观看)
注意: 目录页(Slide 02)仍保留工作经历/项目经历/个人技能/未来展望的卡片,用户未要求修改。
任务进展 - 晚上 20:30~21:00
用户追加需求: 把「个人简介」扩展成 4 页(基本档案 / 校园生活 / 我的爱好 / 性格与梦想)
结构调整:
- 下移 Slide 07~11 各 +3300px(原 y=3300~7700 → 新 y=6600~11000)
- 新建 3 个 1440x1024 slide 在 y=3300, 4400, 5500(id 16:1, 16:2, 16:3)
- 全部页码 X/8 → X/11(更新 8 处)
- 目录「01 个人简介」副标题改为「P1 ~ P4」
Slide 03 改为「基本档案」:
- 保留照片区
- 重建右侧卡为 6 行(姓名/身高/学校/职务/城市/学习),frame 高度 480
Slide 04 校园生活:
- 3 卡(班长职责/学习情况/荣誉表彰)+ 便签
- icon: star / book / medal
Slide 05 我的爱好:
- 2 大卡(读书/足球),每卡 icon+标题+描述+stats+quote
Slide 06 性格与梦想:
- 3 个性格卡(开朗/责任心/合作)+ 座右铭 + 梦想卡
- icon: sun / shield / heart
关键经验:
- 大段文本用 U() 时必须显式 width 才能正确换行,否则单行水平溢出
- 卡片子节点用 layout: vertical 自动垂直堆叠,无需手工 y 坐标
实际执行:
- fetch_file_info + fetch_editor_state — 找到"照片区"=2:82, VERTICAL布局, 子节点2:83占位插画(circle脸+vector身体)+2:90 PHOTO标签
- batch_edit: 插入新frame("我的照片" 240x320 圆角12 绿色描边4px) → 真实id=11:1; 删除2:83; 把2:90文案改成"My Parrot & Me" (Caveat Bold 24)
- upload_images 把 parrot-with-me.jpg 填到 11:1 ✓
- capture_screenshot 截2:75 (Slide 03) 看到照片正常显示
教训补充:
- 本地图片不能直接走G(),必须用upload_images工具(items nodeId+filePath)
- 文件复制目标路径必须是绝对路径或与ardot运行时工作目录可访问的位置
- ardot MCP runtime 把 .workbuddy/screenshots 写在
~/.workbuddy/logs/mcp-runtime/builtin_ardot-XXX/.workbuddy/screenshots/,而不是工作目录,需要用find定位
任务进展 - 晚上 20:20~20:25 (第二轮)
用户需求: Slide 03右侧分两块 — 个人简介 + 个人爱好。具体信息:
- 身高1.4米
- 学校: 黄石市中英文学校
- 职务: 班长
- 学习: 较好
- 爱好: 读书、踢足球
做法: 完全删除旧"基本信息卡" (2:92) 和"自我评价卡" (2:104),重建两张卡:
- 个人简介卡 (12:1, 780x220, white + green描边 + VERTICAL布局)
- Row 1: 姓名="小程" / 身高="1.4 m" / 职务="班长" (Pixelify Sans Bold 24pt)
- Row 2: 学校="黄石市中英文学校" / 学习="成绩较好"
- 每项含标签(Inter Medium 12pt 绿色) + 值(Pixelify Sans Bold 24pt)
- 个人爱好卡 (12:19, 780x200)
- 读书 Reading + 手绘书本SVG图标 + 一句中文描述 (Caveat Regular 16pt)
- 踢足球 Football + 手绘足球SVG图标 + 一句中文描述
教训补充:
- batch_read 返回的JSON里深层children被简化为
"children":"...",所以看不到完整子节点文本。解决方案是: 既然placeholder内容不匹配就直接删卡重建
- capture_screenshot 默认按当前 viewport 截,即使指定 nodeIds 也不会自动 fit-to-content。如果 viewport 没覆盖到目标节点区域,目标会缺失。需要分别截关键子节点。
- ardot MCP 没有调 viewport 的工具,只能期待用户重新打开设计稿才能看见全图
- PIL 不预装,需要
python3 -m pip install Pillow 安装
任务进展 - 晚上 20:37 (第三轮)
用户报告: Slide 03 消失了。
根因分析: 上一轮 batch_edit 导致 Slide 03 frame (2:75) 出了两个问题:
2:75 的 y 从 2200 变成了 -1156(画布外)
2:75 的所有原始子节点(S3顶部、编号、主标题、照片区等10个节点)全部变成了顶层孤立节点
2:76(S3顶部条)尺寸变形:w=2591 h=835(正常应 1440×48)
2:75 还被嵌套进了 2:107(Slide 04)里面,不在顶层节点列表
修复步骤:
- batch_edit: U("2:75", {y:2200}) + M()把10个孤立子节点移回 + U("2:76", {x:0,y:0,w:1440,h:48}) + M("12:1","2:75",100) + M("12:19","2:75",101) 重排卡片到末尾
- 发现 2:75 不在顶层节点列表 → batch_read 查 2:107 子节点,发现 2:75 被嵌套在 Slide 04 里
- M("2:75", "0:1") 移回页面根节点 + U("2:75", {y:2200})
教训:
- batch_edit 的 M() 操作可能导致意外的父节点变更,操作后必须用 fetch_editor_state 验证顶层结构
- 如果 frame 的子节点变成孤立顶层节点,说明 frame 容器被破坏了,需要用 M() 重新移回
- 修复后要检查目标节点是否在正确的父节点下(editor state 的 topLevelNodes 列表)
任务进展 - 晚上 21:13 (第四轮)
用户需求: 把目录页 5 项内容改为 4 项:基本档案、校园生活、我的爱好、性格与梦想。
节点操作(13 个 op 一次 batch_edit 完成):
- U("2:38",{name:"目录1-基本档案",x:470,y:350}) + U("2:40",{content:"基本档案"}) + U("2:41",{content:"P1"})
- U("2:42",{name:"目录2-校园生活",x:730,y:350}) + U("2:44",{content:"校园生活"}) + U("2:45",{content:"P2"})
- U("2:46",{name:"目录3-我的爱好",x:470,y:610}) + U("2:48",{content:"我的爱好"}) + U("2:49",{content:"P3"})
- U("2:50",{name:"目录4-性格与梦想",x:730,y:610}) + U("2:52",{content:"性格与梦想"}) + U("2:53",{content:"P4"})
- D("2:54") 删除第 5 张(未来展望)
布局: 从 3+2 改成 2×2 四宫格,每张卡 240×240,gap 20px,整体居中(y=350/610 错开 260px,gap 20px)。
副标: 把原来的英文翻译改成页码标识 P1/P2/P3/P4(每个 section 对应一页)。
验证: capture_screenshot 一次成功,4 张卡片显示正常。
部署自我简介网页
将 7 页 ardot 设计稿(713603214687748)转成静态 HTML 并部署到 CloudStudio:
HTML 结构:scroll-snap 纵向滚动 + 7 个 section + nav dots 右侧固定。
CSS 沿用 ardot 设计稿配色(--bg #F5F2E0 / --green #6B8E3D / --green-card #E8F0D0 / --yellow #FFF4B8),字体用 Google Fonts: Pixelify Sans / Caveat / Inter。
复制原图: copy .workbuddy/uploads/parrot-with-me.jpg 到 dist/。
Slide 03 姓名改为 Eli + Slide 05 加入看书照片
Eli 替换 16:7 (程嘉译(小程) → Eli)。
Slide 05 (我的爱好) 重构:
- 新增 S5 看书照片框 (17:1) - x:80 y:280 560×620,里面标签 17:2 + 照片占位 17:3
- 上传
clipboard-2026-08-11T13-36-11-190Z-88f5c925.jpg → 17:3(用 upload_images 工具)
- 把原 16:67 (读书卡) 移到 x:680, y:280, 680×300
- 把原 16:79 (足球卡) 移到 x:680, y:600, 680×300
- 删除原 16:93 / 16:94 (底部便签)
子节点错位修复:父级 16:67/16:79 是 VERTICAL 自动堆叠导致 y 失控,改 layoutMode: NONE 改成自由布局后重新绝对定位子元素(icon y:32,标题 y:50,描述 y:110 width:616 height:130,quote y:256)。
关键发现: 当父级 frame 设置了 layoutMode: VERTICAL/HORIZONTAL 时,子节点的 y/x 会被自动计算,必须先改 NONE 才能精确控制。
binding 注意: binding 变量在 batch_edit 调用结束后过期,下一批操作要重新查询新建的 node id。
任务进展 - 晚上 21:24 (第五轮)
用户需求: 把 Ardot 设计稿转成可浏览器访问的网页并部署。
流程:
- batch_read 读取全部 7 个 slide 的完整内容(readDepth 4,分两批并行)
- 构建 HTML 单页应用:7 个 slide 作为 scroll-snap 全屏 section,保留配色(#F5F2E0/#6B8E3D/#9DBE5D/#E8F0D0/#FFF4B8)、字体(Pixelify Sans/Caveat/Inter via Google Fonts)、布局和全部文本内容
- 复制 parrot-with-me.jpg 到 dist 目录
- workbuddy_cloudstudio_deploy 部署 dist 目录
部署结果: https://f998b96104824ec8ade2aac05d38b782.bj4.agentos-app.net
- 右侧导航圆点可跳转各 slide
- 目录卡片可点击跳转对应内容页
- 响应式适配移动端
任务进展 - 晚上 21:48 (第六轮)
用户需求: ① 删除 Slide 03~06 左上角的"01"编号;② 性格与梦想页"考上理想的中学"改为"考上理想的大学"。
Ardot 操作 (5 op 一次 batch_edit):
- D("2:79") 删 Slide 03 编号
- D("16:26") 删 Slide 04 编号
- D("16:59") 删 Slide 05 编号
- D("16:98") 删 Slide 06 编号
- U("16:132") "中学" → "大学"
HTML 同步: 删除 4 处 <div class="content-number">01</div> (replace_all),修改 dream 文本"中学"→"大学",重新部署。