@schnick371/devsteps-shared 0.7.0-next.3 → 0.8.1-next.1
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/core/add.d.ts +2 -3
- package/dist/core/add.d.ts.map +1 -1
- package/dist/core/add.js +58 -37
- package/dist/core/add.js.map +1 -1
- package/dist/core/archive.d.ts.map +1 -1
- package/dist/core/archive.js +35 -25
- package/dist/core/archive.js.map +1 -1
- package/dist/core/auto-migrate.d.ts +154 -0
- package/dist/core/auto-migrate.d.ts.map +1 -0
- package/dist/core/auto-migrate.js +383 -0
- package/dist/core/auto-migrate.js.map +1 -0
- package/dist/core/auto-migrate.test.d.ts +7 -0
- package/dist/core/auto-migrate.test.d.ts.map +1 -0
- package/dist/core/auto-migrate.test.js +364 -0
- package/dist/core/auto-migrate.test.js.map +1 -0
- package/dist/core/index-rebuild.d.ts +75 -0
- package/dist/core/index-rebuild.d.ts.map +1 -0
- package/dist/core/index-rebuild.js +260 -0
- package/dist/core/index-rebuild.js.map +1 -0
- package/dist/core/index-rebuild.test.d.ts +8 -0
- package/dist/core/index-rebuild.test.d.ts.map +1 -0
- package/dist/core/index-rebuild.test.js +582 -0
- package/dist/core/index-rebuild.test.js.map +1 -0
- package/dist/core/index-refs.d.ts +155 -0
- package/dist/core/index-refs.d.ts.map +1 -0
- package/dist/core/index-refs.js +442 -0
- package/dist/core/index-refs.js.map +1 -0
- package/dist/core/index-refs.test.d.ts +7 -0
- package/dist/core/index-refs.test.d.ts.map +1 -0
- package/dist/core/index-refs.test.js +367 -0
- package/dist/core/index-refs.test.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/list.d.ts +2 -3
- package/dist/core/list.d.ts.map +1 -1
- package/dist/core/list.js +67 -12
- package/dist/core/list.js.map +1 -1
- package/dist/core/update.d.ts +1 -2
- package/dist/core/update.d.ts.map +1 -1
- package/dist/core/update.js +30 -21
- package/dist/core/update.js.map +1 -1
- package/dist/migration/fix-missing-eisenhower.d.ts +8 -0
- package/dist/migration/fix-missing-eisenhower.d.ts.map +1 -0
- package/dist/migration/fix-missing-eisenhower.js +58 -0
- package/dist/migration/fix-missing-eisenhower.js.map +1 -0
- package/dist/migration/remove-priority-field.d.ts +15 -0
- package/dist/migration/remove-priority-field.d.ts.map +1 -0
- package/dist/migration/remove-priority-field.js +113 -0
- package/dist/migration/remove-priority-field.js.map +1 -0
- package/dist/schemas/index-refs.schema.d.ts +103 -0
- package/dist/schemas/index-refs.schema.d.ts.map +1 -0
- package/dist/schemas/index-refs.schema.js +88 -0
- package/dist/schemas/index-refs.schema.js.map +1 -0
- package/dist/schemas/index.d.ts +7 -22
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +3 -7
- package/dist/schemas/index.js.map +1 -1
- package/dist/types/commands.d.ts +2 -5
- package/dist/types/commands.d.ts.map +1 -1
- package/dist/types/index-refs.types.d.ts +123 -0
- package/dist/types/index-refs.types.d.ts.map +1 -0
- package/dist/types/index-refs.types.js +71 -0
- package/dist/types/index-refs.types.js.map +1 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +26 -8
- package/dist/utils/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Migration Module
|
|
3
|
+
*
|
|
4
|
+
* Provides auto-detection and migration for external DevSteps projects.
|
|
5
|
+
* Safely migrates from legacy index.json to refs-style distributed index.
|
|
6
|
+
*
|
|
7
|
+
* Safe to call repeatedly - only migrates once.
|
|
8
|
+
*
|
|
9
|
+
* @see STORY-073 External Project Migration Auto-Detection
|
|
10
|
+
* @see EPIC-018 Index Architecture Refactoring
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync, readdirSync, rmdirSync } from 'node:fs';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { hasLegacyIndex, hasRefsStyleIndex, loadLegacyIndex, initializeRefsStyleIndex, addItemToIndex, loadAllIndexes, getIndexPaths, } from './index-refs.js';
|
|
15
|
+
/**
|
|
16
|
+
* Helper: Get type folder name
|
|
17
|
+
*/
|
|
18
|
+
function getTypeFolder(type) {
|
|
19
|
+
const map = {
|
|
20
|
+
epic: 'epics',
|
|
21
|
+
story: 'stories',
|
|
22
|
+
task: 'tasks',
|
|
23
|
+
bug: 'bugs',
|
|
24
|
+
spike: 'spikes',
|
|
25
|
+
test: 'tests',
|
|
26
|
+
feature: 'features',
|
|
27
|
+
requirement: 'requirements',
|
|
28
|
+
};
|
|
29
|
+
return map[type] || 'tasks';
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Check if migration is needed
|
|
33
|
+
*
|
|
34
|
+
* Migration is needed when:
|
|
35
|
+
* - Legacy index.json exists
|
|
36
|
+
* - Refs-style index/ doesn't exist
|
|
37
|
+
*
|
|
38
|
+
* @param devstepsDir Path to .devsteps directory
|
|
39
|
+
* @returns Migration check result with details
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* const result = checkMigrationNeeded('/path/to/.devsteps');
|
|
44
|
+
* if (result.needed) {
|
|
45
|
+
* console.log(result.message);
|
|
46
|
+
* await ensureIndexMigrated('/path/to/.devsteps');
|
|
47
|
+
* }
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export function checkMigrationNeeded(devstepsDir) {
|
|
51
|
+
if (!existsSync(devstepsDir)) {
|
|
52
|
+
return {
|
|
53
|
+
needed: false,
|
|
54
|
+
hasLegacy: false,
|
|
55
|
+
hasRefs: false,
|
|
56
|
+
message: 'Not a DevSteps project (no .devsteps directory)',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const hasLegacy = hasLegacyIndex(devstepsDir);
|
|
60
|
+
const hasRefs = hasRefsStyleIndex(devstepsDir);
|
|
61
|
+
// Already migrated
|
|
62
|
+
if (!hasLegacy && hasRefs) {
|
|
63
|
+
return {
|
|
64
|
+
needed: false,
|
|
65
|
+
hasLegacy: false,
|
|
66
|
+
hasRefs: true,
|
|
67
|
+
message: 'Project already using refs-style index ✓',
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// Both exist - error state (migration partially completed?)
|
|
71
|
+
if (hasLegacy && hasRefs) {
|
|
72
|
+
return {
|
|
73
|
+
needed: false,
|
|
74
|
+
hasLegacy: true,
|
|
75
|
+
hasRefs: true,
|
|
76
|
+
message: 'Both index formats exist - manual intervention required',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
// No index at all - new project
|
|
80
|
+
if (!hasLegacy && !hasRefs) {
|
|
81
|
+
return {
|
|
82
|
+
needed: false,
|
|
83
|
+
hasLegacy: false,
|
|
84
|
+
hasRefs: false,
|
|
85
|
+
message: 'No index found - new project or not initialized',
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// Migration needed
|
|
89
|
+
let itemCount;
|
|
90
|
+
try {
|
|
91
|
+
const legacy = loadLegacyIndex(devstepsDir);
|
|
92
|
+
itemCount = legacy.items.length;
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
// Ignore - legacy index might be corrupted
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
needed: true,
|
|
99
|
+
hasLegacy: true,
|
|
100
|
+
hasRefs: false,
|
|
101
|
+
itemCount,
|
|
102
|
+
message: `Migration needed: ${itemCount ?? 'unknown'} items to migrate`,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Perform index migration (internal implementation)
|
|
107
|
+
*
|
|
108
|
+
* This is the core migration logic without console output.
|
|
109
|
+
* Use ensureIndexMigrated() for auto-migration with user feedback.
|
|
110
|
+
*
|
|
111
|
+
* @param devstepsDir Path to .devsteps directory
|
|
112
|
+
* @param options Migration options
|
|
113
|
+
* @returns Migration statistics
|
|
114
|
+
* @throws Error if migration fails or preconditions not met
|
|
115
|
+
* @internal
|
|
116
|
+
*/
|
|
117
|
+
export async function performMigration(devstepsDir, options = {}) {
|
|
118
|
+
const { skipBackup = false } = options;
|
|
119
|
+
const paths = getIndexPaths(devstepsDir);
|
|
120
|
+
// Pre-flight checks
|
|
121
|
+
if (!existsSync(devstepsDir)) {
|
|
122
|
+
throw new Error('.devsteps directory not found. Is this a DevSteps project?');
|
|
123
|
+
}
|
|
124
|
+
if (!hasLegacyIndex(devstepsDir)) {
|
|
125
|
+
throw new Error('No index.json found. Nothing to migrate.');
|
|
126
|
+
}
|
|
127
|
+
if (hasRefsStyleIndex(devstepsDir)) {
|
|
128
|
+
throw new Error('Refs-style index already exists. Aborting to prevent data loss.');
|
|
129
|
+
}
|
|
130
|
+
const stats = {
|
|
131
|
+
totalItems: 0,
|
|
132
|
+
byType: {},
|
|
133
|
+
byStatus: {},
|
|
134
|
+
byPriority: {},
|
|
135
|
+
};
|
|
136
|
+
// Backup old index
|
|
137
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
138
|
+
if (!skipBackup) {
|
|
139
|
+
const backupPath = `${paths.legacy}.backup-${timestamp}`;
|
|
140
|
+
const indexContent = readFileSync(paths.legacy, 'utf-8');
|
|
141
|
+
writeFileSync(backupPath, indexContent);
|
|
142
|
+
stats.backupPath = backupPath;
|
|
143
|
+
}
|
|
144
|
+
// Load and validate old index
|
|
145
|
+
const indexContent = readFileSync(paths.legacy, 'utf-8');
|
|
146
|
+
const legacyIndex = JSON.parse(indexContent);
|
|
147
|
+
const itemCount = legacyIndex.items.length;
|
|
148
|
+
// Initialize new index structure
|
|
149
|
+
initializeRefsStyleIndex(devstepsDir, legacyIndex.counters || {});
|
|
150
|
+
// Migrate items
|
|
151
|
+
for (const item of legacyIndex.items) {
|
|
152
|
+
// Load full metadata for each item to get eisenhower quadrant
|
|
153
|
+
const typeFolder = getTypeFolder(item.type);
|
|
154
|
+
const metadataPath = join(devstepsDir, typeFolder, `${item.id}.json`);
|
|
155
|
+
if (!existsSync(metadataPath)) {
|
|
156
|
+
// Skip items with missing metadata
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
const metadata = JSON.parse(readFileSync(metadataPath, 'utf-8'));
|
|
160
|
+
addItemToIndex(devstepsDir, metadata);
|
|
161
|
+
stats.totalItems++;
|
|
162
|
+
stats.byType[item.type] = (stats.byType[item.type] || 0) + 1;
|
|
163
|
+
stats.byStatus[item.status] = (stats.byStatus[item.status] || 0) + 1;
|
|
164
|
+
stats.byPriority[metadata.eisenhower] = (stats.byPriority[metadata.eisenhower] || 0) + 1;
|
|
165
|
+
}
|
|
166
|
+
// Verify migration
|
|
167
|
+
const newIndexes = loadAllIndexes(devstepsDir);
|
|
168
|
+
// Count items in new index
|
|
169
|
+
let newItemCount = 0;
|
|
170
|
+
for (const items of newIndexes.byType.values()) {
|
|
171
|
+
newItemCount += items.length;
|
|
172
|
+
}
|
|
173
|
+
if (newItemCount !== stats.totalItems) {
|
|
174
|
+
throw new Error(`Item count mismatch! Migrated: ${stats.totalItems}, Verified: ${newItemCount}`);
|
|
175
|
+
}
|
|
176
|
+
// Check for duplicates
|
|
177
|
+
const allIds = new Set();
|
|
178
|
+
for (const items of newIndexes.byType.values()) {
|
|
179
|
+
for (const id of items) {
|
|
180
|
+
if (allIds.has(id)) {
|
|
181
|
+
throw new Error(`Duplicate item detected: ${id}`);
|
|
182
|
+
}
|
|
183
|
+
allIds.add(id);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Archive old index
|
|
187
|
+
const archivePath = `${paths.legacy}.archived-${timestamp}`;
|
|
188
|
+
renameSync(paths.legacy, archivePath);
|
|
189
|
+
stats.archivePath = archivePath;
|
|
190
|
+
return stats;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Get user-friendly status message
|
|
194
|
+
*
|
|
195
|
+
* @param devstepsDir Path to .devsteps directory
|
|
196
|
+
* @returns Human-readable status message
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* ```typescript
|
|
200
|
+
* console.log(getMigrationStatusMessage('/path/to/.devsteps'));
|
|
201
|
+
* // Output: "📦 DevSteps project using refs-style index ✓"
|
|
202
|
+
* ```
|
|
203
|
+
*/
|
|
204
|
+
export function getMigrationStatusMessage(devstepsDir) {
|
|
205
|
+
const result = checkMigrationNeeded(devstepsDir);
|
|
206
|
+
if (!existsSync(devstepsDir)) {
|
|
207
|
+
return '❌ Not a DevSteps project';
|
|
208
|
+
}
|
|
209
|
+
if (result.needed) {
|
|
210
|
+
const count = result.itemCount ?? 'unknown';
|
|
211
|
+
return `🔄 Migration available: ${count} items can be migrated to refs-style index`;
|
|
212
|
+
}
|
|
213
|
+
if (result.hasRefs) {
|
|
214
|
+
return '✅ Project using refs-style index';
|
|
215
|
+
}
|
|
216
|
+
if (result.hasLegacy && result.hasRefs) {
|
|
217
|
+
return '⚠️ Both index formats detected - manual cleanup needed';
|
|
218
|
+
}
|
|
219
|
+
return '📦 DevSteps project (no index yet)';
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Automatically migrate if needed
|
|
223
|
+
*
|
|
224
|
+
* Safe to call repeatedly - only migrates once.
|
|
225
|
+
* Checks if migration is needed and runs it if necessary.
|
|
226
|
+
*
|
|
227
|
+
* @param devstepsDir Path to .devsteps directory
|
|
228
|
+
* @param options Migration options
|
|
229
|
+
* @returns True if migration was performed, false if not needed
|
|
230
|
+
* @throws Error if migration fails
|
|
231
|
+
*
|
|
232
|
+
* @example
|
|
233
|
+
* ```typescript
|
|
234
|
+
* // Auto-migrate with user feedback
|
|
235
|
+
* const migrated = await ensureIndexMigrated('/path/to/.devsteps');
|
|
236
|
+
* if (migrated) {
|
|
237
|
+
* console.log('✨ Migration complete!');
|
|
238
|
+
* }
|
|
239
|
+
*
|
|
240
|
+
* // Silent auto-migration (for background tasks)
|
|
241
|
+
* await ensureIndexMigrated('/path/to/.devsteps', { silent: true });
|
|
242
|
+
*
|
|
243
|
+
* // Dry-run (check only)
|
|
244
|
+
* const needed = await ensureIndexMigrated('/path/to/.devsteps', { dryRun: true });
|
|
245
|
+
* ```
|
|
246
|
+
*/
|
|
247
|
+
export async function ensureIndexMigrated(devstepsDir, options = {}) {
|
|
248
|
+
const { silent = false, dryRun = false } = options;
|
|
249
|
+
// Check if migration needed
|
|
250
|
+
const check = checkMigrationNeeded(devstepsDir);
|
|
251
|
+
if (!check.needed) {
|
|
252
|
+
if (!silent && check.hasRefs) {
|
|
253
|
+
console.log('✅ Project already using refs-style index');
|
|
254
|
+
}
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
// Dry-run mode - just report
|
|
258
|
+
if (dryRun) {
|
|
259
|
+
if (!silent) {
|
|
260
|
+
console.log('🔍 Migration Check (Dry-Run)');
|
|
261
|
+
console.log(` Legacy index.json: ${check.hasLegacy ? '✓' : '✗'}`);
|
|
262
|
+
console.log(` Refs-style index: ${check.hasRefs ? '✓' : '✗'}`);
|
|
263
|
+
console.log(` Items to migrate: ${check.itemCount ?? 'unknown'}`);
|
|
264
|
+
console.log('\n✅ Migration would proceed');
|
|
265
|
+
}
|
|
266
|
+
return true;
|
|
267
|
+
}
|
|
268
|
+
// Run migration
|
|
269
|
+
if (!silent) {
|
|
270
|
+
console.log('📦 DevSteps Project Detected');
|
|
271
|
+
console.log(`🔍 Legacy index.json found (${check.itemCount ?? 'unknown'} items)`);
|
|
272
|
+
console.log('🆕 Refs-style index not found');
|
|
273
|
+
console.log('🔄 Auto-migrating...\n');
|
|
274
|
+
}
|
|
275
|
+
try {
|
|
276
|
+
// Run migration
|
|
277
|
+
const stats = await performMigration(devstepsDir, options);
|
|
278
|
+
if (!silent) {
|
|
279
|
+
if (stats.backupPath) {
|
|
280
|
+
console.log(` ✅ Backed up to: ${stats.backupPath}`);
|
|
281
|
+
}
|
|
282
|
+
console.log(` ✅ Verified: ${stats.totalItems} items migrated`);
|
|
283
|
+
console.log('✨ Migration complete!\n');
|
|
284
|
+
}
|
|
285
|
+
return true;
|
|
286
|
+
}
|
|
287
|
+
catch (error) {
|
|
288
|
+
if (!silent) {
|
|
289
|
+
console.error('❌ Migration failed:', error instanceof Error ? error.message : String(error));
|
|
290
|
+
}
|
|
291
|
+
throw error;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Check if items/ directory migration is needed
|
|
296
|
+
*
|
|
297
|
+
* Returns true if using flat structure (epics/, stories/)
|
|
298
|
+
* instead of nested structure (items/epics/, items/stories/)
|
|
299
|
+
*/
|
|
300
|
+
export function needsItemsDirectoryMigration(devstepsDir) {
|
|
301
|
+
// Check if old flat structure exists
|
|
302
|
+
const hasOldStructure = existsSync(join(devstepsDir, 'epics')) ||
|
|
303
|
+
existsSync(join(devstepsDir, 'stories')) ||
|
|
304
|
+
existsSync(join(devstepsDir, 'tasks'));
|
|
305
|
+
// Check if new items/ structure exists
|
|
306
|
+
const hasNewStructure = existsSync(join(devstepsDir, 'items'));
|
|
307
|
+
// Need migration if old exists and new doesn't
|
|
308
|
+
return hasOldStructure && !hasNewStructure;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Migrate from flat directory structure to items/ subdirectory
|
|
312
|
+
*
|
|
313
|
+
* Moves files from:
|
|
314
|
+
* .devsteps/epics/EPIC-001.json → .devsteps/items/epics/EPIC-001.json
|
|
315
|
+
* .devsteps/stories/... → .devsteps/items/stories/...
|
|
316
|
+
*
|
|
317
|
+
* @param devstepsDir Path to .devsteps directory
|
|
318
|
+
* @param options Migration options
|
|
319
|
+
* @returns Migration statistics
|
|
320
|
+
*/
|
|
321
|
+
export function migrateItemsDirectory(devstepsDir, options = {}) {
|
|
322
|
+
const { silent = false } = options;
|
|
323
|
+
if (!silent) {
|
|
324
|
+
console.log('📂 Migrating to items/ directory structure...');
|
|
325
|
+
}
|
|
326
|
+
const oldDirs = ['epics', 'stories', 'tasks', 'bugs', 'spikes', 'tests', 'requirements', 'features'];
|
|
327
|
+
const stats = { moved: 0, types: {} };
|
|
328
|
+
// Create items/ directory
|
|
329
|
+
const itemsDir = join(devstepsDir, 'items');
|
|
330
|
+
if (!existsSync(itemsDir)) {
|
|
331
|
+
mkdirSync(itemsDir, { recursive: true });
|
|
332
|
+
}
|
|
333
|
+
// Move each type directory
|
|
334
|
+
for (const dirName of oldDirs) {
|
|
335
|
+
const oldPath = join(devstepsDir, dirName);
|
|
336
|
+
const newPath = join(itemsDir, dirName);
|
|
337
|
+
if (!existsSync(oldPath))
|
|
338
|
+
continue;
|
|
339
|
+
// Create new subdirectory
|
|
340
|
+
mkdirSync(newPath, { recursive: true });
|
|
341
|
+
// Move all files
|
|
342
|
+
const files = readdirSync(oldPath);
|
|
343
|
+
let count = 0;
|
|
344
|
+
for (const file of files) {
|
|
345
|
+
const srcPath = join(oldPath, file);
|
|
346
|
+
const dstPath = join(newPath, file);
|
|
347
|
+
// Use renameSync for atomic move
|
|
348
|
+
renameSync(srcPath, dstPath);
|
|
349
|
+
count++;
|
|
350
|
+
}
|
|
351
|
+
stats.types[dirName] = count;
|
|
352
|
+
stats.moved += count;
|
|
353
|
+
// Remove old empty directory (best effort)
|
|
354
|
+
try {
|
|
355
|
+
rmdirSync(oldPath);
|
|
356
|
+
}
|
|
357
|
+
catch {
|
|
358
|
+
// Directory not empty or other error - ignore
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
if (!silent) {
|
|
362
|
+
console.log(` ✅ Moved ${stats.moved} files to items/ subdirectories`);
|
|
363
|
+
}
|
|
364
|
+
return stats;
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Ensure index is migrated AND items are in correct directory structure
|
|
368
|
+
*
|
|
369
|
+
* Combines both migrations:
|
|
370
|
+
* 1. Legacy index.json → refs-style index/ (if needed)
|
|
371
|
+
* 2. Flat structure → items/ subdirectory (if needed)
|
|
372
|
+
*
|
|
373
|
+
* Safe to call on every operation - only migrates when needed.
|
|
374
|
+
*/
|
|
375
|
+
export async function ensureFullMigration(devstepsDir, options = {}) {
|
|
376
|
+
// Step 1: Index migration (legacy → refs-style)
|
|
377
|
+
await ensureIndexMigrated(devstepsDir, options);
|
|
378
|
+
// Step 2: Directory structure migration (flat → items/)
|
|
379
|
+
if (needsItemsDirectoryMigration(devstepsDir)) {
|
|
380
|
+
migrateItemsDirectory(devstepsDir, options);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
//# sourceMappingURL=auto-migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-migrate.js","sourceRoot":"","sources":["../../src/core/auto-migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-migrate.test.d.ts","sourceRoot":"","sources":["../../src/core/auto-migrate.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|