harness.mdc 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. ---
  2. description:
  3. alwaysApply: true
  4. enabled: true
  5. updatedAt: 2026-04-04T00:38:45.522Z
  6. provider:
  7. ---
  8. # 长时运行代理规则
  9. ## 核心原则
  10. 1. **双 Agent 架构**:Initializer Agent(仅首次)+ Coding Agent(后续所有会话)
  11. 2. **外部持久化**:所有进度必须写入文件,不依赖 AI 记忆
  12. 3. **增量开发**:每次会话只完成 1 个功能
  13. 4. **状态流转**:功能状态按流程逐步推进(start → 编译 → 运行 → 数据库 → 测试 → done)
  14. 5. **自动执行**:AI 必须自动执行所有命令,禁止输出命令让用户手动执行
  15. 6. **失败处理**:验证失败 → 记录状态 → 修复 → 重新执行该环节
  16. ---
  17. ## 功能状态定义
  18. ### 状态流转图
  19. ```
  20. init → start → compiling → running → db-checking → backend-testing → frontend-testing → done
  21. ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
  22. 初始化 开始开发 编译中 运行中 数据库验证中 后端测试中 前端测试中 完成
  23. ```
  24. ### 状态说明
  25. | 状态 | 含义 | 下一步 |
  26. |------|------|--------|
  27. | `init` | 功能已创建,未开始 | → `start` |
  28. | `start` | 开始开发 | → `compiling` |
  29. | `compiling` | 编译中/编译失败 | 成功 → `running`,失败 → 修复 |
  30. | `running` | 运行中/运行失败 | 成功 → `db-checking`,失败 → 修复 |
  31. | `db-checking` | 数据库验证中/失败 | 成功 → `backend-testing`,失败 → 修复 |
  32. | `backend-testing` | 后端接口测试中/失败 | 成功 → `frontend-testing`,失败 → 修复 |
  33. | `frontend-testing` | 前端页面测试中/失败 | 成功 → `done`,失败 → 修复 |
  34. | `done` | 功能完成 | - |
  35. ### 测试阶段说明
  36. **为什么测试要分开**:
  37. > - **后端测试**:使用 curl 测试 API 接口,验证业务逻辑
  38. > - **前端测试**:使用浏览器自动化测试用户交互,验证页面功能
  39. >
  40. > **顺序要求**:
  41. > 1. 先测后端接口 → 确保 API 正常
  42. > 2. 再测前端页面 → 确保交互正常
  43. >
  44. > **原因**:如果后端接口都有问题,前端测试没有意义
  45. ---
  46. ## Initializer Agent 规则
  47. ### 职责(仅第一次运行)
  48. **核心原则:AI 必须自动执行所有初始化步骤,禁止让用户手动操作**
  49. 1. **生成 `init.sh`**:安装依赖、初始化数据库、启动服务
  50. 2. **生成 `claude-progress.txt`**:进度日志
  51. 3. **生成 `feature_list.json`**:100-200+ 细粒度功能清单(JSON 格式)
  52. 4. **初始化 Git**:
  53. ```bash
  54. git init
  55. git add .
  56. git commit -m "initial: 初始化项目"
  57. git branch main
  58. ```
  59. 5. **自动执行初始化**(关键!禁止输出命令让用户执行):
  60. ```bash
  61. # 5.1 初始化数据库
  62. mysql -u root -p123456 < database/init.sql
  63. # 5.2 安装后端依赖
  64. cd backend && mvn install
  65. # 5.3 安装前端依赖(包括 Playwright)
  66. cd ../frontend && npm install && npx playwright install chromium
  67. # 5.4 启动后端(后台运行)
  68. cd backend && mvn spring-boot:run &
  69. # 5.5 启动前端(后台运行)
  70. cd ../frontend && npm run dev &
  71. # 5.6 等待服务启动
  72. sleep 15
  73. # 5.7 验证服务可用性
  74. curl -f http://localhost:8000/health
  75. curl -f http://localhost:8080
  76. python db_check.py
  77. ```
  78. ### 禁止行为
  79. - ❌ 编写功能代码
  80. - ❌ 跳过任何工件生成
  81. - ❌ 使用占位符
  82. - ❌ **输出初始化命令让用户手动执行**
  83. - ❌ **说"启动方式"、"访问地址"等,而不实际执行**
  84. ---
  85. ## Coding Agent 规则
  86. ### 标准流程(按顺序执行,禁止跳步)
  87. #### 步骤 1:读取状态
  88. ```bash
  89. pwd
  90. cat claude-progress.txt
  91. cat feature_list.json
  92. git log --oneline -20
  93. ```
  94. #### 步骤 2:选择功能
  95. - 从 `feature_list.json` 选择最小 id 的未完成功能
  96. - 查看当前状态(应该是 `init` 或 `start`)
  97. - **只做这一条**
  98. #### 步骤 3:更新状态为 `start`
  99. ```bash
  100. # 修改 feature_list.json
  101. {
  102. "id": X,
  103. "status": "start", # 更新为 start
  104. "description": "功能描述"
  105. }
  106. # 记录日志
  107. echo "[时间戳] 开始功能 X:功能描述" >> claude-progress.txt
  108. ```
  109. #### 步骤 4:开发功能
  110. - 编写代码
  111. #### 步骤 5:编译验证(更新状态为 `compiling`)
  112. ```bash
  113. # 先更新状态
  114. {
  115. "id": X,
  116. "status": "compiling" # 更新为 compiling
  117. }
  118. # 执行编译
  119. python -m py_compile backend/*.py
  120. # 或
  121. npm run build
  122. ```
  123. **编译结果处理**:
  124. - ✅ 成功 → 更新状态为 `running`,进入步骤 6
  125. - ❌ 失败 → 保持 `compiling` 状态,记录错误,修复后重新编译
  126. #### 步骤 6:运行验证(更新状态为 `running`)
  127. ```bash
  128. # 先更新状态
  129. {
  130. "id": X,
  131. "status": "running" # 更新为 running
  132. }
  133. # 执行运行验证
  134. pkill -f "python.*main.py" || true
  135. pkill -f "npm.*dev" || true
  136. sleep 2
  137. ./init.sh
  138. sleep 10
  139. curl -f http://localhost:8000/health
  140. curl -f http://localhost:8080
  141. ```
  142. **运行结果处理**:
  143. - ✅ 成功 → 更新状态为 `db-checking`,进入步骤 7
  144. - ❌ 失败 → 保持 `running` 状态,记录错误,修复后重新运行
  145. #### 步骤 7:数据库验证(更新状态为 `db-checking`)
  146. ```bash
  147. # 先更新状态
  148. {
  149. "id": X,
  150. "status": "db-checking" # 更新为 db-checking
  151. }
  152. # 执行数据库验证
  153. python backend/db_check.py
  154. python -c "from backend.db import DB; db = DB(); db.test_connection()"
  155. ```
  156. **数据库结果处理**:
  157. - ✅ 成功 → 更新状态为 `testing`,进入步骤 8
  158. - ❌ 失败 → 保持 `db-checking` 状态,记录错误,修复后重新验证
  159. #### 步骤 8:后端接口测试(更新状态为 `backend-testing`)
  160. ```bash
  161. # 先更新状态
  162. {
  163. "id": X,
  164. "status": "backend-testing" # 更新为 backend-testing
  165. }
  166. # 使用 curl 测试后端接口
  167. # 按照 feature_list.json 中 backend_test_steps 逐项测试
  168. curl -s http://localhost:8000/api/chats/new | jq '.status' | grep -q "success"
  169. curl -f http://localhost:8000/health
  170. ```
  171. **后端测试要求**:
  172. > - 必须按照 backend_test_steps 逐项测试
  173. > - 使用 curl 测试 API 接口
  174. > - 验证接口返回状态码和数据格式
  175. **后端测试结果处理**:
  176. - ✅ 成功 → 更新状态为 `frontend-testing`,进入步骤 9
  177. - ❌ 失败 → 保持 `backend-testing` 状态,记录错误,修复后端接口后重新测试
  178. #### 步骤 9:前端页面测试(更新状态为 `frontend-testing`)
  179. ```bash
  180. # 先更新状态
  181. {
  182. "id": X,
  183. "status": "frontend-testing" # 更新为 frontend-testing
  184. }
  185. # 复制模板并修改
  186. cp .codebuddy/rules/frontend-test-template.js tests/test-frontend.js
  187. # 根据当前功能的 frontend_test_steps 修改测试内容
  188. # 然后执行浏览器自动化测试
  189. node tests/test-frontend.js
  190. ```
  191. **前端测试要求**:
  192. > - 必须按照 frontend_test_steps 逐项测试
  193. > - 使用浏览器自动化(Playwright/Puppeteer)
  194. > - 模拟真实用户操作
  195. **前端测试结果处理**:
  196. - ✅ 成功 → 更新状态为 `done`,进入步骤 10
  197. - ❌ 失败 → 保持 `frontend-testing` 状态,记录错误,修复前端后重新测试
  198. #### 步骤 10:功能完成(更新状态为 `done`)
  199. ```bash
  200. # 更新 feature_list.json
  201. {
  202. "id": X,
  203. "status": "done", # 更新为 done
  204. "passes": true
  205. }
  206. # 更新日志
  207. echo "[时间戳] 功能 X 完成 | 状态流转:start→compiling→running→db-checking→backend-testing→frontend-testing→done" >> claude-progress.txt
  208. # Git 提交
  209. git add .
  210. git commit -m "feat: 完成功能 X | 状态流转:start→compiling→running→db-checking→backend-testing→frontend-testing→done"
  211. ```
  212. ### 状态流转规则
  213. **核心原则**:
  214. > 状态必须逐步流转,不能跳跃
  215. >
  216. > 每个环节失败 → 保持当前状态 → 修复 → 重新执行该环节
  217. >
  218. > 只有该环节成功 → 才能更新为下一个状态
  219. **状态流转示例**:
  220. ```
  221. 功能 1: init → start → compiling → running → db-checking → testing → done ✅
  222. 功能 2: init → start → compiling → (失败) → 修复 → compiling → running → ...
  223. 功能 3: init → start → compiling → running → (失败) → 修复 → running → ...
  224. ```
  225. ### 禁止行为
  226. - ❌ 每次做多个功能
  227. - ❌ **跳过状态直接更新为 done**
  228. - ❌ **不执行验证流程**
  229. - ❌ 不编译就测试
  230. - ❌ 不运行就测试
  231. - ❌ 不验证数据库连接
  232. - ❌ **前端功能测试只用 curl**
  233. - ❌ **不执行前端浏览器自动化测试**
  234. - ❌ 不测试就标记 done
  235. - ❌ 删除/修改 backend_test_steps(后端接口测试步骤)
  236. - ❌ 删除/修改 frontend_test_steps(前端页面测试步骤)
  237. - ❌ **验证失败不修复**
  238. - ❌ **输出初始化/启动命令让用户手动执行**
  239. - ❌ **说"启动方式"、"访问地址"、"请执行"等**
  240. ---
  241. ## passes: true 的条件
  242. 只有状态流转到 `done`,才允许设置 `passes: true`:
  243. ```json
  244. {
  245. "id": X,
  246. "status": "done",
  247. "passes": true
  248. }
  249. ```
  250. **状态流转要求**:
  251. > 必须经历完整流程:start → compiling → running → db-checking → backend-testing → frontend-testing → done
  252. >
  253. > 不允许跳跃状态
  254. >
  255. > 失败时保持当前状态,修复后重新执行
  256. **测试阶段要求**:
  257. > - 先测后端接口 → 确保 API 正常
  258. > - 再测前端页面 → 确保交互正常
  259. > - 后端测试失败 → 禁止进入前端测试
  260. ---
  261. ## 工件规范
  262. ### feature_list.json
  263. ```json
  264. {
  265. "project_name": "项目名称",
  266. "base_config": {
  267. "backend_port": 8000,
  268. "frontend_port": 8080,
  269. "db_host": "localhost",
  270. "db_port": 3306
  271. },
  272. "features": [
  273. {
  274. "id": 1,
  275. "description": "功能描述",
  276. "backend_test_steps": [
  277. "1. curl POST /api/chats/new - 验证创建聊天接口返回 200",
  278. "2. curl GET /api/chats - 验证获取聊天列表接口返回 200",
  279. "3. curl POST /api/messages - 验证发送消息接口返回 200"
  280. ],
  281. "frontend_test_steps": [
  282. "1. 点击'新聊天'按钮",
  283. "2. 验证新聊天窗口创建",
  284. "3. 输入消息内容",
  285. "4. 点击'发送'按钮",
  286. "5. 验证消息显示在聊天窗口"
  287. ],
  288. "status": "init",
  289. "passes": false
  290. }
  291. ]
  292. }
  293. ```
  294. **更新规则**:
  295. - ✅ 只允许按流程更新 status 字段
  296. - ✅ 只有 status 为 done 时才可修改 passes: true
  297. - ❌ 禁止删除功能
  298. - ❌ 禁止删除或修改 backend_test_steps
  299. - ❌ 禁止删除或修改 frontend_test_steps
  300. - ❌ 禁止合并功能
  301. **重要说明**:
  302. > 每个功能必须包含 backend_test_steps(后端接口测试)和 frontend_test_steps(前端页面测试)
  303. > - backend_test_steps:使用 curl 测试 API 接口
  304. > - frontend_test_steps:使用浏览器自动化测试用户交互
  305. ### claude-progress.txt
  306. ```
  307. [时间戳] 初始化完成
  308. [时间戳] 开始功能 1:功能描述 | 状态:init→start
  309. [时间戳] 功能 1 编译中 | 状态:start→compiling
  310. [时间戳] 功能 1 编译失败 | 错误:XXX | 状态:compiling
  311. [时间戳] 功能 1 编译成功 | 状态:compiling→running
  312. [时间戳] 功能 1 运行成功 | 状态:running→db-checking
  313. [时间戳] 功能 1 数据库验证成功 | 状态:db-checking→backend-testing
  314. [时间戳] 功能 1 后端接口测试成功 | 状态:backend-testing→frontend-testing
  315. [时间戳] 功能 1 前端页面测试成功 | 状态:frontend-testing→done
  316. [时间戳] 功能 1 完成 | passes: false→true
  317. ```
  318. **更新规则**:
  319. - ✅ 每次会话追加新记录
  320. - ✅ 记录状态流转过程
  321. - ✅ 记录失败和修复
  322. - ❌ 禁止删除历史记录
  323. ### init.sh
  324. - 格式:Bash 脚本
  325. - 位置:项目根目录
  326. - 要求:
  327. - ✅ 一键启动项目
  328. - ✅ 安装依赖(固定版本)
  329. - ✅ 启动开发服务器
  330. - ✅ 运行基础测试
  331. ### Git
  332. - 提交频率:每次功能完成后
  333. - 提交信息:
  334. ```
  335. initial: 初始化项目
  336. feat: 完成功能 X | 状态流转:start→compiling→running→db-checking→backend-testing→frontend-testing→done
  337. fix: 修复功能 X | 状态:backend-testing (修复后端接口)
  338. fix: 修复功能 X | 状态:frontend-testing (修复前端页面)
  339. ```
  340. ---
  341. ## 失败模式处理
  342. | 问题 | 处理 |
  343. |------|------|
  344. | 过早宣布完成 | 必须按 feature_list.json 顺序完成 |
  345. | 一次做多个功能 | 每次只做 1 个 |
  346. | 留下 Bug | 每次会话前运行基础测试 |
  347. | 过早标记完成 | 必须状态流转到 done |
  348. | 数据库连不上 | 保持 db-checking 状态,修复后重新验证 |
  349. | 后端接口失败 | 保持 backend-testing 状态,修复后重新测试 |
  350. | 前端页面失败 | 保持 frontend-testing 状态,修复后重新测试 |
  351. | AI 推卸责任 | 立即纠正,必须自动执行命令 |
  352. | 一次性通过太难 | 使用状态流转,逐步推进 |
  353. ---
  354. ## 违规处理
  355. 以下行为禁止,发现后立即纠正:
  356. 1. ❌ 每次做多个功能 → 回退,重新按流程执行
  357. 2. ❌ 跳过状态直接 done → 回退,重新执行流程
  358. 3. ❌ 跳过测试阶段(后端→前端) → 回退,重新测试
  359. 4. ❌ 不测试就标记 done → 重新测试
  360. 5. ❌ 删除/修改 backend_test_steps → 恢复原文件
  361. 6. ❌ 删除/修改 frontend_test_steps → 恢复原文件
  362. 7. ❌ 不更新进度日志 → 补充更新
  363. 8. ❌ 留下 Bug → 立即修复或回退
  364. 9. ❌ 数据库失败还标记 done → 回退,修复数据库
  365. 10. ❌ 后端测试失败就测前端 → 回退,先修复后端
  366. 11. ❌ 输出命令让用户执行 → 立即纠正,AI 必须自己执行