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,277 @@
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 { pullDocuments } from '../../utils/pullOperations.js';
6
+ import { listDocuments } from '../../utils/listOperations.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('Error Recovery (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 handle partial failures: 5 docs, 2nd and 4th fail, others succeed', async () => {
27
+ config.saveConfig(mockConfig());
28
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
29
+ const mockSupabase = createMockSupabaseClient();
30
+ const mockDocs = [
31
+ mockDocumentRecord({ id: 'doc-1', title: 'Document 1' }),
32
+ mockDocumentRecord({ id: 'doc-2', title: 'Document 2' }), // Will fail
33
+ mockDocumentRecord({ id: 'doc-3', title: 'Document 3' }),
34
+ mockDocumentRecord({ id: 'doc-4', title: 'Document 4' }), // Will fail
35
+ mockDocumentRecord({ id: 'doc-5', title: 'Document 5' })
36
+ ];
37
+ mockSupabase.from.mockReturnValue({
38
+ select: vi.fn().mockReturnThis(),
39
+ order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
40
+ });
41
+ const mockContent = mockBlockNoteContent();
42
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
43
+ let callCount = 0;
44
+ mockSupabase.storage.from.mockReturnValue({
45
+ download: vi.fn().mockImplementation(() => {
46
+ callCount++;
47
+ // Fail on 2nd and 4th downloads
48
+ if (callCount === 2 || callCount === 4) {
49
+ return Promise.resolve({
50
+ data: null,
51
+ error: { message: 'Download failed', statusCode: '500' }
52
+ });
53
+ }
54
+ return Promise.resolve({ data: blob, error: null });
55
+ })
56
+ });
57
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
58
+ // Pull all documents
59
+ await pullDocuments(false, true);
60
+ // Should have created 3 files (1, 3, 5)
61
+ const files = fs.readdirSync(docsDir);
62
+ expect(files.length).toBe(3);
63
+ const filenames = files.map(f => f.replace('.md', ''));
64
+ expect(filenames).toContain('Document-1');
65
+ expect(filenames).toContain('Document-3');
66
+ expect(filenames).toContain('Document-5');
67
+ // Should show error summary
68
+ const output = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
69
+ expect(output).toMatch(/error/i);
70
+ expect(output).toContain('2'); // 2 errors
71
+ });
72
+ it('should handle network timeout during pull', async () => {
73
+ config.saveConfig(mockConfig());
74
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
75
+ const mockSupabase = createMockSupabaseClient();
76
+ const mockDocs = [
77
+ mockDocumentRecord({ id: 'doc-1', title: 'Document 1' }),
78
+ mockDocumentRecord({ id: 'doc-2', title: 'Document 2' }),
79
+ mockDocumentRecord({ id: 'doc-3', title: 'Document 3' })
80
+ ];
81
+ mockSupabase.from.mockReturnValue({
82
+ select: vi.fn().mockReturnThis(),
83
+ order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
84
+ });
85
+ const mockContent = mockBlockNoteContent();
86
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
87
+ let callCount = 0;
88
+ mockSupabase.storage.from.mockReturnValue({
89
+ download: vi.fn().mockImplementation(() => {
90
+ callCount++;
91
+ if (callCount === 2) {
92
+ // Simulate timeout
93
+ return Promise.reject(new Error('Network timeout'));
94
+ }
95
+ return Promise.resolve({ data: blob, error: null });
96
+ })
97
+ });
98
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
99
+ // Pull should continue despite error
100
+ await pullDocuments(false, true);
101
+ // Should have created 2 files (doc-1 and doc-3)
102
+ const files = fs.readdirSync(docsDir);
103
+ expect(files.length).toBe(2);
104
+ });
105
+ it('should handle malformed JSON in storage', async () => {
106
+ config.saveConfig(mockConfig());
107
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
108
+ const mockSupabase = createMockSupabaseClient();
109
+ const mockDocs = [
110
+ mockDocumentRecord({ id: 'doc-1', title: 'Valid Document' }),
111
+ mockDocumentRecord({ id: 'doc-2', title: 'Malformed Document' }),
112
+ mockDocumentRecord({ id: 'doc-3', title: 'Another Valid' })
113
+ ];
114
+ mockSupabase.from.mockReturnValue({
115
+ select: vi.fn().mockReturnThis(),
116
+ order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
117
+ });
118
+ const validContent = mockBlockNoteContent();
119
+ const validBlob = new Blob([JSON.stringify(validContent)], { type: 'application/json' });
120
+ const malformedBlob = new Blob(['{ invalid json: broken'], { type: 'application/json' });
121
+ let callCount = 0;
122
+ mockSupabase.storage.from.mockReturnValue({
123
+ download: vi.fn().mockImplementation(() => {
124
+ callCount++;
125
+ if (callCount === 2) {
126
+ // Return malformed JSON
127
+ return Promise.resolve({ data: malformedBlob, error: null });
128
+ }
129
+ return Promise.resolve({ data: validBlob, error: null });
130
+ })
131
+ });
132
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
133
+ // Pull should handle JSON parse error gracefully
134
+ await pullDocuments(false, true);
135
+ // Should have created 2 valid files
136
+ const files = fs.readdirSync(docsDir);
137
+ expect(files.length).toBe(2);
138
+ const filenames = files.map(f => f.replace('.md', ''));
139
+ expect(filenames).toContain('Valid-Document');
140
+ expect(filenames).toContain('Another-Valid');
141
+ });
142
+ it('should handle storage 404 for document that exists in database', async () => {
143
+ config.saveConfig(mockConfig());
144
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
145
+ const mockSupabase = createMockSupabaseClient();
146
+ const mockDocs = [
147
+ mockDocumentRecord({ id: 'doc-1', title: 'Exists in Storage' }),
148
+ mockDocumentRecord({ id: 'doc-2', title: 'Missing in Storage' }),
149
+ mockDocumentRecord({ id: 'doc-3', title: 'Also Exists' })
150
+ ];
151
+ mockSupabase.from.mockReturnValue({
152
+ select: vi.fn().mockReturnThis(),
153
+ order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
154
+ });
155
+ const mockContent = mockBlockNoteContent();
156
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
157
+ let callCount = 0;
158
+ mockSupabase.storage.from.mockReturnValue({
159
+ download: vi.fn().mockImplementation(() => {
160
+ callCount++;
161
+ if (callCount === 2) {
162
+ // Storage file not found
163
+ return Promise.resolve({
164
+ data: null,
165
+ error: { message: 'Object not found', statusCode: '404' }
166
+ });
167
+ }
168
+ return Promise.resolve({ data: blob, error: null });
169
+ })
170
+ });
171
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
172
+ // Pull should handle gracefully
173
+ await pullDocuments(false, true);
174
+ // Should have created 2 files
175
+ const files = fs.readdirSync(docsDir);
176
+ expect(files.length).toBe(2);
177
+ // Should show error for missing file
178
+ const output = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
179
+ expect(output).toMatch(/file not found|not found in storage/i);
180
+ });
181
+ it('should handle database connection failure during list', async () => {
182
+ config.saveConfig(mockConfig());
183
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
184
+ const mockSupabase = createMockSupabaseClient();
185
+ // Simulate database error
186
+ mockSupabase.from.mockReturnValue({
187
+ select: vi.fn().mockReturnThis(),
188
+ order: vi.fn().mockResolvedValue({
189
+ data: null,
190
+ error: { message: 'Connection timeout', code: 'CONNECTION_ERROR' }
191
+ })
192
+ });
193
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
194
+ // List should fail with clear error
195
+ await expect(listDocuments()).rejects.toThrow(/Database error/i);
196
+ });
197
+ it('should handle auth token expiry mid-operation', async () => {
198
+ config.saveConfig(mockConfig());
199
+ // Token refresh fails
200
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(false);
201
+ // Pull should fail with auth error
202
+ await expect(pullDocuments(false, true)).rejects.toThrow(/Not authenticated/i);
203
+ });
204
+ it('should handle unsupported document format gracefully', async () => {
205
+ config.saveConfig(mockConfig());
206
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
207
+ const mockSupabase = createMockSupabaseClient();
208
+ const mockDocs = [
209
+ mockDocumentRecord({ id: 'doc-1', title: 'Good Document' }),
210
+ mockDocumentRecord({ id: 'doc-2', title: 'Unsupported Format' }),
211
+ mockDocumentRecord({ id: 'doc-3', title: 'Another Good' })
212
+ ];
213
+ mockSupabase.from.mockReturnValue({
214
+ select: vi.fn().mockReturnThis(),
215
+ order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
216
+ });
217
+ const validContent = mockBlockNoteContent();
218
+ const validBlob = new Blob([JSON.stringify(validContent)], { type: 'application/json' });
219
+ // Unsupported format (not blocknote)
220
+ const unsupportedContent = {
221
+ type: 'unknown-format',
222
+ content: { raw: 'binary data here' }
223
+ };
224
+ const unsupportedBlob = new Blob([JSON.stringify(unsupportedContent)], { type: 'application/json' });
225
+ let callCount = 0;
226
+ mockSupabase.storage.from.mockReturnValue({
227
+ download: vi.fn().mockImplementation(() => {
228
+ callCount++;
229
+ if (callCount === 2) {
230
+ return Promise.resolve({ data: unsupportedBlob, error: null });
231
+ }
232
+ return Promise.resolve({ data: validBlob, error: null });
233
+ })
234
+ });
235
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
236
+ // Pull should skip unsupported format
237
+ await pullDocuments(false, true);
238
+ // Should have created 2 files (skipped unsupported)
239
+ const files = fs.readdirSync(docsDir);
240
+ expect(files.length).toBe(2);
241
+ // Should show error for unsupported format
242
+ const output = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
243
+ expect(output).toMatch(/unsupported format|error/i);
244
+ });
245
+ it('should handle all documents failing: show error, create no files', async () => {
246
+ config.saveConfig(mockConfig());
247
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
248
+ const mockSupabase = createMockSupabaseClient();
249
+ const mockDocs = [
250
+ mockDocumentRecord({ id: 'doc-1', title: 'Document 1' }),
251
+ mockDocumentRecord({ id: 'doc-2', title: 'Document 2' }),
252
+ mockDocumentRecord({ id: 'doc-3', title: 'Document 3' })
253
+ ];
254
+ mockSupabase.from.mockReturnValue({
255
+ select: vi.fn().mockReturnThis(),
256
+ order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
257
+ });
258
+ // All downloads fail
259
+ mockSupabase.storage.from.mockReturnValue({
260
+ download: vi.fn().mockResolvedValue({
261
+ data: null,
262
+ error: { message: 'Storage unavailable' }
263
+ })
264
+ });
265
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
266
+ // Pull should complete but create no files
267
+ await pullDocuments(false, true);
268
+ // No files should be created
269
+ expect(fs.existsSync(docsDir)).toBe(true); // Directory created
270
+ const files = fs.readdirSync(docsDir);
271
+ expect(files.length).toBe(0);
272
+ // Should show error summary
273
+ const output = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
274
+ expect(output).toMatch(/3.*error/i); // 3 errors
275
+ });
276
+ });
277
+ //# sourceMappingURL=error-recovery.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-recovery.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/error-recovery.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=filesystem-edge-cases.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem-edge-cases.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/filesystem-edge-cases.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,218 @@
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 { pullDocuments } from '../../utils/pullOperations.js';
6
+ import * as config from '../../utils/config.js';
7
+ import * as supabaseClient from '../../utils/supabaseClient.js';
8
+ import * as tokenRefresh from '../../utils/tokenRefresh.js';
9
+ import { createTempDir, cleanupTempDir, mockConfig, mockDocumentRecord, mockBlockNoteContent, createMockSupabaseClient } from '../helpers.js';
10
+ describe('Filesystem Edge Cases (Integration)', () => {
11
+ let tempDir;
12
+ let docsDir;
13
+ beforeEach(() => {
14
+ tempDir = createTempDir();
15
+ docsDir = path.join(tempDir, 'KaimonDocs');
16
+ vi.spyOn(os, 'homedir').mockReturnValue(tempDir);
17
+ vi.spyOn(process, 'cwd').mockReturnValue(tempDir);
18
+ });
19
+ afterEach(() => {
20
+ cleanupTempDir(tempDir);
21
+ vi.restoreAllMocks();
22
+ });
23
+ it('should use --flat mode: no KaimonDocs folder, files in current directory', async () => {
24
+ config.saveConfig(mockConfig());
25
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
26
+ const mockSupabase = createMockSupabaseClient();
27
+ const mockDocs = [
28
+ mockDocumentRecord({ id: 'doc-1', title: 'Flat Document 1' }),
29
+ mockDocumentRecord({ id: 'doc-2', title: 'Flat Document 2' })
30
+ ];
31
+ mockSupabase.from.mockReturnValue({
32
+ select: vi.fn().mockReturnThis(),
33
+ order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
34
+ });
35
+ const mockContent = mockBlockNoteContent();
36
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
37
+ mockSupabase.storage.from.mockReturnValue({
38
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
39
+ });
40
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
41
+ // Pull with --flat flag
42
+ await pullDocuments(true, true);
43
+ // Files should be in tempDir, NOT in KaimonDocs subfolder
44
+ expect(fs.existsSync(docsDir)).toBe(false); // No KaimonDocs folder
45
+ const files = fs.readdirSync(tempDir).filter(f => f.endsWith('.md'));
46
+ expect(files.length).toBe(2);
47
+ const filenames = files.map(f => f.replace('.md', ''));
48
+ expect(filenames).toContain('Flat-Document-1');
49
+ expect(filenames).toContain('Flat-Document-2');
50
+ });
51
+ it('should not affect existing user files when pulling to KaimonDocs', async () => {
52
+ config.saveConfig(mockConfig());
53
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
54
+ const mockSupabase = createMockSupabaseClient();
55
+ // Create KaimonDocs with 2 Kaimon docs + 2 user files
56
+ fs.mkdirSync(docsDir, { recursive: true });
57
+ // Existing Kaimon document
58
+ fs.writeFileSync(path.join(docsDir, 'Existing-Kaimon.md'), `---
59
+ kaimon_id: "kaimon-doc-1"
60
+ ---
61
+ Kaimon content`, 'utf-8');
62
+ // User-created files (no frontmatter)
63
+ fs.writeFileSync(path.join(docsDir, 'my-notes.md'), 'User notes here', 'utf-8');
64
+ fs.writeFileSync(path.join(docsDir, 'README.md'), '# User README', 'utf-8');
65
+ const mockDocs = [
66
+ mockDocumentRecord({ id: 'kaimon-doc-1', title: 'Existing Kaimon' }), // Already exists
67
+ mockDocumentRecord({ id: 'new-doc', title: 'New Document' })
68
+ ];
69
+ mockSupabase.from.mockReturnValue({
70
+ select: vi.fn().mockReturnThis(),
71
+ order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
72
+ });
73
+ const mockContent = mockBlockNoteContent();
74
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
75
+ mockSupabase.storage.from.mockReturnValue({
76
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
77
+ });
78
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
79
+ // Pull
80
+ await pullDocuments(false, true);
81
+ // Should have 4 files total (2 user + 2 kaimon)
82
+ const files = fs.readdirSync(docsDir);
83
+ expect(files.length).toBe(4);
84
+ // User files should be unchanged
85
+ const userNotes = fs.readFileSync(path.join(docsDir, 'my-notes.md'), 'utf-8');
86
+ const userReadme = fs.readFileSync(path.join(docsDir, 'README.md'), 'utf-8');
87
+ expect(userNotes).toBe('User notes here');
88
+ expect(userReadme).toBe('# User README');
89
+ });
90
+ it('should handle very long document titles (filename handling)', async () => {
91
+ config.saveConfig(mockConfig());
92
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
93
+ const mockSupabase = createMockSupabaseClient();
94
+ // Very long title (255+ chars - filesystem limit)
95
+ const longTitle = 'A'.repeat(255) + ' Document With More Text';
96
+ const mockDocs = [
97
+ mockDocumentRecord({ id: 'doc-1', title: longTitle })
98
+ ];
99
+ mockSupabase.from.mockReturnValue({
100
+ select: vi.fn().mockReturnThis(),
101
+ order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
102
+ });
103
+ const mockContent = mockBlockNoteContent();
104
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
105
+ mockSupabase.storage.from.mockReturnValue({
106
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
107
+ });
108
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
109
+ // Pull should handle long filename (may truncate or error gracefully)
110
+ try {
111
+ await pullDocuments(false, true);
112
+ // If successful, verify file created
113
+ if (fs.existsSync(docsDir)) {
114
+ const files = fs.readdirSync(docsDir);
115
+ if (files.length > 0) {
116
+ const content = fs.readFileSync(path.join(docsDir, files[0]), 'utf-8');
117
+ expect(content).toContain('kaimon_id: "doc-1"');
118
+ }
119
+ }
120
+ }
121
+ catch (error) {
122
+ // Filesystem may reject very long filenames - that's acceptable
123
+ expect(error).toBeDefined();
124
+ }
125
+ });
126
+ it('should handle unicode and emoji in document titles', async () => {
127
+ config.saveConfig(mockConfig());
128
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
129
+ const mockSupabase = createMockSupabaseClient();
130
+ const mockDocs = [
131
+ mockDocumentRecord({ id: 'doc-1', title: '📄 Document 中文' }),
132
+ mockDocumentRecord({ id: 'doc-2', title: 'Документ Русский 🚀' }),
133
+ mockDocumentRecord({ id: 'doc-3', title: 'مستند عربي 📝' })
134
+ ];
135
+ mockSupabase.from.mockReturnValue({
136
+ select: vi.fn().mockReturnThis(),
137
+ order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
138
+ });
139
+ const mockContent = mockBlockNoteContent();
140
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
141
+ mockSupabase.storage.from.mockReturnValue({
142
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
143
+ });
144
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
145
+ // Pull should handle unicode/emoji
146
+ await pullDocuments(false, true);
147
+ const files = fs.readdirSync(docsDir);
148
+ expect(files.length).toBe(3);
149
+ // All files should be readable
150
+ files.forEach(file => {
151
+ const content = fs.readFileSync(path.join(docsDir, file), 'utf-8');
152
+ expect(content).toContain('kaimon_id:');
153
+ });
154
+ });
155
+ it('should handle existing directory with same name as document title', async () => {
156
+ config.saveConfig(mockConfig());
157
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
158
+ const mockSupabase = createMockSupabaseClient();
159
+ // Create a directory with the same name as document title
160
+ fs.mkdirSync(docsDir, { recursive: true });
161
+ fs.mkdirSync(path.join(docsDir, 'Document-A'), { recursive: true });
162
+ fs.writeFileSync(path.join(docsDir, 'Document-A', 'nested.txt'), 'Nested file', 'utf-8');
163
+ const mockDocs = [
164
+ mockDocumentRecord({ id: 'doc-1', title: 'Document A' })
165
+ ];
166
+ mockSupabase.from.mockReturnValue({
167
+ select: vi.fn().mockReturnThis(),
168
+ order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
169
+ });
170
+ const mockContent = mockBlockNoteContent();
171
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
172
+ mockSupabase.storage.from.mockReturnValue({
173
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
174
+ });
175
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
176
+ // Pull should handle gracefully (create Document-A.md file despite Document-A directory)
177
+ await pullDocuments(false, true);
178
+ // Should have both directory and file
179
+ expect(fs.existsSync(path.join(docsDir, 'Document-A'))).toBe(true);
180
+ expect(fs.statSync(path.join(docsDir, 'Document-A')).isDirectory()).toBe(true);
181
+ const files = fs.readdirSync(docsDir).filter(f => f.endsWith('.md'));
182
+ expect(files.length).toBe(1);
183
+ expect(files[0]).toBe('Document-A.md');
184
+ });
185
+ it('should preserve file permissions after pull', async () => {
186
+ config.saveConfig(mockConfig());
187
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
188
+ const mockSupabase = createMockSupabaseClient();
189
+ const mockDocs = [
190
+ mockDocumentRecord({ id: 'doc-1', title: 'Permission Test' })
191
+ ];
192
+ mockSupabase.from.mockReturnValue({
193
+ select: vi.fn().mockReturnThis(),
194
+ order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
195
+ });
196
+ const mockContent = mockBlockNoteContent();
197
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
198
+ mockSupabase.storage.from.mockReturnValue({
199
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
200
+ });
201
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
202
+ // Pull
203
+ await pullDocuments(false, true);
204
+ const files = fs.readdirSync(docsDir);
205
+ const filePath = path.join(docsDir, files[0]);
206
+ // File should be readable and writable
207
+ const stats = fs.statSync(filePath);
208
+ expect(stats.isFile()).toBe(true);
209
+ // Should be able to read
210
+ const content = fs.readFileSync(filePath, 'utf-8');
211
+ expect(content).toContain('Permission Test');
212
+ // Should be able to write (modify)
213
+ fs.appendFileSync(filePath, '\n\nUser edit', 'utf-8');
214
+ const modifiedContent = fs.readFileSync(filePath, 'utf-8');
215
+ expect(modifiedContent).toContain('User edit');
216
+ });
217
+ });
218
+ //# sourceMappingURL=filesystem-edge-cases.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem-edge-cases.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/filesystem-edge-cases.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=filtering-operations.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filtering-operations.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/filtering-operations.test.ts"],"names":[],"mappings":""}