Files
Xboard/docs/helloagents-workflow-pitfalls.md
yinjianm 30c2f655e7 fix(admin-frontend): 修复节点权限组保存与协议默认值
统一将节点编辑和批量修改的 group_ids、route_ids
序列化为字符串 ID,避免保存权限组后订阅侧无法命中节点

后端新增 whereGroupId 兼容历史字符串与数字 JSON 值,
并补齐 TUIC 版本、ALPN 选项及 AnyTLS 默认 Padding 配置

docs: 新增 HelloAGENTS 通用与工作流避坑指南
2026-04-27 23:03:57 +08:00

343 lines
10 KiB
Markdown
Raw Permalink 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.
# HelloAGENTS 工作流踩坑复盘
## 适用范围
本文记录本轮在 `E:\code\php\Xboard-new` 中调用 HelloAGENTS Standby 工作流时踩到的坑,适用于后续在 Windows + PowerShell + 已激活 `.helloagents/` 项目中执行编码、验证、文档沉淀和收尾任务。
## 总原则
1. 当前用户消息优先于旧状态文件。
2. 代码和真实命令输出优先于记忆、文档和推断。
3. 工具失败必须记录为验证结论或阻断项,不能静默跳过。
4. `output_format=true` 时,只在最后一条收尾消息使用 HelloAGENTS 输出格式。
5. 涉及 `public/assets/admin` 时,必须同时看根仓和子模块状态。
## 坑点清单
### 1. `scripts/turn-state.mjs` 被协议要求,但项目中不存在
**表现**
- 收尾协议要求先执行 `scripts/turn-state.mjs write`
- 实际执行 `node "scripts\turn-state.mjs" write kind=complete role=main` 时失败:
- `Cannot find module 'E:\code\php\Xboard-new\scripts\turn-state.mjs'`
- 仓库根目录也没有 `scripts/` 目录。
**根因**
HelloAGENTS 协议假设存在统一的 turn-state 脚本,但当前项目和全局运行目录没有提供该脚本。
**正确处理**
- 收尾前按协议尝试一次。
- 若脚本不存在,明确记录失败原因。
- 不要反复重试同一个不存在的路径。
- 不要因为脚本失败而伪装成 turn-state 已写入。
- 用项目状态文件 `.helloagents/sessions/master/default/STATE.md` 补充记录当前任务状态。
**下次规则**
如果仓库仍没有 `scripts/turn-state.mjs`
```powershell
node "scripts\turn-state.mjs" write kind=complete role=main
```
失败后只记录一次:
> turn-state 脚本缺失,无法写入运行态信号;已更新 `.helloagents/.../STATE.md` 作为恢复状态。
### 2. 旧 `STATE.md` 容易把新任务带偏
**表现**
进入本轮时,状态文件仍记录上一个“用户管理高级筛选活跃状态”任务,而用户实际要求是修复节点 TUIC 和权限组问题。
**根因**
`.helloagents/sessions/master/default/STATE.md` 是恢复参考,不是当前任务真相源。若直接按旧状态续作,会进入错误业务线。
**正确处理**
- 先读当前用户消息。
- 再看活跃方案包、代码、验证证据。
- 最后才用 `STATE.md` 补上下文。
- 确认是新任务后,立即重写 `STATE.md`,不要等到收尾。
**下次规则**
判断主线优先级固定为:
1. 当前用户最新消息。
2. 本轮确认的范围。
3. 当前代码与验证证据。
4. 活跃方案包。
5. `STATE.md`
### 3. 输出格式只能用于最后一条消息
**表现**
配置中 `output_format=true`,但工具执行前、执行中、阻塞说明都不能使用 HelloAGENTS 外层格式。
**根因**
输出格式只允许用于本轮最终收尾消息。中间消息如果套格式,会让运行时误判任务完成或等待输入。
**正确处理**
- 中间状态用自然语言或工具计划,不使用 `{图标}【HelloAGENTS】`
- 确认不再调用工具后,再使用最终格式。
- 如果使用了记忆引用,记忆引用块必须放在最终回复最末尾。
**下次规则**
只在满足以下条件时使用 HelloAGENTS 输出格式:
- 不再调用工具。
- 不再继续执行。
- 已完成或已明确阻塞。
- 已尝试写 turn-state,或明确记录脚本缺失。
### 4. `.helloagents/` 不是随便放文件的目录
**表现**
用户要求“提炼成一个 md 文档”,直觉上可以放到 `.helloagents/`,但协议要求 `.helloagents/` 内文件创建和更新必须遵循模板。
**根因**
`.helloagents/` 是运行态和知识库目录,部分文件有固定模板和生命周期;随意新增文档可能破坏流程约定。
**正确处理**
- 临时复盘、交付文档优先放到 `docs/`
- 只有状态、方案、知识库、归档等 HelloAGENTS 定义文件才放入 `.helloagents/`
- 更新 `.helloagents/CHANGELOG.md``modules/*.md` 时保持既有格式。
**下次规则**
用户要普通 Markdown 成品时,默认使用:
```text
docs/<topic>.md
```
除非用户明确要求放进 `.helloagents/`
### 5. 容易把快速修复膨胀成完整方案包
**表现**
节点权限组和 TUIC 模板是明确小范围修复,容易因为项目已激活而误判为必须创建完整 `plans/{feature}/`
**根因**
HelloAGENTS 有 T0-T3 交付分层,但不是所有激活项目任务都必须走完整方案包。明确、低风险、小范围、可验证的变更可按 T1 快速执行。
**正确处理**
- 先判断任务复杂度。
- 明确 bugfix 可以直接修,不用额外确认。
- 无独立方案包时,在 `CHANGELOG.md` 标记“快速修改(无方案包)”。
**下次规则**
符合以下条件时走快速修改:
- 用户描述了具体故障或具体页面。
- 改动范围可限定在少量文件。
- 不涉及生产高风险操作。
- 可用本地构建或静态检查验证。
### 6. 记忆可辅助定位,但不能替代当前证据
**表现**
记忆中已有 Xboard-new、`admin-frontend``public/assets/admin` 子模块等经验,能快速提醒验证路径和历史坑。
**风险**
记忆可能过期。直接把记忆当作当前事实,会漏掉分支、远端、目录结构变化。
**正确处理**
- 先用记忆找关键词和历史坑。
- 再用当前命令验证:
- `git status`
- `npm run build`
- 子模块状态
- 目标文件实际内容
- 最终报告区分“已验证”和“记忆提示”。
**下次规则**
记忆只能回答“应该重点看哪里”,不能回答“当前一定是什么状态”。
### 7. `public/assets/admin` 是子模块,根仓状态不等于真实前端产物状态
**表现**
执行 `npm run build` 后,根仓只显示:
```text
m public/assets/admin
```
这不是“没改到”,而是子模块内部产物发生变化。
**额外坑**
进入子模块执行 `git status` 时出现:
```text
fatal: detected dubious ownership in repository at 'E:/code/php/Xboard-new/public/assets/admin'
```
**正确处理**
使用单次 scoped safe directory,不要默认改全局配置:
```powershell
git -c safe.directory="E:/code/php/Xboard-new/public/assets/admin" -C "E:\code\php\Xboard-new\public\assets\admin" status --short --branch
```
**下次规则**
涉及管理端构建产物时必须给两层证据:
1. 根仓:源码文件变更 + `m public/assets/admin`
2. 子模块:产物文件状态或关键词检索结果。
### 8. Windows + PowerShell 下不能偷懒写命令
**表现**
当前环境是 PowerShell,路径包含盘符和反斜杠。命令如果不加引号,容易因为空格、中文或特殊字符导致路径错误。
**正确处理**
- 所有路径用双引号。
- 不用 `cmd /c`
- 多路径操作拆成多条命令。
- 文件修改优先用 `apply_patch`,避免 shell 重定向和编码问题。
**下次规则**
推荐命令形态:
```powershell
git -C "E:\code\php\Xboard-new" status --short
npm run build
```
不推荐:
```powershell
cmd /c ...
```
### 9. 验证阻断要写清楚,不能把未跑的检查说成通过
**表现**
前端可执行:
```powershell
npm run build
```
并已通过。
但 PHP 环境不可用:
```powershell
php -v
```
返回 `php` 命令不存在。
**正确处理**
- 前端构建通过就只声明前端构建通过。
- PHP 语法检查 / PHPUnit 未执行,原因写成阻断。
- 不用“应该没问题”代替验证结果。
**下次规则**
验证结果分三类写:
- 通过:命令执行成功。
- 失败:命令执行但返回错误。
- 未执行:缺少运行时、凭据、服务或外部依赖。
### 10. 工具输出需要审查,不要被外部内容带节奏
**表现**
搜索、构建、Git 输出中会混入大量无关内容,例如 `node_modules`、编译产物、历史 bundle。
**风险**
直接根据长输出行动,容易误改生成文件或误判业务源码。
**正确处理**
- 优先限定路径:
- `admin-frontend/src/...`
- `app/...`
- `.helloagents/...`
- 避免全仓递归搜索进入 `node_modules` 或大型 bundle。
- 对长输出只提取任务相关结论。
**下次规则**
检索优先使用:
```powershell
rg -n --glob "*.php" --glob "!vendor/**" "keyword" "E:\code\php\Xboard-new\app"
```
而不是不加过滤地全仓搜索。
## 标准执行清单
### 开始任务
- [ ] 判断用户最新消息是否是新任务。
- [ ] 若项目已激活,读取当前 `STATE.md`,但不让旧状态覆盖新需求。
- [ ] 判断交付层级:快速修复、完整方案、只读分析或高风险操作。
- [ ] 若需要记忆,先快速检索,再用当前文件验证。
### 执行中
- [ ] 路径全部加双引号。
- [ ] 修改源码优先用 `apply_patch`
- [ ] 不把普通文档随意放入 `.helloagents/`
- [ ] 涉及 UI 时遵守当前 Apple 风格设计契约。
- [ ] 涉及 `public/assets/admin` 时记住它是子模块。
### 验证
- [ ] 能跑的命令必须跑。
- [ ] 不能跑的命令写明原因。
- [ ] `npm run build` 只证明前端构建通过。
- [ ] PHP 缺失时不能声称后端 PHPUnit 或语法检查通过。
- [ ] `git diff --check` 可作为基础格式检查。
### 收尾
- [ ] 更新 `STATE.md` 到下一轮可恢复状态。
- [ ] 有必要时更新 `CHANGELOG.md` 和模块知识。
- [ ] 尝试执行 `scripts/turn-state.mjs write`
- [ ] 若 turn-state 脚本缺失,明确说明。
- [ ] 最后一条回复才使用 HelloAGENTS 输出格式。
## 本轮改进建议
1. 项目初始化时补齐 `scripts/turn-state.mjs`,或在协议中定义缺失时的标准 fallback。
2.`public/assets/admin` 子模块提供固定的本地 safe.directory 说明,减少每轮踩同一个 Git 安全检查。
3.`.helloagents/verify.yaml` 中区分前端、后端、子模块验证命令,避免只剩单一 `npm run build`
4. 给“快速修改(无方案包)”建立轻量记录模板,避免每次临时判断写法不一致。
5. 将 Windows PowerShell 安全命令模板沉淀为项目级约定,减少路径和编码风险。