novelws 4.0.0 → 5.0.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 (357) hide show
  1. package/CHANGELOG.md +100 -623
  2. package/README.md +79 -594
  3. package/dist/cli.js +1 -3
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/init.d.ts.map +1 -1
  6. package/dist/commands/init.js +12 -99
  7. package/dist/commands/init.js.map +1 -1
  8. package/dist/commands/upgrade.d.ts.map +1 -1
  9. package/dist/commands/upgrade.js +17 -108
  10. package/dist/commands/upgrade.js.map +1 -1
  11. package/dist/core/config.d.ts +1 -37
  12. package/dist/core/config.d.ts.map +1 -1
  13. package/dist/core/config.js +6 -45
  14. package/dist/core/config.js.map +1 -1
  15. package/dist/core/errors.d.ts +0 -31
  16. package/dist/core/errors.d.ts.map +1 -1
  17. package/dist/core/errors.js +0 -58
  18. package/dist/core/errors.js.map +1 -1
  19. package/dist/utils/diagnostics.d.ts +2 -16
  20. package/dist/utils/diagnostics.d.ts.map +1 -1
  21. package/dist/utils/diagnostics.js +5 -72
  22. package/dist/utils/diagnostics.js.map +1 -1
  23. package/dist/utils/project.d.ts +1 -1
  24. package/dist/utils/project.d.ts.map +1 -1
  25. package/dist/utils/project.js +3 -3
  26. package/dist/utils/project.js.map +1 -1
  27. package/package.json +1 -2
  28. package/templates/commands/analyze.md +65 -265
  29. package/templates/commands/expand.md +70 -0
  30. package/templates/commands/plan.md +47 -452
  31. package/templates/commands/specify.md +43 -869
  32. package/templates/commands/write.md +49 -643
  33. package/templates/dot-claude/CLAUDE.md +38 -202
  34. package/templates/resources/anti-ai.md +16 -0
  35. package/templates/resources/style-reference.md +19 -0
  36. package/templates/tracking/character-state.json +1 -76
  37. package/templates/tracking/plot-tracker.json +3 -60
  38. package/templates/tracking/relationships.json +1 -68
  39. package/templates/tracking/timeline.json +1 -47
  40. package/dist/commands/plugin.d.ts +0 -6
  41. package/dist/commands/plugin.d.ts.map +0 -1
  42. package/dist/commands/plugin.js +0 -135
  43. package/dist/commands/plugin.js.map +0 -1
  44. package/dist/plugins/identifier.d.ts +0 -13
  45. package/dist/plugins/identifier.d.ts.map +0 -1
  46. package/dist/plugins/identifier.js +0 -72
  47. package/dist/plugins/identifier.js.map +0 -1
  48. package/dist/plugins/installers/base.d.ts +0 -27
  49. package/dist/plugins/installers/base.d.ts.map +0 -1
  50. package/dist/plugins/installers/base.js +0 -30
  51. package/dist/plugins/installers/base.js.map +0 -1
  52. package/dist/plugins/installers/github.d.ts +0 -22
  53. package/dist/plugins/installers/github.d.ts.map +0 -1
  54. package/dist/plugins/installers/github.js +0 -133
  55. package/dist/plugins/installers/github.js.map +0 -1
  56. package/dist/plugins/installers/local.d.ts +0 -16
  57. package/dist/plugins/installers/local.d.ts.map +0 -1
  58. package/dist/plugins/installers/local.js +0 -69
  59. package/dist/plugins/installers/local.js.map +0 -1
  60. package/dist/plugins/installers/npm.d.ts +0 -20
  61. package/dist/plugins/installers/npm.d.ts.map +0 -1
  62. package/dist/plugins/installers/npm.js +0 -99
  63. package/dist/plugins/installers/npm.js.map +0 -1
  64. package/dist/plugins/manager.d.ts +0 -77
  65. package/dist/plugins/manager.d.ts.map +0 -1
  66. package/dist/plugins/manager.js +0 -349
  67. package/dist/plugins/manager.js.map +0 -1
  68. package/dist/plugins/registry.d.ts +0 -48
  69. package/dist/plugins/registry.d.ts.map +0 -1
  70. package/dist/plugins/registry.js +0 -111
  71. package/dist/plugins/registry.js.map +0 -1
  72. package/dist/plugins/types.d.ts +0 -66
  73. package/dist/plugins/types.d.ts.map +0 -1
  74. package/dist/plugins/types.js +0 -2
  75. package/dist/plugins/types.js.map +0 -1
  76. package/dist/plugins/validator.d.ts +0 -19
  77. package/dist/plugins/validator.d.ts.map +0 -1
  78. package/dist/plugins/validator.js +0 -164
  79. package/dist/plugins/validator.js.map +0 -1
  80. package/dist/utils/logger.d.ts +0 -13
  81. package/dist/utils/logger.d.ts.map +0 -1
  82. package/dist/utils/logger.js +0 -48
  83. package/dist/utils/logger.js.map +0 -1
  84. package/plugins/authentic-voice/README.md +0 -31
  85. package/plugins/authentic-voice/commands/authentic-voice.md +0 -73
  86. package/plugins/authentic-voice/commands/authenticity-audit.md +0 -37
  87. package/plugins/authentic-voice/config.yaml +0 -30
  88. package/plugins/authentic-voice/experts/authentic-editor.md +0 -27
  89. package/plugins/export/README.md +0 -319
  90. package/plugins/export/commands/export.md +0 -460
  91. package/plugins/export/commands/generate-cover.md +0 -256
  92. package/plugins/export/commands/metadata.md +0 -309
  93. package/plugins/export/config.yaml +0 -47
  94. package/plugins/export/experts/publishing-expert.md +0 -171
  95. package/plugins/export/templates/epub/chapter-template.html +0 -13
  96. package/plugins/export/templates/epub/cover-template.html +0 -14
  97. package/plugins/export/templates/epub/stylesheet.css +0 -200
  98. package/plugins/export/templates/pdf/ebook-style.css +0 -137
  99. package/plugins/export/templates/pdf/print-style.css +0 -179
  100. package/plugins/export/templates/platforms/jinjiang-format.md +0 -101
  101. package/plugins/export/templates/platforms/qidian-format.md +0 -108
  102. package/plugins/export/templates/platforms/tomato-format.md +0 -95
  103. package/plugins/translate/README.md +0 -265
  104. package/plugins/translate/commands/glossary.md +0 -731
  105. package/plugins/translate/commands/translate-preview.md +0 -543
  106. package/plugins/translate/commands/translate.md +0 -649
  107. package/plugins/translate/config.yaml +0 -43
  108. package/plugins/translate/experts/literary-translator.md +0 -605
  109. package/templates/commands/character.md +0 -287
  110. package/templates/commands/checklist.md +0 -744
  111. package/templates/commands/clarify.md +0 -269
  112. package/templates/commands/constitution.md +0 -269
  113. package/templates/commands/expert.md +0 -188
  114. package/templates/commands/facts.md +0 -552
  115. package/templates/commands/guide.md +0 -900
  116. package/templates/commands/help-me.md +0 -221
  117. package/templates/commands/recap.md +0 -748
  118. package/templates/commands/relations.md +0 -385
  119. package/templates/commands/revise.md +0 -450
  120. package/templates/commands/search.md +0 -531
  121. package/templates/commands/tasks.md +0 -396
  122. package/templates/commands/timeline.md +0 -309
  123. package/templates/commands/track-init.md +0 -149
  124. package/templates/commands/track.md +0 -704
  125. package/templates/commands/volume-summary.md +0 -471
  126. package/templates/knowledge/audit-config.json +0 -26
  127. package/templates/knowledge/character-profiles.md +0 -152
  128. package/templates/knowledge/character-voices.md +0 -137
  129. package/templates/knowledge/locations.md +0 -184
  130. package/templates/knowledge/world-setting.md +0 -121
  131. package/templates/resources/character-archetypes/01-hero.md +0 -233
  132. package/templates/resources/character-archetypes/02-mentor.md +0 -177
  133. package/templates/resources/character-archetypes/03-shadow.md +0 -221
  134. package/templates/resources/character-archetypes/04-ally.md +0 -178
  135. package/templates/resources/character-archetypes/05-shapeshifter.md +0 -177
  136. package/templates/resources/character-archetypes/06-trickster.md +0 -181
  137. package/templates/resources/character-archetypes/07-threshold-guardian.md +0 -177
  138. package/templates/resources/character-archetypes/08-herald.md +0 -180
  139. package/templates/resources/character-archetypes/09-father.md +0 -249
  140. package/templates/resources/character-archetypes/10-mother.md +0 -202
  141. package/templates/resources/character-archetypes/11-child.md +0 -183
  142. package/templates/resources/character-archetypes/12-sage.md +0 -202
  143. package/templates/resources/character-archetypes/README.md +0 -60
  144. package/templates/resources/character-archetypes/application-guide.md +0 -222
  145. package/templates/resources/character-archetypes/archetype-combinations.md +0 -242
  146. package/templates/resources/character-archetypes/config.yaml +0 -28
  147. package/templates/resources/character-archetypes/examples-analysis.md +0 -223
  148. package/templates/resources/config/keyword-mappings.json +0 -226
  149. package/templates/resources/config/specification-example.md +0 -146
  150. package/templates/resources/craft/character-arc.md +0 -1153
  151. package/templates/resources/craft/dialogue.md +0 -1170
  152. package/templates/resources/craft/hook-design.md +0 -345
  153. package/templates/resources/craft/pacing.md +0 -1200
  154. package/templates/resources/craft/power-system.md +0 -254
  155. package/templates/resources/craft/scene-structure.md +0 -1136
  156. package/templates/resources/craft/show-not-tell.md +0 -1012
  157. package/templates/resources/craft/story-structures.md +0 -134
  158. package/templates/resources/craft/tension-management.md +0 -168
  159. package/templates/resources/emotional-beats/01-first-meeting.md +0 -145
  160. package/templates/resources/emotional-beats/02-bonding-moment.md +0 -226
  161. package/templates/resources/emotional-beats/03-declaration.md +0 -284
  162. package/templates/resources/emotional-beats/04-triumph.md +0 -240
  163. package/templates/resources/emotional-beats/05-reunion.md +0 -396
  164. package/templates/resources/emotional-beats/06-forgiveness.md +0 -204
  165. package/templates/resources/emotional-beats/07-betrayal.md +0 -204
  166. package/templates/resources/emotional-beats/08-loss.md +0 -214
  167. package/templates/resources/emotional-beats/09-rejection.md +0 -254
  168. package/templates/resources/emotional-beats/10-failure.md +0 -244
  169. package/templates/resources/emotional-beats/11-misunderstanding.md +0 -205
  170. package/templates/resources/emotional-beats/12-farewell.md +0 -283
  171. package/templates/resources/emotional-beats/13-revelation.md +0 -242
  172. package/templates/resources/emotional-beats/14-point-of-no-return.md +0 -215
  173. package/templates/resources/emotional-beats/15-dark-night.md +0 -244
  174. package/templates/resources/emotional-beats/16-sacrifice.md +0 -246
  175. package/templates/resources/emotional-beats/17-awakening.md +0 -246
  176. package/templates/resources/emotional-beats/18-confrontation.md +0 -217
  177. package/templates/resources/emotional-beats/19-bittersweet-goodbye.md +0 -368
  178. package/templates/resources/emotional-beats/20-moral-dilemma.md +0 -248
  179. package/templates/resources/emotional-beats/21-temptation.md +0 -240
  180. package/templates/resources/emotional-beats/22-redemption.md +0 -210
  181. package/templates/resources/emotional-beats/README.md +0 -104
  182. package/templates/resources/emotional-beats/beat-sequences.md +0 -276
  183. package/templates/resources/emotional-beats/config.yaml +0 -30
  184. package/templates/resources/emotional-beats/pacing-guide.md +0 -390
  185. package/templates/resources/genres/game-lit.md +0 -174
  186. package/templates/resources/genres/historical.md +0 -1127
  187. package/templates/resources/genres/horror.md +0 -211
  188. package/templates/resources/genres/military.md +0 -209
  189. package/templates/resources/genres/mystery.md +0 -1123
  190. package/templates/resources/genres/rebirth.md +0 -177
  191. package/templates/resources/genres/revenge.md +0 -846
  192. package/templates/resources/genres/romance.md +0 -948
  193. package/templates/resources/genres/sci-fi.md +0 -156
  194. package/templates/resources/genres/sports.md +0 -216
  195. package/templates/resources/genres/thriller.md +0 -166
  196. package/templates/resources/genres/urban.md +0 -170
  197. package/templates/resources/genres/workplace.md +0 -214
  198. package/templates/resources/genres/wuxia.md +0 -143
  199. package/templates/resources/genres/xuanhuan.md +0 -234
  200. package/templates/resources/genres/youth.md +0 -219
  201. package/templates/resources/memory/personal-voice.md +0 -113
  202. package/templates/resources/references/README.md +0 -96
  203. package/templates/resources/references/china-1920s/culture.md +0 -423
  204. package/templates/resources/references/china-1920s/daily-life.md +0 -616
  205. package/templates/resources/references/china-1920s/overview.md +0 -298
  206. package/templates/resources/references/china-1920s/society.md +0 -703
  207. package/templates/resources/references/china-1920s/warlords.md +0 -427
  208. package/templates/resources/references/cultivation-world/daily-life.md +0 -108
  209. package/templates/resources/references/cultivation-world/overview.md +0 -64
  210. package/templates/resources/references/cultivation-world/power-system.md +0 -108
  211. package/templates/resources/references/cultivation-world/sects.md +0 -104
  212. package/templates/resources/references/cultivation-world/world-setting.md +0 -108
  213. package/templates/resources/references/modern-workplace/corporate.md +0 -115
  214. package/templates/resources/references/modern-workplace/daily-life.md +0 -129
  215. package/templates/resources/references/modern-workplace/overview.md +0 -73
  216. package/templates/resources/references/modern-workplace/relationships.md +0 -107
  217. package/templates/resources/references/modern-workplace/tech-industry.md +0 -131
  218. package/templates/resources/references/tang-dynasty/culture.md +0 -135
  219. package/templates/resources/references/tang-dynasty/daily-life.md +0 -139
  220. package/templates/resources/references/tang-dynasty/overview.md +0 -76
  221. package/templates/resources/references/tang-dynasty/politics.md +0 -121
  222. package/templates/resources/references/tang-dynasty/society.md +0 -126
  223. package/templates/resources/requirements/README.md +0 -240
  224. package/templates/resources/requirements/anti-ai-v3.md +0 -46
  225. package/templates/resources/requirements/anti-ai-v4-deprecated.md +0 -442
  226. package/templates/resources/requirements/anti-ai-v5-balanced.md +0 -203
  227. package/templates/resources/requirements/concretization.md +0 -90
  228. package/templates/resources/requirements/fast-paced.md +0 -552
  229. package/templates/resources/requirements/no-poison.md +0 -60
  230. package/templates/resources/requirements/romance-angst.md +0 -102
  231. package/templates/resources/requirements/romance-sweet.md +0 -63
  232. package/templates/resources/requirements/serious-literature.md +0 -45
  233. package/templates/resources/requirements/strong-emotion.md +0 -60
  234. package/templates/resources/scripts/README.md +0 -187
  235. package/templates/resources/scripts/bash/analyze-story.sh +0 -170
  236. package/templates/resources/scripts/bash/check-analyze-stage.sh +0 -108
  237. package/templates/resources/scripts/bash/check-consistency.sh +0 -463
  238. package/templates/resources/scripts/bash/check-facts.sh +0 -214
  239. package/templates/resources/scripts/bash/check-plot.sh +0 -374
  240. package/templates/resources/scripts/bash/check-timeline.sh +0 -346
  241. package/templates/resources/scripts/bash/check-world.sh +0 -395
  242. package/templates/resources/scripts/bash/check-writing-state.sh +0 -854
  243. package/templates/resources/scripts/bash/clarify-story.sh +0 -117
  244. package/templates/resources/scripts/bash/common.sh +0 -151
  245. package/templates/resources/scripts/bash/constitution.sh +0 -114
  246. package/templates/resources/scripts/bash/generate-tasks.sh +0 -65
  247. package/templates/resources/scripts/bash/init-tracking.sh +0 -183
  248. package/templates/resources/scripts/bash/manage-relations.sh +0 -174
  249. package/templates/resources/scripts/bash/migrate-tracking.sh +0 -183
  250. package/templates/resources/scripts/bash/plan-story.sh +0 -100
  251. package/templates/resources/scripts/bash/specify-story.sh +0 -93
  252. package/templates/resources/scripts/bash/tasks-story.sh +0 -96
  253. package/templates/resources/scripts/bash/test-word-count.sh +0 -182
  254. package/templates/resources/scripts/bash/tests/bench-preload-cache.sh +0 -100
  255. package/templates/resources/scripts/bash/tests/run-all-benchmarks.sh +0 -16
  256. package/templates/resources/scripts/bash/tests/test-cache-semantics.sh +0 -199
  257. package/templates/resources/scripts/bash/tests/test-cross-platform.sh +0 -35
  258. package/templates/resources/scripts/bash/tests/test-edge-cases-bash.sh +0 -60
  259. package/templates/resources/scripts/bash/tests/test-phase1-bash.sh +0 -28
  260. package/templates/resources/scripts/bash/tests/test-preload-cache.sh +0 -123
  261. package/templates/resources/scripts/bash/tests/test-regex-precompile.sh +0 -89
  262. package/templates/resources/scripts/bash/tests/test-regression-bash.sh +0 -42
  263. package/templates/resources/scripts/bash/tests/test-task6-verification.sh +0 -200
  264. package/templates/resources/scripts/bash/text-audit.sh +0 -144
  265. package/templates/resources/scripts/bash/track-progress.sh +0 -194
  266. package/templates/resources/scripts/powershell/analyze-story.ps1 +0 -174
  267. package/templates/resources/scripts/powershell/check-analyze-stage.ps1 +0 -110
  268. package/templates/resources/scripts/powershell/check-consistency.ps1 +0 -138
  269. package/templates/resources/scripts/powershell/check-facts.ps1 +0 -195
  270. package/templates/resources/scripts/powershell/check-plot.ps1 +0 -139
  271. package/templates/resources/scripts/powershell/check-timeline.ps1 +0 -112
  272. package/templates/resources/scripts/powershell/check-writing-state.ps1 +0 -486
  273. package/templates/resources/scripts/powershell/clarify-story.ps1 +0 -107
  274. package/templates/resources/scripts/powershell/common.ps1 +0 -36
  275. package/templates/resources/scripts/powershell/constitution.ps1 +0 -145
  276. package/templates/resources/scripts/powershell/generate-tasks.ps1 +0 -70
  277. package/templates/resources/scripts/powershell/init-tracking.ps1 +0 -98
  278. package/templates/resources/scripts/powershell/manage-relations.ps1 +0 -134
  279. package/templates/resources/scripts/powershell/migrate-tracking.ps1 +0 -145
  280. package/templates/resources/scripts/powershell/plan-story.ps1 +0 -99
  281. package/templates/resources/scripts/powershell/specify-story.ps1 +0 -85
  282. package/templates/resources/scripts/powershell/tests/bench-ps-cache.ps1 +0 -80
  283. package/templates/resources/scripts/powershell/tests/test-cross-platform.ps1 +0 -27
  284. package/templates/resources/scripts/powershell/tests/test-edge-cases-ps.ps1 +0 -29
  285. package/templates/resources/scripts/powershell/tests/test-phase1-ps.ps1 +0 -28
  286. package/templates/resources/scripts/powershell/tests/test-ps-cache.ps1 +0 -73
  287. package/templates/resources/scripts/powershell/tests/test-regression-ps.ps1 +0 -40
  288. package/templates/resources/scripts/powershell/text-audit.ps1 +0 -102
  289. package/templates/resources/scripts/powershell/track-progress.ps1 +0 -105
  290. package/templates/resources/styles/README.md +0 -302
  291. package/templates/resources/styles/ancient-style.md +0 -579
  292. package/templates/resources/styles/literary.md +0 -439
  293. package/templates/resources/styles/minimal.md +0 -472
  294. package/templates/resources/styles/natural-voice.md +0 -930
  295. package/templates/resources/styles/web-novel.md +0 -525
  296. package/templates/skills/analysis/character-analysis/SKILL.md +0 -71
  297. package/templates/skills/analysis/foreshadow-analysis/SKILL.md +0 -45
  298. package/templates/skills/analysis/hook-analysis/SKILL.md +0 -111
  299. package/templates/skills/analysis/logic-analysis/SKILL.md +0 -58
  300. package/templates/skills/analysis/opening-analysis/SKILL.md +0 -59
  301. package/templates/skills/analysis/pacing-analysis/SKILL.md +0 -55
  302. package/templates/skills/analysis/power-analysis/SKILL.md +0 -148
  303. package/templates/skills/analysis/reader-analysis/SKILL.md +0 -117
  304. package/templates/skills/analysis/style-analysis/SKILL.md +0 -60
  305. package/templates/skills/analysis/voice-analysis/SKILL.md +0 -42
  306. package/templates/skills/auto-tracking/SKILL.md +0 -280
  307. package/templates/skills/genre-knowledge/fantasy/SKILL.md +0 -355
  308. package/templates/skills/genre-knowledge/mystery/SKILL.md +0 -337
  309. package/templates/skills/genre-knowledge/romance/SKILL.md +0 -228
  310. package/templates/skills/genre-knowledge/sci-fi/SKILL.md +0 -65
  311. package/templates/skills/genre-knowledge/thriller/SKILL.md +0 -95
  312. package/templates/skills/planning/volume-detail/SKILL.md +0 -219
  313. package/templates/skills/quality-assurance/consistency-checker/SKILL.md +0 -412
  314. package/templates/skills/quality-assurance/continuity-tracker/SKILL.md +0 -157
  315. package/templates/skills/quality-assurance/facts-checker/SKILL.md +0 -405
  316. package/templates/skills/quality-assurance/forgotten-elements/SKILL.md +0 -147
  317. package/templates/skills/quality-assurance/getting-started/SKILL.md +0 -224
  318. package/templates/skills/quality-assurance/hook-checker/SKILL.md +0 -164
  319. package/templates/skills/quality-assurance/hook-checker/experts/hook-analyst.md +0 -33
  320. package/templates/skills/quality-assurance/long-series-continuity/SKILL.md +0 -570
  321. package/templates/skills/quality-assurance/pacing-monitor/SKILL.md +0 -143
  322. package/templates/skills/quality-assurance/pov-validator/SKILL.md +0 -135
  323. package/templates/skills/quality-assurance/pre-write-checklist/SKILL.md +0 -583
  324. package/templates/skills/quality-assurance/requirement-detector/CONFLICT_RESOLUTION.md +0 -119
  325. package/templates/skills/quality-assurance/requirement-detector/EXAMPLES.md +0 -146
  326. package/templates/skills/quality-assurance/requirement-detector/KEYWORDS.md +0 -160
  327. package/templates/skills/quality-assurance/requirement-detector/SKILL.md +0 -149
  328. package/templates/skills/quality-assurance/setting-detector/SKILL.md +0 -611
  329. package/templates/skills/quality-assurance/style-detector/CONFLICT_RESOLUTION.md +0 -126
  330. package/templates/skills/quality-assurance/style-detector/EXAMPLES.md +0 -206
  331. package/templates/skills/quality-assurance/style-detector/KEYWORDS.md +0 -207
  332. package/templates/skills/quality-assurance/style-detector/SKILL.md +0 -264
  333. package/templates/skills/quality-assurance/voice-consistency-checker/SKILL.md +0 -103
  334. package/templates/skills/quality-assurance/voice-consistency-checker/experts/voice-analyst.md +0 -21
  335. package/templates/skills/quality-assurance/workflow-guide/SKILL.md +0 -381
  336. package/templates/skills/writing-techniques/character-arc/SKILL.md +0 -267
  337. package/templates/skills/writing-techniques/dialogue-techniques/SKILL.md +0 -366
  338. package/templates/skills/writing-techniques/multi-thread-narrative/SKILL.md +0 -708
  339. package/templates/skills/writing-techniques/multi-thread-narrative/experts/thread-analyst.md +0 -226
  340. package/templates/skills/writing-techniques/pacing-control/SKILL.md +0 -480
  341. package/templates/skills/writing-techniques/reader-expectation/SKILL.md +0 -1026
  342. package/templates/skills/writing-techniques/reader-expectation/experts/expectation-analyst.md +0 -209
  343. package/templates/skills/writing-techniques/revision-polish/SKILL.md +0 -496
  344. package/templates/skills/writing-techniques/revision-polish/experts/revision-editor.md +0 -221
  345. package/templates/skills/writing-techniques/scene-structure/SKILL.md +0 -361
  346. package/templates/skills/writing-techniques/style-learning/SKILL.md +0 -436
  347. package/templates/skills/writing-techniques/writing-balance/.gitkeep +0 -0
  348. package/templates/skills/writing-techniques/writing-balance/SKILL.md +0 -460
  349. package/templates/skills/writing-techniques/writing-techniques/SKILL.md +0 -727
  350. package/templates/tracking/story-facts.json +0 -5
  351. package/templates/tracking/summary/characters-summary.json +0 -7
  352. package/templates/tracking/summary/plot-summary.json +0 -13
  353. package/templates/tracking/summary/timeline-summary.json +0 -8
  354. package/templates/tracking/summary/volume-summaries.json +0 -5
  355. package/templates/tracking/tracking-log.md +0 -110
  356. package/templates/tracking/validation-rules.json +0 -128
  357. /package/templates/resources/{memory/constitution.md → constitution.md} +0 -0
