Happycoding Everyday(dsh-happycode):把 DSH 本地会话画成 GitHub 式年度贡献图

前言

用 DeepSeek Harness(DSH)写代码、调工具时,会话会落在本机 ~/.dsh/sessions/ 里,但宿主界面通常不会按「天」汇总这些活动。若你想像 GitHub 个人页那样,用一周一列、深浅绿格回顾自己在一整年里的使用强度,需要自己读日志、算权重、再画网格。

Happycoding Everyday(npm 包与插件 id 均为 dsh-happycode)是社区维护者 luoyiyxo 发布的 DSH 插件,分类为「趣味换装」。它只读本地会话日志,在侧边栏账号菜单里打开对话框,展示 GitHub 风格的年度贡献热力图;数据不出本机,也不是在线服务。

这是什么

一句话:把 DSH 已在磁盘上写入的 session 日志,按日聚合成一个数字,再用与 GitHub 相近的布局与配色画成日历年的热力图。

社区插件目录是独立站点,与 DeepSeek / 幻方无官方从属关系;安装前建议自行查看源码与许可证。插件以当前 DSH 进程权限运行,能读到的会话目录与宿主一致。

核心功能

界面与入口

安装并重启 DSH 后,在侧边栏底部 头像菜单 中会出现 HappyCode 项(位于 Settings 与 Feedback 之间);对话框标题为完整名称 Happycoding Everyday。

对话框风格对齐宿主 Settings:居中品牌、右上角关闭、Esc 与点击遮罩关闭。内容区包含:

  • 资料行:120px 头像、24px 用户名,以及从账号启动器读取的 Coding since …;无头像时用品牌色块首字母;无可用账号时不绘制该行(宿主仅暴露脱敏邮箱时不会把 @ 当名字展示)。
  • 单视图:一个日历年:1 月至 12 月,周一为列起点,首尾空白格避免邻年数据混入。
  • 自适应网格:格大小随卡片宽度计算(设计宽度约 21px,下限 14px),窗口变化时重算,右侧不留空列。
  • 轴标签:月份 Jan…Dec,星期 Mon / Wed / Fri(18px)。
  • 图例:卡片内网格下方右对齐,与 GitHub 位置一致。
  • 年份选择:卡片右侧,当前年以及有活动的年份(新到旧,最多三个按钮);新年即使没有活动也会出现按钮。
  • 单元格 tooltip:沿用 GitHub 措辞,例如 19 contributions on October 24th.、No contributions on October 23rd.。
  • 主题:浅/深两套 GitHub 色板,跟随宿主主题。

什么算「贡献」

每天一个数值,来自会话日志中的三类事件(详见仓库 docs/data-schema.md):

事件 权重符号 默认权重
用户发送的消息(user/message,真实用户来源) m 1
工具调用(tool/call) t 1
写文件的工具调用(write、edit、str_replace_editor 等) f 3

计算公式:value = 1·m + 1·t + 3·f。

明确不计入:注入上下文(运行时快照、skill 目录、时间上下文)、助手消息、工具结果、子 agent 会话、空会话。

颜色分档基于当前窗口内非零日的 25/50/75 分位数;活跃日少于 8 天或分位数重合时,回退为 GitHub 固定档位 1–9 / 10–19 / 20–39 / 40+。

可在宿主 Plugins 插件配置页修改三个权重数字,并点 Recalculate 重算。

隐私与数据路径

  • 无网络请求:仅通过 loopback HTTP 与宿主通信;无遥测、不拉字体或外链头像。
  • 日志只读:~/.dsh/sessions/ 与会话投影缓存只读。
  • 唯一可写目录:~/.dsh/profiles/<profile>/.dsh-happycode/(daily.json、sessions.json、settings.json)。
  • 不把日志正文写入磁盘;诊断信息仅含文件名、计数与错误信息。

兼容环境

  • DSH >=0.2.1-0(含 prerelease),面向账号菜单与插件配置页。
  • Node >=22.15(内置 Zstandard 解码);更旧 Node 会跳过压缩日志并记录,而非崩溃。

安装与启用

在 DSH 插件市场搜索 Happycoding Everyday 可一键安装。终端安装方式为:

dsh plugin --profile <profile> add dsh-happycode

将 <profile> 换成你的 profile 名。DSH Desktop 用户应在 Settings → Plugins 安装(由应用管理 profile)。

安装后 重启 DSH 一次,以便服务端加载;之后客户端随页面热更新。再打开侧边栏头像菜单,点 HappyCode 即可。

典型用法

  1. 确认本机已有 DSH 会话日志(默认在 ~/.dsh/sessions/<workspace>/session-<id>/session.v4.jsonl.zstd)。
  2. 按上一节完成安装与重启。
  3. 从头像菜单打开 HappyCode,在年份选择器切换有数据的年份;悬停格子查看当日贡献文案。
  4. 若统计不符合预期,到 Plugins 页调整 m / t / f 权重并 Recalculate。

后台首次会索引全部会话;之后仅对大小或 mtime 变化的 session 重新解码。解码失败的 session 会被跳过并计入状态,不会重试,也不会导致整体失败。

数据流(摘自 README):

~/.dsh/sessions/.../session.v4.jsonl.zstd  (只读)
        → 拼接 zstd 帧 → JSONL → daily.json 缓存
        → GET /dsh-happycode/api/graph?year=2026
        → 客户端 bundle → 菜单项 → 对话框

适用场景与注意

适合:希望在本地可视化 DSH 使用节奏、对照 GitHub 贡献图习惯做「coding streak」回顾的开发者;强调隐私、不接受上传会话到第三方时。

注意:

  • 统计规则与宿主日志 schema 绑定;升级 DSH 或日志格式变化时,以插件仓库文档为准。
  • 插件不替代 Git 提交记录,只反映 Harness 会话里的消息与工具调用。
  • 安装即授予其读取 ~/.dsh/sessions/ 的能力,请信任维护者与 MIT 源码后再启用。

结尾

Happycoding Everyday 把已有本地 session 转成按年浏览的热力图,入口轻、无出站流量,权重可在插件页微调。进一步了解可访问 SkillHub 目录页 与 GitHub 仓库(含中英文 README 与 docs/host-ui-notes.md)。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye