[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71JPWVNC5JZ2FD4CSR3SZC1":3,"skill-same:01M71JPWVNC5JZ2FD4CSR3SZC1":701},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":32,"linkOnly":33,"markdownContent":34,"markdownBody":35,"frontMatter":36,"refName":37,"commitSha":38,"skillDirectory":5,"forksCount":39,"repositoryHtmlUrl":40,"repositoryHomepageUrl":6,"ownerHtmlUrl":41,"ownerBlogUrl":6,"ownerDescription":42,"updatedAt":43,"install":44,"resources":57},"01M71JPWVNC5JZ2FD4CSR3SZC1","饼干记账",null,"记账技能。写入类:记支出、记收入、拍账单、批量录入、改记录、撤销、恢复、记报销、记退款、记借出、记借入、记收回、记偿还、记分期。查询类:查今天、查某天、查月、查区间、查分类、搜备注、查标签、查账户、查账本、查欠款、查待报销。分析类:看月度、看总览、看分类、看对比、看趋势、看大额、做统计、看洞察、看借贷。目标\u002F账户\u002F联动:设定预算、看预算、设定目标、看目标、新增账户、改账户、账户转账、看账户汇总、买东西联动、吃饭联动。**所有查询\u002F分析类唤醒词默认 invoke HTML 工作流**(scripts\u002Fbill_inject.py + templates),写入类保持文字回执。能力速查:说「饼干记账 HELP」\u002F「查帮助」\u002F「能做什么」。完整 70 个唤醒词见 references\u002F路由表.md","FeatherHunter\u002FSKILLS","FeatherHunter","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F12967785?v=4","01M71JFD7JMNT8HWC3Y9JKMWGG","王辰浩","01M71JFD8DNYSPJPGX25Y4KX70",6,"MIT","https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002FSKILL.md",[],[19,5,20,21,22,23,24,25,26,27,28,29,30,31],"记账","references","help","支出","scripts","收入","账单","预算","文字","templates","invoke","统计","html","2026-11-10 10:12:30",false,"---\nname: 饼干记账\ndescription: 记账技能。写入类:记支出、记收入、拍账单、批量录入、改记录、撤销、恢复、记报销、记退款、记借出、记借入、记收回、记偿还、记分期。查询类:查今天、查某天、查月、查区间、查分类、搜备注、查标签、查账户、查账本、查欠款、查待报销。分析类:看月度、看总览、看分类、看对比、看趋势、看大额、做统计、看洞察、看借贷。目标\u002F账户\u002F联动:设定预算、看预算、设定目标、看目标、新增账户、改账户、账户转账、看账户汇总、买东西联动、吃饭联动。**所有查询\u002F分析类唤醒词默认 invoke HTML 工作流**(scripts\u002Fbill_inject.py + templates),写入类保持文字回执。能力速查:说「饼干记账 HELP」\u002F「查帮助」\u002F「能做什么」。完整 70 个唤醒词见 references\u002F路由表.md\n---\n\n**🔗 联动提示：** 完成本技能主操作后，检查技能路由器（`图片路由\u002FSKILL.md`）的联动规则，判断是否需要联动其他技能（如用户提到买了实物→询问是否录入居家管家；用户提到食物→询问是否记录卡路里）。详见路由器的联动规则表。\n\n## 强制性规定（最高优先级）\n\n1. **`饼干记账.html` = render_help.py 命令生成的 HELP 镜像** — 生成后自动复制到技能根目录,不再手工同步;改动 HELP 相关代码\u002F模板后必须重新生成,一致性由 tests\u002Ftest_render.py 契约锁定\n2. **修改确认采用任务级授权** — 用户显式点名\u002F下发的任务(如 ready-for-agent 票 \u002F wayfinder ticket)视为对任务范围内修改的一次确认,执行中不再逐行确认;任务范围外、涉及真实数据或破坏性变更仍需先确认\n\n---\n\n## 操作规范（强制）\n\n- 所有数据操作通过 CLI（`scripts\u002Fwrite|query|analysis|account\u002Fcli.py` 四域入口），禁止直连数据库\n- 只读操作（查询\u002F分析\u002F统计）不需确认；写入操作（记支出\u002F记收入\u002F拍账单\u002F改记录）需用户确认\n- 不支持删除已有记录；修改功能见「改记录」流程\n- 金额必须明确，不能猜测\n\n---\n\n## 安装与配置\n\n### 依赖\n\n- Python 3.x（系统自带 sqlite3）\n\n### 配置项\n\n| 环境变量 | 说明 | \n|----------|------|\n| `SKILLS_DB_PATH` | 数据库目录 |\n\n### 一键安装\n\n```\n请帮我初始化饼干记账技能：\n1. 检查 Python 环境\n2. 引导我配置环境变量\n3. 显示当前环境变量配置\n4. 告诉我如何更改数据目录\n```\n\n---\n\n## 功能概述\n\n- **文字记账**：解析自然语言，提取金额、分类、备注\n- **图片记账**：看图识别账单金额，用户确认后记录\n- **查询统计**：今日\u002F指定日期\u002F日期范围\u002F分类查询\n- **分析报表**：月度汇总、周期对比、分类明细、收支总览\n\n---\n\n## 唤醒词总表\n\n> 全量 70 个唤醒词(2026-08-08 路由表定案);编号见 references\u002F路由表.md;新增在域区间内追加\n\n| 类型 | 唤醒词 | 功能 | CLI 指令 | 默认输出 |\n|------|--------|------|----------|----------|\n| 写入 | `记支出` | 记一笔支出 | `write add` | 文字回执 |\n| 写入 | `记收入` | 记一笔收入 | `write add` | 文字回执 |\n| 写入 | `拍账单` | 拍账单记账(图片识别) | `write add(图片识别)` | 文字回执 |\n| 写入 | `批量录入` | 批量录入多笔 | `write add(批量)` | 文字回执 |\n| 写入 | `记退款` | 记一笔退款(冲销原支出) | `write add + update(#已退款)` | 文字回执 |\n| 写入 | `记报销` | 记一笔报销支出(#待报销) | `write add(#待报销)` | 文字回执 |\n| 写入 | `报销到账` | 报销到账(记收入 + 流转标签) | `write add + update(标签流转)` | 文字回执 |\n| 写入 | `记借出` | 借给别人钱 | `write add(借贷账本)` | 文字回执 |\n| 写入 | `记借入` | 向别人借钱 | `write add(借贷账本)` | 文字回执 |\n| 写入 | `记收回` | 收回借出的钱 | `write add + update(#已还)` | 文字回执 |\n| 写入 | `记偿还` | 偿还借入的钱 | `write add + update(#已还)` | 文字回执 |\n| 写入 | `记分期` | 记一笔分期(平摊预写) | `write add×N(平摊预写)` | 文字回执 |\n| 写入 | `改记录` | 修改已有记录 | `write update` | 文字回执 |\n| 写入 | `撤销` | 撤销一条记录(软删) | `write update(deleted_at)` | 文字回执 |\n| 写入 | `恢复` | 恢复已撤销记录 | `write update(deleted_at=NULL)` | 文字回执 |\n| 查询 | `查今天` | 查今天收支 | `query summary` | **HTML** |\n| 查询 | `查昨天` | 查昨天收支 | `query list --date` | **HTML** |\n| 查询 | `查某天` | 查某一天的账 | `query list --date` | **HTML** |\n| 查询 | `查最近` | 查最近记录 | `query recent` | **HTML** |\n| 查询 | `查周` | 查某周的账 | `query list --from --to` | **HTML** |\n| 查询 | `查月` | 查某个月的账 | `query list --from --to` | **HTML** |\n| 查询 | `查区间` | 查任意时间段 | `query list --from --to` | **HTML** |\n| 查询 | `查分类` | 查某分类的账 | `query list --category` | **HTML** |\n| 查询 | `搜备注` | 搜索备注关键词 | `query search` | **HTML** |\n| 查询 | `查标签` | 查标签(#tag 聚合) | `query tag --tag` | **HTML** |\n| 查询 | `查账户` | 查某账户流水 | `query list --account` | **HTML** |\n| 查询 | `查账本` | 查某账本的记录 | `query list --ledger` | **HTML** |\n| 查询 | `查欠款` | 查未还欠款(借贷状态) | `query debt` | **HTML** |\n| 查询 | `查待报销` | 查待报销 | `query reimburse` | **HTML** |\n| 查询 | `查分期` | 查进行中的分期 | `query installment` | **HTML** |\n| 分析 | `看月度` | 某月收支汇总 | `analysis monthly --month` | **HTML** |\n| 分析 | `看年度` | 年度收支汇总 | `analysis yearly --year` | **HTML** |\n| 分析 | `看总览` | 时间段收支总览 | `analysis overview --from --to` | **HTML** |\n| 分析 | `看周报` | 本周简报(对比上周) | `analysis week` | **HTML** |\n| 分析 | `看分类` | 钱花在哪些分类 | `analysis category` | **HTML** |\n| 分析 | `看账户` | 各账户花销情况 | `analysis account` | **HTML** |\n| 分析 | `看账本` | 各账本收支汇总 | `analysis ledger` | **HTML** |\n| 分析 | `看结构` | 收入支出来源去向 | `analysis structure` | **HTML** |\n| 分析 | `看对比` | 本期和上期对比 | `analysis compare --period` | **HTML** |\n| 分析 | `看双区间` | 两段时间对比 | `analysis range_compare` | **HTML** |\n| 分析 | `看同比` | 今年和去年同比 | `analysis yoy --month` | **HTML** |\n| 分析 | `看分类对比` | 两段时间分类差异 | `analysis cat_compare` | **HTML** |\n| 分析 | `看趋势` | 每月收支走势 | `analysis trend --months` | **HTML** |\n| 分析 | `看分类趋势` | 某分类的月度变化 | `analysis cat_trend --category` | **HTML** |\n| 分析 | `看大额` | 大额支出排行 | `analysis top --limit` | **HTML** |\n| 分析 | `看高频` | 高频消费排行 | `analysis top_freq` | **HTML** |\n| 分析 | `看分布` | 金额区间分布 | `analysis distribution` | **HTML** |\n| 分析 | `做统计` | 记账情况统计 | `analysis stats` | **HTML** |\n| 分析 | `看活跃` | 记账活跃度 | `analysis activity` | **HTML** |\n| 分析 | `看洞察` | AI 消费洞察 | `analysis insight`(接洞察生成器) | **HTML** |\n| 分析 | `看异常` | 异常波动检测 | `analysis anomaly`(接洞察生成器) | **HTML** |\n| 分析 | `看借贷` | 借贷总览 | `analysis debt_summary`(#借贷) | **HTML** |\n| 分析 | `看报销` | 报销汇总 | `analysis reimburse_summary`(#待报销) | **HTML** |\n| 分析 | `看分期` | 分期总览 | `analysis installment_summary`(#分期) | **HTML** |\n| 分析 | `看退款` | 退款统计 | `analysis refund_summary`(#退款) | **HTML** |\n| 目标 | `设定预算` | 设定月度预算 | `goal set-budget --amount X [--month] [--category]` | **HTML 表单+回执** |\n| 目标 | `看预算` | 查看预算执行 | `goal budget [--month]` | **HTML** |\n| 目标 | `设定目标` | 设定储蓄目标 | `goal set-saving --name X --amount Y [--deadline]` | **HTML 表单+回执** |\n| 目标 | `看目标` | 查看目标进度 | `goal saving [--name]` | **HTML** |\n| 账户 | `新增账户` | 新增账户 | `account add --name X [--type Y]` | **HTML 表单+回执** |\n| 账户 | `改账户` | 修改账户 | `account update --name X [--new-name\u002F--disable\u002F--enable]` | **HTML 表单+回执** |\n| 账户 | `账户转账` | 账户间转账 | `account transfer --amount X --from A --to B` | **HTML 表单+回执** |\n| 账户 | `看账户汇总` | 查看账户汇总 | `account summary` | **HTML** |\n| 联动 | `买东西` | 买东西联动(记账 + 录物品) | `link form + receipt` | **HTML 表单+回执** |\n| 联动 | `吃饭` | 吃饭联动(记账 + 记卡路里) | `link form + receipt` | **HTML 表单+回执** |\n| 开始使用 | `初始化` | 首次使用向导(4 步零决策) | `setup init` | **HTML** |\n| 开始使用 | `初始化状态` | 初始化状态(是否已就绪) | `setup init-status` | **HTML** |\n| 开始使用 | `备份` | 一键备份 \u002F 查看备份 | `setup backup-create \u002F backup-list` | **HTML** |\n| 开始使用 | `恢复备份` | 从备份恢复 | `setup restore --name X` | **HTML** |\n| 开始使用 | `导入` | 导入 CSV 账单(列映射向导) | `setup import --file X` | **HTML** |\n| HELP | `查帮助` | 能力速查 HELP | `render_help.py` | **HTML** |\n| HELP | `能做什么` | 能力速查 HELP | `render_help.py` | **HTML** |\n\n## 📌 输出位置（§04 原则 12.A \u002F 12.B）\n\n> **本 Skill 走 §04 原则 12.A \u002F 12.B**，HTML 路径名规则固化如下，不可随意改动：\n\n| 类型 | §12 分类 | 文件名规范 | 触发命令 |\n|------|----------|------------|----------|\n| **数据 \u002F 过程 HTML**（12.A）| §12.A | `$DATA_DIR\u002Fbiscuit_accountant_html\u002F\u003Ccommand_zh>_\u003CYYYYMMDD>_\u003CHHMMSS>[_N].html` | `bill_inject.py \u003Cquery_type> [args]` |\n| **HELP HTML**（12.B）| §12.B | `$DATA_DIR\u002Fbiscuit_accountant_html\u002F饼干记账_HELP_\u003CYYYYMMDD>_\u003CHHMMSS>[_N].html` | `render_help.py` |\n\n- `\u003Ccommand_zh>` 由 `scripts\u002Fhtml_paths.resolve_command_name()` 解析（如 `今日摘要` \u002F `月度汇总` \u002F `收支总览`）\n- 同秒冲突自动追加 `_2` \u002F `_3` 后缀\n- `$DATA_DIR` 跟随 `SKILLS_DB_PATH` 环境变量（fallback `D:\u002F.db\u002F`）\n- HELP 路径名固定以 `饼干记账_HELP_` 前缀（grep 一抓就出，便于检索历史 HELP 页）\n\n---\n\n## 路由规则（用户表达 → 唤醒词 → CLI）\n\n> G5 Q3 决议落地（#249）· 相对时间换算细则的唯一承载章节；Step 2 括号引用收敛于此。\n\n**触发识别总则（G5 决议 · 变体方向制）：** 触发识别职责 = frontmatter description 触发词矩阵（按域分组）+ AI 自然语言理解（同义 \u002F 口语 \u002F 模糊 3 方向），不再硬编码别名映射表；唤醒词 = AI 路由入口（简短），场景名 = HELP 阅读（「做什么 +（怎么处理）」）。相对时间表达由 AI 按本表语义换算为具体日期后传入 CLI 参数（CLI 始终接收具体日期）。\n\n**可执行参考实现：** `scripts\u002Frouting.py`（3 函数 + today 注入，纯库不进运行时）+ `tests\u002Ftest_routing.py`（40 用例，覆盖跨月\u002F跨年\u002F闰年\u002F12 月\u002F跨年+1）。**修改本表规则必须同步 routing.py，反之亦然。**\n\n### 相对时间映射表\n\n| 表达 | 换算规则 | CLI 参数示例 |\n|------|----------|--------------|\n| 今天 | 当天 | `--date 今天` |\n| 昨天 | 前一天（跨月\u002F跨年自动进位） | `--date 昨天` |\n| 前天 | 前两天 | `--date 前天` |\n| N 天前 | 当天 − N 天 | `--date 3天前` |\n| 本周五 \u002F 上周五 \u002F 上上周五 | 所在周偏移 + 周几（本周=0 \u002F 上周=−1 \u002F 上上周=−2，周一=1…周日=7） | `--date 上周五` |\n| 本周 | **周一 ~ 周日**（含今天所在周） | `--from 本周一 --to 今天` |\n| 上周 | 上周一 ~ 上周日 | `--from 上周一 --to 上周日` |\n| 本月 | 本月 1 日 ~ 月末 | `--month 本月` |\n| 上月 | 上月 1 日 ~ 月末（1 月 → 去年 12 月） | `--month 上月` |\n| 最近 N 天 | 今天 − (N−1) ~ 今天（含今天） | `--days N` |\n\n**关键语义声明：**\n- 「本周」= 周一 ~ 周日（ISO 语义），自持不共享\n- 跨月\u002F跨年\u002F闰年\u002F12 月\u002F跨年+1 等边界由 `tests\u002Ftest_routing.py` 锁死（如「昨天」= 1 月 1 日 → 去年 12 月 31 日；「上月」= 2024-03 → 2024-02-01 ~ 02-29）\n\n## 使用流程\n\n### Step 1：判断输入类型\n\n| 输入类型 | 处理方式 |\n|----------|----------|\n| 纯文字 | 直接匹配唤醒词，解析金额、分类、备注 |\n| 纯图片（无文字） | 进入「拍账单」流程，识别图片内容，展示结果，用户确认后记账 |\n| 图片+文字 | 看图判断金额，用户文字作为备注或分类提示 |\n\n### Step 2：匹配唤醒词\n\n用户输入 → 匹配唤醒词（全量 70 个 · 编号与命令见 §唤醒词总表 \u002F `references\u002F路由表.md`）→ 进入对应功能流程。\n\n**路由识别（G5 决议 · 变体方向制）：** 触发识别职责 = frontmatter description 触发词矩阵（按域分组）+ AI 自然语言理解（同义 \u002F 口语 \u002F 模糊 3 方向），不再硬编码别名映射表；唤醒词 = AI 路由入口（简短），场景名 = HELP 阅读（「做什么 +（怎么处理）」）。相对时间表达（今天 \u002F 昨天 \u002F 上周五 \u002F 最近 N 天等）的换算细则见 §路由规则。\n\n\n### Step 3：解析参数\n\n#### 记支出\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"午饭35\" | 分类=餐饮\u002F外卖\u002F午餐, 金额=-35 |\n| \"奶茶25\" | 分类=餐饮\u002F咖啡奶茶\u002F奶茶, 金额=-25 |\n| \"打车20用支付宝\" | 分类=出行\u002F网约车, 金额=-20, 账户=支付宝 |\n| \"洗发水80\" | 分类=居家\u002F日用品(默认,如上下文有\"理发\u002F发廊\"则→穿着\u002F洗护), 金额=-80 |\n| \"昨天买书58\" | 分类=玩乐\u002F影音游戏\u002F书籍影视(默认,如上下文有\"教材\u002F考试\u002F备考\"则→学习\u002F书籍), 金额=-58, 时间=昨天 |\n| \"记账到旅行账本\" | 账本=旅行 |\n\n**文字解析关键词：**\n- \"花了 \u002F 付了 \u002F 消费 \u002F 支出 \u002F 买了\" → 负数金额\n- 未指定时间 → 默认当前时间\n- 未指定分类 → 根据内容推断，告知用户可纠正\n- 分类参考 `references\u002Fcategories.md`(L1\u002FL2\u002FL3 三级 + 歧义词智能判断)\n\n#### 记收入\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"工资8000\" | 分类=工资\u002F基本工资, 金额=+8000 |\n| \"绩效3000\" | 分类=工资\u002F绩效, 金额=+3000 |\n| \"项目奖金5000\" | 分类=奖金\u002F项目奖金, 金额=+5000 |\n| \"副业赚了2000\" | 分类=兼职\u002F副业, 金额=+2000 |\n| \"基金分红300\" | 分类=投资\u002F分红, 金额=+300 |\n| \"红包100\" | 分类=其他收入\u002F红包, 金额=+100 |\n\n**文字解析关键词：**\n- \"收到 \u002F 收入 \u002F 进账 \u002F 工资 \u002F 赚了\" → 正数金额\n\n#### 拍账单\n\n| 用户输入 | 处理方式 |\n|----------|----------|\n| 发截图\u002F账单图片 | 识别金额，展示结果，用户确认后记录 |\n| 发模糊图片 | 描述看到的内容，请用户确认金额 |\n| 发非账单图片 | 告知非账单，询问是否手动输入 |\n\n**图片识别规则：**\n1. 优先取「实付 \u002F 实收 \u002F 已支付 \u002F 需付」金额\n2. 其次取「合计 \u002F 总计 \u002F 总额 \u002F 应付」金额\n3. 忽略：单品价格、优惠减免、配送费、税额、找零\n4. 无法判断时，描述看到的内容并请用户确认\n\n**确认页生成硬约束（2026-08-13 · #298 缓解 · 违者视为 bug）：**\n1. **确认页只能由脚本生成**：调用 `scripts\u002Frender_write.py photo`（参数：`--images` 图片数 \u002F `--photo-note` 识别说明 \u002F `--amount` \u002F `--category` \u002F `--account` \u002F `--ledger` \u002F `--note` \u002F `--account-source` \u002F `--category-source` \u002F `--ledger-source` \u002F `--out`）产出采集表单 HTML。**禁止 AI 手写\u002F拼装确认页 HTML**——AI 的职责是解析账单并把识别结果当参数传给脚本，不是产 HTML。\n2. **账户必须推断并传参**：识别出商家\u002F平台（如「美团外卖」→ 推断账户「美团」）时，AI 推断最可能的**已有**账户 → `--account 美团 --account-source inferred`（表单标「AI 推断」）；推断出该账户不存在、建议新建（如「美团月付」）→ `--account 美团月付 --account-source recommended_new`（表单标「AI 推荐·新建」）；推断不出、或不确定该账户是否已存在 → 不传（表单留空待用户填），**不得编造**。账户预置只是省填写，用户可改可清空。\n3. **来源语义**：`--\u003Cfield>-source` 取值 `inferred`（AI 推断已有项）\u002F `recommended_new`（AI 推荐新建）\u002F `existing` \u002F `history` \u002F `custom`；只传字段值不传来源 → 脚本按「值在候选内=已有(existing)、否则=推荐新建」处理；分类只给 `--category-hint` 时按建议走（命中已有=推断、全新=推荐新建）。\n\n#### 改记录\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"把那条午饭改成 38\" | id=查最近匹配项, amount=-38 |\n| \"改备注加牛奶\" | id=用户指定或查最近匹配, note=\"原备注+牛奶\" |\n| \"ID=123 改成分类=交通\" | id=123, category=交通 |\n| \"把刚记的那笔改一下\" | id=查最近第 1 条,字段待用户告知 |\n\n**改记录流程(AI 层负责 diff + 确认):**\n1. 通过 `查最近` \u002F `查某天` \u002F `搜备注` 定位目标记录的 ID(必要时把候选展示给用户挑)\n2. 用户告知要改哪些字段、改成什么 → AI 计算 原值 → 新值 的 diff\n3. **展示 diff 给用户,等待\"确认\"**(未确认前不调 update CLI)\n4. 用户回复「确认」→ AI 调 `update --id \u003CID> [...新字段]`\n5. CLI 返回结果 → AI 反馈「已修改」\n\n**确认模板:**\n```\n📝 待修改(ID=123):\n  分类:    餐饮     →  餐饮(未改)\n  金额:    -35.00   →  -38.00\n  备注:    午饭     →  午饭+牛奶\n确认改?(回复「确认」或「取消」)\n```\n\n#### 查今天\n\n无参数。返回今日 count \u002F expense \u002F income \u002F net + 分类聚合 + 明细。\n\n> **查询域通用规则**：全部查询 = 仅结果型 HTML（缺参 → AI 文字反问，不猜不补）；结果 HTML 默认动作区「复制数据 \u002F 复制日志」；无数据 → 空态提示。\n\n#### 查昨天 \u002F 查某天\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"查昨天\" | --date = 昨天日期 |\n| \"5月1号的账\" | --date = 2026-05-01 |\n| \"上周五花了多少\" | --date = 计算后的日期 |\n\n#### 查周 \u002F 查月 \u002F 查区间\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"这周的账\" | --from 本周一 --to 今天 |\n| \"上周消费\" | --from 上周一 --to 上周日 |\n| \"5月1到10号\" | --from 2026-05-01 --to 2026-05-10 |\n\n#### 查分类\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"餐饮类的记录\" | --category 餐饮 |\n| \"交通花了多少\" | --category 交通 |\n| \"支付宝里餐饮花了多少\" | --category 餐饮 --account 支付宝 --type expense |\n| \"旅行账本这个月的\" | --category + --ledger 旅行 + --from\u002F--to |\n\n注意：分类支持 L1 前缀匹配（传「餐饮」命中 餐饮\u002F外卖\u002F午餐 等全部子分类）；可组合 时间\u002F账户\u002F账本\u002F收支方向。返回 KPI(支出\u002F收入\u002F净额)+ 分类聚合 + 逐条记录。如需分类汇总统计，使用「看分类」。\n\n#### 查最近\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"最近5条\" | --limit 5 |\n| \"最近的记录\" | --limit 10（默认） |\n| \"近7天的记录\" | --days 7 |\n| \"最近按金额从大到小\" | --limit 10 --sort amount_desc |\n\n返回：KPI(笔数\u002F支出\u002F收入\u002F净额)+ 明细（默认时间倒序，可金额排序）。\n\n#### 搜备注\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"搜午饭\" | keyword = 午饭 |\n| \"有没有咖啡的记录\" | keyword = 咖啡 |\n\n#### 查标签\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"查 #旅行 的记录\" | --tag 旅行 |\n| \"带 #待报销 的\" | --tag 待报销 |\n\n返回：#tag 聚合卡(笔数\u002F支出\u002F收入)+ 命中明细。精确匹配（#旅行 不误伤 #旅行计划）。\n\n#### 查账户\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"支付宝的流水\" | --account 支付宝 |\n| \"招行这个月的\" | --account 招行 --from\u002F--to |\n\n返回：该账户 KPI(支出\u002F收入\u002F净额)+ 明细。\n\n#### 查账本\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"旅行账本的记录\" | --ledger 旅行 |\n| \"借贷账本\" | --ledger 借贷 |\n\n返回：该账本 KPI(支出\u002F收入\u002F净额)+ 明细。\n\n#### 查欠款\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"查欠款\" | debt |\n| \"小明还欠多少\" | debt --target 小明 |\n\n聚合 `#未还` 记录：借出未还总额 + 借入未还总额 + 未还列表(对象\u002F方向\u002F金额\u002F时间)。对象从备注 `#借给{X}` \u002F `#向{X}借` 提取。\n\n#### 查待报销\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"查待报销\" | reimburse |\n\n聚合 `#待报销` 记录：总额 + 列表(金额\u002F分类\u002F日期)。\n\n#### 查分期\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"查分期\" | installment |\n| \"手机的期数\" | installment --name 手机 |\n\n按备注 `#分期 {名目} 第X期\u002FN` 分组：分期卡(名目\u002F总额\u002F每期\u002F期数\u002F已还期数\u002F剩余期数+金额)+ 记录明细。已还期数按「日期 ≤ 今天」推断（分期写入即固定）。\n\n#### 看月度\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"本月汇总\" | --month = 当前月（YYYY-MM） |\n| \"3月份的账\" | --month = 2026-03 |\n\n返回：支出\u002F收入\u002F净额\u002F笔数 + 分类排行。\n\n#### 看年度\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"今年汇总\" | --year = 当前年 |\n| \"2025年总结\" | --year = 2025 |\n\n返回：全年 KPI(支出\u002F收入\u002F净额\u002F笔数) + 逐月趋势表 + 大额分类 TOP。\n\n#### 看周报\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"本周简报\" | week（默认本周） |\n| \"上周周报\" | week --offset 1 |\n\n返回：本周 KPI + 本周 vs 上周双卡(支出变化率) + 本周大额支出。\n\n#### 看总览\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"本月收支\" | --month = 当前月（默认） |\n| \"3月收支情况\" | --month = 2026-03 |\n| \"5月1到10号的收支\" | --from 2026-05-01 --to 2026-05-10 |\n\n返回：笔数\u002F支出\u002F收入\u002F净额 + 日均支出 + 区间标注。\n\n#### 看分类\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"各类支出占比\" | 无参数，默认本月 |\n| \"5月的分类明细\" | --from 2026-05-01 --to 2026-05-31 |\n| \"支付宝花了什么\" | --account 支付宝 |\n| \"收入占比\" | --type income |\n\n返回：SVG 环形图 + 排行(总额\u002F占比\u002F笔数\u002F均值)；分类 L1 聚合(餐饮\u002F外卖 → 餐饮)。\n\n#### 看账户\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"各账户花销\" | 默认本月 |\n| \"上个月的账户情况\" | --month 上个月 |\n\n返回：账户占比条 + 各账户汇总(支出\u002F收入\u002F净额)。\n\n#### 看账本\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"各账本收支\" | 默认本月 |\n\n返回：各账本汇总卡(生活\u002F旅行\u002F借贷:支出\u002F收入\u002F净额) + 占比。\n\n#### 看结构\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"收入和支出的结构\" | 默认本月 |\n\n返回：双环形图(收入来源结构 + 支出去向结构)。\n\n#### 看对比\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"这周和上周比\" | --period week |\n| \"本月和上月比\" | --period month |\n\n返回：本期\u002F上期的支出\u002F收入\u002F净额 + 变化率徽章(↑↓→)。\n\n#### 看双区间\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"5月和4月比\" | --from1 2026-05-01 --to1 2026-05-31 --from2 2026-04-01 --to2 2026-04-30 |\n| \"五一和端午比\" | 两段区间参数 |\n\n返回：双卡并排(区间一\u002F区间二) + 变化率 + 分类差异提示 TOP。\n\n#### 看同比\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"今年3月和去年比\" | --month 2026-03（默认本月） |\n\n返回：今年 vs 去年同月双卡 + 变化率。\n\n#### 看分类对比\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"5月和4月的分类差异\" | --from1\u002F--to1\u002F--from2\u002F--to2 两段区间 |\n\n返回：分类差异 TOP(金额变化最大\u002F笔数变化最大) 对比条形。\n\n#### 看趋势\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"近6个月走势\" | --months 6 |\n| \"近一年的趋势\" | --months 12（默认） |\n\n返回：SVG 双线折线(支出\u002F收入逐月) + 峰值标注 + 月均。\n\n#### 看分类趋势\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"餐饮的月度变化\" | --category 餐饮 --months 12（默认） |\n| \"出行近半年\" | --category 出行 --months 6 |\n\n返回：柱状\u002F折线(该分类逐月支出) + 月均 + 峰值月；分类 L1 前缀匹配。\n\n#### 看大额\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"大额支出TOP10\" | --limit 10（默认） |\n| \"5月花得最大的一笔\" | --from 2026-05-01 --to 2026-05-31 --limit 5 |\n\n返回：支出 TOP N 排行(金额\u002F分类\u002F日期\u002F备注)。\n\n#### 看高频\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"什么花得最频繁\" | 默认本月 |\n| \"近30天高频\" | --from\u002F--to + --limit 10（默认） |\n\n返回：分类笔数 TOP(笔数\u002F总金额\u002F单均\u002F最近一笔时间)。\n\n#### 看分布\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"金额区间分布\" | 默认本月支出 |\n| \"收入分布\" | --type income |\n\n返回：SVG 直方图(区间:\u003C10 \u002F 10-50 \u002F 50-100 \u002F 100-500 \u002F 500+) + 各区间笔数\u002F占比。\n\n#### 做统计\n\n无参数。返回总笔数、记账天数、日均笔数、首笔时间、最近记录时间 + 月度分布。\n\n#### 看活跃\n\n无参数。返回周几分布柱状(哪天记最多) + 时段分布(几点记)。\n\n#### 看洞察\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"AI 消费洞察\" | --months 6（默认） |\n| \"近90天的洞察\" | --months 3 |\n\n**流程**：AI 调 `analysis insight --months N --json` 拿**事实层**（period\u002Fcategory_dist\u002Fmonthly_trend\u002Ftop_expense + 均值\u002F中位数\u002F最大偏离度，纯计算无判定）→ AI 基于事实撰写解读（消费习惯\u002F异常波动\u002F省钱建议）→ `bill_inject.py insight --months N --ai-note \"消费习惯:…|异常波动:…|省钱建议:…\"` 生成洞察卡 HTML（解读卡 + 事实卡）交付。**AI 解读规则**：只引用事实层数字；不说事实层没有的话；建议可落地(如\"奶茶类支出占 18%，可减少频次\")；三段式用 `|` 分隔。\n\n#### 看异常\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"异常波动检测\" | --months 6（默认） |\n\n**流程**：AI 调 `analysis anomaly --months N --json` 拿**事实层**（月度序列 + 环比变化 + 分类环比暴涨）→ AI 判定异常（突增月\u002F暴涨分类，幅度≥50% 值得说）→ `bill_inject.py anomaly --months N --ai-note \"异常波动:…|建议核对:…\"` 生成检测 HTML（解读卡 + 事实卡）交付。**AI 判定规则**：幅度 \u003C 50% 不判异常；判异常必须附\"建议核对\"(一次性大额\u002F记错分类\u002F真实增长)。\n\n#### 看借贷\n\n无参数。返回借出未还总额 + 借入未还总额 + 对象列表 + 已还\u002F未还统计；聚合 `#借出\u002F#借入\u002F#未还\u002F#已还`。\n\n#### 看报销\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"报销汇总\" | 无参数 |\n\n返回待报销总额 + 已到账总额 + 历史报销列表；聚合 `#待报销\u002F#报销到账`。\n\n#### 看分期\n\n无参数。返回进行中分期卡(名目\u002F总额\u002F每期\u002F期数\u002F已还\u002F剩余期数+金额) + 历史分期；聚合 `#分期`。\n\n#### 看退款\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"退款统计\" | 无参数 |\n\n返回退款总额\u002F次数 + 月份分布 + 退款明细；聚合 `#退款`。\n\n### 开始使用流程细则（6 场景 · 2026-08-09 落地）\n\n初始化\u002F备份\u002F导入统一遵守（载体契约 G6\u002FG2\u002FG1）：\n\n- **初始化**：`setup init --check`（只读环境检测，向导步骤 1-2）→ 用户确认 → `setup init`（建库幂等自愈 + 只读验证）；重复执行安全。`setup init-status` 三重判定（数据存在 + schema 完整 + 版本 v2.0 特征列 deleted_at）；schema 过期 → 显式迁移提示（不自动迁移）。\n- **备份**：`setup backup-create`（db + goals.json → 备份目录 `\u003C时间戳>\u002F`）；`setup backup-list` 查看；`setup restore --name X` 恢复（**默认最新备份**，恢复前自动备份现状防覆盖丢失）。备份\u002F恢复包装公共层 `scripts\u002Fbackup.py`（T0 第 9 项）。\n- **导入**：G1 最小方案 = 通用 CSV + 列映射（**不逐软件适配**）。`setup import --file X [--mapping date=1,amount=3,category=2]` 自动猜测映射（表头关键词 日期\u002F金额\u002F分类\u002F备注\u002F账户\u002F账本\u002F收支方向），可显式覆盖；时间自动归一化（纯日期补 00:00:00）；收支方向列含\"收\"→正\u002F\"支\"→负，缺省按金额符号；逐行校验（分类白名单\u002F金额非零\u002F时间格式），失败行收集不中断；**外部导入缺省未删**（deleted_at=NULL · 软删契约）；缺文件路径 → AI 反问（不猜测）。\n- **向导 HTML 流程**：初始化\u002F恢复\u002F导入 = 向导型（HTML 预览确认 → AI 执行 CLI → 回执）；备份 = 回执型 HTML；状态 = 结果型 HTML。全部走 `scripts\u002Fsetup\u002Frender.py \u003Cmode>`，输出路径与 §12.A 一致。\n\n#### 初始化\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"帮我初始化\u002F开始使用\" | `setup init --check`（渲染向导）→ 确认 → `setup init` |\n| \"初始化了没\u002F能用吗\" | `setup init-status` → 状态 HTML（未就绪引导初始化） |\n\n流程：AI 调 `setup\u002Frender.py init-wizard`（4 步零决策向导：环境检测 → 数据目录确认 → 建库 → 只读验证；含「记第一笔」引导按钮）→ 用户确认（复制 prompt）→ AI 执行 `setup init` → 完成页。\n\n#### 备份 \u002F 恢复备份\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"备份一下\" | `setup backup-create` → 回执 HTML |\n| \"有哪些备份\" | `setup backup-list` → 列表 HTML（空态引导一键备份） |\n| \"从备份恢复\" \u002F \"恢复XX备份\" | `setup restore --name X`（默认最新）→ 向导确认 → 恢复回执 |\n\n#### 导入\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"导入 CSV 账单\" | 缺文件路径 → AI 反问；有路径 → `setup\u002Frender.py import --file X` 渲染列映射向导 |\n\n流程：HTML 列映射向导（前几行预览 + 自动猜测映射可改）→ 用户确认（复制 prompt 含文件路径 + 映射）→ AI 执行 `setup import --file X --mapping ...` → 文字回执（成功\u002F失败行数）。\n\n**HTML 渲染入口（开始使用域专用，不走 bill_inject）：**\n\n```bash\n# 向导型(4 步零决策 \u002F 恢复预览 \u002F 列映射)\npython3 scripts\u002Fsetup\u002Frender.py init-wizard\npython3 scripts\u002Fsetup\u002Frender.py restore [--name X]\npython3 scripts\u002Fsetup\u002Frender.py import --file x.csv\n# 结果型 \u002F 回执型\npython3 scripts\u002Fsetup\u002Frender.py init-status\npython3 scripts\u002Fsetup\u002Frender.py backup-create\npython3 scripts\u002Fsetup\u002Frender.py backup-list\n```\n\n### 账户流程细则（4 场景 · 2026-08-09 落地）\n\n账户 = `bills.account` 字段（无独立账户表）；账户清单 = `goals.json` 顶层 `accounts` 键（账户表，与目标域 `budgets\u002Fsavings` 键隔离）；余额 = 收支累计推算（该账户收入 − 支出）。\n\n**载体契约：**\n- 新增\u002F改名\u002F停用\u002F启用 → 写 `goals.json`（原子写，保留其他键）\n- 改名 → 同步更新 `bills.account`（历史流水保留，跟随新名）\n- 停用 → `disabled=true`，汇总灰显 + 不含于合计；历史记录保留\n- 转账 → **两笔记录**（会计两笔分录）：`转账\u002F转出` 支出(源账户) + `转账\u002F转入` 收入(目标账户)，账本=`转账`，备注=`#转账 转出至X \u002F 转入自X`；**不影响收支统计**（账户汇总收支 KPI 按「转账」分类排除，余额计算含转账使两账户正确增减）；其他域查询中与借贷先例一致如实展示\n\n#### 新增账户\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"新增账户 招行卡\" | --name 招行卡 |\n| \"加个花呗账户,信用类型\" | --name 花呗 --type 信用 |\n\n流程：采集表单（账户名 + 类型，已有账户可点选快速填写）→ 确认 → `account add` → 文字回执；重名 → 提示确认。\n\n#### 改账户\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"把招行卡改成招行工资卡\" | --name 招行卡 --new-name 招行工资卡 |\n| \"停用花呗\" | --name 花呗 --disable |\n\n流程：diff 确认表单（原账户卡 + 待修改表）→ 确认 → `account update` → 文字回执；账户不在账户表 → AI 反问（不猜测）。\n\n#### 账户转账\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"从支付宝转 500 到招行卡\" | --amount 500 --from 支付宝 --to 招行卡 |\n\n流程：采集表单（金额\u002F从账户\u002F到账户\u002F时间，账户建议点选）→ 确认 → `account transfer` → 文字回执两笔（转出支出 + 转入收入）；同账户\u002F负数 → AI 反问。\n\n#### 看账户汇总\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"看账户汇总\" \u002F \"账户余额\" | account summary |\n\n结果型 HTML：总余额\u002F总收入\u002F总支出\u002F净额\u002F转账 KPI + 各账户余额卡（收支\u002F转入转出\u002F笔数\u002F最近一笔；停用灰显 + 未登记标记）+ 最近流水摘要；空账户表 → 空态引导。\n\n**HTML 渲染入口（账户域专用，不走 bill_inject）：**\n\n```bash\n# 采集\u002F选择(过程型表单)\npython3 scripts\u002Faccount\u002Frender.py add-form --name 微信 --type 支付\npython3 scripts\u002Faccount\u002Frender.py transfer-form --amount 200 --from 支付宝 --to 招行卡\npython3 scripts\u002Faccount\u002Frender.py update-form --name 招行卡 --new-name 招行工资卡\npython3 scripts\u002Faccount\u002Frender.py update-form --name 花呗 --disable\n# 查看(结果型)\npython3 scripts\u002Faccount\u002Frender.py view\n```\n\n### 目标域流程细则（4 场景 · 2026-08-09 落地 · 载体 goals.json）\n\n目标域 4 场景统一遵守：\n\n- **载体**：`goals.json`（与 db 同级，跟随 `SKILLS_DB_PATH`，备份机制已包含）。结构 = `{\"budgets\": [...], \"savings\": [...]}`，全部由 CLI 读写，AI 不手改。\n- **实际数据 = bills 聚合**：预算执行 = 当月支出 vs 预算；目标进度 = 目标期内收入-支出累计（目标期 = 创建当月起 ~ 截止日\u002F今天）。\n- **渲染**：全部走 `scripts\u002Fgoal\u002Frender.py \u003Cmode>`（采集表单 ×2 + 进度条视图 ×2），结果视图带「复制数据 \u002F 复制日志」（B1 toast）。\n\n#### 设定预算\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"设个3000的月预算\" | `set-budget --amount 3000`（默认本月） |\n| \"8月餐饮预算500\" | `set-budget --amount 500 --month 2026-08 --category 餐饮` |\n| \"预算提到4000\" | 先 `budget` 查现有 → 冲突提示 → 用户确认后加 `--force` |\n\n**覆盖语义（数据契约）**：同月同类预算已存在 → CLI 返回 `conflict` + 原值（不覆盖）；AI 展示「已存在 X 元预算，确认覆盖为 Y？」→ 用户确认 → 加 `--force` 重跑。采集表单在渲染时自动查冲突并在表单顶部展示警示条。\n\n#### 看预算\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"预算花到哪了\" | `budget`（默认本月） |\n| \"8月的预算执行\" | `budget --month 2026-08` |\n\n返回：结果型 HTML（进度条：预算 vs 实际 \u002F 剩余 \u002F 超支提示）。每预算进度条含状态机：≤90% 预算内（绿）\u002F 90%~100% 接近上限（橙）\u002F >100% 已超支（红，警示色）。KPI 汇总口径：总预算存在 → （总预算金额，当月全部支出）；否则 → 分类预算之和 vs 分类实际之和（避免重复计数）。**月底预测（2026-08-09 门禁 B 复查采纳）**：当月预算显示「日均 X 元 · 按此节奏月底预计 Y 元（预计超\u002F省提示）」（日均 = 实际 ÷ 已过天数；过去月预测 = 实际；未来月无预测）；超支项 KPI 无超支时显示绿色「✓ 无」。\n\n#### 设定目标\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"存个换手机的目标10000\" | `set-saving --name 换手机 --amount 10000` |\n| \"年底前存到1万\" | `set-saving --name X --amount 10000 --deadline 2026-12-31` |\n\n#### 看目标\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"目标存到多少了\" | `saving` |\n| \"看换手机那个目标\" | `saving --name 换手机` |\n\n返回：结果型 HTML（各目标进度：已存 \u002F 目标 \u002F 百分比 \u002F 剩余 \u002F 预计达成日）。预计达成日 = 按月均净存（已存 ÷ 目标期月数）推算；月均 ≤ 0 → 暂无预计；已达 → 标记 🎉；预计日晚于截止日 → 进度落后（红）。**达标所需月存（2026-08-09 门禁 B 复查采纳）**：带截止日且未达成的目标显示「截止前达标还需每月 X 元」（剩余 ÷ 剩余月数，本月内到期按 1 个月计）。\n\n### 写入流程细则（内置能力 + 特殊场景 · 2026-08-08 定稿）\n\n所有写入类场景（记支出\u002F记收入\u002F拍账单\u002F批量录入\u002F记退款\u002F记借出\u002F记借入\u002F记收回\u002F记偿还\u002F记分期）统一遵守：\n\n#### 0. 过程型 HTML 硬约束（2026-08-13 · #298 缓解）\n\n所有写入类确认页\u002F采集表单**只能由对应渲染脚本产出**（`render_write.py` \u002F `link\u002Fcli.py` 等），**禁止 AI 手写 HTML**。AI 的职责 = 解析用户意图 + 把字段当参数传给脚本。字段推断（账户\u002F分类\u002F账本）传得出就传、传不出就不传，**不得编造**；推断已有项配 `--\u003Cfield>-source inferred`、推荐新建配 `--\u003Cfield>-source recommended_new`（缺省只传值 → 值在候选内=已有、否则=推荐新建）；预置值用户可改可清空（详见各场景小节，拍账单见上文「确认页生成硬约束」）。\n\n#### 1. 分类选择器（过程型 HTML 必用）\n\n信息不全面时，AI 生成过程型 HTML（采集表单）让用户补全：\n- **AI 智能推荐**：根据用户话语义 + 现有分类库（references\u002Fcategories.md）推荐：\n  - 已有分类 → 标记「AI 推荐的已有分类」\n  - 库里没有 → 标记「推荐新建分类」\n- **手动选择**：下拉列出全部现有分类（L1\u002FL2\u002FL3 层级）\n- **新建分类**：按钮 → 输入新分类名 → **校验相似**（已有「餐饮\u002F外卖」时提示「是否使用已有的?」→ 拦一字之差）\n- 原则：分类规范是数据质量核心，宁可让用户选，不让 AI 自造\n\n#### 2. 智能预填（记支出\u002F记收入）\n\n用户话里有明确名目（如「交房租」）时：\n- AI 检索历史同类记录（同分类 或 备注关键词匹配）\n- 有 → 过程型 HTML 预填上次值（金额\u002F分类\u002F账户\u002F账本\u002F备注），标注「⚡ 根据 X 月 X 日的房租记录预填,可直接确认或修改」\n- 无历史 → 正常空表单（不猜、不预填）\n- **预填只是省填写**：不自动确认，用户可改可忽略\n\n#### 3. 重复检测提示（写入时）\n\n写入前 AI 检索近期相似记录（同分类 + 同金额 + 时间接近）：\n- 疑似重复 → 提示「这笔和 X 月 X 日的 35 元午饭很像,确认要再记一笔吗?」\n- 用户确认 → 继续写入；否认 → 正常写入\n\n#### 4. tag 约定（备注 #tag）\n\n| tag | 含义 | 使用场景 |\n|---|---|---|\n| #待报销 | 垫付待报销 | 记报销 |\n| #报销到账 | 报销已回款 | 报销到账 |\n| #退款 | 收到的退款 | 记退款 |\n| #已退款 | 原支出已冲销 | 记退款（标记原支出） |\n| #借出 \u002F #借入 | 借贷方向 | 记借出 \u002F 记借入 |\n| #未还 \u002F #已还 | 借贷状态机 | 借出\u002F借入（#未还）→ 收回\u002F偿还（#已还） |\n| #收回 \u002F #偿还 | 借贷回款 | 记收回 \u002F 记偿还 |\n| #分期 | 分期分摊记录 | 记分期（每笔备注 名目 第X期\u002FN） |\n\n#### 5. 特殊场景 AI 流程\n\n**记退款**：① 查原支出（描述定位）② 记收入（分类=退款\u002F冲销，备注 `#退款 原支出:[ID\u002F描述]`）③ 原支出备注追加 `#已退款` ④ 回执两笔；找不到原支出 → AI 反问\n\n**记借出\u002F记借入**：记支出\u002F收入（分类=借贷\u002F借出|借入，账本=借贷，备注=`#借出 #借给{对象} #未还` \u002F `#借入 #向{对象}借 #未还`）\n\n**记收回\u002F记偿还**：① 查 `#未还` 记录定位（对象\u002F金额匹配）② 记反向（收回=收入 \u002F 偿还=支出，分类=借贷\u002F收回|偿还，账本=借贷，备注=`#收回 原记录ID`）③ 原记录备注 `#未还`→`#已还` ④ 回执两笔\n\n**记分期**：每期=总价÷期数（除不尽首期补差额）→ 写 N 笔支出（分类=分期\u002F{名目}，金额=每期，时间=首期日起每月同日，备注=`#分期 {名目} 第X期\u002FN`）→ 向导确认（分摊预览）→ 回执总览；记录=消费分摊，写入即固定（提前还清不影响记录）\n\n### 联动流程细则（买东西联动 \u002F 吃饭联动 · 2026-08-09 落地）\n\n联动域 2 场景 = **场景簇 + 回执按钮**（G2 决议）：主操作 = 记支出（复用 write add），联动 = 回执按钮（可选）。\n\n#### 买东西联动（唤醒词：买东西）\n\n1. AI 解析 金额\u002F物品\u002F分类（选填，默认 居家\u002F家电）→ 调 `link\u002Fcli.py form purchase` 渲染采集表单（含联动预告条）\n2. 用户确认（复制 prompt）→ AI 调 `write\u002Fcli.py add` 记支出（分类\u002F金额\u002F备注，备注建议含物品名，如 `空气炸锅`）\n3. AI 调 `link\u002Fcli.py receipt purchase --id \u003CID> --item \u003C物品>` 渲染回执 HTML：\n   - 已记录账单卡（ID\u002F金额\u002F分类\u002F账户\u002F账本\u002F时间\u002F备注）\n   - 联动按钮「🔗 同时录入居家管家」→ 点击复制联动 prompt（预告式：请加载「居家管家」技能,帮我录入刚买的物品(唤醒词:录物品)：物品\u002F数量\u002F金额\u002F分类）→ 用户粘贴给 AI → AI 调居家管家「录物品」\n   - 「↩ 撤销这笔」+ 复制数据\u002F复制日志（08 硬标准）\n4. 用户只记账不联动 → 正常回执，按钮可选不用\n\n#### 吃饭联动（唤醒词：吃饭）\n\n1. AI 解析 金额\u002F吃了\u002F分类（选填，默认 餐饮）→ 调 `link\u002Fcli.py form meal` 渲染采集表单\n2. 用户确认 → AI 调 `write\u002Fcli.py add` 记支出\n3. AI 调 `link\u002Fcli.py receipt meal --id \u003CID> --ate \u003C吃了>` 渲染回执 HTML：\n   - 联动按钮「🔗 同时记卡路里」→ 点击复制联动 prompt（请加载「卡路里」技能,帮我记一餐(唤醒词:记一餐)：吃了\u002F餐别\u002F备注）→ AI 调卡路里「记一餐」\n\n**通用**：联动 prompt 只在回执按钮上（预告式，点击才复制）；缺金额 → AI 反问（不猜测）；联动 = 可选，不强制。\n\n### Step 4：执行指令\n\n```bash\n# 记支出(多级分类:L1\u002FL2\u002FL3 用 \u002F 分隔)\npython3 scripts\u002Fscripts\u002Fwrite\u002Fcli.py add --category 餐饮\u002F外卖\u002F午餐 --amount -35.0 --note \"午饭\"\npython3 scripts\u002Fscripts\u002Fwrite\u002Fcli.py add --category 餐饮\u002F咖啡奶茶\u002F奶茶 --amount -25.0\n\n# 改记录(按 ID)\npython3 scripts\u002Fscripts\u002Fwrite\u002Fcli.py update --id 123 --note \"午饭+牛奶\"\npython3 scripts\u002Fscripts\u002Fwrite\u002Fcli.py update --id 123 --amount -38.0 --category 餐饮\npython3 scripts\u002Fscripts\u002Fwrite\u002Fcli.py update --id 123 --amount -50 --account 微信 --ledger 餐饮\n\n# 记收入\npython3 scripts\u002Fscripts\u002Fwrite\u002Fcli.py add --category 工资\u002F基本工资 --amount 8000.0 --note \"5月工资\"\n\n# 查今天\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py summary\n\n# 查昨天 \u002F 查某天\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py list --date 2026-05-27\n\n# 查周 \u002F 查月 \u002F 查区间\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py list --from 2026-05-01 --to 2026-05-31\n\n# 查分类\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py list --category 餐饮\n\n# 查最近\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py recent --limit 10\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py recent --days 7 --sort amount_desc\n\n# 搜备注\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py search \"午饭\"\n\n# 查标签(#tag 聚合)\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py tag --tag 旅行\n\n# 查欠款 \u002F 查待报销 \u002F 查分期(状态族聚合)\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py debt --target 小明\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py reimburse\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py installment --name 手机\n\n# 看月度\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py monthly --month 2026-05\n\n# 看年度 \u002F 看周报\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py yearly --year 2026\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py week\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py week --offset 1\n\n# 看总览(区间)\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py overview --from 2026-05-01 --to 2026-05-31\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py overview --month 2026-05\n\n# 看分类(L1 聚合 + 环形图)\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py category\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py category --from 2026-05-01 --to 2026-05-31 --account 支付宝\n\n# 看账户 \u002F 看账本 \u002F 看结构\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py account\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py ledger\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py structure\n\n# 看对比\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py compare --period week\n\n# 看双区间 \u002F 看同比 \u002F 看分类对比\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py range_compare --from1 2026-05-01 --to1 2026-05-31 --from2 2026-04-01 --to2 2026-04-30\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py yoy --month 2026-05\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py cat_compare --from1 2026-05-01 --to1 2026-05-31 --from2 2026-04-01 --to2 2026-04-30\n\n# 看趋势 \u002F 看分类趋势\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py trend --months 12\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py cat_trend --category 餐饮 --months 6\n\n# 看大额 \u002F 看高频 \u002F 看分布\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py top --limit 10\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py top_freq\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py distribution\n\n# 做统计 \u002F 看活跃\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py stats\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py activity\n\n# 看洞察 \u002F 看异常(洞察生成器事实 + AI 解读)\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py insight --months 6\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py anomaly --months 6\n\n# 看借贷 \u002F 看报销 \u002F 看分期 \u002F 看退款(状态聚合)\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py debt_summary\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py reimburse_summary\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py installment_summary\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py refund_summary\n\n# 账户域(账户表 = goals.json accounts;HTML 渲染走 scripts\u002Faccount\u002Frender.py)\npython3 scripts\u002Faccount\u002Fcli.py add --name 招行卡 --type 银行卡\npython3 scripts\u002Faccount\u002Fcli.py update --name 招行卡 --new-name 招行工资卡\npython3 scripts\u002Faccount\u002Fcli.py update --name 花呗 --disable\npython3 scripts\u002Faccount\u002Fcli.py transfer --amount 500 --from 支付宝 --to 招行卡\npython3 scripts\u002Faccount\u002Fcli.py summary\n\n# 开始使用域(初始化\u002F备份\u002F导入;HTML 渲染走 scripts\u002Fsetup\u002Frender.py)\npython3 scripts\u002Fsetup\u002Fcli.py init --check\npython3 scripts\u002Fsetup\u002Fcli.py init\npython3 scripts\u002Fsetup\u002Fcli.py init-status\npython3 scripts\u002Fsetup\u002Fcli.py backup-create\npython3 scripts\u002Fsetup\u002Fcli.py backup-list\npython3 scripts\u002Fsetup\u002Fcli.py restore --name 20260809_120000\npython3 scripts\u002Fsetup\u002Fcli.py import --file x.csv --mapping date=1,amount=3,category=2\n```\n\n### Step 5：回复用户\n\n```\n✓ 已记录：餐饮 -35.00\n```\n\n### Step 6：HTML 可视化查询（v2.3 · 默认工作流）\n\n> **🎯 默认行为（§04 原则 11 HTML-First）：**\n> 所有查询\u002F分析\u002F统计类唤醒词命中后，AI **默认** 调用 `scripts\u002Fbill_inject.py` 生成可视化 HTML 交付给用户。\n> 文字答仅在用户**明确说**「不要 HTML」「给我文字版」「就告诉我数字」时才走。\n\n**支持 25 种查询\u002F分析类型（全部默认 HTML）：**\n\n| 类型 | CLI 子命令 | 适用场景 | bill_inject.py 调用 |\n|---|---|---|---|\n| 今日摘要 | `summary` | 看今日收支 | `bill_inject.py summary` |\n| 列表 | `list` \u002F `recent` \u002F `search` | 看记录明细 | `bill_inject.py list --date 2026-07-27` |\n| 查标签 | `tag` | #tag 聚合 | `bill_inject.py tag --tag 旅行` |\n| 查欠款 | `debt` | 未还借贷聚合 | `bill_inject.py debt` |\n| 查待报销 | `reimburse` | #待报销 清单 | `bill_inject.py reimburse` |\n| 查分期 | `installment` | #分期 分期卡 | `bill_inject.py installment` |\n| 月度汇总 | `monthly` | 看月度分类排行 | `bill_inject.py monthly --month 2026-07` |\n| 年度汇总 | `yearly` | 看年度趋势 | `bill_inject.py yearly --year 2026` |\n| 本周简报 | `week` | 本周 vs 上周 | `bill_inject.py week` |\n| 收支总览 | `overview` | 看区间 4 KPI + 日均 | `bill_inject.py overview --from ... --to ...` |\n| 分类占比 | `category` | 看分类环形图(L1 聚合) | `bill_inject.py category --month 2026-07` |\n| 账户占比 | `account` | 看各账户花销 | `bill_inject.py account` |\n| 账本汇总 | `ledger` | 看各账本收支 | `bill_inject.py ledger` |\n| 收支结构 | `structure` | 看收入来源\u002F支出去向 | `bill_inject.py structure` |\n| 周期对比 | `compare` | 本周 vs 上周 \u002F 本月 vs 上月 | `bill_inject.py compare --period week` |\n| 双区间对比 | `range_compare` | 两段时间对比 | `bill_inject.py range_compare --from1 ... --to1 ... --from2 ... --to2 ...` |\n| 同比对比 | `yoy` | 今年 vs 去年同月 | `bill_inject.py yoy --month 2026-07` |\n| 分类对比 | `cat_compare` | 分类差异 TOP | `bill_inject.py cat_compare --from1 ... --to1 ... --from2 ... --to2 ...` |\n| 收支趋势 | `trend` | 逐月折线(支出\u002F收入) | `bill_inject.py trend --months 12` |\n| 分类趋势 | `cat_trend` | 某分类逐月变化 | `bill_inject.py cat_trend --category 餐饮 --months 6` |\n| 大额排行 | `top` | 支出 TOP N | `bill_inject.py top --limit 10` |\n| 高频排行 | `top_freq` | 分类笔数 TOP | `bill_inject.py top_freq` |\n| 金额分布 | `distribution` | 直方图(5 区间) | `bill_inject.py distribution` |\n| 记账统计 | `stats` | 看总笔数 \u002F 天数 | `bill_inject.py stats` |\n| 活跃度 | `activity` | 周几\u002F时段分布 | `bill_inject.py activity` |\n| 消费洞察 | `insight` | AI 洞察(事实 + 解读) | `bill_inject.py insight --months 6` |\n| 异常检测 | `anomaly` | 突增月\u002F暴涨分类 | `bill_inject.py anomaly --months 6` |\n| 借贷总览 | `debt_summary` | 借出\u002F借入未还 + 对象 | `bill_inject.py debt_summary` |\n| 报销汇总 | `reimburse_summary` | 待报销 + 已到账 | `bill_inject.py reimburse_summary` |\n| 分期总览 | `installment_summary` | 进行中 + 历史分期 | `bill_inject.py installment_summary` |\n| 退款统计 | `refund_summary` | 退款总额\u002F次数\u002F分布 | `bill_inject.py refund_summary` |\n\n> **账户域例外**：账户类唤醒词（新增账户\u002F改账户\u002F账户转账\u002F看账户汇总）不走 bill_inject，走 `scripts\u002Faccount\u002Frender.py`（见「账户流程细则」），输出路径与 §12.A 一致。\n\n**调用流程（AI 必走）：**\n\n```bash\n# 标准路径（自动调 CLI + 注入 HTML 模板 + 输出文件）\npython3 scripts\u002Fbill_inject.py summary\npython3 scripts\u002Fbill_inject.py monthly --month 2026-07\npython3 scripts\u002Fbill_inject.py category --month 2026-07\npython3 scripts\u002Fbill_inject.py range_compare --from1 2026-07-01 --to1 2026-07-31 --from2 2026-06-01 --to2 2026-06-30\npython3 scripts\u002Fbill_inject.py insight --months 6\npython3 scripts\u002Fbill_inject.py search \"咖啡\"\n```\n\n**错误处理（§04 原则 11 反模式 #3）：**\n- HTML 生成失败 → **保留错误页 HTML** 交付给用户（bill_inject.py 自动处理）\n- ❌ **禁止**降级为文字答（这是 fail mode,不是 fallback）\n- 用户明确要文字 → 才走 `python3 scripts\u002Fscripts\u002Fquery\u002Fcli.py summary`（无 --json）\n\n**默认输出路径（v2.5 同步卡路里 §4.1）**：`$DATA_DIR\u002Fbiscuit_accountant_html\u002F\u003Ccommand_zh>_\u003CYYYYMMDD>_\u003CHHMMSS>[_N].html`\n  - `DATA_DIR` 跟随 `SKILLS_DB_PATH` 环境变量（fallback `D:\u002F.db\u002F`）\n  - 中文化 command 名：summary → 今日摘要 \u002F monthly → 月度汇总 \u002F overview → 收支总览\n  - 同秒冲突自动追加 `_2` \u002F `_3` 后缀\n\n**指定输出路径**：`python3 scripts\u002Fbill_inject.py summary --out C:\u002FUsers\u002Fxxx\u002FDesktop\u002Fx.html`\n\n**交付给用户**：用 `\u003Cmedia src=\"...\" type=\"file\" \u002F>` 把生成的 HTML 文件交付，用户双击在浏览器打开即可看到可视化效果。\n\n**模板特性（query_view.html \u002F 分析\u002Fanalysis_view.html）**：\n- 单文件离线运行（无 CDN \u002F 无 chart.js 依赖）\n- Apple 视觉风格（圆角卡片 \u002F 系统字体 \u002F 蓝橙绿红配色）\n- 自适应桌面 + 平板 + 手机\n- 5 种状态：正常 \u002F 空态 \u002F 缺数据 \u002F 错误 \u002F 离线\n- 查询域：SVG 环形图（breakdown 用）\n- 分析域（templates\u002F分析\u002Fanalysis_view.html · 2026-08-09 实施）：SVG 环形\u002F柱状\u002F双线折线\u002F直方 4 种图表，离线可用；25 场景全渲染器（汇总\u002F结构\u002F对比\u002F趋势\u002F金额\u002F统计洞察\u002F状态聚合）\n- 一键复制 ID 回 AI（每条记录含 ID）\n\n**目标域 HTML（goal\u002Frender.py · 2026-08-09 落地）：**\n\n| 场景 | CLI 子命令 | 模板 | goal\u002Frender.py 调用 |\n|---|---|---|---|\n| 设定预算（采集表单） | `set-budget` | `templates\u002F目标\u002Fbudget_form.html` | `goal\u002Frender.py set-budget --amount 3000 --month 2026-08` |\n| 看预算（进度条） | `budget` | `templates\u002F目标\u002Fbudget_view.html` | `goal\u002Frender.py budget --month 2026-08` |\n| 设定目标（采集表单） | `set-saving` | `templates\u002F目标\u002Fsaving_form.html` | `goal\u002Frender.py set-saving --name 换手机 --amount 10000` |\n| 看目标（进度条） | `saving` | `templates\u002F目标\u002Fsaving_view.html` | `goal\u002Frender.py saving` |\n\n目标域结果视图同样默认 HTML 交付（进度条 + 复制数据\u002F日志），采集表单默认「填写确认 + 复制确认 prompt」。\n\n**调用流程（AI 必走）：**\n\n```bash\n# 标准路径（自动调 CLI + 注入 HTML 模板 + 输出文件）\npython3 scripts\u002Fgoal\u002Frender.py set-budget --amount 3000\npython3 scripts\u002Fgoal\u002Frender.py budget\npython3 scripts\u002Fgoal\u002Frender.py set-saving --name 换手机 --amount 10000 --deadline 2026-12-31\npython3 scripts\u002Fgoal\u002Frender.py saving\n```\n\n**错误处理（§04 原则 11 反模式 #3）：**\n- HTML 生成失败 → **保留错误页 HTML** 交付给用户（goal\u002Frender.py 自动处理）\n- ❌ **禁止**降级为文字答（这是 fail mode,不是 fallback）\n- 用户明确要文字 → 才走 `python3 scripts\u002Fscripts\u002Fgoal\u002Fcli.py budget`（无 --json）\n\n**默认输出路径（v2.5 同步卡路里 §4.1）**：`$DATA_DIR\u002Fbiscuit_accountant_html\u002F\u003Ccommand_zh>_\u003CYYYYMMDD>_\u003CHHMMSS>[_N].html`\n  - `DATA_DIR` 跟随 `SKILLS_DB_PATH` 环境变量（fallback `D:\u002F.db\u002F`）\n  - 中文化 command 名：set-budget → 设定预算 \u002F budget → 看预算 \u002F set-saving → 设定目标 \u002F saving → 看目标\n  - 同秒冲突自动追加 `_2` \u002F `_3` 后缀\n\n**指定输出路径**：`python3 scripts\u002Fgoal\u002Frender.py budget --out C:\u002FUsers\u002Fxxx\u002FDesktop\u002Fx.html`\n\n**交付给用户**：用 `\u003Cmedia src=\"...\" type=\"file\" \u002F>` 把生成的 HTML 文件交付，用户双击在浏览器打开即可看到可视化效果。\n\n**模板特性（templates\u002F目标\u002F*.html）**：\n- 单文件离线运行（无 CDN \u002F 无图表库依赖）\n- Apple 视觉风格（圆角卡片 \u002F 系统字体 \u002F 蓝橙绿红配色）\n- 自适应桌面 + 平板 + 手机\n- 结果视图 5 种状态：正常 \u002F 空态 \u002F 缺数据 \u002F 错误 \u002F 离线\n- 进度条组件（预算 vs 实际 \u002F 已存 vs 目标）+ 状态机警示色（预算内绿 \u002F 接近上限橙 \u002F 已超支红；目标进行中蓝 \u002F 落后红 \u002F 达成绿）\n- 采集表单：字段回显 + 覆盖冲突警示条 + 一键复制确认 prompt（对齐 scenes\u002Fgoal.yaml）\n\n**开始使用域 HTML（setup\u002Frender.py · 2026-08-09 落地）：**\n\n| 场景 | CLI 子命令 | 模板 | setup\u002Frender.py 调用 |\n|---|---|---|---|\n| 首次使用向导（4 步零决策） | `init` \u002F `init --check` | `templates\u002F开始使用\u002Finit_wizard.html` | `setup\u002Frender.py init-wizard` |\n| 初始化状态（三重判定） | `init-status` | `templates\u002F开始使用\u002Finit_status.html` | `setup\u002Frender.py init-status` |\n| 一键备份（回执） | `backup-create` | `templates\u002F开始使用\u002Fbackup.html` | `setup\u002Frender.py backup-create` |\n| 查看备份（列表） | `backup-list` | `templates\u002F开始使用\u002Fbackup_list.html` | `setup\u002Frender.py backup-list` |\n| 从备份恢复（向导） | `restore --name X` | `templates\u002F开始使用\u002Frestore.html` | `setup\u002Frender.py restore [--name X]` |\n| 导入 CSV（列映射向导） | `import --file X` | `templates\u002F开始使用\u002Fimport.html` | `setup\u002Frender.py import --file X` |\n\n开始使用域场景默认 HTML 交付（向导\u002F回执\u002F结果型 + 复制数据\u002F日志）；备份\u002F恢复\u002F导入包装公共层 `backup.py`（G2 决议 备份 = db + goals.json）。\n\n**调用流程（AI 必走）：**\n\n```bash\n# 标准路径(向导\u002F回执\u002F结果 → HTML;执行走 setup\u002Fcli.py)\npython3 scripts\u002Fsetup\u002Frender.py init-wizard\npython3 scripts\u002Fsetup\u002Frender.py init-status\npython3 scripts\u002Fsetup\u002Frender.py backup-create\npython3 scripts\u002Fsetup\u002Frender.py backup-list\npython3 scripts\u002Fsetup\u002Frender.py restore\npython3 scripts\u002Fsetup\u002Frender.py import --file x.csv\n# 执行侧(向导确认后)\npython3 scripts\u002Fsetup\u002Fcli.py init\npython3 scripts\u002Fsetup\u002Fcli.py import --file x.csv --mapping date=1,amount=3,category=2\n```\n\n**错误处理（§04 原则 11 反模式 #3）：**\n- HTML 生成失败 \u002F 业务失败（无备份可恢复 \u002F 文件不存在 \u002F 缺文件路径）→ **保留错误页 HTML** 交付给用户（setup\u002Frender.py 自动处理，含 5 状态契约错误回执）\n- ❌ **禁止**降级为纯文字答（这是 fail mode,不是 fallback）\n\n**默认输出路径（v2.5 同步卡路里 §4.1）**：`$DATA_DIR\u002Fbiscuit_accountant_html\u002F\u003Ccommand_zh>_\u003CYYYYMMDD>_\u003CHHMMSS>[_N].html`\n  - 中文化 command 名：init-wizard → 初始化向导 \u002F init-status → 初始化状态 \u002F backup-create → 一键备份 \u002F backup-list → 查看备份 \u002F restore → 从备份恢复 \u002F import → 导入CSV\n\n**指定输出路径**：`python3 scripts\u002Fsetup\u002Frender.py restore --out C:\u002FUsers\u002Fxxx\u002FDesktop\u002Fx.html`\n\n**交付给用户**：用 `\u003Cmedia src=\"...\" type=\"file\" \u002F>` 把生成的 HTML 文件交付，用户双击在浏览器打开即可看到可视化效果。\n\n**模板特性（templates\u002F开始使用\u002F*.html）**：\n- 单文件离线运行（无 CDN \u002F 无图表库依赖）\n- Apple 视觉风格（圆角卡片 \u002F 系统字体 \u002F 蓝橙绿红配色）\n- 自适应桌面 + 平板 + 手机\n- 向导型步骤条（初始化 4 步 \u002F 恢复 3 步 \u002F 导入列映射）+ 完成态「记第一笔」引导按钮\n- 初始化状态三重判定卡（存在 \u002F schema \u002F 版本）+ 迁移提示条\n- 备份列表空态引导一键备份;恢复向导覆盖警示（恢复前自动备份现状）\n\n### Step 7：HELP 能力速查（v4.0 · Base 参数化 · #303）\n\n当用户说「饼干记账 HELP」「饼干记账 帮助」「查帮助」「能做什么」时，AI 调用 `scripts\u002Frender_help.py` 生成 HELP HTML 并交付。\n\n```bash\n# 默认输出\npython3 scripts\u002Frender_help.py\n# 输出路径（v2.5.1）：$DATA_DIR\u002Fbiscuit_accountant_html\u002F饼干记账_HELP_\u003CYYYYMMDD>_\u003CHHMMSS>[_N].html\n\n# 指定输出\npython3 scripts\u002Frender_help.py --out \u002Fpath\u002Fto\u002Fhelp.html\n\n# 仅校验数据源与契约（CI 用）\npython3 scripts\u002Frender_help.py --check\n```\n\n**HELP HTML 契约（§07 · #303 重构）：**\n- 来源：`references\u002Fscenarios.yaml`（合并器汇总 · 7 域 scenes yaml 唯一事实源）+ `公共组件\u002Fassets\u002Fhelp_template.html`（Base 参数化模板 · scene-data 契约 v1 · V4.16 定稿）\n- 展平（技能侧 · render_help.py v4.0）：7 域 → 2 级分组（groups → subgroups）+ 场景卡；wake_word 层消失并入场景卡 chip；types 徽章 = type 单值包数组；**源 yaml 3 层结构不动**\n- 展示 **7 域**（写入 \u002F 查询 \u002F 分析 \u002F 目标 \u002F 账户 \u002F 联动 \u002F 开始使用）× **70 个功能唤醒词（+4 条 HELP）** × **71 个合法场景**\n- 子功能组默认展开；点场景卡开 Sheet 弹层看 prompt 详情 + 复制\n- 每场景「复制」按钮 + Base hm-toast 通知（toast(msg, detail, opts) · 样式由公共组件决定）\n- 粘性搜索栏（跨 Tab 匹配 + 自动跳转 + 高亮）+ 底部 Tab 栏（7 域 + 关于）\n- 未初始化时显示「首次使用」横幅（复制初始化 prompt，与 `setup_init_wizard` 场景逐字一致）\n- HELP 自身 4 条唤醒词经 meta_blocks 透传（页面不渲染展示，与卡路里一致）；联系作者 \u002F 版本在「关于」Tab\n\n---\n\n## 命令行参考\n\n共 10 个子命令：\n\n| 子命令 | 说明 | 必需参数 | 可选参数 |\n|--------|------|----------|----------|\n| `add` | 添加账单 | `--category`, `--amount` | `--time`, `--account`, `--ledger`, `--currency`, `--note` |\n| `update` | 修改账单 | `--id` (必需) | `--category`, `--amount`, `--time`, `--account`, `--ledger`, `--currency`, `--note`(至少传一个) |\n| `list` | 查询记录 | （无） | `--date`, `--from`+`--to`, `--category`, `--account`, `--ledger`, `--type`(expense\u002Fincome), **`--json`** |\n| `search` | 搜索备注 | `keyword`（位置参数） | **`--json`** |\n| `summary` | 今日摘要 | （无） | **`--json`** |\n| `tag` | 查标签(#tag 聚合) | `--tag` | **`--json`** |\n| `debt` | 查欠款(#未还 聚合) | （无） | `--target`, **`--json`** |\n| `reimburse` | 查待报销(#待报销) | （无） | **`--json`** |\n| `installment` | 查分期(#分期 聚合) | （无） | `--name`, **`--json`** |\n| `monthly` | 月度汇总 | `--month` | **`--json`** |\n| `recent` | 最近N条 | （无） | `--limit` (默认 10), `--days`, `--sort`(amount_desc\u002Famount_asc), **`--json`** |\n| `yearly` | 年度汇总 | （无） | `--year` (默认今年), **`--json`** |\n| `week` | 本周简报 | （无） | `--offset` (0=本周\u002F1=上周), **`--json`** |\n| `overview` | 收支总览 | （无） | `--month` (默认当月) 或 `--from`+`--to` (区间), **`--json`** |\n| `category` | 分类占比(L1 聚合) | （无） | `--month` 或 `--from`+`--to`, `--account`, `--type`(expense\u002Fincome), **`--json`** |\n| `account` | 账户占比 | （无） | `--month` 或 `--from`+`--to`, **`--json`** |\n| `ledger` | 账本汇总 | （无） | `--month` 或 `--from`+`--to`, **`--json`** |\n| `structure` | 收支结构(双环形) | （无） | `--month` 或 `--from`+`--to`, **`--json`** |\n| `compare` | 周期对比 | （无） | `--period` (week\u002Fmonth, 默认 week), **`--json`** |\n| `range_compare` | 双区间对比 | （无） | `--from1`+`--to1`+`--from2`+`--to2`(全必填), **`--json`** |\n| `yoy` | 同比对比 | （无） | `--month` (默认本月), **`--json`** |\n| `cat_compare` | 分类对比 | （无） | `--from1`+`--to1`+`--from2`+`--to2`(全必填), **`--json`** |\n| `trend` | 收支趋势 | （无） | `--months` (默认 12), **`--json`** |\n| `cat_trend` | 分类趋势 | （无） | `--category`, `--months` (默认 12), **`--json`** |\n| `top` | 大额排行 | （无） | `--limit` (默认 10), `--from`+`--to`, **`--json`** |\n| `top_freq` | 高频排行 | （无） | `--limit` (默认 10), `--from`+`--to`, **`--json`** |\n| `distribution` | 金额分布 | （无） | `--month` 或 `--from`+`--to`, `--type`(expense\u002Fincome, 默认 expense), **`--json`** |\n| `stats` | 记账统计 | （无） | **`--json`** |\n| `activity` | 记账活跃度 | （无） | **`--json`** |\n| `insight` | AI 消费洞察 | （无） | `--months` (默认 6), `--top-n`, **`--json`** |\n| `anomaly` | 异常波动检测 | （无） | `--months` (默认 6), **`--json`** |\n| `debt_summary` | 借贷总览(#借出\u002F#借入) | （无） | **`--json`** |\n| `reimburse_summary` | 报销汇总(#待报销) | （无） | **`--json`** |\n| `installment_summary` | 分期总览(#分期) | （无） | **`--json`** |\n| `refund_summary` | 退款统计(#退款) | （无） | **`--json`** |\n| `breakdown` | 分类明细(旧口径兼容) | （无） | `--from`, `--to`, **`--json`** |\n| `form` | 联动采集表单渲染(买东西联动\u002F吃饭联动) | `purchase`\u002F`meal`(位置参数) | `--amount`, `--item`\u002F`--ate`, `--category`, `--category-hint`, `--account`, `--ledger`, `--time`, `--note`, `--currency`, `--account-source`, `--category-source`, `--ledger-source`, `--out` |\n| `receipt` | 联动回执渲染(回执带联动按钮) | `purchase`\u002F`meal` + `--id`(必需) | `--item`\u002F`--ate`, `--out` |\n| `set-budget` | 设定月度预算(goal) | `--amount` | `--month`(默认本月), `--category`(不填=总预算), `--force`(覆盖), **`--json`** |\n| `budget` | 查看预算执行(goal) | （无） | `--month`, `--category`, **`--json`** |\n| `set-saving` | 设定储蓄目标(goal) | `--name`, `--amount` | `--deadline`, **`--json`** |\n| `saving` | 查看目标进度(goal) | （无） | `--name`, **`--json`** |\n| `init` | 初始化向导执行(setup) | （无） | `--check`(只读环境检测), **`--json`** |\n| `init-status` | 初始化状态三重判定(setup) | （无） | **`--json`** |\n| `backup-create` | 一键备份(setup · db+goals.json) | （无） | **`--json`** |\n| `backup-list` | 查看备份(setup) | （无） | **`--json`** |\n| `restore` | 从备份恢复(setup) | （无） | `--name`(默认最新), **`--json`** |\n| `import` | 导入 CSV 账单(setup) | `--file` | `--mapping`(字段=列号), `--encoding`, `--skip-header`, `--preview`\u002F`--dry-run`, **`--json`** |\n\n> **JSON 契约**：所有查询命令加 `--json` 后输出 `{status: \"ok\"|\"error\", data: {...}, message: \"...\"}` 三段式。`bill_inject.py` 用此契约注入 HTML 模板。写入类命令（add\u002Fupdate）不支持 `--json`，保持纯文本输出。目标域 4 命令（`set-budget` \u002F `budget` \u002F `set-saving` \u002F `saving`）在 `scripts\u002Fgoal\u002Fcli.py`（HTML 渲染走 `scripts\u002Fgoal\u002Frender.py`）；`set-budget` 覆盖冲突时返回 `status: \"ok\"` + `data.conflict: true`（原值在 `data.existing`），AI 据此提示用户确认后加 `--force`。开始使用域 6 命令（`init` \u002F `init-status` \u002F `backup-create` \u002F `backup-list` \u002F `restore` \u002F `import`）在 `scripts\u002Fsetup\u002Fcli.py`（HTML 渲染走 `scripts\u002Fsetup\u002Frender.py`，包装公共层 backup.py）。\n\n---\n\n## 分类参考\n\n分类采用 **L1\u002FL2\u002FL3 三级** 结构(支出)\u002F **L1\u002FL2 二级** 结构(收入),用 `\u002F` 分隔(如 `餐饮\u002F外卖\u002F午餐`)。\n\n**AI 解析必读 `references\u002Fcategories.md` 的「分类心法」章节** — 心法包含 5 个判断维度(主体\u002F目的\u002F对象\u002F工具vs体验\u002F谁付费)和边界示例。**不要\"关键词查表\",要按意图推场景。** 关键词表只在心法覆盖不到时兜底。\n\n**支出 L1(10 个):** 餐饮、居家、穿着、出行、玩乐、学习、健康、社交、宠物、其他\n\n**收入 L1(5 个):** 工资、奖金、兼职、投资、其他收入\n\n> 旧数据中不带 `\u002F` 的分类(如 `餐饮`、`交通`)自动视为 L1,无需迁移。\n\n---\n\n## 与其他工具的边界\n\n本 Skill 的 **5 层骨架**（数据层 `db.py` \u002F 操作层 `analyze.py` \u002F 规则层 `validators.py` \u002F 接口层 `write|query|analysis|account\u002Fcli.py`(四域) \u002F 文档层 `references\u002F`+`templates\u002F`）**不含** `config-cookie-accounting.ts`。\n\n| 文件 | 归属 | 维护方 | 与本 Skill 的关系 |\n|------|------|--------|-------------------|\n| `config-cookie-accounting.ts` | SkillBoard 数据层视图（legacy） | 独立维护 | 不在 5 层骨架内；权威分类体系以 [`references\u002Fcategories.md`](references\u002Fcategories.md) 为准 |\n| `references\u002Fcategories-mapping.md` | 本 Skill 文档层 | 本 Skill 维护 | 桥接 `config-cookie-accounting.ts`（9 L1）→ `categories.md`（10 L1）；仅做语义映射，不修改任何一方的字段 |\n\n> **若未来澄清 `config-cookie-accounting.ts` 为废弃**：需独立 spec 处理；本 Skill 当前仅做桥接文档（`references\u002Fcategories-mapping.md`），不删不改 `config-cookie-accounting.ts`。\n\n---\n\n## 错误处理\n\n| 场景 | 处理方式 |\n|------|----------|\n| 图片模糊\u002F看不清金额 | 描述看到的内容，请用户确认 |\n| 图片非账单 | 告知用户并询问是否手动输入 |\n| 未指定分类 | 根据内容推断，告知用户可纠正 |\n| 金额不明确 | 请用户确认，不自动猜测 |","**🔗 联动提示：** 完成本技能主操作后，检查技能路由器（`图片路由\u002FSKILL.md`）的联动规则，判断是否需要联动其他技能（如用户提到买了实物→询问是否录入居家管家；用户提到食物→询问是否记录卡路里）。详见路由器的联动规则表。\n\n## 强制性规定（最高优先级）\n\n1. **`饼干记账.html` = render_help.py 命令生成的 HELP 镜像** — 生成后自动复制到技能根目录,不再手工同步;改动 HELP 相关代码\u002F模板后必须重新生成,一致性由 tests\u002Ftest_render.py 契约锁定\n2. **修改确认采用任务级授权** — 用户显式点名\u002F下发的任务(如 ready-for-agent 票 \u002F wayfinder ticket)视为对任务范围内修改的一次确认,执行中不再逐行确认;任务范围外、涉及真实数据或破坏性变更仍需先确认\n\n---\n\n## 操作规范（强制）\n\n- 所有数据操作通过 CLI（`scripts\u002Fwrite|query|analysis|account\u002Fcli.py` 四域入口），禁止直连数据库\n- 只读操作（查询\u002F分析\u002F统计）不需确认；写入操作（记支出\u002F记收入\u002F拍账单\u002F改记录）需用户确认\n- 不支持删除已有记录；修改功能见「改记录」流程\n- 金额必须明确，不能猜测\n\n---\n\n## 安装与配置\n\n### 依赖\n\n- Python 3.x（系统自带 sqlite3）\n\n### 配置项\n\n| 环境变量 | 说明 | \n|----------|------|\n| `SKILLS_DB_PATH` | 数据库目录 |\n\n### 一键安装\n\n```\n请帮我初始化饼干记账技能：\n1. 检查 Python 环境\n2. 引导我配置环境变量\n3. 显示当前环境变量配置\n4. 告诉我如何更改数据目录\n```\n\n---\n\n## 功能概述\n\n- **文字记账**：解析自然语言，提取金额、分类、备注\n- **图片记账**：看图识别账单金额，用户确认后记录\n- **查询统计**：今日\u002F指定日期\u002F日期范围\u002F分类查询\n- **分析报表**：月度汇总、周期对比、分类明细、收支总览\n\n---\n\n## 唤醒词总表\n\n> 全量 70 个唤醒词(2026-08-08 路由表定案);编号见 references\u002F路由表.md;新增在域区间内追加\n\n| 类型 | 唤醒词 | 功能 | CLI 指令 | 默认输出 |\n|------|--------|------|----------|----------|\n| 写入 | `记支出` | 记一笔支出 | `write add` | 文字回执 |\n| 写入 | `记收入` | 记一笔收入 | `write add` | 文字回执 |\n| 写入 | `拍账单` | 拍账单记账(图片识别) | `write add(图片识别)` | 文字回执 |\n| 写入 | `批量录入` | 批量录入多笔 | `write add(批量)` | 文字回执 |\n| 写入 | `记退款` | 记一笔退款(冲销原支出) | `write add + update(#已退款)` | 文字回执 |\n| 写入 | `记报销` | 记一笔报销支出(#待报销) | `write add(#待报销)` | 文字回执 |\n| 写入 | `报销到账` | 报销到账(记收入 + 流转标签) | `write add + update(标签流转)` | 文字回执 |\n| 写入 | `记借出` | 借给别人钱 | `write add(借贷账本)` | 文字回执 |\n| 写入 | `记借入` | 向别人借钱 | `write add(借贷账本)` | 文字回执 |\n| 写入 | `记收回` | 收回借出的钱 | `write add + update(#已还)` | 文字回执 |\n| 写入 | `记偿还` | 偿还借入的钱 | `write add + update(#已还)` | 文字回执 |\n| 写入 | `记分期` | 记一笔分期(平摊预写) | `write add×N(平摊预写)` | 文字回执 |\n| 写入 | `改记录` | 修改已有记录 | `write update` | 文字回执 |\n| 写入 | `撤销` | 撤销一条记录(软删) | `write update(deleted_at)` | 文字回执 |\n| 写入 | `恢复` | 恢复已撤销记录 | `write update(deleted_at=NULL)` | 文字回执 |\n| 查询 | `查今天` | 查今天收支 | `query summary` | **HTML** |\n| 查询 | `查昨天` | 查昨天收支 | `query list --date` | **HTML** |\n| 查询 | `查某天` | 查某一天的账 | `query list --date` | **HTML** |\n| 查询 | `查最近` | 查最近记录 | `query recent` | **HTML** |\n| 查询 | `查周` | 查某周的账 | `query list --from --to` | **HTML** |\n| 查询 | `查月` | 查某个月的账 | `query list --from --to` | **HTML** |\n| 查询 | `查区间` | 查任意时间段 | `query list --from --to` | **HTML** |\n| 查询 | `查分类` | 查某分类的账 | `query list --category` | **HTML** |\n| 查询 | `搜备注` | 搜索备注关键词 | `query search` | **HTML** |\n| 查询 | `查标签` | 查标签(#tag 聚合) | `query tag --tag` | **HTML** |\n| 查询 | `查账户` | 查某账户流水 | `query list --account` | **HTML** |\n| 查询 | `查账本` | 查某账本的记录 | `query list --ledger` | **HTML** |\n| 查询 | `查欠款` | 查未还欠款(借贷状态) | `query debt` | **HTML** |\n| 查询 | `查待报销` | 查待报销 | `query reimburse` | **HTML** |\n| 查询 | `查分期` | 查进行中的分期 | `query installment` | **HTML** |\n| 分析 | `看月度` | 某月收支汇总 | `analysis monthly --month` | **HTML** |\n| 分析 | `看年度` | 年度收支汇总 | `analysis yearly --year` | **HTML** |\n| 分析 | `看总览` | 时间段收支总览 | `analysis overview --from --to` | **HTML** |\n| 分析 | `看周报` | 本周简报(对比上周) | `analysis week` | **HTML** |\n| 分析 | `看分类` | 钱花在哪些分类 | `analysis category` | **HTML** |\n| 分析 | `看账户` | 各账户花销情况 | `analysis account` | **HTML** |\n| 分析 | `看账本` | 各账本收支汇总 | `analysis ledger` | **HTML** |\n| 分析 | `看结构` | 收入支出来源去向 | `analysis structure` | **HTML** |\n| 分析 | `看对比` | 本期和上期对比 | `analysis compare --period` | **HTML** |\n| 分析 | `看双区间` | 两段时间对比 | `analysis range_compare` | **HTML** |\n| 分析 | `看同比` | 今年和去年同比 | `analysis yoy --month` | **HTML** |\n| 分析 | `看分类对比` | 两段时间分类差异 | `analysis cat_compare` | **HTML** |\n| 分析 | `看趋势` | 每月收支走势 | `analysis trend --months` | **HTML** |\n| 分析 | `看分类趋势` | 某分类的月度变化 | `analysis cat_trend --category` | **HTML** |\n| 分析 | `看大额` | 大额支出排行 | `analysis top --limit` | **HTML** |\n| 分析 | `看高频` | 高频消费排行 | `analysis top_freq` | **HTML** |\n| 分析 | `看分布` | 金额区间分布 | `analysis distribution` | **HTML** |\n| 分析 | `做统计` | 记账情况统计 | `analysis stats` | **HTML** |\n| 分析 | `看活跃` | 记账活跃度 | `analysis activity` | **HTML** |\n| 分析 | `看洞察` | AI 消费洞察 | `analysis insight`(接洞察生成器) | **HTML** |\n| 分析 | `看异常` | 异常波动检测 | `analysis anomaly`(接洞察生成器) | **HTML** |\n| 分析 | `看借贷` | 借贷总览 | `analysis debt_summary`(#借贷) | **HTML** |\n| 分析 | `看报销` | 报销汇总 | `analysis reimburse_summary`(#待报销) | **HTML** |\n| 分析 | `看分期` | 分期总览 | `analysis installment_summary`(#分期) | **HTML** |\n| 分析 | `看退款` | 退款统计 | `analysis refund_summary`(#退款) | **HTML** |\n| 目标 | `设定预算` | 设定月度预算 | `goal set-budget --amount X [--month] [--category]` | **HTML 表单+回执** |\n| 目标 | `看预算` | 查看预算执行 | `goal budget [--month]` | **HTML** |\n| 目标 | `设定目标` | 设定储蓄目标 | `goal set-saving --name X --amount Y [--deadline]` | **HTML 表单+回执** |\n| 目标 | `看目标` | 查看目标进度 | `goal saving [--name]` | **HTML** |\n| 账户 | `新增账户` | 新增账户 | `account add --name X [--type Y]` | **HTML 表单+回执** |\n| 账户 | `改账户` | 修改账户 | `account update --name X [--new-name\u002F--disable\u002F--enable]` | **HTML 表单+回执** |\n| 账户 | `账户转账` | 账户间转账 | `account transfer --amount X --from A --to B` | **HTML 表单+回执** |\n| 账户 | `看账户汇总` | 查看账户汇总 | `account summary` | **HTML** |\n| 联动 | `买东西` | 买东西联动(记账 + 录物品) | `link form + receipt` | **HTML 表单+回执** |\n| 联动 | `吃饭` | 吃饭联动(记账 + 记卡路里) | `link form + receipt` | **HTML 表单+回执** |\n| 开始使用 | `初始化` | 首次使用向导(4 步零决策) | `setup init` | **HTML** |\n| 开始使用 | `初始化状态` | 初始化状态(是否已就绪) | `setup init-status` | **HTML** |\n| 开始使用 | `备份` | 一键备份 \u002F 查看备份 | `setup backup-create \u002F backup-list` | **HTML** |\n| 开始使用 | `恢复备份` | 从备份恢复 | `setup restore --name X` | **HTML** |\n| 开始使用 | `导入` | 导入 CSV 账单(列映射向导) | `setup import --file X` | **HTML** |\n| HELP | `查帮助` | 能力速查 HELP | `render_help.py` | **HTML** |\n| HELP | `能做什么` | 能力速查 HELP | `render_help.py` | **HTML** |\n\n## 📌 输出位置（§04 原则 12.A \u002F 12.B）\n\n> **本 Skill 走 §04 原则 12.A \u002F 12.B**，HTML 路径名规则固化如下，不可随意改动：\n\n| 类型 | §12 分类 | 文件名规范 | 触发命令 |\n|------|----------|------------|----------|\n| **数据 \u002F 过程 HTML**（12.A）| §12.A | `$DATA_DIR\u002Fbiscuit_accountant_html\u002F\u003Ccommand_zh>_\u003CYYYYMMDD>_\u003CHHMMSS>[_N].html` | `bill_inject.py \u003Cquery_type> [args]` |\n| **HELP HTML**（12.B）| §12.B | `$DATA_DIR\u002Fbiscuit_accountant_html\u002F饼干记账_HELP_\u003CYYYYMMDD>_\u003CHHMMSS>[_N].html` | `render_help.py` |\n\n- `\u003Ccommand_zh>` 由 `scripts\u002Fhtml_paths.resolve_command_name()` 解析（如 `今日摘要` \u002F `月度汇总` \u002F `收支总览`）\n- 同秒冲突自动追加 `_2` \u002F `_3` 后缀\n- `$DATA_DIR` 跟随 `SKILLS_DB_PATH` 环境变量（fallback `D:\u002F.db\u002F`）\n- HELP 路径名固定以 `饼干记账_HELP_` 前缀（grep 一抓就出，便于检索历史 HELP 页）\n\n---\n\n## 路由规则（用户表达 → 唤醒词 → CLI）\n\n> G5 Q3 决议落地（#249）· 相对时间换算细则的唯一承载章节；Step 2 括号引用收敛于此。\n\n**触发识别总则（G5 决议 · 变体方向制）：** 触发识别职责 = frontmatter description 触发词矩阵（按域分组）+ AI 自然语言理解（同义 \u002F 口语 \u002F 模糊 3 方向），不再硬编码别名映射表；唤醒词 = AI 路由入口（简短），场景名 = HELP 阅读（「做什么 +（怎么处理）」）。相对时间表达由 AI 按本表语义换算为具体日期后传入 CLI 参数（CLI 始终接收具体日期）。\n\n**可执行参考实现：** `scripts\u002Frouting.py`（3 函数 + today 注入，纯库不进运行时）+ `tests\u002Ftest_routing.py`（40 用例，覆盖跨月\u002F跨年\u002F闰年\u002F12 月\u002F跨年+1）。**修改本表规则必须同步 routing.py，反之亦然。**\n\n### 相对时间映射表\n\n| 表达 | 换算规则 | CLI 参数示例 |\n|------|----------|--------------|\n| 今天 | 当天 | `--date 今天` |\n| 昨天 | 前一天（跨月\u002F跨年自动进位） | `--date 昨天` |\n| 前天 | 前两天 | `--date 前天` |\n| N 天前 | 当天 − N 天 | `--date 3天前` |\n| 本周五 \u002F 上周五 \u002F 上上周五 | 所在周偏移 + 周几（本周=0 \u002F 上周=−1 \u002F 上上周=−2，周一=1…周日=7） | `--date 上周五` |\n| 本周 | **周一 ~ 周日**（含今天所在周） | `--from 本周一 --to 今天` |\n| 上周 | 上周一 ~ 上周日 | `--from 上周一 --to 上周日` |\n| 本月 | 本月 1 日 ~ 月末 | `--month 本月` |\n| 上月 | 上月 1 日 ~ 月末（1 月 → 去年 12 月） | `--month 上月` |\n| 最近 N 天 | 今天 − (N−1) ~ 今天（含今天） | `--days N` |\n\n**关键语义声明：**\n- 「本周」= 周一 ~ 周日（ISO 语义），自持不共享\n- 跨月\u002F跨年\u002F闰年\u002F12 月\u002F跨年+1 等边界由 `tests\u002Ftest_routing.py` 锁死（如「昨天」= 1 月 1 日 → 去年 12 月 31 日；「上月」= 2024-03 → 2024-02-01 ~ 02-29）\n\n## 使用流程\n\n### Step 1：判断输入类型\n\n| 输入类型 | 处理方式 |\n|----------|----------|\n| 纯文字 | 直接匹配唤醒词，解析金额、分类、备注 |\n| 纯图片（无文字） | 进入「拍账单」流程，识别图片内容，展示结果，用户确认后记账 |\n| 图片+文字 | 看图判断金额，用户文字作为备注或分类提示 |\n\n### Step 2：匹配唤醒词\n\n用户输入 → 匹配唤醒词（全量 70 个 · 编号与命令见 §唤醒词总表 \u002F `references\u002F路由表.md`）→ 进入对应功能流程。\n\n**路由识别（G5 决议 · 变体方向制）：** 触发识别职责 = frontmatter description 触发词矩阵（按域分组）+ AI 自然语言理解（同义 \u002F 口语 \u002F 模糊 3 方向），不再硬编码别名映射表；唤醒词 = AI 路由入口（简短），场景名 = HELP 阅读（「做什么 +（怎么处理）」）。相对时间表达（今天 \u002F 昨天 \u002F 上周五 \u002F 最近 N 天等）的换算细则见 §路由规则。\n\n\n### Step 3：解析参数\n\n#### 记支出\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"午饭35\" | 分类=餐饮\u002F外卖\u002F午餐, 金额=-35 |\n| \"奶茶25\" | 分类=餐饮\u002F咖啡奶茶\u002F奶茶, 金额=-25 |\n| \"打车20用支付宝\" | 分类=出行\u002F网约车, 金额=-20, 账户=支付宝 |\n| \"洗发水80\" | 分类=居家\u002F日用品(默认,如上下文有\"理发\u002F发廊\"则→穿着\u002F洗护), 金额=-80 |\n| \"昨天买书58\" | 分类=玩乐\u002F影音游戏\u002F书籍影视(默认,如上下文有\"教材\u002F考试\u002F备考\"则→学习\u002F书籍), 金额=-58, 时间=昨天 |\n| \"记账到旅行账本\" | 账本=旅行 |\n\n**文字解析关键词：**\n- \"花了 \u002F 付了 \u002F 消费 \u002F 支出 \u002F 买了\" → 负数金额\n- 未指定时间 → 默认当前时间\n- 未指定分类 → 根据内容推断，告知用户可纠正\n- 分类参考 `references\u002Fcategories.md`(L1\u002FL2\u002FL3 三级 + 歧义词智能判断)\n\n#### 记收入\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"工资8000\" | 分类=工资\u002F基本工资, 金额=+8000 |\n| \"绩效3000\" | 分类=工资\u002F绩效, 金额=+3000 |\n| \"项目奖金5000\" | 分类=奖金\u002F项目奖金, 金额=+5000 |\n| \"副业赚了2000\" | 分类=兼职\u002F副业, 金额=+2000 |\n| \"基金分红300\" | 分类=投资\u002F分红, 金额=+300 |\n| \"红包100\" | 分类=其他收入\u002F红包, 金额=+100 |\n\n**文字解析关键词：**\n- \"收到 \u002F 收入 \u002F 进账 \u002F 工资 \u002F 赚了\" → 正数金额\n\n#### 拍账单\n\n| 用户输入 | 处理方式 |\n|----------|----------|\n| 发截图\u002F账单图片 | 识别金额，展示结果，用户确认后记录 |\n| 发模糊图片 | 描述看到的内容，请用户确认金额 |\n| 发非账单图片 | 告知非账单，询问是否手动输入 |\n\n**图片识别规则：**\n1. 优先取「实付 \u002F 实收 \u002F 已支付 \u002F 需付」金额\n2. 其次取「合计 \u002F 总计 \u002F 总额 \u002F 应付」金额\n3. 忽略：单品价格、优惠减免、配送费、税额、找零\n4. 无法判断时，描述看到的内容并请用户确认\n\n**确认页生成硬约束（2026-08-13 · #298 缓解 · 违者视为 bug）：**\n1. **确认页只能由脚本生成**：调用 `scripts\u002Frender_write.py photo`（参数：`--images` 图片数 \u002F `--photo-note` 识别说明 \u002F `--amount` \u002F `--category` \u002F `--account` \u002F `--ledger` \u002F `--note` \u002F `--account-source` \u002F `--category-source` \u002F `--ledger-source` \u002F `--out`）产出采集表单 HTML。**禁止 AI 手写\u002F拼装确认页 HTML**——AI 的职责是解析账单并把识别结果当参数传给脚本，不是产 HTML。\n2. **账户必须推断并传参**：识别出商家\u002F平台（如「美团外卖」→ 推断账户「美团」）时，AI 推断最可能的**已有**账户 → `--account 美团 --account-source inferred`（表单标「AI 推断」）；推断出该账户不存在、建议新建（如「美团月付」）→ `--account 美团月付 --account-source recommended_new`（表单标「AI 推荐·新建」）；推断不出、或不确定该账户是否已存在 → 不传（表单留空待用户填），**不得编造**。账户预置只是省填写，用户可改可清空。\n3. **来源语义**：`--\u003Cfield>-source` 取值 `inferred`（AI 推断已有项）\u002F `recommended_new`（AI 推荐新建）\u002F `existing` \u002F `history` \u002F `custom`；只传字段值不传来源 → 脚本按「值在候选内=已有(existing)、否则=推荐新建」处理；分类只给 `--category-hint` 时按建议走（命中已有=推断、全新=推荐新建）。\n\n#### 改记录\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"把那条午饭改成 38\" | id=查最近匹配项, amount=-38 |\n| \"改备注加牛奶\" | id=用户指定或查最近匹配, note=\"原备注+牛奶\" |\n| \"ID=123 改成分类=交通\" | id=123, category=交通 |\n| \"把刚记的那笔改一下\" | id=查最近第 1 条,字段待用户告知 |\n\n**改记录流程(AI 层负责 diff + 确认):**\n1. 通过 `查最近` \u002F `查某天` \u002F `搜备注` 定位目标记录的 ID(必要时把候选展示给用户挑)\n2. 用户告知要改哪些字段、改成什么 → AI 计算 原值 → 新值 的 diff\n3. **展示 diff 给用户,等待\"确认\"**(未确认前不调 update CLI)\n4. 用户回复「确认」→ AI 调 `update --id \u003CID> [...新字段]`\n5. CLI 返回结果 → AI 反馈「已修改」\n\n**确认模板:**\n```\n📝 待修改(ID=123):\n  分类:    餐饮     →  餐饮(未改)\n  金额:    -35.00   →  -38.00\n  备注:    午饭     →  午饭+牛奶\n确认改?(回复「确认」或「取消」)\n```\n\n#### 查今天\n\n无参数。返回今日 count \u002F expense \u002F income \u002F net + 分类聚合 + 明细。\n\n> **查询域通用规则**：全部查询 = 仅结果型 HTML（缺参 → AI 文字反问，不猜不补）；结果 HTML 默认动作区「复制数据 \u002F 复制日志」；无数据 → 空态提示。\n\n#### 查昨天 \u002F 查某天\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"查昨天\" | --date = 昨天日期 |\n| \"5月1号的账\" | --date = 2026-05-01 |\n| \"上周五花了多少\" | --date = 计算后的日期 |\n\n#### 查周 \u002F 查月 \u002F 查区间\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"这周的账\" | --from 本周一 --to 今天 |\n| \"上周消费\" | --from 上周一 --to 上周日 |\n| \"5月1到10号\" | --from 2026-05-01 --to 2026-05-10 |\n\n#### 查分类\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"餐饮类的记录\" | --category 餐饮 |\n| \"交通花了多少\" | --category 交通 |\n| \"支付宝里餐饮花了多少\" | --category 餐饮 --account 支付宝 --type expense |\n| \"旅行账本这个月的\" | --category + --ledger 旅行 + --from\u002F--to |\n\n注意：分类支持 L1 前缀匹配（传「餐饮」命中 餐饮\u002F外卖\u002F午餐 等全部子分类）；可组合 时间\u002F账户\u002F账本\u002F收支方向。返回 KPI(支出\u002F收入\u002F净额)+ 分类聚合 + 逐条记录。如需分类汇总统计，使用「看分类」。\n\n#### 查最近\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"最近5条\" | --limit 5 |\n| \"最近的记录\" | --limit 10（默认） |\n| \"近7天的记录\" | --days 7 |\n| \"最近按金额从大到小\" | --limit 10 --sort amount_desc |\n\n返回：KPI(笔数\u002F支出\u002F收入\u002F净额)+ 明细（默认时间倒序，可金额排序）。\n\n#### 搜备注\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"搜午饭\" | keyword = 午饭 |\n| \"有没有咖啡的记录\" | keyword = 咖啡 |\n\n#### 查标签\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"查 #旅行 的记录\" | --tag 旅行 |\n| \"带 #待报销 的\" | --tag 待报销 |\n\n返回：#tag 聚合卡(笔数\u002F支出\u002F收入)+ 命中明细。精确匹配（#旅行 不误伤 #旅行计划）。\n\n#### 查账户\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"支付宝的流水\" | --account 支付宝 |\n| \"招行这个月的\" | --account 招行 --from\u002F--to |\n\n返回：该账户 KPI(支出\u002F收入\u002F净额)+ 明细。\n\n#### 查账本\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"旅行账本的记录\" | --ledger 旅行 |\n| \"借贷账本\" | --ledger 借贷 |\n\n返回：该账本 KPI(支出\u002F收入\u002F净额)+ 明细。\n\n#### 查欠款\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"查欠款\" | debt |\n| \"小明还欠多少\" | debt --target 小明 |\n\n聚合 `#未还` 记录：借出未还总额 + 借入未还总额 + 未还列表(对象\u002F方向\u002F金额\u002F时间)。对象从备注 `#借给{X}` \u002F `#向{X}借` 提取。\n\n#### 查待报销\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"查待报销\" | reimburse |\n\n聚合 `#待报销` 记录：总额 + 列表(金额\u002F分类\u002F日期)。\n\n#### 查分期\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"查分期\" | installment |\n| \"手机的期数\" | installment --name 手机 |\n\n按备注 `#分期 {名目} 第X期\u002FN` 分组：分期卡(名目\u002F总额\u002F每期\u002F期数\u002F已还期数\u002F剩余期数+金额)+ 记录明细。已还期数按「日期 ≤ 今天」推断（分期写入即固定）。\n\n#### 看月度\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"本月汇总\" | --month = 当前月（YYYY-MM） |\n| \"3月份的账\" | --month = 2026-03 |\n\n返回：支出\u002F收入\u002F净额\u002F笔数 + 分类排行。\n\n#### 看年度\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"今年汇总\" | --year = 当前年 |\n| \"2025年总结\" | --year = 2025 |\n\n返回：全年 KPI(支出\u002F收入\u002F净额\u002F笔数) + 逐月趋势表 + 大额分类 TOP。\n\n#### 看周报\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"本周简报\" | week（默认本周） |\n| \"上周周报\" | week --offset 1 |\n\n返回：本周 KPI + 本周 vs 上周双卡(支出变化率) + 本周大额支出。\n\n#### 看总览\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"本月收支\" | --month = 当前月（默认） |\n| \"3月收支情况\" | --month = 2026-03 |\n| \"5月1到10号的收支\" | --from 2026-05-01 --to 2026-05-10 |\n\n返回：笔数\u002F支出\u002F收入\u002F净额 + 日均支出 + 区间标注。\n\n#### 看分类\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"各类支出占比\" | 无参数，默认本月 |\n| \"5月的分类明细\" | --from 2026-05-01 --to 2026-05-31 |\n| \"支付宝花了什么\" | --account 支付宝 |\n| \"收入占比\" | --type income |\n\n返回：SVG 环形图 + 排行(总额\u002F占比\u002F笔数\u002F均值)；分类 L1 聚合(餐饮\u002F外卖 → 餐饮)。\n\n#### 看账户\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"各账户花销\" | 默认本月 |\n| \"上个月的账户情况\" | --month 上个月 |\n\n返回：账户占比条 + 各账户汇总(支出\u002F收入\u002F净额)。\n\n#### 看账本\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"各账本收支\" | 默认本月 |\n\n返回：各账本汇总卡(生活\u002F旅行\u002F借贷:支出\u002F收入\u002F净额) + 占比。\n\n#### 看结构\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"收入和支出的结构\" | 默认本月 |\n\n返回：双环形图(收入来源结构 + 支出去向结构)。\n\n#### 看对比\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"这周和上周比\" | --period week |\n| \"本月和上月比\" | --period month |\n\n返回：本期\u002F上期的支出\u002F收入\u002F净额 + 变化率徽章(↑↓→)。\n\n#### 看双区间\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"5月和4月比\" | --from1 2026-05-01 --to1 2026-05-31 --from2 2026-04-01 --to2 2026-04-30 |\n| \"五一和端午比\" | 两段区间参数 |\n\n返回：双卡并排(区间一\u002F区间二) + 变化率 + 分类差异提示 TOP。\n\n#### 看同比\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"今年3月和去年比\" | --month 2026-03（默认本月） |\n\n返回：今年 vs 去年同月双卡 + 变化率。\n\n#### 看分类对比\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"5月和4月的分类差异\" | --from1\u002F--to1\u002F--from2\u002F--to2 两段区间 |\n\n返回：分类差异 TOP(金额变化最大\u002F笔数变化最大) 对比条形。\n\n#### 看趋势\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"近6个月走势\" | --months 6 |\n| \"近一年的趋势\" | --months 12（默认） |\n\n返回：SVG 双线折线(支出\u002F收入逐月) + 峰值标注 + 月均。\n\n#### 看分类趋势\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"餐饮的月度变化\" | --category 餐饮 --months 12（默认） |\n| \"出行近半年\" | --category 出行 --months 6 |\n\n返回：柱状\u002F折线(该分类逐月支出) + 月均 + 峰值月；分类 L1 前缀匹配。\n\n#### 看大额\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"大额支出TOP10\" | --limit 10（默认） |\n| \"5月花得最大的一笔\" | --from 2026-05-01 --to 2026-05-31 --limit 5 |\n\n返回：支出 TOP N 排行(金额\u002F分类\u002F日期\u002F备注)。\n\n#### 看高频\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"什么花得最频繁\" | 默认本月 |\n| \"近30天高频\" | --from\u002F--to + --limit 10（默认） |\n\n返回：分类笔数 TOP(笔数\u002F总金额\u002F单均\u002F最近一笔时间)。\n\n#### 看分布\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"金额区间分布\" | 默认本月支出 |\n| \"收入分布\" | --type income |\n\n返回：SVG 直方图(区间:\u003C10 \u002F 10-50 \u002F 50-100 \u002F 100-500 \u002F 500+) + 各区间笔数\u002F占比。\n\n#### 做统计\n\n无参数。返回总笔数、记账天数、日均笔数、首笔时间、最近记录时间 + 月度分布。\n\n#### 看活跃\n\n无参数。返回周几分布柱状(哪天记最多) + 时段分布(几点记)。\n\n#### 看洞察\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"AI 消费洞察\" | --months 6（默认） |\n| \"近90天的洞察\" | --months 3 |\n\n**流程**：AI 调 `analysis insight --months N --json` 拿**事实层**（period\u002Fcategory_dist\u002Fmonthly_trend\u002Ftop_expense + 均值\u002F中位数\u002F最大偏离度，纯计算无判定）→ AI 基于事实撰写解读（消费习惯\u002F异常波动\u002F省钱建议）→ `bill_inject.py insight --months N --ai-note \"消费习惯:…|异常波动:…|省钱建议:…\"` 生成洞察卡 HTML（解读卡 + 事实卡）交付。**AI 解读规则**：只引用事实层数字；不说事实层没有的话；建议可落地(如\"奶茶类支出占 18%，可减少频次\")；三段式用 `|` 分隔。\n\n#### 看异常\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"异常波动检测\" | --months 6（默认） |\n\n**流程**：AI 调 `analysis anomaly --months N --json` 拿**事实层**（月度序列 + 环比变化 + 分类环比暴涨）→ AI 判定异常（突增月\u002F暴涨分类，幅度≥50% 值得说）→ `bill_inject.py anomaly --months N --ai-note \"异常波动:…|建议核对:…\"` 生成检测 HTML（解读卡 + 事实卡）交付。**AI 判定规则**：幅度 \u003C 50% 不判异常；判异常必须附\"建议核对\"(一次性大额\u002F记错分类\u002F真实增长)。\n\n#### 看借贷\n\n无参数。返回借出未还总额 + 借入未还总额 + 对象列表 + 已还\u002F未还统计；聚合 `#借出\u002F#借入\u002F#未还\u002F#已还`。\n\n#### 看报销\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"报销汇总\" | 无参数 |\n\n返回待报销总额 + 已到账总额 + 历史报销列表；聚合 `#待报销\u002F#报销到账`。\n\n#### 看分期\n\n无参数。返回进行中分期卡(名目\u002F总额\u002F每期\u002F期数\u002F已还\u002F剩余期数+金额) + 历史分期；聚合 `#分期`。\n\n#### 看退款\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"退款统计\" | 无参数 |\n\n返回退款总额\u002F次数 + 月份分布 + 退款明细；聚合 `#退款`。\n\n### 开始使用流程细则（6 场景 · 2026-08-09 落地）\n\n初始化\u002F备份\u002F导入统一遵守（载体契约 G6\u002FG2\u002FG1）：\n\n- **初始化**：`setup init --check`（只读环境检测，向导步骤 1-2）→ 用户确认 → `setup init`（建库幂等自愈 + 只读验证）；重复执行安全。`setup init-status` 三重判定（数据存在 + schema 完整 + 版本 v2.0 特征列 deleted_at）；schema 过期 → 显式迁移提示（不自动迁移）。\n- **备份**：`setup backup-create`（db + goals.json → 备份目录 `\u003C时间戳>\u002F`）；`setup backup-list` 查看；`setup restore --name X` 恢复（**默认最新备份**，恢复前自动备份现状防覆盖丢失）。备份\u002F恢复包装公共层 `scripts\u002Fbackup.py`（T0 第 9 项）。\n- **导入**：G1 最小方案 = 通用 CSV + 列映射（**不逐软件适配**）。`setup import --file X [--mapping date=1,amount=3,category=2]` 自动猜测映射（表头关键词 日期\u002F金额\u002F分类\u002F备注\u002F账户\u002F账本\u002F收支方向），可显式覆盖；时间自动归一化（纯日期补 00:00:00）；收支方向列含\"收\"→正\u002F\"支\"→负，缺省按金额符号；逐行校验（分类白名单\u002F金额非零\u002F时间格式），失败行收集不中断；**外部导入缺省未删**（deleted_at=NULL · 软删契约）；缺文件路径 → AI 反问（不猜测）。\n- **向导 HTML 流程**：初始化\u002F恢复\u002F导入 = 向导型（HTML 预览确认 → AI 执行 CLI → 回执）；备份 = 回执型 HTML；状态 = 结果型 HTML。全部走 `scripts\u002Fsetup\u002Frender.py \u003Cmode>`，输出路径与 §12.A 一致。\n\n#### 初始化\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"帮我初始化\u002F开始使用\" | `setup init --check`（渲染向导）→ 确认 → `setup init` |\n| \"初始化了没\u002F能用吗\" | `setup init-status` → 状态 HTML（未就绪引导初始化） |\n\n流程：AI 调 `setup\u002Frender.py init-wizard`（4 步零决策向导：环境检测 → 数据目录确认 → 建库 → 只读验证；含「记第一笔」引导按钮）→ 用户确认（复制 prompt）→ AI 执行 `setup init` → 完成页。\n\n#### 备份 \u002F 恢复备份\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"备份一下\" | `setup backup-create` → 回执 HTML |\n| \"有哪些备份\" | `setup backup-list` → 列表 HTML（空态引导一键备份） |\n| \"从备份恢复\" \u002F \"恢复XX备份\" | `setup restore --name X`（默认最新）→ 向导确认 → 恢复回执 |\n\n#### 导入\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"导入 CSV 账单\" | 缺文件路径 → AI 反问；有路径 → `setup\u002Frender.py import --file X` 渲染列映射向导 |\n\n流程：HTML 列映射向导（前几行预览 + 自动猜测映射可改）→ 用户确认（复制 prompt 含文件路径 + 映射）→ AI 执行 `setup import --file X --mapping ...` → 文字回执（成功\u002F失败行数）。\n\n**HTML 渲染入口（开始使用域专用，不走 bill_inject）：**\n\n```bash\n# 向导型(4 步零决策 \u002F 恢复预览 \u002F 列映射)\npython3 scripts\u002Fsetup\u002Frender.py init-wizard\npython3 scripts\u002Fsetup\u002Frender.py restore [--name X]\npython3 scripts\u002Fsetup\u002Frender.py import --file x.csv\n# 结果型 \u002F 回执型\npython3 scripts\u002Fsetup\u002Frender.py init-status\npython3 scripts\u002Fsetup\u002Frender.py backup-create\npython3 scripts\u002Fsetup\u002Frender.py backup-list\n```\n\n### 账户流程细则（4 场景 · 2026-08-09 落地）\n\n账户 = `bills.account` 字段（无独立账户表）；账户清单 = `goals.json` 顶层 `accounts` 键（账户表，与目标域 `budgets\u002Fsavings` 键隔离）；余额 = 收支累计推算（该账户收入 − 支出）。\n\n**载体契约：**\n- 新增\u002F改名\u002F停用\u002F启用 → 写 `goals.json`（原子写，保留其他键）\n- 改名 → 同步更新 `bills.account`（历史流水保留，跟随新名）\n- 停用 → `disabled=true`，汇总灰显 + 不含于合计；历史记录保留\n- 转账 → **两笔记录**（会计两笔分录）：`转账\u002F转出` 支出(源账户) + `转账\u002F转入` 收入(目标账户)，账本=`转账`，备注=`#转账 转出至X \u002F 转入自X`；**不影响收支统计**（账户汇总收支 KPI 按「转账」分类排除，余额计算含转账使两账户正确增减）；其他域查询中与借贷先例一致如实展示\n\n#### 新增账户\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"新增账户 招行卡\" | --name 招行卡 |\n| \"加个花呗账户,信用类型\" | --name 花呗 --type 信用 |\n\n流程：采集表单（账户名 + 类型，已有账户可点选快速填写）→ 确认 → `account add` → 文字回执；重名 → 提示确认。\n\n#### 改账户\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"把招行卡改成招行工资卡\" | --name 招行卡 --new-name 招行工资卡 |\n| \"停用花呗\" | --name 花呗 --disable |\n\n流程：diff 确认表单（原账户卡 + 待修改表）→ 确认 → `account update` → 文字回执；账户不在账户表 → AI 反问（不猜测）。\n\n#### 账户转账\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"从支付宝转 500 到招行卡\" | --amount 500 --from 支付宝 --to 招行卡 |\n\n流程：采集表单（金额\u002F从账户\u002F到账户\u002F时间，账户建议点选）→ 确认 → `account transfer` → 文字回执两笔（转出支出 + 转入收入）；同账户\u002F负数 → AI 反问。\n\n#### 看账户汇总\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"看账户汇总\" \u002F \"账户余额\" | account summary |\n\n结果型 HTML：总余额\u002F总收入\u002F总支出\u002F净额\u002F转账 KPI + 各账户余额卡（收支\u002F转入转出\u002F笔数\u002F最近一笔；停用灰显 + 未登记标记）+ 最近流水摘要；空账户表 → 空态引导。\n\n**HTML 渲染入口（账户域专用，不走 bill_inject）：**\n\n```bash\n# 采集\u002F选择(过程型表单)\npython3 scripts\u002Faccount\u002Frender.py add-form --name 微信 --type 支付\npython3 scripts\u002Faccount\u002Frender.py transfer-form --amount 200 --from 支付宝 --to 招行卡\npython3 scripts\u002Faccount\u002Frender.py update-form --name 招行卡 --new-name 招行工资卡\npython3 scripts\u002Faccount\u002Frender.py update-form --name 花呗 --disable\n# 查看(结果型)\npython3 scripts\u002Faccount\u002Frender.py view\n```\n\n### 目标域流程细则（4 场景 · 2026-08-09 落地 · 载体 goals.json）\n\n目标域 4 场景统一遵守：\n\n- **载体**：`goals.json`（与 db 同级，跟随 `SKILLS_DB_PATH`，备份机制已包含）。结构 = `{\"budgets\": [...], \"savings\": [...]}`，全部由 CLI 读写，AI 不手改。\n- **实际数据 = bills 聚合**：预算执行 = 当月支出 vs 预算；目标进度 = 目标期内收入-支出累计（目标期 = 创建当月起 ~ 截止日\u002F今天）。\n- **渲染**：全部走 `scripts\u002Fgoal\u002Frender.py \u003Cmode>`（采集表单 ×2 + 进度条视图 ×2），结果视图带「复制数据 \u002F 复制日志」（B1 toast）。\n\n#### 设定预算\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"设个3000的月预算\" | `set-budget --amount 3000`（默认本月） |\n| \"8月餐饮预算500\" | `set-budget --amount 500 --month 2026-08 --category 餐饮` |\n| \"预算提到4000\" | 先 `budget` 查现有 → 冲突提示 → 用户确认后加 `--force` |\n\n**覆盖语义（数据契约）**：同月同类预算已存在 → CLI 返回 `conflict` + 原值（不覆盖）；AI 展示「已存在 X 元预算，确认覆盖为 Y？」→ 用户确认 → 加 `--force` 重跑。采集表单在渲染时自动查冲突并在表单顶部展示警示条。\n\n#### 看预算\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"预算花到哪了\" | `budget`（默认本月） |\n| \"8月的预算执行\" | `budget --month 2026-08` |\n\n返回：结果型 HTML（进度条：预算 vs 实际 \u002F 剩余 \u002F 超支提示）。每预算进度条含状态机：≤90% 预算内（绿）\u002F 90%~100% 接近上限（橙）\u002F >100% 已超支（红，警示色）。KPI 汇总口径：总预算存在 → （总预算金额，当月全部支出）；否则 → 分类预算之和 vs 分类实际之和（避免重复计数）。**月底预测（2026-08-09 门禁 B 复查采纳）**：当月预算显示「日均 X 元 · 按此节奏月底预计 Y 元（预计超\u002F省提示）」（日均 = 实际 ÷ 已过天数；过去月预测 = 实际；未来月无预测）；超支项 KPI 无超支时显示绿色「✓ 无」。\n\n#### 设定目标\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"存个换手机的目标10000\" | `set-saving --name 换手机 --amount 10000` |\n| \"年底前存到1万\" | `set-saving --name X --amount 10000 --deadline 2026-12-31` |\n\n#### 看目标\n\n| 用户说 | 解析结果 |\n|--------|----------|\n| \"目标存到多少了\" | `saving` |\n| \"看换手机那个目标\" | `saving --name 换手机` |\n\n返回：结果型 HTML（各目标进度：已存 \u002F 目标 \u002F 百分比 \u002F 剩余 \u002F 预计达成日）。预计达成日 = 按月均净存（已存 ÷ 目标期月数）推算；月均 ≤ 0 → 暂无预计；已达 → 标记 🎉；预计日晚于截止日 → 进度落后（红）。**达标所需月存（2026-08-09 门禁 B 复查采纳）**：带截止日且未达成的目标显示「截止前达标还需每月 X 元」（剩余 ÷ 剩余月数，本月内到期按 1 个月计）。\n\n### 写入流程细则（内置能力 + 特殊场景 · 2026-08-08 定稿）\n\n所有写入类场景（记支出\u002F记收入\u002F拍账单\u002F批量录入\u002F记退款\u002F记借出\u002F记借入\u002F记收回\u002F记偿还\u002F记分期）统一遵守：\n\n#### 0. 过程型 HTML 硬约束（2026-08-13 · #298 缓解）\n\n所有写入类确认页\u002F采集表单**只能由对应渲染脚本产出**（`render_write.py` \u002F `link\u002Fcli.py` 等），**禁止 AI 手写 HTML**。AI 的职责 = 解析用户意图 + 把字段当参数传给脚本。字段推断（账户\u002F分类\u002F账本）传得出就传、传不出就不传，**不得编造**；推断已有项配 `--\u003Cfield>-source inferred`、推荐新建配 `--\u003Cfield>-source recommended_new`（缺省只传值 → 值在候选内=已有、否则=推荐新建）；预置值用户可改可清空（详见各场景小节，拍账单见上文「确认页生成硬约束」）。\n\n#### 1. 分类选择器（过程型 HTML 必用）\n\n信息不全面时，AI 生成过程型 HTML（采集表单）让用户补全：\n- **AI 智能推荐**：根据用户话语义 + 现有分类库（references\u002Fcategories.md）推荐：\n  - 已有分类 → 标记「AI 推荐的已有分类」\n  - 库里没有 → 标记「推荐新建分类」\n- **手动选择**：下拉列出全部现有分类（L1\u002FL2\u002FL3 层级）\n- **新建分类**：按钮 → 输入新分类名 → **校验相似**（已有「餐饮\u002F外卖」时提示「是否使用已有的?」→ 拦一字之差）\n- 原则：分类规范是数据质量核心，宁可让用户选，不让 AI 自造\n\n#### 2. 智能预填（记支出\u002F记收入）\n\n用户话里有明确名目（如「交房租」）时：\n- AI 检索历史同类记录（同分类 或 备注关键词匹配）\n- 有 → 过程型 HTML 预填上次值（金额\u002F分类\u002F账户\u002F账本\u002F备注），标注「⚡ 根据 X 月 X 日的房租记录预填,可直接确认或修改」\n- 无历史 → 正常空表单（不猜、不预填）\n- **预填只是省填写**：不自动确认，用户可改可忽略\n\n#### 3. 重复检测提示（写入时）\n\n写入前 AI 检索近期相似记录（同分类 + 同金额 + 时间接近）：\n- 疑似重复 → 提示「这笔和 X 月 X 日的 35 元午饭很像,确认要再记一笔吗?」\n- 用户确认 → 继续写入；否认 → 正常写入\n\n#### 4. tag 约定（备注 #tag）\n\n| tag | 含义 | 使用场景 |\n|---|---|---|\n| #待报销 | 垫付待报销 | 记报销 |\n| #报销到账 | 报销已回款 | 报销到账 |\n| #退款 | 收到的退款 | 记退款 |\n| #已退款 | 原支出已冲销 | 记退款（标记原支出） |\n| #借出 \u002F #借入 | 借贷方向 | 记借出 \u002F 记借入 |\n| #未还 \u002F #已还 | 借贷状态机 | 借出\u002F借入（#未还）→ 收回\u002F偿还（#已还） |\n| #收回 \u002F #偿还 | 借贷回款 | 记收回 \u002F 记偿还 |\n| #分期 | 分期分摊记录 | 记分期（每笔备注 名目 第X期\u002FN） |\n\n#### 5. 特殊场景 AI 流程\n\n**记退款**：① 查原支出（描述定位）② 记收入（分类=退款\u002F冲销，备注 `#退款 原支出:[ID\u002F描述]`）③ 原支出备注追加 `#已退款` ④ 回执两笔；找不到原支出 → AI 反问\n\n**记借出\u002F记借入**：记支出\u002F收入（分类=借贷\u002F借出|借入，账本=借贷，备注=`#借出 #借给{对象} #未还` \u002F `#借入 #向{对象}借 #未还`）\n\n**记收回\u002F记偿还**：① 查 `#未还` 记录定位（对象\u002F金额匹配）② 记反向（收回=收入 \u002F 偿还=支出，分类=借贷\u002F收回|偿还，账本=借贷，备注=`#收回 原记录ID`）③ 原记录备注 `#未还`→`#已还` ④ 回执两笔\n\n**记分期**：每期=总价÷期数（除不尽首期补差额）→ 写 N 笔支出（分类=分期\u002F{名目}，金额=每期，时间=首期日起每月同日，备注=`#分期 {名目} 第X期\u002FN`）→ 向导确认（分摊预览）→ 回执总览；记录=消费分摊，写入即固定（提前还清不影响记录）\n\n### 联动流程细则（买东西联动 \u002F 吃饭联动 · 2026-08-09 落地）\n\n联动域 2 场景 = **场景簇 + 回执按钮**（G2 决议）：主操作 = 记支出（复用 write add），联动 = 回执按钮（可选）。\n\n#### 买东西联动（唤醒词：买东西）\n\n1. AI 解析 金额\u002F物品\u002F分类（选填，默认 居家\u002F家电）→ 调 `link\u002Fcli.py form purchase` 渲染采集表单（含联动预告条）\n2. 用户确认（复制 prompt）→ AI 调 `write\u002Fcli.py add` 记支出（分类\u002F金额\u002F备注，备注建议含物品名，如 `空气炸锅`）\n3. AI 调 `link\u002Fcli.py receipt purchase --id \u003CID> --item \u003C物品>` 渲染回执 HTML：\n   - 已记录账单卡（ID\u002F金额\u002F分类\u002F账户\u002F账本\u002F时间\u002F备注）\n   - 联动按钮「🔗 同时录入居家管家」→ 点击复制联动 prompt（预告式：请加载「居家管家」技能,帮我录入刚买的物品(唤醒词:录物品)：物品\u002F数量\u002F金额\u002F分类）→ 用户粘贴给 AI → AI 调居家管家「录物品」\n   - 「↩ 撤销这笔」+ 复制数据\u002F复制日志（08 硬标准）\n4. 用户只记账不联动 → 正常回执，按钮可选不用\n\n#### 吃饭联动（唤醒词：吃饭）\n\n1. AI 解析 金额\u002F吃了\u002F分类（选填，默认 餐饮）→ 调 `link\u002Fcli.py form meal` 渲染采集表单\n2. 用户确认 → AI 调 `write\u002Fcli.py add` 记支出\n3. AI 调 `link\u002Fcli.py receipt meal --id \u003CID> --ate \u003C吃了>` 渲染回执 HTML：\n   - 联动按钮「🔗 同时记卡路里」→ 点击复制联动 prompt（请加载「卡路里」技能,帮我记一餐(唤醒词:记一餐)：吃了\u002F餐别\u002F备注）→ AI 调卡路里「记一餐」\n\n**通用**：联动 prompt 只在回执按钮上（预告式，点击才复制）；缺金额 → AI 反问（不猜测）；联动 = 可选，不强制。\n\n### Step 4：执行指令\n\n```bash\n# 记支出(多级分类:L1\u002FL2\u002FL3 用 \u002F 分隔)\npython3 scripts\u002Fscripts\u002Fwrite\u002Fcli.py add --category 餐饮\u002F外卖\u002F午餐 --amount -35.0 --note \"午饭\"\npython3 scripts\u002Fscripts\u002Fwrite\u002Fcli.py add --category 餐饮\u002F咖啡奶茶\u002F奶茶 --amount -25.0\n\n# 改记录(按 ID)\npython3 scripts\u002Fscripts\u002Fwrite\u002Fcli.py update --id 123 --note \"午饭+牛奶\"\npython3 scripts\u002Fscripts\u002Fwrite\u002Fcli.py update --id 123 --amount -38.0 --category 餐饮\npython3 scripts\u002Fscripts\u002Fwrite\u002Fcli.py update --id 123 --amount -50 --account 微信 --ledger 餐饮\n\n# 记收入\npython3 scripts\u002Fscripts\u002Fwrite\u002Fcli.py add --category 工资\u002F基本工资 --amount 8000.0 --note \"5月工资\"\n\n# 查今天\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py summary\n\n# 查昨天 \u002F 查某天\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py list --date 2026-05-27\n\n# 查周 \u002F 查月 \u002F 查区间\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py list --from 2026-05-01 --to 2026-05-31\n\n# 查分类\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py list --category 餐饮\n\n# 查最近\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py recent --limit 10\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py recent --days 7 --sort amount_desc\n\n# 搜备注\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py search \"午饭\"\n\n# 查标签(#tag 聚合)\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py tag --tag 旅行\n\n# 查欠款 \u002F 查待报销 \u002F 查分期(状态族聚合)\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py debt --target 小明\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py reimburse\npython3 scripts\u002Fscripts\u002Fquery\u002Fcli.py installment --name 手机\n\n# 看月度\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py monthly --month 2026-05\n\n# 看年度 \u002F 看周报\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py yearly --year 2026\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py week\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py week --offset 1\n\n# 看总览(区间)\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py overview --from 2026-05-01 --to 2026-05-31\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py overview --month 2026-05\n\n# 看分类(L1 聚合 + 环形图)\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py category\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py category --from 2026-05-01 --to 2026-05-31 --account 支付宝\n\n# 看账户 \u002F 看账本 \u002F 看结构\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py account\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py ledger\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py structure\n\n# 看对比\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py compare --period week\n\n# 看双区间 \u002F 看同比 \u002F 看分类对比\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py range_compare --from1 2026-05-01 --to1 2026-05-31 --from2 2026-04-01 --to2 2026-04-30\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py yoy --month 2026-05\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py cat_compare --from1 2026-05-01 --to1 2026-05-31 --from2 2026-04-01 --to2 2026-04-30\n\n# 看趋势 \u002F 看分类趋势\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py trend --months 12\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py cat_trend --category 餐饮 --months 6\n\n# 看大额 \u002F 看高频 \u002F 看分布\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py top --limit 10\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py top_freq\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py distribution\n\n# 做统计 \u002F 看活跃\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py stats\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py activity\n\n# 看洞察 \u002F 看异常(洞察生成器事实 + AI 解读)\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py insight --months 6\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py anomaly --months 6\n\n# 看借贷 \u002F 看报销 \u002F 看分期 \u002F 看退款(状态聚合)\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py debt_summary\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py reimburse_summary\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py installment_summary\npython3 scripts\u002Fscripts\u002Fanalysis\u002Fcli.py refund_summary\n\n# 账户域(账户表 = goals.json accounts;HTML 渲染走 scripts\u002Faccount\u002Frender.py)\npython3 scripts\u002Faccount\u002Fcli.py add --name 招行卡 --type 银行卡\npython3 scripts\u002Faccount\u002Fcli.py update --name 招行卡 --new-name 招行工资卡\npython3 scripts\u002Faccount\u002Fcli.py update --name 花呗 --disable\npython3 scripts\u002Faccount\u002Fcli.py transfer --amount 500 --from 支付宝 --to 招行卡\npython3 scripts\u002Faccount\u002Fcli.py summary\n\n# 开始使用域(初始化\u002F备份\u002F导入;HTML 渲染走 scripts\u002Fsetup\u002Frender.py)\npython3 scripts\u002Fsetup\u002Fcli.py init --check\npython3 scripts\u002Fsetup\u002Fcli.py init\npython3 scripts\u002Fsetup\u002Fcli.py init-status\npython3 scripts\u002Fsetup\u002Fcli.py backup-create\npython3 scripts\u002Fsetup\u002Fcli.py backup-list\npython3 scripts\u002Fsetup\u002Fcli.py restore --name 20260809_120000\npython3 scripts\u002Fsetup\u002Fcli.py import --file x.csv --mapping date=1,amount=3,category=2\n```\n\n### Step 5：回复用户\n\n```\n✓ 已记录：餐饮 -35.00\n```\n\n### Step 6：HTML 可视化查询（v2.3 · 默认工作流）\n\n> **🎯 默认行为（§04 原则 11 HTML-First）：**\n> 所有查询\u002F分析\u002F统计类唤醒词命中后，AI **默认** 调用 `scripts\u002Fbill_inject.py` 生成可视化 HTML 交付给用户。\n> 文字答仅在用户**明确说**「不要 HTML」「给我文字版」「就告诉我数字」时才走。\n\n**支持 25 种查询\u002F分析类型（全部默认 HTML）：**\n\n| 类型 | CLI 子命令 | 适用场景 | bill_inject.py 调用 |\n|---|---|---|---|\n| 今日摘要 | `summary` | 看今日收支 | `bill_inject.py summary` |\n| 列表 | `list` \u002F `recent` \u002F `search` | 看记录明细 | `bill_inject.py list --date 2026-07-27` |\n| 查标签 | `tag` | #tag 聚合 | `bill_inject.py tag --tag 旅行` |\n| 查欠款 | `debt` | 未还借贷聚合 | `bill_inject.py debt` |\n| 查待报销 | `reimburse` | #待报销 清单 | `bill_inject.py reimburse` |\n| 查分期 | `installment` | #分期 分期卡 | `bill_inject.py installment` |\n| 月度汇总 | `monthly` | 看月度分类排行 | `bill_inject.py monthly --month 2026-07` |\n| 年度汇总 | `yearly` | 看年度趋势 | `bill_inject.py yearly --year 2026` |\n| 本周简报 | `week` | 本周 vs 上周 | `bill_inject.py week` |\n| 收支总览 | `overview` | 看区间 4 KPI + 日均 | `bill_inject.py overview --from ... --to ...` |\n| 分类占比 | `category` | 看分类环形图(L1 聚合) | `bill_inject.py category --month 2026-07` |\n| 账户占比 | `account` | 看各账户花销 | `bill_inject.py account` |\n| 账本汇总 | `ledger` | 看各账本收支 | `bill_inject.py ledger` |\n| 收支结构 | `structure` | 看收入来源\u002F支出去向 | `bill_inject.py structure` |\n| 周期对比 | `compare` | 本周 vs 上周 \u002F 本月 vs 上月 | `bill_inject.py compare --period week` |\n| 双区间对比 | `range_compare` | 两段时间对比 | `bill_inject.py range_compare --from1 ... --to1 ... --from2 ... --to2 ...` |\n| 同比对比 | `yoy` | 今年 vs 去年同月 | `bill_inject.py yoy --month 2026-07` |\n| 分类对比 | `cat_compare` | 分类差异 TOP | `bill_inject.py cat_compare --from1 ... --to1 ... --from2 ... --to2 ...` |\n| 收支趋势 | `trend` | 逐月折线(支出\u002F收入) | `bill_inject.py trend --months 12` |\n| 分类趋势 | `cat_trend` | 某分类逐月变化 | `bill_inject.py cat_trend --category 餐饮 --months 6` |\n| 大额排行 | `top` | 支出 TOP N | `bill_inject.py top --limit 10` |\n| 高频排行 | `top_freq` | 分类笔数 TOP | `bill_inject.py top_freq` |\n| 金额分布 | `distribution` | 直方图(5 区间) | `bill_inject.py distribution` |\n| 记账统计 | `stats` | 看总笔数 \u002F 天数 | `bill_inject.py stats` |\n| 活跃度 | `activity` | 周几\u002F时段分布 | `bill_inject.py activity` |\n| 消费洞察 | `insight` | AI 洞察(事实 + 解读) | `bill_inject.py insight --months 6` |\n| 异常检测 | `anomaly` | 突增月\u002F暴涨分类 | `bill_inject.py anomaly --months 6` |\n| 借贷总览 | `debt_summary` | 借出\u002F借入未还 + 对象 | `bill_inject.py debt_summary` |\n| 报销汇总 | `reimburse_summary` | 待报销 + 已到账 | `bill_inject.py reimburse_summary` |\n| 分期总览 | `installment_summary` | 进行中 + 历史分期 | `bill_inject.py installment_summary` |\n| 退款统计 | `refund_summary` | 退款总额\u002F次数\u002F分布 | `bill_inject.py refund_summary` |\n\n> **账户域例外**：账户类唤醒词（新增账户\u002F改账户\u002F账户转账\u002F看账户汇总）不走 bill_inject，走 `scripts\u002Faccount\u002Frender.py`（见「账户流程细则」），输出路径与 §12.A 一致。\n\n**调用流程（AI 必走）：**\n\n```bash\n# 标准路径（自动调 CLI + 注入 HTML 模板 + 输出文件）\npython3 scripts\u002Fbill_inject.py summary\npython3 scripts\u002Fbill_inject.py monthly --month 2026-07\npython3 scripts\u002Fbill_inject.py category --month 2026-07\npython3 scripts\u002Fbill_inject.py range_compare --from1 2026-07-01 --to1 2026-07-31 --from2 2026-06-01 --to2 2026-06-30\npython3 scripts\u002Fbill_inject.py insight --months 6\npython3 scripts\u002Fbill_inject.py search \"咖啡\"\n```\n\n**错误处理（§04 原则 11 反模式 #3）：**\n- HTML 生成失败 → **保留错误页 HTML** 交付给用户（bill_inject.py 自动处理）\n- ❌ **禁止**降级为文字答（这是 fail mode,不是 fallback）\n- 用户明确要文字 → 才走 `python3 scripts\u002Fscripts\u002Fquery\u002Fcli.py summary`（无 --json）\n\n**默认输出路径（v2.5 同步卡路里 §4.1）**：`$DATA_DIR\u002Fbiscuit_accountant_html\u002F\u003Ccommand_zh>_\u003CYYYYMMDD>_\u003CHHMMSS>[_N].html`\n  - `DATA_DIR` 跟随 `SKILLS_DB_PATH` 环境变量（fallback `D:\u002F.db\u002F`）\n  - 中文化 command 名：summary → 今日摘要 \u002F monthly → 月度汇总 \u002F overview → 收支总览\n  - 同秒冲突自动追加 `_2` \u002F `_3` 后缀\n\n**指定输出路径**：`python3 scripts\u002Fbill_inject.py summary --out C:\u002FUsers\u002Fxxx\u002FDesktop\u002Fx.html`\n\n**交付给用户**：用 `\u003Cmedia src=\"...\" type=\"file\" \u002F>` 把生成的 HTML 文件交付，用户双击在浏览器打开即可看到可视化效果。\n\n**模板特性（query_view.html \u002F 分析\u002Fanalysis_view.html）**：\n- 单文件离线运行（无 CDN \u002F 无 chart.js 依赖）\n- Apple 视觉风格（圆角卡片 \u002F 系统字体 \u002F 蓝橙绿红配色）\n- 自适应桌面 + 平板 + 手机\n- 5 种状态：正常 \u002F 空态 \u002F 缺数据 \u002F 错误 \u002F 离线\n- 查询域：SVG 环形图（breakdown 用）\n- 分析域（templates\u002F分析\u002Fanalysis_view.html · 2026-08-09 实施）：SVG 环形\u002F柱状\u002F双线折线\u002F直方 4 种图表，离线可用；25 场景全渲染器（汇总\u002F结构\u002F对比\u002F趋势\u002F金额\u002F统计洞察\u002F状态聚合）\n- 一键复制 ID 回 AI（每条记录含 ID）\n\n**目标域 HTML（goal\u002Frender.py · 2026-08-09 落地）：**\n\n| 场景 | CLI 子命令 | 模板 | goal\u002Frender.py 调用 |\n|---|---|---|---|\n| 设定预算（采集表单） | `set-budget` | `templates\u002F目标\u002Fbudget_form.html` | `goal\u002Frender.py set-budget --amount 3000 --month 2026-08` |\n| 看预算（进度条） | `budget` | `templates\u002F目标\u002Fbudget_view.html` | `goal\u002Frender.py budget --month 2026-08` |\n| 设定目标（采集表单） | `set-saving` | `templates\u002F目标\u002Fsaving_form.html` | `goal\u002Frender.py set-saving --name 换手机 --amount 10000` |\n| 看目标（进度条） | `saving` | `templates\u002F目标\u002Fsaving_view.html` | `goal\u002Frender.py saving` |\n\n目标域结果视图同样默认 HTML 交付（进度条 + 复制数据\u002F日志），采集表单默认「填写确认 + 复制确认 prompt」。\n\n**调用流程（AI 必走）：**\n\n```bash\n# 标准路径（自动调 CLI + 注入 HTML 模板 + 输出文件）\npython3 scripts\u002Fgoal\u002Frender.py set-budget --amount 3000\npython3 scripts\u002Fgoal\u002Frender.py budget\npython3 scripts\u002Fgoal\u002Frender.py set-saving --name 换手机 --amount 10000 --deadline 2026-12-31\npython3 scripts\u002Fgoal\u002Frender.py saving\n```\n\n**错误处理（§04 原则 11 反模式 #3）：**\n- HTML 生成失败 → **保留错误页 HTML** 交付给用户（goal\u002Frender.py 自动处理）\n- ❌ **禁止**降级为文字答（这是 fail mode,不是 fallback）\n- 用户明确要文字 → 才走 `python3 scripts\u002Fscripts\u002Fgoal\u002Fcli.py budget`（无 --json）\n\n**默认输出路径（v2.5 同步卡路里 §4.1）**：`$DATA_DIR\u002Fbiscuit_accountant_html\u002F\u003Ccommand_zh>_\u003CYYYYMMDD>_\u003CHHMMSS>[_N].html`\n  - `DATA_DIR` 跟随 `SKILLS_DB_PATH` 环境变量（fallback `D:\u002F.db\u002F`）\n  - 中文化 command 名：set-budget → 设定预算 \u002F budget → 看预算 \u002F set-saving → 设定目标 \u002F saving → 看目标\n  - 同秒冲突自动追加 `_2` \u002F `_3` 后缀\n\n**指定输出路径**：`python3 scripts\u002Fgoal\u002Frender.py budget --out C:\u002FUsers\u002Fxxx\u002FDesktop\u002Fx.html`\n\n**交付给用户**：用 `\u003Cmedia src=\"...\" type=\"file\" \u002F>` 把生成的 HTML 文件交付，用户双击在浏览器打开即可看到可视化效果。\n\n**模板特性（templates\u002F目标\u002F*.html）**：\n- 单文件离线运行（无 CDN \u002F 无图表库依赖）\n- Apple 视觉风格（圆角卡片 \u002F 系统字体 \u002F 蓝橙绿红配色）\n- 自适应桌面 + 平板 + 手机\n- 结果视图 5 种状态：正常 \u002F 空态 \u002F 缺数据 \u002F 错误 \u002F 离线\n- 进度条组件（预算 vs 实际 \u002F 已存 vs 目标）+ 状态机警示色（预算内绿 \u002F 接近上限橙 \u002F 已超支红；目标进行中蓝 \u002F 落后红 \u002F 达成绿）\n- 采集表单：字段回显 + 覆盖冲突警示条 + 一键复制确认 prompt（对齐 scenes\u002Fgoal.yaml）\n\n**开始使用域 HTML（setup\u002Frender.py · 2026-08-09 落地）：**\n\n| 场景 | CLI 子命令 | 模板 | setup\u002Frender.py 调用 |\n|---|---|---|---|\n| 首次使用向导（4 步零决策） | `init` \u002F `init --check` | `templates\u002F开始使用\u002Finit_wizard.html` | `setup\u002Frender.py init-wizard` |\n| 初始化状态（三重判定） | `init-status` | `templates\u002F开始使用\u002Finit_status.html` | `setup\u002Frender.py init-status` |\n| 一键备份（回执） | `backup-create` | `templates\u002F开始使用\u002Fbackup.html` | `setup\u002Frender.py backup-create` |\n| 查看备份（列表） | `backup-list` | `templates\u002F开始使用\u002Fbackup_list.html` | `setup\u002Frender.py backup-list` |\n| 从备份恢复（向导） | `restore --name X` | `templates\u002F开始使用\u002Frestore.html` | `setup\u002Frender.py restore [--name X]` |\n| 导入 CSV（列映射向导） | `import --file X` | `templates\u002F开始使用\u002Fimport.html` | `setup\u002Frender.py import --file X` |\n\n开始使用域场景默认 HTML 交付（向导\u002F回执\u002F结果型 + 复制数据\u002F日志）；备份\u002F恢复\u002F导入包装公共层 `backup.py`（G2 决议 备份 = db + goals.json）。\n\n**调用流程（AI 必走）：**\n\n```bash\n# 标准路径(向导\u002F回执\u002F结果 → HTML;执行走 setup\u002Fcli.py)\npython3 scripts\u002Fsetup\u002Frender.py init-wizard\npython3 scripts\u002Fsetup\u002Frender.py init-status\npython3 scripts\u002Fsetup\u002Frender.py backup-create\npython3 scripts\u002Fsetup\u002Frender.py backup-list\npython3 scripts\u002Fsetup\u002Frender.py restore\npython3 scripts\u002Fsetup\u002Frender.py import --file x.csv\n# 执行侧(向导确认后)\npython3 scripts\u002Fsetup\u002Fcli.py init\npython3 scripts\u002Fsetup\u002Fcli.py import --file x.csv --mapping date=1,amount=3,category=2\n```\n\n**错误处理（§04 原则 11 反模式 #3）：**\n- HTML 生成失败 \u002F 业务失败（无备份可恢复 \u002F 文件不存在 \u002F 缺文件路径）→ **保留错误页 HTML** 交付给用户（setup\u002Frender.py 自动处理，含 5 状态契约错误回执）\n- ❌ **禁止**降级为纯文字答（这是 fail mode,不是 fallback）\n\n**默认输出路径（v2.5 同步卡路里 §4.1）**：`$DATA_DIR\u002Fbiscuit_accountant_html\u002F\u003Ccommand_zh>_\u003CYYYYMMDD>_\u003CHHMMSS>[_N].html`\n  - 中文化 command 名：init-wizard → 初始化向导 \u002F init-status → 初始化状态 \u002F backup-create → 一键备份 \u002F backup-list → 查看备份 \u002F restore → 从备份恢复 \u002F import → 导入CSV\n\n**指定输出路径**：`python3 scripts\u002Fsetup\u002Frender.py restore --out C:\u002FUsers\u002Fxxx\u002FDesktop\u002Fx.html`\n\n**交付给用户**：用 `\u003Cmedia src=\"...\" type=\"file\" \u002F>` 把生成的 HTML 文件交付，用户双击在浏览器打开即可看到可视化效果。\n\n**模板特性（templates\u002F开始使用\u002F*.html）**：\n- 单文件离线运行（无 CDN \u002F 无图表库依赖）\n- Apple 视觉风格（圆角卡片 \u002F 系统字体 \u002F 蓝橙绿红配色）\n- 自适应桌面 + 平板 + 手机\n- 向导型步骤条（初始化 4 步 \u002F 恢复 3 步 \u002F 导入列映射）+ 完成态「记第一笔」引导按钮\n- 初始化状态三重判定卡（存在 \u002F schema \u002F 版本）+ 迁移提示条\n- 备份列表空态引导一键备份;恢复向导覆盖警示（恢复前自动备份现状）\n\n### Step 7：HELP 能力速查（v4.0 · Base 参数化 · #303）\n\n当用户说「饼干记账 HELP」「饼干记账 帮助」「查帮助」「能做什么」时，AI 调用 `scripts\u002Frender_help.py` 生成 HELP HTML 并交付。\n\n```bash\n# 默认输出\npython3 scripts\u002Frender_help.py\n# 输出路径（v2.5.1）：$DATA_DIR\u002Fbiscuit_accountant_html\u002F饼干记账_HELP_\u003CYYYYMMDD>_\u003CHHMMSS>[_N].html\n\n# 指定输出\npython3 scripts\u002Frender_help.py --out \u002Fpath\u002Fto\u002Fhelp.html\n\n# 仅校验数据源与契约（CI 用）\npython3 scripts\u002Frender_help.py --check\n```\n\n**HELP HTML 契约（§07 · #303 重构）：**\n- 来源：`references\u002Fscenarios.yaml`（合并器汇总 · 7 域 scenes yaml 唯一事实源）+ `公共组件\u002Fassets\u002Fhelp_template.html`（Base 参数化模板 · scene-data 契约 v1 · V4.16 定稿）\n- 展平（技能侧 · render_help.py v4.0）：7 域 → 2 级分组（groups → subgroups）+ 场景卡；wake_word 层消失并入场景卡 chip；types 徽章 = type 单值包数组；**源 yaml 3 层结构不动**\n- 展示 **7 域**（写入 \u002F 查询 \u002F 分析 \u002F 目标 \u002F 账户 \u002F 联动 \u002F 开始使用）× **70 个功能唤醒词（+4 条 HELP）** × **71 个合法场景**\n- 子功能组默认展开；点场景卡开 Sheet 弹层看 prompt 详情 + 复制\n- 每场景「复制」按钮 + Base hm-toast 通知（toast(msg, detail, opts) · 样式由公共组件决定）\n- 粘性搜索栏（跨 Tab 匹配 + 自动跳转 + 高亮）+ 底部 Tab 栏（7 域 + 关于）\n- 未初始化时显示「首次使用」横幅（复制初始化 prompt，与 `setup_init_wizard` 场景逐字一致）\n- HELP 自身 4 条唤醒词经 meta_blocks 透传（页面不渲染展示，与卡路里一致）；联系作者 \u002F 版本在「关于」Tab\n\n---\n\n## 命令行参考\n\n共 10 个子命令：\n\n| 子命令 | 说明 | 必需参数 | 可选参数 |\n|--------|------|----------|----------|\n| `add` | 添加账单 | `--category`, `--amount` | `--time`, `--account`, `--ledger`, `--currency`, `--note` |\n| `update` | 修改账单 | `--id` (必需) | `--category`, `--amount`, `--time`, `--account`, `--ledger`, `--currency`, `--note`(至少传一个) |\n| `list` | 查询记录 | （无） | `--date`, `--from`+`--to`, `--category`, `--account`, `--ledger`, `--type`(expense\u002Fincome), **`--json`** |\n| `search` | 搜索备注 | `keyword`（位置参数） | **`--json`** |\n| `summary` | 今日摘要 | （无） | **`--json`** |\n| `tag` | 查标签(#tag 聚合) | `--tag` | **`--json`** |\n| `debt` | 查欠款(#未还 聚合) | （无） | `--target`, **`--json`** |\n| `reimburse` | 查待报销(#待报销) | （无） | **`--json`** |\n| `installment` | 查分期(#分期 聚合) | （无） | `--name`, **`--json`** |\n| `monthly` | 月度汇总 | `--month` | **`--json`** |\n| `recent` | 最近N条 | （无） | `--limit` (默认 10), `--days`, `--sort`(amount_desc\u002Famount_asc), **`--json`** |\n| `yearly` | 年度汇总 | （无） | `--year` (默认今年), **`--json`** |\n| `week` | 本周简报 | （无） | `--offset` (0=本周\u002F1=上周), **`--json`** |\n| `overview` | 收支总览 | （无） | `--month` (默认当月) 或 `--from`+`--to` (区间), **`--json`** |\n| `category` | 分类占比(L1 聚合) | （无） | `--month` 或 `--from`+`--to`, `--account`, `--type`(expense\u002Fincome), **`--json`** |\n| `account` | 账户占比 | （无） | `--month` 或 `--from`+`--to`, **`--json`** |\n| `ledger` | 账本汇总 | （无） | `--month` 或 `--from`+`--to`, **`--json`** |\n| `structure` | 收支结构(双环形) | （无） | `--month` 或 `--from`+`--to`, **`--json`** |\n| `compare` | 周期对比 | （无） | `--period` (week\u002Fmonth, 默认 week), **`--json`** |\n| `range_compare` | 双区间对比 | （无） | `--from1`+`--to1`+`--from2`+`--to2`(全必填), **`--json`** |\n| `yoy` | 同比对比 | （无） | `--month` (默认本月), **`--json`** |\n| `cat_compare` | 分类对比 | （无） | `--from1`+`--to1`+`--from2`+`--to2`(全必填), **`--json`** |\n| `trend` | 收支趋势 | （无） | `--months` (默认 12), **`--json`** |\n| `cat_trend` | 分类趋势 | （无） | `--category`, `--months` (默认 12), **`--json`** |\n| `top` | 大额排行 | （无） | `--limit` (默认 10), `--from`+`--to`, **`--json`** |\n| `top_freq` | 高频排行 | （无） | `--limit` (默认 10), `--from`+`--to`, **`--json`** |\n| `distribution` | 金额分布 | （无） | `--month` 或 `--from`+`--to`, `--type`(expense\u002Fincome, 默认 expense), **`--json`** |\n| `stats` | 记账统计 | （无） | **`--json`** |\n| `activity` | 记账活跃度 | （无） | **`--json`** |\n| `insight` | AI 消费洞察 | （无） | `--months` (默认 6), `--top-n`, **`--json`** |\n| `anomaly` | 异常波动检测 | （无） | `--months` (默认 6), **`--json`** |\n| `debt_summary` | 借贷总览(#借出\u002F#借入) | （无） | **`--json`** |\n| `reimburse_summary` | 报销汇总(#待报销) | （无） | **`--json`** |\n| `installment_summary` | 分期总览(#分期) | （无） | **`--json`** |\n| `refund_summary` | 退款统计(#退款) | （无） | **`--json`** |\n| `breakdown` | 分类明细(旧口径兼容) | （无） | `--from`, `--to`, **`--json`** |\n| `form` | 联动采集表单渲染(买东西联动\u002F吃饭联动) | `purchase`\u002F`meal`(位置参数) | `--amount`, `--item`\u002F`--ate`, `--category`, `--category-hint`, `--account`, `--ledger`, `--time`, `--note`, `--currency`, `--account-source`, `--category-source`, `--ledger-source`, `--out` |\n| `receipt` | 联动回执渲染(回执带联动按钮) | `purchase`\u002F`meal` + `--id`(必需) | `--item`\u002F`--ate`, `--out` |\n| `set-budget` | 设定月度预算(goal) | `--amount` | `--month`(默认本月), `--category`(不填=总预算), `--force`(覆盖), **`--json`** |\n| `budget` | 查看预算执行(goal) | （无） | `--month`, `--category`, **`--json`** |\n| `set-saving` | 设定储蓄目标(goal) | `--name`, `--amount` | `--deadline`, **`--json`** |\n| `saving` | 查看目标进度(goal) | （无） | `--name`, **`--json`** |\n| `init` | 初始化向导执行(setup) | （无） | `--check`(只读环境检测), **`--json`** |\n| `init-status` | 初始化状态三重判定(setup) | （无） | **`--json`** |\n| `backup-create` | 一键备份(setup · db+goals.json) | （无） | **`--json`** |\n| `backup-list` | 查看备份(setup) | （无） | **`--json`** |\n| `restore` | 从备份恢复(setup) | （无） | `--name`(默认最新), **`--json`** |\n| `import` | 导入 CSV 账单(setup) | `--file` | `--mapping`(字段=列号), `--encoding`, `--skip-header`, `--preview`\u002F`--dry-run`, **`--json`** |\n\n> **JSON 契约**：所有查询命令加 `--json` 后输出 `{status: \"ok\"|\"error\", data: {...}, message: \"...\"}` 三段式。`bill_inject.py` 用此契约注入 HTML 模板。写入类命令（add\u002Fupdate）不支持 `--json`，保持纯文本输出。目标域 4 命令（`set-budget` \u002F `budget` \u002F `set-saving` \u002F `saving`）在 `scripts\u002Fgoal\u002Fcli.py`（HTML 渲染走 `scripts\u002Fgoal\u002Frender.py`）；`set-budget` 覆盖冲突时返回 `status: \"ok\"` + `data.conflict: true`（原值在 `data.existing`），AI 据此提示用户确认后加 `--force`。开始使用域 6 命令（`init` \u002F `init-status` \u002F `backup-create` \u002F `backup-list` \u002F `restore` \u002F `import`）在 `scripts\u002Fsetup\u002Fcli.py`（HTML 渲染走 `scripts\u002Fsetup\u002Frender.py`，包装公共层 backup.py）。\n\n---\n\n## 分类参考\n\n分类采用 **L1\u002FL2\u002FL3 三级** 结构(支出)\u002F **L1\u002FL2 二级** 结构(收入),用 `\u002F` 分隔(如 `餐饮\u002F外卖\u002F午餐`)。\n\n**AI 解析必读 `references\u002Fcategories.md` 的「分类心法」章节** — 心法包含 5 个判断维度(主体\u002F目的\u002F对象\u002F工具vs体验\u002F谁付费)和边界示例。**不要\"关键词查表\",要按意图推场景。** 关键词表只在心法覆盖不到时兜底。\n\n**支出 L1(10 个):** 餐饮、居家、穿着、出行、玩乐、学习、健康、社交、宠物、其他\n\n**收入 L1(5 个):** 工资、奖金、兼职、投资、其他收入\n\n> 旧数据中不带 `\u002F` 的分类(如 `餐饮`、`交通`)自动视为 L1,无需迁移。\n\n---\n\n## 与其他工具的边界\n\n本 Skill 的 **5 层骨架**（数据层 `db.py` \u002F 操作层 `analyze.py` \u002F 规则层 `validators.py` \u002F 接口层 `write|query|analysis|account\u002Fcli.py`(四域) \u002F 文档层 `references\u002F`+`templates\u002F`）**不含** `config-cookie-accounting.ts`。\n\n| 文件 | 归属 | 维护方 | 与本 Skill 的关系 |\n|------|------|--------|-------------------|\n| `config-cookie-accounting.ts` | SkillBoard 数据层视图（legacy） | 独立维护 | 不在 5 层骨架内；权威分类体系以 [`references\u002Fcategories.md`](references\u002Fcategories.md) 为准 |\n| `references\u002Fcategories-mapping.md` | 本 Skill 文档层 | 本 Skill 维护 | 桥接 `config-cookie-accounting.ts`（9 L1）→ `categories.md`（10 L1）；仅做语义映射，不修改任何一方的字段 |\n\n> **若未来澄清 `config-cookie-accounting.ts` 为废弃**：需独立 spec 处理；本 Skill 当前仅做桥接文档（`references\u002Fcategories-mapping.md`），不删不改 `config-cookie-accounting.ts`。\n\n---\n\n## 错误处理\n\n| 场景 | 处理方式 |\n|------|----------|\n| 图片模糊\u002F看不清金额 | 描述看到的内容，请用户确认 |\n| 图片非账单 | 告知用户并询问是否手动输入 |\n| 未指定分类 | 根据内容推断，告知用户可纠正 |\n| 金额不明确 | 请用户确认，不自动猜测 |",{"name":5,"description":7},"main","5b2b73ce2fbb69cd70597cfbbf24c99bc9e94b4c",1,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS","https:\u002F\u002Fgithub.com\u002FFeatherHunter","The Boy, The Man, The Human.","2026-09-12 20:33:55",{"source":8,"skillName":5,"commands":45,"prompt":55,"zipAvailable":56},[46,49,52],{"tool":47,"command":48},"npx","npx skills add FeatherHunter\u002FSKILLS --skill \"饼干记账\"",{"tool":50,"command":51},"bunx","bunx skills add FeatherHunter\u002FSKILLS --skill \"饼干记账\"",{"tool":53,"command":54},"pnpm","pnpm dlx skills add FeatherHunter\u002FSKILLS --skill \"饼干记账\"","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002FSKILL.md",true,[58,64,70,74,78,82,86,90,94,98,102,106,110,114,118,122,126,130,134,138,142,146,150,156,160,164,168,172,176,180,184,188,194,198,202,206,210,213,217,221,225,229,233,237,241,245,249,253,257,261,265,269,273,277,281,285,289,293,297,301,305,309,313,317,321,325,329,333,337,341,345,349,353,356,360,364,368,372,376,380,384,388,392,396,400,404,408,411,415,419,423,427,431,435,439,443,447,450,454,458,462,466,470,474,478,482,486,490,494,498,502,506,510,514,518,522,526,530,534,538,542,546,550,554,558,562,566,570,574,578,582,586,590,594,598,602,606,610,614,618,622,626,630,634,638,642,646,650,654,658,662,666,670,674,678,682,686,690,693,697],{"path":59,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":62,"sourceHtmlUrl":63},"_meta.json","REFERENCE","参考文档",131,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F_meta.json",{"path":65,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":68,"sourceHtmlUrl":69},".gitignore","OTHER","其他",177,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F.gitignore",{"path":71,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":72,"sourceHtmlUrl":73},".out-of-scope\u002FREADME.md",1382,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F.out-of-scope\u002FREADME.md",{"path":75,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":76,"sourceHtmlUrl":77},".scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F01-tests-foundation.md",765,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F.scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F01-tests-foundation.md",{"path":79,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":80,"sourceHtmlUrl":81},".scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F02-validators-py-centralization.md",1007,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F.scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F02-validators-py-centralization.md",{"path":83,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":84,"sourceHtmlUrl":85},".scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F03-bills-table-check-constraints.md",810,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F.scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F03-bills-table-check-constraints.md",{"path":87,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":88,"sourceHtmlUrl":89},".scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F04-record-bill-expand-validators-call.md",922,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F.scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F04-record-bill-expand-validators-call.md",{"path":91,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":92,"sourceHtmlUrl":93},".scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F05-record-bill-contract-remove-inline-checks.md",709,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F.scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F05-record-bill-contract-remove-inline-checks.md",{"path":95,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":96,"sourceHtmlUrl":97},".scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F06-test-render-nine-query-types.md",785,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F.scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F06-test-render-nine-query-types.md",{"path":99,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":100,"sourceHtmlUrl":101},".scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F07-test-payloads-injection-safety.md",806,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F.scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F07-test-payloads-injection-safety.md",{"path":103,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":104,"sourceHtmlUrl":105},".scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F08-help-wake-words-four-sync.md",795,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F.scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F08-help-wake-words-four-sync.md",{"path":107,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":108,"sourceHtmlUrl":109},".scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F09-help-path-converge-section-12b.md",1168,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F.scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F09-help-path-converge-section-12b.md",{"path":111,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":112,"sourceHtmlUrl":113},".scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F10-adr-0002-bom-and-gitignore.md",862,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F.scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F10-adr-0002-bom-and-gitignore.md",{"path":115,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":116,"sourceHtmlUrl":117},".scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F11-categories-mapping-bridge-doc.md",858,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F.scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F11-categories-mapping-bridge-doc.md",{"path":119,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":120,"sourceHtmlUrl":121},".scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F12-skillmd-other-tools-boundary.md",902,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F.scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fissues\u002F12-skillmd-other-tools-boundary.md",{"path":123,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":124,"sourceHtmlUrl":125},".scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fmap.md",815,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F.scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fmap.md",{"path":127,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":128,"sourceHtmlUrl":129},".scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fspec.md",16363,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F.scratch\u002Falign-biscuit-accountant-to-skill-dev-manual-v1\u002Fspec.md",{"path":131,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":132,"sourceHtmlUrl":133},".scratch\u002Fland-v15-help-layout\u002Fissues\u002F01-land-v15-template-and-auto-copy.md",3190,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F.scratch\u002Fland-v15-help-layout\u002Fissues\u002F01-land-v15-template-and-auto-copy.md",{"path":135,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":136,"sourceHtmlUrl":137},".scratch\u002Fland-v15-help-layout\u002Fissues\u002F02-extend-tests-and-fat.md",2904,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F.scratch\u002Fland-v15-help-layout\u002Fissues\u002F02-extend-tests-and-fat.md",{"path":139,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":140,"sourceHtmlUrl":141},".scratch\u002Fland-v15-help-layout\u002Fspec.md",12680,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F.scratch\u002Fland-v15-help-layout\u002Fspec.md",{"path":143,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":144,"sourceHtmlUrl":145},"AGENTS.md",1063,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002FAGENTS.md",{"path":147,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":148,"sourceHtmlUrl":149},"AI不允许看的文件.md",437,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002FAI不允许看的文件.md",{"path":151,"resourceType":152,"resourceTypeDesc":153,"sizeBytes":154,"sourceHtmlUrl":155},"backups\u002Fbackfill_20260703_124859.csv","ASSET","资产文件",201283,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fbackups\u002Fbackfill_20260703_124859.csv",{"path":157,"resourceType":152,"resourceTypeDesc":153,"sizeBytes":158,"sourceHtmlUrl":159},"backups\u002Fbackfill_20260703_130113.csv",855,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fbackups\u002Fbackfill_20260703_130113.csv",{"path":161,"resourceType":152,"resourceTypeDesc":153,"sizeBytes":162,"sourceHtmlUrl":163},"backups\u002Fbackfill_20260703_131912.csv",4080,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fbackups\u002Fbackfill_20260703_131912.csv",{"path":165,"resourceType":152,"resourceTypeDesc":153,"sizeBytes":166,"sourceHtmlUrl":167},"backups\u002Fbackfill_leisure_20260703_163822.csv",5792,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fbackups\u002Fbackfill_leisure_20260703_163822.csv",{"path":169,"resourceType":152,"resourceTypeDesc":153,"sizeBytes":170,"sourceHtmlUrl":171},"backups\u002Fbackfill_v3p1_classify_20260703_161551.csv",155446,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fbackups\u002Fbackfill_v3p1_classify_20260703_161551.csv",{"path":173,"resourceType":152,"resourceTypeDesc":153,"sizeBytes":174,"sourceHtmlUrl":175},"backups\u002Fmigrate_other_20260703_132832.csv",2314,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fbackups\u002Fmigrate_other_20260703_132832.csv",{"path":177,"resourceType":152,"resourceTypeDesc":153,"sizeBytes":178,"sourceHtmlUrl":179},"backups\u002Fmigrate_other_20260703_133422.csv",344,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fbackups\u002Fmigrate_other_20260703_133422.csv",{"path":181,"resourceType":152,"resourceTypeDesc":153,"sizeBytes":182,"sourceHtmlUrl":183},"backups\u002Fmigrate_uncategorized_20260703_150838.csv",142960,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fbackups\u002Fmigrate_uncategorized_20260703_150838.csv",{"path":185,"resourceType":152,"resourceTypeDesc":153,"sizeBytes":186,"sourceHtmlUrl":187},"backups\u002Fmigrate_uncategorized_20260703_150932.csv",837,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fbackups\u002Fmigrate_uncategorized_20260703_150932.csv",{"path":189,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":192,"sourceHtmlUrl":193},"config-cookie-accounting.ts","SCRIPT","脚本",10514,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fconfig-cookie-accounting.ts",{"path":195,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":196,"sourceHtmlUrl":197},"CONTEXT.md",3970,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002FCONTEXT.md",{"path":199,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":200,"sourceHtmlUrl":201},"docs\u002Fadr\u002F0001-five-layer-skeleton-pending-validators.md",1529,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fdocs\u002Fadr\u002F0001-five-layer-skeleton-pending-validators.md",{"path":203,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":204,"sourceHtmlUrl":205},"docs\u002Fadr\u002F0002-utf-8-bom-for-html-output.md",2333,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fdocs\u002Fadr\u002F0002-utf-8-bom-for-html-output.md",{"path":207,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":208,"sourceHtmlUrl":209},"docs\u002Fadr\u002F0003-monthly-count-semantics.md",2841,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fdocs\u002Fadr\u002F0003-monthly-count-semantics.md",{"path":211,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":112,"sourceHtmlUrl":212},"docs\u002Fagents\u002Fdomain.md","https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fdocs\u002Fagents\u002Fdomain.md",{"path":214,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":215,"sourceHtmlUrl":216},"docs\u002Fagents\u002Fissue-tracker.md",1309,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fdocs\u002Fagents\u002Fissue-tracker.md",{"path":218,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":219,"sourceHtmlUrl":220},"docs\u002Fagents\u002Ftriage-labels.md",1163,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fdocs\u002Fagents\u002Ftriage-labels.md",{"path":222,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":223,"sourceHtmlUrl":224},"references\u002Fcategories-mapping.md",3920,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Freferences\u002Fcategories-mapping.md",{"path":226,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":227,"sourceHtmlUrl":228},"references\u002Fcategories.md",8809,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Freferences\u002Fcategories.md",{"path":230,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":231,"sourceHtmlUrl":232},"references\u002Fscenarios.json",31348,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Freferences\u002Fscenarios.json",{"path":234,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":235,"sourceHtmlUrl":236},"references\u002Fscenarios.md",10890,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Freferences\u002Fscenarios.md",{"path":238,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":239,"sourceHtmlUrl":240},"references\u002Fscenarios.yaml",46454,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Freferences\u002Fscenarios.yaml",{"path":242,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":243,"sourceHtmlUrl":244},"references\u002F唤醒词全集.md",3459,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Freferences\u002F唤醒词全集.md",{"path":246,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":247,"sourceHtmlUrl":248},"references\u002F路由表.md",6456,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Freferences\u002F路由表.md",{"path":250,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":251,"sourceHtmlUrl":252},"references\u002F路由表框架.md",1720,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Freferences\u002F路由表框架.md",{"path":254,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":255,"sourceHtmlUrl":256},"references\u002F软删契约.md",1288,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Freferences\u002F软删契约.md",{"path":258,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":259,"sourceHtmlUrl":260},"scenes\u002Faccount.yaml",3057,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscenes\u002Faccount.yaml",{"path":262,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":263,"sourceHtmlUrl":264},"scenes\u002Fanalysis.yaml",16366,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscenes\u002Fanalysis.yaml",{"path":266,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":267,"sourceHtmlUrl":268},"scenes\u002Fgoal.yaml",3067,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscenes\u002Fgoal.yaml",{"path":270,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":271,"sourceHtmlUrl":272},"scenes\u002Flink.yaml",1976,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscenes\u002Flink.yaml",{"path":274,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":275,"sourceHtmlUrl":276},"scenes\u002Fquery.yaml",9937,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscenes\u002Fquery.yaml",{"path":278,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":279,"sourceHtmlUrl":280},"scenes\u002Fsetup.yaml",4569,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscenes\u002Fsetup.yaml",{"path":282,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":283,"sourceHtmlUrl":284},"scenes\u002Fwrite.yaml",12752,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscenes\u002Fwrite.yaml",{"path":286,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":287,"sourceHtmlUrl":288},"scripts\u002F_base_render.py",7624,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002F_base_render.py",{"path":290,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":291,"sourceHtmlUrl":292},"scripts\u002F_record_pkg_fee.py",729,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002F_record_pkg_fee.py",{"path":294,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":295,"sourceHtmlUrl":296},"scripts\u002F_record_sam_order.py",752,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002F_record_sam_order.py",{"path":298,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":299,"sourceHtmlUrl":300},"scripts\u002F_record_veg.py",742,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002F_record_veg.py",{"path":302,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":303,"sourceHtmlUrl":304},"scripts\u002F_selector.py",5367,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002F_selector.py",{"path":306,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":307,"sourceHtmlUrl":308},"scripts\u002F_split_sam_order.py",1595,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002F_split_sam_order.py",{"path":310,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":311,"sourceHtmlUrl":312},"scripts\u002Faccount\u002F__init__.py",104,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Faccount\u002F__init__.py",{"path":314,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":315,"sourceHtmlUrl":316},"scripts\u002Faccount\u002Fcli.py",16539,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Faccount\u002Fcli.py",{"path":318,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":319,"sourceHtmlUrl":320},"scripts\u002Faccount\u002Frender.py",13806,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Faccount\u002Frender.py",{"path":322,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":323,"sourceHtmlUrl":324},"scripts\u002Fanalysis\u002F__init__.py",43,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fanalysis\u002F__init__.py",{"path":326,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":327,"sourceHtmlUrl":328},"scripts\u002Fanalysis\u002Fcli.py",52826,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fanalysis\u002Fcli.py",{"path":330,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":331,"sourceHtmlUrl":332},"scripts\u002Fanalyze.py",7088,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fanalyze.py",{"path":334,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":335,"sourceHtmlUrl":336},"scripts\u002Fbackfill_multilevel.py",19421,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fbackfill_multilevel.py",{"path":338,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":339,"sourceHtmlUrl":340},"scripts\u002Fbackup.py",5189,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fbackup.py",{"path":342,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":343,"sourceHtmlUrl":344},"scripts\u002Fbill_inject.py",24168,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fbill_inject.py",{"path":346,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":347,"sourceHtmlUrl":348},"scripts\u002Fcli_utils.py",1187,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fcli_utils.py",{"path":350,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":351,"sourceHtmlUrl":352},"scripts\u002Fdb.py",11096,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fdb.py",{"path":354,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":323,"sourceHtmlUrl":355},"scripts\u002Fgoal\u002F__init__.py","https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fgoal\u002F__init__.py",{"path":357,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":358,"sourceHtmlUrl":359},"scripts\u002Fgoal\u002Fcli.py",17125,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fgoal\u002Fcli.py",{"path":361,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":362,"sourceHtmlUrl":363},"scripts\u002Fgoal\u002Frender.py",12356,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fgoal\u002Frender.py",{"path":365,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":366,"sourceHtmlUrl":367},"scripts\u002Fhtml_paths.py",3634,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fhtml_paths.py",{"path":369,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":370,"sourceHtmlUrl":371},"scripts\u002Finsights.py",6093,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Finsights.py",{"path":373,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":374,"sourceHtmlUrl":375},"scripts\u002Fledger\u002F__init__.py",119,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fledger\u002F__init__.py",{"path":377,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":378,"sourceHtmlUrl":379},"scripts\u002Fledger\u002Fcli.py",10589,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fledger\u002Fcli.py",{"path":381,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":382,"sourceHtmlUrl":383},"scripts\u002Flink\u002F__init__.py",28,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Flink\u002F__init__.py",{"path":385,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":386,"sourceHtmlUrl":387},"scripts\u002Flink\u002Fcli.py",20251,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Flink\u002Fcli.py",{"path":389,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":390,"sourceHtmlUrl":391},"scripts\u002Fmerge_scenarios.py",12168,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fmerge_scenarios.py",{"path":393,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":394,"sourceHtmlUrl":395},"scripts\u002Fmigrate_other.py",7237,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fmigrate_other.py",{"path":397,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":398,"sourceHtmlUrl":399},"scripts\u002Fmigrate_uncategorized.py",14213,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fmigrate_uncategorized.py",{"path":401,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":402,"sourceHtmlUrl":403},"scripts\u002Fmigrations\u002Fadd_bills_check_constraints.py",7783,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fmigrations\u002Fadd_bills_check_constraints.py",{"path":405,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":406,"sourceHtmlUrl":407},"scripts\u002Fmigrations\u002Fmerge_dirty_names.py",6216,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fmigrations\u002Fmerge_dirty_names.py",{"path":409,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":323,"sourceHtmlUrl":410},"scripts\u002Fquery\u002F__init__.py","https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fquery\u002F__init__.py",{"path":412,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":413,"sourceHtmlUrl":414},"scripts\u002Fquery\u002Fcli.py",18870,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fquery\u002Fcli.py",{"path":416,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":417,"sourceHtmlUrl":418},"scripts\u002Frecord_bill.py",19938,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Frecord_bill.py",{"path":420,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":421,"sourceHtmlUrl":422},"scripts\u002Frender_help.py",11779,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Frender_help.py",{"path":424,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":425,"sourceHtmlUrl":426},"scripts\u002Frender_write.py",32363,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Frender_write.py",{"path":428,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":429,"sourceHtmlUrl":430},"scripts\u002Frouting.py",3813,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Frouting.py",{"path":432,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":433,"sourceHtmlUrl":434},"scripts\u002Fsetup\u002F__init__.py",0,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fsetup\u002F__init__.py",{"path":436,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":437,"sourceHtmlUrl":438},"scripts\u002Fsetup\u002Fcli.py",26309,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fsetup\u002Fcli.py",{"path":440,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":441,"sourceHtmlUrl":442},"scripts\u002Fsetup\u002Frender.py",17797,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fsetup\u002Frender.py",{"path":444,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":445,"sourceHtmlUrl":446},"scripts\u002Fvalidators.py",8985,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fvalidators.py",{"path":448,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":323,"sourceHtmlUrl":449},"scripts\u002Fwrite\u002F__init__.py","https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fwrite\u002F__init__.py",{"path":451,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":452,"sourceHtmlUrl":453},"scripts\u002Fwrite\u002Fcli.py",7047,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Fscripts\u002Fwrite\u002Fcli.py",{"path":455,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":456,"sourceHtmlUrl":457},"templates\u002Fquery_view.html",27436,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002Fquery_view.html",{"path":459,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":460,"sourceHtmlUrl":461},"templates\u002F写入\u002Fbatch_confirm.html",9504,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F写入\u002Fbatch_confirm.html",{"path":463,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":464,"sourceHtmlUrl":465},"templates\u002F写入\u002Fexpense_form.html",12660,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F写入\u002Fexpense_form.html",{"path":467,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":468,"sourceHtmlUrl":469},"templates\u002F写入\u002Fflow_confirm.html",15001,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F写入\u002Fflow_confirm.html",{"path":471,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":472,"sourceHtmlUrl":473},"templates\u002F写入\u002Finstallment_confirm.html",7923,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F写入\u002Finstallment_confirm.html",{"path":475,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":476,"sourceHtmlUrl":477},"templates\u002F写入\u002Fupdate_confirm.html",7289,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F写入\u002Fupdate_confirm.html",{"path":479,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":480,"sourceHtmlUrl":481},"templates\u002F分析\u002Fanalysis_view.html",57535,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F分析\u002Fanalysis_view.html",{"path":483,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":484,"sourceHtmlUrl":485},"templates\u002F开始使用\u002Fbackup_list.html",7458,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F开始使用\u002Fbackup_list.html",{"path":487,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":488,"sourceHtmlUrl":489},"templates\u002F开始使用\u002Fbackup.html",6749,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F开始使用\u002Fbackup.html",{"path":491,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":492,"sourceHtmlUrl":493},"templates\u002F开始使用\u002Fimport.html",10593,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F开始使用\u002Fimport.html",{"path":495,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":496,"sourceHtmlUrl":497},"templates\u002F开始使用\u002Finit_status.html",8403,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F开始使用\u002Finit_status.html",{"path":499,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":500,"sourceHtmlUrl":501},"templates\u002F开始使用\u002Finit_wizard.html",10202,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F开始使用\u002Finit_wizard.html",{"path":503,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":504,"sourceHtmlUrl":505},"templates\u002F开始使用\u002Frestore.html",11047,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F开始使用\u002Frestore.html",{"path":507,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":508,"sourceHtmlUrl":509},"templates\u002F目标\u002Fbudget_form.html",8816,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F目标\u002Fbudget_form.html",{"path":511,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":512,"sourceHtmlUrl":513},"templates\u002F目标\u002Fbudget_view.html",12467,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F目标\u002Fbudget_view.html",{"path":515,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":516,"sourceHtmlUrl":517},"templates\u002F目标\u002Fsaving_form.html",8047,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F目标\u002Fsaving_form.html",{"path":519,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":520,"sourceHtmlUrl":521},"templates\u002F目标\u002Fsaving_view.html",11998,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F目标\u002Fsaving_view.html",{"path":523,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":524,"sourceHtmlUrl":525},"templates\u002F联动\u002Fmeal_confirm.html",12633,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F联动\u002Fmeal_confirm.html",{"path":527,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":528,"sourceHtmlUrl":529},"templates\u002F联动\u002Fpurchase_confirm.html",12661,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F联动\u002Fpurchase_confirm.html",{"path":531,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":532,"sourceHtmlUrl":533},"templates\u002F联动\u002Freceipt.html",9523,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F联动\u002Freceipt.html",{"path":535,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":536,"sourceHtmlUrl":537},"templates\u002F账户\u002Faccount_form.html",7979,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F账户\u002Faccount_form.html",{"path":539,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":540,"sourceHtmlUrl":541},"templates\u002F账户\u002Faccount_view.html",13816,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F账户\u002Faccount_view.html",{"path":543,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":544,"sourceHtmlUrl":545},"templates\u002F账户\u002Fconfirm.html",7217,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F账户\u002Fconfirm.html",{"path":547,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":548,"sourceHtmlUrl":549},"templates\u002F账户\u002Ftransfer_confirm.html",9084,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftemplates\u002F账户\u002Ftransfer_confirm.html",{"path":551,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":552,"sourceHtmlUrl":553},"tests\u002Fconftest.py",13110,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Fconftest.py",{"path":555,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":556,"sourceHtmlUrl":557},"tests\u002Ftest_account.py",21679,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_account.py",{"path":559,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":560,"sourceHtmlUrl":561},"tests\u002Ftest_analysis.py",29789,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_analysis.py",{"path":563,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":564,"sourceHtmlUrl":565},"tests\u002Ftest_backup.py",3495,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_backup.py",{"path":567,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":568,"sourceHtmlUrl":569},"tests\u002Ftest_base_pipeline.py",18825,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_base_pipeline.py",{"path":571,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":572,"sourceHtmlUrl":573},"tests\u002Ftest_conftest_smoke.py",1811,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_conftest_smoke.py",{"path":575,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":576,"sourceHtmlUrl":577},"tests\u002Ftest_db_check_constraints.py",10014,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_db_check_constraints.py",{"path":579,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":580,"sourceHtmlUrl":581},"tests\u002Ftest_form_selector_dom.py",10358,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_form_selector_dom.py",{"path":583,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":584,"sourceHtmlUrl":585},"tests\u002Ftest_goal.py",25509,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_goal.py",{"path":587,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":588,"sourceHtmlUrl":589},"tests\u002Ftest_goals_fixture.py",1829,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_goals_fixture.py",{"path":591,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":592,"sourceHtmlUrl":593},"tests\u002Ftest_help_contract.py",10659,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_help_contract.py",{"path":595,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":596,"sourceHtmlUrl":597},"tests\u002Ftest_insights.py",3573,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_insights.py",{"path":599,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":600,"sourceHtmlUrl":601},"tests\u002Ftest_ledger.py",20537,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_ledger.py",{"path":603,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":604,"sourceHtmlUrl":605},"tests\u002Ftest_link.py",11897,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_link.py",{"path":607,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":608,"sourceHtmlUrl":609},"tests\u002Ftest_merge_scenarios.py",10409,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_merge_scenarios.py",{"path":611,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":612,"sourceHtmlUrl":613},"tests\u002Ftest_payloads.py",10947,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_payloads.py",{"path":615,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":616,"sourceHtmlUrl":617},"tests\u002Ftest_query.py",16764,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_query.py",{"path":619,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":620,"sourceHtmlUrl":621},"tests\u002Ftest_record_bill_validators.py",5870,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_record_bill_validators.py",{"path":623,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":624,"sourceHtmlUrl":625},"tests\u002Ftest_render_write.py",20391,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_render_write.py",{"path":627,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":628,"sourceHtmlUrl":629},"tests\u002Ftest_render.py",45277,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_render.py",{"path":631,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":632,"sourceHtmlUrl":633},"tests\u002Ftest_routing.py",7692,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_routing.py",{"path":635,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":636,"sourceHtmlUrl":637},"tests\u002Ftest_selector.py",15708,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_selector.py",{"path":639,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":640,"sourceHtmlUrl":641},"tests\u002Ftest_setup.py",24037,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_setup.py",{"path":643,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":644,"sourceHtmlUrl":645},"tests\u002Ftest_soft_delete.py",4597,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_soft_delete.py",{"path":647,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":648,"sourceHtmlUrl":649},"tests\u002Ftest_validators.py",9483,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftests\u002Ftest_validators.py",{"path":651,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":652,"sourceHtmlUrl":653},"tmp_814.py",505,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftmp_814.py",{"path":655,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":656,"sourceHtmlUrl":657},"tmp_bk_food_detail.py",4646,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftmp_bk_food_detail.py",{"path":659,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":660,"sourceHtmlUrl":661},"tmp_bk_food.py",820,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftmp_bk_food.py",{"path":663,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":664,"sourceHtmlUrl":665},"tmp_check_ali.py",297,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftmp_check_ali.py",{"path":667,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":668,"sourceHtmlUrl":669},"tmp_check_gaode.py",261,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftmp_check_gaode.py",{"path":671,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":672,"sourceHtmlUrl":673},"tmp_july_check.py",549,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftmp_july_check.py",{"path":675,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":676,"sourceHtmlUrl":677},"tmp_july_expense.json",52137,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftmp_july_expense.json",{"path":679,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":680,"sourceHtmlUrl":681},"tmp_month.py",1000,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftmp_month.py",{"path":683,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":684,"sourceHtmlUrl":685},"tmp_render_sams.py",846,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftmp_render_sams.py",{"path":687,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":688,"sourceHtmlUrl":689},"tmp_search_all.py",4859,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftmp_search_all.py",{"path":691,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":652,"sourceHtmlUrl":692},"tmp_today.py","https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftmp_today.py",{"path":694,"resourceType":190,"resourceTypeDesc":191,"sizeBytes":695,"sourceHtmlUrl":696},"tmp_write_sams.py",704,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002Ftmp_write_sams.py",{"path":698,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":699,"sourceHtmlUrl":700},"饼干记账.html",128410,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002F饼干记账.html",[702,711,720,730,736,746],{"skillNo":703,"name":704,"nameZh":6,"description":705,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":706,"categories":707,"keywords":708,"publishedAt":32},"01M71JPS100K4E2JN8R3B0F9NR","贴心助理","真实助手 - 主动分析用户状态，关心用户，提供帮助与提醒。不偷懒地联动所有技能，真正像个朋友一样陪伴。","https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F贴心助理\u002FSKILL.md",[],[704,709,710],"陪伴","朋友",{"skillNo":712,"name":713,"nameZh":6,"description":714,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":715,"categories":716,"keywords":717,"publishedAt":32},"01M71JPPN0WZ1ARA081J0JDNPC","美团","安装美团旅游技能(meituan-travel)向导 - 检查 mtskills 商店并安装 meituan-travel","https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F美团\u002FSKILL.md",[],[713,718,719],"meituan","travel",{"skillNo":721,"name":722,"nameZh":6,"description":723,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":724,"categories":725,"keywords":726,"publishedAt":32},"01M71JPN921TSX62DXEFY1B8FJ","网易云音乐","安装网易云音乐 CLI 工具(@music163\u002Fncm-cli) - 通过 npm 全局安装","https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F网易云音乐\u002FSKILL.md",[],[722,727,728,729],"cli","工具","npm",{"skillNo":731,"name":732,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":733,"categories":734,"keywords":735,"publishedAt":32},"01M71JPF82PYTK0NYMJF8Y9E48","私家大厨","https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F私家大厨\u002FSKILL.md",[],[732],{"skillNo":737,"name":738,"nameZh":6,"description":739,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":740,"categories":741,"keywords":742,"publishedAt":32},"01M71JPCK6Z5NT3G258NFKEJGG","目录树","目录树技能 - 递归扫描给定目录，输出所有目录和文件的树状结构清单","https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F目录树\u002FSKILL.md",[],[743,738,744,745],"目录","文件导航","文件",{"skillNo":747,"name":748,"nameZh":6,"description":749,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":750,"categories":751,"keywords":752,"publishedAt":32},"01M71JPADTYH476Q2M2CQ62WSD","百科采集","全网百科知识采集技能。 用户提及采集百科、指定领域、搜索百科、深度搜索、备用搜索、切换引擎、 生成百科、精简百科、扩展知识、百科评语、批量采集、迭代采集时触发。 支持22个预设领域的百科知识采集，Tavily\u002FMiniMax双引擎搜索。","https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F百科采集\u002FSKILL.md",[],[748,753,754,755],"tavily","搜索","生成"]