novelws 5.1.0 → 5.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 +18 -0
- package/README.md +3 -3
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +0 -5
- package/dist/commands/init.js.map +1 -1
- package/dist/core/config.d.ts +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +1 -2
- package/dist/core/config.js.map +1 -1
- package/dist/utils/diagnostics.d.ts +2 -2
- package/dist/utils/diagnostics.d.ts.map +1 -1
- package/dist/utils/diagnostics.js +46 -59
- package/dist/utils/diagnostics.js.map +1 -1
- package/package.json +1 -1
- package/templates/commands/analyze.md +12 -8
- package/templates/commands/expand.md +28 -18
- package/templates/commands/plan.md +3 -2
- package/templates/commands/specify.md +6 -2
- package/templates/commands/write.md +58 -21
- package/templates/dot-claude/CLAUDE.md +22 -9
- package/templates/resources/anti-ai.md +92 -13
- package/templates/resources/constitution.md +83 -140
- package/templates/resources/style-reference.md +30 -6
- package/templates/volume-summary.md +20 -0
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,24 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [5.2.0] - 2026-02-21
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- **constitution.md 重构** — 删除与 anti-ai.md 重叠 95% 的 "Show not Tell" 段落和无用的 "关联文件" 段落;所有违规信号改为 checklist + `→` 修正动作格式;"软指导"重命名为"结构规范"
|
|
13
|
+
- **anti-ai.md 增强** — 通用禁用词从 ~25 扩充到 ~40(新增心理类、描写类);新增类型特有禁用词段落(玄幻/都市/言情/悬疑各 ~10 词),通过 /specify 注入 style-reference.md;新增 2 个完整正面段落示例;用 HTML 注释标记 /expand 加载区和 /specify 参考区边界
|
|
14
|
+
- **style-reference.md 增强** — 新增"故事类型"字段;每个维度添加类型推荐的 HTML 注释提示;"参考锚点"和"风格禁忌"添加具体示例值
|
|
15
|
+
- **specify.md 联动** — 新增读取 anti-ai.md 权限,步骤 4 添加类型禁用词自动注入到 style-reference.md 风格禁忌字段的逻辑
|
|
16
|
+
- **analyze.md 联动** — 新增读取 anti-ai.md 权限,AI味检测改为对照禁用词表精确检查
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
|
|
20
|
+
- **类型套路警示** — constitution.md 新增玄幻/都市/言情/悬疑四类型常见套路示例
|
|
21
|
+
- **类型特有禁用词** — anti-ai.md 新增按故事类型分组的 AI 味词汇(由 /specify 注入 style-reference.md)
|
|
22
|
+
- **正面段落示例** — anti-ai.md 新增场景展开和对话的完整正面示例段落
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
8
26
|
## [5.1.0] - 2026-02-20
|
|
9
27
|
|
|
10
28
|
### Added
|
package/README.md
CHANGED
|
@@ -101,9 +101,9 @@ novelws init my-novel --model claude-sonnet-4-5-20250929
|
|
|
101
101
|
|
|
102
102
|
| 文件 | 用途 | 加载阶段 |
|
|
103
103
|
|------|------|---------|
|
|
104
|
-
| `resources/constitution.md` |
|
|
105
|
-
| `resources/style-reference.md` |
|
|
106
|
-
| `resources/anti-ai.md` | 反AI
|
|
104
|
+
| `resources/constitution.md` | 创作宪法:4 条硬规则(角色区分、情节反套路、一致性校验、张力维持)+ 结构规范 | /specify |
|
|
105
|
+
| `resources/style-reference.md` | 风格参考:9 维度风格锚点,含类型感知提示,由 /specify 自动填充 | /expand |
|
|
106
|
+
| `resources/anti-ai.md` | 反AI规范:3 层防御(词汇级 ~40 禁用词 + 句段级 + 叙述级)+ 类型特有禁用词 | /specify, /expand, /analyze |
|
|
107
107
|
|
|
108
108
|
## Tracking 系统
|
|
109
109
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAetD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAetD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuH1D"}
|
package/dist/commands/init.js
CHANGED
|
@@ -44,7 +44,6 @@ export function registerInitCommand(program) {
|
|
|
44
44
|
paths.claude,
|
|
45
45
|
paths.commands,
|
|
46
46
|
paths.resources,
|
|
47
|
-
paths.tracking,
|
|
48
47
|
paths.stories,
|
|
49
48
|
];
|
|
50
49
|
for (const dir of baseDirs) {
|
|
@@ -81,10 +80,6 @@ export function registerInitCommand(program) {
|
|
|
81
80
|
await fs.copy(templates.resources, paths.resources);
|
|
82
81
|
spinner.text = '已安装资源文件...';
|
|
83
82
|
}
|
|
84
|
-
// 复制 tracking/ 模板(4 个 JSON 文件)
|
|
85
|
-
if (await fs.pathExists(templates.tracking)) {
|
|
86
|
-
await fs.copy(templates.tracking, paths.tracking);
|
|
87
|
-
}
|
|
88
83
|
// Git 初始化
|
|
89
84
|
if (options.git !== false) {
|
|
90
85
|
try {
|
|
@@ -1 +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,EACL,sBAAsB,EACtB,eAAe,EACf,iBAAiB,GAElB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,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,gBAAgB,EAAE,eAAe,CAAC;SACzC,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,MAAM;gBACZ,KAAK,CAAC,QAAQ;gBACd,KAAK,CAAC,SAAS;gBACf,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/core/config.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export declare const DIRS: {
|
|
|
12
12
|
readonly TEMPLATES: "templates";
|
|
13
13
|
readonly TRACKING: "tracking";
|
|
14
14
|
readonly RESOURCES: "resources";
|
|
15
|
+
readonly VOLUMES: "volumes";
|
|
15
16
|
};
|
|
16
17
|
/** 文件名常量 */
|
|
17
18
|
export declare const FILES: {
|
|
@@ -37,7 +38,6 @@ export declare function getProjectPaths(projectRoot: string): {
|
|
|
37
38
|
commands: string;
|
|
38
39
|
resources: string;
|
|
39
40
|
resourcesConfig: string;
|
|
40
|
-
tracking: string;
|
|
41
41
|
stories: string;
|
|
42
42
|
};
|
|
43
43
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA6CH,YAAY;AACZ,eAAO,MAAM,IAAI
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA6CH,YAAY;AACZ,eAAO,MAAM,IAAI;;;;;;;;CAQP,CAAC;AAEX,YAAY;AACZ,eAAO,MAAM,KAAK;;;CAGR,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;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM;;;;;;;;EAalD;AAED;;GAEG;AACH,wBAAgB,sBAAsB;;;;;;EASrC"}
|
package/dist/core/config.js
CHANGED
|
@@ -51,6 +51,7 @@ export const DIRS = {
|
|
|
51
51
|
TEMPLATES: 'templates',
|
|
52
52
|
TRACKING: 'tracking',
|
|
53
53
|
RESOURCES: 'resources',
|
|
54
|
+
VOLUMES: 'volumes',
|
|
54
55
|
};
|
|
55
56
|
/** 文件名常量 */
|
|
56
57
|
export const FILES = {
|
|
@@ -97,8 +98,6 @@ export function getProjectPaths(projectRoot) {
|
|
|
97
98
|
// resources/
|
|
98
99
|
resources: path.join(projectRoot, DIRS.RESOURCES),
|
|
99
100
|
resourcesConfig: path.join(projectRoot, DIRS.RESOURCES, FILES.CONFIG),
|
|
100
|
-
// tracking/
|
|
101
|
-
tracking: path.join(projectRoot, DIRS.TRACKING),
|
|
102
101
|
// stories/
|
|
103
102
|
stories: path.join(projectRoot, DIRS.STORIES),
|
|
104
103
|
};
|
package/dist/core/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB;;;GAGG;AACH,SAAS,eAAe,CAAC,QAAgB;IACvC,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YAClD,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,mBAAmB;YACnB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa;IACpB,eAAe;IACf,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE,CAAC;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,mBAAmB;IACnB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;AACvB,CAAC;AAED,kBAAkB;AAClB,MAAM,YAAY,GAAG,eAAe,CAAC,aAAa,EAAE,CAAC,CAAC;AAEtD,YAAY;AACZ,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,11 +34,11 @@ export declare class ProjectDiagnostics {
|
|
|
34
34
|
*/
|
|
35
35
|
checkProjectStructure(projectRoot: string): Promise<CheckResult>;
|
|
36
36
|
/**
|
|
37
|
-
* 检查 2: tracking
|
|
37
|
+
* 检查 2: tracking 文件是否存在(卷级分片架构下按需创建)
|
|
38
38
|
*/
|
|
39
39
|
checkTrackingFiles(projectRoot: string): Promise<CheckResult>;
|
|
40
40
|
/**
|
|
41
|
-
* 检查 3: JSON
|
|
41
|
+
* 检查 3: JSON 文件完整性(已合并到检查 2 的卷级扫描中)
|
|
42
42
|
*/
|
|
43
43
|
checkFileIntegrity(projectRoot: string): Promise<CheckResult>;
|
|
44
44
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/utils/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,aAAa;AACb,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,WAAW;AACX,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,YAAY;AACZ,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,qBAAa,kBAAkB;IAC7B;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmBrF;;OAEG;IACG,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA2BtE;;OAEG;IACG,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAsCnE;;OAEG;IACG,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/utils/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,aAAa;AACb,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,WAAW;AACX,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,YAAY;AACZ,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,qBAAa,kBAAkB;IAC7B;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmBrF;;OAEG;IACG,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA2BtE;;OAEG;IACG,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAsCnE;;OAEG;IACG,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAoBnE;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM;IAuB9C,OAAO,CAAC,eAAe;CAWxB"}
|
|
@@ -54,76 +54,63 @@ export class ProjectDiagnostics {
|
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
56
|
/**
|
|
57
|
-
* 检查 2: tracking
|
|
57
|
+
* 检查 2: tracking 文件是否存在(卷级分片架构下按需创建)
|
|
58
58
|
*/
|
|
59
59
|
async checkTrackingFiles(projectRoot) {
|
|
60
|
-
const
|
|
61
|
-
if (!await fs.pathExists(
|
|
62
|
-
return {
|
|
63
|
-
name: 'Tracking 文件',
|
|
64
|
-
passed: false,
|
|
65
|
-
message: 'tracking 目录不存在',
|
|
66
|
-
fix: 'novelws init',
|
|
67
|
-
};
|
|
60
|
+
const storiesDir = path.join(projectRoot, 'stories');
|
|
61
|
+
if (!await fs.pathExists(storiesDir)) {
|
|
62
|
+
return { name: 'Tracking 文件', passed: true, message: 'tracking 文件在 /write 首次执行时按需创建' };
|
|
68
63
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
64
|
+
// 扫描 stories/*/volumes/*/tracking/ 是否有损坏的 JSON
|
|
65
|
+
const stories = await fs.readdir(storiesDir).catch(() => []);
|
|
66
|
+
for (const story of stories) {
|
|
67
|
+
const volumesDir = path.join(storiesDir, story, 'volumes');
|
|
68
|
+
if (!await fs.pathExists(volumesDir))
|
|
69
|
+
continue;
|
|
70
|
+
const volumes = await fs.readdir(volumesDir).catch(() => []);
|
|
71
|
+
for (const vol of volumes) {
|
|
72
|
+
const trackingDir = path.join(volumesDir, vol, 'tracking');
|
|
73
|
+
if (!await fs.pathExists(trackingDir))
|
|
74
|
+
continue;
|
|
75
|
+
const jsonFiles = await fs.readdir(trackingDir).catch(() => []);
|
|
76
|
+
for (const file of jsonFiles.filter(f => f.endsWith('.json'))) {
|
|
77
|
+
try {
|
|
78
|
+
const content = await fs.readFile(path.join(trackingDir, file), 'utf-8');
|
|
79
|
+
JSON.parse(content);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return {
|
|
83
|
+
name: 'Tracking 文件',
|
|
84
|
+
passed: false,
|
|
85
|
+
message: `JSON 格式损坏: ${story}/volumes/${vol}/tracking/${file}`,
|
|
86
|
+
fix: '手动修复损坏的 JSON 文件',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
79
90
|
}
|
|
80
91
|
}
|
|
81
|
-
|
|
82
|
-
return { name: 'Tracking 文件', passed: true, message: 'tracking 文件存在' };
|
|
83
|
-
}
|
|
84
|
-
return {
|
|
85
|
-
name: 'Tracking 文件',
|
|
86
|
-
passed: false,
|
|
87
|
-
message: `缺少 tracking 文件: ${missing.join(', ')}`,
|
|
88
|
-
fix: 'novelws init',
|
|
89
|
-
};
|
|
92
|
+
return { name: 'Tracking 文件', passed: true, message: 'tracking 文件正常' };
|
|
90
93
|
}
|
|
91
94
|
/**
|
|
92
|
-
* 检查 3: JSON
|
|
95
|
+
* 检查 3: JSON 文件完整性(已合并到检查 2 的卷级扫描中)
|
|
93
96
|
*/
|
|
94
97
|
async checkFileIntegrity(projectRoot) {
|
|
95
|
-
const
|
|
96
|
-
if (
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
if (await fs.pathExists(filePath)) {
|
|
109
|
-
try {
|
|
110
|
-
const content = await fs.readFile(filePath, 'utf-8');
|
|
111
|
-
JSON.parse(content);
|
|
112
|
-
}
|
|
113
|
-
catch {
|
|
114
|
-
corrupted.push(file);
|
|
115
|
-
}
|
|
98
|
+
const configPath = path.join(projectRoot, 'resources', 'config.json');
|
|
99
|
+
if (await fs.pathExists(configPath)) {
|
|
100
|
+
try {
|
|
101
|
+
const content = await fs.readFile(configPath, 'utf-8');
|
|
102
|
+
JSON.parse(content);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return {
|
|
106
|
+
name: '文件完整性',
|
|
107
|
+
passed: false,
|
|
108
|
+
message: 'config.json 格式损坏',
|
|
109
|
+
fix: '手动修复 resources/config.json',
|
|
110
|
+
};
|
|
116
111
|
}
|
|
117
112
|
}
|
|
118
|
-
|
|
119
|
-
return { name: '文件完整性', passed: true, message: 'JSON 文件格式正确' };
|
|
120
|
-
}
|
|
121
|
-
return {
|
|
122
|
-
name: '文件完整性',
|
|
123
|
-
passed: false,
|
|
124
|
-
message: `JSON 格式损坏: ${corrupted.join(', ')}`,
|
|
125
|
-
fix: '手动修复损坏的 JSON 文件',
|
|
126
|
-
};
|
|
113
|
+
return { name: '文件完整性', passed: true, message: '配置文件格式正确' };
|
|
127
114
|
}
|
|
128
115
|
/**
|
|
129
116
|
* 格式化诊断报告为用户友好的字符串
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/utils/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAyBpD,MAAM,OAAO,kBAAkB;IAC7B;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,KAAY,EAAE,OAAuB;QACvD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC/B,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,WAAW,CAAC;YAC/C,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC;YAC5C,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC;SAC7C,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM;aACjB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;aAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAI,CAAC,CAAC;QAEpB,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,OAAO;YACpB,MAAM;YACN,KAAK;YACL,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;SACtC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,qBAAqB,CAAC,WAAmB;QAC7C,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,YAAY,GAAG;YACnB,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE;YAC7C,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE;YACxC,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,kBAAkB,EAAE;SACpD,CAAC;QAEF,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QAC3D,CAAC;QAED,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,SAAS,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACtC,GAAG,EAAE,cAAc;SACpB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,WAAmB;QAC1C,MAAM,
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/utils/diagnostics.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: 质量检查:对比概要与正文,检测一致性和AI味
|
|
3
3
|
argument-hint: [章节号] [--range start-end]
|
|
4
4
|
recommended-model: claude-sonnet-4-5-20250929
|
|
5
|
-
allowed-tools: Read(//stories/**), Read(//
|
|
5
|
+
allowed-tools: Read(//stories/**), Read(//resources/anti-ai.md), Bash(ls:*)
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
用户输入:$ARGUMENTS
|
|
@@ -16,11 +16,15 @@ allowed-tools: Read(//stories/**), Read(//tracking/**), Bash(ls:*)
|
|
|
16
16
|
- 章节号:分析单章
|
|
17
17
|
- `--range start-end`:批量分析章节范围(如 `--range 1-20`)
|
|
18
18
|
|
|
19
|
+
## 卷定位
|
|
20
|
+
|
|
21
|
+
根据章节号和 `stories/<story>/creative-plan.md` 确定目标章节所属卷(如 `vol-001`)。
|
|
22
|
+
|
|
19
23
|
## 资源加载
|
|
20
24
|
|
|
21
|
-
- 目标章节正文:`stories/<story>/content/chapter-
|
|
22
|
-
- 对应概要:`stories/<story>/content/chapter-
|
|
23
|
-
-
|
|
25
|
+
- 目标章节正文:`stories/<story>/volumes/vol-XXX/content/chapter-YYY.md`
|
|
26
|
+
- 对应概要:`stories/<story>/volumes/vol-XXX/content/chapter-YYY-synopsis.md`
|
|
27
|
+
- 卷级 tracking:`stories/<story>/volumes/vol-XXX/tracking/character-state.json`、`stories/<story>/volumes/vol-XXX/tracking/plot-tracker.json`
|
|
24
28
|
|
|
25
29
|
## 检查项(5项)
|
|
26
30
|
|
|
@@ -58,11 +62,11 @@ allowed-tools: Read(//stories/**), Read(//tracking/**), Bash(ls:*)
|
|
|
58
62
|
评分:✅ / ⚠️ / ❌
|
|
59
63
|
|
|
60
64
|
### 5. AI味检测
|
|
61
|
-
|
|
62
|
-
- AI
|
|
63
|
-
-
|
|
65
|
+
读取 `resources/anti-ai.md` 的禁用词表,对照正文检查:
|
|
66
|
+
- AI高频词使用(对照禁用词汇清单逐项检查)
|
|
67
|
+
- 句式重复度(连续相同结构、段落开头重复)
|
|
64
68
|
- 空洞描写比例
|
|
65
|
-
-
|
|
69
|
+
- 段落结构单一性(是否全部 3-4 句等长段落)
|
|
66
70
|
|
|
67
71
|
评分:✅ 自然 / ⚠️ 轻微AI味 / ❌ 明显AI味
|
|
68
72
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: 将章节概要扩写为 3000-5000 字正文
|
|
3
3
|
argument-hint: [章节号] [--batch N]
|
|
4
4
|
recommended-model: claude-opus-4-6
|
|
5
|
-
allowed-tools: Read(//stories/**), Write(//stories/**/content/**), Read(//tracking/**), Write(//tracking/**), Read(//resources/style-reference.md), Read(//resources/anti-ai.md), Read(//resources/constitution.md), Bash(ls:*)
|
|
5
|
+
allowed-tools: Read(//stories/**), Write(//stories/**/content/**), Read(//stories/**/tracking/**), Write(//stories/**/tracking/**), Read(//resources/style-reference.md), Read(//resources/anti-ai.md), Read(//resources/constitution.md), Bash(ls:*)
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
用户输入:$ARGUMENTS
|
|
@@ -25,6 +25,15 @@ allowed-tools: Read(//stories/**), Write(//stories/**/content/**), Read(//tracki
|
|
|
25
25
|
- 章节号:从 $ARGUMENTS 提取
|
|
26
26
|
- `--batch N`:批量扩写 N 章(最大 10),从指定章节号开始
|
|
27
27
|
|
|
28
|
+
## 卷定位
|
|
29
|
+
|
|
30
|
+
根据章节号和 `stories/<story>/creative-plan.md` 中每卷的章节范围,确定目标章节所属的卷目录(如 `vol-001`)。
|
|
31
|
+
|
|
32
|
+
路径规则:
|
|
33
|
+
- 概要:`stories/<story>/volumes/vol-XXX/content/chapter-YYY-synopsis.md`
|
|
34
|
+
- 正文:`stories/<story>/volumes/vol-XXX/content/chapter-YYY.md`
|
|
35
|
+
- Tracking:`stories/<story>/volumes/vol-XXX/tracking/`
|
|
36
|
+
|
|
28
37
|
## 资源加载(3 层结构,从文件系统重新加载)
|
|
29
38
|
|
|
30
39
|
所有资源必须从文件系统读取,不复用对话中的缓存。总上下文控制在 3500 字以内。
|
|
@@ -33,37 +42,38 @@ allowed-tools: Read(//stories/**), Write(//stories/**/content/**), Read(//tracki
|
|
|
33
42
|
|
|
34
43
|
1. **specification.md 摘要**:读取 `stories/<story>/specification.md`,提取 100 字核心摘要(类型 + 主角 + 核心冲突)
|
|
35
44
|
2. **当前卷大纲**:读取 `stories/<story>/creative-plan.md`,只提取当前章节所属卷的段落
|
|
45
|
+
3. **volume-summary.md**:读取 `stories/<story>/volumes/vol-XXX/volume-summary.md`(跨卷上下文,500-1000 字)
|
|
36
46
|
|
|
37
47
|
### 第 2 层 — 章节核心
|
|
38
48
|
|
|
39
|
-
|
|
40
|
-
|
|
49
|
+
4. **当前章概要**:读取 `stories/<story>/volumes/vol-XXX/content/chapter-YYY-synopsis.md`(200-500字)
|
|
50
|
+
5. **前一章正文末尾**:读取前一章 `chapter-YYY.md` 的最后 500-800 字(衔接用)。如果前一章在上一卷,从上一卷的 content/ 读取。如果前一章尚未扩写,读取前一章概要代替
|
|
41
51
|
|
|
42
52
|
### 第 3 层 — 细节支撑
|
|
43
53
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
54
|
+
6. **本章出场角色状态**:从概要中提取出场角色列表,然后从 `volumes/vol-XXX/tracking/character-state.json` 只提取这些角色的条目。如果角色在本卷 tracking 中不存在,从 volume-summary.md 的活跃角色状态中查找
|
|
55
|
+
7. **本章活跃伏笔**:从 `volumes/vol-XXX/tracking/plot-tracker.json` 提取 status=planted 或 status=hinted 的伏笔。补充 volume-summary.md 中的活跃伏笔
|
|
56
|
+
8. **本章相关角色关系**:从 `volumes/vol-XXX/tracking/relationships.json` 提取本章出场角色之间的关系条目(最多 5 条)。补充 volume-summary.md 中的关键关系
|
|
57
|
+
9. **风格参考**:读取 `resources/style-reference.md`
|
|
58
|
+
10. **反AI规范**:读取 `resources/anti-ai.md`
|
|
49
59
|
|
|
50
60
|
**上下文预算**:
|
|
51
61
|
|
|
52
62
|
| 层级 | 预估字数 |
|
|
53
63
|
|------|---------|
|
|
54
|
-
| 第 1 层 全局 |
|
|
64
|
+
| 第 1 层 全局 | 700-1400 字(含 volume-summary) |
|
|
55
65
|
| 第 2 层 章节 | 700-1300 字 |
|
|
56
66
|
| 第 3 层 细节 | 800-1500 字 |
|
|
57
|
-
| **总计** | **
|
|
67
|
+
| **总计** | **2200-4200 字** |
|
|
58
68
|
|
|
59
|
-
|
|
69
|
+
每层加载完后检查上下文预算,超出则截断。volume-summary.md 超长时只保留活跃角色状态和活跃伏笔部分。
|
|
60
70
|
|
|
61
71
|
## 执行步骤
|
|
62
72
|
|
|
63
73
|
### 1. 前置检查
|
|
64
74
|
|
|
65
75
|
- 确认目标章节的 synopsis.md 存在,否则提示先运行 /write
|
|
66
|
-
- 确认目标章节的正文 chapter-
|
|
76
|
+
- 确认目标章节的正文 chapter-YYY.md 不存在(避免覆盖),如已存在则询问是否覆盖
|
|
67
77
|
|
|
68
78
|
### 2. 加载上下文
|
|
69
79
|
|
|
@@ -75,29 +85,29 @@ allowed-tools: Read(//stories/**), Write(//stories/**/content/**), Read(//tracki
|
|
|
75
85
|
|
|
76
86
|
- **忠实于概要**:核心事件、出场角色、情感走向必须与概要一致
|
|
77
87
|
- **全局一致性**:正文必须与 specification.md 的类型定位和 creative-plan.md 的卷级设计保持一致
|
|
78
|
-
- **角色关系驱动**:对话和互动必须体现 relationships.json 中的关系动态
|
|
88
|
+
- **角色关系驱动**:对话和互动必须体现 tracking/relationships.json 中的关系动态
|
|
79
89
|
- **文学表达**:专注于场景描写、对话、心理活动、动作细节
|
|
80
90
|
- **风格一致**:遵循 style-reference.md 的风格设定
|
|
81
91
|
- **反AI规范**:遵循 anti-ai.md 的写作规范
|
|
82
92
|
- **衔接自然**:与前一章末尾自然衔接
|
|
83
93
|
- **伏笔落地**:概要中标记的伏笔必须在正文中体现
|
|
84
94
|
|
|
85
|
-
写入 `stories/<story>/content/chapter-
|
|
95
|
+
写入 `stories/<story>/volumes/vol-XXX/content/chapter-YYY.md`。
|
|
86
96
|
|
|
87
|
-
### 4.
|
|
97
|
+
### 4. 补充卷级 tracking 细节
|
|
88
98
|
|
|
89
99
|
扩写完成后,检查正文中是否产生了概要中没有的新细节:
|
|
90
|
-
- 对话中透露的新信息 → 更新 character-state 或 relationships
|
|
100
|
+
- 对话中透露的新信息 → 更新 `volumes/vol-XXX/tracking/` 中的 character-state 或 relationships
|
|
91
101
|
- 新的场景细节 → 如有重要设定变化,更新相关 tracking
|
|
92
102
|
|
|
93
103
|
### 5. 批量模式
|
|
94
104
|
|
|
95
105
|
如果指定了 `--batch N`,重复步骤 2-4 共 N 次。每章完成后输出进度和字数。
|
|
96
106
|
|
|
97
|
-
|
|
107
|
+
**批量模式资源隔离**:每章都必须重新从文件系统加载所有资源。批量模式中每章视为独立的扩写任务。如果批量过程中跨卷,需要切换到下一卷的 tracking 和 content 目录。
|
|
98
108
|
|
|
99
109
|
### 6. 后续建议
|
|
100
110
|
|
|
101
|
-
单章完成:「第X章扩写完成(XXXX
|
|
111
|
+
单章完成:「第X章扩写完成(XXXX字,vol-XXX)。继续 /expand [X+1] 或使用 /analyze X 检查质量。」
|
|
102
112
|
|
|
103
113
|
批量完成:「第X-Y章扩写完成(共Z章,平均XXXX字/章)。使用 /analyze --range X-Y 批量检查质量。」
|
|
@@ -48,7 +48,8 @@ allowed-tools: Read(//stories/**/specification.md), Read(//stories/**/creative-p
|
|
|
48
48
|
- 主线概要:
|
|
49
49
|
|
|
50
50
|
## 第一卷:[卷名]
|
|
51
|
-
-
|
|
51
|
+
- 卷目录:vol-001
|
|
52
|
+
- 章节范围:第1-XX章(chapter-001 到 chapter-XXX)
|
|
52
53
|
- 核心主题:
|
|
53
54
|
- 核心冲突:
|
|
54
55
|
- 转折点:
|
|
@@ -67,4 +68,4 @@ allowed-tools: Read(//stories/**/specification.md), Read(//stories/**/creative-p
|
|
|
67
68
|
|
|
68
69
|
### 4. 后续建议
|
|
69
70
|
|
|
70
|
-
输出:「卷级大纲生成完成。下一步请使用 /write 1
|
|
71
|
+
输出:「卷级大纲生成完成。下一步请使用 /write 1 开始逐章生成剧情概要(系统会自动创建 volumes/vol-001/ 目录结构)。可用 /write --batch 20 批量生成。」
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: 定义故事规格,明确要创造什么样的作品
|
|
3
3
|
argument-hint: [故事描述]
|
|
4
|
-
allowed-tools: Read(//stories/**/specification.md), Write(//stories/**/specification.md), Read(//resources/constitution.md), Write(//resources/style-reference.md), Bash(ls:*), Bash(mkdir:*)
|
|
4
|
+
allowed-tools: Read(//stories/**/specification.md), Write(//stories/**/specification.md), Read(//resources/constitution.md), Read(//resources/anti-ai.md), Write(//resources/style-reference.md), Bash(ls:*), Bash(mkdir:*)
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
用户输入:$ARGUMENTS
|
|
@@ -70,7 +70,11 @@ allowed-tools: Read(//stories/**/specification.md), Write(//stories/**/specifica
|
|
|
70
70
|
|
|
71
71
|
### 4. 生成风格参考
|
|
72
72
|
|
|
73
|
-
如果 `resources/style-reference.md` 仍是模板默认内容(含 `[第一人称/第三人称有限/第三人称全知]
|
|
73
|
+
如果 `resources/style-reference.md` 仍是模板默认内容(含 `[第一人称/第三人称有限/第三人称全知]`),根据用户的风格偏好自动填充:
|
|
74
|
+
|
|
75
|
+
- 在「故事类型」字段填入步骤 2 中确定的类型
|
|
76
|
+
- 参考模板中的 HTML 注释提示,为每个维度选择符合该类型的默认值(用户未明确指定时)
|
|
77
|
+
- 读取 `resources/anti-ai.md` 的「类型特有禁用词」段落,将对应类型的禁用词追加到「风格禁忌」字段
|
|
74
78
|
|
|
75
79
|
### 5. 后续建议
|
|
76
80
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: 逐章生成剧情概要(200-500字),同步更新 tracking
|
|
3
3
|
argument-hint: [章节号] [--batch N]
|
|
4
4
|
recommended-model: claude-opus-4-6
|
|
5
|
-
allowed-tools: Read(//stories/**), Write(//stories
|
|
5
|
+
allowed-tools: Read(//stories/**), Write(//stories/**), Bash(ls:*), Bash(mkdir:*)
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
用户输入:$ARGUMENTS
|
|
@@ -16,26 +16,63 @@ allowed-tools: Read(//stories/**), Write(//stories/**/content/**), Read(//tracki
|
|
|
16
16
|
- 章节号:从 $ARGUMENTS 提取,如 `1`、`42`
|
|
17
17
|
- `--batch N`:批量生成 N 章概要(最大 20),从指定章节号开始
|
|
18
18
|
|
|
19
|
-
##
|
|
19
|
+
## 卷定位
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
根据章节号和 `stories/<story>/creative-plan.md` 中每卷的章节范围,确定目标章节所属的卷目录(如 `vol-001`)。
|
|
22
|
+
|
|
23
|
+
路径规则:
|
|
24
|
+
- 概要:`stories/<story>/volumes/vol-XXX/content/chapter-YYY-synopsis.md`
|
|
25
|
+
- Tracking:`stories/<story>/volumes/vol-XXX/tracking/`
|
|
26
|
+
|
|
27
|
+
### 首次写入某卷时的初始化
|
|
28
|
+
|
|
29
|
+
如果 `volumes/vol-XXX/` 目录不存在,自动创建:
|
|
30
|
+
|
|
31
|
+
1. 创建 `volumes/vol-XXX/content/` 和 `volumes/vol-XXX/tracking/`
|
|
32
|
+
2. 初始化 4 个空 tracking 文件(同 templates/tracking/ 的初始内容)
|
|
33
|
+
3. 如果是第一卷(vol-001),生成初始 volume-summary.md(空状态,从 specification.md 提取基本信息)
|
|
34
|
+
4. 如果不是第一卷,执行「卷切换」流程(见下方)
|
|
35
|
+
|
|
36
|
+
### 卷切换流程
|
|
37
|
+
|
|
38
|
+
当目标章节属于新卷时(上一卷已完成):
|
|
39
|
+
|
|
40
|
+
1. 读取上一卷 `volumes/vol-NNN/tracking/` 的 4 个 JSON 文件
|
|
41
|
+
2. 读取上一卷最后一章 synopsis 的章末钩子
|
|
42
|
+
3. 读取 `creative-plan.md` 中下一卷的大纲段落
|
|
43
|
+
4. 生成新卷的 `volume-summary.md`:
|
|
44
|
+
- 故事进度:已完成的章节范围
|
|
45
|
+
- 活跃角色状态:从 character-state.json 提取最近 2 卷出场过的角色
|
|
46
|
+
- 活跃伏笔:从 plot-tracker.json 提取 status=planted/hinted 的条目
|
|
47
|
+
- 关键关系:从 relationships.json 提取活跃角色间的关系
|
|
48
|
+
- 待续悬念:上一卷末章的章末钩子
|
|
49
|
+
5. volume-summary.md 控制在 500-1000 字
|
|
50
|
+
|
|
51
|
+
## 资源加载(卷级)
|
|
52
|
+
|
|
53
|
+
1. **specification.md 摘要**:读取 `stories/<story>/specification.md`,提取 100 字核心摘要(类型 + 主角 + 核心冲突)
|
|
54
|
+
2. **当前卷大纲**:读取 `stories/<story>/creative-plan.md`,只提取当前卷的段落
|
|
55
|
+
3. **volume-summary.md**:读取 `stories/<story>/volumes/vol-XXX/volume-summary.md`(跨卷上下文)
|
|
56
|
+
4. **本卷前序概要标题列表**:扫描 `stories/<story>/volumes/vol-XXX/content/chapter-*-synopsis.md`,只读取每个文件的第一行标题
|
|
57
|
+
5. **前一章概要全文**:读取前一章的 synopsis.md(200-500 字)。如果前一章在上一卷,从上一卷的 content/ 读取
|
|
25
58
|
|
|
26
59
|
**不加载**:resources 目录任何文件、tracking 文件(写入时直接追加)
|
|
27
60
|
|
|
28
61
|
## 执行步骤
|
|
29
62
|
|
|
30
|
-
### 1.
|
|
63
|
+
### 1. 确定故事目录、章节号和所属卷
|
|
64
|
+
|
|
65
|
+
从 $ARGUMENTS 和 `stories/` 目录确定当前故事,从 creative-plan.md 确定章节所属卷。
|
|
66
|
+
|
|
67
|
+
### 2. 确保卷目录存在
|
|
31
68
|
|
|
32
|
-
|
|
69
|
+
如果卷目录不存在,执行初始化或卷切换流程。
|
|
33
70
|
|
|
34
|
-
###
|
|
71
|
+
### 3. 加载上下文
|
|
35
72
|
|
|
36
73
|
按上述「资源加载」规则加载最小上下文。
|
|
37
74
|
|
|
38
|
-
###
|
|
75
|
+
### 4. 生成概要
|
|
39
76
|
|
|
40
77
|
为当前章节生成 200-500 字纯剧情概要,包含:
|
|
41
78
|
|
|
@@ -45,35 +82,35 @@ allowed-tools: Read(//stories/**), Write(//stories/**/content/**), Read(//tracki
|
|
|
45
82
|
- **情感走向**:本章的情感基调和变化
|
|
46
83
|
- **章末钩子**:本章结尾的悬念或引子
|
|
47
84
|
|
|
48
|
-
写入 `stories/<story>/content/chapter-
|
|
85
|
+
写入 `stories/<story>/volumes/vol-XXX/content/chapter-YYY-synopsis.md`(YYY 为三位数补零)。
|
|
49
86
|
|
|
50
|
-
###
|
|
87
|
+
### 5. 更新卷级 tracking
|
|
51
88
|
|
|
52
|
-
根据概要内容,更新
|
|
89
|
+
根据概要内容,更新 `stories/<story>/volumes/vol-XXX/tracking/` 下的 4 个文件:
|
|
53
90
|
|
|
54
|
-
**
|
|
91
|
+
**character-state.json**:
|
|
55
92
|
- 新出场角色:添加条目(role, status, location, state, lastAppearance)
|
|
56
93
|
- 已有角色:更新 status、location、state、lastAppearance
|
|
57
94
|
|
|
58
|
-
**
|
|
95
|
+
**relationships.json**:
|
|
59
96
|
- 新关系:添加条目(from, to, type, note, lastUpdate)
|
|
60
97
|
- 关系变化:更新 note 和 lastUpdate
|
|
61
98
|
|
|
62
|
-
**
|
|
99
|
+
**plot-tracker.json**:
|
|
63
100
|
- 更新 currentChapter
|
|
64
101
|
- 新情节线:添加到 plotlines(name, status, description, keyChapters)
|
|
65
102
|
- 伏笔埋设:添加到 foreshadowing(id, content, plantedAt, status=planted)
|
|
66
103
|
- 伏笔回收:更新 resolveAt 和 status=resolved
|
|
67
104
|
|
|
68
|
-
**
|
|
105
|
+
**timeline.json**:
|
|
69
106
|
- 添加本章事件到 events(chapter, time, event)
|
|
70
107
|
|
|
71
|
-
###
|
|
108
|
+
### 6. 批量模式
|
|
72
109
|
|
|
73
|
-
如果指定了 `--batch N`,重复步骤
|
|
110
|
+
如果指定了 `--batch N`,重复步骤 3-5 共 N 次。如果批量过程中跨卷,自动触发卷切换。
|
|
74
111
|
|
|
75
|
-
###
|
|
112
|
+
### 7. 后续建议
|
|
76
113
|
|
|
77
|
-
单章完成:「第X
|
|
114
|
+
单章完成:「第X章概要已生成(vol-XXX)。继续 /write [X+1] 或 /write --batch 20 批量生成。」
|
|
78
115
|
|
|
79
116
|
批量完成:「第X-Y章概要已生成(共Z章)。继续 /write [Y+1] --batch 20 或开始 /expand [章节号] 扩写。」
|
|
@@ -35,17 +35,30 @@
|
|
|
35
35
|
| resources/style-reference.md | 风格参考 | /expand |
|
|
36
36
|
| resources/anti-ai.md | 反AI规范 | /expand |
|
|
37
37
|
|
|
38
|
-
##
|
|
38
|
+
## 卷级结构
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
40
|
+
每个故事按卷分片存储:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
stories/<story>/
|
|
44
|
+
├── specification.md
|
|
45
|
+
├── creative-plan.md
|
|
46
|
+
└── volumes/
|
|
47
|
+
└── vol-XXX/
|
|
48
|
+
├── volume-summary.md # 跨卷状态快照
|
|
49
|
+
├── tracking/ # 卷级 tracking
|
|
50
|
+
│ ├── character-state.json
|
|
51
|
+
│ ├── plot-tracker.json
|
|
52
|
+
│ ├── relationships.json
|
|
53
|
+
│ └── timeline.json
|
|
54
|
+
└── content/ # 卷级内容
|
|
55
|
+
├── chapter-YYY-synopsis.md
|
|
56
|
+
└── chapter-YYY.md
|
|
57
|
+
```
|
|
46
58
|
|
|
47
|
-
-
|
|
48
|
-
- /
|
|
59
|
+
- volume-summary.md 在卷切换时自动生成,是当前卷的入口条件
|
|
60
|
+
- /write 完成后自动更新卷级 tracking 骨架
|
|
61
|
+
- /expand 完成后补充卷级 tracking 细节
|
|
49
62
|
|
|
50
63
|
## 会话级资源复用
|
|
51
64
|
|
|
@@ -1,16 +1,95 @@
|
|
|
1
1
|
# 反AI写作规范
|
|
2
2
|
|
|
3
3
|
## 核心原则
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
4
|
+
自然表达,像真人写的。以下规则按从微观到宏观三层组织。
|
|
5
|
+
|
|
6
|
+
<!-- === /expand 加载区 开始 === -->
|
|
7
|
+
|
|
8
|
+
## 第一层 — 词汇级
|
|
9
|
+
|
|
10
|
+
### 禁用词汇(出现即替换)
|
|
11
|
+
|
|
12
|
+
**情绪/动作类**:不禁、缓缓、深邃、淡淡、微微、轻轻、默默、静静、悄然、赫然、骤然、竟然、居然、蓦然、倏然、怔怔
|
|
13
|
+
|
|
14
|
+
**转折/连接类**:然而、殊不知、与此同时、值得一提的是、不得不说、毋庸置疑、不言而喻
|
|
15
|
+
|
|
16
|
+
**描写类**:如同XX一般、宛如、仿佛(同一段内超过1次)、映入眼帘、一抹(微笑/苦涩/无奈)、勾勒出、弥漫着、充斥着、笼罩着
|
|
17
|
+
|
|
18
|
+
**心理类**:心中涌起、脑海中浮现、不由得想起、心头一紧、心中暗道
|
|
19
|
+
|
|
20
|
+
### 替代策略
|
|
21
|
+
- 不用副词修饰情绪动词,改用具体动作
|
|
22
|
+
- ❌ 她默默地流下了眼泪
|
|
23
|
+
- ✅ 她偏过头,用袖口蹭了一下眼角
|
|
24
|
+
- 不用"如同/宛如"做比喻,改用直接隐喻或省略
|
|
25
|
+
- ❌ 疼痛如同潮水一般涌来
|
|
26
|
+
- ✅ 疼痛从断骨处一波一波地涌上来
|
|
27
|
+
|
|
28
|
+
## 第二层 — 句段级
|
|
29
|
+
|
|
30
|
+
### 句式变化
|
|
31
|
+
- 禁止连续 3 个句子使用相同结构(如连续主谓宾、连续"他...他...他...")
|
|
32
|
+
- 禁止连续 2 个段落以相同方式开头(如都以角色名开头、都以环境描写开头)
|
|
33
|
+
- 长句后跟短句形成节奏对比
|
|
34
|
+
|
|
35
|
+
### 段落反模式
|
|
36
|
+
- ❌ 每段恰好 3-4 句,长度均匀 — AI 的典型"整齐段落"
|
|
37
|
+
- ✅ 段落长短交替:有 1 句成段的冲击段,有 5-7 句的铺陈段
|
|
38
|
+
- ❌ 段末总是情感总结句("他心中涌起一股XX")
|
|
39
|
+
- ✅ 段末留在动作或对话上,让读者自行感受
|
|
40
|
+
|
|
41
|
+
## 第三层 — 叙述级
|
|
42
|
+
|
|
43
|
+
### 场景展开反模式
|
|
44
|
+
- ❌ 固定公式:环境描写 → 人物出场 → 对话 → 心理活动 → 结尾总结
|
|
45
|
+
- ✅ 可以从对话切入、从动作切入、从一个细节切入
|
|
46
|
+
- ❌ 每个场景都有完整的开场环境描写
|
|
47
|
+
- ✅ 只在环境变化或环境与情绪相关时才描写环境
|
|
48
|
+
|
|
49
|
+
### 对话反模式
|
|
50
|
+
- ❌ 每句对话都有信息量,每句都推进剧情
|
|
51
|
+
- ✅ 允许闲聊、打岔、答非所问、说到一半被打断
|
|
52
|
+
- ❌ 对话后必跟心理描写解释角色真实想法
|
|
53
|
+
- ✅ 让读者从对话本身和动作推断角色想法
|
|
54
|
+
- ❌ 所有角色都说完整的句子,语法正确
|
|
55
|
+
- ✅ 口语化:省略、重复、语气词、不完整句
|
|
56
|
+
|
|
57
|
+
### 情绪表达反模式
|
|
58
|
+
- ❌ 直接命名情绪(他感到愤怒/悲伤/喜悦)
|
|
59
|
+
- ✅ 通过生理反应和无意识动作表现
|
|
60
|
+
- ❌ 用大段内心独白解释角色心理
|
|
61
|
+
- ✅ 内心活动碎片化,穿插在动作和对话之间
|
|
62
|
+
|
|
63
|
+
### 正面示例 — 完整段落演示
|
|
64
|
+
|
|
65
|
+
**场景展开(从细节切入)**:
|
|
66
|
+
> 茶杯磕在桌沿上,发出一声脆响。李远的手指还保持着端杯的姿势,但杯子已经不在了。碎瓷片在地上转了两圈才停下来。
|
|
67
|
+
> "你说什么?"他的声音很平,像是在问今天吃什么。
|
|
68
|
+
|
|
69
|
+
**对话(含打断和答非所问)**:
|
|
70
|
+
> "我觉得这件事——"
|
|
71
|
+
> "你上次也这么觉得。"周婷把筷子往碗上一搁,"结果呢?"
|
|
72
|
+
> 他张了张嘴,最后说:"菜凉了。"
|
|
73
|
+
|
|
74
|
+
<!-- === /expand 加载区 结束 === -->
|
|
75
|
+
|
|
76
|
+
<!-- === /specify 参考区(类型特有禁用词,由 /specify 注入到 style-reference.md 的风格禁忌字段) === -->
|
|
77
|
+
|
|
78
|
+
## 类型特有禁用词
|
|
79
|
+
|
|
80
|
+
> 以下按故事类型分组。/specify 生成 style-reference.md 时,根据 specification.md 的故事类型,
|
|
81
|
+
> 将对应类型的禁用词追加到 style-reference.md 的「风格禁忌」字段中。
|
|
82
|
+
|
|
83
|
+
### 玄幻
|
|
84
|
+
气势如虹、不可一世、实力深不可测、天赋异禀、气运之子、震惊四座、全场哗然、一股强大的气息、修为突破、丹田中的灵力
|
|
85
|
+
|
|
86
|
+
### 都市
|
|
87
|
+
商业帝国、权势滔天、豪门恩怨、身价百亿、谈笑风生、运筹帷幄、一个电话搞定、社会底层逆袭、人脉通天
|
|
88
|
+
|
|
89
|
+
### 言情
|
|
90
|
+
心如鹿撞、脸颊绯红、薄唇微启、眸光深邃、低沉磁性的嗓音、修长的手指、禁欲系、宠溺地笑了笑、霸道地将她揽入怀中
|
|
91
|
+
|
|
92
|
+
### 悬疑
|
|
93
|
+
细思极恐、不寒而栗、一个大胆的想法、真相浮出水面、拨开迷雾、抽丝剥茧、一切都说得通了、背后的真相
|
|
94
|
+
|
|
95
|
+
<!-- === /specify 参考区 结束 === -->
|
|
@@ -1,140 +1,83 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
##
|
|
4
|
-
|
|
5
|
-
###
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
|
|
19
|
-
###
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
###
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
3. 创建详细的角色档案
|
|
85
|
-
4. 构建自洽的世界观体系
|
|
86
|
-
|
|
87
|
-
### 第二阶段:大纲规划
|
|
88
|
-
1. 制定整体故事走向
|
|
89
|
-
2. 规划各卷的主要内容
|
|
90
|
-
3. 设计章节之间的衔接
|
|
91
|
-
4. 标记重要转折点和高潮
|
|
92
|
-
|
|
93
|
-
### 第三阶段:内容创作
|
|
94
|
-
1. 按照大纲逐章写作
|
|
95
|
-
2. 保持稳定的更新节奏
|
|
96
|
-
3. 定期回顾已写内容
|
|
97
|
-
4. 及时调整后续规划
|
|
98
|
-
|
|
99
|
-
### 第四阶段:修订完善
|
|
100
|
-
1. 检查情节逻辑性
|
|
101
|
-
2. 统一文风和用词
|
|
102
|
-
3. 完善细节描写
|
|
103
|
-
4. 优化对话内容
|
|
104
|
-
|
|
105
|
-
## 质量标准
|
|
106
|
-
|
|
107
|
-
### 优秀章节的标准
|
|
108
|
-
- **开头引人** - 快速吸引读者注意力
|
|
109
|
-
- **中间充实** - 情节推进有力度
|
|
110
|
-
- **结尾有力** - 留下悬念或冲击
|
|
111
|
-
- **情感饱满** - 能触动读者情绪
|
|
112
|
-
- **节奏合理** - 张弛有度不拖沓
|
|
113
|
-
|
|
114
|
-
### 完成作品的标准
|
|
115
|
-
- **主题明确** - 传达清晰的核心思想
|
|
116
|
-
- **结构完整** - 开端、发展、高潮、结局俱全
|
|
117
|
-
- **人物成长** - 主要角色有明显变化
|
|
118
|
-
- **冲突解决** - 主要矛盾得到合理解决
|
|
119
|
-
- **余韵悠长** - 结束后让读者回味
|
|
120
|
-
|
|
121
|
-
## 持续改进
|
|
122
|
-
|
|
123
|
-
### 自我提升方向
|
|
124
|
-
1. 广泛阅读优秀作品,学习他人长处
|
|
125
|
-
2. 深入生活体验,积累创作素材
|
|
126
|
-
3. 研究写作技巧,提升专业能力
|
|
127
|
-
4. 接受读者反馈,了解市场需求
|
|
128
|
-
5. 保持创作激情,不断突破自我
|
|
129
|
-
|
|
130
|
-
### 定期复盘要点
|
|
131
|
-
- 哪些章节反响最好,为什么?
|
|
132
|
-
- 哪些情节处理不够理想?
|
|
133
|
-
- 角色塑造是否成功?
|
|
134
|
-
- 节奏控制是否得当?
|
|
135
|
-
- 读者最关心什么内容?
|
|
136
|
-
|
|
137
|
-
---
|
|
138
|
-
*创建时间: 2025年*
|
|
139
|
-
*版本: 1.0*
|
|
140
|
-
*说明: 本准则为小说创作的基础指导原则,可根据具体项目需要进行调整*
|
|
1
|
+
# 创作宪法
|
|
2
|
+
|
|
3
|
+
## 硬规则 — 违反即为质量事故
|
|
4
|
+
|
|
5
|
+
### 一、角色区分(反同质化)
|
|
6
|
+
|
|
7
|
+
**规则**:同一场景中的不同角色,对话风格、反应模式、决策逻辑必须可区分。
|
|
8
|
+
|
|
9
|
+
**违规信号**(扩写完成后逐项自检):
|
|
10
|
+
- [ ] 遮住角色名后,无法从对话内容判断说话者 → 回查角色档案,为每人添加至少一个语言标记
|
|
11
|
+
- [ ] 两个角色面对同一事件的内心反应用了相似的句式或情绪词 → 改写其中一人的反应方式
|
|
12
|
+
- [ ] 配角的对话仅用于推进主角剧情,没有体现自身立场 → 从配角目标出发重写该对话
|
|
13
|
+
|
|
14
|
+
**执行方法**:
|
|
15
|
+
- 写对话前先回顾角色档案中的语言习惯标签
|
|
16
|
+
- 每个角色至少有一个标志性的表达方式(口头禅、句式偏好、话题倾向)
|
|
17
|
+
- 配角发言时,从该配角的目标出发思考,不从"剧情需要什么"出发
|
|
18
|
+
|
|
19
|
+
### 二、情节反套路(反公式化)
|
|
20
|
+
|
|
21
|
+
**规则**:情节发展必须服从角色逻辑和因果链,禁止套用固定叙事公式。
|
|
22
|
+
|
|
23
|
+
**违规信号**:
|
|
24
|
+
- [ ] "误会 → 解释 → 和好"在同一作品中出现超过一次 → 改用其他冲突解决路径
|
|
25
|
+
- [ ] 每次冲突都在同一章内解决,缺乏跨章悬念 → 至少保留一个未解决的矛盾到下一章
|
|
26
|
+
- [ ] 主角遇到危机时总是恰好获得新能力/外援 → 改为利用前文已建立的资源解决
|
|
27
|
+
- [ ] 反派智商随剧情需要波动 → 给反派固定的行为逻辑,允许反派赢
|
|
28
|
+
- [ ] 配角在危机时刻突然"及时赶到"而没有前置铺垫 → 补充至少 2 处前置伏笔
|
|
29
|
+
|
|
30
|
+
**常见类型套路警示**(根据 specification.md 的故事类型选择性参考):
|
|
31
|
+
- 玄幻:拍卖会必出天材地宝→主角竞拍→反派挑衅→打脸;宗门大比必夺第一;升级永远在危机中突破
|
|
32
|
+
- 都市:重生/穿越后立刻展示前世记忆碾压;商战中对手永远低估主角;所有女性角色都被主角吸引
|
|
33
|
+
- 言情:三角恋中备胎永远在关键时刻退出;误会必因第三者挑拨;男主霸道但只对女主温柔
|
|
34
|
+
- 悬疑:最不可能的人是凶手;侦探在最后一章突然顿悟所有线索;每个嫌疑人都有不在场证明但都在撒谎
|
|
35
|
+
|
|
36
|
+
**执行方法**:
|
|
37
|
+
- 冲突解决必须有成本:主角得到的同时必须失去什么
|
|
38
|
+
- 允许角色犯错和失败,不是每次决策都是最优解
|
|
39
|
+
- 危机解除必须基于前文已建立的资源(角色能力、道具、人脉)
|
|
40
|
+
- 转折前必须有至少 2 处伏笔或暗示
|
|
41
|
+
|
|
42
|
+
### 三、一致性校验(反矛盾)
|
|
43
|
+
|
|
44
|
+
**规则**:所有创作内容必须与已建立的设定、tracking 记录保持一致。
|
|
45
|
+
|
|
46
|
+
**违规信号**:
|
|
47
|
+
- [ ] 角色能力/性格与 character-state.json 记录不符 → 回查 tracking 并修正正文或更新 tracking
|
|
48
|
+
- [ ] 世界观规则前后矛盾(如前文说不能飞,后文突然飞了) → 回查 specification.md 修正
|
|
49
|
+
- [ ] 角色关系状态与 relationships.json 不符(如已决裂的两人突然亲密) → 补充关系转变的过渡情节
|
|
50
|
+
- [ ] 时间线冲突(如白天的场景突然变成夜晚) → 回查 timeline.json 修正时间标记
|
|
51
|
+
- [ ] 已消耗的资源/道具再次出现 → 删除或改为其他道具
|
|
52
|
+
|
|
53
|
+
**执行方法**:
|
|
54
|
+
- 扩写前必须检查本章出场角色的最新状态
|
|
55
|
+
- 涉及世界观规则时回查 specification.md 的设定
|
|
56
|
+
- 新增设定细节后必须更新对应 tracking 文件
|
|
57
|
+
|
|
58
|
+
### 四、张力维持(反平淡)
|
|
59
|
+
|
|
60
|
+
**规则**:每个场景必须包含至少一种张力来源。
|
|
61
|
+
|
|
62
|
+
**张力类型**(任选其一即可):
|
|
63
|
+
- 信息差:读者知道角色不知道的,或反之
|
|
64
|
+
- 目标冲突:场景中至少两个角色的即时目标相互矛盾
|
|
65
|
+
- 时间压力:角色必须在限制内完成某事
|
|
66
|
+
- 内心矛盾:角色的欲望与责任/道德相冲突
|
|
67
|
+
- 悬念延续:场景结束时留下未解答的问题
|
|
68
|
+
|
|
69
|
+
**违规信号**:
|
|
70
|
+
- [ ] 场景中所有角色目标一致、没有任何对立面 → 为至少一个角色添加隐藏目标或保留意见
|
|
71
|
+
- [ ] 连续 3 段以上纯描写/叙述,没有推动任何冲突 → 在描写中穿插角色的内心矛盾或不安细节
|
|
72
|
+
- [ ] 章节结尾一切圆满解决,没有遗留任何钩子 → 添加一个未解答的问题或新信息作为结尾
|
|
73
|
+
|
|
74
|
+
## 结构规范 — 章节格式要求
|
|
75
|
+
|
|
76
|
+
### 分段格式
|
|
77
|
+
- 禁止使用"一"、"二"、"三"等数字标记分段(破坏沉浸感)
|
|
78
|
+
- 场景转换使用纯空行分段
|
|
79
|
+
|
|
80
|
+
### 章节结构
|
|
81
|
+
- 开篇 3 段内必须有钩子(悬念、冲突或反常)
|
|
82
|
+
- 结尾必须留下至少一个未解决的问题或新的信息
|
|
83
|
+
- 每章是一个相对完整的叙事单元,有清晰的场景目标
|
|
@@ -1,19 +1,43 @@
|
|
|
1
1
|
# 风格参考
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
>
|
|
3
|
+
> 本文件定义写作风格锚点。由 /specify 根据你的选择自动生成。
|
|
4
|
+
> 扩写阶段加载此文件作为风格约束。
|
|
5
|
+
|
|
6
|
+
**故事类型**:[由 /specify 自动填入]
|
|
5
7
|
|
|
6
8
|
## 叙述视角
|
|
7
9
|
[第一人称/第三人称有限/第三人称全知]
|
|
10
|
+
<!-- 提示:玄幻常用第三人称全知;言情常用第一人称或双视角交替;悬疑推荐第一人称有限(制造信息差) -->
|
|
8
11
|
|
|
9
12
|
## 语言风格
|
|
10
|
-
[
|
|
13
|
+
[简洁利落/细腻优美/口语化/古风/冷硬写实]
|
|
14
|
+
<!-- 提示:都市推荐口语化或简洁利落;玄幻可选古风或简洁利落;言情推荐细腻优美 -->
|
|
11
15
|
|
|
12
16
|
## 节奏偏好
|
|
13
|
-
[
|
|
17
|
+
[快节奏(短场景、频繁切换)/中等/慢节奏(长场景、沉浸式)]
|
|
18
|
+
<!-- 提示:悬疑推荐快节奏;言情推荐中等偏慢;玄幻战斗场景快、修炼场景慢 -->
|
|
14
19
|
|
|
15
20
|
## 对话风格
|
|
16
21
|
[简短有力/生活化/文学化]
|
|
22
|
+
<!-- 提示:都市推荐生活化;玄幻可选文学化(正式场合)+简短有力(战斗);言情推荐生活化 -->
|
|
23
|
+
|
|
24
|
+
## 描写密度
|
|
25
|
+
[重描写(环境、细节、氛围渲染占比高)/均衡/轻描写(重对话和动作,环境一笔带过)]
|
|
26
|
+
<!-- 提示:言情推荐重描写(情感氛围);悬疑推荐轻描写(保持紧张感);玄幻推荐均衡 -->
|
|
27
|
+
|
|
28
|
+
## 情感浓度
|
|
29
|
+
[克制冷静(留白多,让读者自行体会)/适中/热烈浓郁(情感表达直接强烈)]
|
|
30
|
+
<!-- 提示:悬疑推荐克制冷静;言情推荐热烈浓郁;都市推荐适中 -->
|
|
31
|
+
|
|
32
|
+
## 幽默程度
|
|
33
|
+
[严肃/适度幽默(偶尔轻松调剂)/喜剧化]
|
|
34
|
+
|
|
35
|
+
## 参考锚点
|
|
36
|
+
[风格接近的作品或作者]
|
|
37
|
+
<!-- 示例:"节奏参考《诡秘之主》,对话风格参考老舍,氛围参考《白夜行》" -->
|
|
38
|
+
<!-- 提示:填写 1-3 个参考点,每个说明参考哪个维度。/specify 会据此校准其他维度 -->
|
|
17
39
|
|
|
18
|
-
##
|
|
19
|
-
[
|
|
40
|
+
## 风格禁忌
|
|
41
|
+
[本作品特别要避免的表达方式]
|
|
42
|
+
<!-- 示例:"不要武侠腔"、"不要网文套路开场白"、"不要日系轻小说的吐槽风" -->
|
|
43
|
+
<!-- 提示:/specify 会将 anti-ai.md 中对应类型的特有禁用词自动追加到此处 -->
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# 第 X 卷 状态快照
|
|
2
|
+
|
|
3
|
+
> 本文件在卷切换时自动生成,是当前卷创作的入口条件。
|
|
4
|
+
> 第一卷的 volume-summary 在 /write 首次执行时由系统初始化(内容为空状态)。
|
|
5
|
+
|
|
6
|
+
## 故事进度
|
|
7
|
+
- 已完成章节:[从第 1 章到上一卷最后一章]
|
|
8
|
+
- 当前主线:[主线当前阶段一句话描述]
|
|
9
|
+
|
|
10
|
+
## 活跃角色状态
|
|
11
|
+
[最近 2 卷出场过的角色,每人 2-3 句描述当前状态]
|
|
12
|
+
|
|
13
|
+
## 活跃伏笔
|
|
14
|
+
[status=planted 或 hinted 的伏笔列表]
|
|
15
|
+
|
|
16
|
+
## 关键关系
|
|
17
|
+
[当前卷预计出场角色之间的关系]
|
|
18
|
+
|
|
19
|
+
## 待续悬念
|
|
20
|
+
[上一卷结尾留下的钩子/悬念]
|