@schnick371/devsteps-shared 0.7.0-next.3 → 0.7.0-next.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.
Files changed (41) hide show
  1. package/dist/core/auto-migrate.d.ts +154 -0
  2. package/dist/core/auto-migrate.d.ts.map +1 -0
  3. package/dist/core/auto-migrate.js +383 -0
  4. package/dist/core/auto-migrate.js.map +1 -0
  5. package/dist/core/auto-migrate.test.d.ts +7 -0
  6. package/dist/core/auto-migrate.test.d.ts.map +1 -0
  7. package/dist/core/auto-migrate.test.js +364 -0
  8. package/dist/core/auto-migrate.test.js.map +1 -0
  9. package/dist/core/index-rebuild.d.ts +75 -0
  10. package/dist/core/index-rebuild.d.ts.map +1 -0
  11. package/dist/core/index-rebuild.js +260 -0
  12. package/dist/core/index-rebuild.js.map +1 -0
  13. package/dist/core/index-rebuild.test.d.ts +8 -0
  14. package/dist/core/index-rebuild.test.d.ts.map +1 -0
  15. package/dist/core/index-rebuild.test.js +582 -0
  16. package/dist/core/index-rebuild.test.js.map +1 -0
  17. package/dist/core/index-refs.d.ts +155 -0
  18. package/dist/core/index-refs.d.ts.map +1 -0
  19. package/dist/core/index-refs.js +442 -0
  20. package/dist/core/index-refs.js.map +1 -0
  21. package/dist/core/index-refs.test.d.ts +7 -0
  22. package/dist/core/index-refs.test.d.ts.map +1 -0
  23. package/dist/core/index-refs.test.js +367 -0
  24. package/dist/core/index-refs.test.js.map +1 -0
  25. package/dist/migration/fix-missing-eisenhower.d.ts +8 -0
  26. package/dist/migration/fix-missing-eisenhower.d.ts.map +1 -0
  27. package/dist/migration/fix-missing-eisenhower.js +58 -0
  28. package/dist/migration/fix-missing-eisenhower.js.map +1 -0
  29. package/dist/migration/remove-priority-field.d.ts +15 -0
  30. package/dist/migration/remove-priority-field.d.ts.map +1 -0
  31. package/dist/migration/remove-priority-field.js +113 -0
  32. package/dist/migration/remove-priority-field.js.map +1 -0
  33. package/dist/schemas/index-refs.schema.d.ts +103 -0
  34. package/dist/schemas/index-refs.schema.d.ts.map +1 -0
  35. package/dist/schemas/index-refs.schema.js +88 -0
  36. package/dist/schemas/index-refs.schema.js.map +1 -0
  37. package/dist/types/index-refs.types.d.ts +123 -0
  38. package/dist/types/index-refs.types.d.ts.map +1 -0
  39. package/dist/types/index-refs.types.js +71 -0
  40. package/dist/types/index-refs.types.js.map +1 -0
  41. package/package.json +1 -1
