memento-mcp-server 1.15.0 → 1.16.0-b

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 (61) hide show
  1. package/dist/domains/relation/tools/visualize-relations-tool.d.ts +2 -2
  2. package/dist/infrastructure/database/database/migration/migrations/009-quality-assurance-schema.d.ts +60 -0
  3. package/dist/infrastructure/database/database/migration/migrations/009-quality-assurance-schema.d.ts.map +1 -0
  4. package/dist/infrastructure/database/database/migration/migrations/009-quality-assurance-schema.js +276 -0
  5. package/dist/infrastructure/database/database/migration/migrations/009-quality-assurance-schema.js.map +1 -0
  6. package/dist/infrastructure/database/database/migration/migrations/009-quality-assurance-schema.sql +128 -0
  7. package/dist/infrastructure/scheduler/batch-scheduler.d.ts +17 -0
  8. package/dist/infrastructure/scheduler/batch-scheduler.d.ts.map +1 -1
  9. package/dist/infrastructure/scheduler/batch-scheduler.js +130 -0
  10. package/dist/infrastructure/scheduler/batch-scheduler.js.map +1 -1
  11. package/dist/infrastructure/scheduler/jobs/quality-measurement-batch-job.d.ts +108 -0
  12. package/dist/infrastructure/scheduler/jobs/quality-measurement-batch-job.d.ts.map +1 -0
  13. package/dist/infrastructure/scheduler/jobs/quality-measurement-batch-job.js +184 -0
  14. package/dist/infrastructure/scheduler/jobs/quality-measurement-batch-job.js.map +1 -0
  15. package/dist/server/http-server.d.ts.map +1 -1
  16. package/dist/server/http-server.js +3 -0
  17. package/dist/server/http-server.js.map +1 -1
  18. package/dist/server/routes/quality.routes.d.ts +14 -0
  19. package/dist/server/routes/quality.routes.d.ts.map +1 -0
  20. package/dist/server/routes/quality.routes.js +460 -0
  21. package/dist/server/routes/quality.routes.js.map +1 -0
  22. package/dist/services/quality-assurance/quality-assurance-service.d.ts +207 -0
  23. package/dist/services/quality-assurance/quality-assurance-service.d.ts.map +1 -0
  24. package/dist/services/quality-assurance/quality-assurance-service.js +247 -0
  25. package/dist/services/quality-assurance/quality-assurance-service.js.map +1 -0
  26. package/dist/services/quality-assurance/quality-evaluator.d.ts +163 -0
  27. package/dist/services/quality-assurance/quality-evaluator.d.ts.map +1 -0
  28. package/dist/services/quality-assurance/quality-evaluator.js +256 -0
  29. package/dist/services/quality-assurance/quality-evaluator.js.map +1 -0
  30. package/dist/services/quality-assurance/quality-metrics-collector.d.ts +221 -0
  31. package/dist/services/quality-assurance/quality-metrics-collector.d.ts.map +1 -0
  32. package/dist/services/quality-assurance/quality-metrics-collector.js +796 -0
  33. package/dist/services/quality-assurance/quality-metrics-collector.js.map +1 -0
  34. package/dist/services/quality-assurance/quality-recorder.d.ts +108 -0
  35. package/dist/services/quality-assurance/quality-recorder.d.ts.map +1 -0
  36. package/dist/services/quality-assurance/quality-recorder.js +281 -0
  37. package/dist/services/quality-assurance/quality-recorder.js.map +1 -0
  38. package/dist/services/quality-assurance/quality-reporter.d.ts +189 -0
  39. package/dist/services/quality-assurance/quality-reporter.d.ts.map +1 -0
  40. package/dist/services/quality-assurance/quality-reporter.js +558 -0
  41. package/dist/services/quality-assurance/quality-reporter.js.map +1 -0
  42. package/dist/services/quality-assurance/quality-threshold-manager.d.ts +102 -0
  43. package/dist/services/quality-assurance/quality-threshold-manager.d.ts.map +1 -0
  44. package/dist/services/quality-assurance/quality-threshold-manager.js +252 -0
  45. package/dist/services/quality-assurance/quality-threshold-manager.js.map +1 -0
  46. package/dist/shared/utils/database.d.ts +7 -0
  47. package/dist/shared/utils/database.d.ts.map +1 -1
  48. package/dist/shared/utils/database.js +24 -0
  49. package/dist/shared/utils/database.js.map +1 -1
  50. package/dist/test/helpers/search-quality-metrics.d.ts +96 -0
  51. package/dist/test/helpers/search-quality-metrics.d.ts.map +1 -0
  52. package/dist/test/helpers/search-quality-metrics.js +185 -0
  53. package/dist/test/helpers/search-quality-metrics.js.map +1 -0
  54. package/dist/test/helpers/vector-search-quality-metrics.d.ts +1287 -0
  55. package/dist/test/helpers/vector-search-quality-metrics.d.ts.map +1 -0
  56. package/dist/test/helpers/vector-search-quality-metrics.js +2214 -0
  57. package/dist/test/helpers/vector-search-quality-metrics.js.map +1 -0
  58. package/package.json +5 -1
  59. package/scripts/generate-ground-truth.ts +353 -0
  60. package/scripts/quality-report.ts +166 -0
  61. package/scripts/quality-thresholds.ts +279 -0
