DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Water Reminder — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
W

@dsh-plugin/water-reminder

Water Reminder

DeepSeek Harness 的饮水提醒:每隔随机 40-60 分钟通过原生操作系统通知、对话中的智能体提醒、侧边栏倒计时面板以及内置的 hydration-coach skill 发送提醒

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:Smallballoons01/dsh-water-reminder#338b003a4542ba1f804b78f84c5970fddaf157bc
README兼容性版本

兼容性与来源证明

Water Reminder 以 @dsh-plugin/water-reminder 发布,当前版本为 0.1.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/9/17

版本

0.1.0stable
2026/9/17

相关插件

正在加载相关插件…

最新版
0.1.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 1
周下载
0
最近提交
2026/9/17
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 integrations-communication 分类下经过校验的插件。

Acp App@deepseek-ai/dsh-acp-appdsh ACP 配置文件包:基于 dsh-base 的仅限自动化的 JSON-RPC stdio 和进程生命周期管理Im@xmanrui/dsh-im将十一种 IM 渠道和一个公网 AI Office 接入本地 DeepSeek Harness。Pocketdsh-pocket把 DeepSeek Harness 装进你的口袋:一个包、一个设置页,手机扫码即同步访问电脑上的 DSH(局域网 + 公网,实时同屏)。DSCODE@toddzheng024/dscode-bundle完整的 DeepSeek 编码代理,支持持久化 shell、Ultra 协作和自动权限审查。

README

dsh-water-reminder

A hydration reminder plugin for DeepSeek Harness.

People forget to drink while they are deep in work. While a session is live this plugin reminds every 40–60 minutes, drawn at random, and delivers each reminder through three independent channels — missing one still leaves two:

ChannelHow it landsNeeds
🖥️ OS notificationosascript on macOS, a WinRT toast on Windows, notify-send on Linuxctx.subprocess (part of dsh-base)
💬 In-conversation nudgea plugin message injected into every live root session, so the assistant says one linethe agents service
🔔 Browser notificationthe sidebar panel watches reminderSeq and the tab raises its own notificationpage open + user permission

Plus a sidebar countdown panel, a settings page, and an embedded hydration-coach skill.

Why 40–60 at random

The irregularity is the point. A perfectly regular timer is what teaches people to ignore it — which is why "drink water on the hour" apps get switched off. Redrawing the interval from the band on every reminder keeps the rhythm unpredictable, which is what makes it work.

Install

# from a local checkout (writes the profile's package.json and dsh.profile.bundles)
dsh plugin --profile web add link:/path/to/water_reminder

# or from a packed tarball
pnpm pack && dsh plugin --profile web add ./dsh-plugin-water-reminder-0.1.0.tgz

Then restart dsh web: the timer and the tools mount at session start. Never keep two water-reminder rows in one profile — each would start its own timer and register the /water/api prefix route, and the duplicate route makes the whole plugin tree fail to boot.

Tools

ToolPurpose
water_statusToday's intake, remaining, cups, goal streak, current band, quiet hours, next reminder, 7-day series
water_logRecord a cup (defaults to the configured cup size; accepts milliliters and note). Append-only, never deduplicated
water_snoozeDefer the next reminder; defaults to 5 minutes
water_controlstart / stop / set-band / set-goal / remind-now / reset

water_control writes runtime overrides into the state file rather than editing the profile config; reset drops those overrides and falls back to configuration.

Configuration

In the profile's cordis.patch.yml (defaults ship in the plugin's own cordis.patch.yml):

FieldTypeDefaultMeaning
enabledbooleantrueWhether the loop runs at start-up
intervalMinMinutesnumber40Lower bound of the random interval, in minutes
intervalMaxMinutesnumber60Upper bound of the random interval, in minutes
dailyGoalMlnumber2000Daily intake goal
cupMlnumber250Milliliters recorded for one "cup"
snoozeMinutesnumber5Default deferral for water_snooze
quietHours.enabledbooleanfalseHold reminders inside a local-time window
quietHours.from / .tostring22:00 / 08:00The window (may wrap past midnight); a draw inside it resumes at the window's end
notify.osbooleantrueOS notification
notify.agentbooleantrueIn-conversation nudge
notify.soundbooleantruePlay a sound with the OS notification
stateFilestring$DSH_HOME/water-reminder.jsonPersisted state location
promptSectionbooleantrueInject the reminder briefing into the system prompt
skillbooleantrueRegister the embedded hydration-coach skill

The band is clamped to [5, 720] minutes, the goal to [200, 20000] ml, and the cup to [50, 2000] ml. A user patch replaces the whole entry config, so restate every field you want to keep when overriding one.

