@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,462 @@
1
+ /**
2
+ * 工作流状态管理器
3
+ *
4
+ * 迁移自 Python workflow_manager.py
5
+ * 跟踪 write/review 任务执行状态,检测中断点,提供恢复选项
6
+ */
7
+ import { appendFileSync, existsSync, mkdirSync } from 'fs';
8
+ import { join, dirname } from 'path';
9
+ import { writeJsonAtomic, readJsonSafe } from './security.js';
10
+ // ============================================================================
11
+ // Constants
12
+ // ============================================================================
13
+ export const TASK_STATUS = {
14
+ RUNNING: 'running',
15
+ COMPLETED: 'completed',
16
+ FAILED: 'failed',
17
+ };
18
+ export const STEP_STATUS = {
19
+ STARTED: 'started',
20
+ RUNNING: 'running',
21
+ COMPLETED: 'completed',
22
+ FAILED: 'failed',
23
+ };
24
+ // ============================================================================
25
+ // Utility Functions
26
+ // ============================================================================
27
+ function nowIso() {
28
+ return new Date().toISOString();
29
+ }
30
+ // ============================================================================
31
+ // Workflow Manager
32
+ // ============================================================================
33
+ export class WorkflowManager {
34
+ _projectRoot;
35
+ statePath;
36
+ tracePath;
37
+ /** Get the project root directory */
38
+ get projectRoot() {
39
+ return this._projectRoot;
40
+ }
41
+ constructor(projectRoot) {
42
+ this._projectRoot = projectRoot;
43
+ const webnovelDir = join(projectRoot, '.webnovel');
44
+ if (!existsSync(webnovelDir)) {
45
+ mkdirSync(webnovelDir, { recursive: true });
46
+ }
47
+ this.statePath = join(webnovelDir, 'workflow_state.json');
48
+ this.tracePath = join(webnovelDir, 'observability', 'call_trace.jsonl');
49
+ const traceDir = dirname(this.tracePath);
50
+ if (!existsSync(traceDir)) {
51
+ mkdirSync(traceDir, { recursive: true });
52
+ }
53
+ }
54
+ // ==================== State Management ====================
55
+ loadState() {
56
+ const state = readJsonSafe(this.statePath, {
57
+ currentTask: null,
58
+ lastStableState: null,
59
+ history: [],
60
+ });
61
+ // Ensure defaults
62
+ state.currentTask ??= null;
63
+ state.lastStableState ??= null;
64
+ state.history ??= [];
65
+ if (state.currentTask) {
66
+ state.currentTask.failedSteps ??= [];
67
+ state.currentTask.retryCount ??= 0;
68
+ }
69
+ return state;
70
+ }
71
+ saveState(state) {
72
+ writeJsonAtomic(this.statePath, state);
73
+ }
74
+ // ==================== Task Management ====================
75
+ getPendingSteps(command) {
76
+ if (command === 'webnovel-write') {
77
+ return ['Step 1', 'Step 2A', 'Step 2B', 'Step 3', 'Step 4', 'Step 5', 'Step 6'];
78
+ }
79
+ if (command === 'webnovel-review') {
80
+ return ['Step 1', 'Step 2', 'Step 3', 'Step 4', 'Step 5', 'Step 6', 'Step 7', 'Step 8'];
81
+ }
82
+ return [];
83
+ }
84
+ startTask(command, args) {
85
+ const state = this.loadState();
86
+ const current = state.currentTask;
87
+ if (current && current.status === TASK_STATUS.RUNNING) {
88
+ current.retryCount = (current.retryCount ?? 0) + 1;
89
+ current.lastHeartbeat = nowIso();
90
+ state.currentTask = current;
91
+ this.saveState(state);
92
+ this.appendCallTrace('task_reentered', {
93
+ command: current.command,
94
+ chapter: current.args?.chapter_num,
95
+ retryCount: current.retryCount,
96
+ });
97
+ console.log(`ℹ️ 任务已在运行,执行重入标记: ${current.command}`);
98
+ return;
99
+ }
100
+ const startedAt = nowIso();
101
+ state.currentTask = {
102
+ command,
103
+ args,
104
+ startedAt,
105
+ lastHeartbeat: startedAt,
106
+ status: TASK_STATUS.RUNNING,
107
+ currentStep: null,
108
+ completedSteps: [],
109
+ failedSteps: [],
110
+ pendingSteps: this.getPendingSteps(command),
111
+ retryCount: 0,
112
+ artifacts: {
113
+ stateJsonModified: false,
114
+ entitiesAppeared: false,
115
+ reviewCompleted: false,
116
+ },
117
+ };
118
+ this.saveState(state);
119
+ this.appendCallTrace('task_started', { command, args });
120
+ console.log(`✅ 任务已启动: ${command} ${JSON.stringify(args)}`);
121
+ }
122
+ startStep(stepId, stepName, progressNote) {
123
+ const state = this.loadState();
124
+ const task = state.currentTask;
125
+ if (!task) {
126
+ console.log('⚠️ 无活动任务,请先使用 startTask');
127
+ return;
128
+ }
129
+ // Finalize previous step as failed if not completed
130
+ this.finalizeCurrentStepAsFailed(task, 'step_replaced_before_completion');
131
+ const startedAt = nowIso();
132
+ task.currentStep = {
133
+ id: stepId,
134
+ name: stepName,
135
+ status: STEP_STATUS.RUNNING,
136
+ startedAt,
137
+ runningAt: startedAt,
138
+ attempt: (task.retryCount ?? 0) + 1,
139
+ progressNote,
140
+ };
141
+ task.status = TASK_STATUS.RUNNING;
142
+ task.lastHeartbeat = nowIso();
143
+ this.saveState(state);
144
+ this.appendCallTrace('step_started', {
145
+ stepId,
146
+ stepName,
147
+ command: task.command,
148
+ chapter: task.args?.chapter_num,
149
+ progressNote,
150
+ });
151
+ console.log(`▶️ ${stepId} 开始: ${stepName}`);
152
+ }
153
+ completeStep(stepId, artifacts) {
154
+ const state = this.loadState();
155
+ const task = state.currentTask;
156
+ if (!task || !task.currentStep) {
157
+ console.log('⚠️ 无活动 Step');
158
+ return;
159
+ }
160
+ const currentStep = task.currentStep;
161
+ if (currentStep.id !== stepId) {
162
+ console.log(`⚠️ 当前 Step 为 ${currentStep.id},与 ${stepId} 不一致,拒绝完成`);
163
+ this.appendCallTrace('step_complete_rejected', {
164
+ requestedStepId: stepId,
165
+ activeStepId: currentStep.id,
166
+ command: task.command,
167
+ });
168
+ return;
169
+ }
170
+ currentStep.status = STEP_STATUS.COMPLETED;
171
+ currentStep.completedAt = nowIso();
172
+ if (artifacts) {
173
+ currentStep.artifacts = artifacts;
174
+ Object.assign(task.artifacts, artifacts);
175
+ }
176
+ task.completedSteps.push(currentStep);
177
+ task.currentStep = null;
178
+ task.lastHeartbeat = nowIso();
179
+ this.saveState(state);
180
+ this.appendCallTrace('step_completed', {
181
+ stepId,
182
+ command: task.command,
183
+ chapter: task.args?.chapter_num,
184
+ });
185
+ console.log(`✅ ${stepId} 完成`);
186
+ }
187
+ completeTask(finalArtifacts) {
188
+ const state = this.loadState();
189
+ const task = state.currentTask;
190
+ if (!task) {
191
+ console.log('⚠️ 无活动任务');
192
+ return;
193
+ }
194
+ this.finalizeCurrentStepAsFailed(task, 'task_completed_with_active_step');
195
+ task.status = TASK_STATUS.COMPLETED;
196
+ task.completedAt = nowIso();
197
+ if (finalArtifacts) {
198
+ Object.assign(task.artifacts, finalArtifacts);
199
+ }
200
+ state.lastStableState = this.extractStableState(task);
201
+ state.history ??= [];
202
+ state.history.push({
203
+ taskId: `task_${state.history.length + 1}:03d}`,
204
+ command: task.command,
205
+ chapter: task.args?.chapter_num,
206
+ status: TASK_STATUS.COMPLETED,
207
+ completedAt: task.completedAt,
208
+ });
209
+ state.currentTask = null;
210
+ this.saveState(state);
211
+ this.appendCallTrace('task_completed', {
212
+ command: task.command,
213
+ chapter: task.args?.chapter_num,
214
+ completedSteps: task.completedSteps.length,
215
+ failedSteps: task.failedSteps.length,
216
+ });
217
+ console.log('🎀 任务完成');
218
+ }
219
+ failCurrentTask(reason) {
220
+ const state = this.loadState();
221
+ const task = state.currentTask;
222
+ if (!task) {
223
+ console.log('⚠️ 无活动任务');
224
+ return;
225
+ }
226
+ this.finalizeCurrentStepAsFailed(task, reason);
227
+ task.status = TASK_STATUS.FAILED;
228
+ task.failedAt = nowIso();
229
+ task.failureReason = reason;
230
+ this.saveState(state);
231
+ this.appendCallTrace('task_failed', {
232
+ command: task.command,
233
+ chapter: task.args?.chapter_num,
234
+ reason,
235
+ });
236
+ console.log(`⚠️ 任务已标记失败: ${reason}`);
237
+ }
238
+ clearCurrentTask() {
239
+ const state = this.loadState();
240
+ const task = state.currentTask;
241
+ if (task) {
242
+ this.appendCallTrace('task_cleared', {
243
+ command: task.command,
244
+ chapter: task.args?.chapter_num,
245
+ status: task.status,
246
+ });
247
+ state.currentTask = null;
248
+ this.saveState(state);
249
+ console.log('✅ 中断任务已清除');
250
+ }
251
+ else {
252
+ console.log('⚠️ 无中断任务');
253
+ }
254
+ }
255
+ // ==================== Interruption Detection ====================
256
+ detectInterruption() {
257
+ const state = this.loadState();
258
+ if (!state || !state.currentTask) {
259
+ return null;
260
+ }
261
+ const task = state.currentTask;
262
+ if (task.status === TASK_STATUS.COMPLETED) {
263
+ return null;
264
+ }
265
+ const lastHeartbeat = new Date(task.lastHeartbeat);
266
+ const elapsed = (Date.now() - lastHeartbeat.getTime()) / 1000;
267
+ const interruptInfo = {
268
+ command: task.command,
269
+ args: task.args,
270
+ taskStatus: task.status,
271
+ currentStep: task.currentStep,
272
+ completedSteps: task.completedSteps,
273
+ failedSteps: task.failedSteps,
274
+ elapsedSeconds: elapsed,
275
+ artifacts: task.artifacts,
276
+ startedAt: task.startedAt,
277
+ retryCount: task.retryCount,
278
+ };
279
+ this.appendCallTrace('interruption_detected', {
280
+ command: task.command,
281
+ chapter: task.args?.chapter_num,
282
+ taskStatus: task.status,
283
+ currentStep: task.currentStep?.id,
284
+ elapsedSeconds: elapsed,
285
+ });
286
+ return interruptInfo;
287
+ }
288
+ analyzeRecoveryOptions(interruptInfo) {
289
+ const currentStep = interruptInfo.currentStep;
290
+ const command = interruptInfo.command;
291
+ const chapterNum = interruptInfo.args?.chapter_num ?? '?';
292
+ if (!currentStep) {
293
+ return [
294
+ {
295
+ option: 'A',
296
+ label: '从头开始',
297
+ risk: 'low',
298
+ description: '重新执行完整流程',
299
+ actions: [
300
+ '删除 workflow_state.json 当前任务',
301
+ `执行 /${command} ${chapterNum}`,
302
+ ],
303
+ },
304
+ ];
305
+ }
306
+ const stepId = currentStep.id;
307
+ // Step 1 or 1.5
308
+ if (['Step 1', 'Step 1.5'].includes(stepId)) {
309
+ return [
310
+ {
311
+ option: 'A',
312
+ label: '从 Step 1 重新开始',
313
+ risk: 'low',
314
+ description: '重新加载上下文',
315
+ actions: ['清理中断状态', `执行 /${command} ${chapterNum}`],
316
+ },
317
+ ];
318
+ }
319
+ // Step 2 variants
320
+ if (['Step 2', 'Step 2A', 'Step 2B'].includes(stepId)) {
321
+ return [
322
+ {
323
+ option: 'A',
324
+ label: '删除半成品,从 Step 1 重启',
325
+ risk: 'low',
326
+ description: `清理章节文件,重新生成章节`,
327
+ actions: [
328
+ `删除章节文件(如存在)`,
329
+ '清理 Git 暂存区',
330
+ '清理中断状态',
331
+ `执行 /${command} ${chapterNum}`,
332
+ ],
333
+ },
334
+ {
335
+ option: 'B',
336
+ label: '回滚到上一章',
337
+ risk: 'medium',
338
+ description: '丢弃当前章节进度',
339
+ actions: [
340
+ `git reset --hard ch${String(chapterNum - 1).padStart(4, '0')}`,
341
+ '清理中断状态',
342
+ `重新决定是否继续 Ch${chapterNum}`,
343
+ ],
344
+ },
345
+ ];
346
+ }
347
+ // Step 3
348
+ if (stepId === 'Step 3') {
349
+ return [
350
+ {
351
+ option: 'A',
352
+ label: '重新执行审查',
353
+ risk: 'medium',
354
+ description: '重新调用审查员并生成报告',
355
+ actions: ['重新执行审查', '生成审查报告', '继续 Step 4 润色'],
356
+ },
357
+ {
358
+ option: 'B',
359
+ label: '跳过审查直接润色',
360
+ risk: 'low',
361
+ description: '后续可用 /webnovel-review 补审',
362
+ actions: ['标记审查已跳过', '继续 Step 4 润色'],
363
+ },
364
+ ];
365
+ }
366
+ // Step 4
367
+ if (stepId === 'Step 4') {
368
+ return [
369
+ {
370
+ option: 'A',
371
+ label: '继续润色',
372
+ risk: 'low',
373
+ description: '继续润色章节文件,完成后进入 Step 5',
374
+ actions: ['继续润色章节文件', '保存文件', '继续 Step 5(Data Agent)'],
375
+ },
376
+ {
377
+ option: 'B',
378
+ label: '删除润色稿,从 Step 2A 重写',
379
+ risk: 'medium',
380
+ description: '删除章节文件并重新生成',
381
+ actions: ['删除章节文件', '清理 Git 暂存区', '清理中断状态', `执行 /${command} ${chapterNum}`],
382
+ },
383
+ ];
384
+ }
385
+ // Step 5
386
+ if (stepId === 'Step 5') {
387
+ return [
388
+ {
389
+ option: 'A',
390
+ label: '从 Step 5 重新开始',
391
+ risk: 'low',
392
+ description: '重新运行 Data Agent(幂等)',
393
+ actions: ['重新调用 Data Agent', '继续 Step 6(Git 备份)'],
394
+ },
395
+ ];
396
+ }
397
+ // Step 6
398
+ if (stepId === 'Step 6') {
399
+ return [
400
+ {
401
+ option: 'A',
402
+ label: '继续 Git 提交',
403
+ risk: 'low',
404
+ description: '完成未完成的 Git commit + tag',
405
+ actions: ['检查 Git 暂存区', '重新执行备份', '继续 complete-task'],
406
+ },
407
+ {
408
+ option: 'B',
409
+ label: '回滚 Git 改动',
410
+ risk: 'medium',
411
+ description: '丢弃暂存区所有改动',
412
+ actions: ['git reset HEAD .', `删除第${chapterNum}章文件`, '清理中断状态'],
413
+ },
414
+ ];
415
+ }
416
+ // Default
417
+ return [
418
+ {
419
+ option: 'A',
420
+ label: '从头开始',
421
+ risk: 'low',
422
+ description: '重新执行完整流程',
423
+ actions: ['清理所有中断 artifacts', `执行 /${command} ${chapterNum}`],
424
+ },
425
+ ];
426
+ }
427
+ // ==================== Helpers ====================
428
+ finalizeCurrentStepAsFailed(task, reason) {
429
+ const currentStep = task.currentStep;
430
+ if (!currentStep)
431
+ return;
432
+ if ([STEP_STATUS.COMPLETED, STEP_STATUS.FAILED].includes(currentStep.status))
433
+ return;
434
+ currentStep.status = STEP_STATUS.FAILED;
435
+ currentStep.failedAt = nowIso();
436
+ currentStep.failureReason = reason;
437
+ task.failedSteps.push(currentStep);
438
+ task.currentStep = null;
439
+ }
440
+ extractStableState(task) {
441
+ return {
442
+ command: task.command,
443
+ chapterNum: task.args?.chapter_num,
444
+ completedAt: task.completedAt,
445
+ artifacts: task.artifacts,
446
+ };
447
+ }
448
+ appendCallTrace(event, payload) {
449
+ try {
450
+ const entry = {
451
+ timestamp: nowIso(),
452
+ event,
453
+ payload,
454
+ };
455
+ appendFileSync(this.tracePath, JSON.stringify(entry, null, 2) + '\n', 'utf-8');
456
+ }
457
+ catch {
458
+ // Best effort
459
+ }
460
+ }
461
+ }
462
+ //# sourceMappingURL=workflow-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-manager.js","sourceRoot":"","sources":["../../src/utils/workflow-manager.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@changw98ic/cli",
3
+ "version": "1.0.0",
4
+ "description": "命令行工具 - webnovel 命令",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "webnovel": "dist/index.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.js",
14
+ "types": "./dist/index.d.ts"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "README.md",
20
+ "LICENSE"
21
+ ],
22
+ "keywords": [
23
+ "webnovel",
24
+ "writing",
25
+ "ai",
26
+ "cli",
27
+ "command-line",
28
+ "novel"
29
+ ],
30
+ "author": "",
31
+ "license": "GPL-3.0-or-later",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/changw98ic/webnovel-writer-skill.git",
35
+ "directory": "packages/cli"
36
+ },
37
+ "bugs": {
38
+ "url": "https://github.com/changw98ic/webnovel-writer-skill/issues"
39
+ },
40
+ "homepage": "https://github.com/changw98ic/webnovel-writer-skill#readme",
41
+ "publishConfig": {
42
+ "access": "public"
43
+ },
44
+ "dependencies": {
45
+ "commander": "^12.0.0",
46
+ "ora": "^8.0.0",
47
+ "chalk": "^5.3.0",
48
+ "enquirer": "^2.4.0",
49
+ "conf": "^10.2.0",
50
+ "@changw98ic/core": "1.0.0",
51
+ "@changw98ic/data": "1.0.0",
52
+ "@changw98ic/adapters": "1.0.0",
53
+ "@changw98ic/dashboard": "1.0.0"
54
+ },
55
+ "devDependencies": {
56
+ "@types/node": "^20.0.0",
57
+ "typescript": "^5.4.0",
58
+ "vitest": "^1.6.0"
59
+ },
60
+ "scripts": {
61
+ "build": "tsc -p tsconfig.build.json",
62
+ "dev": "tsc -p tsconfig.build.json --watch",
63
+ "clean": "rm -rf dist",
64
+ "test": "vitest run packages/cli"
65
+ }
66
+ }