@@ -1,214 +0,0 @@
1
- #!/bin/bash
2
- set -euo pipefail
3
-
4
- # check-facts.sh - Story Facts 引用扫描脚本
5
- # 扫描章节中的 story-facts 注释,生成引用报告
6
-
7
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
- PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
9
-
10
- # 颜色输出
11
- RED='\033[0;31m'
12
- GREEN='\033[0;32m'
13
- YELLOW='\033[1;33m'
14
- BLUE='\033[0;34m'
15
- BOLD='\033[1m'
16
- NC='\033[0m' # No Color
17
-
18
- # 默认参数
19
- OUTPUT_JSON=false
20
- STORY_NAME=""
21
-
22
- # 解析参数
23
- while [[ $# -gt 0 ]]; do
24
- case $1 in
25
- --json)
26
- OUTPUT_JSON=true
27
- shift
28
- ;;
29
- --story)
30
- STORY_NAME="$2"
31
- shift 2
32
- ;;
33
- *)
34
- echo "Usage: $0 [--json] [--story <story-name>]" >&2
35
- exit 1
36
- ;;
37
- esac
38
- done
39
-
40
- # 检查 story-facts.json 是否存在
41
- FACTS_FILE="$PROJECT_ROOT/tracking/story-facts.json"
42
- if [[ ! -f "$FACTS_FILE" ]]; then
43
- if [[ "$OUTPUT_JSON" == true ]]; then
44
- echo '{"error": "story-facts.json not found", "chapters": [], "unreferenced_facts": [], "unknown_ids": []}'
45
- else
46
- echo -e "${RED}❌ 未找到 story-facts.json${NC}" >&2
47
- echo -e " 路径: $FACTS_FILE" >&2
48
- echo -e " 请先使用 /facts 命令初始化" >&2
49
- fi
50
- exit 1
51
- fi
52
-
53
- # 读取已注册的 fact ID 列表
54
- # 使用 jq 提取(如果有),否则使用 grep + sed
55
- if command -v jq &> /dev/null; then
56
- REGISTERED_FACTS=$(jq -r '.facts[].id' "$FACTS_FILE" 2>/dev/null || echo "")
57
- else
58
- # 降级方案:使用 grep 提取 "id": "xxx"
59
- REGISTERED_FACTS=$(grep -o '"id"[[:space:]]*:[[:space:]]*"[^"]*"' "$FACTS_FILE" | sed 's/"id"[[:space:]]*:[[:space:]]*"\([^"]*\)"/\1/' || echo "")
60
- fi
61
-
62
- # 转换为数组
63
- if [[ -n "$REGISTERED_FACTS" ]]; then
64
- mapfile -t REGISTERED_FACTS_ARRAY <<< "$REGISTERED_FACTS"
65
- else
66
- REGISTERED_FACTS_ARRAY=()
67
- fi
68
-
69
- # 确定扫描目录
70
- if [[ -n "$STORY_NAME" ]]; then
71
- CONTENT_DIR="$PROJECT_ROOT/stories/$STORY_NAME/content"
72
- if [[ ! -d "$CONTENT_DIR" ]]; then
73
- if [[ "$OUTPUT_JSON" == true ]]; then
74
- echo "{\"error\": \"story directory not found: $STORY_NAME\", \"chapters\": [], \"unreferenced_facts\": [], \"unknown_ids\": []}"
75
- else
76
- echo -e "${RED}❌ 未找到故事目录: $STORY_NAME${NC}" >&2
77
- fi
78
- exit 1
79
- fi
80
- SEARCH_PATTERN="$CONTENT_DIR/*.md"
81
- else
82
- SEARCH_PATTERN="$PROJECT_ROOT/stories/*/content/*.md"
83
- fi
84
-
85
- # 初始化数据结构
86
- declare -A chapter_facts # key: 文件路径, value: fact IDs (逗号分隔)
87
- declare -A fact_referenced # key: fact ID, value: 1 if referenced
88
- declare -A unknown_ids_map # key: unknown ID, value: 1
89
-
90
- # 扫描章节文件
91
- shopt -s nullglob # 如果没有匹配文件,glob 返回空而非原始字符串
92
- for chapter_file in $SEARCH_PATTERN; do
93
- # 提取 <!-- story-facts: ... --> 注释
94
- # 正则:<!-- story-facts: (.+?) -->
95
- facts_line=$(grep -oP '<!--\s*story-facts:\s*\K[^-]+(?=\s*-->)' "$chapter_file" || true)
96
-
97
- if [[ -n "$facts_line" ]]; then
98
- # 去除空格,分割为数组
99
- IFS=',' read -ra fact_ids <<< "$facts_line"
100
-
101
- # 处理每个 fact ID
102
- cleaned_ids=()
103
- for id in "${fact_ids[@]}"; do
104
- # 去除前后空格
105
- id=$(echo "$id" | xargs)
106
- if [[ -n "$id" ]]; then
107
- cleaned_ids+=("$id")
108
-
109
- # 检查是否已注册
110
- if printf '%s\n' "${REGISTERED_FACTS_ARRAY[@]}" | grep -q "^${id}$"; then
111
- fact_referenced["$id"]=1
112
- else
113
- unknown_ids_map["$id"]=1
114
- fi
115
- fi
116
- done
117
-
118
- # 保存到 chapter_facts
119
- if [[ ${#cleaned_ids[@]} -gt 0 ]]; then
120
- chapter_facts["$chapter_file"]=$(IFS=,; echo "${cleaned_ids[*]}")
121
- fi
122
- fi
123
- done
124
-
125
- # 计算未被引用的事实
126
- unreferenced_facts=()
127
- for fact_id in "${REGISTERED_FACTS_ARRAY[@]}"; do
128
- if [[ ! -v fact_referenced["$fact_id"] ]]; then
129
- unreferenced_facts+=("$fact_id")
130
- fi
131
- done
132
-
133
- # 收集 unknown IDs
134
- unknown_ids=("${!unknown_ids_map[@]}")
135
-
136
- # 输出结果
137
- if [[ "$OUTPUT_JSON" == true ]]; then
138
- # JSON 输出
139
- echo "{"
140
- echo ' "chapters": ['
141
-
142
- first=true
143
- for file in "${!chapter_facts[@]}"; do
144
- if [[ "$first" == false ]]; then
145
- echo ","
146
- fi
147
- first=false
148
-
149
- # 转换为相对路径
150
- rel_path="${file#$PROJECT_ROOT/}"
151
-
152
- # 转换 fact IDs 为 JSON 数组
153
- IFS=',' read -ra ids <<< "${chapter_facts[$file]}"
154
- ids_json=$(printf '"%s",' "${ids[@]}" | sed 's/,$//')
155
-
156
- echo -n " {\"file\": \"$rel_path\", \"facts\": [$ids_json]}"
157
- done
158
-
159
- if [[ "$first" == false ]]; then
160
- echo ""
161
- fi
162
- echo " ],"
163
-
164
- # unreferenced_facts
165
- echo -n ' "unreferenced_facts": ['
166
- if [[ ${#unreferenced_facts[@]} -gt 0 ]]; then
167
- printf '"%s",' "${unreferenced_facts[@]}" | sed 's/,$//'
168
- fi
169
- echo "],"
170
-
171
- # unknown_ids
172
- echo -n ' "unknown_ids": ['
173
- if [[ ${#unknown_ids[@]} -gt 0 ]]; then
174
- printf '"%s",' "${unknown_ids[@]}" | sed 's/,$//'
175
- fi
176
- echo "]"
177
-
178
- echo "}"
179
- else
180
- # 人类可读输出
181
- echo -e "${BOLD}${BLUE}📊 Story Facts 引用报告${NC}"
182
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
183
- echo ""
184
-
185
- echo -e "${GREEN}已注册事实:${NC} ${#REGISTERED_FACTS_ARRAY[@]} 个"
186
- echo -e "${GREEN}引用章节:${NC} ${#chapter_facts[@]} 个"
187
- echo ""
188
-
189
- if [[ ${#chapter_facts[@]} -gt 0 ]]; then
190
- echo -e "${BOLD}章节引用:${NC}"
191
- for file in "${!chapter_facts[@]}"; do
192
- rel_path="${file#$PROJECT_ROOT/}"
193
- filename=$(basename "$rel_path")
194
- facts="${chapter_facts[$file]}"
195
- echo -e " ${BLUE}$filename${NC} → ${facts//,/, }"
196
- done
197
- echo ""
198
- fi
199
-
200
- if [[ ${#unreferenced_facts[@]} -gt 0 ]]; then
201
- echo -e "${YELLOW}未被引用的事实:${NC} ${unreferenced_facts[*]}"
202
- echo ""
203
- else
204
- echo -e "${GREEN}✓ 所有事实都被至少一个章节引用${NC}"
205
- echo ""
206
- fi
207
-
208
- if [[ ${#unknown_ids[@]} -gt 0 ]]; then
209
- echo -e "${RED}未知 ID (章节中引用但未注册):${NC} ${unknown_ids[*]}"
210
- echo -e " ${YELLOW}提示: 可能是拼写错误或需要注册到 story-facts.json${NC}"
211
- else
212
- echo -e "${GREEN}✓ 未检测到未知 ID${NC}"
213
- fi
214
- fi
@@ -1,374 +0,0 @@
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
- CHECKLIST_MODE=false
12
- if [ "$1" = "--checklist" ]; then
13
- CHECKLIST_MODE=true
14
- fi
15
-
16
- # 获取当前故事目录
17
- STORY_DIR=$(get_current_story)
18
-
19
- if [ -z "$STORY_DIR" ]; then
20
- echo "错误: 未找到故事项目" >&2
21
- exit 1
22
- fi
23
-
24
- # 文件路径
25
- PLOT_TRACKER="$STORY_DIR/tracking/plot-tracker.json"
26
- OUTLINE="$STORY_DIR/creative-plan.md"
27
- PROGRESS="$STORY_DIR/progress.json"
28
-
29
- # 检查必要文件
30
- check_required_files() {
31
- local missing=false
32
-
33
- if [ ! -f "$PLOT_TRACKER" ]; then
34
- echo "⚠️ 未找到情节追踪文件,正在创建..." >&2
35
- mkdir -p "$STORY_DIR/tracking"
36
- # 复制模板
37
- if [ -f "$SCRIPT_DIR/../../templates/tracking/plot-tracker.json" ]; then
38
- cp "$SCRIPT_DIR/../../templates/tracking/plot-tracker.json" "$PLOT_TRACKER"
39
- else
40
- echo "错误: 无法找到模板文件" >&2
41
- exit 1
42
- fi
43
- fi
44
-
45
- if [ ! -f "$OUTLINE" ]; then
46
- echo "错误: 未找到创作计划 (creative-plan.md)" >&2
47
- echo "请先使用 /plan 命令创建创作计划" >&2
48
- exit 1
49
- fi
50
- }
51
-
52
- # 读取当前进度
53
- get_current_progress() {
54
- if [ -f "$PROGRESS" ]; then
55
- CURRENT_CHAPTER=$(jq -r '.statistics.currentChapter // 1' "$PROGRESS")
56
- CURRENT_VOLUME=$(jq -r '.statistics.currentVolume // 1' "$PROGRESS")
57
- else
58
- CURRENT_CHAPTER=$(jq -r '.currentState.chapter // 1' "$PLOT_TRACKER")
59
- CURRENT_VOLUME=$(jq -r '.currentState.volume // 1' "$PLOT_TRACKER")
60
- fi
61
- }
62
-
63
- # 分析情节对齐
64
- analyze_plot_alignment() {
65
- echo "📊 情节发展检查报告"
66
- echo "━━━━━━━━━━━━━━━━━━━━"
67
-
68
- # 当前进度
69
- echo "📍 当前进度:第${CURRENT_CHAPTER}章(第${CURRENT_VOLUME}卷)"
70
-
71
- # 读取情节追踪数据
72
- if [ -f "$PLOT_TRACKER" ]; then
73
- MAIN_PLOT=$(jq -r '.plotlines.main.currentNode // "未设定"' "$PLOT_TRACKER")
74
- PLOT_STATUS=$(jq -r '.plotlines.main.status // "unknown"' "$PLOT_TRACKER")
75
- echo "📖 主线进度:$MAIN_PLOT [$PLOT_STATUS]"
76
-
77
- # 完成的节点
78
- COMPLETED_COUNT=$(jq '.plotlines.main.completedNodes | length' "$PLOT_TRACKER")
79
- echo ""
80
- echo "✅ 已完成节点:${COMPLETED_COUNT}个"
81
- jq -r '.plotlines.main.completedNodes[]? | " • " + .' "$PLOT_TRACKER" 2>/dev/null || true
82
-
83
- # 即将到来的节点
84
- UPCOMING_COUNT=$(jq '.plotlines.main.upcomingNodes | length' "$PLOT_TRACKER")
85
- if [ "$UPCOMING_COUNT" -gt 0 ]; then
86
- echo ""
87
- echo "→ 接下来的节点:"
88
- jq -r '.plotlines.main.upcomingNodes[0:3][]? | " • " + .' "$PLOT_TRACKER" 2>/dev/null || true
89
- fi
90
- fi
91
- }
92
-
93
- # 检查伏笔状态
94
- check_foreshadowing() {
95
- echo ""
96
- echo "🎯 伏笔追踪"
97
- echo "───────────"
98
-
99
- if [ -f "$PLOT_TRACKER" ]; then
100
- # 统计伏笔
101
- TOTAL_FORESHADOW=$(jq '.foreshadowing | length' "$PLOT_TRACKER")
102
- ACTIVE_FORESHADOW=$(jq '[.foreshadowing[] | select(.status == "active")] | length' "$PLOT_TRACKER")
103
- RESOLVED_FORESHADOW=$(jq '[.foreshadowing[] | select(.status == "resolved")] | length' "$PLOT_TRACKER")
104
-
105
- echo "统计:总计${TOTAL_FORESHADOW}个,活跃${ACTIVE_FORESHADOW}个,已回收${RESOLVED_FORESHADOW}个"
106
-
107
- # 列出待处理的伏笔
108
- if [ "$ACTIVE_FORESHADOW" -gt 0 ]; then
109
- echo ""
110
- echo "⚠️ 待处理伏笔:"
111
- jq -r '.foreshadowing[] | select(.status == "active") |
112
- " • " + .content + "(第" + (.planted.chapter | tostring) + "章埋设)"' \
113
- "$PLOT_TRACKER" 2>/dev/null || true
114
- fi
115
-
116
- # 检查是否有过期的伏笔(超过30章未处理)
117
- OVERDUE=$(jq --arg current "$CURRENT_CHAPTER" '
118
- [.foreshadowing[] |
119
- select(.status == "active" and .planted.chapter and
120
- (($current | tonumber) - .planted.chapter) > 30)] |
121
- length' "$PLOT_TRACKER")
122
-
123
- if [ "$OVERDUE" -gt 0 ]; then
124
- echo ""
125
- echo "⚠️ 警告:有${OVERDUE}个伏笔超过30章未处理"
126
- fi
127
- fi
128
- }
129
-
130
- # 检查冲突发展
131
- check_conflicts() {
132
- echo ""
133
- echo "⚔️ 冲突追踪"
134
- echo "───────────"
135
-
136
- if [ -f "$PLOT_TRACKER" ]; then
137
- ACTIVE_CONFLICTS=$(jq '.conflicts.active | length' "$PLOT_TRACKER")
138
-
139
- if [ "$ACTIVE_CONFLICTS" -gt 0 ]; then
140
- echo "当前活跃冲突:${ACTIVE_CONFLICTS}个"
141
- jq -r '.conflicts.active[] |
142
- " • " + .name + " [" + .intensity + "]"' \
143
- "$PLOT_TRACKER" 2>/dev/null || true
144
- else
145
- echo "暂无活跃冲突"
146
- fi
147
- fi
148
- }
149
-
150
- # 生成建议
151
- generate_suggestions() {
152
- echo ""
153
- echo "💡 建议"
154
- echo "───────"
155
-
156
- # 基于当前章节给出建议
157
- if [ "$CURRENT_CHAPTER" -lt 10 ]; then
158
- echo "• 前10章是关键,确保有足够的钩子吸引读者"
159
- elif [ "$CURRENT_CHAPTER" -lt 30 ]; then
160
- echo "• 接近第一个小高潮,检查冲突是否足够激烈"
161
- elif [ "$((CURRENT_CHAPTER % 60))" -gt 50 ]; then
162
- echo "• 接近卷尾,准备高潮和悬念设置"
163
- fi
164
-
165
- # 基于伏笔状态给建议
166
- if [ "$ACTIVE_FORESHADOW" -gt 5 ]; then
167
- echo "• 活跃伏笔较多,考虑在接下来几章回收部分"
168
- fi
169
-
170
- # 基于冲突状态给建议
171
- if [ "$ACTIVE_CONFLICTS" -eq 0 ] && [ "$CURRENT_CHAPTER" -gt 5 ]; then
172
- echo "• 当前无活跃冲突,考虑引入新的矛盾点"
173
- fi
174
- }
175
-
176
- # 生成 checklist 格式输出
177
- output_checklist() {
178
- # 检查必要文件(静默)
179
- check_required_files > /dev/null 2>&1 || true
180
-
181
- # 获取当前进度
182
- get_current_progress
183
-
184
- # 收集数据
185
- local main_plot="未设定"
186
- local plot_status="unknown"
187
- local completed_count=0
188
- local upcoming_count=0
189
- local total_foreshadow=0
190
- local active_foreshadow=0
191
- local resolved_foreshadow=0
192
- local overdue_foreshadow=0
193
- local active_conflicts=0
194
-
195
- if [ -f "$PLOT_TRACKER" ]; then
196
- main_plot=$(jq -r '.plotlines.main.currentNode // "未设定"' "$PLOT_TRACKER")
197
- plot_status=$(jq -r '.plotlines.main.status // "unknown"' "$PLOT_TRACKER")
198
- completed_count=$(jq '.plotlines.main.completedNodes | length' "$PLOT_TRACKER")
199
- upcoming_count=$(jq '.plotlines.main.upcomingNodes | length' "$PLOT_TRACKER")
200
-
201
- total_foreshadow=$(jq '.foreshadowing | length' "$PLOT_TRACKER")
202
- active_foreshadow=$(jq '[.foreshadowing[] | select(.status == "active")] | length' "$PLOT_TRACKER")
203
- resolved_foreshadow=$(jq '[.foreshadowing[] | select(.status == "resolved")] | length' "$PLOT_TRACKER")
204
-
205
- overdue_foreshadow=$(jq --arg current "$CURRENT_CHAPTER" '
206
- [.foreshadowing[] |
207
- select(.status == "active" and .planted.chapter and
208
- (($current | tonumber) - .planted.chapter) > 30)] |
209
- length' "$PLOT_TRACKER")
210
-
211
- active_conflicts=$(jq '.conflicts.active | length' "$PLOT_TRACKER")
212
- fi
213
-
214
- # 输出 checklist 格式
215
- cat <<EOF
216
- # 情节对齐检查 Checklist
217
-
218
- **检查时间**: $(date '+%Y-%m-%d %H:%M:%S')
219
- **检查对象**: plot-tracker.json, creative-plan.md, progress.json
220
- **当前进度**: 第 ${CURRENT_CHAPTER} 章(第 ${CURRENT_VOLUME} 卷)
221
-
222
- ---
223
-
224
- ## 文件完整性
225
-
226
- - [$([ -f "$PLOT_TRACKER" ] && echo "x" || echo " ")] CHK001 plot-tracker.json 存在
227
- - [$([ -f "$OUTLINE" ] && echo "x" || echo " ")] CHK002 creative-plan.md 存在
228
- - [$([ -f "$PROGRESS" ] && echo "x" || echo " ")] CHK003 progress.json 存在
229
-
230
- ## 情节进度
231
-
232
- - [$([ "$plot_status" != "unknown" ] && echo "x" || echo " ")] CHK004 主线情节状态已更新(当前:$plot_status)
233
- - [x] CHK005 主线情节节点进度:$main_plot
234
- - [$([ $completed_count -gt 0 ] && echo "x" || echo " ")] CHK006 已完成情节节点($completed_count 个)
235
- - [$([ $upcoming_count -gt 0 ] && echo "x" || echo " ")] CHK007 后续情节节点已规划($upcoming_count 个)
236
-
237
- ## 伏笔管理
238
-
239
- EOF
240
-
241
- if [ $total_foreshadow -gt 0 ]; then
242
- echo "- [x] CHK008 伏笔记录存在(总计 $total_foreshadow 个)"
243
- echo "- [x] CHK009 伏笔状态跟踪(活跃 $active_foreshadow 个,已回收 $resolved_foreshadow 个)"
244
-
245
- if [ $overdue_foreshadow -eq 0 ]; then
246
- echo "- [x] CHK010 伏笔回收及时(无超过30章未处理)"
247
- else
248
- echo "- [!] CHK010 伏笔回收及时(⚠️ ${overdue_foreshadow}个超过30章未处理)"
249
- fi
250
-
251
- if [ $active_foreshadow -le 5 ]; then
252
- echo "- [x] CHK011 活跃伏笔数量合理($active_foreshadow ≤ 5)"
253
- elif [ $active_foreshadow -le 10 ]; then
254
- echo "- [!] CHK011 活跃伏笔数量偏多($active_foreshadow 个,建议回收部分)"
255
- else
256
- echo "- [!] CHK011 活跃伏笔数量过多(⚠️ $active_foreshadow > 10,可能造成混乱)"
257
- fi
258
- else
259
- echo "- [ ] CHK008 伏笔记录存在(未找到伏笔记录)"
260
- echo "- [ ] CHK009 伏笔状态跟踪(无数据)"
261
- echo "- [ ] CHK010 伏笔回收及时(无数据)"
262
- echo "- [ ] CHK011 活跃伏笔数量合理(无数据)"
263
- fi
264
-
265
- cat <<EOF
266
-
267
- ## 冲突发展
268
-
269
- EOF
270
-
271
- if [ $active_conflicts -gt 0 ]; then
272
- echo "- [x] CHK012 存在活跃冲突($active_conflicts 个)"
273
- elif [ $CURRENT_CHAPTER -gt 5 ]; then
274
- echo "- [!] CHK012 存在活跃冲突(⚠️ 当前无活跃冲突,建议引入矛盾点)"
275
- else
276
- echo "- [x] CHK012 存在活跃冲突(前期章节,可暂无冲突)"
277
- fi
278
-
279
- cat <<EOF
280
-
281
- ## 节奏建议
282
-
283
- EOF
284
-
285
- # 基于当前章节给出检查项
286
- if [ $CURRENT_CHAPTER -lt 10 ]; then
287
- echo "- [ ] CHK013 前10章钩子设置(确保有足够吸引力)"
288
- elif [ $CURRENT_CHAPTER -lt 30 ]; then
289
- echo "- [ ] CHK014 第一个小高潮准备(检查冲突强度)"
290
- elif [ $((CURRENT_CHAPTER % 60)) -gt 50 ]; then
291
- echo "- [ ] CHK015 卷尾高潮设置(准备悬念和高潮)"
292
- else
293
- echo "- [x] CHK016 节奏正常(无特殊节点提醒)"
294
- fi
295
-
296
- cat <<EOF
297
-
298
- ---
299
-
300
- ## 后续行动
301
-
302
- EOF
303
-
304
- # 动态生成后续行动
305
- local has_actions=false
306
-
307
- if [ $overdue_foreshadow -gt 0 ]; then
308
- echo "- [ ] 回收超期伏笔(${overdue_foreshadow}个)"
309
- has_actions=true
310
- fi
311
-
312
- if [ $active_foreshadow -gt 10 ]; then
313
- echo "- [ ] 减少活跃伏笔数量(当前 $active_foreshadow 个)"
314
- has_actions=true
315
- fi
316
-
317
- if [ $active_conflicts -eq 0 ] && [ $CURRENT_CHAPTER -gt 5 ]; then
318
- echo "- [ ] 引入新的冲突点"
319
- has_actions=true
320
- fi
321
-
322
- if [ $upcoming_count -eq 0 ]; then
323
- echo "- [ ] 规划后续情节节点"
324
- has_actions=true
325
- fi
326
-
327
- if [ "$has_actions" = false ]; then
328
- echo "*当前情节发展良好,无需特别行动*"
329
- fi
330
-
331
- cat <<EOF
332
-
333
- ---
334
-
335
- **检查工具**: check-plot.sh
336
- **版本**: 1.1 (支持 checklist 输出)
337
- EOF
338
- }
339
-
340
- # 主函数
341
- main() {
342
- if [ "$CHECKLIST_MODE" = true ]; then
343
- output_checklist
344
- else
345
- echo "🔍 开始检查情节一致性..."
346
- echo ""
347
-
348
- # 检查必要文件
349
- check_required_files
350
-
351
- # 获取当前进度
352
- get_current_progress
353
-
354
- # 执行各项检查
355
- analyze_plot_alignment
356
- check_foreshadowing
357
- check_conflicts
358
- generate_suggestions
359
-
360
- echo ""
361
- echo "━━━━━━━━━━━━━━━━━━━━"
362
- echo "✅ 检查完成"
363
- fi
364
-
365
- # 更新检查时间
366
- if [ -f "$PLOT_TRACKER" ]; then
367
- TEMP_FILE=$(mktemp)
368
- jq --arg date "$(date -Iseconds)" '.lastUpdated = $date' "$PLOT_TRACKER" > "$TEMP_FILE"
369
- mv "$TEMP_FILE" "$PLOT_TRACKER"
370
- fi
371
- }
372
-
373
- # 执行主函数
374
- main