sqlew 3.7.2 → 3.7.4
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/CHANGELOG.md +237 -0
- package/LICENSE +0 -0
- package/README.md +2 -2
- package/assets/config.example.toml +0 -0
- package/assets/kanban-style.png +0 -0
- package/assets/sample-agents/README.md +0 -0
- package/assets/sample-agents/sqlew-architect.md +0 -0
- package/assets/sample-agents/sqlew-researcher.md +0 -0
- package/assets/sample-agents/sqlew-scrum-master.md +0 -0
- package/assets/schema.sql +0 -0
- package/assets/sqlew-logo.png +0 -0
- package/dist/cli/db-export.d.ts +29 -0
- package/dist/cli/db-export.d.ts.map +1 -0
- package/dist/cli/db-export.js +251 -0
- package/dist/cli/db-export.js.map +1 -0
- package/dist/cli/db-import.d.ts +31 -0
- package/dist/cli/db-import.d.ts.map +1 -0
- package/dist/cli/db-import.js +258 -0
- package/dist/cli/db-import.js.map +1 -0
- package/dist/cli.js +24 -2
- package/dist/cli.js.map +1 -1
- package/dist/config/knex/bootstrap/20251025020452_create_master_tables.d.ts.map +1 -1
- package/dist/config/knex/bootstrap/20251025020452_create_master_tables.js +12 -3
- package/dist/config/knex/bootstrap/20251025020452_create_master_tables.js.map +1 -1
- package/dist/config/knex/enhancements/20251106000000_fix_master_tables_project_id_v3_7_3.d.ts +29 -0
- package/dist/config/knex/enhancements/20251106000000_fix_master_tables_project_id_v3_7_3.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251106000000_fix_master_tables_project_id_v3_7_3.js +556 -0
- package/dist/config/knex/enhancements/20251106000000_fix_master_tables_project_id_v3_7_3.js.map +1 -0
- package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.d.ts.map +1 -1
- package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.js +110 -9
- package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.js.map +1 -1
- package/dist/database.d.ts +3 -3
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +30 -12
- package/dist/database.js.map +1 -1
- package/dist/tests/migration-idempotency.test.js +11 -10
- package/dist/tests/migration-idempotency.test.js.map +1 -1
- package/dist/tests/migration-upgrade-paths.test.js +6 -5
- package/dist/tests/migration-upgrade-paths.test.js.map +1 -1
- package/dist/tests/migrations/test-all-versions-real.js +3 -2
- package/dist/tests/migrations/test-all-versions-real.js.map +1 -1
- package/dist/tests/project-detector.test.d.ts +10 -0
- package/dist/tests/project-detector.test.d.ts.map +1 -0
- package/dist/tests/project-detector.test.js +156 -0
- package/dist/tests/project-detector.test.js.map +1 -0
- package/dist/tests/tasks.auto-pruning-partial.test.js +1 -1
- package/dist/tests/tasks.auto-pruning-partial.test.js.map +1 -1
- package/dist/tests/tasks.link-file-backward-compat.test.js +3 -3
- package/dist/tests/tasks.link-file-backward-compat.test.js.map +1 -1
- package/dist/tests/tasks.watch-files-action.test.js +1 -1
- package/dist/tests/tasks.watch-files-action.test.js.map +1 -1
- package/dist/tests/tasks.watch-files-parameter.test.js +2 -2
- package/dist/tests/tasks.watch-files-parameter.test.js.map +1 -1
- package/dist/tools/constraints.js +1 -1
- package/dist/tools/constraints.js.map +1 -1
- package/dist/tools/context.js +2 -2
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/files.js +2 -2
- package/dist/tools/files.js.map +1 -1
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +7 -5
- package/dist/tools/tasks.js.map +1 -1
- package/dist/types.d.ts +121 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/exporter/export.d.ts +100 -0
- package/dist/utils/exporter/export.d.ts.map +1 -0
- package/dist/utils/exporter/export.js +363 -0
- package/dist/utils/exporter/export.js.map +1 -0
- package/dist/utils/importer/import.d.ts +29 -0
- package/dist/utils/importer/import.d.ts.map +1 -0
- package/dist/utils/importer/import.js +514 -0
- package/dist/utils/importer/import.js.map +1 -0
- package/dist/utils/importer/master-tables.d.ts +18 -0
- package/dist/utils/importer/master-tables.d.ts.map +1 -0
- package/dist/utils/importer/master-tables.js +255 -0
- package/dist/utils/importer/master-tables.js.map +1 -0
- package/dist/utils/importer/topological-sort.d.ts +61 -0
- package/dist/utils/importer/topological-sort.d.ts.map +1 -0
- package/dist/utils/importer/topological-sort.js +143 -0
- package/dist/utils/importer/topological-sort.js.map +1 -0
- package/dist/utils/project-detector.d.ts +42 -0
- package/dist/utils/project-detector.d.ts.map +1 -0
- package/dist/utils/project-detector.js +130 -0
- package/dist/utils/project-detector.js.map +1 -0
- package/docs/ACCEPTANCE_CRITERIA.md +0 -0
- package/docs/AI_AGENT_GUIDE.md +0 -0
- package/docs/ARCHITECTURE.md +0 -0
- package/docs/AUTO_FILE_TRACKING.md +0 -1
- package/docs/BEST_PRACTICES.md +0 -0
- package/docs/CONFIGURATION.md +0 -0
- package/docs/DATABASE_AUTH.md +1 -2
- package/docs/DECISION_CONTEXT.md +0 -0
- package/docs/DECISION_TO_TASK_MIGRATION_GUIDE.md +0 -0
- package/docs/GIT_AWARE_AUTO_COMPLETE.md +0 -0
- package/docs/SHARED_CONCEPTS.md +0 -0
- package/docs/SPECIALIZED_AGENTS.md +0 -0
- package/docs/TASK_ACTIONS.md +0 -0
- package/docs/TASK_DEPENDENCIES.md +0 -0
- package/docs/TASK_LINKING.md +0 -0
- package/docs/TASK_MIGRATION.md +0 -0
- package/docs/TASK_OVERVIEW.md +0 -0
- package/docs/TASK_PRUNING.md +0 -0
- package/docs/TASK_SYSTEM.md +0 -0
- package/docs/TOOL_REFERENCE.md +0 -2
- package/docs/TOOL_SELECTION.md +0 -0
- package/docs/WORKFLOWS.md +0 -0
- package/docs/{DATABASE_MIGRATION.md → cli/DATABASE_MIGRATION.md} +71 -32
- package/docs/cli/DATA_EXPORT_IMPORT.md +400 -0
- package/docs/cli/README.md +227 -0
- package/package.json +3 -2
- package/docs/BASEADAPTER_IMPLEMENTATION.md +0 -399
- package/docs/HELP_PREVIEW_COMPARISON.md +0 -259
- package/docs/MIGRATION_CHAIN.md +0 -293
- package/docs/MIGRATION_v2.md +0 -538
- package/docs/MIGRATION_v3.3.md +0 -602
- package/docs/MIGRATION_v3.6.0.md +0 -170
- package/docs/MULTI_PROJECT_ARCHITECTURE.md +0 -497
|
@@ -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
|
package/dist/config/knex/enhancements/20251106000000_fix_master_tables_project_id_v3_7_3.js.map
ADDED
|
@@ -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;
|
|
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"}
|