Hermes 项目级上下文文件使用指南:AGENTS.md、项目路径与 Telegram 单窗口工作流

整理 Hermes 在不同项目中识别 AGENTS.md、CLAUDE.md 和 .cursorrules 的使用方式,并说明如何通过项目路径、/new、/title、profile 和 skill 避免 Telegram 单窗口上下文混乱。

Hermes 也可以像 Codex 一样读取项目级上下文文件。区别在于:Telegram 对话本身只有一个窗口,Hermes 必须先知道“本轮任务要操作哪个项目目录”,才能进入项目、读取规则,再按规则做事。

这篇文章整理一套适合日常使用的约定:每个项目放自己的 AGENTS.md,每次下任务时带上项目路径,必要时用 /new/title 分隔上下文。这样不管是写 Hugo 文章、检查 Matrix 容器,还是维护某个 Docker Compose 项目,Hermes 都能把不同项目的规则分开处理。

Hermes 支持哪些项目上下文文件

Hermes 会识别项目目录里的上下文文件,常见包括:

  • AGENTS.md
  • CLAUDE.md
  • .cursorrules

这些文件的作用是告诉机器人:这个项目是什么、文件怎么放、哪些命令必须验证、哪些目录禁止删除、哪些信息不能输出。

要注意的是,Hermes 需要先知道当前项目路径。比如 Telegram 里的默认工作目录可能是:

/home/hermesuser/.hermes/profiles/code

这个目录只是 Hermes profile 的运行目录,不一定是你的业务项目。如果只说“去改那个项目”,Hermes 不会自动知道应该读取哪个项目的 AGENTS.md

正确的说法是直接给出项目路径:

小工,进 /home/hermesuser/wiki 这个项目,看 AGENTS.md,然后帮我改 xxx。

Hermes 收到后,推荐按这个顺序工作:

  1. 进入指定项目目录。
  2. 读取 AGENTS.mdCLAUDE.md 或相关 README
  3. 查看 git status 和项目结构。
  4. 按项目规则修改。
  5. 运行验证命令。
  6. 汇报修改内容、验证结果和剩余风险。

下任务时怎么区分不同项目

最稳的格式是:

项目:/path/to/project
任务:做 xxx

例如:

项目:/home/hermesuser/wiki
任务:新增一篇 RouterOS 备份说明。

或者:

项目:/home/hermesuser/data/docker_data/matrix
任务:检查 compose 配置和最近日志。

这类写法会把项目路径明确锁定到本轮任务里。Hermes 后续读取上下文文件、执行命令和解释结果,都应该围绕这个目录展开。

推荐的项目目录结构

一个长期维护的项目,建议至少有这些文件:

/project-name/
├── AGENTS.md
├── README.md
├── docker-compose.yml
├── .env.example
├── scripts/
├── docs/
└── ...

AGENTS.md 用来写给 Hermes 的项目规则,README.md 写给人看,.env.example 只放变量名和示例值,不放真实密钥。

一个 Docker 运维项目的 AGENTS.md 可以这样写:

# AGENTS.md

## 项目说明

这是 Matrix / LiveKit 部署项目。

## 工作规则

- 修改前先看 git status。
- 不要提交真实密钥。
- Docker 项目文件放在本目录。
- 修改 compose 后必须运行 docker compose config。
- 改完要给出验证命令和真实结果。

## 常用命令

- docker compose ps
- docker compose logs --tail=100
- docker compose config

## 禁止事项

- 不要删除 data/、postgres/、media_store/。
- 不要在最终回复里输出 token/password。

以后你只要说:

小工,进这个项目处理一下。

只要上下文里已经明确“这个项目”是哪一个,Hermes 就应该按这个目录里的 AGENTS.md 规则来。

Telegram 单窗口怎么避免混乱

Telegram 只有一个聊天窗口时,最容易发生的问题是:上一轮还在写 Wiki,下一轮突然检查 Synapse 日志,机器人可能仍然带着旧项目的上下文。

可以按轻重使用下面几种办法。

