Repository navigation
Releases
v0.8.1 · 修掉番茄钟提醒把会话打死的写入
番茄钟走完的自动提醒会把整个会话打成跑不起来 —— 修掉那条写入。
症状
番茄钟时间走完的那一刻,起钟的那个会话忽然任何回复都发不出去,一直显示:
format v4 message requires a producer-owned source kind
会话历史是完整的、文件也没坏,但之后每一轮都撞同一堵墙。
根因
走完钟时插件用 agent.followup() 往起钟会话塞一条提醒,source 写成
{ kind: 'plugin', plugin: 'dsh-study-desk', … }。
宿主会话格式 v4 把「kind 一律写 plugin、只靠 plugin 字段认来源」判为退役语法,
准入时直接抛错;而 followup 的消息会原样落进 agent/inbox/spliced.data.inserted[],
于是整条事件被拒——写入侧永久失败。
改法
kind 改成生产者自己命名的 plugin:dsh-study-desk:
index.js新增MESSAGE_SOURCE_KIND与timerEndSource(at),提醒一律从工厂出,不再手写字面量- 新增
test/message-source.test.js(4 条):kind 取值、能过宿主同款准入、at每次新对象、
静态扫禁止裸kind: 'plugin'回潮(带注释遮罩,讲旧写法的注释不算违规) apply-probe.mjs端到端断言同步到新 kind- 单测 73 → 78
验证
node --test:78/78 通过node apply-probe.mjs:端到端全通过- 变异自证三次:把 source 改回裸
kind: 'plugin',静态扫与端到端各自变红;还原后全绿 - 实机确认:重启后插件
/api返回0.8.1,原会话可继续对话
v0.8.0 · 督促链路 + 每日计划表
v0.8.0
AI 把督促链路接上了:AI 起番茄钟必须先落卡、走完自动提醒开钟的那个会话;新增每日计划表,模型从系统提示里就知道「现在该做什么」。看板补上过卡模式、卡片截止日期与一批顺手的升级。
- AI 起番茄钟走门禁:工具
focus起钟必须挂一张「进行中」的卡,否则拒绝并教完整流程(add建卡 →move到doing→focus挂卡);客户端手动起钟不受限。 - 番茄钟走完,提醒发回起钟的会话:
agents.get(sessionId).followup唤醒那个会话,空闲就开新一轮、跑着就排下一轮;手动停钟永不提醒;设置页可关(默认开)。 - 每日计划表:
HH:MM~HH:MM 事情 【科目】每日模板——主面板分区(当前时段高亮 + 剩余分钟)、系统提示注入「现在按计划该做什么 / 下一场」、可悬浮在桌面(坑位规矩照抄迷你条)。「启用」与「悬浮」各自独立开关。 - 过卡模式:全屏单卡复习,空格翻备注、1/2/3 打分、→ 跳过;行级「缓一天」;队列键直评队首。
- 卡片截止日期:
@YYYY-MM-DD语法、⏰ 徽章、工具参数、Markdownddl字段往返。 - 热力图点格子看当天明细 · 复制周报(
weekly.textop)· 复盘 2 秒自动落盘 · 科目编辑器 · 快捷键(/搜索、n新建)· 视觉与图标一批(绿族投入条、饼图 8 色宿主色板、品牌番茄 icon、侧栏两枚重画)。
发布走 Trusted Publisher(OIDC),provenance 已进 transparency log:sigstore 链接。
v0.7.0:修三个会静默报错数的坑,界面重排,番茄钟可自由设时长
这一版修的是三个「数字看着正常、其实是错的」,另外把界面按番茄ToDo 的调性重排了一遍。
修复
- 悬浮迷你条拖不动、也点不动:Windows 宿主在窗口顶部画了一条满宽 40px 的
-webkit-app-region: drag带。这条带上的鼠标按下被拿去做窗口拖拽,DOM 收不到事件;
而 app-region 让洞不看层叠顺序,z-index:900救不了它。偏偏唯一能逃出来的两个手势
(拖走、双击回右下角)本身也需要点击,落点又存在 localStorage —— 重载也还是坏的,
看着像代码坏了。现在两个浮层都声明no-drag,并且落点被钳制在那条带之下。 - 单词打卡的今日 / 累计时长偏小:本地那份数据躺在 Androws 虚拟磁盘里、攒一会儿才刷盘,
实测滞后过好几天(原先的取舍是「有本地就用本地」,落后的本地数每次都赢)。改成两边取较新的:
累计只增不减,取较大即取较新;「今日」每天归零、不能取大(过零点时本地和云端都还挂着前一天的数),
有云端那一行就用云端。分与秒改为同源,因为它们会被拼进注入给模型的摘要里。
连不上服务端时,面板会直接标出「本地只刷到某一天」。 - 图表不再掉成一片灰:
--dsw-alias-brand-primary在默认主题里其实是近黑,拿语义色当饼图色板
会得到「五个 tone 里三个是灰的」。饼图换成八色--dsw-static-*分类色板 +color-mix补齐,
扇区之间留一条与卡底同色的缺口;热力图 / 周报 / 顶部今日进度走绿色阶(已经投入的分钟数),
「未来 7 天到期」走琥珀、今天那一根转红(欠着的债)。计时器那条进度条语义不同,保持品牌色。
新增
- 番茄钟可以自由设定 1–240 分钟(原来只有 25 / 45 / 60 三个预设)。闲置时字面直接显示这一段多长
—— 自由值否则没有任何反馈途径,分不清到底写进去没有。
界面排版
十几个散档字号(含 9.5 / 10.5 / 11.5 / 12.5 四个半像素,会有亚像素模糊)收进一条八档阶梯;
标题从衬线换成宿主默认 sans,大数字走品牌字体、倒计时仍用等宽;卡片圆角与阴影分成两档;
间距统一到 4 的倍数;分区标题和看板列头不再画分隔线。
一处刻意取舍
图表分类色不随明暗主题翻转(宿主浅深两套主题给的是同一份色值)。分类色要稳定才有诊断价值,
看板其余部分仍然完全跟着主题走。
工程
node --test 从 48 条涨到 58 条,其中六条是新加的视觉层守卫:CSS 里 hex 必须为 0、
不许出现零点几像素的字号、饼图不许退回语义色、字阶必须挂在各个根上(迷你条是 portal 到 body 的,
漏挂会静默丢字号)。另外换行用 .gitattributes 锁成 LF,AGENTS.md 补了三条踩出来的坑。
v0.6.1 — 迷你条去掉吸附,番茄饼图与单词打卡
番茄钟从「只知道今天学了几分钟」变成「知道时间花去哪了」,迷你条也终于能停在你想放的地方。
高亮
- 迷你条不再吸附:以前松手必然被拍成左右边距,中间值不可能存在;现在拖到哪就停在哪,只做视口钳制(防拖出屏幕丢钟),落点照常记忆。顺带补了指针被弹窗抢走时的脏拖拽态兜底。
- 番茄分布饼图:按番茄的名字聚合专注时长,可切「今天 / 近 30 天」。起钟要报名字(手写名 > 挂的卡片标题 > 兜底),名字就是饼图的图例。
- 单词打卡面板:把不背单词的打卡记录接进侧栏第二个面板——连续签到、累计天数与时长、累计词数、逐月日历、正在学的词书。数据从本机 App 的
shared_prefs读,不登录网页端、不回写 App,凭据只留前 10 位。 - 复习不再被一刀切:卡片可内联编辑(标题 / 科目 / 预计分钟 / 备注);复习开关不再清空难度、遍数、遗忘次数。
- 「结束这一段」真的记账:以前发
timer.reset,专注 20 分钟点结束记 0 分钟;现在按实际时长落一条 session(「放弃」仍不记账)。
v0.4.0 遗忘曲线与复习调度
- 每张到期卡带一条迷你记忆曲线 + 「记忆 N%」(
R(t) = e^(-t/S),曲线在排期那天正好落到 90%),横轴固定 30 天,稳的卡近乎水平、刚忘过的卡往下掉,一眼挑出最脆的那张。 - 未来 7 天到期预报,把复习量摊平。
- 今日建议:在到期队列之上再排一次顺序,写明理由(逾期几天 / 忘过几次 / 难度偏高 / 新卡),并按科目轮换避免连着三张同科;量超过一轮的 1.5 倍时直接劝你顺延。
修复
- 复习开关清空 SM-2 历史(
reps/ease/lapses被emptyReview()抹掉)。 - CI 的
total files断言改成按package.json的files白名单逐个核对,不再因为多一个源文件就红。
测试
48 个单测(数据层、番茄钟状态机、复习排期、遗忘曲线/预报/建议、Markdown 往返、不背单词 prefs 解析)+ 离线冒烟 apply-probe.mjs,全绿。运行时零依赖,不需要构建,不需要联网。
安装:在 DSH profile 目录执行 dsh plugin add dsh-study-desk,再把包名加进该 profile package.json 的 dsh.profile.bundles 数组。装完新开一个会话。
npm 上已可安装:npm i dsh-study-desk@0.6.1
v0.2.0 · 复习队列 + 标签过滤 + 周报 + 每日复盘 + Markdown
v0.2.0
面向备考与学术人群补齐了「复习」这条主线,并把数据接进了 Markdown 生态。
- 间隔重复复习队列:卡片带
review{due, intervalDays, ease, reps, lapses},
用「忘了 / 记得 / 很简单」三档打分推进排期(简化版 SM-2)。已完成的卡照样会到期。
工作台顶部有今日队列,卡片右下角 ↻ 拉进或移出,设置页可调每次摆几张。 - 标签与过滤:卡片带
tags[],新建时写#名词解释就地打标;看板顶部可搜、
按科目、按标签、只看到期,列头显示「符合/总数」。 - 周报:按周(周一起)统计时长、活跃天数、复习次数与环比,配本周科目分布。
- 每日复盘:
journal{}按天存一条短记录,会随摘要进系统提示。 - Markdown 导出 / 读回:生成 Obsidian 友好的
desk.md(科目分节 + 复选框 +
行尾 HTML 注释存机器字段),读回按 id 合并而不是覆盖。 study_desk工具从 7 个 action 扩到 10 个(新增review/journal/report),
add/update认tags与review。- 修:工作台面板自己出滚动容器(宿主中心列是
overflow:hidden的 flex 列,
原先下半截永远看不见);常驻迷你条 portal 到document.body(宿主shell.overlay
是z-index:20的独立层叠上下文,原先被页面级浮层盖住导致点不动、拖不动)。 - 老
desk.json无需迁移,读入时自动补齐新字段。 - CI:GitHub Actions 跑单测与离线冒烟(Node 22 / 24),外加一条
「cordis.patch.yml必须是裸包名、代码里不许有本机路径」的可移植性检查。 - npm 发布改成手动触发的 workflow(发出去的版本删不掉,不跟 tag 自动联动)。
npm 上已可安装:npm i dsh-study-desk(v0.2.0 已发布,latest 指向它)。
装进 DSH:dsh plugin add dsh-study-desk,或在本仓库跑 node install.mjs --profile <profile 目录>。