本 Skill 通过本地 Python CLI 操作 SQLite 账本( db/expenses.db),实现记账、分类管理、报表图表与 Web 看板。Agent 负责自然语言理解与 二次确认;脚本负责结构化读写与一致性。
parse_text 辅助从片段补全字段)user_categories 表;记账时 category 可直接用自定义名)report_dashboard.png:KPI + 支出/收入环形图 + 每日趋势 + 按月柱图;另有单图 expense_by_category.png、 income_by_category.png、 daily_trend.png、 monthly_bar.png)+ 结构化 highlights(供你生成有温度的中文总结); data.agent_json 中含 primary_chart 指向合图路径scripts/dashboard.html + scripts/static/vendor 内 Chart.js,支持时间筛选、按月柱状图、分页明细与图表交互(缩放/平移等),离线可开页环境变量: BILLCLAW_DB_PATH 可覆盖默认数据库路径。
调用方式:在项目根目录执行 python scripts/main.py <子命令> --json-string '<JSON>' 或 --json 文件.json;亦可使用根目录 python main.py ...(转发到同一入口)。 标准输出为一行 JSON: {"ok": bool, "error": str|null, "data": {...}}。
从用户话中提取: date(YYYY-MM-DD)、 type( 收入 | 支出)、 category、 amount(元)、 note。
若字段不全,可调用 parse 子命令辅助:
python scripts/main.py parse --json-string '{"text":"<用户原句或片段>"}'
使用返回的 time.date、 amount.value、 type_hint、 category_hint 补全(仍需你判断是否ambiguous)。
时间模糊:若 parse 或你的理解中 ambiguous: true, 先问用户确认日期/时刻,再 add。
金额异常:若 add 的 data 中含 suspicious: true, 先向用户确认是否输错,再决定是否重新 add 或取消。
写入:
python scripts/main.py add --json-string '{"date":"...","type":"支出","category":"正餐","amount":35,"note":"..."}'
可选: "parse_text":"昨天午饭38" 与上述字段合并(缺省字段由解析补全)。
默认支出分类:正餐、零食饮料、出行、购物、日常开销、娱乐、居住、医疗健康、家人、社交、其他。
默认收入分类:工资、奖金、投资、家人、其他收入。
用户自定义分类可先走 Intent D,之后记账 category 填该名称即可。
python scripts/main.py query --json-string '{...}'
常用字段:
date_from, date_to(含边界,格式建议 YYYY-MM-DD)type: 收入 / 支出category:精确匹配category_like:SQL LIKE 子串note_like:备注 LIKEkeyword_in_note:备注或分类中包含关键词limit:默认 500将 data.rows 用简洁表格或列表回复用户。
禁止直接删除。 必须两步:
delete-preview:与 query 相同过滤字段,返回 data.preview_rows 与 data.ids。
向用户展示将删除的记录, 得到明确确认 后:
delete-confirm: {"ids":[...]}
python scripts/main.py category-add --json-string '{"name":"恋爱","kind":"支出"}'
kind 只能是 收入 或 支出。
可用 category-list 查看已有用户分类。
merge-preview:用 keyword_in_note、 old_category、 old_category_like、 date_from/ date_to、 type(默认可筛支出)等缩小范围。
展示 preview_rows, 用户确认 后:
merge-confirm: {"ids":[...],"new_category":"恋爱"}
python scripts/main.py report --json-string '{"date_from":"2026-03-01","date_to":"2026-03-31","output_dir":"./billclaw_output"}'
data.charts:各 PNG 绝对路径; 优先向用户展示 report_dashboard(或 data.agent_json 里的 primary_chart)。兼容旧键名: expense_pie ≈支出分类图, trend ≈每日趋势。data.highlights:总收支、TOP 支出类、占比等。data.narrative_hints:简短提示句; 你应在此基础上 用朋友/恋人语气写 1~3 句中文总结(可轻微幽默),避免机械罗列数字。output_dir(见下方「output 目录与定时清理」);多次 report 会累积 PNG,需按需或定期清理。python scripts/main.py serve --json-string '{"host":"127.0.0.1","port":8000}'
(进程会占用终端,需告知用户浏览器访问 http://127.0.0.1:8000。)
页面含:日期范围筛选与快捷预设(全部/本年至今/近三月/近一月)、总收支 KPI、 支出与收入分类 环形图、每日折线(滚轮缩放/拖拽平移,可重置)、按月收支柱状图、可排序分页交易表(可选仅收入/仅支出)。前端为 scripts/dashboard.html,JS 库在 scripts/static/vendor/(离线可用,见该目录 README.md);中文字体使用系统字体栈。
python scripts/main.py export-csv --json-string '{"path":"./bills.csv","date_from":"2026-01-01"}'
子命令作用add插入一条交易query条件查询delete-preview / delete-confirm删除预览 / 执行删除merge-preview / merge-confirm改类预览 / 执行批量更新 categorycategory-add / category-list自定义分类report统计 + 出图export-csv导出parse从文本抽取时间/金额/类型/分类提示serve启动 Flask 看板
ok: true, data 为有效负载。ok: false, error 为可读说明。add 在写入成功后仍可能在 data 中带 suspicious(金额超参考阈值), 不代表未写入;若你希望「先确认再记」,应在调用 add 前用规则判断或先问用户(推荐流程:先展示将记入的字段与异常提示,确认后再 add)。add。回复简短确认。parse 若带 ambiguous 或 note 提示晚上默认 20:00 → 问用户是否指今晚/哪一天的晚上 → 确认后再 add。add 后若返回 suspicious 同样要口头确认;用户确认无误再保留。category-add,再说明以后可直接说「恋爱」类消费。delete-preview( date_from/ date_to 卡昨天 + keyword_in_note 或分类/备注)→ 列出 → 用户说「确认删」→ delete-confirm。report 传本月日期范围 → 发图路径 + 个性化短评。serve,给出本机 URL,并说明需在本机浏览器打开。scripts/main.py、 scripts/parser.py、 scripts/db.py、 scripts/report.py、 scripts/web.py、 scripts/utils.py、 scripts/dashboard.html、 scripts/static/vendor/(看板 JS 依赖)若 serve 或 report 报错缺依赖,提示用户执行 pip install -r requirements.txt。
report 将合图与单图 PNG 写入 output_dir。未传时默认为 当前工作目录 下的 billclaw_output/(与显式传 ./billclaw_output 等价,取决于执行 main.py 时的 cwd)。这些文件仅为报表缓存/附件, 不替代 SQLite 账本( db/expenses.db)。output_dir 下过期的 PNG(或按用户指定的保留策略,例如只保留最近 N 天/最近一次生成)。删除前用一两句话说明将删的是报表图片、不涉及账本数据。output_dir 下的 *.png(或整目录内旧文件),具体路径与保留天数由用户自行配置;Agent 不擅自替用户配置系统定时任务,除非用户明确要求协助编写命令或 plist 片段。