@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,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"}