Hyacehila - Personal Portfolio

AGENTS.md — 代码智能体操作协议

版本: 1.1.1
最后更新: 2026-03-13


目录

  1. 目的
  2. 核心原则
  3. 规则一 — 先澄清再执行
  4. 规则二 — 文档强制同步
  5. 规则三 — UV 环境管理
  6. 规则四 — 测试驱动开发 (TDD)
  7. 杂项操作注意事项
  8. 违规处理

1. 目的

本文档定义了所有在本项目上工作的 AI 代码智能体的操作协议。每个智能体在执行任何任务之前必须阅读并遵守本文档。这些规则不可协商,优先级高于智能体的默认行为。


2. 核心原则

# 原则 摘要
1 先问后做 指令不清晰时,必须先向用户请求澄清,而不是直接开始工作。
2 文档随代码更新 每次代码变更必须伴随相应的文档更新。
3 先读后写 在进行任何修改之前,必须先阅读 doc/ 文件夹中的现有文档。
4 Windows 下端到端使用 UTF-8 当任务在 Windows 上涉及中文或其他非 ASCII 文本时,智能体必须先确保终端、子进程和文件 I/O 全链路使用 UTF-8,再信任输出结果。
5 仅限 UV 所有 Python 项目使用 UV 作为唯一的包管理和环境管理工具。禁止直接使用 pip、conda 或 virtualenv。
6 先写测试 严格遵循 TDD 循环。在测试存在并失败之前,不得编写功能代码。

3. 规则一 — 先澄清再执行

3.1 何时需要提问

如果以下任何一个条件成立,智能体必须在开始任务之前向用户请求澄清:

3.2 如何提问

请求澄清时,智能体必须:

  1. 陈述已理解的内容: 总结对用户指令的理解。
  2. 指出模糊之处: 清楚地描述哪些内容不清楚或缺失。
  3. 提出选项: 尽可能提供 2-3 个具体的选项或解读供用户选择。
  4. 保持简洁: 不要过度解释,使用要点列表。

3.3 示例

用户: "更新博客的样式"

智能体回复(正确):
在开始之前,我想确认几点:
- **具体修改哪方面的样式?**
  (a) 博客文章内容排版(标题、段落、代码块)
  (b) 博客列表页面布局
  (c) 博客导航栏或侧边栏
  (d) 以上全部
- **是否有具体的设计参考**(截图、URL 或文字描述)?
- **是否也需要影响主页作品集的样式**,还是仅限于博客部分?

智能体回复(错误):
[直接开始修改 assets/css/style.css,未经询问]

3.4 例外 — 无需澄清的情况

以下情况智能体可以直接执行:


4. 规则二 — 文档强制同步

4.1 先读后写规则

在对项目进行任何修改之前,智能体必须:

  1. 阅读 doc/ 文件夹中所有相关的文档。
  2. 确定 哪些文档将受到计划中变更的影响。
  3. 执行 代码/内容的变更。
  4. 更新 受影响的文档以反映变更。

没有相应文档更新的代码变更被视为未完成。 智能体在文档也更新完毕之前,不得将任务报告为”已完成”。

4.2 什么算作”变更”

任何改变项目行为、结构或约定的修改,包括但不限于:

变更类型 文档影响
创建新博客文章 如果引入了新模式,更新 doc/blog-conventions.md
添加或重命名文件/文件夹 更新 doc/project-structure.md
修改 _config.yml 更新 doc/configuration.md
修改布局或包含文件 更新 doc/layouts-and-includes.md
CSS/JS 变更 更新 doc/frontend-guide.md
添加新功能 创建或更新 doc/ 中的相关文档
构建/部署流程变更 更新 doc/deployment.md

4.3 文档质量标准

更新文档时,智能体必须:

4.4 创建新文档

如果变更引入了现有文档未涵盖的内容,智能体必须:

  1. doc/ 中创建新的 .md 文件,使用描述性文件名(kebab-case, 英文)。
  2. doc/README.md(文档索引)中添加对新文档的引用。

5. 规则三 — UV 环境管理

5.1 策略

UV 是本工作区所有 Python 项目唯一的包管理和环境管理工具。 智能体禁止直接使用 pipcondavirtualenvvenvpoetry。所有依赖和环境操作必须通过 uv 完成。

5.2 常用命令

任务 命令 说明
初始化新项目 uv init 创建 pyproject.toml 和项目脚手架
创建虚拟环境 uv venv 在项目根目录创建 .venv/
激活虚拟环境 .venv\Scripts\activate (Windows) 运行项目代码前激活
添加依赖 uv add <package> 添加到 pyproject.toml 并安装
添加开发依赖 uv add --dev <package> 用于测试/lint/仅开发用的包
移除依赖 uv remove <package> pyproject.toml 中移除并卸载
安装所有依赖 uv sync 根据 lock 文件安装所有依赖
更新 lock 文件 uv lock 根据 pyproject.toml 重新生成 uv.lock
在环境中运行命令 uv run <command> 在托管环境中运行,无需手动激活
查看已安装的包 uv pip list 列出当前环境中的包

