Files

862 lines
28 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CodexPrompts.mdT01-T23 最小发送单元
## 使用说明
本文为每个 P0 Task 提供可复制发送给 Codex 的最小任务指令。
依据文件:
- `AGENTS.md`(当前仓库未发现 `docs/AGENTS.md`,规则文件位于仓库根目录)
- `docs/Tasks.md`
- `docs/TaskDependency.md`
- `docs/TDD.md`
全局执行口径:
- 严格 TDD:先写失败测试,再写最小实现,再重构。
- 不使用真实 TikHub / AI API;所有外部依赖必须 mock。
- 后台任务使用 `ThreadPoolExecutor(max_workers=1)` 和同步 `httpx.Client`
- T13 固定 `AI_BATCH_SIZE=20`,不实现 batch size 减半。
- 报告总结失败默认文案统一为:`总结生成失败,请查看上方统计数据。`
- 当前处于初始单人开发和流程练习阶段,默认一次只发送一个 Task,不启用并行。
- 每个 Task 使用一个 `feat/tXX-short-description` 分支;完成验证后优先创建一个 focused commit。
- 不创建 PR,除非用户明确要求。
- 若未来启用并行,涉及 `docs/Tasks.md` 勾选项时由主协调者统一勾选,避免文档冲突。
## 当前推荐执行顺序
```text
T01 -> 审查/验证/commit
T02 -> 审查/验证/commit
T03 -> 审查/验证/commit
...
T23 -> 最终验收
```
当前阶段不要提前并行发送 T05/T06、T08/T09、T18/T19。等串行流程跑顺后,再由用户明确切换到并行模式。
## 未来并行发送参考
| 分组 | 任务 | 发送方式 |
|---|---|---|
| Group 1 | T01 -> T02 -> T03 -> T04 | 串行 |
| Group 2 | T05 + T06 | 可小心并行,需合并 `app/main.py` |
| Group 3 | T07 -> (T08 + T09) -> T10 -> T11 | T08/T09 可并行 |
| Group 4 | T12 -> T13 -> T14 -> T15 -> T16 | 基本串行 |
| Group 5 | T17 -> (T18 + T19 + T20 service 部分) -> T21 | T18/T19 可并行,T20 service 可并行 |
| Group 6 | T22 -> T23 | 串行;T22 可与页面收尾低冲突并行 |
---
### T01 任务指令
## 任务
完成 T01:初始化项目结构与依赖。
## 前置
前置任务:无。
并行发送:不可并行。T01-T04 是基础骨架,必须串行。
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T01 部分
- `docs/TDD.md` §2、§3、§5.1
- `docs/DevelopmentPlan.md` §2、§4
## 分支
在分支 `feat/t01-project-skeleton` 上开发。
## 输出要求
- 创建 FastAPI 单体项目基础目录:`app/``app/services/``app/platforms/``app/templates/``app/static/``tests/`
- 创建基础文件:`app/main.py``app/config.py``app/db.py``app/models.py``app/schemas.py`、依赖文件、`.env.example`
- 实现 `/health`,返回 `{ "status": "ok" }`
- 先写 `tests/unit/test_config.py``/health` 集成测试,再实现代码。
- 运行并通过:`pytest tests/unit tests/integration -q`
## 边界
- 只做 T01,不实现任务 API、数据库模型细节或页面。
- 不提交真实 key、token、cookie。
-`pyproject.toml``requirements.txt` 二选一,按现有仓库风格;若没有风格,优先 `pyproject.toml`
---
### T02 任务指令
## 任务
完成 T02:配置管理与环境变量。
## 前置
前置任务:T01。
并行发送:不可并行。需等待 T01 项目骨架完成。
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T02 部分
- `docs/TDD.md` §3.2、§5.1
- `docs/DevelopmentPlan.md` §2.1、§12.1
## 分支
在分支 `feat/t02-config-env` 上开发。
## 输出要求
- 修改 `app/config.py`,集中管理 TikHub、AI、数据库、HTTP 超时和任务配置。
- 修改 `.env.example`,只保留变量名和示例空值,不包含真实 key。
- 先写配置默认值和环境变量覆盖测试。
- 覆盖 `AI_CONCURRENCY=2`,硬上限不超过 3`AI_MAX_RETRIES=3``CRAWL_PAGE_INTERVAL_SECONDS` 默认 1.5 且可从环境变量读取。
- 运行并通过:`pytest tests/unit/test_config.py -q`
## 边界
- 只做配置,不实现数据库模型、任务 API、外部 HTTP client。
- 不引入超出计划的配置系统或服务发现。
---
### T03 任务指令
## 任务
完成 T03:数据库初始化与模型。
## 前置
前置任务:T01、T02。
并行发送:不可并行。模型是后续所有任务的共享基础。
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T03 部分
- `docs/TDD.md` §3.2、§5.2、§5.3
- `docs/DevelopmentPlan.md` §5
## 分支
在分支 `feat/t03-database-models` 上开发。
## 输出要求
- 修改 `app/db.py``app/models.py`
- 建立 SQLite + SQLAlchemy Base、engine、session。
- 启用 `check_same_thread=False``timeout=10`、WAL。
- 定义 `tasks``hotspots``content_items``comments``reports` 表。
- 实现任务状态、AI 分析状态、进度字段、报告字段和建议索引。
- 先写 `tests/unit/test_models.py`,断言所有表可创建、状态规则正确、`analysis_status=insufficient` 不改变 `Task.status`
- 运行并通过:`pytest tests/unit/test_models.py -q`
## 边界
- 只做模型和数据库初始化,不实现任务创建 API 或抓取流程。
- 不引入 Alembic。
---
### T04 任务指令
## 任务
完成 T04:任务创建 API 与单任务执行器。
## 前置
前置任务:T03。
并行发送:不可并行。该任务会修改核心 API、schema 和 task service。
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T04 部分
- `docs/TDD.md` §6.1、§6.2
- `docs/DevelopmentPlan.md` §2.1、§9.3
## 分支
在分支 `feat/t04-task-api-executor` 上开发。
## 输出要求
- 修改 `app/schemas.py``app/main.py`
- 创建 `app/services/task_service.py`
- 实现 `POST /api/tasks``GET /api/tasks``GET /api/tasks/{task_id}`
- 实现 `ThreadPoolExecutor(max_workers=1)`
- 当已有 `status=running` 任务时,`POST /api/tasks` 返回 HTTP 400,响应体为 `{"detail": "当前有正在运行的任务,请稍后再试"}`,且不创建新任务。
- 先写 `tests/integration/test_task_creation.py``tests/unit/test_task_executor.py`
- 运行并通过:`pytest tests/integration/test_task_creation.py tests/unit/test_task_executor.py -q`
## 边界
- 只做任务创建、查询和执行器框架,不实现真实抓取、AI、报告。
- 不新增任务状态,任务主状态仅 `running` / `success` / `failed`
---
### T05 任务指令
## 任务
完成 T05:僵尸任务恢复。
## 前置
前置任务:T04。
当前发送方式:串行发送。未来可与 T06 小心并行,但会共同修改 `app/main.py`,需主协调者合并。
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T05 部分
- `docs/TDD.md` §6.3
- `docs/DevelopmentPlan.md` §4.3
## 分支
在分支 `feat/t05-task-recovery` 上开发。
## 输出要求
- 修改 `app/services/task_service.py``app/main.py`
- 应用 lifespan 启动时,将遗留 `status=running` 的任务标记为 `failed`
- 写入 `error_stage=system``error_type=unexpected_restart``error_message=系统重启,任务被中断`
- 先写 `tests/integration/test_task_recovery.py`
- 运行并通过:`pytest tests/integration/test_task_recovery.py -q`
## 边界
- 只做启动恢复,不实现任务取消、补跑或复杂恢复。
- 若与 T06 并行,不要重构无关 route 结构。
---
### T06 任务指令
## 任务
完成 T06:首页 / 任务列表基础页面。
## 前置
前置任务:T04。
当前发送方式:串行发送。未来可与 T05 小心并行,但会共同修改 `app/main.py`,需主协调者合并。
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T06 部分
- `docs/TDD.md` §12.1、§12.2、§12.4
- `docs/UIDesign.md`
## 分支
在分支 `feat/t06-index-task-list` 上开发。
## 输出要求
- 创建 `app/templates/base.html``app/templates/index.html``app/templates/partials/task_rows.html`
- 创建 `app/static/app.css``app/static/app.js`
- 修改 `app/main.py`,提供首页页面 route。
- 首页包含任务表单、任务列表、手动刷新、默认规模预估 1250。
- 任务创建成功后前端跳转至 `/tasks/{new_task_id}`
- 实现基础面包屑 block。
- 先写 `tests/integration/test_routes.py``tests/unit/test_template_filters.py` 中相关测试。
- 运行并通过:`pytest tests/integration/test_routes.py tests/unit/test_template_filters.py -q`
## 边界
- 只做首页和任务列表基础,不做任务详情、报告页、导出服务。
- 状态文案不要散落硬编码,优先集中映射或 macro。
---
### T07 任务指令
## 任务
完成 T07:外部 API 基础客户端与重试。
## 前置
前置任务:T02。
并行发送:不可并行。T08/T09 依赖本任务完成。
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T07 部分
- `docs/TDD.md` §4.4、§6.2、§8.2、§13.3
- `docs/DevelopmentPlan.md` §6.1
## 分支
在分支 `feat/t07-api-client-retry` 上开发。
## 输出要求
- 创建 `app/platforms/base.py``app/services/crawl_service.py`
- 封装同步 `httpx.Client` 调用、20s 超时、429 指数退避 1s -> 2s -> 4s、非 429 网络错误重试。
- 超过重试次数后返回或抛出可被上层捕获的结构化错误,不泄露 API key。
- 新增 `tests/fixtures/http_429_response.json` 或等价 fixture。
-`tests/conftest.py` 补充 429/httpx mock fixture。
- 先写 `tests/unit/test_comment_pagination.py``tests/integration/test_failure_tolerance.py` 中相关测试。
- 运行并通过:`pytest tests/unit/test_comment_pagination.py tests/integration/test_failure_tolerance.py -q`
## 边界
- 只做通用客户端和重试基础,不实现小红书/抖音字段映射。
- 禁止使用 `httpx.AsyncClient`
---
### T08 任务指令
## 任务
完成 T08:小红书热点、笔记、评论字段映射。
## 前置
前置任务:T07。
当前发送方式:串行发送。未来可与 T09 并行发送;若并行,绝对不要修改 `app/platforms/douyin.py`
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T08 部分
- `docs/TDD.md` §4.1、§4.5、§7.1、§7.2
- `docs/API-Spike-Xiaohongshu.md`
- `docs/DevelopmentPlan.md` §6.2
## 分支
在分支 `feat/t08-xiaohongshu-mapping` 上开发。
## 输出要求
- 创建 `app/platforms/xiaohongshu.py`
- 创建或补齐 fixtures`xhs_hot_list.json``xhs_search_notes.json``xhs_comments_page_1.json``xhs_comments_page_2_empty.json``xhs_comments_missing_fields.json`
- 实现 `fetch_hotspots()``search_items_by_hotspot()``fetch_comments()` 的最小字段映射。
- 热点读取 `data.data.items[]`,不误用外层 `data.data.title`
- 笔记优先选择 `comments_count > 0`,不足时补充 `comments_count = 0`
- 评论 ID 优先 `comment_id`,回退 `id`;保存 raw_data。
- 字段缺失不导致整批任务崩溃。
- 先写并通过:`pytest tests/unit/test_xiaohongshu_mapping.py -q`
## 边界
- 只做小红书字段映射和最小抓取链路,不做分页通用停止条件和去重。
- 不发起真实 TikHub 请求。
---
### T09 任务指令
## 任务
完成 T09:抖音热点、视频、评论字段映射。
## 前置
前置任务:T07。
当前发送方式:串行发送。未来可与 T08 并行发送;若并行,绝对不要修改 `app/platforms/xiaohongshu.py`
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T09 部分
- `docs/TDD.md` §4.2、§4.5、§7.4、§7.5
- `docs/API-Spike-Douyin.md`
- `docs/DevelopmentPlan.md` §6.3
## 分支
在分支 `feat/t09-douyin-mapping` 上开发。
## 输出要求
- 创建 `app/platforms/douyin.py`
- 创建或补齐 fixtures`douyin_hot_list.json``douyin_search_videos.json``douyin_comments_page_1.json``douyin_comments_missing_fields.json`
- 实现 `fetch_hotspots()``search_items_by_hotspot()``fetch_comments()` 的最小字段映射。
- 热点映射 `query_id``title``rank``hot_score`
- 视频映射 `aweme_info.aweme_id``desc``author``statistics`
- 评论 ID 优先 `comment_id`,回退 `cid`;保存 raw_data。
- 字段缺失不导致整批任务崩溃。
- 先写并通过:`pytest tests/unit/test_douyin_mapping.py -q`
## 边界
- 只做抖音字段映射和最小抓取链路,不做分页通用停止条件和去重。
- 不发起真实 TikHub 请求。
---
### T10 任务指令
## 任务
完成 T10:评论分页、间隔与去重。
## 前置
前置任务:T08、T09、T02。
并行发送:不可并行。T10 会同时修改两个平台 adapter 和 `crawl_service.py`
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T10 部分
- `docs/TDD.md` §8.1、§8.2、§8.3
- `docs/DevelopmentPlan.md` §6.4
## 分支
在分支 `feat/t10-comment-pagination` 上开发。
## 输出要求
- 修改 `app/platforms/xiaohongshu.py``app/platforms/douyin.py``app/services/crawl_service.py`
- 实现分页停止条件:达到评论数上限、空列表、最大 5 页、无下一页游标、连续失败超过重试次数。
- 实现小红书 cursor / index 推进;抖音 cursor 推进。
- 每次分页请求之间使用 1-2 秒基础间隔,默认读取 `CRAWL_PAGE_INTERVAL_SECONDS=1.5`
- 实现同一任务同一内容条目同一评论 ID 去重。
- 先写并通过:`pytest tests/unit/test_comment_pagination.py -q`
## 边界
- 只做评论分页、间隔、去重,不做任务主流程集成。
- 不改变 T08/T09 已验证的字段映射语义。
---
### T11 任务指令
## 任务
完成 T11:抓取任务主流程集成。
## 前置
前置任务:T04、T07、T08、T09、T10。
并行发送:不可并行。该任务集中修改任务主流程。
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T11 部分
- `docs/TDD.md` §13.1、§13.2、§13.3、§13.4、§13.5
- `docs/DevelopmentPlan.md` §4.3、§13
## 分支
在分支 `feat/t11-crawl-task-flow` 上开发。
## 输出要求
- 修改 `app/services/task_service.py``app/services/crawl_service.py`
- 串起热点、内容条目、评论抓取并入库。
- 更新 `processed_items_count``successful_items_count``failed_items_count`
- 每处理完一个内容条目立即 `session.commit()`
- 单个内容条目失败不阻断整批;热点接口失败导致任务 failed。
- 无任何内容条目成功时任务 failed;至少一个内容条目成功时任务 success。
- 覆盖跨热点重复 `source_item_id` 保留、同一热点重复去重。
- 先写并通过:`pytest tests/integration/test_task_flow_xiaohongshu.py tests/integration/test_task_flow_douyin.py tests/integration/test_failure_tolerance.py -q`
## 边界
- 只做抓取主流程,不接入 AI 分析和报告生成。
- 不引入多 worker 或异步任务系统。
---
### T12 任务指令
## 任务
完成 T12:AI Prompt 与结构化输出校验。
## 前置
前置任务:T03、T02。
当前发送方式:串行发送。不建议与 T13 并行;未来最多仅并行准备 T14 报告统计测试数据,但不要实现 T14。
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T12 部分
- `docs/TDD.md` §4.3、§4.6、§9.1、§9.2
- `docs/DevelopmentPlan.md` §7.1、§7.2
## 分支
在分支 `feat/t12-ai-schema` 上开发。
## 输出要求
- 创建 `app/services/ai_service.py`
- 创建 `app/prompts/comment_analysis.txt`
- 创建或补齐 fixtures`ai_comments_success.json``ai_comments_invalid_json.txt``ai_comments_all_sentiments.json`
- 实现 prompt 构造,输入包含 `comment_id` 和截断至 150 字的 `content`
- AI 输出必须是 JSON Array,并用 Pydantic/schema 校验。
- 校验 sentiment 枚举、labels 最多 3 个、comment_id 必须匹配输入。
- 单条失败标记 `ai_analysis_status=failed`
- 先写并通过:`pytest tests/unit/test_ai_schema.py -q`
## 边界
- 只做 prompt 和 schema 校验,不做 AI 重试并发和任务流程接入。
- 不调用真实 AI 服务。
---
### T13 任务指令
## 任务
完成 T13:AI 重试、成功率统计。
## 前置
前置任务:T12、T04。
并行发送:不可并行。不要与 T16 同时修改 `task_service.py`
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T13 部分
- `docs/TDD.md` §9.3、§9.4、§9.5
- `docs/TaskDependency.md` §2.1
- `docs/DevelopmentPlan.md` §7.3、§7.4(若与 Tasks 冲突,以本指令和 Tasks 为准)
## 分支
在分支 `feat/t13-ai-retry-quality` 上开发。
## 输出要求
- 修改 `app/services/ai_service.py` 和必要的 `app/services/task_service.py` 质量状态逻辑。
- 固定 batch size 为 20,不做动态缩减,不实现 batch size 减半。
- 整批 JSON 解析失败时整批重试,最多 3 次。
- 第 3 次仍失败时,该批次全部评论标记 `ai_analysis_status=failed`,不阻断其他批次。
- 重试间隔符合 1s -> 2s -> 4s。
- 同一任务最多 2 个 AI 批量请求并发;同一内容条目多批评论串行。
- 实现 `analysis_success_rate``analysis_status`>= 0.8 为 `normal`< 0.8 为 `insufficient`,不改变任务主状态。
- 先写并通过:`pytest tests/unit/test_ai_schema.py -q`
## 边界
- 不接入完整任务流程;T16 负责集成。
- 不使用 `httpx.AsyncClient`
---
### T14 任务指令
## 任务
完成 T14:内容条目级报告生成。
## 前置
前置任务:T12、T13、T03。
并行发送:不建议与 T15 并行。T14/T15 都修改 `report_service.py`
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T14 部分
- `docs/TDD.md` §10.1、§10.2、§10.3、§10.5
- `docs/TaskDependency.md` §2.2
- `docs/DevelopmentPlan.md` §8.1、§8.3
## 分支
在分支 `feat/t14-item-report` 上开发。
## 输出要求
- 创建 `app/services/report_service.py`
- 创建 `app/prompts/report_summary.txt`
- 实现内容条目级报告生成,保存 `metrics_json``typical_comments_json``summary``markdown_content`
- 统计情绪、Top 5 标签、典型评论;典型评论优先点赞数,缺失时按抓取顺序。
- 总结 AI 输入包含统计摘要和典型评论文本,每条评论截断至 150 字。
- 总结 AI 使用纯文本输出,不使用 JSON Schema。
- 内容条目总结超过 200 字时截断。
- 总结 AI 超时或失败时使用默认文案:`总结生成失败,请查看上方统计数据。`
- 先写并通过:`pytest tests/unit/test_report_stats.py -q`
## 边界
- 只做内容条目级报告,不做热点级报告和任务流程接入。
- 不在页面 route 中临时计算统计。
---
### T15 任务指令
## 任务
完成 T15:热点级报告生成。
## 前置
前置任务:T14。
并行发送:不建议并行。T15 扩展 T14 的同一 `report_service.py`
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T15 部分
- `docs/TDD.md` §10.1、§10.2、§10.4、§10.5
- `docs/TaskDependency.md` §2.2
- `docs/DevelopmentPlan.md` §8.2、§8.3
## 分支
在分支 `feat/t15-hotspot-report` 上开发。
## 输出要求
- 修改 `app/services/report_service.py`
- 实现热点级报告生成,聚合热点下所有内容条目。
- 统计内容条目数量、评论样本数、情绪分布、Top 5 标签、典型评论。
- 生成热点级 Markdown,并保存到 `reports`
- 任务完成后报告生成顺序为:先内容条目报告,再热点报告。
- 热点总结超过 300 字时截断。
- 总结 AI 超时或失败时使用默认文案:`总结生成失败,请查看上方统计数据。`
- 先写并通过:`pytest tests/unit/test_report_stats.py -q`
## 边界
- 只做热点级报告,不接入任务主流程。
- 页面展示和导出必须后续读取预生成报告,不在 route 中即时计算。
---
### T16 任务指令
## 任务
完成 T16:AI + 报告集成到任务流程。
## 前置
前置任务:T11、T13、T14、T15。
并行发送:不可并行。该任务是抓取、AI、报告的主集成点。
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T16 部分
- `docs/TDD.md` §13.1、§13.2、§13.3、§9.5、§10
- `docs/DevelopmentPlan.md` §4.3、§7、§8、§13
## 分支
在分支 `feat/t16-ai-report-flow` 上开发。
## 输出要求
- 修改 `app/services/task_service.py``app/services/ai_service.py``app/services/report_service.py`
- 在任务流程中调用 AI 分析和报告生成。
- 任务完成后评论有 sentiment、labelsreports 已入库。
- 写入 `analysis_success_rate``analysis_status`
- 每完成一批 AI 分析(20 条评论)后立即 `session.commit()`
- AI 单批失败不阻断其他批次。
- 扩展并通过:`pytest tests/integration/test_task_flow_xiaohongshu.py tests/integration/test_task_flow_douyin.py tests/integration/test_failure_tolerance.py -q`
## 边界
- 不做页面、导出、Docker。
- 不改变 T13 固定 batch size 策略。
---
### T17 任务指令
## 任务
完成 T17:任务详情页。
## 前置
前置任务:T06、T11;建议 T16 完成后再做以展示 AI/报告状态。
并行发送:T17 是 T18/T19 的前置,不建议并行。
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T17 部分
- `docs/TDD.md` §12.1、§12.4
- `docs/UIDesign.md`
## 分支
在分支 `feat/t17-task-detail-page` 上开发。
## 输出要求
- 创建 `app/templates/tasks/detail.html`
- 修改 `app/main.py` 增加任务详情页 route。
- 展示任务概览:任务 ID、平台、创建时间、耗时、状态、AI 分析状态、进度、错误信息。
- 实现热点手风琴列表,默认展开 rank=1。
- 内容条目失败时展示失败原因。
- 任务 running 且热点为空时展示 Spinner。
- 面包屑:首页 -> 任务 `#{task_id}`,首页链接指向 `/`
- 热点报告入口在 T18 前仅需 href 非空。
- 先写并通过:`pytest tests/integration/test_routes.py tests/unit/test_template_filters.py -q`
## 边界
- 只做任务详情页,不实现热点报告页和内容条目详情页。
- 不在模板中做业务统计计算。
---
### T18 任务指令
## 任务
完成 T18:热点级报告页。
## 前置
前置任务:T15、T17。
当前发送方式:串行发送。未来可与 T19 并行,但二者都会修改 `app/main.py``tests/integration/test_routes.py`,需主协调者合并。
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T18 部分
- `docs/TDD.md` §12.1、§12.4、§11.3、§11.4
- `docs/UIDesign.md`
## 分支
在分支 `feat/t18-hotspot-report-page` 上开发。
## 输出要求
- 创建 `app/templates/hotspots/report.html`
- 修改 `app/main.py` 增加热点报告页 route。
- 页面读取预生成热点报告。
- 展示热点基础信息、内容条目数量、评论样本数、情绪分布、Top 5 标签、典型评论、AI 总结和分析不足 Alert。
- 添加 Markdown 导出按钮和热点下全部评论 CSV 导出按钮。
- 报告缺失时显示友好状态,不返回 HTTP 500。
- 实现面包屑:首页 -> 任务 -> 热点 -> 汇总报告。
- 先写并通过:`pytest tests/integration/test_routes.py -q`
## 边界
- 只做热点报告页,不实现内容条目详情页。
- 页面不得即时计算报告统计,必须读取 reports 预生成数据。
---
### T19 任务指令
## 任务
完成 T19:内容条目详情页与评论明细。
## 前置
前置任务:T14、T17。
当前发送方式:串行发送。未来可与 T18 并行,但二者都会修改 `app/main.py``tests/integration/test_routes.py`,需主协调者合并。
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T19 部分
- `docs/TDD.md` §12.3、§12.4、§12.5
- `docs/UIDesign.md`
## 分支
在分支 `feat/t19-item-detail-page` 上开发。
## 输出要求
- 创建 `app/templates/items/detail.html`
- 修改 `app/main.py` 增加内容条目详情页 route。
- 展示内容条目基础信息、原始内容链接、内容条目级报告。
- 评论明细最多展示 100 条。
- 评论排序:点赞数降序;点赞数相同或缺失时评论时间降序。
- labels JSON Array 渲染为多个标签块。
- 评论为空时展示空状态。
- 实现面包屑:首页 -> 任务 -> 热点 -> 内容条目。
- 先写并通过:`pytest tests/integration/test_routes.py tests/unit/test_template_filters.py -q`
## 边界
- P1 原始 JSON `<details>` 调试入口不是 P0,除非用户明确要求,不要实现。
- 不实现热点报告页或导出服务。
---
### T20 任务指令
## 任务
完成 T20:导出服务。
## 前置
前置任务:T14、T15、T18、T19。服务层可在 T14/T15 后先做,但 route 和按钮状态需等页面完成。
当前发送方式:串行发送。未来 T20 service/unit-test 部分可与 T18/T19 页面并行;完整 T20 不建议与 T21 并行。
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T20 部分
- `docs/TDD.md` §11、§12.5
- `docs/DevelopmentPlan.md` §11
## 分支
在分支 `feat/t20-export-service` 上开发。
## 输出要求
- 创建 `app/services/export_service.py`
- 修改 `app/main.py` 增加导出 routes
- `GET /api/export/items/{item_id}/comments.csv`
- `GET /api/export/hotspots/{hotspot_id}/comments.csv`
- `GET /api/export/items/{item_id}.md`
- `GET /api/export/hotspots/{hotspot_id}.md`
- CSV 使用 `UTF-8-SIG`,字段符合 TDD §11.1。
- labels JSON Array 导出为中文逗号拼接。
- 防 CSV 公式注入:`=``+``-``@` 开头加单引号。
- 评论内容中的换行符替换为空格。
- 文件名安全处理符合 TDD §11.2。
- Markdown 直接读取 `reports.markdown_content`
- 补充导出按钮 disabled 条件测试。
- 先写并通过:`pytest tests/unit/test_export.py tests/integration/test_routes.py -q`
## 边界
- 不做 Excel 导出或 JSON 正式导出。
- 不重新计算报告 Markdown。
---
### T21 任务指令
## 任务
完成 T21:模板宏、过滤器与静态交互。
## 前置
前置任务:T06、T17、T18、T19、T20。
并行发送:不建议并行。T21 是页面共享层收敛任务。
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T21 部分
- `docs/TDD.md` §12
- `docs/UIDesign.md`
## 分支
在分支 `feat/t21-template-macros-js` 上开发。
## 输出要求
- 创建 macro`status_badge.html``sentiment_badge.html``label_tags.html`
- 注册 `from_json` Jinja2 filter。
- 修改 `app/static/app.js``app/static/app.css`,实现表单范围校验、规模预估实时计算、导出 Blob 下载。
- 严禁对外部平台内容使用 `|safe`
-`base.html` 中定义 title block。
- 各页面 title 符合 Tasks T21 规范。
- 状态文案集中管理。
- 先写并通过:`pytest tests/unit/test_template_filters.py tests/integration/test_routes.py -q`
## 边界
- 只做共享模板、filter、静态交互收敛,不新增页面功能。
- 不实现 P1 自动轮询或进度条,除非用户明确要求。
---
### T22 任务指令
## 任务
完成 T22Docker Compose 与部署。
## 前置
前置任务:T01、T02、T03;建议 T16/T21 后执行以便完整验收。
当前发送方式:串行发送。未来可与页面 polish 收尾低冲突并行,但会修改 `.env.example`,需避开 T02/T21 的同文件修改。
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T22 部分
- `docs/TDD.md` §15.1、§16.2
- `docs/DevelopmentPlan.md` §12.2
## 分支
在分支 `feat/t22-docker-compose` 上开发。
## 输出要求
- 创建 `Dockerfile`
- 创建 `docker-compose.yml`,包含 app 服务和 `./data:/app/data` 数据卷。
- 暴露 8000 端口。
- 容器启动后可初始化数据库。
- SQLite 写入 `./data/app.db`
- Dockerfile 使用非 root 用户 `appuser`
- 确认挂载卷目录对 `appuser` 可写。
- 写测试或验证:容器内进程 `whoami` 不返回 root。
- 运行并通过:
- `docker compose up --build`
- `curl -f http://localhost:8000/health`
## 边界
- 只做 Docker Compose 单服务部署。
- 不引入 PostgreSQL、Redis、Celery、Nginx 或登录系统。
---
### T23 任务指令
## 任务
完成 T23:最终测试与手工验收。
## 前置
前置任务:T01-T22。
并行发送:不可并行。T23 是最终验收和文档收口任务。
请先读取:
- `AGENTS.md`
- `docs/Tasks.md` 中 T23 部分
- `docs/TDD.md` §15.2、§16.1、§16.2
- `docs/TaskDependency.md`
- `README.md`(如存在)
## 分支
在分支 `feat/t23-final-acceptance` 上开发。
## 输出要求
- 运行并通过:
- `pytest tests/unit -q`
- `pytest tests/integration -q`
- `pytest tests/unit tests/integration --cov=app --cov-branch --cov-report=term-missing`
- 若覆盖率低于目标,补测试后再继续。
- 运行 Docker 验收:
- `docker compose up --build`
- `curl -f http://localhost:8000/health`
- 按 T23 手工验收清单验证小红书和抖音默认任务流程。
- 如项目已有 `README.md`,补充启动和验收说明。
- 只有在对应任务真实完成且验证通过后,才更新 `docs/Tasks.md` 勾选项。
- 输出最终验收报告:通过项、失败项、已知限制、已运行命令。
## 边界
- 不新增 P1/P2 功能。
- 不为了通过验收而删除关键测试或降低断言。
- 不提交真实 API key 或用户私密数据。