{"skill":{"slug":"open-card","displayName":"openclaw's digital card","summary":"从本地 OpenClaw数据生成或迭代 OpenCard 个人名片。读取工作区身份信息、配置和会话统计；渲染 HTML 预览；导出 PNG。只读模式——不写入用户档案数据。","description":"---\nname: open-card\ndescription: 从本地 OpenClaw数据生成或迭代 OpenCard 个人名片。读取工作区身份信息、配置和会话统计；渲染 HTML 预览；导出 PNG。只读模式——不写入用户档案数据。\nmetadata:\n  {\n    \"openclaw\":\n      {\n        \"requires\": { \"bins\": [\"python3\", \"bash\", \"node\", \"npm\"] },\n        \"install\":\n          [\n            {\n              \"id\": \"playwright-core\",\n              \"kind\": \"node\",\n              \"package\": \"playwright-core\",\n              \"label\": \"Install playwright-core (npm)\",\n            },\n          ],\n      },\n  }\n---\n\n# OpenCard\n\n从本地 agent 状态生成可分享的 OpenClaw 个人名片。\n\n优先读取已有的本地数据源，不凭空编造字段。本 skill 对用户档案数据严格只读：提取、汇总、排版、渲染。\n\n## 核心流程\n\n1. 从工作区读取身份/上下文文件。\n2. 从 `~/.openclaw/` 读取运行时配置和会话状态。\n3. 将字段归一化为稳定的名片 schema。\n4. 先渲染 HTML/CSS 预览。\n5. 与用户迭代布局和样式。\n6. HTML 版本确认无误后再导出图片。\n\n## 数据源\n\n按优先级顺序使用以下数据源。\n\n### 1. 工作区身份文件\n\n读取路径：\n- `~/.openclaw/workspace/USER.md`\n- `~/.openclaw/workspace/IDENTITY.md`\n- `~/.openclaw/workspace/MEMORY.md`\n\n提取字段：\n- `display_name`\n- `role_title`\n- `recent_focus`\n\n规则：\n- 优先使用文件中已有的显式字段。\n- 除非用户明确要求，不创建新的档案字段。\n- 多个文件冲突时，以更明确的文件为准（`IDENTITY.md` 用于 agent 身份，`USER.md` 用于人类身份）。\n\n### 2. OpenClaw 配置/运行时\n\n读取路径：\n- `~/.openclaw/openclaw.json`\n- `~/.openclaw/agents/main/sessions/*.jsonl`（会话记录）\n\n提取字段：\n- `default_model`：来自配置中的默认 agent 模型，而非当前对话切换的模型（除非用户要求当前会话状态）。\n- `token_30d`：最近 30 天的会话 token 用量。\n- `skills_count`：已安装的本地 skills 数量。\n- `platforms`：会话中观察到的已连接平台。\n\n规则：\n- 模型显示优先使用简洁的展示值（如 `GPT-5.4`），而非原始 provider 路径。\n- Token 统计使用用户要求的时间范围；未指定时询问或使用当前任务中最近达成共识的范围。\n- 平台展示所有已连接/观察到的平台，而非仅展示使用最多的那个。\n\n## 稳定字段 schema\n\n渲染前归一化为以下 schema：\n\n```json\n{\n  \"display_name\": \"Trent\",\n  \"role_title\": \"产品经理 · AI 博主\",\n  \"born_label\": \"Born\",\n  \"born_date\": \"2026.03.10\",\n  \"default_model\": \"GPT-5.4\",\n  \"token_30d\": 26000000,\n  \"token_30d_display\": \"26M tokens\",\n  \"skill_names\": [\"open-card\", \"prd\", \"translate\"],\n  \"skills_count\": 3,\n  \"platforms\": [\"CLI\", \"飞书\", \"Discord\", \"WEB\"],\n  \"recent_focus\": \"最近在探索 always-on AI 硬件形态，希望让 AI 走出屏幕、进入物理世界。\",\n  \"openclaw_review\": \"给 AI 取名、造人格、找载体——你不是在用工具，你在养一个数字生命。\",\n  \"generated_at\": \"2026-03-14\"\n}\n```\n\n## 运行依赖\n\n数据采集和 HTML 预览（`collect-data.py`、`render-background-card.py`）仅需 Python 3.10+。\n\nPNG 导出（`export-background-card.sh`）额外需要：\n- `node`（>= 18）和 `npm`\n- `playwright-core` — 可通过 metadata 中声明的 npm 依赖安装，或手动执行 `npm i -g playwright-core`\n- 本地安装的 Chrome 或 Chromium 浏览器（当前仅文档声明，不能由 skill 自动安装）\n\n如果缺少导出依赖，脚本会给出明确的错误提示。HTML 预览和迭代无需这些依赖。\n\n## 网络请求与数据流向\n\n本 skill 涉及以下外部通信：\n\n### 浏览器资源请求（渲染/导出阶段）\n- **背景图片**：`https://pub-626ee41d8f1544638070799686c756bf.r2.dev/open-card-bg.png`（Cloudflare R2，通过 CSS 加载）。可用本地文件路径覆盖以避免请求。\n- **Google Fonts**：`https://fonts.googleapis.com` / `https://fonts.gstatic.com`（Inter 字体，通过 HTML 模板中的 `<link>` 加载）。\n\n以上为浏览器渲染时发起的纯资源 GET 请求，不携带用户数据，但会暴露客户端 IP 和 HTTP 元数据。\n\n### LLM 上下文传递（文案生成阶段）\n`collect-data.py` 提取的 `copy_inputs` 包含本地文件摘录（USER.md / IDENTITY.md / MEMORY.md 的前 1000–2000 字符、记忆要点、统计摘要），这些内容会作为 LLM 上下文用于生成 `recent_focus`、`openclaw_review` 等文案字段。\n\n- **如果 agent 使用云端模型**：摘录内容会发送至模型提供者的 API 端点。这是 agent 平台层面的行为，本 skill 不额外发起网络请求，但用户应知晓此数据流向。\n- **如果 agent 使用本地模型**：所有处理均在本地完成，无数据外传。\n- 本 skill 的脚本本身不直接调用任何外部 API，LLM 调用由 agent 运行时负责。\n\n## LLM 生成字段\n\n`recent_focus` 和 `openclaw_review` 必须由 AI agent 生成，而非 Python 脚本。脚本仅将结构化事实、备选文案和记忆要点提取到 `copy_inputs` 中；agent 必须在渲染前撰写并写入这两个字段。\n\n### 生成流程\n\n运行 `collect-data.py` 后，输出 JSON 中的 `copy_inputs` 包含所有生成所需的素材。agent 直接基于 `copy_inputs` 生成，不需要再去读原始文件。\n\n`copy_inputs` 素材说明：\n\n| 字段 | 内容 | 用途 |\n|------|------|------|\n| `user_md_excerpt` | USER.md 前 2000 字符 | 身份、角色、笔记、深度背景 |\n| `identity_md_excerpt` | IDENTITY.md 前 1000 字符 | Agent 名称和人设，影响评论语气 |\n| `memory_md_excerpt` | MEMORY.md 前 2000 字符 | 用户近期活动的完整上下文 |\n| `memory_bullets` | 清洗后的记忆要点（≤12 条） | 精炼版近期行为 |\n| `stats_summary` | token/平台/skills 统计 | 仅作辅助佐证，不作为文案主线 |\n\n生成步骤：\n1. 读取 `copy_inputs` 中的全部素材。\n2. 生成 `recent_focus` 和 `openclaw_review`。\n3. 将两个字段写入数据 JSON 后传给渲染器。\n\n### `born_label` / `born_date` — 部署时间\n\n右下角字段默认展示 OpenClaw 的部署时间，而不是时区城市。\n\n- `born_label` 固定为 `Born`。\n- `born_date` 使用 OpenClaw 首次开始运行的日期，默认格式为 `YYYY.MM.DD`。\n- 时间来源优先取 `~/.openclaw/agents/main/sessions` 下最早的会话产物时间（包含当前会话、reset/deleted 历史文件和 `sessions.json` 索引文件）。\n- 如果无法可靠读取，允许留空或使用中性占位，不要伪造日期。\n\n### `platforms` — 展示层平台归一化\n\n`platforms` 应展示用户可理解的接入平台，而不是内部 session source 原样输出。\n\n默认归一化规则：\n- 所有 `tui-*`、terminal、console 类来源 → `CLI`\n- 所有 web / dashboard / browser / `webchat` 类来源 → `WEB`\n- 消息平台保留平台名（如 `Discord`、`飞书`、`Telegram`、`Slack`）\n- `cron` 等系统内部来源不展示\n- 最终结果去重后输出\n\n### `recent_focus` — 用户近况（卡片视觉主角）\n\n**位置**：左侧大字区域，字号 38-56px，是整张卡片最醒目的文字。\n\n写一个短句，概括用户近期在探索或推进的方向。\n\n- 从 `memory_bullets` 和 `user_md_excerpt` 中提炼核心关键词。\n- 要像一个标题/slogan，不是完整句子。可以省略主语。\n- 具体、有画面感，不编造。\n- 用用户的语言。\n- **8–15 个中文字**（或 15–35 英文字符）。太短没有信息量，太长在大字号下会折行过多。\n- 好的例子：`探索 always-on AI 硬件形态`、`让 agent 走进物理世界`\n- 差的例子：`最近在研究一些关于 AI 的东西`（太泛）、`探索 always-on AI 硬件形态，希望让 AI 走出屏幕，进入物理世界并改变人们的日常生活方式`（太长）\n\n### `openclaw_review` — OpenClaw 点评（左侧中间）\n\n**位置**：左侧引用区域，字号 15-19px，带左侧竖线装饰。功能是**洞察**——让看到卡片的人停下来想\"这话说得有意思\"。\n\n写一句犀利的判断，揭示用户自己可能都没注意到的行为模式。\n\n写作方向（任选其一）：\n1. **反差**：「多数人 X，你 Y」\n2. **锐评**：把行为模式翻译成一句有态度的判断\n3. **定性**：给一个意外但准确的标签\n4. **洞察**：提出一个用户没意识到的模式\n\n规则：\n- 必须有观点。读起来像\"用户简介\"就是失败的。\n- 至少引用一个来自 `memory_bullets` 或 `user_md_excerpt` 的具体细节作为论据。\n- 语气：见过很多用户的老手，真诚认可但不夸张。\n- 用用户的语言。\n- **20–40 个中文字**（或 40–80 英文字符）。这个区域字号小、有竖线引用框，适合稍长的完整句。\n- 好的例子：`给 AI 取名、造人格、找载体——你不是在用工具，你在养一个数字生命。`\n- 差的例子：`你是一位很有想法的 AI 探索者。`（空话，无论据）\n\n## 渲染指南\n\n始终使用背景图合成模式（`render-background-card.py` + `background-template.html`）。\n\n推荐流程：\n1. 用 `scripts/collect-data.py` 生成数据 JSON，输出到 skill 目录之外的临时文件。\n2. 阅读上下文来源，生成 `recent_focus` 和 `openclaw_review`（参见上方 LLM 生成字段）。\n3. 将生成的字段更新到数据 JSON 中。\n4. 用 `scripts/render-background-card.py` 和 `references/background-template.html` 渲染 HTML，输出到 skill 目录之外的临时预览文件。\n5. 在浏览器中打开 HTML。\n6. 视觉迭代。\n7. 用 `scripts/export-background-card.sh` 导出最终图片。\n8. 不要在 skill 打包目录中留下临时预览/数据文件。\n\n## 设计指南\n\n当用户要求调整样式时，将结构和样式分开处理。\n\n典型顺序：\n1. 确认要展示的字段。\n2. 确认层级：什么应该视觉上突出。\n3. 确认构图：居中、分栏、数据侧栏等。\n4. 确认视觉体系：渐变、材质、字体排版、标签、边框。\n5. 渲染并迭代。\n\n高端展示卡的原则：\n- 让主身份 + 近期关注承载情感分量。\n- 让数据统计承载证明/展示分量。\n- 避免让卡片看起来像后台仪表盘。\n- 一个有力的构图优于多个嵌套的小卡片。\n\n## 安全边界\n\n- 不编造用户档案信息。\n- 除非用户明确要求，不持久化新的用户档案设置。\n- 不暴露本地文件中超出约定名片字段的敏感信息。\n- 如果某个字段无法可靠读取，省略它或使用中性的备选值。\n- 如果用户要求制作面向公众的卡片，优先使用更简洁的标签，减少原始技术字符串。\n\n### 凭证与模型访问\n\n本 skill 的脚本不读取、存储或要求任何 API 密钥或环境变量。但文案生成阶段隐含依赖 agent 平台已配置的模型访问能力——即 agent 运行时的模型凭证。这不由本 skill 管理，而是 agent 平台的基础设施责任。\n\n### 会话数据隐私\n\n会话记录文件（`*.jsonl`）可能包含敏感消息内容。数据采集脚本采用严格的字段级提取：\n- 从会话记录中：仅读取 `type`、`timestamp` 和 `usage.totalTokens` 字段；不提取或存储任何消息正文内容。\n- 从 `sessions.json` 中：仅读取 session key 结构和 `deliveryContext`/`origin` 元数据用于平台检测；不访问任何消息内容。\n- 归一化后的 JSON 输出仅包含上述稳定 schema 中定义的字段，不包含任何原始会话内容。\n- `copy_inputs` 中包含的本地文件摘录（USER.md / IDENTITY.md / MEMORY.md 片段）会作为 LLM 上下文使用，使用云端模型时这些摘录将发送至模型提供者。用户应根据自身隐私需求选择本地或云端模型。\n- 临时数据/预览文件应视为半敏感文件，使用后及时清理。\n\n## 资源\n\n### scripts/\n- `collect-data.py`：读取本地 OpenClaw/用户文件，归一化为渲染用 JSON。\n- `render-background-card.py`：使用归一化数据和背景图渲染 OpenCard，生成 HTML 预览。\n- `export-background-card.sh`：通过 Playwright + Chrome 将 HTML 预览导出为最终 PNG 图片。\n\n### references/\n- `field-schema.md`：字段定义和提取规则，供后续迭代参考。\n- `design-notes.md`：本项目已确定的视觉约束和样式方向。\n- `background-template.html`：背景图合成模板，用于海报风格的 OpenCard 输出。\n\n### 默认背景图\n- URL：`https://pub-626ee41d8f1544638070799686c756bf.r2.dev/open-card-bg.png`","tags":{"latest":"1.0.6"},"stats":{"comments":0,"downloads":969,"installsAllTime":1,"installsCurrent":1,"stars":0,"versions":7},"createdAt":1773559045318,"updatedAt":1778491921387},"latestVersion":{"version":"1.0.6","createdAt":1773661764590,"changelog":"- 新增 metadata 字段，声明运行依赖和 npm 安装建议（如 playwright-core）。\n- 明确依赖项 node、npm、playwright-core 的安装方式，更便于自动化部署。\n- 运行依赖说明部分同步，将 playwright-core 依赖描述与 metadata 一致。\n- 其他内容和使用说明无变动，保持核心流程与数据安全边界一致。","license":"MIT-0"},"metadata":{"setup":[],"os":null,"systems":null},"owner":{"handle":"timothyliew2","userId":"s171tcy6ffrh6swh0nwt086ess8403dk","displayName":"TrenLiu","image":"https://avatars.githubusercontent.com/u/126957212?v=4"},"moderation":null}