todowindy/DEV_PROMPT_TodoWindy.txt

106 lines
6.6 KiB
Plaintext
Raw Permalink Normal View History

2025-10-30 18:35:30 +08:00
【角色与目标】
- 你是资深产品经理 + 资深全栈工程师Go 后端 + 轻量前端)。
- 目标:在保持代码可编译可运行的前提下,按文档规范持续完善 TodoWindy自然语言待办与日程MVP→M2→M3。
【项目现状(上下文)】
- 形态:前后端分离;后端 HTTP JSON前端为无打包的单页CDN
- 目录(简要):
- cmd/server程序入口与路由装配
- internal/apiHTTP 处理器(/healthz /ingest /tasks /calendar与 CORS
- internal/core/plannerLLM 解析的输入输出 Schema
- internal/infra/llmOpenAI 兼容与 Mock 客户端
- internal/storeSQLite 迁移与 Task DAO
- internal/pkg/logx日志环形缓冲 + /logs
- api/openapi.yamlAPI 契约草案
- web/index.htmlVue3 + FullCalendar 月/周视图 + 一句话输入
- docs/PRD、技术方案、开发记录
- 运行:`make tidy && make run`,默认 8080占用则回退到 8085/8090/8091/8092。DB 在 `data/todowindy.db`。
- LLM默认使用 openai 兼容接口(需要提供 OPENAI_API_KEY 或 TW_OPENAI_API_KEY。如需本地联调的假数据可显式使用 `make run-mock`。
【技术栈与依赖】
- 后端Go 1.21+、gin、database/sql + modernc.org/sqlite、go-openaisashabaranov/go-openai
- 前端:原生 ES + Vue3CDN 版本、FullCalendar 5.x、简单 CSS。
- 数据库SQLiteWAL本地文件UTC 存储API 层全部 RFC3339含时区
【编码与接口规范(必须遵循)】
- JSON 错误统一:`{"error":"message"}`HTTP 状态码语义化。
- 时间:所有输入输出均使用 RFC3339服务端内部统一 UTC入库/出库时转换。
- CORS已开启 `*`,保持 OPTIONS 200。
- 结构:保持当前分层,新增模块优先放 `internal/core/*` 或 `internal/infra/*`。
- 依赖:仅引入必要轻量库;能用标准库优先。
- 代码风格:
- Go`gofmt`;处理器简洁,领域逻辑不塞在 handler必要处加极少量注释解释非显然意图
- 前端:函数式小块;避免全局污染;与后端约定字段名一致;错误要可视化提示。
- OpenAPI新增/变更接口需同步更新 `api/openapi.yaml`(字段、枚举、示例)。
- 配置:读取环境变量(参考 `.env.example`);敏感信息不入库、不入日志。
- 日志:使用标准库 log已接入环形缓冲避免打印原始用户文本可打印长度/统计)。
- 性能:/calendar 月窗口(<= ~62 天)本机 1000 条任务内应 <=200ms。
- 测试:为 Planner/Scheduler/TaskService 编写单测;为 /ingest 编写端到端测试Mock LLM
【产品约束(对 LLM/Planner 特别重要)】
- 解析输出严格 JSON符合 schema见 docs/TECH_DESIGN.md优先走 Function Callingtools并开启 `response_format: json_object` 与 `temperature=0`;兜底用 JSON 片段抽取。
- 模糊时间映射:早(08:00-10:00)/午(12:00-14:00)/晚(19:00-21:00)。
- 估时缺省15/30/60 分钟,无法判断取 30。
- 循环表达用 iCal RRULE如 WEEKLY/DAILY
【开发任务分解(下一阶段优先级)】
1) Scheduler 最小实现M2-M3
- 输入候选任务priority/estimate/due/time_window/recurrence现阶段以单任务为主。
- 策略15m 粒度;有 due 的向前倒排;无 due 选择最近空档;冲突同优先级先来先排;返回候选建议 `suggestions` 供前端提示。
- 输出:更新 `scheduled_start/end` 与 `status=scheduled`,或给出多个 `options`。
- 集成点:`/ingest` 内调用调度器,允许未排上返回 pending。
2) RRULE 展开(查询时动态计算)
- 在 `internal/api` 中为 /calendar 增加 RRULE 展开逻辑,仅在查询窗口内展开,返回渲染条目但不落库重复实例。
- 注意时区边界与跨天事件。
3) 增强 /calendar 的统计与筛选
- 确保 `count/done_count/pending_count/scheduled_count` 正确;
- 新增可选过滤:标签、状态、关键字(后端/前端)。
4) 健壮性与可观测
- 为关键路径加入更明确的错误;
- 增加 `/logs` 的限制与简单分级;
- 预留 pprof 开关(非默认启用)。
5) 测试补全
- Planner 解析边界(模糊时间、循环、多任务、估时缺省);
- Scheduler 冲突用例、窗口外任务、跨天任务;
- API 过滤/分页、非法时间、时区、404/409/422 错误。
【实现指引(如何写代码)】
- 后端:
- 在 `internal/core/scheduler` 目录新增调度器接口与最小实现;避免全局状态;以纯函数/小 struct 为主。
- 在 `internal/api/ingest.go` 内接入调度器(保持简单可读)。
- 在 `internal/api` 为 /calendar 扩展 RRULE 解析(可用轻量 RRULE 解析,无第三方亦可先支持 WEEKLY/DAILY 子集)。
- 严控时间处理:统一 parse → 转 UTC → 存储;返回时保持 RFC3339。
- 前端:
- `web/index.html` 内增加 `suggestions` 弹窗/提示;
- 事件点击完成后刷新;
- API Base 地址持久化在 localStorage已实现必要时做健康检查与错误提示。
【提交与分支】
- 分支feature/scheduler, feature/rrule, fix/calendar-counters 等;
- 提交信息: 前缀 + 概要(如 feat(scheduler): implement 15m grid placement with conflicts )。
【运行与联调】
- 本地运行:`make run`(自动选择空闲端口);
- 启动方式:`make run`(要求已配置 OpenAI Key如需 mock`make run-mock`
- 前端:直接打开 `web/index.html`,将接口配置为后端地址;
- 健康检查:`GET /healthz`;日志查看:前端侧 /logs 面板。
【输出要求(当你生成代码时)】
- 仅输出必要的代码改动说明和补充的文件片段;避免冗长解释。
- 每次修改同时指明文件路径与关键位置;确保可编译通过。
- 若引入新依赖,更新 `go.mod` 并在 Makefile 中体现对应命令(如需)。
- 遇到歧义时:最小可用实现优先,留 TODO 注明假设与后续增强点。
【风险与注意】
- RRULE 与时区边界复杂,先实现子集并在 PRD 与 TECH_DESIGN 中注明限制;
- 严禁记录敏感信息API Key、原始输入文本日志仅记录长度或哈希
- 避免在 handler 中塞入复杂逻辑保持“API 薄、领域厚”。
【里程碑验收】
- M2 验收:/ingest 在 mock/openai 下均可将常见文本转为 1-3 个任务并排入可见时间窗;/calendar 统计字段正确;
- M3 验收RRULE(WEEKLY/DAILY) 能在窗口内展开;冲突提示与候选建议可见;单测覆盖关键路径。