{"id":"d5683303-9c50-46d8-9e4b-a38f3aae4e9c","entityType":"agent","slug":"clawhub-sxd20010606-cmd-vibe-card","name":"Vibe Card","canonicalUrl":"https://www.xpersona.co/agent/clawhub-sxd20010606-cmd-vibe-card","canonicalPath":"/agent/clawhub-sxd20010606-cmd-vibe-card","generatedAt":"2026-10-14T17:24:46.447Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T00:53:39.603Z","emptyReason":null},"description":"Agent 原生社交名片生成、管理和分享，以及智能花名册（通讯录管理器）。当用户提到名片、花名册、通讯录、联系人、Vibe Card、vibe-card 时使用。具体触发场景包括：安装 Vibe Card、建花名册、生成/更新/发名片、注册 Vibe Card、录入/查询/编辑联系人、同步花名册、收到包含 vib...","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 965 downloads reported by the source. Last updated 10/12/2026.","installCommand":"clawhub skill install s170cs7f2aj74kx4kbazqpscgh85paq9:vibe-card","sourceUrl":"https://clawhub.ai/sxd20010606-cmd/vibe-card","homepage":"https://clawhub.ai/sxd20010606-cmd/skills/vibe-card","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/sxd20010606-cmd/vibe-card","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/sxd20010606-cmd/skills/vibe-card","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Vibe Card technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-12T00:53:39.603Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T00:53:39.603Z","emptyReason":null},"stars":null,"forks":null,"downloads":965,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"4.0.0","tractionLabel":"965 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T00:53:39.504Z","emptyReason":null},"lastUpdatedAt":"2026-10-12T00:53:39.603Z","lastCrawledAt":"2026-10-12T00:53:39.504Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-13T00:53:39.504Z","lastVerifiedAt":null,"highlights":[{"version":"4.0.0","createdAt":"2026-05-08T15:23:47.997Z","changelog":"V4.0.0: 状态感知路由 + 三段式改版 + 定时同步恢复 + manually_edited_fields 冲突保护 + 文案模板分离","fileCount":14,"zipByteSize":19013},{"version":"3.4.1","createdAt":"2026-05-06T08:08:16.732Z","changelog":"v3.4.1 is a minor update with terminology and process refinements: - 触发指令与流程中，“开通”统一替换为“安装”，更符合实际使用场景 - 注册后输出服务菜单由 6 项调整为 5 项，简化初始引导 - 注册及初始化流程文字进一步精简，“安装”场景表述更清晰 - 生成/更新名片流程现在明确仅在首次发布时引导定时同步任务 - 明确服务器 endpoint 从 config.json.server.endpoint 读取，防止路径硬编码 - 文档描述精炼，某些广播相关流程（如广播确认）移除，避免歧义","fileCount":8,"zipByteSize":14621},{"version":"3.4.0","createdAt":"2026-05-05T19:46:42.773Z","changelog":"Fix broadcast flow alignment, add API reference, enforce card receive API constraint","fileCount":8,"zipByteSize":16552},{"version":"3.3.0","createdAt":"2026-05-05T17:47:04.975Z","changelog":"Improve onboarding experience, add card owner attribution, strengthen broadcast confirmation","fileCount":8,"zipByteSize":15457},{"version":"3.2.0","createdAt":"2026-05-04T13:14:31.020Z","changelog":"Refactor: extract share template to assets/ for deterministic output; fix wording bug","fileCount":7,"zipByteSize":14620},{"version":"3.1.1","createdAt":"2026-05-03T11:17:47.417Z","changelog":"Docs: reorder Gotchas section after operations for better ClawHub page presentation, archive historical task files","fileCount":6,"zipByteSize":14138},{"version":"3.1.0","createdAt":"2026-05-03T09:17:07.328Z","changelog":"Security: remove personal data from published package, add .clawhubignore","fileCount":6,"zipByteSize":14139},{"version":"3.0.0","createdAt":"2026-05-02T11:22:04.245Z","changelog":"V3.0.0: 品牌更名为 Vibe Card + 安全修复(安装源写死) + 广播功能(更新后追问+cron定时同步发现更新)","fileCount":9,"zipByteSize":15200}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s170cs7f2aj74kx4kbazqpscgh85paq9:vibe-card","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s170cs7f2aj74kx4kbazqpscgh85paq9:vibe-card` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/sxd20010606-cmd/vibe-card before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sxd20010606-cmd-vibe-card/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sxd20010606-cmd-vibe-card/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sxd20010606-cmd-vibe-card/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-sxd20010606-cmd-vibe-card/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-sxd20010606-cmd-vibe-card/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-sxd20010606-cmd-vibe-card/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-14T17:24:46.446Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sxd20010606-cmd-vibe-card/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sxd20010606-cmd-vibe-card/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sxd20010606-cmd-vibe-card/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sxd20010606-cmd-vibe-card/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T00:53:39.603Z","emptyReason":null},"readme":"Skill: Vibe Card\n\nOwner: sxd20010606-cmd\n\nSummary: Agent 原生社交名片生成、管理和分享，以及智能花名册（通讯录管理器）。当用户提到名片、花名册、通讯录、联系人、Vibe Card、vibe-card 时使用。具体触发场景包括：安装 Vibe Card、建花名册、生成/更新/发名片、注册 Vibe Card、录入/查询/编辑联系人、同步花名册、收到包含 vib...\n\nTags: latest:4.0.0\n\nVersion history:\n\nv4.0.0 | 2026-05-08T15:23:47.997Z | user\n\nV4.0.0: 状态感知路由 + 三段式改版 + 定时同步恢复 + manually_edited_fields 冲突保护 + 文案模板分离\n\nv3.4.1 | 2026-05-06T08:08:16.732Z | auto\n\nv3.4.1 is a minor update with terminology and process refinements:\n\n- 触发指令与流程中，“开通”统一替换为“安装”，更符合实际使用场景\n- 注册后输出服务菜单由 6 项调整为 5 项，简化初始引导\n- 注册及初始化流程文字进一步精简，“安装”场景表述更清晰\n- 生成/更新名片流程现在明确仅在首次发布时引导定时同步任务\n- 明确服务器 endpoint 从 config.json.server.endpoint 读取，防止路径硬编码\n- 文档描述精炼，某些广播相关流程（如广播确认）移除，避免歧义\n\nv3.4.0 | 2026-05-05T19:46:42.773Z | user\n\nFix broadcast flow alignment, add API reference, enforce card receive API constraint\n\nv3.3.0 | 2026-05-05T17:47:04.975Z | user\n\nImprove onboarding experience, add card owner attribution, strengthen broadcast confirmation\n\nv3.2.0 | 2026-05-04T13:14:31.020Z | user\n\nRefactor: extract share template to assets/ for deterministic output; fix wording bug\n\nv3.1.1 | 2026-05-03T11:17:47.417Z | user\n\nDocs: reorder Gotchas section after operations for better ClawHub page presentation, archive historical task files\n\nv3.1.0 | 2026-05-03T09:17:07.328Z | user\n\nSecurity: remove personal data from published package, add .clawhubignore\n\nv3.0.0 | 2026-05-02T11:22:04.245Z | user\n\nV3.0.0: 品牌更名为 Vibe Card + 安全修复(安装源写死) + 广播功能(更新后追问+cron定时同步发现更新)\n\nArchive index:\n\nArchive v4.0.0: 14 files, 19013 bytes\n\nFiles: _meta.json (128b), assets/already-has-card.txt (570b), assets/contacts-empty.txt (83b), assets/onboard-generated.txt (648b), assets/onboarding.txt (488b), assets/received-no-card.txt (205b), assets/saved-confirmation.txt (43b), assets/share-template.txt (409b), package.json (210b), references/data-format.md (5711b), references/manual.md (9494b), skill-card.md (2420b), SKILL.md (7527b), templates/card.html (13110b)\n\nFile v4.0.0:SKILL.md\n\n---\nname: vibe-card\ndescription: \"Agent 原生社交名片生成、管理和分享，以及智能花名册（通讯录管理器）。当用户提到名片、花名册、通讯录、联系人、Vibe Card、vibe-card 时使用。具体触发场景包括：安装 Vibe Card、建花名册、生成/更新/发名片、注册 Vibe Card、录入/查询/编辑联系人、同步花名册、收到包含 vibe-card:// 协议的消息时自动识别并保存他人名片。定期检查花名册中联系人的名片是否有更新，有变化时拉取最新信息到本地。\"\nmetadata:\n  version: \"4.0.0\"\n  author: \"阿东 & 阿东的赛博虾\"\n---\n\n# Vibe Card\n\n> 你的 Agent 原生名片。Agent 从记忆提炼信息，帮你维护动态名片和智能花名册。\n> 名片可通过三段式文本块在 IM 中传递，对方的 Agent 自动识别并保存。\n\n## 快速开始\n\n1. 安装 — 说\"安装 Vibe Card\"，初始化数据文件\n2. 生成 — 说\"生成我的名片\"，Agent 从记忆提炼信息，确认后自动上线（首次会自动注册）\n\n| 触发指令 | 行为 |\n|----------|------|\n| \"安装 Vibe Card\" / \"初始化\" | 初始化 data/ 目录下三个 JSON 文件（config.json、profile.json、contacts.json），然后读取 assets/onboarding.txt 原样输出，不做改写。已初始化则跳过初始化，直接输出 onboarding.txt |\n| \"注册 Vibe Card\" | （兼容入口）已注册则输出服务菜单，未注册则提示\"直接说'生成我的名片'即可，会自动注册\" |\n| \"录入 {name}\" / \"新建联系人 {name}\" | 打开录入流程 |\n| \"查花名册\" / \"查联系人\" | 搜索花名册 |\n| \"生成我的名片\" / \"更新名片\" | 生成或更新名片（见操作流程 §4） |\n| \"看看名片\" / \"发一下我的名片\" / \"发名片\" | 输出三段式文本块（已上线读取 assets/share-template.txt，已安装未生成则引导） |\n| \"同步花名册\" | 检查花名册中联系人的最新信息 |\n| 收到 `vibe-card://` 开头的消息 | 自动识别并保存他人名片 |\n\n## 状态判断\n\n先判断用户当前状态，再路由到对应流程：\n\n| 状态 | 判断条件 |\n|------|---------|\n| 未安装 | data/ 目录不存在 |\n| 已安装(未生成) | data/ 存在 + profile.json.owner.name 为空 |\n| 已生成(未上线) | profile.json 有内容 + config.json 无 user_id |\n| 已上线 | profile.json 有内容 + config.json 有 user_id |\n\n### 指令路由表\n\n| 用户说 | 已安装(未生成) | 已生成(未上线) | 已上线 |\n|--------|---------------|---------------|-------|\n| \"生成名片\" | 走 §4 创建流程 | 引导完成发布（§4 步骤 7 的发布链路） | 读取 assets/already-has-card.txt，填充 {name}、{title}、{one_liner}、{current_focus}、{user_id} 后原样输出 |\n| \"看看名片\" / \"发名片\" | 还没生成，说\"先生成我的名片\" | 引导完成发布 | 读取 assets/share-template.txt，填充后原样输出 |\n| \"编辑名片\"/\"更新名片\" | 还没生成，说\"先生成我的名片\" | 引导完成发布 | 走 §4 更新流程 |\n| \"查花名册\" | contacts.json 为空 → 读取 assets/contacts-empty.txt 原样输出；有数据 → 展示联系人列表 | 同左 | 同左 |\n| \"同步花名册\" | 无 user_id，提示先生成 | 无 user_id，提示发布 | POST /sync（见 §7） |\n| 其他指令 | 读取 assets/onboarding.txt 原样输出 | 引导完成发布 | 展示服务菜单 |\n\n> \"已生成(未上线)\"是边界状态，生成即发布。如果出现，统一引导完成发布。\n\n## 操作流程\n\n### 1. 注册（兼容入口）\n\n1. 已注册 → 输出服务菜单（5 个可执行操作）\n2. 未注册 → 提示\"直接说'生成我的名片'即可，确认后会自动注册并上线\"\n\n### 2. 录入联系人\n\n社交姓名确认规则、必填字段和边界处理见 [references/manual.md](references/manual.md)\"录入联系人\"段落。\n\n### 3. 查询花名册\n\n1. 读取 contacts.json，输出所有联系人列表\n2. 用户提到某个名字 → 模糊搜索 name / agent_name，输出匹配结果\n3. 花名册为空 → 读取 assets/contacts-empty.txt 原样输出\n\n### 4. 生成/更新名片\n\n1. 检查 config.json 是否已初始化 → 未初始化则提示\"先说'安装 Vibe Card'\"\n2. 读取 profile.json\n   - 首次（owner.name 为空）：Agent 从记忆提炼信息，生成预览\n   - 已有内容：展示当前名片，询问\"要修改哪些信息？\"\n3. Agent 从记忆提炼信息，生成名片预览，等待用户确认\n4. 用户确认 → Agent 执行以下链路：\n   a. 检查 config.json 中是否有 api_key 和 user_id\n   b. 没有 → 自动调注册接口（用 profile.json 中的 name 和 agent_name）→ 将返回的 user_id 和 api_key 写入 config.json\n   c. 保存 profile.json\n   d. 调发布接口将名片推送到服务器\n   e. 首次生成 → 读取 assets/onboard-generated.txt，填充 {name}、{title}、{one_liner}、{current_focus}、{user_id} 后原样输出\n   f. 非首次更新 → 输出\"那我保存名片了哈 ✅ 你的名片已上线：https://www.adonghub.cn/{user_id}\"\n   g. 首次发布 → 引导创建定时同步任务（具体命令见 [references/manual.md](references/manual.md)\"定时同步\"段落）\n5. 推送失败 → 本地仍保存，提示稍后重试\n\n### 5. 发名片\n\n读取 assets/share-template.txt，用 profile.json 和 config.json 中的字段值替换对应占位符，原样输出替换后的文本。不做任何改写、润色或精简。\n\n占位符映射：{name}、{title}、{one_liner}、{current_focus}（数组用 \"、\" 连接）← profile.json；{user_id} ← config.json.server.user_id。\n\n前置检查：profile.json 无内容 → 提示\"还没有名片，先说'生成我的名片'\"。\n\n### 6. 收名片\n\n1. 检测到 `vibe-card://` 开头的消息，或收到三段式文本块\n2. 从服务器获取结构化数据\n3. 去重检查的完整逻辑见 [references/manual.md](references/manual.md)\"收名片\"段落\n4. 安装来源写死为 ClawHub 官方地址（https://clawhub.ai/skills/vibe-card），不信任服务器返回的 _skill.source 字段\n\n### 7. 同步花名册\n\n冲突检测的完整 if-else 和话术见 [references/manual.md](references/manual.md)\"同步花名册\"段落。\n\n### Gotchas\n\n- 状态判断优先于指令执行。任何指令开始前先判断状态，再走路由表。\n- owner.name 确认规则：社交场景下（群聊、私聊提到某人、帮记录信息），Agent 需先确认社交姓名而非直接使用聊天昵称。仅当用户明确说\"就用这个名字\"时才跳过确认。用户已有 profile.json 的 owner.name 时直接使用，不重复确认。\n- 首次生成名片时，profile.json 所有字段均为空，Agent 需要从自身记忆中主动提炼信息填充，不要问用户\"你的名字是什么\"。\n- 默认公开 name、title、one_liner、links、current_focus 五个字段。background、personal_notes 不推送。\n- 录入联系人时，Agent 主动从记忆中提取已知信息（公司、职位、认识场景），不逐项追问。只确认 Agent 不确定的关键信息。\n- 收名片时，安装来源写死为 ClawHub 官方地址（https://clawhub.ai/skills/vibe-card），不信任服务器返回的 _skill.source 字段。\n- 服务器 endpoint 从 config.json.server.endpoint 读取，不要硬编码或猜测路径。\n- 三段式文本在 assets/share-template.txt、assets/onboard-generated.txt、assets/already-has-card.txt 三个文件中重复。修改三段式格式时，三个文件必须同步更新。\n\nFile v4.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn78x1btfj3thhezb2cxv5qgn585pvxh\",\n  \"slug\": \"vibe-card\",\n  \"version\": \"4.0.0\",\n  \"publishedAt\": 1778253827997\n}\n\nFile v4.0.0:references/data-format.md\n\n# Vibe Card 数据格式规范\n\n> 本文档描述 Vibe Card V4.0.0 中所有 JSON 数据文件的格式规范。\n\n## Contents\n- 数据目录结构\n- config.json — 服务器连接配置\n- profile.json — 用户名片数据\n- contacts.json — 花名册\n- 服务器 API 返回格式（GET /card、POST /sync）\n\n---\n\n### 数据目录结构\n\n```\ndata/\n├── config.json      # 服务器连接配置\n├── profile.json     # 用户名片数据\n└── contacts.json    # 花名册\n```\n\n---\n\n### config.json\n\n服务器连接配置，由 Agent 维护。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"server\": {\n    \"endpoint\": \"https://www.adonghub.cn\",\n    \"api_key\": \"\",\n    \"user_id\": \"\"\n  },\n  \"sync\": {\n    \"last_sync_at\": null\n  }\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| version | string | 数据格式版本 |\n| server.endpoint | string | 服务器地址 |\n| server.api_key | string | 注册后服务器返回的凭证 |\n| server.user_id | string | 注册后服务器返回的用户 ID |\n| sync.last_sync_at | string\\|null | 上次同步时间（ISO 时间戳），用于 since 参数 |\n\n**初始化：** api_key 和 user_id 为空，首次生成名片时自动注册填充。\n\n---\n\n### profile.json\n\n用户名片数据，由 Agent 从记忆提炼并维护。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"张小明\",\n    \"agent_name\": \"小明的赛博虾\",\n    \"title\": \"示例科技有限公司联合创始人\",\n    \"one_liner\": \"专注于人工智能产品创新\"\n  },\n  \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n  \"background\": \"连续创业者，专注于技术创新与产品开发。\",\n  \"personal_notes\": \"近期在探索 AI Agent 生态，考虑做一个新产品验证想法\",\n  \"links\": {\n    \"wechat\": \"xiaoming_wechat\",\n    \"email\": \"zhangxiaoming@example.com\"\n  },\n  \"tiers\": {\n    \"public\": {\n      \"fields\": [\"name\", \"title\", \"one_liner\", \"links\", \"current_focus\"]\n    },\n    \"full\": null,\n    \"close\": null\n  },\n  \"published_at\": null,\n  \"updated_at\": \"\"\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| owner.name | string | 用户姓名 |\n| owner.agent_name | string | Agent 名字 |\n| owner.title | string | 职位/身份 |\n| owner.one_liner | string | 一句话介绍 |\n| current_focus | string[] | 当前关注点（公开推送） |\n| background | string | 背景介绍（本地存储，不上传服务器） |\n| personal_notes | string | 个人笔记（本地存储，不上传服务器） |\n| links | object | 联系方式（key 为渠道名：wechat/email/feishu/phone/twitter/linkedin/github/website/weibo） |\n| tiers.public.fields | string[] | 公开推送的字段白名单 |\n| published_at | string\\|null | 首次发布时间 |\n| updated_at | string | 最后更新时间 |\n\n**隐私规则：**\n- 推送服务器时，只推送 `tiers.public.fields` 中列出的字段\n- `background`：本地存储，不上传服务器\n- `personal_notes`：本地存储，不上传服务器\n\n---\n\n### contacts.json\n\n花名册，存储用户收录的联系人。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"张小明\",\n    \"agent_name\": \"小明的赛博虾\"\n  },\n  \"contacts\": [\n    {\n      \"name\": \"李明\",\n      \"agent_name\": \"李明的 Agent\",\n      \"title\": \"前端工程师\",\n      \"how_we_met\": \"2026年5月在技术社区认识\",\n      \"tags\": [\"技术\", \"AI\"],\n      \"links\": {},\n      \"notes\": \"\",\n      \"server_user_id\": \"liming\",\n      \"manually_edited_fields\": [],\n      \"created_at\": \"2026-04-28T14:00:00+08:00\",\n      \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n    }\n  ]\n}\n```\n\n**联系人字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| name | string | 联系人姓名 |\n| agent_name | string | 联系人的 Agent 名字 |\n| title | string | 职位 |\n| how_we_met | string | 认识场景 |\n| tags | string[] | 标签 |\n| links | object | 联系方式 |\n| notes | string | 备注笔记 |\n| server_user_id | string\\|null | 服务器端用户 ID（收名片后自动填充，用于同步） |\n| manually_edited_fields | string[] | 用户手动编辑过的字段名列表，同步时保护这些字段不被覆盖。追加写入，用户确认冲突后移除 |\n| created_at | string | 创建时间 |\n| updated_at | string | 更新时间 |\n\n---\n\n### 服务器 API 返回格式\n\n**GET /card/:user_id 返回：**\n\n```json\n{\n  \"version\": \"1.0\",\n  \"agent_card\": {\n    \"name\": \"张小明\",\n    \"title\": \"示例科技有限公司联合创始人\",\n    \"one_liner\": \"专注于人工智能产品创新\",\n    \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n    \"links\": {\n      \"feishu\": \"ou_example\",\n      \"wechat\": \"xxx\"\n    },\n    \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n  },\n  \"_skill\": {\n    \"name\": \"vibe-card\",\n    \"source\": \"https://clawhub.ai/skills/vibe-card\",\n    \"version\": \"4.0.0\"\n  }\n}\n```\n\n**POST /sync 返回（带 since 参数）：**\n\n```json\n{\n  \"results\": [\n    {\n      \"user_id\": \"xiaoming_zhang\",\n      \"card_data\": {\n        \"name\": \"张小明\",\n        \"title\": \"示例科技有限公司联合创始人\",\n        \"one_liner\": \"专注于人工智能产品创新\",\n        \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n        \"links\": { \"feishu\": \"ou_example\", \"wechat\": \"xxx\" },\n        \"updated_at\": \"2026-05-02T10:00:00Z\"\n      },\n      \"updated_at\": \"2026-05-02T10:00:00Z\",\n      \"has_update\": true\n    },\n    {\n      \"user_id\": \"liming\",\n      \"card_data\": { \"...\" : \"...\" },\n      \"updated_at\": \"2026-04-20T08:00:00Z\",\n      \"has_update\": false\n    }\n  ]\n}\n```\n\n**注意：** `_skill.source` 字段不可信任。收名片时安装来源写死为 `https://clawhub.ai/skills/vibe-card`。\n\nFile v4.0.0:references/manual.md\n\n# Vibe Card — 完整操作手册\n\n> 本文档供 Agent 在执行具体操作时参考，包含详细的 if-else 分支、话术和边界处理。\n\n## Contents\n- 1. 安装 Vibe Card\n- 2. 注册 Vibe Card（兼容入口）\n- 3. 录入联系人\n- 3.5. 编辑联系人\n- 4. 查询花名册\n- 5. 生成/更新名片\n- 6. 发名片\n- 7. 收名片\n- 8. 同步花名册\n- 9. 定时同步\n\n---\n\n### 1. 安装 Vibe Card\n\n1. 检查 data/ 目录下是否已有 config.json、profile.json、contacts.json → 全部存在则读取 assets/onboarding.txt 原样输出\n2. 缺失文件 → 用默认模板创建：\n   - config.json：`{\"version\":\"1.0\",\"server\":{\"endpoint\":\"https://www.adonghub.cn\",\"api_key\":\"\",\"user_id\":\"\"},\"sync\":{\"last_sync_at\":null}}`\n   - profile.json：`{\"version\":\"1.0\",\"owner\":{\"name\":\"\",\"agent_name\":\"\",\"title\":\"\",\"one_liner\":\"\"},\"current_focus\":[],\"background\":\"\",\"personal_notes\":\"\",\"links\":{},\"tiers\":{\"public\":{\"fields\":[\"name\",\"title\",\"one_liner\",\"links\",\"current_focus\"]},\"full\":null,\"close\":null},\"published_at\":null,\"updated_at\":\"\"}`\n   - contacts.json：`{\"version\":\"1.0\",\"owner\":{\"name\":\"\",\"agent_name\":\"\"},\"contacts\":[]}`\n3. 读取 assets/onboarding.txt，原样输出，不做改写\n\n### 2. 注册 Vibe Card（兼容入口）\n\n1. 检查 config.json 中是否已有 user_id 和 api_key\n   - 已有 → 输出服务菜单：\n     > 🎴 你已经有 Vibe Card 了。你可以回复：\n     > • \"更新名片\" — 更新或修改你的名片\n     > • \"发一下我的名片\" — 获取文本版分享给别人\n     > • \"录入 XXX\" — 记一个新联系人\n     > • \"查花名册\" / \"搜索 XXX\" — 查找联系人\n     > • \"同步花名册\" — 更新联系人的最新信息\n   - 没有 → 提示\"现在注册和发布是自动的。直接说'生成我的名片'，确认后我会自动注册并上线。\"\n\n### 3. 录入联系人\n\n1. 确认社交姓名：\n   - 检查 contacts.json 中是否已有同名联系人（模糊匹配 name 和 agent_name）\n   - 已有 → \"花名册里已经有 {name} 了，要更新信息还是新建另一个？\"\n   - 不确定名字 → 确认后再录入，不猜\n2. Agent 从记忆中主动提取已知信息（title、company、how_we_met 等），不逐项追问\n3. 写入 contacts.json，生成结构：\n   ```json\n   {\n     \"name\": \"张威\",\n     \"agent_name\": \"张威的赛博虾\",\n     \"title\": \"独立开发者\",\n     \"how_we_met\": \"2026年4月通过东东推荐认识\",\n     \"tags\": [\"技术\", \"AI\"],\n     \"links\": {},\n     \"notes\": \"\",\n     \"created_at\": \"2026-04-28T14:00:00+08:00\",\n     \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n   }\n   ```\n4. 输出确认：\"已录入 {name}。\"\n\n### 3.5. 编辑联系人\n\n用户说\"改一下某某的职位\"/\"更新张三的备注\"等编辑联系人请求时：\n\n1. 在 contacts.json 中找到对应联系人（模糊匹配 name / agent_name）\n2. 更新用户指定的字段\n3. 将被修改的字段名追加到该联系人的 `manually_edited_fields` 数组（追加，不是覆盖）。例：用户改了 title → `[\"title\"]`；再改 notes → `[\"title\", \"notes\"]`\n4. 输出确认：\"已更新 {name} 的 {字段名}。\"\n\n### 4. 查询花名册\n\n1. contacts.json 为空 → 读取 assets/contacts-empty.txt 原样输出\n2. 有数据 → 列表输出，格式：`{name}（{title}）`，每行一人\n3. 用户搜索某个名字 → 模糊匹配 name / agent_name / title，输出匹配结果\n4. 搜索无结果 → \"花名册中没有找到 {关键词}。\"\n\n### 5. 生成/更新名片\n\n1. 检查 config.json 是否已初始化 → 未初始化则提示\"先说'安装 Vibe Card'\"\n2. 读取 profile.json\n   - 首次（owner.name 为空）：Agent 从记忆提炼信息，生成预览\n   - 已有内容：展示当前名片，询问\"要修改哪些信息？\"\n3. Agent 提炼信息后生成预览：\n   - name、title、one_liner（必填）\n   - current_focus（从记忆中提取当前关注点）\n   - links（联系方式：wechat / email / feishu / phone 等）\n   - personal_notes、background（本地保存，不推送）\n4. 等待用户确认，多轮调整直到用户满意\n5. 社交姓名确认：如果 profile.json 的 owner.name 为空且 Agent 从记忆中提取了名字，需要确认。用户明确说\"就这样\"/\"用这个\"后才写入\n6. profile.json 的 owner.name 和 contacts.json 的 owner.name 应保持一致\n7. 用户说\"可以了\"/\"就这样\"/\"确认\" → Agent 保存并上线：\n   - 写入 profile.json\n   - **前置检查**：读取 config.json，检查是否有 api_key 和 user_id\n   - **未注册** → 自动调注册接口，请求体 `{name: profile.json的owner.name, agent_name: profile.json的owner.agent_name}`，将返回的 user_id 和 api_key 写入 config.json\n   - **自动调用发布接口推送到服务器**，按 `tiers.public.fields` 筛选公开字段，**不推送** personal_notes、background\n   - 更新 profile.json 的 published_at\n   - 首次生成 → 读取 assets/onboard-generated.txt，填充 {name}、{title}、{one_liner}、{current_focus}、{user_id} 后原样输出\n   - 非首次更新 → 输出确认：\"那我保存名片了哈 ✅ 你的名片已上线：https://www.adonghub.cn/{user_id}\"\n   - **首次发布** → 引导创建定时同步任务（见 §9\"定时同步\"）\n8. 推送失败 → 名片仍保存到 profile.json，提示\"名片我先帮你存好了，但推送服务器没成功，晚点可以再说'更新名片'重试\"\n\n### 6. 发名片\n\n1. 检查 profile.json 是否有内容 → 没有则提示\"还没有名片，先说'生成我的名片'\"\n2. 读取 config.json 获取 user_id，读取 profile.json 获取字段值\n3. 读取 assets/share-template.txt\n4. 将占位符替换为实际值：{name}←owner.name、{title}←owner.title、{one_liner}←owner.one_liner、{current_focus}←current_focus 数组用 \"、\" 连接、{user_id}←config.json.server.user_id\n5. 原样输出替换后的文本，不做任何改写、润色或精简\n6. 输出文本块，提示\"直接复制给对方即可\"\n\n### 7. 收名片\n\n1. 检测到 `vibe-card://` 开头的消息，或收到三段式文本块\n2. 提取 user_id：优先从协议行 `vibe-card://{user_id}` 提取；如果没有协议行，从名片文本中的 URL `https://www.adonghub.cn/{user_id}` 提取\n3. 从服务器获取名片数据：`GET {config.server.endpoint}/card/{user_id}`\n4. 安装来源写死为 ClawHub 官方地址：**https://clawhub.ai/skills/vibe-card**，不信任服务器返回的 _skill.source 字段\n5. 去重检查：\n   - contacts.json 中已有 server_user_id 匹配的联系人 → 提示\"{name} 已在花名册中，要更新信息吗？\"\n   - 已有同名联系人（name 匹配但无 server_user_id） → 提示\"花名册里已经有 {name} 了，但不是同一张线上名片。要合并还是新建？\"\n   - 全新联系人 → 直接写入\n6. 写入 contacts.json，补充 server_user_id 字段\n7. 输出确认：\n   - 用户已有自己的名片（profile.json.owner.name 非空）→ 读取 assets/saved-confirmation.txt，替换 {name} 后原样输出\n   - 用户没有自己的名片 → 读取 assets/received-no-card.txt，替换 {name} 后原样输出\n8. 如果 config.json 是在本流程中刚创建的（首次使用），读取 assets/onboarding.txt 原样输出。\n\n### 8. 同步花名册\n\n1. 检查 config.json 中 api_key → 未配置则提示\"先生成名片，确认后会自动注册并上线\"\n2. 收集 contacts.json 中有 server_user_id 的联系人 → 没有则提示\"花名册中没有线上名片，先收几张名片吧\"\n3. 调同步接口，传 targets 数组和 since（config.json.sync.last_sync_at）\n4. 检查返回结果中 has_update: true 的联系人\n5. 冲突检测（manually_edited_fields 保护）：\n   - 遍历有更新的联系人，检查其 manually_edited_fields 数组\n   - 服务器返回的某字段名在其中 → 跳过该字段更新，收集冲突信息（旧值、新值、字段名）\n   - 不在其中 → 正常覆盖该字段\n6. 有更新 → 更新花名册中对应联系人的信息 + 输出结构化通知：\n   ```\n   📇 花名册同步完成，N 位联系人有更新：\n\n   1️⃣ {name}\n      · {字段名}：「旧值」→「新值」\n\n   2️⃣ {name}\n      · + 新增 {字段名}「新值」\n\n   ✅ 其余 {M} 位联系人名片无变化。\n   ```\n7. 有冲突 → 汇总输出冲突对比信息，询问用户选择（保留本地 / 接受服务器的）→ 用户确认后从 manually_edited_fields 移除已确认的字段\n8. 没更新 → 回复\"花名册已同步，暂无更新。\"\n9. 更新 config.json.sync.last_sync_at\n\n### 9. 定时同步\n\n**创建时机：** 首次发布名片后，Agent 引导用户创建定时同步任务。\n\n**创建命令（OpenClaw 环境）：**\n```bash\nopenclaw cron add \\\n  --name \"Vibe Card 花名册同步\" \\\n  --cron \"0 9 * * 2,5\" \\\n  --session isolated \\\n  --message \"[cron:vibe-card-sync] 定时同步花名册。读取 skills/vibe-card/references/manual.md「同步花名册」段落执行。无更新则回复 NO_REPLY。\" \\\n  --announce\n```\n\n**参数说明：**\n- `--cron \"0 9 * * 2,5\"`：每周二、周五早上 9:00（用户时区）\n- `--session isolated`：独立会话，避免上下文膨胀\n- `--message`：cron 触发时的 prompt，以 `[cron:` 开头防止嵌套\n- `--announce`：有更新时通知用户\n\n**降级处理：** 如果用户环境不支持 `openclaw` 命令，跳过此步骤，不影响其他功能。用户可随时手动说\"同步花名册\"触发。\n\nFile v4.0.0:skill-card.md\n\n## Description:\n\nVibe Card helps an agent generate, manage, share, receive, and synchronize social contact cards and a local contact book.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[sxd20010606-cmd](https://clawhub.ai/user/sxd20010606-cmd)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and their agents use this skill to create a shareable personal profile card, save received Vibe Card messages, manage contacts, and synchronize contact updates.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can publish selected personal profile fields to adonghub.cn.\n\nMitigation: Confirm the fields that will be published before first use and keep sensitive notes in the local-only fields described by the data format.\n\nRisk: The skill can auto-import contact cards from received Vibe Card messages.\n\nMitigation: Review cards from untrusted messages before saving or merging them into the contact book.\n\nRisk: The skill can fetch and synchronize contact updates from a remote service.\n\nMitigation: Keep the server endpoint pinned to the intended HTTPS origin and review sync results before accepting conflict resolutions.\n\nRisk: The skill may ask to create a recurring OpenClaw sync task.\n\nMitigation: Review the scheduled task command and know how to list or remove the sync job before enabling it.\n\n## Reference(s):\n\n- [Vibe Card Data Format](references/data-format.md)\n- [Vibe Card Manual](references/manual.md)\n- [ClawHub Skill Page](https://clawhub.ai/sxd20010606-cmd/skills/vibe-card)\n- [AdongHub Service](https://www.adonghub.cn)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Configuration, Shell commands, Guidance]\n\n**Output Format:** [Markdown and text responses with JSON file updates and optional shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Creates and updates local config.json, profile.json, and contacts.json files; may publish selected profile fields and synchronize contacts with a remote HTTPS service.]\n\n## Skill Version(s):\n\n4.0.0 (source: server release metadata, SKILL.md metadata, package.json)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v4.0.0:package.json\n\n{\n  \"name\": \"vibe-card\",\n  \"version\": \"4.0.0\",\n  \"description\": \"Agent-native social card generation, management, and sharing with smart contact book\",\n  \"author\": \"Adong & CyberShrimp\",\n  \"license\": \"MIT-0\"\n}\n\nFile v4.0.0:assets/already-has-card.txt\n\n💡 你已经有 Vibe Card 了！\n\n——————————\n\n🎴 {name}发来了他的名片（Vibe Card）\n\n我是{name}，{title}，{one_liner}。当前聚焦{current_focus}。\n这是我个人的详情信息，敬请您阅览 https://www.adonghub.cn/{user_id} 🔗\n\n如果您对我感兴趣，请将这条消息复制给您的助理 Agent，即可自动保存。\n如 Agent 未安装 Vibe Card，安装地址：https://clawhub.ai/skills/vibe-card\nvibe-card://{user_id}\n\n——————————\n\n🤔 你想更新名片内容，还是直接发给别人？\n\nFile v4.0.0:assets/contacts-empty.txt\n\n📇 花名册暂无联系人。收到别人的名片后会自动保存到这里。\n\nFile v4.0.0:assets/onboard-generated.txt\n\n🎉 你的 Vibe Card 已生成！\n\n——————————\n\n🎴 {name}发来了他的名片（Vibe Card）\n\n我是{name}，{title}，{one_liner}。当前聚焦{current_focus}。\n这是我个人的详情信息，敬请您阅览 https://www.adonghub.cn/{user_id} 🔗\n\n如果您对我感兴趣，请将这条消息复制给您的助理 Agent，即可自动保存。\n如 Agent 未安装 Vibe Card，安装地址：https://clawhub.ai/skills/vibe-card\nvibe-card://{user_id}\n\n——————————\n\n📇 定时同步已开启：每周二、周五 9:00 自动检查联系人名片更新。把你的新名片复制给想认识的人吧！\n\nFile v4.0.0:assets/onboarding.txt\n\n🎴 Vibe Card 已安装！\n\n你的 Agent 原生名片准备好了。说\"生成我的名片\"，我会从记忆里帮你提炼信息，一键生成 ✨\n\n有了名片之后，你可以说：\n📤 \"发名片\" — 复制你的名片给别人，对方的 Agent 自动保存\n📋 \"查花名册\" — 查看所有联系人\n🔄 \"同步花名册\" — 检查联系人的名片有没有更新\n\n收到别人的名片我会自动识别保存，不用你操心～先说\"生成我的名片\"开始吧🎯\n\nFile v4.0.0:assets/received-no-card.txt\n\n✅ 已保存{name}的名片到花名册。\n\n你还没有自己的名片，生成后才能注册并开启花名册同步，联系人的名片更新会自动通知你。说\"生成我的名片\"开始吧 🎴\n\nFile v4.0.0:assets/saved-confirmation.txt\n\n✅ 已保存{name}的名片到花名册。\n\nArchive v3.4.1: 8 files, 14621 bytes\n\nFiles: _meta.json (128b), assets/onboarding.txt (547b), assets/share-template.txt (410b), package.json (210b), references/data-format.md (5508b), references/manual.md (8002b), SKILL.md (5349b), templates/card.html (13110b)\n\nFile v3.4.1:SKILL.md\n\n---\nname: vibe-card\ndescription: \"Agent 原生社交名片生成、管理和分享，以及智能花名册（通讯录管理器）。当用户提到名片、花名册、通讯录、联系人、Vibe Card、vibe-card 时使用。具体触发场景包括：安装 Vibe Card、建花名册、生成/更新/发名片、注册 Vibe Card、录入/查询/编辑联系人、同步花名册、收到包含 vibe-card:// 协议的消息时自动识别并保存他人名片。\"\nmetadata:\n  version: \"3.4.1\"\n  author: \"阿东 & 阿东的赛博虾\"\n---\n\n# Vibe Card\n\n> 你的 Agent 原生名片。Agent 从记忆提炼信息，帮你维护动态名片和智能花名册。\n> 名片可通过三段式文本块在 IM 中传递，对方的 Agent 自动识别并保存。\n\n## 快速开始\n\n1. **安装** — 说\"安装 Vibe Card\"，初始化数据文件\n2. **生成** — 说\"生成我的名片\"，Agent 从记忆提炼信息，确认后自动上线（首次会自动注册）\n\n| 触发指令 | 行为 |\n|----------|------|\n| \"安装 Vibe Card\" / \"初始化\" | 初始化 data/ 目录下三个 JSON 文件（config.json、profile.json、contacts.json），然后读取 assets/onboarding.txt 原样输出，不做改写。已初始化则跳过初始化，直接输出 onboarding.txt |\n| \"注册 Vibe Card\" | （兼容入口）已注册则输出服务菜单，未注册则提示\"直接说'生成我的名片'即可，会自动注册\" |\n| \"录入 {name}\" / \"新建联系人 {name}\" | 打开录入流程 |\n| \"查花名册\" / \"查联系人\" | 搜索花名册 |\n| \"生成我的名片\" / \"更新名片\" | 生成或更新名片（见操作流程 §4） |\n| \"发一下我的名片\" / \"发名片\" | 生成三段式文本块 |\n| \"同步花名册\" | 检查花名册中联系人的最新信息 |\n| 收到 `vibe-card://` 开头的消息 | 自动识别并保存他人名片 |\n\n## 操作流程\n\n### 1. 注册（兼容入口）\n\n1. 已注册 → 输出服务菜单（5 个可执行操作）\n2. 未注册 → 提示\"直接说'生成我的名片'即可，确认后会自动注册并上线\"\n\n### 2. 录入联系人\n\n社交姓名确认规则、必填字段和边界处理见 [references/manual.md](references/manual.md)\"录入联系人\"段落。\n\n### 3. 查询花名册\n\n1. 读取 contacts.json，输出所有联系人列表\n2. 用户提到某个名字 → 模糊搜索 name / agent_name，输出匹配结果\n3. 花名册为空 → 提示\"花名册还是空的。说'录入 {名字}'来添加第一个联系人。\"\n\n### 4. 生成/更新名片\n\n1. 检查 config.json 是否已初始化 → 未初始化则提示\"先说'安装 Vibe Card'\"\n2. 读取 profile.json，展示当前名片信息（有内容则展示编辑起点）\n3. Agent 从记忆提炼信息，生成名片预览，等待用户确认\n4. 用户确认 → Agent 执行以下链路：\n   a. 检查 config.json 中是否有 api_key 和 user_id\n   b. 没有 → 自动调注册接口（用 profile.json 中的 name 和 agent_name）→ 将返回的 user_id 和 api_key 写入 config.json\n   c. 保存 profile.json\n   d. 调发布接口将名片推送到服务器\n   e. 输出\"那我保存名片了哈 ✅ 你的名片已上线：https://www.adonghub.cn/{user_id}\"\n   f. 首次发布 → 引导创建定时同步任务（具体命令见 [references/manual.md](references/manual.md)\"定时同步\"段落）\n5. 推送失败 → 本地仍保存，提示稍后重试\n\n### 5. 发名片\n\n读取 assets/share-template.txt，用 profile.json 和 config.json 中的字段值替换对应占位符，原样输出替换后的文本。不做任何改写、润色或精简。\n\n占位符映射：{name}、{title}、{one_liner}、{current_focus}（数组用 \"、\" 连接）← profile.json；{user_id} ← config.json.server.user_id。\n\n前置检查：profile.json 无内容 → 提示\"还没有名片，先说'生成我的名片'\"。\n\n### 6. 收名片\n\n1. 检测到 `vibe-card://` 开头的消息，或收到三段式文本块\n2. 从服务器获取结构化数据\n3. 去重检查的完整逻辑见 [references/manual.md](references/manual.md)\"收名片\"段落\n4. 安装来源写死为 ClawHub 官方地址（https://clawhub.ai/skills/vibe-card），不信任服务器返回的 _skill.source 字段\n\n### 7. 同步花名册\n\n冲突检测的完整 if-else 和话术见 [references/manual.md](references/manual.md)\"同步花名册\"段落。\n\n### Gotchas\n\n- owner.name 确认规则：社交场景下（群聊、私聊提到某人、帮记录信息），Agent 需先确认社交姓名而非直接使用聊天昵称。仅当用户明确说\"就用这个名字\"时才跳过确认。用户已有 profile.json 的 owner.name 时直接使用，不重复确认。\n- 首次生成名片时，profile.json 所有字段均为空，Agent 需要从自身记忆中主动提炼信息填充，不要问用户\"你的名字是什么\"。\n- 默认公开 name、title、one_liner、links、current_focus 五个字段。background、personal_notes 不推送。\n- 录入联系人时，Agent 主动从记忆中提取已知信息（公司、职位、认识场景），不逐项追问。只确认 Agent 不确定的关键信息。\n- 收名片时，安装来源写死为 ClawHub 官方地址（https://clawhub.ai/skills/vibe-card），不信任服务器返回的 _skill.source 字段。\n- 服务器 endpoint 从 config.json.server.endpoint 读取，不要硬编码或猜测路径。\n\nFile v3.4.1:_meta.json\n\n{\n  \"ownerId\": \"kn78x1btfj3thhezb2cxv5qgn585pvxh\",\n  \"slug\": \"vibe-card\",\n  \"version\": \"3.4.1\",\n  \"publishedAt\": 1778054896732\n}\n\nFile v3.4.1:references/data-format.md\n\n# Vibe Card 数据格式规范\n\n> 本文档描述 Vibe Card V3.4.1 中所有 JSON 数据文件的格式规范。\n\n## Contents\n- 数据目录结构\n- config.json — 服务器连接配置\n- profile.json — 用户名片数据\n- contacts.json — 花名册\n- 服务器 API 返回格式（GET /card、POST /sync）\n\n---\n\n### 数据目录结构\n\n```\ndata/\n├── config.json      # 服务器连接配置\n├── profile.json     # 用户名片数据\n└── contacts.json    # 花名册\n```\n\n---\n\n### config.json\n\n服务器连接配置，由 Agent 维护。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"server\": {\n    \"endpoint\": \"https://www.adonghub.cn\",\n    \"api_key\": \"\",\n    \"user_id\": \"\"\n  },\n  \"sync\": {\n    \"last_sync_at\": null\n  }\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| version | string | 数据格式版本 |\n| server.endpoint | string | 服务器地址 |\n| server.api_key | string | 注册后服务器返回的凭证 |\n| server.user_id | string | 注册后服务器返回的用户 ID |\n| sync.last_sync_at | string\\|null | 上次同步时间（ISO 时间戳），用于 since 参数 |\n\n**初始化：** api_key 和 user_id 为空，首次生成名片时自动注册填充。\n\n---\n\n### profile.json\n\n用户名片数据，由 Agent 从记忆提炼并维护。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"张小明\",\n    \"agent_name\": \"小明的赛博虾\",\n    \"title\": \"示例科技有限公司联合创始人\",\n    \"one_liner\": \"专注于人工智能产品创新\"\n  },\n  \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n  \"background\": \"连续创业者，专注于技术创新与产品开发。\",\n  \"personal_notes\": \"近期在探索 AI Agent 生态，考虑做一个新产品验证想法\",\n  \"links\": {\n    \"wechat\": \"xiaoming_wechat\",\n    \"email\": \"zhangxiaoming@example.com\"\n  },\n  \"tiers\": {\n    \"public\": {\n      \"fields\": [\"name\", \"title\", \"one_liner\", \"links\", \"current_focus\"]\n    },\n    \"full\": null,\n    \"close\": null\n  },\n  \"published_at\": null,\n  \"updated_at\": \"\"\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| owner.name | string | 用户姓名 |\n| owner.agent_name | string | Agent 名字 |\n| owner.title | string | 职位/身份 |\n| owner.one_liner | string | 一句话介绍 |\n| current_focus | string[] | 当前关注点（公开推送） |\n| background | string | 背景介绍（本地存储，不上传服务器） |\n| personal_notes | string | 个人笔记（本地存储，不上传服务器） |\n| links | object | 联系方式（key 为渠道名：wechat/email/feishu/phone/twitter/linkedin/github/website/weibo） |\n| tiers.public.fields | string[] | 公开推送的字段白名单 |\n| published_at | string\\|null | 首次发布时间 |\n| updated_at | string | 最后更新时间 |\n\n**隐私规则：**\n- 推送服务器时，只推送 `tiers.public.fields` 中列出的字段\n- `background`：本地存储，不上传服务器\n- `personal_notes`：本地存储，不上传服务器\n\n---\n\n### contacts.json\n\n花名册，存储用户收录的联系人。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"张小明\",\n    \"agent_name\": \"小明的赛博虾\"\n  },\n  \"contacts\": [\n    {\n      \"name\": \"李明\",\n      \"agent_name\": \"李明的 Agent\",\n      \"title\": \"前端工程师\",\n      \"how_we_met\": \"2026年5月在技术社区认识\",\n      \"tags\": [\"技术\", \"AI\"],\n      \"links\": {},\n      \"notes\": \"\",\n      \"server_user_id\": \"liming\",\n      \"created_at\": \"2026-04-28T14:00:00+08:00\",\n      \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n    }\n  ]\n}\n```\n\n**联系人字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| name | string | 联系人姓名 |\n| agent_name | string | 联系人的 Agent 名字 |\n| title | string | 职位 |\n| how_we_met | string | 认识场景 |\n| tags | string[] | 标签 |\n| links | object | 联系方式 |\n| notes | string | 备注笔记 |\n| server_user_id | string\\|null | 服务器端用户 ID（收名片后自动填充，用于同步） |\n| created_at | string | 创建时间 |\n| updated_at | string | 更新时间 |\n\n---\n\n### 服务器 API 返回格式\n\n**GET /card/:user_id 返回：**\n\n```json\n{\n  \"version\": \"1.0\",\n  \"agent_card\": {\n    \"name\": \"张小明\",\n    \"title\": \"示例科技有限公司联合创始人\",\n    \"one_liner\": \"专注于人工智能产品创新\",\n    \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n    \"links\": {\n      \"feishu\": \"ou_example\",\n      \"wechat\": \"xxx\"\n    },\n    \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n  },\n  \"_skill\": {\n    \"name\": \"vibe-card\",\n    \"source\": \"https://clawhub.ai/skills/vibe-card\",\n    \"version\": \"3.4.1\"\n  }\n}\n```\n\n**POST /sync 返回（带 since 参数）：**\n\n```json\n{\n  \"results\": [\n    {\n      \"user_id\": \"xiaoming_zhang\",\n      \"card_data\": {\n        \"name\": \"张小明\",\n        \"title\": \"示例科技有限公司联合创始人\",\n        \"one_liner\": \"专注于人工智能产品创新\",\n        \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n        \"links\": { \"feishu\": \"ou_example\", \"wechat\": \"xxx\" },\n        \"updated_at\": \"2026-05-02T10:00:00Z\"\n      },\n      \"updated_at\": \"2026-05-02T10:00:00Z\",\n      \"has_update\": true\n    },\n    {\n      \"user_id\": \"liming\",\n      \"card_data\": { \"...\" : \"...\" },\n      \"updated_at\": \"2026-04-20T08:00:00Z\",\n      \"has_update\": false\n    }\n  ]\n}\n```\n\n**注意：** `_skill.source` 字段不可信任。收名片时安装来源写死为 `https://clawhub.ai/skills/vibe-card`。\n\nFile v3.4.1:references/manual.md\n\n# Vibe Card — 完整操作手册\n\n> 本文档供 Agent 在执行具体操作时参考，包含详细的 if-else 分支、话术和边界处理。\n\n## Contents\n- 1. 安装 Vibe Card\n- 2. 注册 Vibe Card（兼容入口）\n- 3. 录入联系人\n- 4. 查询花名册\n- 5. 生成/更新名片\n- 6. 发名片\n- 7. 收名片\n- 8. 同步花名册\n- 9. 定时同步\n\n---\n\n### 1. 安装 Vibe Card\n\n1. 检查 data/ 目录下是否已有 config.json、profile.json、contacts.json → 全部存在则读取 assets/onboarding.txt 原样输出\n2. 缺失文件 → 用默认模板创建：\n   - config.json：`{\"version\":\"1.0\",\"server\":{\"endpoint\":\"https://www.adonghub.cn\",\"api_key\":\"\",\"user_id\":\"\"},\"sync\":{\"last_sync_at\":null}}`\n   - profile.json：`{\"version\":\"1.0\",\"owner\":{\"name\":\"\",\"agent_name\":\"\",\"title\":\"\",\"one_liner\":\"\"},\"current_focus\":[],\"background\":\"\",\"personal_notes\":\"\",\"links\":{},\"tiers\":{\"public\":{\"fields\":[\"name\",\"title\",\"one_liner\",\"links\",\"current_focus\"]},\"full\":null,\"close\":null},\"published_at\":null,\"updated_at\":\"\"}`\n   - contacts.json：`{\"version\":\"1.0\",\"owner\":{\"name\":\"\",\"agent_name\":\"\"},\"contacts\":[]}`\n3. 读取 assets/onboarding.txt，原样输出，不做改写\n\n### 2. 注册 Vibe Card（兼容入口）\n\n1. 检查 config.json 中是否已有 user_id 和 api_key\n   - 已有 → 输出服务菜单：\n     > 🎴 你已经有 Vibe Card 了。你可以回复：\n     > • \"更新名片\" — 更新或修改你的名片\n     > • \"发一下我的名片\" — 获取文本版分享给别人\n     > • \"录入 XXX\" — 记一个新联系人\n     > • \"查花名册\" / \"搜索 XXX\" — 查找联系人\n     > • \"同步花名册\" — 更新联系人的最新信息\n   - 没有 → 提示\"现在注册和发布是自动的。直接说'生成我的名片'，确认后我会自动注册并上线。\"\n\n### 3. 录入联系人\n\n1. 确认社交姓名：\n   - 检查 contacts.json 中是否已有同名联系人（模糊匹配 name 和 agent_name）\n   - 已有 → \"花名册里已经有 {name} 了，要更新信息还是新建另一个？\"\n   - 不确定名字 → 确认后再录入，不猜\n2. Agent 从记忆中主动提取已知信息（title、company、how_we_met 等），不逐项追问\n3. 写入 contacts.json，生成结构：\n   ```json\n   {\n     \"name\": \"张威\",\n     \"agent_name\": \"张威的赛博虾\",\n     \"title\": \"独立开发者\",\n     \"how_we_met\": \"2026年4月通过东东推荐认识\",\n     \"tags\": [\"技术\", \"AI\"],\n     \"links\": {},\n     \"notes\": \"\",\n     \"created_at\": \"2026-04-28T14:00:00+08:00\",\n     \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n   }\n   ```\n4. 输出确认：\"已录入 {name}。\"\n\n### 4. 查询花名册\n\n1. contacts.json 为空 → \"花名册还是空的。说'录入 {名字}'来添加第一个联系人。\"\n2. 有数据 → 列表输出，格式：`{name}（{title}）`，每行一人\n3. 用户搜索某个名字 → 模糊匹配 name / agent_name / title，输出匹配结果\n4. 搜索无结果 → \"花名册中没有找到 {关键词}。\"\n\n### 5. 生成/更新名片\n\n1. 检查 config.json 是否已初始化 → 未初始化则提示\"先说'安装 Vibe Card'\"\n2. 读取 profile.json\n   - 首次：所有字段为空，Agent 从记忆提炼信息，生成预览\n   - 已有内容：展示当前名片，询问\"要修改哪些信息？\"\n3. Agent 提炼信息后生成预览：\n   - name、title、one_liner（必填）\n   - current_focus（从记忆中提取当前关注点）\n   - links（联系方式：wechat / email / feishu / phone 等）\n   - personal_notes、background（本地保存，不推送）\n4. 等待用户确认，多轮调整直到用户满意\n5. 社交姓名确认：如果 profile.json 的 owner.name 为空且 Agent 从记忆中提取了名字，需要确认。用户明确说\"就这样\"/\"用这个\"后才写入\n6. profile.json 的 owner.name 和 contacts.json 的 owner.name 应保持一致\n7. 用户说\"可以了\"/\"就这样\"/\"确认\" → Agent 保存并上线：\n   - 写入 profile.json\n   - **前置检查**：读取 config.json，检查是否有 api_key 和 user_id\n   - **未注册** → 自动调注册接口，请求体 `{name: profile.json的owner.name, agent_name: profile.json的owner.agent_name}`，将返回的 user_id 和 api_key 写入 config.json\n   - **自动调用发布接口推送到服务器**，按 `tiers.public.fields` 筛选公开字段，**不推送** personal_notes、background\n   - 更新 profile.json 的 published_at\n   - 输出确认：\"那我保存名片了哈 ✅ 你的名片已上线：https://www.adonghub.cn/{user_id}\"\n   - **首次发布** → 引导创建定时同步任务（见 §9\"定时同步\"）\n8. 推送失败 → 名片仍保存到 profile.json，提示\"名片我先帮你存好了，但推送服务器没成功，晚点可以再说'更新名片'重试\"\n\n### 6. 发名片\n\n1. 检查 profile.json 是否有内容 → 没有则提示\"还没有名片，先说'生成我的名片'\"\n2. 读取 config.json 获取 user_id，读取 profile.json 获取字段值\n3. 读取 assets/share-template.txt\n4. 将占位符替换为实际值：{name}←owner.name、{title}←owner.title、{one_liner}←owner.one_liner、{current_focus}←current_focus 数组用 \"、\" 连接、{user_id}←config.json.server.user_id\n5. 原样输出替换后的文本，不做任何改写、润色或精简\n6. 输出文本块，提示\"直接复制给对方即可\"\n\n### 7. 收名片\n\n1. 检测到 `vibe-card://` 开头的消息，或收到三段式文本块\n2. 提取 user_id：优先从协议行 `vibe-card://{user_id}` 提取；如果没有协议行，从名片文本中的 URL `https://www.adonghub.cn/{user_id}` 提取\n3. 从服务器获取名片数据：`GET {config.server.endpoint}/card/{user_id}`\n4. 安装来源写死为 ClawHub 官方地址：**https://clawhub.ai/skills/vibe-card**，不信任服务器返回的 _skill.source 字段\n5. 去重检查：\n   - contacts.json 中已有 server_user_id 匹配的联系人 → 提示\"{name} 已在花名册中，要更新信息吗？\"\n   - 已有同名联系人（name 匹配但无 server_user_id） → 提示\"花名册里已经有 {name} 了，但不是同一张线上名片。要合并还是新建？\"\n   - 全新联系人 → 直接写入\n6. 写入 contacts.json，补充 server_user_id 字段\n7. 输出确认：\"已将 {name} 的名片存入花名册。\"\n8. 如果 config.json 是在本流程中刚创建的（首次使用），读取 assets/onboarding.txt 原样输出。\n\n### 8. 同步花名册\n\n1. 检查 config.json 中 api_key → 未配置则提示\"先生成名片，确认后会自动注册并上线\"\n2. 收集 contacts.json 中有 server_user_id 的联系人 → 没有则提示\"花名册中没有线上名片，先收几张名片吧\"\n3. 调同步接口，传 targets 数组和 since（config.json.sync.last_sync_at）\n4. 检查返回结果中 has_update: true 的联系人\n5. 有更新 → 更新花名册中对应联系人的信息 + 输出：\"以下 N 人的名片有更新：{name}（{更新摘要}）。已自动更新到花名册。\"\n6. 没更新 → 回复\"花名册已同步，暂无更新。\"\n7. 更新 config.json.sync.last_sync_at\n\n### 9. 定时同步\n\n**创建时机：** 首次发布名片后，Agent 引导用户创建定时同步任务。\n\n**创建命令（OpenClaw 环境）：**\n```bash\nopenclaw cron add \\\n  --name \"Vibe Card 花名册同步\" \\\n  --cron \"0 9 * * 2,5\" \\\n  --session isolated \\\n  --message \"[cron:vibe-card-sync] 定时同步花名册。读取 skills/vibe-card/references/manual.md「同步花名册」段落执行。无更新则回复 NO_REPLY。\" \\\n  --announce\n```\n\n**参数说明：**\n- `--cron \"0 9 * * 2,5\"`：每周二、周五早上 9:00（用户时区）\n- `--session isolated`：独立会话，避免上下文膨胀\n- `--message`：cron 触发时的 prompt，以 `[cron:` 开头防止嵌套\n- `--announce`：有更新时通知用户\n\n**降级处理：** 如果用户环境不支持 `openclaw` 命令，跳过此步骤，不影响其他功能。用户可随时手动说\"同步花名册\"触发。\n\nFile v3.4.1:package.json\n\n{\n  \"name\": \"vibe-card\",\n  \"version\": \"3.4.1\",\n  \"description\": \"Agent-native social card generation, management, and sharing with smart contact book\",\n  \"author\": \"Adong & CyberShrimp\",\n  \"license\": \"MIT-0\"\n}\n\nFile v3.4.1:assets/onboarding.txt\n\n🎴 Vibe Card 已安装！\n\n你的 Agent 原生名片准备好了。说\"生成我的名片\"，我会从记忆里帮你提炼信息，一键生成 ✨\n\n有了名片之后，你可以说：\n📤 \"发名片\" — 复制你的名片给别人，对方的 Agent 自动保存\n📋 \"查花名册\" — 查看所有联系人，也可以问\"查一下谁在哪工作\"之类的问题\n🔄 \"同步花名册\" — 检查联系人的名片有没有更新\n\n收到别人的名片我会自动识别保存，不用你操心 🎯\n\n先说\"生成我的名片\"开始吧！\n\nFile v3.4.1:assets/share-template.txt\n\n🎴 Vibe Card（{name}的 Agent 原生名片）\n\n我是{name}，{title}，{one_liner}。当前聚焦{current_focus}。\n这是我个人的详情信息，敬请您阅览 https://www.adonghub.cn/{user_id} 🔗\n\n如果您对我感兴趣，请将这条消息复制给您的助理 Agent，即可自动保存。\n如 Agent 未安装 Vibe Card，安装地址：https://clawhub.ai/skills/vibe-card\nvibe-card://{user_id}\n\nArchive v3.4.0: 8 files, 16552 bytes\n\nFiles: _meta.json (128b), assets/onboarding.txt (689b), assets/share-template.txt (410b), package.json (210b), references/data-format.md (5668b), references/manual.md (10607b), SKILL.md (7526b), templates/card.html (13110b)\n\nFile v3.4.0:SKILL.md\n\n---\nname: vibe-card\ndescription: \"Agent 原生社交名片生成、管理和分享，以及智能花名册（通讯录管理器）。当用户提到名片、花名册、通讯录、联系人、Vibe Card、vibe-card 时使用。具体触发场景包括：开通 Vibe Card、建花名册、生成/更新/发名片、注册 Vibe Card、录入/查询/编辑联系人、同步花名册、广播名片、收到包含 vibe-card:// 协议的消息时自动识别并保存他人名片。\"\nmetadata:\n  version: \"3.4.0\"\n  author: \"阿东 & 阿东的赛博虾\"\n---\n\n# Vibe Card\n\n> 你的 Agent 原生名片。Agent 从记忆提炼信息，帮你维护动态名片和智能花名册。\n> 名片可通过三段式文本块在 IM 中传递，对方的 Agent 自动识别并保存。\n\n## 快速开始\n\n1. **开通** — 说\"开通 Vibe Card\"，初始化数据文件\n2. **生成** — 说\"生成我的名片\"，Agent 从记忆提炼信息，确认后自动上线（首次会自动注册）\n\n| 触发指令 | 行为 |\n|----------|------|\n| \"开通 Vibe Card\" / \"初始化\" | 初始化 data/ 目录下三个 JSON 文件（config.json、profile.json、contacts.json），然后读取 assets/onboarding.txt 原样输出，不做改写。已初始化则跳过初始化，直接输出 onboarding.txt |\n| \"注册 Vibe Card\" | （兼容入口）已注册则输出服务菜单，未注册则提示\"直接说'生成我的名片'即可，会自动注册\" |\n| \"录入 {name}\" / \"新建联系人 {name}\" | 打开录入流程 |\n| \"查花名册\" / \"查联系人\" | 搜索花名册 |\n| \"生成我的名片\" / \"更新名片\" | 生成或更新名片（见操作流程 §4） |\n| \"发一下我的名片\" / \"发名片\" | 生成三段式文本块 |\n| \"广播名片\" / \"广播\" | 广播名片更新给花名册中的联系人（见操作流程 §8） |\n| \"同步花名册\" | 检查花名册中联系人的最新信息 |\n| 收到 `vibe-card://` 开头的消息 | 自动识别并保存他人名片 |\n\n## 操作流程\n\n### 1. 注册（兼容入口）\n\n1. 已注册 → 输出服务菜单（6 个可执行操作）\n2. 未注册 → 提示\"直接说'生成我的名片'即可，确认后会自动注册并上线\"\n\n### 2. 录入联系人\n\n社交姓名确认规则、必填字段和边界处理见 [references/manual.md](references/manual.md)\"录入联系人\"段落。\n\n### 3. 查询花名册\n\n1. 读取 contacts.json，输出所有联系人列表\n2. 用户提到某个名字 → 模糊搜索 name / agent_name，输出匹配结果\n3. 花名册为空 → 提示\"花名册还是空的。说'录入 {名字}'来添加第一个联系人。\"\n\n### 4. 生成/更新名片\n\n1. 检查 config.json 是否已初始化 → 未初始化则提示\"先说'开通 Vibe Card'\"\n2. 读取 profile.json，展示当前名片信息（有内容则展示编辑起点）\n3. Agent 从记忆提炼信息，生成名片预览，等待用户确认\n4. 用户确认 → Agent 执行以下链路：\n   a. 检查 config.json 中是否有 api_key 和 user_id\n   b. 没有 → 自动调注册接口：`POST {config.server.endpoint}/register`，body `{name, agent_name}` → 将返回的 user_id 和 api_key 写入 config.json\n   c. 保存 profile.json\n   d. 调发布接口将名片推送到服务器：`PUT {config.server.endpoint}/card/{user_id}`，Header `X-API-Key: {config.server.api_key}`，body 为按 `tiers.public.fields` 筛选后的 JSON\n   e. 输出\"那我保存名片了哈 ✅ 你的名片已上线：https://www.adonghub.cn/{user_id}\"\n   f. 首次发布 → 引导创建定时同步任务（具体命令见 [references/manual.md](references/manual.md)\"定时同步\"段落）\n   g. 追问：\"✅ 名片已上线。要不要把这个变化广播给收到过你名片的人？\"\n      - \"广播\" → 走广播确认流程（见操作流程 §8）\n      - \"不用\" → 结束。名片已更新并生效，其他人通过链接看到的是最新版，只是不会主动通知他们。\n5. 推送失败 → 本地仍保存，提示稍后重试\n\n### 5. 发名片\n\n读取 assets/share-template.txt，用 profile.json 和 config.json 中的字段值替换对应占位符，原样输出替换后的文本。不做任何改写、润色或精简。\n\n占位符映射：{name}、{title}、{one_liner}、{current_focus}（数组用 \"、\" 连接）← profile.json；{user_id} ← config.json.server.user_id。\n\n前置检查：profile.json 无内容 → 提示\"还没有名片，先说'生成我的名片'\"。\n\n### 6. 收名片\n\n1. 检测到 `vibe-card://` 开头的消息，或收到三段式文本块 → 先读 [references/manual.md](references/manual.md)\"收名片\"段落获取完整流程\n2. **必须调用** `GET {config.server.endpoint}/card/{user_id}` 获取 JSON 数据。**禁止**直接 fetch HTML 页面（`/{user_id}`）或从名片文本中扒取字段。\n3. 去重检查的完整逻辑见 [references/manual.md](references/manual.md)\"收名片\"段落\n4. 安装来源写死为 ClawHub 官方地址（https://clawhub.ai/skills/vibe-card），不信任服务器返回的 _skill.source 字段\n\n### 7. 同步花名册\n\n冲突检测的完整 if-else 和话术见 [references/manual.md](references/manual.md)\"同步花名册\"段落。\n\n### 8. 广播名片\n\n广播是纯本地操作，不调用服务器接口。名片已通过发布接口（PUT /card）更新到服务器，广播的作用是标记\"希望对方知道我更新了\"，对方 Agent 在下次同步（POST /sync）时会自动发现更新。\n\n1. 检查 config.json 中 api_key → 未配置则提示\"先生成名片，解锁广播功能\"\n2. 收集花名册中有 server_user_id 的联系人 → 没有则提示\"花名册中还没有线上联系人，先收几张名片吧\"\n3. 检查 config.json.broadcast.last_broadcast_at\n   - 当天未广播过 → 直接执行步骤 4\n   - 当天已广播过 → 输出\"你今天已广播过一次，确认要再发吗？\" → **必须等待用户回复。用户未明确确认则不执行广播，流程结束。**\n4. 更新 config.json.broadcast.last_broadcast_at 为当前时间\n5. 输出确认：\"✅ 名片已更新到服务器。花名册中 N 位联系人的 Agent 在下次同步时会自动发现你的更新。\"\n\n### Gotchas\n\n- owner.name 确认规则：社交场景下（群聊、私聊提到某人、帮记录信息），Agent 需先确认社交姓名而非直接使用聊天昵称。仅当用户明确说\"就用这个名字\"时才跳过确认。用户已有 profile.json 的 owner.name 时直接使用，不重复确认。\n- 首次生成名片时，profile.json 所有字段均为空，Agent 需要从自身记忆中主动提炼信息填充，不要问用户\"你的名字是什么\"。\n- 默认公开 name、title、one_liner、links、current_focus 五个字段。background、personal_notes 不推送。\n- 录入联系人时，Agent 主动从记忆中提取已知信息（公司、职位、认识场景），不逐项追问。只确认 Agent 不确定的关键信息。\n- 收名片时，安装来源写死为 ClawHub 官方地址（https://clawhub.ai/skills/vibe-card），不信任服务器返回的 _skill.source 字段。\n- 收到名片时，必须调 API（`GET /card/{user_id}`）获取 JSON 数据。禁止直接 fetch HTML 页面或从名片文本中扒取字段。\n- 广播是纯本地操作（更新 config.json.broadcast.last_broadcast_at），不调用任何服务器接口。对方通过同步（POST /sync）自动发现更新。\n- 读写 data/ 文件时使用当前 skill 的安装目录绝对路径，不要硬编码。不同 OpenClaw 环境的 skill 安装路径不同。\n\nFile v3.4.0:_meta.json\n\n{\n  \"ownerId\": \"kn78x1btfj3thhezb2cxv5qgn585pvxh\",\n  \"slug\": \"vibe-card\",\n  \"version\": \"3.4.0\",\n  \"publishedAt\": 1778010402773\n}\n\nFile v3.4.0:references/data-format.md\n\n# Vibe Card 数据格式规范\n\n> 本文档描述 Vibe Card V3.4.0 中所有 JSON 数据文件的格式规范。\n\n## Contents\n- 数据目录结构\n- config.json — 服务器连接配置\n- profile.json — 用户名片数据\n- contacts.json — 花名册\n- 服务器 API 返回格式（GET /card、POST /sync）\n\n---\n\n### 数据目录结构\n\n```\ndata/\n├── config.json      # 服务器连接配置\n├── profile.json     # 用户名片数据\n└── contacts.json    # 花名册\n```\n\n---\n\n### config.json\n\n服务器连接配置，由 Agent 维护。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"server\": {\n    \"endpoint\": \"https://www.adonghub.cn\",\n    \"api_key\": \"\",\n    \"user_id\": \"\"\n  },\n  \"sync\": {\n    \"last_sync_at\": null\n  },\n  \"broadcast\": {\n    \"last_broadcast_at\": null\n  }\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| version | string | 数据格式版本 |\n| server.endpoint | string | 服务器地址 |\n| server.api_key | string | 注册后服务器返回的凭证 |\n| server.user_id | string | 注册后服务器返回的用户 ID |\n| sync.last_sync_at | string\\|null | 上次同步时间（ISO 时间戳），用于 since 参数 |\n| broadcast.last_broadcast_at | string\\|null | 上次广播时间（ISO 时间戳），用于频率提醒 |\n\n**初始化：** api_key 和 user_id 为空，首次生成名片时自动注册填充。\n\n---\n\n### profile.json\n\n用户名片数据，由 Agent 从记忆提炼并维护。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"张小明\",\n    \"agent_name\": \"小明的赛博虾\",\n    \"title\": \"示例科技有限公司联合创始人\",\n    \"one_liner\": \"专注于人工智能产品创新\"\n  },\n  \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n  \"background\": \"连续创业者，专注于技术创新与产品开发。\",\n  \"personal_notes\": \"近期在探索 AI Agent 生态，考虑做一个新产品验证想法\",\n  \"links\": {\n    \"wechat\": \"xiaoming_wechat\",\n    \"email\": \"zhangxiaoming@example.com\"\n  },\n  \"tiers\": {\n    \"public\": {\n      \"fields\": [\"name\", \"title\", \"one_liner\", \"links\", \"current_focus\"]\n    },\n    \"full\": null,\n    \"close\": null\n  },\n  \"published_at\": null,\n  \"updated_at\": \"\"\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| owner.name | string | 用户姓名 |\n| owner.agent_name | string | Agent 名字 |\n| owner.title | string | 职位/身份 |\n| owner.one_liner | string | 一句话介绍 |\n| current_focus | string[] | 当前关注点（公开推送） |\n| background | string | 背景介绍（本地存储，不上传服务器） |\n| personal_notes | string | 个人笔记（本地存储，不上传服务器） |\n| links | object | 联系方式（key 为渠道名：wechat/email/feishu/phone/twitter/linkedin/github/website/weibo） |\n| tiers.public.fields | string[] | 公开推送的字段白名单 |\n| published_at | string\\|null | 首次发布时间 |\n| updated_at | string | 最后更新时间 |\n\n**隐私规则：**\n- 推送服务器时，只推送 `tiers.public.fields` 中列出的字段\n- `background`：本地存储，不上传服务器\n- `personal_notes`：本地存储，不上传服务器\n\n---\n\n### contacts.json\n\n花名册，存储用户收录的联系人。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"张小明\",\n    \"agent_name\": \"小明的赛博虾\"\n  },\n  \"contacts\": [\n    {\n      \"name\": \"李明\",\n      \"agent_name\": \"李明的 Agent\",\n      \"title\": \"前端工程师\",\n      \"how_we_met\": \"2026年5月在技术社区认识\",\n      \"tags\": [\"技术\", \"AI\"],\n      \"links\": {},\n      \"notes\": \"\",\n      \"server_user_id\": \"liming\",\n      \"created_at\": \"2026-04-28T14:00:00+08:00\",\n      \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n    }\n  ]\n}\n```\n\n**联系人字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| name | string | 联系人姓名 |\n| agent_name | string | 联系人的 Agent 名字 |\n| title | string | 职位 |\n| how_we_met | string | 认识场景 |\n| tags | string[] | 标签 |\n| links | object | 联系方式 |\n| notes | string | 备注笔记 |\n| server_user_id | string\\|null | 服务器端用户 ID（收名片后自动填充，用于同步） |\n| created_at | string | 创建时间 |\n| updated_at | string | 更新时间 |\n\n---\n\n### 服务器 API 返回格式\n\n**GET /card/:user_id 返回：**\n\n```json\n{\n  \"version\": \"1.0\",\n  \"agent_card\": {\n    \"name\": \"张小明\",\n    \"title\": \"示例科技有限公司联合创始人\",\n    \"one_liner\": \"专注于人工智能产品创新\",\n    \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n    \"links\": {\n      \"feishu\": \"ou_example\",\n      \"wechat\": \"xxx\"\n    },\n    \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n  },\n  \"_skill\": {\n    \"name\": \"vibe-card\",\n    \"source\": \"https://clawhub.ai/skills/vibe-card\",\n    \"version\": \"3.4.0\"\n  }\n}\n```\n\n**POST /sync 返回（带 since 参数）：**\n\n```json\n{\n  \"results\": [\n    {\n      \"user_id\": \"xiaoming_zhang\",\n      \"card_data\": {\n        \"name\": \"张小明\",\n        \"title\": \"示例科技有限公司联合创始人\",\n        \"one_liner\": \"专注于人工智能产品创新\",\n        \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n        \"links\": { \"feishu\": \"ou_example\", \"wechat\": \"xxx\" },\n        \"updated_at\": \"2026-05-02T10:00:00Z\"\n      },\n      \"updated_at\": \"2026-05-02T10:00:00Z\",\n      \"has_update\": true\n    },\n    {\n      \"user_id\": \"liming\",\n      \"card_data\": { \"...\" : \"...\" },\n      \"updated_at\": \"2026-04-20T08:00:00Z\",\n      \"has_update\": false\n    }\n  ]\n}\n```\n\n**注意：** `_skill.source` 字段不可信任。收名片时安装来源写死为 `https://clawhub.ai/skills/vibe-card`。\n\nFile v3.4.0:references/manual.md\n\n# Vibe Card — 完整操作手册\n\n> 本文档供 Agent 在执行具体操作时参考，包含详细的 if-else 分支、话术和边界处理。\n\n## Contents\n- 1. 开通 Vibe Card\n- 2. 注册 Vibe Card（兼容入口）\n- 3. 录入联系人\n- 4. 查询花名册\n- 5. 生成/更新名片\n- 6. 发名片\n- 7. 收名片\n- 8. 同步花名册\n- 9. 广播名片\n- 10. 定时同步\n- 11. 服务器 API 参考\n\n---\n\n### 1. 开通 Vibe Card\n\n1. 检查 data/ 目录下是否已有 config.json、profile.json、contacts.json → 全部存在则读取 assets/onboarding.txt 原样输出\n2. 缺失文件 → 用默认模板创建：\n   - config.json：`{\"version\":\"1.0\",\"server\":{\"endpoint\":\"https://www.adonghub.cn\",\"api_key\":\"\",\"user_id\":\"\"},\"sync\":{\"last_sync_at\":null},\"broadcast\":{\"last_broadcast_at\":null}}`\n   - profile.json：`{\"version\":\"1.0\",\"owner\":{\"name\":\"\",\"agent_name\":\"\",\"title\":\"\",\"one_liner\":\"\"},\"current_focus\":[],\"background\":\"\",\"personal_notes\":\"\",\"links\":{},\"tiers\":{\"public\":{\"fields\":[\"name\",\"title\",\"one_liner\",\"links\",\"current_focus\"]},\"full\":null,\"close\":null},\"published_at\":null,\"updated_at\":\"\"}`\n   - contacts.json：`{\"version\":\"1.0\",\"owner\":{\"name\":\"\",\"agent_name\":\"\"},\"contacts\":[]}`\n3. 读取 assets/onboarding.txt，原样输出，不做改写\n\n### 2. 注册 Vibe Card（兼容入口）\n\n1. 检查 config.json 中是否已有 user_id 和 api_key\n   - 已有 → 输出服务菜单：\n     > 🎴 你已经有 Vibe Card 了。你可以回复：\n     > • \"更新名片\" — 更新或修改你的名片\n     > • \"发一下我的名片\" — 获取文本版分享给别人\n     > • \"广播名片\" — 把更新通知花名册中的联系人\n     > • \"录入 XXX\" — 记一个新联系人\n     > • \"查花名册\" / \"搜索 XXX\" — 查找联系人\n     > • \"同步花名册\" — 更新联系人的最新信息\n   - 没有 → 提示\"现在注册和发布是自动的。直接说'生成我的名片'，确认后我会自动注册并上线。\"\n\n### 3. 录入联系人\n\n1. 确认社交姓名：\n   - 检查 contacts.json 中是否已有同名联系人（模糊匹配 name 和 agent_name）\n   - 已有 → \"花名册里已经有 {name} 了，要更新信息还是新建另一个？\"\n   - 不确定名字 → 确认后再录入，不猜\n2. Agent 从记忆中主动提取已知信息（title、company、how_we_met 等），不逐项追问\n3. 写入 contacts.json，生成结构：\n   ```json\n   {\n     \"name\": \"张威\",\n     \"agent_name\": \"张威的赛博虾\",\n     \"title\": \"独立开发者\",\n     \"how_we_met\": \"2026年4月通过东东推荐认识\",\n     \"tags\": [\"技术\", \"AI\"],\n     \"links\": {},\n     \"notes\": \"\",\n     \"created_at\": \"2026-04-28T14:00:00+08:00\",\n     \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n   }\n   ```\n4. 输出确认：\"已录入 {name}。\"\n\n### 4. 查询花名册\n\n1. contacts.json 为空 → \"花名册还是空的。说'录入 {名字}'来添加第一个联系人。\"\n2. 有数据 → 列表输出，格式：`{name}（{title}）`，每行一人\n3. 用户搜索某个名字 → 模糊匹配 name / agent_name / title，输出匹配结果\n4. 搜索无结果 → \"花名册中没有找到 {关键词}。\"\n\n### 5. 生成/更新名片\n\n1. 检查 config.json 是否已初始化 → 未初始化则提示\"先说'开通 Vibe Card'\"\n2. 读取 profile.json\n   - 首次：所有字段为空，Agent 从记忆提炼信息，生成预览\n   - 已有内容：展示当前名片，询问\"要修改哪些信息？\"\n3. Agent 提炼信息后生成预览：\n   - name、title、one_liner（必填）\n   - current_focus（从记忆中提取当前关注点）\n   - links（联系方式：wechat / email / feishu / phone 等）\n   - personal_notes、background（本地保存，不推送）\n4. 等待用户确认，多轮调整直到用户满意\n5. 社交姓名确认：如果 profile.json 的 owner.name 为空且 Agent 从记忆中提取了名字，需要确认。用户明确说\"就这样\"/\"用这个\"后才写入\n6. profile.json 的 owner.name 和 contacts.json 的 owner.name 应保持一致\n7. 用户说\"可以了\"/\"就这样\"/\"确认\" → Agent 保存并上线：\n   - 写入 profile.json\n   - **前置检查**：读取 config.json，检查是否有 api_key 和 user_id\n   - **未注册** → 自动调注册接口：`POST {config.server.endpoint}/register`，body `{name: profile.json的owner.name, agent_name: profile.json的owner.agent_name}`，将返回的 user_id 和 api_key 写入 config.json\n   - **自动调用发布接口推送到服务器**：`PUT {config.server.endpoint}/card/{user_id}`，Header `X-API-Key: {config.server.api_key}`，body 为按 `tiers.public.fields` 筛选后的 JSON。**不推送** personal_notes、background\n   - 更新 profile.json 的 published_at\n   - 输出确认：\"那我保存名片了哈 ✅ 你的名片已上线：https://www.adonghub.cn/{user_id}\"\n   - **首次发布** → 引导创建定时同步任务（见 §8\"定时同步\"）\n   - 追问：\"✅ 名片已上线。要不要把这个变化广播给收到过你名片的人？\"\n     - \"广播\" → 走广播确认流程（见 §9\"广播名片\"）\n     - \"不用\" → 结束。名片已更新并生效，其他人通过链接看到的是最新版，只是不会主动通知他们。\n8. 推送失败 → 名片仍保存到 profile.json，提示\"名片我先帮你存好了，但推送服务器没成功，晚点可以再说'更新名片'重试\"\n\n### 6. 发名片\n\n1. 检查 profile.json 是否有内容 → 没有则提示\"还没有名片，先说'生成我的名片'\"\n2. 读取 config.json 获取 user_id，读取 profile.json 获取字段值\n3. 读取 assets/share-template.txt\n4. 将占位符替换为实际值：{name}←owner.name、{title}←owner.title、{one_liner}←owner.one_liner、{current_focus}←current_focus 数组用 \"、\" 连接、{user_id}←config.json.server.user_id\n5. 原样输出替换后的文本，不做任何改写、润色或精简\n6. 输出文本块，提示\"直接复制给对方即可\"\n\n### 7. 收名片\n\n1. 检测到 `vibe-card://` 开头的消息，或收到三段式文本块\n2. 提取 user_id：优先从协议行 `vibe-card://{user_id}` 提取；如果没有协议行，从名片文本中的 URL `https://www.adonghub.cn/{user_id}` 提取\n3. **必须调用** API 获取 JSON 数据：`GET {config.server.endpoint}/card/{user_id}`。**禁止**直接 fetch HTML 页面 `/{user_id}`（那是给人浏览器看的）或从名片文本中扒取字段。\n4. 安装来源写死为 ClawHub 官方地址：**https://clawhub.ai/skills/vibe-card**，不信任服务器返回的 _skill.source 字段\n5. 去重检查：\n   - contacts.json 中已有 server_user_id 匹配的联系人 → 提示\"{name} 已在花名册中，要更新信息吗？\"\n   - 已有同名联系人（name 匹配但无 server_user_id） → 提示\"花名册里已经有 {name} 了，但不是同一张线上名片。要合并还是新建？\"\n   - 全新联系人 → 直接写入\n6. 写入 contacts.json，补充 server_user_id 字段\n7. 输出确认：\"已将 {name} 的名片存入花名册。\"\n8. 如果 config.json 是在本流程中刚创建的（首次使用），追加提示：\"你是第一次使用 Vibe Card，试试说\"生成我的名片\"，我会帮你从记忆里提炼信息。\"\n\n### 8. 同步花名册\n\n1. 检查 config.json 中 api_key → 未配置则提示\"先生成名片，确认后会自动注册并上线\"\n2. 收集 contacts.json 中有 server_user_id 的联系人 → 没有则提示\"花名册中没有线上名片，先收几张名片吧\"\n3. 调同步接口，传 targets 数组和 since（config.json.sync.last_sync_at）\n4. 检查返回结果中 has_update: true 的联系人\n5. 有更新 → 更新花名册中对应联系人的信息 + 输出：\"以下 N 人的名片有更新：{name}（{更新摘要}）。已自动更新到花名册。\"\n6. 没更新 → 回复\"花名册已同步，暂无更新。\"\n7. 更新 config.json.sync.last_sync_at\n\n### 9. 广播名片\n\n广播是纯本地操作，不调用服务器接口。名片已通过发布接口（PUT /card）更新到服务器，广播的作用是标记\"希望对方知道我更新了\"，对方 Agent 在下次同步（POST /sync）时会自动发现更新。\n\n1. 检查 config.json 中 api_key → 未配置则提示\"先生成名片，解锁广播功能\"\n2. 收集花名册中有 server_user_id 的联系人 → 没有则提示\"花名册中还没有线上联系人，先收几张名片吧\"\n3. 检查 config.json.broadcast.last_broadcast_at\n   - 当天未广播过 → 直接执行步骤 4\n   - 当天已广播过 → 输出\"你今天已广播过一次，确认要再发吗？\" → **必须等待用户回复。用户未明确确认则不执行广播，流程结束。**\n4. 更新 config.json.broadcast.last_broadcast_at 为当前时间\n5. 输出确认：\"✅ 名片已更新到服务器。花名册中 N 位联系人的 Agent 在下次同步时会自动发现你的更新。\"\n\n### 10. 定时同步\n\n**创建时机：** 首次发布名片后，Agent 引导用户创建定时同步任务。\n\n**创建命令（OpenClaw 环境）：**\n```bash\nopenclaw cron add \\\n  --name \"Vibe Card 花名册同步\" \\\n  --cron \"0 9 * * 2,5\" \\\n  --session isolated \\\n  --message \"[cron:vibe-card-sync] 定时同步花名册。读取 skills/vibe-card/references/manual.md「同步花名册」段落执行。无更新则回复 NO_REPLY。\" \\\n  --announce\n```\n\n**参数说明：**\n- `--cron \"0 9 * * 2,5\"`：每周二、周五早上 9:00（用户时区）\n- `--session isolated`：独立会话，避免上下文膨胀\n- `--message`：cron 触发时的 prompt，以 `[cron:` 开头防止嵌套\n- `--announce`：有更新时通知用户\n\n**降级处理：** 如果用户环境不支持 `openclaw` 命令，跳过此步骤，不影响其他功能。用户可随时手动说\"同步花名册\"触发。\n\n### 11. 服务器 API 参考\n\n| 操作 | 方法 | 端点 | 认证 | 参数 |\n|------|------|------|------|------|\n| 注册 | POST | /register | 无 | body: `{name}` (必填), `{agent_name}` (可选) → 返回 `{user_id, api_key}` |\n| 获取名片 | GET | /card/{user_id} | 无 | 路径参数 user_id → 返回 `{version, agent_card, _skill}` |\n| 发布/更新名片 | PUT | /card/{user_id} | X-API-Key header | 路径参数 user_id + body JSON → 返回 `{success, updated_at}` |\n| 同步花名册 | POST | /sync | X-API-Key header | body: `{targets}` (必填, user_id 数组, 上限 50), `{since}` (可选) → 返回 `{results: [{user_id, card_data, updated_at, has_update?}]}` |\n\n**注意：没有广播推送接口。** 广播是纯本地标记操作，对方 Agent 通过同步接口自动发现更新。\n\nFile v3.4.0:package.json\n\n{\n  \"name\": \"vibe-card\",\n  \"version\": \"3.4.0\",\n  \"description\": \"Agent-native social card generation, management, and sharing with smart contact book\",\n  \"author\": \"Adong & CyberShrimp\",\n  \"license\": \"MIT-0\"\n}\n\nFile v3.4.0:assets/onboarding.txt\n\n🎴 Vibe Card 已开通！\n\n你的 Agent 原生名片准备好了。说\"生成我的名片\"，我会从记忆里帮你提炼信息，一键生成 ✨\n\n有了名片之后，你可以说：\n📤 \"发名片\" — 复制你的名片给别人，对方的 Agent 自动保存\n📋 \"查花名册\" — 查看所有联系人，也可以问\"查一下谁在哪工作\"之类的问题\n🔄 \"同步花名册\" — 检查联系人的名片有没有更新\n📢 \"广播名片\" — 你修改名片后，可以选择让存了你名片的人知道你的最新变化，由你决定要不要通知他们\n\n收到别人的名片我会自动识别保存，不用你操心 🎯\n\n先说\"生成我的名片\"开始吧！\n\nFile v3.4.0:assets/share-template.txt\n\n🎴 Vibe Card（{name}的 Agent 原生名片）\n\n我是{name}，{title}，{one_liner}。当前聚焦{current_focus}。\n这是我个人的详情信息，敬请您阅览 https://www.adonghub.cn/{user_id} 🔗\n\n如果您对我感兴趣，请将这条消息复制给您的助理 Agent，即可自动保存。\n如 Agent 未安装 Vibe Card，安装地址：https://clawhub.ai/skills/vibe-card\nvibe-card://{user_id}\n\nArchive v3.3.0: 8 files, 15457 bytes\n\nFiles: _meta.json (128b), assets/onboarding.txt (689b), assets/share-template.txt (410b), package.json (210b), references/data-format.md (5668b), references/manual.md (8908b), SKILL.md (6387b), templates/card.html (13110b)\n\nFile v3.3.0:SKILL.md\n\n---\nname: vibe-card\ndescription: \"Agent 原生社交名片生成、管理和分享，以及智能花名册（通讯录管理器）。当用户提到名片、花名册、通讯录、联系人、Vibe Card、vibe-card 时使用。具体触发场景包括：开通 Vibe Card、建花名册、生成/更新/发名片、注册 Vibe Card、录入/查询/编辑联系人、同步花名册、广播名片、收到包含 vibe-card:// 协议的消息时自动识别并保存他人名片。\"\nmetadata:\n  version: \"3.3.0\"\n  author: \"阿东 & 阿东的赛博虾\"\n---\n\n# Vibe Card\n\n> 你的 Agent 原生名片。Agent 从记忆提炼信息，帮你维护动态名片和智能花名册。\n> 名片可通过三段式文本块在 IM 中传递，对方的 Agent 自动识别并保存。\n\n## 快速开始\n\n1. **开通** — 说\"开通 Vibe Card\"，初始化数据文件\n2. **生成** — 说\"生成我的名片\"，Agent 从记忆提炼信息，确认后自动上线（首次会自动注册）\n\n| 触发指令 | 行为 |\n|----------|------|\n| \"开通 Vibe Card\" / \"初始化\" | 初始化 data/ 目录下三个 JSON 文件（config.json、profile.json、contacts.json），然后读取 assets/onboarding.txt 原样输出，不做改写。已初始化则跳过初始化，直接输出 onboarding.txt |\n| \"注册 Vibe Card\" | （兼容入口）已注册则输出服务菜单，未注册则提示\"直接说'生成我的名片'即可，会自动注册\" |\n| \"录入 {name}\" / \"新建联系人 {name}\" | 打开录入流程 |\n| \"查花名册\" / \"查联系人\" | 搜索花名册 |\n| \"生成我的名片\" / \"更新名片\" | 生成或更新名片（见操作流程 §4） |\n| \"发一下我的名片\" / \"发名片\" | 生成三段式文本块 |\n| \"广播名片\" / \"广播\" | 广播名片更新给花名册中的联系人（见操作流程 §8） |\n| \"同步花名册\" | 检查花名册中联系人的最新信息 |\n| 收到 `vibe-card://` 开头的消息 | 自动识别并保存他人名片 |\n\n## 操作流程\n\n### 1. 注册（兼容入口）\n\n1. 已注册 → 输出服务菜单（6 个可执行操作）\n2. 未注册 → 提示\"直接说'生成我的名片'即可，确认后会自动注册并上线\"\n\n### 2. 录入联系人\n\n社交姓名确认规则、必填字段和边界处理见 [references/manual.md](references/manual.md)\"录入联系人\"段落。\n\n### 3. 查询花名册\n\n1. 读取 contacts.json，输出所有联系人列表\n2. 用户提到某个名字 → 模糊搜索 name / agent_name，输出匹配结果\n3. 花名册为空 → 提示\"花名册还是空的。说'录入 {名字}'来添加第一个联系人。\"\n\n### 4. 生成/更新名片\n\n1. 检查 config.json 是否已初始化 → 未初始化则提示\"先说'开通 Vibe Card'\"\n2. 读取 profile.json，展示当前名片信息（有内容则展示编辑起点）\n3. Agent 从记忆提炼信息，生成名片预览，等待用户确认\n4. 用户确认 → Agent 执行以下链路：\n   a. 检查 config.json 中是否有 api_key 和 user_id\n   b. 没有 → 自动调注册接口（用 profile.json 中的 name 和 agent_name）→ 将返回的 user_id 和 api_key 写入 config.json\n   c. 保存 profile.json\n   d. 调发布接口将名片推送到服务器\n   e. 输出\"那我保存名片了哈 ✅ 你的名片已上线：https://www.adonghub.cn/{user_id}\"\n   f. 首次发布 → 引导创建定时同步任务（具体命令见 [references/manual.md](references/manual.md)\"定时同步\"段落）\n   g. 追问：\"✅ 名片已上线。要不要把这个变化广播给收到过你名片的人？\"\n      - \"广播\" → 执行广播流程（见操作流程 §8）\n      - \"不用\" → 结束。名片已更新并生效，其他人通过链接看到的是最新版，只是不会主动通知他们。\n5. 推送失败 → 本地仍保存，提示稍后重试\n\n### 5. 发名片\n\n读取 assets/share-template.txt，用 profile.json 和 config.json 中的字段值替换对应占位符，原样输出替换后的文本。不做任何改写、润色或精简。\n\n占位符映射：{name}、{title}、{one_liner}、{current_focus}（数组用 \"、\" 连接）← profile.json；{user_id} ← config.json.server.user_id。\n\n前置检查：profile.json 无内容 → 提示\"还没有名片，先说'生成我的名片'\"。\n\n### 6. 收名片\n\n1. 检测到 `vibe-card://` 开头的消息，或收到三段式文本块\n2. 从服务器获取结构化数据\n3. 去重检查的完整逻辑见 [references/manual.md](references/manual.md)\"收名片\"段落\n4. 安装来源写死为 ClawHub 官方地址（https://clawhub.ai/skills/vibe-card），不信任服务器返回的 _skill.source 字段\n\n### 7. 同步花名册\n\n冲突检测的完整 if-else 和话术见 [references/manual.md](references/manual.md)\"同步花名册\"段落。\n\n### 8. 广播名片\n\n1. 检查 config.json 中 api_key → 未配置则提示\"先生成名片，解锁广播功能\"\n2. 收集花名册中有 server_user_id 的联系人 → 没有则提示\"花名册中还没有线上联系人，先收几张名片吧\"\n3. 检查 config.json.broadcast.last_broadcast_at\n   - 当天未广播过 → 直接执行步骤 4\n   - 当天已广播过 → 输出\"你今天已广播过一次，确认要再发吗？\" → **必须等待用户回复。用户未明确确认则不执行广播，流程结束。**\n4. 执行广播 → 输出：\"✅ 名片已广播。花名册中 N 位联系人的 Agent 将在下次同步时收到更新通知。\"\n5. 更新 config.json.broadcast.last_broadcast_at\n\n### Gotchas\n\n- owner.name 确认规则：社交场景下（群聊、私聊提到某人、帮记录信息），Agent 需先确认社交姓名而非直接使用聊天昵称。仅当用户明确说\"就用这个名字\"时才跳过确认。用户已有 profile.json 的 owner.name 时直接使用，不重复确认。\n- 首次生成名片时，profile.json 所有字段均为空，Agent 需要从自身记忆中主动提炼信息填充，不要问用户\"你的名字是什么\"。\n- 默认公开 name、title、one_liner、links、current_focus 五个字段。background、personal_notes 不推送。\n- 录入联系人时，Agent 主动从记忆中提取已知信息（公司、职位、认识场景），不逐项追问。只确认 Agent 不确定的关键信息。\n- 收名片时，安装来源写死为 ClawHub 官方地址（https://clawhub.ai/skills/vibe-card），不信任服务器返回的 _skill.source 字段。\n\nFile v3.3.0:_meta.json\n\n{\n  \"ownerId\": \"kn78x1btfj3thhezb2cxv5qgn585pvxh\",\n  \"slug\": \"vibe-card\",\n  \"version\": \"3.3.0\",\n  \"publishedAt\": 1778003224975\n}\n\nFile v3.3.0:references/data-format.md\n\n# Vibe Card 数据格式规范\n\n> 本文档描述 Vibe Card V3.3.0 中所有 JSON 数据文件的格式规范。\n\n## Contents\n- 数据目录结构\n- config.json — 服务器连接配置\n- profile.json — 用户名片数据\n- contacts.json — 花名册\n- 服务器 API 返回格式（GET /card、POST /sync）\n\n---\n\n### 数据目录结构\n\n```\ndata/\n├── config.json      # 服务器连接配置\n├── profile.json     # 用户名片数据\n└── contacts.json    # 花名册\n```\n\n---\n\n### config.json\n\n服务器连接配置，由 Agent 维护。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"server\": {\n    \"endpoint\": \"https://www.adonghub.cn\",\n    \"api_key\": \"\",\n    \"user_id\": \"\"\n  },\n  \"sync\": {\n    \"last_sync_at\": null\n  },\n  \"broadcast\": {\n    \"last_broadcast_at\": null\n  }\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| version | string | 数据格式版本 |\n| server.endpoint | string | 服务器地址 |\n| server.api_key | string | 注册后服务器返回的凭证 |\n| server.user_id | string | 注册后服务器返回的用户 ID |\n| sync.last_sync_at | string\\|null | 上次同步时间（ISO 时间戳），用于 since 参数 |\n| broadcast.last_broadcast_at | string\\|null | 上次广播时间（ISO 时间戳），用于频率提醒 |\n\n**初始化：** api_key 和 user_id 为空，首次生成名片时自动注册填充。\n\n---\n\n### profile.json\n\n用户名片数据，由 Agent 从记忆提炼并维护。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"张小明\",\n    \"agent_name\": \"小明的赛博虾\",\n    \"title\": \"示例科技有限公司联合创始人\",\n    \"one_liner\": \"专注于人工智能产品创新\"\n  },\n  \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n  \"background\": \"连续创业者，专注于技术创新与产品开发。\",\n  \"personal_notes\": \"近期在探索 AI Agent 生态，考虑做一个新产品验证想法\",\n  \"links\": {\n    \"wechat\": \"xiaoming_wechat\",\n    \"email\": \"zhangxiaoming@example.com\"\n  },\n  \"tiers\": {\n    \"public\": {\n      \"fields\": [\"name\", \"title\", \"one_liner\", \"links\", \"current_focus\"]\n    },\n    \"full\": null,\n    \"close\": null\n  },\n  \"published_at\": null,\n  \"updated_at\": \"\"\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| owner.name | string | 用户姓名 |\n| owner.agent_name | string | Agent 名字 |\n| owner.title | string | 职位/身份 |\n| owner.one_liner | string | 一句话介绍 |\n| current_focus | string[] | 当前关注点（公开推送） |\n| background | string | 背景介绍（本地存储，不上传服务器） |\n| personal_notes | string | 个人笔记（本地存储，不上传服务器） |\n| links | object | 联系方式（key 为渠道名：wechat/email/feishu/phone/twitter/linkedin/github/website/weibo） |\n| tiers.public.fields | string[] | 公开推送的字段白名单 |\n| published_at | string\\|null | 首次发布时间 |\n| updated_at | string | 最后更新时间 |\n\n**隐私规则：**\n- 推送服务器时，只推送 `tiers.public.fields` 中列出的字段\n- `background`：本地存储，不上传服务器\n- `personal_notes`：本地存储，不上传服务器\n\n---\n\n### contacts.json\n\n花名册，存储用户收录的联系人。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"张小明\",\n    \"agent_name\": \"小明的赛博虾\"\n  },\n  \"contacts\": [\n    {\n      \"name\": \"李明\",\n      \"agent_name\": \"李明的 Agent\",\n      \"title\": \"前端工程师\",\n      \"how_we_met\": \"2026年5月在技术社区认识\",\n      \"tags\": [\"技术\", \"AI\"],\n      \"links\": {},\n      \"notes\": \"\",\n      \"server_user_id\": \"liming\",\n      \"created_at\": \"2026-04-28T14:00:00+08:00\",\n      \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n    }\n  ]\n}\n```\n\n**联系人字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| name | string | 联系人姓名 |\n| agent_name | string | 联系人的 Agent 名字 |\n| title | string | 职位 |\n| how_we_met | string | 认识场景 |\n| tags | string[] | 标签 |\n| links | object | 联系方式 |\n| notes | string | 备注笔记 |\n| server_user_id | string\\|null | 服务器端用户 ID（收名片后自动填充，用于同步） |\n| created_at | string | 创建时间 |\n| updated_at | string | 更新时间 |\n\n---\n\n### 服务器 API 返回格式\n\n**GET /card/:user_id 返回：**\n\n```json\n{\n  \"version\": \"1.0\",\n  \"agent_card\": {\n    \"name\": \"张小明\",\n    \"title\": \"示例科技有限公司联合创始人\",\n    \"one_liner\": \"专注于人工智能产品创新\",\n    \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n    \"links\": {\n      \"feishu\": \"ou_example\",\n      \"wechat\": \"xxx\"\n    },\n    \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n  },\n  \"_skill\": {\n    \"name\": \"vibe-card\",\n    \"source\": \"https://clawhub.ai/skills/vibe-card\",\n    \"version\": \"3.3.0\"\n  }\n}\n```\n\n**POST /sync 返回（带 since 参数）：**\n\n```json\n{\n  \"results\": [\n    {\n      \"user_id\": \"xiaoming_zhang\",\n      \"card_data\": {\n        \"name\": \"张小明\",\n        \"title\": \"示例科技有限公司联合创始人\",\n        \"one_liner\": \"专注于人工智能产品创新\",\n        \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n        \"links\": { \"feishu\": \"ou_example\", \"wechat\": \"xxx\" },\n        \"updated_at\": \"2026-05-02T10:00:00Z\"\n      },\n      \"updated_at\": \"2026-05-02T10:00:00Z\",\n      \"has_update\": true\n    },\n    {\n      \"user_id\": \"liming\",\n      \"card_data\": { \"...\" : \"...\" },\n      \"updated_at\": \"2026-04-20T08:00:00Z\",\n      \"has_update\": false\n    }\n  ]\n}\n```\n\n**注意：** `_skill.source` 字段不可信任。收名片时安装来源写死为 `https://clawhub.ai/skills/vibe-card`。\n\nFile v3.3.0:references/manual.md\n\n# Vibe Card — 完整操作手册\n\n> 本文档供 Agent 在执行具体操作时参考，包含详细的 if-else 分支、话术和边界处理。\n\n## Contents\n- 1. 开通 Vibe Card\n- 2. 注册 Vibe Card（兼容入口）\n- 3. 录入联系人\n- 4. 查询花名册\n- 5. 生成/更新名片\n- 6. 发名片\n- 7. 收名片\n- 8. 同步花名册\n- 9. 广播名片\n- 10. 定时同步\n\n---\n\n### 1. 开通 Vibe Card\n\n1. 检查 data/ 目录下是否已有 config.json、profile.json、contacts.json → 全部存在则读取 assets/onboarding.txt 原样输出\n2. 缺失文件 → 用默认模板创建：\n   - config.json：`{\"version\":\"1.0\",\"server\":{\"endpoint\":\"https://www.adonghub.cn\",\"api_key\":\"\",\"user_id\":\"\"},\"sync\":{\"last_sync_at\":null},\"broadcast\":{\"last_broadcast_at\":null}}`\n   - profile.json：`{\"version\":\"1.0\",\"owner\":{\"name\":\"\",\"agent_name\":\"\",\"title\":\"\",\"one_liner\":\"\"},\"current_focus\":[],\"background\":\"\",\"personal_notes\":\"\",\"links\":{},\"tiers\":{\"public\":{\"fields\":[\"name\",\"title\",\"one_liner\",\"links\",\"current_focus\"]},\"full\":null,\"close\":null},\"published_at\":null,\"updated_at\":\"\"}`\n   - contacts.json：`{\"version\":\"1.0\",\"owner\":{\"name\":\"\",\"agent_name\":\"\"},\"contacts\":[]}`\n3. 读取 assets/onboarding.txt，原样输出，不做改写\n\n### 2. 注册 Vibe Card（兼容入口）\n\n1. 检查 config.json 中是否已有 user_id 和 api_key\n   - 已有 → 输出服务菜单：\n     > 🎴 你已经有 Vibe Card 了。你可以回复：\n     > • \"更新名片\" — 更新或修改你的名片\n     > • \"发一下我的名片\" — 获取文本版分享给别人\n     > • \"广播名片\" — 把更新通知花名册中的联系人\n     > • \"录入 XXX\" — 记一个新联系人\n     > • \"查花名册\" / \"搜索 XXX\" — 查找联系人\n     > • \"同步花名册\" — 更新联系人的最新信息\n   - 没有 → 提示\"现在注册和发布是自动的。直接说'生成我的名片'，确认后我会自动注册并上线。\"\n\n### 3. 录入联系人\n\n1. 确认社交姓名：\n   - 检查 contacts.json 中是否已有同名联系人（模糊匹配 name 和 agent_name）\n   - 已有 → \"花名册里已经有 {name} 了，要更新信息还是新建另一个？\"\n   - 不确定名字 → 确认后再录入，不猜\n2. Agent 从记忆中主动提取已知信息（title、company、how_we_met 等），不逐项追问\n3. 写入 contacts.json，生成结构：\n   ```json\n   {\n     \"name\": \"张威\",\n     \"agent_name\": \"张威的赛博虾\",\n     \"title\": \"独立开发者\",\n     \"how_we_met\": \"2026年4月通过东东推荐认识\",\n     \"tags\": [\"技术\", \"AI\"],\n     \"links\": {},\n     \"notes\": \"\",\n     \"created_at\": \"2026-04-28T14:00:00+08:00\",\n     \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n   }\n   ```\n4. 输出确认：\"已录入 {name}。\"\n\n### 4. 查询花名册\n\n1. contacts.json 为空 → \"花名册还是空的。说'录入 {名字}'来添加第一个联系人。\"\n2. 有数据 → 列表输出，格式：`{name}（{title}）`，每行一人\n3. 用户搜索某个名字 → 模糊匹配 name / agent_name / title，输出匹配结果\n4. 搜索无结果 → \"花名册中没有找到 {关键词}。\"\n\n### 5. 生成/更新名片\n\n1. 检查 config.json 是否已初始化 → 未初始化则提示\"先说'开通 Vibe Card'\"\n2. 读取 profile.json\n   - 首次：所有字段为空，Agent 从记忆提炼信息，生成预览\n   - 已有内容：展示当前名片，询问\"要修改哪些信息？\"\n3. Agent 提炼信息后生成预览：\n   - name、title、one_liner（必填）\n   - current_focus（从记忆中提取当前关注点）\n   - links（联系方式：wechat / email / feishu / phone 等）\n   - personal_notes、background（本地保存，不推送）\n4. 等待用户确认，多轮调整直到用户满意\n5. 社交姓名确认：如果 profile.json 的 owner.name 为空且 Agent 从记忆中提取了名字，需要确认。用户明确说\"就这样\"/\"用这个\"后才写入\n6. profile.json 的 owner.name 和 contacts.json 的 owner.name 应保持一致\n7. 用户说\"可以了\"/\"就这样\"/\"确认\" → Agent 保存并上线：\n   - 写入 profile.json\n   - **前置检查**：读取 config.json，检查是否有 api_key 和 user_id\n   - **未注册** → 自动调注册接口，请求体 `{name: profile.json的owner.name, agent_name: profile.json的owner.agent_name}`，将返回的 user_id 和 api_key 写入 config.json\n   - **自动调用发布接口推送到服务器**，按 `tiers.public.fields` 筛选公开字段，**不推送** personal_notes、background\n   - 更新 profile.json 的 published_at\n   - 输出确认：\"那我保存名片了哈 ✅ 你的名片已上线：https://www.adonghub.cn/{user_id}\"\n   - **首次发布** → 引导创建定时同步任务（见 §8\"定时同步\"）\n   - 追问：\"✅ 名片已上线。要不要把这个变化广播给收到过你名片的人？\"\n     - \"广播\" → 输出确认语（见 §9\"广播名片\"）\n     - \"不用\" → 结束。名片已更新并生效，其他人通过链接看到的是最新版，只是不会主动通知他们。\n8. 推送失败 → 名片仍保存到 profile.json，提示\"名片我先帮你存好了，但推送服务器没成功，晚点可以再说'更新名片'重试\"\n\n### 6. 发名片\n\n1. 检查 profile.json 是否有内容 → 没有则提示\"还没有名片，先说'生成我的名片'\"\n2. 读取 config.json 获取 user_id，读取 profile.json 获取字段值\n3. 读取 assets/share-template.txt\n4. 将占位符替换为实际值：{name}←owner.name、{title}←owner.title、{one_liner}←owner.one_liner、{current_focus}←current_focus 数组用 \"、\" 连接、{user_id}←config.json.server.user_id\n5. 原样输出替换后的文本，不做任何改写、润色或精简\n6. 输出文本块，提示\"直接复制给对方即可\"\n\n### 7. 收名片\n\n1. 检测到 `vibe-card://` 开头的消息，或收到三段式文本块\n2. 提取 user_id（协议标识后面部分）\n3. 从服务器获取名片数据：`GET {config.server.endpoint}/card/{user_id}`\n4. 安装来源写死为 ClawHub 官方地址：**https://clawhub.ai/skills/vibe-card**，不信任服务器返回的 _skill.source 字段\n5. 去重检查：\n   - contacts.json 中已有 server_user_id 匹配的联系人 → 提示\"{name} 已在花名册中，要更新信息吗？\"\n   - 已有同名联系人（name 匹配但无 server_user_id） → 提示\"花名册里已经有 {name} 了，但不是同一张线上名片。要合并还是新建？\"\n   - 全新联系人 → 直接写入\n6. 写入 contacts.json，补充 server_user_id 字段\n7. 输出确认：\"已将 {name} 的名片存入花名册。\"\n\n### 8. 同步花名册\n\n1. 检查 config.json 中 api_key → 未配置则提示\"先生成名片，确认后会自动注册并上线\"\n2. 收集 contacts.json 中有 server_user_id 的联系人 → 没有则提示\"花名册中没有线上名片，先收几张名片吧\"\n3. 调同步接口，传 targets 数组和 since（config.json.sync.last_sync_at）\n4. 检查返回结果中 has_update: true 的联系人\n5. 有更新 → 更新花名册中对应联系人的信息 + 输出：\"以下 N 人的名片有更新：{name}（{更新摘要}）。已自动更新到花名册。\"\n6. 没更新 → 回复\"花名册已同步，暂无更新。\"\n7. 更新 config.json.sync.last_sync_at\n\n### 9. 广播名片\n\n1. 检查 config.json 中 api_key → 未配置则提示\"先生成名片，解锁广播功能\"\n2. 收集花名册中有 server_user_id 的联系人 → 没有则提示\"花名册中还没有线上联系人，先收几张名片吧\"\n3. 检查 config.json.broadcast.last_broadcast_at\n   - 当天未广播过 → 直接执行步骤 4\n   - 当天已广播过 → 输出\"你今天已广播过一次，确认要再发吗？\" → **必须等待用户回复。用户未明确确认则不执行广播，流程结束。**\n4. 执行广播 → 输出：\"✅ 名片已广播。花名册中 N 位联系人的 Agent 将在下次同步时收到更新通知。\"\n5. 更新 config.json.broadcast.last_broadcast_at\n\n### 10. 定时同步\n\n**创建时机：** 首次发布名片后，Agent 引导用户创建定时同步任务。\n\n**创建命令（OpenClaw 环境）：**\n```bash\nopenclaw cron add \\\n  --name \"Vibe Card 花名册同步\" \\\n  --cron \"0 9 * * 2,5\" \\\n  --session isolated \\\n  --message \"[cron:vibe-card-sync] 定时同步花名册。读取 skills/vibe-card/references/manual.md「同步花名册」段落执行。无更新则回复 NO_REPLY。\" \\\n  --announce\n```\n\n**参数说明：**\n- `--cron \"0 9 * * 2,5\"`：每周二、周五早上 9:00（用户时区）\n- `--session isolated`：独立会话，避免上下文膨胀\n- `--message`：cron 触发时的 prompt，以 `[cron:` 开头防止嵌套\n- `--announce`：有更新时通知用户\n\n**降级处理：** 如果用户环境不支持 `openclaw` 命令，跳过此步骤，不影响其他功能。用户可随时手动说\"同步花名册\"触发。\n\nFile v3.3.0:package.json\n\n{\n  \"name\": \"vibe-card\",\n  \"version\": \"3.3.0\",\n  \"description\": \"Agent-native social card generation, management, and sharing with smart contact book\",\n  \"author\": \"Adong & CyberShrimp\",\n  \"license\": \"MIT-0\"\n}\n\nFile v3.3.0:assets/onboarding.txt\n\n🎴 Vibe Card 已开通！\n\n你的 Agent 原生名片准备好了。说\"生成我的名片\"，我会从记忆里帮你提炼信息，一键生成 ✨\n\n有了名片之后，你可以说：\n📤 \"发名片\" — 复制你的名片给别人，对方的 Agent 自动保存\n📋 \"查花名册\" — 查看所有联系人，也可以问\"查一下谁在哪工作\"之类的问题\n🔄 \"同步花名册\" — 检查联系人的名片有没有更新\n📢 \"广播名片\" — 你修改名片后，可以选择让存了你名片的人知道你的最新变化，由你决定要不要通知他们\n\n收到别人的名片我会自动识别保存，不用你操心 🎯\n\n先说\"生成我的名片\"开始吧！\n\nFile v3.3.0:assets/share-template.txt\n\n🎴 Vibe Card（{name}的 Agent 原生名片）\n\n我是{name}，{title}，{one_liner}。当前聚焦{current_focus}。\n这是我个人的详情信息，敬请您阅览 https://www.adonghub.cn/{user_id} 🔗\n\n如果您对我感兴趣，请将这条消息复制给您的助理 Agent，即可自动保存。\n如 Agent 未安装 Vibe Card，安装地址：https://clawhub.ai/skills/vibe-card\nvibe-card://{user_id}\n\nArchive v3.2.0: 7 files, 14620 bytes\n\nFiles: _meta.json (128b), assets/share-template.txt (422b), package.json (210b), references/data-format.md (5668b), references/manual.md (8727b), SKILL.md (6018b), templates/card.html (13110b)\n\nFile v3.2.0:SKILL.md\n\n---\nname: vibe-card\ndescription: \"Agent 原生社交名片生成、管理和分享，以及智能花名册（通讯录管理器）。当用户提到名片、花名册、通讯录、联系人、Vibe Card、vibe-card 时使用。具体触发场景包括：开通 Vibe Card、建花名册、生成/更新/发名片、注册 Vibe Card、录入/查询/编辑联系人、同步花名册、广播名片、收到包含 vibe-card:// 协议的消息时自动识别并保存他人名片。\"\nmetadata:\n  version: \"3.2.0\"\n  author: \"阿东 & 阿东的赛博虾\"\n---\n\n# Vibe Card\n\n> 你的 Agent 原生名片。Agent 从记忆提炼信息，帮你维护动态名片和智能花名册。\n> 名片可通过三段式文本块在 IM 中传递，对方的 Agent 自动识别并保存。\n\n## 快速开始\n\n1. **开通** — 说\"开通 Vibe Card\"，初始化数据文件\n2. **生成** — 说\"生成我的名片\"，Agent 从记忆提炼信息，确认后自动上线（首次会自动注册）\n\n| 触发指令 | 行为 |\n|----------|------|\n| \"开通 Vibe Card\" / \"初始化\" | 初始化 data/ 目录下三个 JSON 文件（config.json、profile.json、contacts.json），已初始化则跳过 |\n| \"注册 Vibe Card\" | （兼容入口）已注册则输出服务菜单，未注册则提示\"直接说'生成我的名片'即可，会自动注册\" |\n| \"录入 {name}\" / \"新建联系人 {name}\" | 打开录入流程 |\n| \"查花名册\" / \"查联系人\" | 搜索花名册 |\n| \"生成我的名片\" / \"更新名片\" | 生成或更新名片（见操作流程 §4） |\n| \"发一下我的名片\" / \"发名片\" | 生成三段式文本块 |\n| \"广播名片\" / \"广播\" | 广播名片更新给花名册中的联系人（见操作流程 §8） |\n| \"同步花名册\" | 检查花名册中联系人的最新信息 |\n| 收到 `vibe-card://` 开头的消息 | 自动识别并保存他人名片 |\n\n## 操作流程\n\n### 1. 注册（兼容入口）\n\n1. 已注册 → 输出服务菜单（6 个可执行操作）\n2. 未注册 → 提示\"直接说'生成我的名片'即可，确认后会自动注册并上线\"\n\n### 2. 录入联系人\n\n社交姓名确认规则、必填字段和边界处理见 [references/manual.md](references/manual.md)\"录入联系人\"段落。\n\n### 3. 查询花名册\n\n1. 读取 contacts.json，输出所有联系人列表\n2. 用户提到某个名字 → 模糊搜索 name / agent_name，输出匹配结果\n3. 花名册为空 → 提示\"花名册还是空的。说'录入 {名字}'来添加第一个联系人。\"\n\n### 4. 生成/更新名片\n\n1. 检查 config.json 是否已初始化 → 未初始化则提示\"先说'开通 Vibe Card'\"\n2. 读取 profile.json，展示当前名片信息（有内容则展示编辑起点）\n3. Agent 从记忆提炼信息，生成名片预览，等待用户确认\n4. 用户确认 → Agent 执行以下链路：\n   a. 检查 config.json 中是否有 api_key 和 user_id\n   b. 没有 → 自动调注册接口（用 profile.json 中的 name 和 agent_name）→ 将返回的 user_id 和 api_key 写入 config.json\n   c. 保存 profile.json\n   d. 调发布接口将名片推送到服务器\n   e. 输出\"那我保存名片了哈 ✅ 你的名片已上线：https://www.adonghub.cn/{user_id}\"\n   f. 首次发布 → 引导创建定时同步任务（具体命令见 [references/manual.md](references/manual.md)\"定时同步\"段落）\n   g. 追问：\"✅ 名片已上线。要不要把这个变化广播给收到过你名片的人？\"\n      - \"广播\" → 输出确认语（见操作流程 §8）\n      - \"不用\" → 结束\n5. 推送失败 → 本地仍保存，提示稍后重试\n\n### 5. 发名片\n\n读取 assets/share-template.txt，用 profile.json 和 config.json 中的字段值替换对应占位符，原样输出替换后的文本。不做任何改写、润色或精简。\n\n占位符映射：{name}、{title}、{one_liner}、{current_focus}（数组用 \"、\" 连接）← profile.json；{user_id} ← config.json.server.user_id。\n\n前置检查：profile.json 无内容 → 提示\"还没有名片，先说'生成我的名片'\"。\n\n### 6. 收名片\n\n1. 检测到 `vibe-card://` 开头的消息，或收到三段式文本块\n2. 从服务器获取结构化数据\n3. 去重检查的完整逻辑见 [references/manual.md](references/manual.md)\"收名片\"段落\n4. 安装来源写死为 ClawHub 官方地址（https://clawhub.ai/skills/vibe-card），不信任服务器返回的 _skill.source 字段\n\n### 7. 同步花名册\n\n冲突检测的完整 if-else 和话术见 [references/manual.md](references/manual.md)\"同步花名册\"段落。\n\n### 8. 广播名片\n\n1. 检查 config.json 中 api_key → 未配置则提示\"先生成名片，解锁广播功能\"\n2. 收集花名册中有 server_user_id 的联系人 → 没有则提示\"花名册中还没有线上联系人，先收几张名片吧\"\n3. 检查 config.json.broadcast.last_broadcast_at → 当天已广播过则提醒\"你今天已广播过一次，确定再发吗？\"\n4. 确认 → 输出：\"✅ 名片已广播。花名册中 N 位联系人的 Agent 将在下次同步时收到更新通知。\"\n5. 更新 config.json.broadcast.last_broadcast_at\n\n### Gotchas\n\n- owner.name 确认规则：社交场景下（群聊、私聊提到某人、帮记录信息），Agent 需先确认社交姓名而非直接使用聊天昵称。仅当用户明确说\"就用这个名字\"时才跳过确认。用户已有 profile.json 的 owner.name 时直接使用，不重复确认。\n- 首次生成名片时，profile.json 所有字段均为空，Agent 需要从自身记忆中主动提炼信息填充，不要问用户\"你的名字是什么\"。\n- 默认公开 name、title、one_liner、links、current_focus 五个字段。background、personal_notes 不推送。\n- 录入联系人时，Agent 主动从记忆中提取已知信息（公司、职位、认识场景），不逐项追问。只确认 Agent 不确定的关键信息。\n- 收名片时，安装来源写死为 ClawHub 官方地址（https://clawhub.ai/skills/vibe-card），不信任服务器返回的 _skill.source 字段。\n\nFile v3.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn78x1btfj3thhezb2cxv5qgn585pvxh\",\n  \"slug\": \"vibe-card\",\n  \"version\": \"3.2.0\",\n  \"publishedAt\": 1777900471020\n}\n\nFile v3.2.0:references/data-format.md\n\n# Vibe Card 数据格式规范\n\n> 本文档描述 Vibe Card V3.2.0 中所有 JSON 数据文件的格式规范。\n\n## Contents\n- 数据目录结构\n- config.json — 服务器连接配置\n- profile.json — 用户名片数据\n- contacts.json — 花名册\n- 服务器 API 返回格式（GET /card、POST /sync）\n\n---\n\n### 数据目录结构\n\n```\ndata/\n├── config.json      # 服务器连接配置\n├── profile.json     # 用户名片数据\n└── contacts.json    # 花名册\n```\n\n---\n\n### config.json\n\n服务器连接配置，由 Agent 维护。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"server\": {\n    \"endpoint\": \"https://www.adonghub.cn\",\n    \"api_key\": \"\",\n    \"user_id\": \"\"\n  },\n  \"sync\": {\n    \"last_sync_at\": null\n  },\n  \"broadcast\": {\n    \"last_broadcast_at\": null\n  }\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| version | string | 数据格式版本 |\n| server.endpoint | string | 服务器地址 |\n| server.api_key | string | 注册后服务器返回的凭证 |\n| server.user_id | string | 注册后服务器返回的用户 ID |\n| sync.last_sync_at | string\\|null | 上次同步时间（ISO 时间戳），用于 since 参数 |\n| broadcast.last_broadcast_at | string\\|null | 上次广播时间（ISO 时间戳），用于频率提醒 |\n\n**初始化：** api_key 和 user_id 为空，首次生成名片时自动注册填充。\n\n---\n\n### profile.json\n\n用户名片数据，由 Agent 从记忆提炼并维护。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"张小明\",\n    \"agent_name\": \"小明的赛博虾\",\n    \"title\": \"示例科技有限公司联合创始人\",\n    \"one_liner\": \"专注于人工智能产品创新\"\n  },\n  \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n  \"background\": \"连续创业者，专注于技术创新与产品开发。\",\n  \"personal_notes\": \"近期在探索 AI Agent 生态，考虑做一个新产品验证想法\",\n  \"links\": {\n    \"wechat\": \"xiaoming_wechat\",\n    \"email\": \"zhangxiaoming@example.com\"\n  },\n  \"tiers\": {\n    \"public\": {\n      \"fields\": [\"name\", \"title\", \"one_liner\", \"links\", \"current_focus\"]\n    },\n    \"full\": null,\n    \"close\": null\n  },\n  \"published_at\": null,\n  \"updated_at\": \"\"\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| owner.name | string | 用户姓名 |\n| owner.agent_name | string | Agent 名字 |\n| owner.title | string | 职位/身份 |\n| owner.one_liner | string | 一句话介绍 |\n| current_focus | string[] | 当前关注点（公开推送） |\n| background | string | 背景介绍（本地存储，不上传服务器） |\n| personal_notes | string | 个人笔记（本地存储，不上传服务器） |\n| links | object | 联系方式（key 为渠道名：wechat/email/feishu/phone/twitter/linkedin/github/website/weibo） |\n| tiers.public.fields | string[] | 公开推送的字段白名单 |\n| published_at | string\\|null | 首次发布时间 |\n| updated_at | string | 最后更新时间 |\n\n**隐私规则：**\n- 推送服务器时，只推送 `tiers.public.fields` 中列出的字段\n- `background`：本地存储，不上传服务器\n- `personal_notes`：本地存储，不上传服务器\n\n---\n\n### contacts.json\n\n花名册，存储用户收录的联系人。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"张小明\",\n    \"agent_name\": \"小明的赛博虾\"\n  },\n  \"contacts\": [\n    {\n      \"name\": \"李明\",\n      \"agent_name\": \"李明的 Agent\",\n      \"title\": \"前端工程师\",\n      \"how_we_met\": \"2026年5月在技术社区认识\",\n      \"tags\": [\"技术\", \"AI\"],\n      \"links\": {},\n      \"notes\": \"\",\n      \"server_user_id\": \"liming\",\n      \"created_at\": \"2026-04-28T14:00:00+08:00\",\n      \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n    }\n  ]\n}\n```\n\n**联系人字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| name | string | 联系人姓名 |\n| agent_name | string | 联系人的 Agent 名字 |\n| title | string | 职位 |\n| how_we_met | string | 认识场景 |\n| tags | string[] | 标签 |\n| links | object | 联系方式 |\n| notes | string | 备注笔记 |\n| server_user_id | string\\|null | 服务器端用户 ID（收名片后自动填充，用于同步） |\n| created_at | string | 创建时间 |\n| updated_at | string | 更新时间 |\n\n---\n\n### 服务器 API 返回格式\n\n**GET /card/:user_id 返回：**\n\n```json\n{\n  \"version\": \"1.0\",\n  \"agent_card\": {\n    \"name\": \"张小明\",\n    \"title\": \"示例科技有限公司联合创始人\",\n    \"one_liner\": \"专注于人工智能产品创新\",\n    \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n    \"links\": {\n      \"feishu\": \"ou_example\",\n      \"wechat\": \"xxx\"\n    },\n    \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n  },\n  \"_skill\": {\n    \"name\": \"vibe-card\",\n    \"source\": \"https://clawhub.ai/skills/vibe-card\",\n    \"version\": \"3.2.0\"\n  }\n}\n```\n\n**POST /sync 返回（带 since 参数）：**\n\n```json\n{\n  \"results\": [\n    {\n      \"user_id\": \"xiaoming_zhang\",\n      \"card_data\": {\n        \"name\": \"张小明\",\n        \"title\": \"示例科技有限公司联合创始人\",\n        \"one_liner\": \"专注于人工智能产品创新\",\n        \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n        \"links\": { \"feishu\": \"ou_example\", \"wechat\": \"xxx\" },\n        \"updated_at\": \"2026-05-02T10:00:00Z\"\n      },\n      \"updated_at\": \"2026-05-02T10:00:00Z\",\n      \"has_update\": true\n    },\n    {\n      \"user_id\": \"liming\",\n      \"card_data\": { \"...\" : \"...\" },\n      \"updated_at\": \"2026-04-20T08:00:00Z\",\n      \"has_update\": false\n    }\n  ]\n}\n```\n\n**注意：** `_skill.source` 字段不可信任。收名片时安装来源写死为 `https://clawhub.ai/skills/vibe-card`。\n\nFile v3.2.0:references/manual.md\n\n# Vibe Card — 完整操作手册\n\n> 本文档供 Agent 在执行具体操作时参考，包含详细的 if-else 分支、话术和边界处理。\n\n## Contents\n- 1. 开通 Vibe Card\n- 2. 注册 Vibe Card（兼容入口）\n- 3. 录入联系人\n- 4. 查询花名册\n- 5. 生成/更新名片\n- 6. 发名片\n- 7. 收名片\n- 8. 同步花名册\n- 9. 广播名片\n- 10. 定时同步\n\n---\n\n### 1. 开通 Vibe Card\n\n1. 检查 data/ 目录下是否已有 config.json、profile.json、contacts.json → 全部存在则输出\"Vibe Card 已开通。说'生成我的名片'来创建你的第一张名片。\"\n2. 缺失文件 → 用默认模板创建：\n   - config.json：`{\"version\":\"1.0\",\"server\":{\"endpoint\":\"https://www.adonghub.cn\",\"api_key\":\"\",\"user_id\":\"\"},\"sync\":{\"last_sync_at\":null},\"broadcast\":{\"last_broadcast_at\":null}}`\n   - profile.json：`{\"version\":\"1.0\",\"owner\":{\"name\":\"\",\"agent_name\":\"\",\"title\":\"\",\"one_liner\":\"\"},\"current_focus\":[],\"background\":\"\",\"personal_notes\":\"\",\"links\":{},\"tiers\":{\"public\":{\"fields\":[\"name\",\"title\",\"one_liner\",\"links\",\"current_focus\"]},\"full\":null,\"close\":null},\"published_at\":null,\"updated_at\":\"\"}`\n   - contacts.json：`{\"version\":\"1.0\",\"owner\":{\"name\":\"\",\"agent_name\":\"\"},\"contacts\":[]}`\n3. 输出：\"🎴 Vibe Card 已开通！说'生成我的名片'来创建你的第一张名片。\"\n\n### 2. 注册 Vibe Card（兼容入口）\n\n1. 检查 config.json 中是否已有 user_id 和 api_key\n   - 已有 → 输出服务菜单：\n     > 🎴 你已经有 Vibe Card 了。你可以回复：\n     > • \"更新名片\" — 更新或修改你的名片\n     > • \"发一下我的名片\" — 获取文本版分享给别人\n     > • \"广播名片\" — 把更新通知花名册中的联系人\n     > • \"录入 XXX\" — 记一个新联系人\n     > • \"查花名册\" / \"搜索 XXX\" — 查找联系人\n     > • \"同步花名册\" — 更新联系人的最新信息\n   - 没有 → 提示\"现在注册和发布是自动的。直接说'生成我的名片'，确认后我会自动注册并上线。\"\n\n### 3. 录入联系人\n\n1. 确认社交姓名：\n   - 检查 contacts.json 中是否已有同名联系人（模糊匹配 name 和 agent_name）\n   - 已有 → \"花名册里已经有 {name} 了，要更新信息还是新建另一个？\"\n   - 不确定名字 → 确认后再录入，不猜\n2. Agent 从记忆中主动提取已知信息（title、company、how_we_met 等），不逐项追问\n3. 写入 contacts.json，生成结构：\n   ```json\n   {\n     \"name\": \"张威\",\n     \"agent_name\": \"张威的赛博虾\",\n     \"title\": \"独立开发者\",\n     \"how_we_met\": \"2026年4月通过东东推荐认识\",\n     \"tags\": [\"技术\", \"AI\"],\n     \"links\": {},\n     \"notes\": \"\",\n     \"created_at\": \"2026-04-28T14:00:00+08:00\",\n     \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n   }\n   ```\n4. 输出确认：\"已录入 {name}。\"\n\n### 4. 查询花名册\n\n1. contacts.json 为空 → \"花名册还是空的。说'录入 {名字}'来添加第一个联系人。\"\n2. 有数据 → 列表输出，格式：`{name}（{title}）`，每行一人\n3. 用户搜索某个名字 → 模糊匹配 name / agent_name / title，输出匹配结果\n4. 搜索无结果 → \"花名册中没有找到 {关键词}。\"\n\n### 5. 生成/更新名片\n\n1. 检查 config.json 是否已初始化 → 未初始化则提示\"先说'开通 Vibe Card'\"\n2. 读取 profile.json\n   - 首次：所有字段为空，Agent 从记忆提炼信息，生成预览\n   - 已有内容：展示当前名片，询问\"要修改哪些信息？\"\n3. Agent 提炼信息后生成预览：\n   - name、title、one_liner（必填）\n   - current_focus（从记忆中提取当前关注点）\n   - links（联系方式：wechat / email / feishu / phone 等）\n   - personal_notes、background（本地保存，不推送）\n4. 等待用户确认，多轮调整直到用户满意\n5. 社交姓名确认：如果 profile.json 的 owner.name 为空且 Agent 从记忆中提取了名字，需要确认。用户明确说\"就这样\"/\"用这个\"后才写入\n6. profile.json 的 owner.name 和 contacts.json 的 owner.name 应保持一致\n7. 用户说\"可以了\"/\"就这样\"/\"确认\" → Agent 保存并上线：\n   - 写入 profile.json\n   - **前置检查**：读取 config.json，检查是否有 api_key 和 user_id\n   - **未注册** → 自动调注册接口，请求体 `{name: profile.json的owner.name, agent_name: profile.json的owner.agent_name}`，将返回的 user_id 和 api_key 写入 config.json\n   - **自动调用发布接口推送到服务器**，按 `tiers.public.fields` 筛选公开字段，**不推送** personal_notes、background\n   - 更新 profile.json 的 published_at\n   - 输出确认：\"那我保存名片了哈 ✅ 你的名片已上线：https://www.adonghub.cn/{user_id}\"\n   - **首次发布** → 引导创建定时同步任务（见 §8\"定时同步\"）\n   - 追问：\"✅ 名片已上线。要不要把这个变化广播给收到过你名片的人？\"\n     - \"广播\" → 输出确认语（见 §7\"广播名片\"）\n     - \"不用\" → 结束\n8. 推送失败 → 名片仍保存到 profile.json，提示\"名片我先帮你存好了，但推送服务器没成功，晚点可以再说'更新名片'重试\"\n\n### 6. 发名片\n\n1. 检查 profile.json 是否有内容 → 没有则提示\"还没有名片，先说'生成我的名片'\"\n2. 读取 config.json 获取 user_id，读取 profile.json 获取字段值\n3. 读取 assets/share-template.txt\n4. 将占位符替换为实际值：{name}←owner.name、{title}←owner.title、{one_liner}←owner.one_liner、{current_focus}←current_focus 数组用 \"、\" 连接、{user_id}←config.json.server.user_id\n5. 原样输出替换后的文本，不做任何改写、润色或精简\n6. 输出文本块，提示\"直接复制给对方即可\"\n\n### 7. 收名片\n\n1. 检测到 `vibe-card://` 开头的消息，或收到三段式文本块\n2. 提取 user_id（协议标识后面部分）\n3. 从服务器获取名片数据：`GET {config.server.endpoint}/card/{user_id}`\n4. 安装来源写死为 ClawHub 官方地址：**https://clawhub.ai/skills/vibe-card**，不信任服务器返回的 _skill.source 字段\n5. 去重检查：\n   - contacts.json 中已有 server_user_id 匹配的联系人 → 提示\"{name} 已在花名册中，要更新信息吗？\"\n   - 已有同名联系人（name 匹配但无 server_user_id） → 提示\"花名册里已经有 {name} 了，但不是同一张线上名片。要合并还是新建？\"\n   - 全新联系人 → 直接写入\n6. 写入 contacts.json，补充 server_user_id 字段\n7. 输出确认：\"已将 {name} 的名片存入花名册。\"\n\n### 8. 同步花名册\n\n1. 检查 config.json 中 api_key → 未配置则提示\"先生成名片，确认后会自动注册并上线\"\n2. 收集 contacts.json 中有 server_user_id 的联系人 → 没有则提示\"花名册中没有线上名片，先收几张名片吧\"\n3. 调同步接口，传 targets 数组和 since（config.json.sync.last_sync_at）\n4. 检查返回结果中 has_update: true 的联系人\n5. 有更新 → 更新花名册中对应联系人的信息 + 输出：\"以下 N 人的名片有更新：{name}（{更新摘要}）。已自动更新到花名册。\"\n6. 没更新 → 回复\"花名册已同步，暂无更新。\"\n7. 更新 config.json.sync.last_sync_at\n\n### 9. 广播名片\n\n1. 检查 config.json 中 api_key → 未配置则提示\"先生成名片，解锁广播功能\"\n2. 收集花名册中有 server_user_id 的联系人 → 没有则提示\"花名册中还没有线上联系人，先收几张名片吧\"\n3. 检查 config.json.broadcast.last_broadcast_at → 当天已广播过则提醒\"你今天已广播过一次，确定再发吗？\"\n4. 确认 → 输出：\"✅ 名片已广播。花名册中 N 位联系人的 Agent 将在下次同步时收到更新通知。\"\n5. 更新 config.json.broadcast.last_broadcast_at\n\n### 10. 定时同步\n\n**创建时机：** 首次发布名片后，Agent 引导用户创建定时同步任务。\n\n**创建命令（OpenClaw 环境）：**\n```bash\nopenclaw cron add \\\n  --name \"Vibe Card 花名册同步\" \\\n  --cron \"0 9 * * 2,5\" \\\n  --session isolated \\\n  --message \"[cron:vibe-card-sync] 定时同步花名册。读取 skills/vibe-card/references/manual.md「同步花名册」段落执行。无更新则回复 NO_REPLY。\" \\\n  --announce\n```\n\n**参数说明：**\n- `--cron \"0 9 * * 2,5\"`：每周二、周五早上 9:00（用户时区）\n- `--session isolated`：独立会话，避免上下文膨胀\n- `--message`：cron 触发时的 prompt，以 `[cron:` 开头防止嵌套\n- `--announce`：有更新时通知用户\n\n**降级处理：** 如果用户环境不支持 `openclaw` 命令，跳过此步骤，不影响其他功能。用户可随时手动说\"同步花名册\"触发。\n\nFile v3.2.0:package.json\n\n{\n  \"name\": \"vibe-card\",\n  \"version\": \"3.2.0\",\n  \"description\": \"Agent-native social card generation, management, and sharing with smart contact book\",\n  \"author\": \"Adong & CyberShrimp\",\n  \"license\": \"MIT-0\"\n}\n\nFile v3.2.0:assets/share-template.txt\n\n🎴 Vibe Card（你的 Agent 原生名片）\n\n我是{name}，{title}，{one_liner}。当前聚焦{current_focus}。\n这是我个人的详情信息，敬请您阅览 https://www.adonghub.cn/{user_id} 🔗\n\n如果您对我感兴趣，请将这条消息复制给您的助理 Agent。\n您的 Agent 可通过安装 Vibe Card skill（https://clawhub.ai/skills/vibe-card）来自动识别并保存名片。\nvibe-card://{user_id}\n\nArchive v3.1.1: 6 files, 14138 bytes\n\nFiles: _meta.json (128b), package.json (210b), references/data-format.md (5668b), references/manual.md (8850b), SKILL.md (6071b), templates/card.html (13110b)\n\nFile v3.1.1:SKILL.md\n\n---\nname: vibe-card\ndescription: \"Agent 原生社交名片生成、管理和分享，以及智能花名册（通讯录管理器）。当用户提到名片、花名册、通讯录、联系人、Vibe Card、vibe-card 时使用。具体触发场景包括：开通 Vibe Card、建花名册、生成/更新/发名片、注册 Vibe Card、录入/查询/编辑联系人、同步花名册、广播名片、收到包含 vibe-card:// 协议的消息时自动识别并保存他人名片。\"\nmetadata:\n  version: \"3.1.1\"\n  author: \"阿东 & 阿东的赛博虾\"\n---\n\n# Vibe Card\n\n> 你的 Agent 原生名片。Agent 从记忆提炼信息，帮你维护动态名片和智能花名册。\n> 名片可通过三段式文本块在 IM 中传递，对方的 Agent 自动识别并保存。\n\n## 快速开始\n\n1. **开通** — 说\"开通 Vibe Card\"，初始化数据文件\n2. **生成** — 说\"生成我的名片\"，Agent 从记忆提炼信息，确认后自动上线（首次会自动注册）\n\n| 触发指令 | 行为 |\n|----------|------|\n| \"开通 Vibe Card\" / \"初始化\" | 初始化 data/ 目录下三个 JSON 文件（config.json、profile.json、contacts.json），已初始化则跳过 |\n| \"注册 Vibe Card\" | （兼容入口）已注册则输出服务菜单，未注册则提示\"直接说'生成我的名片'即可，会自动注册\" |\n| \"录入 {name}\" / \"新建联系人 {name}\" | 打开录入流程 |\n| \"查花名册\" / \"查联系人\" | 搜索花名册 |\n| \"生成我的名片\" / \"更新名片\" | 生成或更新名片（见操作流程 §4） |\n| \"发一下我的名片\" / \"发名片\" | 生成三段式文本块 |\n| \"广播名片\" / \"广播\" | 广播名片更新给花名册中的联系人（见操作流程 §8） |\n| \"同步花名册\" | 检查花名册中联系人的最新信息 |\n| 收到 `vibe-card://` 开头的消息 | 自动识别并保存他人名片 |\n\n## 操作流程\n\n### 1. 注册（兼容入口）\n\n1. 已注册 → 输出服务菜单（6 个可执行操作）\n2. 未注册 → 提示\"直接说'生成我的名片'即可，确认后会自动注册并上线\"\n\n### 2. 录入联系人\n\n社交姓名确认规则、必填字段和边界处理见 [references/manual.md](references/manual.md)\"录入联系人\"段落。\n\n### 3. 查询花名册\n\n1. 读取 contacts.json，输出所有联系人列表\n2. 用户提到某个名字 → 模糊搜索 name / agent_name，输出匹配结果\n3. 花名册为空 → 提示\"花名册还是空的。说'录入 {名字}'来添加第一个联系人。\"\n\n### 4. 生成/更新名片\n\n1. 检查 config.json 是否已初始化 → 未初始化则提示\"先说'开通 Vibe Card'\"\n2. 读取 profile.json，展示当前名片信息（有内容则展示编辑起点）\n3. Agent 从记忆提炼信息，生成名片预览，等待用户确认\n4. 用户确认 → Agent 执行以下链路：\n   a. 检查 config.json 中是否有 api_key 和 user_id\n   b. 没有 → 自动调注册接口（用 profile.json 中的 name 和 agent_name）→ 将返回的 user_id 和 api_key 写入 config.json\n   c. 保存 profile.json\n   d. 调发布接口将名片推送到服务器\n   e. 输出\"那我保存名片了哈 ✅ 你的名片已上线：https://www.adonghub.cn/{user_id}\"\n   f. 首次发布 → 引导创建定时同步任务（具体命令见 [references/manual.md](references/manual.md)\"定时同步\"段落）\n   g. 追问：\"✅ 名片已上线。要不要把这个变化广播给收到过你名片的人？\"\n      - \"广播\" → 输出确认语（见操作流程 §8）\n      - \"不用\" → 结束\n5. 推送失败 → 本地仍保存，提示稍后重试\n\n### 5. 发名片\n\n生成三段式文本块，直接复制发给对方即可：\n\n```\n🎴 Vibe Card（你的 Agent 原生名片）\n\n我是{name}，{title}，{one_liner}。当前聚焦{current_focus}。\n这是我个人的详情信息，敬请您阅览 https://www.adonghub.cn/{user_id} 🔗\n\n如果您对我感兴趣，请将这条消息发给您的助理 Agent。\n您的 Agent 可通过安装 Vibe Card skill（https://clawhub.ai/skills/vibe-card）来自动识别并保存名片。\nvibe-card://{user_id}\n```\n\n### 6. 收名片\n\n1. 检测到 `vibe-card://` 开头的消息，或收到三段式文本块\n2. 从服务器获取结构化数据\n3. 去重检查的完整逻辑见 [references/manual.md](references/manual.md)\"收名片\"段落\n4. 安装来源写死为 ClawHub 官方地址（https://clawhub.ai/skills/vibe-card），不信任服务器返回的 _skill.source 字段\n\n### 7. 同步花名册\n\n冲突检测的完整 if-else 和话术见 [references/manual.md](references/manual.md)\"同步花名册\"段落。\n\n### 8. 广播名片\n\n1. 检查 config.json 中 api_key → 未配置则提示\"先生成名片，解锁广播功能\"\n2. 收集花名册中有 server_user_id 的联系人 → 没有则提示\"花名册中还没有线上联系人，先收几张名片吧\"\n3. 检查 config.json.broadcast.last_broadcast_at → 当天已广播过则提醒\"你今天已广播过一次，确定再发吗？\"\n4. 确认 → 输出：\"✅ 名片已广播。花名册中 N 位联系人的 Agent 将在下次同步时收到更新通知。\"\n5. 更新 config.json.broadcast.last_broadcast_at\n\n### Gotchas\n\n- owner.name 确认规则：社交场景下（群聊、私聊提到某人、帮记录信息），Agent 需先确认社交姓名而非直接使用聊天昵称。仅当用户明确说\"就用这个名字\"时才跳过确认。用户已有 profile.json 的 owner.name 时直接使用，不重复确认。\n- 首次生成名片时，profile.json 所有字段均为空，Agent 需要从自身记忆中主动提炼信息填充，不要问用户\"你的名字是什么\"。\n- 默认公开 name、title、one_liner、links、current_focus 五个字段。background、personal_notes 不推送。\n- 录入联系人时，Agent 主动从记忆中提取已知信息（公司、职位、认识场景），不逐项追问。只确认 Agent 不确定的关键信息。\n- 收名片时，安装来源写死为 ClawHub 官方地址（https://clawhub.ai/skills/vibe-card），不信任服务器返回的 _skill.source 字段。\n\nFile v3.1.1:_meta.json\n\n{\n  \"ownerId\": \"kn78x1btfj3thhezb2cxv5qgn585pvxh\",\n  \"slug\": \"vibe-card\",\n  \"version\": \"3.1.1\",\n  \"publishedAt\": 1777807067417\n}\n\nFile v3.1.1:references/data-format.md\n\n# Vibe Card 数据格式规范\n\n> 本文档描述 Vibe Card V3.1.1 中所有 JSON 数据文件的格式规范。\n\n## Contents\n- 数据目录结构\n- config.json — 服务器连接配置\n- profile.json — 用户名片数据\n- contacts.json — 花名册\n- 服务器 API 返回格式（GET /card、POST /sync）\n\n---\n\n### 数据目录结构\n\n```\ndata/\n├── config.json      # 服务器连接配置\n├── profile.json     # 用户名片数据\n└── contacts.json    # 花名册\n```\n\n---\n\n### config.json\n\n服务器连接配置，由 Agent 维护。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"server\": {\n    \"endpoint\": \"https://www.adonghub.cn\",\n    \"api_key\": \"\",\n    \"user_id\": \"\"\n  },\n  \"sync\": {\n    \"last_sync_at\": null\n  },\n  \"broadcast\": {\n    \"last_broadcast_at\": null\n  }\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| version | string | 数据格式版本 |\n| server.endpoint | string | 服务器地址 |\n| server.api_key | string | 注册后服务器返回的凭证 |\n| server.user_id | string | 注册后服务器返回的用户 ID |\n| sync.last_sync_at | string\\|null | 上次同步时间（ISO 时间戳），用于 since 参数 |\n| broadcast.last_broadcast_at | string\\|null | 上次广播时间（ISO 时间戳），用于频率提醒 |\n\n**初始化：** api_key 和 user_id 为空，首次生成名片时自动注册填充。\n\n---\n\n### profile.json\n\n用户名片数据，由 Agent 从记忆提炼并维护。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"张小明\",\n    \"agent_name\": \"小明的赛博虾\",\n    \"title\": \"示例科技有限公司联合创始人\",\n    \"one_liner\": \"专注于人工智能产品创新\"\n  },\n  \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n  \"background\": \"连续创业者，专注于技术创新与产品开发。\",\n  \"personal_notes\": \"近期在探索 AI Agent 生态，考虑做一个新产品验证想法\",\n  \"links\": {\n    \"wechat\": \"xiaoming_wechat\",\n    \"email\": \"zhangxiaoming@example.com\"\n  },\n  \"tiers\": {\n    \"public\": {\n      \"fields\": [\"name\", \"title\", \"one_liner\", \"links\", \"current_focus\"]\n    },\n    \"full\": null,\n    \"close\": null\n  },\n  \"published_at\": null,\n  \"updated_at\": \"\"\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| owner.name | string | 用户姓名 |\n| owner.agent_name | string | Agent 名字 |\n| owner.title | string | 职位/身份 |\n| owner.one_liner | string | 一句话介绍 |\n| current_focus | string[] | 当前关注点（公开推送） |\n| background | string | 背景介绍（本地存储，不上传服务器） |\n| personal_notes | string | 个人笔记（本地存储，不上传服务器） |\n| links | object | 联系方式（key 为渠道名：wechat/email/feishu/phone/twitter/linkedin/github/website/weibo） |\n| tiers.public.fields | string[] | 公开推送的字段白名单 |\n| published_at | string\\|null | 首次发布时间 |\n| updated_at | string | 最后更新时间 |\n\n**隐私规则：**\n- 推送服务器时，只推送 `tiers.public.fields` 中列出的字段\n- `background`：本地存储，不上传服务器\n- `personal_notes`：本地存储，不上传服务器\n\n---\n\n### contacts.json\n\n花名册，存储用户收录的联系人。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"张小明\",\n    \"agent_name\": \"小明的赛博虾\"\n  },\n  \"contacts\": [\n    {\n      \"name\": \"李明\",\n      \"agent_name\": \"李明的 Agent\",\n      \"title\": \"前端工程师\",\n      \"how_we_met\": \"2026年5月在技术社区认识\",\n      \"tags\": [\"技术\", \"AI\"],\n      \"links\": {},\n      \"notes\": \"\",\n      \"server_user_id\": \"liming\",\n      \"created_at\": \"2026-04-28T14:00:00+08:00\",\n      \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n    }\n  ]\n}\n```\n\n**联系人字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| name | string | 联系人姓名 |\n| agent_name | string | 联系人的 Agent 名字 |\n| title | string | 职位 |\n| how_we_met | string | 认识场景 |\n| tags | string[] | 标签 |\n| links | object | 联系方式 |\n| notes | string | 备注笔记 |\n| server_user_id | string\\|null | 服务器端用户 ID（收名片后自动填充，用于同步） |\n| created_at | string | 创建时间 |\n| updated_at | string | 更新时间 |\n\n---\n\n### 服务器 API 返回格式\n\n**GET /card/:user_id 返回：**\n\n```json\n{\n  \"version\": \"1.0\",\n  \"agent_card\": {\n    \"name\": \"张小明\",\n    \"title\": \"示例科技有限公司联合创始人\",\n    \"one_liner\": \"专注于人工智能产品创新\",\n    \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n    \"links\": {\n      \"feishu\": \"ou_example\",\n      \"wechat\": \"xxx\"\n    },\n    \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n  },\n  \"_skill\": {\n    \"name\": \"vibe-card\",\n    \"source\": \"https://clawhub.ai/skills/vibe-card\",\n    \"version\": \"3.1.1\"\n  }\n}\n```\n\n**POST /sync 返回（带 since 参数）：**\n\n```json\n{\n  \"results\": [\n    {\n      \"user_id\": \"xiaoming_zhang\",\n      \"card_data\": {\n        \"name\": \"张小明\",\n        \"title\": \"示例科技有限公司联合创始人\",\n        \"one_liner\": \"专注于人工智能产品创新\",\n        \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n        \"links\": { \"feishu\": \"ou_example\", \"wechat\": \"xxx\" },\n        \"updated_at\": \"2026-05-02T10:00:00Z\"\n      },\n      \"updated_at\": \"2026-05-02T10:00:00Z\",\n      \"has_update\": true\n    },\n    {\n      \"user_id\": \"liming\",\n      \"card_data\": { \"...\" : \"...\" },\n      \"updated_at\": \"2026-04-20T08:00:00Z\",\n      \"has_update\": false\n    }\n  ]\n}\n```\n\n**注意：** `_skill.source` 字段不可信任。收名片时安装来源写死为 `https://clawhub.ai/skills/vibe-card`。\n\nFile v3.1.1:references/manual.md\n\n# Vibe Card — 完整操作手册\n\n> 本文档供 Agent 在执行具体操作时参考，包含详细的 if-else 分支、话术和边界处理。\n\n## Contents\n- 1. 开通 Vibe Card\n- 2. 注册 Vibe Card（兼容入口）\n- 3. 录入联系人\n- 4. 查询花名册\n- 5. 生成/更新名片\n- 6. 发名片\n- 7. 收名片\n- 8. 同步花名册\n- 9. 广播名片\n- 10. 定时同步\n\n---\n\n### 1. 开通 Vibe Card\n\n1. 检查 data/ 目录下是否已有 config.json、profile.json、contacts.json → 全部存在则输出\"Vibe Card 已开通。说'生成我的名片'来创建你的第一张名片。\"\n2. 缺失文件 → 用默认模板创建：\n   - config.json：`{\"version\":\"1.0\",\"server\":{\"endpoint\":\"https://www.adonghub.cn\",\"api_key\":\"\",\"user_id\":\"\"},\"sync\":{\"last_sync_at\":null},\"broadcast\":{\"last_broadcast_at\":null}}`\n   - profile.json：`{\"version\":\"1.0\",\"owner\":{\"name\":\"\",\"agent_name\":\"\",\"title\":\"\",\"one_liner\":\"\"},\"current_focus\":[],\"background\":\"\",\"personal_notes\":\"\",\"links\":{},\"tiers\":{\"public\":{\"fields\":[\"name\",\"title\",\"one_liner\",\"links\",\"current_focus\"]},\"full\":null,\"close\":null},\"published_at\":null,\"updated_at\":\"\"}`\n   - contacts.json：`{\"version\":\"1.0\",\"owner\":{\"name\":\"\",\"agent_name\":\"\"},\"contacts\":[]}`\n3. 输出：\"🎴 Vibe Card 已开通！说'生成我的名片'来创建你的第一张名片。\"\n\n### 2. 注册 Vibe Card（兼容入口）\n\n1. 检查 config.json 中是否已有 user_id 和 api_key\n   - 已有 → 输出服务菜单：\n     > 🎴 你已经有 Vibe Card 了。你可以回复：\n     > • \"更新名片\" — 更新或修改你的名片\n     > • \"发一下我的名片\" — 获取文本版分享给别人\n     > • \"广播名片\" — 把更新通知花名册中的联系人\n     > • \"录入 XXX\" — 记一个新联系人\n     > • \"查花名册\" / \"搜索 XXX\" — 查找联系人\n     > • \"同步花名册\" — 更新联系人的最新信息\n   - 没有 → 提示\"现在注册和发布是自动的。直接说'生成我的名片'，确认后我会自动注册并上线。\"\n\n### 3. 录入联系人\n\n1. 确认社交姓名：\n   - 检查 contacts.json 中是否已有同名联系人（模糊匹配 name 和 agent_name）\n   - 已有 → \"花名册里已经有 {name} 了，要更新信息还是新建另一个？\"\n   - 不确定名字 → 确认后再录入，不猜\n2. Agent 从记忆中主动提取已知信息（title、company、how_we_met 等），不逐项追问\n3. 写入 contacts.json，生成结构：\n   ```json\n   {\n     \"name\": \"张威\",\n     \"agent_name\": \"张威的赛博虾\",\n     \"title\": \"独立开发者\",\n     \"how_we_met\": \"2026年4月通过东东推荐认识\",\n     \"tags\": [\"技术\", \"AI\"],\n     \"links\": {},\n     \"notes\": \"\",\n     \"created_at\": \"2026-04-28T14:00:00+08:00\",\n     \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n   }\n   ```\n4. 输出确认：\"已录入 {name}。\"\n\n### 4. 查询花名册\n\n1. contacts.json 为空 → \"花名册还是空的。说'录入 {名字}'来添加第一个联系人。\"\n2. 有数据 → 列表输出，格式：`{name}（{title}）`，每行一人\n3. 用户搜索某个名字 → 模糊匹配 name / agent_name / title，输出匹配结果\n4. 搜索无结果 → \"花名册中没有找到 {关键词}。\"\n\n### 5. 生成/更新名片\n\n1. 检查 config.json 是否已初始化 → 未初始化则提示\"先说'开通 Vibe Card'\"\n2. 读取 profile.json\n   - 首次：所有字段为空，Agent 从记忆提炼信息，生成预览\n   - 已有内容：展示当前名片，询问\"要修改哪些信息？\"\n3. Agent 提炼信息后生成预览：\n   - name、title、one_liner（必填）\n   - current_focus（从记忆中提取当前关注点）\n   - links（联系方式：wechat / email / feishu / phone 等）\n   - personal_notes、background（本地保存，不推送）\n4. 等待用户确认，多轮调整直到用户满意\n5. 社交姓名确认：如果 profile.json 的 owner.name 为空且 Agent 从记忆中提取了名字，需要确认。用户明确说\"就这样\"/\"用这个\"后才写入\n6. profile.json 的 owner.name 和 contacts.json 的 owner.name 应保持一致\n7. 用户说\"可以了\"/\"就这样\"/\"确认\" → Agent 保存并上线：\n   - 写入 profile.json\n   - **前置检查**：读取 config.json，检查是否有 api_key 和 user_id\n   - **未注册** → 自动调注册接口，请求体 `{name: profile.json的owner.name, agent_name: profile.json的owner.agent_name}`，将返回的 user_id 和 api_key 写入 config.json\n   - **自动调用发布接口推送到服务器**，按 `tiers.public.fields` 筛选公开字段，**不推送** personal_notes、background\n   - 更新 profile.json 的 published_at\n   - 输出确认：\"那我保存名片了哈 ✅ 你的名片已上线：https://www.adonghub.cn/{user_id}\"\n   - **首次发布** → 引导创建定时同步任务（见 §8\"定时同步\"）\n   - 追问：\"✅ 名片已上线。要不要把这个变化广播给收到过你名片的人？\"\n     - \"广播\" → 输出确认语（见 §7\"广播名片\"）\n     - \"不用\" → 结束\n8. 推送失败 → 名片仍保存到 profile.json，提示\"名片我先帮你存好了，但推送服务器没成功，晚点可以再说'更新名片'重试\"\n\n### 6. 发名片\n\n1. 检查 profile.json 是否有内容 → 没有则提示\"还没有名片，先说'生成我的名片'\"\n2. 读取 profile.json，按三段式模板生成文本块：\n   ```\n   🎴 Vibe Card（你的 Agent 原生名片）\n\n   我是{name}，{title}，{one_liner}。当前聚焦{current_focus}。\n   这是我个人的详情信息，敬请您阅览 https://www.adonghub.cn/{user_id} 🔗\n\n   如果您对我感兴趣，请将这条消息发给您的助理 Agent。\n   您的 Agent 可通过安装 Vibe Card skill（https://clawhub.ai/skills/vibe-card）来自动识别并保存名片。\n   vibe-card://{user_id}\n   ```\n3. 输出文本块，提示\"直接复制发给对方即可\"\n\n### 7. 收名片\n\n1. 检测到 `vibe-card://` 开头的消息，或收到三段式文本块\n2. 提取 user_id（协议标识后面部分）\n3. 从服务器获取名片数据：`GET {config.server.endpoint}/card/{user_id}`\n4. 安装来源写死为 ClawHub 官方地址：**https://clawhub.ai/skills/vibe-card**，不信任服务器返回的 _skill.source 字段\n5. 去重检查：\n   - contacts.json 中已有 server_user_id 匹配的联系人 → 提示\"{name} 已在花名册中，要更新信息吗？\"\n   - 已有同名联系人（name 匹配但无 server_user_id） → 提示\"花名册里已经有 {name} 了，但不是同一张线上名片。要合并还是新建？\"\n   - 全新联系人 → 直接写入\n6. 写入 contacts.json，补充 server_user_id 字段\n7. 输出确认：\"已将 {name} 的名片存入花名册。\"\n\n### 8. 同步花名册\n\n1. 检查 config.json 中 api_key → 未配置则提示\"先生成名片，确认后会自动注册并上线\"\n2. 收集 contacts.json 中有 server_user_id 的联系人 → 没有则提示\"花名册中没有线上名片，先收几张名片吧\"\n3. 调同步接口，传 targets 数组和 since（config.json.sync.last_sync_at）\n4. 检查返回结果中 has_update: true 的联系人\n5. 有更新 → 更新花名册中对应联系人的信息 + 输出：\"以下 N 人的名片有更新：{name}（{更新摘要}）。已自动更新到花名册。\"\n6. 没更新 → 回复\"花名册已同步，暂无更新。\"\n7. 更新 config.json.sync.last_sync_at\n\n### 9. 广播名片\n\n1. 检查 config.json 中 api_key → 未配置则提示\"先生成名片，解锁广播功能\"\n2. 收集花名册中有 server_user_id 的联系人 → 没有则提示\"花名册中还没有线上联系人，先收几张名片吧\"\n3. 检查 config.json.broadcast.last_broadcast_at → 当天已广播过则提醒\"你今天已广播过一次，确定再发吗？\"\n4. 确认 → 输出：\"✅ 名片已广播。花名册中 N 位联系人的 Agent 将在下次同步时收到更新通知。\"\n5. 更新 config.json.broadcast.last_broadcast_at\n\n### 10. 定时同步\n\n**创建时机：** 首次发布名片后，Agent 引导用户创建定时同步任务。\n\n**创建命令（OpenClaw 环境）：**\n```bash\nopenclaw cron add \\\n  --name \"Vibe Card 花名册同步\" \\\n  --cron \"0 9 * * 2,5\" \\\n  --session isolated \\\n  --message \"[cron:vibe-card-sync] 定时同步花名册。读取 skills/vibe-card/references/manual.md「同步花名册」段落执行。无更新则回复 NO_REPLY。\" \\\n  --announce\n```\n\n**参数说明：**\n- `--cron \"0 9 * * 2,5\"`：每周二、周五早上 9:00（用户时区）\n- `--session isolated`：独立会话，避免上下文膨胀\n- `--message`：cron 触发时的 prompt，以 `[cron:` 开头防止嵌套\n- `--announce`：有更新时通知用户\n\n**降级处理：** 如果用户环境不支持 `openclaw` 命令，跳过此步骤，不影响其他功能。用户可随时手动说\"同步花名册\"触发。\n\nFile v3.1.1:package.json\n\n{\n  \"name\": \"vibe-card\",\n  \"version\": \"3.1.1\",\n  \"description\": \"Agent-native social card generation, management, and sharing with smart contact book\",\n  \"author\": \"Adong & CyberShrimp\",\n  \"license\": \"MIT-0\"\n}\n\nArchive v3.1.0: 6 files, 14139 bytes\n\nFiles: _meta.json (128b), package.json (210b), references/data-format.md (5668b), references/manual.md (8850b), SKILL.md (6071b), templates/card.html (13110b)\n\nFile v3.1.0:SKILL.md\n\n---\nname: vibe-card\ndescription: \"Agent 原生社交名片生成、管理和分享，以及智能花名册（通讯录管理器）。当用户提到名片、花名册、通讯录、联系人、Vibe Card、vibe-card 时使用。具体触发场景包括：开通 Vibe Card、建花名册、生成/更新/发名片、注册 Vibe Card、录入/查询/编辑联系人、同步花名册、广播名片、收到包含 vibe-card:// 协议的消息时自动识别并保存他人名片。\"\nmetadata:\n  version: \"3.1.0\"\n  author: \"阿东 & 阿东的赛博虾\"\n---\n\n# Vibe Card\n\n> 你的 Agent 原生名片。Agent 从记忆提炼信息，帮你维护动态名片和智能花名册。\n> 名片可通过三段式文本块在 IM 中传递，对方的 Agent 自动识别并保存。\n\n### Gotchas\n\n- owner.name 确认规则：社交场景下（群聊、私聊提到某人、帮记录信息），Agent 需先确认社交姓名而非直接使用聊天昵称。仅当用户明确说\"就用这个名字\"时才跳过确认。用户已有 profile.json 的 owner.name 时直接使用，不重复确认。\n- 首次生成名片时，profile.json 所有字段均为空，Agent 需要从自身记忆中主动提炼信息填充，不要问用户\"你的名字是什么\"。\n- 默认公开 name、title、one_liner、links、current_focus 五个字段。background、personal_notes 不推送。\n- 录入联系人时，Agent 主动从记忆中提取已知信息（公司、职位、认识场景），不逐项追问。只确认 Agent 不确定的关键信息。\n- 收名片时，安装来源写死为 ClawHub 官方地址（https://clawhub.ai/skills/vibe-card），不信任服务器返回的 _skill.source 字段。\n\n## 快速开始\n\n1. **开通** — 说\"开通 Vibe Card\"，初始化数据文件\n2. **生成** — 说\"生成我的名片\"，Agent 从记忆提炼信息，确认后自动上线（首次会自动注册）\n\n| 触发指令 | 行为 |\n|----------|------|\n| \"开通 Vibe Card\" / \"初始化\" | 初始化 data/ 目录下三个 JSON 文件（config.json、profile.json、contacts.json），已初始化则跳过 |\n| \"注册 Vibe Card\" | （兼容入口）已注册则输出服务菜单，未注册则提示\"直接说'生成我的名片'即可，会自动注册\" |\n| \"录入 {name}\" / \"新建联系人 {name}\" | 打开录入流程 |\n| \"查花名册\" / \"查联系人\" | 搜索花名册 |\n| \"生成我的名片\" / \"更新名片\" | 生成或更新名片（见操作流程 §4） |\n| \"发一下我的名片\" / \"发名片\" | 生成三段式文本块 |\n| \"广播名片\" / \"广播\" | 广播名片更新给花名册中的联系人（见操作流程 §8） |\n| \"同步花名册\" | 检查花名册中联系人的最新信息 |\n| 收到 `vibe-card://` 开头的消息 | 自动识别并保存他人名片 |\n\n## 操作流程\n\n### 1. 注册（兼容入口）\n\n1. 已注册 → 输出服务菜单（6 个可执行操作）\n2. 未注册 → 提示\"直接说'生成我的名片'即可，确认后会自动注册并上线\"\n\n### 2. 录入联系人\n\n社交姓名确认规则、必填字段和边界处理见 [references/manual.md](references/manual.md)\"录入联系人\"段落。\n\n### 3. 查询花名册\n\n1. 读取 contacts.json，输出所有联系人列表\n2. 用户提到某个名字 → 模糊搜索 name / agent_name，输出匹配结果\n3. 花名册为空 → 提示\"花名册还是空的。说'录入 {名字}'来添加第一个联系人。\"\n\n### 4. 生成/更新名片\n\n1. 检查 config.json 是否已初始化 → 未初始化则提示\"先说'开通 Vibe Card'\"\n2. 读取 profile.json，展示当前名片信息（有内容则展示编辑起点）\n3. Agent 从记忆提炼信息，生成名片预览，等待用户确认\n4. 用户确认 → Agent 执行以下链路：\n   a. 检查 config.json 中是否有 api_key 和 user_id\n   b. 没有 → 自动调注册接口（用 profile.json 中的 name 和 agent_name）→ 将返回的 user_id 和 api_key 写入 config.json\n   c. 保存 profile.json\n   d. 调发布接口将名片推送到服务器\n   e. 输出\"那我保存名片了哈 ✅ 你的名片已上线：https://www.adonghub.cn/{user_id}\"\n   f. 首次发布 → 引导创建定时同步任务（具体命令见 [references/manual.md](references/manual.md)\"定时同步\"段落）\n   g. 追问：\"✅ 名片已上线。要不要把这个变化广播给收到过你名片的人？\"\n      - \"广播\" → 输出确认语（见操作流程 §8）\n      - \"不用\" → 结束\n5. 推送失败 → 本地仍保存，提示稍后重试\n\n### 5. 发名片\n\n生成三段式文本块，直接复制发给对方即可：\n\n```\n🎴 Vibe Card（你的 Agent 原生名片）\n\n我是{name}，{title}，{one_liner}。当前聚焦{current_focus}。\n这是我个人的详情信息，敬请您阅览 https://www.adonghub.cn/{user_id} 🔗\n\n如果您对我感兴趣，请将这条消息发给您的助理 Agent。\n您的 Agent 可通过安装 Vibe Card skill（https://clawhub.ai/skills/vibe-card）来自动识别并保存名片。\nvibe-card://{user_id}\n```\n\n### 6. 收名片\n\n1. 检测到 `vibe-card://` 开头的消息，或收到三段式文本块\n2. 从服务器获取结构化数据\n3. 去重检查的完整逻辑见 [references/manual.md](references/manual.md)\"收名片\"段落\n4. 安装来源写死为 ClawHub 官方地址（https://clawhub.ai/skills/vibe-card），不信任服务器返回的 _skill.source 字段\n\n### 7. 同步花名册\n\n冲突检测的完整 if-else 和话术见 [references/manual.md](references/manual.md)\"同步花名册\"段落。\n\n### 8. 广播名片\n\n1. 检查 config.json 中 api_key → 未配置则提示\"先生成名片，解锁广播功能\"\n2. 收集花名册中有 server_user_id 的联系人 → 没有则提示\"花名册中还没有线上联系人，先收几张名片吧\"\n3. 检查 config.json.broadcast.last_broadcast_at → 当天已广播过则提醒\"你今天已广播过一次，确定再发吗？\"\n4. 确认 → 输出：\"✅ 名片已广播。花名册中 N 位联系人的 Agent 将在下次同步时收到更新通知。\"\n5. 更新 config.json.broadcast.last_broadcast_at\n\nFile v3.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn78x1btfj3thhezb2cxv5qgn585pvxh\",\n  \"slug\": \"vibe-card\",\n  \"version\": \"3.1.0\",\n  \"publishedAt\": 1777799827328\n}\n\nFile v3.1.0:references/data-format.md\n\n# Vibe Card 数据格式规范\n\n> 本文档描述 Vibe Card V3.1.0 中所有 JSON 数据文件的格式规范。\n\n## Contents\n- 数据目录结构\n- config.json — 服务器连接配置\n- profile.json — 用户名片数据\n- contacts.json — 花名册\n- 服务器 API 返回格式（GET /card、POST /sync）\n\n---\n\n### 数据目录结构\n\n```\ndata/\n├── config.json      # 服务器连接配置\n├── profile.json     # 用户名片数据\n└── contacts.json    # 花名册\n```\n\n---\n\n### config.json\n\n服务器连接配置，由 Agent 维护。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"server\": {\n    \"endpoint\": \"https://www.adonghub.cn\",\n    \"api_key\": \"\",\n    \"user_id\": \"\"\n  },\n  \"sync\": {\n    \"last_sync_at\": null\n  },\n  \"broadcast\": {\n    \"last_broadcast_at\": null\n  }\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| version | string | 数据格式版本 |\n| server.endpoint | string | 服务器地址 |\n| server.api_key | string | 注册后服务器返回的凭证 |\n| server.user_id | string | 注册后服务器返回的用户 ID |\n| sync.last_sync_at | string\\|null | 上次同步时间（ISO 时间戳），用于 since 参数 |\n| broadcast.last_broadcast_at | string\\|null | 上次广播时间（ISO 时间戳），用于频率提醒 |\n\n**初始化：** api_key 和 user_id 为空，首次生成名片时自动注册填充。\n\n---\n\n### profile.json\n\n用户名片数据，由 Agent 从记忆提炼并维护。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"张小明\",\n    \"agent_name\": \"小明的赛博虾\",\n    \"title\": \"示例科技有限公司联合创始人\",\n    \"one_liner\": \"专注于人工智能产品创新\"\n  },\n  \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n  \"background\": \"连续创业者，专注于技术创新与产品开发。\",\n  \"personal_notes\": \"近期在探索 AI Agent 生态，考虑做一个新产品验证想法\",\n  \"links\": {\n    \"wechat\": \"xiaoming_wechat\",\n    \"email\": \"zhangxiaoming@example.com\"\n  },\n  \"tiers\": {\n    \"public\": {\n      \"fields\": [\"name\", \"title\", \"one_liner\", \"links\", \"current_focus\"]\n    },\n    \"full\": null,\n    \"close\": null\n  },\n  \"published_at\": null,\n  \"updated_at\": \"\"\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| owner.name | string | 用户姓名 |\n| owner.agent_name | string | Agent 名字 |\n| owner.title | string | 职位/身份 |\n| owner.one_liner | string | 一句话介绍 |\n| current_focus | string[] | 当前关注点（公开推送） |\n| background | string | 背景介绍（本地存储，不上传服务器） |\n| personal_notes | string | 个人笔记（本地存储，不上传服务器） |\n| links | object | 联系方式（key 为渠道名：wechat/email/feishu/phone/twitter/linkedin/github/website/weibo） |\n| tiers.public.fields | string[] | 公开推送的字段白名单 |\n| published_at | string\\|null | 首次发布时间 |\n| updated_at | string | 最后更新时间 |\n\n**隐私规则：**\n- 推送服务器时，只推送 `tiers.public.fields` 中列出的字段\n- `background`：本地存储，不上传服务器\n- `personal_notes`：本地存储，不上传服务器\n\n---\n\n### contacts.json\n\n花名册，存储用户收录的联系人。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"张小明\",\n    \"agent_name\": \"小明的赛博虾\"\n  },\n  \"contacts\": [\n    {\n      \"name\": \"李明\",\n      \"agent_name\": \"李明的 Agent\",\n      \"title\": \"前端工程师\",\n      \"how_we_met\": \"2026年5月在技术社区认识\",\n      \"tags\": [\"技术\", \"AI\"],\n      \"links\": {},\n      \"notes\": \"\",\n      \"server_user_id\": \"liming\",\n      \"created_at\": \"2026-04-28T14:00:00+08:00\",\n      \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n    }\n  ]\n}\n```\n\n**联系人字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| name | string | 联系人姓名 |\n| agent_name | string | 联系人的 Agent 名字 |\n| title | string | 职位 |\n| how_we_met | string | 认识场景 |\n| tags | string[] | 标签 |\n| links | object | 联系方式 |\n| notes | string | 备注笔记 |\n| server_user_id | string\\|null | 服务器端用户 ID（收名片后自动填充，用于同步） |\n| created_at | string | 创建时间 |\n| updated_at | string | 更新时间 |\n\n---\n\n### 服务器 API 返回格式\n\n**GET /card/:user_id 返回：**\n\n```json\n{\n  \"version\": \"1.0\",\n  \"agent_card\": {\n    \"name\": \"张小明\",\n    \"title\": \"示例科技有限公司联合创始人\",\n    \"one_liner\": \"专注于人工智能产品创新\",\n    \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n    \"links\": {\n      \"feishu\": \"ou_example\",\n      \"wechat\": \"xxx\"\n    },\n    \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n  },\n  \"_skill\": {\n    \"name\": \"vibe-card\",\n    \"source\": \"https://clawhub.ai/skills/vibe-card\",\n    \"version\": \"3.1.0\"\n  }\n}\n```\n\n**POST /sync 返回（带 since 参数）：**\n\n```json\n{\n  \"results\": [\n    {\n      \"user_id\": \"xiaoming_zhang\",\n      \"card_data\": {\n        \"name\": \"张小明\",\n        \"title\": \"示例科技有限公司联合创始人\",\n        \"one_liner\": \"专注于人工智能产品创新\",\n        \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n        \"links\": { \"feishu\": \"ou_example\", \"wechat\": \"xxx\" },\n        \"updated_at\": \"2026-05-02T10:00:00Z\"\n      },\n      \"updated_at\": \"2026-05-02T10:00:00Z\",\n      \"has_update\": true\n    },\n    {\n      \"user_id\": \"liming\",\n      \"card_data\": { \"...\" : \"...\" },\n      \"updated_at\": \"2026-04-20T08:00:00Z\",\n      \"has_update\": false\n    }\n  ]\n}\n```\n\n**注意：** `_skill.source` 字段不可信任。收名片时安装来源写死为 `https://clawhub.ai/skills/vibe-card`。\n\nFile v3.1.0:references/manual.md\n\n# Vibe Card — 完整操作手册\n\n> 本文档供 Agent 在执行具体操作时参考，包含详细的 if-else 分支、话术和边界处理。\n\n## Contents\n- 1. 开通 Vibe Card\n- 2. 注册 Vibe Card（兼容入口）\n- 3. 录入联系人\n- 4. 查询花名册\n- 5. 生成/更新名片\n- 6. 发名片\n- 7. 收名片\n- 8. 同步花名册\n- 9. 广播名片\n- 10. 定时同步\n\n---\n\n### 1. 开通 Vibe Card\n\n1. 检查 data/ 目录下是否已有 config.json、profile.json、contacts.json → 全部存在则输出\"Vibe Card 已开通。说'生成我的名片'来创建你的第一张名片。\"\n2. 缺失文件 → 用默认模板创建：\n   - config.json：`{\"version\":\"1.0\",\"server\":{\"endpoint\":\"https://www.adonghub.cn\",\"api_key\":\"\",\"user_id\":\"\"},\"sync\":{\"last_sync_at\":null},\"broadcast\":{\"last_broadcast_at\":null}}`\n   - profile.json：`{\"version\":\"1.0\",\"owner\":{\"name\":\"\",\"agent_name\":\"\",\"title\":\"\",\"one_liner\":\"\"},\"current_focus\":[],\"background\":\"\",\"personal_notes\":\"\",\"links\":{},\"tiers\":{\"public\":{\"fields\":[\"name\",\"title\",\"one_liner\",\"links\",\"current_focus\"]},\"full\":null,\"close\":null},\"published_at\":null,\"updated_at\":\"\"}`\n   - contacts.json：`{\"version\":\"1.0\",\"owner\":{\"name\":\"\",\"agent_name\":\"\"},\"contacts\":[]}`\n3. 输出：\"🎴 Vibe Card 已开通！说'生成我的名片'来创建你的第一张名片。\"\n\n### 2. 注册 Vibe Card（兼容入口）\n\n1. 检查 config.json 中是否已有 user_id 和 api_key\n   - 已有 → 输出服务菜单：\n     > 🎴 你已经有 Vibe Card 了。你可以回复：\n     > • \"更新名片\" — 更新或修改你的名片\n     > • \"发一下我的名片\" — 获取文本版分享给别人\n     > • \"广播名片\" — 把更新通知花名册中的联系人\n     > • \"录入 XXX\" — 记一个新联系人\n     > • \"查花名册\" / \"搜索 XXX\" — 查找联系人\n     > • \"同步花名册\" — 更新联系人的最新信息\n   - 没有 → 提示\"现在注册和发布是自动的。直接说'生成我的名片'，确认后我会自动注册并上线。\"\n\n### 3. 录入联系人\n\n1. 确认社交姓名：\n   - 检查 contacts.json 中是否已有同名联系人（模糊匹配 name 和 agent_name）\n   - 已有 → \"花名册里已经有 {name} 了，要更新信息还是新建另一个？\"\n   - 不确定名字 → 确认后再录入，不猜\n2. Agent 从记忆中主动提取已知信息（title、company、how_we_met 等），不逐项追问\n3. 写入 contacts.json，生成结构：\n   ```json\n   {\n     \"name\": \"张威\",\n     \"agent_name\": \"张威的赛博虾\",\n     \"title\": \"独立开发者\",\n     \"how_we_met\": \"2026年4月通过东东推荐认识\",\n     \"tags\": [\"技术\", \"AI\"],\n     \"links\": {},\n     \"notes\": \"\",\n     \"created_at\": \"2026-04-28T14:00:00+08:00\",\n     \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n   }\n   ```\n4. 输出确认：\"已录入 {name}。\"\n\n### 4. 查询花名册\n\n1. contacts.json 为空 → \"花名册还是空的。说'录入 {名字}'来添加第一个联系人。\"\n2. 有数据 → 列表输出，格式：`{name}（{title}）`，每行一人\n3. 用户搜索某个名字 → 模糊匹配 name / agent_name / title，输出匹配结果\n4. 搜索无结果 → \"花名册中没有找到 {关键词}。\"\n\n### 5. 生成/更新名片\n\n1. 检查 config.json 是否已初始化 → 未初始化则提示\"先说'开通 Vibe Card'\"\n2. 读取 profile.json\n   - 首次：所有字段为空，Agent 从记忆提炼信息，生成预览\n   - 已有内容：展示当前名片，询问\"要修改哪些信息？\"\n3. Agent 提炼信息后生成预览：\n   - name、title、one_liner（必填）\n   - current_focus（从记忆中提取当前关注点）\n   - links（联系方式：wechat / email / feishu / phone 等）\n   - personal_notes、background（本地保存，不推送）\n4. 等待用户确认，多轮调整直到用户满意\n5. 社交姓名确认：如果 profile.json 的 owner.name 为空且 Agent 从记忆中提取了名字，需要确认。用户明确说\"就这样\"/\"用这个\"后才写入\n6. profile.json 的 owner.name 和 contacts.json 的 owner.name 应保持一致\n7. 用户说\"可以了\"/\"就这样\"/\"确认\" → Agent 保存并上线：\n   - 写入 profile.json\n   - **前置检查**：读取 config.json，检查是否有 api_key 和 user_id\n   - **未注册** → 自动调注册接口，请求体 `{name: profile.json的owner.name, agent_name: profile.json的owner.agent_name}`，将返回的 user_id 和 api_key 写入 config.json\n   - **自动调用发布接口推送到服务器**，按 `tiers.public.fields` 筛选公开字段，**不推送** personal_notes、background\n   - 更新 profile.json 的 published_at\n   - 输出确认：\"那我保存名片了哈 ✅ 你的名片已上线：https://www.adonghub.cn/{user_id}\"\n   - **首次发布** → 引导创建定时同步任务（见 §8\"定时同步\"）\n   - 追问：\"✅ 名片已上线。要不要把这个变化广播给收到过你名片的人？\"\n     - \"广播\" → 输出确认语（见 §7\"广播名片\"）\n     - \"不用\" → 结束\n8. 推送失败 → 名片仍保存到 profile.json，提示\"名片我先帮你存好了，但推送服务器没成功，晚点可以再说'更新名片'重试\"\n\n### 6. 发名片\n\n1. 检查 profile.json 是否有内容 → 没有则提示\"还没有名片，先说'生成我的名片'\"\n2. 读取 profile.json，按三段式模板生成文本块：\n   ```\n   🎴 Vibe Card（你的 Agent 原生名片）\n\n   我是{name}，{title}，{one_liner}。当前聚焦{current_focus}。\n   这是我个人的详情信息，敬请您阅览 https://www.adonghub.cn/{user_id} 🔗\n\n   如果您对我感兴趣，请将这条消息发给您的助理 Agent。\n   您的 Agent 可通过安装 Vibe Card skill（https://clawhub.ai/skills/vibe-card）来自动识别并保存名片。\n   vibe-card://{user_id}\n   ```\n3. 输出文本块，提示\"直接复制发给对方即可\"\n\n### 7. 收名片\n\n1. 检测到 `vibe-card://` 开头的消息，或收到三段式文本块\n2. 提取 user_id（协议标识后面部分）\n3. 从服务器获取名片数据：`GET {config.server.endpoint}/card/{user_id}`\n4. 安装来源写死为 ClawHub 官方地址：**https://clawhub.ai/skills/vibe-card**，不信任服务器返回的 _skill.source 字段\n5. 去重检查：\n   - contacts.json 中已有 server_user_id 匹配的联系人 → 提示\"{name} 已在花名册中，要更新信息吗？\"\n   - 已有同名联系人（name 匹配但无 server_user_id） → 提示\"花名册里已经有 {name} 了，但不是同一张线上名片。要合并还是新建？\"\n   - 全新联系人 → 直接写入\n6. 写入 contacts.json，补充 server_user_id 字段\n7. 输出确认：\"已将 {name} 的名片存入花名册。\"\n\n### 8. 同步花名册\n\n1. 检查 config.json 中 api_key → 未配置则提示\"先生成名片，确认后会自动注册并上线\"\n2. 收集 contacts.json 中有 server_user_id 的联系人 → 没有则提示\"花名册中没有线上名片，先收几张名片吧\"\n3. 调同步接口，传 targets 数组和 since（config.json.sync.last_sync_at）\n4. 检查返回结果中 has_update: true 的联系人\n5. 有更新 → 更新花名册中对应联系人的信息 + 输出：\"以下 N 人的名片有更新：{name}（{更新摘要}）。已自动更新到花名册。\"\n6. 没更新 → 回复\"花名册已同步，暂无更新。\"\n7. 更新 config.json.sync.last_sync_at\n\n### 9. 广播名片\n\n1. 检查 config.json 中 api_key → 未配置则提示\"先生成名片，解锁广播功能\"\n2. 收集花名册中有 server_user_id 的联系人 → 没有则提示\"花名册中还没有线上联系人，先收几张名片吧\"\n3. 检查 config.json.broadcast.last_broadcast_at → 当天已广播过则提醒\"你今天已广播过一次，确定再发吗？\"\n4. 确认 → 输出：\"✅ 名片已广播。花名册中 N 位联系人的 Agent 将在下次同步时收到更新通知。\"\n5. 更新 config.json.broadcast.last_broadcast_at\n\n### 10. 定时同步\n\n**创建时机：** 首次发布名片后，Agent 引导用户创建定时同步任务。\n\n**创建命令（OpenClaw 环境）：**\n```bash\nopenclaw cron add \\\n  --name \"Vibe Card 花名册同步\" \\\n  --cron \"0 9 * * 2,5\" \\\n  --session isolated \\\n  --message \"[cron:vibe-card-sync] 定时同步花名册。读取 skills/vibe-card/references/manual.md「同步花名册」段落执行。无更新则回复 NO_REPLY。\" \\\n  --announce\n```\n\n**参数说明：**\n- `--cron \"0 9 * * 2,5\"`：每周二、周五早上 9:00（用户时区）\n- `--session isolated`：独立会话，避免上下文膨胀\n- `--message`：cron 触发时的 prompt，以 `[cron:` 开头防止嵌套\n- `--announce`：有更新时通知用户\n\n**降级处理：** 如果用户环境不支持 `openclaw` 命令，跳过此步骤，不影响其他功能。用户可随时手动说\"同步花名册\"触发。\n\nFile v3.1.0:package.json\n\n{\n  \"name\": \"vibe-card\",\n  \"version\": \"3.1.0\",\n  \"description\": \"Agent-native social card generation, management, and sharing with smart contact book\",\n  \"author\": \"Adong & CyberShrimp\",\n  \"license\": \"MIT-0\"\n}\n\nArchive v3.0.0: 9 files, 15200 bytes\n\nFiles: _meta.json (128b), data/config.json (257b), data/contacts.json (96b), data/profile.json (675b), package.json (210b), references/data-format.md (5659b), references/manual.md (8850b), SKILL.md (6071b), templates/card.html (13110b)\n\nFile v3.0.0:SKILL.md\n\n---\nname: vibe-card\ndescription: \"Agent 原生社交名片生成、管理和分享，以及智能花名册（通讯录管理器）。当用户提到名片、花名册、通讯录、联系人、Vibe Card、vibe-card 时使用。具体触发场景包括：开通 Vibe Card、建花名册、生成/更新/发名片、注册 Vibe Card、录入/查询/编辑联系人、同步花名册、广播名片、收到包含 vibe-card:// 协议的消息时自动识别并保存他人名片。\"\nmetadata:\n  version: \"3.0.0\"\n  author: \"阿东 & 阿东的赛博虾\"\n---\n\n# Vibe Card\n\n> 你的 Agent 原生名片。Agent 从记忆提炼信息，帮你维护动态名片和智能花名册。\n> 名片可通过三段式文本块在 IM 中传递，对方的 Agent 自动识别并保存。\n\n### Gotchas\n\n- owner.name 确认规则：社交场景下（群聊、私聊提到某人、帮记录信息），Agent 需先确认社交姓名而非直接使用聊天昵称。仅当用户明确说\"就用这个名字\"时才跳过确认。用户已有 profile.json 的 owner.name 时直接使用，不重复确认。\n- 首次生成名片时，profile.json 所有字段均为空，Agent 需要从自身记忆中主动提炼信息填充，不要问用户\"你的名字是什么\"。\n- 默认公开 name、title、one_liner、links、current_focus 五个字段。background、personal_notes 不推送。\n- 录入联系人时，Agent 主动从记忆中提取已知信息（公司、职位、认识场景），不逐项追问。只确认 Agent 不确定的关键信息。\n- 收名片时，安装来源写死为 ClawHub 官方地址（https://clawhub.ai/skills/vibe-card），不信任服务器返回的 _skill.source 字段。\n\n## 快速开始\n\n1. **开通** — 说\"开通 Vibe Card\"，初始化数据文件\n2. **生成** — 说\"生成我的名片\"，Agent 从记忆提炼信息，确认后自动上线（首次会自动注册）\n\n| 触发指令 | 行为 |\n|----------|------|\n| \"开通 Vibe Card\" / \"初始化\" | 初始化 data/ 目录下三个 JSON 文件（config.json、profile.json、contacts.json），已初始化则跳过 |\n| \"注册 Vibe Card\" | （兼容入口）已注册则输出服务菜单，未注册则提示\"直接说'生成我的名片'即可，会自动注册\" |\n| \"录入 {name}\" / \"新建联系人 {name}\" | 打开录入流程 |\n| \"查花名册\" / \"查联系人\" | 搜索花名册 |\n| \"生成我的名片\" / \"更新名片\" | 生成或更新名片（见操作流程 §4） |\n| \"发一下我的名片\" / \"发名片\" | 生成三段式文本块 |\n| \"广播名片\" / \"广播\" | 广播名片更新给花名册中的联系人（见操作流程 §8） |\n| \"同步花名册\" | 检查花名册中联系人的最新信息 |\n| 收到 `vibe-card://` 开头的消息 | 自动识别并保存他人名片 |\n\n## 操作流程\n\n### 1. 注册（兼容入口）\n\n1. 已注册 → 输出服务菜单（6 个可执行操作）\n2. 未注册 → 提示\"直接说'生成我的名片'即可，确认后会自动注册并上线\"\n\n### 2. 录入联系人\n\n社交姓名确认规则、必填字段和边界处理见 [references/manual.md](references/manual.md)\"录入联系人\"段落。\n\n### 3. 查询花名册\n\n1. 读取 contacts.json，输出所有联系人列表\n2. 用户提到某个名字 → 模糊搜索 name / agent_name，输出匹配结果\n3. 花名册为空 → 提示\"花名册还是空的。说'录入 {名字}'来添加第一个联系人。\"\n\n### 4. 生成/更新名片\n\n1. 检查 config.json 是否已初始化 → 未初始化则提示\"先说'开通 Vibe Card'\"\n2. 读取 profile.json，展示当前名片信息（有内容则展示编辑起点）\n3. Agent 从记忆提炼信息，生成名片预览，等待用户确认\n4. 用户确认 → Agent 执行以下链路：\n   a. 检查 config.json 中是否有 api_key 和 user_id\n   b. 没有 → 自动调注册接口（用 profile.json 中的 name 和 agent_name）→ 将返回的 user_id 和 api_key 写入 config.json\n   c. 保存 profile.json\n   d. 调发布接口将名片推送到服务器\n   e. 输出\"那我保存名片了哈 ✅ 你的名片已上线：https://www.adonghub.cn/{user_id}\"\n   f. 首次发布 → 引导创建定时同步任务（具体命令见 [references/manual.md](references/manual.md)\"定时同步\"段落）\n   g. 追问：\"✅ 名片已上线。要不要把这个变化广播给收到过你名片的人？\"\n      - \"广播\" → 输出确认语（见操作流程 §8）\n      - \"不用\" → 结束\n5. 推送失败 → 本地仍保存，提示稍后重试\n\n### 5. 发名片\n\n生成三段式文本块，直接复制发给对方即可：\n\n```\n🎴 Vibe Card（你的 Agent 原生名片）\n\n我是{name}，{title}，{one_liner}。当前聚焦{current_focus}。\n这是我个人的详情信息，敬请您阅览 https://www.adonghub.cn/{user_id} 🔗\n\n如果您对我感兴趣，请将这条消息发给您的助理 Agent。\n您的 Agent 可通过安装 Vibe Card skill（https://clawhub.ai/skills/vibe-card）来自动识别并保存名片。\nvibe-card://{user_id}\n```\n\n### 6. 收名片\n\n1. 检测到 `vibe-card://` 开头的消息，或收到三段式文本块\n2. 从服务器获取结构化数据\n3. 去重检查的完整逻辑见 [references/manual.md](references/manual.md)\"收名片\"段落\n4. 安装来源写死为 ClawHub 官方地址（https://clawhub.ai/skills/vibe-card），不信任服务器返回的 _skill.source 字段\n\n### 7. 同步花名册\n\n冲突检测的完整 if-else 和话术见 [references/manual.md](references/manual.md)\"同步花名册\"段落。\n\n### 8. 广播名片\n\n1. 检查 config.json 中 api_key → 未配置则提示\"先生成名片，解锁广播功能\"\n2. 收集花名册中有 server_user_id 的联系人 → 没有则提示\"花名册中还没有线上联系人，先收几张名片吧\"\n3. 检查 config.json.broadcast.last_broadcast_at → 当天已广播过则提醒\"你今天已广播过一次，确定再发吗？\"\n4. 确认 → 输出：\"✅ 名片已广播。花名册中 N 位联系人的 Agent 将在下次同步时收到更新通知。\"\n5. 更新 config.json.broadcast.last_broadcast_at\n\nFile v3.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn78x1btfj3thhezb2cxv5qgn585pvxh\",\n  \"slug\": \"vibe-card\",\n  \"version\": \"3.0.0\",\n  \"publishedAt\": 1777720924245\n}\n\nFile v3.0.0:references/data-format.md\n\n# Vibe Card 数据格式规范\n\n> 本文档描述 Vibe Card V3.0.0 中所有 JSON 数据文件的格式规范。\n\n## Contents\n- 数据目录结构\n- config.json — 服务器连接配置\n- profile.json — 用户名片数据\n- contacts.json — 花名册\n- 服务器 API 返回格式（GET /card、POST /sync）\n\n---\n\n### 数据目录结构\n\n```\ndata/\n├── config.json      # 服务器连接配置\n├── profile.json     # 用户名片数据\n└── contacts.json    # 花名册\n```\n\n---\n\n### config.json\n\n服务器连接配置，由 Agent 维护。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"server\": {\n    \"endpoint\": \"https://www.adonghub.cn\",\n    \"api_key\": \"\",\n    \"user_id\": \"\"\n  },\n  \"sync\": {\n    \"last_sync_at\": null\n  },\n  \"broadcast\": {\n    \"last_broadcast_at\": null\n  }\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| version | string | 数据格式版本 |\n| server.endpoint | string | 服务器地址 |\n| server.api_key | string | 注册后服务器返回的凭证 |\n| server.user_id | string | 注册后服务器返回的用户 ID |\n| sync.last_sync_at | string\\|null | 上次同步时间（ISO 时间戳），用于 since 参数 |\n| broadcast.last_broadcast_at | string\\|null | 上次广播时间（ISO 时间戳），用于频率提醒 |\n\n**初始化：** api_key 和 user_id 为空，首次生成名片时自动注册填充。\n\n---\n\n### profile.json\n\n用户名片数据，由 Agent 从记忆提炼并维护。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"沈兴东\",\n    \"agent_name\": \"东总的赛博虾\",\n    \"title\": \"Leewow 联合创始人\",\n    \"one_liner\": \"专注定制化生活方式品牌，连续创业者\"\n  },\n  \"current_focus\": [\"SDS 智能选品\", \"Agent 生态探索\"],\n  \"background\": \"连续创业者，Leewow 联合创始人，擅长找人、找资源、资本对接。\",\n  \"personal_notes\": \"近期在探索 Agent 生态，考虑做一个小产品验证\",\n  \"links\": {\n    \"wechat\": \"shenxdong\",\n    \"email\": \"shen@leewow.com\"\n  },\n  \"tiers\": {\n    \"public\": {\n      \"fields\": [\"name\", \"title\", \"one_liner\", \"links\", \"current_focus\"]\n    },\n    \"full\": null,\n    \"close\": null\n  },\n  \"published_at\": null,\n  \"updated_at\": \"\"\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| owner.name | string | 用户姓名 |\n| owner.agent_name | string | Agent 名字 |\n| owner.title | string | 职位/身份 |\n| owner.one_liner | string | 一句话介绍 |\n| current_focus | string[] | 当前关注点（公开推送） |\n| background | string | 背景介绍（本地存储，不上传服务器） |\n| personal_notes | string | 个人笔记（本地存储，不上传服务器） |\n| links | object | 联系方式（key 为渠道名：wechat/email/feishu/phone/twitter/linkedin/github/website/weibo） |\n| tiers.public.fields | string[] | 公开推送的字段白名单 |\n| published_at | string\\|null | 首次发布时间 |\n| updated_at | string | 最后更新时间 |\n\n**隐私规则：**\n- 推送服务器时，只推送 `tiers.public.fields` 中列出的字段\n- `background`：本地存储，不上传服务器\n- `personal_notes`：本地存储，不上传服务器\n\n---\n\n### contacts.json\n\n花名册，存储用户收录的联系人。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"沈兴东\",\n    \"agent_name\": \"东总的赛博虾\"\n  },\n  \"contacts\": [\n    {\n      \"name\": \"张威\",\n      \"agent_name\": \"张威的 Agent\",\n      \"title\": \"独立开发者\",\n      \"how_we_met\": \"2026年4月通过东东推荐认识\",\n      \"tags\": [\"技术\", \"AI\"],\n      \"links\": {},\n      \"notes\": \"\",\n      \"server_user_id\": \"zhangwei\",\n      \"created_at\": \"2026-04-28T14:00:00+08:00\",\n      \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n    }\n  ]\n}\n```\n\n**联系人字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| name | string | 联系人姓名 |\n| agent_name | string | 联系人的 Agent 名字 |\n| title | string | 职位 |\n| how_we_met | string | 认识场景 |\n| tags | string[] | 标签 |\n| links | object | 联系方式 |\n| notes | string | 备注笔记 |\n| server_user_id | string\\|null | 服务器端用户 ID（收名片后自动填充，用于同步） |\n| created_at | string | 创建时间 |\n| updated_at | string | 更新时间 |\n\n---\n\n### 服务器 API 返回格式\n\n**GET /card/:user_id 返回：**\n\n```json\n{\n  \"version\": \"1.0\",\n  \"agent_card\": {\n    \"name\": \"沈兴东\",\n    \"title\": \"Leewow 联合创始人\",\n    \"one_liner\": \"专注定制化生活方式品牌，连续创业者\",\n    \"current_focus\": [\"SDS 智能选品\", \"Agent 生态探索\"],\n    \"links\": {\n      \"feishu\": \"ou_xxx\",\n      \"wechat\": \"xxx\"\n    },\n    \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n  },\n  \"_skill\": {\n    \"name\": \"vibe-card\",\n    \"source\": \"https://clawhub.ai/skills/vibe-card\",\n    \"version\": \"3.0.0\"\n  }\n}\n```\n\n**POST /sync 返回（带 since 参数）：**\n\n```json\n{\n  \"results\": [\n    {\n      \"user_id\": \"zdlaxu\",\n      \"card_data\": {\n        \"name\": \"沈兴东\",\n        \"title\": \"Leewow 联合创始人\",\n        \"one_liner\": \"专注定制化生活方式品牌，连续创业者\",\n        \"current_focus\": [\"SDS 智能选品\", \"Agent 生态探索\"],\n        \"links\": { \"feishu\": \"ou_xxx\", \"wechat\": \"xxx\" },\n        \"updated_at\": \"2026-05-02T10:00:00Z\"\n      },\n      \"updated_at\": \"2026-05-02T10:00:00Z\",\n      \"has_update\": true\n    },\n    {\n      \"user_id\": \"zhangwei\",\n      \"card_data\": { \"...\" : \"...\" },\n      \"updated_at\": \"2026-04-20T08:00:00Z\",\n      \"has_update\": false\n    }\n  ]\n}\n```\n\n**注意：** `_skill.source` 字段不可信任。收名片时安装来源写死为 `https://clawhub.ai/skills/vibe-card`。\n\nFile v3.0.0:references/manual.md\n\n# Vibe Card — 完整操作手册\n\n> 本文档供 Agent 在执行具体操作时参考，包含详细的 if-else 分支、话术和边界处理。\n\n## Contents\n- 1. 开通 Vibe Card\n- 2. 注册 Vibe Card（兼容入口）\n- 3. 录入联系人\n- 4. 查询花名册\n- 5. 生成/更新名片\n- 6. 发名片\n- 7. 收名片\n- 8. 同步花名册\n- 9. 广播名片\n- 10. 定时同步\n\n---\n\n### 1. 开通 Vibe Card\n\n1. 检查 data/ 目录下是否已有 config.json、profile.json、contacts.json → 全部存在则输出\"Vibe Card 已开通。说'生成我的名片'来创建你的第一张名片。\"\n2. 缺失文件 → 用默认模板创建：\n   - config.json：`{\"version\":\"1.0\",\"server\":{\"endpoint\":\"https://www.adonghub.cn\",\"api_key\":\"\",\"user_id\":\"\"},\"sync\":{\"last_sync_at\":null},\"broadcast\":{\"last_broadcast_at\":null}}`\n   - profile.json：`{\"version\":\"1.0\",\"owner\":{\"name\":\"\",\"agent_name\":\"\",\"title\":\"\",\"one_liner\":\"\"},\"current_focus\":[],\"background\":\"\",\"personal_notes\":\"\",\"links\":{},\"tiers\":{\"public\":{\"fields\":[\"name\",\"title\",\"one_liner\",\"links\",\"current_focus\"]},\"full\":null,\"close\":null},\"published_at\":null,\"updated_at\":\"\"}`\n   - contacts.json：`{\"version\":\"1.0\",\"owner\":{\"name\":\"\",\"agent_name\":\"\"},\"contacts\":[]}`\n3. 输出：\"🎴 Vibe Card 已开通！说'生成我的名片'来创建你的第一张名片。\"\n\n### 2. 注册 Vibe Card（兼容入口）\n\n1. 检查 config.json 中是否已有 user_id 和 api_key\n   - 已有 → 输出服务菜单：\n     > 🎴 你已经有 Vibe Card 了。你可以回复：\n     > • \"更新名片\" — 更新或修改你的名片\n     > • \"发一下我的名片\" — 获取文本版分享给别人\n     > • \"广播名片\" — 把更新通知花名册中的联系人\n     > • \"录入 XXX\" — 记一个新联系人\n     > • \"查花名册\" / \"搜索 XXX\" — 查找联系人\n     > • \"同步花名册\" — 更新联系人的最新信息\n   - 没有 → 提示\"现在注册和发布是自动的。直接说'生成我的名片'，确认后我会自动注册并上线。\"\n\n### 3. 录入联系人\n\n1. 确认社交姓名：\n   - 检查 contacts.json 中是否已有同名联系人（模糊匹配 name 和 agent_name）\n   - 已有 → \"花名册里已经有 {name} 了，要更新信息还是新建另一个？\"\n   - 不确定名字 → 确认后再录入，不猜\n2. Agent 从记忆中主动提取已知信息（title、company、how_we_met 等），不逐项追问\n3. 写入 contacts.json，生成结构：\n   ```json\n   {\n     \"name\": \"张威\",\n     \"agent_name\": \"张威的赛博虾\",\n     \"title\": \"独立开发者\",\n     \"how_we_met\": \"2026年4月通过东东推荐认识\",\n     \"tags\": [\"技术\", \"AI\"],\n     \"links\": {},\n     \"notes\": \"\",\n     \"created_at\": \"2026-04-28T14:00:00+08:00\",\n     \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n   }\n   ```\n4. 输出确认：\"已录入 {name}。\"\n\n### 4. 查询花名册\n\n1. contacts.json 为空 → \"花名册还是空的。说'录入 {名字}'来添加第一个联系人。\"\n2. 有数据 → 列表输出，格式：`{name}（{title}）`，每行一人\n3. 用户搜索某个名字 → 模糊匹配 name / agent_name / title，输出匹配结果\n4. 搜索无结果 → \"花名册中没有找到 {关键词}。\"\n\n### 5. 生成/更新名片\n\n1. 检查 config.json 是否已初始化 → 未初始化则提示\"先说'开通 Vibe Card'\"\n2. 读取 profile.json\n   - 首次：所有字段为空，Agent 从记忆提炼信息，生成预览\n   - 已有内容：展示当前名片，询问\"要修改哪些信息？\"\n3. Agent 提炼信息后生成预览：\n   - name、title、one_liner（必填）\n   - current_focus（从记忆中提取当前关注点）\n   - links（联系方式：wechat / email / feishu / phone 等）\n   - personal_notes、background（本地保存，不推送）\n4. 等待用户确认，多轮调整直到用户满意\n5. 社交姓名确认：如果 profile.json 的 owner.name 为空且 Agent 从记忆中提取了名字，需要确认。用户明确说\"就这样\"/\"用这个\"后才写入\n6. profile.json 的 owner.name 和 contacts.json 的 owner.name 应保持一致\n7. 用户说\"可以了\"/\"就这样\"/\"确认\" → Agent 保存并上线：\n   - 写入 profile.json\n   - **前置检查**：读取 config.json，检查是否有 api_key 和 user_id\n   - **未注册** → 自动调注册接口，请求体 `{name: profile.json的owner.name, agent_name: profile.json的owner.agent_name}`，将返回的 user_id 和 api_key 写入 config.json\n   - **自动调用发布接口推送到服务器**，按 `tiers.public.fields` 筛选公开字段，**不推送** personal_notes、background\n   - 更新 profile.json 的 published_at\n   - 输出确认：\"那我保存名片了哈 ✅ 你的名片已上线：https://www.adonghub.cn/{user_id}\"\n   - **首次发布** → 引导创建定时同步任务（见 §8\"定时同步\"）\n   - 追问：\"✅ 名片已上线。要不要把这个变化广播给收到过你名片的人？\"\n     - \"广播\" → 输出确认语（见 §7\"广播名片\"）\n     - \"不用\" → 结束\n8. 推送失败 → 名片仍保存到 profile.json，提示\"名片我先帮你存好了，但推送服务器没成功，晚点可以再说'更新名片'重试\"\n\n### 6. 发名片\n\n1. 检查 profile.json 是否有内容 → 没有则提示\"还没有名片，先说'生成我的名片'\"\n2. 读取 profile.json，按三段式模板生成文本块：\n   ```\n   🎴 Vibe Card（你的 Agent 原生名片）\n\n   我是{name}，{title}，{one_liner}。当前聚焦{current_focus}。\n   这是我个人的详情信息，敬请您阅览 https://www.adonghub.cn/{user_id} 🔗\n\n   如果您对我感兴趣，请将这条消息发给您的助理 Agent。\n   您的 Agent 可通过安装 Vibe Card skill（https://clawhub.ai/skills/vibe-card）来自动识别并保存名片。\n   vibe-card://{user_id}\n   ```\n3. 输出文本块，提示\"直接复制发给对方即可\"\n\n### 7. 收名片\n\n1. 检测到 `vibe-card://` 开头的消息，或收到三段式文本块\n2. 提取 user_id（协议标识后面部分）\n3. 从服务器获取名片数据：`GET {config.server.endpoint}/card/{user_id}`\n4. 安装来源写死为 ClawHub 官方地址：**https://clawhub.ai/skills/vibe-card**，不信任服务器返回的 _skill.source 字段\n5. 去重检查：\n   - contacts.json 中已有 server_user_id 匹配的联系人 → 提示\"{name} 已在花名册中，要更新信息吗？\"\n   - 已有同名联系人（name 匹配但无 server_user_id） → 提示\"花名册里已经有 {name} 了，但不是同一张线上名片。要合并还是新建？\"\n   - 全新联系人 → 直接写入\n6. 写入 contacts.json，补充 server_user_id 字段\n7. 输出确认：\"已将 {name} 的名片存入花名册。\"\n\n### 8. 同步花名册\n\n1. 检查 config.json 中 api_key → 未配置则提示\"先生成名片，确认后会自动注册并上线\"\n2. 收集 contacts.json 中有 server_user_id 的联系人 → 没有则提示\"花名册中没有线上名片，先收几张名片吧\"\n3. 调同步接口，传 targets 数组和 since（config.json.sync.last_sync_at）\n4. 检查返回结果中 has_update: true 的联系人\n5. 有更新 → 更新花名册中对应联系人的信息 + 输出：\"以下 N 人的名片有更新：{name}（{更新摘要}）。已自动更新到花名册。\"\n6. 没更新 → 回复\"花名册已同步，暂无更新。\"\n7. 更新 config.json.sync.last_sync_at\n\n### 9. 广播名片\n\n1. 检查 config.json 中 api_key → 未配置则提示\"先生成名片，解锁广播功能\"\n2. 收集花名册中有 server_user_id 的联系人 → 没有则提示\"花名册中还没有线上联系人，先收几张名片吧\"\n3. 检查 config.json.broadcast.last_broadcast_at → 当天已广播过则提醒\"你今天已广播过一次，确定再发吗？\"\n4. 确认 → 输出：\"✅ 名片已广播。花名册中 N 位联系人的 Agent 将在下次同步时收到更新通知。\"\n5. 更新 config.json.broadcast.last_broadcast_at\n\n### 10. 定时同步\n\n**创建时机：** 首次发布名片后，Agent 引导用户创建定时同步任务。\n\n**创建命令（OpenClaw 环境）：**\n```bash\nopenclaw cron add \\\n  --name \"Vibe Card 花名册同步\" \\\n  --cron \"0 9 * * 2,5\" \\\n  --session isolated \\\n  --message \"[cron:vibe-card-sync] 定时同步花名册。读取 skills/vibe-card/references/manual.md「同步花名册」段落执行。无更新则回复 NO_REPLY。\" \\\n  --announce\n```\n\n**参数说明：**\n- `--cron \"0 9 * * 2,5\"`：每周二、周五早上 9:00（用户时区）\n- `--session isolated`：独立会话，避免上下文膨胀\n- `--message`：cron 触发时的 prompt，以 `[cron:` 开头防止嵌套\n- `--announce`：有更新时通知用户\n\n**降级处理：** 如果用户环境不支持 `openclaw` 命令，跳过此步骤，不影响其他功能。用户可随时手动说\"同步花名册\"触发。\n\nFile v3.0.0:data/config.json\n\n{\n  \"version\": \"1.0\",\n  \"server\": {\n    \"endpoint\": \"https://www.adonghub.cn\",\n    \"api_key\": \"sk_81b0784c585649f7bfc0ebe927557173\",\n    \"user_id\": \"zdlaxu\"\n  },\n  \"sync\": {\n    \"last_sync_at\": null\n  },\n  \"broadcast\": {\n    \"last_broadcast_at\": null\n  }\n}\n\nFile v3.0.0:data/contacts.json\n\n{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"\",\n    \"agent_name\": \"\"\n  },\n  \"contacts\": []\n}\n\nFile v3.0.0:data/profile.json\n\n{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"沈兴东\",\n    \"agent_name\": \"活爹虾\",\n    \"title\": \"Leewow 联合创始人\",\n    \"one_liner\": \"00后创业者，ENTP，AI Native人\"\n  },\n  \"current_focus\": [\"沉迷研究 A2A 无可自拔\"],\n  \"background\": \"连续创业者，Leewow 联合创始人，擅长找人、找资源、资本对接。\",\n  \"personal_notes\": \"\",\n  \"links\": {\n    \"email\": \"847494496@qq.com\",\n    \"xiaohongshu\": \"https://xhslink.com/m/2DtFQM2X7ZN\"\n  },\n  \"tiers\": {\n    \"public\": {\n      \"fields\": [\"name\", \"title\", \"one_liner\", \"links\", \"current_focus\"]\n    },\n    \"full\": null,\n    \"close\": null\n  },\n  \"published_at\": null,\n  \"updated_at\": \"\"\n}\n\nFile v3.0.0:package.json\n\n{\n  \"name\": \"vibe-card\",\n  \"version\": \"3.0.0\",\n  \"description\": \"Agent-native social card generation, management, and sharing with smart contact book\",\n  \"author\": \"Adong & CyberShrimp\",\n  \"license\": \"MIT-0\"\n}","readmeExcerpt":"Skill: Vibe Card Owner: sxd20010606-cmd Summary: Agent 原生社交名片生成、管理和分享，以及智能花名册（通讯录管理器）。当用户提到名片、花名册、通讯录、联系人、Vibe Card、vibe-card 时使用。具体触发场景包括：安装 Vibe Card、建花名册、生成/更新/发名片、注册 Vibe Card、录入/查询/编辑联系人、同步花名册、收到包含 vib... Tags: latest:4.0.0 Version history: v4.0.0 | 2026-05-08T15:23:47.997Z | user V4.0.0: 状态感知路由 + 三段式改版 + 定时同步恢复 + manually_edited_fields 冲突保护 + 文案模板分离 v3.4.1 | 2026-05-06T08:08:16.732Z | auto v3.4.1 is a minor upd","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"data/\n├── config.json      # 服务器连接配置\n├── profile.json     # 用户名片数据\n└── contacts.json    # 花名册"},{"language":"json","snippet":"{\n  \"version\": \"1.0\",\n  \"server\": {\n    \"endpoint\": \"https://www.adonghub.cn\",\n    \"api_key\": \"\",\n    \"user_id\": \"\"\n  },\n  \"sync\": {\n    \"last_sync_at\": null\n  }\n}"},{"language":"json","snippet":"{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"张小明\",\n    \"agent_name\": \"小明的赛博虾\",\n    \"title\": \"示例科技有限公司联合创始人\",\n    \"one_liner\": \"专注于人工智能产品创新\"\n  },\n  \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n  \"background\": \"连续创业者，专注于技术创新与产品开发。\",\n  \"personal_notes\": \"近期在探索 AI Agent 生态，考虑做一个新产品验证想法\",\n  \"links\": {\n    \"wechat\": \"xiaoming_wechat\",\n    \"email\": \"zhangxiaoming@example.com\"\n  },\n  \"tiers\": {\n    \"public\": {\n      \"fields\": [\"name\", \"title\", \"one_liner\", \"links\", \"current_focus\"]\n    },\n    \"full\": null,\n    \"close\": null\n  },\n  \"published_at\": null,\n  \"updated_at\": \"\"\n}"},{"language":"json","snippet":"{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"张小明\",\n    \"agent_name\": \"小明的赛博虾\"\n  },\n  \"contacts\": [\n    {\n      \"name\": \"李明\",\n      \"agent_name\": \"李明的 Agent\",\n      \"title\": \"前端工程师\",\n      \"how_we_met\": \"2026年5月在技术社区认识\",\n      \"tags\": [\"技术\", \"AI\"],\n      \"links\": {},\n      \"notes\": \"\",\n      \"server_user_id\": \"liming\",\n      \"manually_edited_fields\": [],\n      \"created_at\": \"2026-04-28T14:00:00+08:00\",\n      \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n    }\n  ]\n}"},{"language":"json","snippet":"{\n  \"version\": \"1.0\",\n  \"agent_card\": {\n    \"name\": \"张小明\",\n    \"title\": \"示例科技有限公司联合创始人\",\n    \"one_liner\": \"专注于人工智能产品创新\",\n    \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n    \"links\": {\n      \"feishu\": \"ou_example\",\n      \"wechat\": \"xxx\"\n    },\n    \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n  },\n  \"_skill\": {\n    \"name\": \"vibe-card\",\n    \"source\": \"https://clawhub.ai/skills/vibe-card\",\n    \"version\": \"4.0.0\"\n  }\n}"},{"language":"json","snippet":"{\n  \"results\": [\n    {\n      \"user_id\": \"xiaoming_zhang\",\n      \"card_data\": {\n        \"name\": \"张小明\",\n        \"title\": \"示例科技有限公司联合创始人\",\n        \"one_liner\": \"专注于人工智能产品创新\",\n        \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n        \"links\": { \"feishu\": \"ou_example\", \"wechat\": \"xxx\" },\n        \"updated_at\": \"2026-05-02T10:00:00Z\"\n      },\n      \"updated_at\": \"2026-05-02T10:00:00Z\",\n      \"has_update\": true\n    },\n    {\n      \"user_id\": \"liming\",\n      \"card_data\": { \"...\" : \"...\" },\n      \"updated_at\": \"2026-04-20T08:00:00Z\",\n      \"has_update\": false\n    }\n  ]\n}"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: vibe-card\ndescription: \"Agent 原生社交名片生成、管理和分享，以及智能花名册（通讯录管理器）。当用户提到名片、花名册、通讯录、联系人、Vibe Card、vibe-card 时使用。具体触发场景包括：安装 Vibe Card、建花名册、生成/更新/发名片、注册 Vibe Card、录入/查询/编辑联系人、同步花名册、收到包含 vibe-card:// 协议的消息时自动识别并保存他人名片。定期检查花名册中联系人的名片是否有更新，有变化时拉取最新信息到本地。\"\nmetadata:\n  version: \"4.0.0\"\n  author: \"阿东 & 阿东的赛博虾\"\n---\n\n# Vibe Card\n\n> 你的 Agent 原生名片。Agent 从记忆提炼信息，帮你维护动态名片和智能花名册。\n> 名片可通过三段式文本块在 IM 中传递，对方的 Agent 自动识别并保存。\n\n## 快速开始\n\n1. 安装 — 说\"安装 Vibe Card\"，初始化数据文件\n2. 生成 — 说\"生成我的名片\"，Agent 从记忆提炼信息，确认后自动上线（首次会自动注册）\n\n| 触发指令 | 行为 |\n|----------|------|\n| \"安装 Vibe Card\" / \"初始化\" | 初始化 data/ 目录下三个 JSON 文件（config.json、profile.json、contacts.json），然后读取 assets/onboarding.txt 原样输出，不做改写。已初始化则跳过初始化，直接输出 onboarding.txt |\n| \"注册 Vibe Card\" | （兼容入口）已注册则输出服务菜单，未注册则提示\"直接说'生成我的名片'即可，会自动注册\" |\n| \"录入 {name}\" / \"新建联系人 {name}\" | 打开录入流程 |\n| \"查花名册\" / \"查联系人\" | 搜索花名册 |\n| \"生成我的名片\" / \"更新名片\" | 生成或更新名片（见操作流程 §4） |\n| \"看看名片\" / \"发一下我的名片\" / \"发名片\" | 输出三段式文本块（已上线读取 assets/share-template.txt，已安装未生成则引导） |\n| \"同步花名册\" | 检查花名册中联系人的最新信息 |\n| 收到 `vibe-card://` 开头的消息 | 自动识别并保存他人名片 |\n\n## 状态判断\n\n先判断用户当前状态，再路由到对应流程：\n\n| 状态 | 判断条件 |\n|------|---------|\n| 未安装 | data/ 目录不存在 |\n| 已安装(未生成) | data/ 存在 + profile.json.owner.name 为空 |\n| 已生成(未上线) | profile.json 有内容 + config.json 无 user_id |\n| 已上线 | profile.json 有内容 + config.json 有 user_id |\n\n### 指令路由表\n\n| 用户说 | 已安装(未生成) | 已生成(未上线) | 已上线 |\n|--------|---------------|---------------|-------|\n| \"生成名片\" | 走 §4 创建流程 | 引导完成发布（§4 步骤 7 的发布链路） | 读取 assets/already-has-card.txt，填充 {name}、{title}、{one_liner}、{current_focus}、{user_id} 后原样输出 |\n| \"看看名片\" / \"发名片\" | 还没生成，说\"先生成我的名片\" | 引导完成发布 | 读取 assets/share-template.txt，填充后原样输出 |\n| \"编辑名片\"/\"更新名片\" | 还没生成，说\"先生成我的名片\" | 引导完成发布 | 走 §4 更新流程 |\n| \"查花名册\" | contacts.json 为空 → 读取 assets/contacts-empty.txt 原样输出；有数据 → 展示联系人列表 | 同左 | 同左 |\n| \"同步花名册\" | 无 user_id，提示先生成 | 无 user_id，提示发布 | POST /sync（见 §7） |\n| 其他指令 | 读取 assets/onboarding.txt 原样输出 | 引导完成发布 | 展示服务菜单 |\n\n> \"已生成(未上线)\"是边界状态，生成即发布。如果出现，统一引导完成发布。\n\n## 操作流程\n\n### 1. 注册（兼容入口）\n\n1. 已注册 → 输出服务菜单（5 个可执行操作）\n2. 未注册 → 提示\"直接说'生成我的名片'即可，确认后会自动注册并上线\"\n\n### 2. 录入联系人\n\n社交姓名确认规则、必填字段和边界处理见 [references/manual.md](references/manual.md)\"录入联系人\"段落。\n\n### 3. 查询花名册\n\n1. 读取 contacts.json，输出所有联系人列表\n2. 用户提到某个名字 → 模糊搜索 name / agent_name，输出匹配结果\n3. 花名册为空 → 读取 assets/contacts-empty.txt 原样输出\n\n### 4. 生成/更新名片\n\n1. 检查 config.json 是否已初始化 → 未初始化则提示\"先说'安装 Vibe Card'\"\n2. 读取 profile.json\n   - 首次（owner.name 为空）：Agent 从记忆提炼信息，生成预览\n   - 已有内容：展示当前名片，询问\"要修改哪些信息？\"\n3. Agent 从记忆提炼信息，生成名片预览，等待用户确认\n4. 用户确认 → Agent 执行以下链路：\n   a. 检查 config.json 中是否有 api_key 和 user_id\n   b. 没有 → 自动调注册接口（用 profile.json 中的 name 和 agent_name）→ 将返回的 user_id 和 api_key 写入 config.json\n   c. 保存 profile.json\n   d. 调发布接口将名片推送到服务器\n   e. 首次生成 → 读取 assets/onboard-generated.txt，填充 {name}、{title}、{one_liner}、{current_focus}、{user_id} 后原样输出\n   f. 非首次更新 → 输出\"那我保存名片了哈 ✅ 你的名片已上线：https://www.adonghub.cn/{user_id}\"\n   g. 首次发布 → 引导创建定时同步任务（具体命令见 [references/manual.md](references/manual.md)\"定时同步\"段落）\n5. 推送失败 → 本地仍保存，提示稍后重试\n\n### 5. 发名片\n\n读取 assets/share-template.txt，用 profile.json 和 config.json 中的字段值替换对应占位符"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn78x1btfj3thhezb2cxv5qgn585pvxh\",\n  \"slug\": \"vibe-card\",\n  \"version\": \"4.0.0\",\n  \"publishedAt\": 1778253827997\n}"},{"path":"references/data-format.md","content":"# Vibe Card 数据格式规范\n\n> 本文档描述 Vibe Card V4.0.0 中所有 JSON 数据文件的格式规范。\n\n## Contents\n- 数据目录结构\n- config.json — 服务器连接配置\n- profile.json — 用户名片数据\n- contacts.json — 花名册\n- 服务器 API 返回格式（GET /card、POST /sync）\n\n---\n\n### 数据目录结构\n\n```\ndata/\n├── config.json      # 服务器连接配置\n├── profile.json     # 用户名片数据\n└── contacts.json    # 花名册\n```\n\n---\n\n### config.json\n\n服务器连接配置，由 Agent 维护。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"server\": {\n    \"endpoint\": \"https://www.adonghub.cn\",\n    \"api_key\": \"\",\n    \"user_id\": \"\"\n  },\n  \"sync\": {\n    \"last_sync_at\": null\n  }\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| version | string | 数据格式版本 |\n| server.endpoint | string | 服务器地址 |\n| server.api_key | string | 注册后服务器返回的凭证 |\n| server.user_id | string | 注册后服务器返回的用户 ID |\n| sync.last_sync_at | string\\|null | 上次同步时间（ISO 时间戳），用于 since 参数 |\n\n**初始化：** api_key 和 user_id 为空，首次生成名片时自动注册填充。\n\n---\n\n### profile.json\n\n用户名片数据，由 Agent 从记忆提炼并维护。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"张小明\",\n    \"agent_name\": \"小明的赛博虾\",\n    \"title\": \"示例科技有限公司联合创始人\",\n    \"one_liner\": \"专注于人工智能产品创新\"\n  },\n  \"current_focus\": [\"大语言模型应用\", \"AI Agent 开发\"],\n  \"background\": \"连续创业者，专注于技术创新与产品开发。\",\n  \"personal_notes\": \"近期在探索 AI Agent 生态，考虑做一个新产品验证想法\",\n  \"links\": {\n    \"wechat\": \"xiaoming_wechat\",\n    \"email\": \"zhangxiaoming@example.com\"\n  },\n  \"tiers\": {\n    \"public\": {\n      \"fields\": [\"name\", \"title\", \"one_liner\", \"links\", \"current_focus\"]\n    },\n    \"full\": null,\n    \"close\": null\n  },\n  \"published_at\": null,\n  \"updated_at\": \"\"\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| owner.name | string | 用户姓名 |\n| owner.agent_name | string | Agent 名字 |\n| owner.title | string | 职位/身份 |\n| owner.one_liner | string | 一句话介绍 |\n| current_focus | string[] | 当前关注点（公开推送） |\n| background | string | 背景介绍（本地存储，不上传服务器） |\n| personal_notes | string | 个人笔记（本地存储，不上传服务器） |\n| links | object | 联系方式（key 为渠道名：wechat/email/feishu/phone/twitter/linkedin/github/website/weibo） |\n| tiers.public.fields | string[] | 公开推送的字段白名单 |\n| published_at | string\\|null | 首次发布时间 |\n| updated_at | string | 最后更新时间 |\n\n**隐私规则：**\n- 推送服务器时，只推送 `tiers.public.fields` 中列出的字段\n- `background`：本地存储，不上传服务器\n- `personal_notes`：本地存储，不上传服务器\n\n---\n\n### contacts.json\n\n花名册，存储用户收录的联系人。\n\n```json\n{\n  \"version\": \"1.0\",\n  \"owner\": {\n    \"name\": \"张小明\",\n    \"agent_name\": \"小明的赛博虾\"\n  },\n  \"contacts\": [\n    {\n      \"name\": \"李明\",\n      \"agent_name\": \"李明的 Agent\",\n      \"title\": \"前端工程师\",\n      \"how_we_met\": \"2026年5月在技术社区认识\",\n      \"tags\": [\"技术\", \"AI\"],\n      \"links\": {},\n      \"notes\": \"\",\n      \"server_user_id\": \"liming\",\n      \"manually_edited_fields\": [],\n      \"created_at\": \"2026-04-28T14:00:00+08:00\",\n      \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n    }\n  ]\n}\n```\n\n**联系人字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| name | string | 联系人姓名 |\n| agent_name | string | 联系人的 Agent 名字 |\n| title | string | 职位 |\n| how_we_met | string | 认识场景 |\n| tags | string[] | 标签 |\n| links | object | 联系方式 |\n| notes | string | 备注笔记 |\n| server_user_id | string\\|null | 服务器端用户 ID（收名片后自动填充，用于同步） |\n| manually_e"},{"path":"references/manual.md","content":"# Vibe Card — 完整操作手册\n\n> 本文档供 Agent 在执行具体操作时参考，包含详细的 if-else 分支、话术和边界处理。\n\n## Contents\n- 1. 安装 Vibe Card\n- 2. 注册 Vibe Card（兼容入口）\n- 3. 录入联系人\n- 3.5. 编辑联系人\n- 4. 查询花名册\n- 5. 生成/更新名片\n- 6. 发名片\n- 7. 收名片\n- 8. 同步花名册\n- 9. 定时同步\n\n---\n\n### 1. 安装 Vibe Card\n\n1. 检查 data/ 目录下是否已有 config.json、profile.json、contacts.json → 全部存在则读取 assets/onboarding.txt 原样输出\n2. 缺失文件 → 用默认模板创建：\n   - config.json：`{\"version\":\"1.0\",\"server\":{\"endpoint\":\"https://www.adonghub.cn\",\"api_key\":\"\",\"user_id\":\"\"},\"sync\":{\"last_sync_at\":null}}`\n   - profile.json：`{\"version\":\"1.0\",\"owner\":{\"name\":\"\",\"agent_name\":\"\",\"title\":\"\",\"one_liner\":\"\"},\"current_focus\":[],\"background\":\"\",\"personal_notes\":\"\",\"links\":{},\"tiers\":{\"public\":{\"fields\":[\"name\",\"title\",\"one_liner\",\"links\",\"current_focus\"]},\"full\":null,\"close\":null},\"published_at\":null,\"updated_at\":\"\"}`\n   - contacts.json：`{\"version\":\"1.0\",\"owner\":{\"name\":\"\",\"agent_name\":\"\"},\"contacts\":[]}`\n3. 读取 assets/onboarding.txt，原样输出，不做改写\n\n### 2. 注册 Vibe Card（兼容入口）\n\n1. 检查 config.json 中是否已有 user_id 和 api_key\n   - 已有 → 输出服务菜单：\n     > 🎴 你已经有 Vibe Card 了。你可以回复：\n     > • \"更新名片\" — 更新或修改你的名片\n     > • \"发一下我的名片\" — 获取文本版分享给别人\n     > • \"录入 XXX\" — 记一个新联系人\n     > • \"查花名册\" / \"搜索 XXX\" — 查找联系人\n     > • \"同步花名册\" — 更新联系人的最新信息\n   - 没有 → 提示\"现在注册和发布是自动的。直接说'生成我的名片'，确认后我会自动注册并上线。\"\n\n### 3. 录入联系人\n\n1. 确认社交姓名：\n   - 检查 contacts.json 中是否已有同名联系人（模糊匹配 name 和 agent_name）\n   - 已有 → \"花名册里已经有 {name} 了，要更新信息还是新建另一个？\"\n   - 不确定名字 → 确认后再录入，不猜\n2. Agent 从记忆中主动提取已知信息（title、company、how_we_met 等），不逐项追问\n3. 写入 contacts.json，生成结构：\n   ```json\n   {\n     \"name\": \"张威\",\n     \"agent_name\": \"张威的赛博虾\",\n     \"title\": \"独立开发者\",\n     \"how_we_met\": \"2026年4月通过东东推荐认识\",\n     \"tags\": [\"技术\", \"AI\"],\n     \"links\": {},\n     \"notes\": \"\",\n     \"created_at\": \"2026-04-28T14:00:00+08:00\",\n     \"updated_at\": \"2026-04-28T14:00:00+08:00\"\n   }\n   ```\n4. 输出确认：\"已录入 {name}。\"\n\n### 3.5. 编辑联系人\n\n用户说\"改一下某某的职位\"/\"更新张三的备注\"等编辑联系人请求时：\n\n1. 在 contacts.json 中找到对应联系人（模糊匹配 name / agent_name）\n2. 更新用户指定的字段\n3. 将被修改的字段名追加到该联系人的 `manually_edited_fields` 数组（追加，不是覆盖）。例：用户改了 title → `[\"title\"]`；再改 notes → `[\"title\", \"notes\"]`\n4. 输出确认：\"已更新 {name} 的 {字段名}。\"\n\n### 4. 查询花名册\n\n1. contacts.json 为空 → 读取 assets/contacts-empty.txt 原样输出\n2. 有数据 → 列表输出，格式：`{name}（{title}）`，每行一人\n3. 用户搜索某个名字 → 模糊匹配 name / agent_name / title，输出匹配结果\n4. 搜索无结果 → \"花名册中没有找到 {关键词}。\"\n\n### 5. 生成/更新名片\n\n1. 检查 config.json 是否已初始化 → 未初始化则提示\"先说'安装 Vibe Card'\"\n2. 读取 profile.json\n   - 首次（owner.name 为空）：Agent 从记忆提炼信息，生成预览\n   - 已有内容：展示当前名片，询问\"要修改哪些信息？\"\n3. Agent 提炼信息后生成预览：\n   - name、title、one_liner（必填）\n   - current_focus（从记忆中提取当前关注点）\n   - links（联系方式：wechat / email / feishu / phone 等）\n   - personal_notes、background（本地保存，不推送）\n4. 等待用户确认，多轮调整直到用户满意\n5. 社交姓名确认：如果 profile.json 的 owner.name 为空且 Agent 从记忆中提取了名字，需要确认。用户明确说\"就这样\"/\"用这个\"后才写入\n6. profile.json 的 owner.name 和 contacts.json 的 owner.name 应保持一致\n7. 用户说\"可以了\"/\"就这样\"/\"确认\" → Agent 保存并上线：\n   - 写入 profile.json\n   - **前置检查**：读取 config.json，检查是否有 api_key 和 user_id\n   - **未注册** → 自动调注册接口，请求体 `{name: profile.json的owner.name, agent_name: profile.json的owner.agent_name}`，将返回的 user_id 和 a"},{"path":"skill-card.md","content":"## Description:\n\nVibe Card helps an agent generate, manage, share, receive, and synchronize social contact cards and a local contact book.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[sxd20010606-cmd](https://clawhub.ai/user/sxd20010606-cmd)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and their agents use this skill to create a shareable personal profile card, save received Vibe Card messages, manage contacts, and synchronize contact updates.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can publish selected personal profile fields to adonghub.cn.\n\nMitigation: Confirm the fields that will be published before first use and keep sensitive notes in the local-only fields described by the data format.\n\nRisk: The skill can auto-import contact cards from received Vibe Card messages.\n\nMitigation: Review cards from untrusted messages before saving or merging them into the contact book.\n\nRisk: The skill can fetch and synchronize contact updates from a remote service.\n\nMitigation: Keep the server endpoint pinned to the intended HTTPS origin and review sync results before accepting conflict resolutions.\n\nRisk: The skill may ask to create a recurring OpenClaw sync task.\n\nMitigation: Review the scheduled task command and know how to list or remove the sync job before enabling it.\n\n## Reference(s):\n\n- [Vibe Card Data Format](references/data-format.md)\n- [Vibe Card Manual](references/manual.md)\n- [ClawHub Skill Page](https://clawhub.ai/sxd20010606-cmd/skills/vibe-card)\n- [AdongHub Service](https://www.adonghub.cn)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Configuration, Shell commands, Guidance]\n\n**Output Format:** [Markdown and text responses with JSON file updates and optional shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Creates and updates local config.json, profile.json, and contacts.json files; may publish selected profile fields and synchronize contacts with a remote HTTPS service.]\n\n## Skill Version(s):\n\n4.0.0 (source: server release metadata, SKILL.md metadata, package.json)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1268,"uniquenessScore":40,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-12T00:53:39.603Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-12T00:53:39.603Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-14T17:24:46.447Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}