@qihuang02/world-book-mcp 0.0.5-beta.2 → 0.0.5-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/README.md +102 -41
  2. package/README_ZH.md +102 -43
  3. package/dist/core/character-card-project-builder.d.ts +0 -7
  4. package/dist/core/character-card-project-builder.js +0 -25
  5. package/dist/core/character-card-project-builder.js.map +1 -1
  6. package/dist/core/character-card-validator.d.ts +8 -9
  7. package/dist/core/character-card-validator.js +21 -34
  8. package/dist/core/character-card-validator.js.map +1 -1
  9. package/dist/core/content-lint.js +12 -0
  10. package/dist/core/content-lint.js.map +1 -1
  11. package/dist/core/delivery-checklist.d.ts +3 -4
  12. package/dist/core/delivery-checklist.js +26 -65
  13. package/dist/core/delivery-checklist.js.map +1 -1
  14. package/dist/core/ejs-analyzer.d.ts +20 -0
  15. package/dist/core/ejs-analyzer.js +36 -0
  16. package/dist/core/ejs-analyzer.js.map +1 -0
  17. package/dist/core/ejs-validator.d.ts +11 -11
  18. package/dist/core/ejs-validator.js +60 -32
  19. package/dist/core/ejs-validator.js.map +1 -1
  20. package/dist/core/final-review.d.ts +3 -17
  21. package/dist/core/final-review.js +4 -87
  22. package/dist/core/final-review.js.map +1 -1
  23. package/dist/core/first-message-validator.d.ts +16 -0
  24. package/dist/core/first-message-validator.js +69 -0
  25. package/dist/core/first-message-validator.js.map +1 -0
  26. package/dist/core/greeting-validator.d.ts +2 -13
  27. package/dist/core/greeting-validator.js +10 -77
  28. package/dist/core/greeting-validator.js.map +1 -1
  29. package/dist/core/html-beautify-validator.d.ts +9 -12
  30. package/dist/core/html-beautify-validator.js +25 -35
  31. package/dist/core/html-beautify-validator.js.map +1 -1
  32. package/dist/core/mvu-path-analyzer.d.ts +25 -0
  33. package/dist/core/mvu-path-analyzer.js +288 -0
  34. package/dist/core/mvu-path-analyzer.js.map +1 -0
  35. package/dist/core/mvu-validator.d.ts +12 -11
  36. package/dist/core/mvu-validator.js +82 -146
  37. package/dist/core/mvu-validator.js.map +1 -1
  38. package/dist/core/project-initializer.js +4 -4
  39. package/dist/core/project-initializer.js.map +1 -1
  40. package/dist/core/project-validator.d.ts +8 -0
  41. package/dist/core/project-validator.js +99 -0
  42. package/dist/core/project-validator.js.map +1 -0
  43. package/dist/core/validation-types.d.ts +62 -0
  44. package/dist/core/validation-types.js +73 -0
  45. package/dist/core/validation-types.js.map +1 -0
  46. package/dist/schemas/draft-slice.d.ts +5 -0
  47. package/dist/schemas/draft-slice.js +2 -1
  48. package/dist/schemas/draft-slice.js.map +1 -1
  49. package/dist/storage/draft-store.d.ts +4 -0
  50. package/dist/storage/draft-store.js +11 -0
  51. package/dist/storage/draft-store.js.map +1 -1
  52. package/dist/storage/path-policy.js +2 -2
  53. package/dist/storage/path-policy.js.map +1 -1
  54. package/dist/storage/plan-store.js +21 -10
  55. package/dist/storage/plan-store.js.map +1 -1
  56. package/dist/storage/workspace-store.js +3 -2
  57. package/dist/storage/workspace-store.js.map +1 -1
  58. package/dist/tools/draft-tools.js +5 -9
  59. package/dist/tools/draft-tools.js.map +1 -1
  60. package/dist/tools/export-tools.d.ts +10 -0
  61. package/dist/tools/export-tools.js +29 -60
  62. package/dist/tools/export-tools.js.map +1 -1
  63. package/dist/tools/lint-review-tools.js +13 -4
  64. package/dist/tools/lint-review-tools.js.map +1 -1
  65. package/dist/tools/mvu-variable-tools.js +5 -3
  66. package/dist/tools/mvu-variable-tools.js.map +1 -1
  67. package/dist/tools/project-tools.js +17 -3
  68. package/dist/tools/project-tools.js.map +1 -1
  69. package/package.json +1 -1
package/README.md CHANGED
@@ -1,21 +1,62 @@
1
1
  # world-book-mcp
2
2
 
3
- `world-book-mcp` is an MCP server for creating, modifying, validating, and exporting SillyTavern World Book JSON and `chara_card_v3` character card JSON.
3
+ An MCP server for creating, modifying, validating, and exporting SillyTavern World Book JSON and `chara_card_v3` character card JSON.
4
4
 
