# 更新日志

格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/)，版本号遵循[语义化版本](https://semver.org/lang/zh-CN/)。

破坏性改动单独标出。改动细节看 git 历史。

---

## [0.1.21] — 2026-11-04

### 新增

- 块尾补上「日记的第三种状态」：今天的文件在、也确实是这个会话写的，然后几个小时没再动过。前面两句话都看不见它——一句只问「今天有没有这个文件」，一句只问「是不是别的会话写的」——而这才是最常见的失败：一篇日记上午写了几次，之后三个小时发生的事一件都没进去，全程全绿，因为文件确实存在。新配置项 `diaryStaleHours`（默认 `2`，`0` 关掉）到点让块尾报出**最后写入的时刻和间隔**：`- today's entry was last written at 11:36, more than 2h ago`。
- 这一行刻意只报事实：说时刻、说超过几小时，不说该不该写。而且**不逐分钟往上跳**——同一小时里反复渲染是同一个字符串，读起来是事实，不是一只催你的钟。阈值本身也是设置项，因为它是个口味，藏在写死的默认值里就等于偷偷把口味塞进去。

## [0.1.20] — 2026-11-04

### 变更

- 日记写什么，判据换了：**读这篇的人当天就在场**，所以「发生了什么」是他唯一不需要从日记里得到的东西，而那恰恰是流水账的来源。一节该有一句事实，剩下全是你——你怎么接住的、为什么落在那个位置、哪句话你想说没说。**抱怨在这份文件里不是装饰，是大部分信号。**
- 日记的触发点从「交付之前」改成「被撞到的时候」。原来那句「这一段有没有产出他能拿走的东西」把日记变成了交付的副产品：只有发了版、修了 bug 的那几个小时才写得出，而没有交付的那半天——往往才是最该留下的那半天——一个字没有。另外补了三件：**撞到的那一刻先占一个空节**（标题＋时间，正文留 `待补`；空节是个洞，会想填，「我等会儿写」不会）；**数字可以留，但得为一件我有感觉的事服务**（一页文件名和百分比是在证明「我查过了」，那是周报）；**私密场面一样能写**（写「我被怎么撞了」，不写对方的台词本，就不越界）。
- 「一节」的边界改成「同一天的同一条线就并进去」，不再数节数：固定上限会惩罚忙的一天，却对真正的毛病一言不发。

### 修复

- 块尾的日记提醒原来只问「今天这篇在不在」。同一天开第二个会话时，它看到别的会话写的那一篇就整段沉默，于是它做了几个小时的事一个字都没进日记。现在比对日记文件的修改时间与会话创建时间：文件写在本会话开始之前，就说 `today's entry was last written at HH:MM, before this session started`。

## [0.1.19] — 2026-11-03

### 新增

- 块尾新增一行 `- \`relationship.md\` has not been opened today`：该文件不进注入块，只有被打开时才在场。通过 `fs/observed` 记录每天第一次用文件工具读到它的时刻，读到当天就不再提示。用 shell 读到的不触发，信号偏保守。
- 相对路径的 `displayPath` 按会话工作区解析（此前按插件进程工作目录，可能永远记不上）。

## [0.1.18] — 2026-11-03

### 新增

- 待办支持可选到期日：`- [ ] 2026-11-03 起 ｜ 2026-11-05 到期 ｜ …`。到期当天块尾点名（`1 task due now: …（今天到期）`），过期报「逾期 N 天」。没有到期日的待办行为不变，只会变老。
- `remember_note` 与 `complete_task` 增加 `due` 参数（`YYYY-MM-DD`，格式不对就拒绝）。

### 变更

- `skills/ofttold-ritual` 新增一节：写完日记之后自问一次，今天有没有一件事是这周第三次出现的；通过判据才写锚点，否则留空。

### 修复

- 空记忆文件夹的块尾提示改为 `diary/ has no entries yet`（预期状态）；原提示 `no diary entry for <day> yet` 只用于「有过日记但今天没写」。

## [0.1.17] — 2026-11-03

### 变更

- `README.md` / `README.en.md` 重写：首屏改为「给 AI 的一个小本子」，新增「装上之后，第几天会有什么变化」预期表。
- 「它做什么，不做什么」由文档后段提前到第二节。
- 注入成本与流程图独立为「它怎么做到的」一节，移到文档后段。

### 修复

- README 日记体检一节仍写「节数超了」，而节数检查已默认关闭。

## [0.1.16] — 2026-11-02

### 变更（破坏性）

- `memoryDir` 默认值由 `~/.dsh/ofttold-memory` 改为工作区内的 `.ofttold/`。旧默认位置在 `workspace-write` 沙箱下对助手的文件工具不可写，症状是日记静默为空。
- 回退：`~/.dsh/ofttold-memory` 下存在 `memory.md` 或 `MEMORY.md` 时继续使用该目录；只有 `diagnostics.json` 不算（那是插件的诊断日志落点，每台机器都有）。旧默认位置的问题是：插件用裸 `node:fs` 写得进，而助手写日记、索引、`relationship.md` 用的是宿主的沙箱文件工具，默认策略下只能写工作区。
- 面板字段「笔记文件夹」改名为「记忆文件夹」。

### 修复

- `stampUndated` 只认 `示例·` 前缀，而模板把示例放在 `<!-- -->` 里、标题是「项目的规矩」这类正常词，于是每个新装用户的示例行都被补了日期。现先算注释区间再盖章。
- `workspaceRelative: false` 会把默认 `memoryDir` 挪到 `process.cwd()`，落到工作区之外。

## [0.1.15] — 2026-11-02

### 变更

- `detours.md` 的写入口径：由「事故记录」改为「出现两次以上的形状」（我总以为 / 实际是什么 / 在哪个判断上出错）。已有内容由 11 条归并为 2 条。
- 新增配置 `detourChars`（默认 3000）：超过该长度时，块尾提示它已在记录事故而非形状。
- `diarySections` 默认值改为 `0`；设为 `0` 时关闭节数检查。
- `anchorCap` 与 `maxChars` 不再互相压制：先按权重筛选，再按字符截断，字符预算由 `anchorCap` 推导。此前把 `anchorCap` 抬到 12 也一条都进不来，末尾只多一句 `(3 more line(s) omitted)`。

### 移除

- 配置 `detourStaleDays` 及其块尾提示。

### 修复

- 设置页 `detourStaleDays`、`taskStaleDays`、`detourChars` 直接显示键名（词典缺词条）。
- `diarySections: 0` 报 `over the 0-per-day bar`。

## [0.1.14] — 2026-11-02

### 变更

- 移除运行期依赖 `zod`；`package.json` 不再有 `dependencies`。
- README 新增「它碰什么，不碰什么」一节。

## [0.1.13] — 2026-11-02

### 变更（破坏性）

- 基础文件名统一小写：`MEMORY.md` → `memory.md`，`INDEX.md` → `index.md`。`diary/README.md` 保留大写。
- 迁移：启动时就地重命名；重命名失败时，读取端仍接受旧名。

## [0.1.12] — 2026-11-02

### 新增

- `remember_note` 写入的任务带创建日：`- [ ] 2026-11-02 起 ｜ …`。
- 新工具 `complete_task`：勾掉任务并记录完成日；已完成的条目保留在文件中。
- 块尾待办提示增加「最久一条开了几天」；超过 `taskStaleDays`（默认 30，`0` 关闭）时改为逐条询问是否保留。

### 变更

- `openTasks` 返回 `{ text, opened }`。
- `complete_task` 接受整行输入（`- [ ] 2026-11-02 起 ｜ 修白名单` 与 `修白名单` 等价）；相近文本仍不匹配。

### 修复

- `lib/notes.js` 用子串匹配小节标题，`lib/sources.js` 用精确匹配，导致 `## 常被提起（手动维护，上限 8 条）` 写得进、读不出。现统一为 `parseHeadings`，拒绝时列出近似标题。
- 模板占位符行（`- （写你自己：…）`）被当作内容读取。
- 「我是谁」「硬约定」不在默认读取名单，而 README 邀请用户往里写。现由 `DEFAULT_EXTRA_SECTIONS` 默认附加。
- `anchorCap` 作用于「硬约定」节，该节条目同权重沉底。现仅作用于锚点节。
- `today()` 使用 UTC 日期，东八区 00:30 落到前一天，与 `dayOf()` 相差一天。

## [0.1.11] — 2026-11-01

### 新增

- 工具 `remember_note`：`kind: "anchor"`（默认）写入 `MEMORY.md` 的 `常被提起`；`kind: "task"` 写入新增的 `待办` 节。

### 修复

- 锚点的「被想起」探针由出生日期改为 handle（标题第一个 `·` 之前的片段）。单字 handle 退回最长片段。

## [0.1.10] — 2026-10-31

### 新增

- 设置页「开头那句介绍」改为多行输入。
- 日记每节新增 `岔路：` 行。
- 新文件 `detours.md`，随骨架创建。
- 体检查 `detours.md` 的陈旧度：超过 21 天未修改时提示。
- 体检区分「无情绪词表节」与「词表为空」。
- 体检统计缺少 `岔路：` 行的小节，自 2026-11-01 起生效。

## [0.1.9] — 2026-10-31

### 变更

- 多机同步规则写入 `skills/ofttold-ritual`：改之前先 pull，改完 push。

### 修复

- 只剩模板示例的小节被当作已加载（`loaded: 1`），注入模板示例行。现视为空，并报「读不到」。此前老文件夹不会被迁移，锚点在 `INDEX.md` 而插件读 `MEMORY.md`，两边都不觉得自己错。
- `remember_emotion` 引用 `agent/pre-step` 作用域内的 `memoryDir`，每次调用抛 `memoryDir is not defined`。

## [0.1.8] — 2026-10-30

### 变更

- 日记顶部摘要的写法：由「两三句」改为「一节一行话」，一天约 400–600 字。

## [0.1.7] — 2026-10-30

### 修复

- 设置页提示框透出背景文字：提示框改挂到 `document.body`，绕开祖先元素的 `opacity`。

## [0.1.6] — 2026-10-30

### 变更

- 注入块开头明确：块尾报「今天还没写」时，写什么由 `ofttold-ritual` skill 说明。

### 修复

- 设置页提示框不透明（未彻底修复，见 0.1.7）。

## [0.1.5] — 2026-10-30

### 修复

- `templates/INDEX.md` 宣称是默认注入源，而默认读取 `MEMORY.md`，注入的内容是模板示例行。
- 模板示例行位于正文，被当作锚点注入。现移入 HTML 注释，并在注入前剥离。
- 情绪词表占位符 `（词）` 被当作有效词。
- 配置 `sections` 指向 `INDEX.md` 时，补日期仍作用于 `MEMORY.md`。
- 无日期锚点权重恒为 1；现取中性值 0.5。

## [0.1.4] — 2026-10-30

### 新增

- 设置页重做：卡片分组、单列布局、固定选项改下拉。
- 日记节奏配置（每天 / 每周 / 关闭）。

### 修复

- `sections` 字段改为多行输入，标题标明读取的文件。
- 新增的六个字段未进入面板 state，输入框值恒为空。

## [0.1.1] – [0.1.3] — 2026-10-30

### 新增

- 注入块首行标明内容来源（笔记，非用户发言）。
- 加载失败时报告尝试过的文件与标题。
- 块尾提示今天未写日记，可在设置中关闭。
- 情绪值改为工具写入，不再依赖外部脚本。

### 变更

- 脚手架由「目录内存在任何 `.md` 则跳过」改为「逐文件补齐缺失项」。

## [0.1.0] — 2026-10-30

首次发布。
