@winspan/claude-forge 1.16.14 → 1.17.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 (80) hide show
  1. package/README.md +6 -6
  2. package/dist/daemon/index.d.ts.map +1 -1
  3. package/dist/daemon/index.js +8 -0
  4. package/dist/daemon/index.js.map +1 -1
  5. package/dist/pipeline/aggregator.d.ts +118 -0
  6. package/dist/pipeline/aggregator.d.ts.map +1 -0
  7. package/dist/pipeline/aggregator.js +252 -0
  8. package/dist/pipeline/aggregator.js.map +1 -0
  9. package/dist/pipeline/event-sourced-engine.d.ts +77 -0
  10. package/dist/pipeline/event-sourced-engine.d.ts.map +1 -0
  11. package/dist/pipeline/event-sourced-engine.js +266 -0
  12. package/dist/pipeline/event-sourced-engine.js.map +1 -0
  13. package/dist/pipeline/event-store.d.ts +58 -0
  14. package/dist/pipeline/event-store.d.ts.map +1 -0
  15. package/dist/pipeline/event-store.js +184 -0
  16. package/dist/pipeline/event-store.js.map +1 -0
  17. package/dist/pipeline/events.d.ts +166 -0
  18. package/dist/pipeline/events.d.ts.map +1 -0
  19. package/dist/pipeline/events.js +29 -0
  20. package/dist/pipeline/events.js.map +1 -0
  21. package/dist/pipeline/optimized-aggregator.d.ts +36 -0
  22. package/dist/pipeline/optimized-aggregator.d.ts.map +1 -0
  23. package/dist/pipeline/optimized-aggregator.js +93 -0
  24. package/dist/pipeline/optimized-aggregator.js.map +1 -0
  25. package/dist/pipeline/progress-tracker.d.ts +29 -0
  26. package/dist/pipeline/progress-tracker.d.ts.map +1 -0
  27. package/dist/pipeline/progress-tracker.js +99 -0
  28. package/dist/pipeline/progress-tracker.js.map +1 -0
  29. package/dist/pipeline/snapshot-store.d.ts +45 -0
  30. package/dist/pipeline/snapshot-store.d.ts.map +1 -0
  31. package/dist/pipeline/snapshot-store.js +89 -0
  32. package/dist/pipeline/snapshot-store.js.map +1 -0
  33. package/dist/pipeline/state-machine-types.d.ts +156 -0
  34. package/dist/pipeline/state-machine-types.d.ts.map +1 -0
  35. package/dist/pipeline/state-machine-types.js +7 -0
  36. package/dist/pipeline/state-machine-types.js.map +1 -0
  37. package/dist/pipeline/state-machine.d.ts +44 -0
  38. package/dist/pipeline/state-machine.d.ts.map +1 -0
  39. package/dist/pipeline/state-machine.js +203 -0
  40. package/dist/pipeline/state-machine.js.map +1 -0
  41. package/dist/pipeline/state-query.d.ts +71 -0
  42. package/dist/pipeline/state-query.d.ts.map +1 -0
  43. package/dist/pipeline/state-query.js +192 -0
  44. package/dist/pipeline/state-query.js.map +1 -0
  45. package/dist/pipeline/store.d.ts +12 -17
  46. package/dist/pipeline/store.d.ts.map +1 -1
  47. package/dist/pipeline/store.js +214 -110
  48. package/dist/pipeline/store.js.map +1 -1
  49. package/dist/pipeline/store.legacy.d.ts +48 -0
  50. package/dist/pipeline/store.legacy.d.ts.map +1 -0
  51. package/dist/pipeline/store.legacy.js +163 -0
  52. package/dist/pipeline/store.legacy.js.map +1 -0
  53. package/dist/pipeline/transitions.d.ts +28 -0
  54. package/dist/pipeline/transitions.d.ts.map +1 -0
  55. package/dist/pipeline/transitions.js +336 -0
  56. package/dist/pipeline/transitions.js.map +1 -0
  57. package/dist/scripts/auto-migrate.d.ts +9 -0
  58. package/dist/scripts/auto-migrate.d.ts.map +1 -0
  59. package/dist/scripts/auto-migrate.js +161 -0
  60. package/dist/scripts/auto-migrate.js.map +1 -0
  61. package/dist/scripts/migrate-to-event-sourcing.d.ts +16 -0
  62. package/dist/scripts/migrate-to-event-sourcing.d.ts.map +1 -0
  63. package/dist/scripts/migrate-to-event-sourcing.js +179 -0
  64. package/dist/scripts/migrate-to-event-sourcing.js.map +1 -0
  65. package/dist/storage/sqlite.d.ts +1 -0
  66. package/dist/storage/sqlite.d.ts.map +1 -1
  67. package/dist/storage/sqlite.js +3 -0
  68. package/dist/storage/sqlite.js.map +1 -1
  69. package/dist/web/routes/config.d.ts.map +1 -1
  70. package/dist/web/routes/config.js +48 -0
  71. package/dist/web/routes/config.js.map +1 -1
  72. package/dist/web/routes/events.d.ts.map +1 -1
  73. package/dist/web/routes/events.js +12 -0
  74. package/dist/web/routes/events.js.map +1 -1
  75. package/dist/web-static/assets/index-BFIWA0KC.css +2 -0
  76. package/dist/web-static/assets/index-BmOm81pb.js +65 -0
  77. package/dist/web-static/index.html +2 -2
  78. package/package.json +3 -1
  79. package/dist/web-static/assets/index-7DiTbk7a.css +0 -2
  80. package/dist/web-static/assets/index-nauLZfI_.js +0 -65
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Pipeline 事件类型定义
3
+ */
4
+ export declare enum PipelineEventType {
5
+ PIPELINE_CREATED = "pipeline.created",
6
+ PIPELINE_CLOSED = "pipeline.closed",
7
+ PHASE_ADVANCED = "phase.advanced",
8
+ PHASE_ROLLBACK = "phase.rollback",
9
+ TASK_CREATED = "task.created",
10
+ TASK_STARTED = "task.started",
11
+ TASK_COMPLETED = "task.completed",
12
+ TASK_FAILED = "task.failed",
13
+ QUALITY_CHECK_STARTED = "quality.check_started",
14
+ QUALITY_CHECK_PASSED = "quality.check_passed",
15
+ QUALITY_CHECK_FAILED = "quality.check_failed",
16
+ QUALITY_FORCED_PASS = "quality.forced_pass",
17
+ TOOL_TRACKED = "activity.tool_tracked",
18
+ ACTIVITY_THRESHOLD_TRIGGERED = "activity.threshold_triggered",
19
+ EMPTY_PHASE_DETECTED = "phase.empty_detected",
20
+ EMPTY_PHASE_ADVANCED = "phase.empty_advanced"
21
+ }
22
+ /**
23
+ * 事件基类
24
+ */
25
+ export interface PipelineEvent<T = unknown> {
26
+ id: string;
27
+ pipelineId: string;
28
+ type: PipelineEventType;
29
+ timestamp: number;
30
+ payload: T;
31
+ metadata: {
32
+ sessionId: string;
33
+ toolName?: string;
34
+ userId?: string;
35
+ };
36
+ }
37
+ /**
38
+ * Pipeline 创建事件载荷
39
+ */
40
+ export interface PipelineCreatedPayload {
41
+ requirement: string;
42
+ projectPath: string;
43
+ sessionId: string;
44
+ techStack?: string;
45
+ complexity?: string;
46
+ taskType?: string;
47
+ plannedPhases: string[];
48
+ reasoning?: string;
49
+ }
50
+ /**
51
+ * 阶段推进事件载荷
52
+ */
53
+ export interface PhaseAdvancedPayload {
54
+ fromPhase: string;
55
+ toPhase: string;
56
+ reason: 'task_complete' | 'activity_threshold' | 'empty_phase' | 'forced';
57
+ completedTasks: Array<{
58
+ id: string;
59
+ title: string;
60
+ output: string;
61
+ }>;
62
+ qualityLevel?: 'pass' | 'warn' | 'fail';
63
+ }
64
+ /**
65
+ * 任务创建事件载荷
66
+ */
67
+ export interface TaskCreatedPayload {
68
+ taskId: string;
69
+ title: string;
70
+ phase: string;
71
+ description?: string;
72
+ dependencies?: string;
73
+ source?: string;
74
+ }
75
+ /**
76
+ * 任务完成事件载荷
77
+ */
78
+ export interface TaskCompletedPayload {
79
+ taskId: string;
80
+ title: string;
81
+ phase: string;
82
+ artifact: string;
83
+ detectionMethod: 'explicit_signal' | 'heuristic';
84
+ }
85
+ /**
86
+ * 质量检查开始事件载荷
87
+ */
88
+ export interface QualityCheckStartedPayload {
89
+ phase: string;
90
+ taskContext: string;
91
+ recentFiles: string[];
92
+ }
93
+ /**
94
+ * 质量检查通过事件载荷
95
+ */
96
+ export interface QualityCheckPassedPayload {
97
+ phase: string;
98
+ level: 'pass' | 'warn';
99
+ checks: Array<{
100
+ category: string;
101
+ level: 'pass' | 'warn';
102
+ message: string;
103
+ }>;
104
+ }
105
+ /**
106
+ * 质量检查失败事件载荷
107
+ */
108
+ export interface QualityCheckFailedPayload {
109
+ phase: string;
110
+ level: 'fail';
111
+ checks: Array<{
112
+ category: string;
113
+ level: 'fail';
114
+ message: string;
115
+ suggestion?: string;
116
+ }>;
117
+ fixAttempt: number;
118
+ maxAttempts: number;
119
+ }
120
+ /**
121
+ * 质量强制放行事件载荷
122
+ */
123
+ export interface QualityForcedPassPayload {
124
+ phase: string;
125
+ reason: 'max_attempts_reached';
126
+ finalAttempt: number;
127
+ unresolvedIssues: string[];
128
+ }
129
+ /**
130
+ * 工具追踪事件载荷
131
+ */
132
+ export interface ToolTrackedPayload {
133
+ phase: string;
134
+ toolName: string;
135
+ toolCategory: string;
136
+ eventCount: number;
137
+ writeEditCount: number;
138
+ }
139
+ /**
140
+ * 活动阈值触发事件载荷
141
+ */
142
+ export interface ActivityThresholdTriggeredPayload {
143
+ phase: string;
144
+ eventCount: number;
145
+ threshold: number;
146
+ stagnantDuration: number;
147
+ lastWriteEditTime: number;
148
+ }
149
+ /**
150
+ * 空阶段检测事件载荷
151
+ */
152
+ export interface EmptyPhaseDetectedPayload {
153
+ phase: string;
154
+ eventCount: number;
155
+ threshold: number;
156
+ }
157
+ /**
158
+ * Pipeline 关闭事件载荷
159
+ */
160
+ export interface PipelineClosedPayload {
161
+ reason: 'completed' | 'manual' | 'expired';
162
+ totalTasks: number;
163
+ completedTasks: number;
164
+ failedTasks: number;
165
+ }
166
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/pipeline/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Pipeline 事件类型定义
3
+ */
4
+ export var PipelineEventType;
5
+ (function (PipelineEventType) {
6
+ // Pipeline 生命周期
7
+ PipelineEventType["PIPELINE_CREATED"] = "pipeline.created";
8
+ PipelineEventType["PIPELINE_CLOSED"] = "pipeline.closed";
9
+ // 阶段推进
10
+ PipelineEventType["PHASE_ADVANCED"] = "phase.advanced";
11
+ PipelineEventType["PHASE_ROLLBACK"] = "phase.rollback";
12
+ // 任务管理
13
+ PipelineEventType["TASK_CREATED"] = "task.created";
14
+ PipelineEventType["TASK_STARTED"] = "task.started";
15
+ PipelineEventType["TASK_COMPLETED"] = "task.completed";
16
+ PipelineEventType["TASK_FAILED"] = "task.failed";
17
+ // 质量门禁
18
+ PipelineEventType["QUALITY_CHECK_STARTED"] = "quality.check_started";
19
+ PipelineEventType["QUALITY_CHECK_PASSED"] = "quality.check_passed";
20
+ PipelineEventType["QUALITY_CHECK_FAILED"] = "quality.check_failed";
21
+ PipelineEventType["QUALITY_FORCED_PASS"] = "quality.forced_pass";
22
+ // 活动追踪
23
+ PipelineEventType["TOOL_TRACKED"] = "activity.tool_tracked";
24
+ PipelineEventType["ACTIVITY_THRESHOLD_TRIGGERED"] = "activity.threshold_triggered";
25
+ // 空阶段自愈
26
+ PipelineEventType["EMPTY_PHASE_DETECTED"] = "phase.empty_detected";
27
+ PipelineEventType["EMPTY_PHASE_ADVANCED"] = "phase.empty_advanced";
28
+ })(PipelineEventType || (PipelineEventType = {}));
29
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/pipeline/events.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAN,IAAY,iBA4BX;AA5BD,WAAY,iBAAiB;IAC3B,gBAAgB;IAChB,0DAAqC,CAAA;IACrC,wDAAmC,CAAA;IAEnC,OAAO;IACP,sDAAiC,CAAA;IACjC,sDAAiC,CAAA;IAEjC,OAAO;IACP,kDAA6B,CAAA;IAC7B,kDAA6B,CAAA;IAC7B,sDAAiC,CAAA;IACjC,gDAA2B,CAAA;IAE3B,OAAO;IACP,oEAA+C,CAAA;IAC/C,kEAA6C,CAAA;IAC7C,kEAA6C,CAAA;IAC7C,gEAA2C,CAAA;IAE3C,OAAO;IACP,2DAAsC,CAAA;IACtC,kFAA6D,CAAA;IAE7D,QAAQ;IACR,kEAA6C,CAAA;IAC7C,kEAA6C,CAAA;AAC/C,CAAC,EA5BW,iBAAiB,KAAjB,iBAAiB,QA4B5B"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 优化的 Pipeline 聚合器(支持快照)
3
+ *
4
+ * 职责:
5
+ * 1. 从快照 + 增量事件重建状态(性能优化)
6
+ * 2. 自动管理快照生命周期
7
+ */
8
+ import { PipelineAggregator, PipelineState } from './aggregator.js';
9
+ import { EventStore } from './event-store.js';
10
+ import { SnapshotStore } from './snapshot-store.js';
11
+ export declare class OptimizedAggregator extends PipelineAggregator {
12
+ private snapshotStore;
13
+ private readonly SNAPSHOT_INTERVAL;
14
+ constructor(eventStore: EventStore, snapshotStore: SnapshotStore);
15
+ /**
16
+ * 从快照 + 增量事件重建状态
17
+ */
18
+ rebuild(pipelineId: string): PipelineState | null;
19
+ /**
20
+ * 重建状态并自动保存快照
21
+ */
22
+ rebuildAndSnapshot(pipelineId: string): PipelineState | null;
23
+ /**
24
+ * 检查是否需要保存快照
25
+ */
26
+ private maybeSnapshot;
27
+ /**
28
+ * 强制保存快照
29
+ */
30
+ forceSnapshot(pipelineId: string): void;
31
+ /**
32
+ * 清除快照(强制从头重建)
33
+ */
34
+ clearSnapshot(pipelineId: string): void;
35
+ }
36
+ //# sourceMappingURL=optimized-aggregator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimized-aggregator.d.ts","sourceRoot":"","sources":["../../src/pipeline/optimized-aggregator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,qBAAa,mBAAoB,SAAQ,kBAAkB;IAKvD,OAAO,CAAC,aAAa;IAJvB,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAM;gBAGtC,UAAU,EAAE,UAAU,EACd,aAAa,EAAE,aAAa;IAKtC;;OAEG;IACM,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAuB1D;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAU5D;;OAEG;IACH,OAAO,CAAC,aAAa;IAsBrB;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAevC;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;CAGxC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * 优化的 Pipeline 聚合器(支持快照)
3
+ *
4
+ * 职责:
5
+ * 1. 从快照 + 增量事件重建状态(性能优化)
6
+ * 2. 自动管理快照生命周期
7
+ */
8
+ import { PipelineAggregator } from './aggregator.js';
9
+ export class OptimizedAggregator extends PipelineAggregator {
10
+ snapshotStore;
11
+ SNAPSHOT_INTERVAL = 50; // 每 50 个事件保存一次快照
12
+ constructor(eventStore, snapshotStore) {
13
+ super(eventStore);
14
+ this.snapshotStore = snapshotStore;
15
+ }
16
+ /**
17
+ * 从快照 + 增量事件重建状态
18
+ */
19
+ rebuild(pipelineId) {
20
+ // 1. 尝试加载快照
21
+ const snapshot = this.snapshotStore.load(pipelineId);
22
+ if (snapshot) {
23
+ // 2. 加载快照之后的增量事件
24
+ const incrementalEvents = this.eventStore.getEvents(pipelineId, {
25
+ since: snapshot.lastEventTimestamp,
26
+ });
27
+ // 3. 应用增量事件
28
+ let state = snapshot.state;
29
+ for (const event of incrementalEvents) {
30
+ state = this.apply(state, event);
31
+ }
32
+ return state;
33
+ }
34
+ // 4. 没有快照,从头重建
35
+ return super.rebuild(pipelineId);
36
+ }
37
+ /**
38
+ * 重建状态并自动保存快照
39
+ */
40
+ rebuildAndSnapshot(pipelineId) {
41
+ const state = this.rebuild(pipelineId);
42
+ if (state) {
43
+ this.maybeSnapshot(pipelineId, state);
44
+ }
45
+ return state;
46
+ }
47
+ /**
48
+ * 检查是否需要保存快照
49
+ */
50
+ maybeSnapshot(pipelineId, state) {
51
+ const snapshot = this.snapshotStore.load(pipelineId);
52
+ const latestEvent = this.eventStore.getLatestEvents(pipelineId, 1)[0];
53
+ if (!latestEvent)
54
+ return;
55
+ const lastSnapshotTimestamp = snapshot?.lastEventTimestamp || 0;
56
+ const eventsSinceSnapshot = this.eventStore.countEvents(pipelineId, {
57
+ since: lastSnapshotTimestamp,
58
+ });
59
+ // 每 N 个事件保存一次快照
60
+ if (eventsSinceSnapshot >= this.SNAPSHOT_INTERVAL) {
61
+ this.snapshotStore.save({
62
+ pipelineId,
63
+ state,
64
+ lastEventTimestamp: latestEvent.timestamp,
65
+ createdAt: Date.now(),
66
+ });
67
+ }
68
+ }
69
+ /**
70
+ * 强制保存快照
71
+ */
72
+ forceSnapshot(pipelineId) {
73
+ const state = this.rebuild(pipelineId);
74
+ if (!state)
75
+ return;
76
+ const latestEvent = this.eventStore.getLatestEvents(pipelineId, 1)[0];
77
+ if (!latestEvent)
78
+ return;
79
+ this.snapshotStore.save({
80
+ pipelineId,
81
+ state,
82
+ lastEventTimestamp: latestEvent.timestamp,
83
+ createdAt: Date.now(),
84
+ });
85
+ }
86
+ /**
87
+ * 清除快照(强制从头重建)
88
+ */
89
+ clearSnapshot(pipelineId) {
90
+ this.snapshotStore.delete(pipelineId);
91
+ }
92
+ }
93
+ //# sourceMappingURL=optimized-aggregator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimized-aggregator.js","sourceRoot":"","sources":["../../src/pipeline/optimized-aggregator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,kBAAkB,EAAiB,MAAM,iBAAiB,CAAC;AAIpE,MAAM,OAAO,mBAAoB,SAAQ,kBAAkB;IAK/C;IAJO,iBAAiB,GAAG,EAAE,CAAC,CAAC,iBAAiB;IAE1D,YACE,UAAsB,EACd,aAA4B;QAEpC,KAAK,CAAC,UAAU,CAAC,CAAC;QAFV,kBAAa,GAAb,aAAa,CAAe;IAGtC,CAAC;IAED;;OAEG;IACM,OAAO,CAAC,UAAkB;QACjC,YAAY;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAErD,IAAI,QAAQ,EAAE,CAAC;YACb,iBAAiB;YACjB,MAAM,iBAAiB,GAAI,IAAY,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,EAAE;gBACvE,KAAK,EAAE,QAAQ,CAAC,kBAAkB;aACnC,CAAC,CAAC;YAEH,YAAY;YACZ,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC3B,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;gBACtC,KAAK,GAAI,IAAY,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC5C,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;QAED,eAAe;QACf,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,UAAkB;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAEvC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,UAAkB,EAAE,KAAoB;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,WAAW,GAAI,IAAY,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/E,IAAI,CAAC,WAAW;YAAE,OAAO;QAEzB,MAAM,qBAAqB,GAAG,QAAQ,EAAE,kBAAkB,IAAI,CAAC,CAAC;QAChE,MAAM,mBAAmB,GAAI,IAAY,CAAC,UAAU,CAAC,WAAW,CAAC,UAAU,EAAE;YAC3E,KAAK,EAAE,qBAAqB;SAC7B,CAAC,CAAC;QAEH,gBAAgB;QAChB,IAAI,mBAAmB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAClD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gBACtB,UAAU;gBACV,KAAK;gBACL,kBAAkB,EAAE,WAAW,CAAC,SAAS;gBACzC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,UAAkB;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,MAAM,WAAW,GAAI,IAAY,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,WAAW;YAAE,OAAO;QAEzB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YACtB,UAAU;YACV,KAAK;YACL,kBAAkB,EAAE,WAAW,CAAC,SAAS;YACzC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,UAAkB;QAC9B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Pipeline 进度追踪器
3
+ *
4
+ * 职责:
5
+ * 1. 从聚合器获取状态,确保快照与实际状态一致
6
+ * 2. 根据状态机状态生成格式化快照
7
+ */
8
+ import { PipelineAggregator } from './aggregator.js';
9
+ import { EventStore } from './event-store.js';
10
+ export declare class PipelineProgressTracker {
11
+ private aggregator;
12
+ private eventStore;
13
+ constructor(aggregator: PipelineAggregator, eventStore: EventStore);
14
+ /**
15
+ * 生成进度快照(从聚合器重建状态,保证一致性)
16
+ */
17
+ getProgressSnapshot(pipelineId: string, gateStatus?: {
18
+ blocked: boolean;
19
+ level: 'pass' | 'warn' | 'fail';
20
+ issues?: string[];
21
+ fixAttempts?: number;
22
+ checkedPhase?: string;
23
+ }, advanceReason?: 'task_complete' | 'activity_threshold' | 'empty_phase'): string | null;
24
+ /**
25
+ * 获取质量检查时的阶段(用于修复快照不一致问题)
26
+ */
27
+ getCheckedPhase(pipelineId: string): string | null;
28
+ }
29
+ //# sourceMappingURL=progress-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-tracker.d.ts","sourceRoot":"","sources":["../../src/pipeline/progress-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAc9C,qBAAa,uBAAuB;IAEhC,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,UAAU;gBADV,UAAU,EAAE,kBAAkB,EAC9B,UAAU,EAAE,UAAU;IAGhC;;OAEG;IACH,mBAAmB,CACjB,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;QAChC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,EACD,aAAa,CAAC,EAAE,eAAe,GAAG,oBAAoB,GAAG,aAAa,GACrE,MAAM,GAAG,IAAI;IAqEhB;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAOnD"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Pipeline 进度追踪器
3
+ *
4
+ * 职责:
5
+ * 1. 从聚合器获取状态,确保快照与实际状态一致
6
+ * 2. 根据状态机状态生成格式化快照
7
+ */
8
+ import { PipelineEventType } from './events.js';
9
+ const PHASE_LABEL_MAP = {
10
+ analyze: '需求分析',
11
+ design: '架构设计',
12
+ profile: '用户画像',
13
+ code: '编码实现',
14
+ test: '测试',
15
+ review: '代码审查',
16
+ done: '完成',
17
+ };
18
+ export class PipelineProgressTracker {
19
+ aggregator;
20
+ eventStore;
21
+ constructor(aggregator, eventStore) {
22
+ this.aggregator = aggregator;
23
+ this.eventStore = eventStore;
24
+ }
25
+ /**
26
+ * 生成进度快照(从聚合器重建状态,保证一致性)
27
+ */
28
+ getProgressSnapshot(pipelineId, gateStatus, advanceReason) {
29
+ // 从聚合器重建状态(单一真相源)
30
+ const pipeline = this.aggregator.rebuild(pipelineId);
31
+ if (!pipeline || pipeline.phase === 'done')
32
+ return null;
33
+ const phaseTasks = pipeline.tasks.filter(t => t.phase === pipeline.phase);
34
+ if (phaseTasks.length === 0)
35
+ return null;
36
+ const completed = phaseTasks.filter(t => t.status === 'completed').length;
37
+ const total = phaseTasks.length;
38
+ const allTasks = pipeline.tasks;
39
+ const globalCompleted = allTasks.filter(t => t.status === 'completed').length;
40
+ const globalPct = allTasks.length > 0 ? Math.round((globalCompleted / allTasks.length) * 100) : 0;
41
+ const phaseLabel = PHASE_LABEL_MAP[pipeline.phase] || pipeline.phase;
42
+ const bar = '█'.repeat(Math.round((completed / total) * 10)) + '░'.repeat(10 - Math.round((completed / total) * 10));
43
+ const shortId = pipelineId.slice(0, 8);
44
+ // 剩余阶段
45
+ const plannedPhases = pipeline.plannedPhases || ['analyze', 'design', 'code', 'test', 'review'];
46
+ const currentIdx = plannedPhases.indexOf(pipeline.phase);
47
+ const remaining = currentIdx >= 0 ? plannedPhases.slice(currentIdx + 1) : [];
48
+ const remainStr = remaining.length > 0
49
+ ? ` → 待:${remaining.map(p => PHASE_LABEL_MAP[p] || p).join('→')}`
50
+ : '';
51
+ // 推进原因标记
52
+ let reasonTag = '';
53
+ if (advanceReason === 'activity_threshold')
54
+ reasonTag = ' ⚠️ [活动阈值触发]';
55
+ else if (advanceReason === 'empty_phase')
56
+ reasonTag = ' ⚡ [空阶段自愈]';
57
+ // 当前任务
58
+ const currentTask = phaseTasks.find(t => t.status === 'in_progress');
59
+ const currentTaskLine = currentTask ? `\n 📍 当前任务: ${currentTask.title}` : '';
60
+ // 任务列表
61
+ const taskLines = '\n' + phaseTasks.map(t => {
62
+ const icon = t.status === 'completed' ? '✅' : t.status === 'in_progress' ? '▶' : '○';
63
+ const sourceTag = t.source ? ` [${t.source}]` : '';
64
+ return ` ${icon} ${t.title}${sourceTag}`;
65
+ }).join('\n');
66
+ let progressLine = `#${shortId} ${phaseLabel} ${completed}/${total} [${bar}] 全局${globalPct}%${remainStr}${reasonTag}${currentTaskLine}${taskLines}`;
67
+ // 质量门禁状态
68
+ if (!gateStatus)
69
+ return progressLine;
70
+ // 关键修复:使用 checkedPhase 而非当前 pipeline.phase
71
+ // 避免强制放行后快照显示新阶段但质量检查显示旧阶段的不一致
72
+ const displayPhase = gateStatus.checkedPhase || pipeline.phase;
73
+ const displayPhaseLabel = PHASE_LABEL_MAP[displayPhase] || displayPhase;
74
+ let gateLine;
75
+ if (gateStatus.blocked) {
76
+ const attempts = gateStatus.fixAttempts ? ` (第${gateStatus.fixAttempts}次)` : '';
77
+ gateLine = `\n 🚦 阶段状态: ⚠️ 待修复${attempts}`;
78
+ if (gateStatus.issues?.length) {
79
+ gateLine += '\n' + gateStatus.issues.map(i => ` ❌ ${i}`).join('\n');
80
+ }
81
+ gateLine += '\n ⏸️ 阶段推进已暂停,修复后将自动继续';
82
+ }
83
+ else if (gateStatus.level === 'warn') {
84
+ gateLine = `\n 🚦 阶段状态: 🟡 通过(含建议)`;
85
+ }
86
+ else {
87
+ gateLine = `\n 🚦 阶段状态: ✅ 通过`;
88
+ }
89
+ return progressLine + gateLine;
90
+ }
91
+ /**
92
+ * 获取质量检查时的阶段(用于修复快照不一致问题)
93
+ */
94
+ getCheckedPhase(pipelineId) {
95
+ const lastCheckEvent = this.eventStore.getLatestEventByType(pipelineId, PipelineEventType.QUALITY_CHECK_STARTED);
96
+ return lastCheckEvent ? lastCheckEvent.payload.phase : null;
97
+ }
98
+ }
99
+ //# sourceMappingURL=progress-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-tracker.js","sourceRoot":"","sources":["../../src/pipeline/progress-tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Pipeline 快照存储
3
+ *
4
+ * 职责:
5
+ * 1. 定期保存 Pipeline 状态快照
6
+ * 2. 避免每次都从头重建状态(性能优化)
7
+ * 3. 快照 + 增量事件 = 当前状态
8
+ */
9
+ import { PipelineState } from './aggregator.js';
10
+ export interface PipelineSnapshot {
11
+ pipelineId: string;
12
+ state: PipelineState;
13
+ lastEventTimestamp: number;
14
+ createdAt: number;
15
+ }
16
+ export declare class SnapshotStore {
17
+ private db;
18
+ private readonly SNAPSHOT_INTERVAL;
19
+ constructor(dbPath: string);
20
+ /**
21
+ * 初始化快照表
22
+ */
23
+ private initSchema;
24
+ /**
25
+ * 保存快照
26
+ */
27
+ save(snapshot: PipelineSnapshot): void;
28
+ /**
29
+ * 加载快照
30
+ */
31
+ load(pipelineId: string): PipelineSnapshot | null;
32
+ /**
33
+ * 删除快照
34
+ */
35
+ delete(pipelineId: string): void;
36
+ /**
37
+ * 清理过期快照(超过 N 天)
38
+ */
39
+ pruneOldSnapshots(daysOld: number): number;
40
+ /**
41
+ * 关闭数据库连接
42
+ */
43
+ close(): void;
44
+ }
45
+ //# sourceMappingURL=snapshot-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-store.d.ts","sourceRoot":"","sources":["../../src/pipeline/snapshot-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,aAAa,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAM;gBAE5B,MAAM,EAAE,MAAM;IAK1B;;OAEG;IACH,OAAO,CAAC,UAAU;IAclB;;OAEG;IACH,IAAI,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IActC;;OAEG;IACH,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAwBjD;;OAEG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAOhC;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAS1C;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Pipeline 快照存储
3
+ *
4
+ * 职责:
5
+ * 1. 定期保存 Pipeline 状态快照
6
+ * 2. 避免每次都从头重建状态(性能优化)
7
+ * 3. 快照 + 增量事件 = 当前状态
8
+ */
9
+ import Database from 'better-sqlite3';
10
+ export class SnapshotStore {
11
+ db;
12
+ SNAPSHOT_INTERVAL = 50; // 每 50 个事件保存一次快照
13
+ constructor(dbPath) {
14
+ this.db = new Database(dbPath);
15
+ this.initSchema();
16
+ }
17
+ /**
18
+ * 初始化快照表
19
+ */
20
+ initSchema() {
21
+ this.db.exec(`
22
+ CREATE TABLE IF NOT EXISTS pipeline_snapshots (
23
+ pipeline_id TEXT PRIMARY KEY,
24
+ state TEXT NOT NULL,
25
+ last_event_timestamp INTEGER NOT NULL,
26
+ created_at INTEGER NOT NULL
27
+ );
28
+
29
+ CREATE INDEX IF NOT EXISTS idx_pipeline_snapshots_timestamp
30
+ ON pipeline_snapshots(last_event_timestamp);
31
+ `);
32
+ }
33
+ /**
34
+ * 保存快照
35
+ */
36
+ save(snapshot) {
37
+ const stmt = this.db.prepare(`
38
+ INSERT OR REPLACE INTO pipeline_snapshots (pipeline_id, state, last_event_timestamp, created_at)
39
+ VALUES (?, ?, ?, ?)
40
+ `);
41
+ stmt.run(snapshot.pipelineId, JSON.stringify(snapshot.state), snapshot.lastEventTimestamp, snapshot.createdAt);
42
+ }
43
+ /**
44
+ * 加载快照
45
+ */
46
+ load(pipelineId) {
47
+ const stmt = this.db.prepare(`
48
+ SELECT pipeline_id, state, last_event_timestamp, created_at
49
+ FROM pipeline_snapshots
50
+ WHERE pipeline_id = ?
51
+ `);
52
+ const row = stmt.get(pipelineId);
53
+ if (!row)
54
+ return null;
55
+ return {
56
+ pipelineId: row.pipeline_id,
57
+ state: JSON.parse(row.state),
58
+ lastEventTimestamp: row.last_event_timestamp,
59
+ createdAt: row.created_at,
60
+ };
61
+ }
62
+ /**
63
+ * 删除快照
64
+ */
65
+ delete(pipelineId) {
66
+ const stmt = this.db.prepare(`
67
+ DELETE FROM pipeline_snapshots WHERE pipeline_id = ?
68
+ `);
69
+ stmt.run(pipelineId);
70
+ }
71
+ /**
72
+ * 清理过期快照(超过 N 天)
73
+ */
74
+ pruneOldSnapshots(daysOld) {
75
+ const cutoff = Date.now() - daysOld * 24 * 60 * 60 * 1000;
76
+ const stmt = this.db.prepare(`
77
+ DELETE FROM pipeline_snapshots WHERE created_at < ?
78
+ `);
79
+ const result = stmt.run(cutoff);
80
+ return result.changes;
81
+ }
82
+ /**
83
+ * 关闭数据库连接
84
+ */
85
+ close() {
86
+ this.db.close();
87
+ }
88
+ }
89
+ //# sourceMappingURL=snapshot-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-store.js","sourceRoot":"","sources":["../../src/pipeline/snapshot-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAUtC,MAAM,OAAO,aAAa;IAChB,EAAE,CAAoB;IACb,iBAAiB,GAAG,EAAE,CAAC,CAAC,iBAAiB;IAE1D,YAAY,MAAc;QACxB,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,UAAU;QAChB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;KAUZ,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,QAA0B;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAG5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CACN,QAAQ,CAAC,UAAU,EACnB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAC9B,QAAQ,CAAC,kBAAkB,EAC3B,QAAQ,CAAC,SAAS,CACnB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,UAAkB;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAI5B,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAKlB,CAAC;QAEd,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEtB,OAAO;YACL,UAAU,EAAE,GAAG,CAAC,WAAW;YAC3B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;YAC5B,kBAAkB,EAAE,GAAG,CAAC,oBAAoB;YAC5C,SAAS,EAAE,GAAG,CAAC,UAAU;SAC1B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAkB;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;KAE5B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,OAAe;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;KAE5B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChC,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF"}