5
- ## Main workflow
5
+ ## Architecture
6
+
7
+ The project consists of two layers:
8
+
9
+ ```text
10
+ ┌─────────────────────────────────────────────────────────┐
11
+ │ Skill Layer (skill/world-book-mcp-skill/) │
12
+ │ Creative methodology: guides AI on worldbuilding, │
13
+ │ character design, style extraction, derivative │
14
+ │ extraction from novels/web resources, first messages │
15
+ │ Output: high-quality structured content │
16
+ └────────────────────────────┬────────────────────────────┘
17
+ │ AI calls MCP tools to write drafts
18
+ ┌────────────────────────────▼────────────────────────────┐
19
+ │ MCP Layer (src/) │
20
+ │ Engineering orchestrator: manages draft slices, │
21
+ │ validates consistency, builds MVU/EJS/HTML assets, │
22
+ │ exports SillyTavern JSON │
23
+ │ Output: ready-to-import SillyTavern JSON files │
24
+ └─────────────────────────────────────────────────────────┘
25
+ ```
26
+
27
+ ## Main Workflow
6
28
 
7
29
  ```text
8
30
  User request
9
31
  → init_project
10
- → update_plan
11
- → create_draft_slice
12
- update_draft_field / update_draft_fields
13
- validate_draft
14
- build_assets (optional)
15
- → generate_json
32
+ → update_plan (record requirements, decisions, export target)
33
+ → create_draft_slice / update_draft_field(s) (write content)
34
+ validate_draft (check consistency)
35
+ build_assets (optional, preview MVU/EJS/HTML assets)
36
+ review_project / check_delivery (pre-export review)
37
+ → generate_json (export)
16
38
  ```
17
39
 
18
- ## Workspace
40
+ ## Skill Layer — Creative Methodology
41
+
42
+ `skill/world-book-mcp-skill/` contains reference documents that guide AI content creation:
43
+
44
+ | Document | Content |
45
+ |----------|---------|
46
+ | `worldbuilding-methodology.md` | World design: A/B/C type classification, dimension selection, zero-degree writing |
47
+ | `character-creation.md` | Character design: XML+YAML structure, personality palette, tri-faceted method |
48
+ | `derivative-extraction.md` | Derivative extraction: systematic extraction from novels/web resources |
49
+ | `style-extraction-guide.md` | Style extraction: analyze source material and produce style/forbidden-word entries |
50
+ | `rephrase-guide.md` | Rephrase: author's deep annotations to prevent AI misinterpretation |
51
+ | `content-rules.md` | Content rules: forbidden words, specificity, fourth wall |
52
+ | `first-message.md` | First message rules: hooks, plot momentum, interaction points |
53
+ | `composition.md` | Entry composition: blue/green light, position, order |
54
+ | `requirements.md` | Requirements alignment: user decision flow |
55
+ | `tool-reference.md` | MCP tool parameter quick reference |
56
+
57
+ ## MCP Layer — Engineering Orchestration
58
+
59
+ ### Workspace Structure
19
60
 
20
61
  `init_project` creates:
21
62
 
@@ -34,41 +75,53 @@ User request
34
75
  chapter/
