Passer au contenu principal
K

dsh-pomodoro-timer

kseleven/dsh-pomodoro-timer

A pomodoro timer docked below the composer in DeepSeek Harness, with focus/short/long cycles, a resumable countdown, chime, optional system notifications and bilingual settings.

Installer

dsh plugin --profile web add github:kseleven/dsh-pomodoro-timer

README

番茄时钟 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 垫片,覆盖开始/暂停/重置/跳过、阶段切换、 长休息轮转、跨天统计、刷新恢复、设置夹取与落盘、以及组件的渲染与交互。

Plugins associés