前面说过 Hermes 会用文件记住用户的信息,也能翻查历史对话。但每次启动时,Hermes 还会自动读另外几份文件,它们决定了它的身份、对用户的了解程度、以及到了项目里该做什么。
读完会知道:Hermes 启动时自动加载了哪些文件、各管什么用途、加载优先级怎么定。
5.1 三层上下文
Hermes 每次启动会从三个层面读取配置:
第一层:身份。 放在 ~/.hermes/SOUL.md。决定了 Hermes 是什么样的人。这一层全局生效,不分项目。
第二层:记忆。 放在 ~/.hermes/memories/ 目录下,分 MEMORY.md 和 USER.md 两个文件。和 SOUL.md 不同,这两个文件不需要用户手动编辑——Hermes 在对话中自动管理内容,该记的记,该清的清。
第三层:项目。 这一层与当前工作目录绑定。你在哪个目录启动 Hermes,它就去找那个目录下的项目配置文件。
5.2 第一层:身份(SOUL.md)
放在 ~/.hermes/SOUL.md。这是你亲手写的,一句话或一段描述,决定了 Hermes 的说话腔调和行事风格。每次对话都会注入到系统提示词的第一个槽位。
如果这个文件不存在,Hermes 会用内置的默认身份。
5.3 第二层:记忆(MEMORY.md 与 USER.md)
两个文件都在 ~/.hermes/memories/ 下。MEMORY.md 存项目的环境事实和技术约定,USER.md 存用户的偏好和沟通习惯。容量上限分别是 2,200 和 1,375 字符。
和 SOUL.md 最大的区别:这两个文件不是用户写的,是 Hermes 自己在对话中通过 memory 工具往里添加、替换、删除内容。每次会话启动时会拍一张快照注入提示词,会话期间即使内容变了也要等下次启动才更新。
5.4 第三层:项目配置
这一层只在终端里启动时生效。Hermes 会自动扫描当前目录,按优先顺序查找以下文件,只加载最先找到的那一个:
┌──────────────────────────┐
│ .hermes.md / HERMES.md │ ← 最高
├──────────────────────────┤
│ AGENTS.md │
├──────────────────────────┤
│ CLAUDE.md │
├──────────────────────────┤
│ .cursorrules │
├──────────────────────────┤
│ .cursor/rules/*.mdc │ ← 最低
└──────────────────────────┘
.hermes.md/HERMES.md:Hermes 原生项目配置,优先级最高。AGENTS.md:Hermes 原生格式,也兼容其他 Agent 工具。支持子目录递进加载。CLAUDE.md:兼容 Claude Code 的项目说明。.cursorrules和.cursor/rules/*.mdc:兼容 Cursor IDE 的规则文件。
如果同一个目录里同时存在多个,只加载排在最前面的那一个,后面的跳过。各个文件的用途不同,效果一样,都是告诉 Hermes 这个项目有什么规矩。选一个用就行。
举个例子。如果项目根目录有个 .hermes.md,内容是:
这个 Web 项目用 Python 3.12 + FastAPI。
后端入口在 app/main.py。
测试用 pytest,运行前激活 .venv。
编码风格遵循 ruff,commit 前必须通过 lint。
之后在这个目录启动 Hermes,这段内容会自动加入系统提示词。跟 MEMORY.md 一样,它是每一轮对话都带着的上下文——不是问到了才去找,而是每次跟大模型交互时都作为背景知识一起发送。你不需要每次开场先交代一遍技术栈和目录结构。
如果项目里没有 .hermes.md,但有 AGENTS.md,就用它。如果两个都没有,但有 CLAUDE.md,也一样能被识别。选一个你最顺手的格式就好。
5.5 一个场景
假设你桌面上有两个项目:
- blog/:写公众号和小红书文章,文章放在
content/目录,配图放在content/images/,每次发布前需要导出成排版好的 HTML。 - api/:Python FastAPI 后端,入口在
app/main.py,测试用 pytest,代码用 ruff 格式化。
没有项目配置的时候,每次切到 blog/ 跑 Hermes,都要先交代一遍场景:「帮我写一篇公众号文章,风格参照之前的那篇,配图放 content/images/ 里。」切到 api/ 又得再说一遍。
在每个项目根目录放一个 .hermes.md,问题就解决了:
blog/.hermes.md:
公众号和小红书内容项目。
文章放 content/,配图放 content/images/。
发布前需要把 Markdown 转成排好版的 HTML。
写作风格参考之前公众号的风格。
api/.hermes.md:
Python 3.12 + FastAPI 项目。
后端入口 app/main.py,开发服务器 `uvicorn app.main:app --reload`。
测试用 pytest,运行前激活 .venv。
代码风格用 ruff 检查。
之后在 blog/ 目录下启动 Hermes,说「帮我写一篇新技术趋势的文章」,它自动知道文章放 content/、配图路径、发布前要转 HTML。在 api/ 下说「帮我加一个用户注册接口」,它直接去 app/main.py 里找路由定义。不需要每次切换项目都从头交代环境。
5.6 全景回顾
把所有加载项汇总到一起:
| 层次 | 文件 | 位置 | 由谁管理 | 作用域 |
|---|---|---|---|---|
| 身份 | SOUL.md | ~/.hermes/SOUL.md |
用户 | 全局 |
| 记忆 | MEMORY.md | ~/.hermes/memories/ |
Hermes 自动 | 全局 |
| 记忆 | USER.md | ~/.hermes/memories/ |
Hermes 自动 | 全局 |
| 项目 | .hermes.md | 项目目录(找 git 根) | 用户 | 当前项目 |
| 项目 | AGENTS.md | 项目目录 + 子目录 | 用户 | 当前项目 |
| 项目 | CLAUDE.md | 项目目录 | 用户 | 当前项目 |
| 项目 | .cursorrules | 项目目录 | 用户 | 当前项目 |
SOUL.md、MEMORY.md、USER.md 是全局的,每次会话都加载。项目配置文件按目录发现,只加载一种。所有上下文文件加起来不超过 20,000 字符,超出部分自动截断。
5.7 ■ 学点英语
| 中文 | English | 音标 | 说明 |
|---|---|---|---|
| 启动上下文 | Startup Context | /ˈstɑːrtʌp ˈkɑːntekst/ | Agent 启动时预先加载的背景信息 |
| 预加载指令 | Preloaded Instruction | /ˌpriːˈloʊdɪd ɪnˈstrʌkʃən/ | 任务开始前就注入系统的指令内容 |
| 上下文注入 | Context Injection | /ˈkɑːntekst ɪnˈdʒekʃən/ | 在任务开始前把背景信息放入模型输入 |
| 启动配置 | Startup Configuration | /ˈstɑːrtʌp kənˌfɪɡjəˈreɪʃən/ | 影响程序启动行为的配置项 |