方法一:每次带项目路径

这是最简单、最实用的办法。

项目 /home/hermesuser/wiki:帮我整理 RouterOS 备份文档。
项目 /home/hermesuser/data/docker_data/synapse:帮我检查容器日志。
项目 /home/hermesuser/data/docker_data/livekit:帮我升级 compose。

每次任务开头都写清项目,Hermes 就能把工作目录和项目规则绑定到本轮任务。

方法二:切项目时使用 /new

如果你准备从一个项目切到另一个项目,建议先发:

/new

然后再发:

项目:/home/hermesuser/wiki
任务:把今天 Matrix 备份流程写成文档。

/new 的作用是开启新的上下文,减少旧任务对新任务的干扰。尤其是从“运维排错”切到“写文章”、从“生产服务器”切到“本地仓库”时,很值得用。

方法三:用 /title 标记当前会话

如果这个 Telegram 会话会长期围绕一个主题使用,可以给它取标题:

/title matrix-livekit部署

或者:

/title wiki-routeros文档

这样以后翻历史记录时更容易知道这一段对话主要处理了哪个项目。

方法四:长期项目用不同 profile

如果项目之间权限、工具、模型、Telegram Token 或记忆完全不同,可以拆成不同 Hermes profile:

  • code profile:通用开发和运维。
  • matrix profile:专门处理 Matrix / Synapse。
  • wiki profile:专门维护知识库。

不过这属于更重的隔离方式。日常使用时,先做到“项目路径 + AGENTS.md + /new”通常已经足够。

Skill 和 AGENTS.md 怎么分工

Hermes 的 skill 是全局能力,项目里的 AGENTS.md 是本项目规则。两者不冲突,最好分工使用。

可以这样理解:

类型解决什么问题示例
Skill这类任务通常怎么做Matrix / LiveKit 部署、Hugo 文章流程、Hysteria2 节点部署
AGENTS.md这个项目具体怎么做哪些目录不能删、哪个仓库要提交、修改后跑什么验证

例如:

  • Matrix / LiveKit / coturn / NPM:触发 matrix-livekit-deploy
  • Synapse server notice:触发 synapse-server-notice-sender
  • Synapse Docker 备份恢复仓库:触发 synapse-docker-recovery-backup
  • Hysteria2 节点:触发 debian13-hysteria2-node
  • Gost / MWSS / Nginx / FreeBSD Reality:触发 gost-mwss-nginx-deploy
  • Hugo 文章:触发 hugo-post-workflow

真正执行时,应先看项目 AGENTS.md,再结合对应 skill。skill 解决“这类事的经验流程”,AGENTS.md 解决“这个项目的边界和规矩”。

推荐的实际工作流

长期来看,可以给每个项目都放一个 AGENTS.md

/home/hermesuser/wiki/AGENTS.md
/home/hermesuser/data/docker_data/synapse/AGENTS.md
/home/hermesuser/data/docker_data/livekit/AGENTS.md
/home/hermesuser/data/docker_data/npm/AGENTS.md

然后每次找 Hermes 时这样说:

小工,项目 /home/hermesuser/wiki,先看 AGENTS.md,然后把今天 Matrix 备份流程写成文档。

或者:

小工,项目 /home/hermesuser/data/docker_data/synapse,先看 AGENTS.md,检查一下 Synapse 是否正常。

Hermes 应按下面的顺序处理:

  1. 进入项目目录。
  2. 读取 AGENTS.md
  3. 查看 git 状态、文件结构和关键配置。
  4. 执行任务。
  5. 运行验证命令。
  6. 汇报改了什么、验证结果和剩余风险。

一句话约定

你这边用“项目路径、/new/title、每个项目的 AGENTS.md”区分项目。

Hermes 这边用“当前任务指定的工作目录、项目上下文文件、当前会话上下文、已安装 skills 和必要的历史检索”区分项目。

最稳的口诀是:

每次给 Hermes:项目路径 + 任务。

这样即使 Telegram 只有一个窗口,多个项目也不会轻易串线。