@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,364 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit Tests for Auto-Migration Module
|
|
3
|
+
*
|
|
4
|
+
* @see STORY-073 External Project Migration Auto-Detection
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
import { mkdirSync, rmSync, existsSync, writeFileSync } from 'node:fs';
|
|
8
|
+
import { tmpdir } from 'node:os';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { checkMigrationNeeded, getMigrationStatusMessage, ensureIndexMigrated, performMigration, } from './auto-migrate.js';
|
|
11
|
+
import { hasRefsStyleIndex, hasLegacyIndex, initializeRefsStyleIndex, loadAllIndexes, } from './index-refs.js';
|
|
12
|
+
describe('Auto-Migration Module', () => {
|
|
13
|
+
let testDir;
|
|
14
|
+
let devstepsDir;
|
|
15
|
+
// Helper to create minimal valid metadata
|
|
16
|
+
const createMetadata = (id, type, status, eisenhower) => ({
|
|
17
|
+
id,
|
|
18
|
+
type,
|
|
19
|
+
category: 'general',
|
|
20
|
+
title: `Test ${type} ${id}`,
|
|
21
|
+
status,
|
|
22
|
+
eisenhower,
|
|
23
|
+
created: new Date().toISOString(),
|
|
24
|
+
updated: new Date().toISOString(),
|
|
25
|
+
linked_items: {
|
|
26
|
+
implements: [],
|
|
27
|
+
'implemented-by': [],
|
|
28
|
+
'tested-by': [],
|
|
29
|
+
tests: [],
|
|
30
|
+
blocks: [],
|
|
31
|
+
'blocked-by': [],
|
|
32
|
+
'relates-to': [],
|
|
33
|
+
'depends-on': [],
|
|
34
|
+
'required-by': [],
|
|
35
|
+
supersedes: [],
|
|
36
|
+
'superseded-by': [],
|
|
37
|
+
},
|
|
38
|
+
tags: [],
|
|
39
|
+
affected_paths: [],
|
|
40
|
+
commits: [],
|
|
41
|
+
metadata: {},
|
|
42
|
+
});
|
|
43
|
+
beforeEach(() => {
|
|
44
|
+
// Create temporary test directory
|
|
45
|
+
testDir = join(tmpdir(), `devsteps-test-${Date.now()}`);
|
|
46
|
+
devstepsDir = join(testDir, '.devsteps');
|
|
47
|
+
mkdirSync(devstepsDir, { recursive: true });
|
|
48
|
+
});
|
|
49
|
+
afterEach(() => {
|
|
50
|
+
// Clean up test directory
|
|
51
|
+
if (existsSync(testDir)) {
|
|
52
|
+
rmSync(testDir, { recursive: true, force: true });
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
describe('checkMigrationNeeded', () => {
|
|
56
|
+
it('should return false when .devsteps directory does not exist', () => {
|
|
57
|
+
const nonExistentDir = join(tmpdir(), 'non-existent-dir');
|
|
58
|
+
const result = checkMigrationNeeded(nonExistentDir);
|
|
59
|
+
expect(result.needed).toBe(false);
|
|
60
|
+
expect(result.hasLegacy).toBe(false);
|
|
61
|
+
expect(result.hasRefs).toBe(false);
|
|
62
|
+
expect(result.message).toContain('Not a DevSteps project');
|
|
63
|
+
});
|
|
64
|
+
it('should return false when no index exists (new project)', () => {
|
|
65
|
+
const result = checkMigrationNeeded(devstepsDir);
|
|
66
|
+
expect(result.needed).toBe(false);
|
|
67
|
+
expect(result.hasLegacy).toBe(false);
|
|
68
|
+
expect(result.hasRefs).toBe(false);
|
|
69
|
+
expect(result.message).toContain('No index found');
|
|
70
|
+
});
|
|
71
|
+
it('should return false when refs-style index already exists', () => {
|
|
72
|
+
// Create refs-style index
|
|
73
|
+
initializeRefsStyleIndex(devstepsDir);
|
|
74
|
+
const result = checkMigrationNeeded(devstepsDir);
|
|
75
|
+
expect(result.needed).toBe(false);
|
|
76
|
+
expect(result.hasLegacy).toBe(false);
|
|
77
|
+
expect(result.hasRefs).toBe(true);
|
|
78
|
+
expect(result.message).toContain('already using refs-style index');
|
|
79
|
+
});
|
|
80
|
+
it('should return true when migration is needed', () => {
|
|
81
|
+
// Create legacy index
|
|
82
|
+
const legacyIndex = {
|
|
83
|
+
version: '0.6.0',
|
|
84
|
+
items: [
|
|
85
|
+
{ id: 'TASK-001', type: 'task', status: 'draft' },
|
|
86
|
+
{ id: 'STORY-001', type: 'story', status: 'in-progress' },
|
|
87
|
+
],
|
|
88
|
+
counters: { task: 1, story: 1 },
|
|
89
|
+
};
|
|
90
|
+
writeFileSync(join(devstepsDir, 'index.json'), JSON.stringify(legacyIndex, null, 2));
|
|
91
|
+
const result = checkMigrationNeeded(devstepsDir);
|
|
92
|
+
expect(result.needed).toBe(true);
|
|
93
|
+
expect(result.hasLegacy).toBe(true);
|
|
94
|
+
expect(result.hasRefs).toBe(false);
|
|
95
|
+
expect(result.itemCount).toBe(2);
|
|
96
|
+
expect(result.message).toContain('Migration needed');
|
|
97
|
+
expect(result.message).toContain('2 items');
|
|
98
|
+
});
|
|
99
|
+
it('should detect error state when both indexes exist', () => {
|
|
100
|
+
// Create both legacy and refs-style index
|
|
101
|
+
const legacyIndex = {
|
|
102
|
+
version: '0.6.0',
|
|
103
|
+
items: [{ id: 'TASK-001', type: 'task', status: 'draft' }],
|
|
104
|
+
counters: { task: 1 },
|
|
105
|
+
};
|
|
106
|
+
writeFileSync(join(devstepsDir, 'index.json'), JSON.stringify(legacyIndex, null, 2));
|
|
107
|
+
initializeRefsStyleIndex(devstepsDir);
|
|
108
|
+
const result = checkMigrationNeeded(devstepsDir);
|
|
109
|
+
expect(result.needed).toBe(false);
|
|
110
|
+
expect(result.hasLegacy).toBe(true);
|
|
111
|
+
expect(result.hasRefs).toBe(true);
|
|
112
|
+
expect(result.message).toContain('Both index formats exist');
|
|
113
|
+
expect(result.message).toContain('manual intervention');
|
|
114
|
+
});
|
|
115
|
+
it('should handle corrupted legacy index gracefully', () => {
|
|
116
|
+
// Create invalid JSON
|
|
117
|
+
writeFileSync(join(devstepsDir, 'index.json'), 'invalid json {]');
|
|
118
|
+
const result = checkMigrationNeeded(devstepsDir);
|
|
119
|
+
expect(result.needed).toBe(true);
|
|
120
|
+
expect(result.hasLegacy).toBe(true);
|
|
121
|
+
expect(result.hasRefs).toBe(false);
|
|
122
|
+
expect(result.itemCount).toBeUndefined();
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
describe('getMigrationStatusMessage', () => {
|
|
126
|
+
it('should return appropriate message when not a DevSteps project', () => {
|
|
127
|
+
const nonExistentDir = join(tmpdir(), 'non-existent-dir');
|
|
128
|
+
const message = getMigrationStatusMessage(nonExistentDir);
|
|
129
|
+
expect(message).toContain('Not a DevSteps project');
|
|
130
|
+
});
|
|
131
|
+
it('should return success message when using refs-style index', () => {
|
|
132
|
+
initializeRefsStyleIndex(devstepsDir);
|
|
133
|
+
const message = getMigrationStatusMessage(devstepsDir);
|
|
134
|
+
expect(message).toContain('using refs-style index');
|
|
135
|
+
});
|
|
136
|
+
it('should return migration available message', () => {
|
|
137
|
+
const legacyIndex = {
|
|
138
|
+
version: '0.6.0',
|
|
139
|
+
items: [
|
|
140
|
+
{ id: 'TASK-001', type: 'task', status: 'draft' },
|
|
141
|
+
{ id: 'TASK-002', type: 'task', status: 'draft' },
|
|
142
|
+
{ id: 'STORY-001', type: 'story', status: 'in-progress' },
|
|
143
|
+
],
|
|
144
|
+
counters: { task: 2, story: 1 },
|
|
145
|
+
};
|
|
146
|
+
writeFileSync(join(devstepsDir, 'index.json'), JSON.stringify(legacyIndex, null, 2));
|
|
147
|
+
const message = getMigrationStatusMessage(devstepsDir);
|
|
148
|
+
expect(message).toContain('Migration available');
|
|
149
|
+
expect(message).toContain('3 items');
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
describe('ensureIndexMigrated', () => {
|
|
153
|
+
it('should return false when migration not needed', async () => {
|
|
154
|
+
initializeRefsStyleIndex(devstepsDir);
|
|
155
|
+
const migrated = await ensureIndexMigrated(devstepsDir, { silent: true });
|
|
156
|
+
expect(migrated).toBe(false);
|
|
157
|
+
});
|
|
158
|
+
it('should return true in dry-run mode when migration needed', async () => {
|
|
159
|
+
const legacyIndex = {
|
|
160
|
+
version: '0.6.0',
|
|
161
|
+
items: [{ id: 'TASK-001', type: 'task', status: 'draft' }],
|
|
162
|
+
counters: { task: 1 },
|
|
163
|
+
};
|
|
164
|
+
writeFileSync(join(devstepsDir, 'index.json'), JSON.stringify(legacyIndex, null, 2));
|
|
165
|
+
// Create metadata file
|
|
166
|
+
mkdirSync(join(devstepsDir, 'tasks'), { recursive: true });
|
|
167
|
+
const metadata = createMetadata('TASK-001', 'task', 'draft', 'not-urgent-important');
|
|
168
|
+
writeFileSync(join(devstepsDir, 'tasks', 'TASK-001.json'), JSON.stringify(metadata, null, 2));
|
|
169
|
+
const result = await ensureIndexMigrated(devstepsDir, { silent: true, dryRun: true });
|
|
170
|
+
expect(result).toBe(true);
|
|
171
|
+
// Index should NOT be created in dry-run
|
|
172
|
+
expect(hasRefsStyleIndex(devstepsDir)).toBe(false);
|
|
173
|
+
// Legacy index should still exist
|
|
174
|
+
expect(hasLegacyIndex(devstepsDir)).toBe(true);
|
|
175
|
+
});
|
|
176
|
+
it('should be idempotent - safe to call multiple times', async () => {
|
|
177
|
+
initializeRefsStyleIndex(devstepsDir);
|
|
178
|
+
const result1 = await ensureIndexMigrated(devstepsDir, { silent: true });
|
|
179
|
+
const result2 = await ensureIndexMigrated(devstepsDir, { silent: true });
|
|
180
|
+
const result3 = await ensureIndexMigrated(devstepsDir, { silent: true });
|
|
181
|
+
expect(result1).toBe(false);
|
|
182
|
+
expect(result2).toBe(false);
|
|
183
|
+
expect(result3).toBe(false);
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
describe('performMigration', () => {
|
|
187
|
+
it('should throw error when .devsteps directory does not exist', async () => {
|
|
188
|
+
const nonExistentDir = join(tmpdir(), 'non-existent-dir');
|
|
189
|
+
await expect(performMigration(nonExistentDir)).rejects.toThrow('.devsteps directory not found');
|
|
190
|
+
});
|
|
191
|
+
it('should throw error when no legacy index exists', async () => {
|
|
192
|
+
await expect(performMigration(devstepsDir)).rejects.toThrow('No index.json found');
|
|
193
|
+
});
|
|
194
|
+
it('should throw error when refs-style index already exists', async () => {
|
|
195
|
+
// Create both indexes (error state)
|
|
196
|
+
const legacyIndex = {
|
|
197
|
+
version: '0.6.0',
|
|
198
|
+
items: [{ id: 'TASK-001', type: 'task', status: 'draft' }],
|
|
199
|
+
counters: { task: 1 },
|
|
200
|
+
};
|
|
201
|
+
writeFileSync(join(devstepsDir, 'index.json'), JSON.stringify(legacyIndex, null, 2));
|
|
202
|
+
initializeRefsStyleIndex(devstepsDir);
|
|
203
|
+
await expect(performMigration(devstepsDir)).rejects.toThrow('Refs-style index already exists');
|
|
204
|
+
});
|
|
205
|
+
it('should successfully migrate single item', async () => {
|
|
206
|
+
// Create legacy index
|
|
207
|
+
const legacyIndex = {
|
|
208
|
+
version: '0.6.0',
|
|
209
|
+
items: [{ id: 'TASK-001', type: 'task', status: 'draft' }],
|
|
210
|
+
counters: { task: 1 },
|
|
211
|
+
};
|
|
212
|
+
writeFileSync(join(devstepsDir, 'index.json'), JSON.stringify(legacyIndex, null, 2));
|
|
213
|
+
// Create metadata file
|
|
214
|
+
mkdirSync(join(devstepsDir, 'tasks'), { recursive: true });
|
|
215
|
+
const metadata = createMetadata('TASK-001', 'task', 'draft', 'not-urgent-important');
|
|
216
|
+
writeFileSync(join(devstepsDir, 'tasks', 'TASK-001.json'), JSON.stringify(metadata, null, 2));
|
|
217
|
+
const stats = await performMigration(devstepsDir);
|
|
218
|
+
expect(stats.totalItems).toBe(1);
|
|
219
|
+
expect(stats.byType.task).toBe(1);
|
|
220
|
+
expect(stats.byStatus.draft).toBe(1);
|
|
221
|
+
expect(stats.backupPath).toBeDefined();
|
|
222
|
+
expect(stats.archivePath).toBeDefined();
|
|
223
|
+
expect(hasRefsStyleIndex(devstepsDir)).toBe(true);
|
|
224
|
+
expect(hasLegacyIndex(devstepsDir)).toBe(false);
|
|
225
|
+
// Verify migrated data
|
|
226
|
+
const indexes = loadAllIndexes(devstepsDir);
|
|
227
|
+
expect(indexes.byType.get('task')).toContain('TASK-001');
|
|
228
|
+
expect(indexes.byStatus.get('draft')).toContain('TASK-001');
|
|
229
|
+
});
|
|
230
|
+
it('should successfully migrate multiple items of different types', async () => {
|
|
231
|
+
// Create legacy index with multiple items
|
|
232
|
+
const legacyIndex = {
|
|
233
|
+
version: '0.6.0',
|
|
234
|
+
items: [
|
|
235
|
+
{ id: 'TASK-001', type: 'task', status: 'draft' },
|
|
236
|
+
{ id: 'TASK-002', type: 'task', status: 'done' },
|
|
237
|
+
{ id: 'STORY-001', type: 'story', status: 'in-progress' },
|
|
238
|
+
{ id: 'BUG-001', type: 'bug', status: 'review' },
|
|
239
|
+
],
|
|
240
|
+
counters: { task: 2, story: 1, bug: 1 },
|
|
241
|
+
};
|
|
242
|
+
writeFileSync(join(devstepsDir, 'index.json'), JSON.stringify(legacyIndex, null, 2));
|
|
243
|
+
// Create metadata files
|
|
244
|
+
mkdirSync(join(devstepsDir, 'tasks'), { recursive: true });
|
|
245
|
+
mkdirSync(join(devstepsDir, 'stories'), { recursive: true });
|
|
246
|
+
mkdirSync(join(devstepsDir, 'bugs'), { recursive: true });
|
|
247
|
+
const items = [
|
|
248
|
+
createMetadata('TASK-001', 'task', 'draft', 'not-urgent-important'),
|
|
249
|
+
createMetadata('TASK-002', 'task', 'done', 'urgent-important'),
|
|
250
|
+
createMetadata('STORY-001', 'story', 'in-progress', 'urgent-important'),
|
|
251
|
+
createMetadata('BUG-001', 'bug', 'review', 'not-urgent-not-important'),
|
|
252
|
+
];
|
|
253
|
+
for (const item of items) {
|
|
254
|
+
const folder = item.type === 'task' ? 'tasks' : item.type === 'story' ? 'stories' : 'bugs';
|
|
255
|
+
writeFileSync(join(devstepsDir, folder, `${item.id}.json`), JSON.stringify(item, null, 2));
|
|
256
|
+
}
|
|
257
|
+
const stats = await performMigration(devstepsDir);
|
|
258
|
+
expect(stats.totalItems).toBe(4);
|
|
259
|
+
expect(stats.byType.task).toBe(2);
|
|
260
|
+
expect(stats.byType.story).toBe(1);
|
|
261
|
+
expect(stats.byType.bug).toBe(1);
|
|
262
|
+
expect(stats.byStatus.draft).toBe(1);
|
|
263
|
+
expect(stats.byStatus.done).toBe(1);
|
|
264
|
+
expect(stats.byStatus['in-progress']).toBe(1);
|
|
265
|
+
expect(stats.byStatus.review).toBe(1);
|
|
266
|
+
// Verify all items migrated correctly
|
|
267
|
+
const indexes = loadAllIndexes(devstepsDir);
|
|
268
|
+
expect(indexes.byType.get('task')).toEqual(expect.arrayContaining(['TASK-001', 'TASK-002']));
|
|
269
|
+
expect(indexes.byType.get('story')).toContain('STORY-001');
|
|
270
|
+
expect(indexes.byType.get('bug')).toContain('BUG-001');
|
|
271
|
+
});
|
|
272
|
+
it('should skip items with missing metadata files', async () => {
|
|
273
|
+
// Create legacy index with 3 items, but only 2 metadata files
|
|
274
|
+
const legacyIndex = {
|
|
275
|
+
version: '0.6.0',
|
|
276
|
+
items: [
|
|
277
|
+
{ id: 'TASK-001', type: 'task', status: 'draft' },
|
|
278
|
+
{ id: 'TASK-002', type: 'task', status: 'done' },
|
|
279
|
+
{ id: 'TASK-003', type: 'task', status: 'draft' },
|
|
280
|
+
],
|
|
281
|
+
counters: { task: 3 },
|
|
282
|
+
};
|
|
283
|
+
writeFileSync(join(devstepsDir, 'index.json'), JSON.stringify(legacyIndex, null, 2));
|
|
284
|
+
// Create only 2 metadata files
|
|
285
|
+
mkdirSync(join(devstepsDir, 'tasks'), { recursive: true });
|
|
286
|
+
const items = [
|
|
287
|
+
createMetadata('TASK-001', 'task', 'draft', 'not-urgent-important'),
|
|
288
|
+
createMetadata('TASK-002', 'task', 'done', 'urgent-important'),
|
|
289
|
+
// TASK-003 metadata is missing
|
|
290
|
+
];
|
|
291
|
+
for (const item of items) {
|
|
292
|
+
writeFileSync(join(devstepsDir, 'tasks', `${item.id}.json`), JSON.stringify(item, null, 2));
|
|
293
|
+
}
|
|
294
|
+
const stats = await performMigration(devstepsDir);
|
|
295
|
+
// Should only migrate 2 items (skip missing TASK-003)
|
|
296
|
+
expect(stats.totalItems).toBe(2);
|
|
297
|
+
expect(stats.byType.task).toBe(2);
|
|
298
|
+
});
|
|
299
|
+
it('should create backup by default', async () => {
|
|
300
|
+
const legacyIndex = {
|
|
301
|
+
version: '0.6.0',
|
|
302
|
+
items: [{ id: 'TASK-001', type: 'task', status: 'draft' }],
|
|
303
|
+
counters: { task: 1 },
|
|
304
|
+
};
|
|
305
|
+
writeFileSync(join(devstepsDir, 'index.json'), JSON.stringify(legacyIndex, null, 2));
|
|
306
|
+
mkdirSync(join(devstepsDir, 'tasks'), { recursive: true });
|
|
307
|
+
const metadata = createMetadata('TASK-001', 'task', 'draft', 'not-urgent-important');
|
|
308
|
+
writeFileSync(join(devstepsDir, 'tasks', 'TASK-001.json'), JSON.stringify(metadata, null, 2));
|
|
309
|
+
const stats = await performMigration(devstepsDir);
|
|
310
|
+
expect(stats.backupPath).toBeDefined();
|
|
311
|
+
expect(existsSync(stats.backupPath)).toBe(true);
|
|
312
|
+
});
|
|
313
|
+
it('should skip backup when skipBackup option is true', async () => {
|
|
314
|
+
const legacyIndex = {
|
|
315
|
+
version: '0.6.0',
|
|
316
|
+
items: [{ id: 'TASK-001', type: 'task', status: 'draft' }],
|
|
317
|
+
counters: { task: 1 },
|
|
318
|
+
};
|
|
319
|
+
writeFileSync(join(devstepsDir, 'index.json'), JSON.stringify(legacyIndex, null, 2));
|
|
320
|
+
mkdirSync(join(devstepsDir, 'tasks'), { recursive: true });
|
|
321
|
+
const metadata = createMetadata('TASK-001', 'task', 'draft', 'not-urgent-important');
|
|
322
|
+
writeFileSync(join(devstepsDir, 'tasks', 'TASK-001.json'), JSON.stringify(metadata, null, 2));
|
|
323
|
+
const stats = await performMigration(devstepsDir, { skipBackup: true });
|
|
324
|
+
expect(stats.backupPath).toBeUndefined();
|
|
325
|
+
});
|
|
326
|
+
it('should archive original index.json after migration', async () => {
|
|
327
|
+
const legacyIndex = {
|
|
328
|
+
version: '0.6.0',
|
|
329
|
+
items: [{ id: 'TASK-001', type: 'task', status: 'draft' }],
|
|
330
|
+
counters: { task: 1 },
|
|
331
|
+
};
|
|
332
|
+
const legacyPath = join(devstepsDir, 'index.json');
|
|
333
|
+
writeFileSync(legacyPath, JSON.stringify(legacyIndex, null, 2));
|
|
334
|
+
mkdirSync(join(devstepsDir, 'tasks'), { recursive: true });
|
|
335
|
+
const metadata = createMetadata('TASK-001', 'task', 'draft', 'not-urgent-important');
|
|
336
|
+
writeFileSync(join(devstepsDir, 'tasks', 'TASK-001.json'), JSON.stringify(metadata, null, 2));
|
|
337
|
+
const stats = await performMigration(devstepsDir);
|
|
338
|
+
// Original should be moved
|
|
339
|
+
expect(existsSync(legacyPath)).toBe(false);
|
|
340
|
+
// Archive should exist
|
|
341
|
+
expect(stats.archivePath).toBeDefined();
|
|
342
|
+
expect(existsSync(stats.archivePath)).toBe(true);
|
|
343
|
+
expect(stats.archivePath).toContain('.archived-');
|
|
344
|
+
});
|
|
345
|
+
it('should detect and prevent duplicate items via count mismatch', async () => {
|
|
346
|
+
// This is a data integrity test - create corrupted legacy index with duplicates
|
|
347
|
+
const legacyIndex = {
|
|
348
|
+
version: '0.6.0',
|
|
349
|
+
items: [
|
|
350
|
+
{ id: 'TASK-001', type: 'task', status: 'draft' },
|
|
351
|
+
{ id: 'TASK-001', type: 'task', status: 'draft' }, // Duplicate!
|
|
352
|
+
],
|
|
353
|
+
counters: { task: 1 },
|
|
354
|
+
};
|
|
355
|
+
writeFileSync(join(devstepsDir, 'index.json'), JSON.stringify(legacyIndex, null, 2));
|
|
356
|
+
mkdirSync(join(devstepsDir, 'tasks'), { recursive: true });
|
|
357
|
+
const metadata = createMetadata('TASK-001', 'task', 'draft', 'not-urgent-important');
|
|
358
|
+
writeFileSync(join(devstepsDir, 'tasks', 'TASK-001.json'), JSON.stringify(metadata, null, 2));
|
|
359
|
+
// Migration should fail with count mismatch (duplicate handling in addItemToIndex)
|
|
360
|
+
await expect(performMigration(devstepsDir)).rejects.toThrow('Item count mismatch');
|
|
361
|
+
});
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
//# sourceMappingURL=auto-migrate.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-migrate.test.js","sourceRoot":"","sources":["../../src/core/auto-migrate.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Index Rebuild Operations
|
|
3
|
+
*
|
|
4
|
+
* Rebuilds the refs-style index from source of truth (item files).
|
|
5
|
+
* Scans all item directories and reconstructs index files from scratch.
|
|
6
|
+
*
|
|
7
|
+
* Use Cases:
|
|
8
|
+
* - Index corruption recovery
|
|
9
|
+
* - Manual index repair after direct file edits
|
|
10
|
+
* - Migration validation
|
|
11
|
+
* - Development/debugging
|
|
12
|
+
*
|
|
13
|
+
* @see STORY-074 Index Rebuild Command
|
|
14
|
+
* @see EPIC-018 Index Architecture Refactoring
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Result of index rebuild operation
|
|
18
|
+
*/
|
|
19
|
+
export interface RebuildResult {
|
|
20
|
+
/** Total items found in source files */
|
|
21
|
+
totalItems: number;
|
|
22
|
+
/** Items processed successfully */
|
|
23
|
+
processedItems: number;
|
|
24
|
+
/** Items skipped due to errors */
|
|
25
|
+
skippedItems: number;
|
|
26
|
+
/** Files created/updated in index */
|
|
27
|
+
filesCreated: number;
|
|
28
|
+
/** Backup path (if backup was created) */
|
|
29
|
+
backupPath?: string;
|
|
30
|
+
/** Errors encountered during rebuild */
|
|
31
|
+
errors: Array<{
|
|
32
|
+
file: string;
|
|
33
|
+
error: string;
|
|
34
|
+
}>;
|
|
35
|
+
/** Statistics per dimension */
|
|
36
|
+
stats: {
|
|
37
|
+
byType: Record<string, number>;
|
|
38
|
+
byStatus: Record<string, number>;
|
|
39
|
+
byPriority: Record<string, number>;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Options for rebuild operation
|
|
44
|
+
*/
|
|
45
|
+
export interface RebuildOptions {
|
|
46
|
+
/** Create backup before rebuilding (default: true) */
|
|
47
|
+
backup?: boolean;
|
|
48
|
+
/** Dry-run mode: analyze but don't modify (default: false) */
|
|
49
|
+
dryRun?: boolean;
|
|
50
|
+
/** Progress callback for UI updates */
|
|
51
|
+
onProgress?: (current: number, total: number, message: string) => void;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Scan all item files and rebuild index from scratch
|
|
55
|
+
*
|
|
56
|
+
* Algorithm:
|
|
57
|
+
* 1. Backup current index (if requested)
|
|
58
|
+
* 2. Scan all .devsteps/{type}s/ directories
|
|
59
|
+
* 3. Load and validate each JSON file
|
|
60
|
+
* 4. Group items by type, status, eisenhower
|
|
61
|
+
* 5. Write new index files
|
|
62
|
+
* 6. Verify item count consistency
|
|
63
|
+
*
|
|
64
|
+
* @param devstepsDir Path to .devsteps directory
|
|
65
|
+
* @param options Rebuild options
|
|
66
|
+
* @returns Statistics about rebuild operation
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* const result = await rebuildIndex('.devsteps', { backup: true });
|
|
71
|
+
* console.log(`Rebuilt index: ${result.processedItems} items`);
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export declare function rebuildIndex(devstepsDir: string, options?: RebuildOptions): Promise<RebuildResult>;
|
|
75
|
+
//# sourceMappingURL=index-rebuild.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-rebuild.d.ts","sourceRoot":"","sources":["../../src/core/index-rebuild.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAqBH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IAEnB,mCAAmC;IACnC,cAAc,EAAE,MAAM,CAAC;IAEvB,kCAAkC;IAClC,YAAY,EAAE,MAAM,CAAC;IAErB,qCAAqC;IACrC,YAAY,EAAE,MAAM,CAAC;IAErB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,wCAAwC;IACxC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE/C,+BAA+B;IAC/B,KAAK,EAAE;QACN,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,sDAAsD;IACtD,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,uCAAuC;IACvC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,YAAY,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,cAAmB,GAC1B,OAAO,CAAC,aAAa,CAAC,CA+HxB"}
|