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,160 @@
1
+ /**
2
+ * init 命令 - 初始化小说项目
3
+ */
4
+ import chalk from 'chalk';
5
+ import path from 'path';
6
+ import fs from 'fs-extra';
7
+ import ora from 'ora';
8
+ import { execSync } from 'child_process';
9
+ import { getVersion } from '../version.js';
10
+ import { PluginManager } from '../plugins/manager.js';
11
+ import { getPackageRoot, getTemplateSourcePaths, getProjectPaths, DEFAULT_GITIGNORE, } from '../core/config.js';
12
+ export function registerInitCommand(program) {
13
+ program
14
+ .command('init')
15
+ .argument('[name]', '小说项目名称')
16
+ .option('--here', '在当前目录初始化')
17
+ .option('--plugins <names>', '预装插件,逗号分隔')
18
+ .option('--no-git', '跳过 Git 初始化')
19
+ .description('初始化一个新的小说项目')
20
+ .action(async (name, options) => {
21
+ const spinner = ora('正在初始化小说项目...').start();
22
+ try {
23
+ // 确定项目路径
24
+ let projectPath;
25
+ if (options.here) {
26
+ projectPath = process.cwd();
27
+ name = path.basename(projectPath);
28
+ }
29
+ else {
30
+ if (!name) {
31
+ spinner.fail('请提供项目名称或使用 --here 参数');
32
+ process.exit(1);
33
+ }
34
+ projectPath = path.join(process.cwd(), name);
35
+ if (await fs.pathExists(projectPath)) {
36
+ spinner.fail(`项目目录 "${name}" 已存在`);
37
+ process.exit(1);
38
+ }
39
+ await fs.ensureDir(projectPath);
40
+ }
41
+ // 创建基础项目结构
42
+ const paths = getProjectPaths(projectPath);
43
+ const baseDirs = [
44
+ paths.specify,
45
+ paths.specifyMemory,
46
+ paths.specifyTemplates,
47
+ paths.claude,
48
+ paths.commands,
49
+ paths.skills,
50
+ paths.stories,
51
+ paths.spec,
52
+ paths.tracking,
53
+ paths.knowledge,
54
+ ];
55
+ for (const dir of baseDirs) {
56
+ await fs.ensureDir(dir);
57
+ }
58
+ // 创建基础配置文件
59
+ const config = {
60
+ name,
61
+ type: 'novel',
62
+ ai: 'claude',
63
+ created: new Date().toISOString(),
64
+ version: getVersion(),
65
+ };
66
+ await fs.writeJson(paths.specifyConfig, config, { spaces: 2 });
67
+ // 从 novel-writer-skills 包复制模板文件
68
+ const templates = getTemplateSourcePaths();
69
+ // 复制命令文件
70
+ if (await fs.pathExists(templates.commands)) {
71
+ await fs.copy(templates.commands, paths.commands);
72
+ spinner.text = '已安装 Slash Commands...';
73
+ }
74
+ // 复制 Skills 文件
75
+ if (await fs.pathExists(templates.skills)) {
76
+ await fs.copy(templates.skills, paths.skills);
77
+ spinner.text = '已安装 Agent Skills...';
78
+ }
79
+ // 复制模板文件到 .specify/templates
80
+ if (await fs.pathExists(templates.all)) {
81
+ await fs.copy(templates.all, paths.specifyTemplates, { overwrite: false });
82
+ }
83
+ // 复制 memory 文件
84
+ if (await fs.pathExists(templates.memory)) {
85
+ await fs.copy(templates.memory, paths.specifyMemory);
86
+ }
87
+ // 复制追踪文件模板
88
+ if (await fs.pathExists(templates.tracking)) {
89
+ await fs.copy(templates.tracking, paths.tracking);
90
+ }
91
+ // 复制知识库模板(项目特定)
92
+ if (await fs.pathExists(templates.knowledge)) {
93
+ await fs.copy(templates.knowledge, paths.knowledge);
94
+ }
95
+ // 复制通用知识库系统
96
+ if (await fs.pathExists(templates.knowledgeBase)) {
97
+ await fs.copy(templates.knowledgeBase, paths.knowledgeBase);
98
+ spinner.text = '已安装知识库系统...';
99
+ }
100
+ // 如果指定了 --plugins,安装插件
101
+ if (options.plugins) {
102
+ spinner.text = '安装插件...';
103
+ const pluginNames = options.plugins.split(',').map((p) => p.trim());
104
+ const pluginManager = new PluginManager(projectPath);
105
+ const packageRoot = getPackageRoot();
106
+ for (const pluginName of pluginNames) {
107
+ const builtinPluginPath = path.join(packageRoot, 'plugins', pluginName);
108
+ if (await fs.pathExists(builtinPluginPath)) {
109
+ await pluginManager.installPlugin(pluginName, builtinPluginPath);
110
+ }
111
+ else {
112
+ console.log(chalk.yellow(`\n警告: 插件 "${pluginName}" 未找到`));
113
+ }
114
+ }
115
+ }
116
+ // Git 初始化
117
+ if (options.git !== false) {
118
+ try {
119
+ execSync('git init', { cwd: projectPath, stdio: 'ignore' });
120
+ await fs.writeFile(path.join(projectPath, '.gitignore'), DEFAULT_GITIGNORE);
121
+ execSync('git add .', { cwd: projectPath, stdio: 'ignore' });
122
+ execSync('git commit -m "初始化小说项目"', { cwd: projectPath, stdio: 'ignore' });
123
+ }
124
+ catch {
125
+ console.log(chalk.yellow('\n提示: Git 初始化失败,但项目已创建成功'));
126
+ }
127
+ }
128
+ spinner.succeed(chalk.green(`小说项目 "${name}" 创建成功!`));
129
+ // 显示后续步骤
130
+ console.log('\n' + chalk.cyan('接下来:'));
131
+ console.log(chalk.gray('─────────────────────────────'));
132
+ if (!options.here) {
133
+ console.log(` 1. ${chalk.white(`cd ${name}`)} - 进入项目目录`);
134
+ }
135
+ console.log(` 2. ${chalk.white('在 Claude Code 中打开项目')}`);
136
+ console.log(` 3. 使用以下斜杠命令开始创作:`);
137
+ console.log('\n' + chalk.yellow(' 📝 七步方法论:'));
138
+ console.log(` ${chalk.cyan('/constitution')} - 创建创作宪法,定义核心原则`);
139
+ console.log(` ${chalk.cyan('/specify')} - 定义故事规格,明确要创造什么`);
140
+ console.log(` ${chalk.cyan('/clarify')} - 澄清关键决策点,明确模糊之处`);
141
+ console.log(` ${chalk.cyan('/plan')} - 制定技术方案,决定如何创作`);
142
+ console.log(` ${chalk.cyan('/tasks')} - 分解执行任务,生成可执行清单`);
143
+ console.log(` ${chalk.cyan('/write')} - AI 辅助写作章节内容`);
144
+ console.log(` ${chalk.cyan('/analyze')} - 综合验证分析,确保质量一致`);
145
+ console.log('\n' + chalk.yellow(' 📊 追踪管理命令:'));
146
+ console.log(` ${chalk.cyan('/track-init')} - 初始化追踪系统`);
147
+ console.log(` ${chalk.cyan('/track')} - 综合追踪更新`);
148
+ console.log(` ${chalk.cyan('/plot-check')} - 检查情节一致性`);
149
+ console.log(` ${chalk.cyan('/timeline')} - 管理故事时间线`);
150
+ console.log('\n' + chalk.gray('Agent Skills 会自动激活,无需手动调用'));
151
+ console.log(chalk.dim('提示: 斜杠命令在 Claude Code 内部使用,不是在终端中'));
152
+ }
153
+ catch (error) {
154
+ spinner.fail(chalk.red('项目初始化失败'));
155
+ console.error(error);
156
+ process.exit(1);
157
+ }
158
+ });
159
+ }
160
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * plugin 系列命令 - 插件管理
3
+ */
4
+ import { Command } from '@commander-js/extra-typings';
5
+ export declare function registerPluginCommands(program: Command): void;
6
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/commands/plugin.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAUtD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4I7D"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * plugin 系列命令 - 插件管理
3
+ */
4
+ import chalk from 'chalk';
5
+ import path from 'path';
6
+ import fs from 'fs-extra';
7
+ import ora from 'ora';
8
+ import { PluginManager } from '../plugins/manager.js';
9
+ import { ensureProjectRoot, getProjectInfo } from '../utils/project.js';
10
+ import { getPackageRoot } from '../core/config.js';
11
+ import { ProjectNotFoundError } from '../core/errors.js';
12
+ export function registerPluginCommands(program) {
13
+ // plugin 帮助命令
14
+ program
15
+ .command('plugin')
16
+ .description('插件管理 (使用 plugin:list, plugin:add, plugin:remove)')
17
+ .action(() => {
18
+ console.log(chalk.cyan('\n📦 插件管理命令:\n'));
19
+ console.log(' novelws plugin:list - 列出已安装的插件');
20
+ console.log(' novelws plugin:add <name> - 安装插件');
21
+ console.log(' novelws plugin:remove <name> - 移除插件');
22
+ console.log('\n' + chalk.gray('可用插件:'));
23
+ console.log(' authentic-voice - 真实人声写作插件');
24
+ });
25
+ // plugin:list
26
+ program
27
+ .command('plugin:list')
28
+ .description('列出已安装的插件')
29
+ .action(async () => {
30
+ try {
31
+ const projectPath = await ensureProjectRoot();
32
+ const projectInfo = await getProjectInfo(projectPath);
33
+ if (!projectInfo) {
34
+ console.log(chalk.red('❌ 无法读取项目信息'));
35
+ process.exit(1);
36
+ }
37
+ const pluginManager = new PluginManager(projectPath);
38
+ const plugins = await pluginManager.listPlugins();
39
+ console.log(chalk.cyan('\n📦 已安装的插件\n'));
40
+ console.log(chalk.gray(`项目: ${path.basename(projectPath)}\n`));
41
+ if (plugins.length === 0) {
42
+ console.log(chalk.yellow('暂无插件'));
43
+ console.log(chalk.gray('\n使用 "novelws plugin:add <name>" 安装插件'));
44
+ console.log(chalk.gray('可用插件: authentic-voice\n'));
45
+ return;
46
+ }
47
+ for (const plugin of plugins) {
48
+ console.log(chalk.yellow(` ${plugin.name}`) + ` (v${plugin.version})`);
49
+ console.log(chalk.gray(` ${plugin.description}`));
50
+ if (plugin.commands && plugin.commands.length > 0) {
51
+ console.log(chalk.gray(` 命令: ${plugin.commands.map(c => `/${c.id}`).join(', ')}`));
52
+ }
53
+ if (plugin.skills && plugin.skills.length > 0) {
54
+ console.log(chalk.gray(` Skills: ${plugin.skills.map(s => s.id).join(', ')}`));
55
+ }
56
+ console.log('');
57
+ }
58
+ }
59
+ catch (error) {
60
+ if (error instanceof ProjectNotFoundError) {
61
+ console.log(chalk.red(`\n❌ ${error.message}`));
62
+ console.log(chalk.gray(' 请在项目根目录运行此命令\n'));
63
+ process.exit(1);
64
+ }
65
+ console.error(chalk.red('❌ 列出插件失败:'), error);
66
+ process.exit(1);
67
+ }
68
+ });
69
+ // plugin:add
70
+ program
71
+ .command('plugin:add <name>')
72
+ .description('安装插件')
73
+ .action(async (name) => {
74
+ try {
75
+ const projectPath = await ensureProjectRoot();
76
+ const projectInfo = await getProjectInfo(projectPath);
77
+ if (!projectInfo) {
78
+ console.log(chalk.red('❌ 无法读取项目信息'));
79
+ process.exit(1);
80
+ }
81
+ console.log(chalk.cyan('\n📦 NovelWrite 插件安装\n'));
82
+ console.log(chalk.gray(`项目版本: ${projectInfo.version}\n`));
83
+ const packageRoot = getPackageRoot();
84
+ const builtinPluginPath = path.join(packageRoot, 'plugins', name);
85
+ if (!await fs.pathExists(builtinPluginPath)) {
86
+ console.log(chalk.red(`❌ 插件 ${name} 未找到\n`));
87
+ console.log(chalk.gray('可用插件:'));
88
+ console.log(chalk.gray(' - authentic-voice (真实人声插件)'));
89
+ process.exit(1);
90
+ }
91
+ const spinner = ora('正在安装插件...').start();
92
+ const pluginManager = new PluginManager(projectPath);
93
+ await pluginManager.installPlugin(name, builtinPluginPath);
94
+ spinner.succeed(chalk.green('插件安装成功!\n'));
95
+ }
96
+ catch (error) {
97
+ if (error instanceof ProjectNotFoundError) {
98
+ console.log(chalk.red(`\n❌ ${error.message}`));
99
+ console.log(chalk.gray(' 请在项目根目录运行此命令\n'));
100
+ process.exit(1);
101
+ }
102
+ console.log(chalk.red('\n❌ 安装插件失败'));
103
+ console.error(chalk.gray(error.message || error));
104
+ console.log('');
105
+ process.exit(1);
106
+ }
107
+ });
108
+ // plugin:remove
109
+ program
110
+ .command('plugin:remove <name>')
111
+ .description('移除插件')
112
+ .action(async (name) => {
113
+ try {
114
+ const projectPath = await ensureProjectRoot();
115
+ const pluginManager = new PluginManager(projectPath);
116
+ console.log(chalk.cyan('\n📦 NovelWrite 插件移除\n'));
117
+ console.log(chalk.gray(`准备移除插件: ${name}\n`));
118
+ const spinner = ora('正在移除插件...').start();
119
+ await pluginManager.removePlugin(name);
120
+ spinner.succeed(chalk.green('插件移除成功!\n'));
121
+ }
122
+ catch (error) {
123
+ if (error instanceof ProjectNotFoundError) {
124
+ console.log(chalk.red(`\n❌ ${error.message}`));
125
+ console.log(chalk.gray(' 请在项目根目录运行此命令\n'));
126
+ process.exit(1);
127
+ }
128
+ console.log(chalk.red('\n❌ 移除插件失败'));
129
+ console.error(chalk.gray(error.message || error));
130
+ console.log('');
131
+ process.exit(1);
132
+ }
133
+ });
134
+ }
135
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/commands/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * upgrade 命令 - 升级现有项目到最新版本
3
+ */
4
+ import { Command } from '@commander-js/extra-typings';
5
+ export declare function registerUpgradeCommand(program: Command): void;
6
+ //# sourceMappingURL=upgrade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAUtD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4F7D"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * upgrade 命令 - 升级现有项目到最新版本
3
+ */
4
+ import chalk from 'chalk';
5
+ import fs from 'fs-extra';
6
+ import ora from 'ora';
7
+ import { getVersion } from '../version.js';
8
+ import { getProjectPaths, getTemplateSourcePaths, } from '../core/config.js';
9
+ export function registerUpgradeCommand(program) {
10
+ program
11
+ .command('upgrade')
12
+ .option('--commands', '更新命令文件')
13
+ .option('--skills', '更新 Skills 文件')
14
+ .option('--knowledge-base', '更新知识库系统')
15
+ .option('--all', '更新所有内容')
16
+ .option('-y, --yes', '跳过确认提示')
17
+ .description('升级现有项目到最新版本')
18
+ .action(async (options) => {
19
+ const projectPath = process.cwd();
20
+ const paths = getProjectPaths(projectPath);
21
+ const templates = getTemplateSourcePaths();
22
+ try {
23
+ if (!await fs.pathExists(paths.specifyConfig)) {
24
+ console.log(chalk.red('❌ 当前目录不是 novel-writer-skills 项目'));
25
+ process.exit(1);
26
+ }
27
+ const config = await fs.readJson(paths.specifyConfig);
28
+ const projectVersion = config.version || '未知';
29
+ console.log(chalk.cyan('\n📦 NovelWrite 项目升级\n'));
30
+ console.log(chalk.gray(`当前版本: ${projectVersion}`));
31
+ console.log(chalk.gray(`目标版本: ${getVersion()}\n`));
32
+ let updateCommands = options.all || options.commands || false;
33
+ let updateSkills = options.all || options.skills || false;
34
+ let updateKnowledgeBase = options.all || options.knowledgeBase || false;
35
+ if (!updateCommands && !updateSkills && !updateKnowledgeBase) {
36
+ updateCommands = true;
37
+ updateSkills = true;
38
+ updateKnowledgeBase = true;
39
+ }
40
+ if (!options.yes) {
41
+ const inquirer = (await import('inquirer')).default;
42
+ const answers = await inquirer.prompt([
43
+ {
44
+ type: 'confirm',
45
+ name: 'proceed',
46
+ message: '确认执行升级?',
47
+ default: true,
48
+ },
49
+ ]);
50
+ if (!answers.proceed) {
51
+ console.log(chalk.yellow('\n升级已取消'));
52
+ process.exit(0);
53
+ }
54
+ }
55
+ const spinner = ora('正在升级项目...').start();
56
+ if (updateCommands) {
57
+ spinner.text = '更新 Slash Commands...';
58
+ if (await fs.pathExists(templates.commands)) {
59
+ await fs.copy(templates.commands, paths.commands, { overwrite: true });
60
+ }
61
+ }
62
+ if (updateSkills) {
63
+ spinner.text = '更新 Agent Skills...';
64
+ if (await fs.pathExists(templates.skills)) {
65
+ await fs.copy(templates.skills, paths.skills, { overwrite: true });
66
+ }
67
+ }
68
+ if (updateKnowledgeBase) {
69
+ spinner.text = '更新知识库系统...';
70
+ if (await fs.pathExists(templates.knowledgeBase)) {
71
+ await fs.copy(templates.knowledgeBase, paths.knowledgeBase, { overwrite: true });
72
+ }
73
+ }
74
+ config.version = getVersion();
75
+ await fs.writeJson(paths.specifyConfig, config, { spaces: 2 });
76
+ spinner.succeed(chalk.green('升级完成!\n'));
77
+ console.log(chalk.cyan('✨ 升级内容:'));
78
+ if (updateCommands)
79
+ console.log(' • Slash Commands 已更新');
80
+ if (updateSkills)
81
+ console.log(' • Agent Skills 已更新');
82
+ if (updateKnowledgeBase)
83
+ console.log(' • 知识库系统 已更新(包括 styles/ 和 requirements/)');
84
+ console.log(` • 版本号: ${projectVersion} → ${getVersion()}`);
85
+ }
86
+ catch (error) {
87
+ console.error(chalk.red('\n❌ 升级失败:'), error);
88
+ process.exit(1);
89
+ }
90
+ });
91
+ }
92
+ //# sourceMappingURL=upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,eAAe,EACf,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC;SAC9B,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC;SAClC,MAAM,CAAC,kBAAkB,EAAE,SAAS,CAAC;SACrC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC;SACzB,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC;SAC7B,WAAW,CAAC,aAAa,CAAC;SAC1B,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,sBAAsB,EAAE,CAAC;QAE3C,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACtD,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC;YAE9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,cAAc,EAAE,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;YAEnD,IAAI,cAAc,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC;YAC9D,IAAI,YAAY,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;YAC1D,IAAI,mBAAmB,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,aAAa,IAAI,KAAK,CAAC;YAExE,IAAI,CAAC,cAAc,IAAI,CAAC,YAAY,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC7D,cAAc,GAAG,IAAI,CAAC;gBACtB,YAAY,GAAG,IAAI,CAAC;gBACpB,mBAAmB,GAAG,IAAI,CAAC;YAC7B,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACjB,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;gBACpD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;oBACpC;wBACE,IAAI,EAAE,SAAS;wBACf,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,SAAS;wBAClB,OAAO,EAAE,IAAI;qBACd;iBACF,CAAC,CAAC;gBAEH,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;oBACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;oBACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC;YAEzC,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,GAAG,sBAAsB,CAAC;gBACtC,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5C,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACzE,CAAC;YACH,CAAC;YAED,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO,CAAC,IAAI,GAAG,oBAAoB,CAAC;gBACpC,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC1C,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC;YAED,IAAI,mBAAmB,EAAE,CAAC;gBACxB,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC;gBAC5B,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC;oBACjD,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACnF,CAAC;YACH,CAAC;YAED,MAAM,CAAC,OAAO,GAAG,UAAU,EAAE,CAAC;YAC9B,MAAM,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAE/D,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YAExC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YACnC,IAAI,cAAc;gBAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YAC1D,IAAI,YAAY;gBAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACtD,IAAI,mBAAmB;gBAAE,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;YAClF,OAAO,CAAC,GAAG,CAAC,YAAY,cAAc,MAAM,UAAU,EAAE,EAAE,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * 统一配置管理
3
+ *
4
+ * 集中管理所有路径常量、目录名、默认值,
5
+ * 消除散落在各处的硬编码字符串。
6
+ */
7
+ /** 目录名常量 */
8
+ export declare const DIRS: {
9
+ readonly CLAUDE: ".claude";
10
+ readonly SPECIFY: ".specify";
11
+ readonly STORIES: "stories";
12
+ readonly SPEC: "spec";
13
+ readonly COMMANDS: "commands";
14
+ readonly SKILLS: "skills";
15
+ readonly KNOWLEDGE_BASE: "knowledge-base";
16
+ readonly PLUGINS: "plugins";
17
+ readonly MEMORY: "memory";
18
+ readonly TEMPLATES: "templates";
19
+ readonly TRACKING: "tracking";
20
+ readonly KNOWLEDGE: "knowledge";
21
+ };
22
+ /** 文件名常量 */
23
+ export declare const FILES: {
24
+ readonly CONFIG: "config.json";
25
+ readonly PLUGIN_REGISTRY: "plugins.json";
26
+ readonly PLUGIN_CONFIG: "config.yaml";
27
+ readonly GITIGNORE: ".gitignore";
28
+ };
29
+ /** 默认 .gitignore 内容 */
30
+ export declare const DEFAULT_GITIGNORE = "# \u4E34\u65F6\u6587\u4EF6\n*.tmp\n*.swp\n.DS_Store\n\n# \u7F16\u8F91\u5668\u914D\u7F6E\n.vscode/\n.idea/\n\n# AI \u7F13\u5B58\n.ai-cache/\n\n# \u8282\u70B9\u6A21\u5757\nnode_modules/\n";
31
+ /**
32
+ * 获取 novel-writer-skills 包的根目录
33
+ * 从 dist/core/config.js 或 src/core/config.ts 向上解析
34
+ */
35
+ export declare function getPackageRoot(): string;
36
+ /** 获取模板目录路径 */
37
+ export declare function getTemplatesDir(): string;
38
+ /** 获取内置插件目录路径 */
39
+ export declare function getBuiltinPluginsDir(): string;
40
+ /**
41
+ * 获取项目内各目录的路径
42
+ */
43
+ export declare function getProjectPaths(projectRoot: string): {
44
+ root: string;
45
+ specify: string;
46
+ specifyConfig: string;
47
+ specifyMemory: string;
48
+ specifyTemplates: string;
49
+ pluginRegistry: string;
50
+ claude: string;
51
+ commands: string;
52
+ skills: string;
53
+ knowledgeBase: string;
54
+ stories: string;
55
+ spec: string;
56
+ tracking: string;
57
+ knowledge: string;
58
+ plugins: string;
59
+ };
60
+ /**
61
+ * 获取模板源路径映射(用于 init 和 upgrade)
62
+ */
63
+ export declare function getTemplateSourcePaths(): {
64
+ commands: string;
65
+ skills: string;
66
+ knowledgeBase: string;
67
+ memory: string;
68
+ tracking: string;
69
+ knowledge: string;
70
+ all: string;
71
+ };
72
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA6CH,YAAY;AACZ,eAAO,MAAM,IAAI;;;;;;;;;;;;;CAaP,CAAC;AAEX,YAAY;AACZ,eAAO,MAAM,KAAK;;;;;CAKR,CAAC;AAEX,uBAAuB;AACvB,eAAO,MAAM,iBAAiB,8LAc7B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,eAAe;AACf,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,iBAAiB;AACjB,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM;;;;;;;;;;;;;;;;EAkBlD;AAED;;GAEG;AACH,wBAAgB,sBAAsB;;;;;;;;EAWrC"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * 统一配置管理
3
+ *
4
+ * 集中管理所有路径常量、目录名、默认值,
5
+ * 消除散落在各处的硬编码字符串。
6
+ */
7
+ import path from 'path';
8
+ import fs from 'fs';
9
+ /**
10
+ * 查找包根目录(包含 package.json 的最近祖先目录)
11
+ * 兼容 ESM 和 CJS,不依赖 import.meta.url 或 __dirname
12
+ */
13
+ function findPackageRoot(startDir) {
14
+ let dir = startDir;
15
+ while (true) {
16
+ if (fs.existsSync(path.join(dir, 'package.json'))) {
17
+ return dir;
18
+ }
19
+ const parent = path.dirname(dir);
20
+ if (parent === dir) {
21
+ // 到达文件系统根目录仍未找到,回退
22
+ return startDir;
23
+ }
24
+ dir = parent;
25
+ }
26
+ }
27
+ /**
28
+ * 获取当前模块所在目录
29
+ * CJS: 使用 __dirname(Jest 环境)
30
+ * ESM: 使用 process.argv[1](入口脚本路径,如 dist/cli.js)
31
+ * 最终回退: process.cwd()
32
+ */
33
+ function getCurrentDir() {
34
+ // CJS 环境(Jest)
35
+ if (typeof __dirname !== 'undefined') {
36
+ return __dirname;
37
+ }
38
+ // ESM 环境:从入口脚本路径推断
39
+ if (process.argv[1]) {
40
+ return path.dirname(path.resolve(process.argv[1]));
41
+ }
42
+ return process.cwd();
43
+ }
44
+ // 从当前模块位置向上查找包根目录
45
+ const _packageRoot = findPackageRoot(getCurrentDir());
46
+ /** 目录名常量 */
47
+ export const DIRS = {
48
+ CLAUDE: '.claude',
49
+ SPECIFY: '.specify',
50
+ STORIES: 'stories',
51
+ SPEC: 'spec',
52
+ COMMANDS: 'commands',
53
+ SKILLS: 'skills',
54
+ KNOWLEDGE_BASE: 'knowledge-base',
55
+ PLUGINS: 'plugins',
56
+ MEMORY: 'memory',
57
+ TEMPLATES: 'templates',
58
+ TRACKING: 'tracking',
59
+ KNOWLEDGE: 'knowledge',
60
+ };
61
+ /** 文件名常量 */
62
+ export const FILES = {
63
+ CONFIG: 'config.json',
64
+ PLUGIN_REGISTRY: 'plugins.json',
65
+ PLUGIN_CONFIG: 'config.yaml',
66
+ GITIGNORE: '.gitignore',
67
+ };
68
+ /** 默认 .gitignore 内容 */
69
+ export const DEFAULT_GITIGNORE = `# 临时文件
70
+ *.tmp
71
+ *.swp
72
+ .DS_Store
73
+
74
+ # 编辑器配置
75
+ .vscode/
76
+ .idea/
77
+
78
+ # AI 缓存
79
+ .ai-cache/
80
+
81
+ # 节点模块
82
+ node_modules/
83
+ `;
84
+ /**
85
+ * 获取 novel-writer-skills 包的根目录
86
+ * 从 dist/core/config.js 或 src/core/config.ts 向上解析
87
+ */
88
+ export function getPackageRoot() {
89
+ return _packageRoot;
90
+ }
91
+ /** 获取模板目录路径 */
92
+ export function getTemplatesDir() {
93
+ return path.join(getPackageRoot(), DIRS.TEMPLATES);
94
+ }
95
+ /** 获取内置插件目录路径 */
96
+ export function getBuiltinPluginsDir() {
97
+ return path.join(getPackageRoot(), DIRS.PLUGINS);
98
+ }
99
+ /**
100
+ * 获取项目内各目录的路径
101
+ */
102
+ export function getProjectPaths(projectRoot) {
103
+ return {
104
+ root: projectRoot,
105
+ specify: path.join(projectRoot, DIRS.SPECIFY),
106
+ specifyConfig: path.join(projectRoot, DIRS.SPECIFY, FILES.CONFIG),
107
+ specifyMemory: path.join(projectRoot, DIRS.SPECIFY, DIRS.MEMORY),
108
+ specifyTemplates: path.join(projectRoot, DIRS.SPECIFY, DIRS.TEMPLATES),
109
+ pluginRegistry: path.join(projectRoot, DIRS.SPECIFY, FILES.PLUGIN_REGISTRY),
110
+ claude: path.join(projectRoot, DIRS.CLAUDE),
111
+ commands: path.join(projectRoot, DIRS.CLAUDE, DIRS.COMMANDS),
112
+ skills: path.join(projectRoot, DIRS.CLAUDE, DIRS.SKILLS),
113
+ knowledgeBase: path.join(projectRoot, DIRS.CLAUDE, DIRS.KNOWLEDGE_BASE),
114
+ stories: path.join(projectRoot, DIRS.STORIES),
115
+ spec: path.join(projectRoot, DIRS.SPEC),
116
+ tracking: path.join(projectRoot, DIRS.SPEC, DIRS.TRACKING),
117
+ knowledge: path.join(projectRoot, DIRS.SPEC, DIRS.KNOWLEDGE),
118
+ plugins: path.join(projectRoot, DIRS.PLUGINS),
119
+ };
120
+ }
121
+ /**
122
+ * 获取模板源路径映射(用于 init 和 upgrade)
123
+ */
124
+ export function getTemplateSourcePaths() {
125
+ const templatesDir = getTemplatesDir();
126
+ return {
127
+ commands: path.join(templatesDir, DIRS.COMMANDS),
128
+ skills: path.join(templatesDir, DIRS.SKILLS),
129
+ knowledgeBase: path.join(templatesDir, DIRS.KNOWLEDGE_BASE),
130
+ memory: path.join(templatesDir, DIRS.MEMORY),
131
+ tracking: path.join(templatesDir, DIRS.TRACKING),
132
+ knowledge: path.join(templatesDir, DIRS.KNOWLEDGE),
133
+ all: templatesDir,
134
+ };
135
+ }
136
+ //# sourceMappingURL=config.js.map