feat: Phase 0 — monorepo 骨架 + 全表迁移 + FastAPI/Next 骨架 + CI

- uv(workspace) + pnpm monorepo;docker-compose(pg+api+web)
- SQLAlchemy 16 MVP 表 + Alembic 初版迁移(无漂移,users stub)
- FastAPI 骨架:统一错误信封(带 request_id) + structlog + /jobs/:id + OpenAPI
- Next.js 骨架:纸感主题 token + OpenAPI→TS 客户端代码生成(gen:api)
- CI(ruff/mypy/pytest + pg service + alembic 漂移校验)
- 四份设计规格(PRODUCT/UX/ARCHITECTURE/DEV_PLAN) + CLAUDE.md
This commit is contained in:
Yaojia Wang
2026-06-18 11:38:28 +02:00
commit d3dc620a71
74 changed files with 12960 additions and 0 deletions

158
DEV_PLAN.md Normal file
View File

@@ -0,0 +1,158 @@
# 网文创作工作流 · 开发计划DEV_PLAN
> 基于 [PRODUCT_SPEC.md](./PRODUCT_SPEC.md) / [UX_SPEC.md](./UX_SPEC.md) / [ARCHITECTURE.md](./ARCHITECTURE.md) 的分阶段实现计划。
> 子任务尽量**解耦**(只经契约耦合,可并行);每个任务标注所需 **expert skill** 与**文档锚点**。
---
## 0. 锁定技术栈(本计划前提)
| 维度 | 决策 |
|---|---|
| 前端 | Next.js + TypeScript纯 UIOpenAPI 生成的 TS 客户端调后端) |
| 后端 | Python + FastAPIasync, SSE, Pydantic |
| 编排 | **LangGraph**(写章→四审→验收 HITL/checkpoint/并行) |
| LLM 网关 | 薄自建:`anthropic` + `openai`(baseURL 覆盖 DeepSeek/Kimi/Qwen/GLM) + `google-genai`;缓存/降级/回退/记账自建 |
| 结构化输出 | Pydantic + `instructor` |
| ORM/迁移 | SQLAlchemy 2.0(async) + Alembic |
| 存储 | Postgres**无向量**;确定性按需注入) |
| 长任务 | FastAPI BackgroundTasks + `jobs` 表(无专门队列) |
| 多租户 | **原型不做**(单用户 stub后续再加 |
**原型不做(均为后续)**:多租户/Auth、向量检索(P2)、专门队列、全书扫描、社区市场。
---
## 1. 任务约定
格式:`Tx.y [skill] 标题` → 描述 · **依赖** · **DoD**(验收) · **锚点**(文档)。
**Skill 标签**(每任务调用对应 expert skill 编写):
| 标签 | 职责 |
|---|---|
| `@devops` | monorepo/CI/docker/部署/迁移工具链 |
| `@db` | SQLAlchemy 模型、Alembic 迁移、Repository |
| `@backend` | FastAPI 端点、记忆服务、验收事务、BackgroundTasks |
| `@llm` | LLM 网关、适配器、LangGraph 图、Agent 声明 |
| `@frontend` | Next.js 页面、组件、流式渲染、TS 客户端 |
| `@qa` | 单元/集成/E2E、mock 网关、契约测试 |
| `@docs` | 文档修订 |
**解耦原则**:任务只经**契约**耦合OpenAPI / Pydantic schema / `orchestrator`·`gateway`·`Repository` 接口)。**契约先行**——每阶段首个任务先定 schema/接口,随后 front/back/llm 并行。
---
## Phase 0 · 基建与架构栈修订
> 目标:可运行的空骨架 + 文档与锁定栈一致。
- **T0.1 [@devops] monorepo 骨架** → `apps/web`(Next/TS) + `apps/api`(FastAPI) + `packages/*`(python) + `docker-compose`(pg)。· 依赖 无 · DoD `docker compose up` 起 pg+api+web根路由各返回 200。· 锚点 ARCH §2.2/§2.3
- **T0.2 [@db] 初始 schema + 迁移** → SQLAlchemy 模型(全部 **MVP 表**9 张创作表 + `chapter_reviews` + `chapter_digests` + jobs/skills/provider_credentials/tier_routing/usage_ledger**P2 表 `timeline`/`decisions` 不建****无向量**users stub) + Alembic 初版迁移。· 依赖 T0.1 · DoD `alembic upgrade head` 一次建齐全部 MVP 表(含 `chapter_reviews`/`chapter_digests`,后续阶段不再加建表迁移,只加 Repository/约束);模型↔迁移 CI 校验通过。· 锚点 ARCH §3.1
- **T0.3 [@backend] FastAPI 骨架 + 契约基建 + 可观测性底座** → 应用入口、`config`(提供商注册/档位默认/env)、统一错误信封(**带 `request_id`**)、OpenAPI 输出、`jobs` 轮询端点 `GET /jobs/:id`**structlog 结构化日志 + 每请求 `request_id` 生成/透传中间件**(一次"写一章"= 一条贯穿 assemble→write→四审→accept 的 trace。· 依赖 T0.1 · DoD `/openapi.json` 可取;错误信封统一且含 `request_id`;日志为 JSON 且每行带 `request_id`。· 锚点 ARCH §7.1/§7.4/§9.3
- **T0.4 [@frontend] 前端骨架 + 设计 token + 客户端代码生成** → Tailwind + 纸感 CSS 变量(UX §2)、`apps/web/lib/api``/openapi.json` 生成 TS 类型的管线。· 依赖 T0.1,T0.3 · DoD 主题 token 生效;改后端 schema 后 `npm run gen:api` 同步类型。· 锚点 UX §2 / ARCH §8.4
- **T0.5 [@devops] CI** → ruff+mypy+pytest后端、eslint+tsc+vitest前端、Alembic 校验。· 依赖 T0.1 · DoD PR 全绿才可合。· 锚点 ARCH §11
- **T0.6 [@docs] 架构栈修订** → 按计划清单回写 ARCHITECTURE+PRODUCT_SPECPython/FastAPI/LangGraph/无向量/无队列/单用户/OpenAPI 契约)。· 依赖 无 · DoD 两文档无残留 pgvector/队列/Node 后端/ts 代码块;三文档栈口径一致。· 锚点 全文 ✅(已完成)
---
## Phase 1 (M1) · 写章闭环骨架
> 目标:立项 → 写一章草稿(流式)→ 自动保存。**契约先行T1.1 网关接口 + T1.4 API schema。**
- **T1.1 [@llm] LLM 网关接口 + 单 provider 适配器** → `gateway.run(LlmRequest)->LlmResponse``AsyncIterator[Delta]` 流;先实现 1 个 OpenAI 兼容适配器(如 DeepSeek档位路由读 `tier_routing`/默认usage 回传;**每次调用按 §4.8 字段集落 `usage_ledger`**(成本账本从第一天起,带 `request_id`)。· 依赖 T0.2,T0.3 · DoD 单测:给 LlmRequest 得流式 token + usagemock provider 可注入;一次调用产生一条 `usage_ledger` 记录。· 锚点 ARCH §4.14.3/§4.8/§9.3
- **T1.2 [@backend] 记忆服务 `assemble`(确定性选择)** → `select_relevant_entities`(显式+主角+近况) + `render_cards` + prompt 组装(稳定内核/易变 + 缓存断点)。· 依赖 T0.2 · DoD 单测:给定大纲/设定,输出确定且稳定块排序无时间戳。· 锚点 ARCH §3.4/§5.3
- **T1.3 [@llm] LangGraph 写章节点 + SSE** → 单节点图(write) + checkpointer(Postgres) + 流式输出归一为 SSE 事件(`token/done/error`)。· 依赖 T1.1,T1.2 · DoD 调用得流式草稿;图状态落 checkpoint。· 锚点 ARCH §5.2/§7.3
- **T1.4 [@backend] API立项 + 写章** → `POST /projects``GET /projects``GET /projects/:id``POST /projects/:id/chapters/:no/draft`(SSE)、`PUT /projects/:id/chapters/:no/draft`(章节自动保存,写 `chapters` draft见 ARCH §7.2)。· 依赖 T0.3,T1.3 · DoD 端点契约入 OpenAPI`draft` 返回 SSE 流;`PUT draft` 幂等保存当前草稿。· 锚点 ARCH §7.2
- **T1.5 [@frontend] AppShell + 作品库 + 立项向导** → 顶栏/左导航(UX §5)、作品库卡片(UX §6.1)、5 步立项向导(UX §6.2)落 `projects` 字段。· 依赖 T0.4,T1.4 · DoD 可建作品并进入工作台。· 锚点 UX §5/§6.1/§6.2
- **T1.6 [@frontend] 写作工作台(核心)** → 三栏(目录/宋体正文编辑器/本章助手)、流式打字机、本章注入透明面板、自动保存(UX §6.3/§8.3)。· 依赖 T1.4 · DoD 选章→写本章→流式出草稿→自动保存。· 锚点 UX §6.3/§8.3
- **T1.7 [@backend] 提供商凭据管理** → 加密存储 `provider_credentials``GET/PUT /settings/providers``POST /settings/providers/test`(探测+能力矩阵)。· 依赖 T0.2,T1.1 · DoD Key 脱敏返回;测试连接通。· 锚点 ARCH §4.7 / UX §6.10
- **T1.8 [@frontend] 设置页(模型与提供商)** → 档位路由 + 凭据行(脱敏/测试连接/能力徽标)(UX §6.10)。· 依赖 T0.4,T1.7 · DoD 连一家 provider 后可写章。· 锚点 UX §6.10
- **T1.9 [@qa] M1 E2E** → 立项→写一章草稿(mock 网关)→自动保存。· 依赖 T1.5T1.8 · DoD E2E 绿;网关用 mock 不烧 token。· 锚点 ARCH §11
---
## Phase 2 (M2) · 一致性 + 验收
> 目标:写→审(一致性)→裁决→验收(事务写回)。**契约先行T2.1 审稿/冲突 schema。**
- **T2.1 [@llm] continuity Agent 声明 + 结构化输出契约** → `AgentSpec`(分析档) + 输出 `{conflicts:[{type,where,refs,suggestion}]}`(仅冲突digest 改在验收时从终稿另提)。· 依赖 T1.1 · DoD 契约测试mock 响应符合 schema。· 锚点 ARCH §5.1/§5.4
- **T2.2 [@llm] LangGraph 并行审 + review SSE** → write→并行分支(先 continuity)→collect(**落 `chapter_reviews` 留痕**)review 端 SSE(`section/conflict/done`)。· 依赖 T1.3,T2.1 · DoD review 流式返回结构化冲突且入库可查。· 锚点 ARCH §5.2/§7.3
- **T2.3 [@db] 摘要/审稿留痕 Repository + 章节 version** → (表已在 T0.2 建好)`chapter_digests` 追加、`chapter_reviews` 写入、`chapters` 多 version 的 **Repository 逻辑 + 唯一约束**(不含新建表迁移)。· 依赖 T0.2 · DoD 单测append 不覆盖;`(chapter, version)` 唯一。· 锚点 ARCH §3.1/§3.3
- **T2.4 [@backend] 验收事务 + 冲突 gate** → `POST /accept`(单事务:章节晋升 version + **从终稿提炼 digest** append + 裁决留痕 `chapter_reviews.decisions` + 占位 foreshadow/char 更新);未决冲突拦截(`CONFLICT_UNRESOLVED`)LangGraph HITL 恢复(checkpoint 仅控制流,正文/审稿以领域表为准)。· 依赖 T2.2,T2.3 · DoD 事务原子(失败全回滚)digest 来自终稿非草稿;有未决冲突禁验收。· 锚点 ARCH §5.5/§7.1
- **T2.5 [@backend] review API + 历史** → `POST /projects/:id/chapters/:no/review`(SSE) + `GET .../reviews`(审稿历史)。· 依赖 T2.2 · DoD 契约入 OpenAPI。· 锚点 ARCH §7.2
- **T2.6 [@frontend] 审稿报告页 + 冲突裁决 + 验收 gate** → 审稿页(UX §6.4)、正文冲突就地波浪线/锚点、裁决(采纳/忽略/手改)、验收「本次将更新」清单,未决禁验收。· 依赖 T2.4,T2.5 · DoD 写→审→裁决→验收闭环。· 锚点 UX §6.4/§8.3
- **T2.7 [@qa] M2 E2E** → 写→审(一致性)→裁决→验收→摘要入库。· 依赖 T2.6 · DoD E2E 绿。· 锚点 ARCH §11
---
## Phase 3 (M3) · 伏笔 + 节奏
> 目标:伏笔账本/到期提醒/看板 + 节奏引擎 + 大纲。
- **T3.1 [@db] 伏笔表 + 状态机** → `foreshadow` 表 + 纯函数状态机(OPEN/PARTIAL/CLOSED/OVERDUE)。· 依赖 T0.2 · DoD 状态机单测覆盖全转移。· 锚点 ARCH §6.2 / PS §4.2
- **T3.2 [@backend] 到期扫描BackgroundTask** → 验收后触发扫描置 OVERDUE登记/状态变更接口。· 依赖 T2.4,T3.1 · DoD 章号越界自动 OVERDUE。· 锚点 ARCH §6.2
- **T3.3 [@llm] foreshadow-analyst + pace-checker 节点** → 并入四审genre 模板 DSL(存 `rules` genre 级)。· 依赖 T2.2 · DoD 四审齐全、结构化输出。· 锚点 ARCH §5.4/§6.2/§6.4
- **T3.4 [@llm] outliner Agent + 伏笔窗口** → 大纲节点;产出含 `foreshadow_windows`;接近回收窗口提示。· 依赖 T1.1 · DoD 生成分卷分章 + 窗口。· 锚点 ARCH §5.4 / PS §4.2
- **T3.5 [@backend] APIoutline + foreshadow** → `POST /outline``GET /foreshadow?status=`。· 依赖 T3.1,T3.4 · DoD 看板数据可取。· 锚点 ARCH §7.2
- **T3.6 [@frontend] 伏笔看板 + 大纲编辑器 + 节奏报告** → 四泳道看板(UX §6.8)、大纲伏笔徽标(UX §6.7)、节奏节拍图(UX §6.4)。· 依赖 T3.3,T3.5 · DoD OVERDUE 琥珀提醒;节拍图渲染。· 锚点 UX §6.7/§6.8
- **T3.7 [@qa] M3 E2E** → 埋设→进展→逾期提醒;排大纲含窗口。· 依赖 T3.6 · DoD E2E 绿。· 锚点 ARCH §11
---
## Phase 4 (M4) · 文风
> 目标:学文风(指纹) + 漂移打分/回炉。
- **T4.1 [@backend] BackgroundTasks 长任务框架** → `jobs` 写入/进度/查询;`POST /style`(202+jobId)。· 依赖 T0.3 · DoD 长任务异步跑、进度可轮询。· 锚点 ARCH §7.4
- **T4.2 [@llm] style-auditor 双轨 + 并入第四审** → 提取(分析档,带原文证据)→`style_fingerprint`;漂移打分(轻量档)**把漂移打分作为第四审并入 LangGraph review 并行分支与 review SSE**(补齐 continuity/foreshadow/pace 之外的第四审,对齐 ARCH §5.2「四审」)。· 依赖 T1.1,T2.2,T3.3 · DoD 指纹 16 维带证据段落相似度分review 图含四个并行分支、SSE 含文风漂移分项。· 锚点 ARCH §6.3/§5.2 / PS §4.3
- **T4.3 [@backend] APIstyle + refine** → `POST /style`(mode=update)、`POST /chapters/:no/refine`(回炉段)。· 依赖 T4.1,T4.2 · DoD 回炉返回新旧 diff。· 锚点 ARCH §7.2
- **T4.4 [@frontend] 文风页 + 漂移/回炉** → 样本上传+指纹+证据(UX §6.9)、漂移段标注、回炉 diff(UX §8.3)。· 依赖 T4.3 · DoD 学文风→写章漂移标红→一键回炉。· 锚点 UX §6.9/§8.3
- **T4.5 [@qa] M4 E2E** → 学文风→写章打分→回炉。· 依赖 T4.4 · DoD E2E 绿。· 锚点 ARCH §11
---
## Phase 5 (M5) · 生成 + 多 provider + 扩展
> 目标:世界观/角色生成 + 网关多 provider 韧性 + Skill/规则/命令面板。
- **T5.1 [@llm] worldbuilder + character-gen 节点** → 写手档;群像防雷同(注入已生成+已有);编排器入库前追加 continuity 校验。· 依赖 T2.1 · DoD 批量产差异化角色卡、过校验。· 锚点 ARCH §6.5 / PS §4.5
- **T5.2 [@backend] 生成/入库 API** → `POST /world/generate``/characters/generate``POST /characters`(入库)。· 依赖 T5.1 · DoD 预览→入库→进入注入。· 锚点 ARCH §7.2
- **T5.3 [@frontend] 角色生成器 + 世界观设计器 + 设定库** → 生成模态(UX §6.6)、世界观设计器、设定库 Codex(人物/世界观/时间线, UX §6.5)。· 依赖 T5.2 · DoD 一句话生成→预览→入库Codex 可管理。· 锚点 UX §6.5/§6.6
- **T5.4 [@llm] 网关多 provider 韧性** → 多适配器(Anthropic/Gemini/更多 OpenAI 兼容)、回退链 + 熔断 + 能力协商/降级(`usage_ledger` 记账已在 T1.1 落地,此处仅扩展多 provider 维度)。· 依赖 T1.1 · DoD 限流/不支持结构化输出时降级/回退;多 provider 记账分维度可查。· 锚点 ARCH §4.44.6
- **T5.5 [@backend] Skill 运行时 + 规则** → `skills` registry loader + 表权限沙箱(越权拒绝) + `POST /rules`。· 依赖 T0.2,T1.1 · DoD 自定义 skill 受表权限约束、产出经验收 gate。· 锚点 ARCH §5.6 / PS §5.5/§7
- **T5.6 [@frontend] 规则页 + 技能库 + 命令面板** → 规则管理、技能库、命令面板(⌘K)。· 依赖 T5.5 · DoD 加规则/调 skill/快捷跳转。· 锚点 UX §7
- **T5.7 [@qa] M5 E2E + 切 provider** → 生成群像入库;切换 provider 回归(降级/回退)。· 依赖 T5.3,T5.4 · DoD E2E 绿;切 provider 不破。· 锚点 ARCH §11
---
## 2. 阶段 DoD 矩阵
| 阶段 | 出口标准Definition of Done |
|---|---|
| Phase 0 | 骨架可起全表迁移CI 绿;文档与锁定栈一致 |
| M1 | 立项→写一章草稿(流式)→自动保存;连一家 provider |
| M2 | 写→审(一致性)→裁决→验收(事务);未决冲突禁验收 |
| M3 | 伏笔账本/到期提醒/看板;大纲含回收窗口;节奏报告 |
| M4 | 学文风(指纹+证据);漂移打分+回炉 |
| M5 | 世界观/群像生成入库;多 provider 回退/降级Skill 沙箱 |
## 3. 任务 ↔ 文档锚点覆盖(抽样自检)
| 功能(PS §) | 任务 | UX/ARCH 锚点 |
|---|---|---|
| 立项 §6 | T1.4/T1.5 | UX §6.2 |
| 写章 §4/§6 | T1.2/T1.3/T1.6 | ARCH §5.2/§5.3 |
| 一致性 §4.1 | T2.1/T2.4/T2.6 | ARCH §6.1 |
| 伏笔 §4.2 | T3.1/T3.2/T3.6 | ARCH §6.2 / UX §6.8 |
| 文风 §4.3 | T4.2/T4.4 | ARCH §6.3 / UX §6.9 |
| 节奏 §4.4 | T3.3/T3.6 | ARCH §6.4 |
| 角色生成 §4.5 | T5.1/T5.3 | UX §6.6 |
| 多提供商 §3.3 | T1.1/T5.4 | ARCH §4 / UX §6.10 |
| 技能 §5.5 | T5.5 | ARCH §5.6 |
## 4. 后续(原型外,对应规格的 P2/后续标注)
- 多租户 + Auth§9.1Repository 层加 `owner_id` 校验,接 Auth.js/OAuth。
- 向量检索P2`select_relevant_entities` 接口后接 pgvector + 嵌入服务。
- 专门队列BackgroundTasks → arq/Celery接口不变
- 全书一致性回归扫描、社区 Skill 市场、夜读模式。