diff --git a/docs/milestone-propose-requirements.md b/docs/milestone-propose-requirements.md index 666c3ab..df76c32 100644 --- a/docs/milestone-propose-requirements.md +++ b/docs/milestone-propose-requirements.md @@ -490,6 +490,76 @@ - 或 P9.6 前端创建 task 限制(禁止通用 create 创建 feature story / release maintenance task) - 或 P5.2 补全 pending→open 依赖检查(通用依赖检查 helper) +### 2026-03-17 13:00 UTC(第 15 轮:P9.6 Task 创建限制 — 前后端完整落地) + +本轮做了什么: +- 实现 P9.6:禁止通过通用 create task 创建 `story/feature` 和 `maintenance/release` 类型的 task +- **后端 tasks.py**: + - 新增 `RESTRICTED_TYPE_SUBTYPES` 集合,定义受限类型组合 + - `_validate_task_type_subtype()` 增加 `allow_restricted` 参数,默认阻止受限组合 + - 通用 `POST /tasks` 端点自动拦截,返回 400 + 明确错误信息 + - propose accept 内部创建走 ORM 直接写入,不受此限制 +- **后端 milestones.py**: + - `POST /{milestone_id}/tasks` 端点增加 P9.6 守卫:直接拒绝 `story/feature` 创建 + - `maintenance/release` 不受限(milestone endpoint 是其合法创建入口) +- **前端 CreateTaskModal + CreateTaskPage**: + - Story subtypes 移除 `feature`(仅保留 improvement、refactor) + - Maintenance subtypes 移除 `release`(仅保留 deploy) + - 两个创建表单同步更新 + +改了哪些关键文件: +- `HarborForge.Backend/app/api/routers/tasks.py` — RESTRICTED_TYPE_SUBTYPES + 校验增强 +- `HarborForge.Backend/app/api/routers/milestones.py` — story/feature 创建拦截 +- `HarborForge.Frontend/src/components/CreateTaskModal.tsx` — 移除受限 subtypes +- `HarborForge.Frontend/src/pages/CreateTaskPage.tsx` — 移除受限 subtypes + +验证结果: +- Python AST 语法检查 tasks.py / milestones.py 均通过 +- `npx tsc --noEmit` 零错误通过 +- 已 commit:backend `c18b8f3`,frontend `2897172`,parent `6441ea5` + +当前阻塞/风险: +- `maintenance/release` task 的受控创建入口尚未明确实现(当前通过 milestone endpoint 可创建,但无专门的 release setup 流程) +- P2 权限骨架仍未落地 +- batch transition 接口尚未同步 P5.3/P5.4 校验 +- 无本地 MySQL/运行环境做集成验证 + +下一轮最建议继续做什么: +- P10.7 前端 propose 编辑限制(open 时显示编辑入口,accepted/rejected 禁止编辑主体) +- 或 P2.1 后端权限枚举注册(freeze/start/close milestone + close/reopen task + accept/reject/reopen propose) +- 或 P5.2 补全 pending→open 通用依赖检查 helper + +### 2026-03-17 14:00 UTC(第 16 轮:P10.7 前端 Propose 编辑限制) + +本轮做了什么: +- 实现 P10.7:Propose 详情页编辑功能,仅 `open` 状态可编辑 title 和 description +- **ProposeDetailPage 新增**: + - ✏️ Edit 按钮:仅 `open` 状态显示(与 Accept/Reject 同行) + - 编辑弹窗:title 输入框 + description 多行文本框 + - 调用 `PATCH /projects/{pid}/proposes/{id}` 提交修改 + - title 不能为空时 Save 按钮禁用 + - 保存成功后自动刷新详情 + - loading 状态和错误提示完整 +- `accepted` / `rejected` 状态下不显示 Edit 按钮(按钮渲染在 `open` 条件分支内),实现主体不可编辑 + +改了哪些关键文件: +- `HarborForge.Frontend/src/pages/ProposeDetailPage.tsx` — +75 行(编辑状态 + 弹窗 + handler) + +验证结果: +- `npx tsc --noEmit` 零错误通过 +- 已 commit:frontend `208538f` + +当前阻塞/风险: +- 编辑权限仅在后端校验(creator / admin / 项目管理员),前端未根据当前用户身份隐藏按钮 +- P2 权限骨架仍未落地(所有动作接口使用通用 role check 占位) +- batch transition 接口尚未同步 P5.3/P5.4 校验 +- 无本地 MySQL/运行环境做集成验证 + +下一轮最建议继续做什么: +- P2.1 后端权限枚举注册(freeze/start/close milestone + close/reopen task + accept/reject/reopen propose),这是剩余功能中最基础的依赖项 +- 或 P4.1 通用依赖检查 helper 抽取(milestone start 和 task pending→open 复用) +- 或 P5.4 补全后端 undergoing→completed 强制 comment 校验(前端已有弹窗,后端尚缺校验) + --- ## 1. 背景