@@ -0,0 +1,582 @@
1
+ /**
2
+ * Unit Tests for Index Rebuild Operations
3
+ *
4
+ * @see STORY-074 Index Rebuild Command
5
+ * @see EPIC-018 Index Architecture Refactoring
6
+ */
7
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
8
+ import { mkdirSync, rmSync, existsSync, writeFileSync } from 'node:fs';
9
+ import { tmpdir } from 'node:os';
10
+ import { join } from 'node:path';
11
+ import { rebuildIndex } from './index-rebuild.js';
12
+ import { hasRefsStyleIndex, loadIndexByType, loadIndexByStatus, loadIndexByPriority, loadCounters, } from './index-refs.js';
13
+ describe('Index Rebuild Operations', () => {
14
+ let testDir;
15
+ let devstepsDir;
16
+ beforeEach(() => {
17
+ // Create temporary test directory
18
+ testDir = join(tmpdir(), `devsteps-rebuild-test-${Date.now()}`);
19
+ devstepsDir = join(testDir, '.devsteps');
20
+ mkdirSync(devstepsDir, { recursive: true });
21
+ });
22
+ afterEach(() => {
23
+ // Clean up test directory
24
+ if (existsSync(testDir)) {
25
+ rmSync(testDir, { recursive: true, force: true });
26
+ }
27
+ });
28
+ /**
29
+ * Helper: Create a test item file
30
+ */
31
+ function createItemFile(type, item) {
32
+ // Get correct directory name from TYPE_TO_DIRECTORY mapping
33
+ const TYPE_TO_DIR = {
34
+ epic: 'epics',
35
+ story: 'stories',
36
+ task: 'tasks',
37
+ requirement: 'requirements',
38
+ feature: 'features',
39
+ bug: 'bugs',
40
+ spike: 'spikes',
41
+ test: 'tests',
42
+ };
43
+ const typeDir = join(devstepsDir, TYPE_TO_DIR[type] || `${type}s`);
44
+ mkdirSync(typeDir, { recursive: true });
45
+ // Create complete item with defaults for required fields
46
+ const completeItem = {
47
+ category: 'general',
48
+ eisenhower: 'not-urgent-not-important',
49
+ linked_items: {
50
+ implements: [],
51
+ 'implemented-by': [],
52
+ 'tested-by': [],
53
+ tests: [],
54
+ blocks: [],
55
+ 'blocked-by': [],
56
+ 'relates-to': [],
57
+ 'depends-on': [],
58
+ 'required-by': [],
59
+ supersedes: [],
60
+ 'superseded-by': [],
61
+ },
62
+ tags: [],
63
+ affected_paths: [],
64
+ commits: [],
65
+ metadata: {},
66
+ created: new Date().toISOString(),
67
+ updated: new Date().toISOString(),
68
+ ...item,
69
+ };
70
+ const jsonPath = join(typeDir, `${item.id}.json`);
71
+ writeFileSync(jsonPath, JSON.stringify(completeItem, null, 2));
72
+ // Also create dummy .md file
73
+ const mdPath = join(typeDir, `${item.id}.md`);
74
+ writeFileSync(mdPath, `# ${item.title}\n\nTest item`);
75
+ }
76
+ /**
77
+ * Helper: Create a corrupt JSON file
78
+ */
79
+ function createCorruptFile(type, id) {
80
+ const typeDir = join(devstepsDir, `${type}s`);
81
+ mkdirSync(typeDir, { recursive: true });
82
+ const jsonPath = join(typeDir, `${id}.json`);
83
+ writeFileSync(jsonPath, '{corrupt json content');
84
+ }
85
+ /**
86
+ * Helper: Create an invalid item (missing required fields)
87
+ */
88
+ function createInvalidItemFile(type, id) {
89
+ const typeDir = join(devstepsDir, `${type}s`);
90
+ mkdirSync(typeDir, { recursive: true });
91
+ const jsonPath = join(typeDir, `${id}.json`);
92
+ writeFileSync(jsonPath, JSON.stringify({ invalid: true }, null, 2));
93
+ }
94
+ describe('rebuildIndex - Basic Functionality', () => {
95
+ it('should rebuild empty index successfully', async () => {
96
+ const result = await rebuildIndex(devstepsDir);
97
+ expect(result.totalItems).toBe(0);
98
+ expect(result.processedItems).toBe(0);
99
+ expect(result.skippedItems).toBe(0);
100
+ expect(result.errors).toEqual([]);
101
+ expect(hasRefsStyleIndex(devstepsDir)).toBe(true);
102
+ });
103
+ it('should rebuild index with single item', async () => {
104
+ createItemFile('task', {
105
+ id: 'TASK-001',
106
+ type: 'task',
107
+ title: 'Test Task',
108
+ status: 'draft',
109
+ eisenhower: 'not-urgent-not-important',
110
+ created: new Date().toISOString(),
111
+ updated: new Date().toISOString(),
112
+ });
113
+ const result = await rebuildIndex(devstepsDir);
114
+ expect(result.totalItems).toBe(1);
115
+ expect(result.processedItems).toBe(1);
116
+ expect(result.skippedItems).toBe(0);
117
+ expect(result.filesCreated).toBeGreaterThan(0);
118
+ // Verify index was created correctly
119
+ const taskIds = loadIndexByType(devstepsDir, 'task');
120
+ expect(taskIds).toEqual(['TASK-001']);
121
+ const draftIds = loadIndexByStatus(devstepsDir, 'draft');
122
+ expect(draftIds).toEqual(['TASK-001']);
123
+ });
124
+ it('should rebuild index with multiple items of different types', async () => {
125
+ createItemFile('task', {
126
+ id: 'TASK-001',
127
+ type: 'task',
128
+ title: 'Task 1',
129
+ status: 'draft',
130
+ eisenhower: 'urgent-important',
131
+ created: new Date().toISOString(),
132
+ updated: new Date().toISOString(),
133
+ });
134
+ createItemFile('epic', {
135
+ id: 'EPIC-001',
136
+ type: 'epic',
137
+ title: 'Epic 1',
138
+ status: 'planned',
139
+ eisenhower: 'not-urgent-important',
140
+ created: new Date().toISOString(),
141
+ updated: new Date().toISOString(),
142
+ });
143
+ createItemFile('story', {
144
+ id: 'STORY-001',
145
+ type: 'story',
146
+ title: 'Story 1',
147
+ status: 'in-progress',
148
+ eisenhower: 'urgent-not-important',
149
+ created: new Date().toISOString(),
150
+ updated: new Date().toISOString(),
151
+ });
152
+ const result = await rebuildIndex(devstepsDir);
153
+ // Debug output on failure
154
+ if (result.totalItems !== 3) {
155
+ console.log('Rebuild result:', JSON.stringify(result, null, 2));
156
+ }
157
+ expect(result.totalItems).toBe(3);
158
+ expect(result.processedItems).toBe(3);
159
+ expect(result.stats.byType).toEqual({
160
+ task: 1,
161
+ epic: 1,
162
+ story: 1,
163
+ });
164
+ });
165
+ it('should calculate statistics correctly', async () => {
166
+ // Create items with various attributes
167
+ createItemFile('task', {
168
+ id: 'TASK-001',
169
+ type: 'task',
170
+ title: 'Task 1',
171
+ status: 'draft',
172
+ eisenhower: 'urgent-important',
173
+ created: new Date().toISOString(),
174
+ updated: new Date().toISOString(),
175
+ });
176
+ createItemFile('task', {
177
+ id: 'TASK-002',
178
+ type: 'task',
179
+ title: 'Task 2',
180
+ status: 'draft',
181
+ eisenhower: 'urgent-important',
182
+ created: new Date().toISOString(),
183
+ updated: new Date().toISOString(),
184
+ });
185
+ createItemFile('task', {
186
+ id: 'TASK-003',
187
+ type: 'task',
188
+ title: 'Task 3',
189
+ status: 'done',
190
+ eisenhower: 'not-urgent-not-important',
191
+ created: new Date().toISOString(),
192
+ updated: new Date().toISOString(),
193
+ });
194
+ const result = await rebuildIndex(devstepsDir);
195
+ expect(result.stats.byType.task).toBe(3);
196
+ expect(result.stats.byStatus.draft).toBe(2);
197
+ expect(result.stats.byStatus.done).toBe(1);
198
+ expect(result.stats.byPriority['urgent-important']).toBe(2);
199
+ expect(result.stats.byPriority['not-urgent-not-important']).toBe(1);
200
+ });
201
+ });
202
+ describe('rebuildIndex - Dry Run Mode', () => {
203
+ it('should not create index in dry-run mode', async () => {
204
+ createItemFile('task', {
205
+ id: 'TASK-001',
206
+ type: 'task',
207
+ title: 'Test Task',
208
+ status: 'draft',
209
+ eisenhower: 'not-urgent-not-important',
210
+ created: new Date().toISOString(),
211
+ updated: new Date().toISOString(),
212
+ });
213
+ const result = await rebuildIndex(devstepsDir, { dryRun: true });
214
+ expect(result.totalItems).toBe(1);
215
+ expect(result.processedItems).toBe(1);
216
+ expect(result.filesCreated).toBe(0);
217
+ // Verify no index was created
218
+ expect(hasRefsStyleIndex(devstepsDir)).toBe(false);
219
+ });
220
+ it('should still scan and report items in dry-run mode', async () => {
221
+ createItemFile('task', {
222
+ id: 'TASK-001',
223
+ type: 'task',
224
+ title: 'Task 1',
225
+ status: 'draft',
226
+ eisenhower: 'urgent-important',
227
+ created: new Date().toISOString(),
228
+ updated: new Date().toISOString(),
229
+ });
230
+ createItemFile('epic', {
231
+ id: 'EPIC-001',
232
+ type: 'epic',
233
+ title: 'Epic 1',
234
+ status: 'planned',
235
+ eisenhower: 'not-urgent-important',
236
+ created: new Date().toISOString(),
237
+ updated: new Date().toISOString(),
238
+ });
239
+ const result = await rebuildIndex(devstepsDir, { dryRun: true });
240
+ expect(result.processedItems).toBe(2);
241
+ expect(result.stats.byType).toEqual({
242
+ task: 1,
243
+ epic: 1,
244
+ });
245
+ });
246
+ });
247
+ describe('rebuildIndex - Backup Functionality', () => {
248
+ it('should create backup when backup=true', async () => {
249
+ // First, create an initial index
250
+ createItemFile('task', {
251
+ id: 'TASK-001',
252
+ type: 'task',
253
+ title: 'Task 1',
254
+ status: 'draft',
255
+ eisenhower: 'not-urgent-not-important',
256
+ created: new Date().toISOString(),
257
+ updated: new Date().toISOString(),
258
+ });
259
+ await rebuildIndex(devstepsDir, { backup: false });
260
+ // Now rebuild with backup
261
+ const result = await rebuildIndex(devstepsDir, { backup: true });
262
+ expect(result.backupPath).toBeDefined();
263
+ expect(result.backupPath).toContain('index.backup-');
264
+ expect(existsSync(result.backupPath)).toBe(true);
265
+ });
266
+ it('should skip backup when backup=false', async () => {
267
+ // Create initial index
268
+ createItemFile('task', {
269
+ id: 'TASK-001',
270
+ type: 'task',
271
+ title: 'Task 1',
272
+ status: 'draft',
273
+ eisenhower: 'not-urgent-not-important',
274
+ created: new Date().toISOString(),
275
+ updated: new Date().toISOString(),
276
+ });
277
+ await rebuildIndex(devstepsDir, { backup: false });
278
+ // Rebuild without backup
279
+ const result = await rebuildIndex(devstepsDir, { backup: false });
280
+ expect(result.backupPath).toBeUndefined();
281
+ });
282
+ it('should not create backup in dry-run mode', async () => {
283
+ createItemFile('task', {
284
+ id: 'TASK-001',
285
+ type: 'task',
286
+ title: 'Task 1',
287
+ status: 'draft',
288
+ eisenhower: 'not-urgent-not-important',
289
+ created: new Date().toISOString(),
290
+ updated: new Date().toISOString(),
291
+ });
292
+ const result = await rebuildIndex(devstepsDir, { dryRun: true, backup: true });
293
+ expect(result.backupPath).toBeUndefined();
294
+ });
295
+ });
296
+ describe('rebuildIndex - Error Handling', () => {
297
+ it('should handle corrupt JSON files gracefully', async () => {
298
+ createItemFile('task', {
299
+ id: 'TASK-001',
300
+ type: 'task',
301
+ title: 'Valid Task',
302
+ status: 'draft',
303
+ eisenhower: 'not-urgent-not-important',
304
+ created: new Date().toISOString(),
305
+ updated: new Date().toISOString(),
306
+ });
307
+ createCorruptFile('task', 'TASK-002');
308
+ const result = await rebuildIndex(devstepsDir);
309
+ expect(result.processedItems).toBe(1);
310
+ expect(result.skippedItems).toBe(1);
311
+ expect(result.totalItems).toBe(2);
312
+ expect(result.errors).toHaveLength(1);
313
+ expect(result.errors[0].file).toContain('TASK-002.json');
314
+ });
315
+ it('should handle invalid item metadata', async () => {
316
+ createItemFile('task', {
317
+ id: 'TASK-001',
318
+ type: 'task',
319
+ title: 'Valid Task',
320
+ status: 'draft',
321
+ eisenhower: 'not-urgent-not-important',
322
+ created: new Date().toISOString(),
323
+ updated: new Date().toISOString(),
324
+ });
325
+ createInvalidItemFile('task', 'TASK-002');
326
+ const result = await rebuildIndex(devstepsDir);
327
+ expect(result.processedItems).toBe(1);
328
+ expect(result.skippedItems).toBe(1);
329
+ expect(result.errors).toHaveLength(1);
330
+ expect(result.errors[0].error).toContain('missing required fields');
331
+ });
332
+ it('should handle multiple errors gracefully', async () => {
333
+ createCorruptFile('task', 'TASK-001');
334
+ createInvalidItemFile('task', 'TASK-002');
335
+ createCorruptFile('epic', 'EPIC-001');
336
+ const result = await rebuildIndex(devstepsDir);
337
+ expect(result.processedItems).toBe(0);
338
+ expect(result.skippedItems).toBe(3);
339
+ expect(result.errors).toHaveLength(3);
340
+ });
341
+ it('should throw error when devsteps directory does not exist', async () => {
342
+ const nonExistentDir = join(testDir, 'nonexistent', '.devsteps');
343
+ await expect(rebuildIndex(nonExistentDir)).rejects.toThrow('DevSteps directory not found');
344
+ });
345
+ });
346
+ describe('rebuildIndex - Counter Extraction', () => {
347
+ it('should extract correct counters from items', async () => {
348
+ createItemFile('task', {
349
+ id: 'TASK-005',
350
+ type: 'task',
351
+ title: 'Task 5',
352
+ status: 'draft',
353
+ eisenhower: 'not-urgent-not-important',
354
+ created: new Date().toISOString(),
355
+ updated: new Date().toISOString(),
356
+ });
357
+ createItemFile('task', {
358
+ id: 'TASK-003',
359
+ type: 'task',
360
+ title: 'Task 3',
361
+ status: 'draft',
362
+ eisenhower: 'not-urgent-not-important',
363
+ created: new Date().toISOString(),
364
+ updated: new Date().toISOString(),
365
+ });
366
+ createItemFile('epic', {
367
+ id: 'EPIC-010',
368
+ type: 'epic',
369
+ title: 'Epic 10',
370
+ status: 'planned',
371
+ eisenhower: 'not-urgent-important',
372
+ created: new Date().toISOString(),
373
+ updated: new Date().toISOString(),
374
+ });
375
+ await rebuildIndex(devstepsDir);
376
+ const counters = loadCounters(devstepsDir);
377
+ // Should extract highest ID for each type
378
+ expect(counters.TASK).toBe(5);
379
+ expect(counters.EPIC).toBe(10);
380
+ });
381
+ it('should handle items with missing eisenhower field', async () => {
382
+ // Create item without eisenhower field
383
+ const typeDir = join(devstepsDir, 'tasks');
384
+ mkdirSync(typeDir, { recursive: true });
385
+ const jsonPath = join(typeDir, 'TASK-001.json');
386
+ writeFileSync(jsonPath, JSON.stringify({
387
+ id: 'TASK-001',
388
+ type: 'task',
389
+ title: 'Task without eisenhower',
390
+ status: 'draft',
391
+ created: new Date().toISOString(),
392
+ updated: new Date().toISOString(),
393
+ }));
394
+ const result = await rebuildIndex(devstepsDir);
395
+ expect(result.processedItems).toBe(1);
396
+ expect(result.stats.byPriority['not-urgent-not-important']).toBe(1);
397
+ });
398
+ });
399
+ describe('rebuildIndex - Progress Callback', () => {
400
+ it('should call progress callback during rebuild', async () => {
401
+ createItemFile('task', {
402
+ id: 'TASK-001',
403
+ type: 'task',
404
+ title: 'Task 1',
405
+ status: 'draft',
406
+ eisenhower: 'not-urgent-not-important',
407
+ created: new Date().toISOString(),
408
+ updated: new Date().toISOString(),
409
+ });
410
+ const progressMessages = [];
411
+ await rebuildIndex(devstepsDir, {
412
+ onProgress: (current, total, message) => {
413
+ progressMessages.push(message);
414
+ },
415
+ });
416
+ expect(progressMessages.length).toBeGreaterThan(0);
417
+ expect(progressMessages.some((msg) => msg.includes('Scanning'))).toBe(true);
418
+ });
419
+ });
420
+ describe('rebuildIndex - Edge Cases', () => {
421
+ it('should handle empty project with no item directories', async () => {
422
+ const result = await rebuildIndex(devstepsDir);
423
+ expect(result.totalItems).toBe(0);
424
+ expect(result.processedItems).toBe(0);
425
+ expect(result.errors).toEqual([]);
426
+ });
427
+ it('should ignore non-JSON files in item directories', async () => {
428
+ const typeDir = join(devstepsDir, 'tasks');
429
+ mkdirSync(typeDir, { recursive: true });
430
+ // Create various non-JSON files
431
+ writeFileSync(join(typeDir, 'README.md'), '# Tasks');
432
+ writeFileSync(join(typeDir, 'config.txt'), 'config');
433
+ writeFileSync(join(typeDir, '.gitignore'), 'node_modules');
434
+ const result = await rebuildIndex(devstepsDir);
435
+ expect(result.processedItems).toBe(0);
436
+ expect(result.errors).toEqual([]);
437
+ });
438
+ it('should handle large number of items', async () => {
439
+ // Create 100 tasks
440
+ for (let i = 1; i <= 100; i++) {
441
+ createItemFile('task', {
442
+ id: `TASK-${String(i).padStart(3, '0')}`,
443
+ type: 'task',
444
+ title: `Task ${i}`,
445
+ status: i % 2 === 0 ? 'draft' : 'done',
446
+ eisenhower: i % 3 === 0 ? 'urgent-important' : 'not-urgent-not-important',
447
+ created: new Date().toISOString(),
448
+ updated: new Date().toISOString(),
449
+ });
450
+ }
451
+ const result = await rebuildIndex(devstepsDir);
452
+ expect(result.processedItems).toBe(100);
453
+ expect(result.stats.byType.task).toBe(100);
454
+ expect(result.stats.byStatus.draft).toBe(50);
455
+ expect(result.stats.byStatus.done).toBe(50);
456
+ });
457
+ it('should handle items with all possible statuses', async () => {
458
+ const statuses = [
459
+ 'draft',
460
+ 'planned',
461
+ 'in-progress',
462
+ 'review',
463
+ 'done',
464
+ 'blocked',
465
+ 'cancelled',
466
+ 'obsolete',
467
+ ];
468
+ statuses.forEach((status, index) => {
469
+ createItemFile('task', {
470
+ id: `TASK-${String(index + 1).padStart(3, '0')}`,
471
+ type: 'task',
472
+ title: `Task ${status}`,
473
+ status,
474
+ eisenhower: 'not-urgent-not-important',
475
+ created: new Date().toISOString(),
476
+ updated: new Date().toISOString(),
477
+ });
478
+ });
479
+ const result = await rebuildIndex(devstepsDir);
480
+ expect(result.processedItems).toBe(statuses.length);
481
+ statuses.forEach((status) => {
482
+ expect(result.stats.byStatus[status]).toBe(1);
483
+ });
484
+ });
485
+ it('should handle all eisenhower quadrants', async () => {
486
+ const quadrants = [
487
+ 'urgent-important',
488
+ 'not-urgent-important',
489
+ 'urgent-not-important',
490
+ 'not-urgent-not-important',
491
+ ];
492
+ quadrants.forEach((quadrant, index) => {
493
+ createItemFile('task', {
494
+ id: `TASK-${String(index + 1).padStart(3, '0')}`,
495
+ type: 'task',
496
+ title: `Task ${quadrant}`,
497
+ status: 'draft',
498
+ eisenhower: quadrant,
499
+ created: new Date().toISOString(),
500
+ updated: new Date().toISOString(),
501
+ });
502
+ });
503
+ const result = await rebuildIndex(devstepsDir);
504
+ expect(result.processedItems).toBe(quadrants.length);
505
+ quadrants.forEach((quadrant) => {
506
+ expect(result.stats.byPriority[quadrant]).toBe(1);
507
+ });
508
+ });
509
+ });
510
+ describe('rebuildIndex - Integration with Index Refs', () => {
511
+ it('should create queryable index after rebuild', async () => {
512
+ createItemFile('task', {
513
+ id: 'TASK-001',
514
+ type: 'task',
515
+ title: 'Task 1',
516
+ status: 'draft',
517
+ eisenhower: 'urgent-important',
518
+ created: new Date().toISOString(),
519
+ updated: new Date().toISOString(),
520
+ });
521
+ createItemFile('task', {
522
+ id: 'TASK-002',
523
+ type: 'task',
524
+ title: 'Task 2',
525
+ status: 'done',
526
+ eisenhower: 'not-urgent-important',
527
+ created: new Date().toISOString(),
528
+ updated: new Date().toISOString(),
529
+ });
530
+ await rebuildIndex(devstepsDir);
531
+ // Verify index can be queried
532
+ const allTasks = loadIndexByType(devstepsDir, 'task');
533
+ expect(allTasks).toHaveLength(2);
534
+ expect(allTasks).toContain('TASK-001');
535
+ expect(allTasks).toContain('TASK-002');
536
+ const draftTasks = loadIndexByStatus(devstepsDir, 'draft');
537
+ expect(draftTasks).toEqual(['TASK-001']);
538
+ const doneTasks = loadIndexByStatus(devstepsDir, 'done');
539
+ expect(doneTasks).toEqual(['TASK-002']);
540
+ const urgentImportant = loadIndexByPriority(devstepsDir, 'urgent-important');
541
+ expect(urgentImportant).toEqual(['TASK-001']);
542
+ });
543
+ it('should preserve item order in index files', async () => {
544
+ // Create items in specific order
545
+ createItemFile('task', {
546
+ id: 'TASK-003',
547
+ type: 'task',
548
+ title: 'Task 3',
549
+ status: 'draft',
550
+ eisenhower: 'not-urgent-not-important',
551
+ created: new Date().toISOString(),
552
+ updated: new Date().toISOString(),
553
+ });
554
+ createItemFile('task', {
555
+ id: 'TASK-001',
556
+ type: 'task',
557
+ title: 'Task 1',
558
+ status: 'draft',
559
+ eisenhower: 'not-urgent-not-important',
560
+ created: new Date().toISOString(),
561
+ updated: new Date().toISOString(),
562
+ });
563
+ createItemFile('task', {
564
+ id: 'TASK-002',
565
+ type: 'task',
566
+ title: 'Task 2',
567
+ status: 'draft',
568
+ eisenhower: 'not-urgent-not-important',
569
+ created: new Date().toISOString(),
570
+ updated: new Date().toISOString(),
571
+ });
572
+ await rebuildIndex(devstepsDir);
573
+ const taskIds = loadIndexByType(devstepsDir, 'task');
574
+ expect(taskIds).toHaveLength(3);
575
+ // Order should be preserved as files are read
576
+ expect(taskIds).toContain('TASK-001');
577
+ expect(taskIds).toContain('TASK-002');
578
+ expect(taskIds).toContain('TASK-003');
579
+ });
580
+ });
581
+ });
582
+ //# sourceMappingURL=index-rebuild.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-rebuild.test.js","sourceRoot":"","sources":["../../src/core/index-rebuild.test.ts"],"names":[],"mappings":"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"}