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,346 @@
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
+ # 检查是否为 checklist 模式
11
+ CHECKLIST_MODE=false
12
+ COMMAND="${1:-show}"
13
+ if [ "$COMMAND" = "--checklist" ]; then
14
+ CHECKLIST_MODE=true
15
+ COMMAND="check"
16
+ fi
17
+
18
+ # 获取当前故事目录
19
+ STORY_DIR=$(get_current_story)
20
+
21
+ if [ -z "$STORY_DIR" ]; then
22
+ echo "错误: 未找到故事项目" >&2
23
+ exit 1
24
+ fi
25
+
26
+ # 文件路径
27
+ TIMELINE="$STORY_DIR/spec/tracking/timeline.json"
28
+ PROGRESS="$STORY_DIR/progress.json"
29
+
30
+ # 命令参数(已在上面处理 checklist 模式)
31
+ PARAM2="${2:-}"
32
+
33
+ # 初始化时间线文件
34
+ init_timeline() {
35
+ if [ ! -f "$TIMELINE" ]; then
36
+ echo "⚠️ 未找到时间线文件,正在创建..." >&2
37
+ mkdir -p "$STORY_DIR/spec/tracking"
38
+
39
+ if [ -f "$SCRIPT_DIR/../../templates/tracking/timeline.json" ]; then
40
+ cp "$SCRIPT_DIR/../../templates/tracking/timeline.json" "$TIMELINE"
41
+ echo "✅ 时间线文件已创建"
42
+ else
43
+ echo "错误: 无法找到模板文件" >&2
44
+ exit 1
45
+ fi
46
+ fi
47
+ }
48
+
49
+ # 显示时间线
50
+ show_timeline() {
51
+ echo "📅 故事时间线"
52
+ echo "━━━━━━━━━━━━━━━━━━━━"
53
+
54
+ if [ -f "$TIMELINE" ]; then
55
+ # 当前时间
56
+ CURRENT_TIME=$(jq -r '.storyTime.current // "未设定"' "$TIMELINE")
57
+ echo "⏰ 当前时间:$CURRENT_TIME"
58
+ echo ""
59
+
60
+ # 时间跨度计算
61
+ START_TIME=$(jq -r '.storyTime.start // ""' "$TIMELINE")
62
+ if [ -n "$START_TIME" ]; then
63
+ echo "📍 起始时间:$START_TIME"
64
+
65
+ # 计算已经历的事件数
66
+ EVENT_COUNT=$(jq '.events | length' "$TIMELINE")
67
+ echo "📊 记录事件:${EVENT_COUNT}个"
68
+ fi
69
+
70
+ echo ""
71
+ echo "📖 重要事件:"
72
+ echo "───────────────"
73
+
74
+ # 显示最近的事件
75
+ jq -r '.events | sort_by(.chapter) | reverse | .[0:5][] |
76
+ "第" + (.chapter | tostring) + "章 | " + .date + " | " + .event' \
77
+ "$TIMELINE" 2>/dev/null || echo " 暂无事件记录"
78
+
79
+ # 显示并行事件
80
+ PARALLEL_COUNT=$(jq '.parallelEvents.timepoints | length' "$TIMELINE" 2>/dev/null || echo "0")
81
+ if [ "$PARALLEL_COUNT" != "0" ] && [ "$PARALLEL_COUNT" != "null" ]; then
82
+ echo ""
83
+ echo "🔄 并行事件:"
84
+ jq -r '.parallelEvents.timepoints | to_entries[] |
85
+ .key + ": " + (.value | join(", "))' "$TIMELINE" 2>/dev/null || true
86
+ fi
87
+ else
88
+ echo "未找到时间线文件"
89
+ fi
90
+ }
91
+
92
+ # 添加时间节点
93
+ add_event() {
94
+ local chapter="${2:-}"
95
+ local date="${3:-}"
96
+ local event="${4:-}"
97
+
98
+ if [ -z "$chapter" ] || [ -z "$date" ] || [ -z "$event" ]; then
99
+ echo "用法: $0 add <章节号> <时间> <事件描述>" >&2
100
+ echo "示例: $0 add 5 '万历三十年春' '主角抵达京城'" >&2
101
+ exit 1
102
+ fi
103
+
104
+ if [ ! -f "$TIMELINE" ]; then
105
+ init_timeline
106
+ fi
107
+
108
+ # 添加新事件
109
+ TEMP_FILE=$(mktemp)
110
+ jq --arg ch "$chapter" \
111
+ --arg dt "$date" \
112
+ --arg ev "$event" \
113
+ '.events += [{
114
+ chapter: ($ch | tonumber),
115
+ date: $dt,
116
+ event: $ev,
117
+ duration: "",
118
+ participants: []
119
+ }] |
120
+ .events |= sort_by(.chapter) |
121
+ .lastUpdated = now | strftime("%Y-%m-%dT%H:%M:%S")' \
122
+ "$TIMELINE" > "$TEMP_FILE"
123
+
124
+ mv "$TEMP_FILE" "$TIMELINE"
125
+ echo "✅ 事件已添加:第${chapter}章 - $date - $event"
126
+ }
127
+
128
+ # 检查时间连续性
129
+ check_continuity() {
130
+ echo "🔍 检查时间线连续性"
131
+ echo "━━━━━━━━━━━━━━━━━━━━"
132
+
133
+ if [ ! -f "$TIMELINE" ]; then
134
+ echo "错误: 时间线文件不存在" >&2
135
+ exit 1
136
+ fi
137
+
138
+ # 检查事件顺序
139
+ echo "检查章节顺序..."
140
+
141
+ # 获取所有章节号并检查是否递增
142
+ CHAPTERS=$(jq -r '.events | sort_by(.chapter) | .[].chapter' "$TIMELINE")
143
+
144
+ prev_chapter=0
145
+ issues=0
146
+
147
+ for chapter in $CHAPTERS; do
148
+ if [ "$chapter" -le "$prev_chapter" ]; then
149
+ echo "⚠️ 章节顺序异常:第${chapter}章出现在第${prev_chapter}章之后"
150
+ ((issues++))
151
+ fi
152
+ prev_chapter=$chapter
153
+ done
154
+
155
+ # 检查时间跨度
156
+ echo ""
157
+ echo "检查时间跨度..."
158
+
159
+ # 这里可以添加更复杂的时间逻辑检查
160
+ # 比如检查旅行时间是否合理等
161
+
162
+ if [ "$issues" -eq 0 ]; then
163
+ echo ""
164
+ echo "✅ 时间线检查通过,未发现逻辑问题"
165
+ else
166
+ echo ""
167
+ echo "⚠️ 发现${issues}个潜在问题,请检查"
168
+ fi
169
+
170
+ # 记录检查结果
171
+ if [ -f "$TIMELINE" ]; then
172
+ TEMP_FILE=$(mktemp)
173
+ jq --arg date "$(date -Iseconds)" \
174
+ --arg issues "$issues" \
175
+ '.lastChecked = $date |
176
+ .anomalies.lastCheckIssues = ($issues | tonumber)' \
177
+ "$TIMELINE" > "$TEMP_FILE"
178
+ mv "$TEMP_FILE" "$TIMELINE"
179
+ fi
180
+ }
181
+
182
+ # 同步并行事件
183
+ sync_parallel() {
184
+ local timepoint="${2:-}"
185
+ local events="${3:-}"
186
+
187
+ if [ -z "$timepoint" ] || [ -z "$events" ]; then
188
+ echo "用法: $0 sync <时间点> <事件列表>" >&2
189
+ echo "示例: $0 sync '万历三十年春' '战争爆发,使团到达'" >&2
190
+ exit 1
191
+ fi
192
+
193
+ if [ ! -f "$TIMELINE" ]; then
194
+ init_timeline
195
+ fi
196
+
197
+ # 将事件列表转换为JSON数组
198
+ IFS=',' read -ra EVENT_ARRAY <<< "$events"
199
+ JSON_ARRAY=$(printf '"%s",' "${EVENT_ARRAY[@]}" | sed 's/,$//')
200
+ JSON_ARRAY="[${JSON_ARRAY}]"
201
+
202
+ # 更新并行事件
203
+ TEMP_FILE=$(mktemp)
204
+ jq --arg tp "$timepoint" \
205
+ --argjson events "$JSON_ARRAY" \
206
+ '.parallelEvents.timepoints[$tp] = $events |
207
+ .lastUpdated = now | strftime("%Y-%m-%dT%H:%M:%S")' \
208
+ "$TIMELINE" > "$TEMP_FILE"
209
+
210
+ mv "$TEMP_FILE" "$TIMELINE"
211
+ echo "✅ 并行事件已同步:$timepoint"
212
+ }
213
+
214
+ # 生成 checklist 格式输出
215
+ output_checklist() {
216
+ init_timeline
217
+
218
+ local event_count=0
219
+ local parallel_count=0
220
+ local current_time=""
221
+ local start_time=""
222
+ local has_issues=0
223
+
224
+ if [ -f "$TIMELINE" ]; then
225
+ event_count=$(jq '.events | length' "$TIMELINE")
226
+ parallel_count=$(jq '.parallelEvents.timepoints | length' "$TIMELINE" 2>/dev/null || echo "0")
227
+ current_time=$(jq -r '.storyTime.current // ""' "$TIMELINE")
228
+ start_time=$(jq -r '.storyTime.start // ""' "$TIMELINE")
229
+
230
+ # 检查事件顺序问题
231
+ has_issues=$(jq '
232
+ .events |
233
+ sort_by(.chapter) |
234
+ . as $sorted |
235
+ reduce range(1; length) as $i (0;
236
+ if $sorted[$i].chapter <= $sorted[$i-1].chapter then . + 1 else . end
237
+ )' "$TIMELINE")
238
+ fi
239
+
240
+ cat <<EOF
241
+ # 时间线检查 Checklist
242
+
243
+ **检查时间**: $(date '+%Y-%m-%d %H:%M:%S')
244
+ **检查对象**: spec/tracking/timeline.json
245
+ **记录事件数**: $event_count
246
+
247
+ ---
248
+
249
+ ## 文件完整性
250
+
251
+ - [$([ -f "$TIMELINE" ] && echo "x" || echo " ")] CHK001 timeline.json 存在且格式有效
252
+
253
+ ## 时间设定
254
+
255
+ - [$([ -n "$start_time" ] && echo "x" || echo " ")] CHK002 故事起始时间已设定($start_time)
256
+ - [$([ -n "$current_time" ] && echo "x" || echo " ")] CHK003 当前故事时间已更新($current_time)
257
+
258
+ ## 事件记录
259
+
260
+ - [$([ $event_count -gt 0 ] && echo "x" || echo " ")] CHK004 时间事件已记录($event_count 个)
261
+ - [$([ $has_issues -eq 0 ] && echo "x" || echo "!")] CHK005 时间事件按章节有序排列$([ $has_issues -gt 0 ] && echo "(⚠️ 发现 $has_issues 个乱序)" || echo "")
262
+
263
+ ## 并行事件
264
+
265
+ EOF
266
+
267
+ if [ "$parallel_count" -gt 0 ]; then
268
+ echo "- [x] CHK006 并行事件时间点已记录($parallel_count 个)"
269
+ else
270
+ echo "- [ ] CHK006 并行事件时间点已记录(无记录)"
271
+ fi
272
+
273
+ cat <<EOF
274
+
275
+ ---
276
+
277
+ ## 后续行动
278
+
279
+ EOF
280
+
281
+ local has_actions=false
282
+
283
+ if [ $event_count -eq 0 ]; then
284
+ echo "- [ ] 开始记录时间事件"
285
+ has_actions=true
286
+ fi
287
+
288
+ if [ -z "$current_time" ]; then
289
+ echo "- [ ] 设置当前故事时间"
290
+ has_actions=true
291
+ fi
292
+
293
+ if [ $has_issues -gt 0 ]; then
294
+ echo "- [ ] 修复 $has_issues 个事件顺序问题"
295
+ has_actions=true
296
+ fi
297
+
298
+ if [ "$has_actions" = false ]; then
299
+ echo "*时间线记录完整,无需特别行动*"
300
+ fi
301
+
302
+ cat <<EOF
303
+
304
+ ---
305
+
306
+ **检查工具**: check-timeline.sh
307
+ **版本**: 1.1 (支持 checklist 输出)
308
+ EOF
309
+ }
310
+
311
+ # 主函数
312
+ main() {
313
+ if [ "$CHECKLIST_MODE" = true ]; then
314
+ output_checklist
315
+ exit 0
316
+ fi
317
+
318
+ init_timeline
319
+
320
+ case "$COMMAND" in
321
+ show)
322
+ show_timeline
323
+ ;;
324
+ add)
325
+ add_event "$@"
326
+ ;;
327
+ check)
328
+ check_continuity
329
+ ;;
330
+ sync)
331
+ sync_parallel "$@"
332
+ ;;
333
+ *)
334
+ echo "用法: $0 [show|add|check|sync] [参数...]" >&2
335
+ echo "命令:" >&2
336
+ echo " show - 显示时间线" >&2
337
+ echo " add - 添加时间节点" >&2
338
+ echo " check - 检查连续性" >&2
339
+ echo " sync - 同步并行事件" >&2
340
+ exit 1
341
+ ;;
342
+ esac
343
+ }
344
+
345
+ # 执行主函数
346
+ main "$@"