35
76
  ```
36
77
 
37
- It scans existing SillyTavern JSON files in the current directory and slices existing World Book entries, character card profile, greetings, MVU, HTML, EJS, and regex assets into draft files.
78
+ It scans existing SillyTavern JSON files in the current directory and slices World Book entries, character card profile, greetings, MVU, HTML, EJS, and regex assets into draft files.
79
+
80
+ ### Core Tools
81
+
82
+ | Tool | Purpose |
83
+ |------|---------|
84
+ | `init_project` | Initialize `.worldbook/`, scan and slice existing Tavern JSON |
85
+ | `update_plan` | Write requirements, decisions, export target to `.worldbook/plan.md` |
86
+ | `create_draft_slice` | Create a draft slice |
87
+ | `update_draft_field` / `update_draft_fields` | Update draft fields |
88
+ | `validate_draft` | Validate World Book, character card, MVU, EJS, HTML drafts |
89
+ | `build_assets` | Preview assets that will be merged into a character card |
90
+ | `review_project` / `check_delivery` | Pre-export review and blocking checks |
91
+ | `generate_json` | Export World Book JSON, character card JSON, or both |
92
+ | `query_json` | Query exported JSON |
93
+
94
+ ### MVU Variable Tools
95
+
96
+ | Tool | Purpose |
97
+ |------|---------|
98
+ | `list_mvu_variables` | List variables in the schema |
99
+ | `upsert_mvu_variable` | Add or modify a variable |
100
+ | `remove_mvu_variable` | Remove a variable |
101
+ | `rewrite_mvu_variables` | Batch rewrite variables |
38
102
 
39
- ## Core tools
103
+ ### Review & Lint Tools
40
104
 
41
105
  | Tool | Purpose |
42
- |---|---|
43
- | `init_project` | Initialize `.worldbook/`, scan and slice existing Tavern JSON. |
44
- | `update_plan` | Write `.worldbook/plan.md` with requirements, decisions, and export target. |
45
- | `create_draft_slice` | Create draft slices for World Book, character card, MVU, HTML, EJS, etc. |
46
- | `update_draft_field` | Update one draft field. |
47
- | `update_draft_fields` | Update multiple fields in one draft slice. |
48
- | `list_draft_slices` | List draft slices. |
49
- | `get_draft_slice` | Read one draft slice. |
50
- | `delete_draft_slice` | Delete one draft slice. |
51
- | `validate_draft` | Validate World Book, character card, MVU, HTML, and EJS drafts. |
52
- | `build_assets` | Preview assets that will be merged into a character card. |
53
- | `generate_json` | Export World Book JSON, character card JSON, or both. |
54
- | `query_json` | Query exported JSON. |
55
-
56
- ## Draft types
57
-
58
- - `worldbook_entry`
59
- - `character_profile`
60
- - `character_greetings`
61
- - `mvu_schema`
62
- - `mvu_update_rules`
63
- - `html_statusbar`
64
- - `html_regex`
65
- - `ejs_entry`
66
- - `style_profile`
67
- - `chapter_outline`
68
-
69
- ## Modifying existing JSON
70
-
71
- The old import/patch/apply workflow has been removed. To modify an existing character card or World Book:
106
+ |------|---------|
107
+ | `lint_worldbook_content` | Run forbidden-word/specificity lint on text |
108
+ | `lint_project_content` | Run lint on the entire project |
109
+ | `create_writing_optimization_report` | Generate a writing optimization report |
110
+
111
+ ### Draft Types
112
+
113
+ - `worldbook_entry` World Book entry
114
+ - `character_profile` Character card profile
115
+ - `character_greetings` First messages / alternate greetings
116
+ - `mvu_schema` MVU ZOD schema
117
+ - `mvu_update_rules` MVU initvar + update_rules
118
+ - `html_statusbar` HTML status bar
119
+ - `html_regex` — HTML regex scripts
120
+ - `ejs_entry` — EJS dynamic entries
121
+ - `style_profile` — Style configuration
122
+ - `chapter_outline` — Chapter outline
123
+
124
+ ## Modifying Existing JSON
72
125
 
73
126
  ```text
74
127
  init_project(scan_existing=true, import_strategy="auto")
@@ -89,3 +142,11 @@ MCP silently records tool-call summaries in:
89
142
  ```
90
143
 
91
144
  Long text fields are summarized with preview, length, and hash.
145
+
146
+ ## Development
147
+
148
+ ```bash
149
+ npm install
150
+ npm run typecheck
151
+ npm test
152
+ ```
package/README_ZH.md CHANGED
@@ -1,23 +1,62 @@
1
1
  # world-book-mcp
2
2
 
3
- `world-book-mcp` 是用于创建、修改、校验并导出 SillyTavern 世界书 JSON 与 `chara_card_v3` 角色卡 JSON 的 MCP 服务器。
3
+ `world-book-mcp` 是一个 MCP server,用于创建、修改、校验和导出 SillyTavern 世界书 JSON 与 `chara_card_v3` 角色卡 JSON
4
4
 
5
- ## 主线流程
5
+ ## 架构
6
+
7
+ 项目由两层组成:
8
+
9
+ ```text
10
+ ┌─────────────────────────────────────────────────────┐
11
+ │ Skill 层(skill/world-book-mcp-skill/) │
12
+ │ 创作方法论:指导 AI 如何设计世界观、写角色、 │
13
+ │ 提取文风、从小说/网络资源中抽取信息、写开场白 │
14
+ │ 产出:高质量的结构化语料 │
15
+ └──────────────────────────┬──────────────────────────┘
16
+ │ AI 调用 MCP 工具写入 draft
17
+ ┌──────────────────────────▼──────────────────────────┐
18
+ │ MCP 层(src/) │
19
+ │ 工程编排器:管理 draft 切片、校验一致性、 │
20
+ │ 构建 MVU/EJS/HTML 资产、导出酒馆 JSON │
21
+ │ 产出:可直接导入 SillyTavern 的 JSON 文件 │
22
+ └─────────────────────────────────────────────────────┘
23
+ ```
24
+
25
+ ## 主线工作流
6
26
 
7
27
  ```text
8
- 用户提出需求
28
+ 用户需求
9
29
  → init_project
