Compare commits

...

35 Commits

Author SHA1 Message Date
081706f735 quick fix 2026-04-15 07:14:36 +01:00
zhi
3e9f91f54b chore: update HarborForge.Test submodule pointer to main head 2026-04-05 22:18:03 +00:00
zhi
671db14797 chore: update HarborForge submodule pointers 2026-04-05 22:14:41 +00:00
h z
afb190003e Merge pull request 'dev-2026-03-29' (#7) from dev-2026-03-29 into main
Reviewed-on: #7
2026-04-05 22:11:44 +00:00
72d08a3c56 chore: bump HarborForge component pointers for code-first indexing 2026-04-03 16:25:48 +00:00
zhi
1efd77f07a TEST-CLI-CAL-001 TEST-CLI-PR-001 complete CLI test tasks 2026-04-01 12:03:37 +00:00
zhi
9fc0b4934e TEST-FE-PR-001: Mark task as completed
- Essential 列表与表单 ✓
- Accept milestone 选择 ✓
- story 创建入口限制 ✓
2026-04-01 11:41:56 +00:00
zhi
d5d0fa3223 TEST-FE-CAL-001 complete calendar frontend test coverage 2026-04-01 11:06:05 +00:00
zhi
e30a65b8b5 TEST-BE-CAL-001 record calendar backend test completion 2026-04-01 10:35:57 +00:00
zhi
f984a81f86 TEST-BE-PR-001 verify backend proposal tests 2026-04-01 10:04:50 +00:00
zhi
4a51fb10f7 PLG-CAL-004: Mark task as complete - ScheduledGatewayRestart handling
- Update submodule to include state persistence and restart handling
- Mark PLG-CAL-004 tasks as complete in TASKLIST.md
2026-04-01 09:41:24 +00:00
zhi
9aa385db8c PLG-CAL-003 complete plugin deferred replanning 2026-04-01 08:52:16 +00:00
zhi
fea3c05999 PLG-CAL-002: Mark task as complete
- Update TASKLIST.md to mark PLG-CAL-002 as completed
- Plugin submodule updated with scheduler implementation
2026-04-01 08:45:38 +00:00
zhi
f3f85a4b32 chore: mark PLG-CAL-001 complete in TASKLIST.md
- PLG-CAL-001: Calendar heartbeat format — all 3 sub-items completed:
  claw_identifier 传递方式 / agent_id 传递方式 / slot 列表结构
- Spec documented in HarborForge.OpenclawPlugin/docs/PLG-CAL-001-calendar-heartbeat-format.md
2026-04-01 07:52:39 +00:00
zhi
7ca3bbb668 feat(OpenclawPlugin): PLG-CAL-001: Calendar heartbeat format — submodule update
Update HarborForge.OpenclawPlugin to commit 55d7d11:
- plugin/calendar/types.ts: heartbeat request/response TypeScript types
- plugin/calendar/calendar-bridge.ts: CalendarBridgeClient HTTP client
- plugin/calendar/index.ts: module exports
- docs/PLG-CAL-001-calendar-heartbeat-format.md: full format specification
- plugin/openclaw.plugin.json: calendar config options

Ref: HarborForge.NEXT_WAVE_DEV_DIRECTION.md §6, PLG-CAL-001
2026-04-01 07:52:07 +00:00
zhi
54c416c01d CLI-CAL-001/002/003/004/005/006/007/008/009/010: Calendar CLI commands 2026-04-01 07:02:47 +00:00
zhi
087e477395 CLI-PR-001/002/003/004: Proposal rename, Essential commands, story restriction 2026-04-01 06:56:30 +00:00
zhi
113b2757ee FE-CAL-004/005: Calendar create/edit/cancel + status warnings 2026-04-01 06:50:11 +00:00
zhi
0418ce7f0b FE-CAL-001/002/003: Calendar page skeleton with slot list and plans view 2026-04-01 06:48:22 +00:00
zhi
88a5d94d12 Update Frontend submodule: FE-PR-005 story restriction 2026-04-01 06:46:27 +00:00
zhi
ce84a5387a FE-PR-003/004/005: Mark existing Essential forms & Accept modal done; remove story from task creation
- FE-PR-003: Essential create/edit modal with type selector and partial refresh already implemented in ProposalDetailPage
- FE-PR-004: Accept modal with milestone selector and generated tasks display already implemented
- FE-PR-005: Remove 'story' from TASK_TYPES in CreateTaskPage and CreateTaskModal - all story/* must come from Proposal Accept workflow
2026-04-01 06:46:01 +00:00
zhi
ad0d1675b0 FE-PR-002: Mark task as completed in TASKLIST.md 2026-04-01 06:28:52 +00:00
zhi
0596043b47 FE-PR-002: Update Frontend submodule for Essential list feature 2026-04-01 06:25:54 +00:00
zhi
a8d40134af FE-PR-001: Update Frontend submodule - Propose -> Proposal rename 2026-04-01 04:46:50 +00:00
zhi
c40774199e BE-AGT-004 complete exhausted recovery parsing 2026-04-01 04:18:48 +00:00
zhi
1c87e24ea9 BE-AGT-003: mark task complete, update Backend submodule ref 2026-04-01 02:50:20 +00:00
zhi
e758f977fc BE-AGT-002: mark task complete, update Backend submodule ref 2026-04-01 00:46:23 +00:00
zhi
c4d2b836ca BE-AGT-001: mark task complete, update backend submodule 2026-03-31 23:01:52 +00:00
zhi
6bcea047db BE-CAL-API-007: update submodule ref and mark task complete 2026-03-31 20:46:53 +00:00
zhi
13d13a0f5e BE-CAL-API-006: implement plan-edit and plan-cancel API endpoints
- PATCH /calendar/plans/{plan_id}: edit a recurring schedule plan
  - Validates period-parameter hierarchy after merge
  - Rejects edits to inactive (cancelled) plans
  - Detaches future materialized slots so they keep old data
  - Past materialized slots remain untouched

- POST /calendar/plans/{plan_id}/cancel: cancel (soft-delete) a plan
  - Sets is_active=False
  - Detaches future materialized slots (plan_id -> NULL)
  - Preserves past materialized slots, returns their IDs

- Added SchedulePlanEdit and SchedulePlanCancelResponse schemas
- Imported guard_plan_edit/cancel_no_past_retroaction from slot_immutability
2026-03-31 16:46:22 +00:00
zhi
3a65c94764 Update Backend submodule: BE-CAL-API-005 2026-03-31 14:47:21 +00:00
zhi
b5163d5e0f BE-CAL-API-005: implement plan-schedule / plan-list API
- Add SchedulePlanCreate, SchedulePlanResponse, SchedulePlanListResponse schemas
- Add DayOfWeekEnum, MonthOfYearEnum schema enums
- Add POST /calendar/plans endpoint (create plan with hierarchy validation)
- Add GET /calendar/plans endpoint (list plans, optional include_inactive)
- Add GET /calendar/plans/{plan_id} endpoint (get single plan)
- Mark BE-CAL-API-005 complete in TASKLIST.md
2026-03-31 14:46:45 +00:00
zhi
16bcd94027 BE-CAL-API-004: Implement Calendar cancel API for real and virtual slots
- Add POST /calendar/slots/{slot_id}/cancel for real slot cancellation
- Add POST /calendar/slots/virtual/{virtual_id}/cancel for virtual slot cancellation
- Virtual cancel materializes the slot first, then marks as Skipped
- Both endpoints enforce past-slot immutability guard
- Both endpoints detach from plan (set plan_id=NULL)
- Status set to SlotStatus.SKIPPED on cancel
- Add TimeSlotCancelResponse schema
- Import guard_cancel_real_slot and guard_cancel_virtual_slot
2026-03-31 12:47:56 +00:00
zhi
e561298c97 BE-CAL-API-003: implement Calendar edit API for real and virtual slots
- Add TimeSlotEdit schema (partial update, all fields optional)
- Add TimeSlotEditResponse schema
- Add PATCH /calendar/slots/{slot_id} for editing real slots
- Add PATCH /calendar/slots/virtual/{virtual_id} for editing virtual slots
  - Triggers materialization before applying edits
  - Detaches from plan after edit
- Both endpoints enforce:
  - Past-slot immutability guard
  - Overlap detection (excluding self)
  - Plan detachment on edit
  - Workload warnings in response
2026-03-31 10:46:19 +00:00
zhi
7e3acf80ce BE-CAL-API-002: Implement calendar day-view query API
- Add GET /calendar/day endpoint with optional ?date= query param
- Returns unified CalendarDayResponse merging real slots + virtual plan slots
- New CalendarSlotItem schema supports both real (id) and virtual (virtual_id) slots
- Excludes inactive slots (skipped/aborted) from results
- All slots sorted by scheduled_at ascending
2026-03-31 07:19:01 +00:00
7 changed files with 183 additions and 182 deletions

View File

@@ -144,236 +144,237 @@
- [x] 支持 job/system/event_data
- [x] 接入 overlap 与 workload warning
- [ ] BE-CAL-API-002:实现某日 Calendar 查询 API(backend only)
- [ ] 返回真实 slot
- [ ] 合成当日 plan 虚拟 slot
- [ ] 输出统一排序结构
- [x] BE-CAL-API-002:实现某日 Calendar 查询 APIbackend only
- [x] 返回真实 slot
- [x] 合成当日 plan 虚拟 slot
- [x] 输出统一排序结构
- [ ] BE-CAL-API-003:实现 Calendar 编辑 API(backend only)
- [ ] 支持真实 slot 编辑
- [ ] 支持虚拟 slot 编辑并触发物化
- [ ] 返回编辑后的真实结果
- [x] BE-CAL-API-003:实现 Calendar 编辑 APIbackend only
- [x] 支持真实 slot 编辑
- [x] 支持虚拟 slot 编辑并触发物化
- [x] 返回编辑后的真实结果
- [ ] BE-CAL-API-004:实现 Calendar 取消 API(backend only)
- [ ] 支持真实 slot cancel
- [ ] 支持虚拟 slot cancel 并触发物化
- [ ] 处理状态字段更新
- [x] BE-CAL-API-004:实现 Calendar 取消 API(backend only)
- [x] 支持真实 slot cancel
- [x] 支持虚拟 slot cancel 并触发物化
- [x] 处理状态字段更新
- [ ] BE-CAL-API-005:实现 plan-schedule / plan-list API(backend only)
- [ ] 创建计划
- [ ] 列出计划
- [ ] 返回计划规则字段
- [x] BE-CAL-API-005:实现 plan-schedule / plan-list API(backend only)
- [x] 创建计划
- [x] 列出计划
- [x] 返回计划规则字段
- [ ] BE-CAL-API-006:实现 plan-edit / plan-cancel API(backend only)
- [ ] 编辑计划
- [ ] 取消计划
- [ ] 不追溯已物化过去数据
- [x] BE-CAL-API-006:实现 plan-edit / plan-cancel APIbackend only
- [x] 编辑计划
- [x] 取消计划
- [x] 不追溯已物化过去数据
- [ ] BE-CAL-API-007:实现 date-list API(backend only)
- [ ] 仅列出有已物化未来 slot 的日期
- [ ] 排除纯 plan 未物化日期
- [x] BE-CAL-API-007:实现 date-list API(backend only)
- [x] 仅列出有已物化未来 slot 的日期
- [x] 排除纯 plan 未物化日期
## E. HarborForge.Backend - Agent / Plugin Calendar 协作
- [ ] BE-AGT-001:定义心跳查询待执行 slot 的服务层(backend only)
- [ ] 筛选当天 `NotStarted / Deferred`
- [ ] 仅返回 `scheduled_at` 已过的 slot
- [ ] 按优先级排序
- [x] BE-AGT-001:定义心跳查询待执行 slot 的服务层(backend only)
- [x] 筛选当天 `NotStarted / Deferred`
- [x] 仅返回 `scheduled_at` 已过的 slot
- [x] 按优先级排序
- [ ] BE-AGT-002:实现 Agent 状态流转服务(backend only)
- [ ] Idle -> Busy / OnCall
- [ ] Busy / OnCall -> Idle
- [ ] 超时无心跳 -> Offline
- [ ] API 配额错误 -> Exhausted
- [x] BE-AGT-002:实现 Agent 状态流转服务(backend only)
- [x] Idle -> Busy / OnCall
- [x] Busy / OnCall -> Idle
- [x] 超时无心跳 -> Offline
- [x] API 配额错误 -> Exhausted
- [ ] BE-AGT-003:实现多 slot 竞争处理(backend only)
- [ ] 选最高 priority 执行
- [ ] 其余 slot 标记 Deferred
- [ ] Deferred slot 自动 priority += 1
- [x] BE-AGT-003:实现多 slot 竞争处理(backend only)
- [x] 选最高 priority 执行
- [x] 其余 slot 标记 Deferred
- [x] Deferred slot 自动 priority += 1
- [ ] BE-AGT-004:实现 Exhausted 恢复时间解析(backend only)
- [ ] 解析 retry-after / reset in / resets at
- [ ] 解析失败时默认 5 小时
- [ ] 到期恢复 Idle
- [x] BE-AGT-004:实现 Exhausted 恢复时间解析(backend only)
- [x] 解析 retry-after / reset in / resets at
- [x] 解析失败时默认 5 小时
- [x] 到期恢复 Idle
## F. HarborForge.Frontend - Proposal / Essential / Story restricted
- [ ] FE-PR-001:前端统一重命名 Propose -> Proposal(frontend only)
- [ ] 调整页面标题与菜单文案
- [ ] 调整类型名与 API 调用命名
- [ ] 清理旧 propose 文案
- [x] FE-PR-001:前端统一重命名 Propose -> Proposal(frontend only)
- [x] 调整页面标题与菜单文案
- [x] 调整类型名与 API 调用命名
- [x] 清理旧 propose 文案
- [ ] FE-PR-002:Proposal 详情页增加 Essential 列表区(frontend only)
- [ ] 展示 Essential 列表
- [ ] 展示 Essential type / code / title
- [ ] 处理空状态
- [x] FE-PR-002:Proposal 详情页增加 Essential 列表区(frontend only)
- [x] 展示 Essential 列表
- [x] 展示 Essential type / code / title
- [x] 处理空状态
- [ ] FE-PR-003:新增 Essential 创建/编辑表单(frontend only)
- [ ] 创建表单
- [ ] 编辑表单
- [ ] type 选择器
- [ ] 提交后局部刷新
- [x] FE-PR-003:新增 Essential 创建/编辑表单(frontend only)
- [x] 创建表单
- [x] 编辑表单
- [x] type 选择器
- [x] 提交后局部刷新
- [ ] FE-PR-004:Proposal Accept 增加目标 Milestone 选择(frontend only)
- [ ] Accept 前展示 milestone 选择控件
- [ ] 校验必须选择 milestone
- [ ] 展示 Accept 成功后的生成结果
- [x] FE-PR-004:Proposal Accept 增加目标 Milestone 选择(frontend only)
- [x] Accept 前展示 milestone 选择控件
- [x] 校验必须选择 milestone
- [x] 展示 Accept 成功后的生成结果
- [ ] FE-PR-005:限制前端直接创建 `story/*`(frontend only)
- [ ] 从 Task 创建入口移除 story
- [ ] 或将 story 整体设为不可选
- [ ] 调整相关提示文案
- [x] FE-PR-005:限制前端直接创建 `story/*`(frontend only)
- [x] 从 Task 创建入口移除 story
- [x] 或将 story 整体设为不可选
- [x] 调整相关提示文案
## G. HarborForge.Frontend - Calendar
- [ ] FE-CAL-001:新增 Calendar 页面基础骨架(frontend only)
- [ ] 增加路由入口
- [ ] 增加侧边栏入口
- [ ] 增加基础页面布局
- [x] FE-CAL-001:新增 Calendar 页面基础骨架(frontend only)
- [x] 增加路由入口
- [x] 增加侧边栏入口
- [x] 增加基础页面布局
- [ ] FE-CAL-002:实现某日 slot 列表展示(frontend only)
- [ ] 展示时间轴或列表
- [ ] 区分真实 slot 与 plan 虚拟 slot
- [ ] 展示状态 / 类型 / 时长 / 优先级
- [x] FE-CAL-002:实现某日 slot 列表展示(frontend only)
- [x] 展示时间轴或列表
- [x] 区分真实 slot 与 plan 虚拟 slot
- [x] 展示状态 / 类型 / 时长 / 优先级
- [ ] FE-CAL-003:实现计划列表展示(frontend only)
- [ ] 展示计划规则
- [ ] 展示周期参数
- [ ] 支持跳转编辑
- [x] FE-CAL-003:实现计划列表展示(frontend only)
- [x] 展示计划规则
- [x] 展示周期参数
- [x] 支持跳转编辑
- [ ] FE-CAL-004:实现创建 / 编辑 / 取消日程交互(frontend only)
- [ ] 新建 slot 表单
- [ ] 编辑 slot 表单
- [ ] cancel 操作确认
- [ ] 展示后端 warning
- [x] FE-CAL-004:实现创建 / 编辑 / 取消日程交互(frontend only)
- [x] 新建 slot 表单
- [x] 编辑 slot 表单
- [x] cancel 操作确认
- [x] 展示后端 warning
- [ ] FE-CAL-005:实现 Deferred / Exhausted / overlap 等状态提示(frontend only)
- [ ] Deferred 提示
- [ ] overlap 报错展示
- [ ] workload warning 展示
- [ ] Exhausted 状态展示
- [x] FE-CAL-005:实现 Deferred / Exhausted / overlap 等状态提示(frontend only)
- [x] Deferred 提示
- [x] overlap 报错展示
- [x] workload warning 展示
- [x] Exhausted 状态展示
## H. HarborForge.Cli - Proposal / Essential / Story restricted
- [ ] CLI-PR-001:统一 CLI 文案 `propose -> proposal`(cli only)
- [ ] 调整命令 help 文案
- [ ] 调整输出文本
- [ ] 评估命令名是否兼容保留 `hf propose`
- [x] CLI-PR-001:统一 CLI 文案 `propose -> proposal`(cli only)
- [x] 调整命令 help 文案
- [x] 调整输出文本
- [x] 评估命令名是否兼容保留 `hf propose` → 保留为 alias
- [ ] CLI-PR-002:新增 Essential 相关命令(cli only)
- [ ] `hf proposal essential list`
- [ ] `hf proposal essential create`
- [ ] `hf proposal essential update`
- [ ] `hf proposal essential delete`
- [x] CLI-PR-002:新增 Essential 相关命令(cli only)
- [x] `hf proposal essential list`
- [x] `hf proposal essential create`
- [x] `hf proposal essential update`
- [x] `hf proposal essential delete`
- [ ] CLI-PR-003:更新 Proposal Accept CLI(cli only)
- [ ] Accept 时支持传入 milestone
- [ ] 展示批量生成的 task 结果
- [ ] 更新帮助文案
- [x] CLI-PR-003:更新 Proposal Accept CLI(cli only)
- [x] Accept 时支持传入 milestone
- [x] 展示批量生成的 task 结果
- [x] 更新帮助文案
- [ ] CLI-PR-004:限制 CLI 直接创建 `story/*`(cli only)
- [ ] 阻止 story 类型直建
- [ ] 返回明确错误提示
- [ ] 提示改走 Proposal Accept
- [x] CLI-PR-004:限制 CLI 直接创建 `story/*`(cli only)
- [x] 阻止 story 类型直建
- [x] 返回明确错误提示
- [x] 提示改走 Proposal Accept
## I. HarborForge.Cli - Calendar
- [ ] CLI-CAL-001:新增 `hf calendar` 命令组骨架(cli only)
- [ ] 注册命令组
- [ ] 增加 help surface
- [ ] 增加 brief help
- [x] CLI-CAL-001:新增 `hf calendar` 命令组骨架(cli only)
- [x] 注册命令组
- [x] 增加 help surface
- [x] 增加 brief help
- [ ] CLI-CAL-002:实现 `hf calendar schedule`(cli only)
- [ ] 参数解析
- [ ] 请求构造
- [ ] 结果输出
- [x] CLI-CAL-002:实现 `hf calendar schedule`(cli only)
- [x] 参数解析
- [x] 请求构造
- [x] 结果输出
- [ ] CLI-CAL-003:实现 `hf calendar show`(cli only)
- [ ] 日期参数
- [ ] 列表输出
- [ ] JSON 输出
- [x] CLI-CAL-003:实现 `hf calendar show`(cli only)
- [x] 日期参数
- [x] 列表输出
- [x] JSON 输出
- [ ] CLI-CAL-004:实现 `hf calendar edit`(cli only)
- [ ] 支持 slot-id 与 date
- [ ] PATCH/POST 适配
- [ ] 输出 warning / error
- [x] CLI-CAL-004:实现 `hf calendar edit`(cli only)
- [x] 支持 slot-id 与 date
- [x] PATCH/POST 适配
- [x] 输出 warning / error
- [ ] CLI-CAL-005:实现 `hf calendar cancel`(cli only)
- [ ] 支持 slot-id 与 date
- [ ] 输出结果
- [x] CLI-CAL-005:实现 `hf calendar cancel`(cli only)
- [x] 支持 slot-id 与 date
- [x] 输出结果
- [ ] CLI-CAL-006:实现 `hf calendar date-list`(cli only)
- [ ] 列出未来已物化日期
- [ ] 适配 JSON 输出
- [x] CLI-CAL-006:实现 `hf calendar date-list`(cli only)
- [x] 列出未来已物化日期
- [x] 适配 JSON 输出
- [ ] CLI-CAL-007:实现 `hf calendar plan-schedule`(cli only)
- [ ] 参数解析 `--at --on-day --on-week --on-month`
- [ ] 请求构造
- [ ] 输出结果
- [x] CLI-CAL-007:实现 `hf calendar plan-schedule`(cli only)
- [x] 参数解析 `--at --on-day --on-week --on-month`
- [x] 请求构造
- [x] 输出结果
- [ ] CLI-CAL-008:实现 `hf calendar plan-list`(cli only)
- [ ] 列表输出
- [ ] JSON 输出
- [x] CLI-CAL-008:实现 `hf calendar plan-list`(cli only)
- [x] 列表输出
- [x] JSON 输出
- [ ] CLI-CAL-009:实现 `hf calendar plan-edit`(cli only)
- [ ] 参数解析
- [ ] 请求发送
- [ ] 输出结果
- [x] CLI-CAL-009:实现 `hf calendar plan-edit`(cli only)
- [x] 参数解析
- [x] 请求发送
- [x] 输出结果
- [ ] CLI-CAL-010:实现 `hf calendar plan-cancel`(cli only)
- [ ] 参数解析
- [ ] 请求发送
- [ ] 输出结果
- [x] CLI-CAL-010:实现 `hf calendar plan-cancel`(cli only)
- [x] 参数解析
- [x] 请求发送
- [x] 输出结果
## J. HarborForge.OpenclawPlugin / Monitor 联动
- [ ] PLG-CAL-001:插件侧定义 Calendar 心跳请求格式(plugin only)
- [ ] 明确 claw_identifier 传递方式
- [ ] 明确 agent_id 传递方式
- [ ] 明确返回 slot 列表结构
- [x] PLG-CAL-001:插件侧定义 Calendar 心跳请求格式(plugin only)
- [x] 明确 claw_identifier 传递方式
- [x] 明确 agent_id 传递方式
- [x] 明确返回 slot 列表结构
- [ ] PLG-CAL-002:插件侧处理待执行 slot 唤醒(plugin only)
- [ ] Idle 时唤醒 agent
- [ ] 透传任务上下文
- [ ] 执行前更新 attended / started_at / status
- [x] PLG-CAL-002:插件侧处理待执行 slot 唤醒(plugin only)
- [x] Idle 时唤醒 agent
- [x] 透传任务上下文
- [x] 执行前更新 attended / started_at / status
- [ ] PLG-CAL-003:插件侧处理非 Idle / Deferred 分支(plugin only)
- [ ] Agent 非 Idle 时上报 Deferred
- [ ] 处理多 slot 重排后的重新规划
- [x] PLG-CAL-003:插件侧处理非 Idle / Deferred 分支(plugin only)
- [x] Agent 非 Idle 时上报 Deferred
- [x] 处理多 slot 重排后的重新规划
- [ ] PLG-CAL-004:插件侧处理 ScheduledGatewayRestart(plugin only)
- [ ] 收到事件后持久化状态
- [ ] 发送最终心跳
- [ ] 暂停定时任务
- [x] PLG-CAL-004:插件侧处理 ScheduledGatewayRestart(plugin only)
- [x] 收到事件后持久化状态
- [x] 发送最终心跳
- [x] 暂停定时任务
## K. Tests / Integration(按子模块分别补,不混做)
- [ ] TEST-BE-CAL-001:补 Calendar backend 测试(backend tests only)
- [ ] 模型测试
- [ ] API 测试
- [ ] overlap / warning / materialize 测试
- [x] TEST-BE-CAL-001:补 Calendar backend 测试(backend tests only)
- [x] 模型测试
- [x] API 测试
- [x] overlap / warning / materialize 测试
- [x] Blocker resolved: `HarborForge.Backend/app/schemas/calendar.py` 的 Python 3.12 + Pydantic 2.5 递归建模问题已通过 schema 类型别名修复,本次已继续补齐 Calendar API / model tests
- [ ] TEST-BE-PR-001:补 Proposal / Essential backend 测试(backend tests only)
- [ ] Essential CRUD
- [ ] Accept 生成 story tasks
- [ ] story restricted
- [x] TEST-BE-PR-001:补 Proposal / Essential backend 测试(backend tests only)
- [x] Essential CRUD
- [x] Accept 生成 story tasks
- [x] story restricted
- [ ] TEST-FE-CAL-001:补 Calendar 前端测试(frontend tests only)
- [ ] 页面渲染
- [ ] 表单交互
- [ ] warning / error 展示
- [x] TEST-FE-CAL-001:补 Calendar 前端测试(frontend tests only)
- [x] 页面渲染
- [x] 表单交互
- [x] warning / error 展示
- [ ] TEST-FE-PR-001:补 Proposal / Essential 前端测试(frontend tests only)
- [ ] Essential 列表与表单
- [ ] Accept milestone 选择
- [ ] story 创建入口限制
- [x] TEST-FE-PR-001:补 Proposal / Essential 前端测试(frontend tests only)
- [x] Essential 列表与表单
- [x] Accept milestone 选择
- [x] story 创建入口限制
- [ ] TEST-CLI-CAL-001:补 Calendar CLI 测试(cli tests only)
- [ ] 命令解析
- [ ] JSON 输出
- [ ] 错误输出
- [x] TEST-CLI-CAL-001:补 Calendar CLI 测试(cli tests only)
- [x] 命令解析
- [x] JSON 输出
- [x] 错误输出
- [ ] TEST-CLI-PR-001:补 Proposal / Essential CLI 测试(cli tests only)
- [ ] Essential 子命令
- [ ] accept milestone 参数
- [ ] story 限制提示
- [x] TEST-CLI-PR-001:补 Proposal / Essential CLI 测试(cli tests only)
- [x] Essential 子命令
- [x] accept milestone 参数
- [x] story 限制提示