5.3 关键文件

文件 用途 版本控制
pyproject.toml 项目元数据和依赖声明 必须提交
uv.lock 确定性 lock 文件,包含精确解析的版本 必须提交
.venv/ 本地虚拟环境目录 必须加入 .gitignore
.python-version 项目固定的 Python 版本(可选) 如存在则提交

5.4 关键规则

  1. 禁止直接运行 pip install 始终使用 uv adduv sync
  2. 禁止手动修改 uv.lock 该文件由 uv lockuv add 自动生成。
  3. 依赖变更时必须同时提交 pyproject.tomluv.lock
  4. 使用 uv run 执行脚本和工具,以确保使用正确的环境。
  5. 如果项目尚无 pyproject.toml,先运行 uv init 再添加依赖。

6. 规则四 — 测试驱动开发 (TDD)

6.1 TDD 强制要求

智能体必须严格遵循 TDD 循环。在测试存在并失败之前,禁止编写功能代码。 这是防止“幻觉式编程”(写出看似正确但实际无法运行的代码)的核心机制。

6.2 工作流程:红-绿-重构

每个功能的开发必须严格按照以下步骤执行:

  1. 分析需求 — 理解用户的需求,明确预期行为。
  2. 编写测试 — 在 tests/ 文件夹中编写断言预期行为的测试用例。
  3. 验证失败 (RED) — 通过 uv run pytest 运行测试,测试必须失败(证明功能尚未实现)。
  4. 实现功能 — 编写最少量的代码使测试通过。
  5. 验证通过 (GREEN) — 再次运行测试,测试必须通过
  6. 重构 — 在确保测试仍然通过的前提下,清理和优化代码。

跳过步骤 2-3(先写功能代码再补测试)是严格禁止的。

6.3 测试金字塔:分层测试策略

智能体必须根据变更的范围编写不同层级的测试:

A. 单元测试 (Unit Tests) — 基础层

B. 集成测试 (Integration Tests) — 连接层

C. 系统/CLI 测试 (System / E2E Tests) — 黑盒层

6.4 Mocking 策略:模拟外部依赖和 E2E 豁免

6.5 测试目录结构

tests/
├── conftest.py            # 共享 fixtures 和测试配置
├── unit/                  # 单元测试
│   ├── test_parser.py
│   └── test_models.py
├── integration/           # 集成测试
│   ├── test_pipeline.py
│   └── test_database.py
└── e2e/                   # 端到端/系统测试
    └── test_cli.py

6.6 测试验证协议

在将任务标记为“完成”之前,智能体必须运行完整的测试套件:

uv run pytest tests/ -v

6.7 测试失败诊断:代码错误 vs 测试错误

核心认知:测试本身由 AI 生成,因此测试代码也可能出错。

当测试失败时,存在两种可能的原因,智能体必须先诊断再修复:

原因 描述 处理方式
A. 功能代码不满足需求 代码存在 Bug 或未实现预期行为 修复功能代码,重新运行测试
B. 测试本身未正确反映需求 测试的断言、假设或 Mock 设置有误,不符合最初的设计需求 修正测试用例,重新运行测试

诊断流程:

  1. 回溯需求 — 重新阅读用户的原始需求和相关文档,明确”正确行为”应该是什么。
  2. 审查测试 — 检查测试的断言是否准确反映了需求。问自己:”这个测试断言的行为,是用户真正想要的吗?”
  3. 审查代码 — 检查功能代码的逻辑是否符合需求。
  4. 判定 — 确定是代码还是测试需要修改(也可能两者都需要)。
  5. 修复并记录 — 修复后在提交信息或注释中说明修复的是代码还是测试,以及原因。

禁止盲目修复:不得在不理解失败原因的情况下,简单修改代码让测试通过,或简单修改测试让它不再失败。每次修复都必须基于对需求的正确理解。

6.8 何时需要编写测试

场景 要求
新增功能 必须先写测试 (TDD)
修复 Bug 必须先写复现该 Bug 的测试,再修复
重构代码 确保现有测试通过,必要时补充测试
修改配置/文档 无需测试

7. 杂项操作注意事项

以下注意事项适用于日常智能体工作,即使前文没有单独点名说明,也同样必须遵守。

7.1 文件编码与文本处理

[Console]::InputEncoding = [System.Text.UTF8Encoding]::new($false)
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
$OutputEncoding = [Console]::OutputEncoding
Get-Content -Encoding utf8 ./notes.md
Set-Content -Encoding utf8 ./notes.md '中文示例'
python -X utf8 ./script.py

7.2 最小且安全的修改

7.3 内容校验


8. 违规处理

如果智能体意识到违反了本文档中的任何规则(例如,未请求澄清就开始工作,或未更新文档就修改了代码),必须:

  1. 立即停止当前任务。
  2. 向用户承认违规行为。
  3. 在继续之前纠正违规。