@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.
- package/README.md +102 -41
- package/README_ZH.md +102 -43
- package/dist/core/character-card-project-builder.d.ts +0 -7
- package/dist/core/character-card-project-builder.js +0 -25
- package/dist/core/character-card-project-builder.js.map +1 -1
- package/dist/core/character-card-validator.d.ts +8 -9
- package/dist/core/character-card-validator.js +21 -34
- package/dist/core/character-card-validator.js.map +1 -1
- package/dist/core/content-lint.js +12 -0
- package/dist/core/content-lint.js.map +1 -1
- package/dist/core/delivery-checklist.d.ts +3 -4
- package/dist/core/delivery-checklist.js +26 -65
- package/dist/core/delivery-checklist.js.map +1 -1
- package/dist/core/ejs-analyzer.d.ts +20 -0
- package/dist/core/ejs-analyzer.js +36 -0
- package/dist/core/ejs-analyzer.js.map +1 -0
- package/dist/core/ejs-validator.d.ts +11 -11
- package/dist/core/ejs-validator.js +60 -32
- package/dist/core/ejs-validator.js.map +1 -1
- package/dist/core/final-review.d.ts +3 -17
- package/dist/core/final-review.js +4 -87
- package/dist/core/final-review.js.map +1 -1
- package/dist/core/first-message-validator.d.ts +16 -0
- package/dist/core/first-message-validator.js +69 -0
- package/dist/core/first-message-validator.js.map +1 -0
- package/dist/core/greeting-validator.d.ts +2 -13
- package/dist/core/greeting-validator.js +10 -77
- package/dist/core/greeting-validator.js.map +1 -1
- package/dist/core/html-beautify-validator.d.ts +9 -12
- package/dist/core/html-beautify-validator.js +25 -35
- package/dist/core/html-beautify-validator.js.map +1 -1
- package/dist/core/mvu-path-analyzer.d.ts +25 -0
- package/dist/core/mvu-path-analyzer.js +288 -0
- package/dist/core/mvu-path-analyzer.js.map +1 -0
- package/dist/core/mvu-validator.d.ts +12 -11
- package/dist/core/mvu-validator.js +82 -146
- package/dist/core/mvu-validator.js.map +1 -1
- package/dist/core/project-initializer.js +4 -4
- package/dist/core/project-initializer.js.map +1 -1
- package/dist/core/project-validator.d.ts +8 -0
- package/dist/core/project-validator.js +99 -0
- package/dist/core/project-validator.js.map +1 -0
- package/dist/core/validation-types.d.ts +62 -0
- package/dist/core/validation-types.js +73 -0
- package/dist/core/validation-types.js.map +1 -0
- package/dist/schemas/draft-slice.d.ts +5 -0
- package/dist/schemas/draft-slice.js +2 -1
- package/dist/schemas/draft-slice.js.map +1 -1
- package/dist/storage/draft-store.d.ts +4 -0
- package/dist/storage/draft-store.js +11 -0
- package/dist/storage/draft-store.js.map +1 -1
- package/dist/storage/path-policy.js +2 -2
- package/dist/storage/path-policy.js.map +1 -1
- package/dist/storage/plan-store.js +21 -10
- package/dist/storage/plan-store.js.map +1 -1
- package/dist/storage/workspace-store.js +3 -2
- package/dist/storage/workspace-store.js.map +1 -1
- package/dist/tools/draft-tools.js +5 -9
- package/dist/tools/draft-tools.js.map +1 -1
- package/dist/tools/export-tools.d.ts +10 -0
- package/dist/tools/export-tools.js +29 -60
- package/dist/tools/export-tools.js.map +1 -1
- package/dist/tools/lint-review-tools.js +13 -4
- package/dist/tools/lint-review-tools.js.map +1 -1
- package/dist/tools/mvu-variable-tools.js +5 -3
- package/dist/tools/mvu-variable-tools.js.map +1 -1
- package/dist/tools/project-tools.js +17 -3
- package/dist/tools/project-tools.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,21 +1,62 @@
|
|
|
1
1
|
# world-book-mcp
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
An MCP server for creating, modifying, validating, and exporting SillyTavern World Book JSON and `chara_card_v3` character card JSON.
|
|
4
4
|
|
|
5
|
-
##
|
|
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
|
-
→
|
|
13
|
-
→
|
|
14
|
-
→
|
|
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
|
-
##
|
|
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
|
|
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
|
-
|
|
103
|
+
### Review & Lint Tools
|
|
40
104
|
|
|
41
105
|
| Tool | Purpose |
|
|
42
|
-
|
|
43
|
-
| `
|
|
44
|
-
| `
|
|
45
|
-
| `
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
- `
|
|
59
|
-
|
|
60
|
-
|
|
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`
|
|
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
|
-
→
|
|
13
|
-
→
|
|
14
|
-
→
|
|
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
|
-
|
|
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
|
-
|
|
76
|
+
自动扫描当前目录下的 SillyTavern JSON 文件,将世界书条目、角色卡 profile、greetings、MVU、HTML、EJS 等资产切片到 draft 目录。
|
|
38
77
|
|
|
39
|
-
|
|
78
|
+
### 核心工具
|
|
40
79
|
|
|
41
80
|
| 工具 | 用途 |
|
|
42
|
-
|
|
43
|
-
| `init_project` | 初始化 `.worldbook
|
|
44
|
-
| `update_plan` |
|
|
45
|
-
| `create_draft_slice` |
|
|
46
|
-
| `update_draft_field` |
|
|
47
|
-
| `
|
|
48
|
-
| `
|
|
49
|
-
| `
|
|
50
|
-
| `
|
|
51
|
-
| `
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"AACA,OAAO,EAAE,sBAAsB,EAA0B,MAAM,6BAA6B,CAAC;AAC7F,OAAO,EAAE,
|
|
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
|
|
4
|
-
export
|
|
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
|
-
|
|
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 {
|
|
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
|
|
5
|
-
const warnings = [];
|
|
5
|
+
const issues = [];
|
|
6
6
|
const { config, draft } = input;
|
|
7
|
-
if (!config.card.name.trim())
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
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.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
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
|
-
|
|
32
|
-
|
|
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
|
-
|
|
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":"AAEA,OAAO,EAAE,
|
|
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":"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"}
|
|
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
|
|
3
|
-
export type
|
|
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:
|
|
18
|
+
review: ProjectValidationReport;
|
|
20
19
|
}
|
|
21
20
|
export declare function createDeliveryChecklist(input: {
|
|
22
21
|
project: Project;
|