@changw98ic/cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +57 -0
  3. package/dist/commands/adapt.d.ts +8 -0
  4. package/dist/commands/adapt.d.ts.map +1 -0
  5. package/dist/commands/adapt.js +108 -0
  6. package/dist/commands/adapt.js.map +1 -0
  7. package/dist/commands/archive.d.ts +6 -0
  8. package/dist/commands/archive.d.ts.map +1 -0
  9. package/dist/commands/archive.js +66 -0
  10. package/dist/commands/archive.js.map +1 -0
  11. package/dist/commands/backup.d.ts +6 -0
  12. package/dist/commands/backup.d.ts.map +1 -0
  13. package/dist/commands/backup.js +151 -0
  14. package/dist/commands/backup.js.map +1 -0
  15. package/dist/commands/context.d.ts +9 -0
  16. package/dist/commands/context.d.ts.map +1 -0
  17. package/dist/commands/context.js +203 -0
  18. package/dist/commands/context.js.map +1 -0
  19. package/dist/commands/dashboard.d.ts +6 -0
  20. package/dist/commands/dashboard.d.ts.map +1 -0
  21. package/dist/commands/dashboard.js +27 -0
  22. package/dist/commands/dashboard.js.map +1 -0
  23. package/dist/commands/entity.d.ts +6 -0
  24. package/dist/commands/entity.d.ts.map +1 -0
  25. package/dist/commands/entity.js +173 -0
  26. package/dist/commands/entity.js.map +1 -0
  27. package/dist/commands/extract-context.d.ts +9 -0
  28. package/dist/commands/extract-context.d.ts.map +1 -0
  29. package/dist/commands/extract-context.js +135 -0
  30. package/dist/commands/extract-context.js.map +1 -0
  31. package/dist/commands/index.d.ts +6 -0
  32. package/dist/commands/index.d.ts.map +1 -0
  33. package/dist/commands/index.js +69 -0
  34. package/dist/commands/index.js.map +1 -0
  35. package/dist/commands/init.d.ts +8 -0
  36. package/dist/commands/init.d.ts.map +1 -0
  37. package/dist/commands/init.js +37 -0
  38. package/dist/commands/init.js.map +1 -0
  39. package/dist/commands/migrate.d.ts +6 -0
  40. package/dist/commands/migrate.d.ts.map +1 -0
  41. package/dist/commands/migrate.js +67 -0
  42. package/dist/commands/migrate.js.map +1 -0
  43. package/dist/commands/plan.d.ts +6 -0
  44. package/dist/commands/plan.d.ts.map +1 -0
  45. package/dist/commands/plan.js +35 -0
  46. package/dist/commands/plan.js.map +1 -0
  47. package/dist/commands/preflight.d.ts +6 -0
  48. package/dist/commands/preflight.d.ts.map +1 -0
  49. package/dist/commands/preflight.js +80 -0
  50. package/dist/commands/preflight.js.map +1 -0
  51. package/dist/commands/query.d.ts +6 -0
  52. package/dist/commands/query.d.ts.map +1 -0
  53. package/dist/commands/query.js +82 -0
  54. package/dist/commands/query.js.map +1 -0
  55. package/dist/commands/rag.d.ts +6 -0
  56. package/dist/commands/rag.d.ts.map +1 -0
  57. package/dist/commands/rag.js +113 -0
  58. package/dist/commands/rag.js.map +1 -0
  59. package/dist/commands/review.d.ts +6 -0
  60. package/dist/commands/review.d.ts.map +1 -0
  61. package/dist/commands/review.js +38 -0
  62. package/dist/commands/review.js.map +1 -0
  63. package/dist/commands/state.d.ts +6 -0
  64. package/dist/commands/state.d.ts.map +1 -0
  65. package/dist/commands/state.js +64 -0
  66. package/dist/commands/state.js.map +1 -0
  67. package/dist/commands/status.d.ts +6 -0
  68. package/dist/commands/status.d.ts.map +1 -0
  69. package/dist/commands/status.js +49 -0
  70. package/dist/commands/status.js.map +1 -0
  71. package/dist/commands/style.d.ts +9 -0
  72. package/dist/commands/style.d.ts.map +1 -0
  73. package/dist/commands/style.js +120 -0
  74. package/dist/commands/style.js.map +1 -0
  75. package/dist/commands/update-state.d.ts +6 -0
  76. package/dist/commands/update-state.d.ts.map +1 -0
  77. package/dist/commands/update-state.js +92 -0
  78. package/dist/commands/update-state.js.map +1 -0
  79. package/dist/commands/use.d.ts +5 -0
  80. package/dist/commands/use.d.ts.map +1 -0
  81. package/dist/commands/use.js +33 -0
  82. package/dist/commands/use.js.map +1 -0
  83. package/dist/commands/where.d.ts +2 -0
  84. package/dist/commands/where.d.ts.map +1 -0
  85. package/dist/commands/where.js +13 -0
  86. package/dist/commands/where.js.map +1 -0
  87. package/dist/commands/workflow.d.ts +6 -0
  88. package/dist/commands/workflow.d.ts.map +1 -0
  89. package/dist/commands/workflow.js +155 -0
  90. package/dist/commands/workflow.js.map +1 -0
  91. package/dist/commands/write.d.ts +7 -0
  92. package/dist/commands/write.d.ts.map +1 -0
  93. package/dist/commands/write.js +33 -0
  94. package/dist/commands/write.js.map +1 -0
  95. package/dist/index.d.ts +5 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +123 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/utils/api-client.d.ts +61 -0
  100. package/dist/utils/api-client.d.ts.map +1 -0
  101. package/dist/utils/api-client.js +390 -0
  102. package/dist/utils/api-client.js.map +1 -0
  103. package/dist/utils/api-client.types.d.ts +42 -0
  104. package/dist/utils/api-client.types.d.ts.map +1 -0
  105. package/dist/utils/api-client.types.js +5 -0
  106. package/dist/utils/api-client.types.js.map +1 -0
  107. package/dist/utils/archive-manager.d.ts +72 -0
  108. package/dist/utils/archive-manager.d.ts.map +1 -0
  109. package/dist/utils/archive-manager.js +449 -0
  110. package/dist/utils/archive-manager.js.map +1 -0
  111. package/dist/utils/backup-manager.d.ts +65 -0
  112. package/dist/utils/backup-manager.d.ts.map +1 -0
  113. package/dist/utils/backup-manager.js +266 -0
  114. package/dist/utils/backup-manager.js.map +1 -0
  115. package/dist/utils/chapter-context.d.ts +77 -0
  116. package/dist/utils/chapter-context.d.ts.map +1 -0
  117. package/dist/utils/chapter-context.js +280 -0
  118. package/dist/utils/chapter-context.js.map +1 -0
  119. package/dist/utils/entity-linker.d.ts +74 -0
  120. package/dist/utils/entity-linker.d.ts.map +1 -0
  121. package/dist/utils/entity-linker.js +208 -0
  122. package/dist/utils/entity-linker.js.map +1 -0
  123. package/dist/utils/index.d.ts +19 -0
  124. package/dist/utils/index.d.ts.map +1 -0
  125. package/dist/utils/index.js +22 -0
  126. package/dist/utils/index.js.map +1 -0
  127. package/dist/utils/observability.d.ts +145 -0
  128. package/dist/utils/observability.d.ts.map +1 -0
  129. package/dist/utils/observability.js +298 -0
  130. package/dist/utils/observability.js.map +1 -0
  131. package/dist/utils/output.d.ts +45 -0
  132. package/dist/utils/output.d.ts.map +1 -0
  133. package/dist/utils/output.js +60 -0
  134. package/dist/utils/output.js.map +1 -0
  135. package/dist/utils/path-compat.d.ts +63 -0
  136. package/dist/utils/path-compat.d.ts.map +1 -0
  137. package/dist/utils/path-compat.js +128 -0
  138. package/dist/utils/path-compat.js.map +1 -0
  139. package/dist/utils/project-locator.d.ts +47 -0
  140. package/dist/utils/project-locator.d.ts.map +1 -0
  141. package/dist/utils/project-locator.js +372 -0
  142. package/dist/utils/project-locator.js.map +1 -0
  143. package/dist/utils/runtime-compat.d.ts +39 -0
  144. package/dist/utils/runtime-compat.d.ts.map +1 -0
  145. package/dist/utils/runtime-compat.js +113 -0
  146. package/dist/utils/runtime-compat.js.map +1 -0
  147. package/dist/utils/security.d.ts +74 -0
  148. package/dist/utils/security.d.ts.map +1 -0
  149. package/dist/utils/security.js +291 -0
  150. package/dist/utils/security.js.map +1 -0
  151. package/dist/utils/status-reporter.d.ts +66 -0
  152. package/dist/utils/status-reporter.d.ts.map +1 -0
  153. package/dist/utils/status-reporter.js +309 -0
  154. package/dist/utils/status-reporter.js.map +1 -0
  155. package/dist/utils/style-sampler.d.ts +69 -0
  156. package/dist/utils/style-sampler.d.ts.map +1 -0
  157. package/dist/utils/style-sampler.js +206 -0
  158. package/dist/utils/style-sampler.js.map +1 -0
  159. package/dist/utils/workflow-manager.d.ts +104 -0
  160. package/dist/utils/workflow-manager.d.ts.map +1 -0
  161. package/dist/utils/workflow-manager.js +462 -0
  162. package/dist/utils/workflow-manager.js.map +1 -0
  163. package/package.json +66 -0
