sqlew 3.7.2 → 3.7.3

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 (45) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/dist/config/knex/bootstrap/20251025020452_create_master_tables.d.ts.map +1 -1
  3. package/dist/config/knex/bootstrap/20251025020452_create_master_tables.js +12 -3
  4. package/dist/config/knex/bootstrap/20251025020452_create_master_tables.js.map +1 -1
  5. package/dist/config/knex/enhancements/20251106000000_fix_master_tables_project_id_v3_7_3.d.ts +29 -0
  6. package/dist/config/knex/enhancements/20251106000000_fix_master_tables_project_id_v3_7_3.d.ts.map +1 -0
  7. package/dist/config/knex/enhancements/20251106000000_fix_master_tables_project_id_v3_7_3.js +556 -0
  8. package/dist/config/knex/enhancements/20251106000000_fix_master_tables_project_id_v3_7_3.js.map +1 -0
  9. package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.d.ts.map +1 -1
  10. package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.js +110 -9
  11. package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.js.map +1 -1
  12. package/dist/database.d.ts +3 -3
  13. package/dist/database.d.ts.map +1 -1
  14. package/dist/database.js +30 -12
  15. package/dist/database.js.map +1 -1
  16. package/dist/tests/migration-idempotency.test.js +11 -10
  17. package/dist/tests/migration-idempotency.test.js.map +1 -1
  18. package/dist/tests/migration-upgrade-paths.test.js +6 -5
  19. package/dist/tests/migration-upgrade-paths.test.js.map +1 -1
  20. package/dist/tests/project-detector.test.d.ts +10 -0
  21. package/dist/tests/project-detector.test.d.ts.map +1 -0
  22. package/dist/tests/project-detector.test.js +156 -0
  23. package/dist/tests/project-detector.test.js.map +1 -0
  24. package/dist/tests/tasks.auto-pruning-partial.test.js +1 -1
  25. package/dist/tests/tasks.auto-pruning-partial.test.js.map +1 -1
  26. package/dist/tests/tasks.link-file-backward-compat.test.js +3 -3
  27. package/dist/tests/tasks.link-file-backward-compat.test.js.map +1 -1
  28. package/dist/tests/tasks.watch-files-action.test.js +1 -1
  29. package/dist/tests/tasks.watch-files-action.test.js.map +1 -1
  30. package/dist/tests/tasks.watch-files-parameter.test.js +2 -2
  31. package/dist/tests/tasks.watch-files-parameter.test.js.map +1 -1
  32. package/dist/tools/constraints.js +1 -1
  33. package/dist/tools/constraints.js.map +1 -1
  34. package/dist/tools/context.js +2 -2
  35. package/dist/tools/context.js.map +1 -1
  36. package/dist/tools/files.js +2 -2
  37. package/dist/tools/files.js.map +1 -1
  38. package/dist/tools/tasks.d.ts.map +1 -1
  39. package/dist/tools/tasks.js +7 -5
  40. package/dist/tools/tasks.js.map +1 -1
  41. package/dist/utils/project-detector.d.ts +42 -0
  42. package/dist/utils/project-detector.d.ts.map +1 -0
  43. package/dist/utils/project-detector.js +130 -0
  44. package/dist/utils/project-detector.js.map +1 -0
  45. package/package.json +1 -1
