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,296 @@
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, createMockSupabaseClient } from '../helpers.js';
10
+ describe('Data Integrity (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 preserve complex BlockNote structures: nested lists, tables, code blocks', async () => {
24
+ config.saveConfig(mockConfig());
25
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
26
+ const mockSupabase = createMockSupabaseClient();
27
+ const doc = mockDocumentRecord({ id: 'doc-1', title: 'Complex Structure' });
28
+ mockSupabase.from.mockReturnValue({
29
+ select: vi.fn().mockReturnThis(),
30
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
31
+ });
32
+ // Complex BlockNote content with nested lists
33
+ const complexContent = {
34
+ type: 'blocknote',
35
+ content: [
36
+ {
37
+ type: 'heading',
38
+ props: { level: 1 },
39
+ content: [{ type: 'text', text: 'Complex Document' }]
40
+ },
41
+ {
42
+ type: 'paragraph',
43
+ content: [
44
+ { type: 'text', text: 'Text with ' },
45
+ { type: 'text', text: 'bold', styles: { bold: true } },
46
+ { type: 'text', text: ', ' },
47
+ { type: 'text', text: 'italic', styles: { italic: true } },
48
+ { type: 'text', text: ', and ' },
49
+ { type: 'text', text: 'code', styles: { code: true } },
50
+ ]
51
+ },
52
+ {
53
+ type: 'bulletListItem',
54
+ content: [{ type: 'text', text: 'Top level item' }],
55
+ children: [
56
+ {
57
+ type: 'bulletListItem',
58
+ content: [{ type: 'text', text: 'Nested item 1' }]
59
+ },
60
+ {
61
+ type: 'bulletListItem',
62
+ content: [{ type: 'text', text: 'Nested item 2' }]
63
+ }
64
+ ]
65
+ },
66
+ {
67
+ type: 'numberedListItem',
68
+ props: { start: 1 },
69
+ content: [{ type: 'text', text: 'First numbered item' }]
70
+ },
71
+ {
72
+ type: 'numberedListItem',
73
+ props: { start: 2 },
74
+ content: [{ type: 'text', text: 'Second numbered item' }]
75
+ },
76
+ {
77
+ type: 'codeBlock',
78
+ props: { language: 'javascript' },
79
+ content: [{ type: 'text', text: 'const x = 42;\nconsole.log(x);' }]
80
+ },
81
+ {
82
+ type: 'paragraph',
83
+ content: [
84
+ { type: 'text', text: 'Link: ' },
85
+ {
86
+ type: 'text',
87
+ text: 'example.com',
88
+ styles: {
89
+ hyperlink: 'https://example.com'
90
+ }
91
+ }
92
+ ]
93
+ }
94
+ ]
95
+ };
96
+ const blob = new Blob([JSON.stringify(complexContent)], { type: 'application/json' });
97
+ mockSupabase.storage.from.mockReturnValue({
98
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
99
+ });
100
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
101
+ await pullDocuments(false, true);
102
+ const files = fs.readdirSync(docsDir);
103
+ const content = fs.readFileSync(path.join(docsDir, files[0]), 'utf-8');
104
+ // Verify structure is preserved
105
+ expect(content).toContain('# Complex Document');
106
+ expect(content).toContain('**bold**');
107
+ expect(content).toContain('*italic*');
108
+ expect(content).toContain('`code`');
109
+ expect(content).toContain('- Top level item');
110
+ expect(content).toContain('1. First numbered item');
111
+ expect(content).toContain('2. Second numbered item');
112
+ expect(content).toContain('```javascript');
113
+ expect(content).toContain('const x = 42;');
114
+ // Note: BlockNote doesn't convert hyperlink styles to markdown links
115
+ expect(content).toContain('example.com');
116
+ });
117
+ it('should handle empty documents gracefully', async () => {
118
+ config.saveConfig(mockConfig());
119
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
120
+ const mockSupabase = createMockSupabaseClient();
121
+ const doc = mockDocumentRecord({ id: 'doc-1', title: 'Empty Document' });
122
+ mockSupabase.from.mockReturnValue({
123
+ select: vi.fn().mockReturnThis(),
124
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
125
+ });
126
+ // Empty BlockNote content
127
+ const emptyContent = {
128
+ type: 'blocknote',
129
+ content: []
130
+ };
131
+ const blob = new Blob([JSON.stringify(emptyContent)], { type: 'application/json' });
132
+ mockSupabase.storage.from.mockReturnValue({
133
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
134
+ });
135
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
136
+ await pullDocuments(false, true);
137
+ const files = fs.readdirSync(docsDir);
138
+ expect(files.length).toBe(1);
139
+ const content = fs.readFileSync(path.join(docsDir, files[0]), 'utf-8');
140
+ // Should have frontmatter but no body content
141
+ expect(content).toContain('kaimon_id: "doc-1"');
142
+ expect(content).toContain('title: "Empty Document"');
143
+ expect(content).toContain('---');
144
+ });
145
+ it('should preserve frontmatter integrity: all fields present and correct', async () => {
146
+ config.saveConfig(mockConfig());
147
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
148
+ const mockSupabase = createMockSupabaseClient();
149
+ const createdAt = '2024-01-15T10:30:00.000Z';
150
+ const updatedAt = '2024-03-15T15:45:30.123Z';
151
+ const doc = mockDocumentRecord({
152
+ id: 'doc-abc-123',
153
+ title: 'Frontmatter Test',
154
+ created_at: createdAt,
155
+ updated_at: updatedAt
156
+ });
157
+ mockSupabase.from.mockReturnValue({
158
+ select: vi.fn().mockReturnThis(),
159
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
160
+ });
161
+ const content = {
162
+ type: 'blocknote',
163
+ content: [
164
+ { type: 'paragraph', content: [{ type: 'text', text: 'Test content' }] }
165
+ ]
166
+ };
167
+ const blob = new Blob([JSON.stringify(content)], { type: 'application/json' });
168
+ mockSupabase.storage.from.mockReturnValue({
169
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
170
+ });
171
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
172
+ await pullDocuments(false, true);
173
+ const files = fs.readdirSync(docsDir);
174
+ const fileContent = fs.readFileSync(path.join(docsDir, files[0]), 'utf-8');
175
+ // Verify ALL frontmatter fields are present and exact
176
+ expect(fileContent).toContain('---');
177
+ expect(fileContent).toContain('title: "Frontmatter Test"');
178
+ expect(fileContent).toContain('kaimon_id: "doc-abc-123"');
179
+ expect(fileContent).toContain(`created_at: "${createdAt}"`);
180
+ expect(fileContent).toContain(`updated_at: "${updatedAt}"`);
181
+ // Verify frontmatter is at the start
182
+ expect(fileContent.indexOf('---')).toBe(0);
183
+ });
184
+ it('should preserve markdown special characters and escaping', async () => {
185
+ config.saveConfig(mockConfig());
186
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
187
+ const mockSupabase = createMockSupabaseClient();
188
+ const doc = mockDocumentRecord({ id: 'doc-1', title: 'Special Chars' });
189
+ mockSupabase.from.mockReturnValue({
190
+ select: vi.fn().mockReturnThis(),
191
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
192
+ });
193
+ const specialContent = {
194
+ type: 'blocknote',
195
+ content: [
196
+ {
197
+ type: 'paragraph',
198
+ content: [{ type: 'text', text: 'Text with * asterisks * and _ underscores _' }]
199
+ },
200
+ {
201
+ type: 'paragraph',
202
+ content: [{ type: 'text', text: 'Backticks ` in text' }]
203
+ },
204
+ {
205
+ type: 'paragraph',
206
+ content: [{ type: 'text', text: 'HTML <tags> & entities &amp;' }]
207
+ },
208
+ {
209
+ type: 'paragraph',
210
+ content: [{ type: 'text', text: '[Brackets] and (Parentheses)' }]
211
+ }
212
+ ]
213
+ };
214
+ const blob = new Blob([JSON.stringify(specialContent)], { type: 'application/json' });
215
+ mockSupabase.storage.from.mockReturnValue({
216
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
217
+ });
218
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
219
+ await pullDocuments(false, true);
220
+ const files = fs.readdirSync(docsDir);
221
+ const content = fs.readFileSync(path.join(docsDir, files[0]), 'utf-8');
222
+ // Content should preserve special characters
223
+ expect(content).toContain('asterisks');
224
+ expect(content).toContain('underscores');
225
+ expect(content).toContain('Backticks');
226
+ expect(content).toContain('<tags>');
227
+ expect(content).toContain('[Brackets]');
228
+ expect(content).toContain('(Parentheses)');
229
+ });
230
+ it('should handle large documents (1000+ blocks)', async () => {
231
+ config.saveConfig(mockConfig());
232
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
233
+ const mockSupabase = createMockSupabaseClient();
234
+ const doc = mockDocumentRecord({ id: 'doc-1', title: 'Large Document' });
235
+ mockSupabase.from.mockReturnValue({
236
+ select: vi.fn().mockReturnThis(),
237
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
238
+ });
239
+ // Create large content (1000 paragraph blocks)
240
+ const largeContent = {
241
+ type: 'blocknote',
242
+ content: Array.from({ length: 1000 }, (_, i) => ({
243
+ type: 'paragraph',
244
+ content: [{ type: 'text', text: `Paragraph ${i + 1} with some content here.` }]
245
+ }))
246
+ };
247
+ const blob = new Blob([JSON.stringify(largeContent)], { type: 'application/json' });
248
+ mockSupabase.storage.from.mockReturnValue({
249
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
250
+ });
251
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
252
+ // Should handle large document without issues
253
+ await pullDocuments(false, true);
254
+ const files = fs.readdirSync(docsDir);
255
+ expect(files.length).toBe(1);
256
+ const content = fs.readFileSync(path.join(docsDir, files[0]), 'utf-8');
257
+ // Verify first and last paragraphs exist
258
+ expect(content).toContain('Paragraph 1 with some content');
259
+ expect(content).toContain('Paragraph 1000 with some content');
260
+ // File should be readable
261
+ const stats = fs.statSync(path.join(docsDir, files[0]));
262
+ expect(stats.size).toBeGreaterThan(0);
263
+ });
264
+ it('should verify mtime matches remote updated_at timestamp', async () => {
265
+ config.saveConfig(mockConfig());
266
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
267
+ const mockSupabase = createMockSupabaseClient();
268
+ const updatedAt = new Date('2024-03-15T12:00:00.000Z');
269
+ const doc = mockDocumentRecord({
270
+ id: 'doc-1',
271
+ title: 'Timestamp Test',
272
+ updated_at: updatedAt.toISOString()
273
+ });
274
+ mockSupabase.from.mockReturnValue({
275
+ select: vi.fn().mockReturnThis(),
276
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
277
+ });
278
+ const content = {
279
+ type: 'blocknote',
280
+ content: [
281
+ { type: 'paragraph', content: [{ type: 'text', text: 'Test' }] }
282
+ ]
283
+ };
284
+ const blob = new Blob([JSON.stringify(content)], { type: 'application/json' });
285
+ mockSupabase.storage.from.mockReturnValue({
286
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
287
+ });
288
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
289
+ await pullDocuments(false, true);
290
+ const files = fs.readdirSync(docsDir);
291
+ const stats = fs.statSync(path.join(docsDir, files[0]));
292
+ // mtime should match updated_at
293
+ expect(stats.mtime.getTime()).toBe(updatedAt.getTime());
294
+ });
295
+ });
296
+ //# sourceMappingURL=data-integrity.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-integrity.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/data-integrity.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=edge-cases-advanced.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-cases-advanced.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/edge-cases-advanced.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,286 @@
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('Advanced 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 handle readonly directory gracefully', async () => {
24
+ config.saveConfig(mockConfig());
25
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
26
+ const mockSupabase = createMockSupabaseClient();
27
+ const doc = mockDocumentRecord({ id: 'doc-1', title: 'Test Doc' });
28
+ mockSupabase.from.mockReturnValue({
29
+ select: vi.fn().mockReturnThis(),
30
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
31
+ });
32
+ const mockContent = mockBlockNoteContent();
33
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
34
+ mockSupabase.storage.from.mockReturnValue({
35
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
36
+ });
37
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
38
+ // Create readonly parent directory
39
+ fs.mkdirSync(docsDir, { recursive: true });
40
+ try {
41
+ // Make directory readonly (may not work on all systems)
42
+ fs.chmodSync(docsDir, 0o444);
43
+ // Pull should handle readonly error
44
+ await expect(pullDocuments(false, true)).rejects.toThrow();
45
+ }
46
+ catch (error) {
47
+ // If chmod doesn't work (Windows), that's okay
48
+ expect(error).toBeDefined();
49
+ }
50
+ finally {
51
+ // Restore permissions for cleanup
52
+ try {
53
+ fs.chmodSync(docsDir, 0o755);
54
+ }
55
+ catch (e) {
56
+ // Ignore cleanup errors
57
+ }
58
+ }
59
+ });
60
+ it('should handle very long path (Windows 260-char limit)', async () => {
61
+ config.saveConfig(mockConfig());
62
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
63
+ const mockSupabase = createMockSupabaseClient();
64
+ // Create document title that would exceed Windows path limit
65
+ // Windows: C:\...\tempDir\KaimonDocs\very-long-title.md = ~260 chars
66
+ const longTitle = 'A'.repeat(250);
67
+ const doc = mockDocumentRecord({ id: 'doc-1', title: longTitle });
68
+ mockSupabase.from.mockReturnValue({
69
+ select: vi.fn().mockReturnThis(),
70
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
71
+ });
72
+ const mockContent = mockBlockNoteContent();
73
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
74
+ mockSupabase.storage.from.mockReturnValue({
75
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
76
+ });
77
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
78
+ // Should either succeed (truncate) or fail gracefully
79
+ try {
80
+ await pullDocuments(false, true);
81
+ // If it succeeds, verify file was created
82
+ if (fs.existsSync(docsDir)) {
83
+ const files = fs.readdirSync(docsDir);
84
+ // May or may not have files depending on platform
85
+ expect(files.length).toBeGreaterThanOrEqual(0);
86
+ }
87
+ }
88
+ catch (error) {
89
+ // Platform may reject long paths - that's acceptable
90
+ expect(error.message).toMatch(/ENAMETOOLONG|path too long|invalid/i);
91
+ }
92
+ });
93
+ it('should handle disk space issues gracefully', async () => {
94
+ config.saveConfig(mockConfig());
95
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
96
+ const mockSupabase = createMockSupabaseClient();
97
+ const doc = mockDocumentRecord({ id: 'doc-1', title: 'Test Doc' });
98
+ mockSupabase.from.mockReturnValue({
99
+ select: vi.fn().mockReturnThis(),
100
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
101
+ });
102
+ const mockContent = mockBlockNoteContent();
103
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
104
+ mockSupabase.storage.from.mockReturnValue({
105
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
106
+ });
107
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
108
+ // Mock fs.writeFileSync to simulate ENOSPC (no space)
109
+ const originalWriteFileSync = fs.writeFileSync;
110
+ vi.spyOn(fs, 'writeFileSync').mockImplementation((path, data, options) => {
111
+ const error = new Error('ENOSPC: no space left on device');
112
+ error.code = 'ENOSPC';
113
+ throw error;
114
+ });
115
+ // Pull should handle disk space error
116
+ await pullDocuments(false, true);
117
+ // Should not crash, may log error
118
+ expect(fs.writeFileSync).toHaveBeenCalled();
119
+ // Restore original
120
+ fs.writeFileSync = originalWriteFileSync;
121
+ });
122
+ it('should handle concurrent pull attempts (file locking)', async () => {
123
+ config.saveConfig(mockConfig());
124
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
125
+ const mockSupabase = createMockSupabaseClient();
126
+ const doc = mockDocumentRecord({ id: 'doc-1', title: 'Concurrent Doc' });
127
+ mockSupabase.from.mockReturnValue({
128
+ select: vi.fn().mockReturnThis(),
129
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
130
+ });
131
+ const mockContent = mockBlockNoteContent();
132
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
133
+ mockSupabase.storage.from.mockReturnValue({
134
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
135
+ });
136
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
137
+ // Start two pulls concurrently
138
+ const pull1 = pullDocuments(false, true);
139
+ const pull2 = pullDocuments(false, true);
140
+ // Both should complete without crashing
141
+ await Promise.all([pull1, pull2]);
142
+ // Should have created file (one or both succeeded)
143
+ if (fs.existsSync(docsDir)) {
144
+ const files = fs.readdirSync(docsDir);
145
+ expect(files.length).toBeGreaterThanOrEqual(1);
146
+ }
147
+ });
148
+ it('should handle symlink in KaimonDocs directory', async () => {
149
+ config.saveConfig(mockConfig());
150
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
151
+ const mockSupabase = createMockSupabaseClient();
152
+ // Create KaimonDocs with a symlink
153
+ fs.mkdirSync(docsDir, { recursive: true });
154
+ // Create a file outside docsDir
155
+ const targetFile = path.join(tempDir, 'target.md');
156
+ fs.writeFileSync(targetFile, 'Target content', 'utf-8');
157
+ // Create symlink inside docsDir (may not work on Windows without admin)
158
+ const symlinkPath = path.join(docsDir, 'symlink.md');
159
+ try {
160
+ fs.symlinkSync(targetFile, symlinkPath);
161
+ const doc = mockDocumentRecord({ id: 'doc-1', title: 'New Doc' });
162
+ mockSupabase.from.mockReturnValue({
163
+ select: vi.fn().mockReturnThis(),
164
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
165
+ });
166
+ const mockContent = mockBlockNoteContent();
167
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
168
+ mockSupabase.storage.from.mockReturnValue({
169
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
170
+ });
171
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
172
+ // Pull should work despite symlink
173
+ await pullDocuments(false, true);
174
+ // Should have both symlink and new file
175
+ const files = fs.readdirSync(docsDir);
176
+ expect(files.length).toBeGreaterThanOrEqual(2);
177
+ }
178
+ catch (error) {
179
+ // Symlink may fail on Windows - that's okay
180
+ if (error.code === 'EPERM' || error.code === 'ENOTSUP') {
181
+ expect(error).toBeDefined();
182
+ }
183
+ else {
184
+ throw error;
185
+ }
186
+ }
187
+ });
188
+ it('should handle document with null/undefined fields', async () => {
189
+ config.saveConfig(mockConfig());
190
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
191
+ const mockSupabase = createMockSupabaseClient();
192
+ // Document with missing optional fields
193
+ const doc = {
194
+ id: 'doc-1',
195
+ user_id: 'user-123',
196
+ title: 'Incomplete Doc',
197
+ created_at: new Date().toISOString(),
198
+ updated_at: new Date().toISOString()
199
+ // Missing other optional fields
200
+ };
201
+ mockSupabase.from.mockReturnValue({
202
+ select: vi.fn().mockReturnThis(),
203
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
204
+ });
205
+ const mockContent = mockBlockNoteContent();
206
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
207
+ mockSupabase.storage.from.mockReturnValue({
208
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
209
+ });
210
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
211
+ // Should handle gracefully
212
+ await pullDocuments(false, true);
213
+ const files = fs.readdirSync(docsDir);
214
+ expect(files.length).toBe(1);
215
+ const content = fs.readFileSync(path.join(docsDir, files[0]), 'utf-8');
216
+ expect(content).toContain('kaimon_id: "doc-1"');
217
+ });
218
+ it('should handle document with special timestamp formats', async () => {
219
+ config.saveConfig(mockConfig());
220
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
221
+ const mockSupabase = createMockSupabaseClient();
222
+ // Document with various timestamp formats
223
+ const doc = mockDocumentRecord({
224
+ id: 'doc-1',
225
+ title: 'Timestamp Test',
226
+ created_at: '2024-03-15T12:00:00Z', // ISO with Z
227
+ updated_at: '2024-03-15T12:00:00.000+00:00' // ISO with timezone
228
+ });
229
+ mockSupabase.from.mockReturnValue({
230
+ select: vi.fn().mockReturnThis(),
231
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
232
+ });
233
+ const mockContent = mockBlockNoteContent();
234
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
235
+ mockSupabase.storage.from.mockReturnValue({
236
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
237
+ });
238
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
239
+ // Should parse timestamps correctly
240
+ await pullDocuments(false, true);
241
+ const files = fs.readdirSync(docsDir);
242
+ expect(files.length).toBe(1);
243
+ const content = fs.readFileSync(path.join(docsDir, files[0]), 'utf-8');
244
+ expect(content).toContain('created_at:');
245
+ expect(content).toContain('updated_at:');
246
+ });
247
+ it('should handle rapid filesystem changes during pull', async () => {
248
+ config.saveConfig(mockConfig());
249
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
250
+ const mockSupabase = createMockSupabaseClient();
251
+ const doc = mockDocumentRecord({ id: 'doc-1', title: 'Rapid Change' });
252
+ mockSupabase.from.mockReturnValue({
253
+ select: vi.fn().mockReturnThis(),
254
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
255
+ });
256
+ const mockContent = mockBlockNoteContent();
257
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
258
+ mockSupabase.storage.from.mockReturnValue({
259
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
260
+ });
261
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
262
+ // Start pull
263
+ const pullPromise = pullDocuments(false, true);
264
+ // Immediately try to delete/modify KaimonDocs folder
265
+ // This simulates user/system interference during pull
266
+ setTimeout(() => {
267
+ try {
268
+ if (fs.existsSync(docsDir)) {
269
+ // Try to delete a file being written
270
+ const files = fs.readdirSync(docsDir);
271
+ if (files.length > 0) {
272
+ fs.unlinkSync(path.join(docsDir, files[0]));
273
+ }
274
+ }
275
+ }
276
+ catch (e) {
277
+ // Expected - file may be locked
278
+ }
279
+ }, 10);
280
+ // Pull should complete despite interference
281
+ await pullPromise;
282
+ // At least attempt was made
283
+ expect(pullPromise).toBeDefined();
284
+ });
285
+ });
286
+ //# sourceMappingURL=edge-cases-advanced.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-cases-advanced.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/edge-cases-advanced.test.ts"],"names":[],"mappings":"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"}
@@ -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":""}