🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

编码时长同步 JularDepick/dsh-wakatime-plugin

DeepSeek Harnessv0.4.0
JularDepick0 天前有提交已提供中文文档扫描:含敏感能力

一个 dsh 插件:把 DSH 的每一次智能体交互量化为可视化表现指标,自动同步至…

36.5/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/11/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-wakatime-plugin
npm 源 · dsh-wakatime-plugin 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · vision
装得上吗
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 0 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/10/30) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-wakatime-plugin @ 0.4.0
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/3 07:15:55

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 46 处,展示前 28 条)
  • 发起网络请求
    dist/index.mjs:149
    response = await fetch(url, {
  • 发起网络请求
    dist/index.mjs:393
    await this.http.request(`${SUMMARIES_PATH}?range=${CLOUD_SUMMARY_RANGE}`, {
  • 发起网络请求
    dist/index.mjs:402
    const user = (await this.http.request(USER_INFO_PATH, {
  • 发起网络请求
    dist/index.mjs:899
    await this.http.request(HEARTBEATS_PATH, {
  • 发起网络请求
    dist/index.mjs:909
    await this.http.request(HEARTBEATS_BULK_PATH, {
  • 读取本地文件
    dist/index.mjs:1257
    const info = await stat(lockPath);
  • 读取本地文件
    dist/index.mjs:1273
    const content = await readFile(lockPath, "utf-8").catch(() => null);
  • 删除本地文件
    dist/index.mjs:1274
    if (recheck !== null && recheck > options.ttlMs && content !== null) await unlink(lockPath).catch(() => {});
  • 删除本地文件
    dist/index.mjs:1286
    await unlink(lockPath).catch(() => {});
  • 读取本地文件
    dist/index.mjs:1295
    if (await readFile(lockPath, "utf-8").catch(() => null) !== token) return;
  • 写入本地文件
    dist/index.mjs:1296
    await writeFile(lockPath, token);
  • 读取本地文件
    dist/index.mjs:1306
    if (await readFile(lockPath, "utf-8").catch(() => null) === token) await unlink(lockPath).catch(() => {});
  • 删除本地文件
    dist/index.mjs:1306
    if (await readFile(lockPath, "utf-8").catch(() => null) === token) await unlink(lockPath).catch(() => {});
  • 写入本地文件
    dist/index.mjs:1314
    await writeFile(temp, text, { mode });
  • 写入本地文件
    dist/index.mjs:1315
    await rename(temp, path);
  • 删除本地文件
    dist/index.mjs:1317
    await unlink(temp).catch(() => {});
  • 读取本地文件
    dist/index.mjs:1323
    return (await stat(path)).mtimeMs;
  • 读取本地文件
    dist/index.mjs:1331
    text = await readFile(path, "utf-8");
  • 写入本地文件
    dist/index.mjs:1347
    await rename(path, archived);
  • 写入本地文件
    dist/index.mjs:1637
    await mkdir(dir, {
  • 写入本地文件
    dist/index.mjs:1662
    if (archivedPath !== null) await rename(archivedPath, path).catch(() => {});
  • 发起网络请求
    dist/index.mjs:2291
    const data = await this.http.request(`${SUMMARIES_PATH}?range=${CLOUD_SUMMARY_RANGE}`, {
  • 发起网络请求
    dist/client.js:223
    fetch(CREDENTIAL_CLEAR_PATH, {
  • 发起网络请求
    dist/client.js:247
    fetch(SYNC_PATH, {
  • 发起网络请求
    dist/client.js:271
    fetch(RETRY_PATH, {
  • 发起网络请求
    dist/client.js:305
    fetch(MIGRATE_PATH, {
  • 发起网络请求
    dist/client.js:340
    fetch(STATUS_PATH, { cache: "no-store" }).then((response) => {
  • 发起网络请求
    dist/client.js:357
    fetch(LOGS_PATH, { cache: "no-store" }).then(async (response) => {
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-renderer@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-llm@deepseek-ai/dsh-session@deepseek-ai/dsh-tools@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

dsh 插件:把每次 dsh 智能体交互量化为可视化性能指标,并自动同步到 WakaTime——用数据展示你用智能体的生产力。

v0.4.02026-11-01
Full Changelog: · 新增 · 单份 OAuth 访问令牌认证: 直接使用个人访问令牌(wakatime.com/oauth), 保存即覆盖, 清除即回退未配置, 不再需要选择凭证类型 · 单一本地战绩: 战绩不再按凭证分开存放, 更换凭证不影响历史累计, 也不会因为换凭证看起来归零 · 手动迁移旧数据: 检测到 0.3.0 旧版数据时插件只读运行并在上报记录标题下方显示一行红字入口, 点击后把旧的凭证列表与多份本地数据合并为一份(累计量求和, 待发送队列按心跳身份去重, 云端快照取最新; 旧的失败列表不继承, 迁移后为空), 迁移前保留旧文件备份, 便于回查; 不再在启动时自行改写旧数据文件 · 云端快照随账号: 更换凭证后旧账号的云端汇总立即作废并自动重新同步, 不会与本地战绩混算 · 未配置凭证也能查看本地战绩: 战绩工具与 Web 战绩表照常输出九项指标, 凭证只影响云端合并与上报 · 修复 · 两个 profile 同时运行时战绩可能不再增长: 后落盘一方的增量被当成基线吃掉, 现在两侧增量都会累计 · 另一个 profile 写入数据后, 本进程落盘可能删掉它刚新增的待发心跳: 现在只删除本进程真正出队或重试移出的条目 · 待发队列在磁盘上被压缩或按上限截断后, 内存里仍在的心跳写不回去: 现在按磁盘实际内容补齐 · 换凭证后旧账号的云端汇总在从未同步过的 profile 里仍参与取最大值: 现在作废动作一律落盘 · 正在推送中的一批心跳在卸载或进程退出时可能既没送达也从磁盘消失: 在途批次一律按未送达保存 · 手工改配置文件把上报间隔写到极大值时, 上报轮次退化成每毫秒一轮: 现在配置校验, 恢复与定时器三处都按上限截断 · 把界面语言写成不存在的值时工具文案静默回退中文: 现在按非法配置拒绝 · 配置文件归档成功但随后写盘失败时, 下次启动读不到凭证: 现在把归档文件改回原路径 · 文件锁的陈旧清理, 续期与释放可能误删别人刚建立的锁或把已释放的锁写回: 现在按持有令牌核对, 释放前等在途续期落定 · 上报记录里的服务端原文(400/404/422 与非 JSON 响应)直接显示英文: 现在按类别本地化 · 工具面凭证前缀出现英文标记: 现在本地化 · 凭证保存失败时提示出现两句整句拼接: 现在只保留一句 · 重试时任务已不在待重试列表被当成错误提示: 现在按中性提示 · 关闭上报总开关后新心跳被直接丢弃, 界面与文档未说明: 开关文案已写明语义 · 缓存命中 Token 之前从未真正进入 WakaTime: 改用官方统计字段名上报, 云端现在能看到这项指标 · 提示词字符在云端被重复累加: 改为按增量上报, 提示词事件数恢复为真实提示词条数 · 有效 TOKEN 消耗量低估: 改为官方计费口径(未命中输入 + 缓存读 + 缓存写 + 输出) · 凭证失效时心跳会进入失败记录并可能被上限淘汰: 现在整批留在队列(移到队尾轮转, 不再让最旧一批被反复重取而饿死新心跳), 凭证恢复后继续推送 · 非权限原因的 403 也被当成凭证失效, 整批无限轮转: 现在按响应内容区分, 其余 403 计入可重试次数 · 升级后上报记录里满屏都是从 0.3.0 继承来的红色失败行: 迁移不再继承旧失败列表, 只保留批次级记录 · 更换凭证后仍显示上一个账号的名字或数据: 账号信息随凭证整体替换 · 本地数据文件损坏或结构不被识别时可能被清空: 现在先另存备份再按空数据起步 · 环境变量凭证生效时清除凭证看似成功: 现在明确提示需要移除环境变量 · 粘贴被截断的令牌时误提示 插件密钥不再支持: 现在按格式错误提示 · 凭证清除失败时显示了不相关的错误文案 · 更早版本的独立快照文件(stats.json / heartbeats.json)在并入后不被归档, 每次启动重复归零: 现在并入即归档, 历史战绩与待发队列得以保留 · 结构版本高于当前支持值的数据文件被当成损坏件归档清空: 现在只读运行, 不写盘也不挪走, 保留回退余地 · 队列落盘超限时丢弃的是最旧且尚未上报的心跳: 超限先做相邻合并, 只有失败任务与上报记录按上限截断 · 配置文件迁移或归档失败仍会覆盖原文件: 现在中止写入, 不再毁掉旧备份 · 插件卸载时的归仓落盘未等待完成, 写入失败会静默丢失最后一段统计: 现在等待完成并在失败时告警 · 云端同步失败时最长可能重试数分钟, 界面一直等待: 同步请求的重试次数上限压到与凭证校验一致 · 心跳推送失败会在单次请求内最多重发 5 轮, 放大重复上报: 推送请求的重试次数上限压到 1 次, 失败整批回队由下一轮推
v0.3.02026-10-26
Full Changelog: · 新增 · 凭证同权: 插件密钥与 OAuth 访问令牌地位相同, 都能上报与读取; 类型按前缀自动识别, 粘贴即存, 无需选择是哪种凭证 · 多凭证管理: 可保存多份凭证并随时切换, 配置视图提供切换, 移除与一次清除全部; 当前凭证与当前账号分两行展示 · 每份凭证一份本地数据: 战绩累计, 云端快照, 待发送队列与上报记录各自独立, 切换凭证即切换展示, 互不混算 · 凭证缓存清单: 配置视图可查看每份凭证的模糊凭证(首尾各 8 个字符, 中间固定 8 个星号), 类型, 账号, 最后更新时刻与它自己的战绩, 并在清单里直接切换或移除 · 多 profile 同时使用: 同一用户下多个 dsh profile 共用本地数据时, 双方的战绩与设置都会合并, 不再互相覆盖; 模型思考时长这类只在本地统计的指标不会丢失, 平均输出速度不再出现异常大的值 · 配置页两列分组布局(上报, 上报字段, 展示, 诊断), 窄窗口自动回落单列 · 数位分隔符可选千位(每 3 位)或万位(每 4 位)分组, 属纯展示项 · 上报记录新增详情列: 每次上报的类别计数与项目/分支, 失败行在前面附失败原因 · 修复 · 同一账号保存多份凭证时, 汇总视图把同一份云端总量重复计入, 显示的战绩偏高 · 移除凭证时可能连带删除正在使用的本地数据, 导致该账号战绩清零 · 配置修改后主视图的数据与文案不刷新, 需要手动重开标签页 · 未缓存账号名时每次查看状态都会请求账号接口, 离线时界面长时间无响应 · 中文界面下把服务端的英文错误原文直接显示在提示条上 · 标签页左右留白溢出, 以及档位切换条在浅色主题下滑块不可见 · 优化 · 界面术语统一为凭证, 缓存区标题与提示同步更新, 不再出现密钥与实际含义不符的说法 · 凭证获取说明改为官方实际路径: 插件密钥在账号设置页, 个人 OAuth 令牌在 wakatime.com/oauth, 自用无需创建应用; 需要自定义权限时再建应用并在授权时声明所需范围 · 新增凭证时的校验更宽容: 只能写入的插件密钥不再被判为无效, 令牌在缺少账号读取权限时改用战绩数据确认可用性 · 上报记录可看到其它进程写入的记录与失败任务; 其它进程的失败任务只读展示, 重试入口只出现在本条记录所属的进程 · 兼容性 · dsh 版本: 改为实测区间 >=0.2.1-rc.1 <=0.2.1-rc.3, 同一份产物覆盖 0.2.1-rc.1, 0.2.1-rc.2 与 0.2.1-rc.3 · 破坏性变更: 本版本不再支持 dsh 0.2.0-rc.2(上一版本仍支持), 且区间之外的一律拒绝安装与启动, 包括 0.2.1 正式版与 0.3.x; 仍在 0.2.0-rc.2 上的用户不要升级到本版本 · 从 v0.2.2 升级: 旧版单字段凭证在首次启动时自动迁移为凭证列表, 历史战绩按凭证归属延续, 无需手工搬迁; 本地数据在首次写入时自动整理, 旧文件仍可读取
v0.2.22026-10-17
Full Changelog: · 兼容性 · dsh 版本: 支持列表扩展为实测过的 0.2.0-rc.2, 0.2.1-rc.1 与 0.2.1-rc.2,三者共用同一份产物;未实测的 dsh 版本不在列表内,安装或启动会被拒绝 · 从 v0.2.1 升级: 无任何操作要求,配置, API Key 与本地数据文件原样延续 · 适用性判定: 0.2.1-rc.2 与 0.2.1-rc.1 的发布包除版本号字段外逐字节一致,已按发布包类型声明逐文件比对确认
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-wakatime-plugin | [简体中文] 一个 dsh 插件:把 DSH 的每一次智能体交互量化为可视化表现指标,自动同步至 WakaTime,用数据展示你与智能体协作的生产力。 特性 - 自动追踪、量化并上报 DSH 中的 AI 智能体工作数据至 WakaTime 平台 - 凭证:只支持个人 OAuth 访问令牌(前缀 waka_tok_),插件密钥不再支持;本地只保存一份凭证,可随时覆盖保存或清除,更换凭证不影响本地战绩;凭证由本地小后端保管,前端永不接触明文,任何读取面只回显首尾各 8 个字符,中间固定 8 个星号 - 定时批量上报:启动时推送一轮,之后按可配置间隔(默认 60 秒)循环;积压达到 20 条时按积压量的十分之一合并成一次批量请求(单批不超过 WakaTime 的 25 条上限),每条心跳保留自己的时间戳 - 推送队列与重试:未发送的心跳落盘保留,重启不丢(检测到旧版数据、等待确认迁移期间除外,那时插件只读运行);失败自动回到队尾重试,单条最多 3 次,耗尽或遇到 400/404/422 等载荷错误即进入上报记录,可在界面上点击该失败行重新排队重试;凭证失效(401,以及提示权限不足的 403)不会丢心跳,整批移到队尾轮转等待凭证恢复,其余 403 按可重试失败计数;每条记录都带详情(本次上报的类别与项目/分支,失败时附失败原因)
展开完整文档(README 剩余 1 节)
dsh-wakatime-plugin

| [简体中文]

一个 dsh 插件:把 DSH 的每一次智能体交互量化为可视化表现指标,自动同步至 WakaTime,用数据展示你与智能体协作的生产力。

特性

- 自动追踪、量化并上报 DSH 中的 AI 智能体工作数据至 WakaTime 平台
- 凭证:只支持个人 OAuth 访问令牌(前缀 waka_tok_),插件密钥不再支持;本地只保存一份凭证,可随时覆盖保存或清除,更换凭证不影响本地战绩;凭证由本地小后端保管,前端永不接触明文,任何读取面只回显首尾各 8 个字符,中间固定 8 个星号
- 定时批量上报:启动时推送一轮,之后按可配置间隔(默认 60 秒)循环;积压达到 20 条时按积压量的十分之一合并成一次批量请求(单批不超过 WakaTime 的 25 条上限),每条心跳保留自己的时间戳
- 推送队列与重试:未发送的心跳落盘保留,重启不丢(检测到旧版数据、等待确认迁移期间除外,那时插件只读运行);失败自动回到队尾重试,单条最多 3 次,耗尽或遇到 400/404/422 等载荷错误即进入上报记录,可在界面上点击该失败行重新排队重试;凭证失效(401,以及提示权限不足的 403)不会丢心跳,整批移到队尾轮转等待凭证恢复,其余 403 按可重试失败计数;每条记录都带详情(本次上报的类别与项目/分支,失败时附失败原因)
- 单一本地数据:战绩累计、云端快照、待发送队列与上报记录只有一份,与凭证无关,更换凭证不丢数据,也不再按凭证拆分多份缓存
- Token 统计:精确记录每次智能体调用的 input/output Token 数量
- 智能体协作战绩:全局汇总提示词字符总量、模型思考总时长、输出 TOKEN 总量、有效 TOKEN 消耗量、缓存命中 TOKEN 总量与平均输出速度等表现指标,在 Web 界面随时查看;战绩表支持开关边框显示,数值可按千位或万位分隔
- 配置即改即生效:在 WakaTime 标签页右上角「配置」切换出配置视图,凭证管理、上报参数与界面开关在同一处完成,改动立即生效,无需保存
- 云端同步合并:配置凭证后自动同步云端最近 7 天的 AI 汇总,与本地战绩对应指标取最大值合并展示,保证云端与本地一致;更换凭证后云端快照作废并自动重新同步;同步结果本地缓存,切换标签页与刷新页面不重复请求云端
- 会话追踪:全局统一组织 AI 会话数据(全部心跳归为一个整体 AI 会话),自动识别会话工作目录所属项目与 Git 分支(支持子目录与 worktree)
- 本地累计保留:LLM 思考总时长与提示词 Token 估算等本地独有指标写入本地数据文件,重启 dsh 后继续累加,不会归零
- 本地优先:凭证和配置数据默认存储在本地,用户完全掌控

安装

通过 DSH 插件命令安装(发布到 npm 后可用)
dsh plugin --profile <name> add dsh-wakatime-plugin

或从 GitHub 源码直接安装(安装时自动构建,见下方说明)
dsh plugin --profile <name> add github:JularDepick/dsh-wakatime-plugin

或使用发布 tarball 本地安装(预构建产物,无需构建)
dsh plugin --profile <name> add dsh-wakatime-plugin-0.4.1.tgz

从 GitHub 源码安装拉取的是源码而非构建产物,pnpm 会在安装时运行包的 prepare 构建脚本;pnpm 10 及以上默认拒绝执行 git 依赖的构建脚本,首次 add 会失败:把 pnpm 打印的包键(形如 dsh-wakatime-plugin)加入该配置档的 pnpm-workspace.yaml 后再重新执行:

allowBuilds:
dsh-wakatime-plugin: true

该授权意味着允许该包的代码在安装时于你的机器上执行,请只对源码可信的包授权。

兼容性

- dsh 版本:支持实测过的 0.2.1-rc.1 至 0.2.1-rc.5,共用同一份产物,无需按版本分别安装。
- 安装校验:包清单以 engines.dsh 与宿主包对等依赖声明实测版本区间 >=0.2.1-rc.1 <=0.2.1-rc.5;若安装或启动时报插件与当前 dsh 版本不兼容,说明当前 dsh 版本尚未实测,不在区间内。
- 后续版本:高于 0.2.1-rc.5 的 dsh 版本(含 0.2.1 正式版与 0.3.x)都会被本插件拒绝,需要等待插件实测并推进上界。
- 从 0.3.0 升级:凭证在首次启动自动迁移(从已保存的凭证列表里挑出一份 OAuth 令牌作为唯一凭证,插件密钥因官方只允许写入、无法读取战绩而不再支持,只保存过插件密钥的用户需要改用个人 OAuth 令牌);本地数据改为在 Web 界面上确认后迁移:检测到 0.3.0 旧版数据时插件只读运行(不覆盖旧文件),在上报记录标题下方显示一行红字「存在旧版数据,点击迁移」,点击后把分凭证的多份数据合并为一份(战绩逐项求和,待发送队列按心跳身份计数归并(同毫秒的重复心跳计数相加,不再丢弃其中一条),云端快照取最新;0.3.0 的失败列表不继承,迁移后为空,只保留批次级上报记录),更早版本的 stats.json 与 heartbeats.json 在数据文件缺失时并入,迁移成功后红字消失;确认迁移之前本进程的战绩只留在内存,重启会丢,看到红字后请尽快点击;迁移后本地数据与凭证解耦,此后更换凭证不再影响战绩;statsScope 配置项与 WAKATIME_API_KEY 环境变量已移除,旧 cordis.yml 里的残留项不会被拒绝,但插件不再读取,因此不生效,其余默认值不变(tableBorders 默认开启,digitGrouping 默认 thousand)。
升级前请备份 ~/.dsh/plugins/wakatime 目录;0.3.0 与 0.4.0 不能同时使用同一数据目录(旧版本会把新版结构重写成空的旧结构,导致战绩丢失),升级后也不要回退,确需回退时先用备份恢复。在界面上点击迁移后,会把旧数据文件归档为 buckets.json.v2.<时间戳>.bak;更早版本的 stats.json 与 heartbeats.json 在数据文件缺失时被并入,并入后同样归档为 .legacy..bak;损坏或无法识别的文件会把原件归档为 .corrupt..bak 或 .unknown..bak 后重建。凭证需要写入权限:保存时只校验账号资料与战绩读取,若令牌缺少 write_heartbeats scope,上报会被服务端拒绝并一直留在队列(界面上每 5 分钟记一条失败记录),此时请到 wakatime.com/oauth 或应用授权页把该 scope 一并申请。

使用

安装并启用插件后,在配置视图的凭证区粘贴个人 OAuth 访问令牌即可:

- OAuth 访问令牌:前缀 waka_tok_,登录后访问 https://wakatime.com/oauth 获取(页面直接给出个人令牌,自用无需创建应用);需要自定义 scope 或供他人使用时,在 https://wakatime.com/apps 创建应用,授权时以 scope 参数申请 write_heartbeats, read_summaries, email;
- 插件密钥(前缀 waka_)不再支持:官方把它限定为写入专用,而战绩读取与云端同步需要读取权限,粘贴会被拒绝并提示改用个人令牌;
- 前缀 waka_sec_ 是 OAuth 应用密钥,不能当凭证使用,粘贴同样会被拒绝。

配置方式:

- 手动:在 Web 界面会话区域的 WakaTime 标签页,点右上角「配置」进入配置视图后粘贴保存(输入框会先做格式校验,仅覆盖,不可查看);
- Agent 引导:让 Agent 调用 wakatime_config 工具(op=set_credential)代替你完成配置;
- 环境变量:设置 WAKATIME_OAUTH_TOKEN(作为临时凭证优先于文件配置,不落盘)。

只保留一份凭证:再次保存即覆盖原凭证(本地战绩继续累计),「清除凭证」回退到未登录状态(本地战绩保留)。若设置了 WAKATIME_OAUTH_TOKEN,环境变量优先于文件配置,此时保存与清除都会被拒绝并提示,需要先移除该变量再重启 dsh。

配置视图里的开关与上报间隔改动即时生效,无需另点保存(数字字段在失焦或回车后写入)。

此后插件会自动追踪 DSH 中的 AI 交互,按定时节奏批量上报至 WakaTime。

| 工具 | 用途 |
| wakatime_config | 查看/修改插件配置(op=get/set);凭证操作:set_credential 保存或更换 OAuth 访问令牌,仅覆盖不可查看 |
| wakatime_logout | 清除本地凭证(本地战绩保留) |
| wakatime_status | 查看认证状态(不回显令牌明文) |
| wakatime_stats | 查看 Agent 协作战绩(提示词字符总量,提示词 Token 估算,模型思考总时长,输出 TOKEN 总量,有效 TOKEN 消耗量,缓存命中 TOKEN 总量,输入 TOKEN 总量,平均输出速度;与界面战绩表同源) |

配置

插件的配置通过 DSH 的 cordis.yml 提供:

配置优先级:cordis.yml 是配置来源;在界面配置视图里改过的项会写入本地配置文件的 settings 块,并在之后覆盖 cordis.yml 的同名项。本地只记录界面上显式改动过的键,没改过的项仍回落到 cordis.yml,因此把某项改回 cordis.yml 里时,先在界面上改动它一次或清空本地配置文件的 settings 块。

- id: wakatime
name: dsh-wakatime-plugin
config:
enabled: true # 总开关: 关闭后新心跳直接丢弃, 队列里的旧心跳保留 locale: zh-CN # 界面语言(host 工具文案;Web UI 语言跟随 dsh web) reportInterval: 60 # 定时上报间隔(秒, 取值 1 到 3600),启动时上报一次后循环 reportEnabled: true # 是否开启定时上报 includeTokens: true # 是否上报 Token 用量 includePrompts: true # 是否上报提示词长度 debug: false # 调试日志开关 tableBorders: true # 战绩表是否显示表格边框(纯展示项) digitGrouping: thousand # 数位分隔符: thousand 千位(3 位一组)/ myriad 万位(4 位一组),纯展示项

环境变量:

| 变量名 | 描述 |
| WAKATIME_OAUTH_TOKEN | WakaTime OAuth 访问令牌(作为临时凭证优先于文件配置) |
| WAKATIME_DEBUG | 启用调试日志 |
| WAKATIME_CONFIG_DIR | 覆盖凭证配置存放目录(默认 $DSH_HOME/plugins/wakatime,即 ~/.dsh/plugins/wakatime) |
| DSH_HOME | dsh home 目录,影响凭证配置目录的默认位置(默认 ~/.dsh) |
| NODE_USE_ENV_PROXY | 置为 1 时让插件请求走环境代理变量 HTTP_PROXY/HTTPS_PROXY/NO_PROXY(需 Node 24 及以上) |

平台与路径

- 运行平台:Windows、macOS、Linux(WSL);凭证与配置默认位于 $DSH_HOME/plugins/wakatime/config.json,即通常的 ~/.dsh/plugins/wakatime/config.json;同目录下另有本地数据文件 buckets.json,保存唯一一份战绩累计、云端快照、待发送队列与上报记录(与凭证无关);该目录由同一用户下的多个 dsh 配置档共用,写入有文件锁与增量合并保护,不建议手工编辑;升级或数据文件异常时,该目录内会出现带时间戳的 *.bak 归档文件,可据此核对或恢复。
- 权限:POSIX 平台下配置目录与文件分别收紧为 0700 与 0600;Windows 无 POSIX 权限位,依赖用户目录 ACL。
- 项目与分支识别:以会话工作目录为基准,项目名取 Git 仓库根目录名,会话位于仓库子目录或 worktree 中也归到同一项目;分支名解析 Git 头文件,detached HEAD 时分支留空。
- 网络:单次请求超时 30 秒,超时按网络失败重试;上报请求带插件与宿主标识,便于 WakaTime 归类编辑器与操作系统;需要走代理时设置 NODE_USE_ENV_PROXY=1 并配置 HTTP_PROXY/HTTPS_PROXY/NO_PROXY(需 Node 24 及以上)。

发布与分发

标准分发流程(在仓库根目录手动执行):

1. 检查类型并构建产物
pnpm typecheck
pnpm build

2. 打包标准 npm tarball(含构建产物,cordis.patch.yml 与 LICENSE/COPYRIGHT/中英 README,不含源码与依赖)
pnpm pack 会触发 prepare 再次构建
pnpm run pack

产物与用途:

| 产物 | 用途 |
| dsh-wakatime-plugin-<版本>.tgz | 本地/离线安装:dsh plugin --profile <name> add <tgz 路径>;亦可作为发布到 npm registry 的素材(将来执行 npm publish) |

产物为预构建形态,安装无需构建权限。从 GitHub 源码安装依赖 prepare 构建,从 tarball 安装则可离线使用。

相关链接

- dsh 官方仓库:https://github.com/deepseek-ai/deepseek-harness
- dsh 官方插件开发文档:https://github.com/deepseek-ai/deepseek-harness/tree/main/docs/user/develop
- WakaTime 官方:https://wakatime.com

版权声明

Copyright © 2026 JularDepick,详见 COPYRIGHT。

许可证

采用 Apache-2.0 License,详见 LICENSE。
预览分享卡片长什么样 ↓JularDepick/dsh-wakatime-plugin
分享 · DeepSeek Harness Hub
JularDepick/dsh-wakatime-plugin

一个 dsh 插件:把 DSH 的每一次智能体交互量化为可视化表现指标,自动同步至…

回到顶部