Browse Source

docs: add comprehensive system architecture diagram with full read/write mappings

lingfengQAQ 2 months ago
parent
commit
bb9829a110
1 changed files with 430 additions and 0 deletions
  1. 430 0
      docs/architecture/system-architecture.md

+ 430 - 0
docs/architecture/system-architecture.md

@@ -0,0 +1,430 @@
+# Webnovel Writer 系统架构图
+
+> 生成日期:2026-04-15
+> 覆盖范围:init → plan → write 全链路的读写关系
+
+## 总链路
+
+```mermaid
+graph TB
+    subgraph USER["用户(User)"]
+        U_INPUT["用户输入"]
+    end
+
+    subgraph INIT["/webnovel-init(项目初始化)"]
+        INIT_COLLECT["Step 1-7: 交互收集"]
+        INIT_GEN["执行生成"]
+        INIT_STORY["story-system 初始化"]
+    end
+
+    subgraph PLAN["/webnovel-plan(大纲规划)"]
+        PLAN_LOAD["Step 1: 加载数据"]
+        PLAN_SETTING["Step 2: 补齐设定"]
+        PLAN_VOLUME["Step 3-6: 卷级规划"]
+        PLAN_CHAPTER["Step 7: 拆章纲"]
+        PLAN_WRITEBACK["Step 8: 设定写回"]
+        PLAN_STORY["story-system 刷新"]
+    end
+
+    subgraph WRITE["/webnovel-write(写章流程)"]
+        W_PREFLIGHT["准备: preflight"]
+        W_STORY["准备: story-system 刷新合同树"]
+        W_STEP1["Step 1: context-agent"]
+        W_STEP2["Step 2: 起草正文"]
+        W_STEP3["Step 3: reviewer 审查"]
+        W_STEP4["Step 4: 润色"]
+        W_STEP5["Step 5: data-agent + commit"]
+        W_STEP6["Step 6: git 备份"]
+    end
+
+    U_INPUT --> INIT_COLLECT
+    INIT_COLLECT --> INIT_GEN --> INIT_STORY
+    INIT_STORY --> PLAN_LOAD
+    PLAN_LOAD --> PLAN_SETTING --> PLAN_VOLUME --> PLAN_CHAPTER --> PLAN_WRITEBACK
+    PLAN_CHAPTER --> PLAN_STORY
+    PLAN_STORY --> W_PREFLIGHT
+    W_PREFLIGHT --> W_STORY --> W_STEP1 --> W_STEP2 --> W_STEP3 --> W_STEP4 --> W_STEP5 --> W_STEP6
+```
+
+## Init 阶段读写
+
+```mermaid
+graph LR
+    subgraph INIT["/webnovel-init"]
+        I1["交互收集(7 步)"]
+        I2["init_project.py"]
+        I3["Patch 总纲"]
+        I4["story-system CLI"]
+    end
+
+    subgraph STORE_INIT["产出文件"]
+        S_STATE["state.json"]
+        S_SETTING["设定集/*.md"]
+        S_OUTLINE["大纲/总纲.md"]
+        S_IDEA["idea_bank.json"]
+        S_MASTER["MASTER_SETTING.json"]
+        S_ANTI["anti_patterns.json"]
+    end
+
+    subgraph REF_INIT["读取参考"]
+        R_GENRE_TROPES["genre-tropes.md"]
+        R_GENRE_PROFILE["genre-profiles.md"]
+        R_WORLD["worldbuilding/*.md"]
+        R_CREATIVE["creativity/*.md"]
+        R_CSV_NAME["命名规则.csv"]
+    end
+
+    R_GENRE_TROPES -->|"Read"| I1
+    R_GENRE_PROFILE -->|"Read"| I1
+    R_WORLD -->|"Read(按需)"| I1
+    R_CREATIVE -->|"Read(按需)"| I1
+    R_CSV_NAME -->|"reference_search(命名)"| I1
+
+    I1 --> I2
+    I2 -->|"Write"| S_STATE
+    I2 -->|"Write"| S_SETTING
+    I2 -->|"Write"| S_OUTLINE
+    I1 --> I3
+    I3 -->|"Write"| S_OUTLINE
+    I1 -->|"Write"| S_IDEA
+
+    I2 --> I4
+    S_STATE -->|"Read genre"| I4
+    I4 -->|"Write"| S_MASTER
+    I4 -->|"Write"| S_ANTI
+
+    subgraph CSV_ENGINE["story-system 引擎"]
+        CSV_ROUTE["题材与调性推理.csv(路由)"]
+        CSV_REASON["裁决规则.csv(裁决)"]
+        CSV_BASE["基础表 x5(命名/人设/技法/设定/场景)"]
+        CSV_DYN["动态表 x2(桥段/爽点)"]
+    end
+
+    CSV_ROUTE -->|"Read(路由匹配)"| I4
+    CSV_REASON -->|"Read(裁决匹配)"| I4
+    CSV_BASE -->|"Read(BM25 检索)"| I4
+    CSV_DYN -->|"Read(BM25 检索)"| I4
+```
+
+## Plan 阶段读写
+
+```mermaid
+graph LR
+    subgraph PLAN["/webnovel-plan"]
+        P1["Step 1: 加载"]
+        P2["Step 2: 补设定"]
+        P3["Step 4-5: 节拍表+时间线"]
+        P4["Step 6: 卷纲"]
+        P5["Step 7: 拆章纲"]
+        P6["Step 8: 设定写回"]
+        P7["story-system"]
+    end
+
+    subgraph READ_PLAN["读取"]
+        R_STATE2["state.json"]
+        R_OUTLINE2["大纲/总纲.md"]
+        R_SETTING2["设定集/*.md"]
+        R_IDEA2["idea_bank.json"]
+        R_SUMMARY["summaries/(跨卷时)"]
+        R_KNOWLEDGE["knowledge query(跨卷时)"]
+        R_LOOPS["memory-contract get-open-loops(跨卷时)"]
+        R_MASTER2["MASTER_SETTING.json"]
+    end
+
+    subgraph WRITE_PLAN["写入"]
+        W_BEAT["大纲/第X卷-节拍表.md"]
+        W_TIMELINE["大纲/第X卷-时间线.md"]
+        W_DETAIL["大纲/第X卷-详细大纲.md"]
+        W_SETTING2["设定集/*.md(增量)"]
+        W_VOLUME["volumes/volume_NNN.json"]
+        W_CHAP_CONTRACT["chapters/chapter_NNN.json"]
+        W_REVIEW_CONTRACT["reviews/chapter_NNN.review.json"]
+    end
+
+    subgraph REF_PLAN["参考"]
+        R_GP["genre-profiles.md"]
+        R_STRAND["strand-weave-pattern.md"]
+        R_COOL["cool-points-guide.md"]
+        R_CSV_PLAN["CSV 检索(场景/命名)"]
+    end
+
+    R_STATE2 -->|"Read"| P1
+    R_OUTLINE2 -->|"Read"| P1
+    R_SETTING2 -->|"Read"| P1
+    R_IDEA2 -->|"Read(按需)"| P1
+    R_SUMMARY -->|"Read(跨卷)"| P1
+    R_KNOWLEDGE -->|"Bash(跨卷)"| P1
+    R_LOOPS -->|"Bash(跨卷)"| P1
+    R_MASTER2 -->|"Read(调性参照)"| P4
+
+    P2 -->|"Write(增量)"| W_SETTING2
+    P3 -->|"Write"| W_BEAT
+    P3 -->|"Write"| W_TIMELINE
+    P4 --> P5
+    P5 -->|"Write"| W_DETAIL
+
+    R_GP -->|"Read"| P4
+    R_STRAND -->|"Read"| P4
+    R_COOL -->|"Read(按需)"| P4
+    R_CSV_PLAN -->|"Bash(检索)"| P4
+
+    P6 -->|"Write(增量)"| W_SETTING2
+
+    P5 --> P7
+    R_STATE2 -->|"Read genre"| P7
+    P7 -->|"Write"| W_VOLUME
+    P7 -->|"Write"| W_CHAP_CONTRACT
+    P7 -->|"Write"| W_REVIEW_CONTRACT
+```
+
+## Write 阶段读写(核心链路)
+
+```mermaid
+graph TB
+    subgraph PREP["准备阶段"]
+        PRE1["preflight + where"]
+        PRE2["story-system CLI"]
+    end
+
+    subgraph STEP1["Step 1: context-agent(子代理)"]
+        CA_LOAD["load-context"]
+        CA_READ["Read 章纲原文"]
+        CA_QUERY["按需 query-entity / query-rules"]
+        CA_OUT["输出: 写作任务书"]
+    end
+
+    subgraph STEP2["Step 2: 起草正文"]
+        S2_WRITE["Write 正文"]
+        S2_CSV["reference_search(按需)"]
+    end
+
+    subgraph STEP3["Step 3: reviewer(子代理)"]
+        REV_READ["Read 正文"]
+        REV_CONTRACT["Read 审查合同"]
+        REV_OUT["Write review_results.json"]
+        REV_PIPE["review-pipeline --save-metrics"]
+    end
+
+    subgraph STEP4["Step 4: 润色"]
+        S4_REF["Read polish-guide / typesetting / style-adapter"]
+        S4_EDIT["Edit 正文"]
+    end
+
+    subgraph STEP5["Step 5: data-agent + commit"]
+        DA_READ["Read 正文"]
+        DA_ENTITY["Bash: get-core-entities / recent-appearances"]
+        DA_ARTIFACTS["Write 4份 artifacts"]
+        COMMIT["chapter-commit CLI"]
+        PROJ["projection writers x5"]
+    end
+
+    subgraph STEP6["Step 6: Git"]
+        GIT["git add + commit"]
+    end
+
+    %% 数据存储
+    subgraph STORES["数据存储"]
+        ST_STATE["state.json(状态)"]
+        ST_INDEX["index.db(实体/关系)"]
+        ST_SUMMARY["summaries/chNNNN.md(摘要)"]
+        ST_MEMORY["memory_scratchpad.json(记忆)"]
+        ST_VECTOR["vector_db(向量索引)"]
+        ST_COMMIT["commits/chapter_NNN.commit.json(写后真源)"]
+        ST_CHAPTER["正文/第NNNN章.md"]
+        ST_TMP["tmp/*.json(中间产物)"]
+    end
+
+    subgraph CONTRACTS["合同树(.story-system/)"]
+        CT_MASTER["MASTER_SETTING.json"]
+        CT_VOLUME["volumes/volume_NNN.json"]
+        CT_CHAPTER["chapters/chapter_NNN.json"]
+        CT_REVIEW["reviews/chapter_NNN.review.json"]
+        CT_ANTI["anti_patterns.json"]
+    end
+
+    subgraph OUTLINE["大纲"]
+        OL_DETAIL["大纲/第X卷-详细大纲.md"]
+    end
+
+    subgraph CSV["CSV 知识层"]
+        CSV_R["题材与调性推理.csv(路由)"]
+        CSV_J["裁决规则.csv(裁决)"]
+        CSV_ALL["基础表+动态表 x7"]
+    end
+
+    subgraph REFS["润色参考"]
+        REF_POLISH["polish-guide.md"]
+        REF_TYPE["typesetting.md"]
+        REF_STYLE["style-adapter.md"]
+    end
+
+    %% 准备阶段
+    ST_STATE -->|"Read genre"| PRE2
+    CSV_R -->|"Read(路由)"| PRE2
+    CSV_J -->|"Read(裁决)"| PRE2
+    CSV_ALL -->|"Read(BM25)"| PRE2
+    PRE2 -->|"Write"| CT_MASTER
+    PRE2 -->|"Write"| CT_VOLUME
+    PRE2 -->|"Write"| CT_CHAPTER
+    PRE2 -->|"Write"| CT_REVIEW
+    PRE2 -->|"Write"| CT_ANTI
+
+    %% Step 1
+    PRE2 --> CA_LOAD
+    CA_LOAD -->|"Bash: load-context"| ST_STATE
+    CA_LOAD -.->|"内含 contracts"| CT_MASTER
+    CA_LOAD -.->|"内含 summaries"| ST_SUMMARY
+    CA_LOAD -.->|"内含 protagonist"| ST_STATE
+    CA_LOAD -.->|"内含 loops"| ST_STATE
+    CA_READ -->|"Read"| OL_DETAIL
+    CA_QUERY -->|"Bash(按需)"| ST_INDEX
+    CA_OUT -->|"输出任务书"| STEP2
+
+    %% Step 2
+    S2_CSV -->|"Bash: reference_search"| CSV_ALL
+    S2_WRITE -->|"Write"| ST_CHAPTER
+
+    %% Step 3
+    REV_READ -->|"Read"| ST_CHAPTER
+    REV_CONTRACT -->|"Read"| CT_REVIEW
+    REV_OUT -->|"Write"| ST_TMP
+    REV_PIPE -->|"Bash + Write index.db"| ST_INDEX
+
+    %% Step 4
+    S4_REF -->|"Read"| REF_POLISH
+    S4_REF -->|"Read"| REF_TYPE
+    S4_REF -->|"Read"| REF_STYLE
+    S4_EDIT -->|"Edit"| ST_CHAPTER
+
+    %% Step 5
+    DA_READ -->|"Read"| ST_CHAPTER
+    DA_ENTITY -->|"Bash"| ST_INDEX
+    DA_ARTIFACTS -->|"Write x4"| ST_TMP
+    ST_TMP -->|"Read artifacts"| COMMIT
+    COMMIT -->|"Write"| ST_COMMIT
+
+    %% Projection
+    COMMIT --> PROJ
+    PROJ -->|"Write state_deltas"| ST_STATE
+    PROJ -->|"Write entity_deltas"| ST_INDEX
+    PROJ -->|"Write summary_text"| ST_SUMMARY
+    PROJ -->|"Write memory_facts"| ST_MEMORY
+    PROJ -->|"Write event+delta chunks"| ST_VECTOR
+
+    %% Step 6
+    PROJ --> GIT
+```
+
+## 六层主链总览
+
+```mermaid
+graph TB
+    subgraph L1["Layer 1: 知识层(Knowledge)"]
+        CSV_TABLES["9 张 CSV 表"]
+        CSV_CONFIG["CSV_CONFIG(per-table 注册)"]
+        REF_MD["reference md 文件"]
+    end
+
+    subgraph L2["Layer 2: 裁决层(Reasoning)"]
+        ROUTE["题材与调性推理.csv → _route()"]
+        REASON["裁决规则.csv → _load_reasoning()"]
+        APPLY["_apply_reasoning() + _rank_anti_patterns()"]
+    end
+
+    subgraph L3["Layer 3: 合同层(Contract)"]
+        MASTER["MASTER_SETTING.json"]
+        VOLUME["VOLUME_BRIEF"]
+        CHAPTER["CHAPTER_BRIEF + reasoning"]
+        REVIEW["REVIEW_CONTRACT"]
+        ANTI_P["anti_patterns.json"]
+    end
+
+    subgraph L4["Layer 4: 上下文层(Context)"]
+        CTX_MGR["context_manager.py(纯 JSON)"]
+        LOAD_CTX["load-context(轻量基础包)"]
+        KNOW_Q["knowledge_query.py(时序查询)"]
+    end
+
+    subgraph L5["Layer 5: 提交层(Commit)"]
+        DA["data-agent(提取事实)"]
+        COMMIT_SVC["chapter-commit(写后真源)"]
+        PROJ_ROUTER["EventProjectionRouter"]
+    end
+
+    subgraph L6["Layer 6: 投影层(Projection)"]
+        PW_STATE["state_projection_writer"]
+        PW_INDEX["index_projection_writer"]
+        PW_SUMMARY["summary_projection_writer"]
+        PW_MEMORY["memory_projection_writer"]
+        PW_VECTOR["vector_projection_writer"]
+    end
+
+    subgraph STORES["存储"]
+        S_STATE["state.json"]
+        S_INDEX["index.db"]
+        S_SUMMARY["summaries/"]
+        S_MEMORY["memory_scratchpad"]
+        S_VECTOR["vector_db"]
+    end
+
+    CSV_TABLES --> ROUTE
+    CSV_TABLES --> REASON
+    ROUTE --> APPLY
+    REASON --> APPLY
+    APPLY --> MASTER
+    APPLY --> CHAPTER
+    APPLY --> ANTI_P
+
+    MASTER --> CTX_MGR
+    VOLUME --> CTX_MGR
+    CHAPTER --> CTX_MGR
+    REVIEW --> CTX_MGR
+    CTX_MGR --> LOAD_CTX
+
+    S_STATE --> KNOW_Q
+    S_INDEX --> KNOW_Q
+
+    DA --> COMMIT_SVC
+    COMMIT_SVC --> PROJ_ROUTER
+
+    PROJ_ROUTER --> PW_STATE
+    PROJ_ROUTER --> PW_INDEX
+    PROJ_ROUTER --> PW_SUMMARY
+    PROJ_ROUTER --> PW_MEMORY
+    PROJ_ROUTER --> PW_VECTOR
+
+    PW_STATE -->|"Write"| S_STATE
+    PW_INDEX -->|"Write"| S_INDEX
+    PW_SUMMARY -->|"Write"| S_SUMMARY
+    PW_MEMORY -->|"Write"| S_MEMORY
+    PW_VECTOR -->|"Write"| S_VECTOR
+```
+
+## 题材流通路径
+
+```mermaid
+graph LR
+    INIT_USER["用户选择题材(如'修仙')"]
+    STATE_GENRE["state.json<br/>project.genre='修仙'<br/>(唯一真源)"]
+    
+    STORY_CLI["story-system CLI<br/>--genre '修仙'"]
+    
+    ROUTE_TABLE["题材与调性推理.csv<br/>_route(): fallback"]
+    REASON_TABLE["裁决规则.csv<br/>_load_reasoning('修仙')<br/>别名匹配→东方仙侠"]
+    
+    MASTER_OUT["MASTER_SETTING.json<br/>route.primary_genre"]
+    CHAPTER_OUT["chapter_NNN.json<br/>reasoning.genre='东方仙侠'<br/>reasoning.style_priority<br/>reasoning.pacing_strategy"]
+    
+    CTX_AGENT["context-agent<br/>从 load-context 读取<br/>reasoning 字段"]
+    
+    BRIEF["写作任务书 第4段<br/>'保持冷硬算计感...'"]
+
+    INIT_USER -->|"init 写入"| STATE_GENRE
+    STATE_GENRE -->|"Read genre"| STORY_CLI
+    STORY_CLI -->|"query"| ROUTE_TABLE
+    STORY_CLI -->|"genre fallback"| REASON_TABLE
+    STORY_CLI -->|"persist"| MASTER_OUT
+    STORY_CLI -->|"persist"| CHAPTER_OUT
+    CHAPTER_OUT -->|"load-context"| CTX_AGENT
+    CTX_AGENT -->|"翻译为自然语言"| BRIEF
+```