diff --git a/docs/milestone-propose-requirements.md b/docs/milestone-propose-requirements.md index 373f61d..836fca4 100644 --- a/docs/milestone-propose-requirements.md +++ b/docs/milestone-propose-requirements.md @@ -168,6 +168,93 @@ - P10.1-P10.3 前端 Propose 类型定义 + 列表页 + 详情页骨架(让 propose 功能在 UI 上可见) - 或 P3.1 Milestone 动作接口(freeze/start/close),使 milestone 状态机真正可用 +### 2026-03-17 04:00 UTC(第 6 轮:Milestone 动作接口 freeze/start/close + auto-complete) + +本轮做了什么: +- 新建 `app/api/routers/milestone_actions.py`(313 行),实现 P3.1-P3.5 的核心后端逻辑 +- **freeze 接口**(P3.2): + - 校验 milestone 为 open + - 校验有且仅有 1 个 `maintenance/release` task,否则拒绝并给出明确错误 + - 调用 `check_permission("freeze milestone")` +- **start 接口**(P3.3): + - 校验 milestone 为 freeze + - 解析 `depend_on_milestones` / `depend_on_tasks` JSON,校验所有依赖已 completed + - 写入 `started_at`,状态改为 undergoing + - 调用 `check_permission("start milestone")` +- **close 接口**(P3.4): + - 允许从 open/freeze/undergoing → closed + - 支持 reason 参数 + - 调用 `check_permission("close milestone")` +- **auto-complete hook**(P3.5): + - `try_auto_complete_milestone()` 在 task 完成时检测是否为唯一 release task,若是则自动将 milestone 置为 completed + - 已在 tasks.py 的 transition 和 update 两个入口调用 +- **freeze 后限制**(P3.6 partial): + - milestones.py 的 `create_milestone_task` 现在禁止在 freeze 状态下添加 feature story task + - 同时禁止在 undergoing/completed/closed 下添加任何 task +- milestone 序列化新增 `started_at` 字段 +- 所有动作均写 activity log + +改了哪些关键文件: +- `HarborForge.Backend/app/api/routers/milestone_actions.py` — 新增 +- `HarborForge.Backend/app/api/routers/milestones.py` — freeze 限制 + started_at 序列化 +- `HarborForge.Backend/app/api/routers/tasks.py` — auto-complete hook(2 处) +- `HarborForge.Backend/app/main.py` — 注册 milestone_actions_router + +验证结果: +- 4 个文件 Python AST 语法检查全部通过 +- 已 commit:backend `7d8c448` + +当前阻塞/风险: +- P2 权限骨架尚未落地(`freeze/start/close milestone` permission 需要注册到 permission 表 + 默认角色种子) +- milestone 编辑限制(P3.6)只做了部分(freeze 后禁新 feature task),`completed/closed` 禁编辑还需在 update 接口加守卫 +- 前端 milestone 按钮(P8.2)尚未开始 +- 无本地 MySQL 做运行时验证 + +下一轮最建议继续做什么: +- P3.6 补全 milestone 编辑限制(update 接口在 freeze/completed/closed 时拒绝核心字段修改) +- 或 P10.1-P10.3 前端 Propose 类型 + 列表/详情页骨架 +- 或 P8.1-P8.2 前端 milestone 状态 badge + 动作按钮 + +### 2026-03-17 05:00 UTC(第 7 轮:前端 Propose 完整页面骨架 P10.1-P10.5) + +本轮做了什么: +- 新增 `Propose` 类型定义到 `types/index.ts`(P10.1) +- 新建 `ProposesPage.tsx` — 按 project 筛选的 propose 列表页 + 创建弹窗(P10.1-P10.2) + - 项目下拉选择 + - propose 卡片展示 status badge / propose_code / title / description / feat_task_id / created_at + - 内联创建弹窗(title + description) +- 新建 `ProposeDetailPage.tsx` — 完整详情页 + 状态动作按钮(P10.3-P10.6) + - 展示所有必要字段:propose_code / title / description / status / created_by / feat_task_id / timestamps + - `open` 状态显示 Accept + Reject 按钮 + - Accept 弹窗:列出当前 project 下 open 的 milestone 供选择,确认后调用 accept API + - Reject:prompt 填写 reason,调用 reject API + - `rejected` 状态显示 Reopen 按钮 + - `accepted` 状态显示 View Generated Task 跳转按钮 + - 所有动作带 loading 状态和错误提示 +- 在 `App.tsx` 注册 `/proposes` 和 `/proposes/:id` 路由 +- 在 `Sidebar.tsx` 新增 💡 Proposes 导航链接 + +改了哪些关键文件: +- `src/types/index.ts` — 新增 Propose 接口 +- `src/pages/ProposesPage.tsx` — 新增 +- `src/pages/ProposeDetailPage.tsx` — 新增 +- `src/App.tsx` — 路由注册 +- `src/components/Sidebar.tsx` — 侧边栏链接 + +验证结果: +- `npx tsc --noEmit` 零错误通过 +- 已 commit: `35e7d3a` + +当前阻塞/风险: +- ProposeDetailPage 中 "View Generated Task" 跳转使用 `feat_task_id` 作为路径,需确认后端返回的是 task id 数字还是 task code 字符串 +- Propose 编辑功能(P10.7 `open` 时编辑 title/description)尚未实现 +- CSS badge class `status-completed` / `status-closed` 可能需要新增样式 +- 权限可见性控制(按钮仅对有权限的用户显示)尚未实现,当前所有按钮对所有用户可见 + +下一轮最建议继续做什么: +- P8.1-P8.2 前端 milestone 状态 badge + 动作按钮(freeze/start/close),让 milestone 状态机在 UI 上可操作 +- 或 P3.6 补全 milestone 编辑限制(后端 update 接口守卫) + --- ## 1. 背景