{"id":"6f24b80d-74ec-4123-9d2d-2d517f151b1e","entityType":"agent","slug":"clawhub-juneyaooo-mediwise-health-suite","name":"Mediwise Health Suite","canonicalUrl":"https://www.xpersona.co/agent/clawhub-juneyaooo-mediwise-health-suite","canonicalPath":"/agent/clawhub-juneyaooo-mediwise-health-suite","generatedAt":"2026-10-10T03:40:43.222Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T03:13:44.962Z","emptyReason":null},"description":"Family health management suite: health records, diet tracking, weight management, wearable sync. Local SQLite storage by default; optional cloud features req... Skill: Mediwise Health Suite Owner: juneyaooo Summary: Family health management suite: health records, diet tracking, weight management, wearable sync. Local SQLite storage by default; optional cloud features req... Tags: chinese:1.0.8, diet:1.0.8, family:1.0.8, health:1.0.8, latest:2.0.8, medical:1.0.8, multimodal:1.0.8, vision:1.0.8, wearable:1.0.8, weight:1.0.8 Version history: v2.0.8 | 2026-04-07T04:54:51.654Z |","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.7K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17110xxjryky6mk3d7dykc7kx83rv19:mediwise-health-suite","sourceUrl":"https://clawhub.ai/juneyaooo/mediwise-health-suite","homepage":"https://clawhub.ai/juneyaooo/skills/mediwise-health-suite","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/juneyaooo/mediwise-health-suite","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/juneyaooo/skills/mediwise-health-suite","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":55,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Family health management suite: health records, diet tracking, weight management, wearable sync. Local SQLite storage by default; optional cloud features req..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T03:13:44.962Z","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-10T03:13:44.962Z","emptyReason":null},"stars":null,"forks":null,"downloads":1746,"packageName":null,"latestVersion":"2.0.8","tractionLabel":"1.7K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T03:13:44.961Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T03:13:44.962Z","lastCrawledAt":"2026-10-10T03:13:44.961Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T03:13:44.961Z","lastVerifiedAt":null,"highlights":[{"version":"2.0.8","createdAt":"2026-04-07T04:54:51.654Z","changelog":"fix: Garmin 同步范围优化——首次同步仅取2天，增量同步最多7天，避免不必要的大批量请求","fileCount":105,"zipByteSize":353281},{"version":"2.0.7","createdAt":"2026-04-07T04:52:17.975Z","changelog":"fix: 修复 Garmin 同步 429 限流问题——每个 API 请求间隔 0.5s、天与天之间间隔 1s、触发 429 后退避 60s","fileCount":104,"zipByteSize":351341},{"version":"2.0.6","createdAt":"2026-04-07T04:47:58.325Z","changelog":"feat: 新增5个Garmin指标——呼吸频率、训练准备度、训练状态、爬楼层数、水分摄入；补全与GarminDB对齐的全量指标采集","fileCount":104,"zipByteSize":351186},{"version":"2.0.5","createdAt":"2026-04-07T04:19:21.409Z","changelog":"feat: Garmin 新增体重指标同步（get_weight API，含 BMI/体脂率/肌肉量 扩展字段）；更新支持指标列表文档","fileCount":104,"zipByteSize":349375},{"version":"2.0.4","createdAt":"2026-04-07T01:04:30.514Z","changelog":"fix: 消除通过聊天收集 API Key 的流程（改为引导用户在终端输入）；加强 set-backend 风险说明；明确'凭据绝不经过聊天传递'原则","fileCount":104,"zipByteSize":348905},{"version":"2.0.3","createdAt":"2026-04-07T00:46:17.699Z","changelog":"fix: address OpenClaw security review — declare node runtime requirement, remove password passthrough in device-auth, clarify owner_id isolation warning, add 安全说明 section to SKILL.md (data isolation, credential handling, external access table, backup sensitivity)","fileCount":104,"zipByteSize":348674},{"version":"2.0.2","createdAt":"2026-04-06T16:11:58.798Z","changelog":"chore: sync package.json version field to match ClawHub release (was 1.0.15, now 2.0.2)","fileCount":104,"zipByteSize":347989},{"version":"2.0.1","createdAt":"2026-04-06T15:46:49.746Z","changelog":"feat: Garmin tokenstore安全认证（首次登录后自动删除明文密码）、--prompt-password交互式输入（密码不经过模型/日志）、每日健康快照记忆（daily_snapshot.py）、夜间做梦机制（dream.py + DREAM.md skill）、对话健康提及强制实时记录规则","fileCount":104,"zipByteSize":347989}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17110xxjryky6mk3d7dykc7kx83rv19:mediwise-health-suite","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"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-juneyaooo-mediwise-health-suite/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-juneyaooo-mediwise-health-suite/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-juneyaooo-mediwise-health-suite/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-juneyaooo-mediwise-health-suite/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-juneyaooo-mediwise-health-suite/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-juneyaooo-mediwise-health-suite/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-10T03:40:43.219Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-juneyaooo-mediwise-health-suite/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-juneyaooo-mediwise-health-suite/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-juneyaooo-mediwise-health-suite/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-juneyaooo-mediwise-health-suite/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":"high","updatedAt":"2026-10-10T03:13:44.962Z","emptyReason":null},"readme":"Skill: Mediwise Health Suite\n\nOwner: juneyaooo\n\nSummary: Family health management suite: health records, diet tracking, weight management, wearable sync. Local SQLite storage by default; optional cloud features req...\n\nTags: chinese:1.0.8, diet:1.0.8, family:1.0.8, health:1.0.8, latest:2.0.8, medical:1.0.8, multimodal:1.0.8, vision:1.0.8, wearable:1.0.8, weight:1.0.8\n\nVersion history:\n\nv2.0.8 | 2026-04-07T04:54:51.654Z | user\n\nfix: Garmin 同步范围优化——首次同步仅取2天，增量同步最多7天，避免不必要的大批量请求\n\nv2.0.7 | 2026-04-07T04:52:17.975Z | user\n\nfix: 修复 Garmin 同步 429 限流问题——每个 API 请求间隔 0.5s、天与天之间间隔 1s、触发 429 后退避 60s\n\nv2.0.6 | 2026-04-07T04:47:58.325Z | user\n\nfeat: 新增5个Garmin指标——呼吸频率、训练准备度、训练状态、爬楼层数、水分摄入；补全与GarminDB对齐的全量指标采集\n\nv2.0.5 | 2026-04-07T04:19:21.409Z | user\n\nfeat: Garmin 新增体重指标同步（get_weight API，含 BMI/体脂率/肌肉量 扩展字段）；更新支持指标列表文档\n\nv2.0.4 | 2026-04-07T01:04:30.514Z | user\n\nfix: 消除通过聊天收集 API Key 的流程（改为引导用户在终端输入）；加强 set-backend 风险说明；明确'凭据绝不经过聊天传递'原则\n\nv2.0.3 | 2026-04-07T00:46:17.699Z | user\n\nfix: address OpenClaw security review — declare node runtime requirement, remove password passthrough in device-auth, clarify owner_id isolation warning, add 安全说明 section to SKILL.md (data isolation, credential handling, external access table, backup sensitivity)\n\nv2.0.2 | 2026-04-06T16:11:58.798Z | user\n\nchore: sync package.json version field to match ClawHub release (was 1.0.15, now 2.0.2)\n\nv2.0.1 | 2026-04-06T15:46:49.746Z | user\n\nfeat: Garmin tokenstore安全认证（首次登录后自动删除明文密码）、--prompt-password交互式输入（密码不经过模型/日志）、每日健康快照记忆（daily_snapshot.py）、夜间做梦机制（dream.py + DREAM.md skill）、对话健康提及强制实时记录规则\n\nv1.0.19 | 2026-04-06T15:45:30.764Z | user\n\nfeat: Garmin tokenstore安全认证、--prompt-password交互式密码输入、每日健康快照（daily_snapshot.py）、夜间做梦机制（dream.py + DREAM.md）、对话健康提及实时记录\n\nv2.0.0 | 2026-04-06T15:44:45.945Z | user\n\ntest version\n\nv1.0.18 | 2026-03-28T17:07:41.964Z | auto\n\n## mediwise-health-suite 1.0.18\n\n- Updated documentation in README.md.\n- No code or feature changes; functionality remains the same.\n- Clarifies existing usage, configuration, and capabilities.\n\nv1.0.17 | 2026-03-28T17:04:02.464Z | auto\n\n- Added Garmin device provider for wearable sync.\n- Improved and refactored sync and normalization scripts in wearable-sync.\n- Updated dependencies in package and requirements files.\n- Documentation and metadata updated for wearable sync module.\n\nv1.0.16 | 2026-03-28T11:21:01.081Z | user\n\nfix: address ClawHub security review — add owner_id missing warning to all 5 skills; mark auto-filled nutrition with [自动填充] in note; document autofill behavior in SKILL.md to resolve code/guide mismatch\n\nv1.0.15 | 2026-03-28T11:13:36.995Z | user\n\nfix: unify skill execute() interface; fix dashboard member_ownership bug; add Apple Health continuous sync guide and push alert docs\n\nv1.0.14 | 2026-03-15T06:51:17.292Z | user\n\nfix: food_lookup mandatory before meal recording; member confirmation must wait for user reply; remove 'AI估算营养' note\n\nv1.0.13 | 2026-03-15T05:02:40.127Z | user\n\nfix: add install-check.sh path validator; document OpenClaw plugin-root requirement for clawhub install\n\nv1.0.12 | 2026-03-15T04:31:14.472Z | user\n\nfix: strip invisible U+FE0F/U+200D chars from README.md and CONTRIBUTING.md that triggered security scanner\n\nv1.0.11 | 2026-03-15T04:27:29.092Z | user\n\nfix: test-vision supports --image fallback when bundled jpg missing; add --owner-id to quick_entry.py doc examples\n\nv1.0.10 | 2026-03-15T03:23:23.347Z | user\n\nfix: remove invisible U+FE0F chars that triggered scanner; clarify OWNER_ID is single-user mode by default, not admin-mode\n\nv1.0.9 | 2026-03-15T03:19:29.924Z | user\n\ndocs: fix vision model setup docs, add Apple Health provider docs, fix init_db.py reference\n\nv1.0.8 | 2026-03-15T03:00:57.734Z | user\n\ndocs: update vision model to gemini-3.1-pro-preview, add SiliconFlow referral link\n\nv1.0.7 | 2026-03-15T02:52:39.223Z | user\n\nfeat: env-var vision model config (MEDIWISE_VISION_*), .env.example with 5 recommended multimodal providers (Qwen2.5-VL/Gemini/GPT-4o/Step-1V/Ollama), MEDIWISE_OWNER_ID isolation docs\n\nv1.0.6 | 2026-03-15T02:35:23.664Z | user\n\nfeat: chronic disease module (diabetes/hypertension analysis), checkup report interpretation with 38 reference ranges and historical comparison, Apple Health export.xml/zip integration, default owner isolation via MEDIWISE_OWNER_ID env var across all scripts\n\nv1.0.5 | 2026-03-14T09:36:32.911Z | user\n\nfix: clean SKILL.md metadata to pass security scan (plain ASCII descriptions, requires.bins declaration)\n\nv1.0.4 | 2026-03-14T09:27:04.955Z | user\n\nremove MCP server\n\nv1.0.3 | 2026-03-14T02:13:15.525Z | user\n\nsecurity: declare env vars and outbound hosts in metadata; tighten agent permission recommendations\n\nv1.0.2 | 2026-03-14T02:07:20.829Z | user\n\nfeat: visit lifecycle, health memory, medication log, food lookup; fix reminder SyntaxError and wearable sync dedup\n\nv1.0.1 | 2026-03-08T15:20:52.227Z | user\n\nInitial release: Complete family health management suite with 11 integrated skills\n\nv1.0.0 | 2026-03-08T14:54:19.378Z | user\n\nInitial release: Complete family health management suite with 11 integrated skills\n\nArchive index:\n\nArchive v2.0.8: 105 files, 353281 bytes\n\nFiles: CHANGELOG.md (3389b), CONTRIBUTING.md (2799b), diet-tracker/agents/openai.yaml (239b), diet-tracker/index.js (6336b), diet-tracker/package.json (290b), diet-tracker/scripts/diet.py (20650b), diet-tracker/scripts/food_lookup.py (18742b), diet-tracker/scripts/nutrition_goal.py (10671b), diet-tracker/scripts/nutrition.py (8742b), diet-tracker/SKILL.md (6777b), docs/AGENT_SETUP.md (9170b), docs/HEALTH-MANAGEMENT-OVERVIEW.md (9478b), docs/INSTALLATION.md (12811b), health-monitor/agents/openai.yaml (247b), health-monitor/index.js (3737b), health-monitor/package.json (294b), health-monitor/scripts/alert.py (5785b), health-monitor/scripts/check.py (11696b), health-monitor/scripts/dashboard.py (7232b), health-monitor/scripts/test_check.py (5130b), health-monitor/scripts/threshold.py (10288b), health-monitor/scripts/trend.py (11276b), health-monitor/SKILL.md (7800b), install-check.sh (4703b), mediwise-health-tracker/agents/openai.yaml (277b), mediwise-health-tracker/DREAM.md (7215b), mediwise-health-tracker/index.js (21309b), mediwise-health-tracker/package.json (267b), mediwise-health-tracker/references/cycle-attachments-multitenancy.md (4108b), mediwise-health-tracker/references/drug-briefing.md (3042b), mediwise-health-tracker/references/intake-query-vision.md (3476b), mediwise-health-tracker/references/visit-prep.md (3740b), mediwise-health-tracker/scripts/api_client.py (7152b), mediwise-health-tracker/scripts/attachment.py (24074b), mediwise-health-tracker/scripts/briefing_report.py (22279b), mediwise-health-tracker/scripts/checkup_report.py (20520b), mediwise-health-tracker/scripts/chronic_disease.py (15480b), mediwise-health-tracker/scripts/config.py (14567b), mediwise-health-tracker/scripts/cycle_tracker.py (17024b), mediwise-health-tracker/scripts/daily_snapshot.py (13846b), mediwise-health-tracker/scripts/doctor_visit_report.py (35800b), mediwise-health-tracker/scripts/dream.py (14858b), mediwise-health-tracker/scripts/drug_interaction.py (25127b), mediwise-health-tracker/scripts/embedding_provider.py (5820b), mediwise-health-tracker/scripts/export.py (16571b), mediwise-health-tracker/scripts/health_advisor.py (24799b), mediwise-health-tracker/scripts/health_db.py (50812b), mediwise-health-tracker/scripts/health_memory.py (9859b), mediwise-health-tracker/scripts/health_metric.py (9101b), mediwise-health-tracker/scripts/html_screenshot.py (6791b), mediwise-health-tracker/scripts/medical_record.py (30516b), mediwise-health-tracker/scripts/medication_log.py (5373b), mediwise-health-tracker/scripts/member.py (10836b), mediwise-health-tracker/scripts/memory.py (27129b), mediwise-health-tracker/scripts/metric_utils.py (4433b), mediwise-health-tracker/scripts/openfda_query.py (7021b), mediwise-health-tracker/scripts/privacy.py (7953b), mediwise-health-tracker/scripts/query.py (22175b), mediwise-health-tracker/scripts/quick_entry.py (8174b), mediwise-health-tracker/scripts/reminder.py (22169b), mediwise-health-tracker/scripts/setup.py (38455b), mediwise-health-tracker/scripts/smart_intake.py (38872b), mediwise-health-tracker/scripts/test_authorization.py (9551b), mediwise-health-tracker/scripts/test_smart_intake.py (28984b), mediwise-health-tracker/scripts/validators.py (7092b), mediwise-health-tracker/scripts/vector_search.py (19946b), mediwise-health-tracker/scripts/visit_lifecycle.py (19798b), mediwise-health-tracker/SKILL.md (18843b), package.json (920b), QUICKSTART.md (8980b), README.md (13455b), requirements.txt (435b), shared/__init__.py (49b), shared/metric_utils.py (1571b), shared/path_setup.py (679b), skill-card.md (3291b), SKILL.md (10542b), sleep-tracker/index.js (2779b), sleep-tracker/package.json (290b), sleep-tracker/scripts/sleep.py (13914b)\n\nFile v2.0.8:diet-tracker/SKILL.md\n\n---\nname: diet-tracker\ndescription: \"Diet and nutrition tracking: log meals, manage food items, view daily/weekly nutrition summaries, analyze calorie trends. Integrates with mediwise-health-tracker and weight-manager.\"\n---\n\n# diet-tracker\n\n## 概述\n\n提供每餐饮食记录、食物条目管理、每日/每周营养摘要、热量趋势分析等功能。与 `mediwise-health-tracker` 共享数据库，可与 `weight-manager` 联动形成\"饮食 → 热量 → 体重\"完整闭环。\n\n## 数据模型\n\n### diet_records（一餐记录）\n| 字段 | 说明 |\n|------|------|\n| id | 记录 ID |\n| member_id | 成员 ID |\n| meal_type | 餐次: breakfast/lunch/dinner/snack |\n| meal_date | 日期 YYYY-MM-DD |\n| meal_time | 时间 HH:MM（可选） |\n| total_calories | 总热量 kcal |\n| total_protein | 总蛋白质 g |\n| total_fat | 总脂肪 g |\n| total_carbs | 总碳水 g |\n| total_fiber | 总膳食纤维 g |\n| note | 备注 |\n\n### diet_items（食物条目）\n| 字段 | 说明 |\n|------|------|\n| id | 条目 ID |\n| record_id | 关联 diet_records.id |\n| food_name | 食物名称 |\n| amount | 数量 |\n| unit | 单位（g/ml/份/个等） |\n| calories | 热量 kcal |\n| protein | 蛋白质 g |\n| fat | 脂肪 g |\n| carbs | 碳水 g |\n| fiber | 膳食纤维 g |\n| note | 备注 |\n\n## 功能列表\n\n### diet.py — 饮食记录 CRUD\n\n| 动作 | 子命令 | 必要参数 | 可选参数 | 说明 |\n|------|--------|----------|----------|------|\n| add-meal | add-meal | --member-id, --meal-type, --meal-date | --meal-time, --note, --items (JSON) | 添加一餐记录（可同时包含多个食物条目） |\n| add-item | add-item | --record-id, --food-name | --amount, --unit, --calories, --protein, --fat, --carbs, --fiber, --note | 向已有餐次追加食物条目 |\n| list | list | --member-id | --date, --start-date, --end-date, --meal-type, --limit | 查看饮食记录 |\n| delete | delete | --id | --type (record/item) | 删除记录或条目 |\n| daily-summary | daily-summary | --member-id, --date | | 某日营养摘要 |\n\n### nutrition.py — 营养分析\n\n| 动作 | 子命令 | 必要参数 | 可选参数 | 说明 |\n|------|--------|----------|----------|------|\n| weekly-summary | weekly-summary | --member-id | --end-date | 一周营养趋势（每日热量、平均三大营养素） |\n| calorie-trend | calorie-trend | --member-id | --days (默认 7) | 热量趋势分析（N 天每日总热量） |\n| nutrition-balance | nutrition-balance | --member-id | --days (默认 7) | 三大营养素比例分析 |\n\n### food_lookup.py — 食物营养查询\n\n| 动作 | 子命令 | 必要参数 | 可选参数 | 说明 |\n|------|--------|----------|----------|------|\n| food-lookup | search | params.query | params.limit (默认5), params.source (auto/cfcd/brands/usda) | 三层数据源搜索食物营养（CFCD6 → 中国品牌外食 → USDA） |\n| food-stats | stats | — | — | 查看食物数据库概况（各数据源条目数） |\n\n数据来源（按优先级）：\n1. **CFCD6**（离线）：《中国食物成分表标准版第6版》1657 条，覆盖粮谷、肉蛋奶、蔬果、水产等\n2. **cn-brands**（离线）：339 条，奶茶、外卖、便利店、火锅等外食场景\n3. **USDA FoodData Central**（在线）：国际食材兜底，需配置 `USDA_API_KEY` 环境变量\n\n## 使用流程\n\n**记录一餐的标准流程（不得跳步）：**\n\n1. 确认成员身份（通过 mediwise-health-tracker 的 list-members）\n2. **逐一查询每种食物的营养数据**（`food-lookup search`，见下方\"强制规则\"）\n3. 用查询到的营养数据调用 `add-meal`，通过 `--items` JSON 一次录入多个食物\n4. 如需追加食物，使用 `add-item` 向已有餐次添加\n5. 使用 `daily-summary` 查看当天营养摄入\n6. 使用 `weekly-summary` 或 `calorie-trend` 查看长期趋势\n\n## 营养数据强制规则\n\n**禁止用 AI 自身知识直接估算营养数值写入数据库。** 记录每种食物之前，必须先调用 `food-lookup search` 查询，用数据库返回的数据填充 `--items`。\n\n> **自动填充说明**：若 `--items` 中某条目未提供热量数据，`diet.py` 会自动调用内部 food_lookup 数据库补全营养值，并在 `note` 字段标注 `[自动填充]` 及数据来源。此行为仅查询本地数据库（不调用外部 API），补全结果与显式 `food-lookup search` 一致。agent 仍应优先显式查询以便向用户展示候选项，但自动填充是兜底保障而非绕过规则。\n\n```bash\n# 步骤 1：先查每种食物\npython3 {baseDir}/scripts/food_lookup.py search --query \"炸排骨\" --owner-id \"<sender_id>\"\npython3 {baseDir}/scripts/food_lookup.py search --query \"米饭\" --owner-id \"<sender_id>\"\n\n# 步骤 2：用查询结果里的营养数据填 --items，再记录\npython3 {baseDir}/scripts/diet.py add-meal \\\n  --member-id <id> --meal-type lunch --meal-date 2025-03-15 \\\n  --items '[{\"food_name\":\"炸排骨\",\"amount\":150,\"unit\":\"g\",\"calories\":298,\"protein\":21.2,\"fat\":19.3,\"carbs\":9.1,\"note\":\"来源:CFCD6\"}]' \\\n  --owner-id \"<sender_id>\"\n```\n\n**查询未命中时的处理：**\n- 三层数据源（CFCD6 → 中国品牌外食 → USDA）都未找到时，告知用户\"未查到该食物的营养数据\"，**询问用户是否手动输入营养值，或跳过该条目**，不得自行估算后直接写入。\n- 查到多个候选项时，展示给用户确认，选择最贴近的后再录入。\n- 记录时在 `note` 字段写明数据来源（如\"来源：CFCD6\"、\"来源：用户手动输入\"）。\n\n## items JSON 格式\n\n`--items` 参数接受 JSON 数组。**所有营养字段必须来自 `food-lookup search` 的查询结果**，不得由 AI 自行估算填充：\n```json\n[\n  {\"food_name\": \"鸡胸脯肉\", \"amount\": 150, \"unit\": \"g\", \"calories\": 158, \"protein\": 31.6, \"fat\": 3.2, \"carbs\": 0.0, \"note\": \"来源:CFCD6\"},\n  {\"food_name\": \"米饭\", \"amount\": 200, \"unit\": \"g\", \"calories\": 232, \"protein\": 4.6, \"fat\": 0.6, \"carbs\": 51.5, \"note\": \"来源:CFCD6\"}\n]\n```\n\n自动换算规则：CFCD6/USDA 数据按 `amount`（克）换算；中国品牌/外食数据按每份直接使用。\n\n## 注意事项\n\n- **每次调用脚本必须携带 `--owner-id`（强制）**：从会话上下文获取发送者 ID（格式 `<channel>:<user_id>`，如 `feishu:ou_xxx` 或 `qqbot:12345`），作为所有脚本的 `--owner-id` 参数，不得省略。\n- **禁止 AI 估算营养数据**：所有热量/蛋白质/脂肪/碳水/膳食纤维数值必须来自 `food-lookup search`，或经用户明确确认的手动输入，不得由 AI 凭自身知识估算后直接写入。\n- `note` 字段必须记录数据来源，便于用户事后核查。\n- meal_type 支持: breakfast（早餐）、lunch（午餐）、dinner（晚餐）、snack（加餐/零食）\n\nFile v2.0.8:health-monitor/SKILL.md\n\n---\nname: health-monitor\ndescription: >-\n  智能健康监测与告警。基于阈值检测、趋势分析和多级告警系统，\n  对家庭成员的健康指标进行持续监测，发现异常时及时预警。支持全家健康 dashboard 一屏总览。\n  Intelligent health monitoring and alerting. Uses threshold detection,\n  trend analysis, and multi-level alert system to continuously monitor\n  family members' health metrics and warn on anomalies. Supports family dashboard.\n  关键词：健康监测、异常告警、指标预警、趋势分析、健康报告、心率异常、血压异常、血氧低、告警管理、全家概览、健康dashboard。\n---\n\n# Health Monitor - 智能健康监测\n\n持续监测健康指标，多级阈值告警 + 趋势分析，发现异常及时通知。支持全家健康 dashboard 一屏总览。\n\n## 告警级别\n\n| 级别 | 含义 | 处理方式 |\n|------|------|----------|\n| info | 信息记录 | 仅记录，不主动推送 |\n| warning | 预警 | 创建 reminder 推送 |\n| urgent | 紧急 | 推送 + 标记高优先级 |\n| emergency | 危急 | 推送 + 建议立即就医或拨打急救电话 |\n\n## 默认阈值\n\n| 指标 | warning | urgent | emergency |\n|------|---------|--------|-----------|\n| 心率（高）| >100 bpm | >120 bpm | >150 bpm |\n| 心率（低）| <55 bpm | <45 bpm | <35 bpm |\n| 血氧（低）| <95% | <90% | <85% |\n| 收缩压（高）| >140 mmHg | >160 mmHg | >180 mmHg |\n| 舒张压（高）| >90 mmHg | >100 mmHg | >110 mmHg |\n| 体温（高）| >37.3°C | >38.5°C | >39.5°C |\n| 血糖空腹（高）| >6.1 mmol/L | >7.8 mmol/L | >11.1 mmol/L |\n\n支持按年龄自动调整，支持用户自定义覆盖。\n\n## 核心工作流\n\n> **强制规则**：每次调用脚本必须携带 `--owner-id`，从会话上下文获取发送者 ID（格式 `<channel>:<user_id>`，如 `feishu:ou_xxx` 或 `qqbot:12345`）。所有查询和写入操作均需携带，不得省略。\n\n### 0. 全家健康 Dashboard（首选入口）\n\n用户说「看看全家健康」「今天家人状态怎样」「健康概览」时，优先调用此接口。\n返回所有成员的风险级别、未解决告警数、最新关键指标和趋势警告。\n\n```bash\n# 全家健康一屏总览\npython3 {baseDir}/scripts/dashboard.py show\n\n# 按 owner 过滤（多租户场景）\npython3 {baseDir}/scripts/dashboard.py show --owner-id <owner_id>\n```\n\n**返回结构示例：**\n```json\n{\n  \"family_risk\": \"warning\",\n  \"family_risk_label\": \"需关注\",\n  \"total_open_alerts\": 3,\n  \"summary\": \"【紧急】张三 有紧急告警；共 3 条未解决告警\",\n  \"members\": [\n    {\n      \"name\": \"张三\",\n      \"risk_level\": \"urgent\",\n      \"risk_label\": \"紧急\",\n      \"open_alerts\": 2,\n      \"alerts\": [{\"level\": \"urgent\", \"title\": \"张三 heart_rate 高于阈值\", ...}],\n      \"latest_metrics\": {\n        \"heart_rate\": {\"value\": 125, \"unit\": \"bpm\", \"measured_at\": \"2026-03-27 08:30\"},\n        \"blood_pressure\": {\"value\": \"145/95\", \"unit\": \"mmHg\", \"measured_at\": \"2026-03-27 08:30\"}\n      },\n      \"trend_warnings\": [\"heart_rate 呈上升趋势\"]\n    }\n  ]\n}\n```\n\n### 1. 阈值管理\n\n```bash\n# 查看阈值配置（含默认+自定义）\npython3 {baseDir}/scripts/threshold.py list --member-id <id>\n\n# 自定义阈值\npython3 {baseDir}/scripts/threshold.py set --member-id <id> --type heart_rate --level warning --direction above --value 110\n\n# 恢复默认\npython3 {baseDir}/scripts/threshold.py reset --member-id <id> --type heart_rate\n```\n\n### 2. 异常检测\n\n```bash\n# 检查单个成员\npython3 {baseDir}/scripts/check.py run --member-id <id>\n\n# 检查所有成员\npython3 {baseDir}/scripts/check.py run-all\n\n# 检查最近指定时间窗口\npython3 {baseDir}/scripts/check.py run --member-id <id> --window 24h\n```\n\n### 3. 趋势分析\n\n```bash\n# 单指标趋势\npython3 {baseDir}/scripts/trend.py analyze --member-id <id> --type heart_rate --days 7\n\n# 全指标摘要\npython3 {baseDir}/scripts/trend.py report --member-id <id>\n```\n\n### 4. 告警管理\n\n```bash\n# 查看未解决告警\npython3 {baseDir}/scripts/alert.py list --member-id <id>\n\n# 按级别筛选\npython3 {baseDir}/scripts/alert.py list --member-id <id> --level urgent\n\n# 标记已解决\npython3 {baseDir}/scripts/alert.py resolve --alert-id <id>\n\n# 告警历史\npython3 {baseDir}/scripts/alert.py history --member-id <id> --limit 20\n```\n\n## 定时检测\n\n配合 wearable-sync 使用时，每次数据同步完成后会自动触发检测。\n也可单独通过 cron 定时运行：\n\n```bash\n# 每小时检测一次\n0 * * * * cd /path/to/health-monitor/scripts && python3 check.py run-all --window 1h\n```\n\n## 持续监测 + 消息推送完整配置\n\n### 架构概览\n\n```\niPhone 健康 App\n    → 导出 export.zip（手动/Shortcuts 自动）\n    → iCloud Drive 同步到 Mac / 直接传输到服务器\n    → cron: wearable-sync sync.py（导入数据）\n    → cron: health-monitor check.py（检测异常 → 写入 alerts 表）\n    → AI agent 查询告警 → 通过 IM Bot 推送给用户\n```\n\n### 第一步：配置数据同步（wearable-sync）\n\n参考 wearable-sync/SKILL.md 的「Apple Health 持续更新方案」完成设备绑定和 cron 配置。\n\n### 第二步：配置定时检测\n\n```bash\ncrontab -e\n\n# 同步数据（每小时整点）\n0 * * * * cd /path/to/wearable-sync/scripts && python3 sync.py run-all >> ~/mediwise-sync.log 2>&1\n\n# 检测异常（同步后5分钟，确保数据已写入）\n5 * * * * cd /path/to/health-monitor/scripts && python3 check.py run-all --window 2h >> ~/mediwise-check.log 2>&1\n```\n\n### 第三步：推送告警\n\n**当前架构：告警写入数据库，由 AI agent 主动查询推送。**\n\nhealth-monitor 本身不内置 IM 推送 SDK，告警通过以下方式触达用户：\n\n**方式 A：AI agent 定时巡检（推荐）**\n\n在 IM Bot（飞书/企微/钉钉）中，让 AI agent 定时调用 dashboard action 并主动发消息：\n\n```bash\n# cron 触发 agent 巡检脚本（示例）\n30 7 * * * /path/to/bot-client send-health-report --owner-id feishu:ou_xxx\n```\n\nagent 内部执行：\n1. `dashboard show` → 获取全家风险概览\n2. 若 `family_risk` 为 warning/urgent/emergency → 主动发送 IM 消息\n3. `alert-list` → 列出未解决告警，逐条通知\n\n**方式 B：cron 脚本直接调用 Bot API**\n\n```bash\n#!/bin/bash\n# /path/to/health-alert-push.sh\nRESULT=$(python3 /path/to/health-monitor/scripts/dashboard.py show --owner-id \"$1\")\nRISK=$(echo $RESULT | python3 -c \"import sys,json; d=json.load(sys.stdin); print(d.get('family_risk','ok'))\")\n\nif [ \"$RISK\" != \"ok\" ]; then\n  # 调用飞书/企微 Webhook 发送告警\n  curl -X POST \"$FEISHU_WEBHOOK\" \\\n    -H 'Content-Type: application/json' \\\n    -d \"{\\\"msg_type\\\":\\\"text\\\",\\\"content\\\":{\\\"text\\\":\\\"健康告警：$RISK，请打开 MediWise 查看详情\\\"}}\"\nfi\n```\n\n**方式 C：用户主动查询（最简单）**\n\n用户在 IM 中随时发送「看看全家健康」，agent 调用 dashboard 返回实时状态，无需后台推送。\n\n### 告警级别与推送策略建议\n\n| 级别 | 建议推送频率 | 建议渠道 |\n|------|-------------|----------|\n| info | 不推送，仅记录 | — |\n| warning | 每日早晨汇总推送一次 | IM 普通消息 |\n| urgent | 立即推送 | IM @消息 / 手机通知 |\n| emergency | 立即推送 + 重复提醒 | IM @消息 + 电话/短信 |\n\n> **当前限制**：health-monitor 不内置推送 SDK，emergency 级别需要外部脚本或 agent 逻辑实现重复提醒。建议在 agent 层对 emergency 告警做特殊处理（如每15分钟重复发送直到用户确认）。\n\n## 反模式\n\n- **不要将阈值设得过于敏感** — 容易产生告警疲劳\n- **不要忽略 emergency 级别告警** — 应立即关注\n- **趋势分析需要足够数据** — 少于 3 天数据时趋势不可靠\n\nFile v2.0.8:mediwise-health-tracker/SKILL.md\n\n---\nname: mediwise-health-tracker\ndescription: Family health and medical record management. Tracks members, visits, medications, lab results, daily metrics, reminders, briefings, and pre-visit summaries.\n---\n\n# MediWise Health Tracker\n\n家庭健康与病程记录管理技能。所有操作通过 `{baseDir}/scripts/` 下的 Python 脚本完成，默认输出 JSON，再转成自然语言回复给用户。\n\n当用户问”你可以做什么”时，记得主动提到：除了健康档案、指标记录、提醒、简报外，还可以根据最近的描述和历史记录先整理一段”就医前摘要”，并在需要时继续生成图片或 PDF，方便给医生快速了解病情。\n\n## 适用场景\n\n- 添加或管理家庭成员信息\n- 记录就诊经历（门诊/住院/急诊）、症状/诊断/用药/检验/影像检查结果\n- 记录日常健康指标（血压/血糖/心率/体温等）\n- 查询病程历史或用药记录、生成健康时间线或摘要、查看全家健康概况\n- 发送体检报告图片或化验单需要识别录入\n- 设置用药提醒、健康指标测量提醒、复查提醒，或获取主动健康建议、每日健康简报、就医前摘要图\n- 规划就诊流程（预约 → 就诊前汇总 → 记录诊断结果 → 复诊追踪）\n- 随口提到健康问题（如”最近膝盖有点疼”）需要记录并定期跟进\n\n## 核心工作流\n\n### 0. 确定 owner_id（每次必做）\n\n从会话上下文获取当前发送者 ID，格式为 `<channel>:<user_id>`，用于所有脚本的 `--owner-id` 参数。例如：\n- 飞书用户：`feishu:ou_707461a1baa7790213d30230b88fb575`\n- QQ 用户：`qqbot:12345678`\n\n后续所有脚本调用均以此 ID 作为 `--owner-id`，不得省略。\n\n### 1. 先确认成员（必须等用户回复）\n\n```bash\npython3 {baseDir}/scripts/member.py list --owner-id \"<sender_id>\"\n```\n\n每次增删改查前先调用 `list` 查询现有成员，**将结果展示给用户，明确询问\"是为哪位成员操作？\"，等待用户明确回复后再继续。**\n\n**禁止以下行为：**\n- 未经询问自动创建新成员（包括\"本人\"）\n- 在用户未确认目标成员的情况下继续写入数据\n- 假设\"只有一个成员所以自动选择\"\n\n**成员不存在时的处理：**\n```\n列表为空或未找到目标成员 → 告知用户 → 询问是否新建成员 → 等待用户确认姓名和关系 → 再调用 member.py add\n```\n\n```bash\n# 用户确认后才执行创建\npython3 {baseDir}/scripts/member.py add --name \"张三\" --relation \"本人\" --owner-id \"<sender_id>\"\n```\n\n### 2. 选择录入路径\n\n- 简短指标文本：优先 `quick_entry.py`\n- 复杂文本、就诊、用药、检验：用 `smart_intake.py` 或对应业务脚本\n- 图片 / PDF / 多附件：走视觉录入流程\n- 录入后发现异常指标、新诊断或用药变化：用 `log-health-note` 动作记录并跟进\n\n### 3. 查询后做自然语言整理\n\n```bash\npython3 {baseDir}/scripts/query.py summary --member-id <id>\npython3 {baseDir}/scripts/query.py timeline --member-id <id>\npython3 {baseDir}/scripts/query.py active-medications --member-id <id>\npython3 {baseDir}/scripts/query.py family-overview\n```\n\n不要把 JSON 原样贴给用户；改写成趋势、摘要、时间线和清晰列表。\n\n## 快速命令\n\n### 常用录入\n\n结构化数据可直接调用对应动作写入：\n\n| 动作 | 说明 | 关键参数 |\n|------|------|----------|\n| `add-visit` | 添加就诊记录 | member_id, visit_type, visit_date；可选 hospital/department/diagnosis |\n| `add-symptom` | 添加症状记录 | member_id, symptom；可选 severity/visit_id/onset_date |\n| `add-medication` | 添加用药记录 | member_id, name；可选 dosage/frequency/visit_id/purpose |\n| `add-metric` | 添加健康指标 | member_id, type, value；可选 measured_at/source/context |\n\n自然语言或图片输入走 `smart-extract` → `smart-confirm` 流程；短文本指标走 `quick-entry-save`。\n\n### 快速录入指标\n\n```bash\npython3 {baseDir}/scripts/quick_entry.py parse --text \"血压130/85 心率72\" --member-id <id> --owner-id \"<sender_id>\"\npython3 {baseDir}/scripts/quick_entry.py parse-and-save --text \"血压130/85 心率72\" --member-id <id> --owner-id \"<sender_id>\"\n```\n\n### 录入后发现异常，记录并跟进\n\n录入数据后若发现异常指标、新诊断或用药变化，用 `log-health-note` 动作记录并自动创建跟进提醒：\n\n```bash\n# action: log-health-note\npython3 {baseDir}/scripts/health_memory.py log --member-id <id> --content \"血压160/100，高于正常上限\" --category observation --follow-up-days 3\n```\n\n### 生成就医前摘要\n\n当用户最近准备去看医生，可以先让用户用自然语言描述本次不适，默认先生成一段简短摘要：\n\n```bash\npython3 {baseDir}/scripts/doctor_visit_report.py text --member-id <id> --description “最近两周反复头晕，起床和翻身时更明显，偶尔恶心，担心是不是血压或者耳石问题”\n```\n\n生成完后，顺手问一句：\n- “如果你愿意，我也可以继续帮你整理成图片或 PDF，方便就诊时直接出示给医生。”\n\n也可以更自然一点，比如：\n- “这版短文你先看看；如果要更方便出示给医生，我可以再帮你排成图片或 PDF。”\n- “要不要我顺手再帮你整理成一张图，或者导出成 PDF？”\n\n如用户明确需要，再继续导出图片版或 PDF 版。\n\n这份摘要会尽量汇总：\n- 本次主诉与自动提取的重点\n- 近期关键指标、异常提醒、最近就诊变化\n- 相关既往病史与近期检查\n- 当前在用药、过敏史、可识别的中高风险药物相互作用\n\n### 就诊全程管理（plan → prep → outcome → follow-up）\n\n对于有明确就诊计划的场景，可以走完整就诊生命周期：\n\n```bash\n# 1. 创建就诊预约（status=planned），获取准备提醒\npython3 {baseDir}/scripts/visit_lifecycle.py plan --member-id <id> --visit-date 2026-03-15 --hospital 协和医院 --department 心内科 --chief-complaint “反复胸闷”\n\n# 2. 就诊前智能汇总：症状按身体系统分组 + 近期异常指标 + 在用药 + 药物相互作用警告\npython3 {baseDir}/scripts/visit_lifecycle.py prep --member-id <id> [--days 30]\n\n# 3. 就诊后引导录入：诊断、处方、复诊安排（自动创建复诊提醒）\npython3 {baseDir}/scripts/visit_lifecycle.py outcome --visit-id <vid> --diagnosis “高血压” \\\n  --follow-up-date 2026-06-15 \\\n  --medications '[{“name”:”氨氯地平”,”dosage”:”5mg”,”frequency”:”每日一次”}]'\n\n# 4. 查看待处理就诊（planned / 未填结果 / 复诊提醒）\npython3 {baseDir}/scripts/visit_lifecycle.py pending --member-id <id>\n```\n\n### 健康记忆追踪\n\n当用户随口提到健康问题时，及时记录并自动跟进：\n\n```bash\n# 记录随口提到的健康问题，自动创建 N 天后的跟进提醒\npython3 {baseDir}/scripts/health_memory.py log --member-id <id> --content “最近睡眠很差，经常半夜醒” --category symptom --follow-up-days 5\n\n# 查看未解决的健康备注和到期跟进\npython3 {baseDir}/scripts/health_memory.py list --member-id <id>\n\n# 标记已解决\npython3 {baseDir}/scripts/health_memory.py resolve --note-id <nid> --resolution-note “医生建议减少咖啡因摄入，已执行”\n```\n\n待跟进的健康备注会自动出现在每日简报（`health_advisor.py briefing`）中，确保不遗漏。\n\n## 初始配置引导\n\n当用户首次使用、或表示\"图片识别不工作\"\"无法识别报告\"时，先在后台运行配置检查：\n\n```bash\npython3 {baseDir}/scripts/setup.py check\n```\n\n若输出中 `vision_configured` 为 `false`，**不要在聊天中索要 API Key**，而是引导用户在终端完成配置：\n\n### 配置流程\n\n**第一步：询问地区/偏好**\n\n> 检测到图片和 PDF 识别功能还没配置，需要接入一个视觉模型才能用。\n>\n> 你用的是国内网络还是海外网络？或者想完全在本地离线运行？\n\n根据回答推荐方案，并给出对应的注册链接：\n- 国内 → **硅基流动**（免费注册有额度，在 https://cloud.siliconflow.cn 获取 API Key）\n- 海外 → **Google Gemini**（免费，在 https://aistudio.google.com/apikey 获取）\n- 离线 → **本地 Ollama**（需提前安装 Ollama 并下载模型）\n\n**第二步：引导在终端配置（不在聊天中收集密钥）**\n\n告知用户在终端执行以下命令（`sk-xxx` 替换为实际 Key）：\n\n```\n# 示例：硅基流动\npython3 {baseDir}/scripts/setup.py set-vision --provider siliconflow --api-key sk-xxx\n\n# 示例：Google Gemini\npython3 {baseDir}/scripts/setup.py set-vision --provider gemini --api-key AIza-xxx\n\n# 示例：本地 Ollama\npython3 {baseDir}/scripts/setup.py set-vision --provider ollama\n```\n\n> ⚠️ **API Key 请在终端输入，不要通过聊天发送。** 在终端执行完成后告诉我一声，我来帮你验证是否配置成功。\n\n**第三步：用户告知完成后，验证配置**\n\n```bash\npython3 {baseDir}/scripts/setup.py test-vision\n```\n\n- 测试通过 → \"配置好了！现在可以直接把报告图片或 PDF 发给我来识别。\"\n- 测试失败 → 根据错误信息提示用户检查 API Key 是否正确，或网络是否可用。\n\n### 原则\n\n- **不在聊天中收集凭据**：API Key 属于敏感信息，必须由用户在本机终端直接输入，不得经过对话传递。\n- **后台静默执行**：`setup.py test-vision` 等验证命令在后台完成，不要把 JSON 输出贴给用户。\n- **配置失败友好提示**：失败时给出具体原因和可操作的修复建议，不要直接贴报错。\n\n## 不可跳过的规则\n\n1. **不要直接展示 JSON**：查询结果必须转成自然中文。\n2. **不要用自身视觉能力读医疗图片**：图片/PDF 只能走外部视觉模型。\n3. **药物安全问题必须先搜**：通过 DDInter、openFDA 或网页搜索查询，不要凭记忆回答。\n4. **发简报默认发图片版**：优先 `briefing_report.py screenshot`，不是纯文本。\n5. **多张图片先收齐再处理**：不要每到一张就立即确认录入。\n6. **每次调用脚本必须携带 `--owner-id`（强制）**：从当前会话上下文获取发送者 ID，格式为 `<channel>:<user_id>`（如 `feishu:ou_707461a1baa7790213d30230b88fb575` 或 `qqbot:12345`），作为所有脚本的 `--owner-id` 参数。这是多用户数据隔离的核心机制，任何脚本调用都不得省略。不知道 owner_id 时，先停下来确认，不要在没有 owner_id 的情况下写入数据。\n7. **就医前摘要默认先短文版**：先用 `doctor_visit_report.py text` 生成；用户需要时，再导出图片或 PDF。\n8. **成员确认必须等用户明确回复**：先调用 `member.py list` 展示已有成员，问清楚\"是为哪位成员操作\"，等待用户回复后再继续。不得自动创建成员（包括\"本人\"），不得在成员未确认的情况下写入任何数据。\n9. **记录饮食前必须先查食物数据库**：通过 diet-tracker 的 `food_lookup.py search` 查每种食物的营养数据，用查询结果填写 `--items`。禁止凭 AI 自身知识估算营养值后直接写入。\n10. **对话中的健康提及必须实时记录（强制）**：用户在对话中随口提到任何健康相关内容（症状、不适、用药感受、睡眠、情绪等），**必须在当次对话结束前**调用 `health_memory.py log` 将其写入健康备注。这是夜间做梦机制的原始素材来源——`dream.py gather` 会专门读取当日记录的对话提及，未被记录的提及将永久丢失。\n\n    **触发关键词示例**（不限于此）：\n    - \"最近/今天/昨天有点…\"、\"感觉…\"、\"一直…\"、\"偶尔…\"\n    - 身体部位 + 描述：头、胃、腿、眼睛、心脏 + 疼/胀/酸/晕/难受\n    - 睡眠问题：睡不着、早醒、多梦、睡眠质量差\n    - 情绪/精力：累、乏力、焦虑、情绪低落、提不起劲\n    - 用药感受：吃了药之后…、副作用、效果不明显\n\n## 每日健康简报推送规范（OpenClaw 定时任务）\n\n**触发时机：每日早晨 8:00，由 OpenClaw agent 自动执行。**\n\n### 执行流程\n\n```\n1. wearable-sync: sync-all          → 同步手表数据（若有绑定设备）\n2. health-monitor: check-all        → 检测异常指标，写入 alerts 表\n3. health_advisor.py briefing       → 获取全家简报数据（提醒 + 建议 + 风险等级）\n4. briefing_report.py screenshot    → 生成图片版简报（PNG），同时自动保存当日快照\n5. 推送给用户（见下方推送规则）\n```\n\n### 夜间做梦任务（OpenClaw 定时任务）\n\n**触发时机：每晚 22:00，由 OpenClaw agent 自动执行，调用 DREAM skill。**\n\n做梦机制负责在夜间回顾当日健康素材，提炼规律和隐患，将有价值的洞察写入健康备注，供次日简报展示。详见 `mediwise-health-tracker/DREAM.md`。\n\n```\ndream.py status   → 检查是否满足触发条件（≥20h 间隔）\ndream.py lock     → 获取做梦锁（防止并发）\ndream.py gather   → 收集当日健康素材\n↓ agent 深度分析（逐成员回顾指标/告警/备注趋势）\nhealth_memory.py log  → 写入值得记录的发现（有发现才写，最多3条/成员）\ndream.py unlock   → 释放锁，标记完成\n```\n\n### 推送内容规则\n\n| 情况 | 推送什么 |\n|---|---|\n| 有 alert 级告警 | 图片简报 + 文字摘要，文字中明确点出告警项 |\n| 只有 warning 或 info | 图片简报，文字一句话概括（\"今日整体正常，有 N 项提醒\"）|\n| 完全正常 | 只发一句\"今日健康状况良好，无待处理事项\" + 可选图片简报 |\n| 同步失败（无手表数据） | 注明\"今日手表数据未能同步，以下数据基于上次同步结果\" |\n\n### 推送格式\n\n- **默认发图片版**：`briefing_report.py screenshot` 生成 PNG，作为图片消息发送\n- **文字摘要**：在图片前附一段不超过 100 字的中文摘要，点出最重要的 1-2 件事\n- **禁止**：直接把 JSON 或 HTML 内容粘贴到聊天里\n\n### 用户手动请求时\n\n当用户说\"给我看今天的健康简报\"、\"健康小报\"、\"今天身体怎么样\"等时，立即执行步骤 3-5（不重复同步），发送图片简报。\n\n## 每日健康快照记忆（daily_snapshot.py）\n\n每次生成简报时自动保存当日快照，agent 可在对话中直接引用历史状态，无需每次重新计算。\n\n### 支持的查询场景\n\n| 用户说 | agent 调用 | 说明 |\n|---|---|---|\n| \"昨天状态怎么样\" | `daily_snapshot.py get --date <昨天>` | 返回单日摘要 |\n| \"这周身体趋势\" | `daily_snapshot.py history --days 7` | 最近7天列表 |\n| \"这个月有几天出现告警\" | `daily_snapshot.py trend --days 30` | 逐日风险等级 |\n| \"上周五血压有没有异常\" | `daily_snapshot.py get --date <日期>` + 若需要细节查 `health_metrics` | 快照 + 原始指标 |\n\n### 使用规则\n\n- **优先查快照**：用户问历史健康状态时，先查 `daily_snapshot.py`，有结果就直接用，不需要重新跑 `health_advisor.py`\n- **快照没有再查原始指标**：快照只存摘要和风险等级；如用户追问具体数值，再查 `health_metrics`\n- **描述要自然**：把 risk_level（ok / warning / alert）和 summary_text 组合成一句话，不要直接展示 JSON\n\n```bash\n# 查昨天快照\npython3 {baseDir}/scripts/daily_snapshot.py get --member-id <id> --date 2026-04-05 --owner-id <oid>\n\n# 查最近7天\npython3 {baseDir}/scripts/daily_snapshot.py history --member-id <id> --days 7 --owner-id <oid>\n\n# 查30天趋势（用于描述\"这个月整体状况\"）\npython3 {baseDir}/scripts/daily_snapshot.py trend --member-id <id> --days 30 --owner-id <oid>\n```\n\n## 能力介绍模板\n\n当用户问“你可以做什么”“你能帮我做什么”时，可以优先用自然中文这样回答：\n\n```text\n我可以帮你做这些和健康相关的事情：\n- 记录和整理健康档案：症状、诊断、用药、检验、影像、血压血糖等\n- 查询和总结病程：帮你把最近变化、既往史、在用药整理清楚\n- 做提醒和健康简报：比如用药提醒、复查提醒、每日简报\n- 识别报告图片或化验单：把图片/PDF里的信息提取出来录入\n- 在你准备去看医生前，先生成一段”就医前摘要”：自动整理最近的关键情况、相关病史、过敏史、在用药和需要注意的事项；如果你需要，我再继续整理成图片或 PDF\n- 就诊全程管理：提前规划预约 → 就诊前智能汇总症状/指标/用药 → 就诊后记录诊断和处方 → 自动追踪复诊提醒\n- 健康记忆：随时告诉我你注意到的健康问题（如”最近膝盖有点疼”），我会记下来并在几天后主动提醒你跟进\n\n如果你愿意，现在就可以直接告诉我：\n“帮我整理最近的情况”\n或\n“帮我整理最近的就医摘要”\n或\n“帮我生成一张给医生看的摘要图”\n```\n\n如果用户已经明确说最近要去医院、复诊、看专科，优先提“就医前摘要图”，不要把它埋在能力列表最后。\n\n## 数据备份与迁移\n\n当用户需要换设备、换环境，或者迁移到新的小龙虾实例时，使用以下命令打包和恢复数据：\n\n```bash\n# 备份：将所有数据库和配置打包到一个文件\npython3 {baseDir}/scripts/setup.py backup --output mediwise-backup.tar.gz\n\n# 恢复：在新环境中还原数据（Schema 自动升级到最新版本）\npython3 {baseDir}/scripts/setup.py restore --input mediwise-backup.tar.gz\n```\n\n备份文件包含：`medical.db`、`lifestyle.db`、`config.json`（以及旧版 `health.db`，如存在）。\n\n**迁移流程**：\n1. 旧环境：`setup.py backup --output xxx.tar.gz`，将文件发给用户\n2. 用户把文件传到新设备\n3. 新环境：`setup.py restore --input xxx.tar.gz`，数据恢复并自动完成 Schema 迁移\n\n## 参考导航\n\n按需读取，不要一次全读：\n\n- 录入、查询自然语言化、视觉处理：`mediwise-health-tracker/references/intake-query-vision.md:1`\n- 药物安全、健康建议、图片版简报：`mediwise-health-tracker/references/drug-briefing.md:1`\n- 周期追踪、附件管理、多租户隔离：`mediwise-health-tracker/references/cycle-attachments-multitenancy.md:1`\n- 就医前摘要图：`mediwise-health-tracker/references/visit-prep.md:1`\n\n## 反模式\n\n- 不要在未确认成员身份时直接写入数据。\n- 不要猜测诊断、剂量或图片内容。\n- 不要在用户未确认前删除记录或覆盖原始附件。\n- 不要说“无法发送图片”或“平台不支持图片”；本地图片可通过 `<qqimg>` 发送。\n- 不要用英文回复中文用户。\n\nFile v2.0.8:SKILL.md\n\n---\nname: mediwise-health-suite\ndescription: \"Family health management suite: health records, diet tracking, weight management, wearable sync. Local SQLite storage by default; optional cloud features require explicit setup.\"\nversion: 2.0.7\nauthor: MediWise Team\nlicense: MIT\nhomepage: https://github.com/JuneYaooo/mediwise-health-suite\nrepository: https://github.com/JuneYaooo/mediwise-health-suite\nkeywords:\n  - health\n  - medical\n  - family\n  - diet\n  - weight\n  - records\n  - chinese\n  - openclaw\nrequires:\n  bins:\n    - python3\n    - sqlite3\n    - node\n---\n\n# MediWise Health Suite - 家庭健康管理套件\n\n家庭健康管理助手：记录健康数据，追踪饮食和体重，为家庭健康保驾护航。\n\n## 核心能力\n\n### ✅ 1. 家庭健康档案 (mediwise-health-tracker)\n- 成员信息管理：姓名、关系、性别、出生日期、血型\n- 基础病史：既往史、过敏史、联系方式、紧急联系人\n- 病程记录：门诊、住院、急诊、症状、诊断、检验、影像\n- 用药信息：当前在用药、历史用药、停药原因\n- 日常指标：血压、血糖、心率、血氧、体温、体重等\n- 查询能力：健康摘要、时间线、在用药、全家概览\n- **就医前摘要**：自动整理病情、既往史、在用药，生成文本/图片/PDF\n\n### ✅ 2. 饮食追踪 (diet-tracker)\n- 每餐记录与食物条目管理\n- 营养分析：热量、蛋白质、脂肪、碳水、膳食纤维\n- 每日/每周营养摘要\n- 热量趋势分析\n\n### ✅ 3. 体重管理 (weight-manager)\n- 目标设定：减重/增重/维持\n- BMI/BMR/TDEE 计算\n- 运动记录与消耗追踪\n- 身体围度记录\n- 热量收支分析\n- 达标预测\n\n### ⚠ 4. 智能健康监测 (health-monitor) - 待完善\n- 多级阈值告警（info/warning/urgent/emergency）\n- 趋势分析与异常检测\n- 自动提醒：用药提醒、复查提醒、指标测量提醒\n\n### ⚠ 5. 可穿戴设备同步 (wearable-sync) - 待完善\n- 支持 Gadgetbridge（小米手环、华为手表等）\n- 自动同步：心率、步数、血氧、睡眠\n- 可插拔 Provider 架构\n\n## 快速开始\n\n### 安装\n\n> **重要**：OpenClaw 沙箱要求 skills 必须位于插件/agent 工作区目录内。\n> `clawhub install` 会安装到**当前目录**的 `skills/` 子目录，\n> 因此务必先 `cd` 进入正确的工作区目录再执行安装命令。\n\n**通过 ClawdHub（推荐）：**\n```bash\n# 先进入 OpenClaw agent 工作区目录（路径以实际配置为准）\ncd ~/.openclaw/workspace-health   # 或你的插件根目录\n\n# 再安装，skill 会被放到 ./skills/mediwise-health-suite/\nclawdhub install JuneYaooo/mediwise-health-suite\n```\n\n**手动安装（路径最明确）：**\n```bash\n# 直接克隆到正确路径，不受工作目录影响\ngit clone https://github.com/JuneYaooo/mediwise-health-suite.git \\\n  ~/.openclaw/workspace-health/skills/mediwise-health-suite\n```\n\n**路径检测工具（装完后验证）：**\n```bash\nbash ~/.openclaw/workspace-health/skills/mediwise-health-suite/install-check.sh\n```\n\n### 基本使用\n\n1. **添加家庭成员**\n   ```\n   \"帮我添加一个家庭成员，叫张三，是我爸爸\"\n   ```\n\n2. **记录健康指标**\n   ```\n   \"帮我记录今天血压 130/85，心率 72\"\n   ```\n\n3. **查看健康摘要**\n   ```\n   \"帮我看看最近的健康情况\"\n   ```\n\n4. **饮食记录**\n   ```\n   \"帮我记录今天早餐：牛奶一杯、面包两片、鸡蛋一个\"\n   ```\n\n5. **体重管理**\n   ```\n   \"帮我设定一个减重目标，从 70kg 减到 65kg\"\n   ```\n\n6. **就医前准备**\n   ```\n   \"我准备去看医生，帮我整理一下最近的情况\"\n   ```\n\n## 系统要求\n\n- **Python**: 3.8+\n- **SQLite**: 3.x\n- **操作系统**: Linux / macOS / Windows\n- **OpenClaw**: 2026.3.0+\n\n## 数据隐私\n\n- **默认本地存储**：所有数据存储在本地 SQLite 数据库，不上传云端\n- **可选后端模式**：支持可选的后端 API 模式（需用户主动配置，默认关闭）\n- **可选向量搜索**：支持智能查询功能（本地模型优先，可选 API，默认关闭）\n- **多租户隔离**：支持共享实例场景的数据隔离\n\n**重要**：所有云端功能均为可选，需用户主动配置启用。默认配置下，所有数据仅存储在本地。\n\n## 可选环境变量\n\n所有功能在不设置任何环境变量的情况下均可正常使用。详细配置模板见根目录 `.env.example`。\n\n### 多模态视觉模型（强烈推荐配置）\n\n用于识别体检报告图片、化验单、病历 PDF。不配置则无法处理图片输入。\n\n| 变量名 | 说明 | 推荐值 |\n|--------|------|--------|\n| `MEDIWISE_VISION_API_KEY` | 视觉模型 API Key（设置即自动启用） | 见下方推荐方案 |\n| `MEDIWISE_VISION_PROVIDER` | 提供商名称 | `siliconflow` / `openai` / `ollama` |\n| `MEDIWISE_VISION_MODEL` | 模型名称 | 见下方推荐方案 |\n| `MEDIWISE_VISION_BASE_URL` | API 地址（OpenAI 兼容接口） | 见下方推荐方案 |\n\n**推荐方案：**\n\n| 方案 | 适用场景 | PROVIDER | MODEL | BASE_URL |\n|------|---------|----------|-------|----------|\n| 硅基流动 Qwen2.5-VL（**国内首选**） | 国内部署，价格低，[注册链接](https://cloud.siliconflow.cn/i/MOlLXTYM) | `siliconflow` | `Qwen/Qwen2.5-VL-72B-Instruct` | `https://api.siliconflow.cn/v1` |\n| Google Gemini 3.1 Pro（**海外首选**） | 多模态效果强 | `openai` | `gemini-3.1-pro-preview` | `https://generativelanguage.googleapis.com/v1beta/openai` |\n| OpenAI GPT-4o | 通用，效果稳定 | `openai` | `gpt-4o` | `https://api.openai.com/v1` |\n| 阶跃星辰 Step-1V | 国内备选 | `openai` | `step-1v-32k` | `https://api.stepfun.com/v1` |\n| 本地 Ollama | 完全离线 | `ollama` | `qwen2-vl:7b` | `http://localhost:11434/v1` |\n\n也可以用 `setup.py` 命令配置（保存到 `config.json`，环境变量优先级更高）：\n```bash\npython3 scripts/setup.py set-vision \\\n  --provider siliconflow \\\n  --model Qwen/Qwen2.5-VL-72B-Instruct \\\n  --api-key sk-xxx \\\n  --base-url https://api.siliconflow.cn/v1\n```\n\n### 纯文本 LLM（可选）\n\n用于结构化提取、快速录入解析。**不设置时自动复用视觉模型**，无需单独配置。\n\n| 变量名 | 说明 |\n|--------|------|\n| `MEDIWISE_LLM_API_KEY` | 文本模型 API Key |\n| `MEDIWISE_LLM_PROVIDER` | 提供商 |\n| `MEDIWISE_LLM_MODEL` | 模型名称 |\n| `MEDIWISE_LLM_BASE_URL` | API 地址 |\n\n### 其他可选变量\n\n| 变量名 | 用途 | 默认行为 |\n|--------|------|----------|\n| `MEDIWISE_OWNER_ID` | 多租户隔离：限定当前进程只能访问该 owner 的数据。**个人/单用户使用时无需设置**；仅在将本工具部署为多人共享服务（如群聊机器人）时才需要为每个用户设置不同值以实现数据隔离 | 未设置时为单用户模式（访问本机全部数据），适合个人或家庭独立部署 |\n| `USDA_API_KEY` | USDA FoodData Central API Key，用于国际食材兜底查询。免费注册：https://api.data.gov/signup/ | 未设置时跳过 USDA 查询，使用内置离线数据库 |\n| `MEDIWISE_DATA_DIR` | 覆盖 SQLite 数据库存储目录 | 默认 OS 用户数据目录（Linux: `~/.local/share/mediwise`） |\n| `MEDIWISE_MEDICAL_DB_PATH` | 覆盖医疗数据库（medical.db）路径 | 存储在 `MEDIWISE_DATA_DIR` 下 |\n| `MEDIWISE_LIFESTYLE_DB_PATH` | 覆盖生活方式数据库（lifestyle.db）路径 | 存储在 `MEDIWISE_DATA_DIR` 下 |\n\n## 可选外部网络访问\n\n## 安全说明\n\n### 运行时环境\n\n本 skill 同时使用 **Python 3.8+**（业务脚本）和 **Node.js 18+**（action 路由层），两者均需已安装。\n\n### 数据隔离（多用户部署）\n\n- **个人/家庭单机使用**：无需任何配置，所有数据保存在本机 SQLite 文件中。\n- **多用户共享部署**（如群聊机器人）：必须为每个用户传入不同的 `owner_id`（格式 `<channel>:<user_id>`），否则所有用户共享同一份数据库视图。index.js 在 owner_id 缺失时会打印 WARNING 并进入单用户模式。\n\n### 第三方凭据处理\n\n- **凭据绝不经过聊天传递**：所有 API Key、密码等敏感信息必须由用户在本机终端直接输入，agent 不会在对话中索要、接收或代为保存凭据。\n- **Garmin Connect 密码**：首次绑定通过终端交互输入（`--prompt-password`，不回显），密码不经过模型或日志。认证成功后自动保存 OAuth token，后续同步无需密码。\n- **视觉/LLM API Key**：用户在终端执行 `setup.py set-vision --api-key <key>` 完成配置，key 保存在本机 `config.json`，不会出现在聊天记录中。\n- **所有凭据**均保存在本机，不上传到任何远程服务器。\n\n### 可选外部访问（默认关闭）\n\n默认完全离线，以下网络请求**仅在用户主动在终端执行配置命令后**才会发生：\n\n| 触发操作（需用户在终端执行） | 外部主机 | 发送内容 |\n|------------------------------|----------|----------|\n| `setup.py set-vision` 启用视觉模型 | `api.siliconflow.cn` / Google / OpenAI 等 | 图片 base64 + 提示词（不含姓名/身份证等 PII） |\n| `USDA_API_KEY` 环境变量 | `api.nal.usda.gov` | 食物名称搜索词 |\n| `setup.py set-embedding` 启用向量搜索 | `api.siliconflow.cn` | 匿名文本片段 |\n| `setup.py set-backend` 启用后端 API | 用户自配置的端点 | **完整健康记录** — 仅在自托管可信端点使用，不建议指向第三方服务 |\n\n> **set-backend 风险说明**：启用后端 API 后，所有健康记录（病历、指标、用药等）将发送至配置的端点。请仅在完全信任该端点的情况下启用，且优先使用本地或自托管服务。\n\n### 备份文件\n\n`setup.py backup` 会将所有数据库打包为 `.tar.gz`，**包含完整的健康档案**，请妥善保管，不要分享给未授权人员。\n\n## 技术架构\n\n- **数据库**: SQLite（共享 health.db）\n- **脚本语言**: Python 3.8+\n- **Skill 框架**: OpenClaw Agent Skills\n- **模块化设计**: 5 个 skills（3 个已实现，2 个待完善）\n- **可选功能**: 后端 API、向量搜索（默认关闭）\n\n## 许可证\n\nMIT License - 详见 [LICENSE](LICENSE) 文件\n\n## 免责声明\n\n本工具仅供健康信息记录和参考，不构成医疗建议。任何健康问题请咨询专业医生。\n\n---\n\n**关键词**: 健康管理、医疗记录、家庭健康、饮食追踪、体重管理、health management, medical records, family health, diet tracking, weight management\n\nFile v2.0.8:sleep-tracker/SKILL.md\n\n---\nname: sleep-tracker\ndescription: >-\n  睡眠追踪与质量分析。记录每晚睡眠时长和各阶段（深睡/浅睡/REM/清醒），\n  评估睡眠质量评分，查看每日详情和每周趋势。支持手动录入和可穿戴设备自动同步。\n  Sleep tracking and quality analysis. Records nightly sleep duration and stages\n  (deep/light/REM/awake), scores sleep quality, and shows daily details and weekly trends.\n  关键词：睡眠记录、睡眠质量、深睡、REM、睡眠趋势、睡眠分析、失眠、睡了多久、昨晚睡眠。\n---\n\n# Sleep Tracker - 睡眠追踪\n\n记录和分析睡眠数据，评估睡眠质量，发现睡眠规律。\n\n## 睡眠质量评分标准\n\n| 评分 | 标签 | 说明 |\n|------|------|------|\n| 85-100 | 优质 | 时长充足，各阶段比例理想 |\n| 70-84 | 良好 | 基本达标，有小幅改善空间 |\n| 55-69 | 一般 | 存在明显不足，建议关注 |\n| 0-54 | 较差 | 睡眠质量差，需要干预 |\n\n**理想睡眠参考值：**\n- 总时长：7-9 小时\n- 深睡比例：13-23%\n- REM 比例：20-25%\n- 清醒时间：<10%\n\n## 核心工作流\n\n> **强制规则**：每次调用脚本必须携带 `--owner-id`，从会话上下文获取发送者 ID（格式 `<channel>:<user_id>`，如 `feishu:ou_xxx` 或 `qqbot:12345`），不得省略。\n\n### 1. 手动录入睡眠\n\n用户说「昨晚睡了7小时」「记录睡眠」时使用：\n\n```bash\n# 录入总时长（最简方式，其他阶段留空）\npython3 {baseDir}/scripts/sleep.py log --member-id <id> --duration 420\n\n# 带阶段详情录入\npython3 {baseDir}/scripts/sleep.py log --member-id <id> --duration 480 \\\n  --deep 90 --light 240 --rem 100 --awake 30\n\n# 指定日期（默认昨天）\npython3 {baseDir}/scripts/sleep.py log --member-id <id> --duration 450 --date 2026-03-26\n```\n\n**时长换算提示：**\n- 用户说「7小时」→ duration=420\n- 用户说「7.5小时」→ duration=450\n- 用户说「7小时30分」→ duration=450\n\n### 2. 查看每日睡眠\n\n用户说「昨晚睡得怎么样」「查看睡眠」时使用：\n\n```bash\n# 查看昨晚（默认）\npython3 {baseDir}/scripts/sleep.py daily --member-id <id>\n\n# 查看指定日期\npython3 {baseDir}/scripts/sleep.py daily --member-id <id> --date 2026-03-26\n```\n\n### 3. 每周睡眠趋势\n\n用户说「这周睡眠怎么样」「睡眠趋势」时使用：\n\n```bash\n# 近7天（默认）\npython3 {baseDir}/scripts/sleep.py weekly --member-id <id>\n\n# 近14天\npython3 {baseDir}/scripts/sleep.py weekly --member-id <id> --days 14\n```\n\n### 4. 历史记录\n\n```bash\n# 最近14条（默认）\npython3 {baseDir}/scripts/sleep.py list --member-id <id>\n\n# 最近30条\npython3 {baseDir}/scripts/sleep.py list --member-id <id> --limit 30\n```\n\n## 数据来源\n\n睡眠数据来自两个渠道：\n1. **手动录入**：通过 `sleep-log` action 直接输入\n2. **可穿戴同步**：通过 wearable-sync 从 Apple Health / Gadgetbridge 自动导入\n\n两种来源均存储在 `health_metrics` 表（`metric_type='sleep'`），查询时统一处理。\n\n## 反模式\n\n- **不要重复录入同一天** — 系统会显示多条，建议先 daily 确认再录入\n- **阶段时长之和不能超过总时长** — 否则录入报错\n- **手动录入不需要精确到分钟** — 大致时长即可，质量评分有容忍范围\n\nFile v2.0.8:wearable-sync/SKILL.md\n\n---\nname: wearable-sync\ndescription: \"Wearable device data sync: import health data from Garmin watches (Body Battery, HRV, sleep, heart rate), Apple Health, Huawei, Xiaomi (Gadgetbridge), Zepp devices. Pluggable provider architecture.\"\n---\n\n# Wearable Sync - 可穿戴设备数据同步\n\n从可穿戴设备（手环/手表）采集健康数据并写入 mediwise-health-tracker 的 health_metrics 表。\n\n## 支持的设备/Provider\n\n| Provider | 状态 | 数据来源 | 支持指标 |\n|----------|------|----------|----------|\n| Gadgetbridge | ✅ 已实现 | 本地 SQLite 导出文件 | 心率、步数、血氧、睡眠 |\n| Apple Health | ✅ 已实现 | export.xml / export.zip | 心率、步数、血氧、睡眠、体重、身高、体脂、血糖、血压、卡路里 |\n| **Garmin Connect** | ✅ 已实现 | Garmin Connect 账号（非官方 API） | 心率、睡眠分期、HRV、身体电量、压力、步数、卡路里、血氧、活动记录 |\n| 华为 Health Kit | 🔜 Stub | REST API（需企业开发者资质） | — |\n| Zepp Health | 🔜 Stub | REST API（需开发者账号） | — |\n| OpenWearables | 🔜 Stub | 统一 API（暂不支持华为/小米） | — |\n\n> **强制规则**：每次调用脚本必须携带 `--owner-id`，从会话上下文获取发送者 ID（格式 `<channel>:<user_id>`，如 `feishu:ou_xxx` 或 `qqbot:12345`）。所有设备管理和同步操作均需携带，不得省略。\n\n## Garmin Connect 接入说明\n\n### 前置依赖\n\n```bash\npip install garminconnect\n```\n\n> Garmin 使用非官方 API（模拟 Web 登录），无需申请开发者账号。需要用户的 Garmin Connect 账号和密码。\n\n### 绑定流程\n\n```bash\n# 1. 添加 Garmin 设备\npython3 {baseDir}/scripts/device.py add --member-id <id> --provider garmin --device-name \"Garmin Fenix 7\"\n\n# 2. 配置账号（--prompt-password 交互输入，密码不经过模型）\npython3 {baseDir}/scripts/device.py auth --device-id <id> \\\n  --username you@example.com \\\n  --prompt-password \\\n  --tokenstore /home/ubuntu/.garmin_tokens\n# 终端会提示\"请输入密码\"，输入时不回显，密码不出现在命令行/日志/模型上下文中\n\n# 也可通过环境变量传入（适合 CI/cron 无终端场景）\n# export GARMIN_PASSWORD='yourpass'\n# python3 device.py auth --device-id <id> --username you@example.com --tokenstore ...\n\n# 3. 测试连接\npython3 {baseDir}/scripts/device.py test --device-id <id>\n\n# 4. 同步数据\npython3 {baseDir}/scripts/sync.py run --device-id <id>\n```\n\n**Agent 引导规则（重要）：**\n\n- **禁止在聊天中索要密码**：密码一旦在对话框输入，就会出现在模型上下文和服务端日志中\n- 正确做法：先收集邮箱和 tokenstore 路径，然后生成一条 `device.py auth ... --prompt-password` 命令，让用户在自己的终端运行（可用 `! <命令>` 直接在会话执行），密码由终端 `getpass` 读取，全程不经过模型\n\n**Agent 引导步骤（agent 对话中按序询问）：**\n\n1. **确认设备名称**：请问你的佳明手表型号是？（如 Fenix 7、Forerunner 965，填写任意名称即可）\n2. **收集邮箱**：你的 Garmin Connect 登录邮箱是？\n3. **是否保存登录状态**：是否保存登录 token？（推荐，设置后登录一次即可，后续同步无需密码）\n   - 是 → 询问 tokenstore 目录（可用默认值 `~/.garmin_tokens`）\n4. **生成命令让用户自行输入密码**（不在聊天里问密码）：\n\n   ```\n   请在你的终端运行以下命令，运行后会提示输入密码（不回显，不经过我）：\n   ! python3 {baseDir}/scripts/device.py auth --device-id <id> --username <邮箱> --prompt-password --tokenstore ~/.garmin_tokens\n   ```\n\n5. 命令运行成功后，调用 `device-test` 验证连接，再调用 `sync-device` 拉取近 7 天数据\n   - 若返回错误含「升级库」提示，告知用户执行 `pip install --upgrade garminconnect`\n   - 若返回错误含「两步验证」提示，告知用户需要在终端完成一次性验证后重试\n\n### Agent 引导用户配置佳明的对话规则\n\n当用户表达以下意图时，agent 应主动引导完成绑定流程：\n- \"我用佳明\"、\"我有 Garmin 手表\"、\"帮我绑定佳明\"\n- \"我想同步佳明数据\"、\"我的 Fenix / Forerunner / Venu / Vivoactive\"\n\n**同步频率建议**：每小时最多同步一次，可通过 cron 自动定时同步。\n\n### 支持的 Garmin 指标\n\n| metric_type | 说明 | 数据格式 |\n|---|---|---|\n| `heart_rate` | 全天心率（5分钟间隔） | `\"72\"` |\n| `sleep` | 睡眠分期汇总 | `{\"duration_min\":420,\"deep_min\":80,\"light_min\":210,\"rem_min\":100,\"awake_min\":30,\"score\":78}` |\n| `hrv` | 夜间 HRV（RMSSD） | `{\"rmssd\":45.2,\"weekly_avg\":43.0,\"status\":\"BALANCED\"}` |\n| `body_battery` | 身体电量（5分钟间隔） | `{\"level\":72,\"charged\":5,\"drained\":2}` |\n| `stress` | 压力指数（3分钟间隔） | `\"28\"` |\n| `steps` | 每日步数汇总 | `{\"count\":8500,\"distance_m\":6200,\"calories\":320}` |\n| `calories` | 活动卡路里 | `\"320\"` |\n| `blood_oxygen` | 血氧（SpO2，小时均值） | `\"97\"` |\n| `weight` | 体重（kg，来自 Garmin Connect 体重记录） | `\"72.5\"`，extra 含 `bmi`/`bodyFat`/`muscleMass` 等（设备支持时） |\n| `activity` | 运动记录 | `{\"activity_type\":\"running\",\"duration_sec\":3600,\"distance_m\":10000,\"avg_hr\":152}` |\n| `respiration` | 呼吸频率（次/分钟，睡眠期间采样，设备支持时） | `\"14.5\"` |\n| `training_readiness` | 训练准备度评分（0-100，综合睡眠/HRV/负荷等子项） | `{\"score\":72,\"level\":\"GOOD\",\"sleep_score\":80,\"hrv_status\":\"BALANCED\"}` |\n| `training_status` | 训练状态（VO2 Max、有氧/无氧负荷，需设备支持） | `{\"vo2_max\":48.2,\"status\":\"PRODUCTIVE\",\"aerobic_load\":1.2}` |\n| `floors` | 爬楼层数（每日累计） | `{\"ascended\":12,\"descended\":10}` |\n| `hydration` | 水分摄入（ml，需在 Garmin Connect App 手动记录） | `{\"intake_ml\":1800.0,\"sweat_loss_ml\":650.0}` |\n\n### 注意事项\n\n- Garmin 账号若开启双重验证（2FA），首次登录需要在终端手动输入验证码；配置 `tokenstore` 后后续无需重复验证。\n- Garmin Connect 服务器有速率限制，建议同步频率不超过每小时一次。\n- 佳明「身体电量」（Body Battery）是 Garmin 专有指标，存储为 `body_battery` 类型，可与饮食数据联合分析恢复趋势。\n- 高驰（COROS）、Polar、Suunto 暂无官方 API，可通过 Strava 同步后使用 Strava provider（待实现）间接接入活动记录。\n\n## 核心工作流\n\n### 1. 设备绑定\n\n用户需要先绑定设备，指定 Provider 和配置信息：\n\n```bash\n# 添加 Gadgetbridge 设备\npython3 {baseDir}/scripts/device.py add --member-id <id> --provider gadgetbridge --device-name \"小米手环 8\"\n\n# 配置 Gadgetbridge 导出文件路径\npython3 {baseDir}/scripts/device.py auth --device-id <id> --export-path /path/to/Gadgetbridge.db\n\n# 查看已绑定设备\npython3 {baseDir}/scripts/device.py list --member-id <id>\n\n# 测试设备连接\npython3 {baseDir}/scripts/device.py test --device-id <id>\n\n# 移除设备\npython3 {baseDir}/scripts/device.py remove --device-id <id>\n```\n\n### 2. 数据同步\n\n```bash\n# 同步单个设备\npython3 {baseDir}/scripts/sync.py run --device-id <id>\n\n# 同步某成员所有设备\npython3 {baseDir}/scripts/sync.py run --member-id <id>\n\n# 同步所有活跃设备\npython3 {baseDir}/scripts/sync.py run-all\n\n# 查看同步状态\npython3 {baseDir}/scripts/sync.py status --device-id <id>\n\n# 查看同步历史\npython3 {baseDir}/scripts/sync.py history --device-id <id> --limit 10\n```\n\n### 3. 定时同步\n\nSkill 本身不运行后台进程。由 OpenClaw agent 每日定时触发，或用户手动请求时触发。\n\n**OpenClaw 定时触发规范（agent 按此执行）：**\n\n每日早晨 7:30 前，agent 应自动触发一次全量同步，流程如下：\n\n1. 调用 `sync-all` 同步所有活跃设备\n2. 若返回 `synced > 0`，继续触发 health-monitor 检测（见 health-monitor/SKILL.md）\n3. 若有告警，合并进当日健康简报推送（见 mediwise-health-tracker/SKILL.md 的「每日简报推送规范」）\n4. 若同步失败（认证错误/网络错误），**不静默忽略**，主动通知用户：\n   > \"今日佳明手表数据同步失败：{错误原因}，请检查网络或重新绑定设备。\"\n\n**用户手动请求时触发规范：**\n\n当用户说\"同步一下手表\"、\"更新健康数据\"、\"刷新佳明数据\"等时，立即执行 `sync-device` 或 `sync-all`，同步完成后告知结果。\n\n```bash\n# 备用：cron 直接调用（不依赖 agent，适合服务器独立部署）\n# 每小时整点同步一次\n0 * * * * cd /path/to/wearable-sync/scripts && python3 sync.py run-all >> ~/mediwise-sync.log 2>&1\n```\n\n## 数据标准化\n\n不同设备返回的原始数据格式各异，同步时统一转换为 health_metrics 格式：\n\n| 设备原始字段 | metric_type | value 格式 |\n|---|---|---|\n| Gadgetbridge HEART_RATE | heart_rate | \"72\" |\n| Gadgetbridge RAW_INTENSITY (steps) | steps | `{\"count\":8500,\"distance_m\":0,\"calories\":0}` |\n| Gadgetbridge SpO2 | blood_oxygen | \"98\" |\n| Gadgetbridge SLEEP | sleep | `{\"duration_min\":480,\"deep_min\":120,...}` |\n\n## 去重策略\n\n同步时按 `(member_id, metric_type, measured_at, source)` 做唯一性检查。已存在的同源同时间点数据会被跳过，并记录到 `wearable_sync_log` 中。\n\n## Gadgetbridge 导出说明\n\n1. 打开 Gadgetbridge App → 设置 → 数据库管理 → 导出数据库\n2. 导出文件为 `Gadgetbridge` 或 `Gadgetbridge.db`（SQLite 格式）\n3. 将文件传输到电脑，使用 `device.py auth --export-path` 配置路径\n\n## Apple Health 导出说明\n\n1. iPhone → 健康 App → 右上角头像 → 导出健康数据\n2. 生成 `export.zip`（内含 `export.xml`）\n3. 将文件传输到电脑，按以下步骤绑定：\n\n```bash\n# 添加 Apple Health 设备\npython3 {baseDir}/scripts/device.py add --member-id <id> --provider apple_health --device-name \"iPhone\"\n\n# 配置导出文件路径（支持 .xml 或 .zip）\npython3 {baseDir}/scripts/device.py auth --device-id <id> --export-path /path/to/export.zip\n\n# 同步数据\npython3 {baseDir}/scripts/sync.py run --device-id <id>\n```\n\n支持指标：心率、静息心率、步数、血氧、睡眠分期、体重、身高、体脂率、血糖、血压、卡路里消耗。\n\n### Apple Health 持续更新方案\n\nApple Health 导出是**手动触发的快照**，不是实时流。要实现持续监测，需要定期更新导出文件并重新同步。\n\n**推荐流程（每日自动化）：**\n\n```\niPhone 健康 App 导出\n    → AirDrop / iCloud Drive / USB 传输到 Mac\n    → 覆盖固定路径的 export.zip\n    → cron 定时触发 sync.py\n    → health-monitor check.py 检测异常\n```\n\n**方案一：iCloud Drive 自动同步（推荐，Mac 用户）**\n\n1. iPhone 导出时选择保存到 iCloud Drive 固定目录（如 `iCloud Drive/HealthExports/export.zip`）\n2. Mac 上 iCloud Drive 自动同步该文件\n3. 配置 `--export-path` 指向本地 iCloud 同步目录：\n   ```bash\n   ~/Library/Mobile\\ Documents/com~apple~CloudDocs/HealthExports/export.zip\n   ```\n4. 用户每次在 iPhone 重新导出覆盖该文件，Mac 自动同步，cron 定期执行同步\n\n**方案二：快捷指令（Shortcuts）自动导出**\n\niOS「快捷指令」App 可设置每日定时自动导出健康数据并上传到固定位置：\n1. 新建快捷指令 → 添加「导出健康数据」动作\n2. 添加「上传文件」动作（保存到 iCloud Drive 或通过 SSH/SFTP 上传到服务器）\n3. 设置「自动化」→「每天早上 7:00 运行」\n\n**方案三：手动定期导出（最简单）**\n\n用户每周或每天手动在 iPhone 导出一次，通过 AirDrop 传到 Mac，覆盖固定路径即可。适合数据精度要求不高的场景。\n\n**cron 自动同步配置（配合以上任一方案）：**\n\n```bash\n# 编辑 crontab\ncrontab -e\n\n# 每小时同步一次 Apple Health 数据并触发健康检测\n0 * * * * cd /path/to/wearable-sync/scripts && python3 sync.py run --device-id <device-id> >> ~/mediwise-sync.log 2>&1\n5 * * * * cd /path/to/health-monitor/scripts && python3 check.py run-all --window 2h >> ~/mediwise-check.log 2>&1\n```\n\n> **注意**：Apple Health 导出文件更新频率决定了数据新鲜度上限。iCloud 方案约有 5-15 分钟延迟；手动方案取决于用户导出频率。系统内置去重，重复同步同一文件不会产生重复数据。\n\n## 反模式\n\n- **不要手动修改 Gadgetbridge 导出数据库** — 直接读取即可\n- **不要频繁同步相同时间段** — 系统自动去重，但会浪费 I/O\n- **不要在同步过程中删除导出文件** — 等同步完成后再操作\n- **OAuth Provider（华为/Zepp）当前为 Stub** — 调用会抛出 NotImplementedError\n\n## Apple Health 实现依据与参考文献\n\n### HealthKit 官方文档\n\n| 文档 | 链接 | 用途 |\n|------|------|------|\n| HKQuantityTypeIdentifier 枚举 | https://developer.apple.com/documentation/healthkit/hkquantitytypeidentifier | APPLE_TYPE_MAP 中所有类型字符串的权威来源 |\n| HKCategoryTypeIdentifier 枚举 | https://developer.apple.com/documentation/healthkit/hkcategorytypeidentifier | 睡眠分析类型 identifier |\n| HKCategoryValueSleepAnalysis | https://developer.apple.com/documentation/healthkit/hkcategoryvaluesleepanalysis | SLEEP_VALUE_MAP int→阶段映射依据 |\n| HKCorrelation（血压关联模型） | https://developer.apple.com/documentation/healthkit/hkcorrelation | 血压收缩压/舒张压配对60秒窗口依据 |\n| HealthKit 数据类型总览 | https://developer.apple.com/documentation/healthkit/data_types | export.xml Record 元素结构（type/startDate/value/unit） |\n\n### 睡眠分期 int 映射（iOS 16+）\n\n`HKCategoryValueSleepAnalysis` 整数值含义（来源：Apple 开发者文档 + WWDC 2022 Session 10005）：\n\n| 整数值 | 枚举名 | 映射到 |\n|--------|--------|--------|\n| 0 | inBed | awake |\n| 1 | asleepUnspecified | awake |\n| 2 | awake | awake |\n| 3 | asleepCore | light_sleep |\n| 4 | asleepDeep | deep_sleep |\n| 5 | asleepREM | rem_sleep |\n\n值 0-2 为原始 API，值 3-5 在 iOS 16 引入精细睡眠分期时新增。\n\n### 单位换算依据\n\n| 换算 | 系数 | 来源 |\n|------|------|------|\n| 血糖 mg/dL → mmol/L | ÷ 18.0182 | 葡萄糖摩尔质量 180.182 g/mol（SI 单位标准） |\n| 身高 m → cm | × 100 | SI 基本单位定义 |\n| 体重 lbs → kg | × 0.453592 | NIST 磅-千克换算定义值 |\n| 血氧/体脂 fraction→% | × 100 | iOS 旧版本以小数存储（≤1.0 判断） |\n\n### 步数聚合\n\nApple Health 的 `HKQuantityTypeIdentifierStepCount` 为**分段采样**（非累计），每条 Record 记录一段时间内的步数增量。日步数总计通过对同一日历日内所有采样求和得到，与 Apple Health App 显示逻辑一致。\n\n### 大文件流式解析\n\nApple Health 导出文件可超过 1 GB，采用 `xml.etree.ElementTree.iterparse` + `elem.clear()` 模式以 O(1) 内存处理：\n- Python 官方文档：https://docs.python.org/3/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse\n\nFile v2.0.8:weight-manager/SKILL.md\n\n---\nname: weight-manager\ndescription: \"Weight management: set goals, track progress, log exercise, calculate BMI/BMR/TDEE, analyze calorie balance and body composition. Integrates with diet-tracker and mediwise-health-tracker.\"\n---\n\n# weight-manager\n\n## 概述\n\n提供体重目标设定、进度追踪、趋势分析、热量收支计算、达标预测、BMI/BMR/TDEE 计算、运动记录和身体围度记录功能。体重数据复用 `health_metrics` 表（weight 类型），饮食热量数据来自 `diet_records` 表，运动消耗数据来自 `exercise_records` 表，身体围度数据复用 `health_metrics` 表，形成完整的\"饮食 → 运动 → 热量 → 体重 → 身体成分\"管理闭环。\n\n## 数据模型\n\n### weight_goals（体重目标）\n| 字段 | 说明 |\n|------|------|\n| id | 目标 ID |\n| member_id | 成员 ID |\n| goal_type | 目标类型: lose/gain/maintain |\n| start_weight | 起始体重 kg |\n| target_weight | 目标体重 kg |\n| start_date | 开始日期 |\n| target_date | 目标日期 |\n| daily_calorie_target | 每日热量目标 kcal |\n| status | 状态: active/completed/abandoned |\n| note | 备注 |\n\n### exercise_records（运动记录）\n| 字段 | 说明 |\n|------|------|\n| id | 记录 ID |\n| member_id | 成员 ID |\n| exercise_type | 运动类型: running/walking/cycling/swimming/strength/yoga/hiit/other |\n| exercise_name | 自定义名称 |\n| duration | 时长（分钟） |\n| calories_burned | 消耗热量 kcal |\n| exercise_date | 运动日期 YYYY-MM-DD |\n| exercise_time | 运动时间 HH:MM |\n| intensity | 强度: low/medium/high |\n| note | 备注 |\n\n> 体重记录复用 `health_metrics` 表的 weight 类型，不重复建表。\n> 身体围度记录复用 `health_metrics` 表，metric_type 为 waist/hip/chest/arm/thigh/body_fat。\n\n## 功能列表\n\n### weight_goal.py — 目标管理\n\n| 动作 | 子命令 | 必要参数 | 可选参数 | 说明 |\n|------|--------|----------|----------|------|\n| set-goal | set | --member-id, --goal-type, --start-weight, --target-weight | --start-date, --target-date, --daily-calorie-target, --activity-level, --note | 设定减重/增重/维持目标，未指定热量目标时自动根据 BMR/TDEE 推算 |\n| view-goal | view | --member-id | | 查看当前活跃目标 |\n| update-goal | update | --goal-id | --target-weight, --target-date, --daily-calorie-target, --note | 修改目标参数 |\n| complete-goal | complete | --goal-id | | 标记目标完成 |\n| abandon-goal | abandon | --goal-id | | 放弃目标 |\n\n### weight_analysis.py — 进度分析\n\n| 动作 | 子命令 | 必要参数 | 可选参数 | 说明 |\n|------|--------|----------|----------|------|\n| weight-progress | progress | --member-id | | 当前进度（已减/增多少，完成百分比） |\n| weight-trend | trend | --member-id | --days (默认 30) | 体重趋势（N 天变化，平均变化速率） |\n| calorie-balance | calorie-balance | --member-id | --days (默认 7) | 热量收支（含饮食摄入 + 运动消耗 + TDEE 估算） |\n| weekly-report | weekly-report | --member-id | --end-date | 周报（体重变化 + 饮食热量 + 运动统计 + 建议） |\n| weight-projection | projection | --member-id | | 按当前速度预测达标日期 |\n\n### exercise.py — 运动记录\n\n| 动作 | 子命令 | 必要参数 | 可选参数 | 说明 |\n|------|--------|----------|----------|------|\n| add-exercise | add | --member-id, --exercise-type | --exercise-name, --duration, --calories-burned, --exercise-date, --exercise-time, --intensity, --note | 添加运动记录 |\n| list-exercises | list | --member-id | --exercise-type, --start-date, --end-date, --limit | 查看运动记录 |\n| delete-exercise | delete | --id | | 删除运动记录 |\n| exercise-summary | daily-summary | --member-id | --date | 某日运动摘要 |\n\n### body_stats.py — 身体指标与围度\n\n| 动作 | 子命令 | 必要参数 | 可选参数 | 说明 |\n|------|--------|----------|----------|------|\n| calculate-bmi | bmi | --member-id | | 计算 BMI（中国标准分级） |\n| calculate-bmr-tdee | bmr-tdee | --member-id | --activity-level | 计算 BMR 和 TDEE（Mifflin-St Jeor 公式） |\n| suggest-calories | suggest-calories | --member-id | --activity-level, --goal-type | 根据 TDEE + 目标类型推算每日热量目标 |\n| add-measurement | add-measurement | --member-id, --type, --value | --measured-at, --note | 记录身体围度 |\n| list-measurements | list-measurements | --member-id | --type, --limit | 查看围度记录历史 |\n| body-summary | body-summary | --member-id | | 综合身体报告（BMI + 围度变化 + 体脂率趋势） |\n\n## BMI/BMR/TDEE 说明\n\n### BMI 分级（中国标准）\n- < 18.5：偏瘦\n- 18.5 - 24：正常\n- 24 - 28：超重\n- >= 28：肥胖\n\n### BMR 公式（Mifflin-St Jeor）\n- 男: BMR = 10 × 体重(kg) + 6.25 × 身高(cm) - 5 × 年龄 + 5\n- 女: BMR = 10 × 体重(kg) + 6.25 × 身高(cm) - 5 × 年龄 - 161\n\n### TDEE 活动系数\n| 活动水平 | 系数 | 说明 |\n|----------|------|------|\n| sedentary | 1.2 | 久坐不动 |\n| light | 1.375 | 轻度活动（每周1-3次） |\n| moderate | 1.55 | 中度活动（每周3-5次） |\n| active | 1.725 | 高度活动（每周6-7次） |\n| very_active | 1.9 | 极高活动（高强度体力劳动） |\n\n### 热量推算规则\n- 减重: TDEE - 500 kcal（约每周减 0.45kg）\n- 增重: TDEE + 300 kcal\n- 维持: TDEE\n- 最低限制: 男 1500 kcal / 女 1200 kcal\n\n## 身体围度类型\n\n| 类型 | 说明 | 单位 | 范围 |\n|------|------|------|------|\n| waist | 腰围 | cm | 30-200 |\n| hip | 臀围 | cm | 30-200 |\n| chest | 胸围 | cm | 30-200 |\n| arm | 臂围 | cm | 10-80 |\n| thigh | 大腿围 | cm | 20-100 |\n| body_fat | 体脂率 | % | 2-60 |\n\n## 使用流程\n\n1. 确认成员身份\n2. 记录身高体重（通过 `mediwise-health-tracker` 的 `add-metric` 动作，type 填 weight / height）\n3. 使用 `calculate-bmi` 计算 BMI\n4. 使用 `calculate-bmr-tdee` 计算基础代谢和每日总消耗\n5. 使用 `set-goal` 设定体重管理目标（自动推算热量目标）\n6. 定期通过 `mediwise-health-tracker` 记录体重\n7. 通过 `diet-tracker` 记录每日饮食\n8. 通过 `add-exercise` 记录运动消耗\n9. 使用 `calorie-balance` 查看热量收支（含运动消耗）\n10. 使用 `add-measurement` 记录身体围度\n11. 使用 `body-summary` 查看综合身体报告\n12. 使用 `weekly-report` 获取综合周报（含运动统计）\n13. 使用 `weight-projection` 预测达标日期\n\n## 注意事项\n\n- **每次调用脚本必须携带 `--owner-id`（强制）**：从会话上下文获取发送者 ID（格式 `<channel>:<user_id>`，如 `feishu:ou_xxx` 或 `qqbot:12345`），作为所有脚本的 `--owner-id` 参数，不得省略。\n- goal_type 支持: lose（减重）、gain（增重）、maintain（维持）\n- 每个成员同时只能有一个 active 状态的目标\n- 体重数据通过 health_metrics 表记录，本 skill 只读取不写入体重数据\n- 热量收支分析需要 diet-tracker 的饮食记录支持\n- 运动消耗数据通过 exercise_records 表记录\n- BMI/BMR/TDEE 计算需要成员有身高、体重、性别和出生日期信息\n- 身体围度数据存储在 health_metrics 表中，与其他健康指标共用\n- 预测功能基于近期体重变化趋势，仅供参考\n- **附件管理**：身材照片、运动截图等文件的上传和管理通过 `mediwise-health-tracker` 的附件功能完成（`attachment.py`），本 skill 不直接处理文件存储。使用 `add-attachment` 动作并指定 category 为 `body_photo` 或 `exercise_photo`\n\nFile v2.0.8:README.md\n\n# MediWise Health Suite - 家庭健康管理套件\n\n<div align=\"center\">\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![OpenClaw](https://img.shields.io/badge/OpenClaw-Compatible-blue.svg)](https://openclaw.ai)\n[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)\n[![Status](https://img.shields.io/badge/Status-Active%20Development-green.svg)]()\n\n**家庭健康管理助手**\n\n从日常记录到健康追踪的完整解决方案\n\n[快速开始](#快速开始) • [功能介绍](#功能介绍) • [安装方法](#安装方法) • [使用示例](#使用示例)\n\n</div>\n\n---\n\n## 📋 简介\n\nMediWise Health Suite 是一个为 OpenClaw AI 设计的家庭健康管理助手。帮助你记录和管理健康数据，追踪饮食和体重，为家庭健康保驾护航。\n\n**核心价值**：平时能记、能查、能追踪；数据本地存储，保护隐私。默认数据库拆分为医疗与生活方式两库，便于隔离与权限控制。\n\n## 🏗 项目架构图（技术设计）\n\n```text\n┌──────────────────────────────────────────────────────────────────────────────┐\n│                           用户 / 聊天入口（OpenClaw）                        │\n└───────────────────────────────┬──────────────────────────────────────────────┘\n                                │ action + params + owner_id\n                                ▼\n┌──────────────────────────────────────────────────────────────────────────────┐\n│                 Node.js 技能路由层（各 skill 的 index.js）                  │\n│  - 路由 action -> script(args)                                               │\n│  - 统一 subprocess 调 python3                                                │\n│  - 注入 MEDIWISE_OWNER_ID 做多用户隔离                                       │\n└───────────────┬───────────────────────────────────────────────┬──────────────┘\n                │                                               │\n                ▼                                               ▼\n   ┌─────────────────────────────┐                 ┌─────────────────────────────┐\n   │  Health Tracker (Python)    │                 │  其他领域技能 (Python)      │\n   │  - member / medical_record  │                 │  - diet-tracker             │\n   │  - health_metric / reminder │                 │  - weight-manager           │\n   │  - visit_lifecycle / notes  │                 │  - wearable-sync            │\n   │  - checkup/doctor report    │                 │  - health-monitor           │\n   └───────────────┬─────────────┘                 └───────────────┬─────────────┘\n                   │                                               │\n                   └──────────────────────┬────────────────────────┘\n                                          ▼\n                         ┌─────────────────────────────────┐\n                         │      shared 公共层              │\n                         │  - path_setup.py                │\n                         │  - metric_utils.py              │\n                         └─────────────────┬───────────────┘\n                                           ▼\n                   ┌────────────────────────────────────────────────────┐\n                   │         数据访问层：health_db.py（SQLite）          │\n                   │  Domain 路由：medical / lifestyle                  │\n                   │  事务、审计、owner 校验                             │\n                   └───────────────┬──────────────────────┬─────────────┘\n                                   │                      │\n                                   ▼                      ▼\n                     ┌──────────────────────┐   ┌──────────────────────┐\n                     │ medical.db           │   │ lifestyle.db         │\n                     │ members/visits/...   │   │ diet/weight/wearable │\n                     │ health_metrics/...   │   │ sync_log/...         │\n                     └──────────────────────┘   └──────────────────────┘\n\n外部集成（可选）：\n  - Wearable Provider: gadgetbridge / apple_health / garmin / huawei / zepp / openwearables\n  - 视觉识别模型：图片/PDF 走外部模型（通过 setup 配置）\n  - Backend API 模式（可切换）\n```\n\n## 🗺 项目使用图\n\n```text\n[用户发起请求]\n      │\n      ▼\n[确定 owner_id]\n      │\n      ▼\n[先列成员并确认“为哪位成员操作”]\n      │\n      ├──────────────┐\n      │              │\n      ▼              ▼\n[文本录入]      [图片/PDF录入]\n(就诊/症状/用药/指标)  (外部视觉模型识别后写入)\n      │              │\n      └───────┬──────┘\n              ▼\n         [落库到 SQLite]\n              │\n              ├───────────────────────────────┐\n              │                               │\n              ▼                               ▼\n      [饮食/体重管理]                    [可穿戴同步]\n      - food_lookup先查再记餐            - 拉取设备数据\n      - 热量/营养统计                     - 去重写入 health_metrics\n                                          - 自动触发 monitor 检查\n              │                               │\n              └───────────────┬───────────────┘\n                              ▼\n                       [监测与提醒/告警]\n                              │\n                              ▼\n                 [健康简报 / 就医前摘要 / 导出]\n```\n\n---\n\n## ✨ 功能状态\n\n### ✅ 已实现功能\n\n#### 🏥 健康档案管理\n- 家庭成员信息管理\n- 病程记录（门诊、住院、急诊）\n- 用药追踪与提醒\n- 日常健康指标（血压、血糖、心率等）\n- 图片识别（化验单、体检报告、处方）\n- 就医前摘要生成（文本/图片/PDF）\n\n#### 🍎 饮食追踪\n- 饮食记录与营养分析\n- 热量计算\n- 营养素统计\n\n#### ⚖ 体重管理\n- 体重记录与趋势分析\n- BMI/BMR/TDEE 计算\n- 目标设定与进度追踪\n\n### ⚠ 部分实现功能（待完善）\n\n#### 📊 智能监测与提醒（待完善）\n- 多级健康告警\n- 趋势分析与异常检测\n- 用药提醒、复查提醒\n\n#### ⌚ 可穿戴设备同步\n- ✅ **佳明（Garmin）**：Garmin Connect 账号直连，支持心率、睡眠分期、HRV、身体电量（Body Battery）、压力、步数、血氧、活动记录\n- ✅ **Apple Watch / iPhone**：Health App 导出 export.xml/zip，支持心率、步数、血氧、睡眠、体重、血糖、血压等\n- ✅ **小米手环 / Amazfit**：Gadgetbridge 本地 SQLite 导出，支持心率、步数、血氧、睡眠\n- 🔜 华为手表、高驰（COROS）等（开发中）\n\n---\n\n## 🚀 快速开始\n\n### 安装\n\n**方式 1：从 GitHub 安装（推荐）**\n```bash\ngit clone https://github.com/JuneYaooo/mediwise-health-suite.git \\\n  ~/.openclaw/skills/mediwise-health-suite\n```\n\n**方式 2：通过 ClawdHub 安装**\n```bash\n# 从 GitHub 直接安装\nclawdhub install JuneYaooo/mediwise-health-suite\n\n# 或从市场安装（审核通过后）\nclawdhub install mediwise-health-suite\n```\n\n### 基本使用\n\n安装后，直接与 OpenClaw 对话即可：\n\n```\n\"帮我添加一个家庭成员，叫张三，是我爸爸\"\n\"帮我记录今天血压 130/85，心率 72\"\n\"帮我看看最近的健康情况\"\n\"记录今天吃了一碗米饭和一份青菜\"\n\"记录今天体重 65kg\"\n\"我准备去看医生，帮我整理一下最近的情况\"\n```\n\n---\n\n## 💡 使用示例\n\n### 添加家庭成员\n```\n用户：\"帮我添加一个家庭成员，叫张三，是我爸爸，65岁\"\n助手：好的，我来帮您添加...\n```\n\n### 记录健康指标\n```\n用户：\"帮我记录今天血压 130/85，心率 72\"\n助手：已为您记录今天的健康指标...\n```\n\n### 饮食追踪\n```\n用户：\"记录今天吃了一碗米饭和一份青菜\"\n助手：已为您记录今天的饮食...\n```\n\n### 体重管理\n```\n用户：\"记录今天体重 65kg\"\n助手：已记录体重，您的 BMI 是...\n```\n\n### 就医前准备\n```\n用户：\"我准备去看医生，帮我整理一下最近的情况\"\n助手：好的，我先为您生成一份就医前摘要...\n```\n\n### 绑定佳明手表\n```\n用户：\"帮我绑定佳明手表\"\n助手：好的，请问您的手表型号是？（如 Fenix 7、Forerunner 965 等）\n用户：\"Fenix 7\"\n助手：需要您的 Garmin Connect 登录邮箱和密码，凭据仅保存在本地...\n用户：\"邮箱 xxx@gmail.com 密码 xxx\"\n助手：正在连接 Garmin Connect，验证成功！正在同步近 7 天数据...\n       已同步：心率 1240 条、睡眠 7 条、身体电量 2016 条、HRV 7 条\n```\n\n---\n\n## 👪 家庭共用场景\n\n### 一家人在同一个群里使用\n\n在 QQ 群、飞书群等群聊中，多个家庭成员可以共同使用同一个健康助手。系统通过发送者身份（如 QQ 号）自动隔离数据，**每个人只能看到和管理自己添加的记录**。\n\n```\n张三: @健康 帮我记录今天血压 135/88\n助手: 已为您记录血压 135/88。\n\n李四: @健康 帮我看看最近的健康情况\n助手: [只显示李四自己的数据，看不到张三的]\n```\n\n### 为家人代管健康\n\n每个用户可以为自己和家人创建独立的健康档案：\n\n```\n张三: @健康 帮我添加一个家庭成员，叫张爸爸，是我爸爸，65岁\n助手: 好的，已添加家庭成员\"张爸爸\"\n\n张三: @健康 帮张爸爸记录今天血压 150/95\n助手: 已为张爸爸记录血压 150/95。收缩压偏高，建议关注。\n```\n\n### 隔离机制\n\n| 场景 | 隔离方式 |\n|------|---------|\n| 不同用户在同一群里 | 自动按发送者身份隔离，互不可见 |\n| 同一用户的多个家庭成员 | 通过成员管理区分，用户可切换查看 |\n| 不同群聊 | 可配置为同一或不同 Agent，数据独立 |\n\n详细配置方法参见 [Agent 配置指南](docs/AGENT_SETUP.md)。\n\n---\n\n## 📦 包含的功能模块\n\n| 模块 | 状态 | 功能 |\n|------|------|------|\n| 健康档案 | ✅ 已实现 | 成员管理、病程记录、用药追踪、健康指标 |\n| 饮食追踪 | ✅ 已实现 | 饮食记录、营养分析、热量计算 |\n| 体重管理 | ✅ 已实现 | 体重记录、BMI/BMR/TDEE 计算、趋势分析 |\n| 健康监测 | ⚠ 待完善 | 智能告警、趋势分析 |\n| 可穿戴设备 | ✅ 已实现 | 佳明/Apple Watch/Gadgetbridge 数据同步；HRV、身体电量、睡眠分期 |\n\n---\n\n## 🔒 数据隐私\n\n- ✅ **默认本地存储**：所有数据存储在本地 SQLite 数据库（`medical.db` 与 `lifestyle.db`）\n- ✅ **不上传云端**：默认配置下，不上传任何个人健康信息\n- ✅ **可选功能**：后端 API、向量搜索等高级功能需用户主动配置启用\n- ✅ **多租户隔离**：支持共享实例场景的数据隔离\n- ✅ **发布安全**：数据库、附件、导出文件默认被 `.gitignore` / `.clawdhubignore` 排除\n\n**重要**：项目包含可选的后端 API 和向量搜索功能，但默认关闭。所有云端功能需用户主动配置才会启用。\n\n---\n\n## 📋 系统要求\n\n- Python 3.8+\n- SQLite 3.x\n- OpenClaw 2026.3.0+\n- 操作系统：Linux / macOS / Windows\n\n---\n\n## 📄 许可证\n\n本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件\n\n---\n\n## ⚠ 免责声明\n\n本工具仅供健康信息记录和参考，不构成医疗建议。任何健康问题请咨询专业医生。\n\n---\n\n<div align=\"center\">\n\n**⭐ 如果这个项目对你有帮助，请给个 Star！**\n\nMade with ❤ by MediWise Team\n\n</div>\n\nFile v2.0.8:_meta.json\n\n{\n  \"ownerId\": \"kn76gz2yb53tdjgpmb3ydjexax82g5yr\",\n  \"slug\": \"mediwise-health-suite\",\n  \"version\": \"2.0.8\",\n  \"publishedAt\": 1775537691654\n}\n\nFile v2.0.8:mediwise-health-tracker/references/cycle-attachments-multitenancy.md\n\n# Cycle, Attachments, and Multi-Tenancy\n\n## 目录\n\n- 周期追踪\n- 附件管理\n- 多租户隔离\n\n## 周期追踪\n\n支持经期和周期性疾病事件记录、预测、提醒与关怀。\n\n### 常用命令\n\n```bash\npython3 {baseDir}/scripts/cycle_tracker.py record --member-id <id> --cycle-type menstrual --event-type period_start --date 2025-03-01\npython3 {baseDir}/scripts/cycle_tracker.py record --member-id <id> --cycle-type menstrual --event-type period_end --date 2025-03-06\npython3 {baseDir}/scripts/cycle_tracker.py predict --member-id <id> --cycle-type menstrual\npython3 {baseDir}/scripts/cycle_tracker.py status --member-id <id> --cycle-type menstrual\npython3 {baseDir}/scripts/cycle_tracker.py history --member-id <id> --cycle-type menstrual --limit 12\npython3 {baseDir}/scripts/reminder.py auto-cycle --member-id <id> --cycle-type menstrual\n```\n\n### 返回重点\n\n- `predict`：预计开始时间、平均周期、排卵期、易孕窗、置信度\n- `status`：当前阶段、关怀建议\n\n## 附件管理\n\n### 添加与查看\n\n```bash\npython3 {baseDir}/scripts/attachment.py add --member-id <id> --source-path /path/to/report.jpg --category lab_report --description \"2025年3月化验单\"\npython3 {baseDir}/scripts/attachment.py list --member-id <id>\npython3 {baseDir}/scripts/attachment.py get --id <attachment_id>\n```\n\n### 关联、删除、导出\n\n```bash\npython3 {baseDir}/scripts/attachment.py link --attachment-id <id> --record-type lab_result --record-id <record_id>\npython3 {baseDir}/scripts/attachment.py unlink --attachment-id <id> --record-type lab_result --record-id <record_id>\npython3 {baseDir}/scripts/attachment.py delete --id <attachment_id>\npython3 {baseDir}/scripts/attachment.py delete --id <attachment_id> --purge\npython3 {baseDir}/scripts/attachment.py get --id <attachment_id> --base64\npython3 {baseDir}/scripts/attachment.py serve --port 9120\npython3 {baseDir}/scripts/attachment.py get-url --id <attachment_id> --secret <server_secret>\n```\n\n### 规则\n\n- 支持分类：`body_photo`、`food_photo`、`medical_image`、`lab_report`、`prescription`、`exercise_photo`、`other`\n- 同一成员上传相同文件会按 SHA256 去重\n- 文件大小上限 50MB\n- 一张附件可关联多条记录\n\n## 多租户隔离\n\n共享机器人实例下，通过 `owner_id` 在成员层做隔离。\n\n### 工作原理\n\n`owner_id` 是发送者的平台用户 ID（如 QQ 号、飞书用户 ID 等），由路由层自动传入：\n\n1. 用户在群聊中发消息 → 平台提供发送者 ID\n2. `index.js` 路由层自动将发送者 ID 作为 `owner_id` 参数传给脚本\n3. 脚本中的所有查询和写入都带上 `owner_id` 过滤（数据存储在 `medical.db` / `lifestyle.db`）\n\n**结果**：同一群聊中，不同用户的数据完全隔离，互相不可见。\n\n### 核心规则\n\n- 添加成员时带 `--owner-id`\n- 列出成员时带 `--owner-id`\n- 家庭概况、简报、搜索都带 `--owner-id`\n- 不传 `--owner-id` 时视为本地 CLI 模式（开发/单用户场景）\n\n### 家庭群聊场景示例\n\n```\n# 张三（QQ: 111）在群里添加家庭成员\n→ member.py add --name \"妈妈\" --relation \"母亲\" --owner-id \"qq_111\"\n\n# 李四（QQ: 222）在同一个群里添加家庭成员\n→ member.py add --name \"妈妈\" --relation \"母亲\" --owner-id \"qq_222\"\n\n# 这是两份独立的\"妈妈\"档案，互不影响\n\n# 张三查看全家概况 → 只看到自己的成员\n→ query.py family-overview --owner-id \"qq_111\"\n\n# 李四查看全家概况 → 只看到自己的成员\n→ query.py family-overview --owner-id \"qq_222\"\n```\n\n### 命令示例\n\n```bash\npython3 {baseDir}/scripts/member.py add --name \"张三\" --relation \"本人\" --owner-id \"qq_12345\"\npython3 {baseDir}/scripts/member.py list --owner-id \"qq_12345\"\npython3 {baseDir}/scripts/query.py family-overview --owner-id \"qq_12345\"\npython3 {baseDir}/scripts/health_advisor.py briefing --owner-id \"qq_12345\"\npython3 {baseDir}/scripts/query.py search --keyword \"高血压\" --owner-id \"qq_12345\"\n```\n\n通过 `index.js` 调用时，只要 `inputs` 中带 `owner_id`，路由层会自动追加对应参数。\n\nFile v2.0.8:mediwise-health-tracker/references/drug-briefing.md\n\n# Drug Safety and Briefing\n\n## 目录\n\n- 药物安全查询规则\n- DDInter / openFDA / 网页搜索\n- 结果呈现\n- 健康建议与简报\n- 数据导出与在线计算器\n\n## 药物安全查询规则\n\n凡是涉及以下问题，必须先查再答，不能凭记忆：\n\n- 药物交互\n- 用药禁忌\n- 不良反应\n- 药物 + 酒精\n- 药物 + 食物\n- 中成药安全\n\n通过 DDInter、openFDA 或网页搜索查询，统一使用来源筛选、引用格式和免责声明。\n\n## 查询方式\n\n### DDInter\n\n```bash\npython3 {baseDir}/scripts/drug_interaction.py check --member-id <id> --drug-name \"布洛芬\"\npython3 {baseDir}/scripts/drug_interaction.py check-pair --drug-a \"阿司匹林\" --drug-b \"华法林\"\npython3 {baseDir}/scripts/drug_interaction.py lookup --name \"奥美拉唑\"\npython3 {baseDir}/scripts/drug_interaction.py search --name \"阿司匹林\"\n```\n\n适合两种西药之间的交互检查。\n\n### openFDA\n\n```bash\npython3 {baseDir}/scripts/openfda_query.py interaction --name \"warfarin\"\npython3 {baseDir}/scripts/openfda_query.py check-pair --drug-a \"warfarin\" --drug-b \"aspirin\"\npython3 {baseDir}/scripts/openfda_query.py search --name \"metformin\"\n```\n\n适合作为英文结构化补充验证来源。\n\n### 网页搜索\n\n- 中成药、安全说明、药酒同服、药食同服等优先走网页搜索\n- 来源优先级：权威医学数据库 > 官方说明书 > 可靠医学网站\n- 正文关键结论必须带 `[1][2]`\n\n## 结果呈现\n\n- **严重**：明确警告，不建议自行合用\n- **中等**：提示注意，建议咨询药师或医生\n- **轻微**：说明风险较低，但仍需遵医嘱\n\n每次药物安全类回复都要：\n\n1. 给出直接结论\n2. 说明依据并标注编号引用\n3. 列出真实来源链接\n4. 追加免责声明\n\n查不到时，直接说“未查到标准交互数据，建议咨询药师确认”。\n\n## 健康建议与简报\n\n```bash\npython3 {baseDir}/scripts/health_advisor.py tips --member-id <id>\npython3 {baseDir}/scripts/health_advisor.py briefing\n```\n\n### 强制：简报默认发图片版\n\n当用户要“简报”“报告”“健康报告”时，默认用截图 PNG：\n\n```bash\npython3 {baseDir}/scripts/briefing_report.py screenshot --member-id <id>\n```\n\n拿到 `image_path` 后，用 `<qqimg>` 发送：\n\n```text\n这是你的健康简报：\n<qqimg>/path/to/briefing.png</qqimg>\n```\n\n不要说“无法发送图片”或“QQ 不支持”。\n\n### 通用 HTML 截图\n\n```bash\npython3 {baseDir}/scripts/html_screenshot.py <input.html> [output.png] [--width 960]\n```\n\n## 数据导出与在线计算器\n\n### 导出\n\n```bash\npython3 {baseDir}/scripts/export.py fhir --member-id <id>\npython3 {baseDir}/scripts/export.py statistics\n```\n\n### 在线计算器\n\n需要 BMI、eGFR、CHA₂DS₂-VASc、CURB-65、MELD 等计算时，优先给权威在线工具链接，而不是在本地手算：\n\n- 医脉通：`https://cals.medlive.cn/`\n- MSD 临床计算器：`https://www.msdmanuals.cn/professional/pages-with-widgets/clinical-calculators`\n- MDCalc：`https://www.mdcalc.com/`\n\nFile v2.0.8:mediwise-health-tracker/references/intake-query-vision.md\n\n# Intake, Query, and Vision\n\n## 目录\n\n- 录入路径选择\n- 查询结果自然语言化\n- 图片 / PDF / 文本智能录入\n- 多附件处理流程\n\n## 录入路径选择\n\n### 简单指标\n\n以下场景优先 `quick_entry.py`，因为它不依赖 LLM，速度更快：\n\n- 血压\n- 血糖\n- 心率\n- 体温\n- 体重\n- 血氧\n\n```bash\npython3 {baseDir}/scripts/quick_entry.py parse --text \"血压130/85 心率72\" --member-id <id> --owner-id \"<sender_id>\"\npython3 {baseDir}/scripts/quick_entry.py parse-and-save --text \"血压130/85 心率72\" --member-id <id> --owner-id \"<sender_id>\"\n```\n\n如果返回 `fallback: true`，再切换到 `smart_intake.py`。\n\n### 复杂文本或结构化记录\n\n```bash\npython3 {baseDir}/scripts/smart_intake.py extract --text \"今天血压135/88，心率72\" --member-id <id>\npython3 {baseDir}/scripts/medical_record.py add-visit --member-id <id> --visit-type \"门诊\" --visit-date \"2025-01-15\" --hospital \"人民医院\" --diagnosis \"高血压\"\npython3 {baseDir}/scripts/medical_record.py add-medication --member-id <id> --name \"氨氯地平\" --dosage \"5mg\" --frequency \"每日一次\"\n```\n\n### 录入后自动观察\n\n以下情况建议补记到 `memory.py add-observation`：\n\n- 指标异常\n- 新增诊断\n- 新增或变更用药\n- 停药\n\n## 查询结果自然语言化\n\n### 必须做的改写\n\n- 体征查询：描述趋势，不要只堆数字\n- 用药查询：按清单展示药名、剂量、频率、开始时间\n- 健康摘要：突出重点，不要把全部字段都念一遍\n- 时间线：按时间讲述发生了什么\n\n### 示例\n\n```text\n错误：{\"type\":\"blood_pressure\",\"value\":\"{\\\"systolic\\\":140,\\\"diastolic\\\":90}\"}\n正确：最近一次血压是 140/90 mmHg，收缩压偏高；最近一周整体略高但相对稳定，建议继续监测。\n```\n\n## 图片 / PDF / 文本智能录入\n\n### 强制规则\n\n**不要使用自身视觉能力读取医疗图片。** 所有图片 / PDF 识别必须通过外部视觉模型。\n\n### 首次使用先检查配置\n\n```bash\npython3 {baseDir}/scripts/setup.py check\n```\n\n如果 `vision_configured: false`：\n\n1. 告知用户需要先配置视觉模型\n2. 推荐 SiliconFlow 的 `Qwen/Qwen2.5-VL-72B-Instruct`（国内首选）或 Google Gemini `gemini-3.1-pro-preview`（海外首选）\n3. 用户给出 API Key 后执行配置\n4. 再运行测试验证\n\n```bash\npython3 {baseDir}/scripts/setup.py set-vision --provider siliconflow --model \"Qwen/Qwen2.5-VL-72B-Instruct\" --api-key <KEY> --base-url \"https://api.siliconflow.cn/v1\"\n# 用内置测试图测试（需 references/test-vision.jpg 存在）：\npython3 {baseDir}/scripts/setup.py test-vision\n# 或指定任意本地图片测试（推荐）：\npython3 {baseDir}/scripts/setup.py test-vision --image /path/to/any_lab_report.jpg\n```\n\n### 已配置后处理附件\n\n```bash\npython3 {baseDir}/scripts/smart_intake.py extract --image /path/to/image.jpg --member-id <id>\npython3 {baseDir}/scripts/smart_intake.py extract --pdf /path/to/report.pdf --member-id <id>\npython3 {baseDir}/scripts/smart_intake.py extract --text \"今天血压135/88，心率72\" --member-id <id>\n```\n\n## 多附件处理流程\n\n用户连续发送多张图片时：\n\n1. 先累积，回复“收到，还有更多要发的吗？发完告诉我。”\n2. 用户确认发完后，再逐个调用 `smart_intake.py extract`\n3. 汇总所有提取结果，按类型分组给用户核对\n4. 用户确认后再正式录入\n\n不要每收到一张图就立即处理、立即确认。\n\nArchive v2.0.7: 104 files, 351341 bytes\n\nFiles: CHANGELOG.md (3389b), CONTRIBUTING.md (2799b), diet-tracker/agents/openai.yaml (239b), diet-tracker/index.js (6336b), diet-tracker/package.json (290b), diet-tracker/scripts/diet.py (20650b), diet-tracker/scripts/food_lookup.py (18742b), diet-tracker/scripts/nutrition_goal.py (10671b), diet-tracker/scripts/nutrition.py (8742b), diet-tracker/SKILL.md (6777b), docs/AGENT_SETUP.md (9170b), docs/HEALTH-MANAGEMENT-OVERVIEW.md (9478b), docs/INSTALLATION.md (12811b), health-monitor/agents/openai.yaml (247b), health-monitor/index.js (3737b), health-monitor/package.json (294b), health-monitor/scripts/alert.py (5785b), health-monitor/scripts/check.py (11696b), health-monitor/scripts/dashboard.py (7232b), health-monitor/scripts/test_check.py (5130b), health-monitor/scripts/threshold.py (10288b), health-monitor/scripts/trend.py (11276b), health-monitor/SKILL.md (7800b), install-check.sh (4703b), mediwise-health-tracker/agents/openai.yaml (277b), mediwise-health-tracker/DREAM.md (7215b), mediwise-health-tracker/index.js (21309b), mediwise-health-tracker/package.json (267b), mediwise-health-tracker/references/cycle-attachments-multitenancy.md (4108b), mediwise-health-tracker/references/drug-briefing.md (3042b), mediwise-health-tracker/references/intake-query-vision.md (3476b), mediwise-health-tracker/references/visit-prep.md (3740b), mediwise-health-tracker/scripts/api_client.py (7152b), mediwise-health-tracker/scripts/attachment.py (24074b), mediwise-health-tracker/scripts/briefing_report.py (22279b), mediwise-health-tracker/scripts/checkup_report.py (20520b), mediwise-health-tracker/scripts/chronic_disease.py (15480b), mediwise-health-tracker/scripts/config.py (14567b), mediwise-health-tracker/scripts/cycle_tracker.py (17024b), mediwise-health-tracker/scripts/daily_snapshot.py (13846b), mediwise-health-tracker/scripts/doctor_visit_report.py (35800b), mediwise-health-tracker/scripts/dream.py (14858b), mediwise-health-tracker/scripts/drug_interaction.py (25127b), mediwise-health-tracker/scripts/embedding_provider.py (5820b), mediwise-health-tracker/scripts/export.py (16571b), mediwise-health-tracker/scripts/health_advisor.py (24799b), mediwise-health-tracker/scripts/health_db.py (50812b), mediwise-health-tracker/scripts/health_memory.py (9859b), mediwise-health-tracker/scripts/health_metric.py (9101b), mediwise-health-tracker/scripts/html_screenshot.py (6791b), mediwise-health-tracker/scripts/medical_record.py (30516b), mediwise-health-tracker/scripts/medication_log.py (5373b), mediwise-health-tracker/scripts/member.py (10836b), mediwise-health-tracker/scripts/memory.py (27129b), mediwise-health-tracker/scripts/metric_utils.py (4433b), mediwise-health-tracker/scripts/openfda_query.py (7021b), mediwise-health-tracker/scripts/privacy.py (7953b), mediwise-health-tracker/scripts/query.py (22175b), mediwise-health-tracker/scripts/quick_entry.py (8174b), mediwise-health-tracker/scripts/reminder.py (22169b), mediwise-health-tracker/scripts/setup.py (38455b), mediwise-health-tracker/scripts/smart_intake.py (38872b), mediwise-health-tracker/scripts/test_authorization.py (9551b), mediwise-health-tracker/scripts/test_smart_intake.py (28984b), mediwise-health-tracker/scripts/validators.py (7092b), mediwise-health-tracker/scripts/vector_search.py (19946b), mediwise-health-tracker/scripts/visit_lifecycle.py (19798b), mediwise-health-tracker/SKILL.md (18843b), package.json (920b), QUICKSTART.md (8980b), README.md (13455b), requirements.txt (435b), shared/__init__.py (49b), shared/metric_utils.py (1571b), shared/path_setup.py (679b), SKILL.md (10542b), sleep-tracker/index.js (2779b), sleep-tracker/package.json (290b), sleep-tracker/scripts/sleep.py (13914b), sleep-tracker/SKILL.md (3312b)\n\nFile v2.0.7:diet-tracker/SKILL.md\n\n---\nname: diet-tracker\ndescription: \"Diet and nutrition tracking: log meals, manage food items, view daily/weekly nutrition summaries, analyze calorie trends. Integrates with mediwise-health-tracker and weight-manager.\"\n---\n\n# diet-tracker\n\n## 概述\n\n提供每餐饮食记录、食物条目管理、每日/每周营养摘要、热量趋势分析等功能。与 `mediwise-health-tracker` 共享数据库，可与 `weight-manager` 联动形成\"饮食 → 热量 → 体重\"完整闭环。\n\n## 数据模型\n\n### diet_records（一餐记录）\n| 字段 | 说明 |\n|------|------|\n| id | 记录 ID |\n| member_id | 成员 ID |\n| meal_type | 餐次: breakfast/lunch/dinner/snack |\n| meal_date | 日期 YYYY-MM-DD |\n| meal_time | 时间 HH:MM（可选） |\n| total_calories | 总热量 kcal |\n| total_protein | 总蛋白质 g |\n| total_fat | 总脂肪 g |\n| total_carbs | 总碳水 g |\n| total_fiber | 总膳食纤维 g |\n| note | 备注 |\n\n### diet_items（食物条目）\n| 字段 | 说明 |\n|------|------|\n| id | 条目 ID |\n| record_id | 关联 diet_records.id |\n| food_name | 食物名称 |\n| amount | 数量 |\n| unit | 单位（g/ml/份/个等） |\n| calories | 热量 kcal |\n| protein | 蛋白质 g |\n| fat | 脂肪 g |\n| carbs | 碳水 g |\n| fiber | 膳食纤维 g |\n| note | 备注 |\n\n## 功能列表\n\n### diet.py — 饮食记录 CRUD\n\n| 动作 | 子命令 | 必要参数 | 可选参数 | 说明 |\n|------|--------|----------|----------|------|\n| add-meal | add-meal | --member-id, --meal-type, --meal-date | --meal-time, --note, --items (JSON) | 添加一餐记录（可同时包含多个食物条目） |\n| add-item | add-item | --record-id, --food-name | --amount, --unit, --calories, --protein, --fat, --carbs, --fiber, --note | 向已有餐次追加食物条目 |\n| list | list | --member-id | --date, --start-date, --end-date, --meal-type, --limit | 查看饮食记录 |\n| delete | delete | --id | --type (record/item) | 删除记录或条目 |\n| daily-summary | daily-summary | --member-id, --date | | 某日营养摘要 |\n\n### nutrition.py — 营养分析\n\n| 动作 | 子命令 | 必要参数 | 可选参数 | 说明 |\n|------|--------|----------|----------|------|\n| weekly-summary | weekly-summary | --member-id | --end-date | 一周营养趋势（每日热量、平均三大营养素） |\n| calorie-trend | calorie-trend | --member-id | --days (默认 7) | 热量趋势分析（N 天每日总热量） |\n| nutrition-balance | nutrition-balance | --member-id | --days (默认 7) | 三大营养素比例分析 |\n\n### food_lookup.py — 食物营养查询\n\n| 动作 | 子命令 | 必要参数 | 可选参数 | 说明 |\n|------|--------|----------|----------|------|\n| food-lookup | search | params.query | params.limit (默认5), params.source (auto/cfcd/brands/usda) | 三层数据源搜索食物营养（CFCD6 → 中国品牌外食 → USDA） |\n| food-stats | stats | — | — | 查看食物数据库概况（各数据源条目数） |\n\n数据来源（按优先级）：\n1. **CFCD6**（离线）：《中国食物成分表标准版第6版》1657 条，覆盖粮谷、肉蛋奶、蔬果、水产等\n2. **cn-brands**（离线）：339 条，奶茶、外卖、便利店、火锅等外食场景\n3. **USDA FoodData Central**（在线）：国际食材兜底，需配置 `USDA_API_KEY` 环境变量\n\n## 使用流程\n\n**记录一餐的标准流程（不得跳步）：**\n\n1. 确认成员身份（通过 mediwise-health-tracker 的 list-members）\n2. **逐一查询每种食物的营养数据**（`food-lookup search`，见下方\"强制规则\"）\n3. 用查询到的营养数据调用 `add-meal`，通过 `--items` JSON 一次录入多个食物\n4. 如需追加食物，使用 `add-item` 向已有餐次添加\n5. 使用 `daily-summary` 查看当天营养摄入\n6. 使用 `weekly-summary` 或 `calorie-trend` 查看长期趋势\n\n## 营养数据强制规则\n\n**禁止用 AI 自身知识直接估算营养数值写入数据库。** 记录每种食物之前，必须先调用 `food-lookup search` 查询，用数据库返回的数据填充 `--items`。\n\n> **自动填充说明**：若 `--items` 中某条目未提供热量数据，`diet.py` 会自动调用内部 food_lookup 数据库补全营养值，并在 `note` 字段标注 `[自动填充]` 及数据来源。此行为仅查询本地数据库（不调用外部 API），补全结果与显式 `food-lookup search` 一致。agent 仍应优先显式查询以便向用户展示候选项，但自动填充是兜底保障而非绕过规则。\n\n```bash\n# 步骤 1：先查每种食物\npython3 {baseDir}/scripts/food_lookup.py search --query \"炸排骨\" --owner-id \"<sender_id>\"\npython3 {baseDir}/scripts/food_lookup.py search --query \"米饭\" --owner-id \"<sender_id>\"\n\n# 步骤 2：用查询结果里的营养数据填 --items，再记录\npython3 {baseDir}/scripts/diet.py add-meal \\\n  --member-id <id> --meal-type lunch --meal-date 2025-03-15 \\\n  --items '[{\"food_name\":\"炸排骨\",\"amount\":150,\"unit\":\"g\",\"calories\":298,\"protein\":21.2,\"fat\":19.3,\"carbs\":9.1,\"note\":\"来源:CFCD6\"}]' \\\n  --owner-id \"<sender_id>\"\n```\n\n**查询未命中时的处理：**\n- 三层数据源（CFCD6 → 中国品牌外食 → USDA）都未找到时，告知用户\"未查到该食物的营养数据\"，**询问用户是否手动输入营养值，或跳过该条目**，不得自行估算后直接写入。\n- 查到多个候选项时，展示给用户确认，选择最贴近的后再录入。\n- 记录时在 `note` 字段写明数据来源（如\"来源：CFCD6\"、\"来源：用户手动输入\"）。\n\n## items JSON 格式\n\n`--items` 参数接受 JSON 数组。**所有营养字段必须来自 `food-lookup search` 的查询结果**，不得由 AI 自行估算填充：\n```json\n[\n  {\"food_name\": \"鸡胸脯肉\", \"amount\": 150, \"unit\": \"g\", \"calories\": 158, \"protein\": 31.6, \"fat\": 3.2, \"carbs\": 0.0, \"note\": \"来源:CFCD6\"},\n  {\"food_name\": \"米饭\", \"amount\": 200, \"unit\": \"g\", \"calories\": 232, \"protein\": 4.6, \"fat\": 0.6, \"carbs\": 51.5, \"note\": \"来源:CFCD6\"}\n]\n```\n\n自动换算规则：CFCD6/USDA 数据按 `amount`（克）换算；中国品牌/外食数据按每份直接使用。\n\n## 注意事项\n\n- **每次调用脚本必须携带 `--owner-id`（强制）**：从会话上下文获取发送者 ID（格式 `<channel>:<user_id>`，如 `feishu:ou_xxx` 或 `qqbot:12345`），作为所有脚本的 `--owner-id` 参数，不得省略。\n- **禁止 AI 估算营养数据**：所有热量/蛋白质/脂肪/碳水/膳食纤维数值必须来自 `food-lookup search`，或经用户明确确认的手动输入，不得由 AI 凭自身知识估算后直接写入。\n- `note` 字段必须记录数据来源，便于用户事后核查。\n- meal_type 支持: breakfast（早餐）、lunch（午餐）、dinner（晚餐）、snack（加餐/零食）\n\nFile v2.0.7:health-monitor/SKILL.md\n\n---\nname: health-monitor\ndescription: >-\n  智能健康监测与告警。基于阈值检测、趋势分析和多级告警系统，\n  对家庭成员的健康指标进行持续监测，发现异常时及时预警。支持全家健康 dashboard 一屏总览。\n  Intelligent health monitoring and alerting. Uses threshold detection,\n  trend analysis, and multi-level alert system to continuously monitor\n  family members' health metrics and warn on anomalies. Supports family dashboard.\n  关键词：健康监测、异常告警、指标预警、趋势分析、健康报告、心率异常、血压异常、血氧低、告警管理、全家概览、健康dashboard。\n---\n\n# Health Monitor - 智能健康监测\n\n持续监测健康指标，多级阈值告警 + 趋势分析，发现异常及时通知。支持全家健康 dashboard 一屏总览。\n\n## 告警级别\n\n| 级别 | 含义 | 处理方式 |\n|------|------|----------|\n| info | 信息记录 | 仅记录，不主动推送 |\n| warning | 预警 | 创建 reminder 推送 |\n| urgent | 紧急 | 推送 + 标记高优先级 |\n| emergency | 危急 | 推送 + 建议立即就医或拨打急救电话 |\n\n## 默认阈值\n\n| 指标 | warning | urgent | emergency |\n|------|---------|--------|-----------|\n| 心率（高）| >100 bpm | >120 bpm | >150 bpm |\n| 心率（低）| <55 bpm | <45 bpm | <35 bpm |\n| 血氧（低）| <95% | <90% | <85% |\n| 收缩压（高）| >140 mmHg | >160 mmHg | >180 mmHg |\n| 舒张压（高）| >90 mmHg | >100 mmHg | >110 mmHg |\n| 体温（高）| >37.3°C | >38.5°C | >39.5°C |\n| 血糖空腹（高）| >6.1 mmol/L | >7.8 mmol/L | >11.1 mmol/L |\n\n支持按年龄自动调整，支持用户自定义覆盖。\n\n## 核心工作流\n\n> **强制规则**：每次调用脚本必须携带 `--owner-id`，从会话上下文获取发送者 ID（格式 `<channel>:<user_id>`，如 `feishu:ou_xxx` 或 `qqbot:12345`）。所有查询和写入操作均需携带，不得省略。\n\n### 0. 全家健康 Dashboard（首选入口）\n\n用户说「看看全家健康」「今天家人状态怎样」「健康概览」时，优先调用此接口。\n返回所有成员的风险级别、未解决告警数、最新关键指标和趋势警告。\n\n```bash\n# 全家健康一屏总览\npython3 {baseDir}/scripts/dashboard.py show\n\n# 按 owner 过滤（多租户场景）\npython3 {baseDir}/scripts/dashboard.py show --owner-id <owner_id>\n```\n\n**返回结构示例：**\n```json\n{\n  \"family_risk\": \"warning\",\n  \"family_risk_label\": \"需关注\",\n  \"total_open_alerts\": 3,\n  \"summary\": \"【紧急】张三 有紧急告警；共 3 条未解决告警\",\n  \"members\": [\n    {\n      \"name\": \"张三\",\n      \"risk_level\": \"urgent\",\n      \"risk_label\": \"紧急\",\n      \"open_alerts\": 2,\n      \"alerts\": [{\"level\": \"urgent\", \"title\": \"张三 heart_rate 高于阈值\", ...}],\n      \"latest_metrics\": {\n        \"heart_rate\": {\"value\": 125, \"unit\": \"bpm\", \"measured_at\": \"2026-03-27 08:30\"},\n        \"blood_pressure\": {\"value\": \"145/95\", \"unit\": \"mmHg\", \"measured_at\": \"2026-03-27 08:30\"}\n      },\n      \"trend_warnings\": [\"heart_rate 呈上升趋势\"]\n    }\n  ]\n}\n```\n\n### 1. 阈值管理\n\n```bash\n# 查看阈值配置（含默认+自定义）\npython3 {baseDir}/scripts/threshold.py list --member-id <id>\n\n# 自定义阈值\npython3 {baseDir}/scripts/threshold.py set --member-id <id> --type heart_rate --level warning --direction above --value 110\n\n# 恢复默认\npython3 {baseDir}/scripts/threshold.py reset --member-id <id> --type heart_rate\n```\n\n### 2. 异常检测\n\n```bash\n# 检查单个成员\npython3 {baseDir}/scripts/check.py run --member-id <id>\n\n# 检查所有成员\npython3 {baseDir}/scripts/check.py run-all\n\n# 检查最近指定时间窗口\npython3 {baseDir}/scripts/check.py run --member-id <id> --window 24h\n```\n\n### 3. 趋势分析\n\n```bash\n# 单指标趋势\npython3 {baseDir}/scripts/trend.py analyze --member-id <id> --type heart_rate --days 7\n\n# 全指标摘要\npython3 {baseDir}/scripts/trend.py report --member-id <id>\n```\n\n### 4. 告警管理\n\n```bash\n# 查看未解决告警\npython3 {baseDir}/scripts/alert.py list --member-id <id>\n\n# 按级别筛选\npython3 {baseDir}/scripts/alert.py list --member-id <id> --level urgent\n\n# 标记已解决\npython3 {baseDir}/scripts/alert.py resolve --alert-id <id>\n\n# 告警历史\npython3 {baseDir}/scripts/alert.py history --member-id <id> --limit 20\n```\n\n## 定时检测\n\n配合 wearable-sync 使用时，每次数据同步完成后会自动触发检测。\n也可单独通过 cron 定时运行：\n\n```bash\n# 每小时检测一次\n0 * * * * cd /path/to/health-monitor/scripts && python3 check.py run-all --window 1h\n```\n\n## 持续监测 + 消息推送完整配置\n\n### 架构概览\n\n```\niPhone 健康 App\n    → 导出 export.zip（手动/Shortcuts 自动）\n    → iCloud Drive 同步到 Mac / 直接传输到服务器\n    → cron: wearable-sync sync.py（导入数据）\n    → cron: health-monitor check.py（检测异常 → 写入 alerts 表）\n    → AI agent 查询告警 → 通过 IM Bot 推送给用户\n```\n\n### 第一步：配置数据同步（wearable-sync）\n\n参考 wearable-sync/SKILL.md 的「Apple Health 持续更新方案」完成设备绑定和 cron 配置。\n\n### 第二步：配置定时检测\n\n```bash\ncrontab -e\n\n# 同步数据（每小时整点）\n0 * * * * cd /path/to/wearable-sync/scripts && python3 sync.py run-all >> ~/mediwise-sync.log 2>&1\n\n# 检测异常（同步后5分钟，确保数据已写入）\n5 * * * * cd /path/to/health-monitor/scripts && python3 check.py run-all --window 2h >> ~/mediwise-check.log 2>&1\n```\n\n### 第三步：推送告警\n\n**当前架构：告警写入数据库，由 AI agent 主动查询推送。**\n\nhealth-monitor 本身不内置 IM 推送 SDK，告警通过以下方式触达用户：\n\n**方式 A：AI agent 定时巡检（推荐）**\n\n在 IM Bot（飞书/企微/钉钉）中，让 AI agent 定时调用 dashboard action 并主动发消息：\n\n```bash\n# cron 触发 agent 巡检脚本（示例）\n30 7 * * * /path/to/bot-client send-health-report --owner-id feishu:ou_xxx\n```\n\nagent 内部执行：\n1. `dashboard show` → 获取全家风险概览\n2. 若 `family_risk` 为 warning/urgent/emergency → 主动发送 IM 消息\n3. `alert-list` → 列出未解决告警，逐条通知\n\n**方式 B：cron 脚本直接调用 Bot API**\n\n```bash\n#!/bin/bash\n# /path/to/health-alert-push.sh\nRESULT=$(python3 /path/to/health-monitor/scripts/dashboard.py show --owner-id \"$1\")\nRISK=$(echo $RESULT | python3 -c \"import sys,json; d=json.load(sys.stdin); print(d.get('family_risk','ok'))\")\n\nif [ \"$RISK\" != \"ok\" ]; then\n  # 调用飞书/企微 Webhook 发送告警\n  curl -X POST \"$FEISHU_WEBHOOK\" \\\n    -H 'Content-Type: application/json' \\\n    -d \"{\\\"msg_type\\\":\\\"text\\\",\\\"content\\\":{\\\"text\\\":\\\"健康告警：$RISK，请打开 MediWise 查看详情\\\"}}\"\nfi\n```\n\n**方式 C：用户主动查询（最简单）**\n\n用户在 IM 中随时发送「看看全家健康」，agent 调用 dashboard 返回实时状态，无需后台推送。\n\n### 告警级别与推送策略建议\n\n| 级别 | 建议推送频率 | 建议渠道 |\n|------|-------------|----------|\n| info | 不推送，仅记录 | — |\n| warning | 每日早晨汇总推送一次 | IM 普通消息 |\n| urgent | 立即推送 | IM @消息 / 手机通知 |\n| emergency | 立即推送 + 重复提醒 | IM @消息 + 电话/短信 |\n\n> **当前限制**：health-monitor 不内置推送 SDK，emergency 级别需要外部脚本或 agent 逻辑实现重复提醒。建议在 agent 层对 emergency 告警做特殊处理（如每15分钟重复发送直到用户确认）。\n\n## 反模式\n\n- **不要将阈值设得过于敏感** — 容易产生告警疲劳\n- **不要忽略 emergency 级别告警** — 应立即关注\n- **趋势分析需要足够数据** — 少于 3 天数据时趋势不可靠\n\nFile v2.0.7:mediwise-health-tracker/SKILL.md\n\n---\nname: mediwise-health-tracker\ndescription: Family health and medical record management. Tracks members, visits, medications, lab results, daily metrics, reminders, briefings, and pre-visit summaries.\n---\n\n# MediWise Health Tracker\n\n家庭健康与病程记录管理技能。所有操作通过 `{baseDir}/scripts/` 下的 Python 脚本完成，默认输出 JSON，再转成自然语言回复给用户。\n\n当用户问”你可以做什么”时，记得主动提到：除了健康档案、指标记录、提醒、简报外，还可以根据最近的描述和历史记录先整理一段”就医前摘要”，并在需要时继续生成图片或 PDF，方便给医生快速了解病情。\n\n## 适用场景\n\n- 添加或管理家庭成员信息\n- 记录就诊经历（门诊/住院/急诊）、症状/诊断/用药/检验/影像检查结果\n- 记录日常健康指标（血压/血糖/心率/体温等）\n- 查询病程历史或用药记录、生成健康时间线或摘要、查看全家健康概况\n- 发送体检报告图片或化验单需要识别录入\n- 设置用药提醒、健康指标测量提醒、复查提醒，或获取主动健康建议、每日健康简报、就医前摘要图\n- 规划就诊流程（预约 → 就诊前汇总 → 记录诊断结果 → 复诊追踪）\n- 随口提到健康问题（如”最近膝盖有点疼”）需要记录并定期跟进\n\n## 核心工作流\n\n### 0. 确定 owner_id（每次必做）\n\n从会话上下文获取当前发送者 ID，格式为 `<channel>:<user_id>`，用于所有脚本的 `--owner-id` 参数。例如：\n- 飞书用户：`feishu:ou_707461a1baa7790213d30230b88fb575`\n- QQ 用户：`qqbot:12345678`\n\n后续所有脚本调用均以此 ID 作为 `--owner-id`，不得省略。\n\n### 1. 先确认成员（必须等用户回复）\n\n```bash\npython3 {baseDir}/scripts/member.py list --owner-id \"<sender_id>\"\n```\n\n每次增删改查前先调用 `list` 查询现有成员，**将结果展示给用户，明确询问\"是为哪位成员操作？\"，等待用户明确回复后再继续。**\n\n**禁止以下行为：**\n- 未经询问自动创建新成员（包括\"本人\"）\n- 在用户未确认目标成员的情况下继续写入数据\n- 假设\"只有一个成员所以自动选择\"\n\n**成员不存在时的处理：**\n```\n列表为空或未找到目标成员 → 告知用户 → 询问是否新建成员 → 等待用户确认姓名和关系 → 再调用 member.py add\n```\n\n```bash\n# 用户确认后才执行创建\npython3 {baseDir}/scripts/member.py add --name \"张三\" --relation \"本人\" --owner-id \"<sender_id>\"\n```\n\n### 2. 选择录入路径\n\n- 简短指标文本：优先 `quick_entry.py`\n- 复杂文本、就诊、用药、检验：用 `smart_intake.py` 或对应业务脚本\n- 图片 / PDF / 多附件：走视觉录入流程\n- 录入后发现异常指标、新诊断或用药变化：用 `log-health-note` 动作记录并跟进\n\n### 3. 查询后做自然语言整理\n\n```bash\npython3 {baseDir}/scripts/query.py summary --member-id <id>\npython3 {baseDir}/scripts/query.py timeline --member-id <id>\npython3 {baseDir}/scripts/query.py active-medications --member-id <id>\npython3 {baseDir}/scripts/query.py family-overview\n```\n\n不要把 JSON 原样贴给用户；改写成趋势、摘要、时间线和清晰列表。\n\n## 快速命令\n\n### 常用录入\n\n结构化数据可直接调用对应动作写入：\n\n| 动作 | 说明 | 关键参数 |\n|------|------|----------|\n| `add-visit` | 添加就诊记录 | member_id, visit_type, visit_date；可选 hospital/department/diagnosis |\n| `add-symptom` | 添加症状记录 | member_id, symptom；可选 severity/visit_id/onset_date |\n| `add-medication` | 添加用药记录 | member_id, name；可选 dosage/frequency/visit_id/purpose |\n| `add-metric` | 添加健康指标 | member_id, type, value；可选 measured_at/source/context |\n\n自然语言或图片输入走 `smart-extract` → `smart-confirm` 流程；短文本指标走 `quick-entry-save`。\n\n### 快速录入指标\n\n```bash\npython3 {baseDir}/scripts/quick_entry.py parse --text \"血压130/85 心率72\" --member-id <id> --owner-id \"<sender_id>\"\npython3 {baseDir}/scripts/quick_entry.py parse-and-save --text \"血压130/85 心率72\" --member-id <id> --owner-id \"<sender_id>\"\n```\n\n### 录入后发现异常，记录并跟进\n\n录入数据后若发现异常指标、新诊断或用药变化，用 `log-health-note` 动作记录并自动创建跟进提醒：\n\n```bash\n# action: log-health-note\npython3 {baseDir}/scripts/health_memory.py log --member-id <id> --content \"血压160/100，高于正常上限\" --category observation --follow-up-days 3\n```\n\n### 生成就医前摘要\n\n当用户最近准备去看医生，可以先让用户用自然语言描述本次不适，默认先生成一段简短摘要：\n\n```bash\npython3 {baseDir}/scripts/doctor_visit_report.py text --member-id <id> --description “最近两周反复头晕，起床和翻身时更明显，偶尔恶心，担心是不是血压或者耳石问题”\n```\n\n生成完后，顺手问一句：\n- “如果你愿意，我也可以继续帮你整理成图片或 PDF，方便就诊时直接出示给医生。”\n\n也可以更自然一点，比如：\n- “这版短文你先看看；如果要更方便出示给医生，我可以再帮你排成图片或 PDF。”\n- “要不要我顺手再帮你整理成一张图，或者导出成 PDF？”\n\n如用户明确需要，再继续导出图片版或 PDF 版。\n\n这份摘要会尽量汇总：\n- 本次主诉与自动提取的重点\n- 近期关键指标、异常提醒、最近就诊变化\n- 相关既往病史与近期检查\n- 当前在用药、过敏史、可识别的中高风险药物相互作用\n\n### 就诊全程管理（plan → prep → outcome → follow-up）\n\n对于有明确就诊计划的场景，可以走完整就诊生命周期：\n\n```bash\n# 1. 创建就诊预约（status=planned），获取准备提醒\npython3 {baseDir}/scripts/visit_lifecycle.py plan --member-id <id> --visit-date 2026-03-15 --hospital 协和医院 --department 心内科 --chief-complaint “反复胸闷”\n\n# 2. 就诊前智能汇总：症状按身体系统分组 + 近期异常指标 + 在用药 + 药物相互作用警告\npython3 {baseDir}/scripts/visit_lifecycle.py prep --member-id <id> [--days 30]\n\n# 3. 就诊后引导录入：诊断、处方、复诊安排（自动创建复诊提醒）\npython3 {baseDir}/scripts/visit_lifecycle.py outcome --visit-id <vid> --diagnosis “高血压” \\\n  --follow-up-date 2026-06-15 \\\n  --medications '[{“name”:”氨氯地平”,”dosage”:”5mg”,”frequency”:”每日一次”}]'\n\n# 4. 查看待处理就诊（planned / 未填结果 / 复诊提醒）\npython3 {baseDir}/scripts/visit_lifecycle.py pending --member-id <id>\n```\n\n### 健康记忆追踪\n\n当用户随口提到健康问题时，及时记录并自动跟进：\n\n```bash\n# 记录随口提到的健康问题，自动创建 N 天后的跟进提醒\npython3 {baseDir}/scripts/health_memory.py log --member-id <id> --content “最近睡眠很差，经常半夜醒” --category symptom --follow-up-days 5\n\n# 查看未解决的健康备注和到期跟进\npython3 {baseDir}/scripts/health_memory.py list --member-id <id>\n\n# 标记已解决\npython3 {baseDir}/scripts/health_memory.py resolve --note-id <nid> --resolution-note “医生建议减少咖啡因摄入，已执行”\n```\n\n待跟进的健康备注会自动出现在每日简报（`health_advisor.py briefing`）中，确保不遗漏。\n\n## 初始配置引导\n\n当用户首次使用、或表示\"图片识别不工作\"\"无法识别报告\"时，先在后台运行配置检查：\n\n```bash\npython3 {baseDir}/scripts/setup.py check\n```\n\n若输出中 `vision_configured` 为 `false`，**不要在聊天中索要 API Key**，而是引导用户在终端完成配置：\n\n### 配置流程\n\n**第一步：询问地区/偏好**\n\n> 检测到图片和 PDF 识别功能还没配置，需要接入一个视觉模型才能用。\n>\n> 你用的是国内网络还是海外网络？或者想完全在本地离线运行？\n\n根据回答推荐方案，并给出对应的注册链接：\n- 国内 → **硅基流动**（免费注册有额度，在 https://cloud.siliconflow.cn 获取 API Key）\n- 海外 → **Google Gemini**（免费，在 https://aistudio.google.com/apikey 获取）\n- 离线 → **本地 Ollama**（需提前安装 Ollama 并下载模型）\n\n**第二步：引导在终端配置（不在聊天中收集密钥）**\n\n告知用户在终端执行以下命令（`sk-xxx` 替换为实际 Key）：\n\n```\n# 示例：硅基流动\npython3 {baseDir}/scripts/setup.py set-vision --provider siliconflow --api-key sk-xxx\n\n# 示例：Google Gemini\npython3 {baseDir}/scripts/setup.py set-vision --provider gemini --api-key AIza-xxx\n\n# 示例：本地 Ollama\npython3 {baseDir}/scripts/setup.py set-vision --provider ollama\n```\n\n> ⚠️ **API Key 请在终端输入，不要通过聊天发送。** 在终端执行完成后告诉我一声，我来帮你验证是否配置成功。\n\n**第三步：用户告知完成后，验证配置**\n\n```bash\npython3 {baseDir}/scripts/setup.py test-vision\n```\n\n- 测试通过 → \"配置好了！现在可以直接把报告图片或 PDF 发给我来识别。\"\n- 测试失败 → 根据错误信息提示用户检查 API Key 是否正确，或网络是否可用。\n\n### 原则\n\n- **不在聊天中收集凭据**：API Key 属于敏感信息，必须由用户在本机终端直接输入，不得经过对话传递。\n- **后台静默执行**：`setup.py test-vision` 等验证命令在后台完成，不要把 JSON 输出贴给用户。\n- **配置失败友好提示**：失败时给出具体原因和可操作的修复建议，不要直接贴报错。\n\n## 不可跳过的规则\n\n1. **不要直接展示 JSON**：查询结果必须转成自然中文。\n2. **不要用自身视觉能力读医疗图片**：图片/PDF 只能走外部视觉模型。\n3. **药物安全问题必须先搜**：通过 DDInter、openFDA 或网页搜索查询，不要凭记忆回答。\n4. **发简报默认发图片版**：优先 `briefing_report.py screenshot`，不是纯文本。\n5. **多张图片先收齐再处理**：不要每到一张就立即确认录入。\n6. **每次调用脚本必须携带 `--owner-id`（强制）**：从当前会话上下文获取发送者 ID，格式为 `<channel>:<user_id>`（如 `feishu:ou_707461a1baa7790213d30230b88fb575` 或 `qqbot:12345`），作为所有脚本的 `--owner-id` 参数。这是多用户数据隔离的核心机制，任何脚本调用都不得省略。不知道 owner_id 时，先停下来确认，不要在没有 owner_id 的情况下写入数据。\n7. **就医前摘要默认先短文版**：先用 `doctor_visit_report.py text` 生成；用户需要时，再导出图片或 PDF。\n8. **成员确认必须等用户明确回复**：先调用 `member.py list` 展示已有成员，问清楚\"是为哪位成员操作\"，等待用户回复后再继续。不得自动创建成员（包括\"本人\"），不得在成员未确认的情况下写入任何数据。\n9. **记录饮食前必须先查食物数据库**：通过 diet-tracker 的 `food_lookup.py search` 查每种食物的营养数据，用查询结果填写 `--items`。禁止凭 AI 自身知识估算营养值后直接写入。\n10. **对话中的健康提及必须实时记录（强制）**：用户在对话中随口提到任何健康相关内容（症状、不适、用药感受、睡眠、情绪等），**必须在当次对话结束前**调用 `health_memory.py log` 将其写入健康备注。这是夜间做梦机制的原始素材来源——`dream.py gather` 会专门读取当日记录的对话提及，未被记录的提及将永久丢失。\n\n    **触发关键词示例**（不限于此）：\n    - \"最近/今天/昨天有点…\"、\"感觉…\"、\"一直…\"、\"偶尔…\"\n    - 身体部位 + 描述：头、胃、腿、眼睛、心脏 + 疼/胀/酸/晕/难受\n    - 睡眠问题：睡不着、早醒、多梦、睡眠质量差\n    - 情绪/精力：累、乏力、焦虑、情绪低落、提不起劲\n    - 用药感受：吃了药之后…、副作用、效果不明显\n\n## 每日健康简报推送规范（OpenClaw 定时任务）\n\n**触发时机：每日早晨 8:00，由 OpenClaw agent 自动执行。**\n\n### 执行流程\n\n```\n1. wearable-sync: sync-all          → 同步手表数据（若有绑定设备）\n2. health-monitor: check-all        → 检测异常指标，写入 alerts 表\n3. health_advisor.py briefing       → 获取全家简报数据（提醒 + 建议 + 风险等级）\n4. briefing_report.py screenshot    → 生成图片版简报（PNG），同时自动保存当日快照\n5. 推送给用户（见下方推送规则）\n```\n\n### 夜间做梦任务（OpenClaw 定时任务）\n\n**触发时机：每晚 22:00，由 OpenClaw agent 自动执行，调用 DREAM skill。**\n\n做梦机制负责在夜间回顾当日健康素材，提炼规律和隐患，将有价值的洞察写入健康备注，供次日简报展示。详见 `mediwise-health-tracker/DREAM.md`。\n\n```\ndream.py status   → 检查是否满足触发条件（≥20h 间隔）\ndream.py lock     → 获取做梦锁（防止并发）\ndream.py gather   → 收集当日健康素材\n↓ agent 深度分析（逐成员回顾指标/告警/备注趋势）\nhealth_memory.py log  → 写入值得记录的发现（有发现才写，最多3条/成员）\ndream.py unlock   → 释放锁，标记完成\n```\n\n### 推送内容规则\n\n| 情况 | 推送什么 |\n|---|---|\n| 有 alert 级告警 | 图片简报 + 文字摘要，文字中明确点出告警项 |\n| 只有 warning 或 info | 图片简报，文字一句话概括（\"今日整体正常，有 N 项提醒\"）|\n| 完全正常 | 只发一句\"今日健康状况良好，无待处理事项\" + 可选图片简报 |\n| 同步失败（无手表数据） | 注明\"今日手表数据未能同步，以下数据基于上次同步结果\" |\n\n### 推送格式\n\n- **默认发图片版**：`briefing_report.py screenshot` 生成 PNG，作为图片消息发送\n- **文字摘要**：在图片前附一段不超过 100 字的中文摘要，点出最重要的 1-2 件事\n- **禁止**：直接把 JSON 或 HTML 内容粘贴到聊天里\n\n### 用户手动请求时\n\n当用户说\"给我看今天的健康简报\"、\"健康小报\"、\"今天身体怎么样\"等时，立即执行步骤 3-5（不重复同步），发送图片简报。\n\n## 每日健康快照记忆（daily_snapshot.py）\n\n每次生成简报时自动保存当日快照，agent 可在对话中直接引用历史状态，无需每次重新计算。\n\n### 支持的查询场景\n\n| 用户说 | agent 调用 | 说明 |\n|---|---|---|\n| \"昨天状态怎么样\" | `daily_snapshot.py get --date <昨天>` | 返回单日摘要 |\n| \"这周身体趋势\" | `daily_snapshot.py history --days 7` | 最近7天列表 |\n| \"这个月有几天出现告警\" | `daily_snapshot.py trend --days 30` | 逐日风险等级 |\n| \"上周五血压有没有异常\" | `daily_snapshot.py get --date <日期>` + 若需要细节查 `health_metrics` | 快照 + 原始指标 |\n\n### 使用规则\n\n- **优先查快照**：用户问历史健康状态时，先查 `daily_snapshot.py`，有结果就直接用，不需要重新跑 `health_advisor.py`\n- **快照没有再查原始指标**：快照只存摘要和风险等级；如用户追问具体数值，再查 `health_metrics`\n- **描述要自然**：把 risk_level（ok / warning / alert）和 summary_text 组合成一句话，不要直接展示 JSON\n\n```bash\n# 查昨天快照\npython3 {baseDir}/scripts/daily_snapshot.py get --member-id <id> --date 2026-04-05 --owner-id <oid>\n\n# 查最近7天\npython3 {baseDir}/scripts/daily_snapshot.py history --member-id <id> --days 7 --owner-id <oid>\n\n# 查30天趋势（用于描述\"这个月整体状况\"）\npython3 {baseDir}/scripts/daily_snapshot.py trend --member-id <id> --days 30 --owner-id <oid>\n```\n\n## 能力介绍模板\n\n当用户问“你可以做什么”“你能帮我做什么”时，可以优先用自然中文这样回答：\n\n```text\n我可以帮你做这些和健康相关的事情：\n- 记录和整理健康档案：症状、诊断、用药、检验、影像、血压血糖等\n- 查询和总结病程：帮你把最近变化、既往史、在用药整理清楚\n- 做提醒和健康简报：比如用药提醒、复查提醒、每日简报\n- 识别报告图片或化验单：把图片/PDF里的信息提取出来录入\n- 在你准备去看医生前，先生成一段”就医前摘要”：自动整理最近的关键情况、相关病史、过敏史、在用药和需要注意的事项；如果你需要，我再继续整理成图片或 PDF\n- 就诊全程管理：提前规划预约 → 就诊前智能汇总症状/指标/用药 → 就诊后记录诊断和处方 → 自动追踪复诊提醒\n- 健康记忆：随时告诉我你注意到的健康问题（如”最近膝盖有点疼”），我会记下来并在几天后主动提醒你跟进\n\n如果你愿意，现在就可以直接告诉我：\n“帮我整理最近的情况”\n或\n“帮我整理最近的就医摘要”\n或\n“帮我生成一张给医生看的摘要图”\n```\n\n如果用户已经明确说最近要去医院、复诊、看专科，优先提“就医前摘要图”，不要把它埋在能力列表最后。\n\n## 数据备份与迁移\n\n当用户需要换设备、换环境，或者迁移到新的小龙虾实例时，使用以下命令打包和恢复数据：\n\n```bash\n# 备份：将所有数据库和配置打包到一个文件\npython3 {baseDir}/scripts/setup.py backup --output mediwise-backup.tar.gz\n\n# 恢复：在新环境中还原数据（Schema 自动升级到最新版本）\npython3 {baseDir}/scripts/setup.py restore --input mediwise-backup.tar.gz\n```\n\n备份文件包含：`medical.db`、`lifestyle.db`、`config.json`（以及旧版 `health.db`，如存在）。\n\n**迁移流程**：\n1. 旧环境：`setup.py backup --output xxx.tar.gz`，将文件发给用户\n2. 用户把文件传到新设备\n3. 新环境：`setup.py restore --input xxx.tar.gz`，数据恢复并自动完成 Schema 迁移\n\n## 参考导航\n\n按需读取，不要一次全读：\n\n- 录入、查询自然语言化、视觉处理：`mediwise-health-tracker/references/intake-query-vision.md:1`\n- 药物安全、健康建议、图片版简报：`mediwise-health-tracker/references/drug-briefing.md:1`\n- 周期追踪、附件管理、多租户隔离：`mediwise-health-tracker/references/cycle-attachments-multitenancy.md:1`\n- 就医前摘要图：`mediwise-health-tracker/references/visit-prep.md:1`\n\n## 反模式\n\n- 不要在未确认成员身份时直接写入数据。\n- 不要猜测诊断、剂量或图片内容。\n- 不要在用户未确认前删除记录或覆盖原始附件。\n- 不要说“无法发送图片”或“平台不支持图片”；本地图片可通过 `<qqimg>` 发送。\n- 不要用英文回复中文用户。\n\nFile v2.0.7:SKILL.md\n\n---\nname: mediwise-health-suite\ndescription: \"Family health management suite: health records, diet tracking, weight management, wearable sync. Local SQLite storage by default; optional cloud features require explicit setup.\"\nversion: 2.0.6\nauthor: MediWise Team\nlicense: MIT\nhomepage: https://github.com/JuneYaooo/mediwise-health-suite\nrepository: https://github.com/JuneYaooo/mediwise-health-suite\nkeywords:\n  - health\n  - medical\n  - family\n  - diet\n  - weight\n  - records\n  - chinese\n  - openclaw\nrequires:\n  bins:\n    - python3\n    - sqlite3\n    - node\n---\n\n# MediWise Health Suite - 家庭健康管理套件\n\n家庭健康管理助手：记录健康数据，追踪饮食和体重，为家庭健康保驾护航。\n\n## 核心能力\n\n### ✅ 1. 家庭健康档案 (mediwise-health-tracker)\n- 成员信息管理：姓名、关系、性别、出生日期、血型\n- 基础病史：既往史、过敏史、联系方式、紧急联系人\n- 病程记录：门诊、住院、急诊、症状、诊断、检验、影像\n- 用药信息：当前在用药、历史用药、停药原因\n- 日常指标：血压、血糖、心率、血氧、体温、体重等\n- 查询能力：健康摘要、时间线、在用药、全家概览\n- **就医前摘要**：自动整理病情、既往史、在用药，生成文本/图片/PDF\n\n### ✅ 2. 饮食追踪 (diet-tracker)\n- 每餐记录与食物条目管理\n- 营养分析：热量、蛋白质、脂肪、碳水、膳食纤维\n- 每日/每周营养摘要\n- 热量趋势分析\n\n### ✅ 3. 体重管理 (weight-manager)\n- 目标设定：减重/增重/维持\n- BMI/BMR/TDEE 计算\n- 运动记录与消耗追踪\n- 身体围度记录\n- 热量收支分析\n- 达标预测\n\n### ⚠ 4. 智能健康监测 (health-monitor) - 待完善\n- 多级阈值告警（info/warning/urgent/emergency）\n- 趋势分析与异常检测\n- 自动提醒：用药提醒、复查提醒、指标测量提醒\n\n### ⚠ 5. 可穿戴设备同步 (wearable-sync) - 待完善\n- 支持 Gadgetbridge（小米手环、华为手表等）\n- 自动同步：心率、步数、血氧、睡眠\n- 可插拔 Provider 架构\n\n## 快速开始\n\n### 安装\n\n> **重要**：OpenClaw 沙箱要求 skills 必须位于插件/agent 工作区目录内。\n> `clawhub install` 会安装到**当前目录**的 `skills/` 子目录，\n> 因此务必先 `cd` 进入正确的工作区目录再执行安装命令。\n\n**通过 ClawdHub（推荐）：**\n```bash\n# 先进入 OpenClaw agent 工作区目录（路径以实际配置为准）\ncd ~/.openclaw/workspace-health   # 或你的插件根目录\n\n# 再安装，skill 会被放到 ./skills/mediwise-health-suite/\nclawdhub install JuneYaooo/mediwise-health-suite\n```\n\n**手动安装（路径最明确）：**\n```bash\n# 直接克隆到正确路径，不受工作目录影响\ngit clone https://github.com/JuneYaooo/mediwise-health-suite.git \\\n  ~/.openclaw/workspace-health/skills/mediwise-health-suite\n```\n\n**路径检测工具（装完后验证）：**\n```bash\nbash ~/.openclaw/workspace-health/skills/mediwise-health-suite/install-check.sh\n```\n\n### 基本使用\n\n1. **添加家庭成员**\n   ```\n   \"帮我添加一个家庭成员，叫张三，是我爸爸\"\n   ```\n\n2. **记录健康指标**\n   ```\n   \"帮我记录今天血压 130/85，心率 72\"\n   ```\n\n3. **查看健康摘要**\n   ```\n   \"帮我看看最近的健康情况\"\n   ```\n\n4. **饮食记录**\n   ```\n   \"帮我记录今天早餐：牛奶一杯、面包两片、鸡蛋一个\"\n   ```\n\n5. **体重管理**\n   ```\n   \"帮我设定一个减重目标，从 70kg 减到 65kg\"\n   ```\n\n6. **就医前准备**\n   ```\n   \"我准备去看医生，帮我整理一下最近的情况\"\n   ```\n\n## 系统要求\n\n- **Python**: 3.8+\n- **SQLite**: 3.x\n- **操作系统**: Linux / macOS / Windows\n- **OpenClaw**: 2026.3.0+\n\n## 数据隐私\n\n- **默认本地存储**：所有数据存储在本地 SQLite 数据库，不上传云端\n- **可选后端模式**：支持可选的后端 API 模式（需用户主动配置，默认关闭）\n- **可选向量搜索**：支持智能查询功能（本地模型优先，可选 API，默认关闭）\n- **多租户隔离**：支持共享实例场景的数据隔离\n\n**重要**：所有云端功能均为可选，需用户主动配置启用。默认配置下，所有数据仅存储在本地。\n\n## 可选环境变量\n\n所有功能在不设置任何环境变量的情况下均可正常使用。详细配置模板见根目录 `.env.example`。\n\n### 多模态视觉模型（强烈推荐配置）\n\n用于识别体检报告图片、化验单、病历 PDF。不配置则无法处理图片输入。\n\n| 变量名 | 说明 | 推荐值 |\n|--------|------|--------|\n| `MEDIWISE_VISION_API_KEY` | 视觉模型 API Key（设置即自动启用） | 见下方推荐方案 |\n| `MEDIWISE_VISION_PROVIDER` | 提供商名称 | `siliconflow` / `openai` / `ollama` |\n| `MEDIWISE_VISION_MODEL` | 模型名称 | 见下方推荐方案 |\n| `MEDIWISE_VISION_BASE_URL` | API 地址（OpenAI 兼容接口） | 见下方推荐方案 |\n\n**推荐方案：**\n\n| 方案 | 适用场景 | PROVIDER | MODEL | BASE_URL |\n|------|---------|----------|-------|----------|\n| 硅基流动 Qwen2.5-VL（**国内首选**） | 国内部署，价格低，[注册链接](https://cloud.siliconflow.cn/i/MOlLXTYM) | `siliconflow` | `Qwen/Qwen2.5-VL-72B-Instruct` | `https://api.siliconflow.cn/v1` |\n| Google Gemini 3.1 Pro（**海外首选**） | 多模态效果强 | `openai` | `gemini-3.1-pro-preview` | `https://generativelanguage.googleapis.com/v1beta/openai` |\n| OpenAI GPT-4o | 通用，效果稳定 | `openai` | `gpt-4o` | `https://api.openai.com/v1` |\n| 阶跃星辰 Step-1V | 国内备选 | `openai` | `step-1v-32k` | `https://api.stepfun.com/v1` |\n| 本地 Ollama | 完全离线 | `ollama` | `qwen2-vl:7b` | `http://localhost:11434/v1` |\n\n也可以用 `setup.py` 命令配置（保存到 `config.json`，环境变量优先级更高）：\n```bash\npython3 scripts/setup.py set-vision \\\n  --provider siliconflow \\\n  --model Qwen/Qwen2.5-VL-72B-Instruct \\\n  --api-key sk-xxx \\\n  --base-url https://api.siliconflow.cn/v1\n```\n\n### 纯文本 LLM（可选）\n\n用于结构化提取、快速录入解析。**不设置时自动复用视觉模型**，无需单独配置。\n\n| 变量名 | 说明 |\n|--------|------|\n| `MEDIWISE_LLM_API_KEY` | 文本模型 API Key |\n| `MEDIWISE_LLM_PROVIDER` | 提供商 |\n| `MEDIWISE_LLM_MODEL` | 模型名称 |\n| `MEDIWISE_LLM_BASE_URL` | API 地址 |\n\n### 其他可选变量\n\n| 变量名 | 用途 | 默认行为 |\n|--------|------|----------|\n| `MEDIWISE_OWNER_ID` | 多租户隔离：限定当前进程只能访问该 owner 的数据。**个人/单用户使用时无需设置**；仅在将本工具部署为多人共享服务（如群聊机器人）时才需要为每个用户设置不同值以实现数据隔离 | 未设置时为单用户模式（访问本机全部数据），适合个人或家庭独立部署 |\n| `USDA_API_KEY` | USDA FoodData Central API Key，用于国际食材兜底查询。免费注册：https://api.data.gov/signup/ | 未设置时跳过 USDA 查询，使用内置离线数据库 |\n| `MEDIWISE_DATA_DIR` | 覆盖 SQLite 数据库存储目录 | 默认 OS 用户数据目录（Linux: `~/.local/share/mediwise`） |\n| `MEDIWISE_MEDICAL_DB_PATH` | 覆盖医疗数据库（medical.db）路径 | 存储在 `MEDIWISE_DATA_DIR` 下 |\n| `MEDIWISE_LIFESTYLE_DB_PATH` | 覆盖生活方式数据库（lifestyle.db）路径 | 存储在 `MEDIWISE_DATA_DIR` 下 |\n\n## 可选外部网络访问\n\n## 安全说明\n\n### 运行时环境\n\n本 skill 同时使用 **Python 3.8+**（业务脚本）和 **Node.js 18+**（action 路由层），两者均需已安装。\n\n### 数据隔离（多用户部署）\n\n- **个人/家庭单机使用**：无需任何配置，所有数据保存在本机 SQLite 文件中。\n- **多用户共享部署**（如群聊机器人）：必须为每个用户传入不同的 `owner_id`（格式 `<channel>:<user_id>`），否则所有用户共享同一份数据库视图。index.js 在 owner_id 缺失时会打印 WARNING 并进入单用户模式。\n\n### 第三方凭据处理\n\n- **凭据绝不经过聊天传递**：所有 API Key、密码等敏感信息必须由用户在本机终端直接输入，agent 不会在对话中索要、接收或代为保存凭据。\n- **Garmin Connect 密码**：首次绑定通过终端交互输入（`--prompt-password`，不回显），密码不经过模型或日志。认证成功后自动保存 OAuth token，后续同步无需密码。\n- **视觉/LLM API Key**：用户在终端执行 `setup.py set-vision --api-key <key>` 完成配置，key 保存在本机 `config.json`，不会出现在聊天记录中。\n- **所有凭据**均保存在本机，不上传到任何远程服务器。\n\n### 可选外部访问（默认关闭）\n\n默认完全离线，以下网络请求**仅在用户主动在终端执行配置命令后**才会发生：\n\n| 触发操作（需用户在终端执行） | 外部主机 | 发送内容 |\n|------------------------------|----------|----------|\n| `setup.py set-vision` 启用视觉模型 | `api.siliconflow.cn` / Google / OpenAI 等 | 图片 base64 + 提示词（不含姓名/身份证等 PII） |\n| `USDA_API_KEY` 环境变量 | `api.nal.usda.gov` | 食物名称搜索词 |\n| `setup.py set-embedding` 启用向量搜索 | `api.siliconflow.cn` | 匿名文本片段 |\n| `setup.py set-backend` 启用后端 API | 用户自配置的端点 | **完整健康记录** — 仅在自托管可信端点使用，不建议指向第三方服务 |\n\n> **set-backend 风险说明**：启用后端 API 后，所有健康记录（病历、指标、用药等）将发送至配置的端点。请仅在完全信任该端点的情况下启用，且优先使用本地或自托管服务。\n\n### 备份文件\n\n`setup.py backup` 会将所有数据库打包为 `.tar.gz`，**包含完整的健康档案**，请妥善保管，不要分享给未授权人员。\n\n## 技术架构\n\n- **数据库**: SQLite（共享 health.db）\n- **脚本语言**: Python 3.8+\n- **Skill 框架**: OpenClaw Agent Skills\n- **模块化设计**: 5 个 skills（3 个已实现，2 个待完善）\n- **可选功能**: 后端 API、向量搜索（默认关闭）\n\n## 许可证\n\nMIT License - 详见 [LICENSE](LICENSE) 文件\n\n## 免责声明\n\n本工具仅供健康信息记录和参考，不构成医疗建议。任何健康问题请咨询专业医生。\n\n---\n\n**关键词**: 健康管理、医疗记录、家庭健康、饮食追踪、体重管理、health management, medical records, family health, diet tracking, weight management\n\nFile v2.0.7:sleep-tracker/SKILL.md\n\n---\nname: sleep-tracker\ndescription: >-\n  睡眠追踪与质量分析。记录每晚睡眠时长和各阶段（深睡/浅睡/REM/清醒），\n  评估睡眠质量评分，查看每日详情和每周趋势。支持手动录入和可穿戴设备自动同步。\n  Sleep tracking and quality analysis. Records nightly sleep duration and stages\n  (deep/light/REM/awake), scores sleep quality, and shows daily details and weekly trends.\n  关键词：睡眠记录、睡眠质量、深睡、REM、睡眠趋势、睡眠分析、失眠、睡了多久、昨晚睡眠。\n---\n\n# Sleep Tracker - 睡眠追踪\n\n记录和分析睡眠数据，评估睡眠质量，发现睡眠规律。\n\n## 睡眠质量评分标准\n\n| 评分 | 标签 | 说明 |\n|------|------|------|\n| 85-100 | 优质 | 时长充足，各阶段比例理想 |\n| 70-84 | 良好 | 基本达标，有小幅改善空间 |\n| 55-69 | 一般 | 存在明显不足，建议关注 |\n| 0-54 | 较差 | 睡眠质量差，需要干预 |\n\n**理想睡眠参考值：**\n- 总时长：7-9 小时\n- 深睡比例：13-23%\n- REM 比例：20-25%\n- 清醒时间：<10%\n\n## 核心工作流\n\n> **强制规则**：每次调用脚本必须携带 `--owner-id`，从会话上下文获取发送者 ID（格式 `<channel>:<user_id>`，如 `feishu:ou_xxx` 或 `qqbot:12345`），不得省略。\n\n### 1. 手动录入睡眠\n\n用户说「昨晚睡了7小时」「记录睡眠」时使用：\n\n```bash\n# 录入总时长（最简方式，其他阶段留空）\npython3 {baseDir}/scripts/sleep.py log --member-id <id> --duration 420\n\n# 带阶段详情录入\npython3 {baseDir}/scripts/sleep.py log --member-id <id> --duration 480 \\\n  --deep 90 --light 240 --rem 100 --awake 30\n\n# 指定日期（默认昨天）\npython3 {baseDir}/scripts/sleep.py log --member-id <id> --duration 450 --date 2026-03-26\n```\n\n**时长换算提示：**\n- 用户说「7小时」→ duration=420\n- 用户说「7.5小时」→ duration=450\n- 用户说「7小时30分」→ duration=450\n\n### 2. 查看每日睡眠\n\n用户说「昨晚睡得怎么样」「查看睡眠」时使用：\n\n```bash\n# 查看昨晚（默认）\npython3 {baseDir}/scripts/sleep.py daily --member-id <id>\n\n# 查看指定日期\npython3 {baseDir}/scripts/sleep.py daily --member-id <id> --date 2026-03-26\n```\n\n### 3. 每周睡眠趋势\n\n用户说「这周睡眠怎么样」「睡眠趋势」时使用：\n\n```bash\n# 近7天（默认）\npython3 {baseDir}/scripts/sleep.py weekly --member-id <id>\n\n# 近14天\npython3 {baseDir}/scripts/sleep.py weekly --member-id <id> --days 14\n```\n\n### 4. 历史记录\n\n```bash\n# 最近14条（默认）\npython3 {baseDir}/scripts/sleep.py list --member-id <id>\n\n# 最近30条\npython3 {baseDir}/scripts/sleep.py list --member-id <id> --limit 30\n```\n\n## 数据来源\n\n睡眠数据来自两个渠道：\n1. **手动录入**：通过 `sleep-log` action 直接输入\n2. **可穿戴同步**：通过 wearable-sync 从 Apple Health / Gadgetbridge 自动导入\n\n两种来源均存储在 `health_metrics` 表（`metric_type='sleep'`），查询时统一处理。\n\n## 反模式\n\n- **不要重复录入同一天** — 系统会显示多条，建议先 daily 确认再录入\n- **阶段时长之和不能超过总时长** — 否则录入报错\n- **手动录入不需要精确到分钟** — 大致时长即可，质量评分有容忍范围\n\nFile v2.0.7:wearable-sync/SKILL.md\n\n---\nname: wearable-sync\ndescription: \"Wearable device data sync: import health data from Garmin watches (Body Battery, HRV, sleep, heart rate), Apple Health, Huawei, Xiaomi (Gadgetbridge), Zepp devices. Pluggable provider architecture.\"\n---\n\n# Wearable Sync - 可穿戴设备数据同步\n\n从可穿戴设备（手环/手表）采集健康数据并写入 mediwise-health-tracker 的 health_metrics 表。\n\n## 支持的设备/Provider\n\n| Provider | 状态 | 数据来源 | 支持指标 |\n|----------|------|----------|----------|\n| Gadgetbridge | ✅ 已实现 | 本地 SQLite 导出文件 | 心率、步数、血氧、睡眠 |\n| Apple Health | ✅ 已实现 | export.xml / export.zip | 心率、步数、血氧、睡眠、体重、身高、体脂、血糖、血压、卡路里 |\n| **Garmin Connect** | ✅ 已实现 | Garmin Connect 账号（非官方 API） | 心率、睡眠分期、HRV、身体电量、压力、步数、卡路里、血氧、活动记录 |\n| 华为 Health Kit | 🔜 Stub | REST API（需企业开发者资质） | — |\n| Zepp Health | 🔜 Stub | REST API（需开发者账号） | — |\n| OpenWearables | 🔜 Stub | 统一 API（暂不支持华为/小米） | — |\n\n> **强制规则**：每次调用脚本必须携带 `--owner-id`，从会话上下文获取发送者 ID（格式 `<channel>:<user_id>`，如 `feishu:ou_xxx` 或 `qqbot:12345`）。所有设备管理和同步操作均需携带，不得省略。\n\n## Garmin Connect 接入说明\n\n### 前置依赖\n\n```bash\npip install garminconnect\n```\n\n> Garmin 使用非官方 API（模拟 Web 登录），无需申请开发者账号。需要用户的 Garmin Connect 账号和密码。\n\n### 绑定流程\n\n```bash\n# 1. 添加 Garmin 设备\npython3 {baseDir}/scripts/device.py add --member-id <id> --provider garmin --device-name \"Garmin Fenix 7\"\n\n# 2. 配置账号（--prompt-password 交互输入，密码不经过模型）\npython3 {baseDir}/scripts/device.py auth --device-id <id> \\\n  --username you@example.com \\\n  --prompt-password \\\n  --tokenstore /home/ubuntu/.garmin_tokens\n# 终端会提示\"请输入密码\"，输入时不回显，密码不出现在命令行/日志/模型上下文中\n\n# 也可通过环境变量传入（适合 CI/cron 无终端场景）\n# export GARMIN_PASSWORD='yourpass'\n# python3 device.py auth --device-id <id> --username you@example.com --tokenstore ...\n\n# 3. 测试连接\npython3 {baseDir}/scripts/device.py test --device-id <id>\n\n# 4. 同步数据\npython3 {baseDir}/scripts/sync.py run --device-id <id>\n```\n\n**Agent 引导规则（重要）：**\n\n- **禁止在聊天中索要密码**：密码一旦在对话框输入，就会出现在模型上下文和服务端日志中\n- 正确做法：先收集邮箱和 tokenstore 路径，然后生成一条 `device.py auth ... --prompt-password` 命令，让用户在自己的终端运行（可用 `! <命令>` 直接在会话执行），密码由终端 `getpass` 读取，全程不经过模型\n\n**Agent 引导步骤（agent 对话中按序询问）：**\n\n1. **确认设备名称**：请问你的佳明手表型号是？（如 Fenix 7、Forerunner 965，填写任意名称即可）\n2. **收集邮箱**：你的 Garmin Connect 登录邮箱是？\n3. **是否保存登录状态**：是否保存登录 token？（推荐，设置后登录一次即可，后续同步无需密码）\n   - 是 → 询问 tokenstore 目录（可用默认值 `~/.garmin_tokens`）\n4. **生成命令让用户自行输入密码**（不在聊天里问密码）：\n\n   ```\n   请在你的终端运行以下命令，运行后会提示输入密码（不回显，不经过我）：\n   ! python3 {baseDir}/scripts/device.py auth --device-id <id> --username <邮箱> --prompt-password --tokenstore ~/.garmin_tokens\n   ```\n\n5. 命令运行成功后，调用 `device-test` 验证连接，再调用 `sync-device` 拉取近 7 天数据\n   - 若返回错误含「升级库」提示，告知用户执行 `pip install --upgrade garminconnect`\n   - 若返回错误含「两步验证」提示，告知用户需要在终端完成一次性验证后重试\n\n### Agent 引导用户配置佳明的对话规则\n\n当用户表达以下意图时，agent 应主动引导完成绑定流程：\n- \"我用佳明\"、\"我有 Garmin 手表\"、\"帮我绑定佳明\"\n- \"我想同步佳明数据\"、\"我的 Fenix / Forerunner / Venu / Vivoactive\"\n\n**同步频率建议**：每小时最多同步一次，可通过 cron 自动定时同步。\n\n### 支持的 Garmin 指标\n\n| metric_type | 说明 | 数据格式 |\n|---|---|---|\n| `heart_rate` | 全天心率（5分钟间隔） | `\"72\"` |\n| `sleep` | 睡眠分期汇总 | `{\"duration_min\":420,\"deep_min\":80,\"light_min\":210,\"rem_min\":100,\"awake_min\":30,\"score\":78}` |\n| `hrv` | 夜间 HRV（RMSSD） | `{\"rmssd\":45.2,\"weekly_avg\":43.0,\"status\":\"BALANCED\"}` |\n| `body_battery` | 身体电量（5分钟间隔） | `{\"level\":72,\"charged\":5,\"drained\":2}` |\n| `stress` | 压力指数（3分钟间隔） | `\"28\"` |\n| `steps` | 每日步数汇总 | `{\"count\":8500,\"distance_m\":6200,\"calories\":320}` |\n| `calories` | 活动卡路里 | `\"320\"` |\n| `blood_oxygen` | 血氧（SpO2，小时均值） | `\"97\"` |\n| `weight` | 体重（kg，来自 Garmin Connect 体重记录） | `\"72.5\"`，extra 含 `bmi`/`bodyFat`/`muscleMass` 等（设备支持时） |\n| `activity` | 运动记录 | `{\"activity_type\":\"running\",\"duration_sec\":3600,\"distance_m\":10000,\"avg_hr\":152}` |\n| `respiration` | 呼吸频率（次/分钟，睡眠期间采样，设备支持时） | `\"14.5\"` |\n| `training_readiness` | 训练准备度评分（0-100，综合睡眠/HRV/负荷等子项） | `{\"score\":72,\"level\":\"GOOD\",\"sleep_score\":80,\"hrv_status\":\"BALANCED\"}` |\n| `training_status` | 训练状态（VO2 Max、有氧/无氧负荷，需设备支持） | `{\"vo2_max\":48.2,\"status\":\"PRODUCTIVE\",\"aerobic_load\":1.2}` |\n| `floors` | 爬楼层数（每日累计） | `{\"ascended\":12,\"descended\":10}` |\n| `hydration` | 水分摄入（ml，需在 Garmin Connect App 手动记录） | `{\"intake_ml\":1800.0,\"sweat_loss_ml\":650.0}` |\n\n### 注意事项\n\n- Garmin 账号若开启双重验证（2FA），首次登录需要在终端手动输入验证码；配置 `tokenstore` 后后续无需重复验证。\n- Garmin Connect 服务器有速率限制，建议同步频率不超过每小时一次。\n- 佳明「身体电量」（Body Battery）是 Garmin 专有指标，存储为 `body_battery` 类型，可与饮食数据联合分析恢复趋势。\n- 高驰（COROS）、Polar、Suunto 暂无官方 API，可通过 Strava 同步后使用 Strava provider（待实现）间接接入活动记录。\n\n## 核心工作流\n\n### 1. 设备绑定\n\n用户需要先绑定设备，指定 Provider 和配置信息：\n\n```bash\n# 添加 Gadgetbridge 设备\npython3 {baseDir}/scripts/device.py add --member-id <id> --provider gadgetbridge --device-name \"小米手环 8\"\n\n# 配置 Gadgetbridge 导出文件路径\npython3 {baseDir}/scripts/device.py auth --device-id <id> --export-path /path/to/Gadgetbridge.db\n\n# 查看已绑定设备\npython3 {baseDir}/scripts/device.py list --member-id <id>\n\n# 测试设备连接\npython3 {baseDir}/scripts/device.py test --device-id <id>\n\n# 移除设备\npython3 {baseDir}/scripts/device.py remove --device-id <id>\n```\n\n### 2. 数据同步\n\n```bash\n# 同步单个设备\npython3 {baseDir}/scripts/sync.py run --device-id <id>\n\n# 同步某成员所有设备\npython3 {baseDir}/scripts/sync.py run --member-id <id>\n\n# 同步所有活跃设备\npython3 {baseDir}/scripts/sync.py run-all\n\n# 查看同步状态\npython3 {baseDir}/scripts/sync.py status --device-id <id>\n\n# 查看同步历史\npython3 {baseDir}/scripts/sync.py history --device-id <id> --limit 10\n```\n\n### 3. 定时同步\n\nSkill 本身不运行后台进程。由 OpenClaw agent 每日定时触发，或用户手动请求时触发。\n\n**OpenClaw 定时触发规范（agent 按此执行）：**\n\n每日早晨 7:30 前，agent 应自动触发一次全量同步，流程如下：\n\n1. 调用 `sync-all` 同步所有活跃设备\n2. 若返回 `synced > 0`，继续触发 health-monitor 检测（见 health-monitor/SKILL.md）\n3. 若有告警，合并进当日健康简报推送（见 mediwise-health-tracker/SKILL.md 的「每日简报推送规范」）\n4. 若同步失败（认证错误/网络错误），**不静默忽略**，主动通知用户：\n   > \"今日佳明手表数据同步失败：{错误原因}，请检查网络或重新绑定设备。\"\n\n**用户手动请求时触发规范：**\n\n当用户说\"同步一下手表\"、\"更新健康数据\"、\"刷新佳明数据\"等时，立即执行 `sync-device` 或 `sync-all`，同步完成后告知结果。\n\n```bash\n# 备用：cron 直接调用（不依赖 agent，适合服务器独立部署）\n# 每小时整点同步一次\n0 * * * * cd /path/to/wearable-sync/scripts && python3 sync.py run-all >> ~/mediwise-sync.log 2>&1\n```\n\n## 数据标准化\n\n不同设备返回的原始数据格式各异，同步时统一转换为 health_metrics 格式：\n\n| 设备原始字段 | metric_type | value 格式 |\n|---|---|---|\n| Gadgetbridge HEART_RATE | heart_rate | \"72\" |\n| Gadgetbridge RAW_INTENSITY (steps) | steps | `{\"count\":8500,\"distance_m\":0,\"calories\":0}` |\n| Gadgetbridge SpO2 | blood_oxygen | \"98\" |\n| Gadgetbridge SLEEP | sleep | `{\"duration_min\":480,\"deep_min\":120,...}` |\n\n## 去重策略\n\n同步时按 `(member_id, metric_type, measured_at, source)` 做唯一性检查。已存在的同源同时间点数据会被跳过，并记录到 `wearable_sync_log` 中。\n\n## Gadgetbridge 导出说明\n\n1. 打开 Gadgetbridge App → 设置 → 数据库管理 → 导出数据库\n2. 导出文件为 `Gadgetbridge` 或 `Gadgetbridge.db`（SQLite 格式）\n3. 将文件传输到电脑，使用 `device.py auth --export-path` 配置路径\n\n## Apple Health 导出说明\n\n1. iPhone → 健康 App → 右上角头像 → 导出健康数据\n2. 生成 `export.zip`（内含 `export.xml`）\n3. 将文件传输到电脑，按以下步骤绑定：\n\n```bash\n# 添加 Apple Health 设备\npython3 {baseDir}/scripts/device.py add --member-id <id> --provider apple_health --device-name \"iPhone\"\n\n# 配置导出文件路径（支持 .xml 或 .zip）\npython3 {baseDir}/scripts/device.py auth --device-id <id> --export-path /path/to/export.zip\n\n# 同步数据\npython3 {baseDir}/scripts/sync.py run --device-id <id>\n```\n\n支持指标：心率、静息心率、步数、血氧、睡眠分期、体重、身高、体脂率、血糖、血压、卡路里消耗。\n\n### Apple Health 持续更新方案\n\nApple Health 导出是**手动触发的快照**，不是实时流。要实现持续监测，需要定期更新导出文件并重新同步。\n\n**推荐流程（每日自动化）：**\n\n```\niPhone 健康 App 导出\n    → AirDrop / iCloud Drive / USB 传输到 Mac\n    → 覆盖固定路径的 export.zip\n    → cron 定时触发 sync.py\n    → health-monitor check.py 检测异常\n```\n\n**方案一：iCloud Drive 自动同步（推荐，Mac 用户）**\n\n1. iPhone 导出时选择保存到 iCloud Drive 固定目录（如 `iCloud Drive/HealthExports/export.zip`）\n2. Mac 上 iCloud Drive 自动同步该文件\n3. 配置 `--export-path` 指向本地 iCloud 同步目录：\n   ```bash\n   ~/Library/Mobile\\ Documents/com~apple~CloudDocs/HealthExports/export.zip\n   ```\n4. 用户每次在 iPhone 重新导出覆盖该文件，Mac 自动同步，cron 定期执行同步\n\n**方案二：快捷指令（Shortcuts）自动导出**\n\niOS「快捷指令」App 可设置每日定时自动导出健康数据并上传到固定位置：\n1. 新建快捷指令 → 添加「导出健康数据」动作\n2. 添加「上传文件」动作（保存到 iCloud Drive 或通过 SSH/SFTP 上传到服务器）\n3. 设置「自动化」→「每天早上 7:00 运行」\n\n**方案三：手动定期导出（最简单）**\n\n用户每周或每天手动在 iPhone 导出一次，通过 AirDrop 传到 Mac，覆盖固定路径即可。适合数据精度要求不高的场景。\n\n**cron 自动同步配置（配合以上任一方案）：**\n\n```bash\n# 编辑 crontab\ncrontab -e\n\n# 每小时同步一次 Apple Health 数据并触发健康检测\n0 * * * * cd /path/to/wearable-sync/scripts && python3 sync.py run --device-id <device-id> >> ~/mediwise-sync.log 2>&1\n5 * * * * cd /path/to/health-monitor/scripts && python3 check.py run-all --window 2h >> ~/mediwise-check.log 2>&1\n```\n\n> **注意**：Apple Health 导出文件更新频率决定了数据新鲜度上限。iCloud 方案约有 5-15 分钟延迟；手动方案取决于用户导出频率。系统内置去重，重复同步同一文件不会产生重复数据。\n\n## 反模式\n\n- **不要手动修改 Gadgetbridge 导出数据库** — 直接读取即可\n- **不要频繁同步相同时间段** — 系统自动去重，但会浪费 I/O\n- **不要在同步过程中删除导出文件** — 等同步完成后再操作\n- **OAuth Provider（华为/Zepp）当前为 Stub** — 调用会抛出 NotImplementedError\n\n## Apple Health 实现依据与参考文献\n\n### HealthKit 官方文档\n\n| 文档 | 链接 | 用途 |\n|------|------|------|\n| HKQuantityTypeIdentifier 枚举 | https://developer.apple.com/documentation/healthkit/hkquantitytypeidentifier | APPLE_TYPE_MAP 中所有类型字符串的权威来源 |\n| HKCategoryTypeIdentifier 枚举 | https://developer.apple.com/documentation/healthkit/hkcategorytypeidentifier | 睡眠分析类型 identifier |\n| HKCategoryValueSleepAnalysis | https://developer.apple.com/documentation/healthkit/hkcategoryvaluesleepanalysis | SLEEP_VALUE_MAP int→阶段映射依据 |\n| HKCorrelation（血压关联模型） | https://developer.apple.com/documentation/healthkit/hkcorrelation | 血压收缩压/舒张压配对60秒窗口依据 |\n| HealthKit 数据类型总览 | https://developer.apple.com/documentation/healthkit/data_types | export.xml Record 元素结构（type/startDate/value/unit） |\n\n### 睡眠分期 int 映射（iOS 16+）\n\n`HKCategoryValueSleepAnalysis` 整数值含义（来源：Apple 开发者文档 + WWDC 2022 Session 10005）：\n\n| 整数值 | 枚举名 | 映射到 |\n|--------|--------|--------|\n| 0 | inBed | awake |\n| 1 | asleepUnspecified | awake |\n| 2 | awake | awake |\n| 3 | asleepCore | light_sleep |\n| 4 | asleepDeep | deep_sleep |\n| 5 | asleepREM | rem_sleep |\n\n值 0-2 为原始 API，值 3-5 在 iOS 16 引入精细睡眠分期时新增。\n\n### 单位换算依据\n\n| 换算 | 系数 | 来源 |\n|------|------|------|\n| 血糖 mg/dL → mmol/L | ÷ 18.0182 | 葡萄糖摩尔质量 180.182 g/mol（SI 单位标准） |\n| 身高 m → cm | × 100 | SI 基本单位定义 |\n| 体重 lbs → kg | × 0.453592 | NIST 磅-千克换算定义值 |\n| 血氧/体脂 fraction→% | × 100 | iOS 旧版本以小数存储（≤1.0 判断） |\n\n### 步数聚合\n\nApple Health 的 `HKQuantityTypeIdentifierStepCount` 为**分段采样**（非累计），每条 Record 记录一段时间内的步数增量。日步数总计通过对同一日历日内所有采样求和得到，与 Apple Health App 显示逻辑一致。\n\n### 大文件流式解析\n\nApple Health 导出文件可超过 1 GB，采用 `xml.etree.ElementTree.iterparse` + `elem.clear()` 模式以 O(1) 内存处理：\n- Python 官方文档：https://docs.python.org/3/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse\n\nFile v2.0.7:weight-manager/SKILL.md\n\n---\nname: weight-manager\ndescription: \"Weight management: set goals, track progress, log exercise, calculate BMI/BMR/TDEE, analyze calorie balance and body composition. Integrates with diet-tracker and mediwise-health-tracker.\"\n---\n\n# weight-manager\n\n## 概述\n\n提供体重目标设定、进度追踪、趋势分析、热量收支计算、达标预测、BMI/BMR/TDEE 计算、运动记录和身体围度记录功能。体重数据复用 `health_metrics` 表（weight 类型），饮食热量数据来自 `diet_records` 表，运动消耗数据来自 `exercise_records` 表，身体围度数据复用 `health_metrics` 表，形成完整的\"饮食 → 运动 → 热量 → 体重 → 身体成分\"管理闭环。\n\n## 数据模型\n\n### weight_goals（体重目标）\n| 字段 | 说明 |\n|------|------|\n| id | 目标 ID |\n| member_id | 成员 ID |\n| goal_type | 目标类型: lose/gain/maintain |\n| start_weight | 起始体重 kg |\n| target_weight | 目标体重 kg |\n| start_date | 开始日期 |\n| target_date | 目标日期 |\n| daily_calorie_target | 每日热量目标 kcal |\n| status | 状态: active/completed/abandoned |\n| note | 备注 |\n\n### exercise_records（运动记录）\n| 字段 | 说明 |\n|------|------|\n| id | 记录 ID |\n| member_id | 成员 ID |\n| exercise_type | 运动类型: running/walking/cycling/swimming/strength/yoga/hiit/other |\n| exercise_name | 自定义名称 |\n| duration | 时长（分钟） |\n| calories_burned | 消耗热量 kcal |\n| exercise_date | 运动日期 YYYY-MM-DD |\n| exercise_time | 运动时间 HH:MM |\n| intensity | 强度: low/medium/high |\n| note | 备注 |\n\n> 体重记录复用 `health_metrics` 表的 weight 类型，不重复建表。\n> 身体围度记录复用 `health_metrics` 表，metric_type 为 waist/hip/chest/arm/thigh/body_fat。\n\n## 功能列表\n\n### weight_goal.py — 目标管理\n\n| 动作 | 子命令 | 必要参数 | 可选参数 | 说明 |\n|------|--------|----------|----------|------|\n| set-goal | set | --member-id, --goal-type, --start-weight, --target-weight | --start-date, --target-date, --daily-calorie-target, --activity-level, --note | 设定减重/增重/维持目标，未指定热量目标时自动根据 BMR/TDEE 推算 |\n| view-goal | view | --member-id | | 查看当前活跃目标 |\n| update-goal | update | --goal-id | --target-weight, --target-date, --daily-calorie-target, --note | 修改目标参数 |\n| complete-goal | complete | --goal-id | | 标记目标完成 |\n| abandon-goal | abandon | --goal-id | | 放弃目标 |\n\n### weight_analysis.py — 进度分析\n\n| 动作 | 子命令 | 必要参数 | 可选参数 | 说明 |\n|------|--------|----------|----------|------|\n| weight-progress | progress | --member-id | | 当前进度（已减/增多少，完成百分比） |\n| weight-trend | trend | --member-id | --days (默认 30) | 体重趋势（N 天变化，平均变化速率） |\n| calorie-balance | calorie-balance | --member-id | --days (默认 7) | 热量收支（含饮食摄入 + 运动消耗 + TDEE 估算） |\n| weekly-report | weekly-report | --member-id | --end-date | 周报（体重变化 + 饮食热量 + 运动统计 + 建议） |\n| weight-projection | projection | --member-id | | 按当前速度预测达标日期 |\n\n### exercise.py — 运动记录\n\n| 动作 | 子命令 | 必要参数 | 可选参数 | 说明 |\n|------|--------|----------|----------|------|\n| add-exercise | add | --member-id, --exercise-type | --exercise-name, --duration, --calories-burned, --exercise-date, --exercise-time, --intensity, --note | 添加运动记录 |\n| list-exercises | list | --member-id | --exercise-type, --start-date, --end-date, --limit | 查看运动记录 |\n| delete-exercise | delete | --id | | 删除运动记录 |\n| exercise-summary | daily-summary | --member-id | --date | 某日运动摘要 |\n\n### body_stats.py — 身体指标与围度\n\n| 动作 | 子命令 | 必要参数 | 可选参数 | 说明 |\n|------|--------|----------|----------|------|\n| calculate-bmi | bmi | --member-id | | 计算 BMI（中国标准分级） |\n| calculate-bmr-tdee | bmr-tdee | --member-id | --activity-level | 计算 BMR 和 TDEE（Mifflin-St Jeor 公式） |\n| suggest-calories | suggest-calories | --member-id | --activity-level, --goal-type | 根据 TDEE + 目标类型推算每日热量目标 |\n| add-measurement | add-measurement | --member-id, --type, --value | --measured-at, --note | 记录身体围度 |\n| list-measurements | list-measurements | --member-id | --type, --limit | 查看围度记录历史 |\n| body-summary | body-summary | --member-id | | 综合身体报告（BMI + 围度变化 + 体脂率趋势） |\n\n## BMI/BMR/TDEE 说明\n\n### BMI 分级（中国标准）\n- < 18.5：偏瘦\n- 18.5 - 24：正常\n- 24 - 28：超重\n- >= 28：肥胖\n\n### BMR 公式（Mifflin-St Jeor）\n- 男: BMR = 10 × 体重(kg) + 6.25 × 身高(cm) - 5 × 年龄 + 5\n- 女: BMR = 10 × 体重(kg) + 6.25 × 身高(cm) - 5 × 年龄 - 161\n\n### TDEE 活动系数\n| 活动水平 | 系数 | 说明 |\n|----------|------|------|\n| sedentary | 1.2 | 久坐不动 |\n| light | 1.375 | 轻度活动（每周1-3次） |\n| moderate | 1.55 | 中度活动（每周3-5次） |\n| active | 1.725 | 高度活动（每周6-7次） |\n| very_active | 1.9 | 极高活动（高强度体力劳动） |\n\n### 热量推算规则\n- 减重: TDEE - 500 kcal（约每周减 0.45kg）\n- 增重: TDEE + 300 kcal\n- 维持: TDEE\n- 最低限制: 男 1500 kcal / 女 1200 kcal\n\n## 身体围度类型\n\n| 类型 | 说明 | 单位 | 范围 |\n|------|------|------|------|\n| waist | 腰围 | cm | 30-200 |\n| hip | 臀围 | cm | 30-200 |\n| chest | 胸围 | cm | 30-200 |\n| arm | 臂围 | cm | 10-80 |\n| thigh | 大腿围 | cm | 20-100 |\n| body_fat | 体脂率 | % | 2-60 |\n\n## 使用流程\n\n1. 确认成员身份\n2. 记录身高体重（通过 `mediwise-health-tracker` 的 `add-metric` 动作，type 填 weight / height）\n3. 使用 `calculate-bmi` 计算 BMI\n4. 使用 `calculate-bmr-tdee` 计算基础代谢和每日总消耗\n5. 使用 `set-goal` 设定体重管理目标（自动推算热量目标）\n6. 定期通过 `mediwise-health-tracker` 记录体重\n7. 通过 `diet-tracker` 记录每日饮食\n8. 通过 `add-exercise` 记录运动消耗\n9. 使用 `calorie-balance` 查看热量收支（含运动消耗）\n10. 使用 `add-measurement` 记录身体围度\n11. 使用 `body-summary` 查看综合身体报告\n12. 使用 `weekly-report` 获取综合周报（含运动统计）\n13. 使用 `weight-projection` 预测达标日期\n\n## 注意事项\n\n- **每次调用脚本必须携带 `--owner-id`（强制）**：从会话上下文获取发送者 ID（格式 `<channel>:<user_id>`，如 `feishu:ou_xxx` 或 `qqbot:12345`），作为所有脚本的 `--owner-id` 参数，不得省略。\n- goal_type 支持: lose（减重）、gain（增重）、maintain（维持）\n- 每个成员同时只能有一个 active 状态的目标\n- 体重数据通过 health_metrics 表记录，本 skill 只读取不写入体重数据\n- 热量收支分析需要 diet-tracker 的饮食记录支持\n- 运动消耗数据通过 exercise_records 表记录\n- BMI/BMR/TDEE 计算需要成员有身高、体重、性别和出生日期信息\n- 身体围度数据存储在 health_metrics 表中，与其他健康指标共用\n- 预测功能基于近期体重变化趋势，仅供参考\n- **附件管理**：身材照片、运动截图等文件的上传和管理通过 `mediwise-health-tracker` 的附件功能完成（`attachment.py`），本 skill 不直接处理文件存储。使用 `add-attachment` 动作并指定 category 为 `body_photo` 或 `exercise_photo`\n\nFile v2.0.7:README.md\n\n# MediWise Health Suite - 家庭健康管理套件\n\n<div align=\"center\">\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![OpenClaw](https://img.shields.io/badge/OpenClaw-Compatible-blue.svg)](https://openclaw.ai)\n[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)\n[![Status](https://img.shields.io/badge/Status-Active%20Development-green.svg)]()\n\n**家庭健康管理助手**\n\n从日常记录到健康追踪的完整解决方案\n\n[快速开始](#快速开始) • [功能介绍](#功能介绍) • [安装方法](#安装方法) • [使用示例](#使用示例)\n\n</div>\n\n---\n\n## 📋 简介\n\nMediWise Health Suite 是一个为 OpenClaw AI 设计的家庭健康管理助手。帮助你记录和管理健康数据，追踪饮食和体重，为家庭健康保驾护航。\n\n**核心价值**：平时能记、能查、能追踪；数据本地存储，保护隐私。默认数据库拆分为医疗与生活方式两库，便于隔离与权限控制。\n\n## 🏗 项目架构图（技术设计）\n\n```text\n┌──────────────────────────────────────────────────────────────────────────────┐\n│                           用户 / 聊天入口（OpenClaw）                        │\n└───────────────────────────────┬──────────────────────────────────────────────┘\n                                │ action + params + owner_id\n                                ▼\n┌──────────────────────────────────────────────────────────────────────────────┐\n│                 Node.js 技能路由层（各 skill 的 index.js）                  │\n│  - 路由 action -> script(args)                                               │\n│  - 统一 subprocess 调 python3                                                │\n│  - 注入 MEDIWISE_OWNER_ID 做多用户隔离                                       │\n└───────────────┬───────────────────────────────────────────────┬──────────────┘\n                │                                               │\n                ▼                                               ▼\n   ┌─────────────────────────────┐                 ┌─────────────────────────────┐\n   │  Health Tracker (Python)    │                 │  其他领域技能 (Python)      │\n   │  - member / medical_record  │                 │  - diet-tracker             │\n   │  - health_metric / reminder │                 │  - weight-manager           │\n   │  - visit_lifecycle / notes  │                 │  - wearable-sync            │\n   │  - checkup/doctor report    │                 │  - health-monitor           │\n   └───────────────┬─────────────┘                 └───────────────┬─────────────┘\n                   │                                               │\n                   └──────────────────────┬────────────────────────┘\n                                          ▼\n                         ┌─────────────────────────────────┐\n                         │      shared 公共层              │\n                         │  - path_setup.py                │\n                         │  - metric_utils.py              │\n                         └─────────────────┬───────────────┘\n                                           ▼\n                   ┌────────────────────────────────────────────────────┐\n                   │         数据访问层：health_db.py（SQLite）          │\n                   │  Domain 路由：medical / lifestyle                  │\n                   │  事务、审计、owner 校验                             │\n                   └───────────────┬──────────────────────┬─────────────┘\n                                   │                      │\n                                   ▼                      ▼\n                     ┌──────────────────────┐   ┌──────────────────────┐\n                     │ medical.db           │   │ lifestyle.db         │\n                     │ members/visits/...   │   │ diet/weight/wearable │\n                     │ health_metrics/...   │   │ sync_log/...         │\n                     └──────────────────────┘   └──────────────────────┘\n\n外部集成（可选）：\n  - Wearable Provider: gadgetbridge / apple_health / garmin / huawei / zepp / openwearables\n  - 视觉识别模型：图片/PDF 走外部模型（通过 setup 配置）\n  - Backend API 模式（可切换）\n```\n\n## 🗺 项目使用图\n\n```text\n[用户发起请求]\n      │\n      ▼\n[确定 owner_id]\n      │\n      ▼\n[先列成员并确认“为哪位成员操作”]\n      │\n      ├──────────────┐\n      │              │\n      ▼              ▼\n[文本录入]      [图片/PDF录入]\n(就诊/症状/用药/指标)  (外部视觉模型识别后写入)\n      │              │\n      └───────┬──────┘\n              ▼\n         [落库到 SQLite]\n              │\n              ├───────────────────────────────┐\n              │                               │\n              ▼                               ▼\n      [饮食/体重管理]                    [可穿戴同步]\n      - food_lookup先查再记餐            - 拉取设备数据\n      - 热量/营养统计                     - 去重写入 health_metrics\n                                          - 自动触发 monitor 检查\n              │                               │\n              └───────────────┬───────────────┘\n                              ▼\n                       [监测与提醒/告警]\n                              │\n                              ▼\n                 [健康简报 / 就医前摘要 / 导出]\n```\n\n---\n\n## ✨ 功能状态\n\n### ✅ 已实现功能\n\n#### 🏥 健康档案管理\n- 家庭成员信息管理\n- 病程记录（门诊、住院、急诊）\n- 用药追踪与提醒\n- 日常健康指标（血压、血糖、心率等）\n- 图片识别（化验单、体检报告、处方）\n- 就医前摘要生成（文本/图片/PDF）\n\n#### 🍎 饮食追踪\n- 饮食记录与营养分析\n- 热量计算\n- 营养素统计\n\n#### ⚖ 体重管理\n- 体重记录与趋势分析\n- BMI/BMR/TDEE 计算\n- 目标设定与进度追踪\n\n### ⚠ 部分实现功能（待完善）\n\n#### 📊 智能监测与提醒（待完善）\n- 多级健康告警\n- 趋势分析与异常检测\n- 用药提醒、复查提醒\n\n#### ⌚ 可穿戴设备同步\n- ✅ **佳明（Garmin）**：Garmin Connect 账号直连，支持心率、睡眠分期、HRV、身体电量（Body Battery）、压力、步数、血氧、活动记录\n- ✅ **Apple Watch / iPhone**：Health App 导出 export.xml/zip，支持心率、步数、血氧、睡眠、体重、血糖、血压等\n- ✅ **小米手环 / Amazfit**：Gadgetbridge 本地 SQLite 导出，支持心率、步数、血氧、睡眠\n- 🔜 华为手表、高驰（COROS）等（开发中）\n\n---\n\n## 🚀 快速开始\n\n### 安装\n\n**方式 1：从 GitHub 安装（推荐）**\n```bash\ngit clone https://github.com/JuneYaooo/mediwise-health-suite.git \\\n  ~/.openclaw/skills/mediwise-health-suite\n```\n\n**方式 2：通过 ClawdHub 安装**\n```bash\n# 从 GitHub 直接安装\nclawdhub install JuneYaooo/mediwise-health-suite\n\n# 或从市场安装（审核通过后）\nclawdhub install mediwise-health-suite\n```\n\n### 基本使用\n\n安装后，直接与 OpenClaw 对话即可：\n\n```\n\"帮我添加一个家庭成员，叫张三，是我爸爸\"\n\"帮我记录今天血压 130/85，心率 72\"\n\"帮我看看最近的健康情况\"\n\"记录今天吃了一碗米饭和一份青菜\"\n\"记录今天体重 65kg\"\n\"我准备去看医生，帮我整理一下最近的情况\"\n```\n\n---\n\n## 💡 使用示例\n\n### 添加家庭成员\n```\n用户：\"帮我添加一个家庭成员，叫张三，是我爸爸，65岁\"\n助手：好的，我来帮您添加...\n```\n\n### 记录健康指标\n```\n用户：\"帮我记录今天血压 130/85，心率 72\"\n助手：已为您记录今天的健康指标...\n```\n\n### 饮食追踪\n```\n用户：\"记录今天吃了一碗米饭和一份青菜\"\n助手：已为您记录今天的饮食...\n```\n\n### 体重管理\n```\n用户：\"记录今天体重 65kg\"\n助手：已记录体重，您的 BMI 是...\n```\n\n### 就医前准备\n```\n用户：\"我准备去看医生，帮我整理一下最近的情况\"\n助手：好的，我先为您生成一份就医前摘要...\n```\n\n### 绑定佳明手表\n```\n用户：\"帮我绑定佳明手表\"\n助手：好的，请问您的手表型号是？（如 Fenix 7、Forerunner 965 等）\n用户：\"Fenix 7\"\n助手：需要您的 Garmin Connect 登录邮箱和密码，凭据仅保存在本地...\n用户：\"邮箱 xxx@gmail.com 密码 xxx\"\n助手：正在连接 Garmin Connect，验证成功！正在同步近 7 天数据...\n       已同步：心率 1240 条、睡眠 7 条、身体电量 2016 条、HRV 7 条\n```\n\n---\n\n## 👪 家庭共用场景\n\n### 一家人在同一个群里使用\n\n在 QQ 群、飞书群等群聊中，多个家庭成员可以共同使用同一个健康助手。系统通过发送者身份（如 QQ 号）自动隔离数据，**每个人只能看到和管理自己添加的记录**。\n\n```\n张三: @健康 帮我记录今天血压 135/88\n助手: 已为您记录血压 135/88。\n\n李四: @健康 帮我看看最近的健康情况\n助手: [只显示李四自己的数据，看不到张三的]\n```\n\n### 为家人代管健康\n\n每个用户可以为自己和家人创建独立的健康档案：\n\n```\n张三: @健康 帮我添加一个家庭成员，叫张爸爸，是我爸爸，65岁\n助手: 好的，已添加家庭成员\"张爸爸\"\n\n张三: @健康 帮张爸爸记录今天血压 150/95\n助手: 已为张爸爸记录血压 150/95。收缩压偏高，建议关注。\n```\n\n### 隔离机制\n\n| 场景 | 隔离方式 |\n|------|---------|\n| 不同用户在同一群里 | 自动按发送者身份隔离，互不可见 |\n| 同一用户的多个家庭成员 | 通过成员管理区分，用户可切换查看 |\n| 不同群聊 | 可配置为同一或不同 Agent，数据独立 |\n\n详细配置方法参见 [Agent 配置指南](docs/AGENT_SETUP.md)。\n\n---\n\n## 📦 包含的功能模块\n\n| 模块 | 状态 | 功能 |\n|------|------|------|\n| 健康档案 | ✅ 已实现 | 成员管理、病程记录、用药追踪、健康指标 |\n| 饮食追踪 | ✅ 已实现 | 饮食记录、营养分析、热量计算 |\n| 体重管理 | ✅ 已实现 | 体重记录、BMI/BMR/TDEE 计算、趋势分析 |\n| 健康监测 | ⚠ 待完善 | 智能告警、趋势分析 |\n| 可穿戴设备 | ✅ 已实现 | 佳明/Apple Watch/Gadgetbridge 数据同步；HRV、身体电量、睡眠分期 |\n\n---\n\n## 🔒 数据隐私\n\n- ✅ **默认本地存储**：所有数据存储在本地 SQLite 数据库（`medical.db` 与 `lifestyle.db`）\n- ✅ **不上传云端**：默认配置下，不上传任何个人健康信息\n- ✅ **可选功能**：后端 API、向量搜索等高级功能需用户主动配置启用\n- ✅ **多租户隔离**：支持共享实例场景的数据隔离\n- ✅ **发布安全**：数据库、附件、导出文件默认被 `.gitignore` / `.clawdhubignore` 排除\n\n**重要**：项目包含可选的后端 API 和向量搜索功能，但默认关闭。所有云端功能需用户主动配置才会启用。\n\n---\n\n## 📋 系统要求\n\n- Python 3.8+\n- SQLite 3.x\n- OpenClaw 2026.3.0+\n- 操作系统：Linux / macOS / Windows\n\n---\n\n## 📄 许可证\n\n本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件\n\n---\n\n## ⚠ 免责声明\n\n本工具仅供健康信息记录和参考，不构成医疗建议。任何健康问题请咨询专业医生。\n\n---\n\n<div align=\"center\">\n\n**⭐ 如果这个项目对你有帮助，请给个 Star！**\n\nMade with ❤ by MediWise Team\n\n</div>\n\nFile v2.0.7:_meta.json\n\n{\n  \"ownerId\": \"kn76gz2yb53tdjgpmb3ydjexax82g5yr\",\n  \"slug\": \"mediwise-health-suite\",\n  \"version\": \"2.0.7\",\n  \"publishedAt\": 1775537537975\n}\n\nFile v2.0.7:mediwise-health-tracker/references/cycle-attachments-multitenancy.md\n\n# Cycle, Attachments, and Multi-Tenancy\n\n## 目录\n\n- 周期追踪\n- 附件管理\n- 多租户隔离\n\n## 周期追踪\n\n支持经期和周期性疾病事件记录、预测、提醒与关怀。\n\n### 常用命令\n\n```bash\npython3 {baseDir}/scripts/cycle_tracker.py record --member-id <id> --cycle-type menstrual --event-type period_start --date 2025-03-01\npython3 {baseDir}/scripts/cycle_tracker.py record --member-id <id> --cycle-type menstrual --event-type period_end --date 2025-03-06\npython3 {baseDir}/scripts/cycle_tracker.py predict --member-id <id> --cycle-type menstrual\npython3 {baseDir}/scripts/cycle_tracker.py status --member-id <id> --cycle-type menstrual\npython3 {baseDir}/scripts/cycle_tracker.py history --member-id <id> --cycle-type menstrual --limit 12\npython3 {baseDir}/scripts/reminder.py auto-cycle --member-id <id> --cycle-type menstrual\n```\n\n### 返回重点\n\n- `predict`：预计开始时间、平均周期、排卵期、易孕窗、置信度\n- `status`：当前阶段、关怀建议\n\n## 附件管理\n\n### 添加与查看\n\n```bash\npython3 {baseDir}/scripts/attachment.py add --member-id <id> --source-path /path/to/report.jpg --category lab_report --description \"2025年3月化验单\"\npython3 {baseDir}/scripts/attachment.py list --member-id <id>\npython3 {baseDir}/scripts/attachment.py get --id <attachment_id>\n```\n\n### 关联、删除、导出\n\n```bash\npython3 {baseDir}/scripts/attachment.py link --attachment-id <id> --record-type lab_result --record-id <record_id>\npython3 {baseDir}/scripts/attachment.py unlink --attachment-id <id> --record-type lab_result --record-id <record_id>\npython3 {baseDir}/scripts/attachment.py delete --id <attachment_id>\npython3 {baseDir}/scripts/attachment.py delete --id <attachment_id> --purge\npython3 {baseDir}/scripts/attachment.py get --id <attachment_id> --base64\npython3 {baseDir}/scripts/attachment.py serve --port 9120\npython3 {baseDir}/scripts/attachment.py get-url --id <attachment_id> --secret <server_secret>\n```\n\n### 规则\n\n- 支持分类：`body_photo`、`food_photo`、`medical_image`、`lab_report`、`prescription`、`exercise_photo`、`other`\n- 同一成员上传相同文件会按 SHA256 去重\n- 文件大小上限 50MB\n- 一张附件可关联多条记录\n\n## 多租户隔离\n\n共享机器人实例下，通过 `owner_id` 在成员层做隔离。\n\n### 工作原理\n\n`owner_id` 是发送者的平台用户 ID（如 QQ 号、飞书用户 ID 等），由路由层自动传入：\n\n1. 用户在群聊中发消息 → 平台提供发送者 ID\n2. `index.js` 路由层自动将发送者 ID 作为 `owner_id` 参数传给脚本\n3. 脚本中的所有查询和写入都带上 `owner_id` 过滤（数据存储在 `medical.db` / `lifestyle.db`）\n\n**结果**：同一群聊中，不同用户的数据完全隔离，互相不可见。\n\n### 核心规则\n\n- 添加成员时带 `--owner-id`\n- 列出成员时带 `--owner-id`\n- 家庭概况、简报、搜索都带 `--owner-id`\n- 不传 `--owner-id` 时视为本地 CLI 模式（开发/单用户场景）\n\n### 家庭群聊场景示例\n\n```\n# 张三（QQ: 111）在群里添加家庭成员\n→ member.py add --name \"妈妈\" --relation \"母亲\" --owner-id \"qq_111\"\n\n# 李四（QQ: 222）在同一个群里添加家庭成员\n→ member.py add --name \"妈妈\" --relation \"母亲\" --owner-id \"qq_222\"\n\n# 这是两份独立的\"妈妈\"档案，互不影响\n\n# 张三查看全家概况 → 只看到自己的成员\n→ query.py family-overview --owner-id \"qq_111\"\n\n# 李四查看全家概况 → 只看到自己的成员\n→ query.py family-overview --owner-id \"qq_222\"\n```\n\n### 命令示例\n\n```bash\npython3 {baseDir}/scripts/member.py add --name \"张三\" --relation \"本人\" --owner-id \"qq_12345\"\npython3 {baseDir}/scripts/member.py list --owner-id \"qq_12345\"\npython3 {baseDir}/scripts/query.py family-overview --owner-id \"qq_12345\"\npython3 {baseDir}/scripts/health_advisor.py briefing --owner-id \"qq_12345\"\npython3 {baseDir}/scripts/query.py search --keyword \"高血压\" --owner-id \"qq_12345\"\n```\n\n通过 `index.js` 调用时，只要 `inputs` 中带 `owner_id`，路由层会自动追加对应参数。\n\nFile v2.0.7:mediwise-health-tracker/references/drug-briefing.md\n\n# Drug Safety and Briefing\n\n## 目录\n\n- 药物安全查询规则\n- DDInter / openFDA / 网页搜索\n- 结果呈现\n- 健康建议与简报\n- 数据导出与在线计算器\n\n## 药物安全查询规则\n\n凡是涉及以下问题，必须先查再答，不能凭记忆：\n\n- 药物交互\n- 用药禁忌\n- 不良反应\n- 药物 + 酒精\n- 药物 + 食物\n- 中成药安全\n\n通过 DDInter、openFDA 或网页搜索查询，统一使用来源筛选、引用格式和免责声明。\n\n## 查询方式\n\n### DDInter\n\n```bash\npython3 {baseDir}/scripts/drug_interaction.py check --member-id <id> --drug-name \"布洛芬\"\npython3 {baseDir}/scripts/drug_interaction.py check-pair --drug-a \"阿司匹林\" --drug-b \"华法林\"\npython3 {baseDir}/scripts/drug_interaction.py lookup --name \"奥美拉唑\"\npython3 {baseDir}/scripts/drug_interaction.py search --name \"阿司匹林\"\n```\n\n适合两种西药之间的交互检查。\n\n### openFDA\n\n```bash\npython3 {baseDir}/scripts/openfda_query.py interaction --name \"warfarin\"\npython3 {baseDir}/scripts/openfda_query.py check-pair --drug-a \"warfarin\" --drug-b \"aspirin\"\npython3 {baseDir}/scripts/openfda_query.py search --name \"metformin\"\n```\n\n适合作为英文结构化补充验证来源。\n\n### 网页搜索\n\n- 中成药、安全说明、药酒同服、药食同服等优先走网页搜索\n- 来源优先级：权威医学数据库 > 官方说明书 > 可靠医学网站\n- 正文关键结论必须带 `[1][2]`\n\n## 结果呈现\n\n- **严重**：明确警告，不建议自行合用\n- **中等**：提示注意，建议咨询药师或医生\n- **轻微**：说明风险较低，但仍需遵医嘱\n\n每次药物安全类回复都要：\n\n1. 给出直接结论\n2. 说明依据并标注编号引用\n3. 列出真实来源链接\n4. 追加免责声明\n\n查不到时，直接说“未查到标准交互数据，建议咨询药师确认”。\n\n## 健康建议与简报\n\n```bash\npython3 {baseDir}/scripts/health_advisor.py tips --member-id <id>\npython3 {baseDir}/scripts/health_advisor.py briefing\n```\n\n### 强制：简报默认发图片版\n\n当用户要“简报”“报告”“健康报告”时，默认用截图 PNG：\n\n```bash\npython3 {baseDir}/scripts/briefing_report.py screenshot --member-id <id>\n```\n\n拿到 `image_path` 后，用 `<qqimg>` 发送：\n\n```text\n这是你的健康简报：\n<qqimg>/path/to/briefing.png</qqimg>\n```\n\n不要说“无法发送图片”或“QQ 不支持”。\n\n### 通用 HTML 截图\n\n```bash\npython3 {baseDir}/scripts/html_screenshot.py <input.html> [output.png] [--width 960]\n```\n\n## 数据导出与在线计算器\n\n### 导出\n\n```bash\npython3 {baseDir}/scripts/export.py fhir --member-id <id>\npython3 {baseDir}/scripts/export.py statistics\n```\n\n### 在线计算器\n\n需要 BMI、eGFR、CHA₂DS₂-VASc、CURB-65、MELD 等计算时，优先给权威在线工具链接，而不是在本地手算：\n\n- 医脉通：`https://cals.medlive.cn/`\n- MSD 临床计算器：`https://www.msdmanuals.cn/professional/pages-with-widgets/clinical-calculators`\n- MDCalc：`https://www.mdcalc.com/`\n\nFile v2.0.7:mediwise-health-tracker/references/intake-query-vision.md\n\n# Intake, Query, and Vision\n\n## 目录\n\n- 录入路径选择\n- 查询结果自然语言化\n- 图片 / PDF / 文本智能录入\n- 多附件处理流程\n\n## 录入路径选择\n\n### 简单指标\n\n以下场景优先 `quick_entry.py`，因为它不依赖 LLM，速度更快：\n\n- 血压\n- 血糖\n- 心率\n- 体温\n- 体重\n- 血氧\n\n```bash\npython3 {baseDir}/scripts/quick_entry.py parse --text \"血压130/85 心率72\" --member-id <id> --owner-id \"<sender_id>\"\npython3 {baseDir}/scripts/quick_entry.py parse-and-save --text \"血压130/85 心率72\" --member-id <id> --owner-id \"<sender_id>\"\n```\n\n如果返回 `fallback: true`，再切换到 `smart_intake.py`。\n\n### 复杂文本或结构化记录\n\n```bash\npython3 {baseDir}/scripts/smart_intake.py extract --text \"今天血压135/88，心率72\" --member-id <id>\npython3 {baseDir}/scripts/medical_record.py add-visit --member-id <id> --visit-type \"门诊\" --visit-date \"2025-01-15\" --hospital \"人民医院\" --diagnosis \"高血压\"\npython3 {baseDir}/scripts/medical_record.py add-medication --member-id <id> --name \"氨氯地平\" --dosage \"5mg\" --frequency \"每日一次\"\n```\n\n### 录入后自动观察\n\n以下情况建议补记到 `memory.py add-observation`：\n\n- 指标异常\n- 新增诊断\n- 新增或变更用药\n- 停药\n\n## 查询结果自然语言化\n\n### 必须做的改写\n\n- 体征查询：描述趋势，不要只堆数字\n- 用药查询：按清单展示药名、剂量、频率、开始时间\n- 健康摘要：突出重点，不要把全部字段都念一遍\n- 时间线：按时间讲述发生了什么\n\n### 示例\n\n```text\n错误：{\"type\":\"blood_pressure\",\"value\":\"{\\\"systolic\\\":140,\\\"diastolic\\\":90}\"}\n正确：最近一次血压是 140/90 mmHg，收缩压偏高；最近一周整体略高但相对稳定，建议继续监测。\n```\n\n## 图片 / PDF / 文本智能录入\n\n### 强制规则\n\n**不要使用自身视觉能力读取医疗图片。** 所有图片 / PDF 识别必须通过外部视觉模型。\n\n### 首次使用先检查配置\n\n```bash\npython3 {baseDir}/scripts/setup.py check\n```\n\n如果 `vision_configured: false`：\n\n1. 告知用户需要先配置视觉模型\n2. 推荐 SiliconFlow 的 `Qwen/Qwen2.5-VL-72B-Instruct`（国内首选）或 Google Gemini `gemini-3.1-pro-preview`（海外首选）\n3. 用户给出 API Key 后执行配置\n4. 再运行测试验证\n\n```bash\npython3 {baseDir}/scripts/setup.py set-vision --provider siliconflow --model \"Qwen/Qwen2.5-VL-72B-Instruct\" --api-key <KEY> --base-url \"https://api.siliconflow.cn/v1\"\n# 用内置测试图测试（需 references/test-vision.jpg 存在）：\npython3 {baseDir}/scripts/setup.py test-vision\n# 或指定任意本地图片测试（推荐）：\npython3 {baseDir}/scripts/setup.py test-vision --image /path/to/any_lab_report.jpg\n```\n\n### 已配置后处理附件\n\n```bash\npython3 {baseDir}/scripts/smart_intake.py extract --image /path/to/image.jpg --member-id <id>\npython3 {baseDir}/scripts/smart_intake.py extract --pdf /path/to/report.pdf --member-id <id>\npython3 {baseDir}/scripts/smart_intake.py extract --text \"今天血压135/88，心率72\" --member-id <id>\n```\n\n## 多附件处理流程\n\n用户连续发送多张图片时：\n\n1. 先累积，回复“收到，还有更多要发的吗？发完告诉我。”\n2. 用户确认发完后，再逐个调用 `smart_intake.py extract`\n3. 汇总所有提取结果，按类型分组给用户核对\n4. 用户确认后再正式录入\n\n不要每收到一张图就立即处理、立即确认。\n\nArchive v2.0.6: 104 files, 351186 bytes\n\nFiles: CHANGELOG.md (3389b), CONTRIBUTING.md (2799b), diet-tracker/agents/openai.yaml (239b), diet-tracker/index.js (6336b), diet-tracker/package.json (290b), diet-tracker/scripts/diet.py (20650b), diet-tracker/scripts/food_lookup.py (18742b), diet-tracker/scripts/nutrition_goal.py (10671b), diet-tracker/scripts/nutrition.py (8742b), diet-tracker/SKILL.md (6777b), docs/AGENT_SETUP.md (9170b), docs/HEALTH-MANAGEMENT-OVERVIEW.md (9478b), docs/INSTALLATION.md (12811b), health-monitor/agents/openai.yaml (247b), health-monitor/index.js (3737b), health-monitor/package.json (294b), health-monitor/scripts/alert.py (5785b), health-monitor/scripts/check.py (11696b), health-monitor/scripts/dashboard.py (7232b), health-monitor/scripts/test_check.py (5130b), health-monitor/scripts/threshold.py (10288b), health-monitor/scripts/trend.py (11276b), health-monitor/SKILL.md (7800b), install-check.sh (4703b), mediwise-health-tracker/agents/openai.yaml (277b), mediwise-health-tracker/DREAM.md (7215b), mediwise-health-tracker/index.js (21309b), mediwise-health-tracker/package.json (267b), mediwise-health-tracker/references/cycle-attachments-multitenancy.md (4108b), mediwise-health-tracker/references/drug-briefing.md (3042b), mediwise-health-tracker/references/intake-query-vision.md (3476b), mediwise-health-tracker/references/visit-prep.md (3740b), mediwise-health-tracker/scripts/api_client.py (7152b), mediwise-health-tracker/scripts/attachment.py (24074b), mediwise-health-tracker/scripts/briefing_report.py (22279b), mediwise-health-tracker/scripts/checkup_report.py (20520b), mediwise-health-tracker/scripts/chronic_disease.py (15480b), mediwise-health-tracker/scripts/config.py (14567b), mediwise-health-tracker/scripts/cycle_tracker.py (17024b), mediwise-health-tracker/scripts/daily_snapshot.py (13846b), mediwise-health-tracker/scripts/doctor_visit_report.py (35800b), mediwise-health-tracker/scripts/dream.py (14858b), mediwise-health-tracker/scripts/drug_interaction.py (25127b), mediwise-health-tracker/scripts/embedding_provider.py (5820b), mediwise-health-tracker/scripts/export.py (16571b), mediwise-health-tracker/scripts/health_advisor.py (24799b), mediwise-health-tracker/scripts/health_db.py (50812b), mediwise-health-tracker/scripts/health_memory.py (9859b), mediwise-health-tracker/scripts/health_metric.py (9101b), mediwise-health-tracker/scripts/html_screenshot.py (6791b), mediwise-health-tracker/scripts/medical_record.py (30516b), mediwise-health-tracker/scripts/medication_log.py (5373b), mediwise-health-tracker/scripts/member.py (10836b), mediwise-health-tracker/scripts/memory.py (27129b), mediwise-health-tracker/scripts/metric_utils.py (4433b), mediwise-health-tracker/scripts/openfda_query.py (7021b), mediwise-health-tracker/scripts/privacy.py (7953b), mediwise-health-tracker/scripts/query.py (22175b), mediwise-health-tracker/scripts/quick_entry.py (8174b), mediwise-health-tracker/scripts/reminder.py (22169b), mediwise-health-tracker/scripts/setup.py (38455b), mediwise-health-tracker/scripts/smart_intake.py (38872b), mediwise-health-tracker/scripts/test_authorization.py (9551b), mediwise-health-tracker/scripts/test_smart_intake.py (28984b), mediwise-health-tracker/scripts/validators.py (7092b), mediwise-health-tracker/scripts/vector_search.py (19946b), mediwise-health-tracker/scripts/visit_lifecycle.py (19798b), mediwise-health-tracker/SKILL.md (18843b), package.json (920b), QUICKSTART.md (8980b), README.md (13455b), requirements.txt (435b), shared/__init__.py (49b), shared/metric_utils.py (1571b), shared/path_setup.py (679b), SKILL.md (10542b), sleep-tracker/index.js (2779b), sleep-tracker/package.json (290b), sleep-tracker/scripts/sleep.py (13914b), sleep-tracker/SKILL.md (3312b)\n\nFile v2.0.6:diet-tracker/SKILL.md\n\n---\nname: diet-tracker\ndescription: \"Diet and nutrition tracking: log meals, manage food items, view daily/weekly nutrition summaries, analyze calorie trends. Integrates with mediwise-health-tracker and weight-manager.\"\n---\n\n# diet-tracker\n\n## 概述\n\n提供每餐饮食记录、食物条目管理、每日/每周营养摘要、热量趋势分析等功能。与 `mediwise-health-tracker` 共享数据库，可与 `weight-manager` 联动形成\"饮食 → 热量 → 体重\"完整闭环。\n\n## 数据模型\n\n### diet_records（一餐记录）\n| 字段 | 说明 |\n|------|------|\n| id | 记录 ID |\n| member_id | 成员 ID |\n| meal_type | 餐次: breakfast/lunch/dinner/snack |\n| meal_date | 日期 YYYY-MM-DD |\n| meal_time | 时间 HH:MM（可选） |\n| total_calories | 总热量 kcal |\n| total_protein | 总蛋白质 g |\n| total_fat | 总脂肪 g |\n| total_carbs | 总碳水 g |\n| total_fiber | 总膳食纤维 g |\n| note | 备注 |\n\n### diet_items（食物条目）\n| 字段 | 说明 |\n|------|------|\n| id | 条目 ID |\n| record_id | 关联 diet_records.id |\n| food_name | 食物名称 |\n| amount | 数量 |\n| unit | 单位（g/ml/份/个等） |\n| calories | 热量 kcal |\n| protein | 蛋白质 g |\n| fat | 脂肪 g |\n| carbs | 碳水 g |\n| fiber | 膳食纤维 g |\n| note | 备注 |\n\n## 功能列表\n\n### diet.py — 饮食记录 CRUD\n\n| 动作 | 子命令 | 必要参数 | 可选参数 | 说明 |\n|------|--------|----------|----------|------|\n| add-meal | add-meal | --member-id, --meal-type, --meal-date | --meal-time, --note, --items (JSON) | 添加一餐记录（可同时包含多个食物条目） |\n| add-item | add-item | --record-id, --food-name | --amount, --unit, --calories, --protein, --fat, --carbs, --fiber, --note | 向已有餐次追加食物条目 |\n| list | list | --member-id | --date, --start-date, --end-date, --meal-type, --limit | 查看饮食记录 |\n| delete | delete | --id | --type (record/item) | 删除记录或条目 |\n| daily-summary | daily-summary | --member-id, --date | | 某日营养摘要 |\n\n### nutrition.py — 营养分析\n\n| 动作 | 子命令 | 必要参数 | 可选参数 | 说明 |\n|------|--------|----------|----------|------|\n| weekly-summary | weekly-summary | --member-id | --end-date | 一周营养趋势（每日热量、平均三大营养素） |\n| calorie-trend | calorie-trend | --member-id | --days (默认 7) | 热量趋势分析（N 天每日总热量） |\n| nutrition-balance | nutrition-balance | --member-id | --days (默认 7) | 三大营养素比例分析 |\n\n### food_lookup.py — 食物营养查询\n\n| 动作 | 子命令 | 必要参数 | 可选参数 | 说明 |\n|------|--------|----------|----------|------|\n| food-lookup | search | params.query | params.limit (默认5), params.source (auto/cfcd/brands/usda) | 三层数据源搜索食物营养（CFCD6 → 中国品牌外食 → USDA） |\n| food-stats | stats | — | — | 查看食物数据库概况（各数据源条目数） |\n\n数据来源（按优先级）：\n1. **CFCD6**（离线）：《中国食物成分表标准版第6版》1657 条，覆盖粮谷、肉蛋奶、蔬果、水产等\n2. **cn-brands**（离线）：339 条，奶茶、外卖、便利店、火锅等外食场景\n3. **USDA FoodData Central**（在线）：国际食材兜底，需配置 `USDA_API_KEY` 环境变量\n\n## 使用流程\n\n**记录一餐的标准流程（不得跳步）：**\n\n1. 确认成员身份（通过 mediwise-health-tracker 的 list-members）\n2. **逐一查询每种食物的营养数据**（`food-lookup search`，见下方\"强制规则\"）\n3. 用查询到的营养数据调用 `add-meal`，通过 `--items` JSON 一次录入多个食物\n4. 如需追加食物，使用 `add-item` 向已有餐次添加\n5. 使用 `daily-summary` 查看当天营养摄入\n6. 使用 `weekly-summary` 或 `calorie-trend` 查看长期趋势\n\n## 营养数据强制规则\n\n**禁止用 AI 自身知识直接估算营养数值写入数据库。** 记录每种食物之前，必须先调用 `food-lookup search` 查询，用数据库返回的数据填充 `--items`。\n\n> **自动填充说明**：若 `--items` 中某条目未提供热量数据，`diet.py` 会自动调用内部 food_lookup 数据库补全营养值，并在 `note` 字段标注 `[自动填充]` 及数据来源。此行为仅查询本地数据库（不调用外部 API），补全结果与显式 `food-lookup search` 一致。agent 仍应优先显式查询以便向用户展示候选项，但自动填充是兜底保障而非绕过规则。\n\n```bash\n# 步骤 1：先查每种食物\npython3 {baseDir}/scripts/food_lookup.py search --query \"炸排骨\" --owner-id \"<sender_id>\"\npython3 {baseDir}/scripts/food_lookup.py search --query \"米饭\" --owner-id \"<sender_id>\"\n\n# 步骤 2：用查询结果里的营养数据填 --items，再记录\npython3 {baseDir}/scripts/diet.py add-meal \\\n  --member-id <id> --meal-type lunch --meal-date 2025-03-15 \\\n  --items '[{\"food_name\":\"炸排骨\",\"amount\":150,\"unit\":\"g\",\"calories\":298,\"protein\":21.2,\"fat\":19.3,\"carbs\":9.1,\"note\":\"来源:CFCD6\"}]' \\\n  --owner-id \"<sender_id>\"\n```\n\n**查询未命中时的处理：**\n- 三层数据源（CFCD6 → 中国品牌外食 → USDA）都未找到时，告知用户\"未查到该食物的营养数据\"，**询问用户是否手动输入营养值，或跳过该条目**，不得自行估算后直接写入。\n- 查到多个候选项时，展示给用户确认，选择最贴近的后再录入。\n- 记录时在 `note` 字段写明数据来源（如\"来源：CFCD6\"、\"来源：用户手动输入\"）。\n\n## items JSON 格式\n\n`--items` 参数接受 JSON 数组。**所有营养字段必须来自 `food-lookup search` 的查询结果**，不得由 AI 自行估算填充：\n```json\n[\n  {\"food_name\": \"鸡胸脯肉\", \"amount\": 150, \"unit\": \"g\", \"calories\": 158, \"protein\": 31.6, \"fat\": 3.2, \"carbs\": 0.0, \"note\": \"来源:CFCD6\"},\n  {\"food_name\": \"米饭\", \"amount\": 200, \"unit\": \"g\", \"calories\": 232, \"protein\": 4.6, \"fat\": 0.6, \"carbs\": 51.5, \"note\": \"来源:CFCD6\"}\n]\n```\n\n自动换算规则：CFCD6/USDA 数据按 `amount`（克）换算；中国品牌/外食数据按每份直接使用。\n\n## 注意事项\n\n- **每次调用脚本必须携带 `--owner-id`（强制）**：从会话上下文获取发送者 ID（格式 `<channel>:<user_id>`，如 `feishu:ou_xxx` 或 `qqbot:12345`），作为所有脚本的 `--owner-id` 参数，不得省略。\n- **禁止 AI 估算营养数据**：所有热量/蛋白质/脂肪/碳水/膳食纤维数值必须来自 `food-lookup search`，或经用户明确确认的手动输入，不得由 AI 凭自身知识估算后直接写入。\n- `note` 字段必须记录数据来源，便于用户事后核查。\n- meal_type 支持: breakfast（早餐）、lunch（午餐）、dinner（晚餐）、snack（加餐/零食）\n\nFile v2.0.6:health-monitor/SKILL.md\n\n---\nname: health-monitor\ndescription: >-\n  智能健康监测与告警。基于阈值检测、趋势分析和多级告警系统，\n  对家庭成员的健康指标进行持续监测，发现异常时及时预警。支持全家健康 dashboard 一屏总览。\n  Intelligent health monitoring and alerting. Uses threshold detection,\n  trend analysis, and multi-level alert system to continuously monitor\n  family members' health metrics and warn on anomalies. Supports family dashboard.\n  关键词：健康监测、异常告警、指标预警、趋势分析、健康报告、心率异常、血压异常、血氧低、告警管理、全家概览、健康dashboard。\n---\n\n# Health Monitor - 智能健康监测\n\n持续监测健康指标，多级阈值告警 + 趋势分析，发现异常及时通知。支持全家健康 dashboard 一屏总览。\n\n## 告警级别\n\n| 级别 | 含义 | 处理方式 |\n|------|------|----------|\n| info | 信息记录 | 仅记录，不主动推送 |\n| warning | 预警 | 创建 reminder 推送 |\n| urgent | 紧急 | 推送 + 标记高优先级 |\n| emergency | 危急 | 推送 + 建议立即就医或拨打急救电话 |\n\n## 默认阈值\n\n| 指标 | warning | urgent | emergency |\n|------|---------|--------|-----------|\n| 心率（高）| >100 bpm | >120 bpm | >150 bpm |\n| 心率（低）| <55 bpm | <45 bpm | <35 bpm |\n| 血氧（低）| <95% | <90% | <85% |\n| 收缩压（高）| >140 mmHg | >160 mmHg | >180 mmHg |\n| 舒张压（高）| >90 mmHg | >100 mmHg | >110 mmHg |\n| 体温（高）| >37.3°C | >38.5°C | >39.5°C |\n| 血糖空腹（高）| >6.1 mmol/L | >7.8 mmol/L | >11.1 mmol/L |\n\n支持按年龄自动调整，支持用户自定义覆盖。\n\n## 核心工作流\n\n> **强制规则**：每次调用脚本必须携带 `--owner-id`，从会话上下文获取发送者 ID（格式 `<channel>:<user_id>`，如 `feishu:ou_xxx` 或 `qqbot:12345`）。所有查询和写入操作均需携带，不得省略。\n\n### 0. 全家健康 Dashboard（首选入口）\n\n用户说「看看全家健康」「今天家人状态怎样」「健康概览」时，优先调用此接口。\n返回所有成员的风险级别、未解决告警数、最新关键指标和趋势警告。\n\n```bash\n# 全家健康一屏总览\npython3 {baseDir}/scripts/dashboard.py show\n\n# 按 owner 过滤（多租户场景）\npython3 {baseDir}/scripts/dashboard.py show --owner-id <owner_id>\n```\n\n**返回结构示例：**\n```json\n{\n  \"family_risk\": \"warning\",\n  \"family_risk_label\": \"需关注\",\n  \"total_open_alerts\": 3,\n  \"summary\": \"【紧急】张三 有紧急告警；共 3 条未解决告警\",\n  \"members\": [\n    {\n      \"name\": \"张三\",\n      \"risk_level\": \"urgent\",\n      \"risk_label\": \"紧急\",\n      \"open_alerts\": 2,\n      \"alerts\": [{\"level\": \"urgent\", \"title\": \"张三 heart_rate 高于阈值\", ...}],\n      \"latest_metrics\": {\n        \"heart_rate\": {\"value\": 125, \"unit\": \"bpm\", \"measured_at\": \"2026-03-27 08:30\"},\n        \"blood_pressure\": {\"value\": \"145/95\", \"unit\": \"mmHg\", \"measured_at\": \"2026-03-27 08:30\"}\n      },\n      \"trend_warnings\": [\"heart_rate 呈上升趋势\"]\n    }\n  ]\n}\n```\n\n### 1. 阈值管理\n\n```bash\n# 查看阈值配置（含默认+自定义）\npython3 {baseDir}/scripts/threshold.py list --member-id <id>\n\n# 自定义阈值\npython3 {baseDir}/scripts/threshold.py set --member-id <id> --type heart_rate --level warning --direction above --value 110\n\n# 恢复默认\npython3 {baseDir}/scripts/threshold.py reset --member-id <id> --type heart_rate\n```\n\n### 2. 异常检测\n\n```bash\n# 检查单个成员\npython3 {baseDir}/scripts/check.py run --member-id <id>\n\n# 检查所有成员\npython3 {baseDir}/scripts/check.py run-all\n\n# 检查最近指定时间窗口\npython3 {baseDir}/scripts/check.py run --member-id <id> --window 24h\n```\n\n### 3. 趋势分析\n\n```bash\n# 单指标趋势\npython3 {baseDir}/scripts/trend.py analyze --member-id <id> --type heart_rate --days 7\n\n# 全指标摘要\npython3 {baseDir}/scripts/trend.py report --member-id <id>\n```\n\n### 4. 告警管理\n\n```bash\n# 查看未解决告警\npython3 {baseDir}/scripts/alert.py list --member-id <id>\n\n# 按级别筛选\npython3 {baseDir}/scripts/alert.py list --member-id <id> --level urgent\n\n# 标记已解决\npython3 {baseDir}/scripts/alert.py resolve --alert-id <id>\n\n# 告警历史\npython3 {baseDir}/scripts/alert.py history --member-id <id> --limit 20\n```\n\n## 定时检测\n\n配合 wearable-sync 使用时，每次数据同步完成后会自动触发检测。\n也可单独通过 cron 定时运行：\n\n```bash\n# 每小时检测一次\n0 * * * * cd /path/to/health-monitor/scripts && python3 check.py run-all --window 1h\n```\n\n## 持续监测 + 消息推送完整配置\n\n### 架构概览\n\n```\niPhone 健康 App\n    → 导出 export.zip（手动/Shortcuts 自动）\n    → iCloud Drive 同步到 Mac / 直接传输到服务器\n    → cron: wearable-sync sync.py（导入数据）\n    → cron: health-monitor check.py（检测异常 → 写入 alerts 表）\n    → AI agent 查询告警 → 通过 IM Bot 推送给用户\n```\n\n### 第一步：配置数据同步（wearable-sync）\n\n参考 wearable-sync/SKILL.md 的「Apple Health 持续更新方案」完成设备绑定和 cron 配置。\n\n### 第二步：配置定时检测\n\n```bash\ncrontab -e\n\n# 同步数据（每小时整点）\n0 * * * * cd /path/to/wearable-sync/scripts && python3 sync.py run-all >> ~/mediwise-sync.log 2>&1\n\n# 检测异常（同步后5分钟，确保数据已写入）\n5 * * * * cd /path/to/health-monitor/scripts && python3 check.py run-all --window 2h >> ~/mediwise-check.log 2>&1\n```\n\n### 第三步：推送告警\n\n**当前架构：告警写入数据库，由 AI agent 主动查询推送。**\n\nhealth-monitor 本身不内置 IM 推送 SDK，告警通过以下方式触达用户：\n\n**方式 A：AI agent 定时巡检（推荐）**\n\n在 IM Bot（飞书/企微/钉钉）中，让 AI agent 定时调用 dashboard action 并主动发消息：\n\n```bash\n# cron 触发 agent 巡检脚本（示例）\n30 7 * * * /path/to/bot-client send-health-report --owner-id feishu:ou_xxx\n```\n\nagent 内部执行：\n1. `dashboard show` → 获取全家风险概览\n2. 若 `family_risk` 为 warning/urgent/emergency → 主动发送 IM 消息\n3. `alert-list` → 列出未解决告警，逐条通知\n\n**方式 B：cron 脚本直接调用 Bot API**\n\n```bash\n#!/bin/bash\n# /path/to/health-alert-push.sh\nRESULT=$(python3 /path/to/health-monitor/scripts/dashboard.py show --owner-id \"$1\")\nRISK=$(echo $RESULT | python3 -c \"import sys,json; d=json.load(sys.stdin); print(d.get('family_risk','ok'))\")\n\nif [ \"$RISK\" != \"ok\" ]; then\n  # 调用飞书/企微 Webhook 发送告警\n  curl -X POST \"$FEISHU_WEBHOOK\" \\\n    -H 'Content-Type: application/json' \\\n    -d \"{\\\"msg_type\\\":\\\"text\\\",\\\"content\\\":{\\\"text\\\":\\\"健康告警：$RISK，请打开 MediWise 查看详情\\\"}}\"\nfi\n```\n\n**方式 C：用户主动查询（最简单）**\n\n用户在 IM 中随时发送「看看全家健康」，agent 调用 dashboard 返回实时状态，无需后台推送。\n\n### 告警级别与推送策略建议\n\n| 级别 | 建议推送频率 | 建议渠道 |\n|------|-------------|----------|\n| info | 不推送，仅记录 | — |\n| warning | 每日早晨汇总推送一次 | IM 普通消息 |\n| urgent | 立即推送 | IM @消息 / 手机通知 |\n| emergency | 立即推送 + 重复提醒 | IM @消息 + 电话/短信 |\n\n> **当前限制**：health-monitor 不内置推送 SDK，emergency 级别需要外部脚本或 agent 逻辑实现重复提醒。建议在 agent 层对 emergency 告警做特殊处理（如每15分钟重复发送直到用户确认）。\n\n## 反模式\n\n- **不要将阈值设得过于敏感** — 容易产生告警疲劳\n- **不要忽略 emergency 级别告警** — 应立即关注\n- **趋势分析需要足够数据** — 少于 3 天数据时趋势不可靠\n\nFile v2.0.6:mediwise-health-tracker/SKILL.md\n\n---\nname: mediwise-health-tracker\ndescription: Family health and medical record management. Tracks members, visits, medications, lab results, daily metrics, reminders, briefings, and pre-visit summaries.\n---\n\n# MediWise Health Tracker\n\n家庭健康与病程记录管理技能。所有操作通过 `{baseDir}/scripts/` 下的 Python 脚本完成，默认输出 JSON，再转成自然语言回复给用户。\n\n当用户问”你可以做什么”时，记得主动提到：除了健康档案、指标记录、提醒、简报外，还可以根据最近的描述和历史记录先整理一段”就医前摘要”，并在需要时继续生成图片或 PDF，方便给医生快速了解病情。\n\n## 适用场景\n\n- 添加或管理家庭成员信息\n- 记录就诊经历（门诊/住院/急诊）、症状/诊断/用药/检验/影像检查结果\n- 记录日常健康指标（血压/血糖/心率/体温等）\n- 查询病程历史或用药记录、生成健康时间线或摘要、查看全家健康概况\n- 发送体检报告图片或化验单需要识别录入\n- 设置用药提醒、健康指标测量提醒、复查提醒，或获取主动健康建议、每日健康简报、就医前摘要图\n- 规划就诊流程（预约 → 就诊前汇总 → 记录诊断结果 → 复诊追踪）\n- 随口提到健康问题（如”最近膝盖有点疼”）需要记录并定期跟进\n\n## 核心工作流\n\n### 0. 确定 owner_id（每次必做）\n\n从会话上下文获取当前发送者 ID，格式为 `<channel>:<user_id>`，用于所有脚本的 `--owner-id` 参数。例如：\n- 飞书用户：`feishu:ou_707461a1baa7790213d30230b88fb575`\n- QQ 用户：`qqbot:12345678`\n\n后续所有脚本调用均以此 ID 作为 `--owner-id`，不得省略。\n\n### 1. 先确认成员（必须等用户回复）\n\n```bash\npython3 {baseDir}/scripts/member.py list --owner-id \"<sender_id>\"\n```\n\n每次增删改查前先调用 `list` 查询现有成员，**将结果展示给用户，明确询问\"是为哪位成员操作？\"，等待用户明确回复后再继续。**\n\n**禁止以下行为：**\n- 未经询问自动创建新成员（包括\"本人\"）\n- 在用户未确认目标成员的情况下继续写入数据\n- 假设\"只有一个成员所以自动选择\"\n\n**成员不存在时的处理：**\n```\n列表为空或未找到目标成员 → 告知用户 → 询问是否新建成员 → 等待用户确认姓名和关系 → 再调用 member.py add\n```\n\n```bash\n# 用户确认后才执行创建\npython3 {baseDir}/scripts/member.py add --name \"张三\" --relation \"本人\" --owner-id \"<sender_id>\"\n```\n\n### 2. 选择录入路径\n\n- 简短指标文本：优先 `quick_entry.py`\n- 复杂文本、就诊、用药、检验：用 `smart_intake.py` 或对应业务脚本\n- 图片 / PDF / 多附件：走视觉录入流程\n- 录入后发现异常指标、新诊断或用药变化：用 `log-health-note` 动作记录并跟进\n\n### 3. 查询后做自然语言整理\n\n```bash\npython3 {baseDir}/scripts/query.py summary --member-id <id>\npython3 {baseDir}/scripts/query.py timeline --member-id <id>\npython3 {baseDir}/scripts/query.py active-medications --member-id <id>\npython3 {baseDir}/scripts/query.py family-overview\n```\n\n不要把 JSON 原样贴给用户；改写成趋势、摘要、时间线和清晰列表。\n\n## 快速命令\n\n### 常用录入\n\n结构化数据可直接调用对应动作写入：\n\n| 动作 | 说明 | 关键参数 |\n|------|------|----------|\n| `add-visit` | 添加就诊记录 | member_id, visit_type, visit_date；可选 hospital/department/diagnosis |\n| `add-symptom` | 添加症状记录 | member_id, symptom；可选 severity/visit_id/onset_date |\n| `add-medication` | 添加用药记录 | member_id, name；可选 dosage/frequency/visit_id/purpose |\n| `add-metric` | 添加健康指标 | member_id, type, value；可选 measured_at/source/context |\n\n自然语言或图片输入走 `smart-extract` → `smart-confirm` 流程；短文本指标走 `quick-entry-save`。\n\n### 快速录入指标\n\n```bash\npython3 {baseDir}/scripts/quick_entry.py parse --text \"血压130/85 心率72\" --member-id <id> --owner-id \"<sender_id>\"\npython3 {baseDir}/scripts/quick_entry.py parse-and-save --text \"血压130/85 心率72\" --member-id <id> --owner-id \"<sender_id>\"\n```\n\n### 录入后发现异常，记录并跟进\n\n录入数据后若发现异常指标、新诊断或用药变化，用 `log-health-note` 动作记录并自动创建跟进提醒：\n\n```bash\n# action: log-health-note\npython3 {baseDir}/scripts/health_memory.py log --member-id <id> --content \"血压160/100，高于正常上限\" --category observation --follow-up-days 3\n```\n\n### 生成就医前摘要\n\n当用户最近准备去看医生，可以先让用户用自然语言描述本次不适，默认先生成一段简短摘要：\n\n```bash\npython3 {baseDir}/scripts/doctor_visit_report.py text --member-id <id> --description “最近两周反复头晕，起床和翻身时更明显，偶尔恶心，担心是不是血压或者耳石问题”\n```\n\n生成完后，顺手问一句：\n- “如果你愿意，我也可以继续帮你整理成图片或 PDF，方便就诊时直接出示给医生。”\n\n也可以更自然一点，比如：\n- “这版短文你先看看；如果要更方便出示给医生，我可以再帮你排成图片或 PDF。”\n- “要不要我顺手再帮你整理成一张图，或者导出成 PDF？”\n\n如用户明确需要，再继续导出图片版或 PDF 版。\n\n这份摘要会尽量汇总：\n- 本次主诉与自动提取的重点\n- 近期关键指标、异常提醒、最近就诊变化\n- 相关既往病史与近期检查\n- 当前在用药、过敏史、可识别的中高风险药物相互作用\n\n### 就诊全程管理（plan → prep → outcome → follow-up）\n\n对于有明确就诊计划的场景，可以走完整就诊生命周期：\n\n```bash\n# 1. 创建就诊预约（status=planned），获取准备提醒\npython3 {baseDir}/scripts/visit_lifecycle.py plan --member-id <id> --visit-date 2026-03-15 --hospital 协和医院 --department 心内科 --chief-complaint “反复胸闷”\n\n# 2. 就诊前智能汇总：症状按身体系统分组 + 近期异常指标 + 在用药 + 药物相互作用警告\npython3 {baseDir}/scripts/visit_lifecycle.py prep --member-id <id> [--days 30]\n\n# 3. 就诊后引导录入：诊断、处方、复诊安排（自动创建复诊提醒）\npython3 {baseDir}/scripts/visit_lifecycle.py outcome --visit-id <vid> --diagnosis “高血压” \\\n  --follow-up-date 2026-06-15 \\\n  --medications '[{“name”:”氨氯地平”,”dosage”:”5mg”,”frequency”:”每日一次”}]'\n\n# 4. 查看待处理就诊（planned / 未填结果 / 复诊提醒）\npython3 {baseDir}/scripts/visit_lifecycle.py pending --member-id <id>\n```\n\n### 健康记忆追踪\n\n当用户随口提到健康问题时，及时记录并自动跟进：\n\n```bash\n# 记录随口提到的健康问题，自动创建 N 天后的跟进提醒\npython3 {baseDir}/scripts/health_memory.py log --member-id <id> --content “最近睡眠很差，经常半夜醒” --category symptom --follow-up-days 5\n\n# 查看未解决的健康备注和到期跟进\npython3 {baseDir}/scripts/health_memory.py list --member-id <id>\n\n# 标记已解决\npython3 {baseDir}/scripts/health_memory.py resolve --note-id <nid> --resolution-note “医生建议减少咖啡因摄入，已执行”\n```\n\n待跟进的健康备注会自动出现在每日简报（`health_advisor.py briefing`）中，确保不遗漏。\n\n## 初始配置引导\n\n当用户首次使用、或表示\"图片识别不工作\"\"无法识别报告\"时，先在后台运行配置检查：\n\n```bash\npython3 {baseDir}/scripts/setup.py check\n```\n\n若输出中 `vision_configured` 为 `false`，**不要在聊天中索要 API Key**，而是引导用户在终端完成配置：\n\n### 配置流程\n\n**第一步：询问地区/偏好**\n\n> 检测到图片和 PDF 识别功能还没配置，需要接入一个视觉模型才能用。\n>\n> 你用的是国内网络还是海外网络？或者想完全在本地离线运行？\n\n根据回答推荐方案，并给出对应的注册链接：\n- 国内 → **硅基流动**（免费注册有额度，在 https://cloud.siliconflow.cn 获取 API Key）\n- 海外 → **Google Gemini**（免费，在 https://aistudio.google.com/apikey 获取）\n- 离线 → **本地 Ollama**（需提前安装 Ollama 并下载模型）\n\n**第二步：引导在终端配置（不在聊天中收集密钥）**\n\n告知用户在终端执行以下命令（`sk-xxx` 替换为实际 Key）：\n\n```\n# 示例：硅基流动\npython3 {baseDir}/scripts/setup.py set-vision --provider siliconflow --api-key sk-xxx\n\n# 示例：Google Gemini\npython3 {baseDir}/scripts/setup.py set-vision --provider gemini --api-key AIza-xxx\n\n# 示例：本地 Ollama\npython3 {baseDir}/scripts/setup.py set-vision --provider ollama\n```\n\n> ⚠️ **API Key 请在终端输入，不要通过聊天发送。** 在终端执行完成后告诉我一声，我来帮你验证是否配置成功。\n\n**第三步：用户告知完成后，验证配置**\n\n```bash\npython3 {baseDir}/scripts/setup.py test-vision\n```\n\n- 测试通过 → \"配置好了！现在可以直接把报告图片或 PDF 发给我来识别。\"\n- 测试失败 → 根据错误信息提示用户检查 API Key 是否正确，或网络是否可用。\n\n### 原则\n\n- **不在聊天中收集凭据**：API Key 属于敏感信息，必须由用户在本机终端直接输入，不得经过对话传递。\n- **后台静默执行**：`setup.py test-vision` 等验证命令在后台完成，不要把 JSON 输出贴给用户。\n- **配置失败友好提示**：失败时给出具体原因和可操作的修复建议，不要直接贴报错。\n\n## 不可跳过的规则\n\n1. **不要直接展示 JSON**：查询结果必须转成自然中文。\n2. **不要用自身视觉能力读医疗图片**：图片/PDF 只能走外部视觉模型。\n3. **药物安全问题必须先搜**：通过 DDInter、openFDA 或网页搜索查询，不要凭记忆回答。\n4. **发简报默认发图片版**：优先 `briefing_report.py screenshot`，不是纯文本。\n5. **多张图片先收齐再处理**：不要每到一张就立即确认录入。\n6. **每次调用脚本必须携带 `--owner-id`（强制）**：从当前会话上下文获取发送者 ID，格式为 `<channel>:<user_id>`（如 `feishu:ou_707461a1baa7790213d30230b88fb575` 或 `qqbot:12345`），作为所有脚本的 `--owner-id` 参数。这是多用户数据隔离的核心机制，任何脚本调用都不得省略。不知道 owner_id 时，先停下来确认，不要在没有 owner_id 的情况下写入数据。\n7. **就医前摘要默认先短文版**：先用 `doctor_visit_report.py text` 生成；用户需要时，再导出图片或 PDF。\n8. **成员确认必须等用户明确回复**：先调用 `member.py list` 展示已有成员，问清楚\"是为哪位成员操作\"，等待用户回复后再继续。不得自动创建成员（包括\"本人\"），不得在成员未确认的情况下写入任何数据。\n9. **记录饮食前必须先查食物数据库**：通过 diet-tracker 的 `food_lookup.py search` 查每种食物的营养数据，用查询结果填写 `--items`。禁止凭 AI 自身知识估算营养值后直接写入。\n10. **对话中的健康提及必须实时记录（强制）**：用户在对话中随口提到任何健康相关内容（症状、不适、用药感受、睡眠、情绪等），**必须在当次对话结束前**调用 `health_memory.py log` 将其写入健康备注。这是夜间做梦机制的原始素材来源——`dream.py gather` 会专门读取当日记录的对话提及，未被记录的提及将永久丢失。\n\n    **触发关键词示例**（不限于此）：\n    - \"最近/今天/昨天有点…\"、\"感觉…\"、\"一直…\"、\"偶尔…\"\n    - 身体部位 + 描述：头、胃、腿、眼睛、心脏 + 疼/胀/酸/晕/难受\n    - 睡眠问题：睡不着、早醒、多梦、睡眠质量差\n    - 情绪/精力：累、乏力、焦虑、情绪低落、提不起劲\n    - 用药感受：吃了药之后…、副作用、效果不明显\n\n## 每日健康简报推送规范（OpenClaw 定时任务）\n\n**触发时机：每日早晨 8:00，由 OpenClaw agent 自动执行。**\n\n### 执行流程\n\n```\n1. wearable-sync: sync-all          → 同步手表数据（若有绑定设备）\n2. health-monitor: check-all        → 检测异常指标，写入 alerts 表\n3. health_advisor.py briefing       → 获取全家简报数据（提醒 + 建议 + 风险等级）\n4. briefing_report.py screenshot    → 生成图片版简报（PNG），同时自动保存当日快照\n5. 推送给用户（见下方推送规则）\n```\n\n### 夜间做梦任务（OpenClaw 定时任务）\n\n**触发时机：每晚 22:00，由 OpenClaw agent 自动执行，调用 DREAM skill。**\n\n做梦机制负责在夜间回顾当日健康素材，提炼规律和隐患，将有价值的洞察写入健康备注，供次日简报展示。详见 `mediwise-health-tracker/DREAM.md`。\n\n```\ndream.py status   → 检查是否满足触发条件（≥20h 间隔）\ndream.py lock     → 获取做梦锁（防止并发）\ndream.py gather   → 收集当日健康素材\n↓ agent 深度分析（逐成员回顾指标/告警/备注趋势）\nhealth_memory.py log  → 写入值得记录的发现（有发现才写，最多3条/成员）\ndream.py unlock   → 释放锁，标记完成\n```\n\n### 推送内容规则\n\n| 情况 | 推送什么 |\n|---|---|\n| 有 alert 级告警 | 图片简报 + 文字摘要，文字中明确点出告警项 |\n| 只有 warning 或 info | 图片简报，文字一句话概括（\"今日整体正常，有 N 项提醒\"）|\n| 完全正常 | 只发一句\"今日健康状况良好，无待处理事项\" + 可选图片简报 |\n| 同步失败（无手表数据） | 注明\"今日手表数据未能同步，以下数据基于上次同步结果\" |\n\n### 推送格式\n\n- **默认发图片版**：`briefing_report.py screenshot` 生成 PNG，作为图片消息发送\n- **文字摘要**：在图片前附一段不超过 100 字的中文摘要，点出最重要的 1-2 件事\n- **禁止**：直接把 JSON 或 HTML 内容粘贴到聊天里\n\n### 用户手动请求时\n\n当用户说\"给我看今天的健康简报\"、\"健康小报\"、\"今天身体怎么样\"等时，立即执行步骤 3-5（不重复同步），发送图片简报。\n\n## 每日健康快照记忆（daily_snapshot.py）\n\n每次生成简报时自动保存当日快照，agent 可在对话中直接引用历史状态，无需每次重新计算。\n\n### 支持的查询场景\n\n| 用户说 | agent 调用 | 说明 |\n|---|---|---|\n| \"昨天状态怎么样\" | `daily_snapshot.py get --date <昨天>` | 返回单日摘要 |\n| \"这周身体趋势\" | `daily_snapshot.py history --days 7` | 最近7天列表 |\n| \"这个月有几天出现告警\" | `daily_snapshot.py trend --days 30` | 逐日风险等级 |\n| \"上周五血压有没有异常\" | `daily_snapshot.py get --date <日期>` + 若需要细节查 `health_metrics` | 快照 + 原始指标 |\n\n### 使用规则\n\n- **优先查快照**：用户问历史健康状态时，先查 `daily_snapshot.py`，有结果就直接用，不需要重新跑 `health_advisor.py`\n- **快照没有再查原始指标**：快照只存摘要和风险等级；如用户追问具体数值，再查 `health_metrics`\n- **描述要自然**：把 risk_level（ok / warning / alert）和 summary_text 组合成一句话，不要直接展示 JSON\n\n```bash\n# 查昨天快照\npython3 {baseDir}/scripts/daily_snapshot.py get --member-id <id> --date 2026-04-05 --owner-id <oid>\n\n# 查最近7天\npython3 {baseDir}/scripts/daily_snapshot.py history --member-id <id> --days 7 --owner-id <oid>\n\n# 查30天趋势（用于描述\"这个月整体状况\"）\npython3 {baseDir}/scripts/daily_snapshot.py trend --member-id <id> --days 30 --owner-id <oid>\n```\n\n## 能力介绍模板\n\n当用户问“你可以做什么”“你能帮我做什么”时，可以优先用自然中文这样回答：\n\n```text\n我可以帮你做这些和健康相关的事情：\n- 记录和整理健康档案：症状、诊断、用药、检验、影像、血压血糖等\n- 查询和总结病程：帮你把最近变化、既往史、在用药整理清楚\n- 做提醒和健康简报：比如用药提醒、复查提醒、每日简报\n- 识别报告图片或化验单：把图片/PDF里的信息提取出来录入\n- 在你准备去看医生前，先生成一段”就医前摘要”：自动整理最近的关键情况、相关病史、过敏史、在用药和需要注意的事项；如果你需要，我再继续整理成图片或 PDF\n- 就诊全程管理：提前规划预约 → 就诊前智能汇总症状/指标/用药 → 就诊后记录诊断和处方 → 自动追踪复诊提醒\n- 健康记忆：随时告诉我你注意到的健康问题（如”最近膝盖有点疼”），我会记下来并在几天后主动提醒你跟进\n\n如果你愿意，现在就可以直接告诉我：\n“帮我整理最近的情况”\n或\n“帮我整理最近的就医摘要”\n或\n“帮我生成一张给医生看的摘要图”\n```\n\n如果用户已经明确说最近要去医院、复诊、看专科，优先提“就医前摘要图”，不要把它埋在能力列表最后。\n\n## 数据备份与迁移\n\n当用户需要换设备、换环境，或者迁移到新的小龙虾实例时，使用以下命令打包和恢复数据：\n\n```bash\n# 备份：将所有数据库和配置打包到一个文件\npython3 {baseDir}/scripts/setup.py backup --output mediwise-backup.tar.gz\n\n# 恢复：在新环境中还原数据（Schema 自动升级到最新版本）\npython3 {baseDir}/scripts/setup.py restore --input mediwise-backup.tar.gz\n```\n\n备份文件包含：`medical.db`、`lifestyle.db`、`config.json`（以及旧版 `health.db`，如存在）。\n\n**迁移流程**：\n1. 旧环境：`setup.py back\n\nArchive v2.0.5: 104 files, 349375 bytes\n\nFiles: CHANGELOG.md (3389b), CONTRIBUTING.md (2799b), diet-tracker/agents/openai.yaml (239b), diet-tracker/index.js (6336b), diet-tracker/package.json (290b), diet-tracker/scripts/diet.py (20650b), diet-tracker/scripts/food_lookup.py (18742b), diet-tracker/scripts/nutrition_goal.py (10671b), diet-tracker/scripts/nutrition.py (8742b), diet-tracker/SKILL.md (6777b), docs/AGENT_SETUP.md (9170b), docs/HEALTH-MANAGEMENT-OVERVIEW.md (9478b), docs/INSTALLATION.md (12811b), health-monitor/agents/openai.yaml (247b), health-monitor/index.js (3737b), health-monitor/package.json (294b), health-monitor/scripts/alert.py (5785b), health-monitor/scripts/check.py (11696b), health-monitor/scripts/dashboard.py (7232b), health-monitor/scripts/test_check.py (5130b), health-monitor/scripts/threshold.py (10288b), health-monitor/scripts/trend.py (11276b), health-monitor/SKILL.md (7800b), install-check.sh (4703b), mediwise-health-tracker/agents/openai.yaml (277b), mediwise-health-tracker/DREAM.md (7215b), mediwise-health-tracker/index.js (21309b), mediwise-health-tracker/package.json (267b), mediwise-health-tracker/references/cycle-attachments-multitenancy.md (4108b), mediwise-health-tracker/references/drug-briefing.md (3042b), mediwise-health-tracker/references/intake-query-vision.md (3476b), mediwise-health-tracker/references/visit-prep.md (3740b), mediwise-health-tracker/scripts/api_client.py (7152b), mediwise-health-tracker/scripts/attachment.py (24074b), mediwise-health-tracker/scripts/briefing_report.py (22279b), mediwise-health-tracker/scripts/checkup_report.py (20520b), mediwise-health-tracker/scripts/chronic_disease.py (15480b), mediwise-health-tracker/scripts/config.py (14567b), mediwise-health-tracker/scripts/cycle_tracker.py (17024b), mediwise-health-tracker/scripts/daily_snapshot.py (13846b), mediwise-health-tracker/scripts/doctor_visit_report.py (35800b), mediwise-health-tracker/scripts/dream.py (14858b), mediwise-health-tracker/scripts/drug_interaction.py (25127b), mediwise-health-tracker/scripts/embedding_provider.py (5820b), mediwise-health-tracker/scripts/export.py (16571b), mediwise-health-tracker/scripts/health_advisor.py (24799b), mediwise-health-tracker/scripts/health_db.py (50812b), mediwise-health-tracker/scripts/health_memory.py (9859b), mediwise-health-tracker/scripts/health_metric.py (9101b), med...","readmeExcerpt":"Skill: Mediwise Health Suite Owner: juneyaooo Summary: Family health management suite: health records, diet tracking, weight management, wearable sync. Local SQLite storage by default; optional cloud features req... Tags: chinese:1.0.8, diet:1.0.8, family:1.0.8, health:1.0.8, latest:2.0.8, medical:1.0.8, multimodal:1.0.8, vision:1.0.8, wearable:1.0.8, weight:1.0.8 Version history: v2.0.8 | 2026-04-07T04:54:51.654Z | ","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"# 步骤 1：先查每种食物\npython3 {baseDir}/scripts/food_lookup.py search --query \"炸排骨\" --owner-id \"<sender_id>\"\npython3 {baseDir}/scripts/food_lookup.py search --query \"米饭\" --owner-id \"<sender_id>\"\n\n# 步骤 2：用查询结果里的营养数据填 --items，再记录\npython3 {baseDir}/scripts/diet.py add-meal \\\n  --member-id <id> --meal-type lunch --meal-date 2025-03-15 \\\n  --items '[{\"food_name\":\"炸排骨\",\"amount\":150,\"unit\":\"g\",\"calories\":298,\"protein\":21.2,\"fat\":19.3,\"carbs\":9.1,\"note\":\"来源:CFCD6\"}]' \\\n  --owner-id \"<sender_id>\""},{"language":"json","snippet":"[\n  {\"food_name\": \"鸡胸脯肉\", \"amount\": 150, \"unit\": \"g\", \"calories\": 158, \"protein\": 31.6, \"fat\": 3.2, \"carbs\": 0.0, \"note\": \"来源:CFCD6\"},\n  {\"food_name\": \"米饭\", \"amount\": 200, \"unit\": \"g\", \"calories\": 232, \"protein\": 4.6, \"fat\": 0.6, \"carbs\": 51.5, \"note\": \"来源:CFCD6\"}\n]"},{"language":"bash","snippet":"# 全家健康一屏总览\npython3 {baseDir}/scripts/dashboard.py show\n\n# 按 owner 过滤（多租户场景）\npython3 {baseDir}/scripts/dashboard.py show --owner-id <owner_id>"},{"language":"json","snippet":"{\n  \"family_risk\": \"warning\",\n  \"family_risk_label\": \"需关注\",\n  \"total_open_alerts\": 3,\n  \"summary\": \"【紧急】张三 有紧急告警；共 3 条未解决告警\",\n  \"members\": [\n    {\n      \"name\": \"张三\",\n      \"risk_level\": \"urgent\",\n      \"risk_label\": \"紧急\",\n      \"open_alerts\": 2,\n      \"alerts\": [{\"level\": \"urgent\", \"title\": \"张三 heart_rate 高于阈值\", ...}],\n      \"latest_metrics\": {\n        \"heart_rate\": {\"value\": 125, \"unit\": \"bpm\", \"measured_at\": \"2026-03-27 08:30\"},\n        \"blood_pressure\": {\"value\": \"145/95\", \"unit\": \"mmHg\", \"measured_at\": \"2026-03-27 08:30\"}\n      },\n      \"trend_warnings\": [\"heart_rate 呈上升趋势\"]\n    }\n  ]\n}"},{"language":"bash","snippet":"# 查看阈值配置（含默认+自定义）\npython3 {baseDir}/scripts/threshold.py list --member-id <id>\n\n# 自定义阈值\npython3 {baseDir}/scripts/threshold.py set --member-id <id> --type heart_rate --level warning --direction above --value 110\n\n# 恢复默认\npython3 {baseDir}/scripts/threshold.py reset --member-id <id> --type heart_rate"},{"language":"bash","snippet":"# 检查单个成员\npython3 {baseDir}/scripts/check.py run --member-id <id>\n\n# 检查所有成员\npython3 {baseDir}/scripts/check.py run-all\n\n# 检查最近指定时间窗口\npython3 {baseDir}/scripts/check.py run --member-id <id> --window 24h"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"diet-tracker/SKILL.md","content":"---\nname: diet-tracker\ndescription: \"Diet and nutrition tracking: log meals, manage food items, view daily/weekly nutrition summaries, analyze calorie trends. Integrates with mediwise-health-tracker and weight-manager.\"\n---\n\n# diet-tracker\n\n## 概述\n\n提供每餐饮食记录、食物条目管理、每日/每周营养摘要、热量趋势分析等功能。与 `mediwise-health-tracker` 共享数据库，可与 `weight-manager` 联动形成\"饮食 → 热量 → 体重\"完整闭环。\n\n## 数据模型\n\n### diet_records（一餐记录）\n| 字段 | 说明 |\n|------|------|\n| id | 记录 ID |\n| member_id | 成员 ID |\n| meal_type | 餐次: breakfast/lunch/dinner/snack |\n| meal_date | 日期 YYYY-MM-DD |\n| meal_time | 时间 HH:MM（可选） |\n| total_calories | 总热量 kcal |\n| total_protein | 总蛋白质 g |\n| total_fat | 总脂肪 g |\n| total_carbs | 总碳水 g |\n| total_fiber | 总膳食纤维 g |\n| note | 备注 |\n\n### diet_items（食物条目）\n| 字段 | 说明 |\n|------|------|\n| id | 条目 ID |\n| record_id | 关联 diet_records.id |\n| food_name | 食物名称 |\n| amount | 数量 |\n| unit | 单位（g/ml/份/个等） |\n| calories | 热量 kcal |\n| protein | 蛋白质 g |\n| fat | 脂肪 g |\n| carbs | 碳水 g |\n| fiber | 膳食纤维 g |\n| note | 备注 |\n\n## 功能列表\n\n### diet.py — 饮食记录 CRUD\n\n| 动作 | 子命令 | 必要参数 | 可选参数 | 说明 |\n|------|--------|----------|----------|------|\n| add-meal | add-meal | --member-id, --meal-type, --meal-date | --meal-time, --note, --items (JSON) | 添加一餐记录（可同时包含多个食物条目） |\n| add-item | add-item | --record-id, --food-name | --amount, --unit, --calories, --protein, --fat, --carbs, --fiber, --note | 向已有餐次追加食物条目 |\n| list | list | --member-id | --date, --start-date, --end-date, --meal-type, --limit | 查看饮食记录 |\n| delete | delete | --id | --type (record/item) | 删除记录或条目 |\n| daily-summary | daily-summary | --member-id, --date | | 某日营养摘要 |\n\n### nutrition.py — 营养分析\n\n| 动作 | 子命令 | 必要参数 | 可选参数 | 说明 |\n|------|--------|----------|----------|------|\n| weekly-summary | weekly-summary | --member-id | --end-date | 一周营养趋势（每日热量、平均三大营养素） |\n| calorie-trend | calorie-trend | --member-id | --days (默认 7) | 热量趋势分析（N 天每日总热量） |\n| nutrition-balance | nutrition-balance | --member-id | --days (默认 7) | 三大营养素比例分析 |\n\n### food_lookup.py — 食物营养查询\n\n| 动作 | 子命令 | 必要参数 | 可选参数 | 说明 |\n|------|--------|----------|----------|------|\n| food-lookup | search | params.query | params.limit (默认5), params.source (auto/cfcd/brands/usda) | 三层数据源搜索食物营养（CFCD6 → 中国品牌外食 → USDA） |\n| food-stats | stats | — | — | 查看食物数据库概况（各数据源条目数） |\n\n数据来源（按优先级）：\n1. **CFCD6**（离线）：《中国食物成分表标准版第6版》1657 条，覆盖粮谷、肉蛋奶、蔬果、水产等\n2. **cn-brands**（离线）：339 条，奶茶、外卖、便利店、火锅等外食场景\n3. **USDA FoodData Central**（在线）：国际食材兜底，需配置 `USDA_API_KEY` 环境变量\n\n## 使用流程\n\n**记录一餐的标准流程（不得跳步）：**\n\n1. 确认成员身份（通过 mediwise-health-tracker 的 list-members）\n2. **逐一查询每种食物的营养数据**（`food-lookup search`，见下方\"强制规则\"）\n3. 用查询到的营养数据调用 `add-meal`，通过 `--items` JSON 一次录入多个食物\n4. 如需追加食物，使用 `add-item` 向已有餐次添加\n5. 使用 `daily-summary` 查看当天营养摄入\n6. 使用 `weekly-summary` 或 `calorie-trend` 查看长期趋势\n\n## 营养数据强制规则\n\n**禁止用 AI 自身知识直接估算营养数值写入数据库。** 记录每种食物之前，必须先调用 `food-lookup search` 查询，用数据库返回的数据填充 `--items`。\n\n> **自动填充说明**：若 `--items` 中某条目未提供热量数据，`diet.py` 会自动调用内部 food_lookup 数据库补全营养值，并在 `note` 字段标注 `[自动填充]` 及数据来源。此行为仅查询本地数据库（不调用外部 API），补全结果与显式 `food-lookup search` 一致。agent 仍应优先显式查询以"},{"path":"health-monitor/SKILL.md","content":"---\nname: health-monitor\ndescription: >-\n  智能健康监测与告警。基于阈值检测、趋势分析和多级告警系统，\n  对家庭成员的健康指标进行持续监测，发现异常时及时预警。支持全家健康 dashboard 一屏总览。\n  Intelligent health monitoring and alerting. Uses threshold detection,\n  trend analysis, and multi-level alert system to continuously monitor\n  family members' health metrics and warn on anomalies. Supports family dashboard.\n  关键词：健康监测、异常告警、指标预警、趋势分析、健康报告、心率异常、血压异常、血氧低、告警管理、全家概览、健康dashboard。\n---\n\n# Health Monitor - 智能健康监测\n\n持续监测健康指标，多级阈值告警 + 趋势分析，发现异常及时通知。支持全家健康 dashboard 一屏总览。\n\n## 告警级别\n\n| 级别 | 含义 | 处理方式 |\n|------|------|----------|\n| info | 信息记录 | 仅记录，不主动推送 |\n| warning | 预警 | 创建 reminder 推送 |\n| urgent | 紧急 | 推送 + 标记高优先级 |\n| emergency | 危急 | 推送 + 建议立即就医或拨打急救电话 |\n\n## 默认阈值\n\n| 指标 | warning | urgent | emergency |\n|------|---------|--------|-----------|\n| 心率（高）| >100 bpm | >120 bpm | >150 bpm |\n| 心率（低）| <55 bpm | <45 bpm | <35 bpm |\n| 血氧（低）| <95% | <90% | <85% |\n| 收缩压（高）| >140 mmHg | >160 mmHg | >180 mmHg |\n| 舒张压（高）| >90 mmHg | >100 mmHg | >110 mmHg |\n| 体温（高）| >37.3°C | >38.5°C | >39.5°C |\n| 血糖空腹（高）| >6.1 mmol/L | >7.8 mmol/L | >11.1 mmol/L |\n\n支持按年龄自动调整，支持用户自定义覆盖。\n\n## 核心工作流\n\n> **强制规则**：每次调用脚本必须携带 `--owner-id`，从会话上下文获取发送者 ID（格式 `<channel>:<user_id>`，如 `feishu:ou_xxx` 或 `qqbot:12345`）。所有查询和写入操作均需携带，不得省略。\n\n### 0. 全家健康 Dashboard（首选入口）\n\n用户说「看看全家健康」「今天家人状态怎样」「健康概览」时，优先调用此接口。\n返回所有成员的风险级别、未解决告警数、最新关键指标和趋势警告。\n\n```bash\n# 全家健康一屏总览\npython3 {baseDir}/scripts/dashboard.py show\n\n# 按 owner 过滤（多租户场景）\npython3 {baseDir}/scripts/dashboard.py show --owner-id <owner_id>\n```\n\n**返回结构示例：**\n```json\n{\n  \"family_risk\": \"warning\",\n  \"family_risk_label\": \"需关注\",\n  \"total_open_alerts\": 3,\n  \"summary\": \"【紧急】张三 有紧急告警；共 3 条未解决告警\",\n  \"members\": [\n    {\n      \"name\": \"张三\",\n      \"risk_level\": \"urgent\",\n      \"risk_label\": \"紧急\",\n      \"open_alerts\": 2,\n      \"alerts\": [{\"level\": \"urgent\", \"title\": \"张三 heart_rate 高于阈值\", ...}],\n      \"latest_metrics\": {\n        \"heart_rate\": {\"value\": 125, \"unit\": \"bpm\", \"measured_at\": \"2026-03-27 08:30\"},\n        \"blood_pressure\": {\"value\": \"145/95\", \"unit\": \"mmHg\", \"measured_at\": \"2026-03-27 08:30\"}\n      },\n      \"trend_warnings\": [\"heart_rate 呈上升趋势\"]\n    }\n  ]\n}\n```\n\n### 1. 阈值管理\n\n```bash\n# 查看阈值配置（含默认+自定义）\npython3 {baseDir}/scripts/threshold.py list --member-id <id>\n\n# 自定义阈值\npython3 {baseDir}/scripts/threshold.py set --member-id <id> --type heart_rate --level warning --direction above --value 110\n\n# 恢复默认\npython3 {baseDir}/scripts/threshold.py reset --member-id <id> --type heart_rate\n```\n\n### 2. 异常检测\n\n```bash\n# 检查单个成员\npython3 {baseDir}/scripts/check.py run --member-id <id>\n\n# 检查所有成员\npython3 {baseDir}/scripts/check.py run-all\n\n# 检查最近指定时间窗口\npython3 {baseDir}/scripts/check.py run --member-id <id> --window 24h\n```\n\n### 3. 趋势分析\n\n```bash\n# 单指标趋势\npython3 {baseDir}/scripts/trend.py analyze --member-id <id> --type heart_rate --days 7\n\n# 全指标摘要\npython3 {baseDir}/scripts/trend.py report --member-id <id>\n```\n\n### 4. 告警管理\n\n```bash\n# 查看未解决告警\npython3 {baseDir}/scripts/alert.py list --member-id <id>\n\n# 按级别筛选\npython3 {baseDir}/scripts/alert.py list -"},{"path":"mediwise-health-tracker/SKILL.md","content":"---\nname: mediwise-health-tracker\ndescription: Family health and medical record management. Tracks members, visits, medications, lab results, daily metrics, reminders, briefings, and pre-visit summaries.\n---\n\n# MediWise Health Tracker\n\n家庭健康与病程记录管理技能。所有操作通过 `{baseDir}/scripts/` 下的 Python 脚本完成，默认输出 JSON，再转成自然语言回复给用户。\n\n当用户问”你可以做什么”时，记得主动提到：除了健康档案、指标记录、提醒、简报外，还可以根据最近的描述和历史记录先整理一段”就医前摘要”，并在需要时继续生成图片或 PDF，方便给医生快速了解病情。\n\n## 适用场景\n\n- 添加或管理家庭成员信息\n- 记录就诊经历（门诊/住院/急诊）、症状/诊断/用药/检验/影像检查结果\n- 记录日常健康指标（血压/血糖/心率/体温等）\n- 查询病程历史或用药记录、生成健康时间线或摘要、查看全家健康概况\n- 发送体检报告图片或化验单需要识别录入\n- 设置用药提醒、健康指标测量提醒、复查提醒，或获取主动健康建议、每日健康简报、就医前摘要图\n- 规划就诊流程（预约 → 就诊前汇总 → 记录诊断结果 → 复诊追踪）\n- 随口提到健康问题（如”最近膝盖有点疼”）需要记录并定期跟进\n\n## 核心工作流\n\n### 0. 确定 owner_id（每次必做）\n\n从会话上下文获取当前发送者 ID，格式为 `<channel>:<user_id>`，用于所有脚本的 `--owner-id` 参数。例如：\n- 飞书用户：`feishu:ou_707461a1baa7790213d30230b88fb575`\n- QQ 用户：`qqbot:12345678`\n\n后续所有脚本调用均以此 ID 作为 `--owner-id`，不得省略。\n\n### 1. 先确认成员（必须等用户回复）\n\n```bash\npython3 {baseDir}/scripts/member.py list --owner-id \"<sender_id>\"\n```\n\n每次增删改查前先调用 `list` 查询现有成员，**将结果展示给用户，明确询问\"是为哪位成员操作？\"，等待用户明确回复后再继续。**\n\n**禁止以下行为：**\n- 未经询问自动创建新成员（包括\"本人\"）\n- 在用户未确认目标成员的情况下继续写入数据\n- 假设\"只有一个成员所以自动选择\"\n\n**成员不存在时的处理：**\n```\n列表为空或未找到目标成员 → 告知用户 → 询问是否新建成员 → 等待用户确认姓名和关系 → 再调用 member.py add\n```\n\n```bash\n# 用户确认后才执行创建\npython3 {baseDir}/scripts/member.py add --name \"张三\" --relation \"本人\" --owner-id \"<sender_id>\"\n```\n\n### 2. 选择录入路径\n\n- 简短指标文本：优先 `quick_entry.py`\n- 复杂文本、就诊、用药、检验：用 `smart_intake.py` 或对应业务脚本\n- 图片 / PDF / 多附件：走视觉录入流程\n- 录入后发现异常指标、新诊断或用药变化：用 `log-health-note` 动作记录并跟进\n\n### 3. 查询后做自然语言整理\n\n```bash\npython3 {baseDir}/scripts/query.py summary --member-id <id>\npython3 {baseDir}/scripts/query.py timeline --member-id <id>\npython3 {baseDir}/scripts/query.py active-medications --member-id <id>\npython3 {baseDir}/scripts/query.py family-overview\n```\n\n不要把 JSON 原样贴给用户；改写成趋势、摘要、时间线和清晰列表。\n\n## 快速命令\n\n### 常用录入\n\n结构化数据可直接调用对应动作写入：\n\n| 动作 | 说明 | 关键参数 |\n|------|------|----------|\n| `add-visit` | 添加就诊记录 | member_id, visit_type, visit_date；可选 hospital/department/diagnosis |\n| `add-symptom` | 添加症状记录 | member_id, symptom；可选 severity/visit_id/onset_date |\n| `add-medication` | 添加用药记录 | member_id, name；可选 dosage/frequency/visit_id/purpose |\n| `add-metric` | 添加健康指标 | member_id, type, value；可选 measured_at/source/context |\n\n自然语言或图片输入走 `smart-extract` → `smart-confirm` 流程；短文本指标走 `quick-entry-save`。\n\n### 快速录入指标\n\n```bash\npython3 {baseDir}/scripts/quick_entry.py parse --text \"血压130/85 心率72\" --member-id <id> --owner-id \"<sender_id>\"\npython3 {baseDir}/scripts/quick_entry.py parse-and-save --text \"血压130/85 心率72\" --member-id <id> --owner-id \"<sender_id>\"\n```\n\n### 录入后发现异常，记录并跟进\n\n录入数据后若发现异常指标、新诊断或用药变化，用 `log-health-note` 动作记录并自动创建跟进提醒：\n\n```bash\n# action: log-health-note\npython3 {baseDir}/scripts/health_memory.py log --member-id <id> --content \"血压160/100，高于正常上限\" --category observation --follow-up-days 3\n```\n\n### 生成就医前摘要\n\n当用户最近准备去看医生，可以先让用户用自然语言描述本次不适，默认先生成一段简短摘要：\n\n```bash\npython3 {baseDir}/scripts/doctor_visit_report.py text --member-id <id> --description “最近两周反复头晕，起床"},{"path":"SKILL.md","content":"---\nname: mediwise-health-suite\ndescription: \"Family health management suite: health records, diet tracking, weight management, wearable sync. Local SQLite storage by default; optional cloud features require explicit setup.\"\nversion: 2.0.7\nauthor: MediWise Team\nlicense: MIT\nhomepage: https://github.com/JuneYaooo/mediwise-health-suite\nrepository: https://github.com/JuneYaooo/mediwise-health-suite\nkeywords:\n  - health\n  - medical\n  - family\n  - diet\n  - weight\n  - records\n  - chinese\n  - openclaw\nrequires:\n  bins:\n    - python3\n    - sqlite3\n    - node\n---\n\n# MediWise Health Suite - 家庭健康管理套件\n\n家庭健康管理助手：记录健康数据，追踪饮食和体重，为家庭健康保驾护航。\n\n## 核心能力\n\n### ✅ 1. 家庭健康档案 (mediwise-health-tracker)\n- 成员信息管理：姓名、关系、性别、出生日期、血型\n- 基础病史：既往史、过敏史、联系方式、紧急联系人\n- 病程记录：门诊、住院、急诊、症状、诊断、检验、影像\n- 用药信息：当前在用药、历史用药、停药原因\n- 日常指标：血压、血糖、心率、血氧、体温、体重等\n- 查询能力：健康摘要、时间线、在用药、全家概览\n- **就医前摘要**：自动整理病情、既往史、在用药，生成文本/图片/PDF\n\n### ✅ 2. 饮食追踪 (diet-tracker)\n- 每餐记录与食物条目管理\n- 营养分析：热量、蛋白质、脂肪、碳水、膳食纤维\n- 每日/每周营养摘要\n- 热量趋势分析\n\n### ✅ 3. 体重管理 (weight-manager)\n- 目标设定：减重/增重/维持\n- BMI/BMR/TDEE 计算\n- 运动记录与消耗追踪\n- 身体围度记录\n- 热量收支分析\n- 达标预测\n\n### ⚠ 4. 智能健康监测 (health-monitor) - 待完善\n- 多级阈值告警（info/warning/urgent/emergency）\n- 趋势分析与异常检测\n- 自动提醒：用药提醒、复查提醒、指标测量提醒\n\n### ⚠ 5. 可穿戴设备同步 (wearable-sync) - 待完善\n- 支持 Gadgetbridge（小米手环、华为手表等）\n- 自动同步：心率、步数、血氧、睡眠\n- 可插拔 Provider 架构\n\n## 快速开始\n\n### 安装\n\n> **重要**：OpenClaw 沙箱要求 skills 必须位于插件/agent 工作区目录内。\n> `clawhub install` 会安装到**当前目录**的 `skills/` 子目录，\n> 因此务必先 `cd` 进入正确的工作区目录再执行安装命令。\n\n**通过 ClawdHub（推荐）：**\n```bash\n# 先进入 OpenClaw agent 工作区目录（路径以实际配置为准）\ncd ~/.openclaw/workspace-health   # 或你的插件根目录\n\n# 再安装，skill 会被放到 ./skills/mediwise-health-suite/\nclawdhub install JuneYaooo/mediwise-health-suite\n```\n\n**手动安装（路径最明确）：**\n```bash\n# 直接克隆到正确路径，不受工作目录影响\ngit clone https://github.com/JuneYaooo/mediwise-health-suite.git \\\n  ~/.openclaw/workspace-health/skills/mediwise-health-suite\n```\n\n**路径检测工具（装完后验证）：**\n```bash\nbash ~/.openclaw/workspace-health/skills/mediwise-health-suite/install-check.sh\n```\n\n### 基本使用\n\n1. **添加家庭成员**\n   ```\n   \"帮我添加一个家庭成员，叫张三，是我爸爸\"\n   ```\n\n2. **记录健康指标**\n   ```\n   \"帮我记录今天血压 130/85，心率 72\"\n   ```\n\n3. **查看健康摘要**\n   ```\n   \"帮我看看最近的健康情况\"\n   ```\n\n4. **饮食记录**\n   ```\n   \"帮我记录今天早餐：牛奶一杯、面包两片、鸡蛋一个\"\n   ```\n\n5. **体重管理**\n   ```\n   \"帮我设定一个减重目标，从 70kg 减到 65kg\"\n   ```\n\n6. **就医前准备**\n   ```\n   \"我准备去看医生，帮我整理一下最近的情况\"\n   ```\n\n## 系统要求\n\n- **Python**: 3.8+\n- **SQLite**: 3.x\n- **操作系统**: Linux / macOS / Windows\n- **OpenClaw**: 2026.3.0+\n\n## 数据隐私\n\n- **默认本地存储**：所有数据存储在本地 SQLite 数据库，不上传云端\n- **可选后端模式**：支持可选的后端 API 模式（需用户主动配置，默认关闭）\n- **可选向量搜索**：支持智能查询功能（本地模型优先，可选 API，默认关闭）\n- **多租户隔离**：支持共享实例场景的数据隔离\n\n**重要**：所有云端功能均为可选，需用户主动配置启用。默认配置下，所有数据仅存储在本地。\n\n## 可选环境变量\n\n所有功能在不设置任何环境变量的情况下均可正常使用。详细配置模板见根目录 `.env.example`。\n\n### 多模态视觉模型（强烈推荐配置）\n\n用于识别体检报告图片、化验单、病历 PDF。不配置则无法处理图片输入。\n\n| 变量名 | 说明 | 推荐值 |\n|--------|------|--------|\n| `MEDIWISE_VISION_API_KEY` | 视觉模型 API Key（设置即自动启用） | 见下方推荐方案 |\n| `MEDIWISE_VISION_PROVIDER` | 提供商名称 | `siliconflow` / `openai` / `ollama` |\n| `MEDIWISE_VISION_MODEL` | 模型名称 | 见下方推荐方案 |\n| `MEDIWISE_VISION_BASE_URL` | API 地址（OpenAI 兼"},{"path":"sleep-tracker/SKILL.md","content":"---\nname: sleep-tracker\ndescription: >-\n  睡眠追踪与质量分析。记录每晚睡眠时长和各阶段（深睡/浅睡/REM/清醒），\n  评估睡眠质量评分，查看每日详情和每周趋势。支持手动录入和可穿戴设备自动同步。\n  Sleep tracking and quality analysis. Records nightly sleep duration and stages\n  (deep/light/REM/awake), scores sleep quality, and shows daily details and weekly trends.\n  关键词：睡眠记录、睡眠质量、深睡、REM、睡眠趋势、睡眠分析、失眠、睡了多久、昨晚睡眠。\n---\n\n# Sleep Tracker - 睡眠追踪\n\n记录和分析睡眠数据，评估睡眠质量，发现睡眠规律。\n\n## 睡眠质量评分标准\n\n| 评分 | 标签 | 说明 |\n|------|------|------|\n| 85-100 | 优质 | 时长充足，各阶段比例理想 |\n| 70-84 | 良好 | 基本达标，有小幅改善空间 |\n| 55-69 | 一般 | 存在明显不足，建议关注 |\n| 0-54 | 较差 | 睡眠质量差，需要干预 |\n\n**理想睡眠参考值：**\n- 总时长：7-9 小时\n- 深睡比例：13-23%\n- REM 比例：20-25%\n- 清醒时间：<10%\n\n## 核心工作流\n\n> **强制规则**：每次调用脚本必须携带 `--owner-id`，从会话上下文获取发送者 ID（格式 `<channel>:<user_id>`，如 `feishu:ou_xxx` 或 `qqbot:12345`），不得省略。\n\n### 1. 手动录入睡眠\n\n用户说「昨晚睡了7小时」「记录睡眠」时使用：\n\n```bash\n# 录入总时长（最简方式，其他阶段留空）\npython3 {baseDir}/scripts/sleep.py log --member-id <id> --duration 420\n\n# 带阶段详情录入\npython3 {baseDir}/scripts/sleep.py log --member-id <id> --duration 480 \\\n  --deep 90 --light 240 --rem 100 --awake 30\n\n# 指定日期（默认昨天）\npython3 {baseDir}/scripts/sleep.py log --member-id <id> --duration 450 --date 2026-03-26\n```\n\n**时长换算提示：**\n- 用户说「7小时」→ duration=420\n- 用户说「7.5小时」→ duration=450\n- 用户说「7小时30分」→ duration=450\n\n### 2. 查看每日睡眠\n\n用户说「昨晚睡得怎么样」「查看睡眠」时使用：\n\n```bash\n# 查看昨晚（默认）\npython3 {baseDir}/scripts/sleep.py daily --member-id <id>\n\n# 查看指定日期\npython3 {baseDir}/scripts/sleep.py daily --member-id <id> --date 2026-03-26\n```\n\n### 3. 每周睡眠趋势\n\n用户说「这周睡眠怎么样」「睡眠趋势」时使用：\n\n```bash\n# 近7天（默认）\npython3 {baseDir}/scripts/sleep.py weekly --member-id <id>\n\n# 近14天\npython3 {baseDir}/scripts/sleep.py weekly --member-id <id> --days 14\n```\n\n### 4. 历史记录\n\n```bash\n# 最近14条（默认）\npython3 {baseDir}/scripts/sleep.py list --member-id <id>\n\n# 最近30条\npython3 {baseDir}/scripts/sleep.py list --member-id <id> --limit 30\n```\n\n## 数据来源\n\n睡眠数据来自两个渠道：\n1. **手动录入**：通过 `sleep-log` action 直接输入\n2. **可穿戴同步**：通过 wearable-sync 从 Apple Health / Gadgetbridge 自动导入\n\n两种来源均存储在 `health_metrics` 表（`metric_type='sleep'`），查询时统一处理。\n\n## 反模式\n\n- **不要重复录入同一天** — 系统会显示多条，建议先 daily 确认再录入\n- **阶段时长之和不能超过总时长** — 否则录入报错\n- **手动录入不需要精确到分钟** — 大致时长即可，质量评分有容忍范围"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Family health management suite: health records, diet tracking, weight management, wearable sync. Local SQLite storage by default; optional cloud features req... Skill: Mediwise Health Suite Owner: juneyaooo Summary: Family health management suite: health records, diet tracking, weight management, wearable sync. Local SQLite storage by default; optional cloud features req... Tags: chinese:1.0.8, diet:1.0.8, family:1.0.8, health:1.0.8, latest:2.0.8, medical:1.0.8, multimodal:1.0.8, vision:1.0.8, wearable:1.0.8, weight:1.0.8 Version history: v2.0.8 | 2026-04-07T04:54:51.654Z |","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1156,"uniquenessScore":48,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T03:13:44.962Z","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-10T03:13:44.962Z","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-10T03:40:43.222Z","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"}]}}}