10
- → update_plan
11
- → create_draft_slice
12
- update_draft_field / update_draft_fields
13
- validate_draft
14
- build_assets(可选)
15
- → generate_json
30
+ → update_plan(记录需求、决策、导出目标)
31
+ → create_draft_slice / update_draft_field(s)(写入语料)
32
+ validate_draft(校验一致性)
33
+ build_assets(可选,预览 MVU/EJS/HTML 资产)
34
+ review_project / check_delivery(交付前审查)
35
+ → generate_json(导出)
16
36
  ```
17
37
 
18
- ## 工作区
38
+ ## Skill 层 — 创作方法论
39
+
40
+ `skill/world-book-mcp-skill/` 包含指导 AI 创作的 reference 文档:
41
+
42
+ | 文档 | 内容 |
43
+ |------|------|
44
+ | `worldbuilding-methodology.md` | 世界观设计:A/B/C 类型判定、维度取舍、总纲零度写作 |
45
+ | `character-creation.md` | 角色设定:XML+YAML 结构、性格调色盘、三面性、开场白 |
46
+ | `derivative-extraction.md` | 二创提取:从小说/网络资源系统性提取角色、世界观、事件 |
47
+ | `style-extraction-guide.md` | 文风提取:分析源材料风格并转化为风格条目和禁词条目 |
48
+ | `rephrase-guide.md` | 二次解释:作者对角色深层逻辑的注释,防止 AI 误解 |
49
+ | `content-rules.md` | 内容规则:禁词、具体性、第四面墙 |
50
+ | `first-message.md` | 开场白规则:吸引力、剧情动力、互动点 |
51
+ | `composition.md` | 条目编排:蓝绿灯、position、order |
52
+ | `requirements.md` | 需求对齐:用户决策流程 |
53
+ | `tool-reference.md` | MCP 工具参数速查 |
54
+
55
+ ## MCP 层 — 工程编排
19
56
 
20
- `init_project` 会创建:
57
+ ### 工作区结构
58
+
59
+ `init_project` 创建:
21
60
 
22
61
  ```text
23
62
  .worldbook/
@@ -34,41 +73,53 @@
34
73
  chapter/
35
74
  ```
36
75
 
37
- 它会自动扫描当前目录已有 SillyTavern JSON,并切片已有世界书、角色卡 profile、greetings、MVU、HTML、EJS regex 资产。
76
+ 自动扫描当前目录下的 SillyTavern JSON 文件,将世界书条目、角色卡 profile、greetings、MVU、HTML、EJS 等资产切片到 draft 目录。
38
77
 
39
- ## 核心工具
78
+ ### 核心工具
40
79
 
41
80
  | 工具 | 用途 |
42
- |---|---|
43
- | `init_project` | 初始化 `.worldbook/`,自动扫描并切片已有酒馆 JSON |
44
- | `update_plan` | 写入 `.worldbook/plan.md`,记录需求、用户决策和导出目标。 |
45
- | `create_draft_slice` | 创建世界书、角色卡、MVU、HTML、EJS draft 切片。 |
46
- | `update_draft_field` | 更新单个 draft 字段。 |
47
- | `update_draft_fields` | 更新同一 draft 的多个字段。 |
48
- | `list_draft_slices` | 列出 draft。 |
49
- | `get_draft_slice` | 读取 draft。 |
50
- | `delete_draft_slice` | 删除 draft。 |
51
- | `validate_draft` | 统一校验世界书、角色卡、MVU、HTML、EJS。 |
52
- | `build_assets` | 预览最终会合并进角色卡的世界书资产、regex、Tavern Helper、EJS 条目。 |
53
- | `generate_json` | 导出世界书 JSON、角色卡 JSON 或两者。 |
54
- | `query_json` | 查询导出的 JSON。 |
55
-
56
- ## draft 类型
57
-
58
- - `worldbook_entry`
59
- - `character_profile`
60
- - `character_greetings`
61
- - `mvu_schema`
62
- - `mvu_update_rules`
63
- - `html_statusbar`
64
- - `html_regex`
65
- - `ejs_entry`
66
- - `style_profile`
67
- - `chapter_outline`
81
+ |------|------|
82
+ | `init_project` | 初始化 `.worldbook/`,扫描并切片已有酒馆 JSON |
83
+ | `update_plan` | 写入需求、决策、导出目标到 `.worldbook/plan.md` |
84
+ | `create_draft_slice` | 创建 draft 切片 |
85
+ | `update_draft_field` / `update_draft_fields` | 更新 draft 字段 |
86
+ | `validate_draft` | 校验世界书、角色卡、MVU、EJS、HTML |
87
+ | `build_assets` | 预览将合并到角色卡的资产 |
88
+ | `review_project` / `check_delivery` | 交付前审查与阻塞检查 |
89
+ | `generate_json` | 导出世界书 JSON、角色卡 JSON 或两者 |
90
+ | `query_json` | 查询已导出的 JSON |
91
+
92
+ ### MVU 变量工具
68
93
 
69
- ## 修改已有 JSON
94
+ | 工具 | 用途 |
95
+ |------|------|
96
+ | `list_mvu_variables` | 列出 schema 中的变量 |
97
+ | `upsert_mvu_variable` | 新增/修改变量 |
98
+ | `remove_mvu_variable` | 删除变量 |
99
+ | `rewrite_mvu_variables` | 批量重写变量 |
100
+
101
+ ### 审查与 lint 工具
102
+
103
+ | 工具 | 用途 |
104
+ |------|------|
105
+ | `lint_worldbook_content` | 对文本执行禁词/具体性 lint |
106
+ | `lint_project_content` | 对整个项目执行 lint |
107
+ | `create_writing_optimization_report` | 写作优化报告 |
108
+
109
+ ### Draft 类型
110
+
111
+ - `worldbook_entry` — 世界书条目
112
+ - `character_profile` — 角色卡 profile
113
+ - `character_greetings` — 开场白
114
+ - `mvu_schema` — MVU ZOD schema
115
+ - `mvu_update_rules` — MVU initvar + update_rules
116
+ - `html_statusbar` — HTML 状态栏
117
+ - `html_regex` — HTML 正则脚本
118
+ - `ejs_entry` — EJS 动态条目
119
+ - `style_profile` — 文风配置
120
+ - `chapter_outline` — 章节大纲
70
121
 
71
- 旧的 import/patch/apply 流程已移除。修改已有角色卡或世界书统一走:
122
+ ## 修改已有 JSON
72
123
 
73
124
  ```text
