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.
- package/CHANGELOG.md +161 -0
- package/LICENSE +22 -0
- package/README.md +372 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +50 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/check.d.ts +6 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +32 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +160 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/plugin.d.ts +6 -0
- package/dist/commands/plugin.d.ts.map +1 -0
- package/dist/commands/plugin.js +135 -0
- package/dist/commands/plugin.js.map +1 -0
- package/dist/commands/upgrade.d.ts +6 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +92 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/core/config.d.ts +72 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +136 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/errors.d.ts +59 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +125 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/platform.d.ts +27 -0
- package/dist/core/platform.d.ts.map +1 -0
- package/dist/core/platform.js +75 -0
- package/dist/core/platform.js.map +1 -0
- package/dist/core/template.d.ts +35 -0
- package/dist/core/template.d.ts.map +1 -0
- package/dist/core/template.js +94 -0
- package/dist/core/template.js.map +1 -0
- package/dist/plugins/identifier.d.ts +13 -0
- package/dist/plugins/identifier.d.ts.map +1 -0
- package/dist/plugins/identifier.js +72 -0
- package/dist/plugins/identifier.js.map +1 -0
- package/dist/plugins/installers/base.d.ts +27 -0
- package/dist/plugins/installers/base.d.ts.map +1 -0
- package/dist/plugins/installers/base.js +30 -0
- package/dist/plugins/installers/base.js.map +1 -0
- package/dist/plugins/installers/github.d.ts +22 -0
- package/dist/plugins/installers/github.d.ts.map +1 -0
- package/dist/plugins/installers/github.js +133 -0
- package/dist/plugins/installers/github.js.map +1 -0
- package/dist/plugins/installers/local.d.ts +16 -0
- package/dist/plugins/installers/local.d.ts.map +1 -0
- package/dist/plugins/installers/local.js +69 -0
- package/dist/plugins/installers/local.js.map +1 -0
- package/dist/plugins/installers/npm.d.ts +20 -0
- package/dist/plugins/installers/npm.d.ts.map +1 -0
- package/dist/plugins/installers/npm.js +99 -0
- package/dist/plugins/installers/npm.js.map +1 -0
- package/dist/plugins/manager.d.ts +77 -0
- package/dist/plugins/manager.d.ts.map +1 -0
- package/dist/plugins/manager.js +349 -0
- package/dist/plugins/manager.js.map +1 -0
- package/dist/plugins/registry.d.ts +48 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +111 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/plugins/types.d.ts +66 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +2 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/plugins/validator.d.ts +19 -0
- package/dist/plugins/validator.d.ts.map +1 -0
- package/dist/plugins/validator.js +164 -0
- package/dist/plugins/validator.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +48 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/project.d.ts +24 -0
- package/dist/utils/project.d.ts.map +1 -0
- package/dist/utils/project.js +61 -0
- package/dist/utils/project.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +21 -0
- package/dist/version.js.map +1 -0
- package/package.json +76 -0
- package/plugins/authentic-voice/README.md +31 -0
- package/plugins/authentic-voice/commands/authentic-voice.md +73 -0
- package/plugins/authentic-voice/commands/authenticity-audit.md +37 -0
- package/plugins/authentic-voice/config.yaml +30 -0
- package/plugins/authentic-voice/experts/authentic-editor.md +27 -0
- package/plugins/export/README.md +319 -0
- package/plugins/export/commands/export.md +460 -0
- package/plugins/export/commands/generate-cover.md +256 -0
- package/plugins/export/commands/metadata.md +309 -0
- package/plugins/export/config.yaml +47 -0
- package/plugins/export/experts/publishing-expert.md +171 -0
- package/plugins/export/templates/epub/chapter-template.html +13 -0
- package/plugins/export/templates/epub/cover-template.html +14 -0
- package/plugins/export/templates/epub/stylesheet.css +200 -0
- package/plugins/export/templates/pdf/ebook-style.css +137 -0
- package/plugins/export/templates/pdf/print-style.css +179 -0
- package/plugins/export/templates/platforms/jinjiang-format.md +101 -0
- package/plugins/export/templates/platforms/qidian-format.md +108 -0
- package/plugins/export/templates/platforms/tomato-format.md +95 -0
- package/plugins/translate/README.md +265 -0
- package/plugins/translate/commands/glossary.md +731 -0
- package/plugins/translate/commands/translate-preview.md +543 -0
- package/plugins/translate/commands/translate.md +649 -0
- package/plugins/translate/config.yaml +43 -0
- package/plugins/translate/experts/literary-translator.md +605 -0
- package/templates/commands/analyze.md +1485 -0
- package/templates/commands/checklist.md +434 -0
- package/templates/commands/clarify.md +257 -0
- package/templates/commands/constitution.md +257 -0
- package/templates/commands/expert.md +136 -0
- package/templates/commands/plan.md +749 -0
- package/templates/commands/recap.md +613 -0
- package/templates/commands/relations.md +96 -0
- package/templates/commands/revise.md +341 -0
- package/templates/commands/specify.md +682 -0
- package/templates/commands/tasks.md +142 -0
- package/templates/commands/timeline.md +73 -0
- package/templates/commands/track-init.md +137 -0
- package/templates/commands/track.md +463 -0
- package/templates/commands/write.md +1264 -0
- package/templates/config/keyword-mappings.json +106 -0
- package/templates/knowledge/audit-config.json +26 -0
- package/templates/knowledge/character-profiles.md +152 -0
- package/templates/knowledge/character-voices.md +137 -0
- package/templates/knowledge/locations.md +184 -0
- package/templates/knowledge/world-setting.md +121 -0
- package/templates/knowledge-base/README.md +285 -0
- package/templates/knowledge-base/character-archetypes/01-hero.md +233 -0
- package/templates/knowledge-base/character-archetypes/02-mentor.md +177 -0
- package/templates/knowledge-base/character-archetypes/03-shadow.md +221 -0
- package/templates/knowledge-base/character-archetypes/04-ally.md +178 -0
- package/templates/knowledge-base/character-archetypes/05-shapeshifter.md +177 -0
- package/templates/knowledge-base/character-archetypes/06-trickster.md +181 -0
- package/templates/knowledge-base/character-archetypes/07-threshold-guardian.md +177 -0
- package/templates/knowledge-base/character-archetypes/08-herald.md +180 -0
- package/templates/knowledge-base/character-archetypes/09-father.md +249 -0
- package/templates/knowledge-base/character-archetypes/10-mother.md +202 -0
- package/templates/knowledge-base/character-archetypes/11-child.md +183 -0
- package/templates/knowledge-base/character-archetypes/12-sage.md +202 -0
- package/templates/knowledge-base/character-archetypes/README.md +60 -0
- package/templates/knowledge-base/character-archetypes/application-guide.md +222 -0
- package/templates/knowledge-base/character-archetypes/archetype-combinations.md +242 -0
- package/templates/knowledge-base/character-archetypes/config.yaml +28 -0
- package/templates/knowledge-base/character-archetypes/examples-analysis.md +223 -0
- package/templates/knowledge-base/craft/character-arc.md +1153 -0
- package/templates/knowledge-base/craft/dialogue.md +1170 -0
- package/templates/knowledge-base/craft/pacing.md +1200 -0
- package/templates/knowledge-base/craft/scene-structure.md +1136 -0
- package/templates/knowledge-base/craft/show-not-tell.md +1012 -0
- package/templates/knowledge-base/emotional-beats/01-first-meeting.md +145 -0
- package/templates/knowledge-base/emotional-beats/02-bonding-moment.md +226 -0
- package/templates/knowledge-base/emotional-beats/03-declaration.md +284 -0
- package/templates/knowledge-base/emotional-beats/04-triumph.md +240 -0
- package/templates/knowledge-base/emotional-beats/05-reunion.md +396 -0
- package/templates/knowledge-base/emotional-beats/06-forgiveness.md +204 -0
- package/templates/knowledge-base/emotional-beats/07-betrayal.md +204 -0
- package/templates/knowledge-base/emotional-beats/08-loss.md +214 -0
- package/templates/knowledge-base/emotional-beats/09-rejection.md +254 -0
- package/templates/knowledge-base/emotional-beats/10-failure.md +244 -0
- package/templates/knowledge-base/emotional-beats/11-misunderstanding.md +205 -0
- package/templates/knowledge-base/emotional-beats/12-farewell.md +283 -0
- package/templates/knowledge-base/emotional-beats/13-revelation.md +242 -0
- package/templates/knowledge-base/emotional-beats/14-point-of-no-return.md +215 -0
- package/templates/knowledge-base/emotional-beats/15-dark-night.md +244 -0
- package/templates/knowledge-base/emotional-beats/16-sacrifice.md +246 -0
- package/templates/knowledge-base/emotional-beats/17-awakening.md +246 -0
- package/templates/knowledge-base/emotional-beats/18-confrontation.md +217 -0
- package/templates/knowledge-base/emotional-beats/19-bittersweet-goodbye.md +368 -0
- package/templates/knowledge-base/emotional-beats/20-moral-dilemma.md +248 -0
- package/templates/knowledge-base/emotional-beats/21-temptation.md +240 -0
- package/templates/knowledge-base/emotional-beats/22-redemption.md +210 -0
- package/templates/knowledge-base/emotional-beats/README.md +104 -0
- package/templates/knowledge-base/emotional-beats/beat-sequences.md +276 -0
- package/templates/knowledge-base/emotional-beats/config.yaml +30 -0
- package/templates/knowledge-base/emotional-beats/pacing-guide.md +390 -0
- package/templates/knowledge-base/genres/historical.md +1127 -0
- package/templates/knowledge-base/genres/mystery.md +1123 -0
- package/templates/knowledge-base/genres/revenge.md +846 -0
- package/templates/knowledge-base/genres/romance.md +948 -0
- package/templates/knowledge-base/genres/sci-fi.md +156 -0
- package/templates/knowledge-base/genres/thriller.md +166 -0
- package/templates/knowledge-base/genres/wuxia.md +143 -0
- package/templates/knowledge-base/references/README.md +96 -0
- package/templates/knowledge-base/references/china-1920s/culture.md +423 -0
- package/templates/knowledge-base/references/china-1920s/daily-life.md +616 -0
- package/templates/knowledge-base/references/china-1920s/overview.md +298 -0
- package/templates/knowledge-base/references/china-1920s/society.md +703 -0
- package/templates/knowledge-base/references/china-1920s/warlords.md +427 -0
- package/templates/knowledge-base/references/cultivation-world/daily-life.md +108 -0
- package/templates/knowledge-base/references/cultivation-world/overview.md +64 -0
- package/templates/knowledge-base/references/cultivation-world/power-system.md +108 -0
- package/templates/knowledge-base/references/cultivation-world/sects.md +104 -0
- package/templates/knowledge-base/references/cultivation-world/world-setting.md +108 -0
- package/templates/knowledge-base/references/modern-workplace/corporate.md +115 -0
- package/templates/knowledge-base/references/modern-workplace/daily-life.md +129 -0
- package/templates/knowledge-base/references/modern-workplace/overview.md +73 -0
- package/templates/knowledge-base/references/modern-workplace/relationships.md +107 -0
- package/templates/knowledge-base/references/modern-workplace/tech-industry.md +131 -0
- package/templates/knowledge-base/references/tang-dynasty/culture.md +135 -0
- package/templates/knowledge-base/references/tang-dynasty/daily-life.md +139 -0
- package/templates/knowledge-base/references/tang-dynasty/overview.md +76 -0
- package/templates/knowledge-base/references/tang-dynasty/politics.md +121 -0
- package/templates/knowledge-base/references/tang-dynasty/society.md +126 -0
- package/templates/knowledge-base/requirements/README.md +240 -0
- package/templates/knowledge-base/requirements/anti-ai-v3.md +46 -0
- package/templates/knowledge-base/requirements/anti-ai-v4.md +430 -0
- package/templates/knowledge-base/requirements/fast-paced.md +552 -0
- package/templates/knowledge-base/requirements/no-poison.md +60 -0
- package/templates/knowledge-base/requirements/romance-angst.md +102 -0
- package/templates/knowledge-base/requirements/romance-sweet.md +63 -0
- package/templates/knowledge-base/requirements/serious-literature.md +45 -0
- package/templates/knowledge-base/requirements/strong-emotion.md +60 -0
- package/templates/knowledge-base/styles/README.md +302 -0
- package/templates/knowledge-base/styles/ancient-style.md +579 -0
- package/templates/knowledge-base/styles/literary.md +439 -0
- package/templates/knowledge-base/styles/minimal.md +472 -0
- package/templates/knowledge-base/styles/natural-voice.md +930 -0
- package/templates/knowledge-base/styles/web-novel.md +525 -0
- package/templates/memory/constitution.md +140 -0
- package/templates/memory/personal-voice.md +113 -0
- package/templates/scripts/README.md +187 -0
- package/templates/scripts/bash/analyze-story.sh +170 -0
- package/templates/scripts/bash/check-consistency.sh +463 -0
- package/templates/scripts/bash/check-plot.sh +374 -0
- package/templates/scripts/bash/check-timeline.sh +346 -0
- package/templates/scripts/bash/check-world.sh +395 -0
- package/templates/scripts/bash/check-writing-state.sh +854 -0
- package/templates/scripts/bash/clarify-story.sh +117 -0
- package/templates/scripts/bash/common.sh +151 -0
- package/templates/scripts/bash/constitution.sh +114 -0
- package/templates/scripts/bash/generate-tasks.sh +65 -0
- package/templates/scripts/bash/init-tracking.sh +183 -0
- package/templates/scripts/bash/manage-relations.sh +174 -0
- package/templates/scripts/bash/plan-story.sh +100 -0
- package/templates/scripts/bash/specify-story.sh +93 -0
- package/templates/scripts/bash/tasks-story.sh +96 -0
- package/templates/scripts/bash/test-word-count.sh +182 -0
- package/templates/scripts/bash/tests/bench-preload-cache.sh +100 -0
- package/templates/scripts/bash/tests/run-all-benchmarks.sh +16 -0
- package/templates/scripts/bash/tests/test-cache-semantics.sh +199 -0
- package/templates/scripts/bash/tests/test-cross-platform.sh +35 -0
- package/templates/scripts/bash/tests/test-edge-cases-bash.sh +60 -0
- package/templates/scripts/bash/tests/test-phase1-bash.sh +28 -0
- package/templates/scripts/bash/tests/test-preload-cache.sh +123 -0
- package/templates/scripts/bash/tests/test-regex-precompile.sh +89 -0
- package/templates/scripts/bash/tests/test-regression-bash.sh +42 -0
- package/templates/scripts/bash/tests/test-task6-verification.sh +200 -0
- package/templates/scripts/bash/text-audit.sh +144 -0
- package/templates/scripts/bash/track-progress.sh +194 -0
- package/templates/scripts/powershell/analyze-story.ps1 +171 -0
- package/templates/scripts/powershell/check-analyze-stage.ps1 +110 -0
- package/templates/scripts/powershell/check-consistency.ps1 +138 -0
- package/templates/scripts/powershell/check-plot.ps1 +139 -0
- package/templates/scripts/powershell/check-timeline.ps1 +112 -0
- package/templates/scripts/powershell/check-writing-state.ps1 +490 -0
- package/templates/scripts/powershell/check-writing-state.ps1.backup +135 -0
- package/templates/scripts/powershell/clarify-story.ps1 +107 -0
- package/templates/scripts/powershell/common.ps1 +36 -0
- package/templates/scripts/powershell/constitution.ps1 +142 -0
- package/templates/scripts/powershell/generate-tasks.ps1 +75 -0
- package/templates/scripts/powershell/init-tracking.ps1 +98 -0
- package/templates/scripts/powershell/manage-relations.ps1 +134 -0
- package/templates/scripts/powershell/plan-story.ps1 +96 -0
- package/templates/scripts/powershell/specify-story.ps1 +82 -0
- package/templates/scripts/powershell/tests/bench-ps-cache.ps1 +80 -0
- package/templates/scripts/powershell/tests/test-cross-platform.ps1 +27 -0
- package/templates/scripts/powershell/tests/test-edge-cases-ps.ps1 +29 -0
- package/templates/scripts/powershell/tests/test-phase1-ps.ps1 +28 -0
- package/templates/scripts/powershell/tests/test-ps-cache.ps1 +73 -0
- package/templates/scripts/powershell/tests/test-regression-ps.ps1 +40 -0
- package/templates/scripts/powershell/text-audit.ps1 +100 -0
- package/templates/scripts/powershell/track-progress.ps1 +105 -0
- package/templates/skills/genre-knowledge/fantasy/SKILL.md +355 -0
- package/templates/skills/genre-knowledge/mystery/SKILL.md +337 -0
- package/templates/skills/genre-knowledge/romance/SKILL.md +228 -0
- package/templates/skills/genre-knowledge/sci-fi/SKILL.md +65 -0
- package/templates/skills/genre-knowledge/thriller/SKILL.md +95 -0
- package/templates/skills/quality-assurance/consistency-checker/SKILL.md +341 -0
- package/templates/skills/quality-assurance/continuity-tracker/SKILL.md +157 -0
- package/templates/skills/quality-assurance/forgotten-elements/SKILL.md +147 -0
- package/templates/skills/quality-assurance/getting-started/SKILL.md +224 -0
- package/templates/skills/quality-assurance/pacing-monitor/SKILL.md +143 -0
- package/templates/skills/quality-assurance/pov-validator/SKILL.md +135 -0
- package/templates/skills/quality-assurance/pre-write-checklist/SKILL.md +583 -0
- package/templates/skills/quality-assurance/requirement-detector/CONFLICT_RESOLUTION.md +119 -0
- package/templates/skills/quality-assurance/requirement-detector/EXAMPLES.md +146 -0
- package/templates/skills/quality-assurance/requirement-detector/KEYWORDS.md +160 -0
- package/templates/skills/quality-assurance/requirement-detector/SKILL.md +149 -0
- package/templates/skills/quality-assurance/setting-detector/SKILL.md +611 -0
- package/templates/skills/quality-assurance/style-detector/CONFLICT_RESOLUTION.md +126 -0
- package/templates/skills/quality-assurance/style-detector/EXAMPLES.md +206 -0
- package/templates/skills/quality-assurance/style-detector/KEYWORDS.md +207 -0
- package/templates/skills/quality-assurance/style-detector/SKILL.md +126 -0
- package/templates/skills/quality-assurance/workflow-guide/SKILL.md +381 -0
- package/templates/skills/writing-techniques/character-arc/SKILL.md +267 -0
- package/templates/skills/writing-techniques/dialogue-techniques/SKILL.md +366 -0
- package/templates/skills/writing-techniques/multi-thread-narrative/SKILL.md +553 -0
- package/templates/skills/writing-techniques/multi-thread-narrative/experts/thread-analyst.md +226 -0
- package/templates/skills/writing-techniques/pacing-control/SKILL.md +377 -0
- package/templates/skills/writing-techniques/reader-expectation/SKILL.md +578 -0
- package/templates/skills/writing-techniques/reader-expectation/experts/expectation-analyst.md +209 -0
- package/templates/skills/writing-techniques/revision-polish/SKILL.md +496 -0
- package/templates/skills/writing-techniques/revision-polish/experts/revision-editor.md +221 -0
- package/templates/skills/writing-techniques/scene-structure/SKILL.md +361 -0
- package/templates/skills/writing-techniques/style-learning/SKILL.md +436 -0
- package/templates/specification-example.md +146 -0
- package/templates/tracking/character-state.json +78 -0
- package/templates/tracking/plot-tracker.json +62 -0
- package/templates/tracking/relationships.json +70 -0
- package/templates/tracking/timeline.json +49 -0
- package/templates/tracking/tracking-log.md +110 -0
- 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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAgB5B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,IAAY,EACZ,OAAqB;IAErB,MAAM,MAAM,GAAe,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAErD,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,KAAK,CAAC;IAE9C,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAEzB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAElE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC;YAClC,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChD,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC3C,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtD,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAc,EACd,IAAY,EACZ,OAAqB;IAErB,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,KAAK,CAAC;IAE9C,IAAI,CAAC,SAAS,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAW;IACnD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE3C,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAClC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,OAAe,EACf,UAAkB,EAClB,QAA6B;IAE7B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAEnD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACpE,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -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"}
|