kaimon-cli 0.1.46 → 0.3.0

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 (66) hide show
  1. package/README.md +44 -39
  2. package/dist/__tests__/commands/list.test.d.ts +2 -0
  3. package/dist/__tests__/commands/list.test.d.ts.map +1 -0
  4. package/dist/__tests__/commands/list.test.js +109 -0
  5. package/dist/__tests__/commands/list.test.js.map +1 -0
  6. package/dist/__tests__/commands/pull.test.js +153 -58
  7. package/dist/__tests__/commands/pull.test.js.map +1 -1
  8. package/dist/__tests__/integration/complete-user-journeys.test.d.ts +2 -0
  9. package/dist/__tests__/integration/complete-user-journeys.test.d.ts.map +1 -0
  10. package/dist/__tests__/integration/complete-user-journeys.test.js +348 -0
  11. package/dist/__tests__/integration/complete-user-journeys.test.js.map +1 -0
  12. package/dist/__tests__/integration/config-integration.test.d.ts +2 -0
  13. package/dist/__tests__/integration/config-integration.test.d.ts.map +1 -0
  14. package/dist/__tests__/integration/config-integration.test.js +151 -0
  15. package/dist/__tests__/integration/config-integration.test.js.map +1 -0
  16. package/dist/__tests__/integration/data-integrity.test.d.ts +2 -0
  17. package/dist/__tests__/integration/data-integrity.test.d.ts.map +1 -0
  18. package/dist/__tests__/integration/data-integrity.test.js +296 -0
  19. package/dist/__tests__/integration/data-integrity.test.js.map +1 -0
  20. package/dist/__tests__/integration/edge-cases-advanced.test.d.ts +2 -0
  21. package/dist/__tests__/integration/edge-cases-advanced.test.d.ts.map +1 -0
  22. package/dist/__tests__/integration/edge-cases-advanced.test.js +286 -0
  23. package/dist/__tests__/integration/edge-cases-advanced.test.js.map +1 -0
  24. package/dist/__tests__/integration/error-recovery.test.d.ts +2 -0
  25. package/dist/__tests__/integration/error-recovery.test.d.ts.map +1 -0
  26. package/dist/__tests__/integration/error-recovery.test.js +277 -0
  27. package/dist/__tests__/integration/error-recovery.test.js.map +1 -0
  28. package/dist/__tests__/integration/filesystem-edge-cases.test.d.ts +2 -0
  29. package/dist/__tests__/integration/filesystem-edge-cases.test.d.ts.map +1 -0
  30. package/dist/__tests__/integration/filesystem-edge-cases.test.js +218 -0
  31. package/dist/__tests__/integration/filesystem-edge-cases.test.js.map +1 -0
  32. package/dist/__tests__/integration/filtering-operations.test.d.ts +2 -0
  33. package/dist/__tests__/integration/filtering-operations.test.d.ts.map +1 -0
  34. package/dist/__tests__/integration/filtering-operations.test.js +278 -0
  35. package/dist/__tests__/integration/filtering-operations.test.js.map +1 -0
  36. package/dist/__tests__/integration/full-workflow.test.js +3 -57
  37. package/dist/__tests__/integration/full-workflow.test.js.map +1 -1
  38. package/dist/__tests__/integration/state-transitions.test.d.ts +2 -0
  39. package/dist/__tests__/integration/state-transitions.test.d.ts.map +1 -0
  40. package/dist/__tests__/integration/state-transitions.test.js +320 -0
  41. package/dist/__tests__/integration/state-transitions.test.js.map +1 -0
  42. package/dist/commands/auth.js +2 -2
  43. package/dist/commands/auth.js.map +1 -1
  44. package/dist/commands/config.js +1 -1
  45. package/dist/commands/list.d.ts +4 -0
  46. package/dist/commands/list.d.ts.map +1 -0
  47. package/dist/commands/list.js +19 -0
  48. package/dist/commands/list.js.map +1 -0
  49. package/dist/commands/pull.d.ts.map +1 -1
  50. package/dist/commands/pull.js +6 -4
  51. package/dist/commands/pull.js.map +1 -1
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +3 -5
  54. package/dist/index.js.map +1 -1
  55. package/dist/utils/listOperations.d.ts +5 -0
  56. package/dist/utils/listOperations.d.ts.map +1 -0
  57. package/dist/utils/listOperations.js +138 -0
  58. package/dist/utils/listOperations.js.map +1 -0
  59. package/dist/utils/projectConfig.d.ts.map +1 -1
  60. package/dist/utils/projectConfig.js +5 -6
  61. package/dist/utils/projectConfig.js.map +1 -1
  62. package/dist/utils/pullOperations.d.ts +8 -0
  63. package/dist/utils/pullOperations.d.ts.map +1 -0
  64. package/dist/utils/pullOperations.js +319 -0
  65. package/dist/utils/pullOperations.js.map +1 -0
  66. package/package.json +5 -4