@@ -0,0 +1,556 @@
1
+ /**
2
+ * Migration: Fix Master Tables project_id (v3.7.3)
3
+ *
4
+ * CRITICAL BUG FIX: v3.7.0-v3.7.2 shipped with incomplete multi-project support.
5
+ * Master tables (m_files, m_tags, m_scopes) lack project_id columns, causing
6
+ * namespace collisions where "src/index.ts" from ProjectA conflicts with ProjectB.
7
+ *
8
+ * This migration:
9
+ * 1. Detects and renames fake project names ('default-project' → real name)
10
+ * 2. Adds project_id to m_files, m_tags, m_scopes
11
+ * 3. Changes UNIQUE constraints from single-column to composite (project_id, path/name)
12
+ * 4. Maps all existing data to default project (ID 1)
13
+ *
14
+ * Idempotent: Can run multiple times safely (checks hasColumn before altering)
15
+ *
16
+ * Rollback: down() reverts to v3.7.2 schema (removes project_id, restores single-column UNIQUE)
17
+ *
18
+ * Satisfies: v3.7.3 fix for namespace collision bug
19
+ */
20
+ import { detectProjectNameSync } from '../../../utils/project-detector.js';
21
+ /**
22
+ * Helper function to batch insert large datasets (prevents massive SQL queries)
23
+ * Uses smaller batches to avoid SQLite UNION ALL limits and FK issues
24
+ */
25
+ async function batchInsert(knex, tableName, data) {
26
+ if (data.length === 0)
27
+ return;
28
+ const batchSize = 10; // Smaller batches for better SQLite compatibility
29
+ for (let i = 0; i < data.length; i += batchSize) {
30
+ const batch = data.slice(i, i + batchSize);
31
+ await knex(tableName).insert(batch);
32
+ }
33
+ }
34
+ export async function up(knex) {
35
+ console.log('🔧 Starting v3.7.3 master tables project_id fix...');
36
+ // ============================================================================
37
+ // STEP 1: Data Consolidation (Consolidate project #2 into #1)
38
+ // ============================================================================
39
+ const hasProjectsTable = await knex.schema.hasTable('m_projects');
40
+ if (hasProjectsTable) {
41
+ const projectRoot = process.cwd();
42
+ const detected = detectProjectNameSync(projectRoot);
43
+ const existingProject1 = await knex('m_projects')
44
+ .where({ id: 1 })
45
+ .first();
46
+ const existingProject2 = await knex('m_projects')
47
+ .where({ id: 2 })
48
+ .first();
49
+ const FAKE_NAMES = ['default-project', 'default'];
50
+ // Check if this is a v3.7.0-v3.7.2 database needing consolidation
51
+ // This ONLY happens if:
52
+ // 1. User upgraded to v3.7.0-v3.7.2 (which created fake project #1)
53
+ // 2. User manually created project #2 with real name
54
+ // 3. Now upgrading to v3.7.3 to fix the issue
55
+ const isV370UpgradeScenario = existingProject1 &&
56
+ existingProject2 &&
57
+ FAKE_NAMES.includes(existingProject1.name);
58
+ // Perform consolidation ONLY for v3.7.0-v3.7.2 upgrades
59
+ if (isV370UpgradeScenario) {
60
+ console.log(`🔄 Detected v3.7.0-v3.7.2 database - consolidating projects...`);
61
+ console.log(` Project #1: "${existingProject1.name}" (fake name, empty)`);
62
+ console.log(` Project #2: "${existingProject2.name}" (real project, has data)`);
63
+ console.log(`🔄 Consolidating project #2 into project #1...`);
64
+ // STEP 1: Temporarily rename project #2 to avoid conflict
65
+ const tempName = `temp-${existingProject2.name}-${Date.now()}`;
66
+ await knex('m_projects')
67
+ .where({ id: 2 })
68
+ .update({ name: tempName });
69
+ console.log(` ✓ Temporarily renamed project #2 to "${tempName}"`);
70
+ // STEP 2: Rename project #1 to real detected name
71
+ await knex('m_projects')
72
+ .where({ id: 1 })
73
+ .update({
74
+ name: detected.name,
75
+ display_name: detected.name,
76
+ detection_source: detected.source,
77
+ last_active_ts: Math.floor(Date.now() / 1000)
78
+ });
79
+ console.log(` ✓ Renamed project #1 from "${existingProject1.name}" to "${detected.name}"`);
80
+ // STEP 3: Migrate ALL data from project_id=2 → 1
81
+ const tablesToUpdate = [
82
+ 't_decisions',
83
+ 't_decisions_numeric',
84
+ 't_decision_history',
85
+ 't_decision_tags',
86
+ 't_decision_scopes',
87
+ 't_file_changes',
88
+ 't_constraints',
89
+ 't_tasks',
90
+ 't_task_tags',
91
+ 't_task_dependencies',
92
+ 't_task_details',
93
+ 't_task_file_links',
94
+ 't_task_decision_links',
95
+ 't_activity_log',
96
+ 't_decision_context'
97
+ ];
98
+ for (const tableName of tablesToUpdate) {
99
+ const hasTable = await knex.schema.hasTable(tableName);
100
+ if (hasTable) {
101
+ const hasProjectId = await knex.schema.hasColumn(tableName, 'project_id');
102
+ if (hasProjectId) {
103
+ const count = await knex(tableName)
104
+ .where({ project_id: 2 })
105
+ .update({ project_id: 1 });
106
+ if (count > 0) {
107
+ console.log(` ✓ Migrated ${count} rows in ${tableName} (project_id: 2→1)`);
108
+ }
109
+ }
110
+ }
111
+ }
112
+ // STEP 4: Delete project #2
113
+ await knex('m_projects').where({ id: 2 }).delete();
114
+ console.log(` ✓ Deleted project #2 (data consolidated into project #1)`);
115
+ console.log(`✅ Consolidation complete - all data now in project #1 "${detected.name}"`);
116
+ }
117
+ else if (existingProject1 && FAKE_NAMES.includes(existingProject1.name)) {
118
+ // No project #2, just rename project #1
119
+ console.log(`🔄 Renaming project #1 from "${existingProject1.name}" to "${detected.name}"`);
120
+ await knex('m_projects')
121
+ .where({ id: 1 })
122
+ .update({
123
+ name: detected.name,
124
+ display_name: detected.name,
125
+ detection_source: detected.source,
126
+ last_active_ts: Math.floor(Date.now() / 1000)
127
+ });
128
+ console.log(`✓ Project #1 renamed to "${detected.name}" (source: ${detected.source})`);
129
+ }
130
+ else if (existingProject1) {
131
+ // User already has real name, don't change it
132
+ console.log(`✓ Project #1 already has real name: "${existingProject1.name}"`);
133
+ }
134
+ }
135
+ // ============================================================================
136
+ // STEP 2: Check if Already Migrated (Idempotency)
137
+ // ============================================================================
138
+ const hasProjectIdInFiles = await knex.schema.hasColumn('m_files', 'project_id');
139
+ const hasProjectIdInTags = await knex.schema.hasColumn('m_tags', 'project_id');
140
+ const hasProjectIdInScopes = await knex.schema.hasColumn('m_scopes', 'project_id');
141
+ if (hasProjectIdInFiles && hasProjectIdInTags && hasProjectIdInScopes) {
142
+ console.log('✓ Master tables already have project_id columns (migration previously applied)');
143
+ return;
144
+ }
145
+ // ============================================================================
146
+ // STEP 3: Determine Default Project ID (Always 1 after consolidation)
147
+ // ============================================================================
148
+ // After consolidation, all data is in project ID 1
149
+ const defaultProjectId = 1;
150
+ console.log(`📌 Default project_id for master tables: ${defaultProjectId}`);
151
+ // ============================================================================
152
+ // STEP 4: Disable Foreign Key Constraints (SQLite only)
153
+ // ============================================================================
154
+ const isSQLite = knex.client.config.client === 'better-sqlite3' || knex.client.config.client === 'sqlite3';
155
+ if (isSQLite) {
156
+ // For better-sqlite3, we need to actually disable foreign keys at connection level
157
+ await knex.raw('PRAGMA foreign_keys = OFF');
158
+ // First, drop views that depend on tables we're modifying
159
+ const viewsToRestore = [
160
+ 'v_layer_summary',
161
+ 'v_recent_file_changes',
162
+ 'v_task_board',
163
+ 'v_tagged_decisions',
164
+ 'v_tagged_constraints',
165
+ ];
166
+ const viewDefinitions = {};
167
+ for (const viewName of viewsToRestore) {
168
+ const viewInfo = await knex.raw(`SELECT sql FROM sqlite_master WHERE type='view' AND name=?`, [viewName]);
169
+ if (viewInfo.length > 0 && viewInfo[0].sql) {
170
+ viewDefinitions[viewName] = viewInfo[0].sql;
171
+ await knex.raw(`DROP VIEW IF EXISTS ${viewName}`);
172
+ console.log(` ✓ Temporarily dropped view ${viewName}`);
173
+ }
174
+ }
175
+ // Store view definitions for later restoration
176
+ knex.__viewDefinitions = viewDefinitions;
177
+ // Now drop tables that reference master tables
178
+ const referencingTables = [
179
+ 't_file_changes', // References m_files
180
+ 't_task_file_links', // References m_files
181
+ 't_pruned_files', // References m_files (if exists)
182
+ 't_decision_tags', // References m_tags
183
+ 't_task_tags', // References m_tags
184
+ 't_constraint_tags', // References m_tags
185
+ 't_decision_scopes', // References m_scopes
186
+ ];
187
+ const backupData = {};
188
+ for (const tableName of referencingTables) {
189
+ const hasTable = await knex.schema.hasTable(tableName);
190
+ if (hasTable) {
191
+ // Backup data
192
+ const data = await knex(tableName).select('*');
193
+ backupData[tableName] = data;
194
+ // Drop table
195
+ await knex.schema.dropTable(tableName);
196
+ console.log(` ✓ Temporarily dropped ${tableName} (${data.length} rows backed up)`);
197
+ }
198
+ }
199
+ // Store backup data for later restoration
200
+ knex.__masterTableBackup = backupData;
201
+ console.log('✓ Disabled foreign key constraints, backed up views and referencing tables');
202
+ }
203
+ // ============================================================================
204
+ // STEP 5: Fix m_files Table
205
+ // ============================================================================
206
+ if (!hasProjectIdInFiles) {
207
+ console.log('🔧 Fixing m_files table...');
208
+ // Backup existing data
209
+ const filesData = await knex('m_files').select('*');
210
+ console.log(` Backed up ${filesData.length} rows from m_files`);
211
+ // Drop old table
212
+ await knex.schema.dropTableIfExists('m_files');
213
+ console.log(' Dropped old m_files table');
214
+ // Recreate with project_id
215
+ const isMySQL = knex.client.config.client === 'mysql2';
216
+ const pathLength = isMySQL ? 768 : 1000;
217
+ await knex.schema.createTable('m_files', (table) => {
218
+ table.increments('id').primary();
219
+ table.integer('project_id').unsigned().notNullable().defaultTo(defaultProjectId);
220
+ table.string('path', pathLength).notNullable();
221
+ table.unique(['project_id', 'path']); // Composite UNIQUE
222
+ });
223
+ console.log(' Created new m_files table with project_id');
224
+ // Restore data with project_id (add foreign key later)
225
+ if (filesData.length > 0) {
226
+ const restoreData = filesData.map(row => ({
227
+ id: row.id,
228
+ project_id: defaultProjectId,
229
+ path: row.path,
230
+ }));
231
+ await knex('m_files').insert(restoreData);
232
+ console.log(` Restored ${restoreData.length} rows with project_id = ${defaultProjectId}`);
233
+ }
234
+ console.log('✓ m_files table fixed');
235
+ }
236
+ // ============================================================================
237
+ // STEP 6: Fix m_tags Table
238
+ // ============================================================================
239
+ if (!hasProjectIdInTags) {
240
+ console.log('🔧 Fixing m_tags table...');
241
+ // Backup existing data
242
+ const tagsData = await knex('m_tags').select('*');
243
+ console.log(` Backed up ${tagsData.length} rows from m_tags`);
244
+ // Drop old table
245
+ await knex.schema.dropTableIfExists('m_tags');
246
+ console.log(' Dropped old m_tags table');
247
+ // Recreate with project_id
248
+ await knex.schema.createTable('m_tags', (table) => {
249
+ table.increments('id').primary();
250
+ table.integer('project_id').unsigned().notNullable().defaultTo(defaultProjectId);
251
+ table.string('name', 100).notNullable();
252
+ table.unique(['project_id', 'name']); // Composite UNIQUE
253
+ });
254
+ console.log(' Created new m_tags table with project_id');
255
+ // Restore data with project_id (add foreign key later)
256
+ if (tagsData.length > 0) {
257
+ const restoreData = tagsData.map(row => ({
258
+ id: row.id,
259
+ project_id: defaultProjectId,
260
+ name: row.name,
261
+ }));
262
+ await knex('m_tags').insert(restoreData);
263
+ console.log(` Restored ${restoreData.length} rows with project_id = ${defaultProjectId}`);
264
+ }
265
+ console.log('✓ m_tags table fixed');
266
+ }
267
+ // ============================================================================
268
+ // STEP 7: Fix m_scopes Table
269
+ // ============================================================================
270
+ if (!hasProjectIdInScopes) {
271
+ console.log('🔧 Fixing m_scopes table...');
272
+ // Backup existing data
273
+ const scopesData = await knex('m_scopes').select('*');
274
+ console.log(` Backed up ${scopesData.length} rows from m_scopes`);
275
+ // Drop old table
276
+ await knex.schema.dropTableIfExists('m_scopes');
277
+ console.log(' Dropped old m_scopes table');
278
+ // Recreate with project_id
279
+ await knex.schema.createTable('m_scopes', (table) => {
280
+ table.increments('id').primary();
281
+ table.integer('project_id').unsigned().notNullable().defaultTo(defaultProjectId);
282
+ table.string('name', 200).notNullable();
283
+ table.unique(['project_id', 'name']); // Composite UNIQUE
284
+ });
285
+ console.log(' Created new m_scopes table with project_id');
286
+ // Restore data with project_id (add foreign key later)
287
+ if (scopesData.length > 0) {
288
+ const restoreData = scopesData.map(row => ({
289
+ id: row.id,
290
+ project_id: defaultProjectId,
291
+ name: row.name,
292
+ }));
293
+ await knex('m_scopes').insert(restoreData);
294
+ console.log(` Restored ${restoreData.length} rows with project_id = ${defaultProjectId}`);
295
+ }
296
+ console.log('✓ m_scopes table fixed');
297
+ }
298
+ // ============================================================================
299
+ // STEP 7.5: Restore Referencing Tables (SQLite only)
300
+ // ============================================================================
301
+ if (isSQLite && knex.__masterTableBackup) {
302
+ console.log('🔄 Restoring referencing tables with updated foreign keys...');
303
+ const backupData = knex.__masterTableBackup;
304
+ // Restore t_file_changes
305
+ if (backupData['t_file_changes']) {
306
+ await knex.schema.createTable('t_file_changes', (table) => {
307
+ table.increments('id').primary();
308
+ table.integer('project_id').unsigned().notNullable();
309
+ table.integer('file_id').unsigned().notNullable();
310
+ table.integer('change_type').notNullable(); // 1=created, 2=modified, 3=deleted
311
+ table.integer('agent_id').unsigned();
312
+ table.integer('layer_id').unsigned();
313
+ table.text('description');
314
+ table.integer('ts').notNullable();
315
+ table.foreign('file_id').references('m_files.id');
316
+ table.foreign('agent_id').references('m_agents.id');
317
+ table.foreign('layer_id').references('m_layers.id');
318
+ table.foreign('project_id').references('m_projects.id');
319
+ });
320
+ await batchInsert(knex, 't_file_changes', backupData['t_file_changes']);
321
+ console.log(` ✓ Restored t_file_changes (${backupData['t_file_changes'].length} rows)`);
322
+ }
323
+ // Restore t_task_file_links
324
+ if (backupData['t_task_file_links']) {
325
+ await knex.schema.createTable('t_task_file_links', (table) => {
326
+ table.increments('id').primary();
327
+ table.integer('task_id').unsigned().notNullable();
328
+ table.integer('file_id').unsigned().notNullable();
329
+ table.integer('project_id').unsigned().notNullable();
330
+ table.integer('linked_ts').notNullable();
331
+ table.foreign('file_id').references('m_files.id');
332
+ table.foreign('task_id').references('t_tasks.id');
333
+ table.foreign('project_id').references('m_projects.id');
334
+ });
335
+ await batchInsert(knex, 't_task_file_links', backupData['t_task_file_links']);
336
+ console.log(` ✓ Restored t_task_file_links (${backupData['t_task_file_links'].length} rows)`);
337
+ }
338
+ // Restore t_decision_tags
339
+ if (backupData['t_decision_tags']) {
340
+ await knex.schema.createTable('t_decision_tags', (table) => {
341
+ table.integer('decision_key_id').unsigned().notNullable();
342
+ table.integer('project_id').unsigned().notNullable();
343
+ table.integer('tag_id').unsigned().notNullable();
344
+ table.primary(['decision_key_id', 'project_id', 'tag_id']);
345
+ table.foreign('tag_id').references('m_tags.id');
346
+ });
347
+ await batchInsert(knex, 't_decision_tags', backupData['t_decision_tags']);
348
+ console.log(` ✓ Restored t_decision_tags (${backupData['t_decision_tags'].length} rows)`);
349
+ }
350
+ // Restore t_task_tags (filter out orphaned FK references)
351
+ if (backupData['t_task_tags']) {
352
+ // Get valid IDs to filter orphaned references
353
+ const validTagIds = new Set((await knex('m_tags').select('id')).map((row) => row.id));
354
+ const validTaskIds = new Set((await knex('t_tasks').select('id')).map((row) => row.id));
355
+ const filteredTaskTags = backupData['t_task_tags'].filter((row) => validTagIds.has(row.tag_id) && validTaskIds.has(row.task_id));
356
+ const orphanedCount = backupData['t_task_tags'].length - filteredTaskTags.length;
357
+ if (orphanedCount > 0) {
358
+ console.log(` ⚠️ Filtered ${orphanedCount} orphaned FK references in t_task_tags`);
359
+ }
360
+ await knex.schema.createTable('t_task_tags', (table) => {
361
+ table.integer('project_id').unsigned().notNullable();
362
+ table.integer('task_id').unsigned().notNullable();
363
+ table.integer('tag_id').unsigned().notNullable();
364
+ table.primary(['project_id', 'task_id', 'tag_id']);
365
+ table.foreign('tag_id').references('m_tags.id');
366
+ table.foreign('task_id').references('t_tasks.id');
367
+ });
368
+ await batchInsert(knex, 't_task_tags', filteredTaskTags);
369
+ console.log(` ✓ Restored t_task_tags (${filteredTaskTags.length} rows)`);
370
+ }
371
+ // Restore t_decision_scopes
372
+ if (backupData['t_decision_scopes']) {
373
+ await knex.schema.createTable('t_decision_scopes', (table) => {
374
+ table.integer('decision_key_id').unsigned().notNullable();
375
+ table.integer('project_id').unsigned().notNullable();
376
+ table.integer('scope_id').unsigned().notNullable();
377
+ table.primary(['decision_key_id', 'project_id', 'scope_id']);
378
+ table.foreign('scope_id').references('m_scopes.id');
379
+ });
380
+ await batchInsert(knex, 't_decision_scopes', backupData['t_decision_scopes']);
381
+ console.log(` ✓ Restored t_decision_scopes (${backupData['t_decision_scopes'].length} rows)`);
382
+ }
383
+ // Restore t_constraint_tags
384
+ if (backupData['t_constraint_tags']) {
385
+ await knex.schema.createTable('t_constraint_tags', (table) => {
386
+ table.integer('constraint_id').unsigned().notNullable();
387
+ table.integer('tag_id').unsigned().notNullable();
388
+ table.primary(['constraint_id', 'tag_id']);
389
+ table.foreign('constraint_id').references('t_constraints.id');
390
+ table.foreign('tag_id').references('m_tags.id');
391
+ });
392
+ await batchInsert(knex, 't_constraint_tags', backupData['t_constraint_tags']);
393
+ console.log(` ✓ Restored t_constraint_tags (${backupData['t_constraint_tags'].length} rows)`);
394
+ }
395
+ // Restore t_pruned_files if it existed
396
+ if (backupData['t_pruned_files']) {
397
+ await knex.schema.createTable('t_pruned_files', (table) => {
398
+ table.increments('id').primary();
399
+ table.integer('task_id').unsigned().notNullable();
400
+ table.string('file_path', 1000).notNullable();
401
+ table.integer('pruned_ts').notNullable();
402
+ table.foreign('task_id').references('t_tasks.id');
403
+ });
404
+ await batchInsert(knex, 't_pruned_files', backupData['t_pruned_files']);
405
+ console.log(` ✓ Restored t_pruned_files (${backupData['t_pruned_files'].length} rows)`);
406
+ }
407
+ console.log('✅ All referencing tables restored with updated foreign keys');
408
+ // Restore views
409
+ const viewDefinitions = knex.__viewDefinitions;
410
+ if (viewDefinitions && Object.keys(viewDefinitions).length > 0) {
411
+ console.log('🔄 Restoring views...');
412
+ for (const [viewName, viewSql] of Object.entries(viewDefinitions)) {
413
+ await knex.raw(viewSql);
414
+ console.log(` ✓ Restored view ${viewName}`);
415
+ }
416
+ console.log('✅ All views restored');
417
+ }
418
+ }
419
+ // ============================================================================
420
+ // STEP 7.6: Add Foreign Keys to Master Tables (after all data restored)
421
+ // ============================================================================
422
+ //
423
+ // NOTE: For SQLite, foreign keys must be defined during table creation.
424
+ // We already created master tables without FK constraints (to avoid FK errors
425
+ // during data restoration). Adding them post-creation via ALTER TABLE would
426
+ // require recreating tables, which would cascade-delete referencing table data.
427
+ //
428
+ // Since data is already restored and validated, we skip FK addition for SQLite.
429
+ // For MySQL/PostgreSQL, FK constraints can be added via ALTER TABLE safely.
430
+ if (hasProjectsTable && !isSQLite) {
431
+ console.log('🔧 Adding foreign key constraints to master tables...');
432
+ // Add foreign key to m_files
433
+ if (!hasProjectIdInFiles) {
434
+ try {
435
+ await knex.schema.alterTable('m_files', (table) => {
436
+ table.foreign('project_id').references('id').inTable('m_projects').onDelete('CASCADE');
437
+ });
438
+ console.log(' ✓ Added foreign key: m_files.project_id → m_projects.id');
439
+ }
440
+ catch (error) {
441
+ if (!error.message.includes('already exists')) {
442
+ throw error;
443
+ }
444
+ console.log(' ✓ Foreign key already exists on m_files');
445
+ }
446
+ }
447
+ // Add foreign key to m_tags
448
+ if (!hasProjectIdInTags) {
449
+ try {
450
+ await knex.schema.alterTable('m_tags', (table) => {
451
+ table.foreign('project_id').references('id').inTable('m_projects').onDelete('CASCADE');
452
+ });
453
+ console.log(' ✓ Added foreign key: m_tags.project_id → m_projects.id');
454
+ }
455
+ catch (error) {
456
+ if (!error.message.includes('already exists')) {
457
+ throw error;
458
+ }
459
+ console.log(' ✓ Foreign key already exists on m_tags');
460
+ }
461
+ }
462
+ // Add foreign key to m_scopes
463
+ if (!hasProjectIdInScopes) {
464
+ try {
465
+ await knex.schema.alterTable('m_scopes', (table) => {
466
+ table.foreign('project_id').references('id').inTable('m_projects').onDelete('CASCADE');
467
+ });
468
+ console.log(' ✓ Added foreign key: m_scopes.project_id → m_projects.id');
469
+ }
470
+ catch (error) {
471
+ if (!error.message.includes('already exists')) {
472
+ throw error;
473
+ }
474
+ console.log(' ✓ Foreign key already exists on m_scopes');
475
+ }
476
+ }
477
+ console.log('✅ All foreign key constraints added');
478
+ }
479
+ else if (isSQLite) {
480
+ console.log('✓ Skipped FK constraints for SQLite (defined during table creation)');
481
+ }
482
+ // ============================================================================
483
+ // STEP 8: Re-enable Foreign Key Constraints (SQLite only)
484
+ // ============================================================================
485
+ if (isSQLite) {
486
+ await knex.raw('PRAGMA foreign_keys = ON');
487
+ console.log('✓ Re-enabled foreign key constraints');
488
+ }
489
+ console.log('✅ v3.7.3 master tables project_id fix completed successfully');
490
+ }
491
+ /**
492
+ * Rollback: Revert master tables to v3.7.2 schema
493
+ *
494
+ * WARNING: This will remove project_id columns and restore single-column UNIQUE constraints.
495
+ * Data from all projects will be merged (potential conflicts if same path/name exists).
496
+ */
497
+ export async function down(knex) {
498
+ console.log('⚠️ Rolling back v3.7.3 master tables fix...');
499
+ // Check if already rolled back
500
+ const hasProjectIdInFiles = await knex.schema.hasColumn('m_files', 'project_id');
501
+ if (!hasProjectIdInFiles) {
502
+ console.log('✓ Already rolled back (no project_id columns found)');
503
+ return;
504
+ }
505
+ const isSQLite = knex.client.config.client === 'better-sqlite3' || knex.client.config.client === 'sqlite3';
506
+ if (isSQLite) {
507
+ await knex.raw('PRAGMA foreign_keys = OFF');
508
+ }
509
+ // Rollback m_files
510
+ console.log('🔧 Rolling back m_files...');
511
+ const filesData = await knex('m_files').select('id', 'path');
512
+ await knex.schema.dropTableIfExists('m_files');
513
+ const isMySQL = knex.client.config.client === 'mysql2';
514
+ const pathLength = isMySQL ? 768 : 1000;
515
+ await knex.schema.createTable('m_files', (table) => {
516
+ table.increments('id').primary();
517
+ table.string('path', pathLength).unique().notNullable();
518
+ });
519
+ if (filesData.length > 0) {
520
+ // Remove duplicates (keep first occurrence)
521
+ const uniqueFiles = Array.from(new Map(filesData.map(f => [f.path, f])).values());
522
+ await knex('m_files').insert(uniqueFiles);
523
+ console.log(` Restored ${uniqueFiles.length} unique files (removed ${filesData.length - uniqueFiles.length} duplicates)`);
524
+ }
525
+ // Rollback m_tags
526
+ console.log('🔧 Rolling back m_tags...');
527
+ const tagsData = await knex('m_tags').select('id', 'name');
528
+ await knex.schema.dropTableIfExists('m_tags');
529
+ await knex.schema.createTable('m_tags', (table) => {
530
+ table.increments('id').primary();
531
+ table.string('name', 100).unique().notNullable();
532
+ });
533
+ if (tagsData.length > 0) {
534
+ const uniqueTags = Array.from(new Map(tagsData.map(t => [t.name, t])).values());
535
+ await knex('m_tags').insert(uniqueTags);
536
+ console.log(` Restored ${uniqueTags.length} unique tags (removed ${tagsData.length - uniqueTags.length} duplicates)`);
537
+ }
538
+ // Rollback m_scopes
539
+ console.log('🔧 Rolling back m_scopes...');
540
+ const scopesData = await knex('m_scopes').select('id', 'name');
541
+ await knex.schema.dropTableIfExists('m_scopes');
542
+ await knex.schema.createTable('m_scopes', (table) => {
543
+ table.increments('id').primary();
544
+ table.string('name', 200).unique().notNullable();
545
+ });
546
+ if (scopesData.length > 0) {
547
+ const uniqueScopes = Array.from(new Map(scopesData.map(s => [s.name, s])).values());
548
+ await knex('m_scopes').insert(uniqueScopes);
549
+ console.log(` Restored ${uniqueScopes.length} unique scopes (removed ${scopesData.length - uniqueScopes.length} duplicates)`);
550
+ }
551
+ if (isSQLite) {
552
+ await knex.raw('PRAGMA foreign_keys = ON');
553
+ }
554
+ console.log('✅ Rollback completed (reverted to v3.7.2 schema)');
555
+ }
556
+ //# sourceMappingURL=20251106000000_fix_master_tables_project_id_v3_7_3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"20251106000000_fix_master_tables_project_id_v3_7_3.js","sourceRoot":"","sources":["../../../../src/config/knex/enhancements/20251106000000_fix_master_tables_project_id_v3_7_3.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"20251104000000_add_multi_project_v3_7_0.d.ts","sourceRoot":"","sources":["../../../../src/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,wBAAsB,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA6uBlD;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAoOpD"}
1
+ {"version":3,"file":"20251104000000_add_multi_project_v3_7_0.d.ts","sourceRoot":"","sources":["../../../../src/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,wBAAsB,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA61BlD;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAoOpD"}