dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Garmin Connect 同步 + AI 教练分析 + 训练计划生成 — DeepSeek Harness 插件。
把你的 Garmin 账号连到 DSH,自动同步活动/健康/HRV 数据,AI 基于真实数据给出专业训练建议。
⚠️ 免责声明
本插件通过逆向分析调用 Garmin Connect 的内部接口,使用非佳明官方公开的 client_id 模拟客户端登录。佳明不为第三方使用背书,账号可能因异常登录被限流或封禁。
本插件仅供学习与个人研究使用,请勿用于批量同步他人账号或任何违反佳明《Terms of Service》或所在地区法规的场景。
本插件按 「现状」(AS IS) 提供,作者不承担因以下原因造成的任何损失:
- 佳明账号被封禁、限流或任何处置
- 同步数据丢失、错乱、延迟
- 训练建议 / 训练计划不当造成的健康问题
- 佳明接口改版导致插件不可用
- 您违反佳明 ToS 或所在地法规而产生的法律后果
使用即表示您已理解并接受上述风险。
| 模块 | 内容 |
|---|---|
| 🔐 认证 | CN 账号 + 短信 MFA + DI OAuth2(access token ~1h 自动 refresh) |
| 📊 数据同步 | 增量同步(不重复拉全量),手动触发(防 Garmin 行为指纹检测) |
| 📈 运动看板 | 30+ 分析(距离/配速/心率/HR-Pace/步频/TRIMP/时段/一致性等) |
| 🤖 AI 训练建议 | 规则生成洞察(PB 变化、跑量趋势、步频建议等) |
| 📋 训练计划 | AI 生成结构化计划 + 打卡勾选 + 历史版本/恢复 |
| 📓 训练日记 | 训练后记感受/评分 + 时间线查看 |
| 🔄 AI 工具 | 17 个工具,AI 对话中可直接调用(如"月报"/"训练计划") |
| 💾 持久化 | 数据存 ~/data/(garmin.json + training-plan.json + training-diary.json) |
DSH 启动时只显式加载 dsh.profile.bundles 列表里的包,不自动扫 node_modules/ 加载所有 dsh-* 包(这是设计:稳定性、隔离性、性能)。所以 pnpm add dsh-garmin-coach 装包后,必须手动加到 bundles——这是 DSH 的工作方式,不是 bug。
DSH 官方推荐用
dshmarket(应用市场)装包——它会自动加 bundles。dsh-garmin-coach目前还在审核中,临时手动加即可。
cd ~/.dsh/profiles/web
pnpm add dsh-garmin-coach
装完后还需要把 dsh-garmin-coach 加到 bundles(DSH 启动时只显式加载 bundles 里的包):
方法 1:手动改 package.json
编辑 ~/.dsh/profiles/web/package.json,在 dsh.profile.bundles 列表末尾加:
"dsh": {
"profile": {
"bundles": [
...其他包,
"dsh-garmin-coach" ← 加这行
]
}
}
方法 2:命令行追加
cd ~/.dsh/profiles/web
node -e "
const fs = require('fs');
const p = JSON.parse(fs.readFileSync('package.json', 'utf8'));
if (!p.dsh.profile.bundles.includes('dsh-garmin-coach')) {
p.dsh.profile.bundles.push('dsh-garmin-coach');
fs.writeFileSync('package.json', JSON.stringify(p, null, 2) + '\n');
}
"
加完后重启 DSH(您自己执行):
ddsh restart
打开 DSH → 设置 → 应该看到 Garmin Coach 卡片。
在 ~/.dsh/profiles/web/cordis.patch.yml 手动添加(如果不想用 bundles):
- insert:
- id: garmin-coach
name: dsh-garmin-coach
⚠️ 首次同步后,数据存到
~/data/garmin.json(macOS/Linux 用户 Home 目录)。Windows 用户在 DSH 启动目录下的data\garmin.json。
点击侧栏 Garmin Coach → 打开运动看板。
默认显示:
最近活动表支持:
直接用自然语言提问,AI 自动调用工具:
| 自然语言 | AI 调用 |
|---|---|
| "六月份报告" | garmin_report(month) |
| "我十公里最好成绩" | garmin_best_pace(10000) |
| "本周跑量" | garmin_distance_stats(week) |
| "帮我制定半马破2计划" | garmin_training_plan + garmin_save_training_plan |
| "记录今天的训练:跑了 6km,4星" | garmin_log_diary |
| "我的训练进度" | garmin_plan_progress |
对话:"帮我制定 10km 进 5:30 的计划"
→ AI 调 garmin_training_plan(基于您的基线数据)
→ AI 生成 4 周计划 + 16 个训练任务
→ AI 调 garmin_save_training_plan 保存
打开看板 → 看到训练计划(默认折叠)→ 点 ▶ 展开 → 勾选完成的任务
误操作:AI 误覆盖 → 对话:"找回之前的计划" → AI 调 garmin_plan_history + garmin_restore_plan
sso.garmin.cn(中国账号)sso.garmin.com(其他地区)所有数据存到 DSH 用户的 data/ 目录(macOS/Linux 是 Home 目录,Windows 是 DSH 启动目录):
~/data/ # macOS/Linux
%USERPROFILE%\data\ 或 <DSH_cwd>\data\ # Windows
├── garmin.json # meta + daily(同步数据,约 100 KB)
├── garmin-activities.json # activities(约 1.75 MB,单独文件)
├── training-plan.json # 当前训练计划 + 打卡状态
├── training-diary.json # 训练日记
└── training-plan-history/ # 计划历史(自动备份)
本插件需要把同步数据、训练计划、训练日记写入 ~/data/(macOS/Linux)或 C:\Users\<you>\.dsh\data\(Windows)。
DSH 在沙箱里运行,默认没 full access 权限——会导致:
修复方法(在 DSH 里启用文件写权限):
| 平台 | 步骤 |
|---|---|
| macOS | 第一次写文件时会弹"权限"请求 → 允许"完整文件访问" |
| Windows | DSH 设置 → 沙箱/安全 → 开启「完整文件访问」(full file access) → 重启 DSH |
| Linux | 通常默认有权限;如有问题检查 ~/data/ 目录权限 chmod 755 ~/data |
插件已自带保护:写文件前会探测权限,权限不足时会返回明确错误(包含路径 + 修复方法),而不是静默失败。
garmin_whoami / garmin_daily / garmin_sleep / garmin_hrvgarmin_activities / garmin_summarygarmin_sync / garmin_recent_activities / garmin_best_pacegarmin_report / garmin_training_plan / garmin_save_training_plangarmin_toggle_task / garmin_plan_progress / garmin_restore_plangarmin_log_diary / garmin_diary~/data/),不上传任何服务器npm install
npm run build # tsc → lib/
npm run typecheck # 类型检查
data/~/data/process.env.HOME/data(统一路径)src/
├── index.ts # 插件主入口(apply/register/工具注册)
├── storage.ts # GarminStoreFile(数据存储 + 3 文件 IO + 计划缓存)
├── sync.ts # 同步逻辑(增量 + 4 端点并行 + 空 daily 过滤)
├── stats.ts # 运动分析 + 报告聚合 + dailyRecent 推送
├── settings-web.ts # settings route(/garmin-settings)
├── boundary.ts # 错误边界(withBoundary 容错)
├── logger.ts # 日志(落盘到 plugin 日志文件)
├── tools/
│ ├── register.ts # 基础工具(6)
│ └── stats-tools.ts # 统计工具(11)
├── auth/
│ ├── client.ts # DI OAuth2 + token refresh
│ ├── file-store.ts # 持久化 token/mfa state
│ ├── cookie-jar.ts # Set-Cookie 解析
│ ├── token-store.ts # TokenStore 接口
│ ├── types.ts # 类型定义
│ └── constants.ts # CN/国际端点
└── api/
└── queries.ts # 5 端点查询方法(daily/sleep/hrv/readiness/training/activities/summary/whoami)
lib/ # 编译产物
├── *.js + *.d.ts
└── client.js # 看板前端(手写 React IIFE)
cordis.patch.yml # 注册入口
package.json
tsconfig.json
见 CHANGELOG.md。
欢迎提 issue / PR。建议先开 issue 讨论再改。
MIT — 详见 LICENSE。