dsh-ledger-wealth: DSH Local Ledger and Wealth Holdings Plugin

前言

在 DSH(DeepSeek Harness)里做个人财务相关的工作流时,常见做法是把支出记进表格或外部 App,再另开渠道查基金收益;会话里看到的数字往往来自不同来源,还容易把「可支配现金」和「持仓盈亏」混在一起。下面介绍 maintainer ainachoneko 发布的 dsh-ledger-wealth:DeepSeek Harness 分类为「工作流」的插件,把「今天花了多少」和「理财今天赚了多少」放进同一会话,但两笔钱始终是两本账——分表存储、分节汇报,任何地方都不相加。数据落在本机 SQLite,不经过自有服务器。

这是什么

dsh-ledger-wealth 是本地优先的记账 + 理财持仓 DSH 插件:支持记账与小票 OCR、running balance、收益严格降级链、月末双节报告(英文简介:Local-first bookkeeping + wealth ledger for DeepSeek Harness)。

核心设计:两模块、物理隔离

插件把能力拆成 A 记账 与 B 理财,在数据层用不同表隔离:

模块 能力概要
A 记账 一句话或一张小票 → 结构化账目 → 用户确认后落库;余额 = 初始余额 + 累计收入 − 累计支出;月末报告含支出、收入、净结余、分类占比(前 5)、最大单笔、环比
B 理财 持仓录入 → 每日收益按严格降级链取数,每个数字带来源标注;月末理财报告单独一节

物理隔离:ledger_entries 与 wealth_* 分表;finance_monthly_report 用分隔线切开记账与理财,没有跨模块合计。金额在库内以整数分(*_cents)存储,对外 JSON 和文案再转为「元 + 两位小数」。

记账工具(A)

安装后注册约 20 个工具。与记账直接相关的包括:

工具 作用
ledger_set_initial_balance 设置初始余额(必填,不会默认按 0 处理)
ledger_add_entry 记一笔:先预览,confirm:true 才落库
ledger_list_entries 按月份/类型列账目
ledger_delete_entry 删账目:先预览,confirm:true 才删
ledger_balance 当前可支配余额 + 本月收支
ledger_month_summary 月度汇总:分类占比、最大单笔、每日明细
ledger_scan_receipt 小票图片 → 草稿(识别不到就留空,不猜)

典型流程:先 ledger_set_initial_balance 设期初,日常用 ledger_add_entry 记收支;有小票时用 ledger_scan_receipt 出草稿,再在确认后落库。安装脚本会真的加载一次并调用 ledger_balance 做验证。

理财工具与收益降级链(B)

工具 作用
wealth_add_product / wealth_update_product 录入或修改持仓(含份额、手动收益、归档等)
wealth_list_products 列出持仓(可选含已归档)
wealth_record_profit 手填某天收益(同日重记幂等覆盖)
wealth_refresh_profit 按降级链刷新收益,缺失的产品明确报缺失
wealth_summary 理财月度汇总:本月/累计收益、来源、到期提醒

收益降级链按顺序尝试,每一步留在返回值的 attempts 里:

  1. manual — 手填当日收益
  2. api — 基金:份额 × (今日单位净值 − 上一交易日单位净值)
  3. estimated — 仅有涨跌幅时用持仓金额估算,明确标注估算
  4. not_covered — 银行理财无免费源,直接不可用
  5. stale — 失败则沿用上次记录,标明「非实时」
  6. unavailable — 无历史值则如实报缺失,不落库、不编数字

任何情况下都不会用「年化收益率 ÷ 365」推算昨日收益;七日年化仅用于展示。银行理财不做登录态页面抓取。

报告与定时任务

  • finance_monthly_report:月末双节报告(记账 + 理财,中间分隔线,无合并总额)
  • finance_run_daily_job / finance_run_month_end_job:手动触发定时任务(幂等)
  • finance_setup_schedules / finance_schedule_status:注册或查看定时任务
  • finance_alerts / finance_status:数据源告警与插件自检

默认定时(可在 profile 覆盖):每日 0 20 * * *,月末 0 21 28-31 * *(配置项见下文)。

安装与启用

拿到 zip 或源码目录后,进入纯英文、无空格的路径,执行官方安装脚本:

cd dsh-ledger-wealth        # 解压到纯英文、不带空格的路径
node scripts/install-into-dsh.mjs

脚本用 DSH 自带的 pnpm 装进 profile,注册工具并调用 ledger_balance 验证通过后写入 dsh.profile.bundles。装完需重启 DSH。不需要 dsh CLI、不需要 npm 账号、没有 Python 依赖(OCR 若用 rapidocr 需自行配置 Python 路径)。

其他方式(完整说明见仓库 docs/INSTALL.md):

node scripts/install-into-dsh.mjs --pack                     # 自包含副本,源码目录可删
node scripts/install-into-dsh.mjs --remove                   # 卸载
dsh plugin --profile desktop add link:/绝对路径/dsh-ledger-wealth   # 有 dsh 命令时的等价写法

注意:插件以当前 DSH 进程权限运行;安装前应阅读源码与 MIT 许可证,确认 OCR、基金接口等行为符合你的环境策略。社区目录(如 skillhub)与 DeepSeek / 幻方无官方从属关系;市场一键安装依赖 awesome-dsh-plugin 收录,本仓库说明见 docs/PUBLISH.md。

配置

默认配置在插件包 cordis.patch.yml;覆盖请在 profile 自己的 cordis.patch.yml 里对同 id 增加 config(勿改包内文件,升级会被覆盖):

- id: ledger-wealth
  config:
    timeZone: Asia/Shanghai
    dbPath: ''                 # 空 = ~/.dsh/ledger-wealth/ledger.sqlite
    dailyJobCron: '0 20 * * *'
    monthlyJobCron: '0 21 28-31 * *'
    fetchTimeoutMs: 8000
    fundApiEnabled: true       # 关掉 = 基金也走「沿用上次值」
    bankApiEnabled: true       # 银行理财目前没有免费源,恒 not_covered
    ocrProvider: auto          # auto | command | rapidocr | none
    ocrCommand: ''             # 自定义 OCR CLI,stdout 出文字
    ocrVenvPython: ''          # 装了 rapidocr_onnxruntime 的 python

数据位置与隐私

数据库默认路径:

~/.dsh/ledger-wealth/ledger.sqlite

记账表 ledger_entries;理财表 wealth_products、wealth_daily_profit;另有 meta、job_runs、monthly_reports、alerts 等运维表。备份即复制该 .sqlite;卸载插件不删数据,彻底清理需自行删除目录。

隐私相关:无遥测、无账号、无云端同步;网络请求主要为基金净值(东方财富公开接口),可在配置中关闭 fundApiEnabled。

开发与自检

维护者本地可跑:

cd dsh-ledger-wealth
node tests/run.mjs      # 64 个用例,全内存库,不联网
node scripts/check.mjs  # 语法 + 清单自检

表结构、工具签名与错误码见 docs/INTERFACES.md。

适用场景与小结

适合已在用 DSH、希望在本机会话里完成记账预览确认、持仓收益带来源标注、月末分节报告的智能体或开发者。不适合需要多设备云同步或把现金与持仓合成一个「总资产」数字的场景——插件刻意不做跨模块合计。

  • 目录页:https://www.skillhub.cn/plugins/ainachoneko/dsh-ledger-wealth
  • GitHub:https://github.com/ainachoneko/dsh-ledger-wealth
羽毛球分组比赛记分
小程序二维码

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

Xiaoye