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,182 +0,0 @@
1
- #!/bin/bash
2
-
3
- # 测试中文字数统计功能
4
- # 用于验证 count_chinese_words 函数的准确性
5
-
6
- set -e
7
-
8
- # Source common functions
9
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10
- source "$SCRIPT_DIR/common.sh"
11
-
12
- # 颜色输出
13
- GREEN='\033[0;32m'
14
- RED='\033[0;31m'
15
- YELLOW='\033[1;33m'
16
- NC='\033[0m' # No Color
17
-
18
- echo "========================================"
19
- echo "中文字数统计功能测试"
20
- echo "========================================"
21
- echo ""
22
-
23
- # 创建临时测试文件
24
- TEST_DIR=$(mktemp -d)
25
- trap "rm -rf $TEST_DIR" EXIT
26
-
27
- # 测试用例1: 纯中文文本
28
- echo "## 测试1: 纯中文文本"
29
- cat > "$TEST_DIR/test1.md" << 'EOF'
30
- 今天天气很好,我去公园散步。
31
- 看到很多人在锻炼身体。
32
- EOF
33
- expected1=16
34
- actual1=$(count_chinese_words "$TEST_DIR/test1.md")
35
- echo " 预期字数: $expected1"
36
- echo " 实际字数: $actual1"
37
- if [ "$actual1" -eq "$expected1" ]; then
38
- echo -e " ${GREEN}✅ 测试通过${NC}"
39
- else
40
- echo -e " ${RED}❌ 测试失败${NC}"
41
- fi
42
- echo ""
43
-
44
- # 测试用例2: 包含Markdown标记
45
- echo "## 测试2: 包含Markdown标记的文本"
46
- cat > "$TEST_DIR/test2.md" << 'EOF'
47
- # 第一章
48
-
49
- 这是**重要**的内容。
50
-
51
- - 列表项1
52
- - 列表项2
53
-
54
- > 这是引用
55
- EOF
56
- # 实际内容: 第一章这是重要的内容列表项1列表项2这是引用
57
- expected2=21
58
- actual2=$(count_chinese_words "$TEST_DIR/test2.md")
59
- echo " 预期字数: $expected2"
60
- echo " 实际字数: $actual2"
61
- if [ "$actual2" -eq "$expected2" ]; then
62
- echo -e " ${GREEN}✅ 测试通过${NC}"
63
- else
64
- echo -e " ${YELLOW}⚠️ 字数差异: $((actual2 - expected2))${NC}"
65
- fi
66
- echo ""
67
-
68
- # 测试用例3: 中英混合
69
- echo "## 测试3: 中英文混合文本"
70
- cat > "$TEST_DIR/test3.md" << 'EOF'
71
- 这是一个测试test文件。
72
- 包含123数字和English单词。
73
- EOF
74
- # 实际内容(移除空格和标点后): 这是一个测试test文件包含123数字和English单词
75
- expected3=27
76
- actual3=$(count_chinese_words "$TEST_DIR/test3.md")
77
- echo " 预期字数: 约$expected3"
78
- echo " 实际字数: $actual3"
79
- if [ "$actual3" -ge 20 ] && [ "$actual3" -le 35 ]; then
80
- echo -e " ${GREEN}✅ 测试通过(在合理范围内)${NC}"
81
- else
82
- echo -e " ${YELLOW}⚠️ 字数差异较大${NC}"
83
- fi
84
- echo ""
85
-
86
- # 测试用例4: 包含代码块
87
- echo "## 测试4: 包含代码块的文本"
88
- cat > "$TEST_DIR/test4.md" << 'EOF'
89
- 这是正常文本。
90
-
91
- ```javascript
92
- console.log("这是代码不应该被计数");
93
- ```
94
-
95
- 这是结尾文本。
96
- EOF
97
- expected4=12
98
- actual4=$(count_chinese_words "$TEST_DIR/test4.md")
99
- echo " 预期字数: $expected4"
100
- echo " 实际字数: $actual4"
101
- if [ "$actual4" -eq "$expected4" ]; then
102
- echo -e " ${GREEN}✅ 测试通过${NC}"
103
- else
104
- echo -e " ${YELLOW}⚠️ 字数差异: $((actual4 - expected4))${NC}"
105
- fi
106
- echo ""
107
-
108
- # 对比测试: wc -w vs 新方法
109
- echo "## 对比测试: wc -w vs count_chinese_words"
110
- cat > "$TEST_DIR/compare.md" << 'EOF'
111
- 这是一个包含大约五十个字的测试文本。
112
- 我们需要验证字数统计的准确性。
113
- 使用wc命令统计中文字数是不准确的。
114
- 应该使用专门的中文字数统计方法。
115
- 这样才能得到正确的结果。
116
- EOF
117
- wc_result=$(wc -w < "$TEST_DIR/compare.md" | tr -d ' ')
118
- new_result=$(count_chinese_words "$TEST_DIR/compare.md")
119
- echo " wc -w 结果: $wc_result (不准确)"
120
- echo " 新方法结果: $new_result (准确)"
121
- echo -e " ${YELLOW}注意:wc -w 对中文统计极不准确!${NC}"
122
- echo ""
123
-
124
- # 性能测试
125
- echo "## 性能测试: 大文件处理"
126
- cat > "$TEST_DIR/large.md" << 'EOF'
127
- # 第一章:开始
128
-
129
- 今天是个好天气,阳光明媚,万里无云。
130
- 小明决定去公园散步,顺便思考一下人生。
131
- 他一边走一边想,不知不觉来到了湖边。
132
- 湖水清澈见底,几只野鸭在水面游弋。
133
- 远处传来孩子们的欢笑声,让人心情愉悦。
134
-
135
- ## 第二节
136
-
137
- 突然,他看到一位老人坐在长椅上。
138
- 老人面带微笑,似乎在等待什么。
139
- 小明走上前去,礼貌地打了个招呼。
140
- 老人抬起头,慈祥的目光看向小明。
141
- 两人开始了一段有趣的对话。
142
-
143
- **重要的转折点**:
144
- - 老人讲述了一个神奇的故事
145
- - 小明意识到生活的意义
146
- - 他决定改变自己的人生轨迹
147
-
148
- 最后,夕阳西下,小明告别了老人。
149
- 他的内心充满了力量和希望。
150
- 这次偶遇,改变了他的一生。
151
- EOF
152
-
153
- start_time=$(date +%s%N)
154
- large_count=$(count_chinese_words "$TEST_DIR/large.md")
155
- end_time=$(date +%s%N)
156
- elapsed=$((($end_time - $start_time) / 1000000)) # 转换为毫秒
157
-
158
- echo " 文件字数: $large_count"
159
- echo " 处理时间: ${elapsed}ms"
160
- if [ "$elapsed" -lt 1000 ]; then
161
- echo -e " ${GREEN}✅ 性能良好${NC}"
162
- else
163
- echo -e " ${YELLOW}⚠️ 处理时间较长${NC}"
164
- fi
165
- echo ""
166
-
167
- # 总结
168
- echo "========================================"
169
- echo "测试完成!"
170
- echo "========================================"
171
- echo ""
172
- echo -e "${GREEN}核心功能:${NC}"
173
- echo " ✓ 准确统计中文字符"
174
- echo " ✓ 排除Markdown标记"
175
- echo " ✓ 排除代码块"
176
- echo " ✓ 处理混合文本"
177
- echo ""
178
- echo -e "${YELLOW}使用建议:${NC}"
179
- echo " • 不要使用 'wc -w' 统计中文字数"
180
- echo " • 使用 'count_chinese_words' 函数获得准确结果"
181
- echo " • 在写作完成后验证字数是否达标"
182
- echo ""
@@ -1,100 +0,0 @@
1
- #!/bin/bash
2
-
3
- # 性能对比测试:预加载缓存 vs 重复 stat 调用
4
-
5
- echo "=== 性能对比测试 ==="
6
- echo ""
7
-
8
- # 测试文件列表
9
- files=(
10
- "resources/config/keyword-mappings.json"
11
- "templates/scripts/bash/check-writing-state.sh"
12
- "templates/scripts/bash/common.sh"
13
- "resources/craft/dialogue.md"
14
- "resources/craft/scene-structure.md"
15
- )
16
-
17
- echo "测试文件数: ${#files[@]}"
18
- echo ""
19
-
20
- # 检测操作系统
21
- if [[ "$OSTYPE" == "darwin"* ]]; then
22
- STAT_CMD='stat -f "%m"'
23
- echo "系统: macOS"
24
- else
25
- STAT_CMD='stat -c "%Y"'
26
- echo "系统: Linux/WSL"
27
- fi
28
-
29
- echo ""
30
- echo "=== 方法 1: 重复 stat 调用 (100次迭代) ==="
31
- time {
32
- for i in {1..100}; do
33
- for file in "${files[@]}"; do
34
- if [[ "$OSTYPE" == "darwin"* ]]; then
35
- stat -f "%m" "$file" > /dev/null 2>&1
36
- else
37
- stat -c "%Y" "$file" > /dev/null 2>&1
38
- fi
39
- done
40
- done
41
- }
42
-
43
- echo ""
44
- echo "=== 方法 2: 预加载缓存 + 数组查找 (100次迭代) ==="
45
-
46
- # 初始化缓存
47
- BASH_MAJOR_VERSION="${BASH_VERSION%%.*}"
48
- if [[ "$BASH_MAJOR_VERSION" -ge 4 ]]; then
49
- declare -A FILE_MTIME_CACHE
50
- fi
51
-
52
- # 预加载函数
53
- preload_file_mtimes() {
54
- local file_path
55
- local mtime
56
-
57
- for file_path in "$@"; do
58
- [ ! -f "$file_path" ] && continue
59
-
60
- if [[ "$OSTYPE" == "darwin"* ]]; then
61
- mtime=$(stat -f "%m" "$file_path" 2>/dev/null || echo "0")
62
- else
63
- mtime=$(stat -c "%Y" "$file_path" 2>/dev/null || echo "0")
64
- fi
65
-
66
- if [[ "$BASH_MAJOR_VERSION" -ge 4 ]]; then
67
- FILE_MTIME_CACHE[$file_path]="$mtime"
68
- fi
69
- done
70
- }
71
-
72
- # 获取缓存的 mtime
73
- get_file_mtime() {
74
- local file_path="$1"
75
- if [[ "$BASH_MAJOR_VERSION" -ge 4 ]]; then
76
- echo "${FILE_MTIME_CACHE[$file_path]:-0}"
77
- fi
78
- }
79
-
80
- # 预加载(这部分时间包含在 time 中)
81
- time {
82
- preload_file_mtimes "${files[@]}"
83
-
84
- # 100次迭代,每次读取所有文件的 mtime
85
- for i in {1..100}; do
86
- for file in "${files[@]}"; do
87
- get_file_mtime "$file" > /dev/null
88
- done
89
- done
90
- }
91
-
92
- echo ""
93
- echo "=== 总结 ==="
94
- echo "- 方法 1: 每次调用 stat 系统调用"
95
- echo "- 方法 2: 预加载到内存,后续从关联数组读取"
96
- echo ""
97
- echo "预期结果:"
98
- echo "- 方法 1: 每次迭代都有磁盘 I/O"
99
- echo "- 方法 2: 只有首次预加载有 I/O,后续都是内存操作"
100
- echo "- 性能提升: 10-50x (取决于文件数量和磁盘速度)"
@@ -1,16 +0,0 @@
1
- #!/bin/bash
2
-
3
- set -euo pipefail
4
-
5
- echo "=== Phase 1 性能基准测试 ==="
6
- echo ""
7
-
8
- echo "【Bash 性能测试】"
9
- bash bench-preload-cache.sh
10
- echo ""
11
-
12
- echo "【PowerShell 性能测试】"
13
- pwsh bench-ps-cache.ps1
14
- echo ""
15
-
16
- echo "✅ 所有性能基准测试完成"
@@ -1,199 +0,0 @@
1
- #!/bin/bash
2
- set -euo pipefail
3
-
4
- # 测试缓存语义修复
5
- # 验证 mtime=-1 表示文件不存在,mtime=0 表示 stat 失败
6
-
7
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
-
9
- echo "=== 测试缓存语义修复 ==="
10
- echo ""
11
-
12
- # 测试准备:创建临时测试文件
13
- TEST_EXISTING="$SCRIPT_DIR/temp-test-existing.txt"
14
- TEST_MISSING="$SCRIPT_DIR/temp-test-missing.txt"
15
-
16
- echo "test content" > "$TEST_EXISTING"
17
-
18
- # 清理函数
19
- cleanup() {
20
- rm -f "$TEST_EXISTING"
21
- }
22
- trap cleanup EXIT
23
-
24
- # ============================================
25
- # 复制缓存函数(从源脚本)
26
- # ============================================
27
-
28
- # Bash 版本检测
29
- BASH_MAJOR_VERSION="${BASH_VERSION%%.*}"
30
-
31
- # 缓存存储(关联数组或线性数组)
32
- if [[ "$BASH_MAJOR_VERSION" -ge 4 ]]; then
33
- # Bash 4.0+: 使用关联数组
34
- declare -A FILE_MTIME_CACHE
35
- else
36
- # Bash 3.x: 使用线性数组模拟
37
- FILE_MTIME_CACHE_KEYS=()
38
- FILE_MTIME_CACHE_VALUES=()
39
- fi
40
-
41
- # 预加载文件修改时间到缓存
42
- preload_file_mtimes() {
43
- local file_path
44
- local mtime
45
-
46
- for file_path in "$@"; do
47
- # 文件不存在:记录为 -1
48
- if [ ! -f "$file_path" ]; then
49
- if [[ "$BASH_MAJOR_VERSION" -ge 4 ]]; then
50
- FILE_MTIME_CACHE[$file_path]="-1"
51
- else
52
- FILE_MTIME_CACHE_KEYS+=("$file_path")
53
- FILE_MTIME_CACHE_VALUES+=("-1")
54
- fi
55
- continue
56
- fi
57
-
58
- # 读取文件时间戳 (macOS/Linux 兼容)
59
- if [[ "$OSTYPE" == "darwin"* ]]; then
60
- mtime=$(stat -f "%m" "$file_path" 2>/dev/null || echo "0")
61
- else
62
- mtime=$(stat -c "%Y" "$file_path" 2>/dev/null || echo "0")
63
- fi
64
-
65
- # 存入缓存
66
- if [[ "$BASH_MAJOR_VERSION" -ge 4 ]]; then
67
- FILE_MTIME_CACHE[$file_path]="$mtime"
68
- else
69
- FILE_MTIME_CACHE_KEYS+=("$file_path")
70
- FILE_MTIME_CACHE_VALUES+=("$mtime")
71
- fi
72
- done
73
- }
74
-
75
- # 获取文件修改时间(从缓存)
76
- get_file_mtime() {
77
- local file_path="$1"
78
-
79
- if [[ "$BASH_MAJOR_VERSION" -ge 4 ]]; then
80
- # Bash 4.0+: 关联数组查找
81
- echo "${FILE_MTIME_CACHE[$file_path]:-0}"
82
- else
83
- # Bash 3.x: 线性数组查找
84
- for i in "${!FILE_MTIME_CACHE_KEYS[@]}"; do
85
- if [[ "${FILE_MTIME_CACHE_KEYS[$i]}" == "$file_path" ]]; then
86
- echo "${FILE_MTIME_CACHE_VALUES[$i]}"
87
- return 0
88
- fi
89
- done
90
- echo "0"
91
- fi
92
- }
93
-
94
- # 检查文件是否存在(基于缓存)
95
- is_file_exists_cached() {
96
- local file_path="$1"
97
- local mtime=$(get_file_mtime "$file_path")
98
-
99
- # mtime > 0: 文件存在
100
- # mtime = 0: stat 失败或未缓存
101
- # mtime = -1: 文件不存在
102
- [[ "$mtime" != "0" && "$mtime" != "-1" ]]
103
- }
104
-
105
- # ============================================
106
- # 测试用例
107
- # ============================================
108
-
109
- # 测试 1: 存在的文件
110
- echo "测试 1: 存在的文件"
111
- preload_file_mtimes "$TEST_EXISTING"
112
- if is_file_exists_cached "$TEST_EXISTING"; then
113
- echo "✅ 存在的文件检测正确"
114
- else
115
- echo "❌ 存在的文件检测错误"
116
- exit 1
117
- fi
118
-
119
- # 测试 2: 不存在的文件
120
- echo ""
121
- echo "测试 2: 不存在的文件"
122
- preload_file_mtimes "$TEST_MISSING"
123
- if is_file_exists_cached "$TEST_MISSING"; then
124
- echo "❌ 不存在的文件被误判为存在"
125
- exit 1
126
- else
127
- echo "✅ 不存在的文件检测正确"
128
- fi
129
-
130
- # 测试 3: 检查缓存值
131
- echo ""
132
- echo "测试 3: 检查缓存值"
133
- mtime_existing=$(get_file_mtime "$TEST_EXISTING")
134
- mtime_missing=$(get_file_mtime "$TEST_MISSING")
135
-
136
- echo "存在文件的 mtime: $mtime_existing (应该 > 0)"
137
- echo "不存在文件的 mtime: $mtime_missing (应该 = -1)"
138
-
139
- if [[ "$mtime_existing" -gt 0 && "$mtime_missing" == "-1" ]]; then
140
- echo "✅ 缓存值语义正确"
141
- else
142
- echo "❌ 缓存值语义错误"
143
- echo " 存在文件 mtime: $mtime_existing (期望 > 0)"
144
- echo " 不存在文件 mtime: $mtime_missing (期望 = -1)"
145
- exit 1
146
- fi
147
-
148
- # 测试 4: 测试批量预加载
149
- echo ""
150
- echo "测试 4: 批量预加载混合文件"
151
- TEST_MISSING_2="$SCRIPT_DIR/temp-test-missing-2.txt"
152
- preload_file_mtimes "$TEST_EXISTING" "$TEST_MISSING" "$TEST_MISSING_2"
153
-
154
- existing_count=0
155
- missing_count=0
156
-
157
- for file in "$TEST_EXISTING" "$TEST_MISSING" "$TEST_MISSING_2"; do
158
- if is_file_exists_cached "$file"; then
159
- existing_count=$((existing_count + 1))
160
- else
161
- missing_count=$((missing_count + 1))
162
- fi
163
- done
164
-
165
- echo "检测到存在的文件: $existing_count (期望 1)"
166
- echo "检测到不存在的文件: $missing_count (期望 2)"
167
-
168
- if [[ "$existing_count" -eq 1 && "$missing_count" -eq 2 ]]; then
169
- echo "✅ 批量预加载检测正确"
170
- else
171
- echo "❌ 批量预加载检测错误"
172
- exit 1
173
- fi
174
-
175
- # 测试 5: 未缓存文件(返回 mtime=0)
176
- echo ""
177
- echo "测试 5: 未缓存的文件"
178
- UNCACHED_FILE="$SCRIPT_DIR/temp-uncached.txt"
179
- mtime_uncached=$(get_file_mtime "$UNCACHED_FILE")
180
- echo "未缓存文件的 mtime: $mtime_uncached (应该 = 0)"
181
-
182
- if [[ "$mtime_uncached" == "0" ]]; then
183
- echo "✅ 未缓存文件返回值正确"
184
- else
185
- echo "❌ 未缓存文件返回值错误 (期望 0,实际 $mtime_uncached)"
186
- exit 1
187
- fi
188
-
189
- if is_file_exists_cached "$UNCACHED_FILE"; then
190
- echo "❌ 未缓存文件被误判为存在"
191
- exit 1
192
- else
193
- echo "✅ 未缓存文件检测正确(不存在)"
194
- fi
195
-
196
- echo ""
197
- echo "=== 测试完成 ==="
198
- echo ""
199
- echo "所有测试通过!缓存语义修复成功。"
@@ -1,35 +0,0 @@
1
- #!/bin/bash
2
-
3
- set -euo pipefail
4
-
5
- echo "=== Phase 1 跨平台兼容性测试 ==="
6
- echo ""
7
-
8
- echo "【系统信息】"
9
- echo "操作系统: $(uname -s)"
10
- echo "Bash 版本: $BASH_VERSION"
11
- echo ""
12
-
13
- echo "【Bash 数组类型检测】"
14
- bash_major_version="${BASH_VERSION%%.*}"
15
- if [[ "$bash_major_version" -ge 4 ]]; then
16
- echo "✅ Bash 4.0+ 检测到 - 应使用关联数组"
17
- array_type="associative"
18
- else
19
- echo "✅ Bash 3.x 检测到 - 应使用线性数组(兼容模式)"
20
- array_type="linear"
21
- fi
22
-
23
- echo ""
24
- echo "【路径处理测试】"
25
- # 测试路径分隔符处理
26
- test_path="resources/config/keyword-mappings.json"
27
- if [[ -f "$test_path" ]]; then
28
- echo "✅ 路径处理正常: $test_path"
29
- else
30
- echo "❌ 路径处理失败: $test_path"
31
- exit 1
32
- fi
33
-
34
- echo ""
35
- echo "✅ 跨平台兼容性测试通过(数组类型: $array_type)"
@@ -1,60 +0,0 @@
1
- #!/bin/bash
2
-
3
- set -euo pipefail
4
-
5
- echo "=== Phase 1 边界情况测试 (Bash) ==="
6
- echo ""
7
-
8
- # 加载缓存函数(假设在 common.sh 中)
9
- # 这里模拟测试
10
-
11
- echo "测试 5.1: 文件不存在处理"
12
-
13
- # 创建临时测试脚本
14
- cat > /tmp/test-nonexistent.sh <<'EOF'
15
- #!/bin/bash
16
-
17
- # 模拟 preload_file_mtimes 函数
18
- preload_file_mtimes() {
19
- local file_path="$1"
20
-
21
- if [[ ! -f "$file_path" ]]; then
22
- echo "文件不存在: $file_path" >&2
23
- return 1
24
- fi
25
-
26
- return 0
27
- }
28
-
29
- # 模拟 get_file_mtime 函数
30
- get_file_mtime() {
31
- local file_path="$1"
32
-
33
- if [[ ! -f "$file_path" ]]; then
34
- echo "-1" # 哨兵值
35
- return
36
- fi
37
-
38
- # 返回实际时间戳
39
- if stat -c %Y "$file_path" &>/dev/null; then
40
- stat -c %Y "$file_path"
41
- else
42
- stat -f %m "$file_path"
43
- fi
44
- }
45
-
46
- # 测试不存在的文件
47
- mtime=$(get_file_mtime "templates/nonexistent-file.md")
48
- if [[ "$mtime" == "-1" ]]; then
49
- echo "✅ 正确处理文件不存在(mtime = -1)"
50
- else
51
- echo "❌ 文件不存在处理错误:mtime = $mtime"
52
- exit 1
53
- fi
54
- EOF
55
-
56
- bash /tmp/test-nonexistent.sh
57
- rm /tmp/test-nonexistent.sh
58
-
59
- echo ""
60
- echo "✅ Bash 边界情况测试通过"
@@ -1,28 +0,0 @@
1
- #!/bin/bash
2
- set -euo pipefail
3
-
4
- echo "=== Phase 1 Bash 缓存测试 ==="
5
- echo ""
6
-
7
- # 测试 2.1: 功能测试
8
- echo "测试 2.1: 运行功能测试"
9
- bash test-preload-cache.sh
10
- echo ""
11
-
12
- # 测试 2.2: 性能测试
13
- echo "测试 2.2: 运行性能测试"
14
- bash bench-preload-cache.sh
15
- echo ""
16
-
17
- # 测试 2.3: Bash 版本检测
18
- echo "测试 2.3: Bash 版本检测"
19
- bash_version="${BASH_VERSION%%.*}"
20
- echo "当前 Bash 版本: $BASH_VERSION"
21
- if [[ "$bash_version" -ge 4 ]]; then
22
- echo "✅ 使用关联数组(Bash 4.0+)"
23
- else
24
- echo "✅ 使用线性数组(Bash 3.x 兼容)"
25
- fi
26
-
27
- echo ""
28
- echo "✅ Bash 缓存测试全部通过"