@@ -0,0 +1,348 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ import { listDocuments } from '../../utils/listOperations.js';
6
+ import { pullDocuments } from '../../utils/pullOperations.js';
7
+ import * as config from '../../utils/config.js';
8
+ import * as supabaseClient from '../../utils/supabaseClient.js';
9
+ import * as tokenRefresh from '../../utils/tokenRefresh.js';
10
+ import { createTempDir, cleanupTempDir, mockConfig, mockDocumentRecord, mockBlockNoteContent, createMockSupabaseClient } from '../helpers.js';
11
+ describe('Complete User Journeys (Integration)', () => {
12
+ let tempDir;
13
+ let docsDir;
14
+ let consoleSpy;
15
+ beforeEach(() => {
16
+ tempDir = createTempDir();
17
+ docsDir = path.join(tempDir, 'KaimonDocs');
18
+ vi.spyOn(os, 'homedir').mockReturnValue(tempDir);
19
+ vi.spyOn(process, 'cwd').mockReturnValue(tempDir);
20
+ consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
21
+ });
22
+ afterEach(() => {
23
+ cleanupTempDir(tempDir);
24
+ vi.restoreAllMocks();
25
+ });
26
+ it('should complete full workflow: auth → list → pull → verify files', async () => {
27
+ // Step 1: Setup auth
28
+ config.saveConfig(mockConfig());
29
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
30
+ const mockSupabase = createMockSupabaseClient();
31
+ const mockDocs = [
32
+ mockDocumentRecord({
33
+ id: 'doc-1',
34
+ title: 'Document A',
35
+ updated_at: new Date().toISOString()
36
+ }),
37
+ mockDocumentRecord({
38
+ id: 'doc-2',
39
+ title: 'Document B',
40
+ updated_at: new Date(Date.now() - 86400000).toISOString() // 1 day ago
41
+ }),
42
+ mockDocumentRecord({
43
+ id: 'doc-3',
44
+ title: 'Document C',
45
+ updated_at: new Date(Date.now() - 172800000).toISOString() // 2 days ago
46
+ })
47
+ ];
48
+ mockSupabase.from.mockReturnValue({
49
+ select: vi.fn().mockReturnThis(),
50
+ order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
51
+ });
52
+ const mockContent = mockBlockNoteContent();
53
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
54
+ mockSupabase.storage.from.mockReturnValue({
55
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
56
+ });
57
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
58
+ // Step 2: List documents
59
+ await listDocuments();
60
+ const listOutput = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
61
+ expect(listOutput).toContain('Document A');
62
+ expect(listOutput).toContain('Document B');
63
+ expect(listOutput).toContain('Document C');
64
+ expect(listOutput).toContain('[NEW]'); // All should be new
65
+ // Step 3: Pull all documents
66
+ consoleSpy.mockClear();
67
+ await pullDocuments(false, true); // skipConfirmation = true
68
+ // Step 4: Verify files were created
69
+ expect(fs.existsSync(docsDir)).toBe(true);
70
+ const files = fs.readdirSync(docsDir);
71
+ expect(files.length).toBe(3);
72
+ const filenames = files.map(f => f.replace('.md', ''));
73
+ expect(filenames).toContain('Document-A');
74
+ expect(filenames).toContain('Document-B');
75
+ expect(filenames).toContain('Document-C');
76
+ // Step 5: Verify file contents have correct metadata
77
+ const fileA = fs.readFileSync(path.join(docsDir, 'Document-A.md'), 'utf-8');
78
+ expect(fileA).toContain('kaimon_id: "doc-1"');
79
+ expect(fileA).toContain('title: "Document A"');
80
+ expect(fileA).toContain('# Test Document');
81
+ });
82
+ it('should handle fresh start: new user → list shows 5 docs → pull all → verify 5 files', async () => {
83
+ // Simulate brand new user (no local files)
84
+ config.saveConfig(mockConfig());
85
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
86
+ const mockSupabase = createMockSupabaseClient();
87
+ const mockDocs = Array.from({ length: 5 }, (_, i) => mockDocumentRecord({
88
+ id: `doc-${i + 1}`,
89
+ title: `Document ${i + 1}`,
90
+ updated_at: new Date(Date.now() - i * 3600000).toISOString()
91
+ }));
92
+ mockSupabase.from.mockReturnValue({
93
+ select: vi.fn().mockReturnThis(),
94
+ order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
95
+ });
96
+ const mockContent = mockBlockNoteContent();
97
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
98
+ mockSupabase.storage.from.mockReturnValue({
99
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
100
+ });
101
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
102
+ // List should show all as NEW
103
+ await listDocuments();
104
+ const listOutput = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
105
+ expect(listOutput).toContain('5 total');
106
+ // Count [NEW] indicators
107
+ const newCount = (listOutput.match(/\[NEW\]/g) || []).length;
108
+ expect(newCount).toBe(5);
109
+ // Pull all
110
+ await pullDocuments(false, true);
111
+ // Verify exactly 5 files created
112
+ const files = fs.readdirSync(docsDir);
113
+ expect(files.length).toBe(5);
114
+ // Verify each file has correct structure
115
+ files.forEach((file, i) => {
116
+ const content = fs.readFileSync(path.join(docsDir, file), 'utf-8');
117
+ expect(content).toContain('kaimon_id:');
118
+ expect(content).toContain('title:');
119
+ expect(content).toContain('---'); // Frontmatter delimiter
120
+ });
121
+ });
122
+ it('should handle selective workflow: list 10 docs → pull 3 by title → verify exactly 3 files', async () => {
123
+ config.saveConfig(mockConfig());
124
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
125
+ const mockSupabase = createMockSupabaseClient();
126
+ const mockDocs = Array.from({ length: 10 }, (_, i) => mockDocumentRecord({
127
+ id: `doc-${i + 1}`,
128
+ title: `Document ${String.fromCharCode(65 + i)}`, // A-J
129
+ updated_at: new Date().toISOString()
130
+ }));
131
+ mockSupabase.from.mockReturnValue({
132
+ select: vi.fn().mockReturnThis(),
133
+ order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
134
+ });
135
+ const mockContent = mockBlockNoteContent();
136
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
137
+ mockSupabase.storage.from.mockReturnValue({
138
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
139
+ });
140
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
141
+ // List shows 10
142
+ await listDocuments();
143
+ const listOutput = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
144
+ expect(listOutput).toContain('10 total');
145
+ // Pull only 3 specific documents by title
146
+ await pullDocuments(false, true, ['Document A', 'Document E', 'Document J']);
147
+ // Verify exactly 3 files created
148
+ const files = fs.readdirSync(docsDir);
149
+ expect(files.length).toBe(3);
150
+ const filenames = files.map(f => f.replace('.md', ''));
151
+ expect(filenames).toContain('Document-A');
152
+ expect(filenames).toContain('Document-E');
153
+ expect(filenames).toContain('Document-J');
154
+ // Should NOT contain others
155
+ expect(filenames).not.toContain('Document-B');
156
+ expect(filenames).not.toContain('Document-C');
157
+ });
158
+ it('should handle multi-session workflow: pull → remote changes → list shows UPDATED → pull again', async () => {
159
+ config.saveConfig(mockConfig());
160
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
161
+ const mockSupabase = createMockSupabaseClient();
162
+ const initialTimestamp = new Date('2024-01-01T00:00:00Z');
163
+ const doc = mockDocumentRecord({
164
+ id: 'doc-123',
165
+ title: 'Test Document',
166
+ updated_at: initialTimestamp.toISOString()
167
+ });
168
+ mockSupabase.from.mockReturnValue({
169
+ select: vi.fn().mockReturnThis(),
170
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
171
+ });
172
+ const mockContent = mockBlockNoteContent('Test Document');
173
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
174
+ mockSupabase.storage.from.mockReturnValue({
175
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
176
+ });
177
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
178
+ // Session 1: Pull document
179
+ await pullDocuments(false, true);
180
+ expect(fs.existsSync(docsDir)).toBe(true);
181
+ const files1 = fs.readdirSync(docsDir);
182
+ expect(files1.length).toBe(1);
183
+ // Simulate remote update
184
+ const updatedTimestamp = new Date('2024-01-02T12:00:00Z');
185
+ const updatedDoc = mockDocumentRecord({
186
+ id: 'doc-123',
187
+ title: 'Test Document',
188
+ updated_at: updatedTimestamp.toISOString()
189
+ });
190
+ mockSupabase.from.mockReturnValue({
191
+ select: vi.fn().mockReturnThis(),
192
+ order: vi.fn().mockResolvedValue({ data: [updatedDoc], error: null })
193
+ });
194
+ const updatedContent = {
195
+ type: 'blocknote',
196
+ content: [
197
+ { type: 'heading', props: { level: 1 }, content: [{ type: 'text', text: 'Updated Content' }] },
198
+ { type: 'paragraph', content: [{ type: 'text', text: 'This document was updated remotely.' }] }
199
+ ]
200
+ };
201
+ const updatedBlob = new Blob([JSON.stringify(updatedContent)], { type: 'application/json' });
202
+ mockSupabase.storage.from.mockReturnValue({
203
+ download: vi.fn().mockResolvedValue({ data: updatedBlob, error: null })
204
+ });
205
+ // Session 2: List should show UPDATED
206
+ consoleSpy.mockClear();
207
+ await listDocuments();
208
+ const listOutput = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
209
+ expect(listOutput).toContain('[UPDATED]');
210
+ // Session 2: Pull again
211
+ await pullDocuments(false, true);
212
+ // Verify file was updated
213
+ const fileContent = fs.readFileSync(path.join(docsDir, files1[0]), 'utf-8');
214
+ expect(fileContent).toContain('# Updated Content');
215
+ expect(fileContent).toContain('This document was updated remotely');
216
+ });
217
+ it('should handle no changes workflow: pull → list shows UP-TO-DATE → pull skips', async () => {
218
+ config.saveConfig(mockConfig());
219
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
220
+ const mockSupabase = createMockSupabaseClient();
221
+ const doc = mockDocumentRecord({
222
+ id: 'doc-123',
223
+ title: 'Stable Document',
224
+ updated_at: new Date('2024-01-01T00:00:00Z').toISOString()
225
+ });
226
+ mockSupabase.from.mockReturnValue({
227
+ select: vi.fn().mockReturnThis(),
228
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
229
+ });
230
+ const mockContent = mockBlockNoteContent('Stable Document');
231
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
232
+ const downloadSpy = vi.fn().mockResolvedValue({ data: blob, error: null });
233
+ mockSupabase.storage.from.mockReturnValue({
234
+ download: downloadSpy
235
+ });
236
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
237
+ // First pull
238
+ await pullDocuments(false, true);
239
+ expect(downloadSpy).toHaveBeenCalledTimes(1);
240
+ const files = fs.readdirSync(docsDir);
241
+ expect(files.length).toBe(1);
242
+ // List should show UP-TO-DATE
243
+ consoleSpy.mockClear();
244
+ await listDocuments();
245
+ const listOutput = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
246
+ expect(listOutput).toContain('[UP-TO-DATE]');
247
+ // Second pull should skip
248
+ downloadSpy.mockClear();
249
+ consoleSpy.mockClear();
250
+ await pullDocuments(false, true);
251
+ expect(downloadSpy).not.toHaveBeenCalled();
252
+ const pullOutput = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
253
+ expect(pullOutput).toMatch(/All.*up to date|No changes to pull/i);
254
+ });
255
+ it('should handle mixed IDs and titles: pull 5 docs (3 by title, 2 by ID) from pool of 10', async () => {
256
+ config.saveConfig(mockConfig());
257
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
258
+ const mockSupabase = createMockSupabaseClient();
259
+ const mockDocs = [
260
+ mockDocumentRecord({ id: 'abc-111', title: 'Alpha' }),
261
+ mockDocumentRecord({ id: 'abc-222', title: 'Beta' }),
262
+ mockDocumentRecord({ id: 'abc-333', title: 'Gamma' }),
263
+ mockDocumentRecord({ id: 'abc-444', title: 'Delta' }),
264
+ mockDocumentRecord({ id: 'abc-555', title: 'Epsilon' }),
265
+ mockDocumentRecord({ id: 'abc-666', title: 'Zeta' }),
266
+ mockDocumentRecord({ id: 'abc-777', title: 'Eta' }),
267
+ mockDocumentRecord({ id: 'abc-888', title: 'Theta' }),
268
+ mockDocumentRecord({ id: 'abc-999', title: 'Iota' }),
269
+ mockDocumentRecord({ id: 'abc-000', title: 'Kappa' })
270
+ ];
271
+ mockSupabase.from.mockReturnValue({
272
+ select: vi.fn().mockReturnThis(),
273
+ order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
274
+ });
275
+ const mockContent = mockBlockNoteContent();
276
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
277
+ mockSupabase.storage.from.mockReturnValue({
278
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
279
+ });
280
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
281
+ // Pull: 3 by title (Alpha, Gamma, Epsilon) + 2 by ID (abc-444, abc-888)
282
+ await pullDocuments(false, true, ['Alpha', 'Gamma', 'Epsilon', 'abc-444', 'abc-888']);
283
+ // Verify exactly 5 files created
284
+ const files = fs.readdirSync(docsDir);
285
+ expect(files.length).toBe(5);
286
+ const filenames = files.map(f => f.replace('.md', ''));
287
+ expect(filenames).toContain('Alpha');
288
+ expect(filenames).toContain('Gamma');
289
+ expect(filenames).toContain('Epsilon');
290
+ expect(filenames).toContain('Delta'); // abc-444
291
+ expect(filenames).toContain('Theta'); // abc-888
292
+ });
293
+ it('should handle auth persistence: list → pull → new session → list again (auth persists)', async () => {
294
+ // Session 1: Setup
295
+ const authConfig = mockConfig({
296
+ access_token: 'persistent-token',
297
+ expires_at: new Date(Date.now() + 7200000).toISOString() // 2 hours
298
+ });
299
+ config.saveConfig(authConfig);
300
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
301
+ const mockSupabase = createMockSupabaseClient();
302
+ const doc = mockDocumentRecord({ id: 'doc-1', title: 'Persistent Doc' });
303
+ mockSupabase.from.mockReturnValue({
304
+ select: vi.fn().mockReturnThis(),
305
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
306
+ });
307
+ const mockContent = mockBlockNoteContent();
308
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
309
+ mockSupabase.storage.from.mockReturnValue({
310
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
311
+ });
312
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
313
+ // Session 1: List
314
+ await listDocuments();
315
+ expect(consoleSpy).toHaveBeenCalled();
316
+ // Session 1: Pull
317
+ await pullDocuments(false, true);
318
+ expect(fs.existsSync(docsDir)).toBe(true);
319
+ // Simulate new session (reload config from disk)
320
+ const loadedConfig = config.loadConfig();
321
+ expect(loadedConfig.access_token).toBe('persistent-token');
322
+ // Session 2: List again (should work with persisted auth)
323
+ consoleSpy.mockClear();
324
+ await listDocuments();
325
+ const listOutput = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
326
+ expect(listOutput).toContain('Persistent Doc');
327
+ });
328
+ it('should handle empty account: list shows no docs → pull does nothing', async () => {
329
+ config.saveConfig(mockConfig());
330
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
331
+ const mockSupabase = createMockSupabaseClient();
332
+ // Empty account - no documents
333
+ mockSupabase.from.mockReturnValue({
334
+ select: vi.fn().mockReturnThis(),
335
+ order: vi.fn().mockResolvedValue({ data: [], error: null })
336
+ });
337
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
338
+ // List should show empty state
339
+ await listDocuments();
340
+ const listOutput = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
341
+ expect(listOutput).toMatch(/No documents found|Create some documents/i);
342
+ // Pull should do nothing
343
+ await pullDocuments(false, true);
344
+ // No directory should be created
345
+ expect(fs.existsSync(docsDir)).toBe(false);
346
+ });
347
+ });
348
+ //# sourceMappingURL=complete-user-journeys.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complete-user-journeys.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/complete-user-journeys.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config-integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-integration.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/config-integration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,151 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ import * as config from '../../utils/config.js';
6
+ import * as projectConfig from '../../utils/projectConfig.js';
7
+ import { createTempDir, cleanupTempDir, mockConfig } from '../helpers.js';
8
+ describe('Config Integration', () => {
9
+ let tempDir;
10
+ let configDir;
11
+ beforeEach(() => {
12
+ tempDir = createTempDir();
13
+ configDir = path.join(tempDir, '.kaimon');
14
+ vi.spyOn(os, 'homedir').mockReturnValue(tempDir);
15
+ vi.spyOn(process, 'cwd').mockReturnValue(tempDir);
16
+ });
17
+ afterEach(() => {
18
+ cleanupTempDir(tempDir);
19
+ vi.restoreAllMocks();
20
+ });
21
+ it('should initialize project config with correct structure (non-interactive)', async () => {
22
+ // Setup global auth
23
+ config.saveConfig(mockConfig({ user_email: 'test@example.com' }));
24
+ // Create config directly using saveProjectConfig (non-interactive test)
25
+ const newConfig = {
26
+ version: '1.0.0',
27
+ user_id: 'test@example.com',
28
+ sync_patterns: {
29
+ include: ['**/*.md'],
30
+ exclude: ['node_modules/**', '.git/**', 'dist/**', 'build/**']
31
+ }
32
+ };
33
+ projectConfig.saveProjectConfig(newConfig, tempDir);
34
+ // Verify .kaimon directory created
35
+ expect(fs.existsSync(configDir)).toBe(true);
36
+ expect(fs.statSync(configDir).isDirectory()).toBe(true);
37
+ // Verify config.json created
38
+ const configPath = path.join(configDir, 'config.json');
39
+ expect(fs.existsSync(configPath)).toBe(true);
40
+ // Verify config structure
41
+ const configContent = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
42
+ expect(configContent.version).toBe('1.0.0');
43
+ expect(configContent.user_id).toBe('test@example.com');
44
+ expect(configContent.sync_patterns).toBeDefined();
45
+ expect(configContent.sync_patterns.include).toEqual(['**/*.md']);
46
+ expect(configContent.sync_patterns.exclude).toContain('node_modules/**');
47
+ });
48
+ it('should detect when project is already initialized', async () => {
49
+ // Setup global auth
50
+ config.saveConfig(mockConfig());
51
+ // Create existing config
52
+ const existingConfig = {
53
+ version: '1.0.0',
54
+ user_id: 'existing@example.com'
55
+ };
56
+ projectConfig.saveProjectConfig(existingConfig, tempDir);
57
+ // Verify detection
58
+ expect(projectConfig.isProjectInitialized(tempDir)).toBe(true);
59
+ const loaded = projectConfig.loadProjectConfig(tempDir);
60
+ expect(loaded).toBeDefined();
61
+ expect(loaded?.user_id).toBe('existing@example.com');
62
+ });
63
+ it('should find project config by walking up directory tree', async () => {
64
+ // Create nested directory structure
65
+ const nestedDir = path.join(tempDir, 'src', 'components');
66
+ fs.mkdirSync(nestedDir, { recursive: true });
67
+ // Create config in root
68
+ const rootConfig = {
69
+ version: '1.0.0',
70
+ user_id: 'root@example.com'
71
+ };
72
+ projectConfig.saveProjectConfig(rootConfig, tempDir);
73
+ // Find config from nested directory
74
+ const found = projectConfig.findProjectConfig(nestedDir);
75
+ expect(found).toBeDefined();
76
+ expect(found?.path).toBe(tempDir);
77
+ expect(found?.config.user_id).toBe('root@example.com');
78
+ });
79
+ it('should validate project config correctly', () => {
80
+ // Valid config
81
+ const validConfig = {
82
+ version: '1.0.0',
83
+ user_id: 'test@example.com'
84
+ };
85
+ const validResult = projectConfig.validateProjectConfig(validConfig);
86
+ expect(validResult.valid).toBe(true);
87
+ expect(validResult.errors).toHaveLength(0);
88
+ // Invalid config (missing user_id)
89
+ const invalidConfig = {
90
+ version: '1.0.0'
91
+ };
92
+ const invalidResult = projectConfig.validateProjectConfig(invalidConfig);
93
+ expect(invalidResult.valid).toBe(false);
94
+ expect(invalidResult.errors).toContain('Missing user_id field');
95
+ });
96
+ it('should preserve existing config when not overwritten', async () => {
97
+ // Setup global auth
98
+ config.saveConfig(mockConfig({ user_email: 'test@example.com' }));
99
+ // Create existing config
100
+ const existingConfig = {
101
+ version: '1.0.0',
102
+ user_id: 'existing@example.com'
103
+ };
104
+ projectConfig.saveProjectConfig(existingConfig, tempDir);
105
+ // Verify it can be loaded and is unchanged
106
+ const loaded = projectConfig.loadProjectConfig(tempDir);
107
+ expect(loaded?.user_id).toBe('existing@example.com');
108
+ expect(loaded?.version).toBe('1.0.0');
109
+ });
110
+ it('should allow config overwrite by saving new config', async () => {
111
+ // Setup global auth
112
+ config.saveConfig(mockConfig({ user_email: 'new@example.com' }));
113
+ // Create existing config
114
+ const existingConfig = {
115
+ version: '1.0.0',
116
+ user_id: 'old@example.com'
117
+ };
118
+ projectConfig.saveProjectConfig(existingConfig, tempDir);
119
+ // Overwrite with new config
120
+ const newConfig = {
121
+ version: '1.0.0',
122
+ user_id: 'new@example.com'
123
+ };
124
+ projectConfig.saveProjectConfig(newConfig, tempDir);
125
+ // Config should be updated
126
+ const loaded = projectConfig.loadProjectConfig(tempDir);
127
+ expect(loaded?.user_id).toBe('new@example.com');
128
+ });
129
+ it('should handle missing global auth when initializing project', async () => {
130
+ // Clear global config (no auth)
131
+ config.clearConfig();
132
+ // Try to init project config
133
+ await expect(projectConfig.initProjectConfig(tempDir)).rejects.toThrow(/Not authenticated/i);
134
+ // No config should be created
135
+ expect(fs.existsSync(configDir)).toBe(false);
136
+ });
137
+ it('should return null when no project config found in tree', () => {
138
+ // No config exists anywhere
139
+ const found = projectConfig.findProjectConfig(tempDir);
140
+ expect(found).toBeNull();
141
+ });
142
+ it('should handle corrupted config file gracefully', () => {
143
+ // Create corrupted config
144
+ fs.mkdirSync(configDir, { recursive: true });
145
+ const configPath = path.join(configDir, 'config.json');
146
+ fs.writeFileSync(configPath, '{ invalid json here', 'utf-8');
147
+ // Loading should throw error
148
+ expect(() => projectConfig.loadProjectConfig(tempDir)).toThrow(/Failed to load/i);
149
+ });
150
+ });
151
+ //# sourceMappingURL=config-integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-integration.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/config-integration.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAChD,OAAO,KAAK,aAAa,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE1E,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,OAAe,CAAC;IACpB,IAAI,SAAiB,CAAC;IAEtB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,aAAa,EAAE,CAAC;QAC1B,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAE1C,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACjD,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,cAAc,CAAC,OAAO,CAAC,CAAC;QACxB,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,oBAAoB;QACpB,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;QAElE,wEAAwE;QACxE,MAAM,SAAS,GAAgC;YAC7C,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,kBAAkB;YAC3B,aAAa,EAAE;gBACb,OAAO,EAAE,CAAC,SAAS,CAAC;gBACpB,OAAO,EAAE,CAAC,iBAAiB,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC;aAC/D;SACF,CAAC;QACF,aAAa,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEpD,mCAAmC;QACnC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAExD,6BAA6B;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACvD,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7C,0BAA0B;QAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACvD,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;QAClD,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,oBAAoB;QACpB,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;QAEhC,yBAAyB;QACzB,MAAM,cAAc,GAAgC;YAClD,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,sBAAsB;SAChC,CAAC;QACF,aAAa,CAAC,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAEzD,mBAAmB;QACnB,MAAM,CAAC,aAAa,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE/D,MAAM,MAAM,GAAG,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,oCAAoC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;QAC1D,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7C,wBAAwB;QACxB,MAAM,UAAU,GAAgC;YAC9C,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,kBAAkB;SAC5B,CAAC;QACF,aAAa,CAAC,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAErD,oCAAoC;QACpC,MAAM,KAAK,GAAG,aAAa,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAEzD,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,eAAe;QACf,MAAM,WAAW,GAAgC;YAC/C,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,kBAAkB;SAC5B,CAAC;QAEF,MAAM,WAAW,GAAG,aAAa,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;QACrE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAE3C,mCAAmC;QACnC,MAAM,aAAa,GAAgC;YACjD,OAAO,EAAE,OAAO;SACjB,CAAC;QAEF,MAAM,aAAa,GAAG,aAAa,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;QACzE,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,oBAAoB;QACpB,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;QAElE,yBAAyB;QACzB,MAAM,cAAc,GAAgC;YAClD,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,sBAAsB;SAChC,CAAC;QACF,aAAa,CAAC,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAEzD,2CAA2C;QAC3C,MAAM,MAAM,GAAG,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,oBAAoB;QACpB,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;QAEjE,yBAAyB;QACzB,MAAM,cAAc,GAAgC;YAClD,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,iBAAiB;SAC3B,CAAC;QACF,aAAa,CAAC,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAEzD,4BAA4B;QAC5B,MAAM,SAAS,GAAgC;YAC7C,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,iBAAiB;SAC3B,CAAC;QACF,aAAa,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEpD,2BAA2B;QAC3B,MAAM,MAAM,GAAG,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,gCAAgC;QAChC,MAAM,CAAC,WAAW,EAAE,CAAC;QAErB,6BAA6B;QAC7B,MAAM,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAE7F,8BAA8B;QAC9B,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,4BAA4B;QAC5B,MAAM,KAAK,GAAG,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAEvD,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,0BAA0B;QAC1B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACvD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,qBAAqB,EAAE,OAAO,CAAC,CAAC;QAE7D,6BAA6B;QAC7B,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data-integrity.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-integrity.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/data-integrity.test.ts"],"names":[],"mappings":""}