@rengler33/prov 0.1.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.
Files changed (146) hide show
  1. package/README.md +314 -0
  2. package/dist/cli.d.ts +26 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +381 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/agent.d.ts +107 -0
  7. package/dist/commands/agent.d.ts.map +1 -0
  8. package/dist/commands/agent.js +197 -0
  9. package/dist/commands/agent.js.map +1 -0
  10. package/dist/commands/agent.test.d.ts +5 -0
  11. package/dist/commands/agent.test.d.ts.map +1 -0
  12. package/dist/commands/agent.test.js +199 -0
  13. package/dist/commands/agent.test.js.map +1 -0
  14. package/dist/commands/constraint.d.ts +100 -0
  15. package/dist/commands/constraint.d.ts.map +1 -0
  16. package/dist/commands/constraint.js +763 -0
  17. package/dist/commands/constraint.js.map +1 -0
  18. package/dist/commands/constraint.test.d.ts +9 -0
  19. package/dist/commands/constraint.test.d.ts.map +1 -0
  20. package/dist/commands/constraint.test.js +470 -0
  21. package/dist/commands/constraint.test.js.map +1 -0
  22. package/dist/commands/graph.d.ts +99 -0
  23. package/dist/commands/graph.d.ts.map +1 -0
  24. package/dist/commands/graph.js +552 -0
  25. package/dist/commands/graph.js.map +1 -0
  26. package/dist/commands/graph.test.d.ts +2 -0
  27. package/dist/commands/graph.test.d.ts.map +1 -0
  28. package/dist/commands/graph.test.js +258 -0
  29. package/dist/commands/graph.test.js.map +1 -0
  30. package/dist/commands/impact.d.ts +83 -0
  31. package/dist/commands/impact.d.ts.map +1 -0
  32. package/dist/commands/impact.js +319 -0
  33. package/dist/commands/impact.js.map +1 -0
  34. package/dist/commands/impact.test.d.ts +2 -0
  35. package/dist/commands/impact.test.d.ts.map +1 -0
  36. package/dist/commands/impact.test.js +234 -0
  37. package/dist/commands/impact.test.js.map +1 -0
  38. package/dist/commands/init.d.ts +45 -0
  39. package/dist/commands/init.d.ts.map +1 -0
  40. package/dist/commands/init.js +94 -0
  41. package/dist/commands/init.js.map +1 -0
  42. package/dist/commands/init.test.d.ts +7 -0
  43. package/dist/commands/init.test.d.ts.map +1 -0
  44. package/dist/commands/init.test.js +174 -0
  45. package/dist/commands/init.test.js.map +1 -0
  46. package/dist/commands/integration.test.d.ts +10 -0
  47. package/dist/commands/integration.test.d.ts.map +1 -0
  48. package/dist/commands/integration.test.js +456 -0
  49. package/dist/commands/integration.test.js.map +1 -0
  50. package/dist/commands/mcp.d.ts +21 -0
  51. package/dist/commands/mcp.d.ts.map +1 -0
  52. package/dist/commands/mcp.js +616 -0
  53. package/dist/commands/mcp.js.map +1 -0
  54. package/dist/commands/mcp.test.d.ts +7 -0
  55. package/dist/commands/mcp.test.d.ts.map +1 -0
  56. package/dist/commands/mcp.test.js +132 -0
  57. package/dist/commands/mcp.test.js.map +1 -0
  58. package/dist/commands/plan.d.ts +218 -0
  59. package/dist/commands/plan.d.ts.map +1 -0
  60. package/dist/commands/plan.js +1307 -0
  61. package/dist/commands/plan.js.map +1 -0
  62. package/dist/commands/plan.test.d.ts +9 -0
  63. package/dist/commands/plan.test.d.ts.map +1 -0
  64. package/dist/commands/plan.test.js +569 -0
  65. package/dist/commands/plan.test.js.map +1 -0
  66. package/dist/commands/spec.d.ts +94 -0
  67. package/dist/commands/spec.d.ts.map +1 -0
  68. package/dist/commands/spec.js +635 -0
  69. package/dist/commands/spec.js.map +1 -0
  70. package/dist/commands/spec.test.d.ts +9 -0
  71. package/dist/commands/spec.test.d.ts.map +1 -0
  72. package/dist/commands/spec.test.js +407 -0
  73. package/dist/commands/spec.test.js.map +1 -0
  74. package/dist/commands/trace.d.ts +157 -0
  75. package/dist/commands/trace.d.ts.map +1 -0
  76. package/dist/commands/trace.js +847 -0
  77. package/dist/commands/trace.js.map +1 -0
  78. package/dist/commands/trace.test.d.ts +9 -0
  79. package/dist/commands/trace.test.d.ts.map +1 -0
  80. package/dist/commands/trace.test.js +524 -0
  81. package/dist/commands/trace.test.js.map +1 -0
  82. package/dist/graph.d.ts +204 -0
  83. package/dist/graph.d.ts.map +1 -0
  84. package/dist/graph.js +496 -0
  85. package/dist/graph.js.map +1 -0
  86. package/dist/graph.test.d.ts +2 -0
  87. package/dist/graph.test.d.ts.map +1 -0
  88. package/dist/graph.test.js +382 -0
  89. package/dist/graph.test.js.map +1 -0
  90. package/dist/hash.d.ts +72 -0
  91. package/dist/hash.d.ts.map +1 -0
  92. package/dist/hash.js +137 -0
  93. package/dist/hash.js.map +1 -0
  94. package/dist/hash.test.d.ts +2 -0
  95. package/dist/hash.test.d.ts.map +1 -0
  96. package/dist/hash.test.js +227 -0
  97. package/dist/hash.test.js.map +1 -0
  98. package/dist/index.d.ts +18 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +64 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/index.test.d.ts +2 -0
  103. package/dist/index.test.d.ts.map +1 -0
  104. package/dist/index.test.js +11 -0
  105. package/dist/index.test.js.map +1 -0
  106. package/dist/output.d.ts +84 -0
  107. package/dist/output.d.ts.map +1 -0
  108. package/dist/output.js +175 -0
  109. package/dist/output.js.map +1 -0
  110. package/dist/output.test.d.ts +7 -0
  111. package/dist/output.test.d.ts.map +1 -0
  112. package/dist/output.test.js +146 -0
  113. package/dist/output.test.js.map +1 -0
  114. package/dist/staleness.d.ts +162 -0
  115. package/dist/staleness.d.ts.map +1 -0
  116. package/dist/staleness.js +309 -0
  117. package/dist/staleness.js.map +1 -0
  118. package/dist/staleness.test.d.ts +2 -0
  119. package/dist/staleness.test.d.ts.map +1 -0
  120. package/dist/staleness.test.js +448 -0
  121. package/dist/staleness.test.js.map +1 -0
  122. package/dist/storage.d.ts +267 -0
  123. package/dist/storage.d.ts.map +1 -0
  124. package/dist/storage.js +623 -0
  125. package/dist/storage.js.map +1 -0
  126. package/dist/storage.test.d.ts +5 -0
  127. package/dist/storage.test.d.ts.map +1 -0
  128. package/dist/storage.test.js +434 -0
  129. package/dist/storage.test.js.map +1 -0
  130. package/dist/types.d.ts +270 -0
  131. package/dist/types.d.ts.map +1 -0
  132. package/dist/types.js +12 -0
  133. package/dist/types.js.map +1 -0
  134. package/dist/types.test.d.ts +2 -0
  135. package/dist/types.test.d.ts.map +1 -0
  136. package/dist/types.test.js +232 -0
  137. package/dist/types.test.js.map +1 -0
  138. package/dist/watcher.d.ts +139 -0
  139. package/dist/watcher.d.ts.map +1 -0
  140. package/dist/watcher.js +406 -0
  141. package/dist/watcher.js.map +1 -0
  142. package/dist/watcher.test.d.ts +5 -0
  143. package/dist/watcher.test.d.ts.map +1 -0
  144. package/dist/watcher.test.js +327 -0
  145. package/dist/watcher.test.js.map +1 -0
  146. package/package.json +53 -0
