dsh-dev-wrapped
DeepSeek Harness (DSH) 开发者使用报告——类 Spotify Wrapped,统计与 AI 结对编程的行为,生成可分享报告卡片
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 26, 2026
- Updated
- Aug 26, 2026
Introduction
dsh-dev-wrapped
DSH(DeepSeek Harness)开发者年度报告 —— 类 Spotify Wrapped 的编程回顾,统计你与 AI 结对编程的行为,生成可分享的报告卡片。
扫描 ~/.dsh/sessions(zstd 压缩 JSONL)
↓
统一事件模型 NormalizedEvent
↓
聚合统计
↓
JSON 数据 + 深色渐变 HTML 报告卡片
特性
- 100% 本地解析:数据不出本机,不依赖任何云服务
- 零运行时依赖:优先调用系统
zstdCLI 流式解压;未安装时自动回退可选依赖fzstd - 诚实统计:token 只采用模型返回的真实
usage,缺失即报告null,禁止估算 - 适配器架构:解析层与统计层通过
NormalizedEvent解耦,为后续接入其他 CLI 数据源预留接口 - 单文件 HTML:纯 CSS 图表(条形图 / 24h 柱状图),无外部资源,手机与桌面均美观
快速开始
# 前置:系统安装 zstd(Windows: winget install facebook.zstd / macOS: brew install zstd)
npx dsh-dev-wrapped
输出示例:
🔍 扫描 DSH 会话数据...
📂 发现 14 个主会话(另有 8 个子代理会话,默认排除),5 个工作目录
⏳ 解析中...
📊 生成报告...
═══════════════════════════════════════
DSH Dev Wrapped
2026-08-16 → 2026-08-26(10 天)
═══════════════════════════════════════
会话总数 18
对话轮数 162
工具调用 1,944
活跃天数 4
TOP 5 工具 web_search · pwsh · read · ...
📄 报告已保存: reports\dsh-dev-wrapped-2026-08-26.html
📋 JSON 数据: reports\dsh-dev-wrapped-2026-08-26.json
CLI 选项
用法: dsh-dev-wrapped [选项]
选项:
--dsh-home <path> DSH 数据目录(默认 ~/.dsh)
--output <dir> 输出目录(默认 ./reports)
--json 只输出 JSON,不生成 HTML
--since <YYYY-MM-DD> 起始日期(含),按会话 createdAt 本地时区过滤
--until <YYYY-MM-DD> 结束日期(含)
--include-subagents 并入子代理会话的工具调用统计
--help, -h 显示帮助
示例:只回顾 2026 年 8 月,并把子代理的调用算进来:
npx dsh-dev-wrapped --since 2026-08-01 --until 2026-08-31 --include-subagents
统计口径
| 口径 | 说明 |
|---|---|
| 子代理 | 默认排除;--include-subagents 时其工具调用并入总量,但不计入会话数与热门会话 |
| Token | 只累加 assistant 消息携带的真实 usage;存在缺失即整体置 null(禁止估算) |
| 用户消息 | 过滤 <system-reminder> 等注入内容后才计数 |
| 工作目录 | 取 session 头 cwd 真实路径(目录名不可解码) |
| 主/子代理 | 以 session 头 origin 字段为准,delegationDepth >= 1 兜底 |
| 日期过滤 | 以会话 createdAt 为基准,本地时区,含边界当日 |
| 活跃天数 | 会话创建日 ∪ 工具调用日(跨天 resume 的活动日也计入) |
开发
pnpm install # 安装依赖
pnpm build # TypeScript 编译到 dist/
pnpm test # vitest 单测(47 个用例)
node bin/dsh-dev-wrapped.mjs # 本地运行 CLI
项目结构
src/
├── types.ts # 统一事件模型 NormalizedEvent / SessionAdapter / 报告类型
├── parser/
│ ├── zstd.ts # zstd 流式解压(CLI 优先 + fzstd 回退)
│ └── jsonl.ts # JSONL 逐行容错解析 + arguments 二次解析
├── adapters/
│ └── dsh.ts # DSH 适配器:扫描 + 事件映射 + 工具分类
├── stats/
│ └── index.ts # 统计聚合(口径收敛于此)
├── report/
│ ├── json.ts # JSON 报告输出
│ └── html.ts # HTML 卡片(纯 CSS 图表)
├── cli.ts # CLI 主逻辑(参数解析 / 进度 / 汇总输出)
└── index.ts # Cordis 插件壳 + 库导出
__tests__/ # vitest 单测
bin/dsh-dev-wrapped.mjs # CLI 入口
库使用
import { DshAdapter, aggregate } from 'dsh-dev-wrapped'
const adapter = new DshAdapter()
const files = await adapter.scan('~/.dsh') // 实际使用绝对路径
const events = []
for (const f of files) {
await adapter.parse(f, (e) => events.push(e))
}
const report = aggregate(events, { includeSubagents: false })
已知限制
- DSH 处于开发者预览阶段,
~/.dsh/sessions数据格式可能随版本演进发生破坏性变更 - 正在写入的会话文件(DSH 运行中)可能读到不完整数据;损坏文件会被警告并跳过
- Windows 下
zstd需在 PATH 中;缺失且未安装fzstd时会提示安装并以非 0 退出
许可证
MIT