# 存储格式 ## 目录布局 ``` $DSH_HOME/memoir/ ← 默认位置,可用 memoryDir 配置改 ├── .order ← 分类顺序(一行一个 id) ├── user.md ← 一个文件 = 一个分类,文件名就是分类 id ├── projects.md └── ... ``` 没有数据库、没有索引、没有缓存。每次读写都直接落盘——文件都很小,换来的是「手工改了文件,页面刷新立刻就能看到」。 ## 一个分类文件的完整格式 ```markdown # 在做的事 ← 第一层:分类标题(就是中文名) ## 记忆册 ← 第二层:小节(可选,可以有很多个) - 把跨会话记忆整理成分类简短的 md 活文档 ← 第三层:条目 - 只承担长期宏观那一层 ``` ### 解析规则 | 行 | 含义 | |---|---| | `# 标题` | 分类的中文名(文件头,跳过) | | `## 小节名` | 第二层小节;其后的条目都归它 | | `- 内容` 或 `* 内容` | 一条记忆 | | ` ` | 上一条的元数据 | | 缩进 2 空格以上的行 | 上一条的续行(允许一条记忆写成多行) | | 其它(空行、普通段落、`###`) | 排版,忽略 | **最多三层**:`#` → `##` → `-`。更深的 `###` 不认,当普通文字忽略。 ### 元数据字段 | 字段 | 含义 | 缺省行为 | |---|---|---| | `id` | 条目标识,8 位十六进制 | **由正文内容派生**(内容不变则 id 不变) | | `imp` | 重要度 1~5 | 3 | | `at` | 最后更新日期 `YYYY-MM-DD` | 今天 | | `src` | 来源(`模型` / `页面` / `自动提炼`,或手工写的值) | 空 | id 由**内容**派生是有意为之:全量改写会重排条目,如果 id 随机生成,页面上的定位、正在编辑的条目、旧链接每次改写都会失效。 ### 手工编辑 直接改文件就行: - 加一行 `- 内容` = 加一条记忆 - 删掉一行 = 删掉一条记忆 - 改一行 = 改一条记忆 - 加一行 `## 项目名` = 开一个小节 元数据注释可以整行省略——省略时重要度按 3、日期按今天、id 按内容算。 ## 顺序文件 `.order` 是一行一个分类 id 的纯文本: ``` user self projects ``` - 存在的分类按它排序;没记在里面的排到末尾(按名字) - 模型新建分类时会自动追加到末尾 - 删掉这个文件不会坏事:退回「默认分类顺序 + 新分类按名字排」 ## 原子写 写入用「先写 `.tmp-` 再改名」的原子替换,避免页面读到半截文件。临时文件已在 `.gitignore` 里排除。