74
125
  init_project(scan_existing=true, import_strategy="auto")
@@ -81,11 +132,19 @@ init_project(scan_existing=true, import_strategy="auto")
81
132
 
82
133
  ## 日志
83
134
 
84
- MCP 会静默记录工具调用摘要:
135
+ MCP 静默记录工具调用摘要:
85
136
 
86
137
  ```text
87
138
  .worldbook/logs/latest.jsonl
88
139
  .worldbook/logs/<session>.jsonl
89
140
  ```
90
141
 
91
- 长文本只记录 preview、长度和 hash
142
+ 长文本字段以 preview + length + hash 形式记录。
143
+
144
+ ## 开发
145
+
146
+ ```bash
147
+ npm install
148
+ npm run typecheck
149
+ npm test
150
+ ```
@@ -1,12 +1,5 @@
1
1
  import type { Project } from "../schemas/project.js";
2
2
  import { type CharacterCardJson } from "./character-card-builder.js";
3
- import { validateCharacterCardConfig } from "./character-card-validator.js";
4
- import { validateEjsConfig } from "./ejs-validator.js";
5
- import { validateHtmlBeautifyConfig } from "./html-beautify-validator.js";
6
- import { validateMvuConfig } from "./mvu-validator.js";
7
- export type CharacterCardProjectValidation = ReturnType<typeof validateCharacterCardConfig> | ReturnType<typeof validateMvuConfig> | ReturnType<typeof validateHtmlBeautifyConfig> | ReturnType<typeof validateEjsConfig>;
8
- export declare function validateCharacterCardProject(project: Project): CharacterCardProjectValidation;
9
3
  export declare function buildCharacterCardJsonFromProject(project: Project, extraRegexScripts?: import("./mvu-assets.js").RegexScriptAsset[]): {
10
4
  card: CharacterCardJson;
11
- validation: CharacterCardProjectValidation;
12
5
  };
@@ -1,35 +1,10 @@
1
1
  import { buildCharacterCardJson } from "./character-card-builder.js";
2
- import { validateCharacterCardConfig } from "./character-card-validator.js";
3
- import { validateEjsConfig } from "./ejs-validator.js";
4
- import { validateHtmlBeautifyConfig } from "./html-beautify-validator.js";
5
2
  import { buildProjectAssets } from "./project-assets.js";