@@ -0,0 +1,460 @@
1
+ /**
2
+ * Quality Assurance 라우터
3
+ * /api/v1/quality/* 엔드포인트 처리
4
+ *
5
+ * PRD FR-5.2: HTTP API 엔드포인트로 품질 리포트를 조회할 수 있어야 함
6
+ * PRD FR-4.7: HTTP API로 임계값 조회/업데이트 기능 구현
7
+ */
8
+ import { Router } from 'express';
9
+ import { QualityAssuranceService } from '../../services/quality-assurance/quality-assurance-service.js';
10
+ import { QualityThresholdManager } from '../../services/quality-assurance/quality-threshold-manager.js';
11
+ import { logger } from '../../shared/utils/logger.js';
12
+ /**
13
+ * Quality Assurance 라우터 생성
14
+ */
15
+ export function createQualityRouter(db) {
16
+ const router = Router();
17
+ // Quality Assurance Service 초기화
18
+ let qualityService = null;
19
+ let thresholdManager = null;
20
+ if (db) {
21
+ try {
22
+ qualityService = new QualityAssuranceService(db);
23
+ thresholdManager = new QualityThresholdManager(db);
24
+ }
25
+ catch (error) {
26
+ logger.error('QualityAssuranceService 초기화 실패', {
27
+ error: error instanceof Error ? error.message : String(error)
28
+ });
29
+ }
30
+ }
31
+ /**
32
+ * GET /api/v1/quality/report
33
+ * 품질 리포트 생성
34
+ *
35
+ * Query Parameters:
36
+ * - format: 'markdown' | 'json' | 'html' (기본값: 'markdown')
37
+ * - namespace: 네임스페이스 필터 (선택적)
38
+ * - context: 컨텍스트 필터 (선택적, 기본값: 'default')
39
+ * - from: 시작 시간 (ISO 8601 형식, 선택적)
40
+ * - to: 종료 시간 (ISO 8601 형식, 선택적)
41
+ */
42
+ router.get('/report', async (req, res) => {
43
+ try {
44
+ if (!qualityService) {
45
+ return res.status(500).json({
46
+ error: 'QualityAssuranceService not initialized',
47
+ message: 'QualityAssuranceService가 초기화되지 않았습니다'
48
+ });
49
+ }
50
+ const format = req.query.format || 'markdown';
51
+ const namespace = req.query.namespace;
52
+ const context = req.query.context || 'default';
53
+ const from = req.query.from;
54
+ const to = req.query.to;
55
+ const report = await qualityService.generateReport({
56
+ format,
57
+ namespace,
58
+ context,
59
+ from,
60
+ to
61
+ });
62
+ // Content-Type 설정
63
+ if (format === 'json') {
64
+ res.setHeader('Content-Type', 'application/json');
65
+ }
66
+ else if (format === 'html') {
67
+ res.setHeader('Content-Type', 'text/html');
68
+ }
69
+ else {
70
+ res.setHeader('Content-Type', 'text/markdown');
71
+ }
72
+ return res.send(report);
73
+ }
74
+ catch (error) {
75
+ logger.error('품질 리포트 생성 실패', {
76
+ error: error instanceof Error ? error.message : String(error)
77
+ });
78
+ return res.status(500).json({
79
+ error: 'Failed to generate quality report',
80
+ message: error instanceof Error ? error.message : 'Unknown error'
81
+ });
82
+ }
83
+ });
84
+ /**
85
+ * GET /api/v1/quality/report/data
86
+ * 품질 리포트 데이터 조회 (JSON 형식)
87
+ *
88
+ * Query Parameters:
89
+ * - namespace: 네임스페이스 필터 (선택적)
90
+ * - context: 컨텍스트 필터 (선택적, 기본값: 'default')
91
+ * - from: 시작 시간 (ISO 8601 형식, 선택적)
92
+ * - to: 종료 시간 (ISO 8601 형식, 선택적)
93
+ */
94
+ router.get('/report/data', async (req, res) => {
95
+ try {
96
+ if (!qualityService) {
97
+ return res.status(500).json({
98
+ error: 'QualityAssuranceService not initialized',
99
+ message: 'QualityAssuranceService가 초기화되지 않았습니다'
100
+ });
101
+ }
102
+ const namespace = req.query.namespace;
103
+ const context = req.query.context || 'default';
104
+ const from = req.query.from;
105
+ const to = req.query.to;
106
+ const reportData = await qualityService.getReportData({
107
+ namespace,
108
+ context,
109
+ from,
110
+ to
111
+ });
112
+ return res.json(reportData);
113
+ }
114
+ catch (error) {
115
+ logger.error('품질 리포트 데이터 조회 실패', {
116
+ error: error instanceof Error ? error.message : String(error)
117
+ });
118
+ return res.status(500).json({
119
+ error: 'Failed to get quality report data',
120
+ message: error instanceof Error ? error.message : 'Unknown error'
121
+ });
122
+ }
123
+ });
124
+ /**
125
+ * GET /api/v1/quality/history
126
+ * 측정 이력 조회
127
+ *
128
+ * Query Parameters:
129
+ * - namespace: 네임스페이스 필터 (선택적)
130
+ * - context: 컨텍스트 필터 (선택적)
131
+ * - from: 시작 시간 (ISO 8601 형식, 선택적)
132
+ * - to: 종료 시간 (ISO 8601 형식, 선택적)
133
+ * - limit: 최대 개수 (기본값: 100)
134
+ */
135
+ router.get('/history', (req, res) => {
136
+ try {
137
+ if (!qualityService) {
138
+ return res.status(500).json({
139
+ error: 'QualityAssuranceService not initialized',
140
+ message: 'QualityAssuranceService가 초기화되지 않았습니다'
141
+ });
142
+ }
143
+ const namespace = req.query.namespace;
144
+ const context = req.query.context;
145
+ const from = req.query.from;
146
+ const to = req.query.to;
147
+ const limit = req.query.limit ? parseInt(req.query.limit, 10) : 100;
148
+ const history = qualityService.getMeasurementHistory(namespace, context, from, to, limit);
149
+ return res.json({
150
+ history,
151
+ count: history.length,
152
+ limit
153
+ });
154
+ }
155
+ catch (error) {
156
+ logger.error('측정 이력 조회 실패', {
157
+ error: error instanceof Error ? error.message : String(error)
158
+ });
159
+ return res.status(500).json({
160
+ error: 'Failed to get measurement history',
161
+ message: error instanceof Error ? error.message : 'Unknown error'
162
+ });
163
+ }
164
+ });
165
+ /**
166
+ * GET /api/v1/quality/thresholds
167
+ * 모든 임계값 조회
168
+ *
169
+ * Query Parameters:
170
+ * - namespace: 네임스페이스 필터 (선택적)
171
+ * - context: 컨텍스트 필터 (선택적, 기본값: 'default')
172
+ */
173
+ router.get('/thresholds', (req, res) => {
174
+ try {
175
+ if (!qualityService) {
176
+ return res.status(500).json({
177
+ error: 'QualityAssuranceService not initialized',
178
+ message: 'QualityAssuranceService가 초기화되지 않았습니다'
179
+ });
180
+ }
181
+ const namespace = req.query.namespace;
182
+ const context = req.query.context || 'default';
183
+ const thresholds = qualityService.getThresholds(namespace, context);
184
+ return res.json({
185
+ thresholds,
186
+ count: thresholds.length,
187
+ namespace: namespace || 'all',
188
+ context
189
+ });
190
+ }
191
+ catch (error) {
192
+ logger.error('임계값 조회 실패', {
193
+ error: error instanceof Error ? error.message : String(error)
194
+ });
195
+ return res.status(500).json({
196
+ error: 'Failed to get thresholds',
197
+ message: error instanceof Error ? error.message : 'Unknown error'
198
+ });
199
+ }
200
+ });
201
+ /**
202
+ * GET /api/v1/quality/thresholds/:namespace/:key
203
+ * 특정 임계값 조회
204
+ *
205
+ * Query Parameters:
206
+ * - context: 컨텍스트 (선택적, 기본값: 'default')
207
+ */
208
+ router.get('/thresholds/:namespace/:key', (req, res) => {
209
+ try {
210
+ if (!qualityService) {
211
+ return res.status(500).json({
212
+ error: 'QualityAssuranceService not initialized',
213
+ message: 'QualityAssuranceService가 초기화되지 않았습니다'
214
+ });
215
+ }
216
+ if (!thresholdManager) {
217
+ return res.status(500).json({
218
+ error: 'QualityThresholdManager not initialized',
219
+ message: 'QualityThresholdManager가 초기화되지 않았습니다'
220
+ });
221
+ }
222
+ const { namespace, key } = req.params;
223
+ const context = req.query.context || 'default';
224
+ const threshold = thresholdManager.getThreshold(namespace, key, context);
225
+ if (!threshold) {
226
+ return res.status(404).json({
227
+ error: 'Threshold not found',
228
+ message: `임계값을 찾을 수 없습니다: ${namespace}.${key} (${context})`
229
+ });
230
+ }
231
+ return res.json(threshold);
232
+ }
233
+ catch (error) {
234
+ logger.error('임계값 조회 실패', {
235
+ error: error instanceof Error ? error.message : String(error)
236
+ });
237
+ return res.status(500).json({
238
+ error: 'Failed to get threshold',
239
+ message: error instanceof Error ? error.message : 'Unknown error'
240
+ });
241
+ }
242
+ });
243
+ /**
244
+ * PUT /api/v1/quality/thresholds/:namespace/:key
245
+ * 임계값 설정 (생성 또는 업데이트)
246
+ *
247
+ * Request Body:
248
+ * {
249
+ * "threshold_value": number,
250
+ * "threshold_type": "min" | "max",
251
+ * "description"?: string,
252
+ * "context"?: string (기본값: "default")
253
+ * }
254
+ */
255
+ router.put('/thresholds/:namespace/:key', (req, res) => {
256
+ try {
257
+ if (!qualityService) {
258
+ return res.status(500).json({
259
+ error: 'QualityAssuranceService not initialized',
260
+ message: 'QualityAssuranceService가 초기화되지 않았습니다'
261
+ });
262
+ }
263
+ const { namespace, key } = req.params;
264
+ const { threshold_value, threshold_type, description, context = 'default' } = req.body;
265
+ // 유효성 검증
266
+ if (threshold_value === undefined || threshold_type === undefined) {
267
+ return res.status(400).json({
268
+ error: 'Invalid request',
269
+ message: 'threshold_value와 threshold_type은 필수입니다'
270
+ });
271
+ }
272
+ if (typeof threshold_value !== 'number' || threshold_value < 0 || threshold_value > 1) {
273
+ return res.status(400).json({
274
+ error: 'Invalid threshold_value',
275
+ message: 'threshold_value는 0과 1 사이의 숫자여야 합니다'
276
+ });
277
+ }
278
+ if (threshold_type !== 'min' && threshold_type !== 'max') {
279
+ return res.status(400).json({
280
+ error: 'Invalid threshold_type',
281
+ message: 'threshold_type은 "min" 또는 "max"여야 합니다'
282
+ });
283
+ }
284
+ const threshold = qualityService.setThreshold(namespace, key, threshold_value, threshold_type, description, context);
285
+ return res.json({
286
+ message: '임계값이 설정되었습니다',
287
+ threshold
288
+ });
289
+ }
290
+ catch (error) {
291
+ logger.error('임계값 설정 실패', {
292
+ error: error instanceof Error ? error.message : String(error)
293
+ });
294
+ return res.status(500).json({
295
+ error: 'Failed to set threshold',
296
+ message: error instanceof Error ? error.message : 'Unknown error'
297
+ });
298
+ }
299
+ });
300
+ /**
301
+ * DELETE /api/v1/quality/thresholds/:namespace/:key
302
+ * 임계값 삭제
303
+ *
304
+ * Query Parameters:
305
+ * - context: 컨텍스트 (선택적, 기본값: 'default')
306
+ */
307
+ router.delete('/thresholds/:namespace/:key', (req, res) => {
308
+ try {
309
+ if (!qualityService) {
310
+ return res.status(500).json({
311
+ error: 'QualityAssuranceService not initialized',
312
+ message: 'QualityAssuranceService가 초기화되지 않았습니다'
313
+ });
314
+ }
315
+ const { namespace, key } = req.params;
316
+ const context = req.query.context || 'default';
317
+ const deleted = qualityService.deleteThreshold(namespace, key, context);
318
+ if (deleted) {
319
+ return res.json({
320
+ message: '임계값이 삭제되었습니다',
321
+ namespace,
322
+ key,
323
+ context
324
+ });
325
+ }
326
+ else {
327
+ return res.status(404).json({
328
+ error: 'Threshold not found',
329
+ message: `임계값을 찾을 수 없습니다: ${namespace}.${key} (${context})`
330
+ });
331
+ }
332
+ }
333
+ catch (error) {
334
+ logger.error('임계값 삭제 실패', {
335
+ error: error instanceof Error ? error.message : String(error)
336
+ });
337
+ return res.status(500).json({
338
+ error: 'Failed to delete threshold',
339
+ message: error instanceof Error ? error.message : 'Unknown error'
340
+ });
341
+ }
342
+ });
343
+ /**
344
+ * GET /api/v1/quality/metrics
345
+ * 최신 품질 지표 조회
346
+ *
347
+ * Query Parameters:
348
+ * - namespace: 네임스페이스 필터 (선택적)
349
+ * - context: 컨텍스트 필터 (선택적, 기본값: 'default')
350
+ */
351
+ router.get('/metrics', (req, res) => {
352
+ try {
353
+ if (!qualityService) {
354
+ return res.status(500).json({
355
+ error: 'QualityAssuranceService not initialized',
356
+ message: 'QualityAssuranceService가 초기화되지 않았습니다'
357
+ });
358
+ }
359
+ const namespace = req.query.namespace;
360
+ const context = req.query.context || 'default';
361
+ const metrics = qualityService.getLatestMetrics(namespace, context);
362
+ return res.json({
363
+ metrics,
364
+ count: metrics.length,
365
+ namespace: namespace || 'all',
366
+ context
367
+ });
368
+ }
369
+ catch (error) {
370
+ logger.error('최신 품질 지표 조회 실패', {
371
+ error: error instanceof Error ? error.message : String(error)
372
+ });
373
+ return res.status(500).json({
374
+ error: 'Failed to get latest metrics',
375
+ message: error instanceof Error ? error.message : 'Unknown error'
376
+ });
377
+ }
378
+ });
379
+ /**
380
+ * POST /api/v1/quality/measure
381
+ * 품질 측정 실행
382
+ *
383
+ * Request Body (선택적):
384
+ * {
385
+ * "measurement_type"?: "batch" | "test" | "manual" (기본값: "batch"),
386
+ * "context"?: string (기본값: "default"),
387
+ * "namespaces"?: string[],
388
+ * "record"?: boolean (기본값: true)
389
+ * }
390
+ */
391
+ router.post('/measure', async (req, res) => {
392
+ try {
393
+ if (!qualityService) {
394
+ return res.status(500).json({
395
+ error: 'QualityAssuranceService not initialized',
396
+ message: 'QualityAssuranceService가 초기화되지 않았습니다'
397
+ });
398
+ }
399
+ const { measurement_type = 'batch', context = 'default', namespaces, record = true } = req.body;
400
+ const result = await qualityService.measureQuality({
401
+ measurement_type,
402
+ context,
403
+ namespaces,
404
+ record
405
+ });
406
+ return res.json({
407
+ message: '품질 측정이 완료되었습니다',
408
+ result
409
+ });
410
+ }
411
+ catch (error) {
412
+ logger.error('품질 측정 실패', {
413
+ error: error instanceof Error ? error.message : String(error)
414
+ });
415
+ return res.status(500).json({
416
+ error: 'Failed to measure quality',
417
+ message: error instanceof Error ? error.message : 'Unknown error'
418
+ });
419
+ }
420
+ });
421
+ /**
422
+ * POST /api/v1/quality/thresholds/init
423
+ * 기본 임계값 초기화
424
+ *
425
+ * Request Body (선택적):
426
+ * {
427
+ * "context"?: string (기본값: "default"),
428
+ * "overwrite"?: boolean (기본값: false)
429
+ * }
430
+ */
431
+ router.post('/thresholds/init', (req, res) => {
432
+ try {
433
+ if (!qualityService) {
434
+ return res.status(500).json({
435
+ error: 'QualityAssuranceService not initialized',
436
+ message: 'QualityAssuranceService가 초기화되지 않았습니다'
437
+ });
438
+ }
439
+ const { context = 'default', overwrite = false } = req.body;
440
+ const count = qualityService.initializeDefaultThresholds(context, overwrite);
441
+ return res.json({
442
+ message: '기본 임계값이 초기화되었습니다',
443
+ count,
444
+ context,
445
+ overwrite
446
+ });
447
+ }
448
+ catch (error) {
449
+ logger.error('기본 임계값 초기화 실패', {
450
+ error: error instanceof Error ? error.message : String(error)
451
+ });
452
+ return res.status(500).json({
453
+ error: 'Failed to initialize default thresholds',
454
+ message: error instanceof Error ? error.message : 'Unknown error'
455
+ });
456
+ }
457
+ });
458
+ return router;
459
+ }
460
+ //# sourceMappingURL=quality.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality.routes.js","sourceRoot":"","sources":["../../../src/server/routes/quality.routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Quality Assurance Service
3
+ *
4
+ * 중앙 품질 관리 서비스 (Orchestrator)
5
+ *
6
+ * 주요 기능:
7
+ * - Collector, Evaluator, Recorder, Reporter 통합
8
+ * - 품질 측정 실행 (수집 -> 평가 -> 기록)
9
+ * - 리포트 생성
10
+ * - 배치 작업 지원
11
+ *
12
+ * PRD FR-1.1: Orchestrator 역할 - 전체 품질 관리 플로우 조율
13
+ */
14
+ import Database from 'better-sqlite3';
15
+ import { type CollectedMetrics } from './quality-metrics-collector.js';
16
+ import { type QualityEvaluationResult } from './quality-evaluator.js';
17
+ import { type MeasurementType } from './quality-recorder.js';
18
+ import { type ReportOptions } from './quality-reporter.js';
19
+ /**
20
+ * 품질 측정 옵션
21
+ */
22
+ export interface MeasurementOptions {
23
+ /**
24
+ * 측정 타입 (기본값: 'batch')
25
+ */
26
+ measurement_type?: MeasurementType;
27
+ /**
28
+ * 컨텍스트 (기본값: 'default')
29
+ */
30
+ context?: string;
31
+ /**
32
+ * 측정할 네임스페이스 목록 (지정하지 않으면 모든 네임스페이스)
33
+ */
34
+ namespaces?: string[];
35
+ /**
36
+ * 측정 결과를 기록할지 여부 (기본값: true)
37
+ */
38
+ record?: boolean;
39
+ }
40
+ /**
41
+ * 품질 측정 결과
42
+ */
43
+ export interface MeasurementResult {
44
+ /**
45
+ * 측정 시간
46
+ */
47
+ measured_at: string;
48
+ /**
49
+ * 측정된 네임스페이스 목록
50
+ */
51
+ namespaces: string[];
52
+ /**
53
+ * 수집된 지표 목록
54
+ */
55
+ collected_metrics: CollectedMetrics[];
56
+ /**
57
+ * 평가 결과 목록
58
+ */
59
+ evaluation_results: QualityEvaluationResult[];
60
+ /**
61
+ * 기록된 측정 이력 ID 목록
62
+ */
63
+ measurement_ids: string[];
64
+ /**
65
+ * 전체 상태: 'pass', 'warning', 'fail'
66
+ */
67
+ overall_status: 'pass' | 'warning' | 'fail';
68
+ /**
69
+ * 경고 개수
70
+ */
71
+ warning_count: number;
72
+ }
73
+ /**
74
+ * Quality Assurance Service
75
+ *
76
+ * PRD FR-1.1: Orchestrator 역할 - 전체 품질 관리 플로우 조율
77
+ */
78
+ export declare class QualityAssuranceService {
79
+ private db;
80
+ private collector;
81
+ private evaluator;
82
+ private recorder;
83
+ private reporter;
84
+ private thresholdManager;
85
+ constructor(db: Database.Database);
86
+ /**
87
+ * 품질 측정 실행
88
+ *
89
+ * 전체 플로우: 수집 -> 평가 -> 기록
90
+ *
91
+ * PRD FR-3.1: 배치 작업을 통해 주기적으로 품질을 측정해야 함
92
+ *
93
+ * @param options - 측정 옵션
94
+ * @returns 측정 결과
95
+ */
96
+ measureQuality(options?: MeasurementOptions): Promise<MeasurementResult>;
97
+ /**
98
+ * 품질 리포트 생성
99
+ *
100
+ * PRD FR-5.1: CLI 명령어로 품질 리포트를 생성할 수 있어야 함
101
+ * PRD FR-5.2: HTTP API 엔드포인트로 품질 리포트를 조회할 수 있어야 함
102
+ *
103
+ * @param options - 리포트 옵션
104
+ * @returns 리포트 문자열
105
+ */
106
+ generateReport(options?: ReportOptions): Promise<string>;
107
+ /**
108
+ * 품질 리포트 데이터 조회
109
+ *
110
+ * @param options - 리포트 옵션
111
+ * @returns 리포트 데이터
112
+ */
113
+ getReportData(options?: ReportOptions): Promise<import('./quality-reporter.js').QualityReport>;
114
+ /**
115
+ * 기본 품질 임계값 초기화
116
+ *
117
+ * PRD FR-4.1: 품질 임계값을 정의하고 관리할 수 있어야 함
118
+ *
119
+ * @param context - 컨텍스트 (기본값: 'default')
120
+ * @param overwrite - 기존 임계값 덮어쓰기 여부 (기본값: false)
121
+ * @returns 초기화된 임계값 개수
122
+ */
123
+ initializeDefaultThresholds(context?: string, overwrite?: boolean): number;
124
+ /**
125
+ * 품질 임계값 조회
126
+ *
127
+ * @param namespace - 네임스페이스 필터 (선택적)
128
+ * @param context - 컨텍스트 필터 (선택적)
129
+ * @returns 임계값 목록
130
+ */
131
+ getThresholds(namespace?: string, context?: string): import("./quality-threshold-manager.js").QualityThreshold[];
132
+ /**
133
+ * 품질 임계값 설정
134
+ *
135
+ * @param namespace - 네임스페이스
136
+ * @param key - 지표 키
137
+ * @param threshold_value - 임계값
138
+ * @param threshold_type - 임계값 타입 ('min' | 'max')
139
+ * @param description - 설명 (선택적)
140
+ * @param context - 컨텍스트 (기본값: 'default')
141
+ * @returns 설정된 임계값
142
+ */
143
+ setThreshold(namespace: string, key: string, threshold_value: number, threshold_type: 'min' | 'max', description?: string, context?: string): import("./quality-threshold-manager.js").QualityThreshold;
144
+ /**
145
+ * 품질 임계값 삭제
146
+ *
147
+ * @param namespace - 네임스페이스
148
+ * @param key - 지표 키
149
+ * @param context - 컨텍스트 (기본값: 'default')
150
+ * @returns 삭제 성공 여부
151
+ */
152
+ deleteThreshold(namespace: string, key: string, context?: string): boolean;
153
+ /**
154
+ * 측정 이력 조회
155
+ *
156
+ * @param namespace - 네임스페이스 필터 (선택적)
157
+ * @param context - 컨텍스트 필터 (선택적)
158
+ * @param from - 시작 시간 (선택적)
159
+ * @param to - 종료 시간 (선택적)
160
+ * @param limit - 최대 개수 (기본값: 100)
161
+ * @returns 측정 이력 목록
162
+ */
163
+ getMeasurementHistory(namespace?: string, context?: string, from?: string, to?: string, limit?: number): {
164
+ id: string;
165
+ measurement_type: string;
166
+ measured_at: string;
167
+ status: string;
168
+ created_at: string;
169
+ }[];
170
+ /**
171
+ * 최신 품질 지표 조회
172
+ *
173
+ * @param namespace - 네임스페이스 필터 (선택적)
174
+ * @param context - 컨텍스트 필터 (선택적)
175
+ * @returns 최신 품질 지표 목록
176
+ */
177
+ getLatestMetrics(namespace?: string, context?: string): {
178
+ metric_namespace: string;
179
+ metric_key: string;
180
+ context: string;
181
+ metric_value: number;
182
+ measured_at: string;
183
+ status: string;
184
+ threshold_value: number | null;
185
+ updated_at: string;
186
+ }[];
187
+ /**
188
+ * 배치 작업용 품질 측정
189
+ *
190
+ * PRD FR-3.1: 배치 작업을 통해 주기적으로 품질을 측정해야 함
191
+ *
192
+ * @param context - 컨텍스트 (기본값: 'default')
193
+ * @returns 측정 결과
194
+ */
195
+ runBatchMeasurement(context?: string): Promise<MeasurementResult>;
196
+ /**
197
+ * 테스트용 품질 측정
198
+ *
199
+ * PRD FR-3.2: CI/CD 파이프라인에서 테스트 시 품질을 측정해야 함
200
+ *
201
+ * @param context - 컨텍스트 (기본값: 'ci')
202
+ * @param namespaces - 측정할 네임스페이스 목록 (선택적)
203
+ * @returns 측정 결과
204
+ */
205
+ runTestMeasurement(context?: string, namespaces?: string[]): Promise<MeasurementResult>;
206
+ }
207
+ //# sourceMappingURL=quality-assurance-service.d.ts.map