{"id":"8a63d3dc-4464-4338-8319-566dc11e715c","entityType":"agent","slug":"clawhub-domilin-xinyi-drink","name":"xinyi-drink","canonicalUrl":"https://www.xpersona.co/agent/clawhub-domilin-xinyi-drink","canonicalPath":"/agent/clawhub-domilin-xinyi-drink","generatedAt":"2026-10-10T23:47:31.655Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T21:45:43.535Z","emptyReason":null},"description":"Use when users ask to 领取Skill用户大礼包, 查询及分析个人历史订单, 查询菜单及饮品热量, or 查询门店及等候时长 for 新一好喝/新一咖啡.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.3K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s174j1rz3a9ggfhwgncj7gsta983k3fe:xinyi-drink","sourceUrl":"https://clawhub.ai/domilin/xinyi-drink","homepage":"https://clawhub.ai/domilin/skills/xinyi-drink","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/domilin/xinyi-drink","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/domilin/skills/xinyi-drink","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":62,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"xinyi-drink 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-10T21:45:43.535Z","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-10T21:45:43.535Z","emptyReason":null},"stars":null,"forks":null,"downloads":1250,"packageName":null,"latestVersion":"1.2.5","tractionLabel":"1.3K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T21:45:43.469Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T21:45:43.535Z","lastCrawledAt":"2026-10-10T21:45:43.469Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T21:45:43.469Z","lastVerifiedAt":null,"highlights":[{"version":"1.2.5","createdAt":"2026-05-07T06:52:08.522Z","changelog":"xinyi-drink 1.2.5 - Added compiled Python bytecode files (*.pyc) for both scripts and unit tests, improving runtime efficiency and test coverage. - No changes to logic or user-facing features; this is an internal packaging and distribution update.","fileCount":36,"zipByteSize":84028},{"version":"1.2.4","createdAt":"2026-05-07T06:34:38.164Z","changelog":"xinyi-drink 1.2.4 - 优化活动礼包领取流程，优先本地已领取状态，避免多余领取查询。 - 增加手机号领取状态本地只读预检，避免不必要的后端请求，换号/确认需用户明确操作。 - 订单等级提示只展示中文提示语，不再输出级别标签。 - 明确活动状态、手机号状态只可本地读取，禁止用历史或对话记忆。 - 触发表和主流程描述细节修订，提升用户隐私与体验。","fileCount":35,"zipByteSize":82247},{"version":"1.2.2","createdAt":"2026-05-07T04:56:45.210Z","changelog":"Version 1.2.2 - Enhanced handling for语义相关的手机号查询：对用户不局限于示例原文的“参与活动所用手机号”等相关提问，统一要求严格调用本机手机号状态脚本，不查历史记忆或对话记忆。 - 规则及表述细化，明确不允许主动或凭记忆泄露或编造参与活动手机号。 - 文档条目强化，对主流程、隐私和行为规则做出更明确约束。","fileCount":35,"zipByteSize":80853},{"version":"1.2.1","createdAt":"2026-05-07T04:32:28.100Z","changelog":"xinyi-drink 1.2.1 - 增加 `install.sh --check-installed` 支持，可用于安装后检测目标目录与源码一致。 - 明确隐私与安全要求：领取礼包和查订单只允许本账号本人手机号，拒绝代查/他人手机号操作。 - 新增后端信任说明，避免用户配置不可信 API 源。 - 补充了 `server-side-account-ownership-check-required` 等合规提醒，严格限制手机号用途。 - SKILL.md 文档优化，细化了隐私细则与使用规则，无功能变更。","fileCount":35,"zipByteSize":80147},{"version":"1.2.0","createdAt":"2026-05-07T04:12:56.875Z","changelog":"xinyi-drink 1.2.0 - 增强了手机号变更和缓存状态管理，明确换号等场景必须走脚本流程。 - 新增本地活动手机号/状态查询命令，查询本地缓存时不会请求远程或依赖Agent记忆。 - 优化触发表，细化“换号”“重新绑定”及缓存手机号相关指令的行为规则。 - 相关文档内容同步调整，进一步细化敏感场景的流程和话术说明。","fileCount":35,"zipByteSize":79019},{"version":"1.1.20","createdAt":"2026-05-06T12:00:35.134Z","changelog":"- Updated core documentation and rules in SKILL.md for improved clarity and guidance. - Changed the \"活动总览\" (“activity overview”) answer to only mention Skill大礼包, removing other product info. - Added 21 new .pyc files under scripts/ and spec/ directories, reflecting new or compiled script/test modules. - No functional or API/interface changes—updates focus on documentation alignment and internal consistency.","fileCount":35,"zipByteSize":77184},{"version":"1.1.9","createdAt":"2026-05-06T11:13:28.993Z","changelog":"**Summary:** Added installSpec and privacy sections to metadata; revised internal technical language for clarity; included 21 new compiled Python files for scripts and tests. - Added `installSpec` and `privacy` fields to the skill metadata for clearer installation and privacy guidance. - Updated internal rule wording to remove/explain technical implementation details in user-facing text. - Appended cache clearing command and guidance fields for shared machine use in metadata. - Added 21 new `.pyc` files to `scripts/__pycache__/` and `spec/__pycache__/` (compiled scripts and test modules). - No changes to user interaction flow or main feature set.","fileCount":35,"zipByteSize":77510},{"version":"1.1.8","createdAt":"2026-05-06T10:26:31.965Z","changelog":"**Added skill metadata and privacy details for xinyi-drink v1.1.8** - Introduced detailed `keywords` and structured `metadata` fields in SKILL.md for better discoverability and compliance. - Documented privacy practices, data storage explanations, and permission requirements in the skill documentation. - Updated installation guidance with copy-paste instructions compatible with multiple agents. - Clarified mobile number usage/caching rules and expanded explanations of when and how user data is leveraged for activity participation and order queries. - No code changes were made; only documentation (SKILL.md) was updated.","fileCount":35,"zipByteSize":76027}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s174j1rz3a9ggfhwgncj7gsta983k3fe:xinyi-drink","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s174j1rz3a9ggfhwgncj7gsta983k3fe:xinyi-drink` 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/domilin/xinyi-drink 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-domilin-xinyi-drink/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-domilin-xinyi-drink/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-domilin-xinyi-drink/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-domilin-xinyi-drink/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-domilin-xinyi-drink/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-domilin-xinyi-drink/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-10T23:47:31.651Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-domilin-xinyi-drink/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-domilin-xinyi-drink/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-domilin-xinyi-drink/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-domilin-xinyi-drink/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-10T21:45:43.535Z","emptyReason":null},"readme":"Skill: xinyi-drink\n\nOwner: domilin\n\nSummary: Use when users ask to 领取Skill用户大礼包, 查询及分析个人历史订单, 查询菜单及饮品热量, or 查询门店及等候时长 for 新一好喝/新一咖啡.\n\nTags: latest:1.2.5\n\nVersion history:\n\nv1.2.5 | 2026-05-07T06:52:08.522Z | user\n\nxinyi-drink 1.2.5\n\n- Added compiled Python bytecode files (*.pyc) for both scripts and unit tests, improving runtime efficiency and test coverage.\n- No changes to logic or user-facing features; this is an internal packaging and distribution update.\n\nv1.2.4 | 2026-05-07T06:34:38.164Z | user\n\nxinyi-drink 1.2.4\n\n- 优化活动礼包领取流程，优先本地已领取状态，避免多余领取查询。\n- 增加手机号领取状态本地只读预检，避免不必要的后端请求，换号/确认需用户明确操作。\n- 订单等级提示只展示中文提示语，不再输出级别标签。\n- 明确活动状态、手机号状态只可本地读取，禁止用历史或对话记忆。\n- 触发表和主流程描述细节修订，提升用户隐私与体验。\n\nv1.2.2 | 2026-05-07T04:56:45.210Z | user\n\nVersion 1.2.2\n\n- Enhanced handling for语义相关的手机号查询：对用户不局限于示例原文的“参与活动所用手机号”等相关提问，统一要求严格调用本机手机号状态脚本，不查历史记忆或对话记忆。\n- 规则及表述细化，明确不允许主动或凭记忆泄露或编造参与活动手机号。\n- 文档条目强化，对主流程、隐私和行为规则做出更明确约束。\n\nv1.2.1 | 2026-05-07T04:32:28.100Z | user\n\nxinyi-drink 1.2.1\n\n- 增加 `install.sh --check-installed` 支持，可用于安装后检测目标目录与源码一致。\n- 明确隐私与安全要求：领取礼包和查订单只允许本账号本人手机号，拒绝代查/他人手机号操作。\n- 新增后端信任说明，避免用户配置不可信 API 源。\n- 补充了 `server-side-account-ownership-check-required` 等合规提醒，严格限制手机号用途。\n- SKILL.md 文档优化，细化了隐私细则与使用规则，无功能变更。\n\nv1.2.0 | 2026-05-07T04:12:56.875Z | user\n\nxinyi-drink 1.2.0\n\n- 增强了手机号变更和缓存状态管理，明确换号等场景必须走脚本流程。\n- 新增本地活动手机号/状态查询命令，查询本地缓存时不会请求远程或依赖Agent记忆。\n- 优化触发表，细化“换号”“重新绑定”及缓存手机号相关指令的行为规则。\n- 相关文档内容同步调整，进一步细化敏感场景的流程和话术说明。\n\nv1.1.20 | 2026-05-06T12:00:35.134Z | user\n\n- Updated core documentation and rules in SKILL.md for improved clarity and guidance.\n- Changed the \"活动总览\" (“activity overview”) answer to only mention Skill大礼包, removing other product info.\n- Added 21 new .pyc files under scripts/ and spec/ directories, reflecting new or compiled script/test modules.\n- No functional or API/interface changes—updates focus on documentation alignment and internal consistency.\n\nv1.1.9 | 2026-05-06T11:13:28.993Z | user\n\n**Summary:**  \nAdded installSpec and privacy sections to metadata; revised internal technical language for clarity; included 21 new compiled Python files for scripts and tests.\n\n- Added `installSpec` and `privacy` fields to the skill metadata for clearer installation and privacy guidance.\n- Updated internal rule wording to remove/explain technical implementation details in user-facing text.\n- Appended cache clearing command and guidance fields for shared machine use in metadata.\n- Added 21 new `.pyc` files to `scripts/__pycache__/` and `spec/__pycache__/` (compiled scripts and test modules).\n- No changes to user interaction flow or main feature set.\n\nv1.1.8 | 2026-05-06T10:26:31.965Z | user\n\n**Added skill metadata and privacy details for xinyi-drink v1.1.8**\n\n- Introduced detailed `keywords` and structured `metadata` fields in SKILL.md for better discoverability and compliance.\n- Documented privacy practices, data storage explanations, and permission requirements in the skill documentation.\n- Updated installation guidance with copy-paste instructions compatible with multiple agents.\n- Clarified mobile number usage/caching rules and expanded explanations of when and how user data is leveraged for activity participation and order queries.\n- No code changes were made; only documentation (SKILL.md) was updated.\n\nv1.1.6 | 2026-05-06T09:50:40.726Z | user\n\n**No file changes, but SKILL.md updated — clarifies data and privacy logic for orders/手机号、安装方式、主流程.**\n\n- 明确所有订单、活动、联网查询都只用用户本轮明确提供的手机号，不再支持缓存/自动复用；\n- 订单回复必须展示脚本给出的等级话术，严禁预估/补全未查到的数据；\n- 只允许保存手机号哈希、尾号和简要活动状态，禁止保存可复用手机号；\n- 安装指引调整，OpenClaw 用户优先推荐 ClawHub 安装方式；\n- 规范流程和表达，技术/接口词汇替换为自然口吻，避免技术细节外露。\n\nv1.1.5 | 2026-05-06T09:00:34.562Z | user\n\nxinyi-drink 1.1.5\n\n- 新增个人历史订单查询功能：支持通过 scripts/query_orders.py 查询用户订单，并在意图路由和主流程中明确区分订单相关问题。\n- 增加三个测试文件：spec/build_response_test.py、spec/copy_consistency_test.py、spec/query_orders_test.py。\n- 更新 Skill 用途描述和主功能，重点突出“大礼包领取、订单分析、菜单热量、门店等候时长”四大主用例，并简化说明。\n- 优化意图路由表，新增详细订单相关触发逻辑及参数细化。\n- 加强“接口数据为准”原则，禁止自填订单、商品等信息，规范推荐和订单回答逻辑。\n\nv1.1.4 | 2026-04-28T11:45:32.601Z | user\n\n- Only show store information when the user explicitly asks about locations, addresses, or queues; product recommendations will no longer include location details by default.\n- Updated wording rules: highlight product names in recommendations, and include store details only if requested.\n- Added user-facing installation instructions for the skill, clarifying how to install on supported assistants.\n- Improved flow for reward claiming: store info and queue status are only queried if the user asks about them.\n- Clarified sample answers and main process to match new rules for store information and user triggers.\n\nv1.1.2 | 2026-04-28T10:59:57.044Z | user\n\n- 语气身份从“懂茶饮也懂咖啡、不掉书袋的姐姐”调整为“懂茶饮也懂咖啡的店员姐姐”，语气更温和松弛。\n- 精简话术示例和表达风格要求，减少条目、去除部分冗余表述。\n- 去除“不会把话说成报告”、“emoji少量使用”等细致写作要求。\n- 技术/答题流程保持一致，主流程和触发表未变。\n- 无功能和接口更新，本次仅为描述和风格调整。\n\nv1.1.1 | 2026-04-28T10:41:14.534Z | user\n\n- Clarified缓存手机号的使用范围：推荐饮品时默认不自动读取缓存手机号，仅在订单分析、偏好分析、活动状态查询等个性化场景下用手机号。\n- 新增 autoReadPolicy 配置字段，规范 recommend_drink 脚本对手机号缓存的读取行为。\n- 优化触发表和主流程描述，对“活动/福利/订单分析”等需手机号的请求与普通菜单/推荐类请求做更清晰区分。\n- 明确普通推荐、菜单、门店查询等不应索取或自动复用缓存手机号，仅活动/个性化分析才可用。\n\nv1.1.0 | 2026-04-28T10:10:20.037Z | user\n\nxinyi-drink 1.1.0 introduces improved意图识别和触发条件，让交互更智能。\n\n- 调整“触发表”意图判定，更精准匹配用户指令场景\n- 新增订单历史和偏好分析问法支持（如“我买过多少杯”“分析口味偏好”）\n- 门店/菜单/活动相关意图区分更细致，新增常见口语触发形式\n- 精简并规范部分意图调用脚本参数\n- 其他场景判定表述更新，使用体验更自然\n\nv1.0.29 | 2026-04-28T09:33:38.104Z | user\n\n- Added detailed metadata for skill packaging, privacy review, install, runtime, and API/network configuration.\n- No changes to core logic or user-facing behavior.\n\nv1.0.28 | 2026-04-28T09:17:43.794Z | user\n\n**Expanded trigger and capability descriptions for store and drink queries.**\n\n- 触发表表述更加细致，明确支持“各门店等待”、“菜单热量”、“果茶”等查询类型\n- 功能介绍中新增支持查门店等待和菜单热量描述\n- 示例触发表问题更贴近日常语言，例如“今天北京21°C，想喝茶饮，推荐一杯”\n- 明确主流程不可展示接口路径等细节，语义要求微调\n- 其余功能规则及应答风格保持不变\n\nv1.0.27 | 2026-04-28T08:50:13.830Z | user\n\nxinyi-drink 1.0.26\n\n- 优化规则，普通查询时不再主动暴露活动状态或礼包信息，避免未触发场景下提醒用户活动/福利/礼包到账。\n- 进一步明确：仅在用户明确问及活动/福利/领取时才提及身份验证、礼包、活动状态等内容。\n\nv1.0.26 | 2026-04-28T08:48:28.107Z | user\n\nxinyi-drink 1.0.26\n\n- 优化规则，普通查询时不再主动暴露活动状态或礼包信息，避免未触发场景下提醒用户活动/福利/礼包到账。\n- 进一步明确：仅在用户明确问及活动/福利/领取时才提及身份验证、礼包、活动状态等内容。\n\nv1.0.25 | 2026-04-28T08:35:01.733Z | user\n\n**Update summary:**  \nImproved answer logic and response scope for store recommendations and user activity status.\n\n- 用户未主动问福利/活动时，即使已参与，也不再主动提及活动、礼包或身份验证。\n- 推荐饮品时展示门店，必须展示全部返回门店，避免只引导用户去单一门店。\n- 门店展示覆盖：若回答涉及门店信息，需列出全部返回门店及对应详情；若当前无门店需求可不展示。\n- 明确区分活动/福利与普通查询所需手机号，普通门店/菜单无需手机号。\n- 文档细节优化，表达更严谨，避免无关或遗漏信息。\n\nv1.0.24 | 2026-04-28T08:02:24.121Z | user\n\n- Bump version to 1.0.24.\n- No file content changes; documentation and functionality remain the same.\n\nv1.0.23 | 2026-04-28T07:39:41.261Z | auto\n\nVersion 1.0.23\n\n- Activity reward flow updated: now always request the user's bound 小程序 (Mini Program) phone number before claiming, unless already provided.\n- Main process clarified for activity claim/phone requirements: only prompt login steps if user not registered; otherwise focus on phone binding and explicit interface message display.\n- Reward details expression improved: always show interface-returned coupon info (success/failure reason, coupon message, actual coupon type and count); fallback wording updated for missing coupon names.\n- Adjusted activity rules and messaging: prize rules, sticker claim, and user badge details are now standardized in both explanations and example responses.\n- Table triggers, fallback guidance, and language for unhandled cases revised for better accuracy and user experience.\n- Documentation and reference files updated to reflect current business logic and refined process boundaries.\n\nv1.0.22 | 2026-04-28T05:36:31.070Z | user\n\n**xinyi-drink 1.0.22**\n\n- Added scripts/activity_claim.py for activity reward claim functionality.\n- Added references/response-examples.md to provide example responses and recommended answer style.\n- Updated skill metadata and instructions in skill.json and SKILL.md, focusing on succinct triggers, rules, and process for activity and drink recommendations.\n\nv1.0.21 | 2026-04-28T03:04:04.675Z | user\n\nNo changes detected in this version.\n\n- No code or documentation updates from the previous release.\n- Version and documentation remain the same.\n\nv1.0.20 | 2026-04-28T03:02:15.332Z | user\n\nVersion 1.0.20\n\n- 修改 SKILL.md，将 metadata 版本号从 1.0.18 升级至 1.0.19\n- 新增硬性约束：未查到小程序登录记录时，禁止简单回答“没有其他活动”，需明确说明未登录状态、给出大礼包内容、参与方法及留资文案\n- 保持所有接口与功能点说明、意图路由与回答原则未变\n- 仅文档细节优化，无新增脚本或接口变动\n\nv1.0.19 | 2026-04-28T02:07:39.225Z | user\n\nNo changes detected in this version.\n\n- No file or documentation updates present.\n- Functionality remains the same as previous version.\n\nv1.0.18 | 2026-04-27T11:33:23.449Z | user\n\nxinyi-drink 1.0.18\n\n- 活动奖励描述优化：“三重福利”第二项从“接口返回的福利券一张”调整为“接口返回的爆品赠饮一杯”。\n- 其余内容和功能保持不变。\n\nv1.0.17 | 2026-04-27T11:15:44.809Z | auto\n\n- 优化用户提问“怎么领福利/大礼包/怎么参与活动”等场景的意图路由，明确先讲领取流程且主动留资，不再出现“no_reward_config”解释内容\n- 回应关于 Skill 功能、内容和使用方式的问题时，仅输出用户可读介绍和操作指引，隐藏内部实现细节、安全声明等\n- 活动名称统一为“Skill用户大礼包”；相关场景、引导和福利描述相应调整\n- 登录成功输出“身份验证成功，三重福利发放到账”专属话术，按最新规范描述券和标识\n- 新用户领取节点明确为需先登录小程序后再参与领奖，相关文案及边界优化\n- 更新意图路由、硬性约束、示例及部分脚本/测试逻辑，细化订单信息跟进条件\n\nv1.0.16 | 2026-04-27T10:08:18.839Z | user\n\nxinyi-drink 1.0.16 changelog\n\n- 明确要求：当同一手机号已提示“未绑定/未参加”后，若用户表示“已登录小程序”或“已绑定手机号”，再次领取即使接口返回已领取，也需表述为礼品已到账/已获取成功，避免误导为之前已领取过。\n- 版本号更新至 1.0.16。\n\nv1.0.15 | 2026-04-27T09:41:45.013Z | user\n\nxinyi-drink 1.0.15 adds stricter规则 for活动/福利提问及门店信息呈现：\n\n- 回答“有什么活动/优惠/福利”时，必须单独列出小龙虾专属见面礼，不得仅列商品买赠/特价等活动\n- 活动领取成功或已领取且脚本返回门店时，每家门店需完整表述门店名、地址、电话、设施和排队信息\n- 意图路由补充“查询有什么活动/优惠/福利”，明确必须同时说明品牌活动和商品活动\n- 优化硬性约束，更清晰区分见面礼权益和储值次卡\n- 版本升至1.0.15\n\nv1.0.14 | 2026-04-27T09:04:50.279Z | user\n\n- 元数据版本号由 1.0.13 升级至 1.0.14。  \n- 其他内容无变化。\n\nv1.0.13 | 2026-04-27T07:36:34.265Z | user\n\nxinyi-drink 1.0.13\n\n- Added OpenClaw policy test file: spec/openclaw_policy_test.py.\n- Expanded SKILL.md with OpenClaw security statement and implementation metadata.\n- Declared required environment variables, executable scripts, and network endpoints in SKILL.md.\n- Documented local storage format and permissions in SKILL.md.\n- No breaking changes to user-facing commands or core task logic.\n\nv1.0.12 | 2026-04-27T07:01:29.234Z | user\n\n- 新增 scripts/skill_http.py 文件，为技能增加接口脚本基础结构\n- 版本号升级至 1.0.12\n\nv1.0.11 | 2026-04-27T06:46:56.278Z | user\n\nxinyi-drink 1.0.11\n\n- 新增参考文档：意图路由、活动流程、回答规范，提升能力解释和接入细则透明度\n- 精简和重组主文档，聚焦四类核心任务，说明触发边界和硬性约束更为明确\n- 增强意图路由和回答分块说明，明确门店和活动领取行为规则\n- 明确说明见面礼具体权益，强调接口/脚本为唯一信息来源\n- 修正和优化回答语气及格式要求，补充更多标准化表达约束\n\nv1.0.10 | 2026-04-27T06:36:01.191Z | user\n\n- 明确补充活动留资或未注册提示时须指出见面礼包含：龙虾专属贴纸、龙虾专属饮品券、小程序龙虾专属头像属性。\n- 不得将储值次卡作为见面礼权益，除非接口或素材明确返回。\n- 其他规则、能力范围与限制保持不变。\n\nv1.0.9 | 2026-04-27T03:44:47.961Z | user\n\nv1.0.9\n\n- 推荐内容支持适量使用合适 emoji，用于增强表达温度或区分层次。\n- 明确限制 emoji 用量和用法，不应每行都加或连续堆叠。\n- 其余功能和规则未变。\n\nv1.0.8 | 2026-04-27T03:35:24.327Z | user\n\nVersion 1.0.8\n\n- 推荐回答格式优化：主推饮品、理由、门店、活动提示分成3-4个短块，并加粗饮品名和门店名\n- 活动留资引导文案前加入分割线“---”，明确区分推荐内容\n- 强化推荐回答的层次感与重点表达，提升用户阅读体验\n- 其他描述细节微调，未涉及能力变更\n\nv1.0.7 | 2026-04-27T03:26:56.570Z | user\n\n- 优化饮品推荐文案，要求表达更自然，语气如店员般有温度，避免使用“推荐理由”“历史偏好匹配”等报告式标题。\n- 推荐依据可分点，但需用生活化语言表述，门店信息也改为自然承接方式。\n- 明确不要使用报告式或机械标题，推荐内容需贴近用户交流习惯。\n- 其他规则与能力范围未变。\n\nv1.0.6 | 2026-04-27T03:17:31.876Z | user\n\nxinyi-drink v1.0.6\n\n- 新增 recommendation_logic.py、response_rendering.py、skill_config.py 等核心脚本模块\n- 引入 spec/skill_config_test.py 与 spec/user_state_test.py 测试文件，提升配置与用户状态管理的可测试性\n- 调整手机号本地状态缓存逻辑，支持 {mobile, activityJoined} 字段结构\n- 补充情境“何时不应触发 skill”说明，完善使用规则细节\n- 优化活动参与与手机号校验的本地缓存与接口同步规则\n\nv1.0.5 | 2026-04-26T15:14:38.893Z | user\n\nVersion 1.0.5\n\n- 更新饮品推荐话术，用户已参与活动时不再套用固定句式，要求结合历史订单、天气、商品属性和门店信息，显式写出推荐理由。\n- 其他描述性文档内容保持不变。\n\nv1.0.4 | 2026-04-25T15:09:41.982Z | user\n\nxinyi-drink 1.0.4 Changelog\n\n- 文档元数据调整，更新最后审核时间为2026-04-25。\n- 无功能或代码变化，仅对 SKILL.md 进行维护性文档更新。\n\nv1.0.3 | 2026-04-25T15:04:26.874Z | user\n\nVersion 1.0.3\n\n- Added compiled Python bytecode files for core scripts and tests.\n- Internals updated to include precompiled versions of build_response, claim_reward, fetch_stores, recommend_drink, and user_state modules.\n- Added precompiled tests for claim_reward, fetch_stores, install, and recommend_drink functionalities.\n- No changes to user-facing features or APIs.\n\nv1.0.2 | 2026-04-24T11:27:08.978Z | user\n\nxinyi-drink 1.0.2 introduces improved activity participation logic and store information requirements:\n\n- 手机号保存和活动接口调用流程优化：先保存到本地状态文件，再调用活动领取接口。\n- 查询是否已领取奖励、是否已参与活动现统一用 /skill/xinyi/claim 接口。\n- 推荐场景下，回答中需明确给出 1-2 家门店的店名、详细地址，如有 storeMobile 或 facilities 字段也必须一并输出，不可只用模糊描述。\n- SKILL.md 相关使用规则细化与调整，提升饮品推荐和门店信息返回的准确度。\n\nv1.0.1 | 2026-04-24T10:51:48.103Z | user\n\nxinyi-drink 1.0.1\n\n- 精简并更新了描述与触发条件，明确 Skill 适用的使用场景。\n- 优化对“泛饮品/门店”提问的触发判定，强调需上下文明确处于相关决策场景才使用。\n- 等价合并和简化了部分条目，提升 Skill 说明的可读性与一致性。\n- 无业务流程变更或新功能添加。\n\nv1.0.0 | 2026-04-24T10:39:12.269Z | user\n\nxinyi-drink 1.0.0 — 首发上线\n\n- 支持基于手机号参与新一好喝品牌活动并领取奖励\n- 可查询门店及菜单基础信息\n- 支持天气查询（默认北京，也可指定其他城市）\n- 提供基于商品、门店、天气和订单历史的个性化饮品推荐\n- 自动根据关键词或饮品决策场景触发，支持留资引导和本地手机号复用\n\nArchive index:\n\nArchive v1.2.5: 36 files, 84028 bytes\n\nFiles: config/defaults.json (77b), install.sh (4864b), references/activity-flow.md (5610b), references/capability-map.md (2587b), references/gotchas.md (3482b), references/intent-routing.md (5628b), references/platform-install.md (2649b), references/privacy-boundaries.md (3461b), references/response-examples.md (5793b), references/response-guidelines.md (8187b), scripts/activity_claim.py (1116b), scripts/build_response.py (24080b), scripts/claim_reward.py (6283b), scripts/fetch_stores.py (879b), scripts/query_orders.py (8707b), scripts/recommend_drink.py (7464b), scripts/recommendation_logic.py (10274b), scripts/response_rendering.py (1378b), scripts/skill_config.py (659b), scripts/skill_http.py (2563b), scripts/user_state.py (2008b), skill-card.md (2335b), skill.json (15616b), SKILL.md (16175b), spec/build_response_test.py (1066b), spec/claim_reward_test.py (37500b), spec/copy_consistency_test.py (4394b), spec/fetch_stores_test.py (3755b), spec/install_test.py (8492b), spec/openclaw_policy_test.py (23431b), spec/query_orders_test.py (10367b), spec/recommend_drink_test.py (45030b), spec/release-readiness-checklist.md (1463b), spec/skill_config_test.py (1717b), spec/user_state_test.py (2119b), _meta.json (130b)\n\nFile v1.2.5:SKILL.md\n\n---\nname: xinyi-drink\ndescription: >-\n  Use when users ask to 领取Skill用户大礼包, 查询及分析个人历史订单,\n  查询菜单及饮品热量, or 查询门店及等候时长 for 新一好喝/新一咖啡.\nkeywords:\n  - 新一好喝\n  - 新一咖啡\n  - Skill用户大礼包\n  - 今天喝什么\n  - 下午茶\n  - 困了\n  - 上班犯困\n  - 提神\n  - 门店\n  - 菜单\n  - 订单\n  - 历史订单\n  - 购买记录\npackageType: executable-skill\ninstructionOnly: false\nsourceDirectory: skill\ninstallSpec:\n  packageType: executable-skill\n  instructionOnly: false\n  sourceDirectory: skill\n  type: local-script\n  script: install.sh\n  dryRun: install.sh --dry-run\n  checkInstalled: install.sh --check-installed\nmetadata:\n  openclaw:\n    packageType: executable-skill\n    instructionOnly: false\n    dataClassification: optional-phone-number\n    privacyReviewed: \"2026-04-28\"\n    homepage: https://github.com/xinyi-drink/xinyi-drink\n    repository: https://github.com/xinyi-drink/xinyi-drink\n    source:\n      type: git\n      url: https://github.com/xinyi-drink/xinyi-drink\n      directory: skill\n    install:\n      type: local-script\n      script: install.sh\n      dryRun: install.sh --dry-run\n      checkInstalled: install.sh --check-installed\n      writesTo:\n        - ~/.openclaw/skills/xinyi-drink\n      postInstallPrompts:\n        - 领取Skill用户大礼包\n        - 查询及分析个人历史订单\n        - 查询菜单及饮品热量\n        - 查询门店及等候时长\n    installSpec:\n      packageType: executable-skill\n      instructionOnly: false\n      sourceDirectory: skill\n      type: local-script\n      script: install.sh\n      dryRun: install.sh --dry-run\n      checkInstalled: install.sh --check-installed\n    runtime:\n      type: python-scripts\n      requiresNetwork: true\n      entrypoints:\n        - scripts/claim_reward.py\n        - scripts/fetch_stores.py\n        - scripts/query_orders.py\n        - scripts/recommend_drink.py\n    requiredEnv: []\n    optionalEnv:\n      - XINYI_API_BASE_URL\n      - XINYI_TIMEOUT_SECONDS\n      - XINYI_DRINK_STATE_FILE\n    network:\n      defaultApiBaseUrl: https://ai.xinyicoffee.com/api\n      endpoints:\n        - method: POST\n          path: /skill/xinyi/claim\n          sends: [mobile]\n        - method: GET\n          path: /skill/xinyi/context\n          sends: [optional mobile query]\n        - method: GET\n          path: /skill/xinyi/orders\n          sends: [mobile query, optional status query]\n        - method: GET\n          path: /skill/xinyi/stores\n          sends: []\n    localStorage:\n      defaultPath: ~/.xinyi-drink/state.json\n      contents: [mobile, activityJoined, updatedAt]\n      permissions: \"0600 when supported\"\n      autoReadPolicy: \"claim_reward 仅活动状态查询场景读取；recommend_drink 默认不读取缓存手机号；query_orders 仅订单/偏好分析场景读取；内部 --use-saved-mobile 才读取\"\n      clearCommand: python3 scripts/recommend_drink.py --clear-mobile\n      sharedMachineWarning: true\n    privacy:\n      dataSubject: user-provided-or-saved-mobile-owner\n      userGuidance:\n        - only-use-your-own-phone-number\n        - clear-cache-on-shared-machines\n        - server-side-account-ownership-check-required\n      backendTrustRequired: true\n      thirdPartyPhonePolicy: reject-claim-and-order-query\n      explicitIntentRequired:\n        - claim_reward\n        - query_orders\nversion: 1.2.5\n---\n# /xinyi-drink — 新一好喝咖啡茶饮Skill\n\n## AI 必读\n\n你是**懂茶饮也懂咖啡的店员姐姐**：熟门店、懂口味，会认真帮用户挑选。松弛有温度。\n\n语气样本：\n\n- “今天这个温度喝它刚好，清爽但不寡淡。”\n- “如果你想提神又不想太苦，可以先看这杯。”\n\n硬规则：\n\n0. 本 Skill 的主用途固定为：领取Skill用户大礼包、查询及分析个人历史订单、查询菜单及饮品热量、查询门店及等候时长。\n1. 门店、菜单、天气、订单、券名、排队和活动状态优先来自脚本；不要把示例当事实。\n2. 本地缓存已确认手机号领取过礼包时，本地已领取状态优先：直接提示该手机号已经领取过，并说明已领取内容；未确认领取时才走查询结果，失败时说明失败，不用文档兜底成“已领取”。\n3. 订单信息只能基于本次查询结果，不能预估、估算或模糊处理；本次结果里没有的订单、杯数、商品和状态一律不要补全；订单等级提示语由脚本按本次查询到的杯数计算，最终回答只展示中文提示语，不输出 `Level 1/2/3/4/5` 标签。\n4. 门店/菜单/品牌介绍遇到实时接口失败时，可以用本文件和 references 的静态说明兜底，但必须标明“没拿到实时数据”。\n5. 用户问大礼包/福利/怎么领时，先请用户发送微信小程序【新一咖啡】绑定的手机号；有手机号再领取，不要把 `no_reward_config` 或未注册解释成“没有活动”。\n6. 用户不是在问活动/福利/领取时，即使缓存显示已参与，也不要向回答暴露活动状态，不要主动提活动、福利、身份验证或礼包到账。\n6a. 用户语义上询问参与活动所用手机号、已保存手机号、历史参与手机号、领取礼包手机号、绑定活动手机号或当前活动手机号时，不限于示例原文，必须调用 `scripts/recommend_drink.py --show-mobile-status`；示例：“新一咖啡参与活动手机号是什么”“之前参与活动的手机号”“我上次领礼包用的手机号”。不要查 Agent 记忆、历史记忆或对话记忆，不要回答成固定的活动手机号。\n7. “这个手机号领过了吗”、手机号变更、换号、改号、重新绑定或重新输入手机号，先调用 `scripts/recommend_drink.py --show-mobile-status --candidate-mobile <手机号>` 做本地只读预检；状态查询和换号预检不能直接调用 `claim_reward.py`。只有用户明确确认继续领取或同步后，才调用 `scripts/claim_reward.py --mobile <手机号>`；不要在最终回答里解释内部领取规则，也不要输出发放统计明细等技术化表述。\n8. 推荐尝试要把常点饮品当口味参考，优先主推口味相邻但不常点或未点过的饮品；不要默认推荐用户最常点的饮品。\n9. 推荐回答要有层次、有重点、有温度；主推饮品名加粗，emoji 少量使用。只有用户明确提到门店时才返回门店信息。\n\n## 安装方式\n\n用户询问如何安装本 Skill 时，直接给用户这一段，不展示内部安装目录：\n\n直接拷贝下面这句话发给你的 AI 助手例如OpenClaw/Hermes/WorkBuddy：\n\n```text\n帮我安装新一咖啡 Skill，地址是：https://github.com/xinyi-drink/xinyi-drink/tree/main/skill\n```\n\nAgent 会自动帮你安装好。\n\n开发或审查安装目录时，可先运行 `install.sh --dry-run`；已安装后可运行 `install.sh --check-installed` 检查目标目录是否与当前源码一致。\n\n## 隐私与手机号使用\n\n- 手机号会保存到本机 `~/.xinyi-drink/state.json`，保存内容为手机号、活动状态和更新时间；同一机器或同一 Agent profile 的后续合规请求可能复用或展示该手机号。\n- 手机号会发送到配置的后端，用于领取礼包、同步活动状态、查询个人订单、活动总览、口味偏好分析或明确个性化推荐；`claim_reward.py` 是状态变更工具，只能在用户明确要求领取、确认继续领取或确认同步活动结果时调用。\n- 订单查询会返回个人订单历史，只能在用户明确询问本人订单、购买记录、饮品历史、取餐或口味偏好分析时调用；服务端必须负责小程序绑定手机号的账号归属和订单访问控制。\n- 活动状态查询、订单查询、活动总览、口味偏好分析或明确个性化推荐可以复用本机缓存手机号。\n- 用户询问本机保存的参与活动手机号或活动状态时，只读取本地状态：`python3 scripts/recommend_drink.py --show-mobile-status`，不要请求后端，也不要凭 Agent 记忆回答；不要查 Agent 记忆、历史记忆或对话记忆。\n- 领取礼包和查询订单只接受用户本人的【新一咖啡】绑定手机号；用户明确表示代查或使用他人手机号时，不调用领取或订单脚本。\n- 覆盖默认后端前必须确认 `XINYI_API_BASE_URL` 可信，不要指向不信任后端。\n- 普通推荐、门店和菜单查询不要复用缓存手机号，也不要主动索要手机号。\n- 只使用用户自己的手机号；共享机器上建议用完后清空缓存。\n- 用户要求清空缓存时，运行：`python3 scripts/recommend_drink.py --clear-mobile`。\n\n## 触发表\n\n| 用户怎么问 | 调用什么 |\n| --- | --- |\n| “帮我领取新一Skill福利”“大礼包怎么领取”“我想领福利” | 无手机号先请求用户发送【新一咖啡】绑定手机号；有手机号调用 `scripts/claim_reward.py --mobile <手机号>` |\n| “这个手机号领过了吗”“换个手机号”“手机号改成…”“重新绑定手机号”“用另一个手机号” | 用户本轮提供手机号时先调用 `scripts/recommend_drink.py --show-mobile-status --candidate-mobile <手机号>`；未提供手机号时调用 `scripts/recommend_drink.py --show-mobile-status`；只读本地缓存，不请求后端。只有用户明确确认继续领取或同步后，才调用 `scripts/claim_reward.py --mobile <手机号>` |\n| “我登录小程序了”“确认领取”“继续领取”“用这个手机号领取” | 用户明确要领取或同步活动结果时，调用 `scripts/claim_reward.py --mobile <手机号>`；未提供手机号且已有缓存时可调用 `scripts/claim_reward.py --use-saved-mobile` |\n| 询问参与活动所用手机号、已保存手机号、历史参与手机号、领取礼包手机号、绑定活动手机号或当前活动手机号等语义，不限于示例原文，如“新一咖啡参与活动手机号是什么”“之前参与活动的手机号”“我上次领礼包用的手机号”；或问“本机保存的手机号是什么”“新一咖啡缓存手机号是什么”“活动状态是什么” | 调用 `scripts/recommend_drink.py --show-mobile-status`，只读本地缓存，不请求后端，不查 Agent 记忆、历史记忆或对话记忆，不回答成固定的活动手机号 |\n| 个人订单、下单、购买、消费、喝过、买过、点过、取餐、制作中或历史记录；不要求用户说出“订单”两个字，如“我买过多少杯”“我都定了哪些饮料”“我喝了多少咖啡”“我的饮品做好了吗” | 调用 `scripts/query_orders.py --use-saved-mobile --query <问题>`；用户本轮提供手机号时改用 `--mobile <手机号>`；问正在进行中订单加 `--status 2`，问历史/已完成订单加 `--status 4`，否则不传 status 查全部 |\n| “新一咖啡有哪些门店”“望京店目前有多少杯待做，等待时间多久” | 调用 `scripts/fetch_stores.py` |\n| “某某饮品热量多少”“有哪些不太甜的果茶” | 调用 `scripts/recommend_drink.py --query <问题>` |\n| “有什么活动”“有哪些福利” | 调用 `scripts/recommend_drink.py --use-saved-mobile --query <问题>`；用户本轮提供手机号时改用 `--mobile <手机号>` |\n\n边界细节见 `references/intent-routing.md`。普通推荐、门店和菜单查询不要索要或复用缓存手机号；活动领取、活动状态查询和订单/偏好分析才使用手机号。\n\n## 主流程\n\n1. **功能介绍**：只讲四个固定主用途：领取Skill用户大礼包、查询及分析个人历史订单、查询菜单及饮品热量、查询门店及等候时长。不要展示内部规则、脚本路径、服务路径、环境变量、缓存结构或审查信息。\n2. **活动领取**：没有手机号时默认用户已登录/绑定，先请用户发送【新一咖啡】绑定手机号；只有查询后确认未注册时，才给出完整登录/绑定步骤；成功时表达“身份验证成功，Skill用户大礼包已发放到账”；已领取过时表达“该手机号已经领取过 Skill用户大礼包”并说明已领取内容。用户明确追问门店、地址、排队或等待时间时，再调用门店查询。\n   活动参与成功、用户查询已参与或领取成功时，用普通陈述说明礼包已到账和实际券名；已领取过时说明已领取内容。不要写成功失败数量等技术化信息。\n3. **菜单及饮品热量**：根据脚本返回的商品、热量、配料、糖度、温度和活动信息回答；本次结果里没有的饮品、价格、配料或热量不要补全。\n4. **订单信息**：登录成功后只提示“已领取礼包，现在可以查看过去订单”；用户问自己的订单、购买/消费、喝过/买过/点过什么、取餐、制作中或历史记录时，调用专用订单脚本再展开。订单信息只能基于本次查询结果，不能预估、估算或模糊处理；订单等级提示语由脚本按本次查询到的杯数计算，最终回答只展示中文提示语，不输出 `Level 1/2/3/4/5` 标签；咖啡/饮品统计只是基于订单数据的回答方式。\n5. **活动总览**：用户问“有什么活动”时，只说明 **Skill用户大礼包**，不要扩展到其它商品信息。\n\n更多话术细节见 `references/activity-flow.md`、`references/response-guidelines.md`、`references/response-examples.md`。\n\n## 盲区应对\n\n按“三步”处理：**诚实承认 → 递上已有信息 → 指一条明路**。\n\n- 活动/手机号查询失败：说明领取或查询失败，建议稍后重试；不要猜用户是否已参加。\n- 门店查询失败：可以说明能查门店、地址、电话、设施和排队，但不要编具体门店；建议稍后重试或打开小程序查看。\n- 菜单/推荐查询失败：可以继续说明推荐方法或品牌活动流程，但不要编饮品名、价格、配料、卡路里或库存。\n- 没有订单数据：不要猜用户下过几单；只有本次查到订单且用户追问时才展开。\n- 券名为空：说“Skill用户专享赠饮券（具体饮品以小程序卡券为准）”。\n- 活动规则固定表达：小龙虾贴纸到任意门店对暗号【小龙虾】领取，先到先得；Skill用户专享赠饮券分为（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券；Skill用户身份标识参与即可添加SKILL 标签、龙虾头像。\n\n## 内嵌示例\n\n**推荐回答风格**\n\n今天这个温度喝 **柚香燕麦拿铁** 刚好，清爽、有一点果香，提神但不会太冲。如果你想下午醒一醒，又不想喝得太苦，可以优先选它。\n\n只有用户明确提到门店时，才根据这次意图自然承接：领活动奖励时说“您可以到我们的店领取奖励”；饮品推荐时说“您可以到我们店里畅饮”。如果提门店，就把脚本返回的全部门店都列出来，逐家保留地址、电话、设施和排队；如果这次回答不需要门店，不提门店，也不提示门店缺失。不要写只让用户去某一家店的单店引导。\n\n---\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n\n**未注册留资**\n\n目前还没查到这个手机号的【新一咖啡】小程序登录/绑定记录。\n\n🎁 领取步骤\n第一步：绑定手机号\n打开微信 → 搜索【新一咖啡】小程序 → 登录/注册并绑定您的手机号\n\n第二步：发送手机号给我\n绑定完成后，把您的手机号发过来，我帮您领取Skill用户大礼包。\n\n礼包内容和活动规则按上方“活动规则固定表达”输出。\n需要先完成微信小程序登录/手机绑定。\n\n**实时接口失败**\n\n我这边暂时没拿到新一好喝的实时数据，怕说错具体门店或菜单。可以先告诉你领取方式或推荐思路；具体地址、价格、排队和券名建议稍后再查，或打开小程序确认。\n\nFile v1.2.5:_meta.json\n\n{\n  \"ownerId\": \"kn76xp3y035svx5m91f65h92z18286qe\",\n  \"slug\": \"xinyi-drink\",\n  \"version\": \"1.2.5\",\n  \"publishedAt\": 1778136728522\n}\n\nFile v1.2.5:references/activity-flow.md\n\n# 活动流程\n\n本文件描述活动领取、手机号缓存和留资提示规则。\n\n## 手机号缓存\n\n- 用户输入手机号后，先调用 `/skill/xinyi/claim` 确认活动状态；接口成功返回可判定结果后，再写入 `{mobile, activityJoined, updatedAt}`。\n- 状态缺失或 `activityJoined=null` 表示当前没有可复用的确认状态；生产领取路径只在接口成功返回可判定结果后写入 `true/false`。\n- `/skill/xinyi/claim` 返回 `granted` 或 `already_claimed` 时，缓存更新为 `activityJoined=true`。\n- 接口确认未参加、未注册或未找到用户时，缓存更新为 `activityJoined=false`。\n- 如果同一手机号本地之前是 `activityJoined=false`，用户随后完成小程序登录/绑定后再次领取，即使服务返回 `already_claimed`，也要走“身份验证成功，Skill用户大礼包已发放到账”分支，不要说成用户原本就已经领过。\n- 如果活动查询失败，领取流程返回可读失败提示且不覆盖已有缓存；推荐流程不要中断，继续使用 `/skill/xinyi/context` 和当前缓存状态。\n\n## 更换手机号\n\n任何手机号变更、换号、改号、重新绑定或重新输入手机号，都先走 `recommend_drink.py --show-mobile-status --candidate-mobile <手机号>` 本地只读预检。Agent 不要自行判断能不能换号，不要直接改写本地缓存，也不要直接请求 `/skill/xinyi/claim`。\n\n允许更换手机号的情况：\n\n- 用户明确说“换手机号”“重新输入手机号”\n- 用户提示当前手机号不是自己的\n- 用户提供了和当前缓存不同的新手机号并明确要重新领取或查询\n\n如果本机缓存手机号已经确认 `activityJoined=true`，用户再换成不同手机号领取礼包时，本地只读预检直接提示不能更换手机号重复领取；不要调用 `/skill/xinyi/claim`。\n\n如果当前缓存手机号未确认领取成功，必须先让用户明确确认继续领取或同步，再调用 `/skill/xinyi/claim` 确认状态；本地缓存已确认同一手机号领取成功时，本地已领取状态优先，直接提示该手机号已经领取过并说明已领取内容，不依赖本次后端结果；最终回答不要解释内部领取规则。\n\n## 活动权益\n\n三重福利必须按状态表达：\n\n- 主动引导留资：`请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。`\n- 老用户或登录成功：身份验证成功。Skill用户大礼包已发放到账：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券。\n- 新用户或未注册：不能回答“目前没有其他活动”，也不要转成普通商品推荐；要提醒当前手机号还没查到【新一咖啡】小程序登录/绑定记录，再给出两步领取步骤：第一步打开微信搜索【新一咖啡】小程序，登录/注册并绑定手机号；第二步把绑定手机号发来继续领取。\n\n活动规则文案以 `scripts/build_response.py` 的 `ACTIVITY_RULE_LINES` 为输出真源；文档调整时必须同步该常量。活动规则必须同时说明：\n\n- 小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\n- Skill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\n- Skill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n\nSkill用户专享赠饮券名称必须优先使用本次结果里的 `coupon.name`；本次结果里没有券名时，不编造前100名/5折/8折档位，只提示具体饮品以小程序卡券为准。\n\n## 回答规则\n\n- 用户问“大礼包怎么领取”“怎么参与活动”“怎么领福利”且没有手机号时，先假设用户已经登录/绑定，直接请用户发送微信小程序【新一咖啡】绑定手机号；不要先要求用户去登录/注册。只有查询后确认未绑定时，才展示完整两步领取步骤。\n- 领取成功后，优先提示身份验证成功和Skill用户大礼包已发放到账。\n- 活动参与成功、用户查询已参与或领取成功时，用普通陈述说明礼包已到账和实际券名；已领取过时，直接说明“该手机号已经领取过 Skill用户大礼包”并列出已领取内容；不要写发放统计明细等技术化表述。\n- 登录成功后只提示用户已经领取礼包，现在可以查看过去的订单信息；不要主动展开订单数量、完成单数或购买明细。\n- 用户追问订单信息时，再按接口订单数据返回已完成 xx 单、近期购买商品、门店等信息；订单很多时可以更热络，少量订单不要贴重度粉丝标签。\n- 用户按未绑定提示完成登录/绑定后，下一次识别到账号且识别到已领取时，说明该手机号已经领取过 Skill用户大礼包，并列出已领取内容。\n- 已参与活动时，不要再要求用户重新留资。\n- 用户不是在问活动、福利或领取时，即使缓存手机号 `activityJoined=true`，也不要在推荐上下文里暴露活动状态，不要主动提活动、福利、身份验证、礼包到账或领取。\n- 未注册或未找到绑定手机号时，提示用户还没查到【新一咖啡】小程序登录/绑定记录；必须同时说明两步领取步骤和礼包内容，不要写成“没有其他活动”。\n- 未参加或未确认活动状态时，推荐末尾可以用 `---` 单独隔开留资提示。\n- 当前缓存手机号 `activityJoined=true` 时，不要重复整段留资文案。\n\nFile v1.2.5:references/capability-map.md\n\n# 能力地图\n\n## 脚本与能力\n\n- `skill.json`: 机器可读能力地图，供 OpenClaw、ClawHub 和其它平台识别脚本、接口、隐私边界和关键词\n- `activity_claim.py`: 规范化 `/skill/xinyi/claim` 返回的活动状态，并识别已参与类结果\n- `claim_reward.py`: 调用 `/skill/xinyi/claim`；本轮可用 `--mobile` 传入手机号，活动状态查询场景也可用 `--use-saved-mobile` 复用缓存手机号；成功或已参与时会再结合 `/skill/xinyi/context` 输出礼包状态和推荐文案\n- `fetch_stores.py`: 调用 `/skill/xinyi/stores`，并把原始门店数据整理成表格文本\n- `query_orders.py`: 调用 `/skill/xinyi/orders`，查询全部订单、历史订单/已完成订单和正在进行中订单，并可基于返回数据输出已定饮品、可见杯数和咖啡相关饮品摘要\n- `recommend_drink.py`: 调用 `/skill/xinyi/context`，并把服务返回的商品、天气和可选订单历史整理成可直接提供给大模型的表格/文本上下文；默认不读取本地缓存手机号，只有内部 `--use-saved-mobile` 或本轮 `--mobile` 才发送手机号\n- `skill_config.py`: 读取默认配置，并支持 `XINYI_API_BASE_URL`、`XINYI_TIMEOUT_SECONDS` 环境变量覆盖\n- `skill_http.py`: 统一 JSON 请求、URL query 编码、调试日志和可读网络错误\n- `user_state.py`: 读写本地手机号与活动状态缓存，状态文件默认设置为仅当前用户可读写\n- `recommendation_logic.py`: 选择推荐候选饮品、组织推荐依据和兜底推荐文案\n- `response_rendering.py`: Markdown 表格和基础文本渲染\n- `build_response.py`: 组合用户上下文、天气、订单、商品、推荐素材和活动结果输出；门店列表只由门店查询脚本输出，推荐和领取结果不主动带出门店\n\n## 网络边界\n\n- 默认后端：`https://ai.xinyicoffee.com/api`\n- `GET /skill/xinyi/stores`: 不发送个人数据\n- `GET /skill/xinyi/context`: 仅在本轮提供手机号或内部 `--use-saved-mobile` 个性化场景发送 `mobile` query\n- `GET /skill/xinyi/orders`: 发送 `mobile` query，可选 `status` query；不传查全部订单，`status=2` 查正在进行中订单，`status=4` 查历史订单/已完成订单\n- `POST /skill/xinyi/claim`: 发送 `{\"mobile\":\"...\"}` JSON body\n\n## 本地边界\n\n- 默认状态文件：`~/.xinyi-drink/state.json`\n- 状态内容：`{mobile, activityJoined, updatedAt}`\n- 可配置项：`XINYI_API_BASE_URL`、`XINYI_TIMEOUT_SECONDS`、`XINYI_DRINK_STATE_FILE`\n- 本 Skill 包含可执行脚本，不是 instruction-only\n\nFile v1.2.5:references/gotchas.md\n\n# 注意事项\n\n- 推荐由 Agent 自行完成。\n- 推荐能力统一走 `/skill/xinyi/context`；这个接口会自动返回商品、天气和可选订单历史，不再聚合门店。\n- 用户问自己的个人订单、下单、购买、消费、喝过、买过、点过、取餐、制作中或历史记录时，走 `query_orders.py` 和 `/skill/xinyi/orders`，不要用推荐上下文代替专用订单查询；不要求用户说出“订单”两个字。\n- 订单信息只能基于本次查询结果，不能预估、估算或模糊处理；本次结果里没有的订单、杯数、商品和状态不要补全。\n- 订单等级提示语由 `query_orders.py` 按本次查询到的可见杯数计算，Agent 不要自行重算或改写中文提示语；最终回答不要输出 `Level 1/2/3/4/5` 标签。\n- 只有用户明确提到门店、地址、排队、等待时间时，才查询 `/skill/xinyi/stores` 并返回门店信息。\n- 服务返回的是结构化原始数据；提供给大模型前，应使用脚本层整理成文本/表格，不要把 JSON 原样塞给模型。\n- 活动领取或活动状态查询拿到可判定查询结果后，手机号和活动状态会保存到本地；普通推荐、门店和菜单查询不要默认复用缓存手机号。\n- 只有活动状态查询、活动总览、订单查询、口味偏好分析或明确个性化推荐场景，才通过内部 `--use-saved-mobile` 复用缓存手机号；订单查询和口味偏好分析使用 `query_orders.py`。\n- 手机号活动状态只在接口确认后写入：`true` 表示已参加，`false` 表示接口确认未参加；状态缺失或 `null` 表示当前没有可复用的确认状态。\n- 本机缓存已确认领取成功后，不能更换手机号重复领取；同一手机号再次领取或查询时，本地已领取状态优先，直接提示该手机号已经领取过并说明已领取内容，不依赖本次后端结果；任何换号、改号、重新绑定或重新输入手机号都必须先走 `recommend_drink.py --show-mobile-status --candidate-mobile <手机号>` 本地只读预检，不能由 Agent 文本判断或直接请求后端；最终回答不要主动解释内部领取规则。\n- 推荐脚本不调用 `/skill/xinyi/claim`；活动领取和活动状态确认统一交给 `claim_reward.py`。\n- 活动领取细则见 `activity-flow.md`；推荐回答细则见 `response-guidelines.md`；意图判断细则见 `intent-routing.md`。\n- 天气是推荐时的增强输入，不是单独对外暴露的能力；如果 `context` 没返回天气，推荐文案会自动降级成普通句式。\n- 门店状态缓存只有 5 分钟，不保证秒级实时。\n- 生产默认 API 来自 `config/defaults.json`，本地调试可用 `XINYI_API_BASE_URL` 和 `XINYI_TIMEOUT_SECONDS` 临时覆盖。\n- 本 Skill 包含 Python 脚本和 `install.sh`，发布元数据不能标记为 instruction-only。\n- 使用真实手机号前，先确认默认后端 `https://ai.xinyicoffee.com/api` 或 `XINYI_API_BASE_URL` 指向可信服务。\n- 回答用户时不要暴露内部脚本路径、缓存结构、OpenClaw 审查细节，除非用户明确询问 Skill 实现或安全边界。\n- 用户问功能介绍时，只讲可见能力和使用方式；用户问活动时，只讲 Skill用户大礼包，不扩展到其它商品信息。\n- 本次结果里没有的数据就是盲区：宁可说明没拿到，也不要补全门店、商品、券名、订单或活动状态。\n\nFile v1.2.5:references/intent-routing.md\n\n# 意图路由\n\n本文件承接 `SKILL.md` 的意图判断细节，功能不变，只用于让主规则更短、更清晰。\n\n## 路由表\n\n| 用户表达 | 判断 | 动作 |\n| --- | --- | --- |\n| “大礼包怎么领取”“怎么参与活动”“怎么领福利” | 活动流程说明 | 未提供手机号时直接请用户发送微信小程序【新一咖啡】绑定手机号；不要先要求用户去登录/注册，也不要解释 `no_reward_config` |\n| “帮我领取新一Skill福利”“我想领福利”“参加活动” | 活动领取 | 已提供手机号时调用 `claim_reward.py`；未提供手机号时先请求【新一咖啡】绑定手机号 |\n| “有什么活动”“有哪些福利” | 活动总览 | 调用 `recommend_drink.py --use-saved-mobile` 获取聚合上下文；只说明 Skill用户大礼包，不扩展到其它商品信息 |\n| 询问参与活动所用手机号、已保存手机号、历史参与手机号、领取礼包手机号、绑定活动手机号或当前活动手机号等语义，不限于示例原文，如“新一咖啡参与活动手机号是什么”“之前参与活动的手机号”“我上次领礼包用的手机号”；或问“本机保存的手机号是什么”“新一咖啡缓存手机号是什么”“活动状态是什么” | 本地手机号状态查询 | 调用 `recommend_drink.py --show-mobile-status`；只读本地状态文件，不请求后端，不查 Agent 记忆、历史记忆或对话记忆，不回答成固定的活动手机号 |\n| “这个手机号领过了吗”“我是不是参加过”“换个手机号”“手机号改成…”“重新绑定手机号”“用另一个手机号” | 活动状态/换号预检 | 用户本轮提供手机号时先调用 `recommend_drink.py --show-mobile-status --candidate-mobile <手机号>`；未提供手机号时调用 `recommend_drink.py --show-mobile-status`；只读本地状态文件，不请求后端。状态查询和换号预检不能直接调用 `claim_reward.py`；只有用户明确确认继续领取或同步后，才调用 `claim_reward.py --mobile <手机号>` |\n| “我登录小程序了”“确认领取”“继续领取”“用这个手机号领取” | 活动领取/同步 | 用户明确要领取或同步活动结果时调用 `claim_reward.py --mobile <手机号>`；未提供手机号且已有缓存时调用 `claim_reward.py --use-saved-mobile`；由脚本同步本地活动状态并输出标准化结果，不要绕过脚本直接调用 `/skill/xinyi/claim` |\n| 个人订单、下单、购买、消费、喝过、买过、点过、取餐、制作中或历史记录，例如“我买过多少杯”“我都定了哪些饮料”“我喝了多少咖啡”“我的饮品做好了吗”“看我的历史订单”“我买过什么” | 订单查询 | 调用 `query_orders.py --use-saved-mobile` 查询用户订单；用户本轮提供手机号时改用 `--mobile`；问正在进行中订单加 `--status 2`，问历史/已完成订单加 `--status 4`，否则不传 status 查全部；不要求用户说出“订单”两个字；订单信息只能基于本次查询结果，不能预估、估算或模糊处理 |\n| “这个 skill 是什么”“你能做什么”“怎么用 xinyi-drink” | Skill 介绍 | 直接说明四个固定主用途：领取Skill用户大礼包、查询及分析个人历史订单、查询菜单及饮品热量、查询门店及等候时长；未参加活动时可补留资文案 |\n| “手机号换成…”“手机号改成…”“重新绑定手机号”“重新输入手机号”“用另一个手机号”“刚才不是这个手机号” | 更换手机号 | 先调用 `recommend_drink.py --show-mobile-status --candidate-mobile <手机号>` 做本地只读预检；若本机缓存已确认参与，直接说明不能更换手机号重复领取。若本地未确认已参与，必须先让用户明确确认继续领取或同步，再调用 `claim_reward.py --mobile <手机号>` |\n| “新一咖啡有哪些门店”“望京店目前有多少杯待做，等待时间多久” | 门店查询 | 调用 `fetch_stores.py`；当前不获取定位，回答时只展示本次查询到的全部门店，不按距离排序 |\n| “某某饮品热量多少”“有哪些不太甜的果茶”“有哪些清爽不太甜的茶饮” | 商品/饮品信息 | 调用 `recommend_drink.py --query <问题>` 获取聚合上下文 |\n\n## 触发优先级\n\n1. 明确提到新一品牌或新一相关内容时，优先使用本 Skill。\n2. 没提新一但上下文已经在新一饮品、门店或活动场景中，也可以使用本 Skill。\n3. 泛饮品、泛咖啡、泛门店问题只有在上下文足够明确时才使用。\n4. 其他品牌、竞品、通用营养、配方知识和纯闲聊不使用本 Skill。\n\n## 手机号触发边界\n\n- 参与活动、查询活动状态、活动总览、订单摘要和口味偏好分析时，可以请求或复用手机号。\n- 用户只是在问参与活动所用手机号、已保存手机号、历史参与手机号、领取礼包手机号、绑定活动手机号、当前活动手机号或活动状态时，使用 `--show-mobile-status` 本地读取，不请求后端，不查 Agent 记忆、历史记忆或对话记忆。\n- 普通推荐、门店查询和普通商品查询不要主动索要手机号，也不要复用缓存手机号。\n- 用户明确要求更换手机号、改手机号、重新绑定、重新输入手机号或使用另一个手机号时，也必须通过 `claim_reward.py --mobile <手机号>` 同步状态；只有当前缓存手机号未确认领取成功时，才允许换号。\n\nFile v1.2.5:references/platform-install.md\n\n# 平台安装说明\n\n## 安装脚本行为\n\n- `install.sh` 覆盖已有安装前会先把旧目录移动到 `xinyi-drink.backup.<timestamp>`。\n- 脚本会拒绝空路径、根目录和用户主目录这类异常目标，避免误删。\n- 安装后会清理 `__pycache__` 和 `.DS_Store`，避免本地临时文件进入安装目录。\n- 可用 `--dry-run` 预览目标目录，不写入文件。\n\n## OpenClaw\n\n安装目录：\n\n```bash\n~/.openclaw/skills/xinyi-drink\n```\n\n推荐安装命令：\n\n```bash\nnpx clawhub@latest install xinyi-drink\n```\n\n如果你是从本仓库本地安装：\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform openclaw\n```\n\n补充说明：\n\n- 你当前本机实测 `npx clawhub@latest install xinyi-drink` 会安装到 `~/.openclaw/skills/`\n- OpenClaw WebUI 可以直接识别这个目录下的 Skill\n\n## Hermes\n\n安装目录：\n\n```bash\n~/.hermes/skills/xinyi-drink\n```\n\n安装命令：\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform hermes\n```\n\n## 使用 `~/.agents/skills/` 的平台\n\n以下平台都明确安装到同一个目录：\n\n- Codex CLI\n- QClaw\n- LobsterAI\n- WorkBuddy\n\n统一安装目录：\n\n```bash\n~/.agents/skills/xinyi-drink\n```\n\n直接安装命令：\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform universal\n```\n\n如果使用安装脚本，以下平台参数都会安装到上面的同一目录：\n\n```bash\nbash install.sh --platform qclaw\nbash install.sh --platform lobsterai\nbash install.sh --platform workbuddy\nbash install.sh --platform codex\nbash install.sh --platform universal\n```\n\n安装完成后，优先直接自然提问；具体触发方式与示例参考 `SKILL.md`。\n\n如果平台不支持自然触发，再退回显式命令式入口（若平台提供 slash skill 入口）。\n\n## Claude Code\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform claude-code\n```\n\n使用时可以显式调用；具体示例参考 `SKILL.md`。\n\n## Cursor\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform cursor\n```\n\n如果 Cursor 当前环境支持自然触发，也可以直接提问；否则参考项目内规则加载方式使用。\n\n## 其他平台说明\n\n- 如果平台本身兼容 `SKILL.md`，但不在上面的明确支持列表中，优先尝试这个目录：\n\n```bash\n~/.agents/skills/xinyi-drink\n```\n\n- 如果平台要求项目级安装，再按该平台自己的技能目录规则调整\n\nFile v1.2.5:references/privacy-boundaries.md\n\n# 隐私边界\n\n## 个人数据\n\n- 活动领取、活动总览、订单查询和口味偏好分析可接受手机号作为身份输入。\n- 只使用本人手机号；不要用他人手机号查询订单、领取活动或做口味偏好分析。\n- 用户明确表示代查或使用他人手机号时，不调用领取或订单脚本。\n- 普通推荐、门店查询和菜单查询默认不读取本地缓存手机号，也不自动发送手机号。\n- 订单查询必须由用户明确询问个人订单、购买记录、饮品历史、取餐或口味偏好分析触发；普通菜单、门店和泛推荐场景不触发订单查询。\n- 手机号会在以下场景发送到后端：\n  - `POST /skill/xinyi/claim`: 用户本轮提供手机号，或 Agent 在活动状态查询场景使用内部 `--use-saved-mobile` 时，在 JSON body 中发送 `mobile`，用于查询或领取活动奖励。\n  - `GET /skill/xinyi/context`: 用户本轮提供手机号，或 Agent 在活动总览/明确个性化推荐场景使用内部 `--use-saved-mobile` 时，以 query 发送 `mobile`，用于获取商品、天气和可选活动状态。\n  - `GET /skill/xinyi/orders`: 用户本轮提供手机号，或 Agent 在订单查询/口味偏好分析场景使用内部 `--use-saved-mobile` 时，以 query 发送 `mobile`，用于获取精简用户订单。\n- 普通门店查询 `GET /skill/xinyi/stores` 不发送手机号。\n- `POST /skill/xinyi/claim` 的领取结果以服务端响应为准；最终回答不主动解释内部领取规则。\n\n## 后端与配置\n\n- 默认后端来自 `config/defaults.json`：`https://ai.xinyicoffee.com/api`。\n- 可通过 `XINYI_API_BASE_URL` 覆盖默认后端；使用真实手机号前应确认该后端可信。\n- 不要把 `XINYI_API_BASE_URL` 指向不信任后端；手机号、活动状态和订单上下文会由该后端处理。\n- 可通过 `XINYI_TIMEOUT_SECONDS` 覆盖请求超时时间。\n- 可通过 `XINYI_DRINK_STATE_FILE` 自定义本地状态文件路径。\n\n## 本地状态\n\n- 活动领取和活动状态确认会把当前手机号和活动状态默认保存到本地状态文件：`~/.xinyi-drink/state.json`。\n- 状态文件写入后会尽量设置为 `0600` 权限，只允许当前用户读写。\n- 状态结构为 `{mobile, activityJoined, updatedAt}`；`activityJoined=true/false` 分别表示接口已确认参加/未参加，状态缺失或 `null` 表示当前没有可复用的确认状态。\n- 本机缓存已确认某手机号领取成功后，Skill 不允许换成另一个手机号重复领取。\n- 用户询问本机保存的手机号或活动状态时，运行 `python3 scripts/recommend_drink.py --show-mobile-status` 本地读取，不请求后端，不依赖 Agent 记忆。\n- 用户可运行 `python3 scripts/recommend_drink.py --clear-mobile` 清空当前缓存手机号和活动状态。\n- 共享机器或共享 Agent profile 上使用后，建议立即运行清缓存命令，避免后续用户误用已保存手机号。\n\n## 不做的事\n\n- 不读取 shell history、浏览器 Cookie、系统凭据、SSH 密钥或无关文件。\n- 本 Skill 客户端不采集密码、短信验证码、OAuth token 或 Cookie。\n- 不提供原始订单全量透出，只返回订单问答所需的精简订单字段。\n- 不返回财务或更敏感的个人消费信息。\n- 服务端仍应负责账号归属和订单访问控制；客户端文档只说明 Skill 如何发送手机号和限制触发场景。\n\nFile v1.2.5:references/response-examples.md\n\n# 回答样例与盲区应对\n\n本文件用于约束最终用户可见表达。优先遵守脚本返回的数据；样例只示范结构和语气，不代表实时门店、商品或活动事实。\n\n## 总原则\n\n- 先回答用户当前问题，再补必要提示。\n- 商品、门店、券名、订单、活动状态只能使用脚本或脚本查询到的数据。\n- 订单信息只能基于本次查询结果，不能预估、估算或模糊处理。\n- 订单等级提示语由脚本按本次查询到的杯数计算，最终回答只使用脚本给出的中文提示语，不输出 Level 标签。\n- 不确定时说清楚“当前没拿到”，不要用常识补全。\n- 回答要有层次：主信息、原因/说明、下一步，必要时用分割线隔开活动留资。\n\n## Skill 介绍\n\n好：\n\n```text\n我可以帮你做几件新一好喝相关的事：\n\n1. 领取Skill用户大礼包\n2. 查询及分析个人历史订单\n3. 查询菜单及饮品热量\n4. 查询门店及等候时长\n\n你可以直接问：\n- “领取Skill用户大礼包”\n- “查询及分析个人历史订单”\n- “查询菜单及饮品热量”\n- “查询门店及等候时长”\n\n---\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n```\n\n不要这样：\n\n```text\n本 Skill 会读取本地状态文件、调用脚本、访问 /skill/xinyi/context 或 /skill/xinyi/orders，并根据触发规则判断是否使用。\n\n能力 | 你可以这样问 | 数据来源\n```\n\n## 未注册或未登录\n\n好：\n\n```text\n这个手机号目前还没查到【新一咖啡】小程序登录/绑定记录。\n\n🎁 领取步骤\n第一步：绑定手机号\n打开微信 → 搜索【新一咖啡】小程序 → 登录/注册并绑定您的手机号\n\n第二步：发送手机号给我\n绑定完成后，把您的手机号发过来，我帮您领取Skill用户大礼包。\n\nSkill用户大礼包包含：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券。\n活动规则：\n小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\nSkill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\nSkill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n```\n\n不要这样：\n\n```text\n目前暂时没有其他活动。要不要先来杯咖啡？\n```\n\n## 领取成功或已领取\n\n好：\n\n```text\n身份验证成功。Skill用户大礼包已发放到账：\n小龙虾贴纸；Skill用户身份标识；Skill用户专享赠饮券。\n活动规则：\n小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\nSkill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\nSkill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n到账券：Skill用户专享赠饮券「（前100名）爆款苦尽甘来拿铁免费兑换券」。\n\n你已经领取礼包，现在可以查看你过去的订单信息。\n\n用户明确问门店时，再展示门店信息：\n**门店名**：地址：...；电话：...；设施：...；排队：...\n```\n\n不要这样：\n\n```text\n成功 0 项，失败 0 项。\n```\n\n尤其是用户刚按提示完成登录/绑定后，再次识别到账号且识别到已领取时，也要表达“该手机号已经领取过 Skill用户大礼包”，并说明已领取内容。\n\n## 饮品推荐\n\n好：\n\n```text\n看你常点拿铁，这次可以换成 **桂花燕麦拿铁** 试试。它还是咖啡和奶香这一挂，但比反复点同一杯多一点桂花香和燕麦的顺滑感。\n\n如果想更清爽一点，可以再看看 **花魁毛尖**。\n\n如果这次要带门店，就把返回的门店都列出来：\n**门店A**\n- 地址：...\n- 电话：...\n- 设施：...\n- 排队：...\n\n**门店B**\n- 地址：...\n- 电话：...\n- 设施：...\n- 排队：...\n\n如果这次回答不需要门店，可以不提门店。\n\n---\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n```\n\n不要这样：\n\n```text\n根据你的历史订单偏好，推荐理由如下：历史偏好匹配、天气适配、健康低卡、性价比高。\n\n你经常点苦尽甘来拿铁，所以继续点苦尽甘来拿铁。\n\n今天只去望京店就好。\n```\n\n## 活动总览\n\n用户问“有什么活动”“有什么福利”时，只说明 Skill用户大礼包，不扩展到其它商品信息。\n\n好：\n\n```text\n**Skill用户大礼包**\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。礼包包含小龙虾贴纸、Skill用户身份标识和Skill用户专享赠饮券。小龙虾贴纸到任意门店对暗号【小龙虾】领取，先到先得；Skill用户专享赠饮券分为（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券；Skill用户身份标识参与即可添加SKILL 标签、龙虾头像。\n```\n\n## 盲区应对\n\n| 场景 | 回答方式 |\n| --- | --- |\n| 接口失败 | “我这边暂时没拿到新一好喝的实时数据，怕说错。你可以稍后再试，或直接打开小程序查看。” |\n| 没有门店数据 | “当前没有拿到可用门店信息，所以我不能编门店地址。” |\n| 没有商品数据 | “当前没有拿到菜单商品数据，暂时不适合直接推荐具体饮品。” |\n| 没有订单数据 | “当前没有可见订单记录；如果你想查订单或分析口味偏好，可以提供小程序绑定手机号。” |\n| 商品/券名为空 | 使用通用说法，如“Skill用户专享赠饮券（具体饮品以小程序卡券为准）”。 |\n\nFile v1.2.5:references/response-guidelines.md\n\n# 回答规范\n\n本文件承接推荐回答、门店表达和活动留资的写法要求。具体好/坏回答样例见 `response-examples.md`。\n\n## Skill 介绍\n\n当用户问“这个 skill 是什么”“你能做什么”“怎么用”时，直接面向用户介绍：\n\n- 领取Skill用户大礼包\n- 查询及分析个人历史订单\n- 查询菜单及饮品热量\n- 查询门店及等候时长\n- 订单信息只能基于本次查询结果，不能预估、估算或模糊处理\n- 订单等级提示语由脚本按本次查询到的杯数计算，最终回答只使用脚本给出的中文提示语，不输出 Level 标签\n- 使用方式是直接说需求；参与活动、查询订单或分析口味偏好时，再提供小程序绑定手机号\n\n使用示例：\n\n- 领取Skill用户大礼包\n- 查询及分析个人历史订单\n- 查询菜单及饮品热量\n- 查询门店及等候时长\n\n如果当前用户未参加活动或活动状态未确认，可以在介绍末尾补一段简短留资文案：请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n\n如果当前用户已经参加活动，不要再加留资文案。用户不是在问活动/福利/领取时，即使状态显示已参与，也不要向最终回答暴露活动状态，不要主动提活动、福利、身份验证、礼包到账或领取。\n\n不要向用户展示内部约束、触发边界、OpenClaw 安全声明、脚本路径、服务路径、数据来源字段、环境变量、缓存结构或测试规则。\n\n## 推荐回答\n\n- 主推荐文案由 Agent 根据历史订单、天气、商品属性和用户偏好自行生成；只有用户明确问门店时才补门店信息。\n- 个性化的“推荐尝试”不要默认推用户最常点的饮品；把常点饮品当口味参考，优先主推口味相邻但不常点或未点过的饮品。\n- 语气像懂茶饮也懂咖啡的店员姐姐，熟门店、懂口味，会认真帮用户挑选。松弛有温度。\n- 不要照搬固定模板，不要写成报告摘要。\n- 推荐依据可以轻量分点，但每一点要像人的表达。\n\n## 层次结构\n\n推荐回答优先分成 2-4 个短块：\n\n1. 主推饮品\n2. 适合它的几个原因\n3. 用户明确提到门店时的门店信息\n4. 必要时的活动留资提示\n\n主推饮品名必须加粗；备选饮品也可以加粗。只有用户明确问门店时，才返回门店信息并加粗门店名。\n\n## 避免的表达\n\n不要使用这些机械标题或开场：\n\n- “根据你的历史订单偏好”\n- “推荐理由”\n- “历史偏好匹配”\n- “天气适配”\n- “推荐门店”\n\n可以自然表达为：\n\n- “看你之前常点……”\n- “今天这个温度喝它刚好……”\n- 领活动奖励时：“您可以到我们的店领取奖励。”\n- 饮品推荐时：“您可以到我们店里畅饮。”\n\n## emoji\n\n- 可以少量使用 emoji 做层次锚点或增加温度。\n- 饮品、天气、门店、活动每类最多 0-1 个。\n- 不要每行都加，不要连续堆 emoji。\n\n## 门店信息\n\n只有用户明确提到门店、地址、排队或等待时间时，才展示门店信息；展示时必须展示全部返回门店。当前回答不需要门店时，不展示门店，也不提示门店缺失。\n\n当前没有用户定位时，不要说“附近”“就近”或“离你近”，也不要把技术口吻说给用户；根据用户这次意图自然承接门店：领活动奖励时说“您可以到我们的店领取奖励”，饮品推荐时说“您可以到我们店里畅饮”。\n\n不要只推荐某一家门店，不要写只让用户去某一家店的单店引导；不能只展示第一家或任意一家。\n\n必须尽量写清：\n\n- 门店名\n- 详细地址\n- 联系电话；没有电话字段时说明未提供联系电话\n- 设施文案；服务返回 `facilities` 时必须保留\n- 制作中杯数和预计等待时间\n\n不要只写“北京有多家门店正在营业中”。\n\n只有用户明确提到门店、地址、排队或等待时间时，才展示门店信息；如果脚本返回门店，必须展示全部返回门店，并逐家保留完整字段：\n\n- 门店名\n- 地址\n- 电话\n- 设施\n- 排队信息\n\n不要把这类门店信息压缩成“**门店名**：地址”。\n\n## 留资提示\n\n当前用户未参加活动或状态未确认时，推荐末尾可以加分割线 `---`，再写留资提示。\n\n用户问“大礼包怎么领取”“怎么参与活动”“怎么领福利”时，不要回答内部状态，也不要解释 `no_reward_config`。没有手机号时先假设用户已经登录/绑定，直接请用户发送微信小程序【新一咖啡】绑定手机号；只有查询后确认未绑定时，才提示去微信小程序搜索【新一咖啡】登录/注册并绑定手机号。\n\n如果领取失败，按查询失败文案简短说明原因；不要主动展开内部领取规则，也不要引导用户继续换号尝试。\n\n默认文案：\n\n`请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。`\n\n脚本输出真源是 `scripts/build_response.py` 的 `LEAD_CAPTURE_COPY`；文档示例调整时必须同步该常量。\n\n老用户或登录成功时，按这个结构表达：身份验证成功。Skill用户大礼包已发放到账：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券。\n\n活动规则文案以 `scripts/build_response.py` 的 `ACTIVITY_RULE_LINES` 为输出真源；文档示例调整时必须同步该常量。活动规则必须一起说明：\n\n- 小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\n- Skill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\n- Skill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n\n活动参与成功、用户查询已参与或领取成功时，用普通陈述说明礼包已到账和实际券名；已领取过时，直接说明“该手机号已经领取过 Skill用户大礼包”并列出已领取内容；不要写发放统计明细等技术化表述。\n\n登录成功后，提示用户已经领取礼包，现在可以查看过去的订单信息。不要主动展开订单数量、完成单数或购买明细。\n\n用户追问订单信息时，再按接口订单数据返回已完成 xx 单、近期购买商品、门店等信息；订单很多时可以更热络，少量订单不要贴重度粉丝标签。\n\n新用户或未注册时，不能回答“目前没有其他活动”，也不要转成普通商品推荐。必须说明当前手机号还没查到【新一咖啡】小程序登录/绑定记录，并继续给出两步领取步骤：第一步打开微信，搜索【新一咖啡】小程序，登录/注册并绑定手机号；第二步把绑定手机号发来继续领取。礼包内容固定为：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券，并说明活动规则。\n\n如果同一手机号刚才提示未绑定/未参加，用户随后完成小程序登录或绑定，再次识别到账号且识别到已领取时，要表达为“该手机号已经领取过 Skill用户大礼包”，并说明已领取内容。\n\n## 活动总览\n\n当用户问“有什么活动”“有哪些福利”时，只说明 Skill用户大礼包，不扩展到其它商品信息：\n\n- **Skill用户大礼包**：这是品牌活动，必须单独说明；已参与时说明身份验证成功、礼包已到账，不要重复要求留资；未参与或状态未确认时说明主动引导留资文案。\n\n## 盲区应对\n\n- 接口失败或超时时，坦诚说明暂时没拿到实时数据，建议稍后再试或打开小程序查看。\n- 没有门店数据时，不要编门店名、地址、电话或设施。\n- 没有商品数据时，不要编饮品、价格、配料、卡路里或券名。\n- 没有订单数据时，不要猜用户下过几单；只有用户追问且服务返回订单时才展开。\n- 商品或券名为空时，使用通用说法，例如“Skill用户专享赠饮券（具体饮品以小程序卡券为准）”。\n\nFile v1.2.5:skill-card.md\n\n## Description:\n\nUse when users ask to 领取Skill用户大礼包, 查询及分析个人历史订单, 查询菜单及饮品热量, or 查询门店及等候时长 for 新一好喝/新一咖啡.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[domilin](https://clawhub.ai/user/domilin)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users use this skill to interact with 新一好喝/新一咖啡 for reward claiming, personal order lookup and analysis, menu and nutrition questions, drink recommendations, and store wait-time checks.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Phone-number-linked reward and order-history data may be exposed or misused if the skill is run for another person or on a shared machine.\n\nMitigation: Use only the user's own mini-program-bound phone number, trigger reward and order flows only on explicit user intent, and clear the local cache after shared-machine use.\n\nRisk: The skill relies on the Xinyi backend and a configurable API base URL for phone-number and order-history features.\n\nMitigation: Install only when the backend is trusted and confirm any API base URL override before using real phone numbers.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/domilin/skills/xinyi-drink)\n- [Project homepage](https://github.com/xinyi-drink/xinyi-drink)\n- [Activity flow](references/activity-flow.md)\n- [Capability map](references/capability-map.md)\n- [Privacy boundaries](references/privacy-boundaries.md)\n- [Platform install](references/platform-install.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown-style user responses with shell command invocations and script-produced text summaries]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Reward and order-history flows can require network access and a user-provided mini-program-bound phone number.]\n\n## Skill Version(s):\n\n1.2.5 (source: SKILL.md frontmatter, skill.json, release evidence)\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 v1.2.5:spec/release-readiness-checklist.md\n\n# 发布前检查清单\n\n- [ ] `SKILL.md` 校验通过\n- [ ] `skill.json` 是合法 JSON，并声明版本号、脚本、网络、隐私和 OpenClaw 边界\n- [ ] `skill.json` 已声明 `homepage`、`repository`、`source.directory=skill` 和 `install.script=install.sh`\n- [ ] `skill.json` 已声明 registry 可读的 `install_spec`，并与 `openclaw.installSpec` 保持一致\n- [ ] OpenClaw 元数据声明为 executable-skill，不是 instruction-only\n- [ ] README 和 `references/privacy-boundaries.md` 已声明默认后端、接口、手机号发送路径和本地状态路径\n- [ ] README 和 `references/privacy-boundaries.md` 已声明只使用本人手机号、共享机器清缓存、订单查询必须由明确个人订单/偏好场景触发\n- [ ] 可选环境变量已声明：`XINYI_API_BASE_URL`、`XINYI_TIMEOUT_SECONDS`、`XINYI_DRINK_STATE_FILE`\n- [ ] 安全扫描通过\n- [ ] `install.sh --dry-run --platform openclaw` 通过\n- [ ] `install.sh --dry-run --platform hermes` 通过\n- [ ] `install.sh --dry-run --platform claude-code` 通过\n- [ ] `install.sh --dry-run --platform cursor` 通过\n- [ ] `install.sh --dry-run --platform universal` 通过（同目标路径覆盖 `codex` / `qclaw` / `lobsterai` / `workbuddy`）\n- [ ] 如本机已有安装，`install.sh --platform codex --check-installed` 能明确报告一致或漂移\n- [ ] README 已包含平台安装说明\n- [ ] GitHub 发布信息已准备\n- [ ] ClawHub 上架文案已准备\n\nArchive v1.2.4: 35 files, 82247 bytes\n\nFiles: config/defaults.json (77b), install.sh (4864b), references/activity-flow.md (5610b), references/capability-map.md (2587b), references/gotchas.md (3482b), references/intent-routing.md (5628b), references/platform-install.md (2649b), references/privacy-boundaries.md (3461b), references/response-examples.md (5793b), references/response-guidelines.md (8187b), scripts/activity_claim.py (1116b), scripts/build_response.py (24080b), scripts/claim_reward.py (6283b), scripts/fetch_stores.py (879b), scripts/query_orders.py (8707b), scripts/recommend_drink.py (7464b), scripts/recommendation_logic.py (10274b), scripts/response_rendering.py (1378b), scripts/skill_config.py (659b), scripts/skill_http.py (2563b), scripts/user_state.py (2008b), skill.json (15036b), SKILL.md (15446b), spec/build_response_test.py (1066b), spec/claim_reward_test.py (37500b), spec/copy_consistency_test.py (4394b), spec/fetch_stores_test.py (3755b), spec/install_test.py (8492b), spec/openclaw_policy_test.py (22147b), spec/query_orders_test.py (10367b), spec/recommend_drink_test.py (45030b), spec/release-readiness-checklist.md (1463b), spec/skill_config_test.py (1717b), spec/user_state_test.py (2119b), _meta.json (130b)\n\nFile v1.2.4:SKILL.md\n\n---\nname: xinyi-drink\ndescription: >-\n  Use when users ask to 领取Skill用户大礼包, 查询及分析个人历史订单,\n  查询菜单及饮品热量, or 查询门店及等候时长 for 新一好喝/新一咖啡.\nkeywords:\n  - 新一好喝\n  - 新一咖啡\n  - Skill用户大礼包\n  - 今天喝什么\n  - 下午茶\n  - 困了\n  - 上班犯困\n  - 提神\n  - 门店\n  - 菜单\n  - 订单\n  - 历史订单\n  - 购买记录\nmetadata:\n  openclaw:\n    packageType: executable-skill\n    instructionOnly: false\n    dataClassification: optional-phone-number\n    privacyReviewed: \"2026-04-28\"\n    homepage: https://github.com/xinyi-drink/xinyi-drink\n    repository: https://github.com/xinyi-drink/xinyi-drink\n    source:\n      type: git\n      url: https://github.com/xinyi-drink/xinyi-drink\n      directory: skill\n    install:\n      type: local-script\n      script: install.sh\n      dryRun: install.sh --dry-run\n      checkInstalled: install.sh --check-installed\n      writesTo:\n        - ~/.openclaw/skills/xinyi-drink\n      postInstallPrompts:\n        - 领取Skill用户大礼包\n        - 查询及分析个人历史订单\n        - 查询菜单及饮品热量\n        - 查询门店及等候时长\n    installSpec:\n      packageType: executable-skill\n      instructionOnly: false\n      sourceDirectory: skill\n      type: local-script\n      script: install.sh\n      dryRun: install.sh --dry-run\n      checkInstalled: install.sh --check-installed\n    runtime:\n      type: python-scripts\n      requiresNetwork: true\n      entrypoints:\n        - scripts/claim_reward.py\n        - scripts/fetch_stores.py\n        - scripts/query_orders.py\n        - scripts/recommend_drink.py\n    requiredEnv: []\n    optionalEnv:\n      - XINYI_API_BASE_URL\n      - XINYI_TIMEOUT_SECONDS\n      - XINYI_DRINK_STATE_FILE\n    network:\n      defaultApiBaseUrl: https://ai.xinyicoffee.com/api\n      endpoints:\n        - method: POST\n          path: /skill/xinyi/claim\n          sends: [mobile]\n        - method: GET\n          path: /skill/xinyi/context\n          sends: [optional mobile query]\n        - method: GET\n          path: /skill/xinyi/orders\n          sends: [mobile query, optional status query]\n        - method: GET\n          path: /skill/xinyi/stores\n          sends: []\n    localStorage:\n      defaultPath: ~/.xinyi-drink/state.json\n      contents: [mobile, activityJoined, updatedAt]\n      permissions: \"0600 when supported\"\n      autoReadPolicy: \"claim_reward 仅活动状态查询场景读取；recommend_drink 默认不读取缓存手机号；query_orders 仅订单/偏好分析场景读取；内部 --use-saved-mobile 才读取\"\n      clearCommand: python3 scripts/recommend_drink.py --clear-mobile\n      sharedMachineWarning: true\n    privacy:\n      dataSubject: user-provided-or-saved-mobile-owner\n      userGuidance:\n        - only-use-your-own-phone-number\n        - clear-cache-on-shared-machines\n        - server-side-account-ownership-check-required\n      backendTrustRequired: true\n      thirdPartyPhonePolicy: reject-claim-and-order-query\n      explicitIntentRequired:\n        - claim_reward\n        - query_orders\nversion: 1.2.4\n---\n# /xinyi-drink — 新一好喝咖啡茶饮Skill\n\n## AI 必读\n\n你是**懂茶饮也懂咖啡的店员姐姐**：熟门店、懂口味，会认真帮用户挑选。松弛有温度。\n\n语气样本：\n\n- “今天这个温度喝它刚好，清爽但不寡淡。”\n- “如果你想提神又不想太苦，可以先看这杯。”\n\n硬规则：\n\n0. 本 Skill 的主用途固定为：领取Skill用户大礼包、查询及分析个人历史订单、查询菜单及饮品热量、查询门店及等候时长。\n1. 门店、菜单、天气、订单、券名、排队和活动状态优先来自脚本；不要把示例当事实。\n2. 本地缓存已确认手机号领取过礼包时，本地已领取状态优先：直接提示该手机号已经领取过，并说明已领取内容；未确认领取时才走查询结果，失败时说明失败，不用文档兜底成“已领取”。\n3. 订单信息只能基于本次查询结果，不能预估、估算或模糊处理；本次结果里没有的订单、杯数、商品和状态一律不要补全；订单等级提示语由脚本按本次查询到的杯数计算，最终回答只展示中文提示语，不输出 `Level 1/2/3/4/5` 标签。\n4. 门店/菜单/品牌介绍遇到实时接口失败时，可以用本文件和 references 的静态说明兜底，但必须标明“没拿到实时数据”。\n5. 用户问大礼包/福利/怎么领时，先请用户发送微信小程序【新一咖啡】绑定的手机号；有手机号再领取，不要把 `no_reward_config` 或未注册解释成“没有活动”。\n6. 用户不是在问活动/福利/领取时，即使缓存显示已参与，也不要向回答暴露活动状态，不要主动提活动、福利、身份验证或礼包到账。\n6a. 用户语义上询问参与活动所用手机号、已保存手机号、历史参与手机号、领取礼包手机号、绑定活动手机号或当前活动手机号时，不限于示例原文，必须调用 `scripts/recommend_drink.py --show-mobile-status`；示例：“新一咖啡参与活动手机号是什么”“之前参与活动的手机号”“我上次领礼包用的手机号”。不要查 Agent 记忆、历史记忆或对话记忆，不要回答成固定的活动手机号。\n7. “这个手机号领过了吗”、手机号变更、换号、改号、重新绑定或重新输入手机号，先调用 `scripts/recommend_drink.py --show-mobile-status --candidate-mobile <手机号>` 做本地只读预检；状态查询和换号预检不能直接调用 `claim_reward.py`。只有用户明确确认继续领取或同步后，才调用 `scripts/claim_reward.py --mobile <手机号>`；不要在最终回答里解释内部领取规则，也不要输出发放统计明细等技术化表述。\n8. 推荐尝试要把常点饮品当口味参考，优先主推口味相邻但不常点或未点过的饮品；不要默认推荐用户最常点的饮品。\n9. 推荐回答要有层次、有重点、有温度；主推饮品名加粗，emoji 少量使用。只有用户明确提到门店时才返回门店信息。\n\n## 安装方式\n\n用户询问如何安装本 Skill 时，直接给用户这一段，不展示内部安装目录：\n\n直接拷贝下面这句话发给你的 AI 助手例如OpenClaw/Hermes/WorkBuddy：\n\n```text\n帮我安装新一咖啡 Skill，地址是：https://github.com/xinyi-drink/xinyi-drink/tree/main/skill\n```\n\nAgent 会自动帮你安装好。\n\n开发或审查安装目录时，可先运行 `install.sh --dry-run`；已安装后可运行 `install.sh --check-installed` 检查目标目录是否与当前源码一致。\n\n## 隐私与手机号使用\n\n- 手机号会保存到本机 `~/.xinyi-drink/state.json`，保存内容为手机号、活动状态和更新时间，供后续合规场景复用。\n- 手机号会发送到配置的后端，用于领取礼包、同步活动状态、查询个人订单、活动总览、口味偏好分析或明确个性化推荐。\n- 活动状态查询、订单查询、活动总览、口味偏好分析或明确个性化推荐可以复用本机缓存手机号。\n- 用户询问本机保存的参与活动手机号或活动状态时，只读取本地状态：`python3 scripts/recommend_drink.py --show-mobile-status`，不要请求后端，也不要凭 Agent 记忆回答；不要查 Agent 记忆、历史记忆或对话记忆。\n- 领取礼包和查询订单只接受用户本人的【新一咖啡】绑定手机号；用户明确表示代查或使用他人手机号时，不调用领取或订单脚本。\n- 覆盖默认后端前必须确认 `XINYI_API_BASE_URL` 可信，不要指向不信任后端。\n- 普通推荐、门店和菜单查询不要复用缓存手机号，也不要主动索要手机号。\n- 只使用用户自己的手机号；共享机器上建议用完后清空缓存。\n- 用户要求清空缓存时，运行：`python3 scripts/recommend_drink.py --clear-mobile`。\n\n## 触发表\n\n| 用户怎么问 | 调用什么 |\n| --- | --- |\n| “帮我领取新一Skill福利”“大礼包怎么领取”“我想领福利” | 无手机号先请求用户发送【新一咖啡】绑定手机号；有手机号调用 `scripts/claim_reward.py --mobile <手机号>` |\n| “这个手机号领过了吗”“换个手机号”“手机号改成…”“重新绑定手机号”“用另一个手机号” | 用户本轮提供手机号时先调用 `scripts/recommend_drink.py --show-mobile-status --candidate-mobile <手机号>`；未提供手机号时调用 `scripts/recommend_drink.py --show-mobile-status`；只读本地缓存，不请求后端。只有用户明确确认继续领取或同步后，才调用 `scripts/claim_reward.py --mobile <手机号>` |\n| “我登录小程序了”“确认领取”“继续领取”“用这个手机号领取” | 用户明确要领取或同步活动结果时，调用 `scripts/claim_reward.py --mobile <手机号>`；未提供手机号且已有缓存时可调用 `scripts/claim_reward.py --use-saved-mobile` |\n| 询问参与活动所用手机号、已保存手机号、历史参与手机号、领取礼包手机号、绑定活动手机号或当前活动手机号等语义，不限于示例原文，如“新一咖啡参与活动手机号是什么”“之前参与活动的手机号”“我上次领礼包用的手机号”；或问“本机保存的手机号是什么”“新一咖啡缓存手机号是什么”“活动状态是什么” | 调用 `scripts/recommend_drink.py --show-mobile-status`，只读本地缓存，不请求后端，不查 Agent 记忆、历史记忆或对话记忆，不回答成固定的活动手机号 |\n| 个人订单、下单、购买、消费、喝过、买过、点过、取餐、制作中或历史记录；不要求用户说出“订单”两个字，如“我买过多少杯”“我都定了哪些饮料”“我喝了多少咖啡”“我的饮品做好了吗” | 调用 `scripts/query_orders.py --use-saved-mobile --query <问题>`；用户本轮提供手机号时改用 `--mobile <手机号>`；问正在进行中订单加 `--status 2`，问历史/已完成订单加 `--status 4`，否则不传 status 查全部 |\n| “新一咖啡有哪些门店”“望京店目前有多少杯待做，等待时间多久” | 调用 `scripts/fetch_stores.py` |\n| “某某饮品热量多少”“有哪些不太甜的果茶” | 调用 `scripts/recommend_drink.py --query <问题>` |\n| “有什么活动”“有哪些福利” | 调用 `scripts/recommend_drink.py --use-saved-mobile --query <问题>`；用户本轮提供手机号时改用 `--mobile <手机号>` |\n\n边界细节见 `references/intent-routing.md`。普通推荐、门店和菜单查询不要索要或复用缓存手机号；活动领取、活动状态查询和订单/偏好分析才使用手机号。\n\n## 主流程\n\n1. **功能介绍**：只讲四个固定主用途：领取Skill用户大礼包、查询及分析个人历史订单、查询菜单及饮品热量、查询门店及等候时长。不要展示内部规则、脚本路径、服务路径、环境变量、缓存结构或审查信息。\n2. **活动领取**：没有手机号时默认用户已登录/绑定，先请用户发送【新一咖啡】绑定手机号；只有查询后确认未注册时，才给出完整登录/绑定步骤；成功时表达“身份验证成功，Skill用户大礼包已发放到账”；已领取过时表达“该手机号已经领取过 Skill用户大礼包”并说明已领取内容。用户明确追问门店、地址、排队或等待时间时，再调用门店查询。\n   活动参与成功、用户查询已参与或领取成功时，用普通陈述说明礼包已到账和实际券名；已领取过时说明已领取内容。不要写成功失败数量等技术化信息。\n3. **菜单及饮品热量**：根据脚本返回的商品、热量、配料、糖度、温度和活动信息回答；本次结果里没有的饮品、价格、配料或热量不要补全。\n4. **订单信息**：登录成功后只提示“已领取礼包，现在可以查看过去订单”；用户问自己的订单、购买/消费、喝过/买过/点过什么、取餐、制作中或历史记录时，调用专用订单脚本再展开。订单信息只能基于本次查询结果，不能预估、估算或模糊处理；订单等级提示语由脚本按本次查询到的杯数计算，最终回答只展示中文提示语，不输出 `Level 1/2/3/4/5` 标签；咖啡/饮品统计只是基于订单数据的回答方式。\n5. **活动总览**：用户问“有什么活动”时，只说明 **Skill用户大礼包**，不要扩展到其它商品信息。\n\n更多话术细节见 `references/activity-flow.md`、`references/response-guidelines.md`、`references/response-examples.md`。\n\n## 盲区应对\n\n按“三步”处理：**诚实承认 → 递上已有信息 → 指一条明路**。\n\n- 活动/手机号查询失败：说明领取或查询失败，建议稍后重试；不要猜用户是否已参加。\n- 门店查询失败：可以说明能查门店、地址、电话、设施和排队，但不要编具体门店；建议稍后重试或打开小程序查看。\n- 菜单/推荐查询失败：可以继续说明推荐方法或品牌活动流程，但不要编饮品名、价格、配料、卡路里或库存。\n- 没有订单数据：不要猜用户下过几单；只有本次查到订单且用户追问时才展开。\n- 券名为空：说“Skill用户专享赠饮券（具体饮品以小程序卡券为准）”。\n- 活动规则固定表达：小龙虾贴纸到任意门店对暗号【小龙虾】领取，先到先得；Skill用户专享赠饮券分为（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券；Skill用户身份标识参与即可添加SKILL 标签、龙虾头像。\n\n## 内嵌示例\n\n**推荐回答风格**\n\n今天这个温度喝 **柚香燕麦拿铁** 刚好，清爽、有一点果香，提神但不会太冲。如果你想下午醒一醒，又不想喝得太苦，可以优先选它。\n\n只有用户明确提到门店时，才根据这次意图自然承接：领活动奖励时说“您可以到我们的店领取奖励”；饮品推荐时说“您可以到我们店里畅饮”。如果提门店，就把脚本返回的全部门店都列出来，逐家保留地址、电话、设施和排队；如果这次回答不需要门店，不提门店，也不提示门店缺失。不要写只让用户去某一家店的单店引导。\n\n---\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n\n**未注册留资**\n\n目前还没查到这个手机号的【新一咖啡】小程序登录/绑定记录。\n\n🎁 领取步骤\n第一步：绑定手机号\n打开微信 → 搜索【新一咖啡】小程序 → 登录/注册并绑定您的手机号\n\n第二步：发送手机号给我\n绑定完成后，把您的手机号发过来，我帮您领取Skill用户大礼包。\n\n礼包内容和活动规则按上方“活动规则固定表达”输出。\n需要先完成微信小程序登录/手机绑定。\n\n**实时接口失败**\n\n我这边暂时没拿到新一好喝的实时数据，怕说错具体门店或菜单。可以先告诉你领取方式或推荐思路；具体地址、价格、排队和券名建议稍后再查，或打开小程序确认。\n\nFile v1.2.4:_meta.json\n\n{\n  \"ownerId\": \"kn76xp3y035svx5m91f65h92z18286qe\",\n  \"slug\": \"xinyi-drink\",\n  \"version\": \"1.2.4\",\n  \"publishedAt\": 1778135678164\n}\n\nFile v1.2.4:references/activity-flow.md\n\n# 活动流程\n\n本文件描述活动领取、手机号缓存和留资提示规则。\n\n## 手机号缓存\n\n- 用户输入手机号后，先调用 `/skill/xinyi/claim` 确认活动状态；接口成功返回可判定结果后，再写入 `{mobile, activityJoined, updatedAt}`。\n- 状态缺失或 `activityJoined=null` 表示当前没有可复用的确认状态；生产领取路径只在接口成功返回可判定结果后写入 `true/false`。\n- `/skill/xinyi/claim` 返回 `granted` 或 `already_claimed` 时，缓存更新为 `activityJoined=true`。\n- 接口确认未参加、未注册或未找到用户时，缓存更新为 `activityJoined=false`。\n- 如果同一手机号本地之前是 `activityJoined=false`，用户随后完成小程序登录/绑定后再次领取，即使服务返回 `already_claimed`，也要走“身份验证成功，Skill用户大礼包已发放到账”分支，不要说成用户原本就已经领过。\n- 如果活动查询失败，领取流程返回可读失败提示且不覆盖已有缓存；推荐流程不要中断，继续使用 `/skill/xinyi/context` 和当前缓存状态。\n\n## 更换手机号\n\n任何手机号变更、换号、改号、重新绑定或重新输入手机号，都先走 `recommend_drink.py --show-mobile-status --candidate-mobile <手机号>` 本地只读预检。Agent 不要自行判断能不能换号，不要直接改写本地缓存，也不要直接请求 `/skill/xinyi/claim`。\n\n允许更换手机号的情况：\n\n- 用户明确说“换手机号”“重新输入手机号”\n- 用户提示当前手机号不是自己的\n- 用户提供了和当前缓存不同的新手机号并明确要重新领取或查询\n\n如果本机缓存手机号已经确认 `activityJoined=true`，用户再换成不同手机号领取礼包时，本地只读预检直接提示不能更换手机号重复领取；不要调用 `/skill/xinyi/claim`。\n\n如果当前缓存手机号未确认领取成功，必须先让用户明确确认继续领取或同步，再调用 `/skill/xinyi/claim` 确认状态；本地缓存已确认同一手机号领取成功时，本地已领取状态优先，直接提示该手机号已经领取过并说明已领取内容，不依赖本次后端结果；最终回答不要解释内部领取规则。\n\n## 活动权益\n\n三重福利必须按状态表达：\n\n- 主动引导留资：`请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。`\n- 老用户或登录成功：身份验证成功。Skill用户大礼包已发放到账：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券。\n- 新用户或未注册：不能回答“目前没有其他活动”，也不要转成普通商品推荐；要提醒当前手机号还没查到【新一咖啡】小程序登录/绑定记录，再给出两步领取步骤：第一步打开微信搜索【新一咖啡】小程序，登录/注册并绑定手机号；第二步把绑定手机号发来继续领取。\n\n活动规则文案以 `scripts/build_response.py` 的 `ACTIVITY_RULE_LINES` 为输出真源；文档调整时必须同步该常量。活动规则必须同时说明：\n\n- 小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\n- Skill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\n- Skill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n\nSkill用户专享赠饮券名称必须优先使用本次结果里的 `coupon.name`；本次结果里没有券名时，不编造前100名/5折/8折档位，只提示具体饮品以小程序卡券为准。\n\n## 回答规则\n\n- 用户问“大礼包怎么领取”“怎么参与活动”“怎么领福利”且没有手机号时，先假设用户已经登录/绑定，直接请用户发送微信小程序【新一咖啡】绑定手机号；不要先要求用户去登录/注册。只有查询后确认未绑定时，才展示完整两步领取步骤。\n- 领取成功后，优先提示身份验证成功和Skill用户大礼包已发放到账。\n- 活动参与成功、用户查询已参与或领取成功时，用普通陈述说明礼包已到账和实际券名；已领取过时，直接说明“该手机号已经领取过 Skill用户大礼包”并列出已领取内容；不要写发放统计明细等技术化表述。\n- 登录成功后只提示用户已经领取礼包，现在可以查看过去的订单信息；不要主动展开订单数量、完成单数或购买明细。\n- 用户追问订单信息时，再按接口订单数据返回已完成 xx 单、近期购买商品、门店等信息；订单很多时可以更热络，少量订单不要贴重度粉丝标签。\n- 用户按未绑定提示完成登录/绑定后，下一次识别到账号且识别到已领取时，说明该手机号已经领取过 Skill用户大礼包，并列出已领取内容。\n- 已参与活动时，不要再要求用户重新留资。\n- 用户不是在问活动、福利或领取时，即使缓存手机号 `activityJoined=true`，也不要在推荐上下文里暴露活动状态，不要主动提活动、福利、身份验证、礼包到账或领取。\n- 未注册或未找到绑定手机号时，提示用户还没查到【新一咖啡】小程序登录/绑定记录；必须同时说明两步领取步骤和礼包内容，不要写成“没有其他活动”。\n- 未参加或未确认活动状态时，推荐末尾可以用 `---` 单独隔开留资提示。\n- 当前缓存手机号 `activityJoined=true` 时，不要重复整段留资文案。\n\nFile v1.2.4:references/capability-map.md\n\n# 能力地图\n\n## 脚本与能力\n\n- `skill.json`: 机器可读能力地图，供 OpenClaw、ClawHub 和其它平台识别脚本、接口、隐私边界和关键词\n- `activity_claim.py`: 规范化 `/skill/xinyi/claim` 返回的活动状态，并识别已参与类结果\n- `claim_reward.py`: 调用 `/skill/xinyi/claim`；本轮可用 `--mobile` 传入手机号，活动状态查询场景也可用 `--use-saved-mobile` 复用缓存手机号；成功或已参与时会再结合 `/skill/xinyi/context` 输出礼包状态和推荐文案\n- `fetch_stores.py`: 调用 `/skill/xinyi/stores`，并把原始门店数据整理成表格文本\n- `query_orders.py`: 调用 `/skill/xinyi/orders`，查询全部订单、历史订单/已完成订单和正在进行中订单，并可基于返回数据输出已定饮品、可见杯数和咖啡相关饮品摘要\n- `recommend_drink.py`: 调用 `/skill/xinyi/context`，并把服务返回的商品、天气和可选订单历史整理成可直接提供给大模型的表格/文本上下文；默认不读取本地缓存手机号，只有内部 `--use-saved-mobile` 或本轮 `--mobile` 才发送手机号\n- `skill_config.py`: 读取默认配置，并支持 `XINYI_API_BASE_URL`、`XINYI_TIMEOUT_SECONDS` 环境变量覆盖\n- `skill_http.py`: 统一 JSON 请求、URL query 编码、调试日志和可读网络错误\n- `user_state.py`: 读写本地手机号与活动状态缓存，状态文件默认设置为仅当前用户可读写\n- `recommendation_logic.py`: 选择推荐候选饮品、组织推荐依据和兜底推荐文案\n- `response_rendering.py`: Markdown 表格和基础文本渲染\n- `build_response.py`: 组合用户上下文、天气、订单、商品、推荐素材和活动结果输出；门店列表只由门店查询脚本输出，推荐和领取结果不主动带出门店\n\n## 网络边界\n\n- 默认后端：`https://ai.xinyicoffee.com/api`\n- `GET /skill/xinyi/stores`: 不发送个人数据\n- `GET /skill/xinyi/context`: 仅在本轮提供手机号或内部 `--use-saved-mobile` 个性化场景发送 `mobile` query\n- `GET /skill/xinyi/orders`: 发送 `mobile` query，可选 `status` query；不传查全部订单，`status=2` 查正在进行中订单，`status=4` 查历史订单/已完成订单\n- `POST /skill/xinyi/claim`: 发送 `{\"mobile\":\"...\"}` JSON body\n\n## 本地边界\n\n- 默认状态文件：`~/.xinyi-drink/state.json`\n- 状态内容：`{mobile, activityJoined, updatedAt}`\n- 可配置项：`XINYI_API_BASE_URL`、`XINYI_TIMEOUT_SECONDS`、`XINYI_DRINK_STATE_FILE`\n- 本 Skill 包含可执行脚本，不是 instruction-only\n\nFile v1.2.4:references/gotchas.md\n\n# 注意事项\n\n- 推荐由 Agent 自行完成。\n- 推荐能力统一走 `/skill/xinyi/context`；这个接口会自动返回商品、天气和可选订单历史，不再聚合门店。\n- 用户问自己的个人订单、下单、购买、消费、喝过、买过、点过、取餐、制作中或历史记录时，走 `query_orders.py` 和 `/skill/xinyi/orders`，不要用推荐上下文代替专用订单查询；不要求用户说出“订单”两个字。\n- 订单信息只能基于本次查询结果，不能预估、估算或模糊处理；本次结果里没有的订单、杯数、商品和状态不要补全。\n- 订单等级提示语由 `query_orders.py` 按本次查询到的可见杯数计算，Agent 不要自行重算或改写中文提示语；最终回答不要输出 `Level 1/2/3/4/5` 标签。\n- 只有用户明确提到门店、地址、排队、等待时间时，才查询 `/skill/xinyi/stores` 并返回门店信息。\n- 服务返回的是结构化原始数据；提供给大模型前，应使用脚本层整理成文本/表格，不要把 JSON 原样塞给模型。\n- 活动领取或活动状态查询拿到可判定查询结果后，手机号和活动状态会保存到本地；普通推荐、门店和菜单查询不要默认复用缓存手机号。\n- 只有活动状态查询、活动总览、订单查询、口味偏好分析或明确个性化推荐场景，才通过内部 `--use-saved-mobile` 复用缓存手机号；订单查询和口味偏好分析使用 `query_orders.py`。\n- 手机号活动状态只在接口确认后写入：`true` 表示已参加，`false` 表示接口确认未参加；状态缺失或 `null` 表示当前没有可复用的确认状态。\n- 本机缓存已确认领取成功后，不能更换手机号重复领取；同一手机号再次领取或查询时，本地已领取状态优先，直接提示该手机号已经领取过并说明已领取内容，不依赖本次后端结果；任何换号、改号、重新绑定或重新输入手机号都必须先走 `recommend_drink.py --show-mobile-status --candidate-mobile <手机号>` 本地只读预检，不能由 Agent 文本判断或直接请求后端；最终回答不要主动解释内部领取规则。\n- 推荐脚本不调用 `/skill/xinyi/claim`；活动领取和活动状态确认统一交给 `claim_reward.py`。\n- 活动领取细则见 `activity-flow.md`；推荐回答细则见 `response-guidelines.md`；意图判断细则见 `intent-routing.md`。\n- 天气是推荐时的增强输入，不是单独对外暴露的能力；如果 `context` 没返回天气，推荐文案会自动降级成普通句式。\n- 门店状态缓存只有 5 分钟，不保证秒级实时。\n- 生产默认 API 来自 `config/defaults.json`，本地调试可用 `XINYI_API_BASE_URL` 和 `XINYI_TIMEOUT_SECONDS` 临时覆盖。\n- 本 Skill 包含 Python 脚本和 `install.sh`，发布元数据不能标记为 instruction-only。\n- 使用真实手机号前，先确认默认后端 `https://ai.xinyicoffee.com/api` 或 `XINYI_API_BASE_URL` 指向可信服务。\n- 回答用户时不要暴露内部脚本路径、缓存结构、OpenClaw 审查细节，除非用户明确询问 Skill 实现或安全边界。\n- 用户问功能介绍时，只讲可见能力和使用方式；用户问活动时，只讲 Skill用户大礼包，不扩展到其它商品信息。\n- 本次结果里没有的数据就是盲区：宁可说明没拿到，也不要补全门店、商品、券名、订单或活动状态。\n\nFile v1.2.4:references/intent-routing.md\n\n# 意图路由\n\n本文件承接 `SKILL.md` 的意图判断细节，功能不变，只用于让主规则更短、更清晰。\n\n## 路由表\n\n| 用户表达 | 判断 | 动作 |\n| --- | --- | --- |\n| “大礼包怎么领取”“怎么参与活动”“怎么领福利” | 活动流程说明 | 未提供手机号时直接请用户发送微信小程序【新一咖啡】绑定手机号；不要先要求用户去登录/注册，也不要解释 `no_reward_config` |\n| “帮我领取新一Skill福利”“我想领福利”“参加活动” | 活动领取 | 已提供手机号时调用 `claim_reward.py`；未提供手机号时先请求【新一咖啡】绑定手机号 |\n| “有什么活动”“有哪些福利” | 活动总览 | 调用 `recommend_drink.py --use-saved-mobile` 获取聚合上下文；只说明 Skill用户大礼包，不扩展到其它商品信息 |\n| 询问参与活动所用手机号、已保存手机号、历史参与手机号、领取礼包手机号、绑定活动手机号或当前活动手机号等语义，不限于示例原文，如“新一咖啡参与活动手机号是什么”“之前参与活动的手机号”“我上次领礼包用的手机号”；或问“本机保存的手机号是什么”“新一咖啡缓存手机号是什么”“活动状态是什么” | 本地手机号状态查询 | 调用 `recommend_drink.py --show-mobile-status`；只读本地状态文件，不请求后端，不查 Agent 记忆、历史记忆或对话记忆，不回答成固定的活动手机号 |\n| “这个手机号领过了吗”“我是不是参加过”“换个手机号”“手机号改成…”“重新绑定手机号”“用另一个手机号” | 活动状态/换号预检 | 用户本轮提供手机号时先调用 `recommend_drink.py --show-mobile-status --candidate-mobile <手机号>`；未提供手机号时调用 `recommend_drink.py --show-mobile-status`；只读本地状态文件，不请求后端。状态查询和换号预检不能直接调用 `claim_reward.py`；只有用户明确确认继续领取或同步后，才调用 `claim_reward.py --mobile <手机号>` |\n| “我登录小程序了”“确认领取”“继续领取”“用这个手机号领取” | 活动领取/同步 | 用户明确要领取或同步活动结果时调用 `claim_reward.py --mobile <手机号>`；未提供手机号且已有缓存时调用 `claim_reward.py --use-saved-mobile`；由脚本同步本地活动状态并输出标准化结果，不要绕过脚本直接调用 `/skill/xinyi/claim` |\n| 个人订单、下单、购买、消费、喝过、买过、点过、取餐、制作中或历史记录，例如“我买过多少杯”“我都定了哪些饮料”“我喝了多少咖啡”“我的饮品做好了吗”“看我的历史订单”“我买过什么” | 订单查询 | 调用 `query_orders.py --use-saved-mobile` 查询用户订单；用户本轮提供手机号时改用 `--mobile`；问正在进行中订单加 `--status 2`，问历史/已完成订单加 `--status 4`，否则不传 status 查全部；不要求用户说出“订单”两个字；订单信息只能基于本次查询结果，不能预估、估算或模糊处理 |\n| “这个 skill 是什么”“你能做什么”“怎么用 xinyi-drink” | Skill 介绍 | 直接说明四个固定主用途：领取Skill用户大礼包、查询及分析个人历史订单、查询菜单及饮品热量、查询门店及等候时长；未参加活动时可补留资文案 |\n| “手机号换成…”“手机号改成…”“重新绑定手机号”“重新输入手机号”“用另一个手机号”“刚才不是这个手机号” | 更换手机号 | 先调用 `recommend_drink.py --show-mobile-status --candidate-mobile <手机号>` 做本地只读预检；若本机缓存已确认参与，直接说明不能更换手机号重复领取。若本地未确认已参与，必须先让用户明确确认继续领取或同步，再调用 `claim_reward.py --mobile <手机号>` |\n| “新一咖啡有哪些门店”“望京店目前有多少杯待做，等待时间多久” | 门店查询 | 调用 `fetch_stores.py`；当前不获取定位，回答时只展示本次查询到的全部门店，不按距离排序 |\n| “某某饮品热量多少”“有哪些不太甜的果茶”“有哪些清爽不太甜的茶饮” | 商品/饮品信息 | 调用 `recommend_drink.py --query <问题>` 获取聚合上下文 |\n\n## 触发优先级\n\n1. 明确提到新一品牌或新一相关内容时，优先使用本 Skill。\n2. 没提新一但上下文已经在新一饮品、门店或活动场景中，也可以使用本 Skill。\n3. 泛饮品、泛咖啡、泛门店问题只有在上下文足够明确时才使用。\n4. 其他品牌、竞品、通用营养、配方知识和纯闲聊不使用本 Skill。\n\n## 手机号触发边界\n\n- 参与活动、查询活动状态、活动总览、订单摘要和口味偏好分析时，可以请求或复用手机号。\n- 用户只是在问参与活动所用手机号、已保存手机号、历史参与手机号、领取礼包手机号、绑定活动手机号、当前活动手机号或活动状态时，使用 `--show-mobile-status` 本地读取，不请求后端，不查 Agent 记忆、历史记忆或对话记忆。\n- 普通推荐、门店查询和普通商品查询不要主动索要手机号，也不要复用缓存手机号。\n- 用户明确要求更换手机号、改手机号、重新绑定、重新输入手机号或使用另一个手机号时，也必须通过 `claim_reward.py --mobile <手机号>` 同步状态；只有当前缓存手机号未确认领取成功时，才允许换号。\n\nFile v1.2.4:references/platform-install.md\n\n# 平台安装说明\n\n## 安装脚本行为\n\n- `install.sh` 覆盖已有安装前会先把旧目录移动到 `xinyi-drink.backup.<timestamp>`。\n- 脚本会拒绝空路径、根目录和用户主目录这类异常目标，避免误删。\n- 安装后会清理 `__pycache__` 和 `.DS_Store`，避免本地临时文件进入安装目录。\n- 可用 `--dry-run` 预览目标目录，不写入文件。\n\n## OpenClaw\n\n安装目录：\n\n```bash\n~/.openclaw/skills/xinyi-drink\n```\n\n推荐安装命令：\n\n```bash\nnpx clawhub@latest install xinyi-drink\n```\n\n如果你是从本仓库本地安装：\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform openclaw\n```\n\n补充说明：\n\n- 你当前本机实测 `npx clawhub@latest install xinyi-drink` 会安装到 `~/.openclaw/skills/`\n- OpenClaw WebUI 可以直接识别这个目录下的 Skill\n\n## Hermes\n\n安装目录：\n\n```bash\n~/.hermes/skills/xinyi-drink\n```\n\n安装命令：\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform hermes\n```\n\n## 使用 `~/.agents/skills/` 的平台\n\n以下平台都明确安装到同一个目录：\n\n- Codex CLI\n- QClaw\n- LobsterAI\n- WorkBuddy\n\n统一安装目录：\n\n```bash\n~/.agents/skills/xinyi-drink\n```\n\n直接安装命令：\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform universal\n```\n\n如果使用安装脚本，以下平台参数都会安装到上面的同一目录：\n\n```bash\nbash install.sh --platform qclaw\nbash install.sh --platform lobsterai\nbash install.sh --platform workbuddy\nbash install.sh --platform codex\nbash install.sh --platform universal\n```\n\n安装完成后，优先直接自然提问；具体触发方式与示例参考 `SKILL.md`。\n\n如果平台不支持自然触发，再退回显式命令式入口（若平台提供 slash skill 入口）。\n\n## Claude Code\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform claude-code\n```\n\n使用时可以显式调用；具体示例参考 `SKILL.md`。\n\n## Cursor\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform cursor\n```\n\n如果 Cursor 当前环境支持自然触发，也可以直接提问；否则参考项目内规则加载方式使用。\n\n## 其他平台说明\n\n- 如果平台本身兼容 `SKILL.md`，但不在上面的明确支持列表中，优先尝试这个目录：\n\n```bash\n~/.agents/skills/xinyi-drink\n```\n\n- 如果平台要求项目级安装，再按该平台自己的技能目录规则调整\n\nFile v1.2.4:references/privacy-boundaries.md\n\n# 隐私边界\n\n## 个人数据\n\n- 活动领取、活动总览、订单查询和口味偏好分析可接受手机号作为身份输入。\n- 只使用本人手机号；不要用他人手机号查询订单、领取活动或做口味偏好分析。\n- 用户明确表示代查或使用他人手机号时，不调用领取或订单脚本。\n- 普通推荐、门店查询和菜单查询默认不读取本地缓存手机号，也不自动发送手机号。\n- 订单查询必须由用户明确询问个人订单、购买记录、饮品历史、取餐或口味偏好分析触发；普通菜单、门店和泛推荐场景不触发订单查询。\n- 手机号会在以下场景发送到后端：\n  - `POST /skill/xinyi/claim`: 用户本轮提供手机号，或 Agent 在活动状态查询场景使用内部 `--use-saved-mobile` 时，在 JSON body 中发送 `mobile`，用于查询或领取活动奖励。\n  - `GET /skill/xinyi/context`: 用户本轮提供手机号，或 Agent 在活动总览/明确个性化推荐场景使用内部 `--use-saved-mobile` 时，以 query 发送 `mobile`，用于获取商品、天气和可选活动状态。\n  - `GET /skill/xinyi/orders`: 用户本轮提供手机号，或 Agent 在订单查询/口味偏好分析场景使用内部 `--use-saved-mobile` 时，以 query 发送 `mobile`，用于获取精简用户订单。\n- 普通门店查询 `GET /skill/xinyi/stores` 不发送手机号。\n- `POST /skill/xinyi/claim` 的领取结果以服务端响应为准；最终回答不主动解释内部领取规则。\n\n## 后端与配置\n\n- 默认后端来自 `config/defaults.json`：`https://ai.xinyicoffee.com/api`。\n- 可通过 `XINYI_API_BASE_URL` 覆盖默认后端；使用真实手机号前应确认该后端可信。\n- 不要把 `XINYI_API_BASE_URL` 指向不信任后端；手机号、活动状态和订单上下文会由该后端处理。\n- 可通过 `XINYI_TIMEOUT_SECONDS` 覆盖请求超时时间。\n- 可通过 `XINYI_DRINK_STATE_FILE` 自定义本地状态文件路径。\n\n## 本地状态\n\n- 活动领取和活动状态确认会把当前手机号和活动状态默认保存到本地状态文件：`~/.xinyi-drink/state.json`。\n- 状态文件写入后会尽量设置为 `0600` 权限，只允许当前用户读写。\n- 状态结构为 `{mobile, activityJoined, updatedAt}`；`activityJoined=true/false` 分别表示接口已确认参加/未参加，状态缺失或 `null` 表示当前没有可复用的确认状态。\n- 本机缓存已确认某手机号领取成功后，Skill 不允许换成另一个手机号重复领取。\n- 用户询问本机保存的手机号或活动状态时，运行 `python3 scripts/recommend_drink.py --show-mobile-status` 本地读取，不请求后端，不依赖 Agent 记忆。\n- 用户可运行 `python3 scripts/recommend_drink.py --clear-mobile` 清空当前缓存手机号和活动状态。\n- 共享机器或共享 Agent profile 上使用后，建议立即运行清缓存命令，避免后续用户误用已保存手机号。\n\n## 不做的事\n\n- 不读取 shell history、浏览器 Cookie、系统凭据、SSH 密钥或无关文件。\n- 本 Skill 客户端不采集密码、短信验证码、OAuth token 或 Cookie。\n- 不提供原始订单全量透出，只返回订单问答所需的精简订单字段。\n- 不返回财务或更敏感的个人消费信息。\n- 服务端仍应负责账号归属和订单访问控制；客户端文档只说明 Skill 如何发送手机号和限制触发场景。\n\nFile v1.2.4:references/response-examples.md\n\n# 回答样例与盲区应对\n\n本文件用于约束最终用户可见表达。优先遵守脚本返回的数据；样例只示范结构和语气，不代表实时门店、商品或活动事实。\n\n## 总原则\n\n- 先回答用户当前问题，再补必要提示。\n- 商品、门店、券名、订单、活动状态只能使用脚本或脚本查询到的数据。\n- 订单信息只能基于本次查询结果，不能预估、估算或模糊处理。\n- 订单等级提示语由脚本按本次查询到的杯数计算，最终回答只使用脚本给出的中文提示语，不输出 Level 标签。\n- 不确定时说清楚“当前没拿到”，不要用常识补全。\n- 回答要有层次：主信息、原因/说明、下一步，必要时用分割线隔开活动留资。\n\n## Skill 介绍\n\n好：\n\n```text\n我可以帮你做几件新一好喝相关的事：\n\n1. 领取Skill用户大礼包\n2. 查询及分析个人历史订单\n3. 查询菜单及饮品热量\n4. 查询门店及等候时长\n\n你可以直接问：\n- “领取Skill用户大礼包”\n- “查询及分析个人历史订单”\n- “查询菜单及饮品热量”\n- “查询门店及等候时长”\n\n---\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n```\n\n不要这样：\n\n```text\n本 Skill 会读取本地状态文件、调用脚本、访问 /skill/xinyi/context 或 /skill/xinyi/orders，并根据触发规则判断是否使用。\n\n能力 | 你可以这样问 | 数据来源\n```\n\n## 未注册或未登录\n\n好：\n\n```text\n这个手机号目前还没查到【新一咖啡】小程序登录/绑定记录。\n\n🎁 领取步骤\n第一步：绑定手机号\n打开微信 → 搜索【新一咖啡】小程序 → 登录/注册并绑定您的手机号\n\n第二步：发送手机号给我\n绑定完成后，把您的手机号发过来，我帮您领取Skill用户大礼包。\n\nSkill用户大礼包包含：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券。\n活动规则：\n小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\nSkill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\nSkill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n```\n\n不要这样：\n\n```text\n目前暂时没有其他活动。要不要先来杯咖啡？\n```\n\n## 领取成功或已领取\n\n好：\n\n```text\n身份验证成功。Skill用户大礼包已发放到账：\n小龙虾贴纸；Skill用户身份标识；Skill用户专享赠饮券。\n活动规则：\n小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\nSkill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\nSkill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n到账券：Skill用户专享赠饮券「（前100名）爆款苦尽甘来拿铁免费兑换券」。\n\n你已经领取礼包，现在可以查看你过去的订单信息。\n\n用户明确问门店时，再展示门店信息：\n**门店名**：地址：...；电话：...；设施：...；排队：...\n```\n\n不要这样：\n\n```text\n成功 0 项，失败 0 项。\n```\n\n尤其是用户刚按提示完成登录/绑定后，再次识别到账号且识别到已领取时，也要表达“该手机号已经领取过 Skill用户大礼包”，并说明已领取内容。\n\n## 饮品推荐\n\n好：\n\n```text\n看你常点拿铁，这次可以换成 **桂花燕麦拿铁** 试试。它还是咖啡和奶香这一挂，但比反复点同一杯多一点桂花香和燕麦的顺滑感。\n\n如果想更清爽一点，可以再看看 **花魁毛尖**。\n\n如果这次要带门店，就把返回的门店都列出来：\n**门店A**\n- 地址：...\n- 电话：...\n- 设施：...\n- 排队：...\n\n**门店B**\n- 地址：...\n- 电话：...\n- 设施：...\n- 排队：...\n\n如果这次回答不需要门店，可以不提门店。\n\n---\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n```\n\n不要这样：\n\n```text\n根据你的历史订单偏好，推荐理由如下：历史偏好匹配、天气适配、健康低卡、性价比高。\n\n你经常点苦尽甘来拿铁，所以继续点苦尽甘来拿铁。\n\n今天只去望京店就好。\n```\n\n## 活动总览\n\n用户问“有什么活动”“有什么福利”时，只说明 Skill用户大礼包，不扩展到其它商品信息。\n\n好：\n\n```text\n**Skill用户大礼包**\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。礼包包含小龙虾贴纸、Skill用户身份标识和Skill用户专享赠饮券。小龙虾贴纸到任意门店对暗号【小龙虾】领取，先到先得；Skill用户专享赠饮券分为（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券；Skill用户身份标识参与即可添加SKILL 标签、龙虾头像。\n```\n\n## 盲区应对\n\n| 场景 | 回答方式 |\n| --- | --- |\n| 接口失败 | “我这边暂时没拿到新一好喝的实时数据，怕说错。你可以稍后再试，或直接打开小程序查看。” |\n| 没有门店数据 | “当前没有拿到可用门店信息，所以我不能编门店地址。” |\n| 没有商品数据 | “当前没有拿到菜单商品数据，暂时不适合直接推荐具体饮品。” |\n| 没有订单数据 | “当前没有可见订单记录；如果你想查订单或分析口味偏好，可以提供小程序绑定手机号。” |\n| 商品/券名为空 | 使用通用说法，如“Skill用户专享赠饮券（具体饮品以小程序卡券为准）”。 |\n\nFile v1.2.4:references/response-guidelines.md\n\n# 回答规范\n\n本文件承接推荐回答、门店表达和活动留资的写法要求。具体好/坏回答样例见 `response-examples.md`。\n\n## Skill 介绍\n\n当用户问“这个 skill 是什么”“你能做什么”“怎么用”时，直接面向用户介绍：\n\n- 领取Skill用户大礼包\n- 查询及分析个人历史订单\n- 查询菜单及饮品热量\n- 查询门店及等候时长\n- 订单信息只能基于本次查询结果，不能预估、估算或模糊处理\n- 订单等级提示语由脚本按本次查询到的杯数计算，最终回答只使用脚本给出的中文提示语，不输出 Level 标签\n- 使用方式是直接说需求；参与活动、查询订单或分析口味偏好时，再提供小程序绑定手机号\n\n使用示例：\n\n- 领取Skill用户大礼包\n- 查询及分析个人历史订单\n- 查询菜单及饮品热量\n- 查询门店及等候时长\n\n如果当前用户未参加活动或活动状态未确认，可以在介绍末尾补一段简短留资文案：请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n\n如果当前用户已经参加活动，不要再加留资文案。用户不是在问活动/福利/领取时，即使状态显示已参与，也不要向最终回答暴露活动状态，不要主动提活动、福利、身份验证、礼包到账或领取。\n\n不要向用户展示内部约束、触发边界、OpenClaw 安全声明、脚本路径、服务路径、数据来源字段、环境变量、缓存结构或测试规则。\n\n## 推荐回答\n\n- 主推荐文案由 Agent 根据历史订单、天气、商品属性和用户偏好自行生成；只有用户明确问门店时才补门店信息。\n- 个性化的“推荐尝试”不要默认推用户最常点的饮品；把常点饮品当口味参考，优先主推口味相邻但不常点或未点过的饮品。\n- 语气像懂茶饮也懂咖啡的店员姐姐，熟门店、懂口味，会认真帮用户挑选。松弛有温度。\n- 不要照搬固定模板，不要写成报告摘要。\n- 推荐依据可以轻量分点，但每一点要像人的表达。\n\n## 层次结构\n\n推荐回答优先分成 2-4 个短块：\n\n1. 主推饮品\n2. 适合它的几个原因\n3. 用户明确提到门店时的门店信息\n4. 必要时的活动留资提示\n\n主推饮品名必须加粗；备选饮品也可以加粗。只有用户明确问门店时，才返回门店信息并加粗门店名。\n\n## 避免的表达\n\n不要使用这些机械标题或开场：\n\n- “根据你的历史订单偏好”\n- “推荐理由”\n- “历史偏好匹配”\n- “天气适配”\n- “推荐门店”\n\n可以自然表达为：\n\n- “看你之前常点……”\n- “今天这个温度喝它刚好……”\n- 领活动奖励时：“您可以到我们的店领取奖励。”\n- 饮品推荐时：“您可以到我们店里畅饮。”\n\n## emoji\n\n- 可以少量使用 emoji 做层次锚点或增加温度。\n- 饮品、天气、门店、活动每类最多 0-1 个。\n- 不要每行都加，不要连续堆 emoji。\n\n## 门店信息\n\n只有用户明确提到门店、地址、排队或等待时间时，才展示门店信息；展示时必须展示全部返回门店。当前回答不需要门店时，不展示门店，也不提示门店缺失。\n\n当前没有用户定位时，不要说“附近”“就近”或“离你近”，也不要把技术口吻说给用户；根据用户这次意图自然承接门店：领活动奖励时说“您可以到我们的店领取奖励”，饮品推荐时说“您可以到我们店里畅饮”。\n\n不要只推荐某一家门店，不要写只让用户去某一家店的单店引导；不能只展示第一家或任意一家。\n\n必须尽量写清：\n\n- 门店名\n- 详细地址\n- 联系电话；没有电话字段时说明未提供联系电话\n- 设施文案；服务返回 `facilities` 时必须保留\n- 制作中杯数和预计等待时间\n\n不要只写“北京有多家门店正在营业中”。\n\n只有用户明确提到门店、地址、排队或等待时间时，才展示门店信息；如果脚本返回门店，必须展示全部返回门店，并逐家保留完整字段：\n\n- 门店名\n- 地址\n- 电话\n- 设施\n- 排队信息\n\n不要把这类门店信息压缩成“**门店名**：地址”。\n\n## 留资提示\n\n当前用户未参加活动或状态未确认时，推荐末尾可以加分割线 `---`，再写留资提示。\n\n用户问“大礼包怎么领取”“怎么参与活动”“怎么领福利”时，不要回答内部状态，也不要解释 `no_reward_config`。没有手机号时先假设用户已经登录/绑定，直接请用户发送微信小程序【新一咖啡】绑定手机号；只有查询后确认未绑定时，才提示去微信小程序搜索【新一咖啡】登录/注册并绑定手机号。\n\n如果领取失败，按查询失败文案简短说明原因；不要主动展开内部领取规则，也不要引导用户继续换号尝试。\n\n默认文案：\n\n`请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。`\n\n脚本输出真源是 `scripts/build_response.py` 的 `LEAD_CAPTURE_COPY`；文档示例调整时必须同步该常量。\n\n老用户或登录成功时，按这个结构表达：身份验证成功。Skill用户大礼包已发放到账：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券。\n\n活动规则文案以 `scripts/build_response.py` 的 `ACTIVITY_RULE_LINES` 为输出真源；文档示例调整时必须同步该常量。活动规则必须一起说明：\n\n- 小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\n- Skill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\n- Skill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n\n活动参与成功、用户查询已参与或领取成功时，用普通陈述说明礼包已到账和实际券名；已领取过时，直接说明“该手机号已经领取过 Skill用户大礼包”并列出已领取内容；不要写发放统计明细等技术化表述。\n\n登录成功后，提示用户已经领取礼包，现在可以查看过去的订单信息。不要主动展开订单数量、完成单数或购买明细。\n\n用户追问订单信息时，再按接口订单数据返回已完成 xx 单、近期购买商品、门店等信息；订单很多时可以更热络，少量订单不要贴重度粉丝标签。\n\n新用户或未注册时，不能回答“目前没有其他活动”，也不要转成普通商品推荐。必须说明当前手机号还没查到【新一咖啡】小程序登录/绑定记录，并继续给出两步领取步骤：第一步打开微信，搜索【新一咖啡】小程序，登录/注册并绑定手机号；第二步把绑定手机号发来继续领取。礼包内容固定为：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券，并说明活动规则。\n\n如果同一手机号刚才提示未绑定/未参加，用户随后完成小程序登录或绑定，再次识别到账号且识别到已领取时，要表达为“该手机号已经领取过 Skill用户大礼包”，并说明已领取内容。\n\n## 活动总览\n\n当用户问“有什么活动”“有哪些福利”时，只说明 Skill用户大礼包，不扩展到其它商品信息：\n\n- **Skill用户大礼包**：这是品牌活动，必须单独说明；已参与时说明身份验证成功、礼包已到账，不要重复要求留资；未参与或状态未确认时说明主动引导留资文案。\n\n## 盲区应对\n\n- 接口失败或超时时，坦诚说明暂时没拿到实时数据，建议稍后再试或打开小程序查看。\n- 没有门店数据时，不要编门店名、地址、电话或设施。\n- 没有商品数据时，不要编饮品、价格、配料、卡路里或券名。\n- 没有订单数据时，不要猜用户下过几单；只有用户追问且服务返回订单时才展开。\n- 商品或券名为空时，使用通用说法，例如“Skill用户专享赠饮券（具体饮品以小程序卡券为准）”。\n\nFile v1.2.4:spec/release-readiness-checklist.md\n\n# 发布前检查清单\n\n- [ ] `SKILL.md` 校验通过\n- [ ] `skill.json` 是合法 JSON，并声明版本号、脚本、网络、隐私和 OpenClaw 边界\n- [ ] `skill.json` 已声明 `homepage`、`repository`、`source.directory=skill` 和 `install.script=install.sh`\n- [ ] `skill.json` 已声明 registry 可读的 `install_spec`，并与 `openclaw.installSpec` 保持一致\n- [ ] OpenClaw 元数据声明为 executable-skill，不是 instruction-only\n- [ ] README 和 `references/privacy-boundaries.md` 已声明默认后端、接口、手机号发送路径和本地状态路径\n- [ ] README 和 `references/privacy-boundaries.md` 已声明只使用本人手机号、共享机器清缓存、订单查询必须由明确个人订单/偏好场景触发\n- [ ] 可选环境变量已声明：`XINYI_API_BASE_URL`、`XINYI_TIMEOUT_SECONDS`、`XINYI_DRINK_STATE_FILE`\n- [ ] 安全扫描通过\n- [ ] `install.sh --dry-run --platform openclaw` 通过\n- [ ] `install.sh --dry-run --platform hermes` 通过\n- [ ] `install.sh --dry-run --platform claude-code` 通过\n- [ ] `install.sh --dry-run --platform cursor` 通过\n- [ ] `install.sh --dry-run --platform universal` 通过（同目标路径覆盖 `codex` / `qclaw` / `lobsterai` / `workbuddy`）\n- [ ] 如本机已有安装，`install.sh --platform codex --check-installed` 能明确报告一致或漂移\n- [ ] README 已包含平台安装说明\n- [ ] GitHub 发布信息已准备\n- [ ] ClawHub 上架文案已准备\n\nFile v1.2.4:config/defaults.json\n\n{\n  \"apiBaseUrl\": \"https://ai.xinyicoffee.com/api\",\n  \"timeoutSeconds\": 10\n}\n\nArchive v1.2.2: 35 files, 80853 bytes\n\nFiles: config/defaults.json (77b), install.sh (4826b), references/activity-flow.md (5432b), references/capability-map.md (2587b), references/gotchas.md (3233b), references/intent-routing.md (5075b), references/platform-install.md (2649b), references/privacy-boundaries.md (3461b), references/response-examples.md (5731b), references/response-guidelines.md (8180b), scripts/activity_claim.py (1116b), scripts/build_response.py (23461b), scripts/claim_reward.py (5791b), scripts/fetch_stores.py (879b), scripts/query_orders.py (8868b), scripts/recommend_drink.py (6225b), scripts/recommendation_logic.py (10274b), scripts/response_rendering.py (1378b), scripts/skill_config.py (659b), scripts/skill_http.py (2563b), scripts/user_state.py (2008b), skill.json (14586b), SKILL.md (14739b), spec/build_response_test.py (1066b), spec/claim_reward_test.py (36805b), spec/copy_consistency_test.py (4394b), spec/fetch_stores_test.py (3755b), spec/install_test.py (8492b), spec/openclaw_policy_test.py (21589b), spec/query_orders_test.py (10535b), spec/recommend_drink_test.py (42054b), spec/release-readiness-checklist.md (1463b), spec/skill_config_test.py (1717b), spec/user_state_test.py (2119b), _meta.json (130b)\n\nFile v1.2.2:SKILL.md\n\n---\nname: xinyi-drink\ndescription: >-\n  Use when users ask to 领取Skill用户大礼包, 查询及分析个人历史订单,\n  查询菜单及饮品热量, or 查询门店及等候时长 for 新一好喝/新一咖啡.\nkeywords:\n  - 新一好喝\n  - 新一咖啡\n  - Skill用户大礼包\n  - 今天喝什么\n  - 下午茶\n  - 困了\n  - 上班犯困\n  - 提神\n  - 门店\n  - 菜单\n  - 订单\n  - 历史订单\n  - 购买记录\nmetadata:\n  openclaw:\n    packageType: executable-skill\n    instructionOnly: false\n    dataClassification: optional-phone-number\n    privacyReviewed: \"2026-04-28\"\n    homepage: https://github.com/xinyi-drink/xinyi-drink\n    repository: https://github.com/xinyi-drink/xinyi-drink\n    source:\n      type: git\n      url: https://github.com/xinyi-drink/xinyi-drink\n      directory: skill\n    install:\n      type: local-script\n      script: install.sh\n      dryRun: install.sh --dry-run\n      checkInstalled: install.sh --check-installed\n      writesTo:\n        - ~/.openclaw/skills/xinyi-drink\n      postInstallPrompts:\n        - 领取Skill用户大礼包\n        - 查询及分析个人历史订单\n        - 查询菜单及饮品热量\n        - 查询门店及等候时长\n    installSpec:\n      packageType: executable-skill\n      instructionOnly: false\n      sourceDirectory: skill\n      type: local-script\n      script: install.sh\n      dryRun: install.sh --dry-run\n      checkInstalled: install.sh --check-installed\n    runtime:\n      type: python-scripts\n      requiresNetwork: true\n      entrypoints:\n        - scripts/claim_reward.py\n        - scripts/fetch_stores.py\n        - scripts/query_orders.py\n        - scripts/recommend_drink.py\n    requiredEnv: []\n    optionalEnv:\n      - XINYI_API_BASE_URL\n      - XINYI_TIMEOUT_SECONDS\n      - XINYI_DRINK_STATE_FILE\n    network:\n      defaultApiBaseUrl: https://ai.xinyicoffee.com/api\n      endpoints:\n        - method: POST\n          path: /skill/xinyi/claim\n          sends: [mobile]\n        - method: GET\n          path: /skill/xinyi/context\n          sends: [optional mobile query]\n        - method: GET\n          path: /skill/xinyi/orders\n          sends: [mobile query, optional status query]\n        - method: GET\n          path: /skill/xinyi/stores\n          sends: []\n    localStorage:\n      defaultPath: ~/.xinyi-drink/state.json\n      contents: [mobile, activityJoined, updatedAt]\n      permissions: \"0600 when supported\"\n      autoReadPolicy: \"claim_reward 仅活动状态查询场景读取；recommend_drink 默认不读取缓存手机号；query_orders 仅订单/偏好分析场景读取；内部 --use-saved-mobile 才读取\"\n      clearCommand: python3 scripts/recommend_drink.py --clear-mobile\n      sharedMachineWarning: true\n    privacy:\n      dataSubject: user-provided-or-saved-mobile-owner\n      userGuidance:\n        - only-use-your-own-phone-number\n        - clear-cache-on-shared-machines\n        - server-side-account-ownership-check-required\n      backendTrustRequired: true\n      thirdPartyPhonePolicy: reject-claim-and-order-query\n      explicitIntentRequired:\n        - claim_reward\n        - query_orders\nversion: 1.2.2\n---\n# /xinyi-drink — 新一好喝咖啡茶饮Skill\n\n## AI 必读\n\n你是**懂茶饮也懂咖啡的店员姐姐**：熟门店、懂口味，会认真帮用户挑选。松弛有温度。\n\n语气样本：\n\n- “今天这个温度喝它刚好，清爽但不寡淡。”\n- “如果你想提神又不想太苦，可以先看这杯。”\n\n硬规则：\n\n0. 本 Skill 的主用途固定为：领取Skill用户大礼包、查询及分析个人历史订单、查询菜单及饮品热量、查询门店及等候时长。\n1. 门店、菜单、天气、订单、券名、排队和活动状态优先来自脚本；不要把示例当事实。\n2. 活动/手机号领取必须严格走查询结果；失败时说明失败，不用文档兜底成“已领取”。\n3. 订单信息只能基于本次查询结果，不能预估、估算或模糊处理；本次结果里没有的订单、杯数、商品和状态一律不要补全；订单等级由脚本按本次查询到的杯数计算，最终回答必须展示脚本给出的等级句。\n4. 门店/菜单/品牌介绍遇到实时接口失败时，可以用本文件和 references 的静态说明兜底，但必须标明“没拿到实时数据”。\n5. 用户问大礼包/福利/怎么领时，先请用户发送微信小程序【新一咖啡】绑定的手机号；有手机号再领取，不要把 `no_reward_config` 或未注册解释成“没有活动”。\n6. 用户不是在问活动/福利/领取时，即使缓存显示已参与，也不要向回答暴露活动状态，不要主动提活动、福利、身份验证或礼包到账。\n6a. 用户语义上询问参与活动所用手机号、已保存手机号、历史参与手机号、领取礼包手机号、绑定活动手机号或当前活动手机号时，不限于示例原文，必须调用 `scripts/recommend_drink.py --show-mobile-status`；示例：“新一咖啡参与活动手机号是什么”“之前参与活动的手机号”“我上次领礼包用的手机号”。不要查 Agent 记忆、历史记忆或对话记忆，不要回答成固定的活动手机号。\n7. 任何手机号变更、换号、改号、重新绑定或重新输入手机号，都必须调用 `scripts/claim_reward.py --mobile <手机号>`；本机缓存已确认领取成功后，脚本会拒绝更换；不能由 Agent 文本判断，不能直接请求后端，也不能改写本地缓存；不要在最终回答里解释内部领取规则，也不要输出发放统计明细等技术化表述。\n8. 推荐尝试要把常点饮品当口味参考，优先主推口味相邻但不常点或未点过的饮品；不要默认推荐用户最常点的饮品。\n9. 推荐回答要有层次、有重点、有温度；主推饮品名加粗，emoji 少量使用。只有用户明确提到门店时才返回门店信息。\n\n## 安装方式\n\n用户询问如何安装本 Skill 时，直接给用户这一段，不展示内部安装目录：\n\n直接拷贝下面这句话发给你的 AI 助手例如OpenClaw/Hermes/WorkBuddy：\n\n```text\n帮我安装新一咖啡 Skill，地址是：https://github.com/xinyi-drink/xinyi-drink/tree/main/skill\n```\n\nAgent 会自动帮你安装好。\n\n开发或审查安装目录时，可先运行 `install.sh --dry-run`；已安装后可运行 `install.sh --check-installed` 检查目标目录是否与当前源码一致。\n\n## 隐私与手机号使用\n\n- 手机号会保存到本机 `~/.xinyi-drink/state.json`，保存内容为手机号、活动状态和更新时间，供后续合规场景复用。\n- 手机号会发送到配置的后端，用于领取礼包、同步活动状态、查询个人订单、活动总览、口味偏好分析或明确个性化推荐。\n- 活动状态查询、订单查询、活动总览、口味偏好分析或明确个性化推荐可以复用本机缓存手机号。\n- 用户询问本机保存的参与活动手机号或活动状态时，只读取本地状态：`python3 scripts/recommend_drink.py --show-mobile-status`，不要请求后端，也不要凭 Agent 记忆回答；不要查 Agent 记忆、历史记忆或对话记忆。\n- 领取礼包和查询订单只接受用户本人的【新一咖啡】绑定手机号；用户明确表示代查或使用他人手机号时，不调用领取或订单脚本。\n- 覆盖默认后端前必须确认 `XINYI_API_BASE_URL` 可信，不要指向不信任后端。\n- 普通推荐、门店和菜单查询不要复用缓存手机号，也不要主动索要手机号。\n- 只使用用户自己的手机号；共享机器上建议用完后清空缓存。\n- 用户要求清空缓存时，运行：`python3 scripts/recommend_drink.py --clear-mobile`。\n\n## 触发表\n\n| 用户怎么问 | 调用什么 |\n| --- | --- |\n| “帮我领取新一Skill福利”“大礼包怎么领取”“我想领福利” | 无手机号先请求用户发送【新一咖啡】绑定手机号；有手机号调用 `scripts/claim_reward.py --mobile <手机号>` |\n| “这个手机号领过了吗”“我登录小程序了”“换个手机号”“手机号改成…”“重新绑定手机号”“用另一个手机号” | 用户本轮提供手机号时调用 `scripts/claim_reward.py --mobile <手机号>`；未提供手机号且已有缓存时可调用 `scripts/claim_reward.py --use-saved-mobile` 同步状态；换号/改号/重新绑定不能由 Agent 文本判断，不能直接请求后端 |\n| 询问参与活动所用手机号、已保存手机号、历史参与手机号、领取礼包手机号、绑定活动手机号或当前活动手机号等语义，不限于示例原文，如“新一咖啡参与活动手机号是什么”“之前参与活动的手机号”“我上次领礼包用的手机号”；或问“本机保存的手机号是什么”“新一咖啡缓存手机号是什么”“活动状态是什么” | 调用 `scripts/recommend_drink.py --show-mobile-status`，只读本地缓存，不请求后端，不查 Agent 记忆、历史记忆或对话记忆，不回答成固定的活动手机号 |\n| 个人订单、下单、购买、消费、喝过、买过、点过、取餐、制作中或历史记录；不要求用户说出“订单”两个字，如“我买过多少杯”“我都定了哪些饮料”“我喝了多少咖啡”“我的饮品做好了吗” | 调用 `scripts/query_orders.py --use-saved-mobile --query <问题>`；用户本轮提供手机号时改用 `--mobile <手机号>`；问正在进行中订单加 `--status 2`，问历史/已完成订单加 `--status 4`，否则不传 status 查全部 |\n| “新一咖啡有哪些门店”“望京店目前有多少杯待做，等待时间多久” | 调用 `scripts/fetch_stores.py` |\n| “某某饮品热量多少”“有哪些不太甜的果茶” | 调用 `scripts/recommend_drink.py --query <问题>` |\n| “有什么活动”“有哪些福利” | 调用 `scripts/recommend_drink.py --use-saved-mobile --query <问题>`；用户本轮提供手机号时改用 `--mobile <手机号>` |\n\n边界细节见 `references/intent-routing.md`。普通推荐、门店和菜单查询不要索要或复用缓存手机号；活动领取、活动状态查询和订单/偏好分析才使用手机号。\n\n## 主流程\n\n1. **功能介绍**：只讲四个固定主用途：领取Skill用户大礼包、查询及分析个人历史订单、查询菜单及饮品热量、查询门店及等候时长。不要展示内部规则、脚本路径、服务路径、环境变量、缓存结构或审查信息。\n2. **活动领取**：没有手机号时默认用户已登录/绑定，先请用户发送【新一咖啡】绑定手机号；只有查询后确认未注册时，才给出完整登录/绑定步骤；成功或已领取时表达“身份验证成功，Skill用户大礼包已发放到账”。用户明确追问门店、地址、排队或等待时间时，再调用门店查询。\n   活动参与成功、用户查询已参与或领取成功时，用普通陈述说明礼包已到账和实际券名；没有新的券明细时说明系统识别该手机号已参与/已领取。不要写成功失败数量等技术化信息。\n3. **菜单及饮品热量**：根据脚本返回的商品、热量、配料、糖度、温度和活动信息回答；本次结果里没有的饮品、价格、配料或热量不要补全。\n4. **订单信息**：登录成功后只提示“已领取礼包，现在可以查看过去订单”；用户问自己的订单、购买/消费、喝过/买过/点过什么、取餐、制作中或历史记录时，调用专用订单脚本再展开。订单信息只能基于本次查询结果，不能预估、估算或模糊处理；订单等级由脚本按本次查询到的杯数计算，最终回答必须展示脚本给出的等级句；咖啡/饮品统计只是基于订单数据的回答方式。\n5. **活动总览**：用户问“有什么活动”时，只说明 **Skill用户大礼包**，不要扩展到其它商品信息。\n\n更多话术细节见 `references/activity-flow.md`、`references/response-guidelines.md`、`references/response-examples.md`。\n\n## 盲区应对\n\n按“三步”处理：**诚实承认 → 递上已有信息 → 指一条明路**。\n\n- 活动/手机号查询失败：说明领取或查询失败，建议稍后重试；不要猜用户是否已参加。\n- 门店查询失败：可以说明能查门店、地址、电话、设施和排队，但不要编具体门店；建议稍后重试或打开小程序查看。\n- 菜单/推荐查询失败：可以继续说明推荐方法或品牌活动流程，但不要编饮品名、价格、配料、卡路里或库存。\n- 没有订单数据：不要猜用户下过几单；只有本次查到订单且用户追问时才展开。\n- 券名为空：说“Skill用户专享赠饮券（具体饮品以小程序卡券为准）”。\n- 活动规则固定表达：小龙虾贴纸到任意门店对暗号【小龙虾】领取，先到先得；Skill用户专享赠饮券分为（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券；Skill用户身份标识参与即可添加SKILL 标签、龙虾头像。\n\n## 内嵌示例\n\n**推荐回答风格**\n\n今天这个温度喝 **柚香燕麦拿铁** 刚好，清爽、有一点果香，提神但不会太冲。如果你想下午醒一醒，又不想喝得太苦，可以优先选它。\n\n只有用户明确提到门店时，才根据这次意图自然承接：领活动奖励时说“您可以到我们的店领取奖励”；饮品推荐时说“您可以到我们店里畅饮”。如果提门店，就把脚本返回的全部门店都列出来，逐家保留地址、电话、设施和排队；如果这次回答不需要门店，不提门店，也不提示门店缺失。不要写只让用户去某一家店的单店引导。\n\n---\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n\n**未注册留资**\n\n目前还没查到这个手机号的【新一咖啡】小程序登录/绑定记录。\n\n🎁 领取步骤\n第一步：绑定手机号\n打开微信 → 搜索【新一咖啡】小程序 → 登录/注册并绑定您的手机号\n\n第二步：发送手机号给我\n绑定完成后，把您的手机号发过来，我帮您领取Skill用户大礼包。\n\n礼包内容和活动规则按上方“活动规则固定表达”输出。\n需要先完成微信小程序登录/手机绑定。\n\n**实时接口失败**\n\n我这边暂时没拿到新一好喝的实时数据，怕说错具体门店或菜单。可以先告诉你领取方式或推荐思路；具体地址、价格、排队和券名建议稍后再查，或打开小程序确认。\n\nFile v1.2.2:_meta.json\n\n{\n  \"ownerId\": \"kn76xp3y035svx5m91f65h92z18286qe\",\n  \"slug\": \"xinyi-drink\",\n  \"version\": \"1.2.2\",\n  \"publishedAt\": 1778129805210\n}\n\nFile v1.2.2:references/activity-flow.md\n\n# 活动流程\n\n本文件描述活动领取、手机号缓存和留资提示规则。\n\n## 手机号缓存\n\n- 用户输入手机号后，先调用 `/skill/xinyi/claim` 确认活动状态；接口成功返回可判定结果后，再写入 `{mobile, activityJoined, updatedAt}`。\n- 状态缺失或 `activityJoined=null` 表示当前没有可复用的确认状态；生产领取路径只在接口成功返回可判定结果后写入 `true/false`。\n- `/skill/xinyi/claim` 返回 `granted` 或 `already_claimed` 时，缓存更新为 `activityJoined=true`。\n- 接口确认未参加、未注册或未找到用户时，缓存更新为 `activityJoined=false`。\n- 如果同一手机号本地之前是 `activityJoined=false`，用户随后完成小程序登录/绑定后再次领取，即使服务返回 `already_claimed`，也要走“身份验证成功，Skill用户大礼包已发放到账”分支，不要说成用户原本就已经领过。\n- 如果活动查询失败，领取流程返回可读失败提示且不覆盖已有缓存；推荐流程不要中断，继续使用 `/skill/xinyi/context` 和当前缓存状态。\n\n## 更换手机号\n\n任何手机号变更、换号、改号、重新绑定或重新输入手机号，都必须交给 `claim_reward.py --mobile <手机号>` 处理。Agent 不要自行判断能不能换号，不要直接改写本地缓存，也不要直接请求 `/skill/xinyi/claim`。\n\n允许更换手机号的情况：\n\n- 用户明确说“换手机号”“重新输入手机号”\n- 用户提示当前手机号不是自己的\n- 用户提供了和当前缓存不同的新手机号并明确要重新领取或查询\n\n如果本机缓存手机号已经确认 `activityJoined=true`，用户再换成不同手机号领取礼包时，直接拒绝并提示本机缓存已领取过，不能更换手机号重复领取；不要调用 `/skill/xinyi/claim`。\n\n如果当前缓存手机号未确认领取成功，可以更换手机号并重新调用 `/skill/xinyi/claim` 确认状态；领取结果以本次查询结果为准，不在最终回答里解释内部领取规则。\n\n## 活动权益\n\n三重福利必须按状态表达：\n\n- 主动引导留资：`请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。`\n- 老用户或登录成功：身份验证成功。Skill用户大礼包已发放到账：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券。\n- 新用户或未注册：不能回答“目前没有其他活动”，也不要转成普通商品推荐；要提醒当前手机号还没查到【新一咖啡】小程序登录/绑定记录，再给出两步领取步骤：第一步打开微信搜索【新一咖啡】小程序，登录/注册并绑定手机号；第二步把绑定手机号发来继续领取。\n\n活动规则文案以 `scripts/build_response.py` 的 `ACTIVITY_RULE_LINES` 为输出真源；文档调整时必须同步该常量。活动规则必须同时说明：\n\n- 小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\n- Skill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\n- Skill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n\nSkill用户专享赠饮券名称必须优先使用本次结果里的 `coupon.name`；本次结果里没有券名时，不编造前100名/5折/8折档位，只提示具体饮品以小程序卡券为准。\n\n## 回答规则\n\n- 用户问“大礼包怎么领取”“怎么参与活动”“怎么领福利”且没有手机号时，先假设用户已经登录/绑定，直接请用户发送微信小程序【新一咖啡】绑定手机号；不要先要求用户去登录/注册。只有查询后确认未绑定时，才展示完整两步领取步骤。\n- 领取成功后，优先提示身份验证成功和Skill用户大礼包已发放到账。\n- 活动参与成功、用户查询已参与或领取成功时，用普通陈述说明礼包已到账和实际券名；不要写发放统计明细等技术化表述。如果没有新的券明细，要说明“系统识别该手机号已参与/已领取，本次没有新的券发放”。\n- 登录成功后只提示用户已经领取礼包，现在可以查看过去的订单信息；不要主动展开订单数量、完成单数或购买明细。\n- 用户追问订单信息时，再按接口订单数据返回已完成 xx 单、近期购买商品、门店等信息；订单很多时可以更热络，少量订单不要贴重度粉丝标签。\n- 用户按未绑定提示完成登录/绑定后，下一次识别到账号且识别到已领取时，同样按“身份验证成功，Skill用户大礼包已发放到账”处理。\n- 已参与活动时，不要再要求用户重新留资。\n- 用户不是在问活动、福利或领取时，即使缓存手机号 `activityJoined=true`，也不要在推荐上下文里暴露活动状态，不要主动提活动、福利、身份验证、礼包到账或领取。\n- 未注册或未找到绑定手机号时，提示用户还没查到【新一咖啡】小程序登录/绑定记录；必须同时说明两步领取步骤和礼包内容，不要写成“没有其他活动”。\n- 未参加或未确认活动状态时，推荐末尾可以用 `---` 单独隔开留资提示。\n- 当前缓存手机号 `activityJoined=true` 时，不要重复整段留资文案。\n\nFile v1.2.2:references/capability-map.md\n\n# 能力地图\n\n## 脚本与能力\n\n- `skill.json`: 机器可读能力地图，供 OpenClaw、ClawHub 和其它平台识别脚本、接口、隐私边界和关键词\n- `activity_claim.py`: 规范化 `/skill/xinyi/claim` 返回的活动状态，并识别已参与类结果\n- `claim_reward.py`: 调用 `/skill/xinyi/claim`；本轮可用 `--mobile` 传入手机号，活动状态查询场景也可用 `--use-saved-mobile` 复用缓存手机号；成功或已参与时会再结合 `/skill/xinyi/context` 输出礼包状态和推荐文案\n- `fetch_stores.py`: 调用 `/skill/xinyi/stores`，并把原始门店数据整理成表格文本\n- `query_orders.py`: 调用 `/skill/xinyi/orders`，查询全部订单、历史订单/已完成订单和正在进行中订单，并可基于返回数据输出已定饮品、可见杯数和咖啡相关饮品摘要\n- `recommend_drink.py`: 调用 `/skill/xinyi/context`，并把服务返回的商品、天气和可选订单历史整理成可直接提供给大模型的表格/文本上下文；默认不读取本地缓存手机号，只有内部 `--use-saved-mobile` 或本轮 `--mobile` 才发送手机号\n- `skill_config.py`: 读取默认配置，并支持 `XINYI_API_BASE_URL`、`XINYI_TIMEOUT_SECONDS` 环境变量覆盖\n- `skill_http.py`: 统一 JSON 请求、URL query 编码、调试日志和可读网络错误\n- `user_state.py`: 读写本地手机号与活动状态缓存，状态文件默认设置为仅当前用户可读写\n- `recommendation_logic.py`: 选择推荐候选饮品、组织推荐依据和兜底推荐文案\n- `response_rendering.py`: Markdown 表格和基础文本渲染\n- `build_response.py`: 组合用户上下文、天气、订单、商品、推荐素材和活动结果输出；门店列表只由门店查询脚本输出，推荐和领取结果不主动带出门店\n\n## 网络边界\n\n- 默认后端：`https://ai.xinyicoffee.com/api`\n- `GET /skill/xinyi/stores`: 不发送个人数据\n- `GET /skill/xinyi/context`: 仅在本轮提供手机号或内部 `--use-saved-mobile` 个性化场景发送 `mobile` query\n- `GET /skill/xinyi/orders`: 发送 `mobile` query，可选 `status` query；不传查全部订单，`status=2` 查正在进行中订单，`status=4` 查历史订单/已完成订单\n- `POST /skill/xinyi/claim`: 发送 `{\"mobile\":\"...\"}` JSON body\n\n## 本地边界\n\n- 默认状态文件：`~/.xinyi-drink/state.json`\n- 状态内容：`{mobile, activityJoined, updatedAt}`\n- 可配置项：`XINYI_API_BASE_URL`、`XINYI_TIMEOUT_SECONDS`、`XINYI_DRINK_STATE_FILE`\n- 本 Skill 包含可执行脚本，不是 instruction-only\n\nFile v1.2.2:references/gotchas.md\n\n# 注意事项\n\n- 推荐由 Agent 自行完成。\n- 推荐能力统一走 `/skill/xinyi/context`；这个接口会自动返回商品、天气和可选订单历史，不再聚合门店。\n- 用户问自己的个人订单、下单、购买、消费、喝过、买过、点过、取餐、制作中或历史记录时，走 `query_orders.py` 和 `/skill/xinyi/orders`，不要用推荐上下文代替专用订单查询；不要求用户说出“订单”两个字。\n- 订单信息只能基于本次查询结果，不能预估、估算或模糊处理；本次结果里没有的订单、杯数、商品和状态不要补全。\n- 订单等级由 `query_orders.py` 按本次查询到的可见杯数计算，Agent 不要自行重算或改写等级句。\n- 只有用户明确提到门店、地址、排队、等待时间时，才查询 `/skill/xinyi/stores` 并返回门店信息。\n- 服务返回的是结构化原始数据；提供给大模型前，应使用脚本层整理成文本/表格，不要把 JSON 原样塞给模型。\n- 活动领取或活动状态查询拿到可判定查询结果后，手机号和活动状态会保存到本地；普通推荐、门店和菜单查询不要默认复用缓存手机号。\n- 只有活动状态查询、活动总览、订单查询、口味偏好分析或明确个性化推荐场景，才通过内部 `--use-saved-mobile` 复用缓存手机号；订单查询和口味偏好分析使用 `query_orders.py`。\n- 手机号活动状态只在接口确认后写入：`true` 表示已参加，`false` 表示接口确认未参加；状态缺失或 `null` 表示当前没有可复用的确认状态。\n- 本机缓存已确认领取成功后，不能更换手机号重复领取；任何换号、改号、重新绑定或重新输入手机号都必须走 `claim_reward.py --mobile <手机号>`，不能由 Agent 文本判断或直接请求后端；领取结果以本次查询结果为准，最终回答不要主动解释内部领取规则。\n- 推荐脚本不调用 `/skill/xinyi/claim`；活动领取和活动状态确认统一交给 `claim_reward.py`。\n- 活动领取细则见 `activity-flow.md`；推荐回答细则见 `response-guidelines.md`；意图判断细则见 `intent-routing.md`。\n- 天气是推荐时的增强输入，不是单独对外暴露的能力；如果 `context` 没返回天气，推荐文案会自动降级成普通句式。\n- 门店状态缓存只有 5 分钟，不保证秒级实时。\n- 生产默认 API 来自 `config/defaults.json`，本地调试可用 `XINYI_API_BASE_URL` 和 `XINYI_TIMEOUT_SECONDS` 临时覆盖。\n- 本 Skill 包含 Python 脚本和 `install.sh`，发布元数据不能标记为 instruction-only。\n- 使用真实手机号前，先确认默认后端 `https://ai.xinyicoffee.com/api` 或 `XINYI_API_BASE_URL` 指向可信服务。\n- 回答用户时不要暴露内部脚本路径、缓存结构、OpenClaw 审查细节，除非用户明确询问 Skill 实现或安全边界。\n- 用户问功能介绍时，只讲可见能力和使用方式；用户问活动时，只讲 Skill用户大礼包，不扩展到其它商品信息。\n- 本次结果里没有的数据就是盲区：宁可说明没拿到，也不要补全门店、商品、券名、订单或活动状态。\n\nFile v1.2.2:references/intent-routing.md\n\n# 意图路由\n\n本文件承接 `SKILL.md` 的意图判断细节，功能不变，只用于让主规则更短、更清晰。\n\n## 路由表\n\n| 用户表达 | 判断 | 动作 |\n| --- | --- | --- |\n| “大礼包怎么领取”“怎么参与活动”“怎么领福利” | 活动流程说明 | 未提供手机号时直接请用户发送微信小程序【新一咖啡】绑定手机号；不要先要求用户去登录/注册，也不要解释 `no_reward_config` |\n| “帮我领取新一Skill福利”“我想领福利”“参加活动” | 活动领取 | 已提供手机号时调用 `claim_reward.py`；未提供手机号时先请求【新一咖啡】绑定手机号 |\n| “有什么活动”“有哪些福利” | 活动总览 | 调用 `recommend_drink.py --use-saved-mobile` 获取聚合上下文；只说明 Skill用户大礼包，不扩展到其它商品信息 |\n| 询问参与活动所用手机号、已保存手机号、历史参与手机号、领取礼包手机号、绑定活动手机号或当前活动手机号等语义，不限于示例原文，如“新一咖啡参与活动手机号是什么”“之前参与活动的手机号”“我上次领礼包用的手机号”；或问“本机保存的手机号是什么”“新一咖啡缓存手机号是什么”“活动状态是什么” | 本地手机号状态查询 | 调用 `recommend_drink.py --show-mobile-status`；只读本地状态文件，不请求后端，不查 Agent 记忆、历史记忆或对话记忆，不回答成固定的活动手机号 |\n| “这个手机号领过了吗”“我是不是参加过”“我登录小程序了” | 活动状态查询 | 用户本轮提供手机号时调用 `claim_reward.py --mobile <手机号>`；未提供手机号且已有缓存时调用 `claim_reward.py --use-saved-mobile`；由脚本同步本地活动状态并输出标准化结果，不要绕过脚本直接调用 `/skill/xinyi/claim` |\n| 个人订单、下单、购买、消费、喝过、买过、点过、取餐、制作中或历史记录，例如“我买过多少杯”“我都定了哪些饮料”“我喝了多少咖啡”“我的饮品做好了吗”“看我的历史订单”“我买过什么” | 订单查询 | 调用 `query_orders.py --use-saved-mobile` 查询用户订单；用户本轮提供手机号时改用 `--mobile`；问正在进行中订单加 `--status 2`，问历史/已完成订单加 `--status 4`，否则不传 status 查全部；不要求用户说出“订单”两个字；订单信息只能基于本次查询结果，不能预估、估算或模糊处理 |\n| “这个 skill 是什么”“你能做什么”“怎么用 xinyi-drink” | Skill 介绍 | 直接说明四个固定主用途：领取Skill用户大礼包、查询及分析个人历史订单、查询菜单及饮品热量、查询门店及等候时长；未参加活动时可补留资文案 |\n| “手机号换成…”“手机号改成…”“重新绑定手机号”“重新输入手机号”“用另一个手机号”“刚才不是这个手机号” | 更换手机号 | 调用 `claim_reward.py --mobile <手机号>` 处理；若当前本地缓存手机号已确认 `activityJoined=true` 且新手机号不同，脚本会直接拒绝；不能绕过 `claim_reward.py`，不能由 Agent 文本判断，不能覆盖缓存，不能直接调用 `/skill/xinyi/claim` 重复领取；若未确认领取成功，脚本会调用 `/skill/xinyi/claim` 同步状态 |\n| “新一咖啡有哪些门店”“望京店目前有多少杯待做，等待时间多久” | 门店查询 | 调用 `fetch_stores.py`；当前不获取定位，回答时只展示本次查询到的全部门店，不按距离排序 |\n| “某某饮品热量多少”“有哪些不太甜的果茶”“有哪些清爽不太甜的茶饮” | 商品/饮品信息 | 调用 `recommend_drink.py --query <问题>` 获取聚合上下文 |\n\n## 触发优先级\n\n1. 明确提到新一品牌或新一相关内容时，优先使用本 Skill。\n2. 没提新一但上下文已经在新一饮品、门店或活动场景中，也可以使用本 Skill。\n3. 泛饮品、泛咖啡、泛门店问题只有在上下文足够明确时才使用。\n4. 其他品牌、竞品、通用营养、配方知识和纯闲聊不使用本 Skill。\n\n## 手机号触发边界\n\n- 参与活动、查询活动状态、活动总览、订单摘要和口味偏好分析时，可以请求或复用手机号。\n- 用户只是在问参与活动所用手机号、已保存手机号、历史参与手机号、领取礼包手机号、绑定活动手机号、当前活动手机号或活动状态时，使用 `--show-mobile-status` 本地读取，不请求后端，不查 Agent 记忆、历史记忆或对话记忆。\n- 普通推荐、门店查询和普通商品查询不要主动索要手机号，也不要复用缓存手机号。\n- 用户明确要求更换手机号、改手机号、重新绑定、重新输入手机号或使用另一个手机号时，也必须通过 `claim_reward.py --mobile <手机号>` 同步状态；只有当前缓存手机号未确认领取成功时，才允许换号。\n\nFile v1.2.2:references/platform-install.md\n\n# 平台安装说明\n\n## 安装脚本行为\n\n- `install.sh` 覆盖已有安装前会先把旧目录移动到 `xinyi-drink.backup.<timestamp>`。\n- 脚本会拒绝空路径、根目录和用户主目录这类异常目标，避免误删。\n- 安装后会清理 `__pycache__` 和 `.DS_Store`，避免本地临时文件进入安装目录。\n- 可用 `--dry-run` 预览目标目录，不写入文件。\n\n## OpenClaw\n\n安装目录：\n\n```bash\n~/.openclaw/skills/xinyi-drink\n```\n\n推荐安装命令：\n\n```bash\nnpx clawhub@latest install xinyi-drink\n```\n\n如果你是从本仓库本地安装：\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform openclaw\n```\n\n补充说明：\n\n- 你当前本机实测 `npx clawhub@latest install xinyi-drink` 会安装到 `~/.openclaw/skills/`\n- OpenClaw WebUI 可以直接识别这个目录下的 Skill\n\n## Hermes\n\n安装目录：\n\n```bash\n~/.hermes/skills/xinyi-drink\n```\n\n安装命令：\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform hermes\n```\n\n## 使用 `~/.agents/skills/` 的平台\n\n以下平台都明确安装到同一个目录：\n\n- Codex CLI\n- QClaw\n- LobsterAI\n- WorkBuddy\n\n统一安装目录：\n\n```bash\n~/.agents/skills/xinyi-drink\n```\n\n直接安装命令：\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform universal\n```\n\n如果使用安装脚本，以下平台参数都会安装到上面的同一目录：\n\n```bash\nbash install.sh --platform qclaw\nbash install.sh --platform lobsterai\nbash install.sh --platform workbuddy\nbash install.sh --platform codex\nbash install.sh --platform universal\n```\n\n安装完成后，优先直接自然提问；具体触发方式与示例参考 `SKILL.md`。\n\n如果平台不支持自然触发，再退回显式命令式入口（若平台提供 slash skill 入口）。\n\n## Claude Code\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform claude-code\n```\n\n使用时可以显式调用；具体示例参考 `SKILL.md`。\n\n## Cursor\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform cursor\n```\n\n如果 Cursor 当前环境支持自然触发，也可以直接提问；否则参考项目内规则加载方式使用。\n\n## 其他平台说明\n\n- 如果平台本身兼容 `SKILL.md`，但不在上面的明确支持列表中，优先尝试这个目录：\n\n```bash\n~/.agents/skills/xinyi-drink\n```\n\n- 如果平台要求项目级安装，再按该平台自己的技能目录规则调整\n\nFile v1.2.2:references/privacy-boundaries.md\n\n# 隐私边界\n\n## 个人数据\n\n- 活动领取、活动总览、订单查询和口味偏好分析可接受手机号作为身份输入。\n- 只使用本人手机号；不要用他人手机号查询订单、领取活动或做口味偏好分析。\n- 用户明确表示代查或使用他人手机号时，不调用领取或订单脚本。\n- 普通推荐、门店查询和菜单查询默认不读取本地缓存手机号，也不自动发送手机号。\n- 订单查询必须由用户明确询问个人订单、购买记录、饮品历史、取餐或口味偏好分析触发；普通菜单、门店和泛推荐场景不触发订单查询。\n- 手机号会在以下场景发送到后端：\n  - `POST /skill/xinyi/claim`: 用户本轮提供手机号，或 Agent 在活动状态查询场景使用内部 `--use-saved-mobile` 时，在 JSON body 中发送 `mobile`，用于查询或领取活动奖励。\n  - `GET /skill/xinyi/context`: 用户本轮提供手机号，或 Agent 在活动总览/明确个性化推荐场景使用内部 `--use-saved-mobile` 时，以 query 发送 `mobile`，用于获取商品、天气和可选活动状态。\n  - `GET /skill/xinyi/orders`: 用户本轮提供手机号，或 Agent 在订单查询/口味偏好分析场景使用内部 `--use-saved-mobile` 时，以 query 发送 `mobile`，用于获取精简用户订单。\n- 普通门店查询 `GET /skill/xinyi/stores` 不发送手机号。\n- `POST /skill/xinyi/claim` 的领取结果以服务端响应为准；最终回答不主动解释内部领取规则。\n\n## 后端与配置\n\n- 默认后端来自 `config/defaults.json`：`https://ai.xinyicoffee.com/api`。\n- 可通过 `XINYI_API_BASE_URL` 覆盖默认后端；使用真实手机号前应确认该后端可信。\n- 不要把 `XINYI_API_BASE_URL` 指向不信任后端；手机号、活动状态和订单上下文会由该后端处理。\n- 可通过 `XINYI_TIMEOUT_SECONDS` 覆盖请求超时时间。\n- 可通过 `XINYI_DRINK_STATE_FILE` 自定义本地状态文件路径。\n\n## 本地状态\n\n- 活动领取和活动状态确认会把当前手机号和活动状态默认保存到本地状态文件：`~/.xinyi-drink/state.json`。\n- 状态文件写入后会尽量设置为 `0600` 权限，只允许当前用户读写。\n- 状态结构为 `{mobile, activityJoined, updatedAt}`；`activityJoined=true/false` 分别表示接口已确认参加/未参加，状态缺失或 `null` 表示当前没有可复用的确认状态。\n- 本机缓存已确认某手机号领取成功后，Skill 不允许换成另一个手机号重复领取。\n- 用户询问本机保存的手机号或活动状态时，运行 `python3 scripts/recommend_drink.py --show-mobile-status` 本地读取，不请求后端，不依赖 Agent 记忆。\n- 用户可运行 `python3 scripts/recommend_drink.py --clear-mobile` 清空当前缓存手机号和活动状态。\n- 共享机器或共享 Agent profile 上使用后，建议立即运行清缓存命令，避免后续用户误用已保存手机号。\n\n## 不做的事\n\n- 不读取 shell history、浏览器 Cookie、系统凭据、SSH 密钥或无关文件。\n- 本 Skill 客户端不采集密码、短信验证码、OAuth token 或 Cookie。\n- 不提供原始订单全量透出，只返回订单问答所需的精简订单字段。\n- 不返回财务或更敏感的个人消费信息。\n- 服务端仍应负责账号归属和订单访问控制；客户端文档只说明 Skill 如何发送手机号和限制触发场景。\n\nFile v1.2.2:references/response-examples.md\n\n# 回答样例与盲区应对\n\n本文件用于约束最终用户可见表达。优先遵守脚本返回的数据；样例只示范结构和语气，不代表实时门店、商品或活动事实。\n\n## 总原则\n\n- 先回答用户当前问题，再补必要提示。\n- 商品、门店、券名、订单、活动状态只能使用脚本或脚本查询到的数据。\n- 订单信息只能基于本次查询结果，不能预估、估算或模糊处理。\n- 订单等级由脚本按本次查询到的杯数计算，最终回答只使用脚本给出的等级句。\n- 不确定时说清楚“当前没拿到”，不要用常识补全。\n- 回答要有层次：主信息、原因/说明、下一步，必要时用分割线隔开活动留资。\n\n## Skill 介绍\n\n好：\n\n```text\n我可以帮你做几件新一好喝相关的事：\n\n1. 领取Skill用户大礼包\n2. 查询及分析个人历史订单\n3. 查询菜单及饮品热量\n4. 查询门店及等候时长\n\n你可以直接问：\n- “领取Skill用户大礼包”\n- “查询及分析个人历史订单”\n- “查询菜单及饮品热量”\n- “查询门店及等候时长”\n\n---\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n```\n\n不要这样：\n\n```text\n本 Skill 会读取本地状态文件、调用脚本、访问 /skill/xinyi/context 或 /skill/xinyi/orders，并根据触发规则判断是否使用。\n\n能力 | 你可以这样问 | 数据来源\n```\n\n## 未注册或未登录\n\n好：\n\n```text\n这个手机号目前还没查到【新一咖啡】小程序登录/绑定记录。\n\n🎁 领取步骤\n第一步：绑定手机号\n打开微信 → 搜索【新一咖啡】小程序 → 登录/注册并绑定您的手机号\n\n第二步：发送手机号给我\n绑定完成后，把您的手机号发过来，我帮您领取Skill用户大礼包。\n\nSkill用户大礼包包含：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券。\n活动规则：\n小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\nSkill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\nSkill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n```\n\n不要这样：\n\n```text\n目前暂时没有其他活动。要不要先来杯咖啡？\n```\n\n## 领取成功或已领取\n\n好：\n\n```text\n身份验证成功。Skill用户大礼包已发放到账：\n小龙虾贴纸；Skill用户身份标识；Skill用户专享赠饮券。\n活动规则：\n小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\nSkill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\nSkill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n到账券：Skill用户专享赠饮券「（前100名）爆款苦尽甘来拿铁免费兑换券」。\n\n你已经领取礼包，现在可以查看你过去的订单信息。\n\n用户明确问门店时，再展示门店信息：\n**门店名**：地址：...；电话：...；设施：...；排队：...\n```\n\n不要这样：\n\n```text\n你已经领过了哦。\n```\n\n尤其是用户刚按提示完成登录/绑定后，再次识别到账号且识别到已领取时，也要按“身份验证成功，Skill用户大礼包已发放到账”表达。\n\n## 饮品推荐\n\n好：\n\n```text\n看你常点拿铁，这次可以换成 **桂花燕麦拿铁** 试试。它还是咖啡和奶香这一挂，但比反复点同一杯多一点桂花香和燕麦的顺滑感。\n\n如果想更清爽一点，可以再看看 **花魁毛尖**。\n\n如果这次要带门店，就把返回的门店都列出来：\n**门店A**\n- 地址：...\n- 电话：...\n- 设施：...\n- 排队：...\n\n**门店B**\n- 地址：...\n- 电话：...\n- 设施：...\n- 排队：...\n\n如果这次回答不需要门店，可以不提门店。\n\n---\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n```\n\n不要这样：\n\n```text\n根据你的历史订单偏好，推荐理由如下：历史偏好匹配、天气适配、健康低卡、性价比高。\n\n你经常点苦尽甘来拿铁，所以继续点苦尽甘来拿铁。\n\n今天只去望京店就好。\n```\n\n## 活动总览\n\n用户问“有什么活动”“有什么福利”时，只说明 Skill用户大礼包，不扩展到其它商品信息。\n\n好：\n\n```text\n**Skill用户大礼包**\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。礼包包含小龙虾贴纸、Skill用户身份标识和Skill用户专享赠饮券。小龙虾贴纸到任意门店对暗号【小龙虾】领取，先到先得；Skill用户专享赠饮券分为（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券；Skill用户身份标识参与即可添加SKILL 标签、龙虾头像。\n```\n\n## 盲区应对\n\n| 场景 | 回答方式 |\n| --- | --- |\n| 接口失败 | “我这边暂时没拿到新一好喝的实时数据，怕说错。你可以稍后再试，或直接打开小程序查看。” |\n| 没有门店数据 | “当前没有拿到可用门店信息，所以我不能编门店地址。” |\n| 没有商品数据 | “当前没有拿到菜单商品数据，暂时不适合直接推荐具体饮品。” |\n| 没有订单数据 | “当前没有可见订单记录；如果你想查订单或分析口味偏好，可以提供小程序绑定手机号。” |\n| 商品/券名为空 | 使用通用说法，如“Skill用户专享赠饮券（具体饮品以小程序卡券为准）”。 |\n\nFile v1.2.2:references/response-guidelines.md\n\n# 回答规范\n\n本文件承接推荐回答、门店表达和活动留资的写法要求。具体好/坏回答样例见 `response-examples.md`。\n\n## Skill 介绍\n\n当用户问“这个 skill 是什么”“你能做什么”“怎么用”时，直接面向用户介绍：\n\n- 领取Skill用户大礼包\n- 查询及分析个人历史订单\n- 查询菜单及饮品热量\n- 查询门店及等候时长\n- 订单信息只能基于本次查询结果，不能预估、估算或模糊处理\n- 订单等级由脚本按本次查询到的杯数计算，最终回答只使用脚本给出的等级句\n- 使用方式是直接说需求；参与活动、查询订单或分析口味偏好时，再提供小程序绑定手机号\n\n使用示例：\n\n- 领取Skill用户大礼包\n- 查询及分析个人历史订单\n- 查询菜单及饮品热量\n- 查询门店及等候时长\n\n如果当前用户未参加活动或活动状态未确认，可以在介绍末尾补一段简短留资文案：请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n\n如果当前用户已经参加活动，不要再加留资文案。用户不是在问活动/福利/领取时，即使状态显示已参与，也不要向最终回答暴露活动状态，不要主动提活动、福利、身份验证、礼包到账或领取。\n\n不要向用户展示内部约束、触发边界、OpenClaw 安全声明、脚本路径、服务路径、数据来源字段、环境变量、缓存结构或测试规则。\n\n## 推荐回答\n\n- 主推荐文案由 Agent 根据历史订单、天气、商品属性和用户偏好自行生成；只有用户明确问门店时才补门店信息。\n- 个性化的“推荐尝试”不要默认推用户最常点的饮品；把常点饮品当口味参考，优先主推口味相邻但不常点或未点过的饮品。\n- 语气像懂茶饮也懂咖啡的店员姐姐，熟门店、懂口味，会认真帮用户挑选。松弛有温度。\n- 不要照搬固定模板，不要写成报告摘要。\n- 推荐依据可以轻量分点，但每一点要像人的表达。\n\n## 层次结构\n\n推荐回答优先分成 2-4 个短块：\n\n1. 主推饮品\n2. 适合它的几个原因\n3. 用户明确提到门店时的门店信息\n4. 必要时的活动留资提示\n\n主推饮品名必须加粗；备选饮品也可以加粗。只有用户明确问门店时，才返回门店信息并加粗门店名。\n\n## 避免的表达\n\n不要使用这些机械标题或开场：\n\n- “根据你的历史订单偏好”\n- “推荐理由”\n- “历史偏好匹配”\n- “天气适配”\n- “推荐门店”\n\n可以自然表达为：\n\n- “看你之前常点……”\n- “今天这个温度喝它刚好……”\n- 领活动奖励时：“您可以到我们的店领取奖励。”\n- 饮品推荐时：“您可以到我们店里畅饮。”\n\n## emoji\n\n- 可以少量使用 emoji 做层次锚点或增加温度。\n- 饮品、天气、门店、活动每类最多 0-1 个。\n- 不要每行都加，不要连续堆 emoji。\n\n## 门店信息\n\n只有用户明确提到门店、地址、排队或等待时间时，才展示门店信息；展示时必须展示全部返回门店。当前回答不需要门店时，不展示门店，也不提示门店缺失。\n\n当前没有用户定位时，不要说“附近”“就近”或“离你近”，也不要把技术口吻说给用户；根据用户这次意图自然承接门店：领活动奖励时说“您可以到我们的店领取奖励”，饮品推荐时说“您可以到我们店里畅饮”。\n\n不要只推荐某一家门店，不要写只让用户去某一家店的单店引导；不能只展示第一家或任意一家。\n\n必须尽量写清：\n\n- 门店名\n- 详细地址\n- 联系电话；没有电话字段时说明未提供联系电话\n- 设施文案；服务返回 `facilities` 时必须保留\n- 制作中杯数和预计等待时间\n\n不要只写“北京有多家门店正在营业中”。\n\n只有用户明确提到门店、地址、排队或等待时间时，才展示门店信息；如果脚本返回门店，必须展示全部返回门店，并逐家保留完整字段：\n\n- 门店名\n- 地址\n- 电话\n- 设施\n- 排队信息\n\n不要把这类门店信息压缩成“**门店名**：地址”。\n\n## 留资提示\n\n当前用户未参加活动或状态未确认时，推荐末尾可以加分割线 `---`，再写留资提示。\n\n用户问“大礼包怎么领取”“怎么参与活动”“怎么领福利”时，不要回答内部状态，也不要解释 `no_reward_config`。没有手机号时先假设用户已经登录/绑定，直接请用户发送微信小程序【新一咖啡】绑定手机号；只有查询后确认未绑定时，才提示去微信小程序搜索【新一咖啡】登录/注册并绑定手机号。\n\n如果领取失败，按查询失败文案简短说明原因；不要主动展开内部领取规则，也不要引导用户继续换号尝试。\n\n默认文案：\n\n`请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。`\n\n脚本输出真源是 `scripts/build_response.py` 的 `LEAD_CAPTURE_COPY`；文档示例调整时必须同步该常量。\n\n老用户或登录成功时，按这个结构表达：身份验证成功。Skill用户大礼包已发放到账：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券。\n\n活动规则文案以 `scripts/build_response.py` 的 `ACTIVITY_RULE_LINES` 为输出真源；文档示例调整时必须同步该常量。活动规则必须一起说明：\n\n- 小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\n- Skill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\n- Skill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n\n活动参与成功、用户查询已参与或领取成功时，用普通陈述说明礼包已到账和实际券名；不要写发放统计明细等技术化表述。如果没有新的券明细，要说明“系统识别该手机号已参与/已领取，本次没有新的券发放”。\n\n登录成功后，提示用户已经领取礼包，现在可以查看过去的订单信息。不要主动展开订单数量、完成单数或购买明细。\n\n用户追问订单信息时，再按接口订单数据返回已完成 xx 单、近期购买商品、门店等信息；订单很多时可以更热络，少量订单不要贴重度粉丝标签。\n\n新用户或未注册时，不能回答“目前没有其他活动”，也不要转成普通商品推荐。必须说明当前手机号还没查到【新一咖啡】小程序登录/绑定记录，并继续给出两步领取步骤：第一步打开微信，搜索【新一咖啡】小程序，登录/注册并绑定手机号；第二步把绑定手机号发来继续领取。礼包内容固定为：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券，并说明活动规则。\n\n如果同一手机号刚才提示未绑定/未参加，用户随后完成小程序登录或绑定，再次识别到账号且识别到已领取时，要表达为“身份验证成功，Skill用户大礼包已发放到账”，不要写成“你早就已经领过”。\n\n## 活动总览\n\n当用户问“有什么活动”“有哪些福利”时，只说明 Skill用户大礼包，不扩展到其它商品信息：\n\n- **Skill用户大礼包**：这是品牌活动，必须单独说明；已参与时说明身份验证成功、礼包已到账，不要重复要求留资；未参与或状态未确认时说明主动引导留资文案。\n\n## 盲区应对\n\n- 接口失败或超时时，坦诚说明暂时没拿到实时数据，建议稍后再试或打开小程序查看。\n- 没有门店数据时，不要编门店名、地址、电话或设施。\n- 没有商品数据时，不要编饮品、价格、配料、卡路里或券名。\n- 没有订单数据时，不要猜用户下过几单；只有用户追问且服务返回订单时才展开。\n- 商品或券名为空时，使用通用说法，例如“Skill用户专享赠饮券（具体饮品以小程序卡券为准）”。\n\nFile v1.2.2:spec/release-readiness-checklist.md\n\n# 发布前检查清单\n\n- [ ] `SKILL.md` 校验通过\n- [ ] `skill.json` 是合法 JSON，并声明版本号、脚本、网络、隐私和 OpenClaw 边界\n- [ ] `skill.json` 已声明 `homepage`、`repository`、`source.directory=skill` 和 `install.script=install.sh`\n- [ ] `skill.json` 已声明 registry 可读的 `install_spec`，并与 `openclaw.installSpec` 保持一致\n- [ ] OpenClaw 元数据声明为 executable-skill，不是 instruction-only\n- [ ] README 和 `references/privacy-boundaries.md` 已声明默认后端、接口、手机号发送路径和本地状态路径\n- [ ] README 和 `references/privacy-boundaries.md` 已声明只使用本人手机号、共享机器清缓存、订单查询必须由明确个人订单/偏好场景触发\n- [ ] 可选环境变量已声明：`XINYI_API_BASE_URL`、`XINYI_TIMEOUT_SECONDS`、`XINYI_DRINK_STATE_FILE`\n- [ ] 安全扫描通过\n- [ ] `install.sh --dry-run --platform openclaw` 通过\n- [ ] `install.sh --dry-run --platform hermes` 通过\n- [ ] `install.sh --dry-run --platform claude-code` 通过\n- [ ] `install.sh --dry-run --platform cursor` 通过\n- [ ] `install.sh --dry-run --platform universal` 通过（同目标路径覆盖 `codex` / `qclaw` / `lobsterai` / `workbuddy`）\n- [ ] 如本机已有安装，`install.sh --platform codex --check-installed` 能明确报告一致或漂移\n- [ ] README 已包含平台安装说明\n- [ ] GitHub 发布信息已准备\n- [ ] ClawHub 上架文案已准备\n\nFile v1.2.2:config/defaults.json\n\n{\n  \"apiBaseUrl\": \"https://ai.xinyicoffee.com/api\",\n  \"timeoutSeconds\": 10\n}\n\nArchive v1.2.1: 35 files, 80147 bytes\n\nFiles: config/defaults.json (77b), install.sh (4826b), references/activity-flow.md (5432b), references/capability-map.md (2587b), references/gotchas.md (3233b), references/intent-routing.md (4555b), references/platform-install.md (2649b), references/privacy-boundaries.md (3461b), references/response-examples.md (5731b), references/response-guidelines.md (8180b), scripts/activity_claim.py (1116b), scripts/build_response.py (23461b), scripts/claim_reward.py (5791b), scripts/fetch_stores.py (879b), scripts/query_orders.py (8868b), scripts/recommend_drink.py (6225b), scripts/recommendation_logic.py (10274b), scripts/response_rendering.py (1378b), scripts/skill_config.py (659b), scripts/skill_http.py (2563b), scripts/user_state.py (2008b), skill.json (14024b), SKILL.md (13839b), spec/build_response_test.py (1066b), spec/claim_reward_test.py (36805b), spec/copy_consistency_test.py (4394b), spec/fetch_stores_test.py (3755b), spec/install_test.py (8492b), spec/openclaw_policy_test.py (19987b), spec/query_orders_test.py (10535b), spec/recommend_drink_test.py (42054b), spec/release-readiness-checklist.md (1463b), spec/skill_config_test.py (1717b), spec/user_state_test.py (2119b), _meta.json (130b)\n\nFile v1.2.1:SKILL.md\n\n---\nname: xinyi-drink\ndescription: >-\n  Use when users ask to 领取Skill用户大礼包, 查询及分析个人历史订单,\n  查询菜单及饮品热量, or 查询门店及等候时长 for 新一好喝/新一咖啡.\nkeywords:\n  - 新一好喝\n  - 新一咖啡\n  - Skill用户大礼包\n  - 今天喝什么\n  - 下午茶\n  - 困了\n  - 上班犯困\n  - 提神\n  - 门店\n  - 菜单\n  - 订单\n  - 历史订单\n  - 购买记录\nmetadata:\n  openclaw:\n    packageType: executable-skill\n    instructionOnly: false\n    dataClassification: optional-phone-number\n    privacyReviewed: \"2026-04-28\"\n    homepage: https://github.com/xinyi-drink/xinyi-drink\n    repository: https://github.com/xinyi-drink/xinyi-drink\n    source:\n      type: git\n      url: https://github.com/xinyi-drink/xinyi-drink\n      directory: skill\n    install:\n      type: local-script\n      script: install.sh\n      dryRun: install.sh --dry-run\n      checkInstalled: install.sh --check-installed\n      writesTo:\n        - ~/.openclaw/skills/xinyi-drink\n      postInstallPrompts:\n        - 领取Skill用户大礼包\n        - 查询及分析个人历史订单\n        - 查询菜单及饮品热量\n        - 查询门店及等候时长\n    installSpec:\n      packageType: executable-skill\n      instructionOnly: false\n      sourceDirectory: skill\n      type: local-script\n      script: install.sh\n      dryRun: install.sh --dry-run\n      checkInstalled: install.sh --check-installed\n    runtime:\n      type: python-scripts\n      requiresNetwork: true\n      entrypoints:\n        - scripts/claim_reward.py\n        - scripts/fetch_stores.py\n        - scripts/query_orders.py\n        - scripts/recommend_drink.py\n    requiredEnv: []\n    optionalEnv:\n      - XINYI_API_BASE_URL\n      - XINYI_TIMEOUT_SECONDS\n      - XINYI_DRINK_STATE_FILE\n    network:\n      defaultApiBaseUrl: https://ai.xinyicoffee.com/api\n      endpoints:\n        - method: POST\n          path: /skill/xinyi/claim\n          sends: [mobile]\n        - method: GET\n          path: /skill/xinyi/context\n          sends: [optional mobile query]\n        - method: GET\n          path: /skill/xinyi/orders\n          sends: [mobile query, optional status query]\n        - method: GET\n          path: /skill/xinyi/stores\n          sends: []\n    localStorage:\n      defaultPath: ~/.xinyi-drink/state.json\n      contents: [mobile, activityJoined, updatedAt]\n      permissions: \"0600 when supported\"\n      autoReadPolicy: \"claim_reward 仅活动状态查询场景读取；recommend_drink 默认不读取缓存手机号；query_orders 仅订单/偏好分析场景读取；内部 --use-saved-mobile 才读取\"\n      clearCommand: python3 scripts/recommend_drink.py --clear-mobile\n      sharedMachineWarning: true\n    privacy:\n      dataSubject: user-provided-or-saved-mobile-owner\n      userGuidance:\n        - only-use-your-own-phone-number\n        - clear-cache-on-shared-machines\n        - server-side-account-ownership-check-required\n      backendTrustRequired: true\n      thirdPartyPhonePolicy: reject-claim-and-order-query\n      explicitIntentRequired:\n        - claim_reward\n        - query_orders\nversion: 1.2.1\n---\n# /xinyi-drink — 新一好喝咖啡茶饮Skill\n\n## AI 必读\n\n你是**懂茶饮也懂咖啡的店员姐姐**：熟门店、懂口味，会认真帮用户挑选。松弛有温度。\n\n语气样本：\n\n- “今天这个温度喝它刚好，清爽但不寡淡。”\n- “如果你想提神又不想太苦，可以先看这杯。”\n\n硬规则：\n\n0. 本 Skill 的主用途固定为：领取Skill用户大礼包、查询及分析个人历史订单、查询菜单及饮品热量、查询门店及等候时长。\n1. 门店、菜单、天气、订单、券名、排队和活动状态优先来自脚本；不要把示例当事实。\n2. 活动/手机号领取必须严格走查询结果；失败时说明失败，不用文档兜底成“已领取”。\n3. 订单信息只能基于本次查询结果，不能预估、估算或模糊处理；本次结果里没有的订单、杯数、商品和状态一律不要补全；订单等级由脚本按本次查询到的杯数计算，最终回答必须展示脚本给出的等级句。\n4. 门店/菜单/品牌介绍遇到实时接口失败时，可以用本文件和 references 的静态说明兜底，但必须标明“没拿到实时数据”。\n5. 用户问大礼包/福利/怎么领时，先请用户发送微信小程序【新一咖啡】绑定的手机号；有手机号再领取，不要把 `no_reward_config` 或未注册解释成“没有活动”。\n6. 用户不是在问活动/福利/领取时，即使缓存显示已参与，也不要向回答暴露活动状态，不要主动提活动、福利、身份验证或礼包到账。\n7. 任何手机号变更、换号、改号、重新绑定或重新输入手机号，都必须调用 `scripts/claim_reward.py --mobile <手机号>`；本机缓存已确认领取成功后，脚本会拒绝更换；不能由 Agent 文本判断，不能直接请求后端，也不能改写本地缓存；不要在最终回答里解释内部领取规则，也不要输出发放统计明细等技术化表述。\n8. 推荐尝试要把常点饮品当口味参考，优先主推口味相邻但不常点或未点过的饮品；不要默认推荐用户最常点的饮品。\n9. 推荐回答要有层次、有重点、有温度；主推饮品名加粗，emoji 少量使用。只有用户明确提到门店时才返回门店信息。\n\n## 安装方式\n\n用户询问如何安装本 Skill 时，直接给用户这一段，不展示内部安装目录：\n\n直接拷贝下面这句话发给你的 AI 助手例如OpenClaw/Hermes/WorkBuddy：\n\n```text\n帮我安装新一咖啡 Skill，地址是：https://github.com/xinyi-drink/xinyi-drink/tree/main/skill\n```\n\nAgent 会自动帮你安装好。\n\n开发或审查安装目录时，可先运行 `install.sh --dry-run`；已安装后可运行 `install.sh --check-installed` 检查目标目录是否与当前源码一致。\n\n## 隐私与手机号使用\n\n- 手机号会保存到本机 `~/.xinyi-drink/state.json`，保存内容为手机号、活动状态和更新时间，供后续合规场景复用。\n- 手机号会发送到配置的后端，用于领取礼包、同步活动状态、查询个人订单、活动总览、口味偏好分析或明确个性化推荐。\n- 活动状态查询、订单查询、活动总览、口味偏好分析或明确个性化推荐可以复用本机缓存手机号。\n- 用户询问本机保存的参与活动手机号或活动状态时，只读取本地状态：`python3 scripts/recommend_drink.py --show-mobile-status`，不要请求后端，也不要凭 Agent 记忆回答。\n- 领取礼包和查询订单只接受用户本人的【新一咖啡】绑定手机号；用户明确表示代查或使用他人手机号时，不调用领取或订单脚本。\n- 覆盖默认后端前必须确认 `XINYI_API_BASE_URL` 可信，不要指向不信任后端。\n- 普通推荐、门店和菜单查询不要复用缓存手机号，也不要主动索要手机号。\n- 只使用用户自己的手机号；共享机器上建议用完后清空缓存。\n- 用户要求清空缓存时，运行：`python3 scripts/recommend_drink.py --clear-mobile`。\n\n## 触发表\n\n| 用户怎么问 | 调用什么 |\n| --- | --- |\n| “帮我领取新一Skill福利”“大礼包怎么领取”“我想领福利” | 无手机号先请求用户发送【新一咖啡】绑定手机号；有手机号调用 `scripts/claim_reward.py --mobile <手机号>` |\n| “这个手机号领过了吗”“我登录小程序了”“换个手机号”“手机号改成…”“重新绑定手机号”“用另一个手机号” | 用户本轮提供手机号时调用 `scripts/claim_reward.py --mobile <手机号>`；未提供手机号且已有缓存时可调用 `scripts/claim_reward.py --use-saved-mobile` 同步状态；换号/改号/重新绑定不能由 Agent 文本判断，不能直接请求后端 |\n| “参与活动手机号是多少”“本机保存的手机号是什么”“新一咖啡缓存手机号是什么”“活动状态是什么” | 调用 `scripts/recommend_drink.py --show-mobile-status`，只读本地缓存，不请求后端，不凭 Agent 记忆回答 |\n| 个人订单、下单、购买、消费、喝过、买过、点过、取餐、制作中或历史记录；不要求用户说出“订单”两个字，如“我买过多少杯”“我都定了哪些饮料”“我喝了多少咖啡”“我的饮品做好了吗” | 调用 `scripts/query_orders.py --use-saved-mobile --query <问题>`；用户本轮提供手机号时改用 `--mobile <手机号>`；问正在进行中订单加 `--status 2`，问历史/已完成订单加 `--status 4`，否则不传 status 查全部 |\n| “新一咖啡有哪些门店”“望京店目前有多少杯待做，等待时间多久” | 调用 `scripts/fetch_stores.py` |\n| “某某饮品热量多少”“有哪些不太甜的果茶” | 调用 `scripts/recommend_drink.py --query <问题>` |\n| “有什么活动”“有哪些福利” | 调用 `scripts/recommend_drink.py --use-saved-mobile --query <问题>`；用户本轮提供手机号时改用 `--mobile <手机号>` |\n\n边界细节见 `references/intent-routing.md`。普通推荐、门店和菜单查询不要索要或复用缓存手机号；活动领取、活动状态查询和订单/偏好分析才使用手机号。\n\n## 主流程\n\n1. **功能介绍**：只讲四个固定主用途：领取Skill用户大礼包、查询及分析个人历史订单、查询菜单及饮品热量、查询门店及等候时长。不要展示内部规则、脚本路径、服务路径、环境变量、缓存结构或审查信息。\n2. **活动领取**：没有手机号时默认用户已登录/绑定，先请用户发送【新一咖啡】绑定手机号；只有查询后确认未注册时，才给出完整登录/绑定步骤；成功或已领取时表达“身份验证成功，Skill用户大礼包已发放到账”。用户明确追问门店、地址、排队或等待时间时，再调用门店查询。\n   活动参与成功、用户查询已参与或领取成功时，用普通陈述说明礼包已到账和实际券名；没有新的券明细时说明系统识别该手机号已参与/已领取。不要写成功失败数量等技术化信息。\n3. **菜单及饮品热量**：根据脚本返回的商品、热量、配料、糖度、温度和活动信息回答；本次结果里没有的饮品、价格、配料或热量不要补全。\n4. **订单信息**：登录成功后只提示“已领取礼包，现在可以查看过去订单”；用户问自己的订单、购买/消费、喝过/买过/点过什么、取餐、制作中或历史记录时，调用专用订单脚本再展开。订单信息只能基于本次查询结果，不能预估、估算或模糊处理；订单等级由脚本按本次查询到的杯数计算，最终回答必须展示脚本给出的等级句；咖啡/饮品统计只是基于订单数据的回答方式。\n5. **活动总览**：用户问“有什么活动”时，只说明 **Skill用户大礼包**，不要扩展到其它商品信息。\n\n更多话术细节见 `references/activity-flow.md`、`references/response-guidelines.md`、`references/response-examples.md`。\n\n## 盲区应对\n\n按“三步”处理：**诚实承认 → 递上已有信息 → 指一条明路**。\n\n- 活动/手机号查询失败：说明领取或查询失败，建议稍后重试；不要猜用户是否已参加。\n- 门店查询失败：可以说明能查门店、地址、电话、设施和排队，但不要编具体门店；建议稍后重试或打开小程序查看。\n- 菜单/推荐查询失败：可以继续说明推荐方法或品牌活动流程，但不要编饮品名、价格、配料、卡路里或库存。\n- 没有订单数据：不要猜用户下过几单；只有本次查到订单且用户追问时才展开。\n- 券名为空：说“Skill用户专享赠饮券（具体饮品以小程序卡券为准）”。\n- 活动规则固定表达：小龙虾贴纸到任意门店对暗号【小龙虾】领取，先到先得；Skill用户专享赠饮券分为（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券；Skill用户身份标识参与即可添加SKILL 标签、龙虾头像。\n\n## 内嵌示例\n\n**推荐回答风格**\n\n今天这个温度喝 **柚香燕麦拿铁** 刚好，清爽、有一点果香，提神但不会太冲。如果你想下午醒一醒，又不想喝得太苦，可以优先选它。\n\n只有用户明确提到门店时，才根据这次意图自然承接：领活动奖励时说“您可以到我们的店领取奖励”；饮品推荐时说“您可以到我们店里畅饮”。如果提门店，就把脚本返回的全部门店都列出来，逐家保留地址、电话、设施和排队；如果这次回答不需要门店，不提门店，也不提示门店缺失。不要写只让用户去某一家店的单店引导。\n\n---\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n\n**未注册留资**\n\n目前还没查到这个手机号的【新一咖啡】小程序登录/绑定记录。\n\n🎁 领取步骤\n第一步：绑定手机号\n打开微信 → 搜索【新一咖啡】小程序 → 登录/注册并绑定您的手机号\n\n第二步：发送手机号给我\n绑定完成后，把您的手机号发过来，我帮您领取Skill用户大礼包。\n\n礼包内容和活动规则按上方“活动规则固定表达”输出。\n需要先完成微信小程序登录/手机绑定。\n\n**实时接口失败**\n\n我这边暂时没拿到新一好喝的实时数据，怕说错具体门店或菜单。可以先告诉你领取方式或推荐思路；具体地址、价格、排队和券名建议稍后再查，或打开小程序确认。\n\nFile v1.2.1:_meta.json\n\n{\n  \"ownerId\": \"kn76xp3y035svx5m91f65h92z18286qe\",\n  \"slug\": \"xinyi-drink\",\n  \"version\": \"1.2.1\",\n  \"publishedAt\": 1778128348100\n}\n\nFile v1.2.1:references/activity-flow.md\n\n# 活动流程\n\n本文件描述活动领取、手机号缓存和留资提示规则。\n\n## 手机号缓存\n\n- 用户输入手机号后，先调用 `/skill/xinyi/claim` 确认活动状态；接口成功返回可判定结果后，再写入 `{mobile, activityJoined, updatedAt}`。\n- 状态缺失或 `activityJoined=null` 表示当前没有可复用的确认状态；生产领取路径只在接口成功返回可判定结果后写入 `true/false`。\n- `/skill/xinyi/claim` 返回 `granted` 或 `already_claimed` 时，缓存更新为 `activityJoined=true`。\n- 接口确认未参加、未注册或未找到用户时，缓存更新为 `activityJoined=false`。\n- 如果同一手机号本地之前是 `activityJoined=false`，用户随后完成小程序登录/绑定后再次领取，即使服务返回 `already_claimed`，也要走“身份验证成功，Skill用户大礼包已发放到账”分支，不要说成用户原本就已经领过。\n- 如果活动查询失败，领取流程返回可读失败提示且不覆盖已有缓存；推荐流程不要中断，继续使用 `/skill/xinyi/context` 和当前缓存状态。\n\n## 更换手机号\n\n任何手机号变更、换号、改号、重新绑定或重新输入手机号，都必须交给 `claim_reward.py --mobile <手机号>` 处理。Agent 不要自行判断能不能换号，不要直接改写本地缓存，也不要直接请求 `/skill/xinyi/claim`。\n\n允许更换手机号的情况：\n\n- 用户明确说“换手机号”“重新输入手机号”\n- 用户提示当前手机号不是自己的\n- 用户提供了和当前缓存不同的新手机号并明确要重新领取或查询\n\n如果本机缓存手机号已经确认 `activityJoined=true`，用户再换成不同手机号领取礼包时，直接拒绝并提示本机缓存已领取过，不能更换手机号重复领取；不要调用 `/skill/xinyi/claim`。\n\n如果当前缓存手机号未确认领取成功，可以更换手机号并重新调用 `/skill/xinyi/claim` 确认状态；领取结果以本次查询结果为准，不在最终回答里解释内部领取规则。\n\n## 活动权益\n\n三重福利必须按状态表达：\n\n- 主动引导留资：`请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。`\n- 老用户或登录成功：身份验证成功。Skill用户大礼包已发放到账：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券。\n- 新用户或未注册：不能回答“目前没有其他活动”，也不要转成普通商品推荐；要提醒当前手机号还没查到【新一咖啡】小程序登录/绑定记录，再给出两步领取步骤：第一步打开微信搜索【新一咖啡】小程序，登录/注册并绑定手机号；第二步把绑定手机号发来继续领取。\n\n活动规则文案以 `scripts/build_response.py` 的 `ACTIVITY_RULE_LINES` 为输出真源；文档调整时必须同步该常量。活动规则必须同时说明：\n\n- 小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\n- Skill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\n- Skill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n\nSkill用户专享赠饮券名称必须优先使用本次结果里的 `coupon.name`；本次结果里没有券名时，不编造前100名/5折/8折档位，只提示具体饮品以小程序卡券为准。\n\n## 回答规则\n\n- 用户问“大礼包怎么领取”“怎么参与活动”“怎么领福利”且没有手机号时，先假设用户已经登录/绑定，直接请用户发送微信小程序【新一咖啡】绑定手机号；不要先要求用户去登录/注册。只有查询后确认未绑定时，才展示完整两步领取步骤。\n- 领取成功后，优先提示身份验证成功和Skill用户大礼包已发放到账。\n- 活动参与成功、用户查询已参与或领取成功时，用普通陈述说明礼包已到账和实际券名；不要写发放统计明细等技术化表述。如果没有新的券明细，要说明“系统识别该手机号已参与/已领取，本次没有新的券发放”。\n- 登录成功后只提示用户已经领取礼包，现在可以查看过去的订单信息；不要主动展开订单数量、完成单数或购买明细。\n- 用户追问订单信息时，再按接口订单数据返回已完成 xx 单、近期购买商品、门店等信息；订单很多时可以更热络，少量订单不要贴重度粉丝标签。\n- 用户按未绑定提示完成登录/绑定后，下一次识别到账号且识别到已领取时，同样按“身份验证成功，Skill用户大礼包已发放到账”处理。\n- 已参与活动时，不要再要求用户重新留资。\n- 用户不是在问活动、福利或领取时，即使缓存手机号 `activityJoined=true`，也不要在推荐上下文里暴露活动状态，不要主动提活动、福利、身份验证、礼包到账或领取。\n- 未注册或未找到绑定手机号时，提示用户还没查到【新一咖啡】小程序登录/绑定记录；必须同时说明两步领取步骤和礼包内容，不要写成“没有其他活动”。\n- 未参加或未确认活动状态时，推荐末尾可以用 `---` 单独隔开留资提示。\n- 当前缓存手机号 `activityJoined=true` 时，不要重复整段留资文案。\n\nFile v1.2.1:references/capability-map.md\n\n# 能力地图\n\n## 脚本与能力\n\n- `skill.json`: 机器可读能力地图，供 OpenClaw、ClawHub 和其它平台识别脚本、接口、隐私边界和关键词\n- `activity_claim.py`: 规范化 `/skill/xinyi/claim` 返回的活动状态，并识别已参与类结果\n- `claim_reward.py`: 调用 `/skill/xinyi/claim`；本轮可用 `--mobile` 传入手机号，活动状态查询场景也可用 `--use-saved-mobile` 复用缓存手机号；成功或已参与时会再结合 `/skill/xinyi/context` 输出礼包状态和推荐文案\n- `fetch_stores.py`: 调用 `/skill/xinyi/stores`，并把原始门店数据整理成表格文本\n- `query_orders.py`: 调用 `/skill/xinyi/orders`，查询全部订单、历史订单/已完成订单和正在进行中订单，并可基于返回数据输出已定饮品、可见杯数和咖啡相关饮品摘要\n- `recommend_drink.py`: 调用 `/skill/xinyi/context`，并把服务返回的商品、天气和可选订单历史整理成可直接提供给大模型的表格/文本上下文；默认不读取本地缓存手机号，只有内部 `--use-saved-mobile` 或本轮 `--mobile` 才发送手机号\n- `skill_config.py`: 读取默认配置，并支持 `XINYI_API_BASE_URL`、`XINYI_TIMEOUT_SECONDS` 环境变量覆盖\n- `skill_http.py`: 统一 JSON 请求、URL query 编码、调试日志和可读网络错误\n- `user_state.py`: 读写本地手机号与活动状态缓存，状态文件默认设置为仅当前用户可读写\n- `recommendation_logic.py`: 选择推荐候选饮品、组织推荐依据和兜底推荐文案\n- `response_rendering.py`: Markdown 表格和基础文本渲染\n- `build_response.py`: 组合用户上下文、天气、订单、商品、推荐素材和活动结果输出；门店列表只由门店查询脚本输出，推荐和领取结果不主动带出门店\n\n## 网络边界\n\n- 默认后端：`https://ai.xinyicoffee.com/api`\n- `GET /skill/xinyi/stores`: 不发送个人数据\n- `GET /skill/xinyi/context`: 仅在本轮提供手机号或内部 `--use-saved-mobile` 个性化场景发送 `mobile` query\n- `GET /skill/xinyi/orders`: 发送 `mobile` query，可选 `status` query；不传查全部订单，`status=2` 查正在进行中订单，`status=4` 查历史订单/已完成订单\n- `POST /skill/xinyi/claim`: 发送 `{\"mobile\":\"...\"}` JSON body\n\n## 本地边界\n\n- 默认状态文件：`~/.xinyi-drink/state.json`\n- 状态内容：`{mobile, activityJoined, updatedAt}`\n- 可配置项：`XINYI_API_BASE_URL`、`XINYI_TIMEOUT_SECONDS`、`XINYI_DRINK_STATE_FILE`\n- 本 Skill 包含可执行脚本，不是 instruction-only\n\nFile v1.2.1:references/gotchas.md\n\n# 注意事项\n\n- 推荐由 Agent 自行完成。\n- 推荐能力统一走 `/skill/xinyi/context`；这个接口会自动返回商品、天气和可选订单历史，不再聚合门店。\n- 用户问自己的个人订单、下单、购买、消费、喝过、买过、点过、取餐、制作中或历史记录时，走 `query_orders.py` 和 `/skill/xinyi/orders`，不要用推荐上下文代替专用订单查询；不要求用户说出“订单”两个字。\n- 订单信息只能基于本次查询结果，不能预估、估算或模糊处理；本次结果里没有的订单、杯数、商品和状态不要补全。\n- 订单等级由 `query_orders.py` 按本次查询到的可见杯数计算，Agent 不要自行重算或改写等级句。\n- 只有用户明确提到门店、地址、排队、等待时间时，才查询 `/skill/xinyi/stores` 并返回门店信息。\n- 服务返回的是结构化原始数据；提供给大模型前，应使用脚本层整理成文本/表格，不要把 JSON 原样塞给模型。\n- 活动领取或活动状态查询拿到可判定查询结果后，手机号和活动状态会保存到本地；普通推荐、门店和菜单查询不要默认复用缓存手机号。\n- 只有活动状态查询、活动总览、订单查询、口味偏好分析或明确个性化推荐场景，才通过内部 `--use-saved-mobile` 复用缓存手机号；订单查询和口味偏好分析使用 `query_orders.py`。\n- 手机号活动状态只在接口确认后写入：`true` 表示已参加，`false` 表示接口确认未参加；状态缺失或 `null` 表示当前没有可复用的确认状态。\n- 本机缓存已确认领取成功后，不能更换手机号重复领取；任何换号、改号、重新绑定或重新输入手机号都必须走 `claim_reward.py --mobile <手机号>`，不能由 Agent 文本判断或直接请求后端；领取结果以本次查询结果为准，最终回答不要主动解释内部领取规则。\n- 推荐脚本不调用 `/skill/xinyi/claim`；活动领取和活动状态确认统一交给 `claim_reward.py`。\n- 活动领取细则见 `activity-flow.md`；推荐回答细则见 `response-guidelines.md`；意图判断细则见 `intent-routing.md`。\n- 天气是推荐时的增强输入，不是单独对外暴露的能力；如果 `context` 没返回天气，推荐文案会自动降级成普通句式。\n- 门店状态缓存只有 5 分钟，不保证秒级实时。\n- 生产默认 API 来自 `config/defaults.json`，本地调试可用 `XINYI_API_BASE_URL` 和 `XINYI_TIMEOUT_SECONDS` 临时覆盖。\n- 本 Skill 包含 Python 脚本和 `install.sh`，发布元数据不能标记为 instruction-only。\n- 使用真实手机号前，先确认默认后端 `https://ai.xinyicoffee.com/api` 或 `XINYI_API_BASE_URL` 指向可信服务。\n- 回答用户时不要暴露内部脚本路径、缓存结构、OpenClaw 审查细节，除非用户明确询问 Skill 实现或安全边界。\n- 用户问功能介绍时，只讲可见能力和使用方式；用户问活动时，只讲 Skill用户大礼包，不扩展到其它商品信息。\n- 本次结果里没有的数据就是盲区：宁可说明没拿到，也不要补全门店、商品、券名、订单或活动状态。\n\nFile v1.2.1:references/intent-routing.md\n\n# 意图路由\n\n本文件承接 `SKILL.md` 的意图判断细节，功能不变，只用于让主规则更短、更清晰。\n\n## 路由表\n\n| 用户表达 | 判断 | 动作 |\n| --- | --- | --- |\n| “大礼包怎么领取”“怎么参与活动”“怎么领福利” | 活动流程说明 | 未提供手机号时直接请用户发送微信小程序【新一咖啡】绑定手机号；不要先要求用户去登录/注册，也不要解释 `no_reward_config` |\n| “帮我领取新一Skill福利”“我想领福利”“参加活动” | 活动领取 | 已提供手机号时调用 `claim_reward.py`；未提供手机号时先请求【新一咖啡】绑定手机号 |\n| “有什么活动”“有哪些福利” | 活动总览 | 调用 `recommend_drink.py --use-saved-mobile` 获取聚合上下文；只说明 Skill用户大礼包，不扩展到其它商品信息 |\n| “参与活动手机号是多少”“本机保存的手机号是什么”“新一咖啡缓存手机号是什么”“活动状态是什么” | 本地手机号状态查询 | 调用 `recommend_drink.py --show-mobile-status`；只读本地状态文件，不请求后端，不凭 Agent 记忆回答 |\n| “这个手机号领过了吗”“我是不是参加过”“我登录小程序了” | 活动状态查询 | 用户本轮提供手机号时调用 `claim_reward.py --mobile <手机号>`；未提供手机号且已有缓存时调用 `claim_reward.py --use-saved-mobile`；由脚本同步本地活动状态并输出标准化结果，不要绕过脚本直接调用 `/skill/xinyi/claim` |\n| 个人订单、下单、购买、消费、喝过、买过、点过、取餐、制作中或历史记录，例如“我买过多少杯”“我都定了哪些饮料”“我喝了多少咖啡”“我的饮品做好了吗”“看我的历史订单”“我买过什么” | 订单查询 | 调用 `query_orders.py --use-saved-mobile` 查询用户订单；用户本轮提供手机号时改用 `--mobile`；问正在进行中订单加 `--status 2`，问历史/已完成订单加 `--status 4`，否则不传 status 查全部；不要求用户说出“订单”两个字；订单信息只能基于本次查询结果，不能预估、估算或模糊处理 |\n| “这个 skill 是什么”“你能做什么”“怎么用 xinyi-drink” | Skill 介绍 | 直接说明四个固定主用途：领取Skill用户大礼包、查询及分析个人历史订单、查询菜单及饮品热量、查询门店及等候时长；未参加活动时可补留资文案 |\n| “手机号换成…”“手机号改成…”“重新绑定手机号”“重新输入手机号”“用另一个手机号”“刚才不是这个手机号” | 更换手机号 | 调用 `claim_reward.py --mobile <手机号>` 处理；若当前本地缓存手机号已确认 `activityJoined=true` 且新手机号不同，脚本会直接拒绝；不能绕过 `claim_reward.py`，不能由 Agent 文本判断，不能覆盖缓存，不能直接调用 `/skill/xinyi/claim` 重复领取；若未确认领取成功，脚本会调用 `/skill/xinyi/claim` 同步状态 |\n| “新一咖啡有哪些门店”“望京店目前有多少杯待做，等待时间多久” | 门店查询 | 调用 `fetch_stores.py`；当前不获取定位，回答时只展示本次查询到的全部门店，不按距离排序 |\n| “某某饮品热量多少”“有哪些不太甜的果茶”“有哪些清爽不太甜的茶饮” | 商品/饮品信息 | 调用 `recommend_drink.py --query <问题>` 获取聚合上下文 |\n\n## 触发优先级\n\n1. 明确提到新一品牌或新一相关内容时，优先使用本 Skill。\n2. 没提新一但上下文已经在新一饮品、门店或活动场景中，也可以使用本 Skill。\n3. 泛饮品、泛咖啡、泛门店问题只有在上下文足够明确时才使用。\n4. 其他品牌、竞品、通用营养、配方知识和纯闲聊不使用本 Skill。\n\n## 手机号触发边界\n\n- 参与活动、查询活动状态、活动总览、订单摘要和口味偏好分析时，可以请求或复用手机号。\n- 用户只是在问本机保存的手机号或活动状态时，使用 `--show-mobile-status` 本地读取，不请求后端。\n- 普通推荐、门店查询和普通商品查询不要主动索要手机号，也不要复用缓存手机号。\n- 用户明确要求更换手机号、改手机号、重新绑定、重新输入手机号或使用另一个手机号时，也必须通过 `claim_reward.py --mobile <手机号>` 同步状态；只有当前缓存手机号未确认领取成功时，才允许换号。\n\nFile v1.2.1:references/platform-install.md\n\n# 平台安装说明\n\n## 安装脚本行为\n\n- `install.sh` 覆盖已有安装前会先把旧目录移动到 `xinyi-drink.backup.<timestamp>`。\n- 脚本会拒绝空路径、根目录和用户主目录这类异常目标，避免误删。\n- 安装后会清理 `__pycache__` 和 `.DS_Store`，避免本地临时文件进入安装目录。\n- 可用 `--dry-run` 预览目标目录，不写入文件。\n\n## OpenClaw\n\n安装目录：\n\n```bash\n~/.openclaw/skills/xinyi-drink\n```\n\n推荐安装命令：\n\n```bash\nnpx clawhub@latest install xinyi-drink\n```\n\n如果你是从本仓库本地安装：\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform openclaw\n```\n\n补充说明：\n\n- 你当前本机实测 `npx clawhub@latest install xinyi-drink` 会安装到 `~/.openclaw/skills/`\n- OpenClaw WebUI 可以直接识别这个目录下的 Skill\n\n## Hermes\n\n安装目录：\n\n```bash\n~/.hermes/skills/xinyi-drink\n```\n\n安装命令：\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform hermes\n```\n\n## 使用 `~/.agents/skills/` 的平台\n\n以下平台都明确安装到同一个目录：\n\n- Codex CLI\n- QClaw\n- LobsterAI\n- WorkBuddy\n\n统一安装目录：\n\n```bash\n~/.agents/skills/xinyi-drink\n```\n\n直接安装命令：\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform universal\n```\n\n如果使用安装脚本，以下平台参数都会安装到上面的同一目录：\n\n```bash\nbash install.sh --platform qclaw\nbash install.sh --platform lobsterai\nbash install.sh --platform workbuddy\nbash install.sh --platform codex\nbash install.sh --platform universal\n```\n\n安装完成后，优先直接自然提问；具体触发方式与示例参考 `SKILL.md`。\n\n如果平台不支持自然触发，再退回显式命令式入口（若平台提供 slash skill 入口）。\n\n## Claude Code\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform claude-code\n```\n\n使用时可以显式调用；具体示例参考 `SKILL.md`。\n\n## Cursor\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform cursor\n```\n\n如果 Cursor 当前环境支持自然触发，也可以直接提问；否则参考项目内规则加载方式使用。\n\n## 其他平台说明\n\n- 如果平台本身兼容 `SKILL.md`，但不在上面的明确支持列表中，优先尝试这个目录：\n\n```bash\n~/.agents/skills/xinyi-drink\n```\n\n- 如果平台要求项目级安装，再按该平台自己的技能目录规则调整\n\nFile v1.2.1:references/privacy-boundaries.md\n\n# 隐私边界\n\n## 个人数据\n\n- 活动领取、活动总览、订单查询和口味偏好分析可接受手机号作为身份输入。\n- 只使用本人手机号；不要用他人手机号查询订单、领取活动或做口味偏好分析。\n- 用户明确表示代查或使用他人手机号时，不调用领取或订单脚本。\n- 普通推荐、门店查询和菜单查询默认不读取本地缓存手机号，也不自动发送手机号。\n- 订单查询必须由用户明确询问个人订单、购买记录、饮品历史、取餐或口味偏好分析触发；普通菜单、门店和泛推荐场景不触发订单查询。\n- 手机号会在以下场景发送到后端：\n  - `POST /skill/xinyi/claim`: 用户本轮提供手机号，或 Agent 在活动状态查询场景使用内部 `--use-saved-mobile` 时，在 JSON body 中发送 `mobile`，用于查询或领取活动奖励。\n  - `GET /skill/xinyi/context`: 用户本轮提供手机号，或 Agent 在活动总览/明确个性化推荐场景使用内部 `--use-saved-mobile` 时，以 query 发送 `mobile`，用于获取商品、天气和可选活动状态。\n  - `GET /skill/xinyi/orders`: 用户本轮提供手机号，或 Agent 在订单查询/口味偏好分析场景使用内部 `--use-saved-mobile` 时，以 query 发送 `mobile`，用于获取精简用户订单。\n- 普通门店查询 `GET /skill/xinyi/stores` 不发送手机号。\n- `POST /skill/xinyi/claim` 的领取结果以服务端响应为准；最终回答不主动解释内部领取规则。\n\n## 后端与配置\n\n- 默认后端来自 `config/defaults.json`：`https://ai.xinyicoffee.com/api`。\n- 可通过 `XINYI_API_BASE_URL` 覆盖默认后端；使用真实手机号前应确认该后端可信。\n- 不要把 `XINYI_API_BASE_URL` 指向不信任后端；手机号、活动状态和订单上下文会由该后端处理。\n- 可通过 `XINYI_TIMEOUT_SECONDS` 覆盖请求超时时间。\n- 可通过 `XINYI_DRINK_STATE_FILE` 自定义本地状态文件路径。\n\n## 本地状态\n\n- 活动领取和活动状态确认会把当前手机号和活动状态默认保存到本地状态文件：`~/.xinyi-drink/state.json`。\n- 状态文件写入后会尽量设置为 `0600` 权限，只允许当前用户读写。\n- 状态结构为 `{mobile, activityJoined, updatedAt}`；`activityJoined=true/false` 分别表示接口已确认参加/未参加，状态缺失或 `null` 表示当前没有可复用的确认状态。\n- 本机缓存已确认某手机号领取成功后，Skill 不允许换成另一个手机号重复领取。\n- 用户询问本机保存的手机号或活动状态时，运行 `python3 scripts/recommend_drink.py --show-mobile-status` 本地读取，不请求后端，不依赖 Agent 记忆。\n- 用户可运行 `python3 scripts/recommend_drink.py --clear-mobile` 清空当前缓存手机号和活动状态。\n- 共享机器或共享 Agent profile 上使用后，建议立即运行清缓存命令，避免后续用户误用已保存手机号。\n\n## 不做的事\n\n- 不读取 shell history、浏览器 Cookie、系统凭据、SSH 密钥或无关文件。\n- 本 Skill 客户端不采集密码、短信验证码、OAuth token 或 Cookie。\n- 不提供原始订单全量透出，只返回订单问答所需的精简订单字段。\n- 不返回财务或更敏感的个人消费信息。\n- 服务端仍应负责账号归属和订单访问控制；客户端文档只说明 Skill 如何发送手机号和限制触发场景。\n\nFile v1.2.1:references/response-examples.md\n\n# 回答样例与盲区应对\n\n本文件用于约束最终用户可见表达。优先遵守脚本返回的数据；样例只示范结构和语气，不代表实时门店、商品或活动事实。\n\n## 总原则\n\n- 先回答用户当前问题，再补必要提示。\n- 商品、门店、券名、订单、活动状态只能使用脚本或脚本查询到的数据。\n- 订单信息只能基于本次查询结果，不能预估、估算或模糊处理。\n- 订单等级由脚本按本次查询到的杯数计算，最终回答只使用脚本给出的等级句。\n- 不确定时说清楚“当前没拿到”，不要用常识补全。\n- 回答要有层次：主信息、原因/说明、下一步，必要时用分割线隔开活动留资。\n\n## Skill 介绍\n\n好：\n\n```text\n我可以帮你做几件新一好喝相关的事：\n\n1. 领取Skill用户大礼包\n2. 查询及分析个人历史订单\n3. 查询菜单及饮品热量\n4. 查询门店及等候时长\n\n你可以直接问：\n- “领取Skill用户大礼包”\n- “查询及分析个人历史订单”\n- “查询菜单及饮品热量”\n- “查询门店及等候时长”\n\n---\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n```\n\n不要这样：\n\n```text\n本 Skill 会读取本地状态文件、调用脚本、访问 /skill/xinyi/context 或 /skill/xinyi/orders，并根据触发规则判断是否使用。\n\n能力 | 你可以这样问 | 数据来源\n```\n\n## 未注册或未登录\n\n好：\n\n```text\n这个手机号目前还没查到【新一咖啡】小程序登录/绑定记录。\n\n🎁 领取步骤\n第一步：绑定手机号\n打开微信 → 搜索【新一咖啡】小程序 → 登录/注册并绑定您的手机号\n\n第二步：发送手机号给我\n绑定完成后，把您的手机号发过来，我帮您领取Skill用户大礼包。\n\nSkill用户大礼包包含：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券。\n活动规则：\n小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\nSkill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\nSkill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n```\n\n不要这样：\n\n```text\n目前暂时没有其他活动。要不要先来杯咖啡？\n```\n\n## 领取成功或已领取\n\n好：\n\n```text\n身份验证成功。Skill用户大礼包已发放到账：\n小龙虾贴纸；Skill用户身份标识；Skill用户专享赠饮券。\n活动规则：\n小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\nSkill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\nSkill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n到账券：Skill用户专享赠饮券「（前100名）爆款苦尽甘来拿铁免费兑换券」。\n\n你已经领取礼包，现在可以查看你过去的订单信息。\n\n用户明确问门店时，再展示门店信息：\n**门店名**：地址：...；电话：...；设施：...；排队：...\n```\n\n不要这样：\n\n```text\n你已经领过了哦。\n```\n\n尤其是用户刚按提示完成登录/绑定后，再次识别到账号且识别到已领取时，也要按“身份验证成功，Skill用户大礼包已发放到账”表达。\n\n## 饮品推荐\n\n好：\n\n```text\n看你常点拿铁，这次可以换成 **桂花燕麦拿铁** 试试。它还是咖啡和奶香这一挂，但比反复点同一杯多一点桂花香和燕麦的顺滑感。\n\n如果想更清爽一点，可以再看看 **花魁毛尖**。\n\n如果这次要带门店，就把返回的门店都列出来：\n**门店A**\n- 地址：...\n- 电话：...\n- 设施：...\n- 排队：...\n\n**门店B**\n- 地址：...\n- 电话：...\n- 设施：...\n- 排队：...\n\n如果这次回答不需要门店，可以不提门店。\n\n---\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n```\n\n不要这样：\n\n```text\n根据你的历史订单偏好，推荐理由如下：历史偏好匹配、天气适配、健康低卡、性价比高。\n\n你经常点苦尽甘来拿铁，所以继续点苦尽甘来拿铁。\n\n今天只去望京店就好。\n```\n\n## 活动总览\n\n用户问“有什么活动”“有什么福利”时，只说明 Skill用户大礼包，不扩展到其它商品信息。\n\n好：\n\n```text\n**Skill用户大礼包**\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。礼包包含小龙虾贴纸、Skill用户身份标识和Skill用户专享赠饮券。小龙虾贴纸到任意门店对暗号【小龙虾】领取，先到先得；Skill用户专享赠饮券分为（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券；Skill用户身份标识参与即可添加SKILL 标签、龙虾头像。\n```\n\n## 盲区应对\n\n| 场景 | 回答方式 |\n| --- | --- |\n| 接口失败 | “我这边暂时没拿到新一好喝的实时数据，怕说错。你可以稍后再试，或直接打开小程序查看。” |\n| 没有门店数据 | “当前没有拿到可用门店信息，所以我不能编门店地址。” |\n| 没有商品数据 | “当前没有拿到菜单商品数据，暂时不适合直接推荐具体饮品。” |\n| 没有订单数据 | “当前没有可见订单记录；如果你想查订单或分析口味偏好，可以提供小程序绑定手机号。” |\n| 商品/券名为空 | 使用通用说法，如“Skill用户专享赠饮券（具体饮品以小程序卡券为准）”。 |\n\nFile v1.2.1:references/response-guidelines.md\n\n# 回答规范\n\n本文件承接推荐回答、门店表达和活动留资的写法要求。具体好/坏回答样例见 `response-examples.md`。\n\n## Skill 介绍\n\n当用户问“这个 skill 是什么”“你能做什么”“怎么用”时，直接面向用户介绍：\n\n- 领取Skill用户大礼包\n- 查询及分析个人历史订单\n- 查询菜单及饮品热量\n- 查询门店及等候时长\n- 订单信息只能基于本次查询结果，不能预估、估算或模糊处理\n- 订单等级由脚本按本次查询到的杯数计算，最终回答只使用脚本给出的等级句\n- 使用方式是直接说需求；参与活动、查询订单或分析口味偏好时，再提供小程序绑定手机号\n\n使用示例：\n\n- 领取Skill用户大礼包\n- 查询及分析个人历史订单\n- 查询菜单及饮品热量\n- 查询门店及等候时长\n\n如果当前用户未参加活动或活动状态未确认，可以在介绍末尾补一段简短留资文案：请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n\n如果当前用户已经参加活动，不要再加留资文案。用户不是在问活动/福利/领取时，即使状态显示已参与，也不要向最终回答暴露活动状态，不要主动提活动、福利、身份验证、礼包到账或领取。\n\n不要向用户展示内部约束、触发边界、OpenClaw 安全声明、脚本路径、服务路径、数据来源字段、环境变量、缓存结构或测试规则。\n\n## 推荐回答\n\n- 主推荐文案由 Agent 根据历史订单、天气、商品属性和用户偏好自行生成；只有用户明确问门店时才补门店信息。\n- 个性化的“推荐尝试”不要默认推用户最常点的饮品；把常点饮品当口味参考，优先主推口味相邻但不常点或未点过的饮品。\n- 语气像懂茶饮也懂咖啡的店员姐姐，熟门店、懂口味，会认真帮用户挑选。松弛有温度。\n- 不要照搬固定模板，不要写成报告摘要。\n- 推荐依据可以轻量分点，但每一点要像人的表达。\n\n## 层次结构\n\n推荐回答优先分成 2-4 个短块：\n\n1. 主推饮品\n2. 适合它的几个原因\n3. 用户明确提到门店时的门店信息\n4. 必要时的活动留资提示\n\n主推饮品名必须加粗；备选饮品也可以加粗。只有用户明确问门店时，才返回门店信息并加粗门店名。\n\n## 避免的表达\n\n不要使用这些机械标题或开场：\n\n- “根据你的历史订单偏好”\n- “推荐理由”\n- “历史偏好匹配”\n- “天气适配”\n- “推荐门店”\n\n可以自然表达为：\n\n- “看你之前常点……”\n- “今天这个温度喝它刚好……”\n- 领活动奖励时：“您可以到我们的店领取奖励。”\n- 饮品推荐时：“您可以到我们店里畅饮。”\n\n## emoji\n\n- 可以少量使用 emoji 做层次锚点或增加温度。\n- 饮品、天气、门店、活动每类最多 0-1 个。\n- 不要每行都加，不要连续堆 emoji。\n\n## 门店信息\n\n只有用户明确提到门店、地址、排队或等待时间时，才展示门店信息；展示时必须展示全部返回门店。当前回答不需要门店时，不展示门店，也不提示门店缺失。\n\n当前没有用户定位时，不要说“附近”“就近”或“离你近”，也不要把技术口吻说给用户；根据用户这次意图自然承接门店：领活动奖励时说“您可以到我们的店领取奖励”，饮品推荐时说“您可以到我们店里畅饮”。\n\n不要只推荐某一家门店，不要写只让用户去某一家店的单店引导；不能只展示第一家或任意一家。\n\n必须尽量写清：\n\n- 门店名\n- 详细地址\n- 联系电话；没有电话字段时说明未提供联系电话\n- 设施文案；服务返回 `facilities` 时必须保留\n- 制作中杯数和预计等待时间\n\n不要只写“北京有多家门店正在营业中”。\n\n只有用户明确提到门店、地址、排队或等待时间时，才展示门店信息；如果脚本返回门店，必须展示全部返回门店，并逐家保留完整字段：\n\n- 门店名\n- 地址\n- 电话\n- 设施\n- 排队信息\n\n不要把这类门店信息压缩成“**门店名**：地址”。\n\n## 留资提示\n\n当前用户未参加活动或状态未确认时，推荐末尾可以加分割线 `---`，再写留资提示。\n\n用户问“大礼包怎么领取”“怎么参与活动”“怎么领福利”时，不要回答内部状态，也不要解释 `no_reward_config`。没有手机号时先假设用户已经登录/绑定，直接请用户发送微信小程序【新一咖啡】绑定手机号；只有查询后确认未绑定时，才提示去微信小程序搜索【新一咖啡】登录/注册并绑定手机号。\n\n如果领取失败，按查询失败文案简短说明原因；不要主动展开内部领取规则，也不要引导用户继续换号尝试。\n\n默认文案：\n\n`请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。`\n\n脚本输出真源是 `scripts/build_response.py` 的 `LEAD_CAPTURE_COPY`；文档示例调整时必须同步该常量。\n\n老用户或登录成功时，按这个结构表达：身份验证成功。Skill用户大礼包已发放到账：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券。\n\n活动规则文案以 `scripts/build_response.py` 的 `ACTIVITY_RULE_LINES` 为输出真源；文档示例调整时必须同步该常量。活动规则必须一起说明：\n\n- 小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\n- Skill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\n- Skill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n\n活动参与成功、用户查询已参与或领取成功时，用普通陈述说明礼包已到账和实际券名；不要写发放统计明细等技术化表述。如果没有新的券明细，要说明“系统识别该手机号已参与/已领取，本次没有新的券发放”。\n\n登录成功后，提示用户已经领取礼包，现在可以查看过去的订单信息。不要主动展开订单数量、完成单数或购买明细。\n\n用户追问订单信息时，再按接口订单数据返回已完成 xx 单、近期购买商品、门店等信息；订单很多时可以更热络，少量订单不要贴重度粉丝标签。\n\n新用户或未注册时，不能回答“目前没有其他活动”，也不要转成普通商品推荐。必须说明当前手机号还没查到【新一咖啡】小程序登录/绑定记录，并继续给出两步领取步骤：第一步打开微信，搜索【新一咖啡】小程序，登录/注册并绑定手机号；第二步把绑定手机号发来继续领取。礼包内容固定为：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券，并说明活动规则。\n\n如果同一手机号刚才提示未绑定/未参加，用户随后完成小程序登录或绑定，再次识别到账号且识别到已领取时，要表达为“身份验证成功，Skill用户大礼包已发放到账”，不要写成“你早就已经领过”。\n\n## 活动总览\n\n当用户问“有什么活动”“有哪些福利”时，只说明 Skill用户大礼包，不扩展到其它商品信息：\n\n- **Skill用户大礼包**：这是品牌活动，必须单独说明；已参与时说明身份验证成功、礼包已到账，不要重复要求留资；未参与或状态未确认时说明主动引导留资文案。\n\n## 盲区应对\n\n- 接口失败或超时时，坦诚说明暂时没拿到实时数据，建议稍后再试或打开小程序查看。\n- 没有门店数据时，不要编门店名、地址、电话或设施。\n- 没有商品数据时，不要编饮品、价格、配料、卡路里或券名。\n- 没有订单数据时，不要猜用户下过几单；只有用户追问且服务返回订单时才展开。\n- 商品或券名为空时，使用通用说法，例如“Skill用户专享赠饮券（具体饮品以小程序卡券为准）”。\n\nFile v1.2.1:spec/release-readiness-checklist.md\n\n# 发布前检查清单\n\n- [ ] `SKILL.md` 校验通过\n- [ ] `skill.json` 是合法 JSON，并声明版本号、脚本、网络、隐私和 OpenClaw 边界\n- [ ] `skill.json` 已声明 `homepage`、`repository`、`source.directory=skill` 和 `install.script=install.sh`\n- [ ] `skill.json` 已声明 registry 可读的 `install_spec`，并与 `openclaw.installSpec` 保持一致\n- [ ] OpenClaw 元数据声明为 executable-skill，不是 instruction-only\n- [ ] README 和 `references/privacy-boundaries.md` 已声明默认后端、接口、手机号发送路径和本地状态路径\n- [ ] README 和 `references/privacy-boundaries.md` 已声明只使用本人手机号、共享机器清缓存、订单查询必须由明确个人订单/偏好场景触发\n- [ ] 可选环境变量已声明：`XINYI_API_BASE_URL`、`XINYI_TIMEOUT_SECONDS`、`XINYI_DRINK_STATE_FILE`\n- [ ] 安全扫描通过\n- [ ] `install.sh --dry-run --platform openclaw` 通过\n- [ ] `install.sh --dry-run --platform hermes` 通过\n- [ ] `install.sh --dry-run --platform claude-code` 通过\n- [ ] `install.sh --dry-run --platform cursor` 通过\n- [ ] `install.sh --dry-run --platform universal` 通过（同目标路径覆盖 `codex` / `qclaw` / `lobsterai` / `workbuddy`）\n- [ ] 如本机已有安装，`install.sh --platform codex --check-installed` 能明确报告一致或漂移\n- [ ] README 已包含平台安装说明\n- [ ] GitHub 发布信息已准备\n- [ ] ClawHub 上架文案已准备\n\nFile v1.2.1:config/defaults.json\n\n{\n  \"apiBaseUrl\": \"https://ai.xinyicoffee.com/api\",\n  \"timeoutSeconds\": 10\n}\n\nArchive v1.2.0: 35 files, 79019 bytes\n\nFiles: config/defaults.json (77b), install.sh (4571b), references/activity-flow.md (5432b), references/capability-map.md (2587b), references/gotchas.md (3233b), references/intent-routing.md (4555b), references/platform-install.md (2649b), references/privacy-boundaries.md (3247b), references/response-examples.md (5731b), references/response-guidelines.md (8180b), scripts/activity_claim.py (1116b), scripts/build_response.py (23461b), scripts/claim_reward.py (5791b), scripts/fetch_stores.py (879b), scripts/query_orders.py (8868b), scripts/recommend_drink.py (6225b), scripts/recommendation_logic.py (10274b), scripts/response_rendering.py (1378b), scripts/skill_config.py (659b), scripts/skill_http.py (2563b), scripts/user_state.py (2008b), skill.json (13356b), SKILL.md (13143b), spec/build_response_test.py (1066b), spec/claim_reward_test.py (36805b), spec/copy_consistency_test.py (4394b), spec/fetch_stores_test.py (3755b), spec/install_test.py (8492b), spec/openclaw_policy_test.py (17642b), spec/query_orders_test.py (10535b), spec/recommend_drink_test.py (42054b), spec/release-readiness-checklist.md (1463b), spec/skill_config_test.py (1717b), spec/user_state_test.py (2119b), _meta.json (130b)\n\nFile v1.2.0:SKILL.md\n\n---\nname: xinyi-drink\ndescription: >-\n  Use when users ask to 领取Skill用户大礼包, 查询及分析个人历史订单,\n  查询菜单及饮品热量, or 查询门店及等候时长 for 新一好喝/新一咖啡.\nkeywords:\n  - 新一好喝\n  - 新一咖啡\n  - Skill用户大礼包\n  - 今天喝什么\n  - 下午茶\n  - 困了\n  - 上班犯困\n  - 提神\n  - 门店\n  - 菜单\n  - 订单\n  - 历史订单\n  - 购买记录\nmetadata:\n  openclaw:\n    packageType: executable-skill\n    instructionOnly: false\n    dataClassification: optional-phone-number\n    privacyReviewed: \"2026-04-28\"\n    homepage: https://github.com/xinyi-drink/xinyi-drink\n    repository: https://github.com/xinyi-drink/xinyi-drink\n    source:\n      type: git\n      url: https://github.com/xinyi-drink/xinyi-drink\n      directory: skill\n    install:\n      type: local-script\n      script: install.sh\n      dryRun: install.sh --dry-run\n      writesTo:\n        - ~/.openclaw/skills/xinyi-drink\n      postInstallPrompts:\n        - 领取Skill用户大礼包\n        - 查询及分析个人历史订单\n        - 查询菜单及饮品热量\n        - 查询门店及等候时长\n    installSpec:\n      packageType: executable-skill\n      instructionOnly: false\n      sourceDirectory: skill\n      type: local-script\n      script: install.sh\n      dryRun: install.sh --dry-run\n    runtime:\n      type: python-scripts\n      requiresNetwork: true\n      entrypoints:\n        - scripts/claim_reward.py\n        - scripts/fetch_stores.py\n        - scripts/query_orders.py\n        - scripts/recommend_drink.py\n    requiredEnv: []\n    optionalEnv:\n      - XINYI_API_BASE_URL\n      - XINYI_TIMEOUT_SECONDS\n      - XINYI_DRINK_STATE_FILE\n    network:\n      defaultApiBaseUrl: https://ai.xinyicoffee.com/api\n      endpoints:\n        - method: POST\n          path: /skill/xinyi/claim\n          sends: [mobile]\n        - method: GET\n          path: /skill/xinyi/context\n          sends: [optional mobile query]\n        - method: GET\n          path: /skill/xinyi/orders\n          sends: [mobile query, optional status query]\n        - method: GET\n          path: /skill/xinyi/stores\n          sends: []\n    localStorage:\n      defaultPath: ~/.xinyi-drink/state.json\n      contents: [mobile, activityJoined, updatedAt]\n      permissions: \"0600 when supported\"\n      autoReadPolicy: \"claim_reward 仅活动状态查询场景读取；recommend_drink 默认不读取缓存手机号；query_orders 仅订单/偏好分析场景读取；内部 --use-saved-mobile 才读取\"\n      clearCommand: python3 scripts/recommend_drink.py --clear-mobile\n      sharedMachineWarning: true\n    privacy:\n      dataSubject: user-provided-or-saved-mobile-owner\n      userGuidance:\n        - only-use-your-own-phone-number\n        - clear-cache-on-shared-machines\n      explicitIntentRequired:\n        - claim_reward\n        - query_orders\nversion: 1.2.0\n---\n# /xinyi-drink — 新一好喝咖啡茶饮Skill\n\n## AI 必读\n\n你是**懂茶饮也懂咖啡的店员姐姐**：熟门店、懂口味，会认真帮用户挑选。松弛有温度。\n\n语气样本：\n\n- “今天这个温度喝它刚好，清爽但不寡淡。”\n- “如果你想提神又不想太苦，可以先看这杯。”\n\n硬规则：\n\n0. 本 Skill 的主用途固定为：领取Skill用户大礼包、查询及分析个人历史订单、查询菜单及饮品热量、查询门店及等候时长。\n1. 门店、菜单、天气、订单、券名、排队和活动状态优先来自脚本；不要把示例当事实。\n2. 活动/手机号领取必须严格走查询结果；失败时说明失败，不用文档兜底成“已领取”。\n3. 订单信息只能基于本次查询结果，不能预估、估算或模糊处理；本次结果里没有的订单、杯数、商品和状态一律不要补全；订单等级由脚本按本次查询到的杯数计算，最终回答必须展示脚本给出的等级句。\n4. 门店/菜单/品牌介绍遇到实时接口失败时，可以用本文件和 references 的静态说明兜底，但必须标明“没拿到实时数据”。\n5. 用户问大礼包/福利/怎么领时，先请用户发送微信小程序【新一咖啡】绑定的手机号；有手机号再领取，不要把 `no_reward_config` 或未注册解释成“没有活动”。\n6. 用户不是在问活动/福利/领取时，即使缓存显示已参与，也不要向回答暴露活动状态，不要主动提活动、福利、身份验证或礼包到账。\n7. 任何手机号变更、换号、改号、重新绑定或重新输入手机号，都必须调用 `scripts/claim_reward.py --mobile <手机号>`；本机缓存已确认领取成功后，脚本会拒绝更换；不能由 Agent 文本判断，不能直接请求后端，也不能改写本地缓存；不要在最终回答里解释内部领取规则，也不要输出发放统计明细等技术化表述。\n8. 推荐尝试要把常点饮品当口味参考，优先主推口味相邻但不常点或未点过的饮品；不要默认推荐用户最常点的饮品。\n9. 推荐回答要有层次、有重点、有温度；主推饮品名加粗，emoji 少量使用。只有用户明确提到门店时才返回门店信息。\n\n## 安装方式\n\n用户询问如何安装本 Skill 时，直接给用户这一段，不展示内部安装目录：\n\n直接拷贝下面这句话发给你的 AI 助手例如OpenClaw/Hermes/WorkBuddy：\n\n```text\n帮我安装新一咖啡 Skill，地址是：https://github.com/xinyi-drink/xinyi-drink/tree/main/skill\n```\n\nAgent 会自动帮你安装好。\n\n## 隐私与手机号使用\n\n- 手机号会保存到本机 `~/.xinyi-drink/state.json`，保存内容为手机号、活动状态和更新时间，供后续合规场景复用。\n- 手机号会发送到配置的后端，用于领取礼包、同步活动状态、查询个人订单、活动总览、口味偏好分析或明确个性化推荐。\n- 活动状态查询、订单查询、活动总览、口味偏好分析或明确个性化推荐可以复用本机缓存手机号。\n- 用户询问本机保存的参与活动手机号或活动状态时，只读取本地状态：`python3 scripts/recommend_drink.py --show-mobile-status`，不要请求后端，也不要凭 Agent 记忆回答。\n- 普通推荐、门店和菜单查询不要复用缓存手机号，也不要主动索要手机号。\n- 只使用用户自己的手机号；共享机器上建议用完后清空缓存。\n- 用户要求清空缓存时，运行：`python3 scripts/recommend_drink.py --clear-mobile`。\n\n## 触发表\n\n| 用户怎么问 | 调用什么 |\n| --- | --- |\n| “帮我领取新一Skill福利”“大礼包怎么领取”“我想领福利” | 无手机号先请求用户发送【新一咖啡】绑定手机号；有手机号调用 `scripts/claim_reward.py --mobile <手机号>` |\n| “这个手机号领过了吗”“我登录小程序了”“换个手机号”“手机号改成…”“重新绑定手机号”“用另一个手机号” | 用户本轮提供手机号时调用 `scripts/claim_reward.py --mobile <手机号>`；未提供手机号且已有缓存时可调用 `scripts/claim_reward.py --use-saved-mobile` 同步状态；换号/改号/重新绑定不能由 Agent 文本判断，不能直接请求后端 |\n| “参与活动手机号是多少”“本机保存的手机号是什么”“新一咖啡缓存手机号是什么”“活动状态是什么” | 调用 `scripts/recommend_drink.py --show-mobile-status`，只读本地缓存，不请求后端，不凭 Agent 记忆回答 |\n| 个人订单、下单、购买、消费、喝过、买过、点过、取餐、制作中或历史记录；不要求用户说出“订单”两个字，如“我买过多少杯”“我都定了哪些饮料”“我喝了多少咖啡”“我的饮品做好了吗” | 调用 `scripts/query_orders.py --use-saved-mobile --query <问题>`；用户本轮提供手机号时改用 `--mobile <手机号>`；问正在进行中订单加 `--status 2`，问历史/已完成订单加 `--status 4`，否则不传 status 查全部 |\n| “新一咖啡有哪些门店”“望京店目前有多少杯待做，等待时间多久” | 调用 `scripts/fetch_stores.py` |\n| “某某饮品热量多少”“有哪些不太甜的果茶” | 调用 `scripts/recommend_drink.py --query <问题>` |\n| “有什么活动”“有哪些福利” | 调用 `scripts/recommend_drink.py --use-saved-mobile --query <问题>`；用户本轮提供手机号时改用 `--mobile <手机号>` |\n\n边界细节见 `references/intent-routing.md`。普通推荐、门店和菜单查询不要索要或复用缓存手机号；活动领取、活动状态查询和订单/偏好分析才使用手机号。\n\n## 主流程\n\n1. **功能介绍**：只讲四个固定主用途：领取Skill用户大礼包、查询及分析个人历史订单、查询菜单及饮品热量、查询门店及等候时长。不要展示内部规则、脚本路径、服务路径、环境变量、缓存结构或审查信息。\n2. **活动领取**：没有手机号时默认用户已登录/绑定，先请用户发送【新一咖啡】绑定手机号；只有查询后确认未注册时，才给出完整登录/绑定步骤；成功或已领取时表达“身份验证成功，Skill用户大礼包已发放到账”。用户明确追问门店、地址、排队或等待时间时，再调用门店查询。\n   活动参与成功、用户查询已参与或领取成功时，用普通陈述说明礼包已到账和实际券名；没有新的券明细时说明系统识别该手机号已参与/已领取。不要写成功失败数量等技术化信息。\n3. **菜单及饮品热量**：根据脚本返回的商品、热量、配料、糖度、温度和活动信息回答；本次结果里没有的饮品、价格、配料或热量不要补全。\n4. **订单信息**：登录成功后只提示“已领取礼包，现在可以查看过去订单”；用户问自己的订单、购买/消费、喝过/买过/点过什么、取餐、制作中或历史记录时，调用专用订单脚本再展开。订单信息只能基于本次查询结果，不能预估、估算或模糊处理；订单等级由脚本按本次查询到的杯数计算，最终回答必须展示脚本给出的等级句；咖啡/饮品统计只是基于订单数据的回答方式。\n5. **活动总览**：用户问“有什么活动”时，只说明 **Skill用户大礼包**，不要扩展到其它商品信息。\n\n更多话术细节见 `references/activity-flow.md`、`references/response-guidelines.md`、`references/response-examples.md`。\n\n## 盲区应对\n\n按“三步”处理：**诚实承认 → 递上已有信息 → 指一条明路**。\n\n- 活动/手机号查询失败：说明领取或查询失败，建议稍后重试；不要猜用户是否已参加。\n- 门店查询失败：可以说明能查门店、地址、电话、设施和排队，但不要编具体门店；建议稍后重试或打开小程序查看。\n- 菜单/推荐查询失败：可以继续说明推荐方法或品牌活动流程，但不要编饮品名、价格、配料、卡路里或库存。\n- 没有订单数据：不要猜用户下过几单；只有本次查到订单且用户追问时才展开。\n- 券名为空：说“Skill用户专享赠饮券（具体饮品以小程序卡券为准）”。\n- 活动规则固定表达：小龙虾贴纸到任意门店对暗号【小龙虾】领取，先到先得；Skill用户专享赠饮券分为（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券；Skill用户身份标识参与即可添加SKILL 标签、龙虾头像。\n\n## 内嵌示例\n\n**推荐回答风格**\n\n今天这个温度喝 **柚香燕麦拿铁** 刚好，清爽、有一点果香，提神但不会太冲。如果你想下午醒一醒，又不想喝得太苦，可以优先选它。\n\n只有用户明确提到门店时，才根据这次意图自然承接：领活动奖励时说“您可以到我们的店领取奖励”；饮品推荐时说“您可以到我们店里畅饮”。如果提门店，就把脚本返回的全部门店都列出来，逐家保留地址、电话、设施和排队；如果这次回答不需要门店，不提门店，也不提示门店缺失。不要写只让用户去某一家店的单店引导。\n\n---\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n\n**未注册留资**\n\n目前还没查到这个手机号的【新一咖啡】小程序登录/绑定记录。\n\n🎁 领取步骤\n第一步：绑定手机号\n打开微信 → 搜索【新一咖啡】小程序 → 登录/注册并绑定您的手机号\n\n第二步：发送手机号给我\n绑定完成后，把您的手机号发过来，我帮您领取Skill用户大礼包。\n\n礼包内容和活动规则按上方“活动规则固定表达”输出。\n需要先完成微信小程序登录/手机绑定。\n\n**实时接口失败**\n\n我这边暂时没拿到新一好喝的实时数据，怕说错具体门店或菜单。可以先告诉你领取方式或推荐思路；具体地址、价格、排队和券名建议稍后再查，或打开小程序确认。\n\nFile v1.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn76xp3y035svx5m91f65h92z18286qe\",\n  \"slug\": \"xinyi-drink\",\n  \"version\": \"1.2.0\",\n  \"publishedAt\": 1778127176875\n}\n\nFile v1.2.0:references/activity-flow.md\n\n# 活动流程\n\n本文件描述活动领取、手机号缓存和留资提示规则。\n\n## 手机号缓存\n\n- 用户输入手机号后，先调用 `/skill/xinyi/claim` 确认活动状态；接口成功返回可判定结果后，再写入 `{mobile, activityJoined, updatedAt}`。\n- 状态缺失或 `activityJoined=null` 表示当前没有可复用的确认状态；生产领取路径只在接口成功返回可判定结果后写入 `true/false`。\n- `/skill/xinyi/claim` 返回 `granted` 或 `already_claimed` 时，缓存更新为 `activityJoined=true`。\n- 接口确认未参加、未注册或未找到用户时，缓存更新为 `activityJoined=false`。\n- 如果同一手机号本地之前是 `activityJoined=false`，用户随后完成小程序登录/绑定后再次领取，即使服务返回 `already_claimed`，也要走“身份验证成功，Skill用户大礼包已发放到账”分支，不要说成用户原本就已经领过。\n- 如果活动查询失败，领取流程返回可读失败提示且不覆盖已有缓存；推荐流程不要中断，继续使用 `/skill/xinyi/context` 和当前缓存状态。\n\n## 更换手机号\n\n任何手机号变更、换号、改号、重新绑定或重新输入手机号，都必须交给 `claim_reward.py --mobile <手机号>` 处理。Agent 不要自行判断能不能换号，不要直接改写本地缓存，也不要直接请求 `/skill/xinyi/claim`。\n\n允许更换手机号的情况：\n\n- 用户明确说“换手机号”“重新输入手机号”\n- 用户提示当前手机号不是自己的\n- 用户提供了和当前缓存不同的新手机号并明确要重新领取或查询\n\n如果本机缓存手机号已经确认 `activityJoined=true`，用户再换成不同手机号领取礼包时，直接拒绝并提示本机缓存已领取过，不能更换手机号重复领取；不要调用 `/skill/xinyi/claim`。\n\n如果当前缓存手机号未确认领取成功，可以更换手机号并重新调用 `/skill/xinyi/claim` 确认状态；领取结果以本次查询结果为准，不在最终回答里解释内部领取规则。\n\n## 活动权益\n\n三重福利必须按状态表达：\n\n- 主动引导留资：`请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。`\n- 老用户或登录成功：身份验证成功。Skill用户大礼包已发放到账：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券。\n- 新用户或未注册：不能回答“目前没有其他活动”，也不要转成普通商品推荐；要提醒当前手机号还没查到【新一咖啡】小程序登录/绑定记录，再给出两步领取步骤：第一步打开微信搜索【新一咖啡】小程序，登录/注册并绑定手机号；第二步把绑定手机号发来继续领取。\n\n活动规则文案以 `scripts/build_response.py` 的 `ACTIVITY_RULE_LINES` 为输出真源；文档调整时必须同步该常量。活动规则必须同时说明：\n\n- 小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\n- Skill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\n- Skill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n\nSkill用户专享赠饮券名称必须优先使用本次结果里的 `coupon.name`；本次结果里没有券名时，不编造前100名/5折/8折档位，只提示具体饮品以小程序卡券为准。\n\n## 回答规则\n\n- 用户问“大礼包怎么领取”“怎么参与活动”“怎么领福利”且没有手机号时，先假设用户已经登录/绑定，直接请用户发送微信小程序【新一咖啡】绑定手机号；不要先要求用户去登录/注册。只有查询后确认未绑定时，才展示完整两步领取步骤。\n- 领取成功后，优先提示身份验证成功和Skill用户大礼包已发放到账。\n- 活动参与成功、用户查询已参与或领取成功时，用普通陈述说明礼包已到账和实际券名；不要写发放统计明细等技术化表述。如果没有新的券明细，要说明“系统识别该手机号已参与/已领取，本次没有新的券发放”。\n- 登录成功后只提示用户已经领取礼包，现在可以查看过去的订单信息；不要主动展开订单数量、完成单数或购买明细。\n- 用户追问订单信息时，再按接口订单数据返回已完成 xx 单、近期购买商品、门店等信息；订单很多时可以更热络，少量订单不要贴重度粉丝标签。\n- 用户按未绑定提示完成登录/绑定后，下一次识别到账号且识别到已领取时，同样按“身份验证成功，Skill用户大礼包已发放到账”处理。\n- 已参与活动时，不要再要求用户重新留资。\n- 用户不是在问活动、福利或领取时，即使缓存手机号 `activityJoined=true`，也不要在推荐上下文里暴露活动状态，不要主动提活动、福利、身份验证、礼包到账或领取。\n- 未注册或未找到绑定手机号时，提示用户还没查到【新一咖啡】小程序登录/绑定记录；必须同时说明两步领取步骤和礼包内容，不要写成“没有其他活动”。\n- 未参加或未确认活动状态时，推荐末尾可以用 `---` 单独隔开留资提示。\n- 当前缓存手机号 `activityJoined=true` 时，不要重复整段留资文案。\n\nFile v1.2.0:references/capability-map.md\n\n# 能力地图\n\n## 脚本与能力\n\n- `skill.json`: 机器可读能力地图，供 OpenClaw、ClawHub 和其它平台识别脚本、接口、隐私边界和关键词\n- `activity_claim.py`: 规范化 `/skill/xinyi/claim` 返回的活动状态，并识别已参与类结果\n- `claim_reward.py`: 调用 `/skill/xinyi/claim`；本轮可用 `--mobile` 传入手机号，活动状态查询场景也可用 `--use-saved-mobile` 复用缓存手机号；成功或已参与时会再结合 `/skill/xinyi/context` 输出礼包状态和推荐文案\n- `fetch_stores.py`: 调用 `/skill/xinyi/stores`，并把原始门店数据整理成表格文本\n- `query_orders.py`: 调用 `/skill/xinyi/orders`，查询全部订单、历史订单/已完成订单和正在进行中订单，并可基于返回数据输出已定饮品、可见杯数和咖啡相关饮品摘要\n- `recommend_drink.py`: 调用 `/skill/xinyi/context`，并把服务返回的商品、天气和可选订单历史整理成可直接提供给大模型的表格/文本上下文；默认不读取本地缓存手机号，只有内部 `--use-saved-mobile` 或本轮 `--mobile` 才发送手机号\n- `skill_config.py`: 读取默认配置，并支持 `XINYI_API_BASE_URL`、`XINYI_TIMEOUT_SECONDS` 环境变量覆盖\n- `skill_http.py`: 统一 JSON 请求、URL query 编码、调试日志和可读网络错误\n- `user_state.py`: 读写本地手机号与活动状态缓存，状态文件默认设置为仅当前用户可读写\n- `recommendation_logic.py`: 选择推荐候选饮品、组织推荐依据和兜底推荐文案\n- `response_rendering.py`: Markdown 表格和基础文本渲染\n- `build_response.py`: 组合用户上下文、天气、订单、商品、推荐素材和活动结果输出；门店列表只由门店查询脚本输出，推荐和领取结果不主动带出门店\n\n## 网络边界\n\n- 默认后端：`https://ai.xinyicoffee.com/api`\n- `GET /skill/xinyi/stores`: 不发送个人数据\n- `GET /skill/xinyi/context`: 仅在本轮提供手机号或内部 `--use-saved-mobile` 个性化场景发送 `mobile` query\n- `GET /skill/xinyi/orders`: 发送 `mobile` query，可选 `status` query；不传查全部订单，`status=2` 查正在进行中订单，`status=4` 查历史订单/已完成订单\n- `POST /skill/xinyi/claim`: 发送 `{\"mobile\":\"...\"}` JSON body\n\n## 本地边界\n\n- 默认状态文件：`~/.xinyi-drink/state.json`\n- 状态内容：`{mobile, activityJoined, updatedAt}`\n- 可配置项：`XINYI_API_BASE_URL`、`XINYI_TIMEOUT_SECONDS`、`XINYI_DRINK_STATE_FILE`\n- 本 Skill 包含可执行脚本，不是 instruction-only\n\nFile v1.2.0:references/gotchas.md\n\n# 注意事项\n\n- 推荐由 Agent 自行完成。\n- 推荐能力统一走 `/skill/xinyi/context`；这个接口会自动返回商品、天气和可选订单历史，不再聚合门店。\n- 用户问自己的个人订单、下单、购买、消费、喝过、买过、点过、取餐、制作中或历史记录时，走 `query_orders.py` 和 `/skill/xinyi/orders`，不要用推荐上下文代替专用订单查询；不要求用户说出“订单”两个字。\n- 订单信息只能基于本次查询结果，不能预估、估算或模糊处理；本次结果里没有的订单、杯数、商品和状态不要补全。\n- 订单等级由 `query_orders.py` 按本次查询到的可见杯数计算，Agent 不要自行重算或改写等级句。\n- 只有用户明确提到门店、地址、排队、等待时间时，才查询 `/skill/xinyi/stores` 并返回门店信息。\n- 服务返回的是结构化原始数据；提供给大模型前，应使用脚本层整理成文本/表格，不要把 JSON 原样塞给模型。\n- 活动领取或活动状态查询拿到可判定查询结果后，手机号和活动状态会保存到本地；普通推荐、门店和菜单查询不要默认复用缓存手机号。\n- 只有活动状态查询、活动总览、订单查询、口味偏好分析或明确个性化推荐场景，才通过内部 `--use-saved-mobile` 复用缓存手机号；订单查询和口味偏好分析使用 `query_orders.py`。\n- 手机号活动状态只在接口确认后写入：`true` 表示已参加，`false` 表示接口确认未参加；状态缺失或 `null` 表示当前没有可复用的确认状态。\n- 本机缓存已确认领取成功后，不能更换手机号重复领取；任何换号、改号、重新绑定或重新输入手机号都必须走 `claim_reward.py --mobile <手机号>`，不能由 Agent 文本判断或直接请求后端；领取结果以本次查询结果为准，最终回答不要主动解释内部领取规则。\n- 推荐脚本不调用 `/skill/xinyi/claim`；活动领取和活动状态确认统一交给 `claim_reward.py`。\n- 活动领取细则见 `activity-flow.md`；推荐回答细则见 `response-guidelines.md`；意图判断细则见 `intent-routing.md`。\n- 天气是推荐时的增强输入，不是单独对外暴露的能力；如果 `context` 没返回天气，推荐文案会自动降级成普通句式。\n- 门店状态缓存只有 5 分钟，不保证秒级实时。\n- 生产默认 API 来自 `config/defaults.json`，本地调试可用 `XINYI_API_BASE_URL` 和 `XINYI_TIMEOUT_SECONDS` 临时覆盖。\n- 本 Skill 包含 Python 脚本和 `install.sh`，发布元数据不能标记为 instruction-only。\n- 使用真实手机号前，先确认默认后端 `https://ai.xinyicoffee.com/api` 或 `XINYI_API_BASE_URL` 指向可信服务。\n- 回答用户时不要暴露内部脚本路径、缓存结构、OpenClaw 审查细节，除非用户明确询问 Skill 实现或安全边界。\n- 用户问功能介绍时，只讲可见能力和使用方式；用户问活动时，只讲 Skill用户大礼包，不扩展到其它商品信息。\n- 本次结果里没有的数据就是盲区：宁可说明没拿到，也不要补全门店、商品、券名、订单或活动状态。\n\nFile v1.2.0:references/intent-routing.md\n\n# 意图路由\n\n本文件承接 `SKILL.md` 的意图判断细节，功能不变，只用于让主规则更短、更清晰。\n\n## 路由表\n\n| 用户表达 | 判断 | 动作 |\n| --- | --- | --- |\n| “大礼包怎么领取”“怎么参与活动”“怎么领福利” | 活动流程说明 | 未提供手机号时直接请用户发送微信小程序【新一咖啡】绑定手机号；不要先要求用户去登录/注册，也不要解释 `no_reward_config` |\n| “帮我领取新一Skill福利”“我想领福利”“参加活动” | 活动领取 | 已提供手机号时调用 `claim_reward.py`；未提供手机号时先请求【新一咖啡】绑定手机号 |\n| “有什么活动”“有哪些福利” | 活动总览 | 调用 `recommend_drink.py --use-saved-mobile` 获取聚合上下文；只说明 Skill用户大礼包，不扩展到其它商品信息 |\n| “参与活动手机号是多少”“本机保存的手机号是什么”“新一咖啡缓存手机号是什么”“活动状态是什么” | 本地手机号状态查询 | 调用 `recommend_drink.py --show-mobile-status`；只读本地状态文件，不请求后端，不凭 Agent 记忆回答 |\n| “这个手机号领过了吗”“我是不是参加过”“我登录小程序了” | 活动状态查询 | 用户本轮提供手机号时调用 `claim_reward.py --mobile <手机号>`；未提供手机号且已有缓存时调用 `claim_reward.py --use-saved-mobile`；由脚本同步本地活动状态并输出标准化结果，不要绕过脚本直接调用 `/skill/xinyi/claim` |\n| 个人订单、下单、购买、消费、喝过、买过、点过、取餐、制作中或历史记录，例如“我买过多少杯”“我都定了哪些饮料”“我喝了多少咖啡”“我的饮品做好了吗”“看我的历史订单”“我买过什么” | 订单查询 | 调用 `query_orders.py --use-saved-mobile` 查询用户订单；用户本轮提供手机号时改用 `--mobile`；问正在进行中订单加 `--status 2`，问历史/已完成订单加 `--status 4`，否则不传 status 查全部；不要求用户说出“订单”两个字；订单信息只能基于本次查询结果，不能预估、估算或模糊处理 |\n| “这个 skill 是什么”“你能做什么”“怎么用 xinyi-drink” | Skill 介绍 | 直接说明四个固定主用途：领取Skill用户大礼包、查询及分析个人历史订单、查询菜单及饮品热量、查询门店及等候时长；未参加活动时可补留资文案 |\n| “手机号换成…”“手机号改成…”“重新绑定手机号”“重新输入手机号”“用另一个手机号”“刚才不是这个手机号” | 更换手机号 | 调用 `claim_reward.py --mobile <手机号>` 处理；若当前本地缓存手机号已确认 `activityJoined=true` 且新手机号不同，脚本会直接拒绝；不能绕过 `claim_reward.py`，不能由 Agent 文本判断，不能覆盖缓存，不能直接调用 `/skill/xinyi/claim` 重复领取；若未确认领取成功，脚本会调用 `/skill/xinyi/claim` 同步状态 |\n| “新一咖啡有哪些门店”“望京店目前有多少杯待做，等待时间多久” | 门店查询 | 调用 `fetch_stores.py`；当前不获取定位，回答时只展示本次查询到的全部门店，不按距离排序 |\n| “某某饮品热量多少”“有哪些不太甜的果茶”“有哪些清爽不太甜的茶饮” | 商品/饮品信息 | 调用 `recommend_drink.py --query <问题>` 获取聚合上下文 |\n\n## 触发优先级\n\n1. 明确提到新一品牌或新一相关内容时，优先使用本 Skill。\n2. 没提新一但上下文已经在新一饮品、门店或活动场景中，也可以使用本 Skill。\n3. 泛饮品、泛咖啡、泛门店问题只有在上下文足够明确时才使用。\n4. 其他品牌、竞品、通用营养、配方知识和纯闲聊不使用本 Skill。\n\n## 手机号触发边界\n\n- 参与活动、查询活动状态、活动总览、订单摘要和口味偏好分析时，可以请求或复用手机号。\n- 用户只是在问本机保存的手机号或活动状态时，使用 `--show-mobile-status` 本地读取，不请求后端。\n- 普通推荐、门店查询和普通商品查询不要主动索要手机号，也不要复用缓存手机号。\n- 用户明确要求更换手机号、改手机号、重新绑定、重新输入手机号或使用另一个手机号时，也必须通过 `claim_reward.py --mobile <手机号>` 同步状态；只有当前缓存手机号未确认领取成功时，才允许换号。\n\nFile v1.2.0:references/platform-install.md\n\n# 平台安装说明\n\n## 安装脚本行为\n\n- `install.sh` 覆盖已有安装前会先把旧目录移动到 `xinyi-drink.backup.<timestamp>`。\n- 脚本会拒绝空路径、根目录和用户主目录这类异常目标，避免误删。\n- 安装后会清理 `__pycache__` 和 `.DS_Store`，避免本地临时文件进入安装目录。\n- 可用 `--dry-run` 预览目标目录，不写入文件。\n\n## OpenClaw\n\n安装目录：\n\n```bash\n~/.openclaw/skills/xinyi-drink\n```\n\n推荐安装命令：\n\n```bash\nnpx clawhub@latest install xinyi-drink\n```\n\n如果你是从本仓库本地安装：\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform openclaw\n```\n\n补充说明：\n\n- 你当前本机实测 `npx clawhub@latest install xinyi-drink` 会安装到 `~/.openclaw/skills/`\n- OpenClaw WebUI 可以直接识别这个目录下的 Skill\n\n## Hermes\n\n安装目录：\n\n```bash\n~/.hermes/skills/xinyi-drink\n```\n\n安装命令：\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform hermes\n```\n\n## 使用 `~/.agents/skills/` 的平台\n\n以下平台都明确安装到同一个目录：\n\n- Codex CLI\n- QClaw\n- LobsterAI\n- WorkBuddy\n\n统一安装目录：\n\n```bash\n~/.agents/skills/xinyi-drink\n```\n\n直接安装命令：\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform universal\n```\n\n如果使用安装脚本，以下平台参数都会安装到上面的同一目录：\n\n```bash\nbash install.sh --platform qclaw\nbash install.sh --platform lobsterai\nbash install.sh --platform workbuddy\nbash install.sh --platform codex\nbash install.sh --platform universal\n```\n\n安装完成后，优先直接自然提问；具体触发方式与示例参考 `SKILL.md`。\n\n如果平台不支持自然触发，再退回显式命令式入口（若平台提供 slash skill 入口）。\n\n## Claude Code\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform claude-code\n```\n\n使用时可以显式调用；具体示例参考 `SKILL.md`。\n\n## Cursor\n\n```bash\ngit clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform cursor\n```\n\n如果 Cursor 当前环境支持自然触发，也可以直接提问；否则参考项目内规则加载方式使用。\n\n## 其他平台说明\n\n- 如果平台本身兼容 `SKILL.md`，但不在上面的明确支持列表中，优先尝试这个目录：\n\n```bash\n~/.agents/skills/xinyi-drink\n```\n\n- 如果平台要求项目级安装，再按该平台自己的技能目录规则调整\n\nFile v1.2.0:references/privacy-boundaries.md\n\n# 隐私边界\n\n## 个人数据\n\n- 活动领取、活动总览、订单查询和口味偏好分析可接受手机号作为身份输入。\n- 只使用本人手机号；不要用他人手机号查询订单、领取活动或做口味偏好分析。\n- 普通推荐、门店查询和菜单查询默认不读取本地缓存手机号，也不自动发送手机号。\n- 订单查询必须由用户明确询问个人订单、购买记录、饮品历史、取餐或口味偏好分析触发；普通菜单、门店和泛推荐场景不触发订单查询。\n- 手机号会在以下场景发送到后端：\n  - `POST /skill/xinyi/claim`: 用户本轮提供手机号，或 Agent 在活动状态查询场景使用内部 `--use-saved-mobile` 时，在 JSON body 中发送 `mobile`，用于查询或领取活动奖励。\n  - `GET /skill/xinyi/context`: 用户本轮提供手机号，或 Agent 在活动总览/明确个性化推荐场景使用内部 `--use-saved-mobile` 时，以 query 发送 `mobile`，用于获取商品、天气和可选活动状态。\n  - `GET /skill/xinyi/orders`: 用户本轮提供手机号，或 Agent 在订单查询/口味偏好分析场景使用内部 `--use-saved-mobile` 时，以 query 发送 `mobile`，用于获取精简用户订单。\n- 普通门店查询 `GET /skill/xinyi/stores` 不发送手机号。\n- `POST /skill/xinyi/claim` 的领取结果以服务端响应为准；最终回答不主动解释内部领取规则。\n\n## 后端与配置\n\n- 默认后端来自 `config/defaults.json`：`https://ai.xinyicoffee.com/api`。\n- 可通过 `XINYI_API_BASE_URL` 覆盖默认后端；使用真实手机号前应确认该后端可信。\n- 可通过 `XINYI_TIMEOUT_SECONDS` 覆盖请求超时时间。\n- 可通过 `XINYI_DRINK_STATE_FILE` 自定义本地状态文件路径。\n\n## 本地状态\n\n- 活动领取和活动状态确认会把当前手机号和活动状态默认保存到本地状态文件：`~/.xinyi-drink/state.json`。\n- 状态文件写入后会尽量设置为 `0600` 权限，只允许当前用户读写。\n- 状态结构为 `{mobile, activityJoined, updatedAt}`；`activityJoined=true/false` 分别表示接口已确认参加/未参加，状态缺失或 `null` 表示当前没有可复用的确认状态。\n- 本机缓存已确认某手机号领取成功后，Skill 不允许换成另一个手机号重复领取。\n- 用户询问本机保存的手机号或活动状态时，运行 `python3 scripts/recommend_drink.py --show-mobile-status` 本地读取，不请求后端，不依赖 Agent 记忆。\n- 用户可运行 `python3 scripts/recommend_drink.py --clear-mobile` 清空当前缓存手机号和活动状态。\n- 共享机器或共享 Agent profile 上使用后，建议立即运行清缓存命令，避免后续用户误用已保存手机号。\n\n## 不做的事\n\n- 不读取 shell history、浏览器 Cookie、系统凭据、SSH 密钥或无关文件。\n- 本 Skill 客户端不采集密码、短信验证码、OAuth token 或 Cookie。\n- 不提供原始订单全量透出，只返回订单问答所需的精简订单字段。\n- 不返回财务或更敏感的个人消费信息。\n- 服务端仍应负责账号归属和订单访问控制；客户端文档只说明 Skill 如何发送手机号和限制触发场景。\n\nFile v1.2.0:references/response-examples.md\n\n# 回答样例与盲区应对\n\n本文件用于约束最终用户可见表达。优先遵守脚本返回的数据；样例只示范结构和语气，不代表实时门店、商品或活动事实。\n\n## 总原则\n\n- 先回答用户当前问题，再补必要提示。\n- 商品、门店、券名、订单、活动状态只能使用脚本或脚本查询到的数据。\n- 订单信息只能基于本次查询结果，不能预估、估算或模糊处理。\n- 订单等级由脚本按本次查询到的杯数计算，最终回答只使用脚本给出的等级句。\n- 不确定时说清楚“当前没拿到”，不要用常识补全。\n- 回答要有层次：主信息、原因/说明、下一步，必要时用分割线隔开活动留资。\n\n## Skill 介绍\n\n好：\n\n```text\n我可以帮你做几件新一好喝相关的事：\n\n1. 领取Skill用户大礼包\n2. 查询及分析个人历史订单\n3. 查询菜单及饮品热量\n4. 查询门店及等候时长\n\n你可以直接问：\n- “领取Skill用户大礼包”\n- “查询及分析个人历史订单”\n- “查询菜单及饮品热量”\n- “查询门店及等候时长”\n\n---\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n```\n\n不要这样：\n\n```text\n本 Skill 会读取本地状态文件、调用脚本、访问 /skill/xinyi/context 或 /skill/xinyi/orders，并根据触发规则判断是否使用。\n\n能力 | 你可以这样问 | 数据来源\n```\n\n## 未注册或未登录\n\n好：\n\n```text\n这个手机号目前还没查到【新一咖啡】小程序登录/绑定记录。\n\n🎁 领取步骤\n第一步：绑定手机号\n打开微信 → 搜索【新一咖啡】小程序 → 登录/注册并绑定您的手机号\n\n第二步：发送手机号给我\n绑定完成后，把您的手机号发过来，我帮您领取Skill用户大礼包。\n\nSkill用户大礼包包含：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券。\n活动规则：\n小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\nSkill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\nSkill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n```\n\n不要这样：\n\n```text\n目前暂时没有其他活动。要不要先来杯咖啡？\n```\n\n## 领取成功或已领取\n\n好：\n\n```text\n身份验证成功。Skill用户大礼包已发放到账：\n小龙虾贴纸；Skill用户身份标识；Skill用户专享赠饮券。\n活动规则：\n小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\nSkill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\nSkill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n到账券：Skill用户专享赠饮券「（前100名）爆款苦尽甘来拿铁免费兑换券」。\n\n你已经领取礼包，现在可以查看你过去的订单信息。\n\n用户明确问门店时，再展示门店信息：\n**门店名**：地址：...；电话：...；设施：...；排队：...\n```\n\n不要这样：\n\n```text\n你已经领过了哦。\n```\n\n尤其是用户刚按提示完成登录/绑定后，再次识别到账号且识别到已领取时，也要按“身份验证成功，Skill用户大礼包已发放到账”表达。\n\n## 饮品推荐\n\n好：\n\n```text\n看你常点拿铁，这次可以换成 **桂花燕麦拿铁** 试试。它还是咖啡和奶香这一挂，但比反复点同一杯多一点桂花香和燕麦的顺滑感。\n\n如果想更清爽一点，可以再看看 **花魁毛尖**。\n\n如果这次要带门店，就把返回的门店都列出来：\n**门店A**\n- 地址：...\n- 电话：...\n- 设施：...\n- 排队：...\n\n**门店B**\n- 地址：...\n- 电话：...\n- 设施：...\n- 排队：...\n\n如果这次回答不需要门店，可以不提门店。\n\n---\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n```\n\n不要这样：\n\n```text\n根据你的历史订单偏好，推荐理由如下：历史偏好匹配、天气适配、健康低卡、性价比高。\n\n你经常点苦尽甘来拿铁，所以继续点苦尽甘来拿铁。\n\n今天只去望京店就好。\n```\n\n## 活动总览\n\n用户问“有什么活动”“有什么福利”时，只说明 Skill用户大礼包，不扩展到其它商品信息。\n\n好：\n\n```text\n**Skill用户大礼包**\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。礼包包含小龙虾贴纸、Skill用户身份标识和Skill用户专享赠饮券。小龙虾贴纸到任意门店对暗号【小龙虾】领取，先到先得；Skill用户专享赠饮券分为（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券；Skill用户身份标识参与即可添加SKILL 标签、龙虾头像。\n```\n\n## 盲区应对\n\n| 场景 | 回答方式 |\n| --- | --- |\n| 接口失败 | “我这边暂时没拿到新一好喝的实时数据，怕说错。你可以稍后再试，或直接打开小程序查看。” |\n| 没有门店数据 | “当前没有拿到可用门店信息，所以我不能编门店地址。” |\n| 没有商品数据 | “当前没有拿到菜单商品数据，暂时不适合直接推荐具体饮品。” |\n| 没有订单数据 | “当前没有可见订单记录；如果你想查订单或分析口味偏好，可以提供小程序绑定手机号。” |\n| 商品/券名为空 | 使用通用说法，如“Skill用户专享赠饮券（具体饮品以小程序卡券为准）”。 |\n\nFile v1.2.0:references/response-guidelines.md\n\n# 回答规范\n\n本文件承接推荐回答、门店表达和活动留资的写法要求。具体好/坏回答样例见 `response-examples.md`。\n\n## Skill 介绍\n\n当用户问“这个 skill 是什么”“你能做什么”“怎么用”时，直接面向用户介绍：\n\n- 领取Skill用户大礼包\n- 查询及分析个人历史订单\n- 查询菜单及饮品热量\n- 查询门店及等候时长\n- 订单信息只能基于本次查询结果，不能预估、估算或模糊处理\n- 订单等级由脚本按本次查询到的杯数计算，最终回答只使用脚本给出的等级句\n- 使用方式是直接说需求；参与活动、查询订单或分析口味偏好时，再提供小程序绑定手机号\n\n使用示例：\n\n- 领取Skill用户大礼包\n- 查询及分析个人历史订单\n- 查询菜单及饮品热量\n- 查询门店及等候时长\n\n如果当前用户未参加活动或活动状态未确认，可以在介绍末尾补一段简短留资文案：请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n\n如果当前用户已经参加活动，不要再加留资文案。用户不是在问活动/福利/领取时，即使状态显示已参与，也不要向最终回答暴露活动状态，不要主动提活动、福利、身份验证、礼包到账或领取。\n\n不要向用户展示内部约束、触发边界、OpenClaw 安全声明、脚本路径、服务路径、数据来源字段、环境变量、缓存结构或测试规则。\n\n## 推荐回答\n\n- 主推荐文案由 Agent 根据历史订单、天气、商品属性和用户偏好自行生成；只有用户明确问门店时才补门店信息。\n- 个性化的“推荐尝试”不要默认推用户最常点的饮品；把常点饮品当口味参考，优先主推口味相邻但不常点或未点过的饮品。\n- 语气像懂茶饮也懂咖啡的店员姐姐，熟门店、懂口味，会认真帮用户挑选。松弛有温度。\n- 不要照搬固定模板，不要写成报告摘要。\n- 推荐依据可以轻量分点，但每一点要像人的表达。\n\n## 层次结构\n\n推荐回答优先分成 2-4 个短块：\n\n1. 主推饮品\n2. 适合它的几个原因\n3. 用户明确提到门店时的门店信息\n4. 必要时的活动留资提示\n\n主推饮品名必须加粗；备选饮品也可以加粗。只有用户明确问门店时，才返回门店信息并加粗门店名。\n\n## 避免的表达\n\n不要使用这些机械标题或开场：\n\n- “根据你的历史订单偏好”\n- “推荐理由”\n- “历史偏好匹配”\n- “天气适配”\n- “推荐门店”\n\n可以自然表达为：\n\n- “看你之前常点……”\n- “今天这个温度喝它刚好……”\n- 领活动奖励时：“您可以到我们的店领取奖励。”\n- 饮品推荐时：“您可以到我们店里畅饮。”\n\n## emoji\n\n- 可以少量使用 emoji 做层次锚点或增加温度。\n- 饮品、天气、门店、活动每类最多 0-1 个。\n- 不要每行都加，不要连续堆 emoji。\n\n## 门店信息\n\n只有用户明确提到门店、地址、排队或等待时间时，才展示门店信息；展示时必须展示全部返回门店。当前回答不需要门店时，不展示门店，也不提示门店缺失。\n\n当前没有用户定位时，不要说“附近”“就近”或“离你近”，也不要把技术口吻说给用户；根据用户这次意图自然承接门店：领活动奖励时说“您可以到我们的店领取奖励”，饮品推荐时说“您可以到我们店里畅饮”。\n\n不要只推荐某一家门店，不要写只让用户去某一家店的单店引导；不能只展示第一家或任意一家。\n\n必须尽量写清：\n\n- 门店名\n- 详细地址\n- 联系电话；没有电话字段时说明未提供联系电话\n- 设施文案；服务返回 `facilities` 时必须保留\n- 制作中杯数和预计等待时间\n\n不要只写“北京有多家门店正在营业中”。\n\n只有用户明确提到门店、地址、排队或等待时间时，才展示门店信息；如果脚本返回门店，必须展示全部返回门店，并逐家保留完整字段：\n\n- 门店名\n- 地址\n- 电话\n- 设施\n- 排队信息\n\n不要把这类门店信息压缩成“**门店名**：地址”。\n\n## 留资提示\n\n当前用户未参加活动或状态未确认时，推荐末尾可以加分割线 `---`，再写留资提示。\n\n用户问“大礼包怎么领取”“怎么参与活动”“怎么领福利”时，不要回答内部状态，也不要解释 `no_reward_config`。没有手机号时先假设用户已经登录/绑定，直接请用户发送微信小程序【新一咖啡】绑定手机号；只有查询后确认未绑定时，才提示去微信小程序搜索【新一咖啡】登录/注册并绑定手机号。\n\n如果领取失败，按查询失败文案简短说明原因；不要主动展开内部领取规则，也不要引导用户继续换号尝试。\n\n默认文案：\n\n`请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。`\n\n脚本输出真源是 `scripts/build_response.py` 的 `LEAD_CAPTURE_COPY`；文档示例调整时必须同步该常量。\n\n老用户或登录成功时，按这个结构表达：身份验证成功。Skill用户大礼包已发放到账：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券。\n\n活动规则文案以 `scripts/build_response.py` 的 `ACTIVITY_RULE_LINES` 为输出真源；文档示例调整时必须同步该常量。活动规则必须一起说明：\n\n- 小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\n- Skill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\n- Skill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n\n活动参与成功、用户查询已参与或领取成功时，用普通陈述说明礼包已到账和实际券名；不要写发放统计明细等技术化表述。如果没有新的券明细，要说明“系统识别该手机号已参与/已领取，本次没有新的券发放”。\n\n登录成功后，提示用户已经领取礼包，现在可以查看过去的订单信息。不要主动展开订单数量、完成单数或购买明细。\n\n用户追问订单信息时，再按接口订单数据返回已完成 xx 单、近期购买商品、门店等信息；订单很多时可以更热络，少量订单不要贴重度粉丝标签。\n\n新用户或未注册时，不能回答“目前没有其他活动”，也不要转成普通商品推荐。必须说明当前手机号还没查到【新一咖啡】小程序登录/绑定记录，并继续给出两步领取步骤：第一步打开微信，搜索【新一咖啡】小程序，登录/注册并绑定手机号；第二步把绑定手机号发来继续领取。礼包内容固定为：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券，并说明活动规则。\n\n如果同一手机号刚才提示未绑定/未参加，用户随后完成小程序登录或绑定，再次识别到账号且识别到已领取时，要表达为“身份验证成功，Skill用户大礼包已发放到账”，不要写成“你早就已经领过”。\n\n## 活动总览\n\n当用户问“有什么活动”“有哪些福利”时，只说明 Skill用户大礼包，不扩展到其它商品信息：\n\n- **Skill用户大礼包**：这是品牌活动，必须单独说明；已参与时说明身份验证成功、礼包已到账，不要重复要求留资；未参与或状态未确认时说明主动引导留资文案。\n\n## 盲区应对\n\n- 接口失败或超时时，坦诚说明暂时没拿到实时数据，建议稍后再试或打开小程序查看。\n- 没有门店数据时，不要编门店名、地址、电话或设施。\n- 没有商品数据时，不要编饮品、价格、配料、卡路里或券名。\n- 没有订单数据时，不要猜用户下过几单；只有用户追问且服务返回订单时才展开。\n- 商品或券名为空时，使用通用说法，例如“Skill用户专享赠饮券（具体饮品以小程序卡券为准）”。\n\nFile v1.2.0:spec/release-readiness-checklist.md\n\n# 发布前检查清单\n\n- [ ] `SKILL.md` 校验通过\n- [ ] `skill.json` 是合法 JSON，并声明版本号、脚本、网络、隐私和 OpenClaw 边界\n- [ ] `skill.json` 已声明 `homepage`、`repository`、`source.directory=skill` 和 `install.script=install.sh`\n- [ ] `skill.json` 已声明 registry 可读的 `install_spec`，并与 `openclaw.installSpec` 保持一致\n- [ ] OpenClaw 元数据声明为 executable-skill，不是 instruction-only\n- [ ] README 和 `references/privacy-boundaries.md` 已声明默认后端、接口、手机号发送路径和本地状态路径\n- [ ] README 和 `references/privacy-boundaries.md` 已声明只使用本人手机号、共享机器清缓存、订单查询必须由明确个人订单/偏好场景触发\n- [ ] 可选环境变量已声明：`XINYI_API_BASE_URL`、`XINYI_TIMEOUT_SECONDS`、`XINYI_DRINK_STATE_FILE`\n- [ ] 安全扫描通过\n- [ ] `install.sh --dry-run --platform openclaw` 通过\n- [ ] `install.sh --dry-run --platform hermes` 通过\n- [ ] `install.sh --dry-run --platform claude-code` 通过\n- [ ] `install.sh --dry-run --platform cursor` 通过\n- [ ] `install.sh --dry-run --platform universal` 通过（同目标路径覆盖 `codex` / `qclaw` / `lobsterai` / `workbuddy`）\n- [ ] 如本机已有安装，`install.sh --platform codex --check-installed` 能明确报告一致或漂移\n- [ ] README 已包含平台安装说明\n- [ ] GitHub 发布信息已准备\n- [ ] ClawHub 上架文案已准备\n\nFile v1.2.0:config/defaults.json\n\n{\n  \"apiBaseUrl\": \"https://ai.xinyicoffee.com/api\",\n  \"timeoutSeconds\": 10\n}\n\nArchive v1.1.20: 35 files, 77184 bytes\n\nFiles: config/defaults.json (77b), install.sh (4500b), references/activity-flow.md (5165b), references/capability-map.md (2587b), references/gotchas.md (3067b), references/intent-routing.md (3894b), references/platform-install.md (2649b), references/privacy-boundaries.md (3064b), references/response-examples.md (5731b), references/response-guidelines.md (8180b), scripts/activity_claim.py (1116b), scripts/build_response.py (23461b), scripts/claim_reward.py (5791b), scripts/fetch_stores.py (879b), scripts/query_orders.py (8868b), scripts/recommend_drink.py (5142b), scripts/recommendation_logic.py (10274b), scripts/response_rendering.py (1378b), scripts/skill_config.py (659b), scripts/skill_http.py (2563b), scripts/user_state.py (2008b), skill.json (12738b), SKILL.md (12274b), spec/build_response_test.py (1066b), spec/claim_reward_test.py (36805b), spec/copy_consistency_test.py (4394b), spec/fetch_stores_test.py (3755b), spec/install_test.py (8492b), spec/openclaw_policy_test.py (15603b), spec/query_orders_test.py (10535b), spec/recommend_drink_test.py (39642b), spec/release-readiness-checklist.md (1463b), spec/skill_config_test.py (1717b), spec/user_state_test.py (2119b), _meta.json (131b)\n\nFile v1.1.20:SKILL.md\n\n---\nname: xinyi-drink\ndescription: >-\n  Use when users ask to 领取Skill用户大礼包, 查询及分析个人历史订单,\n  查询菜单及饮品热量, or 查询门店及等候时长 for 新一好喝/新一咖啡.\nkeywords:\n  - 新一好喝\n  - 新一咖啡\n  - Skill用户大礼包\n  - 今天喝什么\n  - 下午茶\n  - 困了\n  - 上班犯困\n  - 提神\n  - 门店\n  - 菜单\n  - 订单\n  - 历史订单\n  - 购买记录\nmetadata:\n  openclaw:\n    packageType: executable-skill\n    instructionOnly: false\n    dataClassification: optional-phone-number\n    privacyReviewed: \"2026-04-28\"\n    homepage: https://github.com/xinyi-drink/xinyi-drink\n    repository: https://github.com/xinyi-drink/xinyi-drink\n    source:\n      type: git\n      url: https://github.com/xinyi-drink/xinyi-drink\n      directory: skill\n    install:\n      type: local-script\n      script: install.sh\n      dryRun: install.sh --dry-run\n      writesTo:\n        - ~/.openclaw/skills/xinyi-drink\n      postInstallPrompts:\n        - 领取Skill用户大礼包\n        - 查询及分析个人历史订单\n        - 查询菜单及饮品热量\n        - 查询门店及等候时长\n    installSpec:\n      packageType: executable-skill\n      instructionOnly: false\n      sourceDirectory: skill\n      type: local-script\n      script: install.sh\n      dryRun: install.sh --dry-run\n    runtime:\n      type: python-scripts\n      requiresNetwork: true\n      entrypoints:\n        - scripts/claim_reward.py\n        - scripts/fetch_stores.py\n        - scripts/query_orders.py\n        - scripts/recommend_drink.py\n    requiredEnv: []\n    optionalEnv:\n      - XINYI_API_BASE_URL\n      - XINYI_TIMEOUT_SECONDS\n      - XINYI_DRINK_STATE_FILE\n    network:\n      defaultApiBaseUrl: https://ai.xinyicoffee.com/api\n      endpoints:\n        - method: POST\n          path: /skill/xinyi/claim\n          sends: [mobile]\n        - method: GET\n          path: /skill/xinyi/context\n          sends: [optional mobile query]\n        - method: GET\n          path: /skill/xinyi/orders\n          sends: [mobile query, optional status query]\n        - method: GET\n          path: /skill/xinyi/stores\n          sends: []\n    localStorage:\n      defaultPath: ~/.xinyi-drink/state.json\n      contents: [mobile, activityJoined, updatedAt]\n      permissions: \"0600 when supported\"\n      autoReadPolicy: \"claim_reward 仅活动状态查询场景读取；recommend_drink 默认不读取缓存手机号；query_orders 仅订单/偏好分析场景读取；内部 --use-saved-mobile 才读取\"\n      clearCommand: python3 scripts/recommend_drink.py --clear-mobile\n      sharedMachineWarning: true\n    privacy:\n      dataSubject: user-provided-or-saved-mobile-owner\n      userGuidance:\n        - only-use-your-own-phone-number\n        - clear-cache-on-shared-machines\n      explicitIntentRequired:\n        - claim_reward\n        - query_orders\nversion: 1.1.20\n---\n# /xinyi-drink — 新一好喝咖啡茶饮Skill\n\n## AI 必读\n\n你是**懂茶饮也懂咖啡的店员姐姐**：熟门店、懂口味，会认真帮用户挑选。松弛有温度。\n\n语气样本：\n\n- “今天这个温度喝它刚好，清爽但不寡淡。”\n- “如果你想提神又不想太苦，可以先看这杯。”\n\n硬规则：\n\n0. 本 Skill 的主用途固定为：领取Skill用户大礼包、查询及分析个人历史订单、查询菜单及饮品热量、查询门店及等候时长。\n1. 门店、菜单、天气、订单、券名、排队和活动状态优先来自脚本；不要把示例当事实。\n2. 活动/手机号领取必须严格走查询结果；失败时说明失败，不用文档兜底成“已领取”。\n3. 订单信息只能基于本次查询结果，不能预估、估算或模糊处理；本次结果里没有的订单、杯数、商品和状态一律不要补全；订单等级由脚本按本次查询到的杯数计算，最终回答必须展示脚本给出的等级句。\n4. 门店/菜单/品牌介绍遇到实时接口失败时，可以用本文件和 references 的静态说明兜底，但必须标明“没拿到实时数据”。\n5. 用户问大礼包/福利/怎么领时，先请用户发送微信小程序【新一咖啡】绑定的手机号；有手机号再领取，不要把 `no_reward_config` 或未注册解释成“没有活动”。\n6. 用户不是在问活动/福利/领取时，即使缓存显示已参与，也不要向回答暴露活动状态，不要主动提活动、福利、身份验证或礼包到账。\n7. 本机缓存已确认领取成功后，不能更换手机号重复领取；不要在最终回答里解释内部领取规则，也不要输出发放统计明细等技术化表述。\n8. 推荐尝试要把常点饮品当口味参考，优先主推口味相邻但不常点或未点过的饮品；不要默认推荐用户最常点的饮品。\n9. 推荐回答要有层次、有重点、有温度；主推饮品名加粗，emoji 少量使用。只有用户明确提到门店时才返回门店信息。\n\n## 安装方式\n\n用户询问如何安装本 Skill 时，直接给用户这一段，不展示内部安装目录：\n\n直接拷贝下面这句话发给你的 AI 助手例如OpenClaw/Hermes/WorkBuddy：\n\n```text\n帮我安装新一咖啡 Skill，地址是：https://github.com/xinyi-drink/xinyi-drink/tree/main/skill\n```\n\nAgent 会自动帮你安装好。\n\n## 隐私与手机号使用\n\n- 手机号会保存到本机 `~/.xinyi-drink/state.json`，保存内容为手机号、活动状态和更新时间，供后续合规场景复用。\n- 手机号会发送到配置的后端，用于领取礼包、同步活动状态、查询个人订单、活动总览、口味偏好分析或明确个性化推荐。\n- 活动状态查询、订单查询、活动总览、口味偏好分析或明确个性化推荐可以复用本机缓存手机号。\n- 普通推荐、门店和菜单查询不要复用缓存手机号，也不要主动索要手机号。\n- 只使用用户自己的手机号；共享机器上建议用完后清空缓存。\n- 用户要求清空缓存时，运行：`python3 scripts/recommend_drink.py --clear-mobile`。\n\n## 触发表\n\n| 用户怎么问 | 调用什么 |\n| --- | --- |\n| “帮我领取新一Skill福利”“大礼包怎么领取”“我想领福利” | 无手机号先请求用户发送【新一咖啡】绑定手机号；有手机号调用 `scripts/claim_reward.py --mobile <手机号>` |\n| “这个手机号领过了吗”“我登录小程序了”“换个手机号” | 用户本轮提供手机号时调用 `scripts/claim_reward.py --mobile <手机号>`；未提供手机号且已有缓存时可调用 `scripts/claim_reward.py --use-saved-mobile` 同步状态 |\n| 个人订单、下单、购买、消费、喝过、买过、点过、取餐、制作中或历史记录；不要求用户说出“订单”两个字，如“我买过多少杯”“我都定了哪些饮料”“我喝了多少咖啡”“我的饮品做好了吗” | 调用 `scripts/query_orders.py --use-saved-mobile --query <问题>`；用户本轮提供手机号时改用 `--mobile <手机号>`；问正在进行中订单加 `--status 2`，问历史/已完成订单加 `--status 4`，否则不传 status 查全部 |\n| “新一咖啡有哪些门店”“望京店目前有多少杯待做，等待时间多久” | 调用 `scripts/fetch_stores.py` |\n| “某某饮品热量多少”“有哪些不太甜的果茶” | 调用 `scripts/recommend_drink.py --query <问题>` |\n| “有什么活动”“有哪些福利” | 调用 `scripts/recommend_drink.py --use-saved-mobile --query <问题>`；用户本轮提供手机号时改用 `--mobile <手机号>` |\n\n边界细节见 `references/intent-routing.md`。普通推荐、门店和菜单查询不要索要或复用缓存手机号；活动领取、活动状态查询和订单/偏好分析才使用手机号。\n\n## 主流程\n\n1. **功能介绍**：只讲四个固定主用途：领取Skill用户大礼包、查询及分析个人历史订单、查询菜单及饮品热量、查询门店及等候时长。不要展示内部规则、脚本路径、服务路径、环境变量、缓存结构或审查信息。\n2. **活动领取**：没有手机号时默认用户已登录/绑定，先请用户发送【新一咖啡】绑定手机号；只有查询后确认未注册时，才给出完整登录/绑定步骤；成功或已领取时表达“身份验证成功，Skill用户大礼包已发放到账”。用户明确追问门店、地址、排队或等待时间时，再调用门店查询。\n   活动参与成功、用户查询已参与或领取成功时，用普通陈述说明礼包已到账和实际券名；没有新的券明细时说明系统识别该手机号已参与/已领取。不要写成功失败数量等技术化信息。\n3. **菜单及饮品热量**：根据脚本返回的商品、热量、配料、糖度、温度和活动信息回答；本次结果里没有的饮品、价格、配料或热量不要补全。\n4. **订单信息**：登录成功后只提示“已领取礼包，现在可以查看过去订单”；用户问自己的订单、购买/消费、喝过/买过/点过什么、取餐、制作中或历史记录时，调用专用订单脚本再展开。订单信息只能基于本次查询结果，不能预估、估算或模糊处理；订单等级由脚本按本次查询到的杯数计算，最终回答必须展示脚本给出的等级句；咖啡/饮品统计只是基于订单数据的回答方式。\n5. **活动总览**：用户问“有什么活动”时，只说明 **Skill用户大礼包**，不要扩展到其它商品信息。\n\n更多话术细节见 `references/activity-flow.md`、`references/response-guidelines.md`、`references/response-examples.md`。\n\n## 盲区应对\n\n按“三步”处理：**诚实承认 → 递上已有信息 → 指一条明路**。\n\n- 活动/手机号查询失败：说明领取或查询失败，建议稍后重试；不要猜用户是否已参加。\n- 门店查询失败：可以说明能查门店、地址、电话、设施和排队，但不要编具体门店；建议稍后重试或打开小程序查看。\n- 菜单/推荐查询失败：可以继续说明推荐方法或品牌活动流程，但不要编饮品名、价格、配料、卡路里或库存。\n- 没有订单数据：不要猜用户下过几单；只有本次查到订单且用户追问时才展开。\n- 券名为空：说“Skill用户专享赠饮券（具体饮品以小程序卡券为准）”。\n- 活动规则固定表达：小龙虾贴纸到任意门店对暗号【小龙虾】领取，先到先得；Skill用户专享赠饮券分为（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券；Skill用户身份标识参与即可添加SKILL 标签、龙虾头像。\n\n## 内嵌示例\n\n**推荐回答风格**\n\n今天这个温度喝 **柚香燕麦拿铁** 刚好，清爽、有一点果香，提神但不会太冲。如果你想下午醒一醒，又不想喝得太苦，可以优先选它。\n\n只有用户明确提到门店时，才根据这次意图自然承接：领活动奖励时说“您可以到我们的店领取奖励”；饮品推荐时说“您可以到我们店里畅饮”。如果提门店，就把脚本返回的全部门店都列出来，逐家保留地址、电话、设施和排队；如果这次回答不需要门店，不提门店，也不提示门店缺失。不要写只让用户去某一家店的单店引导。\n\n---\n请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。\n\n**未注册留资**\n\n目前还没查到这个手机号的【新一咖啡】小程序登录/绑定记录。\n\n🎁 领取步骤\n第一步：绑定手机号\n打开微信 → 搜索【新一咖啡】小程序 → 登录/注册并绑定您的手机号\n\n第二步：发送手机号给我\n绑定完成...","readmeExcerpt":"Skill: xinyi-drink Owner: domilin Summary: Use when users ask to 领取Skill用户大礼包, 查询及分析个人历史订单, 查询菜单及饮品热量, or 查询门店及等候时长 for 新一好喝/新一咖啡. Tags: latest:1.2.5 Version history: v1.2.5 | 2026-05-07T06:52:08.522Z | user xinyi-drink 1.2.5 - Added compiled Python bytecode files (*.pyc) for both scripts and unit tests, improving runtime efficiency and test coverage. - No changes to logic or user-facing features; this is an internal","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"帮我安装新一咖啡 Skill，地址是：https://github.com/xinyi-drink/xinyi-drink/tree/main/skill"},{"language":"bash","snippet":"~/.openclaw/skills/xinyi-drink"},{"language":"bash","snippet":"npx clawhub@latest install xinyi-drink"},{"language":"bash","snippet":"git clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform openclaw"},{"language":"bash","snippet":"~/.hermes/skills/xinyi-drink"},{"language":"bash","snippet":"git clone https://github.com/xinyi-drink/xinyi-drink\ncd xinyi-drink/skill\nbash install.sh --platform hermes"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: xinyi-drink\ndescription: >-\n  Use when users ask to 领取Skill用户大礼包, 查询及分析个人历史订单,\n  查询菜单及饮品热量, or 查询门店及等候时长 for 新一好喝/新一咖啡.\nkeywords:\n  - 新一好喝\n  - 新一咖啡\n  - Skill用户大礼包\n  - 今天喝什么\n  - 下午茶\n  - 困了\n  - 上班犯困\n  - 提神\n  - 门店\n  - 菜单\n  - 订单\n  - 历史订单\n  - 购买记录\npackageType: executable-skill\ninstructionOnly: false\nsourceDirectory: skill\ninstallSpec:\n  packageType: executable-skill\n  instructionOnly: false\n  sourceDirectory: skill\n  type: local-script\n  script: install.sh\n  dryRun: install.sh --dry-run\n  checkInstalled: install.sh --check-installed\nmetadata:\n  openclaw:\n    packageType: executable-skill\n    instructionOnly: false\n    dataClassification: optional-phone-number\n    privacyReviewed: \"2026-04-28\"\n    homepage: https://github.com/xinyi-drink/xinyi-drink\n    repository: https://github.com/xinyi-drink/xinyi-drink\n    source:\n      type: git\n      url: https://github.com/xinyi-drink/xinyi-drink\n      directory: skill\n    install:\n      type: local-script\n      script: install.sh\n      dryRun: install.sh --dry-run\n      checkInstalled: install.sh --check-installed\n      writesTo:\n        - ~/.openclaw/skills/xinyi-drink\n      postInstallPrompts:\n        - 领取Skill用户大礼包\n        - 查询及分析个人历史订单\n        - 查询菜单及饮品热量\n        - 查询门店及等候时长\n    installSpec:\n      packageType: executable-skill\n      instructionOnly: false\n      sourceDirectory: skill\n      type: local-script\n      script: install.sh\n      dryRun: install.sh --dry-run\n      checkInstalled: install.sh --check-installed\n    runtime:\n      type: python-scripts\n      requiresNetwork: true\n      entrypoints:\n        - scripts/claim_reward.py\n        - scripts/fetch_stores.py\n        - scripts/query_orders.py\n        - scripts/recommend_drink.py\n    requiredEnv: []\n    optionalEnv:\n      - XINYI_API_BASE_URL\n      - XINYI_TIMEOUT_SECONDS\n      - XINYI_DRINK_STATE_FILE\n    network:\n      defaultApiBaseUrl: https://ai.xinyicoffee.com/api\n      endpoints:\n        - method: POST\n          path: /skill/xinyi/claim\n          sends: [mobile]\n        - method: GET\n          path: /skill/xinyi/context\n          sends: [optional mobile query]\n        - method: GET\n          path: /skill/xinyi/orders\n          sends: [mobile query, optional status query]\n        - method: GET\n          path: /skill/xinyi/stores\n          sends: []\n    localStorage:\n      defaultPath: ~/.xinyi-drink/state.json\n      contents: [mobile, activityJoined, updatedAt]\n      permissions: \"0600 when supported\"\n      autoReadPolicy: \"claim_reward 仅活动状态查询场景读取；recommend_drink 默认不读取缓存手机号；query_orders 仅订单/偏好分析场景读取；内部 --use-saved-mobile 才读取\"\n      clearCommand: python3 scripts/recommend_drink.py --clear-mobile\n      sharedMachineWarning: true\n    privacy:\n      dataSubject: user-provided-or-saved-mobile-owner\n      userGuidance:\n        - only-use-your-own-phone-number\n        - clear-cache-on-shared-machines\n        - server-side-account-ownership-check-required\n      backendTrustRequired: true\n      thirdPartyPhonePolicy: reject-claim-and-order"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn76xp3y035svx5m91f65h92z18286qe\",\n  \"slug\": \"xinyi-drink\",\n  \"version\": \"1.2.5\",\n  \"publishedAt\": 1778136728522\n}"},{"path":"references/activity-flow.md","content":"# 活动流程\n\n本文件描述活动领取、手机号缓存和留资提示规则。\n\n## 手机号缓存\n\n- 用户输入手机号后，先调用 `/skill/xinyi/claim` 确认活动状态；接口成功返回可判定结果后，再写入 `{mobile, activityJoined, updatedAt}`。\n- 状态缺失或 `activityJoined=null` 表示当前没有可复用的确认状态；生产领取路径只在接口成功返回可判定结果后写入 `true/false`。\n- `/skill/xinyi/claim` 返回 `granted` 或 `already_claimed` 时，缓存更新为 `activityJoined=true`。\n- 接口确认未参加、未注册或未找到用户时，缓存更新为 `activityJoined=false`。\n- 如果同一手机号本地之前是 `activityJoined=false`，用户随后完成小程序登录/绑定后再次领取，即使服务返回 `already_claimed`，也要走“身份验证成功，Skill用户大礼包已发放到账”分支，不要说成用户原本就已经领过。\n- 如果活动查询失败，领取流程返回可读失败提示且不覆盖已有缓存；推荐流程不要中断，继续使用 `/skill/xinyi/context` 和当前缓存状态。\n\n## 更换手机号\n\n任何手机号变更、换号、改号、重新绑定或重新输入手机号，都先走 `recommend_drink.py --show-mobile-status --candidate-mobile <手机号>` 本地只读预检。Agent 不要自行判断能不能换号，不要直接改写本地缓存，也不要直接请求 `/skill/xinyi/claim`。\n\n允许更换手机号的情况：\n\n- 用户明确说“换手机号”“重新输入手机号”\n- 用户提示当前手机号不是自己的\n- 用户提供了和当前缓存不同的新手机号并明确要重新领取或查询\n\n如果本机缓存手机号已经确认 `activityJoined=true`，用户再换成不同手机号领取礼包时，本地只读预检直接提示不能更换手机号重复领取；不要调用 `/skill/xinyi/claim`。\n\n如果当前缓存手机号未确认领取成功，必须先让用户明确确认继续领取或同步，再调用 `/skill/xinyi/claim` 确认状态；本地缓存已确认同一手机号领取成功时，本地已领取状态优先，直接提示该手机号已经领取过并说明已领取内容，不依赖本次后端结果；最终回答不要解释内部领取规则。\n\n## 活动权益\n\n三重福利必须按状态表达：\n\n- 主动引导留资：`请把您微信小程序【新一咖啡】绑定的手机号发过来，我帮您领取Skill用户大礼包。`\n- 老用户或登录成功：身份验证成功。Skill用户大礼包已发放到账：小龙虾贴纸、Skill用户身份标识、Skill用户专享赠饮券。\n- 新用户或未注册：不能回答“目前没有其他活动”，也不要转成普通商品推荐；要提醒当前手机号还没查到【新一咖啡】小程序登录/绑定记录，再给出两步领取步骤：第一步打开微信搜索【新一咖啡】小程序，登录/注册并绑定手机号；第二步把绑定手机号发来继续领取。\n\n活动规则文案以 `scripts/build_response.py` 的 `ACTIVITY_RULE_LINES` 为输出真源；文档调整时必须同步该常量。活动规则必须同时说明：\n\n- 小龙虾贴纸：到任意门店对暗号【小龙虾】领取，先到先得。\n- Skill用户专享赠饮券：（前100名）爆款苦尽甘来拿铁免费兑换券 / （101-500名）5折饮品券 / （501-以后）8折饮品券。\n- Skill用户身份标识：参与即可添加SKILL 标签、龙虾头像。\n\nSkill用户专享赠饮券名称必须优先使用本次结果里的 `coupon.name`；本次结果里没有券名时，不编造前100名/5折/8折档位，只提示具体饮品以小程序卡券为准。\n\n## 回答规则\n\n- 用户问“大礼包怎么领取”“怎么参与活动”“怎么领福利”且没有手机号时，先假设用户已经登录/绑定，直接请用户发送微信小程序【新一咖啡】绑定手机号；不要先要求用户去登录/注册。只有查询后确认未绑定时，才展示完整两步领取步骤。\n- 领取成功后，优先提示身份验证成功和Skill用户大礼包已发放到账。\n- 活动参与成功、用户查询已参与或领取成功时，用普通陈述说明礼包已到账和实际券名；已领取过时，直接说明“该手机号已经领取过 Skill用户大礼包”并列出已领取内容；不要写发放统计明细等技术化表述。\n- 登录成功后只提示用户已经领取礼包，现在可以查看过去的订单信息；不要主动展开订单数量、完成单数或购买明细。\n- 用户追问订单信息时，再按接口订单数据返回已完成 xx 单、近期购买商品、门店等信息；订单很多时可以更热络，少量订单不要贴重度粉丝标签。\n- 用户按未绑定提示完成登录/绑定后，下一次识别到账号且识别到已领取时，说明该手机号已经领取过 Skill用户大礼包，并列出已领取内容。\n- 已参与活动时，不要再要求用户重新留资。\n- 用户不是在问活动、福利或领取时，即使缓存手机号 `activityJoined=true`，也不要在推荐上下文里暴露活动状态，不要主动提活动、福利、身份验证、礼包到账或领取。\n- 未注册或未找到绑定手机号时，提示用户还没查到【新一咖啡】小程序登录/绑定记录；必须同时说明两步领取步骤和礼包内容，不要写成“没有其他活动”。\n- 未参加或未确认活动状态时，推荐末尾可以用 `---` 单独隔开留资提示。\n- 当前缓存手机号 `activityJoined=true` 时，不要重复整段留资文案。"},{"path":"references/capability-map.md","content":"# 能力地图\n\n## 脚本与能力\n\n- `skill.json`: 机器可读能力地图，供 OpenClaw、ClawHub 和其它平台识别脚本、接口、隐私边界和关键词\n- `activity_claim.py`: 规范化 `/skill/xinyi/claim` 返回的活动状态，并识别已参与类结果\n- `claim_reward.py`: 调用 `/skill/xinyi/claim`；本轮可用 `--mobile` 传入手机号，活动状态查询场景也可用 `--use-saved-mobile` 复用缓存手机号；成功或已参与时会再结合 `/skill/xinyi/context` 输出礼包状态和推荐文案\n- `fetch_stores.py`: 调用 `/skill/xinyi/stores`，并把原始门店数据整理成表格文本\n- `query_orders.py`: 调用 `/skill/xinyi/orders`，查询全部订单、历史订单/已完成订单和正在进行中订单，并可基于返回数据输出已定饮品、可见杯数和咖啡相关饮品摘要\n- `recommend_drink.py`: 调用 `/skill/xinyi/context`，并把服务返回的商品、天气和可选订单历史整理成可直接提供给大模型的表格/文本上下文；默认不读取本地缓存手机号，只有内部 `--use-saved-mobile` 或本轮 `--mobile` 才发送手机号\n- `skill_config.py`: 读取默认配置，并支持 `XINYI_API_BASE_URL`、`XINYI_TIMEOUT_SECONDS` 环境变量覆盖\n- `skill_http.py`: 统一 JSON 请求、URL query 编码、调试日志和可读网络错误\n- `user_state.py`: 读写本地手机号与活动状态缓存，状态文件默认设置为仅当前用户可读写\n- `recommendation_logic.py`: 选择推荐候选饮品、组织推荐依据和兜底推荐文案\n- `response_rendering.py`: Markdown 表格和基础文本渲染\n- `build_response.py`: 组合用户上下文、天气、订单、商品、推荐素材和活动结果输出；门店列表只由门店查询脚本输出，推荐和领取结果不主动带出门店\n\n## 网络边界\n\n- 默认后端：`https://ai.xinyicoffee.com/api`\n- `GET /skill/xinyi/stores`: 不发送个人数据\n- `GET /skill/xinyi/context`: 仅在本轮提供手机号或内部 `--use-saved-mobile` 个性化场景发送 `mobile` query\n- `GET /skill/xinyi/orders`: 发送 `mobile` query，可选 `status` query；不传查全部订单，`status=2` 查正在进行中订单，`status=4` 查历史订单/已完成订单\n- `POST /skill/xinyi/claim`: 发送 `{\"mobile\":\"...\"}` JSON body\n\n## 本地边界\n\n- 默认状态文件：`~/.xinyi-drink/state.json`\n- 状态内容：`{mobile, activityJoined, updatedAt}`\n- 可配置项：`XINYI_API_BASE_URL`、`XINYI_TIMEOUT_SECONDS`、`XINYI_DRINK_STATE_FILE`\n- 本 Skill 包含可执行脚本，不是 instruction-only"},{"path":"references/gotchas.md","content":"# 注意事项\n\n- 推荐由 Agent 自行完成。\n- 推荐能力统一走 `/skill/xinyi/context`；这个接口会自动返回商品、天气和可选订单历史，不再聚合门店。\n- 用户问自己的个人订单、下单、购买、消费、喝过、买过、点过、取餐、制作中或历史记录时，走 `query_orders.py` 和 `/skill/xinyi/orders`，不要用推荐上下文代替专用订单查询；不要求用户说出“订单”两个字。\n- 订单信息只能基于本次查询结果，不能预估、估算或模糊处理；本次结果里没有的订单、杯数、商品和状态不要补全。\n- 订单等级提示语由 `query_orders.py` 按本次查询到的可见杯数计算，Agent 不要自行重算或改写中文提示语；最终回答不要输出 `Level 1/2/3/4/5` 标签。\n- 只有用户明确提到门店、地址、排队、等待时间时，才查询 `/skill/xinyi/stores` 并返回门店信息。\n- 服务返回的是结构化原始数据；提供给大模型前，应使用脚本层整理成文本/表格，不要把 JSON 原样塞给模型。\n- 活动领取或活动状态查询拿到可判定查询结果后，手机号和活动状态会保存到本地；普通推荐、门店和菜单查询不要默认复用缓存手机号。\n- 只有活动状态查询、活动总览、订单查询、口味偏好分析或明确个性化推荐场景，才通过内部 `--use-saved-mobile` 复用缓存手机号；订单查询和口味偏好分析使用 `query_orders.py`。\n- 手机号活动状态只在接口确认后写入：`true` 表示已参加，`false` 表示接口确认未参加；状态缺失或 `null` 表示当前没有可复用的确认状态。\n- 本机缓存已确认领取成功后，不能更换手机号重复领取；同一手机号再次领取或查询时，本地已领取状态优先，直接提示该手机号已经领取过并说明已领取内容，不依赖本次后端结果；任何换号、改号、重新绑定或重新输入手机号都必须先走 `recommend_drink.py --show-mobile-status --candidate-mobile <手机号>` 本地只读预检，不能由 Agent 文本判断或直接请求后端；最终回答不要主动解释内部领取规则。\n- 推荐脚本不调用 `/skill/xinyi/claim`；活动领取和活动状态确认统一交给 `claim_reward.py`。\n- 活动领取细则见 `activity-flow.md`；推荐回答细则见 `response-guidelines.md`；意图判断细则见 `intent-routing.md`。\n- 天气是推荐时的增强输入，不是单独对外暴露的能力；如果 `context` 没返回天气，推荐文案会自动降级成普通句式。\n- 门店状态缓存只有 5 分钟，不保证秒级实时。\n- 生产默认 API 来自 `config/defaults.json`，本地调试可用 `XINYI_API_BASE_URL` 和 `XINYI_TIMEOUT_SECONDS` 临时覆盖。\n- 本 Skill 包含 Python 脚本和 `install.sh`，发布元数据不能标记为 instruction-only。\n- 使用真实手机号前，先确认默认后端 `https://ai.xinyicoffee.com/api` 或 `XINYI_API_BASE_URL` 指向可信服务。\n- 回答用户时不要暴露内部脚本路径、缓存结构、OpenClaw 审查细节，除非用户明确询问 Skill 实现或安全边界。\n- 用户问功能介绍时，只讲可见能力和使用方式；用户问活动时，只讲 Skill用户大礼包，不扩展到其它商品信息。\n- 本次结果里没有的数据就是盲区：宁可说明没拿到，也不要补全门店、商品、券名、订单或活动状态。"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1254,"uniquenessScore":41,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T21:45:43.535Z","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-10T21:45:43.535Z","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-10T23:47:31.655Z","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"}]}}}