饼干记账
记账技能。写入类:记支出、记收入、拍账单、批量录入、改记录、撤销、恢复、记报销、记退款、记借出、记借入、记收回、记偿还、记分期。查询类:查今天、查某天、查月、查区间、查分类、搜备注、查标签、查账户、查账本、查欠款、查待报销。分析类:看月度、看总览、看分类、看对比、看趋势、看大额、做统计、看洞察、看借贷。目标/账户/联动:设定预算、看预算、设定目标、看目标、新增账户、改账户、账户转账、看账户汇总、买东西联动、吃饭联动。**所有查询/分析类唤醒词默认 invoke HTML 工作流**(scripts/bill_inject.py + templates),写入类保持文字回执。能力速查:说「饼干记账 HELP」/「查帮助」/「能做什么」。完整 70 个唤醒词见 references/路由表.md
- License 许可
- MIT
- 最近更新
- 2026-09-12
- Stars
- ★ 6
- Forks
- 1
01 前言 Front Matter
- name
- 饼干记账
- description
- 记账技能。写入类:记支出、记收入、拍账单、批量录入、改记录、撤销、恢复、记报销、记退款、记借出、记借入、记收回、记偿还、记分期。查询类:查今天、查某天、查月、查区间、查分类、搜备注、查标签、查账户、查账本、查欠款、查待报销。分析类:看月度、看总览、看分类、看对比、看趋势、看大额、做统计、看洞察、看借贷。目标/账户/联动:设定预算、看预算、设定目标、看目标、新增账户、改账户、账户转账、看账户汇总、买东西联动、吃饭联动。**所有查询/分析类唤醒词默认 invoke HTML 工作流**(scripts/bill_inject.py + templates),写入类保持文字回执。能力速查:说「饼干记账 HELP」/「查帮助」/「能做什么」。完整 70 个唤醒词见 references/路由表.md
02 资源文件 160
- 参考文档_meta.json131 B
- 其他.gitignore177 B
- 参考文档.out-of-scope/README.md1.3 KB
- 参考文档.scratch/align-biscuit-accountant-to-skill-dev-manual-v1/issues/01-tests-foundation.md765 B
- 参考文档.scratch/align-biscuit-accountant-to-skill-dev-manual-v1/issues/02-validators-py-centralization.md1007 B
- 参考文档.scratch/align-biscuit-accountant-to-skill-dev-manual-v1/issues/03-bills-table-check-constraints.md810 B
- 参考文档.scratch/align-biscuit-accountant-to-skill-dev-manual-v1/issues/04-record-bill-expand-validators-call.md922 B
- 参考文档.scratch/align-biscuit-accountant-to-skill-dev-manual-v1/issues/05-record-bill-contract-remove-inline-checks.md709 B
- 参考文档.scratch/align-biscuit-accountant-to-skill-dev-manual-v1/issues/06-test-render-nine-query-types.md785 B
- 参考文档.scratch/align-biscuit-accountant-to-skill-dev-manual-v1/issues/07-test-payloads-injection-safety.md806 B
- 参考文档.scratch/align-biscuit-accountant-to-skill-dev-manual-v1/issues/08-help-wake-words-four-sync.md795 B
- 参考文档.scratch/align-biscuit-accountant-to-skill-dev-manual-v1/issues/09-help-path-converge-section-12b.md1.1 KB
- 参考文档.scratch/align-biscuit-accountant-to-skill-dev-manual-v1/issues/10-adr-0002-bom-and-gitignore.md862 B
- 参考文档.scratch/align-biscuit-accountant-to-skill-dev-manual-v1/issues/11-categories-mapping-bridge-doc.md858 B
- 参考文档.scratch/align-biscuit-accountant-to-skill-dev-manual-v1/issues/12-skillmd-other-tools-boundary.md902 B
- 参考文档.scratch/align-biscuit-accountant-to-skill-dev-manual-v1/map.md815 B
- 参考文档.scratch/align-biscuit-accountant-to-skill-dev-manual-v1/spec.md16.0 KB
- 参考文档.scratch/land-v15-help-layout/issues/01-land-v15-template-and-auto-copy.md3.1 KB
- 参考文档.scratch/land-v15-help-layout/issues/02-extend-tests-and-fat.md2.8 KB
- 参考文档.scratch/land-v15-help-layout/spec.md12.4 KB
- 参考文档AGENTS.md1.0 KB
- 参考文档AI不允许看的文件.md437 B
- 资产文件backups/backfill_20260703_124859.csv196.6 KB
- 资产文件backups/backfill_20260703_130113.csv855 B
- 资产文件backups/backfill_20260703_131912.csv4.0 KB
- 资产文件backups/backfill_leisure_20260703_163822.csv5.7 KB
- 资产文件backups/backfill_v3p1_classify_20260703_161551.csv151.8 KB
- 资产文件backups/migrate_other_20260703_132832.csv2.3 KB
- 资产文件backups/migrate_other_20260703_133422.csv344 B
- 资产文件backups/migrate_uncategorized_20260703_150838.csv139.6 KB
- 资产文件backups/migrate_uncategorized_20260703_150932.csv837 B
- 脚本config-cookie-accounting.ts10.3 KB
- 参考文档CONTEXT.md3.9 KB
- 参考文档docs/adr/0001-five-layer-skeleton-pending-validators.md1.5 KB
- 参考文档docs/adr/0002-utf-8-bom-for-html-output.md2.3 KB
- 参考文档docs/adr/0003-monthly-count-semantics.md2.8 KB
- 参考文档docs/agents/domain.md862 B
- 参考文档docs/agents/issue-tracker.md1.3 KB
- 参考文档docs/agents/triage-labels.md1.1 KB
- 参考文档references/categories-mapping.md3.8 KB
- 参考文档references/categories.md8.6 KB
- 参考文档references/scenarios.json30.6 KB
- 参考文档references/scenarios.md10.6 KB
- 参考文档references/scenarios.yaml45.4 KB
- 参考文档references/唤醒词全集.md3.4 KB
- 参考文档references/路由表.md6.3 KB
- 参考文档references/路由表框架.md1.7 KB
- 参考文档references/软删契约.md1.3 KB
- 参考文档scenes/account.yaml3.0 KB
- 参考文档scenes/analysis.yaml16.0 KB
- 参考文档scenes/goal.yaml3.0 KB
- 参考文档scenes/link.yaml1.9 KB
- 参考文档scenes/query.yaml9.7 KB
- 参考文档scenes/setup.yaml4.5 KB
- 参考文档scenes/write.yaml12.5 KB
- 脚本scripts/_base_render.py7.4 KB
- 脚本scripts/_record_pkg_fee.py729 B
- 脚本scripts/_record_sam_order.py752 B
- 脚本scripts/_record_veg.py742 B
- 脚本scripts/_selector.py5.2 KB
- 脚本scripts/_split_sam_order.py1.6 KB
- 脚本scripts/account/__init__.py104 B
- 脚本scripts/account/cli.py16.2 KB
- 脚本scripts/account/render.py13.5 KB
- 脚本scripts/analysis/__init__.py43 B
- 脚本scripts/analysis/cli.py51.6 KB
- 脚本scripts/analyze.py6.9 KB
- 脚本scripts/backfill_multilevel.py19.0 KB
- 脚本scripts/backup.py5.1 KB
- 脚本scripts/bill_inject.py23.6 KB
- 脚本scripts/cli_utils.py1.2 KB
- 脚本scripts/db.py10.8 KB
- 脚本scripts/goal/__init__.py43 B
- 脚本scripts/goal/cli.py16.7 KB
- 脚本scripts/goal/render.py12.1 KB
- 脚本scripts/html_paths.py3.5 KB
- 脚本scripts/insights.py6.0 KB
- 脚本scripts/ledger/__init__.py119 B
- 脚本scripts/ledger/cli.py10.3 KB
- 脚本scripts/link/__init__.py28 B
- 脚本scripts/link/cli.py19.8 KB
- 脚本scripts/merge_scenarios.py11.9 KB
- 脚本scripts/migrate_other.py7.1 KB
- 脚本scripts/migrate_uncategorized.py13.9 KB
- 脚本scripts/migrations/add_bills_check_constraints.py7.6 KB
- 脚本scripts/migrations/merge_dirty_names.py6.1 KB
- 脚本scripts/query/__init__.py43 B
- 脚本scripts/query/cli.py18.4 KB
- 脚本scripts/record_bill.py19.5 KB
- 脚本scripts/render_help.py11.5 KB
- 脚本scripts/render_write.py31.6 KB
- 脚本scripts/routing.py3.7 KB
- 脚本scripts/setup/__init__.py—
- 脚本scripts/setup/cli.py25.7 KB
- 脚本scripts/setup/render.py17.4 KB
- 脚本scripts/validators.py8.8 KB
- 脚本scripts/write/__init__.py43 B
- 脚本scripts/write/cli.py6.9 KB
- 参考文档templates/query_view.html26.8 KB
- 参考文档templates/写入/batch_confirm.html9.3 KB
- 参考文档templates/写入/expense_form.html12.4 KB
- 参考文档templates/写入/flow_confirm.html14.6 KB
- 参考文档templates/写入/installment_confirm.html7.7 KB
- 参考文档templates/写入/update_confirm.html7.1 KB
- 参考文档templates/分析/analysis_view.html56.2 KB
- 参考文档templates/开始使用/backup_list.html7.3 KB
- 参考文档templates/开始使用/backup.html6.6 KB
- 参考文档templates/开始使用/import.html10.3 KB
- 参考文档templates/开始使用/init_status.html8.2 KB
- 参考文档templates/开始使用/init_wizard.html10.0 KB
- 参考文档templates/开始使用/restore.html10.8 KB
- 参考文档templates/目标/budget_form.html8.6 KB
- 参考文档templates/目标/budget_view.html12.2 KB
- 参考文档templates/目标/saving_form.html7.9 KB
- 参考文档templates/目标/saving_view.html11.7 KB
- 参考文档templates/联动/meal_confirm.html12.3 KB
- 参考文档templates/联动/purchase_confirm.html12.4 KB
- 参考文档templates/联动/receipt.html9.3 KB
- 参考文档templates/账户/account_form.html7.8 KB
- 参考文档templates/账户/account_view.html13.5 KB
- 参考文档templates/账户/confirm.html7.0 KB
- 参考文档templates/账户/transfer_confirm.html8.9 KB
- 脚本tests/conftest.py12.8 KB
- 脚本tests/test_account.py21.2 KB
- 脚本tests/test_analysis.py29.1 KB
- 脚本tests/test_backup.py3.4 KB
- 脚本tests/test_base_pipeline.py18.4 KB
- 脚本tests/test_conftest_smoke.py1.8 KB
- 脚本tests/test_db_check_constraints.py9.8 KB
- 脚本tests/test_form_selector_dom.py10.1 KB
- 脚本tests/test_goal.py24.9 KB
- 脚本tests/test_goals_fixture.py1.8 KB
- 脚本tests/test_help_contract.py10.4 KB
- 脚本tests/test_insights.py3.5 KB
- 脚本tests/test_ledger.py20.1 KB
- 脚本tests/test_link.py11.6 KB
- 脚本tests/test_merge_scenarios.py10.2 KB
- 脚本tests/test_payloads.py10.7 KB
- 脚本tests/test_query.py16.4 KB
- 脚本tests/test_record_bill_validators.py5.7 KB
- 脚本tests/test_render_write.py19.9 KB
- 脚本tests/test_render.py44.2 KB
- 脚本tests/test_routing.py7.5 KB
- 脚本tests/test_selector.py15.3 KB
- 脚本tests/test_setup.py23.5 KB
- 脚本tests/test_soft_delete.py4.5 KB
- 脚本tests/test_validators.py9.3 KB
- 脚本tmp_814.py505 B
- 脚本tmp_bk_food_detail.py4.5 KB
- 脚本tmp_bk_food.py820 B
- 脚本tmp_check_ali.py297 B
- 脚本tmp_check_gaode.py261 B
- 脚本tmp_july_check.py549 B
- 参考文档tmp_july_expense.json50.9 KB
- 脚本tmp_month.py1000 B
- 脚本tmp_render_sams.py846 B
- 脚本tmp_search_all.py4.7 KB
- 脚本tmp_today.py505 B
- 脚本tmp_write_sams.py704 B
- 参考文档饼干记账.html125.4 KB
03 SKILL.md 正文
🔗 联动提示: 完成本技能主操作后,检查技能路由器(图片路由/SKILL.md)的联动规则,判断是否需要联动其他技能(如用户提到买了实物→询问是否录入居家管家;用户提到食物→询问是否记录卡路里)。详见路由器的联动规则表。
强制性规定(最高优先级)
饼干记账.html= render_help.py 命令生成的 HELP 镜像 — 生成后自动复制到技能根目录,不再手工同步;改动 HELP 相关代码/模板后必须重新生成,一致性由 tests/test_render.py 契约锁定- 修改确认采用任务级授权 — 用户显式点名/下发的任务(如 ready-for-agent 票 / wayfinder ticket)视为对任务范围内修改的一次确认,执行中不再逐行确认;任务范围外、涉及真实数据或破坏性变更仍需先确认
操作规范(强制)
- 所有数据操作通过 CLI(
scripts/write|query|analysis|account/cli.py四域入口),禁止直连数据库 - 只读操作(查询/分析/统计)不需确认;写入操作(记支出/记收入/拍账单/改记录)需用户确认
- 不支持删除已有记录;修改功能见「改记录」流程
- 金额必须明确,不能猜测
安装与配置
依赖
- Python 3.x(系统自带 sqlite3)
配置项
| 环境变量 | 说明 |
|---|---|
SKILLS_DB_PATH |
数据库目录 |
一键安装
请帮我初始化饼干记账技能:
1. 检查 Python 环境
2. 引导我配置环境变量
3. 显示当前环境变量配置
4. 告诉我如何更改数据目录
功能概述
- 文字记账:解析自然语言,提取金额、分类、备注
- 图片记账:看图识别账单金额,用户确认后记录
- 查询统计:今日/指定日期/日期范围/分类查询
- 分析报表:月度汇总、周期对比、分类明细、收支总览
唤醒词总表
全量 70 个唤醒词(2026-08-08 路由表定案);编号见 references/路由表.md;新增在域区间内追加
| 类型 | 唤醒词 | 功能 | CLI 指令 | 默认输出 |
|---|---|---|---|---|
| 写入 | 记支出 |
记一笔支出 | write add |
文字回执 |
| 写入 | 记收入 |
记一笔收入 | write add |
文字回执 |
| 写入 | 拍账单 |
拍账单记账(图片识别) | write add(图片识别) |
文字回执 |
| 写入 | 批量录入 |
批量录入多笔 | write add(批量) |
文字回执 |
| 写入 | 记退款 |
记一笔退款(冲销原支出) | write add + update(#已退款) |
文字回执 |
| 写入 | 记报销 |
记一笔报销支出(#待报销) | write add(#待报销) |
文字回执 |
| 写入 | 报销到账 |
报销到账(记收入 + 流转标签) | write add + update(标签流转) |
文字回执 |
| 写入 | 记借出 |
借给别人钱 | write add(借贷账本) |
文字回执 |
| 写入 | 记借入 |
向别人借钱 | write add(借贷账本) |
文字回执 |
| 写入 | 记收回 |
收回借出的钱 | write add + update(#已还) |
文字回执 |
| 写入 | 记偿还 |
偿还借入的钱 | write add + update(#已还) |
文字回执 |
| 写入 | 记分期 |
记一笔分期(平摊预写) | write add×N(平摊预写) |
文字回执 |
| 写入 | 改记录 |
修改已有记录 | write update |
文字回执 |
| 写入 | 撤销 |
撤销一条记录(软删) | write update(deleted_at) |
文字回执 |
| 写入 | 恢复 |
恢复已撤销记录 | write update(deleted_at=NULL) |
文字回执 |
| 查询 | 查今天 |
查今天收支 | query summary |
HTML |
| 查询 | 查昨天 |
查昨天收支 | query list --date |
HTML |
| 查询 | 查某天 |
查某一天的账 | query list --date |
HTML |
| 查询 | 查最近 |
查最近记录 | query recent |
HTML |
| 查询 | 查周 |
查某周的账 | query list --from --to |
HTML |
| 查询 | 查月 |
查某个月的账 | query list --from --to |
HTML |
| 查询 | 查区间 |
查任意时间段 | query list --from --to |
HTML |
| 查询 | 查分类 |
查某分类的账 | query list --category |
HTML |
| 查询 | 搜备注 |
搜索备注关键词 | query search |
HTML |
| 查询 | 查标签 |
查标签(#tag 聚合) | query tag --tag |
HTML |
| 查询 | 查账户 |
查某账户流水 | query list --account |
HTML |
| 查询 | 查账本 |
查某账本的记录 | query list --ledger |
HTML |
| 查询 | 查欠款 |
查未还欠款(借贷状态) | query debt |
HTML |
| 查询 | 查待报销 |
查待报销 | query reimburse |
HTML |
| 查询 | 查分期 |
查进行中的分期 | query installment |
HTML |
| 分析 | 看月度 |
某月收支汇总 | analysis monthly --month |
HTML |
| 分析 | 看年度 |
年度收支汇总 | analysis yearly --year |
HTML |
| 分析 | 看总览 |
时间段收支总览 | analysis overview --from --to |
HTML |
| 分析 | 看周报 |
本周简报(对比上周) | analysis week |
HTML |
| 分析 | 看分类 |
钱花在哪些分类 | analysis category |
HTML |
| 分析 | 看账户 |
各账户花销情况 | analysis account |
HTML |
| 分析 | 看账本 |
各账本收支汇总 | analysis ledger |
HTML |
| 分析 | 看结构 |
收入支出来源去向 | analysis structure |
HTML |
| 分析 | 看对比 |
本期和上期对比 | analysis compare --period |
HTML |
| 分析 | 看双区间 |
两段时间对比 | analysis range_compare |
HTML |
| 分析 | 看同比 |
今年和去年同比 | analysis yoy --month |
HTML |
| 分析 | 看分类对比 |
两段时间分类差异 | analysis cat_compare |
HTML |
| 分析 | 看趋势 |
每月收支走势 | analysis trend --months |
HTML |
| 分析 | 看分类趋势 |
某分类的月度变化 | analysis cat_trend --category |
HTML |
| 分析 | 看大额 |
大额支出排行 | analysis top --limit |
HTML |
| 分析 | 看高频 |
高频消费排行 | analysis top_freq |
HTML |
| 分析 | 看分布 |
金额区间分布 | analysis distribution |
HTML |
| 分析 | 做统计 |
记账情况统计 | analysis stats |
HTML |
| 分析 | 看活跃 |
记账活跃度 | analysis activity |
HTML |
| 分析 | 看洞察 |
AI 消费洞察 | analysis insight(接洞察生成器) |
HTML |
| 分析 | 看异常 |
异常波动检测 | analysis anomaly(接洞察生成器) |
HTML |
| 分析 | 看借贷 |
借贷总览 | analysis debt_summary(#借贷) |
HTML |
| 分析 | 看报销 |
报销汇总 | analysis reimburse_summary(#待报销) |
HTML |
| 分析 | 看分期 |
分期总览 | analysis installment_summary(#分期) |
HTML |
| 分析 | 看退款 |
退款统计 | analysis refund_summary(#退款) |
HTML |
| 目标 | 设定预算 |
设定月度预算 | goal set-budget --amount X [--month] [--category] |
HTML 表单+回执 |
| 目标 | 看预算 |
查看预算执行 | goal budget [--month] |
HTML |
| 目标 | 设定目标 |
设定储蓄目标 | goal set-saving --name X --amount Y [--deadline] |
HTML 表单+回执 |
| 目标 | 看目标 |
查看目标进度 | goal saving [--name] |
HTML |
| 账户 | 新增账户 |
新增账户 | account add --name X [--type Y] |
HTML 表单+回执 |
| 账户 | 改账户 |
修改账户 | account update --name X [--new-name/--disable/--enable] |
HTML 表单+回执 |
| 账户 | 账户转账 |
账户间转账 | account transfer --amount X --from A --to B |
HTML 表单+回执 |
| 账户 | 看账户汇总 |
查看账户汇总 | account summary |
HTML |
| 联动 | 买东西 |
买东西联动(记账 + 录物品) | link form + receipt |
HTML 表单+回执 |
| 联动 | 吃饭 |
吃饭联动(记账 + 记卡路里) | link form + receipt |
HTML 表单+回执 |
| 开始使用 | 初始化 |
首次使用向导(4 步零决策) | setup init |
HTML |
| 开始使用 | 初始化状态 |
初始化状态(是否已就绪) | setup init-status |
HTML |
| 开始使用 | 备份 |
一键备份 / 查看备份 | setup backup-create / backup-list |
HTML |
| 开始使用 | 恢复备份 |
从备份恢复 | setup restore --name X |
HTML |
| 开始使用 | 导入 |
导入 CSV 账单(列映射向导) | setup import --file X |
HTML |
| HELP | 查帮助 |
能力速查 HELP | render_help.py |
HTML |
| HELP | 能做什么 |
能力速查 HELP | render_help.py |
HTML |
📌 输出位置(§04 原则 12.A / 12.B)
本 Skill 走 §04 原则 12.A / 12.B,HTML 路径名规则固化如下,不可随意改动:
| 类型 | §12 分类 | 文件名规范 | 触发命令 |
|---|---|---|---|
| 数据 / 过程 HTML(12.A) | §12.A | $DATA_DIR/biscuit_accountant_html/<command_zh>_<YYYYMMDD>_<HHMMSS>[_N].html |
bill_inject.py <query_type> [args] |
| HELP HTML(12.B) | §12.B | $DATA_DIR/biscuit_accountant_html/饼干记账_HELP_<YYYYMMDD>_<HHMMSS>[_N].html |
render_help.py |
<command_zh>由scripts/html_paths.resolve_command_name()解析(如今日摘要/月度汇总/收支总览)- 同秒冲突自动追加
_2/_3后缀 $DATA_DIR跟随SKILLS_DB_PATH环境变量(fallbackD:/.db/)- HELP 路径名固定以
饼干记账_HELP_前缀(grep 一抓就出,便于检索历史 HELP 页)
路由规则(用户表达 → 唤醒词 → CLI)
G5 Q3 决议落地(#249)· 相对时间换算细则的唯一承载章节;Step 2 括号引用收敛于此。
触发识别总则(G5 决议 · 变体方向制): 触发识别职责 = frontmatter description 触发词矩阵(按域分组)+ AI 自然语言理解(同义 / 口语 / 模糊 3 方向),不再硬编码别名映射表;唤醒词 = AI 路由入口(简短),场景名 = HELP 阅读(「做什么 +(怎么处理)」)。相对时间表达由 AI 按本表语义换算为具体日期后传入 CLI 参数(CLI 始终接收具体日期)。
可执行参考实现: scripts/routing.py(3 函数 + today 注入,纯库不进运行时)+ tests/test_routing.py(40 用例,覆盖跨月/跨年/闰年/12 月/跨年+1)。修改本表规则必须同步 routing.py,反之亦然。
相对时间映射表
| 表达 | 换算规则 | CLI 参数示例 |
|---|---|---|
| 今天 | 当天 | --date 今天 |
| 昨天 | 前一天(跨月/跨年自动进位) | --date 昨天 |
| 前天 | 前两天 | --date 前天 |
| N 天前 | 当天 − N 天 | --date 3天前 |
| 本周五 / 上周五 / 上上周五 | 所在周偏移 + 周几(本周=0 / 上周=−1 / 上上周=−2,周一=1…周日=7) | --date 上周五 |
| 本周 | 周一 ~ 周日(含今天所在周) | --from 本周一 --to 今天 |
| 上周 | 上周一 ~ 上周日 | --from 上周一 --to 上周日 |
| 本月 | 本月 1 日 ~ 月末 | --month 本月 |
| 上月 | 上月 1 日 ~ 月末(1 月 → 去年 12 月) | --month 上月 |
| 最近 N 天 | 今天 − (N−1) ~ 今天(含今天) | --days N |
关键语义声明:
- 「本周」= 周一 ~ 周日(ISO 语义),自持不共享
- 跨月/跨年/闰年/12 月/跨年+1 等边界由
tests/test_routing.py锁死(如「昨天」= 1 月 1 日 → 去年 12 月 31 日;「上月」= 2024-03 → 2024-02-01 ~ 02-29)
使用流程
Step 1:判断输入类型
| 输入类型 | 处理方式 |
|---|---|
| 纯文字 | 直接匹配唤醒词,解析金额、分类、备注 |
| 纯图片(无文字) | 进入「拍账单」流程,识别图片内容,展示结果,用户确认后记账 |
| 图片+文字 | 看图判断金额,用户文字作为备注或分类提示 |
Step 2:匹配唤醒词
用户输入 → 匹配唤醒词(全量 70 个 · 编号与命令见 §唤醒词总表 / references/路由表.md)→ 进入对应功能流程。
路由识别(G5 决议 · 变体方向制): 触发识别职责 = frontmatter description 触发词矩阵(按域分组)+ AI 自然语言理解(同义 / 口语 / 模糊 3 方向),不再硬编码别名映射表;唤醒词 = AI 路由入口(简短),场景名 = HELP 阅读(「做什么 +(怎么处理)」)。相对时间表达(今天 / 昨天 / 上周五 / 最近 N 天等)的换算细则见 §路由规则。
Step 3:解析参数
记支出
| 用户说 | 解析结果 |
|---|---|
| "午饭35" | 分类=餐饮/外卖/午餐, 金额=-35 |
| "奶茶25" | 分类=餐饮/咖啡奶茶/奶茶, 金额=-25 |
| "打车20用支付宝" | 分类=出行/网约车, 金额=-20, 账户=支付宝 |
| "洗发水80" | 分类=居家/日用品(默认,如上下文有"理发/发廊"则→穿着/洗护), 金额=-80 |
| "昨天买书58" | 分类=玩乐/影音游戏/书籍影视(默认,如上下文有"教材/考试/备考"则→学习/书籍), 金额=-58, 时间=昨天 |
| "记账到旅行账本" | 账本=旅行 |
文字解析关键词:
- "花了 / 付了 / 消费 / 支出 / 买了" → 负数金额
- 未指定时间 → 默认当前时间
- 未指定分类 → 根据内容推断,告知用户可纠正
- 分类参考
references/categories.md(L1/L2/L3 三级 + 歧义词智能判断)
记收入
| 用户说 | 解析结果 |
|---|---|
| "工资8000" | 分类=工资/基本工资, 金额=+8000 |
| "绩效3000" | 分类=工资/绩效, 金额=+3000 |
| "项目奖金5000" | 分类=奖金/项目奖金, 金额=+5000 |
| "副业赚了2000" | 分类=兼职/副业, 金额=+2000 |
| "基金分红300" | 分类=投资/分红, 金额=+300 |
| "红包100" | 分类=其他收入/红包, 金额=+100 |
文字解析关键词:
- "收到 / 收入 / 进账 / 工资 / 赚了" → 正数金额
拍账单
| 用户输入 | 处理方式 |
|---|---|
| 发截图/账单图片 | 识别金额,展示结果,用户确认后记录 |
| 发模糊图片 | 描述看到的内容,请用户确认金额 |
| 发非账单图片 | 告知非账单,询问是否手动输入 |
图片识别规则:
- 优先取「实付 / 实收 / 已支付 / 需付」金额
- 其次取「合计 / 总计 / 总额 / 应付」金额
- 忽略:单品价格、优惠减免、配送费、税额、找零
- 无法判断时,描述看到的内容并请用户确认
确认页生成硬约束(2026-08-13 · #298 缓解 · 违者视为 bug):
- 确认页只能由脚本生成:调用
scripts/render_write.py photo(参数:--images图片数 /--photo-note识别说明 /--amount/--category/--account/--ledger/--note/--account-source/--category-source/--ledger-source/--out)产出采集表单 HTML。禁止 AI 手写/拼装确认页 HTML——AI 的职责是解析账单并把识别结果当参数传给脚本,不是产 HTML。 - 账户必须推断并传参:识别出商家/平台(如「美团外卖」→ 推断账户「美团」)时,AI 推断最可能的已有账户 →
--account 美团 --account-source inferred(表单标「AI 推断」);推断出该账户不存在、建议新建(如「美团月付」)→--account 美团月付 --account-source recommended_new(表单标「AI 推荐·新建」);推断不出、或不确定该账户是否已存在 → 不传(表单留空待用户填),不得编造。账户预置只是省填写,用户可改可清空。 - 来源语义:
--<field>-source取值inferred(AI 推断已有项)/recommended_new(AI 推荐新建)/existing/history/custom;只传字段值不传来源 → 脚本按「值在候选内=已有(existing)、否则=推荐新建」处理;分类只给--category-hint时按建议走(命中已有=推断、全新=推荐新建)。
改记录
| 用户说 | 解析结果 |
|---|---|
| "把那条午饭改成 38" | id=查最近匹配项, amount=-38 |
| "改备注加牛奶" | id=用户指定或查最近匹配, note="原备注+牛奶" |
| "ID=123 改成分类=交通" | id=123, category=交通 |
| "把刚记的那笔改一下" | id=查最近第 1 条,字段待用户告知 |
改记录流程(AI 层负责 diff + 确认):
- 通过
查最近/查某天/搜备注定位目标记录的 ID(必要时把候选展示给用户挑) - 用户告知要改哪些字段、改成什么 → AI 计算 原值 → 新值 的 diff
- 展示 diff 给用户,等待"确认"(未确认前不调 update CLI)
- 用户回复「确认」→ AI 调
update --id <ID> [...新字段] - CLI 返回结果 → AI 反馈「已修改」
确认模板:
📝 待修改(ID=123):
分类: 餐饮 → 餐饮(未改)
金额: -35.00 → -38.00
备注: 午饭 → 午饭+牛奶
确认改?(回复「确认」或「取消」)
查今天
无参数。返回今日 count / expense / income / net + 分类聚合 + 明细。
查询域通用规则:全部查询 = 仅结果型 HTML(缺参 → AI 文字反问,不猜不补);结果 HTML 默认动作区「复制数据 / 复制日志」;无数据 → 空态提示。
查昨天 / 查某天
| 用户说 | 解析结果 |
|---|---|
| "查昨天" | --date = 昨天日期 |
| "5月1号的账" | --date = 2026-05-01 |
| "上周五花了多少" | --date = 计算后的日期 |
查周 / 查月 / 查区间
| 用户说 | 解析结果 |
|---|---|
| "这周的账" | --from 本周一 --to 今天 |
| "上周消费" | --from 上周一 --to 上周日 |
| "5月1到10号" | --from 2026-05-01 --to 2026-05-10 |
查分类
| 用户说 | 解析结果 |
|---|---|
| "餐饮类的记录" | --category 餐饮 |
| "交通花了多少" | --category 交通 |
| "支付宝里餐饮花了多少" | --category 餐饮 --account 支付宝 --type expense |
| "旅行账本这个月的" | --category + --ledger 旅行 + --from/--to |
注意:分类支持 L1 前缀匹配(传「餐饮」命中 餐饮/外卖/午餐 等全部子分类);可组合 时间/账户/账本/收支方向。返回 KPI(支出/收入/净额)+ 分类聚合 + 逐条记录。如需分类汇总统计,使用「看分类」。
查最近
| 用户说 | 解析结果 |
|---|---|
| "最近5条" | --limit 5 |
| "最近的记录" | --limit 10(默认) |
| "近7天的记录" | --days 7 |
| "最近按金额从大到小" | --limit 10 --sort amount_desc |
返回:KPI(笔数/支出/收入/净额)+ 明细(默认时间倒序,可金额排序)。
搜备注
| 用户说 | 解析结果 |
|---|---|
| "搜午饭" | keyword = 午饭 |
| "有没有咖啡的记录" | keyword = 咖啡 |
查标签
| 用户说 | 解析结果 |
|---|---|
| "查 #旅行 的记录" | --tag 旅行 |
| "带 #待报销 的" | --tag 待报销 |
返回:#tag 聚合卡(笔数/支出/收入)+ 命中明细。精确匹配(#旅行 不误伤 #旅行计划)。
查账户
| 用户说 | 解析结果 |
|---|---|
| "支付宝的流水" | --account 支付宝 |
| "招行这个月的" | --account 招行 --from/--to |
返回:该账户 KPI(支出/收入/净额)+ 明细。
查账本
| 用户说 | 解析结果 |
|---|---|
| "旅行账本的记录" | --ledger 旅行 |
| "借贷账本" | --ledger 借贷 |
返回:该账本 KPI(支出/收入/净额)+ 明细。
查欠款
| 用户说 | 解析结果 |
|---|---|
| "查欠款" | debt |
| "小明还欠多少" | debt --target 小明 |
聚合 #未还 记录:借出未还总额 + 借入未还总额 + 未还列表(对象/方向/金额/时间)。对象从备注 #借给{X} / #向{X}借 提取。
查待报销
| 用户说 | 解析结果 |
|---|---|
| "查待报销" | reimburse |
聚合 #待报销 记录:总额 + 列表(金额/分类/日期)。
查分期
| 用户说 | 解析结果 |
|---|---|
| "查分期" | installment |
| "手机的期数" | installment --name 手机 |
按备注 #分期 {名目} 第X期/N 分组:分期卡(名目/总额/每期/期数/已还期数/剩余期数+金额)+ 记录明细。已还期数按「日期 ≤ 今天」推断(分期写入即固定)。
看月度
| 用户说 | 解析结果 |
|---|---|
| "本月汇总" | --month = 当前月(YYYY-MM) |
| "3月份的账" | --month = 2026-03 |
返回:支出/收入/净额/笔数 + 分类排行。
看年度
| 用户说 | 解析结果 |
|---|---|
| "今年汇总" | --year = 当前年 |
| "2025年总结" | --year = 2025 |
返回:全年 KPI(支出/收入/净额/笔数) + 逐月趋势表 + 大额分类 TOP。
看周报
| 用户说 | 解析结果 |
|---|---|
| "本周简报" | week(默认本周) |
| "上周周报" | week --offset 1 |
返回:本周 KPI + 本周 vs 上周双卡(支出变化率) + 本周大额支出。
看总览
| 用户说 | 解析结果 |
|---|---|
| "本月收支" | --month = 当前月(默认) |
| "3月收支情况" | --month = 2026-03 |
| "5月1到10号的收支" | --from 2026-05-01 --to 2026-05-10 |
返回:笔数/支出/收入/净额 + 日均支出 + 区间标注。
看分类
| 用户说 | 解析结果 |
|---|---|
| "各类支出占比" | 无参数,默认本月 |
| "5月的分类明细" | --from 2026-05-01 --to 2026-05-31 |
| "支付宝花了什么" | --account 支付宝 |
| "收入占比" | --type income |
返回:SVG 环形图 + 排行(总额/占比/笔数/均值);分类 L1 聚合(餐饮/外卖 → 餐饮)。
看账户
| 用户说 | 解析结果 |
|---|---|
| "各账户花销" | 默认本月 |
| "上个月的账户情况" | --month 上个月 |
返回:账户占比条 + 各账户汇总(支出/收入/净额)。
看账本
| 用户说 | 解析结果 |
|---|---|
| "各账本收支" | 默认本月 |
返回:各账本汇总卡(生活/旅行/借贷:支出/收入/净额) + 占比。
看结构
| 用户说 | 解析结果 |
|---|---|
| "收入和支出的结构" | 默认本月 |
返回:双环形图(收入来源结构 + 支出去向结构)。
看对比
| 用户说 | 解析结果 |
|---|---|
| "这周和上周比" | --period week |
| "本月和上月比" | --period month |
返回:本期/上期的支出/收入/净额 + 变化率徽章(↑↓→)。
看双区间
| 用户说 | 解析结果 |
|---|---|
| "5月和4月比" | --from1 2026-05-01 --to1 2026-05-31 --from2 2026-04-01 --to2 2026-04-30 |
| "五一和端午比" | 两段区间参数 |
返回:双卡并排(区间一/区间二) + 变化率 + 分类差异提示 TOP。
看同比
| 用户说 | 解析结果 |
|---|---|
| "今年3月和去年比" | --month 2026-03(默认本月) |
返回:今年 vs 去年同月双卡 + 变化率。
看分类对比
| 用户说 | 解析结果 |
|---|---|
| "5月和4月的分类差异" | --from1/--to1/--from2/--to2 两段区间 |
返回:分类差异 TOP(金额变化最大/笔数变化最大) 对比条形。
看趋势
| 用户说 | 解析结果 |
|---|---|
| "近6个月走势" | --months 6 |
| "近一年的趋势" | --months 12(默认) |
返回:SVG 双线折线(支出/收入逐月) + 峰值标注 + 月均。
看分类趋势
| 用户说 | 解析结果 |
|---|---|
| "餐饮的月度变化" | --category 餐饮 --months 12(默认) |
| "出行近半年" | --category 出行 --months 6 |
返回:柱状/折线(该分类逐月支出) + 月均 + 峰值月;分类 L1 前缀匹配。
看大额
| 用户说 | 解析结果 |
|---|---|
| "大额支出TOP10" | --limit 10(默认) |
| "5月花得最大的一笔" | --from 2026-05-01 --to 2026-05-31 --limit 5 |
返回:支出 TOP N 排行(金额/分类/日期/备注)。
看高频
| 用户说 | 解析结果 |
|---|---|
| "什么花得最频繁" | 默认本月 |
| "近30天高频" | --from/--to + --limit 10(默认) |
返回:分类笔数 TOP(笔数/总金额/单均/最近一笔时间)。
看分布
| 用户说 | 解析结果 |
|---|---|
| "金额区间分布" | 默认本月支出 |
| "收入分布" | --type income |
返回:SVG 直方图(区间:<10 / 10-50 / 50-100 / 100-500 / 500+) + 各区间笔数/占比。
做统计
无参数。返回总笔数、记账天数、日均笔数、首笔时间、最近记录时间 + 月度分布。
看活跃
无参数。返回周几分布柱状(哪天记最多) + 时段分布(几点记)。
看洞察
| 用户说 | 解析结果 |
|---|---|
| "AI 消费洞察" | --months 6(默认) |
| "近90天的洞察" | --months 3 |
流程:AI 调 analysis insight --months N --json 拿事实层(period/category_dist/monthly_trend/top_expense + 均值/中位数/最大偏离度,纯计算无判定)→ AI 基于事实撰写解读(消费习惯/异常波动/省钱建议)→ bill_inject.py insight --months N --ai-note "消费习惯:…|异常波动:…|省钱建议:…" 生成洞察卡 HTML(解读卡 + 事实卡)交付。AI 解读规则:只引用事实层数字;不说事实层没有的话;建议可落地(如"奶茶类支出占 18%,可减少频次");三段式用 | 分隔。
看异常
| 用户说 | 解析结果 |
|---|---|
| "异常波动检测" | --months 6(默认) |
流程:AI 调 analysis anomaly --months N --json 拿事实层(月度序列 + 环比变化 + 分类环比暴涨)→ AI 判定异常(突增月/暴涨分类,幅度≥50% 值得说)→ bill_inject.py anomaly --months N --ai-note "异常波动:…|建议核对:…" 生成检测 HTML(解读卡 + 事实卡)交付。AI 判定规则:幅度 < 50% 不判异常;判异常必须附"建议核对"(一次性大额/记错分类/真实增长)。
看借贷
无参数。返回借出未还总额 + 借入未还总额 + 对象列表 + 已还/未还统计;聚合 #借出/#借入/#未还/#已还。
看报销
| 用户说 | 解析结果 |
|---|---|
| "报销汇总" | 无参数 |
返回待报销总额 + 已到账总额 + 历史报销列表;聚合 #待报销/#报销到账。
看分期
无参数。返回进行中分期卡(名目/总额/每期/期数/已还/剩余期数+金额) + 历史分期;聚合 #分期。
看退款
| 用户说 | 解析结果 |
|---|---|
| "退款统计" | 无参数 |
返回退款总额/次数 + 月份分布 + 退款明细;聚合 #退款。
开始使用流程细则(6 场景 · 2026-08-09 落地)
初始化/备份/导入统一遵守(载体契约 G6/G2/G1):
- 初始化:
setup init --check(只读环境检测,向导步骤 1-2)→ 用户确认 →setup init(建库幂等自愈 + 只读验证);重复执行安全。setup init-status三重判定(数据存在 + schema 完整 + 版本 v2.0 特征列 deleted_at);schema 过期 → 显式迁移提示(不自动迁移)。 - 备份:
setup backup-create(db + goals.json → 备份目录<时间戳>/);setup backup-list查看;setup restore --name X恢复(默认最新备份,恢复前自动备份现状防覆盖丢失)。备份/恢复包装公共层scripts/backup.py(T0 第 9 项)。 - 导入:G1 最小方案 = 通用 CSV + 列映射(不逐软件适配)。
setup import --file X [--mapping date=1,amount=3,category=2]自动猜测映射(表头关键词 日期/金额/分类/备注/账户/账本/收支方向),可显式覆盖;时间自动归一化(纯日期补 00:00:00);收支方向列含"收"→正/"支"→负,缺省按金额符号;逐行校验(分类白名单/金额非零/时间格式),失败行收集不中断;外部导入缺省未删(deleted_at=NULL · 软删契约);缺文件路径 → AI 反问(不猜测)。 - 向导 HTML 流程:初始化/恢复/导入 = 向导型(HTML 预览确认 → AI 执行 CLI → 回执);备份 = 回执型 HTML;状态 = 结果型 HTML。全部走
scripts/setup/render.py <mode>,输出路径与 §12.A 一致。
初始化
| 用户说 | 解析结果 |
|---|---|
| "帮我初始化/开始使用" | setup init --check(渲染向导)→ 确认 → setup init |
| "初始化了没/能用吗" | setup init-status → 状态 HTML(未就绪引导初始化) |
流程:AI 调 setup/render.py init-wizard(4 步零决策向导:环境检测 → 数据目录确认 → 建库 → 只读验证;含「记第一笔」引导按钮)→ 用户确认(复制 prompt)→ AI 执行 setup init → 完成页。
备份 / 恢复备份
| 用户说 | 解析结果 |
|---|---|
| "备份一下" | setup backup-create → 回执 HTML |
| "有哪些备份" | setup backup-list → 列表 HTML(空态引导一键备份) |
| "从备份恢复" / "恢复XX备份" | setup restore --name X(默认最新)→ 向导确认 → 恢复回执 |
导入
| 用户说 | 解析结果 |
|---|---|
| "导入 CSV 账单" | 缺文件路径 → AI 反问;有路径 → setup/render.py import --file X 渲染列映射向导 |
流程:HTML 列映射向导(前几行预览 + 自动猜测映射可改)→ 用户确认(复制 prompt 含文件路径 + 映射)→ AI 执行 setup import --file X --mapping ... → 文字回执(成功/失败行数)。
HTML 渲染入口(开始使用域专用,不走 bill_inject):
# 向导型(4 步零决策 / 恢复预览 / 列映射)
python3 scripts/setup/render.py init-wizard
python3 scripts/setup/render.py restore [--name X]
python3 scripts/setup/render.py import --file x.csv
# 结果型 / 回执型
python3 scripts/setup/render.py init-status
python3 scripts/setup/render.py backup-create
python3 scripts/setup/render.py backup-list
账户流程细则(4 场景 · 2026-08-09 落地)
账户 = bills.account 字段(无独立账户表);账户清单 = goals.json 顶层 accounts 键(账户表,与目标域 budgets/savings 键隔离);余额 = 收支累计推算(该账户收入 − 支出)。
载体契约:
- 新增/改名/停用/启用 → 写
goals.json(原子写,保留其他键) - 改名 → 同步更新
bills.account(历史流水保留,跟随新名) - 停用 →
disabled=true,汇总灰显 + 不含于合计;历史记录保留 - 转账 → 两笔记录(会计两笔分录):
转账/转出支出(源账户) +转账/转入收入(目标账户),账本=转账,备注=#转账 转出至X / 转入自X;不影响收支统计(账户汇总收支 KPI 按「转账」分类排除,余额计算含转账使两账户正确增减);其他域查询中与借贷先例一致如实展示
新增账户
| 用户说 | 解析结果 |
|---|---|
| "新增账户 招行卡" | --name 招行卡 |
| "加个花呗账户,信用类型" | --name 花呗 --type 信用 |
流程:采集表单(账户名 + 类型,已有账户可点选快速填写)→ 确认 → account add → 文字回执;重名 → 提示确认。
改账户
| 用户说 | 解析结果 |
|---|---|
| "把招行卡改成招行工资卡" | --name 招行卡 --new-name 招行工资卡 |
| "停用花呗" | --name 花呗 --disable |
流程:diff 确认表单(原账户卡 + 待修改表)→ 确认 → account update → 文字回执;账户不在账户表 → AI 反问(不猜测)。
账户转账
| 用户说 | 解析结果 |
|---|---|
| "从支付宝转 500 到招行卡" | --amount 500 --from 支付宝 --to 招行卡 |
流程:采集表单(金额/从账户/到账户/时间,账户建议点选)→ 确认 → account transfer → 文字回执两笔(转出支出 + 转入收入);同账户/负数 → AI 反问。
看账户汇总
| 用户说 | 解析结果 |
|---|---|
| "看账户汇总" / "账户余额" | account summary |
结果型 HTML:总余额/总收入/总支出/净额/转账 KPI + 各账户余额卡(收支/转入转出/笔数/最近一笔;停用灰显 + 未登记标记)+ 最近流水摘要;空账户表 → 空态引导。
HTML 渲染入口(账户域专用,不走 bill_inject):
# 采集/选择(过程型表单)
python3 scripts/account/render.py add-form --name 微信 --type 支付
python3 scripts/account/render.py transfer-form --amount 200 --from 支付宝 --to 招行卡
python3 scripts/account/render.py update-form --name 招行卡 --new-name 招行工资卡
python3 scripts/account/render.py update-form --name 花呗 --disable
# 查看(结果型)
python3 scripts/account/render.py view
目标域流程细则(4 场景 · 2026-08-09 落地 · 载体 goals.json)
目标域 4 场景统一遵守:
- 载体:
goals.json(与 db 同级,跟随SKILLS_DB_PATH,备份机制已包含)。结构 ={"budgets": [...], "savings": [...]},全部由 CLI 读写,AI 不手改。 - 实际数据 = bills 聚合:预算执行 = 当月支出 vs 预算;目标进度 = 目标期内收入-支出累计(目标期 = 创建当月起 ~ 截止日/今天)。
- 渲染:全部走
scripts/goal/render.py <mode>(采集表单 ×2 + 进度条视图 ×2),结果视图带「复制数据 / 复制日志」(B1 toast)。
设定预算
| 用户说 | 解析结果 |
|---|---|
| "设个3000的月预算" | set-budget --amount 3000(默认本月) |
| "8月餐饮预算500" | set-budget --amount 500 --month 2026-08 --category 餐饮 |
| "预算提到4000" | 先 budget 查现有 → 冲突提示 → 用户确认后加 --force |
覆盖语义(数据契约):同月同类预算已存在 → CLI 返回 conflict + 原值(不覆盖);AI 展示「已存在 X 元预算,确认覆盖为 Y?」→ 用户确认 → 加 --force 重跑。采集表单在渲染时自动查冲突并在表单顶部展示警示条。
看预算
| 用户说 | 解析结果 |
|---|---|
| "预算花到哪了" | budget(默认本月) |
| "8月的预算执行" | budget --month 2026-08 |
返回:结果型 HTML(进度条:预算 vs 实际 / 剩余 / 超支提示)。每预算进度条含状态机:≤90% 预算内(绿)/ 90%~100% 接近上限(橙)/ >100% 已超支(红,警示色)。KPI 汇总口径:总预算存在 → (总预算金额,当月全部支出);否则 → 分类预算之和 vs 分类实际之和(避免重复计数)。月底预测(2026-08-09 门禁 B 复查采纳):当月预算显示「日均 X 元 · 按此节奏月底预计 Y 元(预计超/省提示)」(日均 = 实际 ÷ 已过天数;过去月预测 = 实际;未来月无预测);超支项 KPI 无超支时显示绿色「✓ 无」。
设定目标
| 用户说 | 解析结果 |
|---|---|
| "存个换手机的目标10000" | set-saving --name 换手机 --amount 10000 |
| "年底前存到1万" | set-saving --name X --amount 10000 --deadline 2026-12-31 |
看目标
| 用户说 | 解析结果 |
|---|---|
| "目标存到多少了" | saving |
| "看换手机那个目标" | saving --name 换手机 |
返回:结果型 HTML(各目标进度:已存 / 目标 / 百分比 / 剩余 / 预计达成日)。预计达成日 = 按月均净存(已存 ÷ 目标期月数)推算;月均 ≤ 0 → 暂无预计;已达 → 标记 🎉;预计日晚于截止日 → 进度落后(红)。达标所需月存(2026-08-09 门禁 B 复查采纳):带截止日且未达成的目标显示「截止前达标还需每月 X 元」(剩余 ÷ 剩余月数,本月内到期按 1 个月计)。
写入流程细则(内置能力 + 特殊场景 · 2026-08-08 定稿)
所有写入类场景(记支出/记收入/拍账单/批量录入/记退款/记借出/记借入/记收回/记偿还/记分期)统一遵守:
0. 过程型 HTML 硬约束(2026-08-13 · #298 缓解)
所有写入类确认页/采集表单只能由对应渲染脚本产出(render_write.py / link/cli.py 等),禁止 AI 手写 HTML。AI 的职责 = 解析用户意图 + 把字段当参数传给脚本。字段推断(账户/分类/账本)传得出就传、传不出就不传,不得编造;推断已有项配 --<field>-source inferred、推荐新建配 --<field>-source recommended_new(缺省只传值 → 值在候选内=已有、否则=推荐新建);预置值用户可改可清空(详见各场景小节,拍账单见上文「确认页生成硬约束」)。
1. 分类选择器(过程型 HTML 必用)
信息不全面时,AI 生成过程型 HTML(采集表单)让用户补全:
- AI 智能推荐:根据用户话语义 + 现有分类库(references/categories.md)推荐:
- 已有分类 → 标记「AI 推荐的已有分类」
- 库里没有 → 标记「推荐新建分类」
- 手动选择:下拉列出全部现有分类(L1/L2/L3 层级)
- 新建分类:按钮 → 输入新分类名 → 校验相似(已有「餐饮/外卖」时提示「是否使用已有的?」→ 拦一字之差)
- 原则:分类规范是数据质量核心,宁可让用户选,不让 AI 自造
2. 智能预填(记支出/记收入)
用户话里有明确名目(如「交房租」)时:
- AI 检索历史同类记录(同分类 或 备注关键词匹配)
- 有 → 过程型 HTML 预填上次值(金额/分类/账户/账本/备注),标注「⚡ 根据 X 月 X 日的房租记录预填,可直接确认或修改」
- 无历史 → 正常空表单(不猜、不预填)
- 预填只是省填写:不自动确认,用户可改可忽略
3. 重复检测提示(写入时)
写入前 AI 检索近期相似记录(同分类 + 同金额 + 时间接近):
- 疑似重复 → 提示「这笔和 X 月 X 日的 35 元午饭很像,确认要再记一笔吗?」
- 用户确认 → 继续写入;否认 → 正常写入
4. tag 约定(备注 #tag)
| tag | 含义 | 使用场景 |
|---|---|---|
| #待报销 | 垫付待报销 | 记报销 |
| #报销到账 | 报销已回款 | 报销到账 |
| #退款 | 收到的退款 | 记退款 |
| #已退款 | 原支出已冲销 | 记退款(标记原支出) |
| #借出 / #借入 | 借贷方向 | 记借出 / 记借入 |
| #未还 / #已还 | 借贷状态机 | 借出/借入(#未还)→ 收回/偿还(#已还) |
| #收回 / #偿还 | 借贷回款 | 记收回 / 记偿还 |
| #分期 | 分期分摊记录 | 记分期(每笔备注 名目 第X期/N) |
5. 特殊场景 AI 流程
记退款:① 查原支出(描述定位)② 记收入(分类=退款/冲销,备注 #退款 原支出:[ID/描述])③ 原支出备注追加 #已退款 ④ 回执两笔;找不到原支出 → AI 反问
记借出/记借入:记支出/收入(分类=借贷/借出|借入,账本=借贷,备注=#借出 #借给{对象} #未还 / #借入 #向{对象}借 #未还)
记收回/记偿还:① 查 #未还 记录定位(对象/金额匹配)② 记反向(收回=收入 / 偿还=支出,分类=借贷/收回|偿还,账本=借贷,备注=#收回 原记录ID)③ 原记录备注 #未还→#已还 ④ 回执两笔
记分期:每期=总价÷期数(除不尽首期补差额)→ 写 N 笔支出(分类=分期/{名目},金额=每期,时间=首期日起每月同日,备注=#分期 {名目} 第X期/N)→ 向导确认(分摊预览)→ 回执总览;记录=消费分摊,写入即固定(提前还清不影响记录)
联动流程细则(买东西联动 / 吃饭联动 · 2026-08-09 落地)
联动域 2 场景 = 场景簇 + 回执按钮(G2 决议):主操作 = 记支出(复用 write add),联动 = 回执按钮(可选)。
买东西联动(唤醒词:买东西)
- AI 解析 金额/物品/分类(选填,默认 居家/家电)→ 调
link/cli.py form purchase渲染采集表单(含联动预告条) - 用户确认(复制 prompt)→ AI 调
write/cli.py add记支出(分类/金额/备注,备注建议含物品名,如空气炸锅) - AI 调
link/cli.py receipt purchase --id <ID> --item <物品>渲染回执 HTML:- 已记录账单卡(ID/金额/分类/账户/账本/时间/备注)
- 联动按钮「🔗 同时录入居家管家」→ 点击复制联动 prompt(预告式:请加载「居家管家」技能,帮我录入刚买的物品(唤醒词:录物品):物品/数量/金额/分类)→ 用户粘贴给 AI → AI 调居家管家「录物品」
- 「↩ 撤销这笔」+ 复制数据/复制日志(08 硬标准)
- 用户只记账不联动 → 正常回执,按钮可选不用
吃饭联动(唤醒词:吃饭)
- AI 解析 金额/吃了/分类(选填,默认 餐饮)→ 调
link/cli.py form meal渲染采集表单 - 用户确认 → AI 调
write/cli.py add记支出 - AI 调
link/cli.py receipt meal --id <ID> --ate <吃了>渲染回执 HTML:- 联动按钮「🔗 同时记卡路里」→ 点击复制联动 prompt(请加载「卡路里」技能,帮我记一餐(唤醒词:记一餐):吃了/餐别/备注)→ AI 调卡路里「记一餐」
通用:联动 prompt 只在回执按钮上(预告式,点击才复制);缺金额 → AI 反问(不猜测);联动 = 可选,不强制。
Step 4:执行指令
# 记支出(多级分类:L1/L2/L3 用 / 分隔)
python3 scripts/scripts/write/cli.py add --category 餐饮/外卖/午餐 --amount -35.0 --note "午饭"
python3 scripts/scripts/write/cli.py add --category 餐饮/咖啡奶茶/奶茶 --amount -25.0
# 改记录(按 ID)
python3 scripts/scripts/write/cli.py update --id 123 --note "午饭+牛奶"
python3 scripts/scripts/write/cli.py update --id 123 --amount -38.0 --category 餐饮
python3 scripts/scripts/write/cli.py update --id 123 --amount -50 --account 微信 --ledger 餐饮
# 记收入
python3 scripts/scripts/write/cli.py add --category 工资/基本工资 --amount 8000.0 --note "5月工资"
# 查今天
python3 scripts/scripts/query/cli.py summary
# 查昨天 / 查某天
python3 scripts/scripts/query/cli.py list --date 2026-05-27
# 查周 / 查月 / 查区间
python3 scripts/scripts/query/cli.py list --from 2026-05-01 --to 2026-05-31
# 查分类
python3 scripts/scripts/query/cli.py list --category 餐饮
# 查最近
python3 scripts/scripts/query/cli.py recent --limit 10
python3 scripts/scripts/query/cli.py recent --days 7 --sort amount_desc
# 搜备注
python3 scripts/scripts/query/cli.py search "午饭"
# 查标签(#tag 聚合)
python3 scripts/scripts/query/cli.py tag --tag 旅行
# 查欠款 / 查待报销 / 查分期(状态族聚合)
python3 scripts/scripts/query/cli.py debt --target 小明
python3 scripts/scripts/query/cli.py reimburse
python3 scripts/scripts/query/cli.py installment --name 手机
# 看月度
python3 scripts/scripts/analysis/cli.py monthly --month 2026-05
# 看年度 / 看周报
python3 scripts/scripts/analysis/cli.py yearly --year 2026
python3 scripts/scripts/analysis/cli.py week
python3 scripts/scripts/analysis/cli.py week --offset 1
# 看总览(区间)
python3 scripts/scripts/analysis/cli.py overview --from 2026-05-01 --to 2026-05-31
python3 scripts/scripts/analysis/cli.py overview --month 2026-05
# 看分类(L1 聚合 + 环形图)
python3 scripts/scripts/analysis/cli.py category
python3 scripts/scripts/analysis/cli.py category --from 2026-05-01 --to 2026-05-31 --account 支付宝
# 看账户 / 看账本 / 看结构
python3 scripts/scripts/analysis/cli.py account
python3 scripts/scripts/analysis/cli.py ledger
python3 scripts/scripts/analysis/cli.py structure
# 看对比
python3 scripts/scripts/analysis/cli.py compare --period week
# 看双区间 / 看同比 / 看分类对比
python3 scripts/scripts/analysis/cli.py range_compare --from1 2026-05-01 --to1 2026-05-31 --from2 2026-04-01 --to2 2026-04-30
python3 scripts/scripts/analysis/cli.py yoy --month 2026-05
python3 scripts/scripts/analysis/cli.py cat_compare --from1 2026-05-01 --to1 2026-05-31 --from2 2026-04-01 --to2 2026-04-30
# 看趋势 / 看分类趋势
python3 scripts/scripts/analysis/cli.py trend --months 12
python3 scripts/scripts/analysis/cli.py cat_trend --category 餐饮 --months 6
# 看大额 / 看高频 / 看分布
python3 scripts/scripts/analysis/cli.py top --limit 10
python3 scripts/scripts/analysis/cli.py top_freq
python3 scripts/scripts/analysis/cli.py distribution
# 做统计 / 看活跃
python3 scripts/scripts/analysis/cli.py stats
python3 scripts/scripts/analysis/cli.py activity
# 看洞察 / 看异常(洞察生成器事实 + AI 解读)
python3 scripts/scripts/analysis/cli.py insight --months 6
python3 scripts/scripts/analysis/cli.py anomaly --months 6
# 看借贷 / 看报销 / 看分期 / 看退款(状态聚合)
python3 scripts/scripts/analysis/cli.py debt_summary
python3 scripts/scripts/analysis/cli.py reimburse_summary
python3 scripts/scripts/analysis/cli.py installment_summary
python3 scripts/scripts/analysis/cli.py refund_summary
# 账户域(账户表 = goals.json accounts;HTML 渲染走 scripts/account/render.py)
python3 scripts/account/cli.py add --name 招行卡 --type 银行卡
python3 scripts/account/cli.py update --name 招行卡 --new-name 招行工资卡
python3 scripts/account/cli.py update --name 花呗 --disable
python3 scripts/account/cli.py transfer --amount 500 --from 支付宝 --to 招行卡
python3 scripts/account/cli.py summary
# 开始使用域(初始化/备份/导入;HTML 渲染走 scripts/setup/render.py)
python3 scripts/setup/cli.py init --check
python3 scripts/setup/cli.py init
python3 scripts/setup/cli.py init-status
python3 scripts/setup/cli.py backup-create
python3 scripts/setup/cli.py backup-list
python3 scripts/setup/cli.py restore --name 20260809_120000
python3 scripts/setup/cli.py import --file x.csv --mapping date=1,amount=3,category=2
Step 5:回复用户
✓ 已记录:餐饮 -35.00
Step 6:HTML 可视化查询(v2.3 · 默认工作流)
🎯 默认行为(§04 原则 11 HTML-First): 所有查询/分析/统计类唤醒词命中后,AI 默认 调用
scripts/bill_inject.py生成可视化 HTML 交付给用户。 文字答仅在用户明确说「不要 HTML」「给我文字版」「就告诉我数字」时才走。
支持 25 种查询/分析类型(全部默认 HTML):
| 类型 | CLI 子命令 | 适用场景 | bill_inject.py 调用 |
|---|---|---|---|
| 今日摘要 | summary |
看今日收支 | bill_inject.py summary |
| 列表 | list / recent / search |
看记录明细 | bill_inject.py list --date 2026-07-27 |
| 查标签 | tag |
#tag 聚合 | bill_inject.py tag --tag 旅行 |
| 查欠款 | debt |
未还借贷聚合 | bill_inject.py debt |
| 查待报销 | reimburse |
#待报销 清单 | bill_inject.py reimburse |
| 查分期 | installment |
#分期 分期卡 | bill_inject.py installment |
| 月度汇总 | monthly |
看月度分类排行 | bill_inject.py monthly --month 2026-07 |
| 年度汇总 | yearly |
看年度趋势 | bill_inject.py yearly --year 2026 |
| 本周简报 | week |
本周 vs 上周 | bill_inject.py week |
| 收支总览 | overview |
看区间 4 KPI + 日均 | bill_inject.py overview --from ... --to ... |
| 分类占比 | category |
看分类环形图(L1 聚合) | bill_inject.py category --month 2026-07 |
| 账户占比 | account |
看各账户花销 | bill_inject.py account |
| 账本汇总 | ledger |
看各账本收支 | bill_inject.py ledger |
| 收支结构 | structure |
看收入来源/支出去向 | bill_inject.py structure |
| 周期对比 | compare |
本周 vs 上周 / 本月 vs 上月 | bill_inject.py compare --period week |
| 双区间对比 | range_compare |
两段时间对比 | bill_inject.py range_compare --from1 ... --to1 ... --from2 ... --to2 ... |
| 同比对比 | yoy |
今年 vs 去年同月 | bill_inject.py yoy --month 2026-07 |
| 分类对比 | cat_compare |
分类差异 TOP | bill_inject.py cat_compare --from1 ... --to1 ... --from2 ... --to2 ... |
| 收支趋势 | trend |
逐月折线(支出/收入) | bill_inject.py trend --months 12 |
| 分类趋势 | cat_trend |
某分类逐月变化 | bill_inject.py cat_trend --category 餐饮 --months 6 |
| 大额排行 | top |
支出 TOP N | bill_inject.py top --limit 10 |
| 高频排行 | top_freq |
分类笔数 TOP | bill_inject.py top_freq |
| 金额分布 | distribution |
直方图(5 区间) | bill_inject.py distribution |
| 记账统计 | stats |
看总笔数 / 天数 | bill_inject.py stats |
| 活跃度 | activity |
周几/时段分布 | bill_inject.py activity |
| 消费洞察 | insight |
AI 洞察(事实 + 解读) | bill_inject.py insight --months 6 |
| 异常检测 | anomaly |
突增月/暴涨分类 | bill_inject.py anomaly --months 6 |
| 借贷总览 | debt_summary |
借出/借入未还 + 对象 | bill_inject.py debt_summary |
| 报销汇总 | reimburse_summary |
待报销 + 已到账 | bill_inject.py reimburse_summary |
| 分期总览 | installment_summary |
进行中 + 历史分期 | bill_inject.py installment_summary |
| 退款统计 | refund_summary |
退款总额/次数/分布 | bill_inject.py refund_summary |
账户域例外:账户类唤醒词(新增账户/改账户/账户转账/看账户汇总)不走 bill_inject,走
scripts/account/render.py(见「账户流程细则」),输出路径与 §12.A 一致。
调用流程(AI 必走):
# 标准路径(自动调 CLI + 注入 HTML 模板 + 输出文件)
python3 scripts/bill_inject.py summary
python3 scripts/bill_inject.py monthly --month 2026-07
python3 scripts/bill_inject.py category --month 2026-07
python3 scripts/bill_inject.py range_compare --from1 2026-07-01 --to1 2026-07-31 --from2 2026-06-01 --to2 2026-06-30
python3 scripts/bill_inject.py insight --months 6
python3 scripts/bill_inject.py search "咖啡"
错误处理(§04 原则 11 反模式 #3):
- HTML 生成失败 → 保留错误页 HTML 交付给用户(bill_inject.py 自动处理)
- ❌ 禁止降级为文字答(这是 fail mode,不是 fallback)
- 用户明确要文字 → 才走
python3 scripts/scripts/query/cli.py summary(无 --json)
默认输出路径(v2.5 同步卡路里 §4.1):$DATA_DIR/biscuit_accountant_html/<command_zh>_<YYYYMMDD>_<HHMMSS>[_N].html
DATA_DIR跟随SKILLS_DB_PATH环境变量(fallbackD:/.db/)- 中文化 command 名:summary → 今日摘要 / monthly → 月度汇总 / overview → 收支总览
- 同秒冲突自动追加
_2/_3后缀
指定输出路径:python3 scripts/bill_inject.py summary --out C:/Users/xxx/Desktop/x.html
交付给用户:用 <media src="..." type="file" /> 把生成的 HTML 文件交付,用户双击在浏览器打开即可看到可视化效果。
模板特性(query_view.html / 分析/analysis_view.html):
- 单文件离线运行(无 CDN / 无 chart.js 依赖)
- Apple 视觉风格(圆角卡片 / 系统字体 / 蓝橙绿红配色)
- 自适应桌面 + 平板 + 手机
- 5 种状态:正常 / 空态 / 缺数据 / 错误 / 离线
- 查询域:SVG 环形图(breakdown 用)
- 分析域(templates/分析/analysis_view.html · 2026-08-09 实施):SVG 环形/柱状/双线折线/直方 4 种图表,离线可用;25 场景全渲染器(汇总/结构/对比/趋势/金额/统计洞察/状态聚合)
- 一键复制 ID 回 AI(每条记录含 ID)
目标域 HTML(goal/render.py · 2026-08-09 落地):
| 场景 | CLI 子命令 | 模板 | goal/render.py 调用 |
|---|---|---|---|
| 设定预算(采集表单) | set-budget |
templates/目标/budget_form.html |
goal/render.py set-budget --amount 3000 --month 2026-08 |
| 看预算(进度条) | budget |
templates/目标/budget_view.html |
goal/render.py budget --month 2026-08 |
| 设定目标(采集表单) | set-saving |
templates/目标/saving_form.html |
goal/render.py set-saving --name 换手机 --amount 10000 |
| 看目标(进度条) | saving |
templates/目标/saving_view.html |
goal/render.py saving |
目标域结果视图同样默认 HTML 交付(进度条 + 复制数据/日志),采集表单默认「填写确认 + 复制确认 prompt」。
调用流程(AI 必走):
# 标准路径(自动调 CLI + 注入 HTML 模板 + 输出文件)
python3 scripts/goal/render.py set-budget --amount 3000
python3 scripts/goal/render.py budget
python3 scripts/goal/render.py set-saving --name 换手机 --amount 10000 --deadline 2026-12-31
python3 scripts/goal/render.py saving
错误处理(§04 原则 11 反模式 #3):
- HTML 生成失败 → 保留错误页 HTML 交付给用户(goal/render.py 自动处理)
- ❌ 禁止降级为文字答(这是 fail mode,不是 fallback)
- 用户明确要文字 → 才走
python3 scripts/scripts/goal/cli.py budget(无 --json)
默认输出路径(v2.5 同步卡路里 §4.1):$DATA_DIR/biscuit_accountant_html/<command_zh>_<YYYYMMDD>_<HHMMSS>[_N].html
DATA_DIR跟随SKILLS_DB_PATH环境变量(fallbackD:/.db/)- 中文化 command 名:set-budget → 设定预算 / budget → 看预算 / set-saving → 设定目标 / saving → 看目标
- 同秒冲突自动追加
_2/_3后缀
指定输出路径:python3 scripts/goal/render.py budget --out C:/Users/xxx/Desktop/x.html
交付给用户:用 <media src="..." type="file" /> 把生成的 HTML 文件交付,用户双击在浏览器打开即可看到可视化效果。
模板特性(templates/目标/*.html):
- 单文件离线运行(无 CDN / 无图表库依赖)
- Apple 视觉风格(圆角卡片 / 系统字体 / 蓝橙绿红配色)
- 自适应桌面 + 平板 + 手机
- 结果视图 5 种状态:正常 / 空态 / 缺数据 / 错误 / 离线
- 进度条组件(预算 vs 实际 / 已存 vs 目标)+ 状态机警示色(预算内绿 / 接近上限橙 / 已超支红;目标进行中蓝 / 落后红 / 达成绿)
- 采集表单:字段回显 + 覆盖冲突警示条 + 一键复制确认 prompt(对齐 scenes/goal.yaml)
开始使用域 HTML(setup/render.py · 2026-08-09 落地):
| 场景 | CLI 子命令 | 模板 | setup/render.py 调用 |
|---|---|---|---|
| 首次使用向导(4 步零决策) | init / init --check |
templates/开始使用/init_wizard.html |
setup/render.py init-wizard |
| 初始化状态(三重判定) | init-status |
templates/开始使用/init_status.html |
setup/render.py init-status |
| 一键备份(回执) | backup-create |
templates/开始使用/backup.html |
setup/render.py backup-create |
| 查看备份(列表) | backup-list |
templates/开始使用/backup_list.html |
setup/render.py backup-list |
| 从备份恢复(向导) | restore --name X |
templates/开始使用/restore.html |
setup/render.py restore [--name X] |
| 导入 CSV(列映射向导) | import --file X |
templates/开始使用/import.html |
setup/render.py import --file X |
开始使用域场景默认 HTML 交付(向导/回执/结果型 + 复制数据/日志);备份/恢复/导入包装公共层 backup.py(G2 决议 备份 = db + goals.json)。
调用流程(AI 必走):
# 标准路径(向导/回执/结果 → HTML;执行走 setup/cli.py)
python3 scripts/setup/render.py init-wizard
python3 scripts/setup/render.py init-status
python3 scripts/setup/render.py backup-create
python3 scripts/setup/render.py backup-list
python3 scripts/setup/render.py restore
python3 scripts/setup/render.py import --file x.csv
# 执行侧(向导确认后)
python3 scripts/setup/cli.py init
python3 scripts/setup/cli.py import --file x.csv --mapping date=1,amount=3,category=2
错误处理(§04 原则 11 反模式 #3):
- HTML 生成失败 / 业务失败(无备份可恢复 / 文件不存在 / 缺文件路径)→ 保留错误页 HTML 交付给用户(setup/render.py 自动处理,含 5 状态契约错误回执)
- ❌ 禁止降级为纯文字答(这是 fail mode,不是 fallback)
默认输出路径(v2.5 同步卡路里 §4.1):$DATA_DIR/biscuit_accountant_html/<command_zh>_<YYYYMMDD>_<HHMMSS>[_N].html
- 中文化 command 名:init-wizard → 初始化向导 / init-status → 初始化状态 / backup-create → 一键备份 / backup-list → 查看备份 / restore → 从备份恢复 / import → 导入CSV
指定输出路径:python3 scripts/setup/render.py restore --out C:/Users/xxx/Desktop/x.html
交付给用户:用 <media src="..." type="file" /> 把生成的 HTML 文件交付,用户双击在浏览器打开即可看到可视化效果。
模板特性(templates/开始使用/*.html):
- 单文件离线运行(无 CDN / 无图表库依赖)
- Apple 视觉风格(圆角卡片 / 系统字体 / 蓝橙绿红配色)
- 自适应桌面 + 平板 + 手机
- 向导型步骤条(初始化 4 步 / 恢复 3 步 / 导入列映射)+ 完成态「记第一笔」引导按钮
- 初始化状态三重判定卡(存在 / schema / 版本)+ 迁移提示条
- 备份列表空态引导一键备份;恢复向导覆盖警示(恢复前自动备份现状)
Step 7:HELP 能力速查(v4.0 · Base 参数化 · #303)
当用户说「饼干记账 HELP」「饼干记账 帮助」「查帮助」「能做什么」时,AI 调用 scripts/render_help.py 生成 HELP HTML 并交付。
# 默认输出
python3 scripts/render_help.py
# 输出路径(v2.5.1):$DATA_DIR/biscuit_accountant_html/饼干记账_HELP_<YYYYMMDD>_<HHMMSS>[_N].html
# 指定输出
python3 scripts/render_help.py --out /path/to/help.html
# 仅校验数据源与契约(CI 用)
python3 scripts/render_help.py --check
HELP HTML 契约(§07 · #303 重构):
- 来源:
references/scenarios.yaml(合并器汇总 · 7 域 scenes yaml 唯一事实源)+公共组件/assets/help_template.html(Base 参数化模板 · scene-data 契约 v1 · V4.16 定稿) - 展平(技能侧 · render_help.py v4.0):7 域 → 2 级分组(groups → subgroups)+ 场景卡;wake_word 层消失并入场景卡 chip;types 徽章 = type 单值包数组;源 yaml 3 层结构不动
- 展示 7 域(写入 / 查询 / 分析 / 目标 / 账户 / 联动 / 开始使用)× 70 个功能唤醒词(+4 条 HELP) × 71 个合法场景
- 子功能组默认展开;点场景卡开 Sheet 弹层看 prompt 详情 + 复制
- 每场景「复制」按钮 + Base hm-toast 通知(toast(msg, detail, opts) · 样式由公共组件决定)
- 粘性搜索栏(跨 Tab 匹配 + 自动跳转 + 高亮)+ 底部 Tab 栏(7 域 + 关于)
- 未初始化时显示「首次使用」横幅(复制初始化 prompt,与
setup_init_wizard场景逐字一致) - HELP 自身 4 条唤醒词经 meta_blocks 透传(页面不渲染展示,与卡路里一致);联系作者 / 版本在「关于」Tab
命令行参考
共 10 个子命令:
| 子命令 | 说明 | 必需参数 | 可选参数 |
|---|---|---|---|
add |
添加账单 | --category, --amount |
--time, --account, --ledger, --currency, --note |
update |
修改账单 | --id (必需) |
--category, --amount, --time, --account, --ledger, --currency, --note(至少传一个) |
list |
查询记录 | (无) | --date, --from+--to, --category, --account, --ledger, --type(expense/income), --json |
search |
搜索备注 | keyword(位置参数) |
--json |
summary |
今日摘要 | (无) | --json |
tag |
查标签(#tag 聚合) | --tag |
--json |
debt |
查欠款(#未还 聚合) | (无) | --target, --json |
reimburse |
查待报销(#待报销) | (无) | --json |
installment |
查分期(#分期 聚合) | (无) | --name, --json |
monthly |
月度汇总 | --month |
--json |
recent |
最近N条 | (无) | --limit (默认 10), --days, --sort(amount_desc/amount_asc), --json |
yearly |
年度汇总 | (无) | --year (默认今年), --json |
week |
本周简报 | (无) | --offset (0=本周/1=上周), --json |
overview |
收支总览 | (无) | --month (默认当月) 或 --from+--to (区间), --json |
category |
分类占比(L1 聚合) | (无) | --month 或 --from+--to, --account, --type(expense/income), --json |
account |
账户占比 | (无) | --month 或 --from+--to, --json |
ledger |
账本汇总 | (无) | --month 或 --from+--to, --json |
structure |
收支结构(双环形) | (无) | --month 或 --from+--to, --json |
compare |
周期对比 | (无) | --period (week/month, 默认 week), --json |
range_compare |
双区间对比 | (无) | --from1+--to1+--from2+--to2(全必填), --json |
yoy |
同比对比 | (无) | --month (默认本月), --json |
cat_compare |
分类对比 | (无) | --from1+--to1+--from2+--to2(全必填), --json |
trend |
收支趋势 | (无) | --months (默认 12), --json |
cat_trend |
分类趋势 | (无) | --category, --months (默认 12), --json |
top |
大额排行 | (无) | --limit (默认 10), --from+--to, --json |
top_freq |
高频排行 | (无) | --limit (默认 10), --from+--to, --json |
distribution |
金额分布 | (无) | --month 或 --from+--to, --type(expense/income, 默认 expense), --json |
stats |
记账统计 | (无) | --json |
activity |
记账活跃度 | (无) | --json |
insight |
AI 消费洞察 | (无) | --months (默认 6), --top-n, --json |
anomaly |
异常波动检测 | (无) | --months (默认 6), --json |
debt_summary |
借贷总览(#借出/#借入) | (无) | --json |
reimburse_summary |
报销汇总(#待报销) | (无) | --json |
installment_summary |
分期总览(#分期) | (无) | --json |
refund_summary |
退款统计(#退款) | (无) | --json |
breakdown |
分类明细(旧口径兼容) | (无) | --from, --to, --json |
form |
联动采集表单渲染(买东西联动/吃饭联动) | purchase/meal(位置参数) |
--amount, --item/--ate, --category, --category-hint, --account, --ledger, --time, --note, --currency, --account-source, --category-source, --ledger-source, --out |
receipt |
联动回执渲染(回执带联动按钮) | purchase/meal + --id(必需) |
--item/--ate, --out |
set-budget |
设定月度预算(goal) | --amount |
--month(默认本月), --category(不填=总预算), --force(覆盖), --json |
budget |
查看预算执行(goal) | (无) | --month, --category, --json |
set-saving |
设定储蓄目标(goal) | --name, --amount |
--deadline, --json |
saving |
查看目标进度(goal) | (无) | --name, --json |
init |
初始化向导执行(setup) | (无) | --check(只读环境检测), --json |
init-status |
初始化状态三重判定(setup) | (无) | --json |
backup-create |
一键备份(setup · db+goals.json) | (无) | --json |
backup-list |
查看备份(setup) | (无) | --json |
restore |
从备份恢复(setup) | (无) | --name(默认最新), --json |
import |
导入 CSV 账单(setup) | --file |
--mapping(字段=列号), --encoding, --skip-header, --preview/--dry-run, --json |
JSON 契约:所有查询命令加
--json后输出{status: "ok"|"error", data: {...}, message: "..."}三段式。bill_inject.py用此契约注入 HTML 模板。写入类命令(add/update)不支持--json,保持纯文本输出。目标域 4 命令(set-budget/budget/set-saving/saving)在scripts/goal/cli.py(HTML 渲染走scripts/goal/render.py);set-budget覆盖冲突时返回status: "ok"+data.conflict: true(原值在data.existing),AI 据此提示用户确认后加--force。开始使用域 6 命令(init/init-status/backup-create/backup-list/restore/import)在scripts/setup/cli.py(HTML 渲染走scripts/setup/render.py,包装公共层 backup.py)。
分类参考
分类采用 L1/L2/L3 三级 结构(支出)/ L1/L2 二级 结构(收入),用 / 分隔(如 餐饮/外卖/午餐)。
AI 解析必读 references/categories.md 的「分类心法」章节 — 心法包含 5 个判断维度(主体/目的/对象/工具vs体验/谁付费)和边界示例。不要"关键词查表",要按意图推场景。 关键词表只在心法覆盖不到时兜底。
支出 L1(10 个): 餐饮、居家、穿着、出行、玩乐、学习、健康、社交、宠物、其他
收入 L1(5 个): 工资、奖金、兼职、投资、其他收入
旧数据中不带
/的分类(如餐饮、交通)自动视为 L1,无需迁移。
与其他工具的边界
本 Skill 的 5 层骨架(数据层 db.py / 操作层 analyze.py / 规则层 validators.py / 接口层 write|query|analysis|account/cli.py(四域) / 文档层 references/+templates/)不含 config-cookie-accounting.ts。
| 文件 | 归属 | 维护方 | 与本 Skill 的关系 |
|---|---|---|---|
config-cookie-accounting.ts |
SkillBoard 数据层视图(legacy) | 独立维护 | 不在 5 层骨架内;权威分类体系以 references/categories.md 为准 |
references/categories-mapping.md |
本 Skill 文档层 | 本 Skill 维护 | 桥接 config-cookie-accounting.ts(9 L1)→ categories.md(10 L1);仅做语义映射,不修改任何一方的字段 |
若未来澄清
config-cookie-accounting.ts为废弃:需独立 spec 处理;本 Skill 当前仅做桥接文档(references/categories-mapping.md),不删不改config-cookie-accounting.ts。
错误处理
| 场景 | 处理方式 |
|---|---|
| 图片模糊/看不清金额 | 描述看到的内容,请用户确认 |
| 图片非账单 | 告知用户并询问是否手动输入 |
| 未指定分类 | 根据内容推断,告知用户可纠正 |
| 金额不明确 | 请用户确认,不自动猜测 |
04 同仓库更多 Skills
贴心助理
真实助手 - 主动分析用户状态,关心用户,提供帮助与提醒。不偷懒地联动所有技能,真正像个朋友一样陪伴。
美团
安装美团旅游技能(meituan-travel)向导 - 检查 mtskills 商店并安装 meituan-travel
网易云音乐
安装网易云音乐 CLI 工具(@music163/ncm-cli) - 通过 npm 全局安装
私家大厨
暂无简介
目录树
目录树技能 - 递归扫描给定目录,输出所有目录和文件的树状结构清单
百科采集
全网百科知识采集技能。 用户提及采集百科、指定领域、搜索百科、深度搜索、备用搜索、切换引擎、 生成百科、精简百科、扩展知识、百科评语、批量采集、迭代采集时触发。 支持22个预设领域的百科知识采集,Tavily/MiniMax双引擎搜索。