@@ -0,0 +1,5 @@
1
+ /**
2
+ * API 客户端类型定义
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=api-client.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.types.js","sourceRoot":"","sources":["../../src/utils/api-client.types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,72 @@
1
+ export interface ArchiveConfig {
2
+ characterInactiveThreshold: number;
3
+ plotResolvedThreshold: number;
4
+ reviewOldThreshold: number;
5
+ fileSizeTriggerMb: number;
6
+ chapterTrigger: number;
7
+ }
8
+ export interface TriggerResult {
9
+ shouldArchive: boolean;
10
+ fileSizeMb: number;
11
+ currentChapter: number;
12
+ sizeTrigger: boolean;
13
+ chapterTrigger: boolean;
14
+ }
15
+ export interface InactiveCharacter {
16
+ character: Record<string, unknown>;
17
+ inactiveChapters: number;
18
+ lastAppearance: number;
19
+ }
20
+ export interface ResolvedThread {
21
+ thread: Record<string, unknown>;
22
+ chaptersSinceResolved: number;
23
+ resolvedChapter: number;
24
+ }
25
+ export interface OldReview {
26
+ review: Record<string, unknown>;
27
+ chaptersSinceReview: number;
28
+ reviewChapter: number;
29
+ }
30
+ export interface ArchiveResult {
31
+ charactersArchived: number;
32
+ threadsArchived: number;
33
+ reviewsArchived: number;
34
+ savedMb: number;
35
+ }
36
+ export interface ArchiveStats {
37
+ charactersCount: number;
38
+ threadsCount: number;
39
+ reviewsCount: number;
40
+ archiveSizeKb: number;
41
+ stateSizeMb: number;
42
+ }
43
+ export declare class ArchiveManager {
44
+ private _projectRoot;
45
+ private indexManager;
46
+ private statePath;
47
+ private archiveDir;
48
+ private charactersArchivePath;
49
+ private plotThreadsArchivePath;
50
+ private reviewsArchivePath;
51
+ private config;
52
+ /** Get the project root directory */
53
+ get projectRoot(): string;
54
+ constructor(projectRoot: string);
55
+ private loadState;
56
+ private saveState;
57
+ private loadArchive;
58
+ private saveArchive;
59
+ checkTriggerConditions(state: Record<string, unknown>): TriggerResult;
60
+ identifyInactiveCharacters(state: Record<string, unknown>): InactiveCharacter[];
61
+ identifyResolvedPlotThreads(state: Record<string, unknown>): ResolvedThread[];
62
+ identifyOldReviews(state: Record<string, unknown>): OldReview[];
63
+ archiveCharacters(inactiveList: InactiveCharacter[], dryRun?: boolean): number;
64
+ archivePlotThreads(resolvedList: ResolvedThread[], dryRun?: boolean): number;
65
+ archiveReviews(oldReviewsList: OldReview[], dryRun?: boolean): number;
66
+ private removeFromState;
67
+ runAutoCheck(force?: boolean, dryRun?: boolean): ArchiveResult | null;
68
+ restoreCharacter(name: string): boolean;
69
+ getStats(): ArchiveStats;
70
+ showStats(): void;
71
+ }
72
+ //# sourceMappingURL=archive-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive-manager.d.ts","sourceRoot":"","sources":["../../src/utils/archive-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,449 @@
1
+ /**
2
+ * 归档管理器
3
+ *
4
+ * 迁移自 Python archive_manager.py
5
+ * 防止 state.json 无限增长,确保 200 万字长跑稳定运行
6
+ *
7
+ * 归档策略:
8
+ * - 角色:超过 50 章未出场的次要角色 → archive/characters.json
9
+ * - 伏笔:status="已回收" 且超过 20 章的伏笔 → archive/plot_threads.json
10
+ * - 审查报告:超过 50 章的旧报告 → archive/reviews.json
11
+ */
12
+ import { existsSync, mkdirSync, statSync, writeFileSync } from 'fs';
13
+ import { join } from 'path';
14
+ import { IndexManager } from '@changw98ic/data';
15
+ import { readJsonSafe, writeJsonAtomic } from './security.js';
16
+ // ============================================================================
17
+ // Archive Manager
18
+ // ============================================================================
19
+ export class ArchiveManager {
20
+ _projectRoot;
21
+ indexManager;
22
+ statePath;
23
+ archiveDir;
24
+ charactersArchivePath;
25
+ plotThreadsArchivePath;
26
+ reviewsArchivePath;
27
+ config = {
28
+ characterInactiveThreshold: 50,
29
+ plotResolvedThreshold: 20,
30
+ reviewOldThreshold: 50,
31
+ fileSizeTriggerMb: 1.0,
32
+ chapterTrigger: 10,
33
+ };
34
+ /** Get the project root directory */
35
+ get projectRoot() {
36
+ return this._projectRoot;
37
+ }
38
+ constructor(projectRoot) {
39
+ this._projectRoot = projectRoot;
40
+ this.indexManager = new IndexManager({ projectRoot });
41
+ this.statePath = join(projectRoot, '.webnovel', 'state.json');
42
+ this.archiveDir = join(projectRoot, '.webnovel', 'archive');
43
+ // Ensure archive directory exists
44
+ if (!existsSync(this.archiveDir)) {
45
+ mkdirSync(this.archiveDir, { recursive: true });
46
+ }
47
+ this.charactersArchivePath = join(this.archiveDir, 'characters.json');
48
+ this.plotThreadsArchivePath = join(this.archiveDir, 'plot_threads.json');
49
+ this.reviewsArchivePath = join(this.archiveDir, 'reviews.json');
50
+ }
51
+ // ==================== State Operations ====================
52
+ loadState() {
53
+ return readJsonSafe(this.statePath, {});
54
+ }
55
+ saveState(state) {
56
+ writeJsonAtomic(this.statePath, state);
57
+ console.log('✅ state.json 已原子化更新');
58
+ }
59
+ loadArchive(archivePath) {
60
+ if (!existsSync(archivePath)) {
61
+ return [];
62
+ }
63
+ return readJsonSafe(archivePath, []);
64
+ }
65
+ saveArchive(archivePath, data) {
66
+ writeFileSync(archivePath, JSON.stringify(data, null, 2), 'utf-8');
67
+ }
68
+ // ==================== Trigger Detection ====================
69
+ checkTriggerConditions(state) {
70
+ const progress = state.progress;
71
+ const currentChapter = progress?.current_chapter ?? 0;
72
+ // Condition 1: File size exceeds threshold
73
+ let fileSizeMb = 0;
74
+ if (existsSync(this.statePath)) {
75
+ const stats = statSync(this.statePath);
76
+ fileSizeMb = stats.size / (1024 * 1024);
77
+ }
78
+ const sizeTrigger = fileSizeMb >= this.config.fileSizeTriggerMb;
79
+ // Condition 2: Chapter count is multiple of trigger interval
80
+ const chapterTrigger = currentChapter > 0 &&
81
+ currentChapter % this.config.chapterTrigger === 0;
82
+ return {
83
+ shouldArchive: sizeTrigger || chapterTrigger,
84
+ fileSizeMb,
85
+ currentChapter,
86
+ sizeTrigger,
87
+ chapterTrigger,
88
+ };
89
+ }
90
+ // ==================== Identification ====================
91
+ identifyInactiveCharacters(state) {
92
+ const progress = state.progress;
93
+ const currentChapter = progress?.current_chapter ?? 0;
94
+ const threshold = this.config.characterInactiveThreshold;
95
+ // Get all characters from IndexManager
96
+ const characters = this.indexManager.getEntities({ type: '角色' });
97
+ const inactive = [];
98
+ for (const char of characters) {
99
+ // Only archive non-core characters (tier="装饰" or tier="支线")
100
+ const tier = String(char.tier ?? '').trim();
101
+ if (tier === '核心')
102
+ continue;
103
+ // Check last appearance chapter
104
+ const lastAppearance = char.last_appearance ?? 0;
105
+ if (lastAppearance <= 0)
106
+ continue;
107
+ const inactiveChapters = currentChapter - lastAppearance;
108
+ if (inactiveChapters >= threshold) {
109
+ // Build character data without duplicate keys
110
+ const charData = {
111
+ name: char.canonical_name ?? char.id,
112
+ last_appearance_chapter: lastAppearance,
113
+ };
114
+ // Copy other properties from char, avoiding duplicates
115
+ for (const [key, value] of Object.entries(char)) {
116
+ if (!(key in charData)) {
117
+ charData[key] = value;
118
+ }
119
+ }
120
+ charData.id = char.id;
121
+ charData.tier = tier;
122
+ inactive.push({
123
+ character: charData,
124
+ inactiveChapters,
125
+ lastAppearance,
126
+ });
127
+ }
128
+ }
129
+ return inactive;
130
+ }
131
+ identifyResolvedPlotThreads(state) {
132
+ const progress = state.progress;
133
+ const currentChapter = progress?.current_chapter ?? 0;
134
+ const plotThreads = state.plot_threads ?? {};
135
+ const foreshadowing = plotThreads.foreshadowing ?? [];
136
+ const resolvedLegacy = plotThreads.resolved ?? [];
137
+ const threshold = this.config.plotResolvedThreshold;
138
+ const archivable = [];
139
+ // New format: plot_threads.foreshadowing (with status field)
140
+ for (const item of foreshadowing) {
141
+ const status = String(item.status ?? '').trim();
142
+ if (!['已回收', 'resolved'].includes(status))
143
+ continue;
144
+ const resolvedChapter = item.resolved_chapter ?? 0;
145
+ if (resolvedChapter <= 0)
146
+ continue;
147
+ const chaptersSinceResolved = currentChapter - resolvedChapter;
148
+ if (chaptersSinceResolved >= threshold) {
149
+ archivable.push({
150
+ thread: item,
151
+ chaptersSinceResolved,
152
+ resolvedChapter,
153
+ });
154
+ }
155
+ }
156
+ // Legacy format: plot_threads.resolved (direct list)
157
+ for (const item of resolvedLegacy) {
158
+ const resolvedChapter = item.resolved_chapter ?? 0;
159
+ if (resolvedChapter <= 0)
160
+ continue;
161
+ const chaptersSinceResolved = currentChapter - resolvedChapter;
162
+ if (chaptersSinceResolved >= threshold) {
163
+ archivable.push({
164
+ thread: item,
165
+ chaptersSinceResolved,
166
+ resolvedChapter,
167
+ });
168
+ }
169
+ }
170
+ return archivable;
171
+ }
172
+ identifyOldReviews(state) {
173
+ const progress = state.progress;
174
+ const currentChapter = progress?.current_chapter ?? 0;
175
+ const reviews = state.review_checkpoints ?? [];
176
+ const threshold = this.config.reviewOldThreshold;
177
+ const parseEndChapter = (review) => {
178
+ // New format: {"chapters":"5-6","report":"...","reviewed_at":"..."}
179
+ const chapters = review.chapters;
180
+ if (chapters) {
181
+ const parts = chapters.replace(/—/g, '-').split('-').map(p => p.trim()).filter(Boolean);
182
+ if (parts.length > 0) {
183
+ const last = parseInt(parts[parts.length - 1], 10);
184
+ if (!isNaN(last))
185
+ return last;
186
+ }
187
+ }
188
+ // Legacy format: {"chapter_range":[5,6], "date":"..."}
189
+ const cr = review.chapter_range;
190
+ if (cr && cr.length >= 2) {
191
+ const last = cr[1];
192
+ if (!isNaN(last))
193
+ return last;
194
+ }
195
+ // Fallback: extract from report filename
196
+ const report = review.report;
197
+ if (report) {
198
+ // Try "Ch5-6" pattern
199
+ let m = report.match(/Ch(\d+)[-–—](\d+)/);
200
+ if (m) {
201
+ const last = parseInt(m[2], 10);
202
+ if (!isNaN(last))
203
+ return last;
204
+ }
205
+ // Try "第5-6章" pattern
206
+ m = report.match(/第(\d+)[-–—](\d+)章/);
207
+ if (m) {
208
+ const last = parseInt(m[2], 10);
209
+ if (!isNaN(last))
210
+ return last;
211
+ }
212
+ }
213
+ return 0;
214
+ };
215
+ const oldReviews = [];
216
+ for (const review of reviews) {
217
+ const reviewChapter = parseEndChapter(review);
218
+ const chaptersSinceReview = currentChapter - reviewChapter;
219
+ if (chaptersSinceReview >= threshold) {
220
+ oldReviews.push({
221
+ review,
222
+ chaptersSinceReview,
223
+ reviewChapter,
224
+ });
225
+ }
226
+ }
227
+ return oldReviews;
228
+ }
229
+ // ==================== Archive Operations ====================
230
+ archiveCharacters(inactiveList, dryRun = false) {
231
+ if (inactiveList.length === 0)
232
+ return 0;
233
+ const archived = this.loadArchive(this.charactersArchivePath);
234
+ const timestamp = new Date().toISOString();
235
+ for (const item of inactiveList) {
236
+ item.character.archived_at = timestamp;
237
+ archived.push(item.character);
238
+ }
239
+ if (!dryRun) {
240
+ this.saveArchive(this.charactersArchivePath, archived);
241
+ }
242
+ return inactiveList.length;
243
+ }
244
+ archivePlotThreads(resolvedList, dryRun = false) {
245
+ if (resolvedList.length === 0)
246
+ return 0;
247
+ const archived = this.loadArchive(this.plotThreadsArchivePath);
248
+ const timestamp = new Date().toISOString();
249
+ for (const item of resolvedList) {
250
+ item.thread.archived_at = timestamp;
251
+ archived.push(item.thread);
252
+ }
253
+ if (!dryRun) {
254
+ this.saveArchive(this.plotThreadsArchivePath, archived);
255
+ }
256
+ return resolvedList.length;
257
+ }
258
+ archiveReviews(oldReviewsList, dryRun = false) {
259
+ if (oldReviewsList.length === 0)
260
+ return 0;
261
+ const archived = this.loadArchive(this.reviewsArchivePath);
262
+ const timestamp = new Date().toISOString();
263
+ for (const item of oldReviewsList) {
264
+ item.review.archived_at = timestamp;
265
+ archived.push(item.review);
266
+ }
267
+ if (!dryRun) {
268
+ this.saveArchive(this.reviewsArchivePath, archived);
269
+ }
270
+ return oldReviewsList.length;
271
+ }
272
+ removeFromState(state, _inactiveChars, // Note: Character archiving is handled via IndexManager's is_archived flag
273
+ resolvedThreads, oldReviews) {
274
+ // Note: Characters are archived in SQLite via IndexManager's is_archived flag
275
+ // They are NOT removed from state.json
276
+ // Remove archived plot threads
277
+ if (resolvedThreads.length > 0) {
278
+ const threadIds = new Set();
279
+ for (const item of resolvedThreads) {
280
+ const content = item.thread.content ?? item.thread.description;
281
+ if (content && content.trim()) {
282
+ threadIds.add(content.trim());
283
+ }
284
+ }
285
+ const plotThreads = state.plot_threads ?? {};
286
+ if (Array.isArray(plotThreads.foreshadowing)) {
287
+ plotThreads.foreshadowing = plotThreads.foreshadowing.filter(t => {
288
+ const content = t.content ?? t.description;
289
+ return !content || !threadIds.has(content.trim());
290
+ });
291
+ }
292
+ if (Array.isArray(plotThreads.resolved)) {
293
+ plotThreads.resolved = plotThreads.resolved.filter(t => {
294
+ const content = t.content ?? t.description;
295
+ return !content || !threadIds.has(content.trim());
296
+ });
297
+ }
298
+ state.plot_threads = plotThreads;
299
+ }
300
+ // Remove old reviews
301
+ if (oldReviews.length > 0) {
302
+ const reviewKeys = new Set();
303
+ for (const item of oldReviews) {
304
+ const key = item.review.report ??
305
+ item.review.reviewed_at ??
306
+ item.review.date;
307
+ if (key && key.trim()) {
308
+ reviewKeys.add(key.trim());
309
+ }
310
+ }
311
+ state.review_checkpoints = (state.review_checkpoints ?? []).filter(review => {
312
+ const key = review.report ??
313
+ review.reviewed_at ??
314
+ review.date;
315
+ return !key || !reviewKeys.has(key.trim());
316
+ });
317
+ }
318
+ return state;
319
+ }
320
+ // ==================== Main Operations ====================
321
+ runAutoCheck(force = false, dryRun = false) {
322
+ const state = this.loadState();
323
+ // Check trigger conditions
324
+ const trigger = this.checkTriggerConditions(state);
325
+ if (!force && !trigger.shouldArchive) {
326
+ console.log('✅ 无需归档(触发条件未满足)');
327
+ console.log(` 文件大小: ${trigger.fileSizeMb.toFixed(2)} MB (阈值: ${this.config.fileSizeTriggerMb} MB)`);
328
+ console.log(` 当前章节: ${trigger.currentChapter} (每 ${this.config.chapterTrigger} 章触发)`);
329
+ return null;
330
+ }
331
+ console.log('🔍 开始归档检查...');
332
+ console.log(` 文件大小: ${trigger.fileSizeMb.toFixed(2)} MB`);
333
+ console.log(` 当前章节: ${trigger.currentChapter}`);
334
+ // Identify archivable data
335
+ const inactiveChars = this.identifyInactiveCharacters(state);
336
+ const resolvedThreads = this.identifyResolvedPlotThreads(state);
337
+ const oldReviews = this.identifyOldReviews(state);
338
+ // Output stats
339
+ console.log('\n📊 归档统计:');
340
+ console.log(` 不活跃角色: ${inactiveChars.length}`);
341
+ console.log(` 已回收伏笔: ${resolvedThreads.length}`);
342
+ console.log(` 旧审查报告: ${oldReviews.length}`);
343
+ if (inactiveChars.length === 0 && resolvedThreads.length === 0 && oldReviews.length === 0) {
344
+ console.log('\n✅ 无需归档(无符合条件的数据)');
345
+ return null;
346
+ }
347
+ // Dry-run mode
348
+ if (dryRun) {
349
+ console.log('\n🔍 [Dry-run] 将被归档的数据:');
350
+ if (inactiveChars.length > 0) {
351
+ console.log('\n 不活跃角色:');
352
+ for (const item of inactiveChars.slice(0, 5)) {
353
+ const name = item.character.name ?? '未知';
354
+ console.log(` - ${name} (超过 ${item.inactiveChapters} 章未出场)`);
355
+ }
356
+ }
357
+ if (resolvedThreads.length > 0) {
358
+ console.log('\n 已回收伏笔:');
359
+ for (const item of resolvedThreads.slice(0, 5)) {
360
+ const desc = (item.thread.content ?? item.thread.description ?? '').slice(0, 30);
361
+ console.log(` - ${desc}... (已回收 ${item.chaptersSinceResolved} 章)`);
362
+ }
363
+ }
364
+ if (oldReviews.length > 0) {
365
+ console.log('\n 旧审查报告:');
366
+ for (const item of oldReviews.slice(0, 5)) {
367
+ console.log(` - Ch${item.reviewChapter} (${item.chaptersSinceReview} 章前)`);
368
+ }
369
+ }
370
+ return null;
371
+ }
372
+ // Execute archive
373
+ const charsArchived = this.archiveCharacters(inactiveChars, dryRun);
374
+ const threadsArchived = this.archivePlotThreads(resolvedThreads, dryRun);
375
+ const reviewsArchived = this.archiveReviews(oldReviews, dryRun);
376
+ // Remove from state.json
377
+ const newState = this.removeFromState(state, inactiveChars, resolvedThreads, oldReviews);
378
+ this.saveState(newState);
379
+ // Calculate saved space
380
+ let newFileSizeMb = 0;
381
+ if (existsSync(this.statePath)) {
382
+ const stats = statSync(this.statePath);
383
+ newFileSizeMb = stats.size / (1024 * 1024);
384
+ }
385
+ const savedMb = trigger.fileSizeMb - newFileSizeMb;
386
+ // Final stats
387
+ console.log('\n✅ 归档完成:');
388
+ console.log(` 角色归档: ${charsArchived} → characters.json`);
389
+ console.log(` 伏笔归档: ${threadsArchived} → plot_threads.json`);
390
+ console.log(` 报告归档: ${reviewsArchived} → reviews.json`);
391
+ console.log(`\n💾 文件大小: ${trigger.fileSizeMb.toFixed(2)} MB → ${newFileSizeMb.toFixed(2)} MB (节省 ${savedMb.toFixed(2)} MB)`);
392
+ return {
393
+ charactersArchived: charsArchived,
394
+ threadsArchived: threadsArchived,
395
+ reviewsArchived: reviewsArchived,
396
+ savedMb,
397
+ };
398
+ }
399
+ restoreCharacter(name) {
400
+ const archived = this.loadArchive(this.charactersArchivePath);
401
+ // Find character
402
+ const charToRestore = archived.find(char => char.name === name);
403
+ if (!charToRestore) {
404
+ console.log(`❌ 归档中未找到角色: ${name}`);
405
+ return false;
406
+ }
407
+ // Remove archived_at field
408
+ delete charToRestore.archived_at;
409
+ // Remove from archive
410
+ const newArchived = archived.filter(char => char.name !== name);
411
+ this.saveArchive(this.charactersArchivePath, newArchived);
412
+ console.log(`✅ 角色已恢复: ${name}`);
413
+ return true;
414
+ }
415
+ getStats() {
416
+ const chars = this.loadArchive(this.charactersArchivePath);
417
+ const threads = this.loadArchive(this.plotThreadsArchivePath);
418
+ const reviews = this.loadArchive(this.reviewsArchivePath);
419
+ // Calculate archive file size
420
+ let totalSize = 0;
421
+ for (const path of [this.charactersArchivePath, this.plotThreadsArchivePath, this.reviewsArchivePath]) {
422
+ if (existsSync(path)) {
423
+ totalSize += statSync(path).size;
424
+ }
425
+ }
426
+ // Get state.json size
427
+ let stateSizeMb = 0;
428
+ if (existsSync(this.statePath)) {
429
+ stateSizeMb = statSync(this.statePath).size / (1024 * 1024);
430
+ }
431
+ return {
432
+ charactersCount: chars.length,
433
+ threadsCount: threads.length,
434
+ reviewsCount: reviews.length,
435
+ archiveSizeKb: totalSize / 1024,
436
+ stateSizeMb,
437
+ };
438
+ }
439
+ showStats() {
440
+ const stats = this.getStats();
441
+ console.log('📊 归档统计:');
442
+ console.log(` 角色归档: ${stats.charactersCount}`);
443
+ console.log(` 伏笔归档: ${stats.threadsCount}`);
444
+ console.log(` 报告归档: ${stats.reviewsCount}`);
445
+ console.log(` 归档大小: ${stats.archiveSizeKb.toFixed(2)} KB`);
446
+ console.log(`\n💾 state.json 当前大小: ${stats.stateSizeMb.toFixed(2)} MB`);
447
+ }
448
+ }
449
+ //# sourceMappingURL=archive-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive-manager.js","sourceRoot":"","sources":["../../src/utils/archive-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ export interface BackupInfo {
2
+ commitHash: string;
3
+ tag?: string;
4
+ chapter?: number;
5
+ message: string;
6
+ timestamp: string;
7
+ author: string;
8
+ }
9
+ export interface DiffResult {
10
+ fromChapter: number;
11
+ toChapter: number;
12
+ files: Array<{
13
+ path: string;
14
+ additions: number;
15
+ deletions: number;
16
+ }>;
17
+ summary: string;
18
+ }
19
+ export declare class BackupManager {
20
+ private projectRoot;
21
+ private gitAvailable;
22
+ private isGitRepository;
23
+ constructor(projectRoot: string);
24
+ /**
25
+ * 检查 Git 是否可用
26
+ */
27
+ isAvailable(): boolean;
28
+ /**
29
+ * 初始化 Git 仓库(如果不存在)
30
+ */
31
+ initRepo(): boolean;
32
+ /**
33
+ * 创建备份(git commit)
34
+ */
35
+ createBackup(chapter: number, message?: string): boolean;
36
+ /**
37
+ * 回滚到指定章节
38
+ */
39
+ rollback(chapter: number): boolean;
40
+ /**
41
+ * 查看差异
42
+ */
43
+ diff(fromChapter: number, toChapter: number): DiffResult | null;
44
+ /**
45
+ * 创建分支
46
+ */
47
+ createBranch(chapter: number, branchName: string): boolean;
48
+ /**
49
+ * 列出备份
50
+ */
51
+ listBackups(): BackupInfo[];
52
+ /**
53
+ * 获取当前版本
54
+ */
55
+ getCurrentVersion(): string | null;
56
+ /**
57
+ * 获取当前分支
58
+ */
59
+ getCurrentBranch(): string | null;
60
+ /**
61
+ * 检查是否有未提交的更改
62
+ */
63
+ hasUncommittedChanges(): boolean;
64
+ }
65
+ //# sourceMappingURL=backup-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup-manager.d.ts","sourceRoot":"","sources":["../../src/utils/backup-manager.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,eAAe,CAAU;gBAErB,WAAW,EAAE,MAAM;IAa/B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,QAAQ,IAAI,OAAO;IAoBnB;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAmDxD;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAoClC;;OAEG;IACH,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IA4B/D;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAuB1D;;OAEG;IACH,WAAW,IAAI,UAAU,EAAE;IA6C3B;;OAEG;IACH,iBAAiB,IAAI,MAAM,GAAG,IAAI;IAkBlC;;OAEG;IACH,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAkBjC;;OAEG;IACH,qBAAqB,IAAI,OAAO;CAajC"}