Files
study-tool/AGENTS.md
T
study-tool d8808e64d9 docs: AGENTS.md 增加收尾提交规则,发版流程改为工具驱动一条线
现象:发版流程里「手动提交 + 手动打 tag」与 bump-my-version 的 commit = true / tag = true
冲突,真用工具会撞同名 tag;另外没有写清「何时提交、何时必须先提交」,导致为 1 行 uv.lock
单开了提交(4784ac0)。

根因:发版步骤是按手动流程写的,后来才配了自动提交 + 打 tag 的工具,两边没有对齐;提交时机
只散落在发版一节里。

边界:
- 新增「收尾(Commit)」:任务完成后自动提交,一个任务一个 commit;附带产物(如 uv.lock)
  跟着产生它的任务走;重大变更(改依赖 / 表结构 / 规则文档 / 发版)开始前工作区必须干净;
  发版本只在用户确认后触发
- 「发版本流程」改为:整理 CHANGELOG 并普通提交 → uv lock 自检 → 工作区干净后
  uv tool run bump-my-version bump patch 一次完成改三处版本 + 提交 + 打 tag;不再手动 commit / tag
- docs/agent_workflow.md 记入三条:发版配置要 dry-run、发版只留一条线、附带产物不单开提交
- 不改代码、不改版本号、不打 tag

运行了什么:git status 自查(只提交这 2 个文档文件);提交时 pre-commit 跑 ruff / web typecheck / commitizen
没跑什么:没跑 bump-my-version 真实发版;没跑测试、没构建(本次无代码改动)
2026-11-01 21:17:42 +08:00

