DSH 日历日记:侧栏纯记事本

前言

DeepSeek Harness(DSH)的定位是「一切皆插件」,开发者可以自由扩展侧栏面板、命令与工具链。然而多数侧栏插件要么做日程提醒,要么做笔记聚合,很少提供「本地、离线、持久化」的简单记事方式。DSH 社区里也缺少一个纯记事本:把一天的记录写在一个 Excel 文件里,侧栏按月历展示,不联网、不依赖云同步。

插件定位

dsh-calendar-diary(日历日记)是 DSH 的一个纯记事本插件,由 liwangzimo 维护。它不提供提醒、通知、标签、搜索或云同步,也不与 DSH 的官方「自动化任务」联动。插件通过侧栏月历面板展示日期,每一天的内容写在用户指定的 .xlsx 文件里(默认位置为用户目录下的 .dsh/dsh-calendar-diary/diary.xlsx)。数据格式与桌面日历软件 DesktopCal 导出的两列结构一致,方便导入已有数据。

核心功能

侧栏「日历日记」面板

  • 月历网格一次显示 10 周(10 行 × 7 天,周一开头)。
  • 格子内直接显示当天内容,超出部分裁切;鼠标悬停查看全文。
  • 有记录的日子带标记。
  • 支持左右切换月份、回到今天。
  • 点击某天弹出编辑框,可新增、修改、删除当日记录;保存或 Ctrl+Enter 提交,删除按钮清空当日文本但保留行。

数据文件管理

  • 面板顶部显示当前数据文件路径,点击「更改…」可切换文件(只改变指向,不移动数据)。
  • 数据文件为 .xlsx,默认位置与格式见「数据格式」。
  • 支持导入 .xlsx / .xls 文件,导入前先预览:显示来源、行数、日期范围、新增 / 冲突 / 未变 / 跳过的条目数,并逐条列出冲突。
  • 选择冲突策略(默认「保留现有」),确认后执行导入,写入前自动备份。

导出功能

  • 支持导出范围:全部 / 某年 / 某月。
  • 导出为同构的 .xlsx,只写入新文件,不修改数据文件本身。
  • 目标若为当前数据文件本身会被拒绝,避免一次导出导致范围外的天数被清空。

安装与启用

安装前需要 DSH(桌面版或网页版均可),插件同时包含宿主半与客户端半。

方式一:从 GitHub 安装

& '<DSH 安装目录>\resources\runtime\cli\bin\dsh.cmd' plugin --profile <profile> add "github:liwangzimo/dsh-calendar-diary" --config.minimumReleaseAge=0

方式二:克隆到本地后按目录安装

git clone https://github.com/liwangzimo/dsh-calendar-diary.git
& '<DSH 安装目录>\resources\runtime\cli\bin\dsh.cmd' plugin --profile <profile> add "link:<克隆下来的目录>" --config.minimumReleaseAge=0

--config.minimumReleaseAge=0 只放宽这一次命令的供应链策略(DSH 的 profile 默认拒绝”太新”的包)。不加可能因 ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION 失败。

注册 bundle

dsh plugin add 只安装依赖,还需在 profile 的 package.json 里登记插件:

"dsh": {
  "profile": {
    "bundles": [
      "…",
      "dsh-calendar-diary"
    ]
  }
}

修改后完全退出并重启 DSH。重启后侧栏应出现「日历日记」面板,或访问 http://<DSH 地址>/dsh-calendar-diary/state 检查 JSON 输出。

卸载

& '<DSH 安装目录>\resources\runtime\cli\bin\dsh.cmd' plugin --profile <profile> remove dsh-calendar-diary

删除 dsh.profile.bundles 中的对应条目,重启。

数据格式

数据文件为 .xlsx,默认位置为用户目录下的 .dsh/dsh-calendar-diary/diary.xlsx(首次运行时创建):

项 值
工作表 DesktopCal
A 列 整数 Excel 日期序列号(1900 系统),单元格格式固定 m/d/yy
B 列 自由文本,可多行(\r\n),时间直接写在文本里
行序 日期降序;一天最多一行

该格式与 DesktopCal 导出的两列一致,因此已有的 DesktopCal 导出数据可直接导入。

HTTP 接口

插件在宿主半注册了以下 HTTP 路由(客户端同源调用,无会话依赖):

方法 路径 说明
GET /dsh-calendar-diary/state 数据文件路径、是否存在 / 可写、总行数、有记录的月份(降序)、今天
GET /dsh-calendar-diary/entries?month=YYYY-MM 该月条目 [{ date, serial, text }]
POST /dsh-calendar-diary/entries { date, text } 写入 / 覆盖一天;text:'' 置空但保留行
POST /dsh-calendar-diary/entries/remove { date } 删掉该行
POST /dsh-calendar-diary/path { dataPath } 换数据文件(校验是可用日记、拒绝 .xls)
POST /dsh-calendar-diary/pick-dir 原生文件夹对话框(不可用时返回 {ok:false,error},界面回落手输)
POST /dsh-calendar-diary/list-files { dir } 列出候选 .xlsx / .xls
POST /dsh-calendar-diary/import/scan 只读预览导入,不写盘
POST /dsh-calendar-diary/import/apply { sourcePath, policy } 执行导入(先备份再原子写)
POST /dsh-calendar-diary/export { scope, value, outPath } 导出新 .xlsx

错误一律返回 JSON:{ ok:false, error:'<code>' },并伴随相应的 4xx / 5xx 状态码。

适用场景与注意事项

  • 适合需要本地、离线、持久化记录的用户,尤其是习惯用 Excel 管理条目的场景。
  • 数据完全在本地,插件只读写指定的 .xlsx 文件,不联网、不依赖云服务。
  • 一天只保留一行:如果数据文件里同一天有多行,读取时按首行优先,后续写入会覆盖该行。
  • 导入必须先预览再应用:预览由客户端实现,宿主半无状态,/import/apply 单独调用也会执行,但无法按天逐个决策。
  • 两位数年份的文本日期(如 11/25/26)按 20xx 解释,与 Excel 在该日期范围内的行为一致。
  • 插件以当前 DSH 进程的权限运行,安装前建议检查源码与许可证(MIT)。

小结

dsh-calendar-diary 提供了一个极简的本地记事方案:侧栏月历面板配合 .xlsx 文件,支持导入导出与冲突处理,不联网、不依赖云同步。对于希望把记录落在自己控制文件中的开发者,它是一个轻量、可控的补充工具。

  • 插件主页:https://github.com/liwangzimo/dsh-calendar-diary
  • 技能社区目录:https://www.skillhub.cn/plugins/liwangzimo/dsh-calendar-diary
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