kaimon-cli 0.2.1 → 0.4.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 (68) hide show
  1. package/README.md +37 -3
  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 +113 -0
  5. package/dist/__tests__/commands/list.test.js.map +1 -0
  6. package/dist/__tests__/commands/pull.test.js +165 -59
  7. package/dist/__tests__/commands/pull.test.js.map +1 -1
  8. package/dist/__tests__/helpers.d.ts.map +1 -1
  9. package/dist/__tests__/helpers.js +2 -1
  10. package/dist/__tests__/helpers.js.map +1 -1
  11. package/dist/__tests__/integration/complete-user-journeys.test.d.ts +2 -0
  12. package/dist/__tests__/integration/complete-user-journeys.test.d.ts.map +1 -0
  13. package/dist/__tests__/integration/complete-user-journeys.test.js +357 -0
  14. package/dist/__tests__/integration/complete-user-journeys.test.js.map +1 -0
  15. package/dist/__tests__/integration/config-integration.test.d.ts +2 -0
  16. package/dist/__tests__/integration/config-integration.test.d.ts.map +1 -0
  17. package/dist/__tests__/integration/config-integration.test.js +151 -0
  18. package/dist/__tests__/integration/config-integration.test.js.map +1 -0
  19. package/dist/__tests__/integration/data-integrity.test.d.ts +2 -0
  20. package/dist/__tests__/integration/data-integrity.test.d.ts.map +1 -0
  21. package/dist/__tests__/integration/data-integrity.test.js +302 -0
  22. package/dist/__tests__/integration/data-integrity.test.js.map +1 -0
  23. package/dist/__tests__/integration/edge-cases-advanced.test.d.ts +2 -0
  24. package/dist/__tests__/integration/edge-cases-advanced.test.d.ts.map +1 -0
  25. package/dist/__tests__/integration/edge-cases-advanced.test.js +294 -0
  26. package/dist/__tests__/integration/edge-cases-advanced.test.js.map +1 -0
  27. package/dist/__tests__/integration/error-recovery.test.d.ts +2 -0
  28. package/dist/__tests__/integration/error-recovery.test.d.ts.map +1 -0
  29. package/dist/__tests__/integration/error-recovery.test.js +284 -0
  30. package/dist/__tests__/integration/error-recovery.test.js.map +1 -0
  31. package/dist/__tests__/integration/filesystem-edge-cases.test.d.ts +2 -0
  32. package/dist/__tests__/integration/filesystem-edge-cases.test.d.ts.map +1 -0
  33. package/dist/__tests__/integration/filesystem-edge-cases.test.js +224 -0
  34. package/dist/__tests__/integration/filesystem-edge-cases.test.js.map +1 -0
  35. package/dist/__tests__/integration/filtering-operations.test.d.ts +2 -0
  36. package/dist/__tests__/integration/filtering-operations.test.d.ts.map +1 -0
  37. package/dist/__tests__/integration/filtering-operations.test.js +286 -0
  38. package/dist/__tests__/integration/filtering-operations.test.js.map +1 -0
  39. package/dist/__tests__/integration/full-workflow.test.js +4 -0
  40. package/dist/__tests__/integration/full-workflow.test.js.map +1 -1
  41. package/dist/__tests__/integration/state-transitions.test.d.ts +2 -0
  42. package/dist/__tests__/integration/state-transitions.test.d.ts.map +1 -0
  43. package/dist/__tests__/integration/state-transitions.test.js +328 -0
  44. package/dist/__tests__/integration/state-transitions.test.js.map +1 -0
  45. package/dist/__tests__/unit/utils/frontmatter.test.js +68 -68
  46. package/dist/__tests__/unit/utils/markdown.test.js +11 -11
  47. package/dist/commands/auth.d.ts.map +1 -1
  48. package/dist/commands/auth.js +2 -11
  49. package/dist/commands/auth.js.map +1 -1
  50. package/dist/commands/list.d.ts +4 -0
  51. package/dist/commands/list.d.ts.map +1 -0
  52. package/dist/commands/list.js +19 -0
  53. package/dist/commands/list.js.map +1 -0
  54. package/dist/commands/pull.d.ts.map +1 -1
  55. package/dist/commands/pull.js +5 -3
  56. package/dist/commands/pull.js.map +1 -1
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +6 -1
  59. package/dist/index.js.map +1 -1
  60. package/dist/utils/listOperations.d.ts +5 -0
  61. package/dist/utils/listOperations.d.ts.map +1 -0
  62. package/dist/utils/listOperations.js +171 -0
  63. package/dist/utils/listOperations.js.map +1 -0
  64. package/dist/utils/pullOperations.d.ts +3 -2
  65. package/dist/utils/pullOperations.d.ts.map +1 -1
  66. package/dist/utils/pullOperations.js +86 -9
  67. package/dist/utils/pullOperations.js.map +1 -1
  68. package/package.json +2 -2
