番茄时钟 dsh-pomodoro-card
DeepSeek Harness 插件:在会话输入框下方的环境栏(conversation.composer.dock)里常驻一个番茄钟,
用圆环倒计时显示当前阶段,提供专注 / 短休息 / 长休息三段循环。
预览
截图里输入框下方那一条就是计时卡:左侧圆环显示剩余时间与开始/暂停状态,中间是阶段名和
本轮循环进度,右侧是重置、跳过、设置三个按钮。
点击右侧的 ⚙ 会打开设置面板,面板浮在计时卡上方,不占用对话区域:
功能
- 三段循环:专注 → 短休息 → 专注 …,每完成 4 个专注进入一次长休息(次数可调)。
- 倒计时圆环:点击圆环开始 / 暂停 / 继续;圆环随剩余时间收缩,颜色随阶段变化
(专注番茄红、短休息绿、长休息蓝)。 - 阶段操作:重置本阶段(回到完整时长)、跳过本阶段(不计入完成数)、打开设置。
- 进度提示:阶段名 + 当前循环内的圆点进度(● ● ○ ○)。
- 今日统计:按本地日期统计当日完成的专注数,跨天自动归零。
- 可调设置:专注 / 短休息 / 长休息时长(分钟)、长休息间隔(个番茄)、
自动开始下一阶段、完成提示音、系统通知;支持一键恢复默认。 - 刷新不丢:用绝对结束时间写入
localStorage,刷新或重开页面后继续倒计时;
同一 Harness 窗口内的多个会话共享同一个计时器。 - 完成提醒:阶段结束时,输入框下方的计时卡会弹出一条提醒(说明下一阶段、时长,
以及是自动开始还是等待手动开始),10 秒后自动收起,也可以点 × 立即关闭。 - 提示音:阶段完成时用 Web Audio 播放三音提示;浏览器要求先在页面上有一次点击 / 按键
才能出声,插件会在开始计时后持续保持音频解锁,刷新后第一次点击页面也会自动恢复。
开启系统通知后(设置面板会显示授权状态,可点「发一条测试通知」立即验证),阶段完成还会发一条桌面通知。桌面通知本身不响铃(声音由提示音负责),12 秒后自动关闭。
测试通知发送成功后面板里会出现绿色提示;如果通知只出现在通知中心而没有横幅,
通常是 macOS 把该应用的提醒样式设成了「无」(见下方设置项说明)。 - 跟随语言:内置中 / 英文案,跟随 Harness 的语言设置即时切换(默认回退英文)。
目录结构
pomodoro-timer/
├── package.json # bundle 清单:dsh.bundle / dsh.client 声明
├── cordis.patch.yml # 把插件挂进 profile 的插入补丁
├── index.js # Host 半边(空实现,计时器完全在 Client 侧)
├── client.js # Client 模块:计时状态机 + 输入框下方 dock 组件
├── locale/
│ ├── en.json # 插件市场上的英文标题 / 描述
│ └── zh.json # 插件市场上的中文标题 / 描述
├── icon.svg # 插件图标(插件包)
├── icon.png # 市场条目图标(GitHub 托管的 PNG)
├── preview.png # README 里的主截图
├── setting.png # README 里的设置面板截图
├── test/
│ └── run-tests.mjs # 无浏览器 / 无 React 依赖的行为测试
├── LICENSE # MIT
├── MARKETPLACE.md # 上架到 DSH 插件市场的步骤
└── README.md
安装
插件通过 Harness 的插件管理器以本地 bundle 安装(在 profile 的 node_modules 中以 symlink 链接本目录):
- 在本会话中,让代理执行:
plugin_manager(action: "install_bundle", target: "<本目录的绝对路径>") - 或在 Harness 的插件管理界面里选择「从本地目录安装」,指向本目录。
安装完成后输入框下方会出现番茄钟;如果没出现,刷新一次 Web 界面。
上架到插件市场(让其他人也能在 Discover 里搜到)的步骤见 MARKETPLACE.md。
使用
| 操作 | 行为 |
|---|---|
| 点击圆环 | 开始倒计时 / 暂停 / 继续 |
| ↺ | 重置当前阶段到完整时长(不改变已完成数) |
| ⏭ | 跳过当前阶段,不计入完成数 |
| ⚙ | 展开 / 收起设置(面板从计时卡上方展开,Esc 收起) |
设置项:
- 专注时长 / 短休息 / 长休息:1–120 / 1–60 / 1–120 分钟。
- 长休息间隔:每完成几个专注进入长休息,1–8 个。
- 自动开始下一阶段:关闭后,每个阶段结束会停在待开始状态,需手动点圆环。
- 完成提示音:用 Web Audio 合成三音提示,不依赖音频文件。
- 系统通知:先在 macOS「系统设置 → 通知 → DeepSeek Harness」允许并把提醒样式设为「横幅」或「提醒」(若选「无」,通知只会静默进入通知中心),再打开本开关(默认关,首次开启会申请授权)。设置面板会显示「系统通知已就绪 / 尚未授权 / 已被拒绝」,点「发一条测试通知」可立刻验证,发送成功后会出现绿色确认。专注模式 / 勿扰也会压掉横幅;应用内提醒条不受影响。
其他行为:
- 跳过专注不会增加「今日完成」和循环圆点。
- 专注完成时计数 +1,并按长休息间隔决定下一阶段;休息结束回到专注。
- 默认「自动开始下一阶段」是开着的:专注结束会立刻切到休息并开始倒计时,休息结束再切回专注。
想每段结束都停下来,关掉该开关即可,提醒里会显示「已暂停,点开始继续」。 - 完成提醒不会写入
localStorage,刷新页面后不会重复弹出。
数据
- 存储键:
dsh:pomodoro:timer:v1(localStorage)。 - 内容:当前阶段、运行状态、绝对结束时间、暂停剩余时长、已完成专注数、今日统计、设置。
- 清除该键即可恢复默认状态;设置面板中的「恢复默认」只重置设置项。
开发
- 纯 Client 模块,无需构建:
client.js里嵌入 React(require('react'))、字典和样式,
以window.__ModuleLoader__.load({ id, factory })注册,然后在
conversation.composer.dock槽位注册组件。 - 修改后无需重装(profile 里是指向本目录的 symlink),刷新 Web 界面即可;
若改了package.json里的 name /dsh清单,需要重新安装一次。 - 计时器逻辑在 store 中以 250ms 的 ticker 驱动,只在显示秒数变化 / 阶段切换时通知订阅者,
每次动作和阶段切换时落盘,不会每秒写localStorage。 - 主题使用 Harness 的
--dsw-alias-*设计令牌;番茄红 / 绿 / 蓝只作为计时器本身的识别色。
测试
npm test # 等价于 node test/run-tests.mjs
测试不需要浏览器或 React:test/run-tests.mjs 用 node:vm 伪造 window(内存
localStorage、可手动推进的假时钟、捕获的定时器、假的 document)加载真实
client.js,注入一个极小的 React hook 垫片,覆盖开始/暂停/重置/跳过、阶段切换、
长休息轮转、跨天统计、刷新恢复、设置夹取与落盘、以及组件的渲染与交互。