Files
cc-web/.planning/2026-08-23-gitea-workflow/progress.md

98 lines
6.1 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.

# Gitea Workflow 进度
## 2026-08-23
### 当前阶段:需求、协议与架构文档化
- 已完成用户需求 grilling 对齐。
- 已确认 cc-web 本地会话、Codex App、MCP 注入和 turn 完成代码入口。
- 已确认官方 gitea-mcp 的 stdio、环境变量和工具覆盖。
- 已创建主实施计划,准备并行派发文档与协议核验子任务。
### 文件
- `.planning/2026-08-23-gitea-workflow/task_plan.md`
- `.planning/2026-08-23-gitea-workflow/findings.md`
- `.planning/2026-08-23-gitea-workflow/progress.md`
### 测试
| 测试 | 结果 |
|---|---|
| 当前 git status | 工作区初始干净 |
| codebase-memory 索引 | ready |
## 2026-08-24
### 当前阶段:集成验收与交付
- 已落地 `lib/gitea-workflow-domain.js`、`store`、`queue`、`service`,统一由 `server.js` 挂接。
- 已落地 Webhook HMAC/mention/delivery 去重、HTTPS 工作区 clone/fetch、临时 Git 凭据和脏目录阻塞。
- 已落地 Codex App 线程级官方 `gitea-mcp`、turn 标记、回执查询、一次只补发回执和 REST 兜底。
- 已落地配置、仓库、任务、审计、暂停/恢复/取消/中止管理 API 与前端页面。
- 专项测试全部通过:Webhook 回归 9 场景、核心 7 项、工作区、Codex、管理页面。
- `npm run regression` 已在 60 秒门限内完成并输出 `Regression checks passed.`;此前的长时观察记录已由最终回归结果覆盖。另已通过 `codexapp-unrouted-routing`、`composer-slash-routing`、`codexapp-stale-running` 目标回归。
- 当前主机未安装 `gitea-mcp` 可执行文件,也未配置真实 Gitea host/token;真实出站 MCP/REST 回帖仍需部署后 smoke test。
### 2026-08-24 主任务终审补强
- 修正隐藏回执补发轮次的 turn 标识校验:允许初始预分配标识与历史补发标识集合,避免
Agent 已回帖但因 Codex 实际 turnId 变化被误判为缺失。
- 查询 Gitea 回帖状态为 `unknown` 时改为保守失败:不自动补发/REST 覆盖,先发送状态
告警并标记 `failed_reply`,与 CODEX-INTEGRATION、PRD、ARCHITECTURE 统一。
- 工作区成功/脏目录状态回写 Workflow Store;管理页补齐仓库工作区、队列数、活动任务、
脏目录原因和审计日志镜像;配置接口校验 Gitea 地址并保留 0600 凭据文件。
- Gitea 管理 JS/CSS 使用独立缓存版本,避免只修改管理资源时命中旧缓存。
- 修正管理停用仓库后的规范化 Webhook 路径:`enqueueNormalizedTask` 现在返回明确
`ok`,对已停用仓库拒绝入队并写入审计,避免通过独立 receiver 绕过停用控制。
- 管理页保存的并发上限现会在重启后被 Workflow 服务读取;环境变量凭据只同步“已配置”
标志,不把明文 Secret 写入管理状态。
- 工作区脏目录现在记录 `dirtySessionKey`:同一 Issue/PR 会话后续 turn 可安全沿用现场,
跳过 fetch/checkout;其他讨论仍进入 `blocked_workspace`,且每轮结束会重新探测并在清洁后
自动清除脏标记。
- Webhook 对完整 `ccweb-gitea` 隐藏标识做前置过滤,即使 Gitea 事件缺少作者字段也不会
触发自循环。
- 队列的工作区阻塞、失败、取消和中止终态现在统一发送 Gitea 状态评论;REST 兜底成功
会单独标记“REST 兜底回帖”,避免用户只看到初始排队消息。
- 管理配置更新和控制操作均强制要求 `reason`,并在接口层返回 `reason_required`,保证审计
记录不会出现无原因的人工运维动作。
### 终审验证
| 测试 | 结果 |
|---|---|
| Gitea 专项 5 脚本 | 全部通过 |
| `node --check` + `git diff --check` | 通过 |
| `timeout 60s npm run regression` | `Regression checks passed.` |
| 隔离服务启动/HTTP 冒烟 | 根页面 200;未认证管理 API 401;未配置 Secret 的 Webhook 503 |
### 主任务验收补强
- 复核子任务实际代码、管理页面/API 挂接、文档和持久化边界;未发现重复路由或
覆盖核心模块的问题。
- 修正 `server.js` 启动时环境配置同步:只有实际提供的环境字段才覆盖管理镜像,
避免空的 `CC_WEB_GITEA_WORKSPACE_ROOT` 或并发字段覆盖页面已保存配置。
- 重新通过五个 Gitea 专项脚本、`node --check`、`git diff --check` 和
`timeout 60s npm run regression`。
- 隔离实例 HTTP 冒烟再次通过:根页面 200、未认证管理 API 401、未配置 Secret
的 Webhook 503;未触碰当前 PM2 进程。
- 追加运行时收敛保护:初始/补发 Codex turn 启动被拒绝时立即清理 waiter 并进入
回帖失败/REST 兜底路径;任务持久化 `turnState/turnStartedAt/turnUpdatedAt`,
管理页可看到更准确的 Turn 状态。
- 工作区校验新增 Gitea host 白名单,阻止 Webhook 携带跨实例 clone URL;队列恢复
和入队按评论创建时间(缺失时按接收/创建时间)排序,满足同讨论串顺序处理。
- 上述补强后核心、Webhook、管理专项测试与语法/差异检查均再次通过。
- 启动配置镜像现在会读取 Secret 文件实际内容后再标记“已配置”,不存在或空文件
不会造成管理页虚报凭据可用;隔离 HTTP 冒烟仍通过。
- 对“每个 @ 必须有回执”再补强:停用仓库或 Webhook 异步入队异常会发送带任务标识的
Gitea 状态回帖,而不是只写本地日志。
- 澄清交互采用独立 `waiting_user` 隐藏回执标识;Agent 提问不会被误判为最终回帖
缺失,也不会触发重复修改型 reply retry。未配置 Bot Token 时 Webhook 直接 503,
防止接受无法回帖的任务。
- 最终专项脚本、语法检查、差异检查和完整 regression 均通过。
- 复核“文档与集成测试”子任务回传:7 个 fixture 均可解析,独立脚本未加载
`server.js`,9/9 场景覆盖验签、过滤、恢复、回帖补偿、MCP 和安全边界;未发现
该子任务修改 `server.js` 的证据。
- 主任务随后补上状态评论持久化幂等键(`taskId:status`),使 ARCHITECTURE/PRD
中的评论幂等契约与运行实现一致;专项测试继续通过。