@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.
Files changed (69) hide show
  1. package/dist/application/PhaseController.d.ts +110 -0
  2. package/dist/application/PhaseController.d.ts.map +1 -0
  3. package/dist/application/PhaseController.js +272 -0
  4. package/dist/application/PhaseController.js.map +1 -0
  5. package/dist/application/QualityGateRunner.d.ts +97 -0
  6. package/dist/application/QualityGateRunner.d.ts.map +1 -0
  7. package/dist/application/QualityGateRunner.js +234 -0
  8. package/dist/application/QualityGateRunner.js.map +1 -0
  9. package/dist/application/StateTracker.d.ts +119 -0
  10. package/dist/application/StateTracker.d.ts.map +1 -0
  11. package/dist/application/StateTracker.js +192 -0
  12. package/dist/application/StateTracker.js.map +1 -0
  13. package/dist/application/index.d.ts +11 -0
  14. package/dist/application/index.d.ts.map +1 -0
  15. package/dist/application/index.js +11 -0
  16. package/dist/application/index.js.map +1 -0
  17. package/dist/domain/entities/Phase.d.ts +125 -0
  18. package/dist/domain/entities/Phase.d.ts.map +1 -0
  19. package/dist/domain/entities/Phase.js +146 -0
  20. package/dist/domain/entities/Phase.js.map +1 -0
  21. package/dist/domain/entities/QualityGate.d.ts +85 -0
  22. package/dist/domain/entities/QualityGate.d.ts.map +1 -0
  23. package/dist/domain/entities/QualityGate.js +117 -0
  24. package/dist/domain/entities/QualityGate.js.map +1 -0
  25. package/dist/domain/entities/Workflow.d.ts +90 -0
  26. package/dist/domain/entities/Workflow.d.ts.map +1 -0
  27. package/dist/domain/entities/Workflow.js +174 -0
  28. package/dist/domain/entities/Workflow.js.map +1 -0
  29. package/dist/domain/entities/index.d.ts +11 -0
  30. package/dist/domain/entities/index.d.ts.map +1 -0
  31. package/dist/domain/entities/index.js +11 -0
  32. package/dist/domain/entities/index.js.map +1 -0
  33. package/dist/domain/events/PhaseTransitioned.d.ts +37 -0
  34. package/dist/domain/events/PhaseTransitioned.d.ts.map +1 -0
  35. package/dist/domain/events/PhaseTransitioned.js +38 -0
  36. package/dist/domain/events/PhaseTransitioned.js.map +1 -0
  37. package/dist/domain/events/QualityGatePassed.d.ts +63 -0
  38. package/dist/domain/events/QualityGatePassed.d.ts.map +1 -0
  39. package/dist/domain/events/QualityGatePassed.js +68 -0
  40. package/dist/domain/events/QualityGatePassed.js.map +1 -0
  41. package/dist/domain/events/index.d.ts +13 -0
  42. package/dist/domain/events/index.d.ts.map +1 -0
  43. package/dist/domain/events/index.js +9 -0
  44. package/dist/domain/events/index.js.map +1 -0
  45. package/dist/domain/index.d.ts +11 -0
  46. package/dist/domain/index.d.ts.map +1 -0
  47. package/dist/domain/index.js +14 -0
  48. package/dist/domain/index.js.map +1 -0
  49. package/dist/domain/value-objects/ApprovalStatus.d.ts +69 -0
  50. package/dist/domain/value-objects/ApprovalStatus.d.ts.map +1 -0
  51. package/dist/domain/value-objects/ApprovalStatus.js +105 -0
  52. package/dist/domain/value-objects/ApprovalStatus.js.map +1 -0
  53. package/dist/domain/value-objects/PhaseType.d.ts +66 -0
  54. package/dist/domain/value-objects/PhaseType.d.ts.map +1 -0
  55. package/dist/domain/value-objects/PhaseType.js +105 -0
  56. package/dist/domain/value-objects/PhaseType.js.map +1 -0
  57. package/dist/domain/value-objects/TaskStatus.d.ts +59 -0
  58. package/dist/domain/value-objects/TaskStatus.d.ts.map +1 -0
  59. package/dist/domain/value-objects/TaskStatus.js +90 -0
  60. package/dist/domain/value-objects/TaskStatus.js.map +1 -0
  61. package/dist/domain/value-objects/index.d.ts +11 -0
  62. package/dist/domain/value-objects/index.d.ts.map +1 -0
  63. package/dist/domain/value-objects/index.js +11 -0
  64. package/dist/domain/value-objects/index.js.map +1 -0
  65. package/dist/index.d.ts +20 -0
  66. package/dist/index.d.ts.map +1 -0
  67. package/dist/index.js +20 -0
  68. package/dist/index.js.map +1 -0
  69. 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":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAKL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAwB5B;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IACpB,KAAK,GAAkC,IAAI,GAAG,EAAE,CAAC;IACxC,MAAM,CAA0B;IAEjD,YAAY,SAAkC,EAAE;QAC9C,IAAI,CAAC,MAAM,GAAG;YACZ,WAAW,EAAE,KAAK;YAClB,iBAAiB,EAAE,IAAI;YACvB,GAAG,MAAM;SACV,CAAC;QAEF,yBAAyB;QACzB,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,YAAY,CAAC,IAAiB;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACpD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACzC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,KAAgB;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAwB,EAAE,CAAC;QAExC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBACnD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAErB,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;oBACrD,MAAM;gBACR,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,WAAW,GAAsB;oBACrC,MAAM,EAAE,IAAI,CAAC,EAAE;oBACf,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,OAAO,EAAE,CAAC;4BACR,MAAM,EAAE,KAAK;4BACb,OAAO,EAAE,qBAAqB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;4BACtF,QAAQ,EAAE,OAAO;yBAClB,CAAC;oBACF,MAAM,EAAE,KAAK;oBACb,UAAU,EAAE,IAAI,IAAI,EAAE;oBACtB,QAAQ,EAAE,CAAC;iBACZ,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAExC,OAAO;YACL,KAAK;YACL,OAAO;YACP,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,eAAe,EAAE,UAAU,CAAC,eAAe;YAC3C,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,QAAQ;SACT,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,kBAAkB,CAAC,IAAiB;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,WAAY,CAAC;QAEzC,OAAO,OAAO,CAAC,IAAI,CAAC;YAClB,kBAAkB,CAAC,IAAI,CAAC;YACxB,IAAI,OAAO,CAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC3C,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAC3E;SACF,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,oBAAoB;QAC1B,2BAA2B;QAC3B,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC;YAClC,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,cAAc;YACrB,WAAW,EAAE,kBAAkB;YAC/B,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC;SACzD,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC;YAClC,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,cAAc;YACrB,WAAW,EAAE,sBAAsB;YACnC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC;SACxD,CAAC,CAAC,CAAC;QAEJ,qBAAqB;QACrB,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC;YAClC,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,sBAAsB;YAC5B,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,gBAAgB;YAC7B,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,sBAAsB,CAAC;SACpE,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC;YAClC,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,sBAAsB;YACnC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC;SACxD,CAAC,CAAC,CAAC;QAEJ,6BAA6B;QAC7B,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC;YAClC,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,sBAAsB;YAC5B,KAAK,EAAE,gBAAgB;YACvB,WAAW,EAAE,iBAAiB;YAC9B,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,sBAAsB,CAAC;SACpE,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC;YAClC,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,gBAAgB;YACvB,WAAW,EAAE,uBAAuB;YACpC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC;SAC1D,CAAC,CAAC,CAAC;QAEJ,6BAA6B;QAC7B,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC;YAClC,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,gBAAgB;YACvB,WAAW,EAAE,qBAAqB;YAClC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC;SACzD,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC;YAClC,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,gBAAgB;YACvB,WAAW,EAAE,uBAAuB;YACpC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;SACvD,CAAC,CAAC,CAAC;QAEJ,yBAAyB;QACzB,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC;YAClC,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,YAAY;YACnB,WAAW,EAAE,sBAAsB;YACnC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC;SAC3D,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;;;OAKG;IACK,mBAAmB,CAAC,IAAY;QACtC,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,GAAG,IAAI,MAAM;YACtB,QAAQ,EAAE,MAAM;SACjB,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,MAAqB;QACjC,MAAM,KAAK,GAAG;YACZ,gCAAgC,MAAM,CAAC,KAAK,EAAE;YAC9C,EAAE;YACF,aAAa,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe,EAAE;YAClE,cAAc,MAAM,CAAC,OAAO,EAAE;YAC9B,eAAe,MAAM,CAAC,QAAQ,IAAI;YAClC,EAAE;YACF,uBAAuB;SACxB,CAAC;QAEF,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,UAAU,CAAC,QAAQ,KAAK,UAAU,CAAC,QAAQ,KAAK,CAAC,CAAC;YAE3E,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvC,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACpC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBAChE,KAAK,CAAC,IAAI,CAAC,KAAK,aAAa,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACH,gBAAgB,CAAC,KAAgB;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAgC;IACtE,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC"}
@@ -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"}