6
- import { validateMvuConfig } from "./mvu-validator.js";
7
- export function validateCharacterCardProject(project) {
8
- if (!project.characterCardConfig)
9
- throw new Error("项目尚未保存 character card config");
10
- const validation = validateCharacterCardConfig({ config: project.characterCardConfig, draft: project.draft, mvuEnabled: project.mvuConfig?.enabled });
11
- if (!validation.valid)
12
- return validation;
13
- const mvuValidation = project.mvuConfig?.enabled ? validateMvuConfig({ mvu: project.mvuConfig, characterCardConfig: project.characterCardConfig }) : undefined;
14
- if (mvuValidation && !mvuValidation.valid)
15
- return mvuValidation;
16
- const htmlValidation = project.htmlBeautifyConfig?.enabled ? validateHtmlBeautifyConfig({ html: project.htmlBeautifyConfig, mvu: project.mvuConfig, characterCardConfig: project.characterCardConfig }) : undefined;
17
- if (htmlValidation && !htmlValidation.valid)
18
- return htmlValidation;
19
- const ejsValidation = project.ejsConfig?.enabled ? validateEjsConfig({ ejs: project.ejsConfig, mvu: project.mvuConfig }) : undefined;
20
- if (ejsValidation && !ejsValidation.valid)
21
- return ejsValidation;
22
- return validation;
23
- }
24
3
  export function buildCharacterCardJsonFromProject(project, extraRegexScripts = []) {
25
4
  if (!project.characterCardConfig)
26
5
  throw new Error("项目尚未保存 character card config");
27
- const validation = validateCharacterCardProject(project);
28
- if (!validation.valid)
29
- return { card: undefined, validation };
30
6
  const assets = buildProjectAssets(project, "all", extraRegexScripts);
31
7
  return {
32
- validation,
33
8
  card: buildCharacterCardJson({
34
9
  config: project.characterCardConfig,
35
10
  worldbookEntries: project.draft,
@@ -1 +1 @@
1
- {"version":3,"file":"character-card-project-builder.js","sourceRoot":"","sources":["../../src/core/character-card-project-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"character-card-project-builder.js","sourceRoot":"","sources":["../../src/core/character-card-project-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAA0B,MAAM,6BAA6B,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,UAAU,iCAAiC,CAAC,OAAgB,EAAE,oBAAkE,EAAE;IACtI,IAAI,CAAC,OAAO,CAAC,mBAAmB;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;IACrE,OAAO;QACL,IAAI,EAAE,sBAAsB,CAAC;YAC3B,MAAM,EAAE,OAAO,CAAC,mBAAmB;YACnC,gBAAgB,EAAE,OAAO,CAAC,KAAK;YAC/B,aAAa,EAAE,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI;YACzE,oFAAoF;YACpF,qEAAqE;YACrE,SAAS,EAAE,EAAE,gBAAgB,EAAE,MAAM,CAAC,iBAAiB,EAAE,YAAY,EAAE,MAAM,CAAC,aAAa,EAAE,mBAAmB,EAAE,MAAM,CAAC,qBAAqB,EAAE;YAChJ,UAAU,EAAE,MAAM,CAAC,WAAW;SAC/B,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -1,17 +1,16 @@
1
1
  import type { CharacterCardConfig } from "../schemas/character-card.js";
2
2
  import type { WorldbookDraftEntry } from "../schemas/worldbook-draft.js";
3
- import { type ValidationIssue } from "./worldbook-validator.js";
4
- export interface CharacterCardValidationResult {
3
+ import { type ValidationSection } from "./validation-types.js";
4
+ export type CharacterCardValidationResult = ValidationSection<{
5
+ worldbook_entry_count: number;
6
+ greeting_count: number;
7
+ description_empty: boolean;
8
+ }> & {
5
9
  valid: boolean;
6
- errors: ValidationIssue[];
7
- warnings: ValidationIssue[];
8
- summary: {
9
- worldbook_entry_count: number;
10
- greeting_count: number;
11
- };
12
- }
10
+ };
13
11
  export declare function validateCharacterCardConfig(input: {
14
12
  config: CharacterCardConfig;
15
13
  draft?: WorldbookDraftEntry[];
16
14
  mvuEnabled?: boolean;
15
+ htmlStatusbarEnabled?: boolean;
17
16
  }): CharacterCardValidationResult;
@@ -1,49 +1,36 @@
1
- import { validateGreetings } from "./greeting-validator.js";
1
+ import { validateFirstMessages } from "./first-message-validator.js";
2
2
  import { validateWorldbookDraft } from "./worldbook-validator.js";
3
+ import { issue, normalizeIssue, section, splitIssues, withValid } from "./validation-types.js";
3
4
  export function validateCharacterCardConfig(input) {
4
- const errors = [];
5
- const warnings = [];
5
+ const issues = [];
6
6
  const { config, draft } = input;
7
- if (!config.card.name.trim()) {
8
- errors.push({ field: "card.name", severity: "error", message: "角色卡 name 必填" });
9
- }
10
- if (!config.card.first_mes.trim()) {
11
- errors.push({ field: "card.first_mes", severity: "error", message: "角色卡 first_mes 必填" });
12
- }
7
+ if (!config.card.name.trim())
8
+ issues.push(issue({ code: "character_card.name.empty", field: "card.name", severity: "error", message: "角色卡 name 必填" }));
9
+ if (!config.card.first_mes.trim())
10
+ issues.push(issue({ code: "character_card.first_mes.empty", field: "card.first_mes", severity: "error", message: "角色卡 first_mes 必填" }));
13
11
  if (config.card.description.trim()) {
14
- warnings.push({ field: "card.description", severity: "warning", message: "当前规范建议 description 为空,角色信息放入世界书条目" });
15
- }
16
- if (looksLikeLongSetting(config.card.personality)) {
17
- warnings.push({ field: "card.personality", severity: "warning", message: "personality 中疑似包含大段人设,当前规范建议移入 character_personality 世界书条目" });
12
+ const severity = (!draft || draft.length === 0) && looksLikeLongSetting(config.card.description) ? "error" : "warning";
13
+ issues.push(issue({ code: "character_card.description.not_empty", field: "card.description", severity, message: severity === "error" ? "description 内含大段人设且项目 draft 为空,违背新主线;请迁移到世界书条目" : "当前规范建议 description 为空,角色信息放入世界书条目" }));
18
14
  }
19
- if (looksLikeLongSetting(config.card.scenario)) {
20
- warnings.push({ field: "card.scenario", severity: "warning", message: "scenario 中疑似包含大段场景或背景设定,当前规范建议移入世界书条目" });
21
- }
22
- const greetingValidation = validateGreetings({ config, mvu_enabled: input.mvuEnabled });
23
- errors.push(...greetingValidation.errors);
24
- warnings.push(...greetingValidation.warnings);
15
+ if (looksLikeLongSetting(config.card.personality))
16
+ issues.push(issue({ code: "character_card.personality.long_setting", field: "card.personality", severity: "warning", message: "personality 中疑似包含大段人设,当前规范建议移入 character_personality 世界书条目" }));
17
+ if (looksLikeLongSetting(config.card.scenario))
18
+ issues.push(issue({ code: "character_card.scenario.long_setting", field: "card.scenario", severity: "warning", message: "scenario 中疑似包含大段场景或背景设定,当前规范建议移入世界书条目" }));
19
+ const firstMessage = validateFirstMessages({ config, mvu_enabled: input.mvuEnabled, html_statusbar_enabled: input.htmlStatusbarEnabled });
20
+ issues.push(...firstMessage.errors, ...firstMessage.warnings, ...firstMessage.infos);
25
21
  if (config.worldbook.source === "project_draft") {
26
- if (!draft) {
27
- errors.push({ field: "worldbook.source", severity: "error", message: "worldbook.source=project_draft 时项目必须有 draft" });
28
- }
22
+ if (!draft)
23
+ issues.push(issue({ code: "character_card.worldbook.missing_draft", field: "worldbook.source", severity: "error", message: "worldbook.source=project_draft 时项目必须有 draft" }));
29
24
  else {
30
25
  const worldbookValidation = validateWorldbookDraft(draft);
31
- errors.push(...worldbookValidation.errors.map((issue) => ({ ...issue, field: `worldbook.${issue.field ?? "unknown"}` })));
32
- warnings.push(...worldbookValidation.warnings.map((issue) => ({ ...issue, field: `worldbook.${issue.field ?? "unknown"}` })));
26
+ issues.push(...worldbookValidation.errors.map((item) => normalizeIssue({ ...item, field: `worldbook.${item.field ?? "unknown"}` })));
27
+ issues.push(...worldbookValidation.warnings.map((item) => normalizeIssue({ ...item, field: `worldbook.${item.field ?? "unknown"}` })));
33
28
  }
34
29
  }
35
30
  else {
36
- warnings.push({ field: "worldbook.source", severity: "warning", message: "未嵌入世界书,角色信息可能不足" });
31
+ issues.push(issue({ code: "character_card.worldbook.not_embedded", field: "worldbook.source", severity: "warning", message: "未嵌入世界书,角色信息可能不足" }));
37
32
  }
38
- return {
39
- valid: errors.length === 0,
40
- errors,
41
- warnings,
42
- summary: {
43
- worldbook_entry_count: config.worldbook.source === "project_draft" ? draft?.length ?? 0 : 0,
44
- greeting_count: 1 + config.card.alternate_greetings.length,
45
- },
46
- };
33
+ return withValid(section({ ...splitIssues(issues), summary: { worldbook_entry_count: config.worldbook.source === "project_draft" ? draft?.length ?? 0 : 0, greeting_count: 1 + config.card.alternate_greetings.length, description_empty: !config.card.description.trim() } }));
47
34
  }
48
35
  function looksLikeLongSetting(value) {
49
36
  const trimmed = value.trim();
@@ -1 +1 @@
1
- {"version":3,"file":"character-card-validator.js","sourceRoot":"","sources":["../../src/core/character-card-validator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"character-card-validator.js","sourceRoot":"","sources":["../../src/core/character-card-validator.ts"],"names":[],"mappings":"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"}
@@ -83,6 +83,18 @@ export function lintContent(content) {
83
83
  if (/内心|心中|仿佛在|像是在|看起来像/.test(content)) {
84
84
  issues.push({ type: "authorial_explanation", category: "authorial_explanation", severity: "warning", message: "疑似作者视角解释心理或动作意义", suggestion: "保留可观察动作,删除解释" });
85
85
  }
86
+ if (/精致|白皙|好看|漂亮|美丽|英俊|帅气|完美/.test(content)) {
87
+ issues.push({ type: "generic_beauty", category: "appearance", severity: "warning", message: "外貌描写疑似使用万能美人词", suggestion: "只写可辨认特征,如发型、衣料磨损、姿态习惯、标志物" });
88
+ }
89
+ if (/温柔善良|感情深厚|关系很好|性格复杂|很有魅力|十分神秘/.test(content)) {
90
+ issues.push({ type: "abstract_label", category: "specificity", severity: "warning", message: "发现抽象性格/关系标签", suggestion: "改写为具体事件、行为边界或互动证据" });
91
+ }
92
+ if (/某(?:城市|组织|学校|地点|人物|家族)|待定|TODO|TBD|占位/.test(content)) {
93
+ issues.push({ type: "placeholder_term", category: "specificity", severity: "error", message: "发现占位词或未完成设定", suggestion: "补成具体名称;如果未知,应记录为 pending decision 而非写入成品条目" });
94
+ }
95
+ if (/角色卡|世界书|AI|模型|玩家正在使用|提示词|prompt/i.test(content)) {
96
+ issues.push({ type: "fourth_wall", category: "meta", severity: "warning", message: "疑似出现第四面墙或工具层术语", suggestion: "条目应只写角色可用的世界内信息" });
97
+ }
86
98
  return { ok: issues.every((issue) => issue.severity !== "error"), issues };
87
99
  }
88
100
  function pushTermIssues(issues, content, term, type, severity, suggestion, category) {
@@ -1 +1 @@
1
- {"version":3,"file":"content-lint.js","sourceRoot":"","sources":["../../src/core/content-lint.ts"],"names":[],"mappings":"AAiBA,MAAM,eAAe,GAAG;IACtB,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,IAAI;IACJ,MAAM;IACN,MAAM;IACN,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,MAAM;IACN,IAAI;IACJ,IAAI;IACJ,IAAI;CACL,CAAC;AAEF,8CAA8C;AAC9C,mDAAmD;AACnD,MAAM,oBAAoB,GAAG;IAC3B,IAAI;IACJ,GAAG;IACH,GAAG;CACJ,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC3D,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAChE,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AACtD,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACtG,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACnE,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAC/D,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAChF,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAEnE,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,MAAM,GAAuB,EAAE,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,CAAC,CAAC;IACrG,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,oBAAoB,EAAE,CAAC;QACxC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;IACxG,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,aAAa;QAAE,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;IAClI,KAAK,MAAM,IAAI,IAAI,gBAAgB;QAAE,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,oBAAoB,EAAE,iBAAiB,CAAC,CAAC;IAClJ,KAAK,MAAM,IAAI,IAAI,cAAc;QAAE,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAC;IACzI,KAAK,MAAM,IAAI,IAAI,sBAAsB;QAAE,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IACpJ,KAAK,MAAM,IAAI,IAAI,gBAAgB;QAAE,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,qBAAqB,EAAE,kBAAkB,CAAC,CAAC;IACrJ,KAAK,MAAM,IAAI,IAAI,qBAAqB;QAAE,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,eAAe,EAAE,iBAAiB,CAAC,CAAC;IAElJ,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,oBAAoB,EAAE,UAAU,CAAC,CAAC;IACtG,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC;IACtG,CAAC;IAED,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,0BAA0B;YAChC,QAAQ,EAAE,kBAAkB;YAC5B,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,0BAA0B;YACnC,UAAU,EAAE,eAAe;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,0BAA0B;YAChC,QAAQ,EAAE,kBAAkB;YAC5B,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,2BAA2B;YACpC,UAAU,EAAE,eAAe;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,IAAI,uCAAuC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,QAAQ,EAAE,uBAAuB,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,sBAAsB,EAAE,CAAC,CAAC;IAC5K,CAAC;IAED,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,QAAQ,EAAE,uBAAuB,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC;IACjK,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,cAAc,CACrB,MAA0B,EAC1B,OAAe,EACf,IAAY,EACZ,IAAY,EACZ,QAAsB,EACtB,UAAkB,EAClB,QAAiB;IAEjB,IAAI,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC;YACV,IAAI;YACJ,QAAQ;YACR,QAAQ;YACR,IAAI;YACJ,KAAK;YACL,OAAO,EAAE,MAAM,IAAI,EAAE;YACrB,UAAU;SACX,CAAC,CAAC;QACH,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"content-lint.js","sourceRoot":"","sources":["../../src/core/content-lint.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { Project } from "../schemas/project.js";
2
- import { type DeliveryStatus, type FinalReviewReport } from "./final-review.js";
3
- export type { DeliveryStatus } from "./final-review.js";
2
+ import { type ProjectValidationReport } from "./validation-types.js";
3
+ export type DeliveryStatus = "ok" | "warning" | "blocking";
4
4
  export interface DeliveryChecklistItem {
5
5
  section: string;
6
6
  status: DeliveryStatus;
@@ -12,11 +12,10 @@ export interface DeliveryChecklistResult {
12
12
  ready_to_export: boolean;
13
13
  blocking_count: number;
14
14
  warning_count: number;
15
- /** 当 warning_count 超过 high_warning_threshold 时给一个明显提示,便于上层 UI/日志单独高亮。 */
16
15
  high_warning: boolean;
17
16
  high_warning_threshold: number;
18
17
  items: DeliveryChecklistItem[];
19
- review: FinalReviewReport;
18
+ review: ProjectValidationReport;
20
19
  }
21
20
  export declare function createDeliveryChecklist(input: {
22
21
  project: Project;