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