@@ -0,0 +1,357 @@
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
+ eq: vi.fn().mockReturnThis(),
51
+ order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
52
+ });
53
+ const mockContent = mockBlockNoteContent();
54
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
55
+ mockSupabase.storage.from.mockReturnValue({
56
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
57
+ });
58
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
59
+ // Step 2: List documents
60
+ await listDocuments();
61
+ const listOutput = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
62
+ expect(listOutput).toContain('Document A');
63
+ expect(listOutput).toContain('Document B');
64
+ expect(listOutput).toContain('Document C');
65
+ expect(listOutput).toContain('[NEW]'); // All should be new
66
+ // Step 3: Pull all documents
67
+ consoleSpy.mockClear();
68
+ await pullDocuments(false, true); // skipConfirmation = true
69
+ // Step 4: Verify files were created
70
+ expect(fs.existsSync(docsDir)).toBe(true);
71
+ const files = fs.readdirSync(docsDir);
72
+ expect(files.length).toBe(3);
73
+ const filenames = files.map(f => f.replace('.md', ''));
74
+ expect(filenames).toContain('Document-A');
75
+ expect(filenames).toContain('Document-B');
76
+ expect(filenames).toContain('Document-C');
77
+ // Step 5: Verify file contents have correct metadata
78
+ const fileA = fs.readFileSync(path.join(docsDir, 'Document-A.md'), 'utf-8');
79
+ expect(fileA).toContain('kaimon_id: "doc-1"');
80
+ expect(fileA).toContain('title: "Document A"');
81
+ expect(fileA).toContain('# Test Document');
82
+ });
83
+ it('should handle fresh start: new user → list shows 5 docs → pull all → verify 5 files', async () => {
84
+ // Simulate brand new user (no local files)
85
+ config.saveConfig(mockConfig());
86
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
87
+ const mockSupabase = createMockSupabaseClient();
88
+ const mockDocs = Array.from({ length: 5 }, (_, i) => mockDocumentRecord({
89
+ id: `doc-${i + 1}`,
90
+ title: `Document ${i + 1}`,
91
+ updated_at: new Date(Date.now() - i * 3600000).toISOString()
92
+ }));
93
+ mockSupabase.from.mockReturnValue({
94
+ select: vi.fn().mockReturnThis(),
95
+ eq: vi.fn().mockReturnThis(),
96
+ order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
97
+ });
98
+ const mockContent = mockBlockNoteContent();
99
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
100
+ mockSupabase.storage.from.mockReturnValue({
101
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
102
+ });
103
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
104
+ // List should show all as NEW
105
+ await listDocuments();
106
+ const listOutput = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
107
+ expect(listOutput).toContain('5 total');
108
+ // Count [NEW] indicators
109
+ const newCount = (listOutput.match(/\[NEW\]/g) || []).length;
110
+ expect(newCount).toBe(5);
111
+ // Pull all
112
+ await pullDocuments(false, true);
113
+ // Verify exactly 5 files created
114
+ const files = fs.readdirSync(docsDir);
115
+ expect(files.length).toBe(5);
116
+ // Verify each file has correct structure
117
+ files.forEach((file, i) => {
118
+ const content = fs.readFileSync(path.join(docsDir, file), 'utf-8');
119
+ expect(content).toContain('kaimon_id:');
120
+ expect(content).toContain('title:');
121
+ expect(content).toContain('---'); // Frontmatter delimiter
122
+ });
123
+ });
124
+ it('should handle selective workflow: list 10 docs → pull 3 by title → verify exactly 3 files', async () => {
125
+ config.saveConfig(mockConfig());
126
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
127
+ const mockSupabase = createMockSupabaseClient();
128
+ const mockDocs = Array.from({ length: 10 }, (_, i) => mockDocumentRecord({
129
+ id: `doc-${i + 1}`,
130
+ title: `Document ${String.fromCharCode(65 + i)}`, // A-J
131
+ updated_at: new Date().toISOString()
132
+ }));
133
+ mockSupabase.from.mockReturnValue({
134
+ select: vi.fn().mockReturnThis(),
135
+ eq: vi.fn().mockReturnThis(),
136
+ order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
137
+ });
138
+ const mockContent = mockBlockNoteContent();
139
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
140
+ mockSupabase.storage.from.mockReturnValue({
141
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
142
+ });
143
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
144
+ // List shows 10
145
+ await listDocuments();
146
+ const listOutput = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
147
+ expect(listOutput).toContain('10 total');
148
+ // Pull only 3 specific documents by title
149
+ await pullDocuments(false, true, ['Document A', 'Document E', 'Document J']);
150
+ // Verify exactly 3 files created
151
+ const files = fs.readdirSync(docsDir);
152
+ expect(files.length).toBe(3);
153
+ const filenames = files.map(f => f.replace('.md', ''));
154
+ expect(filenames).toContain('Document-A');
155
+ expect(filenames).toContain('Document-E');
156
+ expect(filenames).toContain('Document-J');
157
+ // Should NOT contain others
158
+ expect(filenames).not.toContain('Document-B');
159
+ expect(filenames).not.toContain('Document-C');
160
+ });
161
+ it('should handle multi-session workflow: pull → remote changes → list shows UPDATED → pull again', async () => {
162
+ config.saveConfig(mockConfig());
163
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
164
+ const mockSupabase = createMockSupabaseClient();
165
+ const initialTimestamp = new Date('2024-01-01T00:00:00Z');
166
+ const doc = mockDocumentRecord({
167
+ id: 'doc-123',
168
+ title: 'Test Document',
169
+ updated_at: initialTimestamp.toISOString()
170
+ });
171
+ mockSupabase.from.mockReturnValue({
172
+ select: vi.fn().mockReturnThis(),
173
+ eq: vi.fn().mockReturnThis(),
174
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
175
+ });
176
+ const mockContent = mockBlockNoteContent('Test Document');
177
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
178
+ mockSupabase.storage.from.mockReturnValue({
179
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
180
+ });
181
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
182
+ // Session 1: Pull document
183
+ await pullDocuments(false, true);
184
+ expect(fs.existsSync(docsDir)).toBe(true);
185
+ const files1 = fs.readdirSync(docsDir);
186
+ expect(files1.length).toBe(1);
187
+ // Simulate remote update
188
+ const updatedTimestamp = new Date('2024-01-02T12:00:00Z');
189
+ const updatedDoc = mockDocumentRecord({
190
+ id: 'doc-123',
191
+ title: 'Test Document',
192
+ updated_at: updatedTimestamp.toISOString()
193
+ });
194
+ mockSupabase.from.mockReturnValue({
195
+ select: vi.fn().mockReturnThis(),
196
+ eq: vi.fn().mockReturnThis(),
197
+ order: vi.fn().mockResolvedValue({ data: [updatedDoc], error: null })
198
+ });
199
+ const updatedContent = {
200
+ type: 'blocknote',
201
+ content: [
202
+ { type: 'heading', props: { level: 1 }, content: [{ type: 'text', text: 'Updated Content' }] },
203
+ { type: 'paragraph', content: [{ type: 'text', text: 'This document was updated remotely.' }] }
204
+ ]
205
+ };
206
+ const updatedBlob = new Blob([JSON.stringify(updatedContent)], { type: 'application/json' });
207
+ mockSupabase.storage.from.mockReturnValue({
208
+ download: vi.fn().mockResolvedValue({ data: updatedBlob, error: null })
209
+ });
210
+ // Session 2: List should show UPDATED
211
+ consoleSpy.mockClear();
212
+ await listDocuments();
213
+ const listOutput = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
214
+ expect(listOutput).toContain('[UPDATED]');
215
+ // Session 2: Pull again
216
+ await pullDocuments(false, true);
217
+ // Verify file was updated
218
+ const fileContent = fs.readFileSync(path.join(docsDir, files1[0]), 'utf-8');
219
+ expect(fileContent).toContain('# Updated Content');
220
+ expect(fileContent).toContain('This document was updated remotely');
221
+ });
222
+ it('should handle no changes workflow: pull → list shows UP-TO-DATE → pull skips', async () => {
223
+ config.saveConfig(mockConfig());
224
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
225
+ const mockSupabase = createMockSupabaseClient();
226
+ const doc = mockDocumentRecord({
227
+ id: 'doc-123',
228
+ title: 'Stable Document',
229
+ updated_at: new Date('2024-01-01T00:00:00Z').toISOString()
230
+ });
231
+ mockSupabase.from.mockReturnValue({
232
+ select: vi.fn().mockReturnThis(),
233
+ eq: vi.fn().mockReturnThis(),
234
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
235
+ });
236
+ const mockContent = mockBlockNoteContent('Stable Document');
237
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
238
+ const downloadSpy = vi.fn().mockResolvedValue({ data: blob, error: null });
239
+ mockSupabase.storage.from.mockReturnValue({
240
+ download: downloadSpy
241
+ });
242
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
243
+ // First pull
244
+ await pullDocuments(false, true);
245
+ expect(downloadSpy).toHaveBeenCalledTimes(1);
246
+ const files = fs.readdirSync(docsDir);
247
+ expect(files.length).toBe(1);
248
+ // List should show UP-TO-DATE
249
+ consoleSpy.mockClear();
250
+ await listDocuments();
251
+ const listOutput = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
252
+ expect(listOutput).toContain('[UP-TO-DATE]');
253
+ // Second pull should skip
254
+ downloadSpy.mockClear();
255
+ consoleSpy.mockClear();
256
+ await pullDocuments(false, true);
257
+ expect(downloadSpy).not.toHaveBeenCalled();
258
+ const pullOutput = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
259
+ expect(pullOutput).toMatch(/All.*up to date|No changes to pull/i);
260
+ });
261
+ it('should handle mixed IDs and titles: pull 5 docs (3 by title, 2 by ID) from pool of 10', async () => {
262
+ config.saveConfig(mockConfig());
263
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
264
+ const mockSupabase = createMockSupabaseClient();
265
+ const mockDocs = [
266
+ mockDocumentRecord({ id: 'abc-111', title: 'Alpha' }),
267
+ mockDocumentRecord({ id: 'abc-222', title: 'Beta' }),
268
+ mockDocumentRecord({ id: 'abc-333', title: 'Gamma' }),
269
+ mockDocumentRecord({ id: 'abc-444', title: 'Delta' }),
270
+ mockDocumentRecord({ id: 'abc-555', title: 'Epsilon' }),
271
+ mockDocumentRecord({ id: 'abc-666', title: 'Zeta' }),
272
+ mockDocumentRecord({ id: 'abc-777', title: 'Eta' }),
273
+ mockDocumentRecord({ id: 'abc-888', title: 'Theta' }),
274
+ mockDocumentRecord({ id: 'abc-999', title: 'Iota' }),
275
+ mockDocumentRecord({ id: 'abc-000', title: 'Kappa' })
276
+ ];
277
+ mockSupabase.from.mockReturnValue({
278
+ select: vi.fn().mockReturnThis(),
279
+ eq: vi.fn().mockReturnThis(),
280
+ order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
281
+ });
282
+ const mockContent = mockBlockNoteContent();
283
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
284
+ mockSupabase.storage.from.mockReturnValue({
285
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
286
+ });
287
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
288
+ // Pull: 3 by title (Alpha, Gamma, Epsilon) + 2 by ID (abc-444, abc-888)
289
+ await pullDocuments(false, true, ['Alpha', 'Gamma', 'Epsilon', 'abc-444', 'abc-888']);
290
+ // Verify exactly 5 files created
291
+ const files = fs.readdirSync(docsDir);
292
+ expect(files.length).toBe(5);
293
+ const filenames = files.map(f => f.replace('.md', ''));
294
+ expect(filenames).toContain('Alpha');
295
+ expect(filenames).toContain('Gamma');
296
+ expect(filenames).toContain('Epsilon');
297
+ expect(filenames).toContain('Delta'); // abc-444
298
+ expect(filenames).toContain('Theta'); // abc-888
299
+ });
300
+ it('should handle auth persistence: list → pull → new session → list again (auth persists)', async () => {
301
+ // Session 1: Setup
302
+ const authConfig = mockConfig({
303
+ access_token: 'persistent-token',
304
+ expires_at: new Date(Date.now() + 7200000).toISOString() // 2 hours
305
+ });
306
+ config.saveConfig(authConfig);
307
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
308
+ const mockSupabase = createMockSupabaseClient();
309
+ const doc = mockDocumentRecord({ id: 'doc-1', title: 'Persistent Doc' });
310
+ mockSupabase.from.mockReturnValue({
311
+ select: vi.fn().mockReturnThis(),
312
+ eq: vi.fn().mockReturnThis(),
313
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
314
+ });
315
+ const mockContent = mockBlockNoteContent();
316
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
317
+ mockSupabase.storage.from.mockReturnValue({
318
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
319
+ });
320
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
321
+ // Session 1: List
322
+ await listDocuments();
323
+ expect(consoleSpy).toHaveBeenCalled();
324
+ // Session 1: Pull
325
+ await pullDocuments(false, true);
326
+ expect(fs.existsSync(docsDir)).toBe(true);
327
+ // Simulate new session (reload config from disk)
328
+ const loadedConfig = config.loadConfig();
329
+ expect(loadedConfig.access_token).toBe('persistent-token');
330
+ // Session 2: List again (should work with persisted auth)
331
+ consoleSpy.mockClear();
332
+ await listDocuments();
333
+ const listOutput = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
334
+ expect(listOutput).toContain('Persistent Doc');
335
+ });
336
+ it('should handle empty account: list shows no docs → pull does nothing', async () => {
337
+ config.saveConfig(mockConfig());
338
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
339
+ const mockSupabase = createMockSupabaseClient();
340
+ // Empty account - no documents
341
+ mockSupabase.from.mockReturnValue({
342
+ select: vi.fn().mockReturnThis(),
343
+ eq: vi.fn().mockReturnThis(),
344
+ order: vi.fn().mockResolvedValue({ data: [], error: null })
345
+ });
346
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
347
+ // List should show empty state
348
+ await listDocuments();
349
+ const listOutput = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
350
+ expect(listOutput).toMatch(/No documents found|Create some documents/i);
351
+ // Pull should do nothing
352
+ await pullDocuments(false, true);
353
+ // No directory should be created
354
+ expect(fs.existsSync(docsDir)).toBe(false);
355
+ });
356
+ });
357
+ //# 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":"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"}
@@ -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":""}