@@ -0,0 +1,434 @@
1
+ /**
2
+ * Tests for the storage layer.
3
+ */
4
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
5
+ import { mkdirSync, rmSync, existsSync, writeFileSync, readFileSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ import { tmpdir } from 'node:os';
8
+ import { PROV_DIR, GRAPH_FILE, MAPPINGS_DIR, CACHE_DIR, getProvDir, getGraphPath, getMappingsDir, getCacheDir, getMappingPath, isInitialized, initialize, acquireLock, releaseLock, atomicWrite, saveGraph, loadGraph, saveMapping, loadMapping, deleteMapping, listMappings, getCachedHash, setCachedHash, clearCache, Storage, } from './storage.js';
9
+ import { IntentGraph } from './graph.js';
10
+ // Test utilities
11
+ function createTestDir() {
12
+ const dir = join(tmpdir(), `prov-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
13
+ mkdirSync(dir, { recursive: true });
14
+ return dir;
15
+ }
16
+ function cleanupTestDir(dir) {
17
+ if (existsSync(dir)) {
18
+ rmSync(dir, { recursive: true, force: true });
19
+ }
20
+ }
21
+ describe('Path Utilities', () => {
22
+ const testRoot = '/test/project';
23
+ it('getProvDir returns correct path', () => {
24
+ expect(getProvDir(testRoot)).toBe(`${testRoot}/${PROV_DIR}`);
25
+ });
26
+ it('getGraphPath returns correct path', () => {
27
+ expect(getGraphPath(testRoot)).toBe(`${testRoot}/${PROV_DIR}/${GRAPH_FILE}`);
28
+ });
29
+ it('getMappingsDir returns correct path', () => {
30
+ expect(getMappingsDir(testRoot)).toBe(`${testRoot}/${PROV_DIR}/${MAPPINGS_DIR}`);
31
+ });
32
+ it('getCacheDir returns correct path', () => {
33
+ expect(getCacheDir(testRoot)).toBe(`${testRoot}/${PROV_DIR}/${CACHE_DIR}`);
34
+ });
35
+ it('getMappingPath converts source path to mapping path', () => {
36
+ expect(getMappingPath('src/auth/login.ts', testRoot)).toBe(`${testRoot}/${PROV_DIR}/${MAPPINGS_DIR}/src/auth/login.ts.yaml`);
37
+ });
38
+ it('getMappingPath handles paths with leading slash', () => {
39
+ expect(getMappingPath('/src/utils.ts', testRoot)).toBe(`${testRoot}/${PROV_DIR}/${MAPPINGS_DIR}/src/utils.ts.yaml`);
40
+ });
41
+ it('getMappingPath handles Windows-style paths', () => {
42
+ expect(getMappingPath('src\\auth\\login.ts', testRoot)).toBe(`${testRoot}/${PROV_DIR}/${MAPPINGS_DIR}/src/auth/login.ts.yaml`);
43
+ });
44
+ });
45
+ describe('Directory Management', () => {
46
+ let testDir;
47
+ beforeEach(() => {
48
+ testDir = createTestDir();
49
+ });
50
+ afterEach(() => {
51
+ cleanupTestDir(testDir);
52
+ });
53
+ it('isInitialized returns false for uninitialized project', () => {
54
+ expect(isInitialized(testDir)).toBe(false);
55
+ });
56
+ it('isInitialized returns true after initialization', () => {
57
+ initialize(testDir);
58
+ expect(isInitialized(testDir)).toBe(true);
59
+ });
60
+ it('initialize creates directory structure', () => {
61
+ const result = initialize(testDir);
62
+ expect(result.success).toBe(true);
63
+ expect(existsSync(getProvDir(testDir))).toBe(true);
64
+ expect(existsSync(getMappingsDir(testDir))).toBe(true);
65
+ expect(existsSync(getCacheDir(testDir))).toBe(true);
66
+ });
67
+ it('initialize creates .gitignore in cache directory', () => {
68
+ initialize(testDir);
69
+ const gitignorePath = join(getCacheDir(testDir), '.gitignore');
70
+ expect(existsSync(gitignorePath)).toBe(true);
71
+ const content = readFileSync(gitignorePath, 'utf8');
72
+ expect(content).toContain('*');
73
+ expect(content).toContain('!.gitignore');
74
+ });
75
+ it('initialize is idempotent', () => {
76
+ const result1 = initialize(testDir);
77
+ const result2 = initialize(testDir);
78
+ expect(result1.success).toBe(true);
79
+ expect(result2.success).toBe(true);
80
+ });
81
+ });
82
+ describe('Lock Management', () => {
83
+ let testDir;
84
+ beforeEach(() => {
85
+ testDir = createTestDir();
86
+ initialize(testDir);
87
+ });
88
+ afterEach(() => {
89
+ releaseLock(testDir);
90
+ cleanupTestDir(testDir);
91
+ });
92
+ it('acquireLock succeeds when no lock exists', () => {
93
+ const result = acquireLock(testDir);
94
+ expect(result.success).toBe(true);
95
+ });
96
+ it('acquireLock fails when lock already held', () => {
97
+ acquireLock(testDir);
98
+ const result = acquireLock(testDir);
99
+ expect(result.success).toBe(false);
100
+ expect(result.error).toContain('Lock');
101
+ });
102
+ it('releaseLock removes the lock', () => {
103
+ acquireLock(testDir);
104
+ releaseLock(testDir);
105
+ const result = acquireLock(testDir);
106
+ expect(result.success).toBe(true);
107
+ });
108
+ it('releaseLock succeeds when no lock exists', () => {
109
+ const result = releaseLock(testDir);
110
+ expect(result.success).toBe(true);
111
+ });
112
+ });
113
+ describe('Atomic Write', () => {
114
+ let testDir;
115
+ beforeEach(() => {
116
+ testDir = createTestDir();
117
+ });
118
+ afterEach(() => {
119
+ cleanupTestDir(testDir);
120
+ });
121
+ it('atomicWrite creates file', () => {
122
+ const filePath = join(testDir, 'test.txt');
123
+ const content = 'Hello, World!';
124
+ const result = atomicWrite(filePath, content);
125
+ expect(result.success).toBe(true);
126
+ expect(readFileSync(filePath, 'utf8')).toBe(content);
127
+ });
128
+ it('atomicWrite creates parent directories', () => {
129
+ const filePath = join(testDir, 'nested', 'deep', 'test.txt');
130
+ const content = 'Hello!';
131
+ const result = atomicWrite(filePath, content);
132
+ expect(result.success).toBe(true);
133
+ expect(readFileSync(filePath, 'utf8')).toBe(content);
134
+ });
135
+ it('atomicWrite overwrites existing file', () => {
136
+ const filePath = join(testDir, 'test.txt');
137
+ writeFileSync(filePath, 'Old content');
138
+ const result = atomicWrite(filePath, 'New content');
139
+ expect(result.success).toBe(true);
140
+ expect(readFileSync(filePath, 'utf8')).toBe('New content');
141
+ });
142
+ });
143
+ describe('Graph Persistence', () => {
144
+ let testDir;
145
+ beforeEach(() => {
146
+ testDir = createTestDir();
147
+ initialize(testDir);
148
+ });
149
+ afterEach(() => {
150
+ cleanupTestDir(testDir);
151
+ });
152
+ it('loadGraph returns empty graph when no file exists', () => {
153
+ const result = loadGraph(testDir);
154
+ expect(result.success).toBe(true);
155
+ expect(result.data).toBeDefined();
156
+ expect(result.data?.nodeCount).toBe(0);
157
+ });
158
+ it('saveGraph and loadGraph round-trip', () => {
159
+ const graph = new IntentGraph();
160
+ const specId = 'spec:test:v1';
161
+ graph.addNode(specId, 'spec', {
162
+ id: specId,
163
+ version: '1.0.0',
164
+ title: 'Test Spec',
165
+ status: 'active',
166
+ intent: 'Test intent',
167
+ requirements: [],
168
+ });
169
+ const saveResult = saveGraph(graph, testDir);
170
+ expect(saveResult.success).toBe(true);
171
+ const loadResult = loadGraph(testDir);
172
+ expect(loadResult.success).toBe(true);
173
+ expect(loadResult.data?.nodeCount).toBe(1);
174
+ expect(loadResult.data?.getNode(specId)).toBeDefined();
175
+ });
176
+ it('saveGraph produces deterministic output', () => {
177
+ const graph1 = new IntentGraph();
178
+ const graph2 = new IntentGraph();
179
+ const specA = {
180
+ id: 'spec:a:v1',
181
+ version: '1.0.0',
182
+ title: 'Spec A',
183
+ status: 'active',
184
+ intent: 'Test A',
185
+ requirements: [],
186
+ };
187
+ const specB = {
188
+ id: 'spec:b:v1',
189
+ version: '1.0.0',
190
+ title: 'Spec B',
191
+ status: 'active',
192
+ intent: 'Test B',
193
+ requirements: [],
194
+ };
195
+ // Add nodes in different order
196
+ graph1.addNode('spec:a:v1', 'spec', specA);
197
+ graph1.addNode('spec:b:v1', 'spec', specB);
198
+ graph2.addNode('spec:b:v1', 'spec', specB);
199
+ graph2.addNode('spec:a:v1', 'spec', specA);
200
+ saveGraph(graph1, testDir);
201
+ const content1 = readFileSync(getGraphPath(testDir), 'utf8');
202
+ saveGraph(graph2, testDir);
203
+ const content2 = readFileSync(getGraphPath(testDir), 'utf8');
204
+ // Parse and compare structure (timestamps will differ)
205
+ const json1 = JSON.parse(content1);
206
+ const json2 = JSON.parse(content2);
207
+ expect(Object.keys(json1.nodes)).toEqual(Object.keys(json2.nodes));
208
+ });
209
+ it('loadGraph validates schema version', () => {
210
+ const graphPath = getGraphPath(testDir);
211
+ writeFileSync(graphPath, JSON.stringify({
212
+ schemaVersion: 999,
213
+ updatedAt: new Date().toISOString(),
214
+ nodes: {},
215
+ edges: [],
216
+ }));
217
+ const result = loadGraph(testDir);
218
+ expect(result.success).toBe(false);
219
+ expect(result.error).toContain('schema version');
220
+ });
221
+ it('preserves node hashes', () => {
222
+ const graph = new IntentGraph();
223
+ const hash = 'sha256:abc123def456';
224
+ graph.addNode('spec:test:v1', 'spec', {
225
+ id: 'spec:test:v1',
226
+ version: '1.0.0',
227
+ title: 'Test',
228
+ status: 'active',
229
+ intent: 'Test',
230
+ requirements: [],
231
+ }, hash);
232
+ saveGraph(graph, testDir);
233
+ const loadResult = loadGraph(testDir);
234
+ expect(loadResult.data?.getNode('spec:test:v1')?.hash).toBe(hash);
235
+ });
236
+ it('preserves edges', () => {
237
+ const graph = new IntentGraph();
238
+ graph.addNode('spec:test:v1', 'spec', {
239
+ id: 'spec:test:v1',
240
+ version: '1.0.0',
241
+ title: 'Test',
242
+ status: 'active',
243
+ intent: 'Test',
244
+ requirements: [],
245
+ });
246
+ graph.addNode('req:test:one', 'requirement', {
247
+ id: 'req:test:one',
248
+ description: 'Test requirement',
249
+ acceptance: ['Test acceptance'],
250
+ });
251
+ graph.addEdge('spec:test:v1', 'req:test:one', 'contains');
252
+ saveGraph(graph, testDir);
253
+ const loadResult = loadGraph(testDir);
254
+ const edges = loadResult.data?.getOutgoingEdges('spec:test:v1');
255
+ expect(edges).toBeDefined();
256
+ expect(edges?.length).toBe(1);
257
+ expect(edges?.[0]?.type).toBe('contains');
258
+ });
259
+ });
260
+ describe('Mapping Persistence', () => {
261
+ let testDir;
262
+ beforeEach(() => {
263
+ testDir = createTestDir();
264
+ initialize(testDir);
265
+ });
266
+ afterEach(() => {
267
+ cleanupTestDir(testDir);
268
+ });
269
+ it('loadMapping returns null when no file exists', () => {
270
+ const result = loadMapping('src/test.ts', testDir);
271
+ expect(result.success).toBe(true);
272
+ expect(result.data).toBeNull();
273
+ });
274
+ it('saveMapping and loadMapping round-trip', () => {
275
+ const mapping = {
276
+ path: 'src/auth/login.ts',
277
+ fileHash: 'sha256:abc123def456',
278
+ updatedAt: new Date().toISOString(),
279
+ mappings: [
280
+ {
281
+ startLine: 10,
282
+ endLine: 25,
283
+ stepId: 'step:auth:1',
284
+ },
285
+ ],
286
+ };
287
+ const saveResult = saveMapping(mapping, testDir);
288
+ expect(saveResult.success).toBe(true);
289
+ const loadResult = loadMapping('src/auth/login.ts', testDir);
290
+ expect(loadResult.success).toBe(true);
291
+ expect(loadResult.data?.path).toBe('src/auth/login.ts');
292
+ expect(loadResult.data?.mappings.length).toBe(1);
293
+ });
294
+ it('deleteMapping removes the mapping file', () => {
295
+ const mapping = {
296
+ path: 'src/test.ts',
297
+ fileHash: 'sha256:abc123',
298
+ updatedAt: new Date().toISOString(),
299
+ mappings: [],
300
+ };
301
+ saveMapping(mapping, testDir);
302
+ expect(loadMapping('src/test.ts', testDir).data).not.toBeNull();
303
+ deleteMapping('src/test.ts', testDir);
304
+ expect(loadMapping('src/test.ts', testDir).data).toBeNull();
305
+ });
306
+ it('listMappings returns all mapping paths', () => {
307
+ const mapping1 = {
308
+ path: 'src/a.ts',
309
+ fileHash: 'sha256:aaa',
310
+ updatedAt: new Date().toISOString(),
311
+ mappings: [],
312
+ };
313
+ const mapping2 = {
314
+ path: 'src/b.ts',
315
+ fileHash: 'sha256:bbb',
316
+ updatedAt: new Date().toISOString(),
317
+ mappings: [],
318
+ };
319
+ saveMapping(mapping1, testDir);
320
+ saveMapping(mapping2, testDir);
321
+ const result = listMappings(testDir);
322
+ expect(result.success).toBe(true);
323
+ expect(result.data).toContain('src/a.ts');
324
+ expect(result.data).toContain('src/b.ts');
325
+ });
326
+ it('listMappings returns empty array when no mappings exist', () => {
327
+ const result = listMappings(testDir);
328
+ expect(result.success).toBe(true);
329
+ expect(result.data).toEqual([]);
330
+ });
331
+ });
332
+ describe('Cache Management', () => {
333
+ let testDir;
334
+ beforeEach(() => {
335
+ testDir = createTestDir();
336
+ initialize(testDir);
337
+ });
338
+ afterEach(() => {
339
+ cleanupTestDir(testDir);
340
+ });
341
+ it('getCachedHash returns null when no cache exists', () => {
342
+ const hash = getCachedHash('src/test.ts', testDir);
343
+ expect(hash).toBeNull();
344
+ });
345
+ it('setCachedHash and getCachedHash round-trip', () => {
346
+ const hash = 'sha256:abc123def456';
347
+ const setResult = setCachedHash('src/test.ts', hash, testDir);
348
+ expect(setResult.success).toBe(true);
349
+ const cachedHash = getCachedHash('src/test.ts', testDir);
350
+ expect(cachedHash).toBe(hash);
351
+ });
352
+ it('clearCache removes all cached hashes', () => {
353
+ setCachedHash('src/a.ts', 'sha256:aaa', testDir);
354
+ setCachedHash('src/b.ts', 'sha256:bbb', testDir);
355
+ const clearResult = clearCache(testDir);
356
+ expect(clearResult.success).toBe(true);
357
+ expect(getCachedHash('src/a.ts', testDir)).toBeNull();
358
+ expect(getCachedHash('src/b.ts', testDir)).toBeNull();
359
+ });
360
+ it('clearCache preserves .gitignore', () => {
361
+ setCachedHash('src/test.ts', 'sha256:abc', testDir);
362
+ clearCache(testDir);
363
+ const gitignorePath = join(getCacheDir(testDir), '.gitignore');
364
+ expect(existsSync(gitignorePath)).toBe(true);
365
+ });
366
+ });
367
+ describe('Storage Class', () => {
368
+ let testDir;
369
+ let storage;
370
+ beforeEach(() => {
371
+ testDir = createTestDir();
372
+ storage = new Storage({ projectRoot: testDir });
373
+ });
374
+ afterEach(() => {
375
+ cleanupTestDir(testDir);
376
+ });
377
+ it('provides isInitialized method', () => {
378
+ expect(storage.isInitialized()).toBe(false);
379
+ storage.initialize();
380
+ expect(storage.isInitialized()).toBe(true);
381
+ });
382
+ it('provides graph operations', () => {
383
+ storage.initialize();
384
+ const graph = new IntentGraph();
385
+ graph.addNode('spec:test:v1', 'spec', {
386
+ id: 'spec:test:v1',
387
+ version: '1.0.0',
388
+ title: 'Test',
389
+ status: 'active',
390
+ intent: 'Test',
391
+ requirements: [],
392
+ });
393
+ const saveResult = storage.saveGraph(graph);
394
+ expect(saveResult.success).toBe(true);
395
+ const loadResult = storage.loadGraph();
396
+ expect(loadResult.success).toBe(true);
397
+ expect(loadResult.data?.nodeCount).toBe(1);
398
+ });
399
+ it('provides mapping operations', () => {
400
+ storage.initialize();
401
+ const mapping = {
402
+ path: 'src/test.ts',
403
+ fileHash: 'sha256:abc',
404
+ updatedAt: new Date().toISOString(),
405
+ mappings: [],
406
+ };
407
+ storage.saveMapping(mapping);
408
+ const loadResult = storage.loadMapping('src/test.ts');
409
+ expect(loadResult.data?.path).toBe('src/test.ts');
410
+ storage.deleteMapping('src/test.ts');
411
+ expect(storage.loadMapping('src/test.ts').data).toBeNull();
412
+ });
413
+ it('provides cache operations', () => {
414
+ storage.initialize();
415
+ storage.setCachedHash('src/test.ts', 'sha256:abc');
416
+ expect(storage.getCachedHash('src/test.ts')).toBe('sha256:abc');
417
+ storage.clearCache();
418
+ expect(storage.getCachedHash('src/test.ts')).toBeNull();
419
+ });
420
+ it('provides path utilities', () => {
421
+ expect(storage.paths.provDir).toBe(getProvDir(testDir));
422
+ expect(storage.paths.graphPath).toBe(getGraphPath(testDir));
423
+ expect(storage.paths.getMappingPath('src/test.ts')).toBe(getMappingPath('src/test.ts', testDir));
424
+ });
425
+ it('provides withLock for atomic operations', async () => {
426
+ storage.initialize();
427
+ const result = await storage.withLock(() => {
428
+ return 'success';
429
+ });
430
+ expect(result.success).toBe(true);
431
+ expect(result.data).toBe('success');
432
+ });
433
+ });
434
+ //# sourceMappingURL=storage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.test.js","sourceRoot":"","sources":["../src/storage.test.ts"],"names":[],"mappings":"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"}