Web surfaces

  • Sidebar footer 💧 button — carries the live countdown to the next reminder (shows "Paused" while off, ✅ once the goal is met). The panel has today's progress bar, cups/streak/band, next reminder, a 7-day bar chart, +250ml logging, snooze, remind-now, pause/resume, and a control to grant browser-notification permission.
  • Settings page — the full rhythm/goal/quiet-hours/channels form. Writes land in $DSH_HOME/settings.yaml and hot-reload; changing the band or quiet hours rearms the timer immediately.

The two switches marked "(restart)" (promptSection, skill) are read at load time and need a Harness reload.

Skill

The same instructions ship two ways:

  1. Runtime registration — at mount the plugin calls ctx.skills.register(), so the model sees hydration-coach in its skill catalog with no filesystem skill root at all.
  2. On disk — skills/hydration-coach/SKILL.md, for deployments that prefer a filesystem skill root (~/.dsh/skills, ~/.agents/skills, a project .dsh/skills).

skill.js is the single source of truth and npm test asserts the checked-in SKILL.md matches the embedded body byte for byte, so the two delivery paths cannot drift. Run npm run skill after editing the body.

The skill covers which tool to call when, how to react to a reminder (one short line, no health lecture, never derail the current task), logging rules, how to retune the rhythm, estimating a personal goal from body weight (30 ml × kg), and tone/safety boundaries (no medical claims).

How the reminder loop behaves

  • The state file owns the state. Timer, next due time, and intake log live in $DSH_HOME/water-reminder.json, written through a temp file plus rename so a crash cannot truncate it.
  • No backlog after a restart. A stale nextDueAt draws a fresh interval instead of firing the missed reminders at once.
  • Quiet hours push a draw inside the window to the window's end rather than redrawing, so the behaviour stays predictable.
  • A manual reminder leaves the rhythm alone. remind-now delivers once without resetting the pending reminder.
  • Disposal drains. Unloading the plugin waits for an already-queued state write, so a cup logged at the last moment is not lost.
  • The timer is unref()ed, so the reminder loop never keeps the process alive.

Known limitations

  • Reminders only exist while Harness is alive. There is no email, SMS, or push channel. With the process down, only the OS notification path exists — and only while it is up.
  • The Windows toast needs WinRT, invoked as powershell -EncodedCommand (UTF-16LE base64) so quoting and CJK text are safe. If PowerShell is restricted by policy the reminder degrades to a log line, while the other two channels still fire.
  • Browser notifications need a user gesture to request permission; the 🔔 control in the panel is that gesture.
  • The 7-day series is panel-only. water_status returns a compact one-line text form instead, which keeps the tool's output schema free of nested arrays.

Development

Prerequisites

The plugin has zero runtime dependencies — @deepseek-ai/dsh-tools, dsh-llm, schemastery and friends are peer dependencies that the Harness supplies at runtime.

Note, though, that the versions this plugin is developed against are not published to npm (npm's latest @deepseek-ai/dsh-tools is 0.0.1-rc.1; this plugin targets 0.1.6-alpha.1), so a fresh clone cannot npm install a working test environment. Pick one of three:

# 1) Run the dependency-free part only — works immediately after cloning
npm test              # 35 pass / 2 skip, and each skip says why

# 2) Reuse the packages from an existing local Harness profile (fastest, offline)
mkdir -p node_modules/@deepseek-ai
for p in cordis dsh-llm dsh-tools dsh-settings dsh-skill dsh-system-prompt schemastery; do
  ln -sfn "$HOME/.dsh/profiles/node_modules/@deepseek-ai/$p" "node_modules/@deepseek-ai/$p"
done
npm test              # 60 pass, including the real cordis composition tests

# 3) Build the Harness from source and link this plugin the way it documents
git clone https://github.com/deepseek-ai/deepseek-harness

Use 2 or 3 for the full suite; 1 is enough when you are only touching pure logic (hydration.js / notify.js).

Scripts

npm test              # 60 tests with dependencies; 35 pass + 2 skip without
npm run skill         # regenerate SKILL.md from skill.js
npm run skill:check   # verify SKILL.md is in sync
FileCoverageNeeds Harness
test/hydration.test.jsPure logic: band normalization, random-draw bounds, quiet hours across midnight, streaks, summary, config completionno
test/notify.test.jsExact per-platform argv, AppleScript/XML escaping, PowerShell encode round-tripno
test/skill.test.jsEmbedded skill identical to the on-disk SKILL.md byte for byte, spec-compliant name, tool names completeno
test/plugin.test.jsTool behavior against a minimal fake context, asserting every result matches its own declared output.schemayes
test/integration.test.jsMounted on a real Context with the real tools/skills/systemPrompt services: dependency resolution, skill discoverability, clean disposal, and no disk writes during teardownyes

When the packages are missing, the last two files skip with a printed reason instead of turning the suite red.

License

MIT — see LICENSE.