memento-mcp-server 1.8.0 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/environment.d.ts.map +1 -1
- package/dist/config/environment.js +2 -1
- package/dist/config/environment.js.map +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +5 -2
- package/dist/config/index.js.map +1 -1
- package/dist/database/init.d.ts.map +1 -1
- package/dist/database/init.js +159 -7
- package/dist/database/init.js.map +1 -1
- package/dist/database/migration/backup-manager.d.ts +55 -0
- package/dist/database/migration/backup-manager.d.ts.map +1 -0
- package/dist/database/migration/backup-manager.js +181 -0
- package/dist/database/migration/backup-manager.js.map +1 -0
- package/dist/database/migration/dependency-validator.d.ts +62 -0
- package/dist/database/migration/dependency-validator.d.ts.map +1 -0
- package/dist/database/migration/dependency-validator.js +260 -0
- package/dist/database/migration/dependency-validator.js.map +1 -0
- package/dist/database/migration/migration-detector.d.ts +67 -0
- package/dist/database/migration/migration-detector.d.ts.map +1 -0
- package/dist/database/migration/migration-detector.js +129 -0
- package/dist/database/migration/migration-detector.js.map +1 -0
- package/dist/database/migration/migration-logger.d.ts +82 -0
- package/dist/database/migration/migration-logger.d.ts.map +1 -0
- package/dist/database/migration/migration-logger.js +168 -0
- package/dist/database/migration/migration-logger.js.map +1 -0
- package/dist/database/migration/migration-runner.d.ts +45 -0
- package/dist/database/migration/migration-runner.d.ts.map +1 -0
- package/dist/database/migration/migration-runner.js +194 -0
- package/dist/database/migration/migration-runner.js.map +1 -0
- package/dist/database/migration/migrations/002-mirix-schema-expansion.d.ts +55 -0
- package/dist/database/migration/migrations/002-mirix-schema-expansion.d.ts.map +1 -0
- package/dist/database/migration/migrations/002-mirix-schema-expansion.js +154 -0
- package/dist/database/migration/migrations/002-mirix-schema-expansion.js.map +1 -0
- package/dist/database/migration/schema-version-manager.d.ts +43 -0
- package/dist/database/migration/schema-version-manager.d.ts.map +1 -0
- package/dist/database/migration/schema-version-manager.js +146 -0
- package/dist/database/migration/schema-version-manager.js.map +1 -0
- package/dist/database/migration/types.d.ts +127 -0
- package/dist/database/migration/types.d.ts.map +1 -0
- package/dist/database/migration/types.js +5 -0
- package/dist/database/migration/types.js.map +1 -0
- package/dist/database/schema.sql +69 -1
- package/dist/npm-client/memento-client.d.ts.map +1 -1
- package/dist/npm-client/memento-client.js +39 -8
- package/dist/npm-client/memento-client.js.map +1 -1
- package/dist/npm-client/types.d.ts +16 -2
- package/dist/npm-client/types.d.ts.map +1 -1
- package/dist/npm-client/types.js.map +1 -1
- package/dist/npm-client/utils.d.ts.map +1 -1
- package/dist/npm-client/utils.js +44 -5
- package/dist/npm-client/utils.js.map +1 -1
- package/dist/repositories/core-memory-repository.d.ts +81 -0
- package/dist/repositories/core-memory-repository.d.ts.map +1 -0
- package/dist/repositories/core-memory-repository.js +263 -0
- package/dist/repositories/core-memory-repository.js.map +1 -0
- package/dist/repositories/knowledge-vault-repository.d.ts +102 -0
- package/dist/repositories/knowledge-vault-repository.d.ts.map +1 -0
- package/dist/repositories/knowledge-vault-repository.js +395 -0
- package/dist/repositories/knowledge-vault-repository.js.map +1 -0
- package/dist/services/core-memory-cache-service.d.ts +80 -0
- package/dist/services/core-memory-cache-service.d.ts.map +1 -0
- package/dist/services/core-memory-cache-service.js +122 -0
- package/dist/services/core-memory-cache-service.js.map +1 -0
- package/dist/services/core-memory-service.d.ts +117 -0
- package/dist/services/core-memory-service.d.ts.map +1 -0
- package/dist/services/core-memory-service.js +247 -0
- package/dist/services/core-memory-service.js.map +1 -0
- package/dist/services/knowledge-vault-service.d.ts +114 -0
- package/dist/services/knowledge-vault-service.d.ts.map +1 -0
- package/dist/services/knowledge-vault-service.js +233 -0
- package/dist/services/knowledge-vault-service.js.map +1 -0
- package/dist/tools/memory-injection-prompt.d.ts.map +1 -1
- package/dist/tools/memory-injection-prompt.js +28 -4
- package/dist/tools/memory-injection-prompt.js.map +1 -1
- package/dist/tools/recall-tool.d.ts.map +1 -1
- package/dist/tools/recall-tool.js +292 -82
- package/dist/tools/recall-tool.js.map +1 -1
- package/dist/tools/remember-tool.d.ts.map +1 -1
- package/dist/tools/remember-tool.js +282 -106
- package/dist/tools/remember-tool.js.map +1 -1
- package/dist/tools/types.d.ts +9 -2
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +11 -2
- package/dist/tools/types.js.map +1 -1
- package/dist/types/index.d.ts +20 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +7 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/type-param-validator.d.ts +31 -0
- package/dist/utils/type-param-validator.d.ts.map +1 -0
- package/dist/utils/type-param-validator.js +76 -0
- package/dist/utils/type-param-validator.js.map +1 -0
- package/package.json +1 -1
- package/src/database/schema.sql +69 -1
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 데이터베이스 의존성 검증 유틸리티
|
|
3
|
+
* 마이그레이션 후 기존 의존성(외래키, 트리거 등)이 정상적으로 작동하는지 검증
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 데이터베이스 의존성 검증기
|
|
7
|
+
*/
|
|
8
|
+
export class DependencyValidator {
|
|
9
|
+
/**
|
|
10
|
+
* 모든 의존성 검증 수행
|
|
11
|
+
*/
|
|
12
|
+
static async validateAll(db) {
|
|
13
|
+
const results = [];
|
|
14
|
+
// 1. memory_embedding 외래키 검증
|
|
15
|
+
results.push(await this.validateMemoryEmbeddingForeignKey(db));
|
|
16
|
+
// 2. FTS5 트리거 검증
|
|
17
|
+
results.push(await this.validateFTS5Triggers(db));
|
|
18
|
+
// 3. VEC 트리거 검증
|
|
19
|
+
results.push(await this.validateVECTriggers(db));
|
|
20
|
+
const failureCount = results.filter(r => !r.success).length;
|
|
21
|
+
return {
|
|
22
|
+
success: failureCount === 0,
|
|
23
|
+
results,
|
|
24
|
+
failureCount
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* memory_embedding 테이블의 외래키 검증
|
|
29
|
+
*/
|
|
30
|
+
static async validateMemoryEmbeddingForeignKey(db) {
|
|
31
|
+
try {
|
|
32
|
+
// memory_embedding 테이블 존재 확인
|
|
33
|
+
const tableExists = db.prepare(`
|
|
34
|
+
SELECT name FROM sqlite_master
|
|
35
|
+
WHERE type='table' AND name='memory_embedding'
|
|
36
|
+
`).get();
|
|
37
|
+
if (!tableExists) {
|
|
38
|
+
return {
|
|
39
|
+
name: 'memory_embedding_foreign_key',
|
|
40
|
+
success: false,
|
|
41
|
+
error: 'memory_embedding table does not exist'
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// 외래키 제약 조건 확인
|
|
45
|
+
const fkInfo = db.prepare(`
|
|
46
|
+
SELECT * FROM pragma_foreign_key_list('memory_embedding')
|
|
47
|
+
WHERE "table" = 'memory_item'
|
|
48
|
+
`).all();
|
|
49
|
+
if (fkInfo.length === 0) {
|
|
50
|
+
return {
|
|
51
|
+
name: 'memory_embedding_foreign_key',
|
|
52
|
+
success: false,
|
|
53
|
+
error: 'Foreign key constraint from memory_embedding.memory_id to memory_item.id is missing'
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const fk = fkInfo[0];
|
|
57
|
+
if (!fk) {
|
|
58
|
+
return {
|
|
59
|
+
name: 'memory_embedding_foreign_key',
|
|
60
|
+
success: false,
|
|
61
|
+
error: 'Foreign key constraint information is missing'
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
if (fk.from !== 'memory_id' || fk.to !== 'id') {
|
|
65
|
+
return {
|
|
66
|
+
name: 'memory_embedding_foreign_key',
|
|
67
|
+
success: false,
|
|
68
|
+
error: `Foreign key constraint mismatch: expected memory_id -> id, got ${fk.from} -> ${fk.to}`
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (fk.on_delete !== 'CASCADE') {
|
|
72
|
+
return {
|
|
73
|
+
name: 'memory_embedding_foreign_key',
|
|
74
|
+
success: false,
|
|
75
|
+
error: `Foreign key on_delete action should be CASCADE, got ${fk.on_delete}`
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
name: 'memory_embedding_foreign_key',
|
|
80
|
+
success: true,
|
|
81
|
+
details: {
|
|
82
|
+
from: fk.from,
|
|
83
|
+
to: fk.to,
|
|
84
|
+
on_delete: fk.on_delete,
|
|
85
|
+
on_update: fk.on_update
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
return {
|
|
91
|
+
name: 'memory_embedding_foreign_key',
|
|
92
|
+
success: false,
|
|
93
|
+
error: error.message || 'Unknown error during foreign key validation'
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* FTS5 트리거 검증
|
|
99
|
+
*/
|
|
100
|
+
static async validateFTS5Triggers(db) {
|
|
101
|
+
try {
|
|
102
|
+
const requiredTriggers = [
|
|
103
|
+
'memory_item_fts_insert',
|
|
104
|
+
'memory_item_fts_update',
|
|
105
|
+
'memory_item_fts_delete'
|
|
106
|
+
];
|
|
107
|
+
const missingTriggers = [];
|
|
108
|
+
const foundTriggers = [];
|
|
109
|
+
for (const triggerName of requiredTriggers) {
|
|
110
|
+
const trigger = db.prepare(`
|
|
111
|
+
SELECT name, sql FROM sqlite_master
|
|
112
|
+
WHERE type='trigger' AND name=?
|
|
113
|
+
`).get(triggerName);
|
|
114
|
+
if (!trigger) {
|
|
115
|
+
missingTriggers.push(triggerName);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
foundTriggers.push(triggerName);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (missingTriggers.length > 0) {
|
|
122
|
+
return {
|
|
123
|
+
name: 'fts5_triggers',
|
|
124
|
+
success: false,
|
|
125
|
+
error: `Missing FTS5 triggers: ${missingTriggers.join(', ')}`,
|
|
126
|
+
details: {
|
|
127
|
+
found: foundTriggers,
|
|
128
|
+
missing: missingTriggers
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
// FTS5 가상 테이블 존재 확인
|
|
133
|
+
const ftsTable = db.prepare(`
|
|
134
|
+
SELECT name FROM sqlite_master
|
|
135
|
+
WHERE type='table' AND name='memory_item_fts'
|
|
136
|
+
`).get();
|
|
137
|
+
if (!ftsTable) {
|
|
138
|
+
return {
|
|
139
|
+
name: 'fts5_triggers',
|
|
140
|
+
success: false,
|
|
141
|
+
error: 'FTS5 virtual table memory_item_fts does not exist'
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
name: 'fts5_triggers',
|
|
146
|
+
success: true,
|
|
147
|
+
details: {
|
|
148
|
+
triggers: foundTriggers,
|
|
149
|
+
fts_table_exists: true
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
return {
|
|
155
|
+
name: 'fts5_triggers',
|
|
156
|
+
success: false,
|
|
157
|
+
error: error.message || 'Unknown error during FTS5 trigger validation'
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* VEC 트리거 검증
|
|
163
|
+
*/
|
|
164
|
+
static async validateVECTriggers(db) {
|
|
165
|
+
try {
|
|
166
|
+
const requiredTriggers = [
|
|
167
|
+
'memory_embedding_vec_insert',
|
|
168
|
+
'memory_embedding_vec_update',
|
|
169
|
+
'memory_embedding_vec_delete'
|
|
170
|
+
];
|
|
171
|
+
const missingTriggers = [];
|
|
172
|
+
const foundTriggers = [];
|
|
173
|
+
for (const triggerName of requiredTriggers) {
|
|
174
|
+
const trigger = db.prepare(`
|
|
175
|
+
SELECT name, sql FROM sqlite_master
|
|
176
|
+
WHERE type='trigger' AND name=?
|
|
177
|
+
`).get(triggerName);
|
|
178
|
+
if (!trigger) {
|
|
179
|
+
missingTriggers.push(triggerName);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
foundTriggers.push(triggerName);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (missingTriggers.length > 0) {
|
|
186
|
+
return {
|
|
187
|
+
name: 'vec_triggers',
|
|
188
|
+
success: false,
|
|
189
|
+
error: `Missing VEC triggers: ${missingTriggers.join(', ')}`,
|
|
190
|
+
details: {
|
|
191
|
+
found: foundTriggers,
|
|
192
|
+
missing: missingTriggers
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
// VEC 가상 테이블 존재 확인 (선택적, sqlite-vec 확장이 설치되어 있을 때만)
|
|
197
|
+
const vecTables = [
|
|
198
|
+
'memory_item_vec',
|
|
199
|
+
'memory_item_vec_tfidf',
|
|
200
|
+
'memory_item_vec_minilm',
|
|
201
|
+
'memory_item_vec_openai',
|
|
202
|
+
'memory_item_vec_gemini'
|
|
203
|
+
];
|
|
204
|
+
const existingVecTables = [];
|
|
205
|
+
const missingVecTables = [];
|
|
206
|
+
for (const tableName of vecTables) {
|
|
207
|
+
try {
|
|
208
|
+
const table = db.prepare(`
|
|
209
|
+
SELECT name FROM sqlite_master
|
|
210
|
+
WHERE type='table' AND name=?
|
|
211
|
+
`).get(tableName);
|
|
212
|
+
if (table) {
|
|
213
|
+
existingVecTables.push(tableName);
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
missingVecTables.push(tableName);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
// sqlite-vec 확장이 없을 수 있으므로 에러는 무시
|
|
221
|
+
missingVecTables.push(tableName);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// VEC 테이블이 하나도 없으면 경고 (sqlite-vec 확장이 설치되지 않았을 수 있음)
|
|
225
|
+
if (existingVecTables.length === 0) {
|
|
226
|
+
return {
|
|
227
|
+
name: 'vec_triggers',
|
|
228
|
+
success: true, // 트리거는 존재하므로 성공으로 처리
|
|
229
|
+
details: {
|
|
230
|
+
triggers: foundTriggers,
|
|
231
|
+
vec_tables: {
|
|
232
|
+
existing: existingVecTables,
|
|
233
|
+
missing: missingVecTables,
|
|
234
|
+
note: 'sqlite-vec extension may not be installed'
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
return {
|
|
240
|
+
name: 'vec_triggers',
|
|
241
|
+
success: true,
|
|
242
|
+
details: {
|
|
243
|
+
triggers: foundTriggers,
|
|
244
|
+
vec_tables: {
|
|
245
|
+
existing: existingVecTables,
|
|
246
|
+
missing: missingVecTables
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
return {
|
|
253
|
+
name: 'vec_triggers',
|
|
254
|
+
success: false,
|
|
255
|
+
error: error.message || 'Unknown error during VEC trigger validation'
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=dependency-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-validator.js","sourceRoot":"","sources":["../../../src/database/migration/dependency-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 마이그레이션 자동 감지 시스템
|
|
3
|
+
*
|
|
4
|
+
* migrations/ 디렉토리에서 마이그레이션 스크립트를 자동으로 감지하고,
|
|
5
|
+
* 현재 스키마 버전과 비교하여 실행해야 할 마이그레이션을 찾습니다.
|
|
6
|
+
*/
|
|
7
|
+
import type Database from 'better-sqlite3';
|
|
8
|
+
import type { Migration } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* 마이그레이션 감지 결과
|
|
11
|
+
*/
|
|
12
|
+
export interface DetectedMigration {
|
|
13
|
+
/**
|
|
14
|
+
* 마이그레이션 인스턴스
|
|
15
|
+
*/
|
|
16
|
+
migration: Migration;
|
|
17
|
+
/**
|
|
18
|
+
* 마이그레이션 파일 경로
|
|
19
|
+
*/
|
|
20
|
+
filePath: string;
|
|
21
|
+
/**
|
|
22
|
+
* 마이그레이션 버전 번호 (숫자)
|
|
23
|
+
*/
|
|
24
|
+
versionNumber: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 마이그레이션 감지 결과
|
|
28
|
+
*/
|
|
29
|
+
export interface MigrationDetectionResult {
|
|
30
|
+
/**
|
|
31
|
+
* 실행해야 할 마이그레이션 목록 (버전 순서대로 정렬됨)
|
|
32
|
+
*/
|
|
33
|
+
pendingMigrations: DetectedMigration[];
|
|
34
|
+
/**
|
|
35
|
+
* 이미 실행된 마이그레이션 목록
|
|
36
|
+
*/
|
|
37
|
+
appliedMigrations: DetectedMigration[];
|
|
38
|
+
/**
|
|
39
|
+
* 현재 스키마 버전
|
|
40
|
+
*/
|
|
41
|
+
currentVersion: string | null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 마이그레이션 자동 감지기
|
|
45
|
+
*/
|
|
46
|
+
export declare class MigrationDetector {
|
|
47
|
+
private migrationsDir;
|
|
48
|
+
constructor(migrationsDir?: string);
|
|
49
|
+
/**
|
|
50
|
+
* 모든 마이그레이션 파일 감지
|
|
51
|
+
*/
|
|
52
|
+
detectAllMigrations(): Promise<DetectedMigration[]>;
|
|
53
|
+
/**
|
|
54
|
+
* 실행해야 할 마이그레이션 감지
|
|
55
|
+
*/
|
|
56
|
+
detectPendingMigrations(db: Database.Database): Promise<MigrationDetectionResult>;
|
|
57
|
+
/**
|
|
58
|
+
* 버전 문자열을 숫자로 변환
|
|
59
|
+
* 예: "002" -> 2, "001" -> 1
|
|
60
|
+
*/
|
|
61
|
+
private parseVersionNumber;
|
|
62
|
+
/**
|
|
63
|
+
* 특정 버전의 마이그레이션 찾기
|
|
64
|
+
*/
|
|
65
|
+
findMigrationByVersion(version: string | undefined): Promise<DetectedMigration | null>;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=migration-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-detector.d.ts","sourceRoot":"","sources":["../../../src/database/migration/migration-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAI3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAM5C;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,SAAS,EAAE,SAAS,CAAC;IAErB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;IAEvC;;OAEG;IACH,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;IAEvC;;OAEG;IACH,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,aAAa,CAAS;gBAElB,aAAa,CAAC,EAAE,MAAM;IAIlC;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAmEzD;;OAEG;IACG,uBAAuB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,wBAAwB,CAAC;IA2BvF;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACG,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;CAO7F"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 마이그레이션 자동 감지 시스템
|
|
3
|
+
*
|
|
4
|
+
* migrations/ 디렉토리에서 마이그레이션 스크립트를 자동으로 감지하고,
|
|
5
|
+
* 현재 스키마 버전과 비교하여 실행해야 할 마이그레이션을 찾습니다.
|
|
6
|
+
*/
|
|
7
|
+
import { readdir } from 'fs/promises';
|
|
8
|
+
import { join, dirname } from 'path';
|
|
9
|
+
import { fileURLToPath } from 'url';
|
|
10
|
+
import { SchemaVersionManager } from './schema-version-manager.js';
|
|
11
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
+
const __dirname = dirname(__filename);
|
|
13
|
+
/**
|
|
14
|
+
* 마이그레이션 자동 감지기
|
|
15
|
+
*/
|
|
16
|
+
export class MigrationDetector {
|
|
17
|
+
migrationsDir;
|
|
18
|
+
constructor(migrationsDir) {
|
|
19
|
+
this.migrationsDir = migrationsDir || join(__dirname, 'migrations');
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 모든 마이그레이션 파일 감지
|
|
23
|
+
*/
|
|
24
|
+
async detectAllMigrations() {
|
|
25
|
+
const files = await readdir(this.migrationsDir);
|
|
26
|
+
const migrationFiles = files.filter(file => file.endsWith('.ts') &&
|
|
27
|
+
!file.endsWith('.spec.ts') &&
|
|
28
|
+
/^\d{3}-/.test(file));
|
|
29
|
+
const migrations = [];
|
|
30
|
+
for (const file of migrationFiles) {
|
|
31
|
+
try {
|
|
32
|
+
const filePath = join(this.migrationsDir, file);
|
|
33
|
+
const module = await import(`file://${filePath}`);
|
|
34
|
+
// default export 또는 named export 찾기
|
|
35
|
+
let MigrationClass = module.default;
|
|
36
|
+
// named export에서 Migration 클래스 찾기
|
|
37
|
+
if (!MigrationClass || typeof MigrationClass !== 'function') {
|
|
38
|
+
const exportedKeys = Object.keys(module);
|
|
39
|
+
for (const key of exportedKeys) {
|
|
40
|
+
const exported = module[key];
|
|
41
|
+
// 클래스이고 version, name, up 메서드를 가진 경우
|
|
42
|
+
if (typeof exported === 'function' && exported.prototype &&
|
|
43
|
+
(exported.prototype.version || exported.prototype.name)) {
|
|
44
|
+
MigrationClass = exported;
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (!MigrationClass || typeof MigrationClass !== 'function') {
|
|
50
|
+
console.warn(`⚠️ 마이그레이션 파일 ${file}에서 유효한 마이그레이션 클래스를 찾을 수 없습니다.`);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
// 클래스 인스턴스 생성
|
|
54
|
+
const migration = new MigrationClass();
|
|
55
|
+
if (!migration || !migration.version || !migration.up) {
|
|
56
|
+
console.warn(`⚠️ 마이그레이션 파일 ${file}에서 유효한 마이그레이션 인스턴스를 생성할 수 없습니다.`);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const versionNumber = this.parseVersionNumber(migration.version);
|
|
60
|
+
if (versionNumber === null) {
|
|
61
|
+
console.warn(`⚠️ 마이그레이션 ${file}의 버전 형식이 올바르지 않습니다: ${migration.version}`);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
migrations.push({
|
|
65
|
+
migration,
|
|
66
|
+
filePath,
|
|
67
|
+
versionNumber
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
console.error(`❌ 마이그레이션 파일 ${file} 로드 실패:`, error);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// 버전 번호로 정렬
|
|
75
|
+
migrations.sort((a, b) => a.versionNumber - b.versionNumber);
|
|
76
|
+
return migrations;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 실행해야 할 마이그레이션 감지
|
|
80
|
+
*/
|
|
81
|
+
async detectPendingMigrations(db) {
|
|
82
|
+
const allMigrations = await this.detectAllMigrations();
|
|
83
|
+
const versionManager = new SchemaVersionManager(db);
|
|
84
|
+
const currentVersion = await versionManager.getCurrentVersion();
|
|
85
|
+
const appliedVersions = currentVersion !== null
|
|
86
|
+
? await versionManager.getAppliedVersions()
|
|
87
|
+
: [];
|
|
88
|
+
const pendingMigrations = [];
|
|
89
|
+
const appliedMigrations = [];
|
|
90
|
+
for (const detected of allMigrations) {
|
|
91
|
+
if (appliedVersions.includes(detected.migration.version)) {
|
|
92
|
+
appliedMigrations.push(detected);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
pendingMigrations.push(detected);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
pendingMigrations,
|
|
100
|
+
appliedMigrations,
|
|
101
|
+
currentVersion
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 버전 문자열을 숫자로 변환
|
|
106
|
+
* 예: "002" -> 2, "001" -> 1
|
|
107
|
+
*/
|
|
108
|
+
parseVersionNumber(version) {
|
|
109
|
+
if (!version) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
const match = version.match(/^(\d+)/);
|
|
113
|
+
if (!match || !match[1]) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
return parseInt(match[1], 10);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* 특정 버전의 마이그레이션 찾기
|
|
120
|
+
*/
|
|
121
|
+
async findMigrationByVersion(version) {
|
|
122
|
+
if (!version) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
const allMigrations = await this.detectAllMigrations();
|
|
126
|
+
return allMigrations.find(m => m.migration.version === version) || null;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=migration-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-detector.js","sourceRoot":"","sources":["../../../src/database/migration/migration-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 마이그레이션 로깅 시스템
|
|
3
|
+
*
|
|
4
|
+
* 마이그레이션 실행 과정을 로그 파일에 기록합니다.
|
|
5
|
+
*/
|
|
6
|
+
import type { MigrationResult } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* 로그 레벨
|
|
9
|
+
*/
|
|
10
|
+
export declare enum LogLevel {
|
|
11
|
+
INFO = "INFO",
|
|
12
|
+
WARN = "WARN",
|
|
13
|
+
ERROR = "ERROR",
|
|
14
|
+
DEBUG = "DEBUG"
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 로그 엔트리
|
|
18
|
+
*/
|
|
19
|
+
export interface LogEntry {
|
|
20
|
+
timestamp: Date;
|
|
21
|
+
level: LogLevel;
|
|
22
|
+
message: string;
|
|
23
|
+
data?: any;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 마이그레이션 로거
|
|
27
|
+
*/
|
|
28
|
+
export declare class MigrationLogger {
|
|
29
|
+
private logDir;
|
|
30
|
+
private logFile;
|
|
31
|
+
private entries;
|
|
32
|
+
constructor(logDir?: string);
|
|
33
|
+
/**
|
|
34
|
+
* 로그 디렉토리 생성
|
|
35
|
+
*/
|
|
36
|
+
private ensureLogDirectory;
|
|
37
|
+
/**
|
|
38
|
+
* 로그 파일 초기화
|
|
39
|
+
*/
|
|
40
|
+
initializeLogFile(migrationVersion: string): void;
|
|
41
|
+
/**
|
|
42
|
+
* 로그 기록
|
|
43
|
+
*/
|
|
44
|
+
log(level: LogLevel, message: string, data?: any): void;
|
|
45
|
+
/**
|
|
46
|
+
* INFO 레벨 로그
|
|
47
|
+
*/
|
|
48
|
+
info(message: string, data?: any): void;
|
|
49
|
+
/**
|
|
50
|
+
* WARN 레벨 로그
|
|
51
|
+
*/
|
|
52
|
+
warn(message: string, data?: any): void;
|
|
53
|
+
/**
|
|
54
|
+
* ERROR 레벨 로그
|
|
55
|
+
*/
|
|
56
|
+
error(message: string, data?: any): void;
|
|
57
|
+
/**
|
|
58
|
+
* DEBUG 레벨 로그
|
|
59
|
+
*/
|
|
60
|
+
debug(message: string, data?: any): void;
|
|
61
|
+
/**
|
|
62
|
+
* 마이그레이션 결과 기록
|
|
63
|
+
*/
|
|
64
|
+
logMigrationResult(result: MigrationResult): void;
|
|
65
|
+
/**
|
|
66
|
+
* 로그 파일에 쓰기
|
|
67
|
+
*/
|
|
68
|
+
private writeToFile;
|
|
69
|
+
/**
|
|
70
|
+
* 로그 파일 경로 반환
|
|
71
|
+
*/
|
|
72
|
+
getLogFile(): string | null;
|
|
73
|
+
/**
|
|
74
|
+
* 로그 엔트리 조회
|
|
75
|
+
*/
|
|
76
|
+
getEntries(): LogEntry[];
|
|
77
|
+
/**
|
|
78
|
+
* 로그 디렉토리 경로 반환
|
|
79
|
+
*/
|
|
80
|
+
getLogDirectory(): string;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=migration-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-logger.d.ts","sourceRoot":"","sources":["../../../src/database/migration/migration-logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;GAEG;AACH,oBAAY,QAAQ;IAClB,IAAI,SAAS;IACb,IAAI,SAAS;IACb,KAAK,UAAU;IACf,KAAK,UAAU;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,OAAO,CAAkB;gBAErB,MAAM,CAAC,EAAE,MAAM;IAO3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI;IAcjD;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IA2BvD;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAIvC;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAIvC;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAIxC;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAIxC;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAoBjD;;OAEG;IACH,OAAO,CAAC,WAAW;IAYnB;;OAEG;IACH,UAAU,IAAI,MAAM,GAAG,IAAI;IAI3B;;OAEG;IACH,UAAU,IAAI,QAAQ,EAAE;IAIxB;;OAEG;IACH,eAAe,IAAI,MAAM;CAG1B"}
|