aiwf 0.3.21 → 0.3.23

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 (140) hide show
  1. package/package.json +3 -2
  2. package/src/cli/index.js +39 -336
  3. package/src/lib/installer.js +310 -90
  4. package/src/utils/messages.js +24 -0
  5. package/src/DEPENDENCY_MAP.md +0 -90
  6. package/src/cli/cache-cli.js +0 -459
  7. package/src/cli/checkpoint-cli.js +0 -417
  8. package/src/cli/language-cli.js +0 -286
  9. package/src/cli/sprint-cli.js +0 -287
  10. package/src/commands/ai-tool.js +0 -383
  11. package/src/commands/compress.js +0 -60
  12. package/src/commands/create-project.js +0 -160
  13. package/src/commands/evaluate.js +0 -459
  14. package/src/commands/persona.js +0 -309
  15. package/src/commands/sprint-task.js +0 -262
  16. package/src/commands/token.js +0 -312
  17. package/src/lib/ai-persona-manager.js +0 -711
  18. package/src/lib/cache-system.js +0 -332
  19. package/src/lib/context-engine.js +0 -568
  20. package/src/lib/github-integration.js +0 -402
  21. package/src/lib/memory-profiler.js +0 -471
  22. package/src/lib/metrics-collector.js +0 -885
  23. package/src/lib/offline-detector.js +0 -386
  24. package/src/lib/resource-loader-enhanced.js +0 -399
  25. package/src/lib/resource-loader.js +0 -250
  26. package/src/lib/resources/commands/ai-persona.js +0 -602
  27. package/src/lib/resources/commands/compress-context.js +0 -389
  28. package/src/lib/resources/commands/evaluate.js +0 -246
  29. package/src/lib/resources/commands/persona-context-apply.js +0 -562
  30. package/src/lib/resources/commands/token-tracking.js +0 -443
  31. package/src/lib/resources/config/commit-patterns.js +0 -103
  32. package/src/lib/resources/config/language.json +0 -6
  33. package/src/lib/resources/personas/PERSONA_INDEX.md +0 -57
  34. package/src/lib/resources/personas/analyst.json +0 -44
  35. package/src/lib/resources/personas/architect/best_practices.md +0 -136
  36. package/src/lib/resources/personas/architect/knowledge_base.md +0 -377
  37. package/src/lib/resources/personas/architect.json +0 -44
  38. package/src/lib/resources/personas/backend/best_practices.md +0 -766
  39. package/src/lib/resources/personas/backend/knowledge_base.md +0 -1070
  40. package/src/lib/resources/personas/data_analyst/best_practices.md +0 -594
  41. package/src/lib/resources/personas/data_analyst/knowledge_base.md +0 -1057
  42. package/src/lib/resources/personas/developer.json +0 -44
  43. package/src/lib/resources/personas/developer.md +0 -37
  44. package/src/lib/resources/personas/evaluation_criteria.json +0 -137
  45. package/src/lib/resources/personas/frontend/best_practices.md +0 -445
  46. package/src/lib/resources/personas/frontend/knowledge_base.md +0 -729
  47. package/src/lib/resources/personas/persona-index.json +0 -31
  48. package/src/lib/resources/personas/reviewer.json +0 -44
  49. package/src/lib/resources/personas/security/best_practices.md +0 -307
  50. package/src/lib/resources/personas/security/knowledge_base.md +0 -498
  51. package/src/lib/resources/personas/tester.json +0 -44
  52. package/src/lib/resources/templates/README.md +0 -78
  53. package/src/lib/resources/templates/api-server/config.json +0 -64
  54. package/src/lib/resources/templates/api-server/template/.aiwf/config.json +0 -56
  55. package/src/lib/resources/templates/api-server/template/.aiwf/feature-ledger.json +0 -42
  56. package/src/lib/resources/templates/api-server/template/.aiwf/personas/backend-engineer.json +0 -40
  57. package/src/lib/resources/templates/api-server/template/.aiwf/scripts/cli.js +0 -111
  58. package/src/lib/resources/templates/api-server/template/.env.example +0 -29
  59. package/src/lib/resources/templates/api-server/template/.eslintrc.json +0 -23
  60. package/src/lib/resources/templates/api-server/template/README.md +0 -171
  61. package/src/lib/resources/templates/api-server/template/jest.config.js +0 -26
  62. package/src/lib/resources/templates/api-server/template/nodemon.json +0 -9
  63. package/src/lib/resources/templates/api-server/template/package.json +0 -61
  64. package/src/lib/resources/templates/api-server/template/src/app.ts +0 -60
  65. package/src/lib/resources/templates/api-server/template/src/config/swagger.ts +0 -38
  66. package/src/lib/resources/templates/api-server/template/src/controllers/aiwfController.ts +0 -54
  67. package/src/lib/resources/templates/api-server/template/src/controllers/authController.ts +0 -128
  68. package/src/lib/resources/templates/api-server/template/src/controllers/statusController.ts +0 -28
  69. package/src/lib/resources/templates/api-server/template/src/index.ts +0 -28
  70. package/src/lib/resources/templates/api-server/template/src/middleware/aiwfMiddleware.ts +0 -50
  71. package/src/lib/resources/templates/api-server/template/src/middleware/authMiddleware.ts +0 -41
  72. package/src/lib/resources/templates/api-server/template/src/middleware/errorHandler.ts +0 -42
  73. package/src/lib/resources/templates/api-server/template/src/middleware/notFoundHandler.ts +0 -14
  74. package/src/lib/resources/templates/api-server/template/src/middleware/requestLogger.ts +0 -20
  75. package/src/lib/resources/templates/api-server/template/src/routes/aiwf.ts +0 -31
  76. package/src/lib/resources/templates/api-server/template/src/routes/index.ts +0 -13
  77. package/src/lib/resources/templates/api-server/template/src/routes/v1/index.ts +0 -67
  78. package/src/lib/resources/templates/api-server/template/src/utils/logger.ts +0 -37
  79. package/src/lib/resources/templates/api-server/template/tests/app.test.ts +0 -40
  80. package/src/lib/resources/templates/api-server/template/tsconfig.json +0 -43
  81. package/src/lib/resources/templates/npm-library/config.json +0 -61
  82. package/src/lib/resources/templates/npm-library/template/LICENSE +0 -21
  83. package/src/lib/resources/templates/npm-library/template/README.md +0 -201
  84. package/src/lib/resources/templates/npm-library/template/package.json +0 -78
  85. package/src/lib/resources/templates/web-app/config.json +0 -53
  86. package/src/lib/resources/templates/web-app/template/.aiwf/config.json +0 -54
  87. package/src/lib/resources/templates/web-app/template/.aiwf/feature-ledger.json +0 -37
  88. package/src/lib/resources/templates/web-app/template/.aiwf/personas/fullstack-developer.json +0 -40
  89. package/src/lib/resources/templates/web-app/template/.aiwf/scripts/cli.js +0 -110
  90. package/src/lib/resources/templates/web-app/template/.eslintrc.cjs +0 -20
  91. package/src/lib/resources/templates/web-app/template/README.md +0 -151
  92. package/src/lib/resources/templates/web-app/template/index.html +0 -14
  93. package/src/lib/resources/templates/web-app/template/package.json +0 -44
  94. package/src/lib/resources/templates/web-app/template/postcss.config.js +0 -6
  95. package/src/lib/resources/templates/web-app/template/public/vite.svg +0 -1
  96. package/src/lib/resources/templates/web-app/template/src/App.tsx +0 -21
  97. package/src/lib/resources/templates/web-app/template/src/components/Layout.tsx +0 -57
  98. package/src/lib/resources/templates/web-app/template/src/components/aiwf/ContextStatus.tsx +0 -107
  99. package/src/lib/resources/templates/web-app/template/src/components/aiwf/TokenUsage.tsx +0 -71
  100. package/src/lib/resources/templates/web-app/template/src/index.css +0 -60
  101. package/src/lib/resources/templates/web-app/template/src/main.tsx +0 -10
  102. package/src/lib/resources/templates/web-app/template/src/pages/AiwfDashboard.tsx +0 -57
  103. package/src/lib/resources/templates/web-app/template/src/pages/HomePage.tsx +0 -89
  104. package/src/lib/resources/templates/web-app/template/src/pages/NotFound.tsx +0 -25
  105. package/src/lib/resources/templates/web-app/template/src/stores/aiwfStore.ts +0 -126
  106. package/src/lib/resources/templates/web-app/template/src/types/global.d.ts +0 -9
  107. package/src/lib/resources/templates/web-app/template/src/vite-env.d.ts +0 -1
  108. package/src/lib/resources/templates/web-app/template/tailwind.config.js +0 -30
  109. package/src/lib/resources/templates/web-app/template/tsconfig.json +0 -37
  110. package/src/lib/resources/templates/web-app/template/tsconfig.node.json +0 -10
  111. package/src/lib/resources/templates/web-app/template/vite.config.ts +0 -23
  112. package/src/lib/resources/utils/background-monitor.js +0 -223
  113. package/src/lib/resources/utils/compression-metrics.js +0 -1031
  114. package/src/lib/resources/utils/compression-strategies.js +0 -557
  115. package/src/lib/resources/utils/content-normalizer.js +0 -455
  116. package/src/lib/resources/utils/context-compressor.js +0 -583
  117. package/src/lib/resources/utils/context-rule-parser.js +0 -180
  118. package/src/lib/resources/utils/context-token-monitor.js +0 -463
  119. package/src/lib/resources/utils/context-update-manager.js +0 -502
  120. package/src/lib/resources/utils/git-utils.js +0 -220
  121. package/src/lib/resources/utils/importance-classifier.js +0 -645
  122. package/src/lib/resources/utils/information-filter.js +0 -710
  123. package/src/lib/resources/utils/persona-aware-compressor.js +0 -598
  124. package/src/lib/resources/utils/prompt-injector.js +0 -242
  125. package/src/lib/resources/utils/simplified-evaluator.js +0 -119
  126. package/src/lib/resources/utils/text-summarizer.js +0 -492
  127. package/src/lib/resources/utils/token-counter.js +0 -177
  128. package/src/lib/resources/utils/token-monitor.js +0 -484
  129. package/src/lib/resources/utils/token-reporter.js +0 -452
  130. package/src/lib/resources/utils/token-storage.js +0 -433
  131. package/src/lib/resources/utils/token-tracker.js +0 -283
  132. package/src/lib/state/priority-calculator.js +0 -217
  133. package/src/lib/state/state-index.js +0 -155
  134. package/src/lib/state/task-scanner.js +0 -328
  135. package/src/lib/task-analyzer.js +0 -599
  136. package/src/lib/template-cache-system.js +0 -559
  137. package/src/lib/template-downloader.js +0 -467
  138. package/src/lib/template-version-manager.js +0 -491
  139. package/src/lib/token-optimizer.js +0 -517
  140. package/src/utils/engineering-guard.js +0 -399
