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 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * 自定义错误类型层级
3
+ *
4
+ * 所有 NovelWriter 错误继承自 NovelWriterError,
5
+ * CLI 层统一捕获并格式化输出。
6
+ */
7
+ export declare class NovelWriterError extends Error {
8
+ readonly code: string;
9
+ readonly exitCode: number;
10
+ constructor(message: string, code: string, exitCode?: number);
11
+ }
12
+ /** 不在项目目录中 */
13
+ export declare class ProjectNotFoundError extends NovelWriterError {
14
+ constructor(dir?: string);
15
+ }
16
+ /** 项目已存在 */
17
+ export declare class ProjectExistsError extends NovelWriterError {
18
+ constructor(name: string);
19
+ }
20
+ /** 插件不存在 */
21
+ export declare class PluginNotFoundError extends NovelWriterError {
22
+ constructor(name: string);
23
+ }
24
+ /** 插件校验失败 */
25
+ export declare class PluginValidationError extends NovelWriterError {
26
+ readonly errors: string[];
27
+ readonly warnings: string[];
28
+ constructor(name: string, errors: string[], warnings?: string[]);
29
+ }
30
+ /** 插件安装失败 */
31
+ export declare class PluginInstallError extends NovelWriterError {
32
+ readonly source: string;
33
+ constructor(name: string, source: string, reason?: string);
34
+ }
35
+ /** 网络请求失败 */
36
+ export declare class NetworkError extends NovelWriterError {
37
+ readonly url: string;
38
+ readonly statusCode?: number;
39
+ constructor(url: string, statusCode?: number, reason?: string);
40
+ }
41
+ /** 平台不兼容 */
42
+ export declare class PlatformError extends NovelWriterError {
43
+ constructor(message: string);
44
+ }
45
+ /** 配置文件损坏或缺失 */
46
+ export declare class ConfigError extends NovelWriterError {
47
+ readonly configPath: string;
48
+ constructor(configPath: string, reason?: string);
49
+ }
50
+ /** 插件已安装 */
51
+ export declare class PluginAlreadyInstalledError extends NovelWriterError {
52
+ constructor(name: string);
53
+ }
54
+ /**
55
+ * CLI 全局错误处理
56
+ * 将 NovelWriterError 格式化为用户友好的输出,非预期错误输出堆栈
57
+ */
58
+ export declare function handleError(error: unknown): never;
59
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU;CAMhE;AAED,cAAc;AACd,qBAAa,oBAAqB,SAAQ,gBAAgB;gBAC5C,GAAG,CAAC,EAAE,MAAM;CAMzB;AAED,YAAY;AACZ,qBAAa,kBAAmB,SAAQ,gBAAgB;gBAC1C,IAAI,EAAE,MAAM;CAGzB;AAED,YAAY;AACZ,qBAAa,mBAAoB,SAAQ,gBAAgB;gBAC3C,IAAI,EAAE,MAAM;CAGzB;AAED,aAAa;AACb,qBAAa,qBAAsB,SAAQ,gBAAgB;IACzD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;gBAEhB,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,GAAE,MAAM,EAAO;CAKpE;AAED,aAAa;AACb,qBAAa,kBAAmB,SAAQ,gBAAgB;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAO1D;AAED,aAAa;AACb,qBAAa,YAAa,SAAQ,gBAAgB;IAChD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;gBAEjB,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAU9D;AAED,YAAY;AACZ,qBAAa,aAAc,SAAQ,gBAAgB;gBACrC,OAAO,EAAE,MAAM;CAG5B;AAED,gBAAgB;AAChB,qBAAa,WAAY,SAAQ,gBAAgB;IAC/C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAOhD;AAED,YAAY;AACZ,qBAAa,2BAA4B,SAAQ,gBAAgB;gBACnD,IAAI,EAAE,MAAM;CAGzB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAyBjD"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * 自定义错误类型层级
3
+ *
4
+ * 所有 NovelWriter 错误继承自 NovelWriterError,
5
+ * CLI 层统一捕获并格式化输出。
6
+ */
7
+ export class NovelWriterError extends Error {
8
+ code;
9
+ exitCode;
10
+ constructor(message, code, exitCode = 1) {
11
+ super(message);
12
+ this.name = this.constructor.name;
13
+ this.code = code;
14
+ this.exitCode = exitCode;
15
+ }
16
+ }
17
+ /** 不在项目目录中 */
18
+ export class ProjectNotFoundError extends NovelWriterError {
19
+ constructor(dir) {
20
+ const msg = dir
21
+ ? `目录 "${dir}" 不是 novel-writer-skills 项目`
22
+ : '当前目录不是 novel-writer-skills 项目,请在项目根目录运行此命令';
23
+ super(msg, 'PROJECT_NOT_FOUND');
24
+ }
25
+ }
26
+ /** 项目已存在 */
27
+ export class ProjectExistsError extends NovelWriterError {
28
+ constructor(name) {
29
+ super(`项目目录 "${name}" 已存在`, 'PROJECT_EXISTS');
30
+ }
31
+ }
32
+ /** 插件不存在 */
33
+ export class PluginNotFoundError extends NovelWriterError {
34
+ constructor(name) {
35
+ super(`插件 "${name}" 未找到`, 'PLUGIN_NOT_FOUND');
36
+ }
37
+ }
38
+ /** 插件校验失败 */
39
+ export class PluginValidationError extends NovelWriterError {
40
+ errors;
41
+ warnings;
42
+ constructor(name, errors, warnings = []) {
43
+ super(`插件 "${name}" 验证失败: ${errors.join(', ')}`, 'PLUGIN_VALIDATION_FAILED');
44
+ this.errors = errors;
45
+ this.warnings = warnings;
46
+ }
47
+ }
48
+ /** 插件安装失败 */
49
+ export class PluginInstallError extends NovelWriterError {
50
+ source;
51
+ constructor(name, source, reason) {
52
+ const msg = reason
53
+ ? `插件 "${name}" 安装失败 (来源: ${source}): ${reason}`
54
+ : `插件 "${name}" 安装失败 (来源: ${source})`;
55
+ super(msg, 'PLUGIN_INSTALL_FAILED');
56
+ this.source = source;
57
+ }
58
+ }
59
+ /** 网络请求失败 */
60
+ export class NetworkError extends NovelWriterError {
61
+ url;
62
+ statusCode;
63
+ constructor(url, statusCode, reason) {
64
+ const msg = reason
65
+ ? `网络请求失败 (${url}): ${reason}`
66
+ : statusCode
67
+ ? `网络请求失败 (${url}): HTTP ${statusCode}`
68
+ : `网络请求失败 (${url})`;
69
+ super(msg, 'NETWORK_ERROR');
70
+ this.url = url;
71
+ this.statusCode = statusCode;
72
+ }
73
+ }
74
+ /** 平台不兼容 */
75
+ export class PlatformError extends NovelWriterError {
76
+ constructor(message) {
77
+ super(message, 'PLATFORM_ERROR');
78
+ }
79
+ }
80
+ /** 配置文件损坏或缺失 */
81
+ export class ConfigError extends NovelWriterError {
82
+ configPath;
83
+ constructor(configPath, reason) {
84
+ const msg = reason
85
+ ? `配置文件错误 (${configPath}): ${reason}`
86
+ : `配置文件错误: ${configPath}`;
87
+ super(msg, 'CONFIG_ERROR');
88
+ this.configPath = configPath;
89
+ }
90
+ }
91
+ /** 插件已安装 */
92
+ export class PluginAlreadyInstalledError extends NovelWriterError {
93
+ constructor(name) {
94
+ super(`插件 "${name}" 已安装。如需更新请使用 plugin:update`, 'PLUGIN_ALREADY_INSTALLED');
95
+ }
96
+ }
97
+ /**
98
+ * CLI 全局错误处理
99
+ * 将 NovelWriterError 格式化为用户友好的输出,非预期错误输出堆栈
100
+ */
101
+ export function handleError(error) {
102
+ if (error instanceof NovelWriterError) {
103
+ console.error(`\n❌ ${error.message}`);
104
+ if (error instanceof PluginValidationError && error.errors.length > 0) {
105
+ for (const err of error.errors) {
106
+ console.error(` - ${err}`);
107
+ }
108
+ }
109
+ process.exit(error.exitCode);
110
+ }
111
+ if (error instanceof Error) {
112
+ // Commander.js 的 exitOverride 错误
113
+ if (error.message === '(outputHelp)' || error.exitCode === 0) {
114
+ process.exit(0);
115
+ }
116
+ console.error(`\n❌ 未预期的错误: ${error.message}`);
117
+ if (process.env.DEBUG) {
118
+ console.error(error.stack);
119
+ }
120
+ process.exit(1);
121
+ }
122
+ console.error('\n❌ 未知错误:', error);
123
+ process.exit(1);
124
+ }
125
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * 跨平台工具
3
+ *
4
+ * 统一 tar 解压逻辑(Windows PowerShell / Unix tar),
5
+ * 提供可执行权限设置、临时目录管理等工具。
6
+ */
7
+ /**
8
+ * 解压 tarball 文件
9
+ * Windows 使用 PowerShell 的 tar 命令,Unix 使用系统 tar
10
+ */
11
+ export declare function extractTarball(tarballPath: string, extractPath: string, options?: {
12
+ stripComponents?: number;
13
+ }): Promise<void>;
14
+ /**
15
+ * 设置文件可执行权限
16
+ * Unix 上设置 0o755,Windows 上跳过(无需此操作)
17
+ */
18
+ export declare function setExecutable(filePath: string): void;
19
+ /**
20
+ * 创建临时目录
21
+ */
22
+ export declare function createTempDir(prefix?: string): Promise<string>;
23
+ /**
24
+ * 清理临时目录
25
+ */
26
+ export declare function cleanupTempDir(dir: string): Promise<void>;
27
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/core/platform.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH;;;GAGG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;IAAE,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GACrC,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAapD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,GAAE,MAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAK5E;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM/D"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * 跨平台工具
3
+ *
4
+ * 统一 tar 解压逻辑(Windows PowerShell / Unix tar),
5
+ * 提供可执行权限设置、临时目录管理等工具。
6
+ */
7
+ import { execSync } from 'child_process';
8
+ import fs from 'fs-extra';
9
+ import os from 'os';
10
+ import path from 'path';
11
+ import { PlatformError } from './errors.js';
12
+ /**
13
+ * 解压 tarball 文件
14
+ * Windows 使用 PowerShell 的 tar 命令,Unix 使用系统 tar
15
+ */
16
+ export async function extractTarball(tarballPath, extractPath, options) {
17
+ await fs.ensureDir(extractPath);
18
+ const strip = options?.stripComponents ?? 0;
19
+ const isWindows = process.platform === 'win32';
20
+ try {
21
+ if (isWindows) {
22
+ // Windows: 使用 tar 命令(Windows 10+ 内置)
23
+ const stripArg = strip > 0 ? `--strip-components=${strip}` : '';
24
+ const cmd = `tar -xzf "${tarballPath}" -C "${extractPath}" ${stripArg}`.trim();
25
+ execSync(cmd, { stdio: 'ignore' });
26
+ }
27
+ else {
28
+ // Unix: 使用系统 tar
29
+ const stripArg = strip > 0 ? `--strip-components=${strip}` : '';
30
+ const cmd = `tar -xzf "${tarballPath}" -C "${extractPath}" ${stripArg}`.trim();
31
+ execSync(cmd, { stdio: 'ignore' });
32
+ }
33
+ }
34
+ catch (error) {
35
+ throw new PlatformError(`解压 tarball 失败: ${tarballPath} → ${extractPath}` +
36
+ (error instanceof Error ? `: ${error.message}` : ''));
37
+ }
38
+ }
39
+ /**
40
+ * 设置文件可执行权限
41
+ * Unix 上设置 0o755,Windows 上跳过(无需此操作)
42
+ */
43
+ export function setExecutable(filePath) {
44
+ if (process.platform === 'win32') {
45
+ return;
46
+ }
47
+ try {
48
+ fs.chmodSync(filePath, 0o755);
49
+ }
50
+ catch (error) {
51
+ throw new PlatformError(`设置可执行权限失败: ${filePath}` +
52
+ (error instanceof Error ? `: ${error.message}` : ''));
53
+ }
54
+ }
55
+ /**
56
+ * 创建临时目录
57
+ */
58
+ export async function createTempDir(prefix = 'nws-') {
59
+ const tmpBase = os.tmpdir();
60
+ const tmpDir = path.join(tmpBase, `${prefix}${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);
61
+ await fs.ensureDir(tmpDir);
62
+ return tmpDir;
63
+ }
64
+ /**
65
+ * 清理临时目录
66
+ */
67
+ export async function cleanupTempDir(dir) {
68
+ try {
69
+ await fs.remove(dir);
70
+ }
71
+ catch {
72
+ // 清理失败不阻塞主流程
73
+ }
74
+ }
75
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/core/platform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * 模板引擎
3
+ *
4
+ * 封装模板复制逻辑,供 init 和 upgrade 命令使用。
5
+ */
6
+ export interface CopyOptions {
7
+ /** 是否覆盖已存在的文件,默认 false */
8
+ overwrite?: boolean;
9
+ /** 过滤函数,返回 false 跳过该文件 */
10
+ filter?: (src: string) => boolean;
11
+ }
12
+ export interface CopyResult {
13
+ /** 已复制的文件数 */
14
+ copied: number;
15
+ /** 已跳过的文件数(已存在且未覆盖) */
16
+ skipped: number;
17
+ }
18
+ /**
19
+ * 复制模板目录
20
+ * 递归复制 source 下所有文件到 dest
21
+ */
22
+ export declare function copyTemplates(source: string, dest: string, options?: CopyOptions): Promise<CopyResult>;
23
+ /**
24
+ * 复制单个模板文件
25
+ * 返回 true 表示已复制,false 表示已跳过
26
+ */
27
+ export declare function copyTemplateFile(source: string, dest: string, options?: CopyOptions): Promise<boolean>;
28
+ /**
29
+ * 获取目录下所有文件的内容哈希清单
30
+ * 用于 upgrade 时比较文件是否有变化
31
+ *
32
+ * 返回 Map<相对路径, md5哈希>
33
+ */
34
+ export declare function getTemplateManifest(dir: string): Promise<Map<string, string>>;
35
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/core/template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,WAAW;IAC1B,0BAA0B;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACzB,cAAc;IACd,MAAM,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,UAAU,CAAC,CAsCrB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CASnF"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * 模板引擎
3
+ *
4
+ * 封装模板复制逻辑,供 init 和 upgrade 命令使用。
5
+ */
6
+ import fs from 'fs-extra';
7
+ import path from 'path';
8
+ import crypto from 'crypto';
9
+ /**
10
+ * 复制模板目录
11
+ * 递归复制 source 下所有文件到 dest
12
+ */
13
+ export async function copyTemplates(source, dest, options) {
14
+ const result = { copied: 0, skipped: 0 };
15
+ if (!await fs.pathExists(source)) {
16
+ return result;
17
+ }
18
+ const overwrite = options?.overwrite ?? false;
19
+ await fs.ensureDir(dest);
20
+ const entries = await fs.readdir(source, { withFileTypes: true });
21
+ for (const entry of entries) {
22
+ const srcPath = path.join(source, entry.name);
23
+ const destPath = path.join(dest, entry.name);
24
+ if (options?.filter && !options.filter(srcPath)) {
25
+ result.skipped++;
26
+ continue;
27
+ }
28
+ if (entry.isDirectory()) {
29
+ const subResult = await copyTemplates(srcPath, destPath, options);
30
+ result.copied += subResult.copied;
31
+ result.skipped += subResult.skipped;
32
+ }
33
+ else {
34
+ if (!overwrite && await fs.pathExists(destPath)) {
35
+ result.skipped++;
36
+ }
37
+ else {
38
+ await fs.ensureDir(path.dirname(destPath));
39
+ await fs.copy(srcPath, destPath, { overwrite: true });
40
+ result.copied++;
41
+ }
42
+ }
43
+ }
44
+ return result;
45
+ }
46
+ /**
47
+ * 复制单个模板文件
48
+ * 返回 true 表示已复制,false 表示已跳过
49
+ */
50
+ export async function copyTemplateFile(source, dest, options) {
51
+ if (!await fs.pathExists(source)) {
52
+ return false;
53
+ }
54
+ if (options?.filter && !options.filter(source)) {
55
+ return false;
56
+ }
57
+ const overwrite = options?.overwrite ?? false;
58
+ if (!overwrite && await fs.pathExists(dest)) {
59
+ return false;
60
+ }
61
+ await fs.ensureDir(path.dirname(dest));
62
+ await fs.copy(source, dest, { overwrite: true });
63
+ return true;
64
+ }
65
+ /**
66
+ * 获取目录下所有文件的内容哈希清单
67
+ * 用于 upgrade 时比较文件是否有变化
68
+ *
69
+ * 返回 Map<相对路径, md5哈希>
70
+ */
71
+ export async function getTemplateManifest(dir) {
72
+ const manifest = new Map();
73
+ if (!await fs.pathExists(dir)) {
74
+ return manifest;
75
+ }
76
+ await walkDir(dir, dir, manifest);
77
+ return manifest;
78
+ }
79
+ async function walkDir(baseDir, currentDir, manifest) {
80
+ const entries = await fs.readdir(currentDir, { withFileTypes: true });
81
+ for (const entry of entries) {
82
+ const fullPath = path.join(currentDir, entry.name);
83
+ if (entry.isDirectory()) {
84
+ await walkDir(baseDir, fullPath, manifest);
85
+ }
86
+ else {
87
+ const relativePath = path.relative(baseDir, fullPath);
88
+ const content = await fs.readFile(fullPath);
89
+ const hash = crypto.createHash('md5').update(content).digest('hex');
90
+ manifest.set(relativePath, hash);
91
+ }
92
+ }
93
+ }
94
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/core/template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 插件标识符解析
3
+ *
4
+ * 支持格式:
5
+ * - npm scoped: @scope/name 或 @scope/name@version
6
+ * - npm: name 或 name@version(支持版本范围如 ^1.0.0、~1.2.0)
7
+ * - GitHub URL: https://github.com/user/repo
8
+ * - GitHub shorthand: user/repo 或 user/repo@ref
9
+ * - Local tarball: ./path.tgz 或 ./path.tar.gz
10
+ */
11
+ import { PluginIdentifier } from './types.js';
12
+ export declare function parsePluginIdentifier(input: string): PluginIdentifier;
13
+ //# sourceMappingURL=identifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identifier.d.ts","sourceRoot":"","sources":["../../src/plugins/identifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAU9C,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CA6DrE"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * 插件标识符解析
3
+ *
4
+ * 支持格式:
5
+ * - npm scoped: @scope/name 或 @scope/name@version
6
+ * - npm: name 或 name@version(支持版本范围如 ^1.0.0、~1.2.0)
7
+ * - GitHub URL: https://github.com/user/repo
8
+ * - GitHub shorthand: user/repo 或 user/repo@ref
9
+ * - Local tarball: ./path.tgz 或 ./path.tar.gz
10
+ */
11
+ import path from 'path';
12
+ const SUPPORTED_FORMATS = [
13
+ 'npm 包名 (如 my-plugin 或 my-plugin@1.0.0)',
14
+ 'npm scoped 包名 (如 @scope/my-plugin)',
15
+ 'GitHub 仓库 (如 user/repo 或 user/repo@tag)',
16
+ 'GitHub URL (如 https://github.com/user/repo)',
17
+ '本地 tarball (如 ./plugin.tgz)',
18
+ ].join('\n - ');
19
+ export function parsePluginIdentifier(input) {
20
+ const trimmed = input.trim();
21
+ if (!trimmed) {
22
+ throw new Error(`插件标识符不能为空。支持的格式:\n - ${SUPPORTED_FORMATS}`);
23
+ }
24
+ // npm scoped package: @scope/name 或 @scope/name@version
25
+ const scopedNpmMatch = trimmed.match(/^(@[\w-]+\/[\w-]+)(?:@(.+))?$/);
26
+ if (scopedNpmMatch) {
27
+ return {
28
+ type: 'npm',
29
+ name: scopedNpmMatch[1],
30
+ version: scopedNpmMatch[2],
31
+ scope: scopedNpmMatch[1].split('/')[0],
32
+ };
33
+ }
34
+ // GitHub URL: 严格匹配 https://github.com/user/repo
35
+ const githubUrlMatch = trimmed.match(/^https?:\/\/github\.com\/([\w.-]+)\/([\w.-]+?)(?:\.git)?(?:\/.*)?$/);
36
+ if (githubUrlMatch) {
37
+ return {
38
+ type: 'github',
39
+ repository: `${githubUrlMatch[1]}/${githubUrlMatch[2]}`,
40
+ name: githubUrlMatch[2],
41
+ };
42
+ }
43
+ // Local tarball: *.tgz 或 *.tar.gz(在 GitHub shorthand 之前检查)
44
+ if (trimmed.endsWith('.tgz') || trimmed.endsWith('.tar.gz')) {
45
+ const ext = trimmed.endsWith('.tar.gz') ? '.tar.gz' : '.tgz';
46
+ return {
47
+ type: 'local',
48
+ name: path.basename(trimmed, ext),
49
+ };
50
+ }
51
+ // GitHub shorthand: user/repo 或 user/repo@ref
52
+ const githubMatch = trimmed.match(/^([\w.-]+)\/([\w.-]+)(?:@([\w./-]+))?$/);
53
+ if (githubMatch) {
54
+ return {
55
+ type: 'github',
56
+ repository: `${githubMatch[1]}/${githubMatch[2]}`,
57
+ name: githubMatch[2],
58
+ version: githubMatch[3] || 'main',
59
+ };
60
+ }
61
+ // npm package: name 或 name@version(支持版本范围如 ^1.0.0、~1.2.0、>=1.0.0)
62
+ const npmMatch = trimmed.match(/^([\w-]+)(?:@(.+))?$/);
63
+ if (npmMatch) {
64
+ return {
65
+ type: 'npm',
66
+ name: npmMatch[1],
67
+ version: npmMatch[2],
68
+ };
69
+ }
70
+ throw new Error(`无法识别的插件格式: "${trimmed}"。支持的格式:\n - ${SUPPORTED_FORMATS}`);
71
+ }
72
+ //# sourceMappingURL=identifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identifier.js","sourceRoot":"","sources":["../../src/plugins/identifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,MAAM,iBAAiB,GAAG;IACxB,wCAAwC;IACxC,oCAAoC;IACpC,yCAAyC;IACzC,6CAA6C;IAC7C,6BAA6B;CAC9B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAEjB,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,yBAAyB,iBAAiB,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,wDAAwD;IACxD,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACtE,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;YACvB,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;YAC1B,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACvC,CAAC;IACJ,CAAC;IAED,gDAAgD;IAChD,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;IAC3G,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE;YACvD,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;SACxB,CAAC;IACJ,CAAC;IAED,2DAA2D;IAC3D,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5D,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7D,OAAO;YACL,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC;SAClC,CAAC;IACJ,CAAC;IAED,8CAA8C;IAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5E,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE;YACjD,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;YACpB,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,MAAM;SAClC,CAAC;IACJ,CAAC;IAED,kEAAkE;IAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACvD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;YACjB,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;SACrB,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,KAAK,CACb,eAAe,OAAO,iBAAiB,iBAAiB,EAAE,CAC3D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * 安装器抽象基类
3
+ *
4
+ * 提取 npm/github/local 安装器的公共逻辑:
5
+ * 临时目录管理、tar 解压。
6
+ */
7
+ import { PluginIdentifier, InstallResult } from '../types.js';
8
+ export declare abstract class BaseInstaller {
9
+ /**
10
+ * 解压 tarball 到指定目录
11
+ */
12
+ protected extractTarball(tarballPath: string, extractPath: string, stripComponents?: number): Promise<void>;
13
+ /**
14
+ * 创建临时工作目录
15
+ */
16
+ protected createTempDir(prefix?: string): Promise<string>;
17
+ /**
18
+ * 清理临时目录
19
+ */
20
+ protected cleanup(tempDir: string): Promise<void>;
21
+ /**
22
+ * 安装插件到目标目录
23
+ * 子类必须实现此方法
24
+ */
25
+ abstract install(identifier: PluginIdentifier, destDir: string): Promise<InstallResult>;
26
+ }
27
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/plugins/installers/base.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG9D,8BAAsB,aAAa;IACjC;;OAEG;cACa,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC;IAMhB;;OAEG;cACa,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI/D;;OAEG;cACa,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CACxF"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * 安装器抽象基类
3
+ *
4
+ * 提取 npm/github/local 安装器的公共逻辑:
5
+ * 临时目录管理、tar 解压。
6
+ */
7
+ import { extractTarball, createTempDir, cleanupTempDir } from '../../core/platform.js';
8
+ export class BaseInstaller {
9
+ /**
10
+ * 解压 tarball 到指定目录
11
+ */
12
+ async extractTarball(tarballPath, extractPath, stripComponents) {
13
+ await extractTarball(tarballPath, extractPath, {
14
+ stripComponents: stripComponents ?? 0,
15
+ });
16
+ }
17
+ /**
18
+ * 创建临时工作目录
19
+ */
20
+ async createTempDir(prefix) {
21
+ return createTempDir(prefix);
22
+ }
23
+ /**
24
+ * 清理临时目录
25
+ */
26
+ async cleanup(tempDir) {
27
+ await cleanupTempDir(tempDir);
28
+ }
29
+ }
30
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/plugins/installers/base.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAEvF,MAAM,OAAgB,aAAa;IACjC;;OAEG;IACO,KAAK,CAAC,cAAc,CAC5B,WAAmB,EACnB,WAAmB,EACnB,eAAwB;QAExB,MAAM,cAAc,CAAC,WAAW,EAAE,WAAW,EAAE;YAC7C,eAAe,EAAE,eAAe,IAAI,CAAC;SACtC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,aAAa,CAAC,MAAe;QAC3C,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,OAAO,CAAC,OAAe;QACrC,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;CAOF"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * GitHub 安装器
3
+ *
4
+ * 从 GitHub 仓库下载并安装插件。
5
+ * 继承 BaseInstaller,复用公共 tar 解压逻辑。
6
+ * 支持 GITHUB_TOKEN 环境变量用于私有仓库。
7
+ */
8
+ import { PluginIdentifier, InstallResult, InstallerOptions } from '../types.js';
9
+ import { BaseInstaller } from './base.js';
10
+ export declare class GitHubInstaller extends BaseInstaller {
11
+ private token?;
12
+ constructor(options?: InstallerOptions);
13
+ private getHeaders;
14
+ getRepoInfo(repository: string): Promise<any>;
15
+ downloadArchive(repository: string, ref: string, destPath: string): Promise<void>;
16
+ /**
17
+ * 在目录中查找 config.yaml,限制搜索深度
18
+ */
19
+ private findConfigYaml;
20
+ install(identifier: PluginIdentifier, destDir: string): Promise<InstallResult>;
21
+ }
22
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../src/plugins/installers/github.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAO1C,qBAAa,eAAgB,SAAQ,aAAa;IAChD,OAAO,CAAC,KAAK,CAAC,CAAS;gBAEX,OAAO,CAAC,EAAE,gBAAgB;IAKtC,OAAO,CAAC,UAAU;IAWZ,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAoB7C,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAsBhB;;OAEG;YACW,cAAc;IAyBtB,OAAO,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CAkDrF"}