@nahisaho/musubix-workflow-engine 2.4.2
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/dist/application/PhaseController.d.ts +110 -0
- package/dist/application/PhaseController.d.ts.map +1 -0
- package/dist/application/PhaseController.js +272 -0
- package/dist/application/PhaseController.js.map +1 -0
- package/dist/application/QualityGateRunner.d.ts +97 -0
- package/dist/application/QualityGateRunner.d.ts.map +1 -0
- package/dist/application/QualityGateRunner.js +234 -0
- package/dist/application/QualityGateRunner.js.map +1 -0
- package/dist/application/StateTracker.d.ts +119 -0
- package/dist/application/StateTracker.d.ts.map +1 -0
- package/dist/application/StateTracker.js +192 -0
- package/dist/application/StateTracker.js.map +1 -0
- package/dist/application/index.d.ts +11 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +11 -0
- package/dist/application/index.js.map +1 -0
- package/dist/domain/entities/Phase.d.ts +125 -0
- package/dist/domain/entities/Phase.d.ts.map +1 -0
- package/dist/domain/entities/Phase.js +146 -0
- package/dist/domain/entities/Phase.js.map +1 -0
- package/dist/domain/entities/QualityGate.d.ts +85 -0
- package/dist/domain/entities/QualityGate.d.ts.map +1 -0
- package/dist/domain/entities/QualityGate.js +117 -0
- package/dist/domain/entities/QualityGate.js.map +1 -0
- package/dist/domain/entities/Workflow.d.ts +90 -0
- package/dist/domain/entities/Workflow.d.ts.map +1 -0
- package/dist/domain/entities/Workflow.js +174 -0
- package/dist/domain/entities/Workflow.js.map +1 -0
- package/dist/domain/entities/index.d.ts +11 -0
- package/dist/domain/entities/index.d.ts.map +1 -0
- package/dist/domain/entities/index.js +11 -0
- package/dist/domain/entities/index.js.map +1 -0
- package/dist/domain/events/PhaseTransitioned.d.ts +37 -0
- package/dist/domain/events/PhaseTransitioned.d.ts.map +1 -0
- package/dist/domain/events/PhaseTransitioned.js +38 -0
- package/dist/domain/events/PhaseTransitioned.js.map +1 -0
- package/dist/domain/events/QualityGatePassed.d.ts +63 -0
- package/dist/domain/events/QualityGatePassed.d.ts.map +1 -0
- package/dist/domain/events/QualityGatePassed.js +68 -0
- package/dist/domain/events/QualityGatePassed.js.map +1 -0
- package/dist/domain/events/index.d.ts +13 -0
- package/dist/domain/events/index.d.ts.map +1 -0
- package/dist/domain/events/index.js +9 -0
- package/dist/domain/events/index.js.map +1 -0
- package/dist/domain/index.d.ts +11 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +14 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/value-objects/ApprovalStatus.d.ts +69 -0
- package/dist/domain/value-objects/ApprovalStatus.d.ts.map +1 -0
- package/dist/domain/value-objects/ApprovalStatus.js +105 -0
- package/dist/domain/value-objects/ApprovalStatus.js.map +1 -0
- package/dist/domain/value-objects/PhaseType.d.ts +66 -0
- package/dist/domain/value-objects/PhaseType.d.ts.map +1 -0
- package/dist/domain/value-objects/PhaseType.js +105 -0
- package/dist/domain/value-objects/PhaseType.js.map +1 -0
- package/dist/domain/value-objects/TaskStatus.d.ts +59 -0
- package/dist/domain/value-objects/TaskStatus.d.ts.map +1 -0
- package/dist/domain/value-objects/TaskStatus.js +90 -0
- package/dist/domain/value-objects/TaskStatus.js.map +1 -0
- package/dist/domain/value-objects/index.d.ts +11 -0
- package/dist/domain/value-objects/index.d.ts.map +1 -0
- package/dist/domain/value-objects/index.js +11 -0
- package/dist/domain/value-objects/index.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QualityGateRunner - Application Service
|
|
3
|
+
*
|
|
4
|
+
* Runs quality gates and validates phase completion
|
|
5
|
+
*
|
|
6
|
+
* @see TSK-WORKFLOW-003 - QualityGateRunner
|
|
7
|
+
* @see REQ-ORCH-003 - Quality Gate Integration
|
|
8
|
+
* @see DES-ORCH-003 - QualityGateRunner Component
|
|
9
|
+
*/
|
|
10
|
+
import { createQualityGate, executeQualityGate, aggregateGateResults, } from '../domain/index.js';
|
|
11
|
+
/**
|
|
12
|
+
* Quality Gate Runner
|
|
13
|
+
*
|
|
14
|
+
* Executes quality gates for phase transitions
|
|
15
|
+
*/
|
|
16
|
+
export class QualityGateRunner {
|
|
17
|
+
gates = new Map();
|
|
18
|
+
config;
|
|
19
|
+
constructor(config = {}) {
|
|
20
|
+
this.config = {
|
|
21
|
+
gateTimeout: 30000,
|
|
22
|
+
continueOnFailure: true,
|
|
23
|
+
...config,
|
|
24
|
+
};
|
|
25
|
+
// Register default gates
|
|
26
|
+
this.registerDefaultGates();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Register a quality gate
|
|
30
|
+
*
|
|
31
|
+
* @param gate - Quality gate to register
|
|
32
|
+
*/
|
|
33
|
+
registerGate(gate) {
|
|
34
|
+
const phaseGates = this.gates.get(gate.phase) ?? [];
|
|
35
|
+
phaseGates.push(gate);
|
|
36
|
+
this.gates.set(gate.phase, phaseGates);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Run all gates for a phase
|
|
40
|
+
*
|
|
41
|
+
* @param phase - Phase type
|
|
42
|
+
* @returns Gate run result
|
|
43
|
+
*/
|
|
44
|
+
async runGates(phase) {
|
|
45
|
+
const startTime = Date.now();
|
|
46
|
+
const phaseGates = this.gates.get(phase) ?? [];
|
|
47
|
+
const results = [];
|
|
48
|
+
for (const gate of phaseGates) {
|
|
49
|
+
try {
|
|
50
|
+
const result = await this.executeWithTimeout(gate);
|
|
51
|
+
results.push(result);
|
|
52
|
+
if (!result.passed && !this.config.continueOnFailure) {
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
const errorResult = {
|
|
58
|
+
gateId: gate.id,
|
|
59
|
+
gateName: gate.name,
|
|
60
|
+
results: [{
|
|
61
|
+
passed: false,
|
|
62
|
+
message: `Timeout or error: ${error instanceof Error ? error.message : String(error)}`,
|
|
63
|
+
severity: 'error',
|
|
64
|
+
}],
|
|
65
|
+
passed: false,
|
|
66
|
+
executedAt: new Date(),
|
|
67
|
+
duration: 0,
|
|
68
|
+
};
|
|
69
|
+
results.push(errorResult);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const aggregated = aggregateGateResults(results);
|
|
73
|
+
const duration = Date.now() - startTime;
|
|
74
|
+
return {
|
|
75
|
+
phase,
|
|
76
|
+
results,
|
|
77
|
+
allPassed: aggregated.allPassed,
|
|
78
|
+
mandatoryPassed: aggregated.mandatoryPassed,
|
|
79
|
+
summary: aggregated.summary,
|
|
80
|
+
duration,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Execute gate with timeout
|
|
85
|
+
*
|
|
86
|
+
* @param gate - Gate to execute
|
|
87
|
+
* @returns Gate result
|
|
88
|
+
*/
|
|
89
|
+
async executeWithTimeout(gate) {
|
|
90
|
+
const timeout = this.config.gateTimeout;
|
|
91
|
+
return Promise.race([
|
|
92
|
+
executeQualityGate(gate),
|
|
93
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error(`Gate timeout: ${gate.name}`)), timeout)),
|
|
94
|
+
]);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Register default quality gates
|
|
98
|
+
*/
|
|
99
|
+
registerDefaultGates() {
|
|
100
|
+
// Requirements phase gates
|
|
101
|
+
this.registerGate(createQualityGate({
|
|
102
|
+
id: 'QG-REQ-001',
|
|
103
|
+
name: 'EARS形式の検証',
|
|
104
|
+
phase: 'requirements',
|
|
105
|
+
description: 'EARS形式に準拠しているか検証',
|
|
106
|
+
check: async () => this.createPassingResult('EARS形式の検証'),
|
|
107
|
+
}));
|
|
108
|
+
this.registerGate(createQualityGate({
|
|
109
|
+
id: 'QG-REQ-002',
|
|
110
|
+
name: '優先度設定の確認',
|
|
111
|
+
phase: 'requirements',
|
|
112
|
+
description: '全ての要件に優先度が設定されているか確認',
|
|
113
|
+
check: async () => this.createPassingResult('優先度設定の確認'),
|
|
114
|
+
}));
|
|
115
|
+
// Design phase gates
|
|
116
|
+
this.registerGate(createQualityGate({
|
|
117
|
+
id: 'QG-DES-001',
|
|
118
|
+
name: 'トレーサビリティ (REQ → DES)',
|
|
119
|
+
phase: 'design',
|
|
120
|
+
description: '要件から設計への追跡性を検証',
|
|
121
|
+
check: async () => this.createPassingResult('トレーサビリティ (REQ → DES)'),
|
|
122
|
+
}));
|
|
123
|
+
this.registerGate(createQualityGate({
|
|
124
|
+
id: 'QG-DES-002',
|
|
125
|
+
name: '設計パターン適用',
|
|
126
|
+
phase: 'design',
|
|
127
|
+
description: '適切な設計パターンが適用されているか検証',
|
|
128
|
+
check: async () => this.createPassingResult('設計パターン適用'),
|
|
129
|
+
}));
|
|
130
|
+
// Task breakdown phase gates
|
|
131
|
+
this.registerGate(createQualityGate({
|
|
132
|
+
id: 'QG-TSK-001',
|
|
133
|
+
name: 'トレーサビリティ (DES → TSK)',
|
|
134
|
+
phase: 'task-breakdown',
|
|
135
|
+
description: '設計からタスクへの追跡性を検証',
|
|
136
|
+
check: async () => this.createPassingResult('トレーサビリティ (DES → TSK)'),
|
|
137
|
+
}));
|
|
138
|
+
this.registerGate(createQualityGate({
|
|
139
|
+
id: 'QG-TSK-002',
|
|
140
|
+
name: 'タスクサイズの適切性',
|
|
141
|
+
phase: 'task-breakdown',
|
|
142
|
+
description: 'タスクが適切なサイズに分割されているか検証',
|
|
143
|
+
check: async () => this.createPassingResult('タスクサイズの適切性'),
|
|
144
|
+
}));
|
|
145
|
+
// Implementation phase gates
|
|
146
|
+
this.registerGate(createQualityGate({
|
|
147
|
+
id: 'QG-IMP-001',
|
|
148
|
+
name: 'ユニットテスト合格',
|
|
149
|
+
phase: 'implementation',
|
|
150
|
+
description: 'ユニットテストが全て合格しているか検証',
|
|
151
|
+
check: async () => this.createPassingResult('ユニットテスト合格'),
|
|
152
|
+
}));
|
|
153
|
+
this.registerGate(createQualityGate({
|
|
154
|
+
id: 'QG-IMP-002',
|
|
155
|
+
name: '型チェック合格',
|
|
156
|
+
phase: 'implementation',
|
|
157
|
+
description: 'TypeScript型チェックが通るか検証',
|
|
158
|
+
check: async () => this.createPassingResult('型チェック合格'),
|
|
159
|
+
}));
|
|
160
|
+
// Completion phase gates
|
|
161
|
+
this.registerGate(createQualityGate({
|
|
162
|
+
id: 'QG-CMP-001',
|
|
163
|
+
name: 'CHANGELOG更新',
|
|
164
|
+
phase: 'completion',
|
|
165
|
+
description: 'CHANGELOGが更新されているか検証',
|
|
166
|
+
check: async () => this.createPassingResult('CHANGELOG更新'),
|
|
167
|
+
}));
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Create a passing result (placeholder for actual implementation)
|
|
171
|
+
*
|
|
172
|
+
* @param name - Check name
|
|
173
|
+
* @returns Passing check result
|
|
174
|
+
*/
|
|
175
|
+
createPassingResult(name) {
|
|
176
|
+
return {
|
|
177
|
+
passed: true,
|
|
178
|
+
message: `${name}: OK`,
|
|
179
|
+
severity: 'info',
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Format gate results for display
|
|
184
|
+
*
|
|
185
|
+
* @param result - Gate run result
|
|
186
|
+
* @returns Formatted string
|
|
187
|
+
*/
|
|
188
|
+
formatResults(result) {
|
|
189
|
+
const lines = [
|
|
190
|
+
`🔍 **Quality Gate Results**: ${result.phase}`,
|
|
191
|
+
'',
|
|
192
|
+
`- Status: ${result.allPassed ? '✅ All Passed' : '❌ Some Failed'}`,
|
|
193
|
+
`- Summary: ${result.summary}`,
|
|
194
|
+
`- Duration: ${result.duration}ms`,
|
|
195
|
+
'',
|
|
196
|
+
'**Individual Gates:**',
|
|
197
|
+
];
|
|
198
|
+
for (const gateResult of result.results) {
|
|
199
|
+
const emoji = gateResult.passed ? '✅' : '❌';
|
|
200
|
+
lines.push(`- ${emoji} ${gateResult.gateName} (${gateResult.duration}ms)`);
|
|
201
|
+
for (const check of gateResult.results) {
|
|
202
|
+
const severityEmoji = check.severity === 'error' ? '🔴' :
|
|
203
|
+
check.severity === 'warning' ? '🟡' : '🟢';
|
|
204
|
+
lines.push(` ${severityEmoji} ${check.message}`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return lines.join('\n');
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Get registered gates for a phase
|
|
211
|
+
*
|
|
212
|
+
* @param phase - Phase type
|
|
213
|
+
* @returns Quality gates
|
|
214
|
+
*/
|
|
215
|
+
getGatesForPhase(phase) {
|
|
216
|
+
return this.gates.get(phase) ?? [];
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Clear all gates
|
|
220
|
+
*/
|
|
221
|
+
clearGates() {
|
|
222
|
+
this.gates.clear();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Create a quality gate runner instance
|
|
227
|
+
*
|
|
228
|
+
* @param config - Configuration
|
|
229
|
+
* @returns QualityGateRunner instance
|
|
230
|
+
*/
|
|
231
|
+
export function createQualityGateRunner(config) {
|
|
232
|
+
return new QualityGateRunner(config);
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=QualityGateRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QualityGateRunner.js","sourceRoot":"","sources":["../../src/application/QualityGateRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StateTracker - Application Service
|
|
3
|
+
*
|
|
4
|
+
* Tracks and persists workflow state
|
|
5
|
+
*
|
|
6
|
+
* @see TSK-WORKFLOW-002 - StateTracker
|
|
7
|
+
* @see REQ-ORCH-002 - State Tracking
|
|
8
|
+
* @see DES-ORCH-002 - StateTracker Component
|
|
9
|
+
*/
|
|
10
|
+
import type { Workflow, WorkflowStatus, PhaseType } from '../domain/index.js';
|
|
11
|
+
/**
|
|
12
|
+
* State snapshot
|
|
13
|
+
*/
|
|
14
|
+
export interface StateSnapshot {
|
|
15
|
+
readonly workflowId: string;
|
|
16
|
+
readonly status: WorkflowStatus;
|
|
17
|
+
readonly currentPhase: PhaseType | null;
|
|
18
|
+
readonly progress: number;
|
|
19
|
+
readonly phaseStatuses: Record<PhaseType, string>;
|
|
20
|
+
readonly timestamp: Date;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* State change event
|
|
24
|
+
*/
|
|
25
|
+
export interface StateChangeEvent {
|
|
26
|
+
readonly type: 'state-change';
|
|
27
|
+
readonly workflowId: string;
|
|
28
|
+
readonly previousState: StateSnapshot;
|
|
29
|
+
readonly currentState: StateSnapshot;
|
|
30
|
+
readonly timestamp: Date;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* State listener function
|
|
34
|
+
*/
|
|
35
|
+
export type StateListener = (event: StateChangeEvent) => void;
|
|
36
|
+
/**
|
|
37
|
+
* State Tracker
|
|
38
|
+
*
|
|
39
|
+
* Tracks workflow state and emits change events
|
|
40
|
+
*/
|
|
41
|
+
export declare class StateTracker {
|
|
42
|
+
private snapshots;
|
|
43
|
+
private listeners;
|
|
44
|
+
/**
|
|
45
|
+
* Take a snapshot of workflow state
|
|
46
|
+
*
|
|
47
|
+
* @param workflow - Workflow to snapshot
|
|
48
|
+
* @returns State snapshot
|
|
49
|
+
*/
|
|
50
|
+
snapshot(workflow: Workflow): StateSnapshot;
|
|
51
|
+
/**
|
|
52
|
+
* Get latest snapshot for a workflow
|
|
53
|
+
*
|
|
54
|
+
* @param workflowId - Workflow ID
|
|
55
|
+
* @returns Latest snapshot or undefined
|
|
56
|
+
*/
|
|
57
|
+
getLatestSnapshot(workflowId: string): StateSnapshot | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* Get snapshot history for a workflow
|
|
60
|
+
*
|
|
61
|
+
* @param workflowId - Workflow ID
|
|
62
|
+
* @returns Snapshot history
|
|
63
|
+
*/
|
|
64
|
+
getHistory(workflowId: string): readonly StateSnapshot[];
|
|
65
|
+
/**
|
|
66
|
+
* Subscribe to state changes
|
|
67
|
+
*
|
|
68
|
+
* @param listener - State listener
|
|
69
|
+
* @returns Unsubscribe function
|
|
70
|
+
*/
|
|
71
|
+
subscribe(listener: StateListener): () => void;
|
|
72
|
+
/**
|
|
73
|
+
* Check if state has changed
|
|
74
|
+
*
|
|
75
|
+
* @param previous - Previous snapshot
|
|
76
|
+
* @param current - Current snapshot
|
|
77
|
+
* @returns true if changed
|
|
78
|
+
*/
|
|
79
|
+
private hasStateChanged;
|
|
80
|
+
/**
|
|
81
|
+
* Emit state change event
|
|
82
|
+
*
|
|
83
|
+
* @param workflowId - Workflow ID
|
|
84
|
+
* @param previous - Previous state
|
|
85
|
+
* @param current - Current state
|
|
86
|
+
*/
|
|
87
|
+
private emitStateChange;
|
|
88
|
+
/**
|
|
89
|
+
* Format state as display string
|
|
90
|
+
*
|
|
91
|
+
* @param snapshot - State snapshot
|
|
92
|
+
* @returns Formatted string
|
|
93
|
+
*/
|
|
94
|
+
formatState(snapshot: StateSnapshot): string;
|
|
95
|
+
/**
|
|
96
|
+
* Get emoji for status
|
|
97
|
+
*
|
|
98
|
+
* @param status - Phase status
|
|
99
|
+
* @returns Emoji
|
|
100
|
+
*/
|
|
101
|
+
private getStatusEmoji;
|
|
102
|
+
/**
|
|
103
|
+
* Clear history for a workflow
|
|
104
|
+
*
|
|
105
|
+
* @param workflowId - Workflow ID
|
|
106
|
+
*/
|
|
107
|
+
clearHistory(workflowId: string): void;
|
|
108
|
+
/**
|
|
109
|
+
* Clear all tracking data
|
|
110
|
+
*/
|
|
111
|
+
clearAll(): void;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Create a state tracker instance
|
|
115
|
+
*
|
|
116
|
+
* @returns StateTracker instance
|
|
117
|
+
*/
|
|
118
|
+
export declare function createStateTracker(): StateTracker;
|
|
119
|
+
//# sourceMappingURL=StateTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateTracker.d.ts","sourceRoot":"","sources":["../../src/application/StateTracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EACd,SAAS,EACV,MAAM,oBAAoB,CAAC;AAG5B;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,SAAS,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAClD,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAE9D;;;;GAIG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAA2C;IAC5D,OAAO,CAAC,SAAS,CAAiC;IAElD;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,aAAa;IA+B3C;;;;;OAKG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAKhE;;;;;OAKG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,aAAa,EAAE;IAIxD;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI;IAK9C;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IAcvB;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IAsBvB;;;;;OAKG;IACH,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM;IA4B5C;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAUtB;;;;OAIG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAItC;;OAEG;IACH,QAAQ,IAAI,IAAI;CAIjB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAEjD"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StateTracker - Application Service
|
|
3
|
+
*
|
|
4
|
+
* Tracks and persists workflow state
|
|
5
|
+
*
|
|
6
|
+
* @see TSK-WORKFLOW-002 - StateTracker
|
|
7
|
+
* @see REQ-ORCH-002 - State Tracking
|
|
8
|
+
* @see DES-ORCH-002 - StateTracker Component
|
|
9
|
+
*/
|
|
10
|
+
import { getWorkflowProgress } from '../domain/entities/Workflow.js';
|
|
11
|
+
/**
|
|
12
|
+
* State Tracker
|
|
13
|
+
*
|
|
14
|
+
* Tracks workflow state and emits change events
|
|
15
|
+
*/
|
|
16
|
+
export class StateTracker {
|
|
17
|
+
snapshots = new Map();
|
|
18
|
+
listeners = new Set();
|
|
19
|
+
/**
|
|
20
|
+
* Take a snapshot of workflow state
|
|
21
|
+
*
|
|
22
|
+
* @param workflow - Workflow to snapshot
|
|
23
|
+
* @returns State snapshot
|
|
24
|
+
*/
|
|
25
|
+
snapshot(workflow) {
|
|
26
|
+
const phaseStatuses = {};
|
|
27
|
+
for (const [phaseType, phase] of workflow.phases) {
|
|
28
|
+
phaseStatuses[phaseType] = phase.status;
|
|
29
|
+
}
|
|
30
|
+
const snapshot = Object.freeze({
|
|
31
|
+
workflowId: workflow.id,
|
|
32
|
+
status: workflow.status,
|
|
33
|
+
currentPhase: workflow.currentPhase,
|
|
34
|
+
progress: getWorkflowProgress(workflow),
|
|
35
|
+
phaseStatuses,
|
|
36
|
+
timestamp: new Date(),
|
|
37
|
+
});
|
|
38
|
+
// Store snapshot
|
|
39
|
+
const history = this.snapshots.get(workflow.id) ?? [];
|
|
40
|
+
// Check for state change
|
|
41
|
+
const lastSnapshot = history[history.length - 1];
|
|
42
|
+
if (lastSnapshot && this.hasStateChanged(lastSnapshot, snapshot)) {
|
|
43
|
+
this.emitStateChange(workflow.id, lastSnapshot, snapshot);
|
|
44
|
+
}
|
|
45
|
+
history.push(snapshot);
|
|
46
|
+
this.snapshots.set(workflow.id, history);
|
|
47
|
+
return snapshot;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get latest snapshot for a workflow
|
|
51
|
+
*
|
|
52
|
+
* @param workflowId - Workflow ID
|
|
53
|
+
* @returns Latest snapshot or undefined
|
|
54
|
+
*/
|
|
55
|
+
getLatestSnapshot(workflowId) {
|
|
56
|
+
const history = this.snapshots.get(workflowId);
|
|
57
|
+
return history?.[history.length - 1];
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get snapshot history for a workflow
|
|
61
|
+
*
|
|
62
|
+
* @param workflowId - Workflow ID
|
|
63
|
+
* @returns Snapshot history
|
|
64
|
+
*/
|
|
65
|
+
getHistory(workflowId) {
|
|
66
|
+
return this.snapshots.get(workflowId) ?? [];
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Subscribe to state changes
|
|
70
|
+
*
|
|
71
|
+
* @param listener - State listener
|
|
72
|
+
* @returns Unsubscribe function
|
|
73
|
+
*/
|
|
74
|
+
subscribe(listener) {
|
|
75
|
+
this.listeners.add(listener);
|
|
76
|
+
return () => this.listeners.delete(listener);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Check if state has changed
|
|
80
|
+
*
|
|
81
|
+
* @param previous - Previous snapshot
|
|
82
|
+
* @param current - Current snapshot
|
|
83
|
+
* @returns true if changed
|
|
84
|
+
*/
|
|
85
|
+
hasStateChanged(previous, current) {
|
|
86
|
+
if (previous.status !== current.status)
|
|
87
|
+
return true;
|
|
88
|
+
if (previous.currentPhase !== current.currentPhase)
|
|
89
|
+
return true;
|
|
90
|
+
if (previous.progress !== current.progress)
|
|
91
|
+
return true;
|
|
92
|
+
for (const phase of Object.keys(previous.phaseStatuses)) {
|
|
93
|
+
if (previous.phaseStatuses[phase] !== current.phaseStatuses[phase]) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Emit state change event
|
|
101
|
+
*
|
|
102
|
+
* @param workflowId - Workflow ID
|
|
103
|
+
* @param previous - Previous state
|
|
104
|
+
* @param current - Current state
|
|
105
|
+
*/
|
|
106
|
+
emitStateChange(workflowId, previous, current) {
|
|
107
|
+
const event = {
|
|
108
|
+
type: 'state-change',
|
|
109
|
+
workflowId,
|
|
110
|
+
previousState: previous,
|
|
111
|
+
currentState: current,
|
|
112
|
+
timestamp: new Date(),
|
|
113
|
+
};
|
|
114
|
+
for (const listener of this.listeners) {
|
|
115
|
+
try {
|
|
116
|
+
listener(event);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
console.error('State listener error:', error);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Format state as display string
|
|
125
|
+
*
|
|
126
|
+
* @param snapshot - State snapshot
|
|
127
|
+
* @returns Formatted string
|
|
128
|
+
*/
|
|
129
|
+
formatState(snapshot) {
|
|
130
|
+
const lines = [
|
|
131
|
+
`📊 **Workflow State**: ${snapshot.workflowId}`,
|
|
132
|
+
'',
|
|
133
|
+
`- Status: ${snapshot.status}`,
|
|
134
|
+
`- Current Phase: ${snapshot.currentPhase ?? 'N/A'}`,
|
|
135
|
+
`- Progress: ${snapshot.progress}%`,
|
|
136
|
+
'',
|
|
137
|
+
'**Phase Status:**',
|
|
138
|
+
];
|
|
139
|
+
const phaseOrder = [
|
|
140
|
+
'requirements',
|
|
141
|
+
'design',
|
|
142
|
+
'task-breakdown',
|
|
143
|
+
'implementation',
|
|
144
|
+
'completion',
|
|
145
|
+
];
|
|
146
|
+
for (const phase of phaseOrder) {
|
|
147
|
+
const status = snapshot.phaseStatuses[phase];
|
|
148
|
+
const emoji = this.getStatusEmoji(status);
|
|
149
|
+
lines.push(`- ${phase}: ${emoji} ${status}`);
|
|
150
|
+
}
|
|
151
|
+
return lines.join('\n');
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get emoji for status
|
|
155
|
+
*
|
|
156
|
+
* @param status - Phase status
|
|
157
|
+
* @returns Emoji
|
|
158
|
+
*/
|
|
159
|
+
getStatusEmoji(status) {
|
|
160
|
+
switch (status) {
|
|
161
|
+
case 'pending': return '⬜';
|
|
162
|
+
case 'in-progress': return '🔄';
|
|
163
|
+
case 'completed': return '✅';
|
|
164
|
+
case 'approved': return '✅✅';
|
|
165
|
+
default: return '❓';
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Clear history for a workflow
|
|
170
|
+
*
|
|
171
|
+
* @param workflowId - Workflow ID
|
|
172
|
+
*/
|
|
173
|
+
clearHistory(workflowId) {
|
|
174
|
+
this.snapshots.delete(workflowId);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Clear all tracking data
|
|
178
|
+
*/
|
|
179
|
+
clearAll() {
|
|
180
|
+
this.snapshots.clear();
|
|
181
|
+
this.listeners.clear();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Create a state tracker instance
|
|
186
|
+
*
|
|
187
|
+
* @returns StateTracker instance
|
|
188
|
+
*/
|
|
189
|
+
export function createStateTracker() {
|
|
190
|
+
return new StateTracker();
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=StateTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateTracker.js","sourceRoot":"","sources":["../../src/application/StateTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application Layer barrel export
|
|
3
|
+
*
|
|
4
|
+
* @see TSK-WORKFLOW-001 - PhaseController
|
|
5
|
+
* @see TSK-WORKFLOW-002 - StateTracker
|
|
6
|
+
* @see TSK-WORKFLOW-003 - QualityGateRunner
|
|
7
|
+
*/
|
|
8
|
+
export { type PhaseControllerConfig, type PhaseControllerResult, PhaseController, createPhaseController, } from './PhaseController.js';
|
|
9
|
+
export { type StateSnapshot, type StateChangeEvent, type StateListener, StateTracker, createStateTracker, } from './StateTracker.js';
|
|
10
|
+
export { type QualityGateRunnerConfig, type GateRunResult, QualityGateRunner, createQualityGateRunner, } from './QualityGateRunner.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/application/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,eAAe,EACf,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,YAAY,EACZ,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application Layer barrel export
|
|
3
|
+
*
|
|
4
|
+
* @see TSK-WORKFLOW-001 - PhaseController
|
|
5
|
+
* @see TSK-WORKFLOW-002 - StateTracker
|
|
6
|
+
* @see TSK-WORKFLOW-003 - QualityGateRunner
|
|
7
|
+
*/
|
|
8
|
+
export { PhaseController, createPhaseController, } from './PhaseController.js';
|
|
9
|
+
export { StateTracker, createStateTracker, } from './StateTracker.js';
|
|
10
|
+
export { QualityGateRunner, createQualityGateRunner, } from './QualityGateRunner.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/application/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAGL,eAAe,EACf,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAIL,YAAY,EACZ,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAGL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC"}
|