# Notion Life Capture

> 当用户想把随手输入「记录/录入」进 FIOS（个人 Notion 生活管理系统）时使用——记一笔支出/收入、记个任务待办、记读书/学习笔记、记一个选题/想法、记美食/健康/打卡、记一件人际事项等。触发词：记一下、记一笔、记个、收藏、存一下、帮我记、备忘，以及"今天/刚才 + 花了/吃了/读了/想到/联系了/买了…"。一段话含多件事会拆成多条分别入库。不要用于：查看/查询/列出已有记录（那是 notion-life-system）、成体系地设定/拆解目标规划（那是 notion-life-cascade）、写日/周/月复盘叙述（那是 notion-life-reflection）、跨库分析对比（那是 notion-life-insights）。

- **Type:** Skill
- **Install:** `agentstack add skill-rexchengm-fios-skills-notion-life-capture`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [rexchengm](https://agentstack.voostack.com/s/rexchengm)
- **Installs:** 0
- **Category:** [Productivity](https://agentstack.voostack.com/c/productivity)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [rexchengm](https://github.com/rexchengm)
- **Source:** https://github.com/rexchengm/fios-skills/tree/main/skills/notion-life-capture

## Install

```sh
agentstack add skill-rexchengm-fios-skills-notion-life-capture
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# Notion 生活记录（Life Capture）

## 概述

随手说一句 → 分条 → 路由到正确的 `direct_write` 业务库 → 智能填好「非公式」字段 → 入库。这是和 查询 / 分析 / 设定 / 复盘 并列的「**记录**」动词入口。

**字段权威 = `notion-life-system` 的 `references/notion-intake-rules.json`（单一事实来源）。** 它由 schema 刷新脚本从用户真实 Notion 生成，含每个库的可直填字段 / 类型 / options / relation。本技能内的「高频速查卡」只是**加速参考**，一切以 json 为准；用户改了 Notion 属性后，多数情况靠**刷新 json 即自愈**，无需改本技能。

**REQUIRED BACKGROUND：** notion-life-system —— 复用 `ntn` CLI、`scripts/notion_query.zsh`、`references/notion-intake-rules.json` / `.md`，以及 schema 刷新三件套脚本。

## 何时使用（动词边界）

用本技能：把一条/多条**新信息记进库**。触发词 记一下 / 记一笔 / 记个 / 收藏 / 存一下 / 帮我记 / 备忘，或 "今天/刚才 + 花了/吃了/读了/想到/联系了/买了/跑了…"。

**不要用于**（这些是负向用例，必须分流出去）：
- 查看 / 查询 / 列出 已有记录 → notion-life-system（只读查询）
- 成体系地 设定 / 拆解 目标·规划·项目·任务 → notion-life-cascade（capture 只管零散记**一条**事实/事件/想法，不做向下拆解）
- 写 日/周/月 复盘叙述（今日复盘 / 周报 / 月报）→ notion-life-reflection
- 跨库 分析 / 对比 / "做得怎么样" → notion-life-insights

## 核心流程 —— 4 步

1. **分条** —— 把输入拆成 1 条或多条待记项。"今天午饭花了 35，还读完了《原则》" = 2 条（支出事项 + 书籍阅读）。

2. **路由** —— 按 `notion-intake-rules` 的场景 / 触发词，把每条匹配到一个 `direct_write` 业务库（共 31 个）。
   - 命中速查卡的高频库 → 直接用卡。
   - 未命中 → 读 `references/notion-intake-rules.json`，按各库的场景与触发词匹配。
   - 命中维度库（`conditional_write`）的内容 → 不直接建，转「维度库」一节处理。
   - 命中只读库（`avoid_manual_write`）→ 拒写并提示。

3. **智能默认决策**（核心 —— 明确就写，含糊才问）：
   - 明确无歧义 + 纯 `direct_write` + 不需关联/新建维度 → **直接写完即报**。
   - 需解析 relation（挂到某项目/账户/人物/分类）→ 先 `scripts/notion_query.zsh ` 查 page_id；查到就写，查不到或多义 → **一句话确认**。
   - 要新建维度对象（新账户/新分类/新联系人）→ **先确认再建**（见「维度库」一节）。
   - 库不明确 或 缺关键直填字段 → **一句话确认**，只问最少必要项。

4. **写入与回报** —— `ntn api v1/pages -X POST`（带目标 data_source_id + properties）。每条记录回报：**库 / 标题 / page_id / 设置的关联 / 未解析字段**。批量多条时先给一行式预览再统一写。

## 智能填充规则

- **日期**：缺省 = 今天；"明天 / 下周二 / 周末"解析成具体日期。
- **金额 / 数字**：从自然语言抽取（"花了三十五" / "35 块" → 35）。
- **select / status / multi_select**：拿话里的词去**匹配该字段的 `options`**（取自 json）。匹配不到就用最接近的或**留空 + 提示**，**绝不臆造新选项**。⚠️实测两者行为不同：**select / multi_select** 塞不存在的值，Notion **不报错、自动新建该选项** → 悄悄污染选项库（比报错更隐蔽有害）；**status** 塞越界值则直接 **400 失败**。两种都 →**匹配不到必须留空**，仅当用户明确说"新增『X』选项"才对 select 传新值（status 选项无法这样加）。
- **relation**：先 `notion_query.zsh` 查目标库拿 page_id，**不编造、不写成纯文本**。归类型关联（分类/账户/类型）缺省时按「关键关联兜底」兜到「其他」(无则自动建)；身份型关联（人/项目/书）查不到才留空或问。
- **title**：必填，从输入提炼一个短标题。
- **绝不填**：`formula` / `rollup` / `button` / `created_time` / `last_edited_time` / `unique_id` 等计算或同步字段。

## 高频录入速查卡（~10 库 · 字段权威以 `intake-rules.json` 为准）

下表是最常记的库的加速参考。字段名是各库「最小字段」，`*` 标记最常用的几个；options 值不在此硬写（最易漂移），运行时从 json 取并匹配。

| 你随口说 | 路由到 | 自动填的非公式字段 | 智能默认 |
|---|---|---|---|
| 花了X / 记一笔 / 买了X | 支出事项 | 事项*(title)、支出金额*(number)、入账时间*(date)、描述(rich_text)、备注日期(date)；relation→支出分类·收支账户·每日复盘 | 日期=今天；金额抽取；**账户/分类未指定→兜底「其他」(无则自动建)** |
| 收到X / 进账X | 收入事项 | 事项*、收入金额*、入账时间*、描述；relation→收入分类·收支账户·每日复盘 | 日期=今天；**账户/分类未指定→兜底「其他」(无则自动建)，保证汇入财务监管→第二大脑** |
| 任务 / 待办 / 明天要做X | 任务执行 | 事项*(title)、事项日期*(date)、事项描述(rich_text)、任务时长(分钟)(number)、备注(select)、任务四象限法则(status) | 日期解析"明天"；四象限/时长可空待补 |
| 读完/在读《X》 | 书籍阅读 | 书籍名称*(title)、阅读状态*(status)、读完时间/开始时间(date)、标签关键词(multi_select)、URL | 状态按"读完/在读"映射 options |
| 学习笔记 / 笔记：X | 学习笔记 | 专注笔记*(title)、创建时间*(date)、标签(multi_select)、来源(select)、状态(status)、URL | 时间=今天 |
| 想到个选题 / 选题：X | 选题收集 | 选题标题*(title)、主要内容(rich_text)、来源(select)、状态(status)、备注 | 来源按 options 匹配 |
| 收藏 / 资料 / 链接X | 资源收集 | 名称*(title)、URL*、核心思想(rich_text)、主要内容(rich_text)、标签(multi_select)、来源(status)、备注日期 | 有链接填 URL |
| 吃了X / 美食 / 记菜谱 | 美食记录（**营养菜谱库**）| 美食*(title)、时间(date)、标签、类型(早午晚餐)、主菜/副菜/配菜(select 选食材)、主油脂、其他配料 + 每食材的 用量/热量/碳水/脂肪/蛋白 | 见下方专门注释 ⬇️ |
| 体检/睡眠/身体X | 身体健康 | 时间*(title)、记录时间*(date)、起床时间/睡眠时间(date) | |
| 打卡了X / 做了N次 | 次数打卡 / 日常打卡 | 主题/习惯*(title)、相关日期(date)；按习惯查 习惯分类 relation | 先查习惯是否已存在 |
| 见了/联系了某人 | 事项处理 | 具体事项*(title)、发生日期*(date)、事项描述、状态、备注(select)；relation→社交信息 | 先查此人 page_id，查不到问是否建联系人 |

其余 21 个 `direct_write` 库（旅游计划、景点选择、电影视频、影视评论、物品管理、固定收支、就医跟踪、事项跟踪、打卡记录、兴趣学习、书籍笔记、每日/周/月复盘、规划设定、项目执行、目标设定、心愿奖励 等）**不在卡里硬写**——运行时读 `intake-rules.json` 取该库的可直填字段、options、relation 后再填。

> 注意：`目标设定 / 规划设定 / 项目执行` 虽是 `direct_write`，但它们是**有方法论的结构化对象**（要量化指标、三期路径、页面正文模板），**一律走 notion-life-cascade，capture 不碰**——别把体系化目标当普通记录草草塞一条。`任务执行` 是唯一例外：孤立待办（"明天要做 X"）归 capture；从项目拆解出来的任务归 cascade。

> **美食记录 = 营养菜谱库（特殊填法，踩过坑）**：它不是简单"吃了啥"打卡，而是带营养计算的菜谱库。食材分 主菜/副菜/配菜（select，从 options 选：鸡蛋/猪肉/牛肉/鱼肉/西红柿/青椒/茄子…，**不臆造新选项**）+ 主油脂（花生油/橄榄油…）+ 其他配料（葱姜蒜/酱油…）。⚠️**营养字段（X热量/X碳水/X脂肪/X蛋白）填「每克值」**（≈每100g ÷ 100，如鸡蛋热量 1.4、花生油 9），**用量填克数** —— 公式 `总热量/总营养 = Σ(用量 × 每克值)` 会自动汇总，另有 菜谱评分 / 营养成分 公式。**别把整道菜的总热量直接填进去**（会炸成几万卡）。菜谱来源 relation 可挂 家人亲人（跟谁学的）。

## 维度库与关键关联兜底（保证数据流向第二大脑）

FIOS 靠逐级 rollup 把底层数据汇总到第二大脑。**归类/账户类 relation 一旦留空，这条记录就 rollup 不上去、成了汇不进第二大脑的孤儿**（例：收入不挂「账户」→ 进不了 收支账户→财务监管→第二大脑）。所以这类关联即使用户没指定也不能空——按维度的"类型"分别处理：

**① 归类型维度（分类 / 类型 / 账户 等通用归类，参与向上汇总）—— 用户没指定时自动兜底到「其他」，不留空、不打断：**
1. `scripts/notion_query.zsh ` 查名为「其他」（或"未分类/默认"）的对象；
2. 有 → 关联其 page_id；
3. 没有 → **自动新建** title=「其他」的维度对象（免确认，这是受控的唯一兜底对象），再关联。
- 典型：收入事项/支出事项 的「分类」(→收入分类/支出分类) 与「账户」(→收支账户)；其它库的「分类/类型」同理。
- 用户**明确说了**具体分类/账户（"记到招行""算饮食类"）→ 查该具名对象；查不到 → 先问是否新建**该具名**对象；用户不建 / 暂不回应时**回退兜底到「其他」**（归类型关联**永不留空**），并提示"已暂挂『其他』，回头可改成 X"。

**② 身份型关联（指向具体 人物 / 项目 / 书籍 / 具体对象）—— 不塞「其他」：** 查到才关联，查不到就留空或一句话问。给身份关联硬塞"其他"会造成错误关联，比留空更糟。

**③ 日记关联（→每日复盘）—— 尽量关联「今天的每日复盘」：** `notion_query.zsh 每日复盘` 找当天那条，有就关联（让当日数据汇进日复盘 rollup），查不到不强建。

通则：绝不因为"维度库有可填字段"就往里塞业务记录；除归类型的「其他」兜底对象外，新建**具名**维度对象都先确认。

## 只读库：绝不写（11 个 `avoid_manual_write`）

9 个监管（时间/知识/人际/习惯/财务/旅游/家庭/影视/复盘监管）+ 月度展示 + 第二大脑。这些是公式 / rollup / 总控看板，**任何情况都不手动写**——把底层业务数据记对，它们会自动汇总。误判要往这里写时，停下并提示。

## Schema 漂移自愈（用户改了属性导致写入报错）

触发：`ntn api` 写入返回错误（属性不存在 / select option 不在列表 / 类型不符 / HTTP 400）。

1. **诊断** —— 判断是 schema 漂移（字段被改名/删除、option 变了、库结构变了），还是其它错误（网络 / 权限 / TLS）。后者不刷新，直接报。
2. **自动刷新快照**（只读拉取 + 重建本地 json，安全）：
   ```bash
   ~/.claude/skills/notion-life-system/scripts/fetch_raw_schema.zsh
   NOTION_SCHEMA_BUILD_ONLY=1 ~/.claude/skills/notion-life-system/scripts/refresh_schema.js --build-only
   ~/.claude/skills/notion-life-system/scripts/build_intake_rules.js
   ```
3. **重试一次** —— 用新 `intake-rules.json` 重新映射字段 / options，再写一次。
4. **仍失败 → 报 diff** —— 把"字段 X 不见了 / 改名为 Y / option 由 A 变成 B"清楚讲给用户，交他决定怎么填，**不盲目反复重试**。
5. **是否回改本技能** —— 因为字段以 json 为单一来源，**多数漂移靠刷新 json 自愈，不用动本技能**。只有当某个高频库的**录入模式整体变了**（常用字段增减、库改名），才提示更新本文件的「速查卡」。

## 通用规则

- **明确就写，含糊才问** —— 智能默认是核心；别为每条都确认，也别在多义时硬写。
- **一次最多一个确认问题** —— 多条待记项的确认合并成一次。
- **relation 填 page_id，先查不编造。**
- **select/status 值必须取自 options，不臆造。**
- **不碰公式/汇总/系统字段。**
- **只读库绝不写；维度库仅确认后建。**
- **写入偶发失败先重试一次** —— `ntn` 偶有间歇性失败（返回空 / 非 page 对象，但 JSON 合法、并非字段或 option 错误）；原样重试一次通常即成功。连续失败再按「Schema 漂移自愈」诊断。
- **写完逐条回报 page_id**，让用户可核对。

## 常见错误

- 把一段含多件事的话只记成一条 → 该分条的没分条。
- 关联字段写人名/项目名的纯文本而非 page_id → 关联为空。Fix：先查。
- select 值硬塞一个 options 里没有的词 → API 400。Fix：匹配 options，匹配不到留空+提示。
- 往监管/第二大脑/月度展示写 → 违反只读。Fix：记到底层 direct_write 库，让它自动汇总。
- 漂移报错后凭印象改字段名重试 → 越改越乱。Fix：先刷新 json 拿真实结构，再重试一次。
- 把"成体系建目标/规划"当普通记录处理 → 应转 notion-life-cascade。

## 完整示例

**输入："今天午饭花了 35，还读完了《原则》"**
1. 分条 → ①支出 ②读书。
2. 路由 → ①支出事项 ②书籍阅读，都是 `direct_write`，无歧义、无需关联。
3. 决策 → 两条都直接写。
4. 写入：
   - 支出事项：事项=午饭、支出金额=35、入账时间=2026-06-03 → page_id `a1…`
   - 书籍阅读：书籍名称=原则、阅读状态=读完(匹配 options)、读完时间=2026-06-03 → page_id `b2…`
   - 回报两条 page_id。

**输入："约了张三下周二喝咖啡"**
→ 事项处理（具体事项=和张三喝咖啡、发生日期=下周二解析）；relation→社交信息：先 `notion_query.zsh 社交信息` 查"张三"，查到则关联，查不到 → 问"通讯录没有张三，要新建联系人吗？"

**负向："看看我有哪些目标"** → 不处理，提示这是查询 → notion-life-system。

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [rexchengm](https://github.com/rexchengm)
- **Source:** [rexchengm/fios-skills](https://github.com/rexchengm/fios-skills)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-rexchengm-fios-skills-notion-life-capture
- Seller: https://agentstack.voostack.com/s/rexchengm
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