88 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AGENTS.md
本文档用于约束本项目中的 AI / 自动化开发行为。
**优先级:用户当前消息 > 本文件 > 其他文档。** 与本文件冲突时以用户消息为准,并在收尾时问一句要不要同步改本文件。
## 基本原则
- 先读现有代码,再动手修改,优先沿用项目已有结构和写法。
- 写代码保持最少行数,能简单实现就不要引入复杂抽象。
- 标准格式、协议、解析、压缩、加密、日期等通用能力优先使用成熟稳定的库,不要手写底层实现,除非用户明确要求或项目已有实现必须沿用。
- 不要为了“兼容更多场景”写大量分支,只实现当前明确需要的功能。
- 项目尚未上线,不需要兼容旧数据;表结构或字段调整时直接按新设计修改,不写旧字段兼容、数据迁移兜底或删除旧表的清理逻辑,除非用户明确要求。
- 不要改无关文件,不要顺手重构;顺手发现的 bug 不修,记进 `docs/progress/todo.md` 并注明位置。
- 如果工作区已有用户改动,不要回滚,不要覆盖;只在必要范围内追加修改。
### 动文件之前(Plan-first)
- 修改**已存在文件**前,先给一次改动清单:路径 / 改什么 / 为什么 / 影响面;同意后本次任务内连续执行,不逐文件问。
- 新建文件、新建目录不用逐次问,但要列进清单。
- 删除、覆盖、格式化、`git reset --hard`、`git checkout .`、`git push -f`、删分支 / 删 worktree,必须单独列出、单独同意。
- 用户当条消息里点名的改动,视为已同意。
### 验证口径
- **产物生成必须做**:前端改动 → `cd web && pnpm build`,`static/` 一起提交,不直接改 `static/` 里的产物。
- **质量验证不做**:不跑测试、不跑全量 lint / typecheck,由用户执行。例外:用户明确要求、发版、或改到核心逻辑(认证 / 计费 / 写库 / 定时任务 / 并发 / 对外协议)。
- 提交时 pre-commit 会跑 `ruff-check` / `ruff-format` / `web typecheck`,失败就修;这不算“检查语法”。
- 结论必须带依据:命令、`文件:行`、报错原文;没核实就写「未核实」。
- 命令失败、文件读不到、解析失败 → 结论是「未知」,不是「空」或「没问题」。
- 没跑的验证写 `Not tried: <原因>`。
### 收尾(Commit)
- **任务完成后自动提交**:一个任务一个 commit(一个 commit 一个目标),不为附带产物(如 `uv.lock`)单开提交,它们跟着产生它的那次任务走。
- **重大变更开始前,工作区必须干净**:重大变更指改依赖、改表结构、改 `AGENTS.md` / `docs/architecture.md` 这类规则文档、发版本;有残留改动先提交或撤销,再动手。
- **发版本是独立动作**:只在用户明确确认「发版」后才触发,见「发版本流程」。
- 提交范围:只提交本次任务的文件(`git add <具体路径>`)。提交前 `git status` 必须只剩本次任务的文件;出现别人的或无关的改动 → 停下问,不顺手提交。
- 提交信息:标题 `<区域>: <用户可见的变化>`;body 写 现象 → 根因 → 边界(哪些变了、哪些没变)→ 运行了什么 / 没跑什么。
## 多 Agent 协作
- 看板表头统一为 `| 路径 | 任务 | Agent | 状态 |`,历史行 `Agent` 列留空。
- 开工前在 `docs/agent_board.md` 追加一行,状态写 `进行中 (MM-DD HH:mm)`(如 `进行中 (11-01 19:40)`)。同一路径已有别人的 `进行中` → 停下问,不硬改。
- 完成后只改自己那行:状态改 `已完成,待实测`,**保留行**(它是完成记录)。不动别人 Agent 的行。
- 超过 24 小时仍是 `进行中` 的行(按状态里的时间算)视为过期,可以接管,但要注明接管人。
- 只有一个 Agent 在顺序开发时,认领行可以省,但改前必须先看有没有人动过同一文件。
- **并行开发(≥2 个任务同时改代码)** 时,每个任务用独立 worktree:
```bash
git worktree add ../study-tool-<任务名> -b <任务名>
cp .env ../study-tool-<任务名>/
uv sync
pnpm --dir web install
```
合并回 master 后 `git worktree remove ../study-tool-<任务名>`。单人顺序开发不强制建 worktree。
- 禁止 `git add -A` / `git add .`:必须按具体文件名暂存,防止误提交其他 Agent 未完成的改动。
## 反复提醒沉淀
- 同一个坑出现 ≥2 次(或同一个注意事项被用户纠正 2 次以上)才写成规则;只出现 1 次的先记 `docs/agent_workflow.md` 的「观察中」。
- `docs/agent_workflow.md` 每条格式:规则 / 为什么 / 证据(提交 sha、报错原文、`文件:行`)/ Seen N×。
- Seen ≥3 且用户同意,才升级进本文件;写入前先全文搜重,有同义条目就改旧的,不新增重复条目。
- 补充时写成明确、可执行的规则,避免只写模糊描述。
- Agent 只提议并附证据,**不自己改本文件**。
## 文档规范
- README 保持简洁,只放项目介绍、核心功能、快速开始和文档入口。
- 后续待办写到 `docs/progress/todo.md`,分三段:待做 / 已知偏差 / 未验证。
- 已实现但还需要用户测试确认的事项写到 `OPTIMIZATION.md`。
- 每次任务完成前,根据实际变更检查并更新 `OPTIMIZATION.md` 与 `docs/progress/todo.md`;没有变化也要确认无需修改。
- 文档里的命令、路径、字段名必须与代码一致;引用代码写 `路径 + 符号名`,不写行号。
- 文档不要写过期日期;除非用户明确要求记录具体时间。
## 发版本流程
- 发版本只在用户明确确认后触发;触发前工作区必须干净(见「收尾」)。
- 先把 `CHANGELOG.md` 的 `Unreleased` 变更整理成新的版本记录,保留空的 `Unreleased` 标题,并作为一个普通提交先提交。
- 发版前跑一次 `uv lock` 自检:它若改动了 `uv.lock`,说明某个任务漏提交了锁文件——补进那次任务,不为它单开提交。
- 工作区干净后执行 `uv tool run bump-my-version bump patch`:它一次完成「改 `metadata.yaml` / `pyproject.toml` / `uv.lock` 三处 `version` + 自动提交 + 自动打 tag」,**不要再手动 commit 或 `git tag`**。普通提交不动版本号。
- 发完用 `git log -1` 和 `git tag -l` 确认 tag 存在、HEAD 正确;打 tag 前工具会失败于同名 tag,不覆盖已有 tag。
- 发版本流程中不要执行编译、测试或构建,除非用户明确要求;前端改动仍需 `pnpm build` 并把 `static/` 一起提交(在发版前的普通提交里完成)。
## 项目契约
- 日志约定、目录分层、平台插件契约统一维护在 `docs/architecture.md`,改动结构时同步更新;本文件不再重复这些内容。