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,1264 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 基于任务清单执行章节写作,自动加载上下文和验证规则
|
|
3
|
+
argument-hint: [章节编号或任务ID]
|
|
4
|
+
allowed-tools: Read(//**), Write(//stories/**/content/**), Bash(ls:*), Bash(find:*), Bash(wc:*), Bash(grep:*), Bash(*)
|
|
5
|
+
model: claude-sonnet-4-5-20250929
|
|
6
|
+
scripts:
|
|
7
|
+
sh: .specify/scripts/bash/check-writing-state.sh
|
|
8
|
+
ps: .specify/scripts/powershell/check-writing-state.ps1
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
基于七步方法论流程执行章节写作。
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 写作前准备(推荐)
|
|
15
|
+
|
|
16
|
+
如果距离上次写作已超过 1 天,或已写超过 30 章:
|
|
17
|
+
- 执行 `/recap` 重建上下文
|
|
18
|
+
- 快速扫描简报中的关键信息和警告
|
|
19
|
+
- 确认无高优先级警告后再开始写作
|
|
20
|
+
|
|
21
|
+
**快速模式**:如果只是短暂离开,使用 `/recap --brief` 获取快速参考卡片。
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 前置检查
|
|
26
|
+
|
|
27
|
+
1. **运行脚本** `{SCRIPT}` 检查创作状态
|
|
28
|
+
2. **解析资源加载报告**
|
|
29
|
+
|
|
30
|
+
运行脚本并获取 JSON 格式的资源加载报告:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# Bash 环境
|
|
34
|
+
bash {SCRIPT} --json
|
|
35
|
+
|
|
36
|
+
# PowerShell 环境
|
|
37
|
+
powershell -File {SCRIPT} -Json
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**脚本性能优化**:
|
|
41
|
+
- 脚本内部使用文件时间戳缓存,加速文件检查(Phase 1 优化)
|
|
42
|
+
- 你应该维护"已加载资源列表",避免重复读取相同文件(会话级优化)
|
|
43
|
+
- 两层优化结合,实现最佳性能
|
|
44
|
+
|
|
45
|
+
**报告格式**(JSON):
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"status": "ready",
|
|
49
|
+
"timestamp": "2026-02-08T09:15:30Z",
|
|
50
|
+
"has_config": true,
|
|
51
|
+
"resources": {
|
|
52
|
+
"knowledge-base": [
|
|
53
|
+
"craft/dialogue.md",
|
|
54
|
+
"craft/pacing.md",
|
|
55
|
+
"craft/show-not-tell.md"
|
|
56
|
+
],
|
|
57
|
+
"skills": [
|
|
58
|
+
"writing-techniques/dialogue-techniques",
|
|
59
|
+
"writing-techniques/pacing-control"
|
|
60
|
+
],
|
|
61
|
+
"disabled": []
|
|
62
|
+
},
|
|
63
|
+
"warnings": []
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**处理逻辑**:
|
|
68
|
+
|
|
69
|
+
1. **状态检查**:
|
|
70
|
+
- 如果 `status` 不是 "ready",终止执行并显示错误消息
|
|
71
|
+
|
|
72
|
+
2. **警告处理**:
|
|
73
|
+
- 如果 `warnings` 非空,在控制台显示警告但继续执行
|
|
74
|
+
- 建议用户检查 specification.md 配置或资源文件完整性
|
|
75
|
+
|
|
76
|
+
3. **资源加载**:
|
|
77
|
+
- 按顺序加载 `resources.knowledge-base` 和 `resources.skills` 中的文件
|
|
78
|
+
- **跳过** `resources.disabled` 中明确禁用的资源
|
|
79
|
+
- 如果某个资源文件不存在,记录警告但不阻断流程
|
|
80
|
+
|
|
81
|
+
4. **降级策略**(向后兼容):
|
|
82
|
+
- 如果脚本不支持 `--json` 参数,回退到传统的检查模式
|
|
83
|
+
- 使用默认的智能推断规则(Layer 1 默认推断)
|
|
84
|
+
|
|
85
|
+
⚠️ **资源加载说明**: 上述报告提供配置概览,但文件的实际查询顺序仍需遵循以下协议。报告中列出的 `knowledge-base` 和 `skills` 资源会在第三层(智能资源加载)自动加载。
|
|
86
|
+
|
|
87
|
+
### 查询协议(必读顺序 + 三层资源加载)
|
|
88
|
+
|
|
89
|
+
⚠️ **重要**:请严格按照以下顺序查询文档,确保上下文完整且优先级正确。
|
|
90
|
+
|
|
91
|
+
**查询顺序**:
|
|
92
|
+
1. **先查(最高优先级)**:
|
|
93
|
+
- `memory/constitution.md`(创作宪法 - 最高原则)
|
|
94
|
+
- `memory/personal-voice.md`(个人风格指南 - 如果通过风格学习生成)
|
|
95
|
+
- `memory/style-reference.md`(风格参考 - 如果通过 `/book-internalize` 生成)
|
|
96
|
+
|
|
97
|
+
2. **再查(规格和计划)**:
|
|
98
|
+
- `stories/*/specification.md`(故事规格)
|
|
99
|
+
- `stories/*/creative-plan.md`(创作计划)
|
|
100
|
+
- `stories/*/tasks.md`(当前任务)
|
|
101
|
+
|
|
102
|
+
2.1. **🆕 风格学习前置检查**:
|
|
103
|
+
|
|
104
|
+
**检查 personal-voice.md 状态**:
|
|
105
|
+
- 如果 `memory/personal-voice.md` 不存在
|
|
106
|
+
- 且检测到已写章节 ≥ 3 章
|
|
107
|
+
- 提示用户:
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
💡 风格学习建议
|
|
111
|
+
|
|
112
|
+
检测到:
|
|
113
|
+
- 已写章节:5 章
|
|
114
|
+
- personal-voice.md:不存在
|
|
115
|
+
|
|
116
|
+
建议执行风格学习生成个性化风格指南,提升 AI 续写一致性:
|
|
117
|
+
|
|
118
|
+
执行命令:
|
|
119
|
+
/style-learning
|
|
120
|
+
|
|
121
|
+
或跳过此步骤继续写作(输入 'skip')
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**如果用户选择跳过**:继续执行写作流程
|
|
125
|
+
|
|
126
|
+
**如果用户执行风格学习**:
|
|
127
|
+
- 暂停当前写作流程
|
|
128
|
+
- 等待风格学习完成
|
|
129
|
+
- 重新加载 personal-voice.md
|
|
130
|
+
- 继续写作流程
|
|
131
|
+
|
|
132
|
+
2.5. **自动加载写作风格和规范(基于配置)**:
|
|
133
|
+
- 读取 `specification.md` 的 YAML frontmatter
|
|
134
|
+
- 检查是否配置了 `writing-style`(写作风格)
|
|
135
|
+
- 检查是否配置了 `writing-requirements`(写作规范)
|
|
136
|
+
|
|
137
|
+
**如果配置了 writing-style**,加载对应风格文档:
|
|
138
|
+
```yaml
|
|
139
|
+
---
|
|
140
|
+
writing-style: natural-voice
|
|
141
|
+
---
|
|
142
|
+
```
|
|
143
|
+
则读取:`.claude/knowledge-base/styles/natural-voice.md`
|
|
144
|
+
|
|
145
|
+
**如果配置了 writing-requirements**,加载对应规范文档:
|
|
146
|
+
```yaml
|
|
147
|
+
---
|
|
148
|
+
writing-requirements:
|
|
149
|
+
- anti-ai-v4
|
|
150
|
+
- fast-paced
|
|
151
|
+
---
|
|
152
|
+
```
|
|
153
|
+
则读取:
|
|
154
|
+
- `.claude/knowledge-base/requirements/anti-ai-v4.md`
|
|
155
|
+
- `.claude/knowledge-base/requirements/fast-paced.md`
|
|
156
|
+
|
|
157
|
+
⚠️ **优先级说明**:
|
|
158
|
+
- 风格文档(styles)的优先级**高于** spec/presets/ 中的旧版规范
|
|
159
|
+
- 规范文档(requirements)会**叠加**应用(所有配置的规范都生效)
|
|
160
|
+
- 如果未配置,则使用默认的 spec/presets/ 规范
|
|
161
|
+
|
|
162
|
+
2.6. **🆕 第三层智能资源加载(三层机制)**
|
|
163
|
+
|
|
164
|
+
**优先级顺序**: Layer 2 配置覆盖 > Layer 1 默认推断 > Layer 3 关键词触发
|
|
165
|
+
|
|
166
|
+
#### Layer 1: 默认智能推断
|
|
167
|
+
|
|
168
|
+
**如果 specification.md 未配置 resource-loading**,或 `auto-load: true`(默认),自动加载:
|
|
169
|
+
|
|
170
|
+
**Knowledge-base (craft)**:
|
|
171
|
+
- `templates/knowledge-base/craft/dialogue.md`
|
|
172
|
+
- `templates/knowledge-base/craft/scene-structure.md`
|
|
173
|
+
- `templates/knowledge-base/craft/character-arc.md`
|
|
174
|
+
- `templates/knowledge-base/craft/pacing.md`
|
|
175
|
+
- `templates/knowledge-base/craft/show-not-tell.md`
|
|
176
|
+
|
|
177
|
+
**Skills (writing-techniques)**:
|
|
178
|
+
- `templates/skills/writing-techniques/dialogue-techniques/SKILL.md`
|
|
179
|
+
- `templates/skills/writing-techniques/scene-structure/SKILL.md`
|
|
180
|
+
- `templates/skills/writing-techniques/character-arc/SKILL.md`
|
|
181
|
+
- `templates/skills/writing-techniques/pacing-control/SKILL.md`
|
|
182
|
+
|
|
183
|
+
**⚠️ 优先级说明**:
|
|
184
|
+
- 这些资源的优先级**低于** 第一层(constitution)和第二层(specification)
|
|
185
|
+
- 这些资源的优先级**高于** 第五层(前文内容)和第六层(写作规范细节)
|
|
186
|
+
- 资源内容用于辅助判断和提升质量,不覆盖核心原则
|
|
187
|
+
|
|
188
|
+
#### Layer 2: 配置覆盖
|
|
189
|
+
|
|
190
|
+
**如果 specification.md 配置了 resource-loading**,使用配置覆盖默认推断:
|
|
191
|
+
|
|
192
|
+
```yaml
|
|
193
|
+
---
|
|
194
|
+
resource-loading:
|
|
195
|
+
auto-load: true # 或 false(完全禁用默认推断)
|
|
196
|
+
|
|
197
|
+
knowledge-base:
|
|
198
|
+
craft:
|
|
199
|
+
- dialogue
|
|
200
|
+
- pacing
|
|
201
|
+
- "!character-arc" # ! 前缀表示排除
|
|
202
|
+
styles: # 覆盖 writing-style 字段
|
|
203
|
+
- natural-voice
|
|
204
|
+
requirements: # 覆盖 writing-requirements 字段
|
|
205
|
+
- anti-ai-v4
|
|
206
|
+
|
|
207
|
+
skills:
|
|
208
|
+
writing-techniques:
|
|
209
|
+
- dialogue-techniques
|
|
210
|
+
- pacing-control
|
|
211
|
+
quality-assurance:
|
|
212
|
+
- consistency-checker
|
|
213
|
+
|
|
214
|
+
keyword-triggers:
|
|
215
|
+
enabled: true # 是否启用关键词触发(Layer 3)
|
|
216
|
+
custom-mappings: # 自定义关键词映射(覆盖默认)
|
|
217
|
+
"情感节奏": "templates/knowledge-base/craft/pacing.md"
|
|
218
|
+
---
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**配置处理逻辑**:
|
|
222
|
+
1. 如果 `auto-load: false`,清空 Layer 1 的默认推断
|
|
223
|
+
2. 如果配置了具体资源列表,使用配置的列表
|
|
224
|
+
3. 如果未配置某个分类(如 craft),使用 Layer 1 的默认推断
|
|
225
|
+
4. `!` 前缀用于排除特定资源(在默认推断基础上减去)
|
|
226
|
+
|
|
227
|
+
**向后兼容**:
|
|
228
|
+
- 如果未配置 `resource-loading`,保持原有行为(writing-style, writing-requirements)
|
|
229
|
+
- 如果配置了 `resource-loading.knowledge-base.styles`,覆盖 `writing-style` 字段
|
|
230
|
+
- 如果配置了 `resource-loading.knowledge-base.requirements`,覆盖 `writing-requirements` 字段
|
|
231
|
+
|
|
232
|
+
### 🆕 Layer 3: 运行时关键词触发(动态加载)
|
|
233
|
+
|
|
234
|
+
**触发时机**:
|
|
235
|
+
1. 用户在执行 `/write` 命令时提供的参数中(如 `--focus 节奏控制`)
|
|
236
|
+
2. 读取当前任务描述时(从 `tasks.md` 提取)
|
|
237
|
+
3. 用户在交互过程中的输入中
|
|
238
|
+
|
|
239
|
+
**检查配置**:
|
|
240
|
+
|
|
241
|
+
读取 `specification.md` 的 `resource-loading.keyword-triggers` 配置:
|
|
242
|
+
|
|
243
|
+
```yaml
|
|
244
|
+
resource-loading:
|
|
245
|
+
keyword-triggers:
|
|
246
|
+
enabled: true # 默认启用,false 则跳过此步骤
|
|
247
|
+
custom-mappings:
|
|
248
|
+
"情感节奏": "knowledge-base/craft/pacing.md"
|
|
249
|
+
"甜度": "knowledge-base/genres/romance.md"
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
**如果 `enabled: false`**,跳过关键词触发机制。
|
|
253
|
+
|
|
254
|
+
**如果 `enabled: true` 或未配置**(默认启用),执行以下流程:
|
|
255
|
+
|
|
256
|
+
#### 3.1. 收集待扫描文本
|
|
257
|
+
|
|
258
|
+
**收集以下来源的文本**:
|
|
259
|
+
1. 命令参数中的文本(如 `--focus 对话技巧`)
|
|
260
|
+
2. 当前任务描述(从 `tasks.md` 读取当前任务的 description 字段)
|
|
261
|
+
3. 用户在写作过程中的交互输入(如提示 "这段节奏太慢了")
|
|
262
|
+
|
|
263
|
+
**拼接文本**:
|
|
264
|
+
```javascript
|
|
265
|
+
const textToScan = [
|
|
266
|
+
commandArgs, // 命令参数
|
|
267
|
+
currentTaskDesc, // 任务描述
|
|
268
|
+
userInput // 用户输入
|
|
269
|
+
].join('\n');
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
#### 3.2. 加载关键词映射表
|
|
273
|
+
|
|
274
|
+
**读取文件**: `templates/config/keyword-mappings.json`
|
|
275
|
+
|
|
276
|
+
**解析结构**:
|
|
277
|
+
```json
|
|
278
|
+
{
|
|
279
|
+
"mappings": {
|
|
280
|
+
"craft-knowledge": {
|
|
281
|
+
"pacing": {
|
|
282
|
+
"keywords": ["节奏", "拖沓", "太快", "太慢"],
|
|
283
|
+
"resources": [
|
|
284
|
+
"templates/knowledge-base/craft/pacing.md",
|
|
285
|
+
"templates/skills/writing-techniques/pacing-control/SKILL.md"
|
|
286
|
+
],
|
|
287
|
+
"priority": 1
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
},
|
|
291
|
+
"regex-patterns": {
|
|
292
|
+
"pacing": "节奏|拖沓|太快|太慢|过快|过慢"
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
**合并自定义映射**:
|
|
298
|
+
|
|
299
|
+
如果 `specification.md` 配置了 `keyword-triggers.custom-mappings`,合并到映射表中:
|
|
300
|
+
|
|
301
|
+
```javascript
|
|
302
|
+
const customMappings = spec.resourceLoading?.keywordTriggers?.customMappings || {};
|
|
303
|
+
|
|
304
|
+
// 为每个自定义映射创建条目
|
|
305
|
+
for (const [keyword, resourcePath] of Object.entries(customMappings)) {
|
|
306
|
+
mappings['custom-' + keyword] = {
|
|
307
|
+
keywords: [keyword],
|
|
308
|
+
resources: [resourcePath],
|
|
309
|
+
priority: 0 // 自定义映射优先级最高
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
#### 3.3. 执行关键词匹配
|
|
315
|
+
|
|
316
|
+
**遍历所有映射条目**:
|
|
317
|
+
|
|
318
|
+
```javascript
|
|
319
|
+
const matched = [];
|
|
320
|
+
|
|
321
|
+
for (const [category, items] of Object.entries(mappings)) {
|
|
322
|
+
for (const [name, config] of Object.entries(items)) {
|
|
323
|
+
// 使用预定义正则或构建正则
|
|
324
|
+
const pattern = regexPatterns[name] || config.keywords.join('|');
|
|
325
|
+
const regex = new RegExp(pattern, 'i'); // 忽略大小写
|
|
326
|
+
|
|
327
|
+
if (regex.test(textToScan)) {
|
|
328
|
+
matched.push({
|
|
329
|
+
category,
|
|
330
|
+
name,
|
|
331
|
+
resources: config.resources,
|
|
332
|
+
priority: config.priority,
|
|
333
|
+
matchedKeyword: textToScan.match(regex)[0]
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
**按优先级排序**:
|
|
341
|
+
```javascript
|
|
342
|
+
matched.sort((a, b) => a.priority - b.priority); // 数字越小优先级越高
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
#### 3.4. 资源去重检查
|
|
346
|
+
|
|
347
|
+
**检查已加载资源**:
|
|
348
|
+
|
|
349
|
+
维护一个已加载资源列表(从 Layer 1 和 Layer 2 的加载结果中获取):
|
|
350
|
+
|
|
351
|
+
```javascript
|
|
352
|
+
const loadedResources = [
|
|
353
|
+
...layer1Resources,
|
|
354
|
+
...layer2Resources
|
|
355
|
+
];
|
|
356
|
+
|
|
357
|
+
const newResources = [];
|
|
358
|
+
|
|
359
|
+
for (const match of matched) {
|
|
360
|
+
for (const resource of match.resources) {
|
|
361
|
+
// 规范化路径(去除前缀 templates/)
|
|
362
|
+
const normalizedPath = resource.replace(/^templates\//, '');
|
|
363
|
+
|
|
364
|
+
// 检查是否已加载
|
|
365
|
+
const isLoaded = loadedResources.some(loaded =>
|
|
366
|
+
loaded.includes(normalizedPath) || normalizedPath.includes(loaded)
|
|
367
|
+
);
|
|
368
|
+
|
|
369
|
+
if (!isLoaded && !newResources.includes(resource)) {
|
|
370
|
+
newResources.push({
|
|
371
|
+
resource,
|
|
372
|
+
trigger: match.name,
|
|
373
|
+
keyword: match.matchedKeyword,
|
|
374
|
+
category: match.category
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
#### 3.5. 用户提示和确认
|
|
382
|
+
|
|
383
|
+
**如果有新资源待加载**,显示提示:
|
|
384
|
+
|
|
385
|
+
```markdown
|
|
386
|
+
---
|
|
387
|
+
🔍 **关键词触发检测**
|
|
388
|
+
|
|
389
|
+
检测到以下关键词,建议加载相关资源:
|
|
390
|
+
|
|
391
|
+
1. **"节奏"** → 节奏控制 (pacing)
|
|
392
|
+
- 知识库: craft/pacing.md
|
|
393
|
+
- 技巧: writing-techniques/pacing-control
|
|
394
|
+
|
|
395
|
+
2. **"对话"** → 对话技巧 (dialogue)
|
|
396
|
+
- 知识库: craft/dialogue.md
|
|
397
|
+
- 技巧: writing-techniques/dialogue-techniques
|
|
398
|
+
|
|
399
|
+
是否加载这些资源?
|
|
400
|
+
[Y] 全部加载 [N] 跳过 [S] 选择性加载
|
|
401
|
+
---
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
**处理用户响应**:
|
|
405
|
+
|
|
406
|
+
- **Y (全部加载)**: 加载所有建议的资源
|
|
407
|
+
- **N (跳过)**: 不加载任何资源,继续写作流程
|
|
408
|
+
- **S (选择性加载)**: 逐个询问
|
|
409
|
+
|
|
410
|
+
**选择性加载流程**:
|
|
411
|
+
```markdown
|
|
412
|
+
### 1. 节奏控制 (pacing)
|
|
413
|
+
|
|
414
|
+
资源:
|
|
415
|
+
- craft/pacing.md
|
|
416
|
+
- writing-techniques/pacing-control
|
|
417
|
+
|
|
418
|
+
是否加载? [Y/N]
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
#### 3.6. 动态资源加载
|
|
422
|
+
|
|
423
|
+
**对于确认加载的资源**:
|
|
424
|
+
|
|
425
|
+
```javascript
|
|
426
|
+
for (const item of confirmedResources) {
|
|
427
|
+
const { resource, trigger, keyword } = item;
|
|
428
|
+
|
|
429
|
+
// 加载资源内容
|
|
430
|
+
const content = await readFile(resource);
|
|
431
|
+
|
|
432
|
+
// 添加到上下文
|
|
433
|
+
context.push({
|
|
434
|
+
source: resource,
|
|
435
|
+
content: content,
|
|
436
|
+
loadedBy: 'keyword-trigger',
|
|
437
|
+
trigger: trigger,
|
|
438
|
+
keyword: keyword
|
|
439
|
+
});
|
|
440
|
+
|
|
441
|
+
// 记录到日志
|
|
442
|
+
console.log(`✓ 动态加载: ${resource} (触发词: "${keyword}")`);
|
|
443
|
+
}
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
**加载完成提示**:
|
|
447
|
+
```markdown
|
|
448
|
+
✅ 已加载 2 个资源:
|
|
449
|
+
- craft/pacing.md
|
|
450
|
+
- writing-techniques/pacing-control
|
|
451
|
+
|
|
452
|
+
继续写作流程...
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
#### 3.7. 交互过程中的实时触发
|
|
456
|
+
|
|
457
|
+
**在写作执行过程中**,每当用户提供新的输入时:
|
|
458
|
+
|
|
459
|
+
```javascript
|
|
460
|
+
// 用户输入新的指令或反馈
|
|
461
|
+
const userFeedback = getUserInput();
|
|
462
|
+
|
|
463
|
+
// 重新扫描关键词
|
|
464
|
+
const runtimeMatched = scanKeywords(userFeedback);
|
|
465
|
+
|
|
466
|
+
// 过滤已加载资源
|
|
467
|
+
const runtimeNew = filterAlreadyLoaded(runtimeMatched, loadedResources);
|
|
468
|
+
|
|
469
|
+
// 如果有新资源,提示用户
|
|
470
|
+
if (runtimeNew.length > 0) {
|
|
471
|
+
promptUserToLoad(runtimeNew);
|
|
472
|
+
}
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
**实时提示示例**:
|
|
476
|
+
```markdown
|
|
477
|
+
💡 **提示**: 检测到关键词 "节奏太慢",是否加载 pacing-control 技巧? [Y/N]
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
---
|
|
481
|
+
|
|
482
|
+
### 🆕 配置示例
|
|
483
|
+
|
|
484
|
+
**启用关键词触发(默认)**:
|
|
485
|
+
```yaml
|
|
486
|
+
# specification.md
|
|
487
|
+
---
|
|
488
|
+
resource-loading:
|
|
489
|
+
keyword-triggers:
|
|
490
|
+
enabled: true
|
|
491
|
+
---
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
**禁用关键词触发**:
|
|
495
|
+
```yaml
|
|
496
|
+
---
|
|
497
|
+
resource-loading:
|
|
498
|
+
keyword-triggers:
|
|
499
|
+
enabled: false
|
|
500
|
+
---
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
**添加自定义关键词映射**:
|
|
504
|
+
```yaml
|
|
505
|
+
---
|
|
506
|
+
resource-loading:
|
|
507
|
+
keyword-triggers:
|
|
508
|
+
enabled: true
|
|
509
|
+
custom-mappings:
|
|
510
|
+
"情感节奏": "knowledge-base/craft/pacing.md"
|
|
511
|
+
"甜度": "knowledge-base/genres/romance.md"
|
|
512
|
+
"虐文": "knowledge-base/requirements/romance-angst.md"
|
|
513
|
+
---
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
**自定义映射优先级最高**(priority: 0),会优先于内置映射表。
|
|
517
|
+
|
|
518
|
+
#### 资源加载报告集成
|
|
519
|
+
|
|
520
|
+
从步骤 2 获取的 JSON 报告中,`resources` 字段反映了 Layer 1 和 Layer 2 的加载结果:
|
|
521
|
+
|
|
522
|
+
```json
|
|
523
|
+
{
|
|
524
|
+
"resources": {
|
|
525
|
+
"knowledge-base": ["craft/dialogue.md", "craft/pacing.md"],
|
|
526
|
+
"skills": ["writing-techniques/dialogue-techniques"],
|
|
527
|
+
"disabled": ["craft/character-arc"] // ! 前缀排除的资源
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
**加载顺序**:
|
|
533
|
+
1. 加载 `knowledge-base` 列表中的所有文件
|
|
534
|
+
2. 加载 `skills` 列表中的所有 SKILL.md
|
|
535
|
+
3. 记录 `disabled` 列表,确保不加载这些资源
|
|
536
|
+
4. 保持与原有查询协议的优先级关系
|
|
537
|
+
|
|
538
|
+
---
|
|
539
|
+
|
|
540
|
+
## 性能优化:会话级资源复用
|
|
541
|
+
|
|
542
|
+
**优化策略**:
|
|
543
|
+
本次对话中已加载的资源知识应复用,避免重复读取文件。
|
|
544
|
+
|
|
545
|
+
**操作指南**:
|
|
546
|
+
1. **首次加载**:读取资源文件内容,记住已加载的资源列表
|
|
547
|
+
2. **后续命令**:检查资源是否在"已加载列表"中
|
|
548
|
+
- ✅ 如果已加载:直接使用已有知识,不要重新读取文件
|
|
549
|
+
- ❌ 如果未加载:读取文件并添加到"已加载列表"
|
|
550
|
+
|
|
551
|
+
**实际场景示例**:
|
|
552
|
+
假设本次对话已执行过 `/write chapter-1`,加载了以下资源:
|
|
553
|
+
- templates/knowledge-base/craft/dialogue.md
|
|
554
|
+
- templates/knowledge-base/craft/scene-structure.md
|
|
555
|
+
|
|
556
|
+
当用户执行 `/write chapter-2` 时:
|
|
557
|
+
- 如需 dialogue 知识 → **直接使用已有知识**,不重新读取文件
|
|
558
|
+
- 如需 pacing 知识 → 首次需要,读取文件并添加到已加载列表
|
|
559
|
+
|
|
560
|
+
**复用判断**:
|
|
561
|
+
- 相同文件路径 = 可以复用
|
|
562
|
+
- 不同章节、相同资源 = 可以复用
|
|
563
|
+
- 用户修改了 specification.md = 重新评估需要哪些资源
|
|
564
|
+
|
|
565
|
+
**性能收益**:
|
|
566
|
+
- 首次命令:正常加载(~50-100ms)
|
|
567
|
+
- 重复命令:资源复用(节省 30-50ms)
|
|
568
|
+
- 多章节写作:累计节省可观
|
|
569
|
+
|
|
570
|
+
**注意事项**:
|
|
571
|
+
- 如果用户明确要求"重新加载"或"使用最新的",应重新读取
|
|
572
|
+
- 如果发现资源文件内容与记忆不符,应重新读取
|
|
573
|
+
- specification.md 的 resource-loading 配置变化时,重新评估资源需求
|
|
574
|
+
|
|
575
|
+
---
|
|
576
|
+
|
|
577
|
+
3. **再查(状态和数据)**:
|
|
578
|
+
- `spec/tracking/character-state.json`(角色状态)
|
|
579
|
+
- `spec/tracking/relationships.json`(关系网络)
|
|
580
|
+
- `spec/tracking/plot-tracker.json`(情节追踪 - 如有)
|
|
581
|
+
- `spec/tracking/validation-rules.json`(验证规则 - 如有)
|
|
582
|
+
|
|
583
|
+
4. **再查(知识库)**:
|
|
584
|
+
- `spec/knowledge/` 相关文件(世界观、角色档案等)
|
|
585
|
+
- `stories/*/content/`(前文内容 - 了解前情)
|
|
586
|
+
|
|
587
|
+
5. **再查(写作规范)**:
|
|
588
|
+
- `memory/personal-voice.md`(个人语料 - 如有)
|
|
589
|
+
- `spec/knowledge/natural-expression.md`(自然化表达 - 如有)
|
|
590
|
+
- `spec/knowledge/punctuation-personality.md`(标点个性化 - 如有)
|
|
591
|
+
- `spec/knowledge/detail-formulas.md`(具象化公式 - 如有)
|
|
592
|
+
- `spec/presets/anti-ai-detection.md`(反AI检测规范)
|
|
593
|
+
|
|
594
|
+
6. **条件查询(前三章专用)**:
|
|
595
|
+
- **如果章节编号 ≤ 3 或总字数 < 10000字**,额外查询:
|
|
596
|
+
- `spec/presets/golden-opening.md`(黄金开篇法则)
|
|
597
|
+
- 并严格遵循其中的五大法则
|
|
598
|
+
|
|
599
|
+
### ⚠️ 强制完成确认(解决失焦问题的关键)
|
|
600
|
+
|
|
601
|
+
**在开始写作前,你必须明确列出已读取的核心文件**:
|
|
602
|
+
|
|
603
|
+
```markdown
|
|
604
|
+
📋 写作前检查清单(已完成):
|
|
605
|
+
|
|
606
|
+
✓ 1. memory/constitution.md - 创作宪法
|
|
607
|
+
✓ 2. memory/style-reference.md - 风格参考(如有)
|
|
608
|
+
✓ 3. stories/*/specification.md - 故事规格
|
|
609
|
+
✓ 4. stories/*/creative-plan.md - 创作计划
|
|
610
|
+
✓ 5. stories/*/tasks.md - 当前任务
|
|
611
|
+
✓ 6. spec/tracking/character-state.json - 角色状态
|
|
612
|
+
✓ 7. spec/tracking/relationships.json - 关系网络
|
|
613
|
+
✓ 8. spec/tracking/plot-tracker.json - 情节追踪(如有)
|
|
614
|
+
✓ 9. spec/tracking/validation-rules.json - 验证规则(如有)
|
|
615
|
+
|
|
616
|
+
🎨 写作风格和规范(基于配置):
|
|
617
|
+
✓ 写作风格:[style-name](如配置)或 无配置
|
|
618
|
+
✓ 写作规范:[requirement-1, requirement-2, ...](如配置)或 无配置
|
|
619
|
+
|
|
620
|
+
🆕 **三层资源加载(基于配置)**:
|
|
621
|
+
✓ Layer 1 默认推断:[enabled/disabled]
|
|
622
|
+
✓ Layer 2 配置覆盖:[列出加载的 knowledge-base 和 skills]
|
|
623
|
+
✓ Layer 3 关键词触发:[enabled/disabled]
|
|
624
|
+
✓ 已加载资源清单:
|
|
625
|
+
- Knowledge-base: [列出文件名]
|
|
626
|
+
- Skills: [列出技巧名]
|
|
627
|
+
- 排除资源: [列出被 ! 排除的资源]
|
|
628
|
+
|
|
629
|
+
📊 上下文加载状态:✅ 完成
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
**如果任何文件不存在或读取失败,必须明确说明原因**。
|
|
633
|
+
|
|
634
|
+
**风格和规范说明**:
|
|
635
|
+
- 如果 specification.md 中配置了 `writing-style` 或 `writing-requirements`,必须列出具体加载的文档
|
|
636
|
+
- 示例:"写作风格:natural-voice"、"写作规范:anti-ai-v4, fast-paced"
|
|
637
|
+
- 如果未配置,标注"无配置"并使用默认规范
|
|
638
|
+
|
|
639
|
+
⚠️ **禁止跳过此步骤**:这是防止AI在长篇创作中失焦的核心机制。只有完成此确认后,才能进入下一步写作流程。
|
|
640
|
+
|
|
641
|
+
<!-- PLUGIN_HOOK: genre-knowledge-write -->
|
|
642
|
+
<!-- 插件增强区:风格应用
|
|
643
|
+
如果你安装了 genre-knowledge 插件,请在此处插入风格应用增强提示词
|
|
644
|
+
参考:plugins/genre-knowledge/README.md 的"2.3 增强 /write 命令"章节
|
|
645
|
+
-->
|
|
646
|
+
|
|
647
|
+
## 写作执行流程
|
|
648
|
+
|
|
649
|
+
### 1. 选择写作任务
|
|
650
|
+
从 `tasks.md` 中选择状态为 `pending` 的写作任务,标记为 `in_progress`。
|
|
651
|
+
|
|
652
|
+
### 2. 验证前置条件
|
|
653
|
+
- 检查相关依赖任务是否完成
|
|
654
|
+
- 验证必要的设定是否就绪
|
|
655
|
+
- 确认前序章节是否完成
|
|
656
|
+
|
|
657
|
+
### 3. 写作前提醒
|
|
658
|
+
**基于宪法原则提醒**:
|
|
659
|
+
- 核心价值观要点
|
|
660
|
+
- 质量标准要求
|
|
661
|
+
- 风格一致性准则
|
|
662
|
+
|
|
663
|
+
**基于规格要求提醒**:
|
|
664
|
+
- P0 必须包含的元素
|
|
665
|
+
- 目标读者特征
|
|
666
|
+
- 内容红线提醒
|
|
667
|
+
|
|
668
|
+
**基于写作风格和规范提醒(如已配置)**:
|
|
669
|
+
- 当前激活的写作风格及其核心原则
|
|
670
|
+
- 当前激活的写作规范及其关键要求
|
|
671
|
+
- 风格和规范的组合效果说明
|
|
672
|
+
- 需要特别注意的禁忌和要点
|
|
673
|
+
|
|
674
|
+
**示例**:
|
|
675
|
+
```
|
|
676
|
+
🎨 当前写作配置:
|
|
677
|
+
- 风格:natural-voice(自然人声)
|
|
678
|
+
- 口语化优先,对话推动情节
|
|
679
|
+
- 行为>心理,具体>抽象
|
|
680
|
+
|
|
681
|
+
- 规范:anti-ai-v4 + fast-paced
|
|
682
|
+
- 200+禁用词,形容词限制
|
|
683
|
+
- 每章至少2个爽点,节奏紧凑
|
|
684
|
+
|
|
685
|
+
组合效果:自然流畅的快节奏爽文
|
|
686
|
+
```
|
|
687
|
+
|
|
688
|
+
**分段格式规范(重要)**:
|
|
689
|
+
- ⛔ **禁止使用**:"一"、"二"、"三"等数字标记分段
|
|
690
|
+
- ✅ **使用方式**:场景转换时用两个空行(一个空白行)分隔
|
|
691
|
+
- 📖 **原因**:数字标记过于生硬,破坏阅读沉浸感,不符合网络小说习惯
|
|
692
|
+
|
|
693
|
+
**反AI检测写作规范(基于腾讯朱雀标准)**:
|
|
694
|
+
|
|
695
|
+
⚠️ **重要背景**:AI编程工具使用低温度参数,但传统"补偿方法"(强制堆砌细节)会导致过度描写,反而增加AI特征。以下规范基于实测通过标准(AI浓度0%)。
|
|
696
|
+
|
|
697
|
+
### 📏 段落结构规范(关键)⭐
|
|
698
|
+
|
|
699
|
+
**单句成段比例**:
|
|
700
|
+
- ✅ **30%-50%的段落应为单句成段**
|
|
701
|
+
- ✅ **每段控制在50-100字**
|
|
702
|
+
- ✅ **重点信息独立成段**
|
|
703
|
+
|
|
704
|
+
**示例对比**:
|
|
705
|
+
|
|
706
|
+
❌ **AI化写法**(过度描写,95% AI浓度):
|
|
707
|
+
> 房间里弥漫着霉味,唯一的光源是窗帘缝隙透进的灰白月光。他摸索着墙壁前行,指尖触到冰冷的石壁,直到膝盖撞上桌角——一张摇摇欲坠的木桌,上面堆满灰尘。
|
|
708
|
+
|
|
709
|
+
✅ **自然写法**(简洁克制,0% AI浓度):
|
|
710
|
+
> 永嘉之乱后,中原被异族占领。
|
|
711
|
+
>
|
|
712
|
+
> 汉地士族百姓除了少数不愿离开家乡的,大都南下渡江。
|
|
713
|
+
>
|
|
714
|
+
> 王谯这些年招揽了百十流民为自己种地。
|
|
715
|
+
|
|
716
|
+
### 🚫 禁止事项清单(反AI腔)
|
|
717
|
+
|
|
718
|
+
1. **禁止无意义堆砌**
|
|
719
|
+
- ❌ 不要强行凑够"3种感官"
|
|
720
|
+
- ❌ 不要列举式情绪描写
|
|
721
|
+
- ✅ 一个准确的细节胜过三个堆砌
|
|
722
|
+
|
|
723
|
+
2. **禁止华丽比喻**
|
|
724
|
+
- ❌ "摇摇欲坠的木桌"、"空气凝固"
|
|
725
|
+
- ✅ 直接描述:"一张旧木桌"、"沉默"
|
|
726
|
+
|
|
727
|
+
3. **禁止过度戏剧化**
|
|
728
|
+
- ❌ "话音未落,她已转身离开。他冲上去抓住..."
|
|
729
|
+
- ✅ 简洁处理:"她转身走了。他追上去。"
|
|
730
|
+
|
|
731
|
+
4. **禁止说明式对话**
|
|
732
|
+
- ❌ "我很生气,因为你昨天没来"
|
|
733
|
+
- ✅ "你昨天去哪了?""……不关你的事。"
|
|
734
|
+
|
|
735
|
+
5. **禁止直白心理描写**
|
|
736
|
+
- ❌ "他心中暗想,这事不简单"
|
|
737
|
+
- ✅ 通过行为暗示:"他眉头一紧。"
|
|
738
|
+
|
|
739
|
+
### ✅ 自然化写作原则
|
|
740
|
+
|
|
741
|
+
**1. 历史白描法**(古代背景适用)
|
|
742
|
+
- 陈述事实,不加修饰
|
|
743
|
+
- 示例:"这些年来,王谯招揽了百十流民为自己种地。"
|
|
744
|
+
|
|
745
|
+
**2. 口语化处理**(对话)
|
|
746
|
+
- 加入语病、停顿、重复
|
|
747
|
+
- 示例:"大都分人都南下"(而非"大部分人")
|
|
748
|
+
|
|
749
|
+
**3. 短句节奏**(叙事)
|
|
750
|
+
- 单句15-25字
|
|
751
|
+
- 关键信息独立成段
|
|
752
|
+
|
|
753
|
+
**4. 克制描写**(场景)
|
|
754
|
+
- 一个场景1-2个细节即可
|
|
755
|
+
- ❌ 不写:"房间里弥漫着霉味,墙壁冰冷,光线昏暗..."
|
|
756
|
+
- ✅ 而写:"房间很暗。"(足够)
|
|
757
|
+
|
|
758
|
+
### 📊 自检标准
|
|
759
|
+
|
|
760
|
+
写完一段后检查:
|
|
761
|
+
- [ ] 单句成段占比是否在30%-50%?
|
|
762
|
+
- [ ] 每段字数是否在50-100字?
|
|
763
|
+
- [ ] 是否有"唯一的"、"直到"、"弥漫"等AI高频词?
|
|
764
|
+
- [ ] 是否强行堆砌感官细节?
|
|
765
|
+
- [ ] 对话是否过于完整(缺少停顿、语病)?
|
|
766
|
+
- [ ] 比喻是否过于华丽?
|
|
767
|
+
|
|
768
|
+
**AI高频词黑名单**:
|
|
769
|
+
- "唯一的"、"直到"、"弥漫着"、"摇摇欲坠"
|
|
770
|
+
- "空气凝固"、"话音未落"、"猛地"
|
|
771
|
+
- "不禁"、"顿时"、"心中暗想"
|
|
772
|
+
- "皱起眉头"、"叹了口气"
|
|
773
|
+
|
|
774
|
+
**替换策略**:
|
|
775
|
+
| ❌ AI词汇 | ✅ 自然替换 |
|
|
776
|
+
|---------|----------|
|
|
777
|
+
| 弥漫着霉味 | 有股霉味 |
|
|
778
|
+
| 唯一的光源 | 只有一点光 |
|
|
779
|
+
| 摇摇欲坠的木桌 | 一张旧木桌 |
|
|
780
|
+
| 他心中暗想 | 他想 / 删除 |
|
|
781
|
+
| 话音未落 | 他话没说完 / 删除 |
|
|
782
|
+
|
|
783
|
+
### 4. 实时辅助模式(可选)
|
|
784
|
+
|
|
785
|
+
**如果用户在写作过程中遇到困难**,比如说:
|
|
786
|
+
- "帮我想一下主角该怎么办"
|
|
787
|
+
- "接下来如何发展情节?"
|
|
788
|
+
- "给我几个选项"
|
|
789
|
+
|
|
790
|
+
**你可以主动提供 2-3 个行动选项**,例如:
|
|
791
|
+
|
|
792
|
+
> **情节发展建议**:
|
|
793
|
+
>
|
|
794
|
+
> **选项A(主动型)**:主角直接出手,利用金手指碾压对手
|
|
795
|
+
> - 优点:爽点直接,读者满足感强
|
|
796
|
+
> - 风险:可能显得主角过于强大
|
|
797
|
+
>
|
|
798
|
+
> **选项B(策略型)**:主角隐藏实力,智取对手
|
|
799
|
+
> - 优点:展现主角智慧,增加悬念
|
|
800
|
+
> - 风险:节奏可能稍慢
|
|
801
|
+
>
|
|
802
|
+
> **选项C(意外型)**:引入新的变数,打断当前冲突
|
|
803
|
+
> - 优点:增加复杂度,引出新线索
|
|
804
|
+
> - 风险:可能让读者感觉被打断
|
|
805
|
+
|
|
806
|
+
**然后根据用户选择**,继续创作内容。
|
|
807
|
+
|
|
808
|
+
⚠️ **注意**:这是辅助模式,不要主动提供选项,除非用户明确请求帮助。
|
|
809
|
+
|
|
810
|
+
---
|
|
811
|
+
|
|
812
|
+
### 5. 根据计划创作内容:
|
|
813
|
+
- **开场**:吸引读者,承接前文
|
|
814
|
+
- **发展**:推进情节,深化人物
|
|
815
|
+
- **转折**:制造冲突或悬念
|
|
816
|
+
- **收尾**:适当收束,引出下文
|
|
817
|
+
|
|
818
|
+
### 6. 质量自检
|
|
819
|
+
|
|
820
|
+
**宪法合规检查**:
|
|
821
|
+
- 是否符合核心价值观
|
|
822
|
+
- 是否达到质量标准
|
|
823
|
+
- 是否保持风格一致
|
|
824
|
+
|
|
825
|
+
**规格符合检查**:
|
|
826
|
+
- 是否包含必要元素
|
|
827
|
+
- 是否符合目标定位
|
|
828
|
+
- 是否遵守约束条件
|
|
829
|
+
|
|
830
|
+
**计划执行检查**:
|
|
831
|
+
- 是否按照章节架构
|
|
832
|
+
- 是否符合节奏设计
|
|
833
|
+
- 是否达到字数要求
|
|
834
|
+
|
|
835
|
+
**格式规范检查**:
|
|
836
|
+
- ⚠️ 确认未使用"一"、"二"、"三"等数字标记分段
|
|
837
|
+
- ✅ 场景转换使用两个空行(一个空白行)
|
|
838
|
+
- ✅ 保持段落间距自然流畅
|
|
839
|
+
|
|
840
|
+
### 📊 具象化检查清单(去AI味关键)⭐
|
|
841
|
+
|
|
842
|
+
写完一段后,主动识别并替换抽象表达:
|
|
843
|
+
|
|
844
|
+
#### 🔍 识别抽象表达
|
|
845
|
+
|
|
846
|
+
**时间抽象** ❌ → **具体化** ✅
|
|
847
|
+
- "最近" → "上周三下午"
|
|
848
|
+
- "很久以前" → "三年前的秋天"
|
|
849
|
+
- "不久前" → "昨天早上八点"
|
|
850
|
+
- "过了很久" → "等了整整两个小时"
|
|
851
|
+
|
|
852
|
+
**人物抽象** ❌ → **具体化** ✅
|
|
853
|
+
- "很多人" → "我身边至少有5个朋友"
|
|
854
|
+
- "有人说" → "李叔告诉我" / "隔壁老王提起过"
|
|
855
|
+
- "大家都知道" → "村里的老人都说"
|
|
856
|
+
- "据说" → "听王叔私下说过"
|
|
857
|
+
|
|
858
|
+
**数量抽象** ❌ → **具体化** ✅
|
|
859
|
+
- "效果很好" → "这次比上次多收了三石粮" / "客人比平时多了一倍"
|
|
860
|
+
- "很贵" → "一顿饭花了三百块"
|
|
861
|
+
- "很远" → "开车要两小时"
|
|
862
|
+
- "很多" → "至少有二十个"
|
|
863
|
+
|
|
864
|
+
**场景抽象** ❌ → **具体化** ✅
|
|
865
|
+
- "房间很乱" → "地上堆着三天没洗的衣服"
|
|
866
|
+
- "天气很冷" → "呼出的气都能看见白雾"
|
|
867
|
+
- "很累" → "走了整整五个小时山路"
|
|
868
|
+
- "气氛紧张" → "没人说话,只听见时钟滴答声"
|
|
869
|
+
|
|
870
|
+
#### 💡 主动搜索建议
|
|
871
|
+
|
|
872
|
+
**当遇到以下情况时,考虑使用 WebSearch 获取真实细节**:
|
|
873
|
+
- 历史事件:搜索真实日期、人物、地点
|
|
874
|
+
- 技术细节:搜索实际参数、专业术语
|
|
875
|
+
- 地理信息:搜索真实地名、距离、地标
|
|
876
|
+
- 文化习俗:搜索当地方言、习俗、特产
|
|
877
|
+
- 数据支撑:搜索真实统计、案例、新闻
|
|
878
|
+
|
|
879
|
+
**搜索公式**:
|
|
880
|
+
```
|
|
881
|
+
- "中国古代 [朝代] 官职体系"
|
|
882
|
+
- "[城市名] 特色方言词汇"
|
|
883
|
+
- "[年代] 真实历史事件"
|
|
884
|
+
- "[行业] 专业术语大全"
|
|
885
|
+
```
|
|
886
|
+
|
|
887
|
+
#### ✅ 具象化自检问题
|
|
888
|
+
|
|
889
|
+
- [ ] 时间是否具体?(避免"最近"、"很久")
|
|
890
|
+
- [ ] 人物来源是否明确?(避免"有人"、"大家")
|
|
891
|
+
- [ ] 数量是否精确?(避免"很多"、"不少")
|
|
892
|
+
- [ ] 场景细节是否可见?(避免"很xx"的形容)
|
|
893
|
+
- [ ] 是否用了真实的地名/人名/数据?
|
|
894
|
+
- [ ] 对话是否有具体内容?(避免"他说了很多")
|
|
895
|
+
|
|
896
|
+
#### 📌 具象化注意事项
|
|
897
|
+
|
|
898
|
+
**适度原则**:
|
|
899
|
+
- ✅ 关键情节必须具象:转折点、高潮、伏笔
|
|
900
|
+
- ✅ 重要细节必须具象:第一印象、关键道具
|
|
901
|
+
- ⚠️ 次要信息可以概括:过渡段落、背景铺陈
|
|
902
|
+
- ❌ 避免过度具象:流水账、啰嗦
|
|
903
|
+
|
|
904
|
+
**场景适配**:
|
|
905
|
+
- 古代背景:历史白描,适度具象
|
|
906
|
+
- 现代背景:生活细节,高度具象
|
|
907
|
+
- 玄幻背景:世界观设定,适度具象
|
|
908
|
+
|
|
909
|
+
**示例对比**:
|
|
910
|
+
|
|
911
|
+
❌ **抽象版**(AI腔):
|
|
912
|
+
```
|
|
913
|
+
最近城里发生了很多事,大家都在议论。王强听说后很担心,决定去看看情况。
|
|
914
|
+
```
|
|
915
|
+
|
|
916
|
+
✅ **具象版**(真实感):
|
|
917
|
+
```
|
|
918
|
+
上周三开始,菜市场的李婶就一直在说东街出事了。
|
|
919
|
+
|
|
920
|
+
王强听了两天,实在忍不住:"到底出什么事了?"
|
|
921
|
+
|
|
922
|
+
"死了人啊!"李婶压低声音,"听说是那个开超市的老张..."
|
|
923
|
+
|
|
924
|
+
王强心里一紧。老张他认识,上个月还在他那买过米。
|
|
925
|
+
|
|
926
|
+
他决定下午过去看看。
|
|
927
|
+
```
|
|
928
|
+
|
|
929
|
+
**具象化效果对比**:
|
|
930
|
+
- 时间:最近 → 上周三
|
|
931
|
+
- 地点:城里 → 东街、菜市场
|
|
932
|
+
- 人物:大家 → 李婶、老张
|
|
933
|
+
- 事件:很多事 → 死了人、开超市的
|
|
934
|
+
- 细节:听说 → 压低声音、上个月买过米
|
|
935
|
+
|
|
936
|
+
### 7. 保存和更新
|
|
937
|
+
- 将章节内容保存到 `stories/*/content/`
|
|
938
|
+
- 更新任务状态为 `completed`
|
|
939
|
+
- 记录完成时间和字数
|
|
940
|
+
|
|
941
|
+
## 写作要点
|
|
942
|
+
|
|
943
|
+
- **遵循宪法**:始终符合创作原则
|
|
944
|
+
- **满足规格**:确保包含必要元素
|
|
945
|
+
- **执行计划**:按照技术方案推进
|
|
946
|
+
- **完成任务**:系统化推进任务清单
|
|
947
|
+
- **持续验证**:定期运行 `/analyze` 检查
|
|
948
|
+
|
|
949
|
+
## 完成后行动
|
|
950
|
+
|
|
951
|
+
### 8. 验证字数和更新进度
|
|
952
|
+
|
|
953
|
+
**字数统计说明**:
|
|
954
|
+
- 使用准确的中文字数统计方法
|
|
955
|
+
- 排除Markdown标记(`#`、`*`、`-`等)
|
|
956
|
+
- 只统计实际内容字符
|
|
957
|
+
- 字数要求来自 `spec/tracking/validation-rules.json`(默认2000-4000字)
|
|
958
|
+
|
|
959
|
+
**验证方法**:
|
|
960
|
+
使用项目提供的字数统计脚本验证章节字数:
|
|
961
|
+
```bash
|
|
962
|
+
source scripts/bash/common.sh
|
|
963
|
+
count_chinese_words "stories/*/content/第X章.md"
|
|
964
|
+
```
|
|
965
|
+
|
|
966
|
+
⚠️ **注意**:不要使用 `wc -w` 统计中文字数,它对中文极不准确!
|
|
967
|
+
|
|
968
|
+
**完成报告**:
|
|
969
|
+
```
|
|
970
|
+
✅ 章节写作完成
|
|
971
|
+
- 已保存:stories/*/content/第X章.md
|
|
972
|
+
- 实际字数:[X]字
|
|
973
|
+
- 字数要求:2000-4000字
|
|
974
|
+
- 字数状态:✅ 符合要求 / ⚠️ 字数不足 / ⚠️ 字数超出
|
|
975
|
+
- 任务状态:已更新
|
|
976
|
+
```
|
|
977
|
+
|
|
978
|
+
### 9. 建议下一步
|
|
979
|
+
- 继续下一个写作任务
|
|
980
|
+
- 每5章运行 `/analyze` 进行质量检查
|
|
981
|
+
- 发现问题及时调整计划
|
|
982
|
+
|
|
983
|
+
## 与方法论的关系
|
|
984
|
+
|
|
985
|
+
```
|
|
986
|
+
/constitution → 提供创作原则
|
|
987
|
+
↓
|
|
988
|
+
/specify → 定义故事需求
|
|
989
|
+
↓
|
|
990
|
+
/clarify → 澄清关键决策
|
|
991
|
+
↓
|
|
992
|
+
/plan → 制定技术方案
|
|
993
|
+
↓
|
|
994
|
+
/tasks → 分解执行任务
|
|
995
|
+
↓
|
|
996
|
+
/write → 【当前】执行写作
|
|
997
|
+
↓
|
|
998
|
+
/analyze → 验证质量一致
|
|
999
|
+
```
|
|
1000
|
+
|
|
1001
|
+
记住:写作是执行层,要严格遵循上层的规格和计划。
|
|
1002
|
+
|
|
1003
|
+
---
|
|
1004
|
+
|
|
1005
|
+
## 🆕 后置处理:自动 Tracking 更新
|
|
1006
|
+
|
|
1007
|
+
**执行时机**: 章节写作完成后,内容已写入 `stories/*/content/*.md` 文件
|
|
1008
|
+
|
|
1009
|
+
**更新策略**: 核心命令(/write)自动更新,无需用户确认
|
|
1010
|
+
|
|
1011
|
+
### 自动更新的文件(4 个)
|
|
1012
|
+
|
|
1013
|
+
#### 1. character-state.json
|
|
1014
|
+
|
|
1015
|
+
**更新内容**:
|
|
1016
|
+
- 角色最后出场位置(`lastAppearance`)
|
|
1017
|
+
- 角色关键状态变化(`keyStates`)
|
|
1018
|
+
- 角色情绪变化(如配置了 emotions 字段)
|
|
1019
|
+
|
|
1020
|
+
**更新依据**:
|
|
1021
|
+
- 分析本章中出现的所有角色
|
|
1022
|
+
- 识别角色状态的关键变化点
|
|
1023
|
+
- 记录角色在本章的重要决策或转折
|
|
1024
|
+
|
|
1025
|
+
**示例更新**:
|
|
1026
|
+
```json
|
|
1027
|
+
{
|
|
1028
|
+
"林晓": {
|
|
1029
|
+
"lastAppearance": "chapter-05",
|
|
1030
|
+
"keyStates": {
|
|
1031
|
+
"mental": "焦虑",
|
|
1032
|
+
"physical": "疲惫"
|
|
1033
|
+
}
|
|
1034
|
+
}
|
|
1035
|
+
}
|
|
1036
|
+
```
|
|
1037
|
+
|
|
1038
|
+
#### 2. relationships.json
|
|
1039
|
+
|
|
1040
|
+
**更新内容**:
|
|
1041
|
+
- 新增或更新角色关系
|
|
1042
|
+
- 关系强度变化
|
|
1043
|
+
- 关系类型变化
|
|
1044
|
+
|
|
1045
|
+
**更新依据**:
|
|
1046
|
+
- 分析角色互动场景
|
|
1047
|
+
- 识别关系的关键变化点(冲突、和解、信任建立等)
|
|
1048
|
+
- 量化关系强度变化
|
|
1049
|
+
|
|
1050
|
+
**示例更新**:
|
|
1051
|
+
```json
|
|
1052
|
+
{
|
|
1053
|
+
"relationships": [
|
|
1054
|
+
{
|
|
1055
|
+
"from": "林晓",
|
|
1056
|
+
"to": "队长",
|
|
1057
|
+
"type": "信任",
|
|
1058
|
+
"strength": 0.6,
|
|
1059
|
+
"lastUpdate": "chapter-05",
|
|
1060
|
+
"note": "首次合作任务中建立初步信任"
|
|
1061
|
+
}
|
|
1062
|
+
]
|
|
1063
|
+
}
|
|
1064
|
+
```
|
|
1065
|
+
|
|
1066
|
+
#### 3. plot-tracker.json
|
|
1067
|
+
|
|
1068
|
+
**更新内容**:
|
|
1069
|
+
- 情节线推进状态
|
|
1070
|
+
- 新增情节事件
|
|
1071
|
+
- 伏笔埋设记录
|
|
1072
|
+
|
|
1073
|
+
**更新依据**:
|
|
1074
|
+
- 识别本章推进的情节线
|
|
1075
|
+
- 记录重要情节转折点
|
|
1076
|
+
- 标记埋下的伏笔(待后续回收)
|
|
1077
|
+
|
|
1078
|
+
**示例更新**:
|
|
1079
|
+
```json
|
|
1080
|
+
{
|
|
1081
|
+
"plotLines": [
|
|
1082
|
+
{
|
|
1083
|
+
"id": "主线-001",
|
|
1084
|
+
"name": "寻找真相",
|
|
1085
|
+
"status": "进行中",
|
|
1086
|
+
"progress": 0.3,
|
|
1087
|
+
"lastUpdate": "chapter-05",
|
|
1088
|
+
"events": [
|
|
1089
|
+
{
|
|
1090
|
+
"chapter": "chapter-05",
|
|
1091
|
+
"description": "发现第一条线索",
|
|
1092
|
+
"importance": "high"
|
|
1093
|
+
}
|
|
1094
|
+
]
|
|
1095
|
+
}
|
|
1096
|
+
],
|
|
1097
|
+
"foreshadowing": [
|
|
1098
|
+
{
|
|
1099
|
+
"chapter": "chapter-05",
|
|
1100
|
+
"content": "神秘人物的出现",
|
|
1101
|
+
"payoffChapter": null,
|
|
1102
|
+
"status": "planted"
|
|
1103
|
+
}
|
|
1104
|
+
]
|
|
1105
|
+
}
|
|
1106
|
+
```
|
|
1107
|
+
|
|
1108
|
+
#### 4. timeline.json
|
|
1109
|
+
|
|
1110
|
+
**更新内容**:
|
|
1111
|
+
- 新增时间线事件
|
|
1112
|
+
- 更新故事时间进度
|
|
1113
|
+
|
|
1114
|
+
**更新依据**:
|
|
1115
|
+
- 分析本章的时间跨度
|
|
1116
|
+
- 识别标志性时间点
|
|
1117
|
+
- 记录重要事件的时间戳
|
|
1118
|
+
|
|
1119
|
+
**示例更新**:
|
|
1120
|
+
```json
|
|
1121
|
+
{
|
|
1122
|
+
"events": [
|
|
1123
|
+
{
|
|
1124
|
+
"day": 15,
|
|
1125
|
+
"time": "14:00",
|
|
1126
|
+
"chapter": "chapter-05",
|
|
1127
|
+
"event": "首次合作任务",
|
|
1128
|
+
"participants": ["林晓", "队长"],
|
|
1129
|
+
"location": "城市中心"
|
|
1130
|
+
}
|
|
1131
|
+
]
|
|
1132
|
+
}
|
|
1133
|
+
```
|
|
1134
|
+
|
|
1135
|
+
### 更新执行流程
|
|
1136
|
+
|
|
1137
|
+
#### Step 1: 分析本章内容
|
|
1138
|
+
|
|
1139
|
+
分析刚完成的章节内容(`stories/*/content/chapter-XX.md`):
|
|
1140
|
+
1. 提取所有出现的角色
|
|
1141
|
+
2. 识别角色互动和关系变化
|
|
1142
|
+
3. 识别情节推进点
|
|
1143
|
+
4. 识别时间线信息
|
|
1144
|
+
|
|
1145
|
+
#### Step 2: 生成更新建议(内部)
|
|
1146
|
+
|
|
1147
|
+
基于分析结果,生成 4 个 tracking 文件的更新内容(JSON diff 格式)
|
|
1148
|
+
|
|
1149
|
+
#### Step 3: 自动应用更新
|
|
1150
|
+
|
|
1151
|
+
**无需用户确认**,直接更新文件:
|
|
1152
|
+
1. 读取现有 tracking 文件
|
|
1153
|
+
2. 合并新内容(保持 JSON 格式正确)
|
|
1154
|
+
3. 写入更新后的文件
|
|
1155
|
+
4. 验证 JSON 格式有效性
|
|
1156
|
+
|
|
1157
|
+
#### Step 4: 记录到 tracking-log.md
|
|
1158
|
+
|
|
1159
|
+
追加更新记录到 `stories/*/spec/tracking/tracking-log.md`。
|
|
1160
|
+
|
|
1161
|
+
**日志格式**:
|
|
1162
|
+
```markdown
|
|
1163
|
+
## [时间戳] - /write chapter-XX
|
|
1164
|
+
|
|
1165
|
+
### 命令执行
|
|
1166
|
+
- **命令**: `/write chapter-XX`
|
|
1167
|
+
- **章节**: Chapter XX - [章节标题]
|
|
1168
|
+
- **字数**: XXXX 字
|
|
1169
|
+
- **执行者**: AI
|
|
1170
|
+
- **状态**: 已自动更新
|
|
1171
|
+
|
|
1172
|
+
### 自动更新内容
|
|
1173
|
+
|
|
1174
|
+
#### character-state.json
|
|
1175
|
+
\`\`\`diff
|
|
1176
|
+
"林晓": {
|
|
1177
|
+
- "lastAppearance": "chapter-04",
|
|
1178
|
+
+ "lastAppearance": "chapter-05",
|
|
1179
|
+
"keyStates": {
|
|
1180
|
+
- "mental": "平静",
|
|
1181
|
+
+ "mental": "焦虑"
|
|
1182
|
+
}
|
|
1183
|
+
}
|
|
1184
|
+
\`\`\`
|
|
1185
|
+
|
|
1186
|
+
#### relationships.json
|
|
1187
|
+
\`\`\`diff
|
|
1188
|
+
+ {
|
|
1189
|
+
+ "from": "林晓",
|
|
1190
|
+
+ "to": "队长",
|
|
1191
|
+
+ "type": "信任",
|
|
1192
|
+
+ "strength": 0.6,
|
|
1193
|
+
+ "lastUpdate": "chapter-05"
|
|
1194
|
+
+ }
|
|
1195
|
+
\`\`\`
|
|
1196
|
+
|
|
1197
|
+
#### plot-tracker.json
|
|
1198
|
+
\`\`\`diff
|
|
1199
|
+
"plotLines": [
|
|
1200
|
+
{
|
|
1201
|
+
"id": "主线-001",
|
|
1202
|
+
- "progress": 0.2,
|
|
1203
|
+
+ "progress": 0.3,
|
|
1204
|
+
- "lastUpdate": "chapter-04",
|
|
1205
|
+
+ "lastUpdate": "chapter-05"
|
|
1206
|
+
}
|
|
1207
|
+
]
|
|
1208
|
+
\`\`\`
|
|
1209
|
+
|
|
1210
|
+
#### timeline.json
|
|
1211
|
+
\`\`\`diff
|
|
1212
|
+
+ {
|
|
1213
|
+
+ "day": 15,
|
|
1214
|
+
+ "time": "14:00",
|
|
1215
|
+
+ "chapter": "chapter-05",
|
|
1216
|
+
+ "event": "首次合作任务"
|
|
1217
|
+
+ }
|
|
1218
|
+
\`\`\`
|
|
1219
|
+
|
|
1220
|
+
### 更新依据
|
|
1221
|
+
- **角色分析**: 检测到林晓在本章出现,状态从平静转为焦虑
|
|
1222
|
+
- **关系分析**: 林晓与队长在本章首次合作,建立初步信任关系
|
|
1223
|
+
- **情节推进**: 主线情节推进 10%,发现第一条线索
|
|
1224
|
+
- **时间线**: 故事进展到第 15 天,记录关键事件时间点
|
|
1225
|
+
|
|
1226
|
+
---
|
|
1227
|
+
```
|
|
1228
|
+
|
|
1229
|
+
### 错误处理
|
|
1230
|
+
|
|
1231
|
+
#### 如果 tracking 文件不存在
|
|
1232
|
+
|
|
1233
|
+
```
|
|
1234
|
+
⚠️ 警告:tracking 文件不存在
|
|
1235
|
+
- 文件:[文件路径]
|
|
1236
|
+
- 建议:运行 `/track --init` 初始化 tracking 文件
|
|
1237
|
+
- 跳过本次更新
|
|
1238
|
+
```
|
|
1239
|
+
|
|
1240
|
+
#### 如果 JSON 格式错误
|
|
1241
|
+
|
|
1242
|
+
```
|
|
1243
|
+
❌ 错误:tracking 文件格式错误
|
|
1244
|
+
- 文件:[文件路径]
|
|
1245
|
+
- 错误:[JSON 解析错误信息]
|
|
1246
|
+
- 建议:手动修复文件格式后重试
|
|
1247
|
+
- 跳过本次更新
|
|
1248
|
+
```
|
|
1249
|
+
|
|
1250
|
+
#### 如果更新失败
|
|
1251
|
+
|
|
1252
|
+
```
|
|
1253
|
+
❌ 错误:更新 tracking 文件失败
|
|
1254
|
+
- 文件:[文件路径]
|
|
1255
|
+
- 错误:[写入错误信息]
|
|
1256
|
+
- 建议:检查文件权限和磁盘空间
|
|
1257
|
+
- 更新内容已记录到 tracking-log.md,可手动补充
|
|
1258
|
+
```
|
|
1259
|
+
|
|
1260
|
+
### 性能考虑
|
|
1261
|
+
|
|
1262
|
+
- **批量更新**: 4 个文件一次性更新,减少 I/O 操作
|
|
1263
|
+
- **增量写入**: 仅更新变化部分,保留其他内容
|
|
1264
|
+
- **异步日志**: tracking-log.md 追加操作可异步执行
|