novelws 1.2.0

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 (320) hide show
  1. package/CHANGELOG.md +161 -0
  2. package/LICENSE +22 -0
  3. package/README.md +372 -0
  4. package/dist/cli.d.ts +3 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +50 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/check.d.ts +6 -0
  9. package/dist/commands/check.d.ts.map +1 -0
  10. package/dist/commands/check.js +32 -0
  11. package/dist/commands/check.js.map +1 -0
  12. package/dist/commands/init.d.ts +6 -0
  13. package/dist/commands/init.d.ts.map +1 -0
  14. package/dist/commands/init.js +160 -0
  15. package/dist/commands/init.js.map +1 -0
  16. package/dist/commands/plugin.d.ts +6 -0
  17. package/dist/commands/plugin.d.ts.map +1 -0
  18. package/dist/commands/plugin.js +135 -0
  19. package/dist/commands/plugin.js.map +1 -0
  20. package/dist/commands/upgrade.d.ts +6 -0
  21. package/dist/commands/upgrade.d.ts.map +1 -0
  22. package/dist/commands/upgrade.js +92 -0
  23. package/dist/commands/upgrade.js.map +1 -0
  24. package/dist/core/config.d.ts +72 -0
  25. package/dist/core/config.d.ts.map +1 -0
  26. package/dist/core/config.js +136 -0
  27. package/dist/core/config.js.map +1 -0
  28. package/dist/core/errors.d.ts +59 -0
  29. package/dist/core/errors.d.ts.map +1 -0
  30. package/dist/core/errors.js +125 -0
  31. package/dist/core/errors.js.map +1 -0
  32. package/dist/core/platform.d.ts +27 -0
  33. package/dist/core/platform.d.ts.map +1 -0
  34. package/dist/core/platform.js +75 -0
  35. package/dist/core/platform.js.map +1 -0
  36. package/dist/core/template.d.ts +35 -0
  37. package/dist/core/template.d.ts.map +1 -0
  38. package/dist/core/template.js +94 -0
  39. package/dist/core/template.js.map +1 -0
  40. package/dist/plugins/identifier.d.ts +13 -0
  41. package/dist/plugins/identifier.d.ts.map +1 -0
  42. package/dist/plugins/identifier.js +72 -0
  43. package/dist/plugins/identifier.js.map +1 -0
  44. package/dist/plugins/installers/base.d.ts +27 -0
  45. package/dist/plugins/installers/base.d.ts.map +1 -0
  46. package/dist/plugins/installers/base.js +30 -0
  47. package/dist/plugins/installers/base.js.map +1 -0
  48. package/dist/plugins/installers/github.d.ts +22 -0
  49. package/dist/plugins/installers/github.d.ts.map +1 -0
  50. package/dist/plugins/installers/github.js +133 -0
  51. package/dist/plugins/installers/github.js.map +1 -0
  52. package/dist/plugins/installers/local.d.ts +16 -0
  53. package/dist/plugins/installers/local.d.ts.map +1 -0
  54. package/dist/plugins/installers/local.js +69 -0
  55. package/dist/plugins/installers/local.js.map +1 -0
  56. package/dist/plugins/installers/npm.d.ts +20 -0
  57. package/dist/plugins/installers/npm.d.ts.map +1 -0
  58. package/dist/plugins/installers/npm.js +99 -0
  59. package/dist/plugins/installers/npm.js.map +1 -0
  60. package/dist/plugins/manager.d.ts +77 -0
  61. package/dist/plugins/manager.d.ts.map +1 -0
  62. package/dist/plugins/manager.js +349 -0
  63. package/dist/plugins/manager.js.map +1 -0
  64. package/dist/plugins/registry.d.ts +48 -0
  65. package/dist/plugins/registry.d.ts.map +1 -0
  66. package/dist/plugins/registry.js +111 -0
  67. package/dist/plugins/registry.js.map +1 -0
  68. package/dist/plugins/types.d.ts +66 -0
  69. package/dist/plugins/types.d.ts.map +1 -0
  70. package/dist/plugins/types.js +2 -0
  71. package/dist/plugins/types.js.map +1 -0
  72. package/dist/plugins/validator.d.ts +19 -0
  73. package/dist/plugins/validator.d.ts.map +1 -0
  74. package/dist/plugins/validator.js +164 -0
  75. package/dist/plugins/validator.js.map +1 -0
  76. package/dist/utils/logger.d.ts +13 -0
  77. package/dist/utils/logger.d.ts.map +1 -0
  78. package/dist/utils/logger.js +48 -0
  79. package/dist/utils/logger.js.map +1 -0
  80. package/dist/utils/project.d.ts +24 -0
  81. package/dist/utils/project.d.ts.map +1 -0
  82. package/dist/utils/project.js +61 -0
  83. package/dist/utils/project.js.map +1 -0
  84. package/dist/version.d.ts +3 -0
  85. package/dist/version.d.ts.map +1 -0
  86. package/dist/version.js +21 -0
  87. package/dist/version.js.map +1 -0
  88. package/package.json +76 -0
  89. package/plugins/authentic-voice/README.md +31 -0
  90. package/plugins/authentic-voice/commands/authentic-voice.md +73 -0
  91. package/plugins/authentic-voice/commands/authenticity-audit.md +37 -0
  92. package/plugins/authentic-voice/config.yaml +30 -0
  93. package/plugins/authentic-voice/experts/authentic-editor.md +27 -0
  94. package/plugins/export/README.md +319 -0
  95. package/plugins/export/commands/export.md +460 -0
  96. package/plugins/export/commands/generate-cover.md +256 -0
  97. package/plugins/export/commands/metadata.md +309 -0
  98. package/plugins/export/config.yaml +47 -0
  99. package/plugins/export/experts/publishing-expert.md +171 -0
  100. package/plugins/export/templates/epub/chapter-template.html +13 -0
  101. package/plugins/export/templates/epub/cover-template.html +14 -0
  102. package/plugins/export/templates/epub/stylesheet.css +200 -0
  103. package/plugins/export/templates/pdf/ebook-style.css +137 -0
  104. package/plugins/export/templates/pdf/print-style.css +179 -0
  105. package/plugins/export/templates/platforms/jinjiang-format.md +101 -0
  106. package/plugins/export/templates/platforms/qidian-format.md +108 -0
  107. package/plugins/export/templates/platforms/tomato-format.md +95 -0
  108. package/plugins/translate/README.md +265 -0
  109. package/plugins/translate/commands/glossary.md +731 -0
  110. package/plugins/translate/commands/translate-preview.md +543 -0
  111. package/plugins/translate/commands/translate.md +649 -0
  112. package/plugins/translate/config.yaml +43 -0
  113. package/plugins/translate/experts/literary-translator.md +605 -0
  114. package/templates/commands/analyze.md +1485 -0
  115. package/templates/commands/checklist.md +434 -0
  116. package/templates/commands/clarify.md +257 -0
  117. package/templates/commands/constitution.md +257 -0
  118. package/templates/commands/expert.md +136 -0
  119. package/templates/commands/plan.md +749 -0
  120. package/templates/commands/recap.md +613 -0
  121. package/templates/commands/relations.md +96 -0
  122. package/templates/commands/revise.md +341 -0
  123. package/templates/commands/specify.md +682 -0
  124. package/templates/commands/tasks.md +142 -0
  125. package/templates/commands/timeline.md +73 -0
  126. package/templates/commands/track-init.md +137 -0
  127. package/templates/commands/track.md +463 -0
  128. package/templates/commands/write.md +1264 -0
  129. package/templates/config/keyword-mappings.json +106 -0
  130. package/templates/knowledge/audit-config.json +26 -0
  131. package/templates/knowledge/character-profiles.md +152 -0
  132. package/templates/knowledge/character-voices.md +137 -0
  133. package/templates/knowledge/locations.md +184 -0
  134. package/templates/knowledge/world-setting.md +121 -0
  135. package/templates/knowledge-base/README.md +285 -0
  136. package/templates/knowledge-base/character-archetypes/01-hero.md +233 -0
  137. package/templates/knowledge-base/character-archetypes/02-mentor.md +177 -0
  138. package/templates/knowledge-base/character-archetypes/03-shadow.md +221 -0
  139. package/templates/knowledge-base/character-archetypes/04-ally.md +178 -0
  140. package/templates/knowledge-base/character-archetypes/05-shapeshifter.md +177 -0
  141. package/templates/knowledge-base/character-archetypes/06-trickster.md +181 -0
  142. package/templates/knowledge-base/character-archetypes/07-threshold-guardian.md +177 -0
  143. package/templates/knowledge-base/character-archetypes/08-herald.md +180 -0
  144. package/templates/knowledge-base/character-archetypes/09-father.md +249 -0
  145. package/templates/knowledge-base/character-archetypes/10-mother.md +202 -0
  146. package/templates/knowledge-base/character-archetypes/11-child.md +183 -0
  147. package/templates/knowledge-base/character-archetypes/12-sage.md +202 -0
  148. package/templates/knowledge-base/character-archetypes/README.md +60 -0
  149. package/templates/knowledge-base/character-archetypes/application-guide.md +222 -0
  150. package/templates/knowledge-base/character-archetypes/archetype-combinations.md +242 -0
  151. package/templates/knowledge-base/character-archetypes/config.yaml +28 -0
  152. package/templates/knowledge-base/character-archetypes/examples-analysis.md +223 -0
  153. package/templates/knowledge-base/craft/character-arc.md +1153 -0
  154. package/templates/knowledge-base/craft/dialogue.md +1170 -0
  155. package/templates/knowledge-base/craft/pacing.md +1200 -0
  156. package/templates/knowledge-base/craft/scene-structure.md +1136 -0
  157. package/templates/knowledge-base/craft/show-not-tell.md +1012 -0
  158. package/templates/knowledge-base/emotional-beats/01-first-meeting.md +145 -0
  159. package/templates/knowledge-base/emotional-beats/02-bonding-moment.md +226 -0
  160. package/templates/knowledge-base/emotional-beats/03-declaration.md +284 -0
  161. package/templates/knowledge-base/emotional-beats/04-triumph.md +240 -0
  162. package/templates/knowledge-base/emotional-beats/05-reunion.md +396 -0
  163. package/templates/knowledge-base/emotional-beats/06-forgiveness.md +204 -0
  164. package/templates/knowledge-base/emotional-beats/07-betrayal.md +204 -0
  165. package/templates/knowledge-base/emotional-beats/08-loss.md +214 -0
  166. package/templates/knowledge-base/emotional-beats/09-rejection.md +254 -0
  167. package/templates/knowledge-base/emotional-beats/10-failure.md +244 -0
  168. package/templates/knowledge-base/emotional-beats/11-misunderstanding.md +205 -0
  169. package/templates/knowledge-base/emotional-beats/12-farewell.md +283 -0
  170. package/templates/knowledge-base/emotional-beats/13-revelation.md +242 -0
  171. package/templates/knowledge-base/emotional-beats/14-point-of-no-return.md +215 -0
  172. package/templates/knowledge-base/emotional-beats/15-dark-night.md +244 -0
  173. package/templates/knowledge-base/emotional-beats/16-sacrifice.md +246 -0
  174. package/templates/knowledge-base/emotional-beats/17-awakening.md +246 -0
  175. package/templates/knowledge-base/emotional-beats/18-confrontation.md +217 -0
  176. package/templates/knowledge-base/emotional-beats/19-bittersweet-goodbye.md +368 -0
  177. package/templates/knowledge-base/emotional-beats/20-moral-dilemma.md +248 -0
  178. package/templates/knowledge-base/emotional-beats/21-temptation.md +240 -0
  179. package/templates/knowledge-base/emotional-beats/22-redemption.md +210 -0
  180. package/templates/knowledge-base/emotional-beats/README.md +104 -0
  181. package/templates/knowledge-base/emotional-beats/beat-sequences.md +276 -0
  182. package/templates/knowledge-base/emotional-beats/config.yaml +30 -0
  183. package/templates/knowledge-base/emotional-beats/pacing-guide.md +390 -0
  184. package/templates/knowledge-base/genres/historical.md +1127 -0
  185. package/templates/knowledge-base/genres/mystery.md +1123 -0
  186. package/templates/knowledge-base/genres/revenge.md +846 -0
  187. package/templates/knowledge-base/genres/romance.md +948 -0
  188. package/templates/knowledge-base/genres/sci-fi.md +156 -0
  189. package/templates/knowledge-base/genres/thriller.md +166 -0
  190. package/templates/knowledge-base/genres/wuxia.md +143 -0
  191. package/templates/knowledge-base/references/README.md +96 -0
  192. package/templates/knowledge-base/references/china-1920s/culture.md +423 -0
  193. package/templates/knowledge-base/references/china-1920s/daily-life.md +616 -0
  194. package/templates/knowledge-base/references/china-1920s/overview.md +298 -0
  195. package/templates/knowledge-base/references/china-1920s/society.md +703 -0
  196. package/templates/knowledge-base/references/china-1920s/warlords.md +427 -0
  197. package/templates/knowledge-base/references/cultivation-world/daily-life.md +108 -0
  198. package/templates/knowledge-base/references/cultivation-world/overview.md +64 -0
  199. package/templates/knowledge-base/references/cultivation-world/power-system.md +108 -0
  200. package/templates/knowledge-base/references/cultivation-world/sects.md +104 -0
  201. package/templates/knowledge-base/references/cultivation-world/world-setting.md +108 -0
  202. package/templates/knowledge-base/references/modern-workplace/corporate.md +115 -0
  203. package/templates/knowledge-base/references/modern-workplace/daily-life.md +129 -0
  204. package/templates/knowledge-base/references/modern-workplace/overview.md +73 -0
  205. package/templates/knowledge-base/references/modern-workplace/relationships.md +107 -0
  206. package/templates/knowledge-base/references/modern-workplace/tech-industry.md +131 -0
  207. package/templates/knowledge-base/references/tang-dynasty/culture.md +135 -0
  208. package/templates/knowledge-base/references/tang-dynasty/daily-life.md +139 -0
  209. package/templates/knowledge-base/references/tang-dynasty/overview.md +76 -0
  210. package/templates/knowledge-base/references/tang-dynasty/politics.md +121 -0
  211. package/templates/knowledge-base/references/tang-dynasty/society.md +126 -0
  212. package/templates/knowledge-base/requirements/README.md +240 -0
  213. package/templates/knowledge-base/requirements/anti-ai-v3.md +46 -0
  214. package/templates/knowledge-base/requirements/anti-ai-v4.md +430 -0
  215. package/templates/knowledge-base/requirements/fast-paced.md +552 -0
  216. package/templates/knowledge-base/requirements/no-poison.md +60 -0
  217. package/templates/knowledge-base/requirements/romance-angst.md +102 -0
  218. package/templates/knowledge-base/requirements/romance-sweet.md +63 -0
  219. package/templates/knowledge-base/requirements/serious-literature.md +45 -0
  220. package/templates/knowledge-base/requirements/strong-emotion.md +60 -0
  221. package/templates/knowledge-base/styles/README.md +302 -0
  222. package/templates/knowledge-base/styles/ancient-style.md +579 -0
  223. package/templates/knowledge-base/styles/literary.md +439 -0
  224. package/templates/knowledge-base/styles/minimal.md +472 -0
  225. package/templates/knowledge-base/styles/natural-voice.md +930 -0
  226. package/templates/knowledge-base/styles/web-novel.md +525 -0
  227. package/templates/memory/constitution.md +140 -0
  228. package/templates/memory/personal-voice.md +113 -0
  229. package/templates/scripts/README.md +187 -0
  230. package/templates/scripts/bash/analyze-story.sh +170 -0
  231. package/templates/scripts/bash/check-consistency.sh +463 -0
  232. package/templates/scripts/bash/check-plot.sh +374 -0
  233. package/templates/scripts/bash/check-timeline.sh +346 -0
  234. package/templates/scripts/bash/check-world.sh +395 -0
  235. package/templates/scripts/bash/check-writing-state.sh +854 -0
  236. package/templates/scripts/bash/clarify-story.sh +117 -0
  237. package/templates/scripts/bash/common.sh +151 -0
  238. package/templates/scripts/bash/constitution.sh +114 -0
  239. package/templates/scripts/bash/generate-tasks.sh +65 -0
  240. package/templates/scripts/bash/init-tracking.sh +183 -0
  241. package/templates/scripts/bash/manage-relations.sh +174 -0
  242. package/templates/scripts/bash/plan-story.sh +100 -0
  243. package/templates/scripts/bash/specify-story.sh +93 -0
  244. package/templates/scripts/bash/tasks-story.sh +96 -0
  245. package/templates/scripts/bash/test-word-count.sh +182 -0
  246. package/templates/scripts/bash/tests/bench-preload-cache.sh +100 -0
  247. package/templates/scripts/bash/tests/run-all-benchmarks.sh +16 -0
  248. package/templates/scripts/bash/tests/test-cache-semantics.sh +199 -0
  249. package/templates/scripts/bash/tests/test-cross-platform.sh +35 -0
  250. package/templates/scripts/bash/tests/test-edge-cases-bash.sh +60 -0
  251. package/templates/scripts/bash/tests/test-phase1-bash.sh +28 -0
  252. package/templates/scripts/bash/tests/test-preload-cache.sh +123 -0
  253. package/templates/scripts/bash/tests/test-regex-precompile.sh +89 -0
  254. package/templates/scripts/bash/tests/test-regression-bash.sh +42 -0
  255. package/templates/scripts/bash/tests/test-task6-verification.sh +200 -0
  256. package/templates/scripts/bash/text-audit.sh +144 -0
  257. package/templates/scripts/bash/track-progress.sh +194 -0
  258. package/templates/scripts/powershell/analyze-story.ps1 +171 -0
  259. package/templates/scripts/powershell/check-analyze-stage.ps1 +110 -0
  260. package/templates/scripts/powershell/check-consistency.ps1 +138 -0
  261. package/templates/scripts/powershell/check-plot.ps1 +139 -0
  262. package/templates/scripts/powershell/check-timeline.ps1 +112 -0
  263. package/templates/scripts/powershell/check-writing-state.ps1 +490 -0
  264. package/templates/scripts/powershell/check-writing-state.ps1.backup +135 -0
  265. package/templates/scripts/powershell/clarify-story.ps1 +107 -0
  266. package/templates/scripts/powershell/common.ps1 +36 -0
  267. package/templates/scripts/powershell/constitution.ps1 +142 -0
  268. package/templates/scripts/powershell/generate-tasks.ps1 +75 -0
  269. package/templates/scripts/powershell/init-tracking.ps1 +98 -0
  270. package/templates/scripts/powershell/manage-relations.ps1 +134 -0
  271. package/templates/scripts/powershell/plan-story.ps1 +96 -0
  272. package/templates/scripts/powershell/specify-story.ps1 +82 -0
  273. package/templates/scripts/powershell/tests/bench-ps-cache.ps1 +80 -0
  274. package/templates/scripts/powershell/tests/test-cross-platform.ps1 +27 -0
  275. package/templates/scripts/powershell/tests/test-edge-cases-ps.ps1 +29 -0
  276. package/templates/scripts/powershell/tests/test-phase1-ps.ps1 +28 -0
  277. package/templates/scripts/powershell/tests/test-ps-cache.ps1 +73 -0
  278. package/templates/scripts/powershell/tests/test-regression-ps.ps1 +40 -0
  279. package/templates/scripts/powershell/text-audit.ps1 +100 -0
  280. package/templates/scripts/powershell/track-progress.ps1 +105 -0
  281. package/templates/skills/genre-knowledge/fantasy/SKILL.md +355 -0
  282. package/templates/skills/genre-knowledge/mystery/SKILL.md +337 -0
  283. package/templates/skills/genre-knowledge/romance/SKILL.md +228 -0
  284. package/templates/skills/genre-knowledge/sci-fi/SKILL.md +65 -0
  285. package/templates/skills/genre-knowledge/thriller/SKILL.md +95 -0
  286. package/templates/skills/quality-assurance/consistency-checker/SKILL.md +341 -0
  287. package/templates/skills/quality-assurance/continuity-tracker/SKILL.md +157 -0
  288. package/templates/skills/quality-assurance/forgotten-elements/SKILL.md +147 -0
  289. package/templates/skills/quality-assurance/getting-started/SKILL.md +224 -0
  290. package/templates/skills/quality-assurance/pacing-monitor/SKILL.md +143 -0
  291. package/templates/skills/quality-assurance/pov-validator/SKILL.md +135 -0
  292. package/templates/skills/quality-assurance/pre-write-checklist/SKILL.md +583 -0
  293. package/templates/skills/quality-assurance/requirement-detector/CONFLICT_RESOLUTION.md +119 -0
  294. package/templates/skills/quality-assurance/requirement-detector/EXAMPLES.md +146 -0
  295. package/templates/skills/quality-assurance/requirement-detector/KEYWORDS.md +160 -0
  296. package/templates/skills/quality-assurance/requirement-detector/SKILL.md +149 -0
  297. package/templates/skills/quality-assurance/setting-detector/SKILL.md +611 -0
  298. package/templates/skills/quality-assurance/style-detector/CONFLICT_RESOLUTION.md +126 -0
  299. package/templates/skills/quality-assurance/style-detector/EXAMPLES.md +206 -0
  300. package/templates/skills/quality-assurance/style-detector/KEYWORDS.md +207 -0
  301. package/templates/skills/quality-assurance/style-detector/SKILL.md +126 -0
  302. package/templates/skills/quality-assurance/workflow-guide/SKILL.md +381 -0
  303. package/templates/skills/writing-techniques/character-arc/SKILL.md +267 -0
  304. package/templates/skills/writing-techniques/dialogue-techniques/SKILL.md +366 -0
  305. package/templates/skills/writing-techniques/multi-thread-narrative/SKILL.md +553 -0
  306. package/templates/skills/writing-techniques/multi-thread-narrative/experts/thread-analyst.md +226 -0
  307. package/templates/skills/writing-techniques/pacing-control/SKILL.md +377 -0
  308. package/templates/skills/writing-techniques/reader-expectation/SKILL.md +578 -0
  309. package/templates/skills/writing-techniques/reader-expectation/experts/expectation-analyst.md +209 -0
  310. package/templates/skills/writing-techniques/revision-polish/SKILL.md +496 -0
  311. package/templates/skills/writing-techniques/revision-polish/experts/revision-editor.md +221 -0
  312. package/templates/skills/writing-techniques/scene-structure/SKILL.md +361 -0
  313. package/templates/skills/writing-techniques/style-learning/SKILL.md +436 -0
  314. package/templates/specification-example.md +146 -0
  315. package/templates/tracking/character-state.json +78 -0
  316. package/templates/tracking/plot-tracker.json +62 -0
  317. package/templates/tracking/relationships.json +70 -0
  318. package/templates/tracking/timeline.json +49 -0
  319. package/templates/tracking/tracking-log.md +110 -0
  320. package/templates/tracking/validation-rules.json +128 -0
