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.
- package/README.md +44 -39
- package/dist/__tests__/commands/list.test.d.ts +2 -0
- package/dist/__tests__/commands/list.test.d.ts.map +1 -0
- package/dist/__tests__/commands/list.test.js +109 -0
- package/dist/__tests__/commands/list.test.js.map +1 -0
- package/dist/__tests__/commands/pull.test.js +153 -58
- package/dist/__tests__/commands/pull.test.js.map +1 -1
- package/dist/__tests__/integration/complete-user-journeys.test.d.ts +2 -0
- package/dist/__tests__/integration/complete-user-journeys.test.d.ts.map +1 -0
- package/dist/__tests__/integration/complete-user-journeys.test.js +348 -0
- package/dist/__tests__/integration/complete-user-journeys.test.js.map +1 -0
- package/dist/__tests__/integration/config-integration.test.d.ts +2 -0
- package/dist/__tests__/integration/config-integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/config-integration.test.js +151 -0
- package/dist/__tests__/integration/config-integration.test.js.map +1 -0
- package/dist/__tests__/integration/data-integrity.test.d.ts +2 -0
- package/dist/__tests__/integration/data-integrity.test.d.ts.map +1 -0
- package/dist/__tests__/integration/data-integrity.test.js +296 -0
- package/dist/__tests__/integration/data-integrity.test.js.map +1 -0
- package/dist/__tests__/integration/edge-cases-advanced.test.d.ts +2 -0
- package/dist/__tests__/integration/edge-cases-advanced.test.d.ts.map +1 -0
- package/dist/__tests__/integration/edge-cases-advanced.test.js +286 -0
- package/dist/__tests__/integration/edge-cases-advanced.test.js.map +1 -0
- package/dist/__tests__/integration/error-recovery.test.d.ts +2 -0
- package/dist/__tests__/integration/error-recovery.test.d.ts.map +1 -0
- package/dist/__tests__/integration/error-recovery.test.js +277 -0
- package/dist/__tests__/integration/error-recovery.test.js.map +1 -0
- package/dist/__tests__/integration/filesystem-edge-cases.test.d.ts +2 -0
- package/dist/__tests__/integration/filesystem-edge-cases.test.d.ts.map +1 -0
- package/dist/__tests__/integration/filesystem-edge-cases.test.js +218 -0
- package/dist/__tests__/integration/filesystem-edge-cases.test.js.map +1 -0
- package/dist/__tests__/integration/filtering-operations.test.d.ts +2 -0
- package/dist/__tests__/integration/filtering-operations.test.d.ts.map +1 -0
- package/dist/__tests__/integration/filtering-operations.test.js +278 -0
- package/dist/__tests__/integration/filtering-operations.test.js.map +1 -0
- package/dist/__tests__/integration/full-workflow.test.js +3 -57
- package/dist/__tests__/integration/full-workflow.test.js.map +1 -1
- package/dist/__tests__/integration/state-transitions.test.d.ts +2 -0
- package/dist/__tests__/integration/state-transitions.test.d.ts.map +1 -0
- package/dist/__tests__/integration/state-transitions.test.js +320 -0
- package/dist/__tests__/integration/state-transitions.test.js.map +1 -0
- package/dist/commands/auth.js +2 -2
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/config.js +1 -1
- package/dist/commands/list.d.ts +4 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +19 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +6 -4
- package/dist/commands/pull.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/dist/utils/listOperations.d.ts +5 -0
- package/dist/utils/listOperations.d.ts.map +1 -0
- package/dist/utils/listOperations.js +138 -0
- package/dist/utils/listOperations.js.map +1 -0
- package/dist/utils/projectConfig.d.ts.map +1 -1
- package/dist/utils/projectConfig.js +5 -6
- package/dist/utils/projectConfig.js.map +1 -1
- package/dist/utils/pullOperations.d.ts +8 -0
- package/dist/utils/pullOperations.d.ts.map +1 -0
- package/dist/utils/pullOperations.js +319 -0
- package/dist/utils/pullOperations.js.map +1 -0
- package/package.json +5 -4
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Kaimon CLI
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> Download your Kaimon documentation (.md) to your codebase from the command line.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -22,7 +22,6 @@ Then use `npx kaimon` instead of `kaimon`:
|
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
24
|
npx kaimon pull
|
|
25
|
-
npx kaimon push
|
|
26
25
|
```
|
|
27
26
|
|
|
28
27
|
**Local installation benefits:** Version control your CLI version, team consistency, no global pollution.
|
|
@@ -36,10 +35,8 @@ kaimon auth login
|
|
|
36
35
|
# 2. Navigate to your project directory
|
|
37
36
|
cd my-project
|
|
38
37
|
|
|
39
|
-
# 3.
|
|
40
|
-
kaimon pull
|
|
41
|
-
OR
|
|
42
|
-
kaimon push
|
|
38
|
+
# 3. Download your documents as markdown files
|
|
39
|
+
kaimon pull
|
|
43
40
|
```
|
|
44
41
|
|
|
45
42
|
Your documents will be downloaded to `./KaimonDocs/` as markdown files with metadata frontmatter.
|
|
@@ -71,55 +68,68 @@ kaimon auth logout
|
|
|
71
68
|
### Project Setup
|
|
72
69
|
|
|
73
70
|
```bash
|
|
74
|
-
# Initialize current directory for
|
|
71
|
+
# Initialize current directory for pulling
|
|
75
72
|
kaimon config init
|
|
76
73
|
|
|
77
74
|
# View project configuration
|
|
78
75
|
kaimon config show
|
|
79
76
|
```
|
|
80
77
|
|
|
81
|
-
###
|
|
78
|
+
### Downloading Documents
|
|
82
79
|
|
|
83
80
|
```bash
|
|
81
|
+
# List all available documents
|
|
82
|
+
kaimon list
|
|
83
|
+
|
|
84
84
|
# Download all documents from Kaimon as markdown
|
|
85
85
|
kaimon pull
|
|
86
86
|
|
|
87
|
+
# Download specific document by title
|
|
88
|
+
kaimon pull "Product Roadmap"
|
|
89
|
+
|
|
90
|
+
# Download specific document by ID
|
|
91
|
+
kaimon pull "abc-123-def-456"
|
|
92
|
+
|
|
93
|
+
# Download multiple specific documents
|
|
94
|
+
kaimon pull "Product Roadmap" "Engineering Notes" "abc-123-def-456"
|
|
95
|
+
|
|
87
96
|
# Download documents to current folder (no KaimonDocs subfolder)
|
|
88
97
|
kaimon pull --flat
|
|
89
98
|
|
|
90
99
|
# Pull without confirmation
|
|
91
100
|
kaimon pull -y
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### List Command
|
|
92
104
|
|
|
93
|
-
|
|
94
|
-
kaimon push
|
|
105
|
+
Show all available documents with their status:
|
|
95
106
|
|
|
96
|
-
|
|
97
|
-
kaimon
|
|
107
|
+
```bash
|
|
108
|
+
$ kaimon list
|
|
98
109
|
|
|
99
|
-
|
|
100
|
-
kaimon push -y
|
|
110
|
+
📄 Available documents (5 total):
|
|
101
111
|
|
|
102
|
-
|
|
103
|
-
|
|
112
|
+
1. "Product Roadmap" ID: abc-123-def-456 (updated 2 days ago) [NEW]
|
|
113
|
+
2. "Engineering Notes" ID: xyz-789-ghi-012 (updated 1 week ago) [UP-TO-DATE]
|
|
114
|
+
3. "Design System" ID: jkl-345-mno-678 (updated 3 days ago) [UPDATED]
|
|
115
|
+
4. "Meeting Notes" ID: pqr-901-stu-234 (updated 1 hour ago) [NEW]
|
|
116
|
+
5. "API Documentation" ID: vwx-567-yza-890 (updated 2 weeks ago) [UP-TO-DATE]
|
|
117
|
+
|
|
118
|
+
Use: kaimon pull "title" or kaimon pull "ID" to pull specific document(s)
|
|
104
119
|
```
|
|
105
120
|
|
|
121
|
+
**Status indicators:**
|
|
122
|
+
- `[NEW]` - Document not yet in local folder
|
|
123
|
+
- `[UPDATED]` - Remote version is newer than local
|
|
124
|
+
- `[UP-TO-DATE]` - Local and remote are in sync
|
|
125
|
+
|
|
106
126
|
**Pull behavior:**
|
|
107
|
-
- **Smart
|
|
127
|
+
- **Smart pull**: Only pulls new or updated documents (compares timestamps)
|
|
108
128
|
- If local file is newer than remote → skips (no overwrite)
|
|
109
129
|
- Default: Creates `./KaimonDocs/` subfolder and downloads documents there
|
|
110
130
|
- `--flat`: Downloads documents directly to current folder (no subfolder)
|
|
111
131
|
- `-y, --yes`: Skip confirmation and pull all documents
|
|
112
|
-
- Shows preview with
|
|
113
|
-
|
|
114
|
-
**Push behavior:**
|
|
115
|
-
- **Smart sync**: Only pushes new or modified files (compares timestamps)
|
|
116
|
-
- If remote is newer than local → skips (no overwrite)
|
|
117
|
-
- Reads frontmatter `kaimon_id` to match existing documents
|
|
118
|
-
- Default: Finds all `.md` files in current folder + subfolders, lists them, asks for confirmation
|
|
119
|
-
- `[files...]`: Push only specific files (e.g., `kaimon push doc1.md readme.md`)
|
|
120
|
-
- `-y, --yes`: Skip confirmation and push all files found
|
|
121
|
-
- Shows preview with actions and timestamps before pushing
|
|
122
|
-
- Automatically updates frontmatter with `kaimon_id` for new documents
|
|
132
|
+
- Shows preview with document names and timestamps before pulling
|
|
123
133
|
|
|
124
134
|
## Document Format
|
|
125
135
|
|
|
@@ -139,23 +149,18 @@ Content here...
|
|
|
139
149
|
```
|
|
140
150
|
|
|
141
151
|
**Important**: The `kaimon_id` field links local files to remote documents. Don't remove it!
|
|
142
|
-
- When pushing: Files with `kaimon_id` update existing documents
|
|
143
|
-
- When pushing: Files without `kaimon_id` create new documents
|
|
144
|
-
- The CLI automatically adds `kaimon_id` to new files after first push
|
|
145
152
|
|
|
146
|
-
## Smart
|
|
153
|
+
## Smart Pull
|
|
147
154
|
|
|
148
|
-
|
|
155
|
+
The `pull` command uses **smart pull** logic to avoid unnecessary transfers:
|
|
149
156
|
|
|
150
157
|
### Pull Logic
|
|
151
158
|
- **New documents**: Not in local folder → pull
|
|
152
159
|
- **Updated documents**: Remote newer than local → pull
|
|
160
|
+
- **Conflict detected**: Both local and remote changed → skip with warning
|
|
153
161
|
- **Up-to-date**: Remote same age or older → skip
|
|
154
162
|
|
|
155
|
-
|
|
156
|
-
- **New files**: No `kaimon_id` in frontmatter → create new document
|
|
157
|
-
- **Modified files**: Local newer than remote → push update
|
|
158
|
-
- **Up-to-date**: Remote same age or newer → skip
|
|
163
|
+
The CLI compares content hashes to detect when docs were edited elsewhere.
|
|
159
164
|
|
|
160
165
|
### Example Output
|
|
161
166
|
|
|
@@ -176,8 +181,8 @@ Updated documents:
|
|
|
176
181
|
|
|
177
182
|
⏭️ 12 document(s) already up to date
|
|
178
183
|
|
|
179
|
-
📁
|
|
180
|
-
Will
|
|
184
|
+
📁 Pull Location
|
|
185
|
+
Will pull to: ./KaimonDocs/
|
|
181
186
|
|
|
182
187
|
Continue? (y/N):
|
|
183
188
|
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/commands/list.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import { listDocuments } from '../../utils/listOperations.js';
|
|
5
|
+
import * as config from '../../utils/config.js';
|
|
6
|
+
import * as supabaseClient from '../../utils/supabaseClient.js';
|
|
7
|
+
import * as tokenRefresh from '../../utils/tokenRefresh.js';
|
|
8
|
+
import { createTempDir, cleanupTempDir, mockConfig, mockDocumentRecord, createMockSupabaseClient } from '../helpers.js';
|
|
9
|
+
describe('list command', () => {
|
|
10
|
+
let tempDir;
|
|
11
|
+
let docsDir;
|
|
12
|
+
let consoleSpy;
|
|
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
|
+
consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
19
|
+
});
|
|
20
|
+
afterEach(() => {
|
|
21
|
+
cleanupTempDir(tempDir);
|
|
22
|
+
vi.restoreAllMocks();
|
|
23
|
+
});
|
|
24
|
+
describe('listDocuments', () => {
|
|
25
|
+
it('should display documents with titles and IDs', async () => {
|
|
26
|
+
config.saveConfig(mockConfig());
|
|
27
|
+
vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
|
|
28
|
+
const mockDocs = [
|
|
29
|
+
mockDocumentRecord({
|
|
30
|
+
id: 'abc-123-def-456',
|
|
31
|
+
title: 'Product Roadmap',
|
|
32
|
+
updated_at: new Date().toISOString()
|
|
33
|
+
}),
|
|
34
|
+
mockDocumentRecord({
|
|
35
|
+
id: 'xyz-789-ghi-012',
|
|
36
|
+
title: 'Engineering Notes',
|
|
37
|
+
updated_at: new Date(Date.now() - 604800000).toISOString()
|
|
38
|
+
}),
|
|
39
|
+
];
|
|
40
|
+
const mockSupabase = createMockSupabaseClient();
|
|
41
|
+
mockSupabase.from.mockReturnValue({
|
|
42
|
+
select: vi.fn().mockReturnThis(),
|
|
43
|
+
order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
|
|
44
|
+
});
|
|
45
|
+
vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
|
|
46
|
+
await listDocuments();
|
|
47
|
+
const output = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
|
|
48
|
+
// User-facing: should see titles and IDs
|
|
49
|
+
expect(output).toContain('Product Roadmap');
|
|
50
|
+
expect(output).toContain('abc-123-def-456');
|
|
51
|
+
expect(output).toContain('Engineering Notes');
|
|
52
|
+
expect(output).toContain('xyz-789-ghi-012');
|
|
53
|
+
});
|
|
54
|
+
it('should show error when no documents exist', async () => {
|
|
55
|
+
config.saveConfig(mockConfig());
|
|
56
|
+
vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
|
|
57
|
+
const mockSupabase = createMockSupabaseClient();
|
|
58
|
+
mockSupabase.from.mockReturnValue({
|
|
59
|
+
select: vi.fn().mockReturnThis(),
|
|
60
|
+
order: vi.fn().mockResolvedValue({ data: [], error: null })
|
|
61
|
+
});
|
|
62
|
+
vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
|
|
63
|
+
await listDocuments();
|
|
64
|
+
const output = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
|
|
65
|
+
// Should indicate no documents
|
|
66
|
+
expect(output).toMatch(/No documents found|Create some documents/i);
|
|
67
|
+
});
|
|
68
|
+
it('should show helpful message on authentication failure', async () => {
|
|
69
|
+
config.saveConfig(mockConfig());
|
|
70
|
+
vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(false);
|
|
71
|
+
await expect(listDocuments()).rejects.toThrow('Not authenticated');
|
|
72
|
+
});
|
|
73
|
+
it('should handle database errors gracefully', async () => {
|
|
74
|
+
config.saveConfig(mockConfig());
|
|
75
|
+
vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
|
|
76
|
+
const mockSupabase = createMockSupabaseClient();
|
|
77
|
+
mockSupabase.from.mockReturnValue({
|
|
78
|
+
select: vi.fn().mockReturnThis(),
|
|
79
|
+
order: vi.fn().mockResolvedValue({
|
|
80
|
+
data: null,
|
|
81
|
+
error: { message: 'Connection failed' }
|
|
82
|
+
})
|
|
83
|
+
});
|
|
84
|
+
vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
|
|
85
|
+
await expect(listDocuments()).rejects.toThrow('Database error');
|
|
86
|
+
});
|
|
87
|
+
it('should display relative timestamps (e.g., "2 days ago")', async () => {
|
|
88
|
+
config.saveConfig(mockConfig());
|
|
89
|
+
vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
|
|
90
|
+
const mockDocs = [
|
|
91
|
+
mockDocumentRecord({
|
|
92
|
+
id: 'doc-1',
|
|
93
|
+
title: 'Test Doc',
|
|
94
|
+
updated_at: new Date(Date.now() - 172800000).toISOString() // 2 days ago
|
|
95
|
+
}),
|
|
96
|
+
];
|
|
97
|
+
const mockSupabase = createMockSupabaseClient();
|
|
98
|
+
mockSupabase.from.mockReturnValue({
|
|
99
|
+
select: vi.fn().mockReturnThis(),
|
|
100
|
+
order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
|
|
101
|
+
});
|
|
102
|
+
vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
|
|
103
|
+
await listDocuments();
|
|
104
|
+
const output = consoleSpy.mock.calls.map((c) => c[0]).join('\n');
|
|
105
|
+
expect(output).toMatch(/days? ago/);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
//# sourceMappingURL=list.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.test.js","sourceRoot":"","sources":["../../../src/__tests__/commands/list.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
|
2
2
|
import fs from 'fs';
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import os from 'os';
|
|
5
|
-
import { pullDocuments } from '../../utils/
|
|
5
|
+
import { pullDocuments } from '../../utils/pullOperations.js';
|
|
6
6
|
import * as config from '../../utils/config.js';
|
|
7
7
|
import * as supabaseClient from '../../utils/supabaseClient.js';
|
|
8
8
|
import * as tokenRefresh from '../../utils/tokenRefresh.js';
|
|
@@ -20,53 +20,54 @@ describe('pull command', () => {
|
|
|
20
20
|
cleanupTempDir(tempDir);
|
|
21
21
|
vi.restoreAllMocks();
|
|
22
22
|
});
|
|
23
|
-
describe('pullDocuments', () => {
|
|
24
|
-
it('should
|
|
25
|
-
// Setup auth
|
|
23
|
+
describe('pullDocuments - core behavior', () => {
|
|
24
|
+
it('should create markdown files with correct metadata', async () => {
|
|
26
25
|
config.saveConfig(mockConfig());
|
|
27
26
|
vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
|
|
28
|
-
// Mock Supabase
|
|
29
27
|
const mockSupabase = createMockSupabaseClient();
|
|
30
|
-
const mockDocs = [mockDocumentRecord({
|
|
28
|
+
const mockDocs = [mockDocumentRecord({
|
|
29
|
+
id: 'test-doc-123',
|
|
30
|
+
title: 'My Test Document'
|
|
31
|
+
})];
|
|
31
32
|
mockSupabase.from.mockReturnValue({
|
|
32
33
|
select: vi.fn().mockReturnThis(),
|
|
33
34
|
order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
|
|
34
35
|
});
|
|
35
|
-
const mockContent = mockBlockNoteContent('Test Document');
|
|
36
|
+
const mockContent = mockBlockNoteContent('My Test Document');
|
|
36
37
|
const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
|
|
37
38
|
mockSupabase.storage.from.mockReturnValue({
|
|
38
39
|
download: vi.fn().mockResolvedValue({ data: blob, error: null })
|
|
39
40
|
});
|
|
40
41
|
vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
|
|
41
|
-
// Pull with -y flag to skip confirmation
|
|
42
42
|
await pullDocuments(false, true);
|
|
43
43
|
// Verify file was created
|
|
44
|
+
expect(fs.existsSync(docsDir)).toBe(true);
|
|
44
45
|
const files = fs.readdirSync(docsDir);
|
|
45
|
-
expect(files).
|
|
46
|
-
expect(files[0]).
|
|
47
|
-
// Verify
|
|
46
|
+
expect(files.length).toBe(1);
|
|
47
|
+
expect(files[0]).toMatch(/\.md$/);
|
|
48
|
+
// Verify metadata
|
|
48
49
|
const content = fs.readFileSync(path.join(docsDir, files[0]), 'utf-8');
|
|
49
|
-
expect(content).toContain('kaimon_id:');
|
|
50
|
-
expect(content).toContain('Test Document');
|
|
50
|
+
expect(content).toContain('kaimon_id: "test-doc-123"');
|
|
51
|
+
expect(content).toContain('title: "My Test Document"');
|
|
51
52
|
});
|
|
52
|
-
it('should skip up-to-date
|
|
53
|
+
it('should skip documents that are already up-to-date', async () => {
|
|
53
54
|
config.saveConfig(mockConfig());
|
|
54
55
|
vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
|
|
55
|
-
// Create existing file
|
|
56
|
-
const mockDoc = mockDocumentRecord({
|
|
57
|
-
id: 'doc-123',
|
|
58
|
-
title: 'Existing Document',
|
|
59
|
-
updated_at: new Date(Date.now() - 86400000).toISOString() // 1 day ago
|
|
60
|
-
});
|
|
56
|
+
// Create existing file from 1 day ago
|
|
61
57
|
fs.mkdirSync(docsDir, { recursive: true });
|
|
62
|
-
const existingFile = path.join(docsDir, 'Existing-
|
|
58
|
+
const existingFile = path.join(docsDir, 'Existing-Doc.md');
|
|
59
|
+
const oldTime = new Date(Date.now() - 86400000);
|
|
63
60
|
fs.writeFileSync(existingFile, `---
|
|
64
|
-
kaimon_id: "doc
|
|
61
|
+
kaimon_id: "existing-doc"
|
|
65
62
|
---
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
//
|
|
69
|
-
|
|
63
|
+
Original content`, 'utf-8');
|
|
64
|
+
fs.utimesSync(existingFile, oldTime, oldTime);
|
|
65
|
+
// Remote doc is older than local
|
|
66
|
+
const mockDoc = mockDocumentRecord({
|
|
67
|
+
id: 'existing-doc',
|
|
68
|
+
title: 'Existing Doc',
|
|
69
|
+
updated_at: new Date(oldTime.getTime() - 3600000).toISOString()
|
|
70
|
+
});
|
|
70
71
|
const mockSupabase = createMockSupabaseClient();
|
|
71
72
|
mockSupabase.from.mockReturnValue({
|
|
72
73
|
select: vi.fn().mockReturnThis(),
|
|
@@ -74,15 +75,14 @@ Content`, 'utf-8');
|
|
|
74
75
|
});
|
|
75
76
|
vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
|
|
76
77
|
await pullDocuments(false, true);
|
|
77
|
-
// File should
|
|
78
|
-
const
|
|
79
|
-
expect(
|
|
80
|
-
kaimon_id: "doc
|
|
78
|
+
// File should NOT be modified
|
|
79
|
+
const finalContent = fs.readFileSync(existingFile, 'utf-8');
|
|
80
|
+
expect(finalContent).toBe(`---
|
|
81
|
+
kaimon_id: "existing-doc"
|
|
81
82
|
---
|
|
82
|
-
|
|
83
|
-
Content`);
|
|
83
|
+
Original content`);
|
|
84
84
|
});
|
|
85
|
-
it('should use flat directory
|
|
85
|
+
it('should use flat directory with --flat flag', async () => {
|
|
86
86
|
config.saveConfig(mockConfig());
|
|
87
87
|
vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
|
|
88
88
|
const mockSupabase = createMockSupabaseClient();
|
|
@@ -97,7 +97,7 @@ Content`);
|
|
|
97
97
|
download: vi.fn().mockResolvedValue({ data: blob, error: null })
|
|
98
98
|
});
|
|
99
99
|
vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
|
|
100
|
-
// Pull with --flat
|
|
100
|
+
// Pull with --flat flag
|
|
101
101
|
await pullDocuments(true, true);
|
|
102
102
|
// Files should be in current directory, not KaimonDocs/
|
|
103
103
|
const files = fs.readdirSync(tempDir);
|
|
@@ -105,24 +105,13 @@ Content`);
|
|
|
105
105
|
expect(mdFiles.length).toBeGreaterThan(0);
|
|
106
106
|
expect(fs.existsSync(docsDir)).toBe(false);
|
|
107
107
|
});
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const mockSupabase = createMockSupabaseClient();
|
|
112
|
-
mockSupabase.from.mockReturnValue({
|
|
113
|
-
select: vi.fn().mockReturnThis(),
|
|
114
|
-
order: vi.fn().mockResolvedValue({ data: [], error: null })
|
|
115
|
-
});
|
|
116
|
-
vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
|
|
117
|
-
await pullDocuments(false, true);
|
|
118
|
-
// Should not create directory if no docs
|
|
119
|
-
expect(fs.existsSync(docsDir)).toBe(false);
|
|
120
|
-
});
|
|
121
|
-
it('should handle authentication failure', async () => {
|
|
108
|
+
});
|
|
109
|
+
describe('pullDocuments - error handling', () => {
|
|
110
|
+
it('should fail gracefully if not authenticated', async () => {
|
|
122
111
|
vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(false);
|
|
123
112
|
await expect(pullDocuments(false, true)).rejects.toThrow('Not authenticated');
|
|
124
113
|
});
|
|
125
|
-
it('should handle database errors', async () => {
|
|
114
|
+
it('should handle database connection errors', async () => {
|
|
126
115
|
config.saveConfig(mockConfig());
|
|
127
116
|
vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
|
|
128
117
|
const mockSupabase = createMockSupabaseClient();
|
|
@@ -130,11 +119,11 @@ Content`);
|
|
|
130
119
|
select: vi.fn().mockReturnThis(),
|
|
131
120
|
order: vi.fn().mockResolvedValue({
|
|
132
121
|
data: null,
|
|
133
|
-
error: { message: '
|
|
122
|
+
error: { message: 'Connection timeout' }
|
|
134
123
|
})
|
|
135
124
|
});
|
|
136
125
|
vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
|
|
137
|
-
await expect(pullDocuments(false, true)).rejects.toThrow();
|
|
126
|
+
await expect(pullDocuments(false, true)).rejects.toThrow('Database error');
|
|
138
127
|
});
|
|
139
128
|
it('should handle storage download errors gracefully', async () => {
|
|
140
129
|
config.saveConfig(mockConfig());
|
|
@@ -153,17 +142,123 @@ Content`);
|
|
|
153
142
|
});
|
|
154
143
|
vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
|
|
155
144
|
// Should not throw, but handle error gracefully
|
|
145
|
+
await expect(pullDocuments(false, true)).resolves.not.toThrow();
|
|
146
|
+
});
|
|
147
|
+
it('should handle no documents available', async () => {
|
|
148
|
+
config.saveConfig(mockConfig());
|
|
149
|
+
vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
|
|
150
|
+
const mockSupabase = createMockSupabaseClient();
|
|
151
|
+
mockSupabase.from.mockReturnValue({
|
|
152
|
+
select: vi.fn().mockReturnThis(),
|
|
153
|
+
order: vi.fn().mockResolvedValue({ data: [], error: null })
|
|
154
|
+
});
|
|
155
|
+
vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
|
|
156
156
|
await pullDocuments(false, true);
|
|
157
|
+
// Should not create directory if no docs
|
|
158
|
+
expect(fs.existsSync(docsDir)).toBe(false);
|
|
157
159
|
});
|
|
158
|
-
|
|
160
|
+
});
|
|
161
|
+
describe('pullDocuments - filtering by title/ID', () => {
|
|
162
|
+
it('should pull only documents matching selected title', async () => {
|
|
159
163
|
config.saveConfig(mockConfig());
|
|
160
164
|
vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
|
|
161
|
-
const remoteTime = new Date('2024-01-15T10:00:00Z');
|
|
162
|
-
const mockDoc = mockDocumentRecord({ updated_at: remoteTime.toISOString() });
|
|
163
165
|
const mockSupabase = createMockSupabaseClient();
|
|
166
|
+
const mockDocs = [
|
|
167
|
+
mockDocumentRecord({ id: 'doc-1', title: 'Document A' }),
|
|
168
|
+
mockDocumentRecord({ id: 'doc-2', title: 'Document B' }),
|
|
169
|
+
mockDocumentRecord({ id: 'doc-3', title: 'Document C' }),
|
|
170
|
+
];
|
|
164
171
|
mockSupabase.from.mockReturnValue({
|
|
165
172
|
select: vi.fn().mockReturnThis(),
|
|
166
|
-
order: vi.fn().mockResolvedValue({ data:
|
|
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 only Document A
|
|
182
|
+
await pullDocuments(false, true, ['Document A']);
|
|
183
|
+
const files = fs.readdirSync(docsDir);
|
|
184
|
+
expect(files.length).toBe(1);
|
|
185
|
+
expect(files[0]).toContain('Document-A');
|
|
186
|
+
});
|
|
187
|
+
it('should pull only documents matching selected ID', async () => {
|
|
188
|
+
config.saveConfig(mockConfig());
|
|
189
|
+
vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
|
|
190
|
+
const mockSupabase = createMockSupabaseClient();
|
|
191
|
+
const mockDocs = [
|
|
192
|
+
mockDocumentRecord({ id: 'abc-123', title: 'Document A' }),
|
|
193
|
+
mockDocumentRecord({ id: 'xyz-789', title: 'Document B' }),
|
|
194
|
+
];
|
|
195
|
+
mockSupabase.from.mockReturnValue({
|
|
196
|
+
select: vi.fn().mockReturnThis(),
|
|
197
|
+
order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
|
|
198
|
+
});
|
|
199
|
+
const mockContent = mockBlockNoteContent();
|
|
200
|
+
const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
|
|
201
|
+
mockSupabase.storage.from.mockReturnValue({
|
|
202
|
+
download: vi.fn().mockResolvedValue({ data: blob, error: null })
|
|
203
|
+
});
|
|
204
|
+
vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
|
|
205
|
+
// Pull only by ID
|
|
206
|
+
await pullDocuments(false, true, ['abc-123']);
|
|
207
|
+
const files = fs.readdirSync(docsDir);
|
|
208
|
+
expect(files.length).toBe(1);
|
|
209
|
+
});
|
|
210
|
+
it('should handle when selected document does not exist', async () => {
|
|
211
|
+
config.saveConfig(mockConfig());
|
|
212
|
+
vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
|
|
213
|
+
const mockSupabase = createMockSupabaseClient();
|
|
214
|
+
const mockDocs = [mockDocumentRecord({ id: 'doc-1', title: 'Document A' })];
|
|
215
|
+
mockSupabase.from.mockReturnValue({
|
|
216
|
+
select: vi.fn().mockReturnThis(),
|
|
217
|
+
order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
|
|
218
|
+
});
|
|
219
|
+
vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
|
|
220
|
+
// Try to pull non-existent document
|
|
221
|
+
await pullDocuments(false, true, ['Nonexistent Document']);
|
|
222
|
+
// Should not create any files
|
|
223
|
+
expect(fs.existsSync(docsDir)).toBe(false);
|
|
224
|
+
});
|
|
225
|
+
it('should pull multiple documents by title and ID mix', async () => {
|
|
226
|
+
config.saveConfig(mockConfig());
|
|
227
|
+
vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
|
|
228
|
+
const mockSupabase = createMockSupabaseClient();
|
|
229
|
+
const mockDocs = [
|
|
230
|
+
mockDocumentRecord({ id: 'abc-123', title: 'Document A' }),
|
|
231
|
+
mockDocumentRecord({ id: 'xyz-789', title: 'Document B' }),
|
|
232
|
+
mockDocumentRecord({ id: 'def-456', title: 'Document C' }),
|
|
233
|
+
];
|
|
234
|
+
mockSupabase.from.mockReturnValue({
|
|
235
|
+
select: vi.fn().mockReturnThis(),
|
|
236
|
+
order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
|
|
237
|
+
});
|
|
238
|
+
const mockContent = mockBlockNoteContent();
|
|
239
|
+
const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
|
|
240
|
+
mockSupabase.storage.from.mockReturnValue({
|
|
241
|
+
download: vi.fn().mockResolvedValue({ data: blob, error: null })
|
|
242
|
+
});
|
|
243
|
+
vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
|
|
244
|
+
// Pull by mix of title and ID
|
|
245
|
+
await pullDocuments(false, true, ['Document A', 'xyz-789']);
|
|
246
|
+
const files = fs.readdirSync(docsDir);
|
|
247
|
+
expect(files.length).toBe(2);
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
describe('pullDocuments - input validation', () => {
|
|
251
|
+
it('should sanitize filenames with special characters', async () => {
|
|
252
|
+
config.saveConfig(mockConfig());
|
|
253
|
+
vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
|
|
254
|
+
const mockSupabase = createMockSupabaseClient();
|
|
255
|
+
const mockDocs = [mockDocumentRecord({
|
|
256
|
+
id: 'doc-1',
|
|
257
|
+
title: 'Document: "Special" <Chars> & More!'
|
|
258
|
+
})];
|
|
259
|
+
mockSupabase.from.mockReturnValue({
|
|
260
|
+
select: vi.fn().mockReturnThis(),
|
|
261
|
+
order: vi.fn().mockResolvedValue({ data: mockDocs, error: null })
|
|
167
262
|
});
|
|
168
263
|
const mockContent = mockBlockNoteContent();
|
|
169
264
|
const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
|
|
@@ -173,9 +268,9 @@ Content`);
|
|
|
173
268
|
vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
|
|
174
269
|
await pullDocuments(false, true);
|
|
175
270
|
const files = fs.readdirSync(docsDir);
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
expect(
|
|
271
|
+
expect(files.length).toBe(1);
|
|
272
|
+
// Filename should not contain invalid characters
|
|
273
|
+
expect(files[0]).not.toMatch(/[<>:"|?*]/);
|
|
179
274
|
});
|
|
180
275
|
});
|
|
181
276
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pull.test.js","sourceRoot":"","sources":["../../../src/__tests__/commands/pull.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pull.test.js","sourceRoot":"","sources":["../../../src/__tests__/commands/pull.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complete-user-journeys.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/complete-user-journeys.test.ts"],"names":[],"mappings":""}
|