98 lines
6.1 KiB
Markdown
98 lines
6.1 KiB
Markdown
# 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
|
||
中的评论幂等契约与运行实现一致;专项测试继续通过。
|