文档状态:
draft(2026-04-14)
本文档调研 ui-ux-pro-max skill 的真实工程结构,重点回答四个问题:
webnovel-writer 学习说明:
C:\Users\lcy\.gemini\tmp\webnovel-writer\ui-ux-pro-max-skill\src\ui-ux-pro-maxreferences/csv 与 story-system 的收束型 specui-ux-pro-max 能工作的核心,不是”提示词写得长”,而是它把 skill 做成了一个 外置知识库 + 通用检索内核 + 上层推理聚合器 + 持久化主文件/覆盖文件 + 平台分发适配 的小型知识系统。
我们真正缺的不是聚合器(StorySystemEngine 已经承担了这个角色),而是一套显式、结构化、可审查的裁决层——当前很多裁决逻辑仍散落在 engine 代码、CSV、context_manager 和 skill 文本里,还没有被收束成独立的配置层。
对我们最值得学习的,不是 UI 数据本身,而是这五个架构动作:
Master + Override 层级真源但有一个关键区别必须前置:ui-ux-pro-max 本质上是一套”查询时聚合”的准静态知识系统,它的知识域(风格、配色、字体、技术栈 best practices)不会随运行时事件演进。而我们的故事系统会——角色状态、关系、设定、世界规则都随章节提交持续变化。这意味着即使完整复刻它的前四层,仍然还要额外解决 Chapter Commit Layer 与 Projection Layer 的运行时演进问题。
本次重点查看了以下内容:
scripts/core.pyscripts/design_system.pyscripts/search.pydata/*.csvdata/stacks/*.csvdata/_sync_all.pytemplates/base/*.mdtemplates/platforms/*.json从目录结构看,ui-ux-pro-max 至少有三层物理结构,加一条独立运行路径:
ui-ux-pro-max/
├── data/ # 结构化知识库
├── scripts/ # 检索、推理、聚合、持久化
└── templates/ # skill 内容模板、平台安装元数据
运行路径则是:
query
-> search.py
-> core.py / design_system.py
-> 结构化输出或持久化产物
它的数据层明显分了三类:
例如:
styles.csvcolors.csvcharts.csvlanding.csvproducts.csvux-guidelines.csvtypography.csvicons.csvreact-performance.csvapp-interface.csvgoogle-fonts.csv这些表并不追求统一成一个超大表,而是按“知识域”拆分。
对应证据见:
scripts/core.py:17scripts/core.py:18scripts/core.py:68其关键特点是:
filesearch_colsoutput_cols也就是说,它不是“查整张表”,而是为每类知识定义了检索字段和展示字段。
它额外有一张 ui-reasoning.csv,不承担原始知识条目职责,而是承担:
证据见:
scripts/design_system.py:24scripts/design_system.py:43scripts/design_system.py:88这很关键:
它把“检索结果”和“最终裁决”分开了。
它还单独维护:
data/stacks/react.csvdata/stacks/nextjs.csvdata/stacks/vue.csvdata/stacks/react-native.csvdata/stacks/threejs.csv
等 16 张表这些不是产品知识,而是实现层 best practices。
证据见:
scripts/core.py:75scripts/core.py:95data/stacks/react.csv这说明它的数据分层并不是按文件类型,而是按职责分层:
core.py 的核心并不复杂,但架构很干净:
CSV_CONFIG 注册 domain_load_csv() 统一读表_search_csv() 统一走 BM25search() 做 domain 查询search_stack() 做 stack 查询证据见:
scripts/core.py:17scripts/core.py:166scripts/core.py:221scripts/core.py:243这里最值得学习的不是 BM25 本身,而是:
这让它的数据表可以持续增加,而不用每加一张表就重写一套逻辑。
关键摘录如下:
CSV_CONFIG = {
"style": {
"file": "styles.csv",
"search_cols": [...],
"output_cols": [...]
},
"color": {
"file": "colors.csv",
"search_cols": [...],
"output_cols": [...]
},
}
这里也要顺手校准我们当前实现和它的真实差距。
webnovel-writer/scripts/reference_search.py 目前仍然是全局硬编码字段,而不是 per-domain 注册:
_SEARCH_FIELD_WEIGHTS = {
"意图与同义词": 4,
"关键词": 3,
"核心摘要": 2,
"详细展开": 1,
}
_CONTENT_COLUMNS = [
"技法名称", "桥段名称", "人设类型", ...
]
这意味着当前更准确的对应关系不是
core.py -> reference_search.py,而是:
core.py -> reference_search.py + 尚未存在的 CSV_CONFIG 注册层detect_domain() 用关键词表先做 domain 猜测,再决定默认查什么。
证据见:
scripts/core.py:198scripts/core.py:202scripts/core.py:216这一步虽然简单,但很有启发:
对我们来说,这对应的是:
design_system.py 才是这个 skill 真正的中枢。
其逻辑顺序是:
productproduct 结果得到 categoryui-reasoning.csv 找对应 reasoning rulestyle_priority 做多 domain 检索design_system 字典证据见:
scripts/design_system.py:51scripts/design_system.py:64scripts/design_system.py:88scripts/design_system.py:163scripts/design_system.py:197这比单纯 reference_search 高了一层,因为它已经不是“返回搜索命中项”,而是:
这其实已经很接近一个轻量 contract 生成器。
它的另一个关键设计是:
运行时生成的设计系统可以被持久化为:
design-system/<project>/MASTER.mddesign-system/<project>/pages/<page>.md证据见:
scripts/search.py:13scripts/design_system.py:561scripts/design_system.py:589scripts/design_system.py:612scripts/design_system.py:886这套模式的意义非常大:
MASTER.md 承担全局真源pages/*.md 只记录局部偏离这和我们现在的 Story System 其实是同构的:
MASTER_SETTING ≈ MASTER.mdVOLUME / CHAPTER / REVIEW contract ≈ page override也就是说,ui-ux-pro-max 的核心思想并不是 UI 专属,而是:
templates/platforms/*.json 说明它不是只为一个 agent 平台准备的。
例如:
templates/platforms/claude.jsontemplates/platforms/codex.jsontemplates/platforms/gemini.json这些 JSON 负责定义:
证据见:
templates/platforms/claude.jsontemplates/platforms/codex.jsontemplates/platforms/gemini.json这意味着它把三类东西彻底分开了:
这是一个非常值得抄的边界。
data/_sync_all.py 的作用很明确:
products.csv、colors.csv、ui-reasoning.csv证据见:
data/_sync_all.py:1data/_sync_all.py:63data/_sync_all.py:136这个脚本说明它有“离线数据维护流水线”,而不是在 runtime 临时 patch 数据。
但这部分对我们要谨慎学习:
因为我们的硬约束是:
md -> csv 知识迁移必须人工完成所以对我们来说,应当保留:
但不能写:
为避免和 story-system-evolution-spec.md 的六层术语打架,后文统一按 evolution-spec 6.1 的六层来描述迁移:
Knowledge Layer
-> Reasoning Layer
-> Contract Layer
-> Runtime Assembly Layer
-> Chapter Commit Layer
-> Projection Layer
ui-ux-pro-max 主要覆盖的是前四层,加上一套 MASTER.md + page override 的持久化真源;
而我们的故事系统还必须额外补上 Chapter Commit 和 Projection,因为知识会随章节运行时演进。
映射到我们项目里,更准确的对照应是:
evolution-spec 六层 |
ui-ux-pro-max 参照物 |
webnovel-writer 现状 / 目标 |
当前完成度 |
|---|---|---|---|
Knowledge Layer |
products.csv、styles/colors/...、stack tables |
references/csv 基础表、动态表、路由基础表 |
已有基础骨架:7 张规则表、路由表、README schema 已在位 |
Reasoning Layer |
core.py 的 CSV_CONFIG + detect_domain(),以及 design_system.py 的 reasoning rule |
题材与调性推理.csv、StorySystemEngine._route()、未来显式 CSV_CONFIG 与 reasoning config |
半成品:已有 route 与 engine 裁决,但还没抽成显式配置层 |
Contract Layer |
design_system 统一对象与 MASTER.md/pages/*.md |
MASTER_SETTING / VOLUME_BRIEF / CHAPTER_BRIEF / REVIEW_CONTRACT / anti_patterns |
已接上主骨架:engine.build() 可产出 MASTER/CHAPTER/ANTI,RuntimeContractBuilder 可产出 VOLUME/REVIEW |
Runtime Assembly Layer |
生成页面时“先 page override,再 MASTER”的装配逻辑 | context_manager(contract-first) 与运行时上下文装配 |
半成品:context_manager 已读 runtime contracts,但整体仍是运行时装配器,尚未完全收束到 contract-first SSOT |
Chapter Commit Layer |
无完整对应;UI/UX skill 没有事件提交主链 | CHAPTER_COMMIT + override ledger |
已接线待治理:ChapterCommitService 已能生成 commit、写 event log、触发 amend proposal 与 projection writers,但 rejected/backlog 治理仍未完全闭合 |
Projection Layer |
无完整对应;没有状态投影链 | state / index / summaries / memory / dashboard |
已接线待降级:已有四类 projection writer,但旧的 state/index/memory 散写与双写链路仍未完全退居投影层 |
如果只看搜索 primitive 和聚合器,对应关系要写得更严格一些:
core.py ≈ reference_search.py + 尚未存在的 CSV_CONFIG 注册层design_system.py ≈ StorySystemEngine + story_system.py + RuntimeContractBuilder当前我们已经有:
题材与调性推理.csvreference_search.pystory_system_engine.py而且当前系统已经不是“只有搜索,没有聚合”。
story_system.py 已经串起了 build -> persist story seed -> build runtime contracts -> persist runtime contracts 的主链:
contract = engine.build(...)
persist_story_seed(...)
volume_brief, review_contract = RuntimeContractBuilder(project_root).build_for_chapter(...)
persist_runtime_contracts(project_root, args.chapter, volume_brief, review_contract)
StorySystemEngine.build() 也已经直接产出 MASTER_SETTING / CHAPTER_BRIEF / anti_patterns:
return {
"master_setting": {
"meta": {"contract_type": "MASTER_SETTING"},
...
},
"chapter_brief": {
"meta": {"contract_type": "CHAPTER_BRIEF"},
...
},
"anti_patterns": anti_patterns,
}
这意味着当前的 StorySystemEngine + RuntimeContractBuilder,实际上已经共同承担了
route / aggregate / persist 主链中的大部分职责。
所以现状并不是“还缺一个像 design_system.py 那样的聚合器”,而是:
context_manager.py 和 skill 文本里ui-reasoning.csv 那样被提炼成一套显式、结构化、可审查、可测试的规则层目前很多裁决还散落在:
story_system_engine.pycontext_manager.py后续建议把这类规则显式收束为 Python 配置层,或落成一张独立 reasoning 表。
不一定非要 CSV,但必须是结构化、可审查、可测试的。
这一点其实我们已经部分做到,但还需要在 spec 层写得更硬:
MASTER_SETTING 是全局真源VOLUME_BRIEF 是卷级偏移CHAPTER_BRIEF / REVIEW_CONTRACT 是章级偏移CHAPTER_COMMIT 是写后事实真源这和 ui-ux-pro-max 的 MASTER.md + page override 是同一类思想。
但这里必须补一条关键校准:
ui-ux-pro-max 实际上是二层覆盖:
MASTER.mdpages/*.md而我们已经是四层合同覆盖 + 写后事实层:
MASTER_SETTINGVOLUME_BRIEFCHAPTER_BRIEFREVIEW_CONTRACTCHAPTER_COMMIT这意味着同一个 field 可能在多个层级被覆盖,复杂度显著高于
page override trumps master 这种二层规则。
所以我们不能直接照搬它的覆盖判定逻辑,必须与 evolution-spec 8.5 的 override ledger 一起设计。
对我们真正重要的是建立一个统一注册表,明确:
也就是做出属于我们的 CSV_CONFIG。
但这一步的起点应该是:承认当前 reference_search.py 只是一个通用 BM25 primitive,还不是注册式配置层。
它现在的检索列和展示列都是全局硬编码,不区分 domain:
_SEARCH_FIELD_WEIGHTS = {
"意图与同义词": 4,
"关键词": 3,
"核心摘要": 2,
"详细展开": 1,
}
_CONTENT_COLUMNS = [...]
因此下一步不是重写搜索算法,而是在它上面补一层 per-table / per-domain 的元数据注册。
后续我们自己的 CSV / contract 系统,不应该直接把表结构暴露给所有消费者。
正确方向是:
story-system 负责产出统一 contractcontext-agent / webnovel-write / webnovel-query / dashboard 只消费 contractui-ux-pro-max 的 CSV 检索结果直接进 prompt,单次交互的上下文窗口足够消化。但我们的写作任务书需要织入前文摘要、长期记忆、RAG 线索、当前状态、追读信号等多源数据,context-agent 自身的 research 阶段就要消耗大量上下文。
这意味着 reasoning 层不能照搬它"查完全部再推理"的模式,而是要考虑:
这个差异直接影响"reasoning 层该做多重"的设计决策:我们的 reasoning 层应该是轻量配置 + 按需路由,而不是像 design_system.py 那样在单次调用中串联五六个 domain 的检索结果。
ui-ux-pro-max 的 _sync_all.py 有一定“程序生成衍生数据”的倾向。
这对 UI 配色数据可以接受,但对故事知识库不适合。
我们的硬边界仍然要保持:
它的 detect_domain() 主要靠关键词启发式。
这在 UI 场景可以用,但故事系统不能只靠这个。
我们更适合的顺序是:
.story-system contract题材与调性推理.csv注:这里说的是题材路由判定顺序,不同于 evolution-spec 7.2 的运行时上下文装配优先级。
后者是在合同已存在时,按 chapter -> volume -> master -> 题材与调性推理.csv -> genre-profiles.md -> templates/genres/*.md 组装输入。
平台适配层必须是壳,不应该反向决定 CSV 结构。
如果把这次调研落成一份可执行 spec,最应该写进 spec 的不是“继续加几百条 CSV”,而是以下结构要求:
CSV_CONFIG这里的 CSV_CONFIG 不应取代 references/csv/README.md,两者应该明确分工:
CSV_CONFIG:Python 代码层注册字典,供 runtime 的检索、路由、contract 注入直接消费README.md:人类可读的 schema / 录入规范 / 表边界说明CSV_CONFIG 与 README.md 的列定义、表角色、前缀约定保持一致当前 README.md 已经承担了 schema 文档职责,例如:
| `关键词` | 是 | 高权重触发词,多值字段,统一使用 `|` |
| `核心摘要` | 是 | 供高权重召回与结果展示使用的简明摘要 |
### 命名规则.csv
| `命名对象` | 角色、书名、地点、势力、功法、道具等 |
因此更合理的落地方向不是”README 或 CSV_CONFIG 二选一”,而是:
CSV_CONFIG 讲机器话至少明确:
这一步是本次调研最关键的迁移结论。
也就是:
消费统一 contract,而不是各自重新拼知识。
ui-ux-pro-max 的成功,本质上说明了一件事:
一个强 skill 的核心,不是写一篇更长的说明书,而是把知识、检索、推理、持久化和消费边界做成明确分层。
对 webnovel-writer 来说,最值得学习的最终不是:
而是:
references/csv 承担 Knowledge Layer(见 evolution-spec 6.1, 12.3)story_system + 显式 reasoning 配置 承担 Reasoning / Contract Layer(见 evolution-spec 6.1, 7).story-system 承担主真源与覆盖层(见 evolution-spec 7, 8.5)CHAPTER_COMMIT + override ledger + canonical event log 承担运行时演进主链(见 evolution-spec 9, 10)evolution-spec 9.4, 12)这才是它真正值得迁移过来的思想和架构。