@@ -0,0 +1,395 @@
1
+ #!/usr/bin/env bash
2
+ # 世界观一致性检查脚本
3
+
4
+ set -e
5
+
6
+ # 加载通用函数
7
+ SCRIPT_DIR=$(dirname "$0")
8
+ source "$SCRIPT_DIR/common.sh"
9
+
10
+ # 获取当前故事目录
11
+ STORY_DIR=$(get_current_story)
12
+
13
+ if [ -z "$STORY_DIR" ]; then
14
+ echo "错误: 未找到故事项目" >&2
15
+ exit 1
16
+ fi
17
+
18
+ # 检查模式
19
+ CHECKLIST_MODE=false
20
+ if [ "$1" = "--checklist" ]; then
21
+ CHECKLIST_MODE=true
22
+ fi
23
+
24
+ # 文件路径
25
+ WORLD_SETTING="$STORY_DIR/spec/knowledge/world-setting.md"
26
+ LOCATIONS="$STORY_DIR/spec/knowledge/locations.md"
27
+ CULTURE="$STORY_DIR/spec/knowledge/culture.md"
28
+ RULES="$STORY_DIR/spec/knowledge/rules.md"
29
+ CONTENT_DIR="$STORY_DIR/content"
30
+
31
+ # ANSI颜色代码
32
+ RED='\033[0;31m'
33
+ GREEN='\033[0;32m'
34
+ YELLOW='\033[1;33m'
35
+ BLUE='\033[0;34m'
36
+ NC='\033[0m' # No Color
37
+
38
+ # 统计变量
39
+ TOTAL_CHECKS=0
40
+ PASSED_CHECKS=0
41
+ WARNINGS=0
42
+ ERRORS=0
43
+ ISSUES=()
44
+
45
+ # 检查函数
46
+ check() {
47
+ local name="$1"
48
+ local condition="$2"
49
+ local error_msg="$3"
50
+
51
+ ((TOTAL_CHECKS++))
52
+
53
+ if eval "$condition"; then
54
+ if [ "$CHECKLIST_MODE" = false ]; then
55
+ echo -e "${GREEN}✓${NC} $name"
56
+ fi
57
+ ((PASSED_CHECKS++))
58
+ else
59
+ if [ "$CHECKLIST_MODE" = false ]; then
60
+ echo -e "${RED}✗${NC} $name: $error_msg"
61
+ fi
62
+ ((ERRORS++))
63
+ ISSUES+=("$name|$error_msg")
64
+ fi
65
+ }
66
+
67
+ warn() {
68
+ local msg="$1"
69
+ if [ "$CHECKLIST_MODE" = false ]; then
70
+ echo -e "${YELLOW}⚠${NC} 警告: $msg"
71
+ fi
72
+ ((WARNINGS++))
73
+ ISSUES+=("警告|$msg")
74
+ }
75
+
76
+ # 检查设定文件完整性
77
+ check_setting_files() {
78
+ if [ "$CHECKLIST_MODE" = false ]; then
79
+ echo "📁 检查设定文件完整性"
80
+ echo "─────────────────────"
81
+ fi
82
+
83
+ check "world-setting.md" "[ -f '$WORLD_SETTING' ]" "核心世界观文件不存在"
84
+ check "locations.md" "[ -f '$LOCATIONS' ]" "地点描述文件不存在"
85
+ check "culture.md" "[ -f '$CULTURE' ]" "文化风俗文件不存在"
86
+ check "rules.md" "[ -f '$RULES' ]" "特殊规则文件不存在"
87
+
88
+ if [ "$CHECKLIST_MODE" = false ]; then
89
+ echo ""
90
+ fi
91
+ }
92
+
93
+ # 检查术语一致性
94
+ check_terminology() {
95
+ if [ "$CHECKLIST_MODE" = false ]; then
96
+ echo "📝 检查术语一致性"
97
+ echo "────────────────"
98
+ fi
99
+
100
+ if [ -d "$CONTENT_DIR" ]; then
101
+ # 提取世界观文档中的专有名词(简化版,实际应该更复杂)
102
+ local term_count=0
103
+
104
+ if [ -f "$WORLD_SETTING" ]; then
105
+ # 统计专有名词(这里简化为统计加粗或特殊标记的词)
106
+ term_count=$(grep -o '\*\*[^*]*\*\*' "$WORLD_SETTING" 2>/dev/null | wc -l || echo 0)
107
+ fi
108
+
109
+ check "专有名词定义" "[ $term_count -gt 0 ]" "未找到专有名词定义"
110
+
111
+ if [ "$CHECKLIST_MODE" = false ]; then
112
+ echo " 📊 专有名词数量: $term_count"
113
+ fi
114
+ else
115
+ warn "内容目录不存在,跳过术语检查"
116
+ fi
117
+
118
+ if [ "$CHECKLIST_MODE" = false ]; then
119
+ echo ""
120
+ fi
121
+ }
122
+
123
+ # 检查地理逻辑
124
+ check_geography() {
125
+ if [ "$CHECKLIST_MODE" = false ]; then
126
+ echo "🗺️ 检查地理逻辑"
127
+ echo "───────────────"
128
+ fi
129
+
130
+ if [ -f "$LOCATIONS" ]; then
131
+ # 统计定义的地点数
132
+ local location_count=$(grep -c '^##' "$LOCATIONS" 2>/dev/null || echo 0)
133
+
134
+ check "地点定义完整性" "[ $location_count -gt 0 ]" "未定义任何地点"
135
+
136
+ if [ "$CHECKLIST_MODE" = false ]; then
137
+ echo " 📊 已定义地点: ${location_count}个"
138
+ fi
139
+
140
+ # 检查内容中提到的地点是否在定义中
141
+ if [ -d "$CONTENT_DIR" ]; then
142
+ # 这里简化处理,实际应该用更复杂的匹配逻辑
143
+ local undefined_locations=0
144
+
145
+ # TODO: 实现更智能的地点匹配逻辑
146
+ # 目前只做基本的文件检查
147
+
148
+ check "地点引用检查" "[ $undefined_locations -eq 0 ]" "发现未定义的地点引用"
149
+ fi
150
+ else
151
+ warn "地点描述文件不存在"
152
+ fi
153
+
154
+ if [ "$CHECKLIST_MODE" = false ]; then
155
+ echo ""
156
+ fi
157
+ }
158
+
159
+ # 检查文化一致性
160
+ check_culture() {
161
+ if [ "$CHECKLIST_MODE" = false ]; then
162
+ echo "🎭 检查文化一致性"
163
+ echo "────────────────"
164
+ fi
165
+
166
+ if [ -f "$CULTURE" ]; then
167
+ # 统计文化要素
168
+ local culture_count=$(grep -c '^##' "$CULTURE" 2>/dev/null || echo 0)
169
+
170
+ check "文化要素定义" "[ $culture_count -gt 0 ]" "未定义文化要素"
171
+
172
+ if [ "$CHECKLIST_MODE" = false ]; then
173
+ echo " 📊 文化要素: ${culture_count}个"
174
+ fi
175
+ else
176
+ warn "文化风俗文件不存在"
177
+ fi
178
+
179
+ if [ "$CHECKLIST_MODE" = false ]; then
180
+ echo ""
181
+ fi
182
+ }
183
+
184
+ # 检查规则一致性
185
+ check_rules() {
186
+ if [ "$CHECKLIST_MODE" = false ]; then
187
+ echo "⚖️ 检查规则一致性"
188
+ echo "───────────────"
189
+ fi
190
+
191
+ if [ -f "$RULES" ]; then
192
+ # 统计特殊规则
193
+ local rule_count=$(grep -c '^##' "$RULES" 2>/dev/null || echo 0)
194
+
195
+ check "特殊规则定义" "[ $rule_count -gt 0 ]" "未定义特殊规则"
196
+
197
+ if [ "$CHECKLIST_MODE" = false ]; then
198
+ echo " 📊 特殊规则: ${rule_count}条"
199
+ fi
200
+ else
201
+ warn "特殊规则文件不存在"
202
+ fi
203
+
204
+ if [ "$CHECKLIST_MODE" = false ]; then
205
+ echo ""
206
+ fi
207
+ }
208
+
209
+ # 生成普通报告
210
+ generate_report() {
211
+ echo "═══════════════════════════════════════"
212
+ echo "🌍 世界观一致性检查报告"
213
+ echo "═══════════════════════════════════════"
214
+ echo ""
215
+
216
+ check_setting_files
217
+ check_terminology
218
+ check_geography
219
+ check_culture
220
+ check_rules
221
+
222
+ echo "═══════════════════════════════════════"
223
+ echo "📈 检查结果汇总"
224
+ echo "───────────────────"
225
+ echo " 总检查项: ${TOTAL_CHECKS}"
226
+ echo -e " ${GREEN}通过: ${PASSED_CHECKS}${NC}"
227
+ echo -e " ${YELLOW}警告: ${WARNINGS}${NC}"
228
+ echo -e " ${RED}错误: ${ERRORS}${NC}"
229
+
230
+ if [ "$ERRORS" -eq 0 ] && [ "$WARNINGS" -eq 0 ]; then
231
+ echo ""
232
+ echo -e "${GREEN}✅ 完美!所有检查项全部通过${NC}"
233
+ elif [ "$ERRORS" -eq 0 ]; then
234
+ echo ""
235
+ echo -e "${YELLOW}⚠️ 存在${WARNINGS}个警告,建议关注${NC}"
236
+ else
237
+ echo ""
238
+ echo -e "${RED}❌ 发现${ERRORS}个错误,需要修正${NC}"
239
+ fi
240
+
241
+ echo "═══════════════════════════════════════"
242
+ echo ""
243
+ echo "检查时间: $(date '+%Y-%m-%d %H:%M:%S')"
244
+ echo ""
245
+ echo "💡 建议:"
246
+ echo " - 定期更新世界观设定文档"
247
+ echo " - 创建术语表以保持一致性"
248
+ echo " - 记录地点间的距离和方位关系"
249
+ }
250
+
251
+ # 生成 checklist 格式输出
252
+ output_checklist() {
253
+ # 重新执行检查逻辑收集数据
254
+ TOTAL_CHECKS=0
255
+ PASSED_CHECKS=0
256
+ ERRORS=0
257
+ WARNINGS=0
258
+ ISSUES=()
259
+
260
+ check_setting_files
261
+ check_terminology
262
+ check_geography
263
+ check_culture
264
+ check_rules
265
+
266
+ # 输出 checklist 格式
267
+ cat <<EOF
268
+ # 世界观一致性检查 Checklist
269
+
270
+ **检查时间**: $(date '+%Y-%m-%d %H:%M:%S')
271
+ **检查对象**: spec/knowledge/ 目录及已写章节内容
272
+ **检查范围**: 世界观设定、地理逻辑、文化风俗、特殊规则
273
+
274
+ ---
275
+
276
+ ## 设定文件完整性
277
+
278
+ - [$([ -f "$WORLD_SETTING" ] && echo "x" || echo " ")] CHK001 world-setting.md 存在
279
+ - [$([ -f "$LOCATIONS" ] && echo "x" || echo " ")] CHK002 locations.md 存在
280
+ - [$([ -f "$CULTURE" ] && echo "x" || echo " ")] CHK003 culture.md 存在
281
+ - [$([ -f "$RULES" ] && echo "x" || echo " ")] CHK004 rules.md 存在
282
+
283
+ ## 术语一致性
284
+
285
+ - [$([ -d "$CONTENT_DIR" ] && echo "x" || echo " ")] CHK005 专有名词定义完整
286
+ - [ ] CHK006 章节中的术语与设定文档一致(需人工核查)
287
+
288
+ ## 地理逻辑
289
+
290
+ EOF
291
+
292
+ if [ -f "$LOCATIONS" ]; then
293
+ local location_count=$(grep -c '^##' "$LOCATIONS" 2>/dev/null || echo 0)
294
+ echo "- [x] CHK007 地点定义完整(已定义 ${location_count} 个地点)"
295
+ else
296
+ echo "- [ ] CHK007 地点定义完整"
297
+ fi
298
+
299
+ cat <<EOF
300
+ - [ ] CHK008 地点间距离和方位合理(需人工核查)
301
+ - [ ] CHK009 章节中的地理描述与设定一致(需人工核查)
302
+
303
+ ## 文化一致性
304
+
305
+ EOF
306
+
307
+ if [ -f "$CULTURE" ]; then
308
+ local culture_count=$(grep -c '^##' "$CULTURE" 2>/dev/null || echo 0)
309
+ echo "- [x] CHK010 文化要素定义完整(已定义 ${culture_count} 个要素)"
310
+ else
311
+ echo "- [ ] CHK010 文化要素定义完整"
312
+ fi
313
+
314
+ cat <<EOF
315
+ - [ ] CHK011 风俗描述前后一致(需人工核查)
316
+ - [ ] CHK012 语言和称谓使用统一(需人工核查)
317
+
318
+ ## 规则一致性
319
+
320
+ EOF
321
+
322
+ if [ -f "$RULES" ]; then
323
+ local rule_count=$(grep -c '^##' "$RULES" 2>/dev/null || echo 0)
324
+ echo "- [x] CHK013 特殊规则定义完整(已定义 ${rule_count} 条规则)"
325
+ else
326
+ echo "- [ ] CHK013 特殊规则定义完整"
327
+ fi
328
+
329
+ cat <<EOF
330
+ - [ ] CHK014 规则应用前后一致(需人工核查)
331
+ - [ ] CHK015 规则未出现相互矛盾(需人工核查)
332
+
333
+ ---
334
+
335
+ ## 发现的问题
336
+
337
+ EOF
338
+
339
+ if [ ${#ISSUES[@]} -gt 0 ]; then
340
+ for issue in "${ISSUES[@]}"; do
341
+ IFS='|' read -r name msg <<< "$issue"
342
+ echo "### $name"
343
+ echo ""
344
+ echo "**问题**: $msg"
345
+ echo ""
346
+ done
347
+ else
348
+ echo "*未发现问题*"
349
+ fi
350
+
351
+ cat <<EOF
352
+
353
+ ---
354
+
355
+ ## 检查统计
356
+
357
+ - **总检查项**: ${TOTAL_CHECKS}
358
+ - **已通过**: ${PASSED_CHECKS}
359
+ - **需改进**: ${ERRORS}
360
+ - **警告**: ${WARNINGS}
361
+
362
+ ---
363
+
364
+ ## 后续行动
365
+
366
+ - [ ] 补充缺失的设定文档
367
+ - [ ] 创建术语表记录专有名词
368
+ - [ ] 人工核查章节中的世界观描述
369
+ - [ ] 记录地点间的距离和旅行时间
370
+
371
+ ---
372
+
373
+ **检查工具**: check-world.sh
374
+ **版本**: 1.0
375
+ EOF
376
+ }
377
+
378
+ # 主函数
379
+ main() {
380
+ if [ "$CHECKLIST_MODE" = true ]; then
381
+ output_checklist
382
+ else
383
+ generate_report
384
+ fi
385
+
386
+ # 根据结果返回适当的退出码
387
+ if [ "$ERRORS" -gt 0 ]; then
388
+ exit 1
389
+ else
390
+ exit 0
391
+ fi
392
+ }
393
+
394
+ # 执行主函数
395
+ main