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