@@ -1,471 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import { performance } from 'perf_hooks';
4
- import fs from 'fs/promises';
5
- import path from 'path';
6
-
7
- /**
8
- * 메모리 프로파일링 및 최적화 시스템
9
- * - 실시간 메모리 사용량 추적
10
- * - 메모리 누수 감지
11
- * - 가비지 컬렉션 최적화
12
- */
13
- class MemoryProfiler {
14
- constructor(options = {}) {
15
- this.samplingInterval = options.samplingInterval || 1000; // 1초
16
- this.maxSamples = options.maxSamples || 1000;
17
- this.thresholds = {
18
- heapUsed: options.heapThreshold || 100 * 1024 * 1024, // 100MB
19
- heapTotal: options.heapTotalThreshold || 200 * 1024 * 1024, // 200MB
20
- external: options.externalThreshold || 50 * 1024 * 1024, // 50MB
21
- rss: options.rssThreshold || 500 * 1024 * 1024 // 500MB
22
- };
23
-
24
- this.samples = [];
25
- this.alerts = [];
26
- this.profiling = false;
27
- this.intervalId = null;
28
- this.snapshots = new Map();
29
- this.objectLeakDetector = new ObjectLeakDetector();
30
- }
31
-
32
- // 프로파일링 시작
33
- startProfiling() {
34
- if (this.profiling) {
35
- return;
36
- }
37
-
38
- this.profiling = true;
39
- this.intervalId = setInterval(() => {
40
- this.takeSample();
41
- }, this.samplingInterval);
42
-
43
- console.log('Memory profiling started');
44
- }
45
-
46
- // 프로파일링 중지
47
- stopProfiling() {
48
- if (!this.profiling) {
49
- return;
50
- }
51
-
52
- this.profiling = false;
53
- if (this.intervalId) {
54
- clearInterval(this.intervalId);
55
- this.intervalId = null;
56
- }
57
-
58
- console.log('Memory profiling stopped');
59
- }
60
-
61
- // 메모리 샘플 수집
62
- takeSample() {
63
- const memoryUsage = process.memoryUsage();
64
- const performanceMetrics = this.getPerformanceMetrics();
65
-
66
- const sample = {
67
- timestamp: Date.now(),
68
- memory: memoryUsage,
69
- performance: performanceMetrics,
70
- gc: this.getGCStats()
71
- };
72
-
73
- this.samples.push(sample);
74
-
75
- // 최대 샘플 수 제한
76
- if (this.samples.length > this.maxSamples) {
77
- this.samples.shift();
78
- }
79
-
80
- // 임계값 확인
81
- this.checkThresholds(sample);
82
-
83
- // 메모리 누수 감지
84
- this.detectMemoryLeaks(sample);
85
- }
86
-
87
- // 성능 메트릭 수집
88
- getPerformanceMetrics() {
89
- const entries = performance.getEntriesByType('measure');
90
- const metrics = {
91
- totalMeasures: entries.length,
92
- averageDuration: 0,
93
- maxDuration: 0,
94
- minDuration: Infinity
95
- };
96
-
97
- if (entries.length > 0) {
98
- const durations = entries.map(entry => entry.duration);
99
- metrics.averageDuration = durations.reduce((a, b) => a + b, 0) / durations.length;
100
- metrics.maxDuration = Math.max(...durations);
101
- metrics.minDuration = Math.min(...durations);
102
- }
103
-
104
- return metrics;
105
- }
106
-
107
- // GC 통계 수집
108
- getGCStats() {
109
- // V8 GC 정보 (Node.js 14+)
110
- if (global.gc && typeof global.gc.getHeapStatistics === 'function') {
111
- return global.gc.getHeapStatistics();
112
- }
113
-
114
- return {
115
- totalHeapSize: 0,
116
- usedHeapSize: 0,
117
- heapSizeLimit: 0
118
- };
119
- }
120
-
121
- // 임계값 확인
122
- checkThresholds(sample) {
123
- const { memory } = sample;
124
- const alerts = [];
125
-
126
- Object.entries(this.thresholds).forEach(([key, threshold]) => {
127
- if (memory[key] > threshold) {
128
- alerts.push({
129
- type: 'threshold_exceeded',
130
- metric: key,
131
- value: memory[key],
132
- threshold,
133
- timestamp: sample.timestamp
134
- });
135
- }
136
- });
137
-
138
- if (alerts.length > 0) {
139
- this.alerts.push(...alerts);
140
- this.triggerAlerts(alerts);
141
- }
142
- }
143
-
144
- // 메모리 누수 감지
145
- detectMemoryLeaks(sample) {
146
- const recentSamples = this.samples.slice(-10); // 최근 10개 샘플
147
-
148
- if (recentSamples.length < 10) {
149
- return;
150
- }
151
-
152
- // 메모리 사용량 추세 분석
153
- const heapTrend = this.calculateTrend(recentSamples.map(s => s.memory.heapUsed));
154
- const rssTrend = this.calculateTrend(recentSamples.map(s => s.memory.rss));
155
-
156
- // 지속적인 메모리 증가 감지
157
- if (heapTrend > 0.05 || rssTrend > 0.05) { // 5% 이상 증가
158
- this.alerts.push({
159
- type: 'memory_leak_suspected',
160
- heapTrend,
161
- rssTrend,
162
- timestamp: sample.timestamp
163
- });
164
- }
165
- }
166
-
167
- // 추세 계산
168
- calculateTrend(values) {
169
- if (values.length < 2) return 0;
170
-
171
- const first = values[0];
172
- const last = values[values.length - 1];
173
-
174
- return (last - first) / first;
175
- }
176
-
177
- // 알림 발생
178
- triggerAlerts(alerts) {
179
- alerts.forEach(alert => {
180
- console.warn(`Memory Alert: ${alert.type}`, alert);
181
- });
182
- }
183
-
184
- // 메모리 스냅샷 생성
185
- createSnapshot(label) {
186
- const snapshot = {
187
- label,
188
- timestamp: Date.now(),
189
- memory: process.memoryUsage(),
190
- objectCounts: this.objectLeakDetector.getObjectCounts()
191
- };
192
-
193
- this.snapshots.set(label, snapshot);
194
- return snapshot;
195
- }
196
-
197
- // 스냅샷 비교
198
- compareSnapshots(label1, label2) {
199
- const snapshot1 = this.snapshots.get(label1);
200
- const snapshot2 = this.snapshots.get(label2);
201
-
202
- if (!snapshot1 || !snapshot2) {
203
- throw new Error('Snapshot not found');
204
- }
205
-
206
- const comparison = {
207
- timeDiff: snapshot2.timestamp - snapshot1.timestamp,
208
- memoryDiff: {},
209
- objectDiff: {}
210
- };
211
-
212
- // 메모리 사용량 차이
213
- Object.keys(snapshot1.memory).forEach(key => {
214
- comparison.memoryDiff[key] = snapshot2.memory[key] - snapshot1.memory[key];
215
- });
216
-
217
- // 객체 수 차이
218
- Object.keys(snapshot1.objectCounts).forEach(key => {
219
- comparison.objectDiff[key] = (snapshot2.objectCounts[key] || 0) - (snapshot1.objectCounts[key] || 0);
220
- });
221
-
222
- return comparison;
223
- }
224
-
225
- // 메모리 최적화 제안
226
- getOptimizationSuggestions() {
227
- const suggestions = [];
228
- const currentMemory = process.memoryUsage();
229
- const recentSamples = this.samples.slice(-10);
230
-
231
- // 높은 메모리 사용량
232
- if (currentMemory.heapUsed > this.thresholds.heapUsed) {
233
- suggestions.push({
234
- type: 'high_memory_usage',
235
- suggestion: 'Consider running garbage collection or optimizing data structures',
236
- priority: 'high'
237
- });
238
- }
239
-
240
- // 메모리 누수 의심
241
- if (recentSamples.length > 0) {
242
- const heapTrend = this.calculateTrend(recentSamples.map(s => s.memory.heapUsed));
243
- if (heapTrend > 0.1) {
244
- suggestions.push({
245
- type: 'memory_leak',
246
- suggestion: 'Potential memory leak detected. Review object references and event listeners',
247
- priority: 'critical'
248
- });
249
- }
250
- }
251
-
252
- // 외부 메모리 사용량
253
- if (currentMemory.external > this.thresholds.external) {
254
- suggestions.push({
255
- type: 'external_memory',
256
- suggestion: 'High external memory usage. Review Buffer and C++ addon usage',
257
- priority: 'medium'
258
- });
259
- }
260
-
261
- return suggestions;
262
- }
263
-
264
- // 가비지 컬렉션 강제 실행
265
- forceGarbageCollection() {
266
- if (global.gc) {
267
- const beforeGC = process.memoryUsage();
268
- global.gc();
269
- const afterGC = process.memoryUsage();
270
-
271
- return {
272
- before: beforeGC,
273
- after: afterGC,
274
- freed: {
275
- heapUsed: beforeGC.heapUsed - afterGC.heapUsed,
276
- heapTotal: beforeGC.heapTotal - afterGC.heapTotal,
277
- external: beforeGC.external - afterGC.external,
278
- rss: beforeGC.rss - afterGC.rss
279
- }
280
- };
281
- }
282
-
283
- return null;
284
- }
285
-
286
- // 메모리 사용량 보고서 생성
287
- generateReport() {
288
- const currentMemory = process.memoryUsage();
289
- const recentSamples = this.samples.slice(-100); // 최근 100개 샘플
290
-
291
- const report = {
292
- timestamp: Date.now(),
293
- current: currentMemory,
294
- statistics: this.calculateStatistics(recentSamples),
295
- alerts: this.alerts.slice(-10), // 최근 10개 알림
296
- suggestions: this.getOptimizationSuggestions(),
297
- snapshots: Array.from(this.snapshots.keys())
298
- };
299
-
300
- return report;
301
- }
302
-
303
- // 통계 계산
304
- calculateStatistics(samples) {
305
- if (samples.length === 0) {
306
- return {};
307
- }
308
-
309
- const stats = {
310
- heapUsed: { min: Infinity, max: 0, avg: 0 },
311
- heapTotal: { min: Infinity, max: 0, avg: 0 },
312
- external: { min: Infinity, max: 0, avg: 0 },
313
- rss: { min: Infinity, max: 0, avg: 0 }
314
- };
315
-
316
- samples.forEach(sample => {
317
- Object.keys(stats).forEach(key => {
318
- const value = sample.memory[key];
319
- stats[key].min = Math.min(stats[key].min, value);
320
- stats[key].max = Math.max(stats[key].max, value);
321
- stats[key].avg += value;
322
- });
323
- });
324
-
325
- // 평균 계산
326
- Object.keys(stats).forEach(key => {
327
- stats[key].avg /= samples.length;
328
- });
329
-
330
- return stats;
331
- }
332
-
333
- // 보고서를 파일로 저장
334
- async saveReport(filePath) {
335
- const report = this.generateReport();
336
- await fs.writeFile(filePath, JSON.stringify(report, null, 2));
337
- return filePath;
338
- }
339
-
340
- // 메모리 사용량 모니터링
341
- monitor(duration = 60000) { // 1분 기본
342
- return new Promise((resolve) => {
343
- this.startProfiling();
344
-
345
- setTimeout(() => {
346
- this.stopProfiling();
347
- resolve(this.generateReport());
348
- }, duration);
349
- });
350
- }
351
- }
352
-
353
- // 객체 누수 감지기
354
- class ObjectLeakDetector {
355
- constructor() {
356
- this.objectCounts = new Map();
357
- this.tracking = false;
358
- }
359
-
360
- startTracking() {
361
- this.tracking = true;
362
- this.objectCounts.clear();
363
- }
364
-
365
- stopTracking() {
366
- this.tracking = false;
367
- }
368
-
369
- // 객체 수 추적
370
- trackObject(type, operation = 'create') {
371
- if (!this.tracking) return;
372
-
373
- const current = this.objectCounts.get(type) || 0;
374
-
375
- if (operation === 'create') {
376
- this.objectCounts.set(type, current + 1);
377
- } else if (operation === 'destroy') {
378
- this.objectCounts.set(type, Math.max(0, current - 1));
379
- }
380
- }
381
-
382
- // 현재 객체 수 반환
383
- getObjectCounts() {
384
- return Object.fromEntries(this.objectCounts);
385
- }
386
-
387
- // 누수 의심 객체 찾기
388
- findLeakingObjects(threshold = 1000) {
389
- const leaking = [];
390
-
391
- for (const [type, count] of this.objectCounts) {
392
- if (count > threshold) {
393
- leaking.push({ type, count });
394
- }
395
- }
396
-
397
- return leaking;
398
- }
399
- }
400
-
401
- // 메모리 최적화 유틸리티
402
- class MemoryOptimizer {
403
- static async optimizeForLargeFiles(filePath, chunkSize = 64 * 1024) {
404
- const stat = await fs.stat(filePath);
405
-
406
- if (stat.size > 100 * 1024 * 1024) { // 100MB 이상
407
- // 스트리밍 처리 권장
408
- return {
409
- recommendation: 'streaming',
410
- reason: 'File size exceeds 100MB',
411
- chunkSize
412
- };
413
- }
414
-
415
- return {
416
- recommendation: 'buffer',
417
- reason: 'File size is manageable for buffer processing'
418
- };
419
- }
420
-
421
- static optimizeDataStructures(data) {
422
- // 메모리 효율적인 데이터 구조 제안
423
- if (Array.isArray(data)) {
424
- if (data.length > 10000) {
425
- return {
426
- recommendation: 'Use Set or Map for better performance',
427
- reason: 'Large array detected'
428
- };
429
- }
430
- }
431
-
432
- if (typeof data === 'object' && data !== null) {
433
- const keys = Object.keys(data);
434
- if (keys.length > 1000) {
435
- return {
436
- recommendation: 'Consider using Map instead of Object',
437
- reason: 'Large object with many properties'
438
- };
439
- }
440
- }
441
-
442
- return {
443
- recommendation: 'Current data structure is optimal',
444
- reason: 'Size is within acceptable limits'
445
- };
446
- }
447
-
448
- static async cleanupTemporaryFiles(tmpDir = '/tmp') {
449
- const files = await fs.readdir(tmpDir);
450
- const cleanedFiles = [];
451
-
452
- for (const file of files) {
453
- const filePath = path.join(tmpDir, file);
454
- try {
455
- const stat = await fs.stat(filePath);
456
-
457
- // 1시간 이상 된 임시 파일 삭제
458
- if (Date.now() - stat.mtime.getTime() > 3600000) {
459
- await fs.unlink(filePath);
460
- cleanedFiles.push(filePath);
461
- }
462
- } catch (error) {
463
- // 파일 삭제 실패는 무시
464
- }
465
- }
466
-
467
- return cleanedFiles;
468
- }
469
- }
470
-
471
- export { MemoryProfiler, ObjectLeakDetector, MemoryOptimizer };