@skillsmith/core 2.0.2 → 2.1.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 (71) hide show
  1. package/README.md +1 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/db/schema.d.ts +1 -1
  4. package/dist/src/db/schema.d.ts.map +1 -1
  5. package/dist/src/db/schema.js +41 -1
  6. package/dist/src/db/schema.js.map +1 -1
  7. package/dist/src/index.d.ts +1 -0
  8. package/dist/src/index.d.ts.map +1 -1
  9. package/dist/src/index.js +2 -0
  10. package/dist/src/index.js.map +1 -1
  11. package/dist/src/repositories/SyncConfigRepository.d.ts +91 -0
  12. package/dist/src/repositories/SyncConfigRepository.d.ts.map +1 -0
  13. package/dist/src/repositories/SyncConfigRepository.js +202 -0
  14. package/dist/src/repositories/SyncConfigRepository.js.map +1 -0
  15. package/dist/src/repositories/SyncHistoryRepository.d.ts +104 -0
  16. package/dist/src/repositories/SyncHistoryRepository.d.ts.map +1 -0
  17. package/dist/src/repositories/SyncHistoryRepository.js +235 -0
  18. package/dist/src/repositories/SyncHistoryRepository.js.map +1 -0
  19. package/dist/src/scripts/github-import/github-client.d.ts +24 -0
  20. package/dist/src/scripts/github-import/github-client.d.ts.map +1 -1
  21. package/dist/src/scripts/github-import/github-client.js +103 -0
  22. package/dist/src/scripts/github-import/github-client.js.map +1 -1
  23. package/dist/src/scripts/github-import/index.js +3 -10
  24. package/dist/src/scripts/github-import/index.js.map +1 -1
  25. package/dist/src/scripts/merge-skills.d.ts +56 -0
  26. package/dist/src/scripts/merge-skills.d.ts.map +1 -0
  27. package/dist/src/scripts/merge-skills.js +411 -0
  28. package/dist/src/scripts/merge-skills.js.map +1 -0
  29. package/dist/src/scripts/skill-scanner/index.d.ts +9 -2
  30. package/dist/src/scripts/skill-scanner/index.d.ts.map +1 -1
  31. package/dist/src/scripts/skill-scanner/index.js +98 -7
  32. package/dist/src/scripts/skill-scanner/index.js.map +1 -1
  33. package/dist/src/scripts/skill-scanner/logger.d.ts +51 -0
  34. package/dist/src/scripts/skill-scanner/logger.d.ts.map +1 -1
  35. package/dist/src/scripts/skill-scanner/logger.js +255 -1
  36. package/dist/src/scripts/skill-scanner/logger.js.map +1 -1
  37. package/dist/src/scripts/skill-scanner/reporter.d.ts +1 -1
  38. package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -1
  39. package/dist/src/scripts/skill-scanner/reporter.js +67 -15
  40. package/dist/src/scripts/skill-scanner/reporter.js.map +1 -1
  41. package/dist/src/scripts/skill-scanner/scanner.d.ts +5 -2
  42. package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -1
  43. package/dist/src/scripts/skill-scanner/scanner.js +156 -39
  44. package/dist/src/scripts/skill-scanner/scanner.js.map +1 -1
  45. package/dist/src/scripts/skill-scanner/types.d.ts +44 -0
  46. package/dist/src/scripts/skill-scanner/types.d.ts.map +1 -1
  47. package/dist/src/sync/BackgroundSyncService.d.ts +90 -0
  48. package/dist/src/sync/BackgroundSyncService.d.ts.map +1 -0
  49. package/dist/src/sync/BackgroundSyncService.js +214 -0
  50. package/dist/src/sync/BackgroundSyncService.js.map +1 -0
  51. package/dist/src/sync/SyncEngine.d.ts +76 -0
  52. package/dist/src/sync/SyncEngine.d.ts.map +1 -0
  53. package/dist/src/sync/SyncEngine.js +272 -0
  54. package/dist/src/sync/SyncEngine.js.map +1 -0
  55. package/dist/src/sync/index.d.ts +11 -0
  56. package/dist/src/sync/index.d.ts.map +1 -0
  57. package/dist/src/sync/index.js +14 -0
  58. package/dist/src/sync/index.js.map +1 -0
  59. package/dist/tests/sync/SyncConfigRepository.test.d.ts +7 -0
  60. package/dist/tests/sync/SyncConfigRepository.test.d.ts.map +1 -0
  61. package/dist/tests/sync/SyncConfigRepository.test.js +154 -0
  62. package/dist/tests/sync/SyncConfigRepository.test.js.map +1 -0
  63. package/dist/tests/sync/SyncEngine.test.d.ts +7 -0
  64. package/dist/tests/sync/SyncEngine.test.d.ts.map +1 -0
  65. package/dist/tests/sync/SyncEngine.test.js +298 -0
  66. package/dist/tests/sync/SyncEngine.test.js.map +1 -0
  67. package/dist/tests/sync/SyncHistoryRepository.test.d.ts +7 -0
  68. package/dist/tests/sync/SyncHistoryRepository.test.d.ts.map +1 -0
  69. package/dist/tests/sync/SyncHistoryRepository.test.js +220 -0
  70. package/dist/tests/sync/SyncHistoryRepository.test.js.map +1 -0
  71. package/package.json +1 -1
@@ -0,0 +1,154 @@
1
+ /**
2
+ * SyncConfigRepository Tests
3
+ *
4
+ * Tests for sync configuration management.
5
+ */
6
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
7
+ import { createDatabase, closeDatabase } from '../../src/db/schema.js';
8
+ import { SyncConfigRepository, FREQUENCY_INTERVALS, } from '../../src/repositories/SyncConfigRepository.js';
9
+ describe('SyncConfigRepository', () => {
10
+ let db;
11
+ let repo;
12
+ beforeEach(() => {
13
+ db = createDatabase(':memory:');
14
+ repo = new SyncConfigRepository(db);
15
+ });
16
+ afterEach(() => {
17
+ closeDatabase(db);
18
+ });
19
+ describe('getConfig', () => {
20
+ it('should return default config on fresh database', () => {
21
+ const config = repo.getConfig();
22
+ expect(config.id).toBe('default');
23
+ expect(config.enabled).toBe(true);
24
+ expect(config.frequency).toBe('daily');
25
+ expect(config.intervalMs).toBe(FREQUENCY_INTERVALS.daily);
26
+ expect(config.lastSyncAt).toBeNull();
27
+ expect(config.nextSyncAt).toBeNull();
28
+ expect(config.lastSyncCount).toBe(0);
29
+ expect(config.lastSyncError).toBeNull();
30
+ });
31
+ it('should return updated config after changes', () => {
32
+ repo.disable();
33
+ const config = repo.getConfig();
34
+ expect(config.enabled).toBe(false);
35
+ });
36
+ });
37
+ describe('updateConfig', () => {
38
+ it('should update enabled status', () => {
39
+ repo.updateConfig({ enabled: false });
40
+ expect(repo.getConfig().enabled).toBe(false);
41
+ repo.updateConfig({ enabled: true });
42
+ expect(repo.getConfig().enabled).toBe(true);
43
+ });
44
+ it('should update frequency and recalculate interval', () => {
45
+ repo.updateConfig({ frequency: 'weekly' });
46
+ const config = repo.getConfig();
47
+ expect(config.frequency).toBe('weekly');
48
+ expect(config.intervalMs).toBe(FREQUENCY_INTERVALS.weekly);
49
+ });
50
+ it('should recalculate nextSyncAt when frequency changes and lastSyncAt exists', () => {
51
+ const lastSync = new Date().toISOString();
52
+ repo.setLastSync(lastSync, 10);
53
+ repo.updateConfig({ frequency: 'weekly' });
54
+ const config = repo.getConfig();
55
+ expect(config.nextSyncAt).not.toBeNull();
56
+ const expectedNext = new Date(new Date(lastSync).getTime() + FREQUENCY_INTERVALS.weekly);
57
+ expect(new Date(config.nextSyncAt).getTime()).toBe(expectedNext.getTime());
58
+ });
59
+ });
60
+ describe('enable/disable', () => {
61
+ it('should enable auto-sync', () => {
62
+ repo.disable();
63
+ expect(repo.getConfig().enabled).toBe(false);
64
+ repo.enable();
65
+ expect(repo.getConfig().enabled).toBe(true);
66
+ });
67
+ it('should disable auto-sync', () => {
68
+ expect(repo.getConfig().enabled).toBe(true);
69
+ repo.disable();
70
+ expect(repo.getConfig().enabled).toBe(false);
71
+ });
72
+ });
73
+ describe('setFrequency', () => {
74
+ it('should set frequency to daily', () => {
75
+ repo.setFrequency('weekly');
76
+ repo.setFrequency('daily');
77
+ const config = repo.getConfig();
78
+ expect(config.frequency).toBe('daily');
79
+ expect(config.intervalMs).toBe(FREQUENCY_INTERVALS.daily);
80
+ });
81
+ it('should set frequency to weekly', () => {
82
+ repo.setFrequency('weekly');
83
+ const config = repo.getConfig();
84
+ expect(config.frequency).toBe('weekly');
85
+ expect(config.intervalMs).toBe(FREQUENCY_INTERVALS.weekly);
86
+ });
87
+ });
88
+ describe('setLastSync', () => {
89
+ it('should update lastSyncAt and lastSyncCount', () => {
90
+ const timestamp = new Date().toISOString();
91
+ repo.setLastSync(timestamp, 42);
92
+ const config = repo.getConfig();
93
+ expect(config.lastSyncAt).toBe(timestamp);
94
+ expect(config.lastSyncCount).toBe(42);
95
+ expect(config.lastSyncError).toBeNull();
96
+ });
97
+ it('should calculate nextSyncAt based on interval', () => {
98
+ const timestamp = new Date().toISOString();
99
+ repo.setLastSync(timestamp, 10);
100
+ const config = repo.getConfig();
101
+ expect(config.nextSyncAt).not.toBeNull();
102
+ const expectedNext = new Date(new Date(timestamp).getTime() + FREQUENCY_INTERVALS.daily);
103
+ expect(new Date(config.nextSyncAt).getTime()).toBe(expectedNext.getTime());
104
+ });
105
+ it('should clear lastSyncError on successful sync', () => {
106
+ repo.setLastSyncError('Previous error');
107
+ expect(repo.getConfig().lastSyncError).toBe('Previous error');
108
+ repo.setLastSync(new Date().toISOString(), 5);
109
+ expect(repo.getConfig().lastSyncError).toBeNull();
110
+ });
111
+ });
112
+ describe('setLastSyncError', () => {
113
+ it('should store error message', () => {
114
+ repo.setLastSyncError('Connection failed');
115
+ expect(repo.getConfig().lastSyncError).toBe('Connection failed');
116
+ });
117
+ });
118
+ describe('clearError', () => {
119
+ it('should clear stored error', () => {
120
+ repo.setLastSyncError('Some error');
121
+ expect(repo.getConfig().lastSyncError).toBe('Some error');
122
+ repo.clearError();
123
+ expect(repo.getConfig().lastSyncError).toBeNull();
124
+ });
125
+ });
126
+ describe('isSyncDue', () => {
127
+ it('should return true if never synced', () => {
128
+ expect(repo.isSyncDue()).toBe(true);
129
+ });
130
+ it('should return true if nextSyncAt has passed', () => {
131
+ // Set last sync to 2 days ago
132
+ const twoDaysAgo = new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString();
133
+ repo.setLastSync(twoDaysAgo, 10);
134
+ // With daily frequency, sync should be due
135
+ expect(repo.isSyncDue()).toBe(true);
136
+ });
137
+ it('should return false if nextSyncAt is in the future', () => {
138
+ // Set last sync to now
139
+ const now = new Date().toISOString();
140
+ repo.setLastSync(now, 10);
141
+ // With daily frequency, next sync is 24 hours away
142
+ expect(repo.isSyncDue()).toBe(false);
143
+ });
144
+ });
145
+ describe('calculateNextSync', () => {
146
+ it('should add interval to last sync time', () => {
147
+ const lastSync = '2026-01-15T12:00:00.000Z';
148
+ const nextSync = repo.calculateNextSync(lastSync, FREQUENCY_INTERVALS.daily);
149
+ const expected = new Date(new Date(lastSync).getTime() + FREQUENCY_INTERVALS.daily);
150
+ expect(nextSync).toBe(expected.toISOString());
151
+ });
152
+ });
153
+ });
154
+ //# sourceMappingURL=SyncConfigRepository.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SyncConfigRepository.test.js","sourceRoot":"","sources":["../../../tests/sync/SyncConfigRepository.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * SyncEngine Tests
3
+ *
4
+ * Tests for the core sync engine with mocked dependencies.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=SyncEngine.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SyncEngine.test.d.ts","sourceRoot":"","sources":["../../../tests/sync/SyncEngine.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,298 @@
1
+ /**
2
+ * SyncEngine Tests
3
+ *
4
+ * Tests for the core sync engine with mocked dependencies.
5
+ */
6
+ import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
7
+ import { createDatabase, closeDatabase } from '../../src/db/schema.js';
8
+ import { SyncConfigRepository } from '../../src/repositories/SyncConfigRepository.js';
9
+ import { SyncHistoryRepository } from '../../src/repositories/SyncHistoryRepository.js';
10
+ import { SkillRepository } from '../../src/repositories/SkillRepository.js';
11
+ import { SyncEngine } from '../../src/sync/SyncEngine.js';
12
+ /**
13
+ * Create a mock skill for testing
14
+ * Note: quality_score must be between 0 and 1 (database constraint)
15
+ */
16
+ function createMockSkill(id, updatedAt = new Date().toISOString()) {
17
+ return {
18
+ id,
19
+ name: `Skill ${id}`,
20
+ description: `Description for ${id}`,
21
+ author: 'test-author',
22
+ repo_url: `https://github.com/test/${id}`,
23
+ quality_score: 0.85, // Must be 0-1 range (database constraint)
24
+ trust_tier: 'community',
25
+ tags: ['test'],
26
+ stars: 50,
27
+ installable: true,
28
+ created_at: updatedAt,
29
+ updated_at: updatedAt,
30
+ };
31
+ }
32
+ /**
33
+ * Create a mock API client with customizable behavior
34
+ */
35
+ function createMockApiClient(config = {}) {
36
+ const { offline = false, healthStatus = 'healthy', skills = [], throwOnSearch } = config;
37
+ const searchMock = vi.fn().mockImplementation(async ({ limit = 100, offset = 0 }) => {
38
+ if (throwOnSearch) {
39
+ throw throwOnSearch;
40
+ }
41
+ const pageSkills = skills.slice(offset, offset + limit);
42
+ return {
43
+ data: pageSkills,
44
+ total: skills.length,
45
+ limit,
46
+ offset,
47
+ };
48
+ });
49
+ return {
50
+ isOffline: vi.fn().mockReturnValue(offline),
51
+ checkHealth: vi.fn().mockResolvedValue({ status: healthStatus }),
52
+ search: searchMock,
53
+ getSkill: vi.fn(),
54
+ getHealthStatus: vi.fn(),
55
+ };
56
+ }
57
+ describe('SyncEngine', () => {
58
+ let db;
59
+ let syncConfigRepo;
60
+ let syncHistoryRepo;
61
+ let skillRepo;
62
+ beforeEach(() => {
63
+ db = createDatabase(':memory:');
64
+ syncConfigRepo = new SyncConfigRepository(db);
65
+ syncHistoryRepo = new SyncHistoryRepository(db);
66
+ skillRepo = new SkillRepository(db);
67
+ });
68
+ afterEach(() => {
69
+ closeDatabase(db);
70
+ });
71
+ describe('constructor', () => {
72
+ it('should create sync engine with all dependencies', () => {
73
+ const apiClient = createMockApiClient();
74
+ const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
75
+ expect(engine).toBeDefined();
76
+ });
77
+ });
78
+ describe('sync - offline and health checks', () => {
79
+ it('should fail when API client is offline', async () => {
80
+ const apiClient = createMockApiClient({ offline: true });
81
+ const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
82
+ const result = await engine.sync();
83
+ expect(result.success).toBe(false);
84
+ expect(result.errors).toContain('API client is in offline mode. Cannot sync.');
85
+ });
86
+ it('should fail when API health check fails', async () => {
87
+ const apiClient = createMockApiClient({ healthStatus: 'unhealthy' });
88
+ const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
89
+ const result = await engine.sync();
90
+ expect(result.success).toBe(false);
91
+ expect(result.errors).toContain('API is unhealthy. Try again later.');
92
+ });
93
+ });
94
+ describe('sync - basic functionality', () => {
95
+ it('should successfully sync skills from API', async () => {
96
+ const skills = [
97
+ createMockSkill('test/skill-1'),
98
+ createMockSkill('test/skill-2'),
99
+ createMockSkill('test/skill-3'),
100
+ ];
101
+ const apiClient = createMockApiClient({ skills });
102
+ const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
103
+ const result = await engine.sync();
104
+ expect(result.success).toBe(true);
105
+ expect(result.skillsAdded).toBe(3);
106
+ expect(result.skillsUpdated).toBe(0);
107
+ expect(result.skillsUnchanged).toBe(0);
108
+ expect(result.totalProcessed).toBe(3);
109
+ expect(result.errors).toHaveLength(0);
110
+ });
111
+ it('should detect updates to existing skills', async () => {
112
+ // Pre-populate database with a skill
113
+ skillRepo.create({
114
+ id: 'test/skill-1',
115
+ name: 'Old Name',
116
+ trustTier: 'community',
117
+ tags: ['old'],
118
+ });
119
+ // API returns updated version with new updated_at
120
+ const skills = [createMockSkill('test/skill-1', new Date(Date.now() + 1000).toISOString())];
121
+ const apiClient = createMockApiClient({ skills });
122
+ const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
123
+ const result = await engine.sync();
124
+ expect(result.success).toBe(true);
125
+ expect(result.skillsAdded).toBe(0);
126
+ expect(result.skillsUpdated).toBe(1);
127
+ });
128
+ it('should skip unchanged skills when timestamps match', async () => {
129
+ const timestamp = new Date().toISOString();
130
+ // Pre-populate database with a skill
131
+ skillRepo.create({
132
+ id: 'test/skill-1',
133
+ name: 'Skill test/skill-1',
134
+ trustTier: 'community',
135
+ tags: ['test'],
136
+ });
137
+ // Manually set the same timestamp as what API will return
138
+ db.prepare('UPDATE skills SET updated_at = ? WHERE id = ?').run(timestamp, 'test/skill-1');
139
+ // API returns skill with same timestamp
140
+ const skills = [createMockSkill('test/skill-1', timestamp)];
141
+ const apiClient = createMockApiClient({ skills });
142
+ const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
143
+ const result = await engine.sync();
144
+ expect(result.success).toBe(true);
145
+ expect(result.skillsUnchanged).toBe(1);
146
+ expect(result.skillsUpdated).toBe(0);
147
+ expect(result.skillsAdded).toBe(0);
148
+ });
149
+ });
150
+ describe('sync - differential sync', () => {
151
+ it('should perform differential sync when lastSyncAt exists', async () => {
152
+ // Set last sync to 1 hour ago
153
+ const oneHourAgo = new Date(Date.now() - 60 * 60 * 1000);
154
+ syncConfigRepo.setLastSync(oneHourAgo.toISOString(), 0);
155
+ // Create skills: one old (before lastSync), one new (after lastSync)
156
+ const oldSkill = createMockSkill('test/old-skill', new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString());
157
+ const newSkill = createMockSkill('test/new-skill', new Date().toISOString());
158
+ const apiClient = createMockApiClient({ skills: [oldSkill, newSkill] });
159
+ const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
160
+ const result = await engine.sync();
161
+ expect(result.success).toBe(true);
162
+ // Only the new skill should be added (old one filtered out by differential)
163
+ expect(result.skillsAdded).toBe(1);
164
+ expect(result.totalProcessed).toBe(2); // Both fetched
165
+ });
166
+ it('should perform full sync with force option', async () => {
167
+ // Set last sync recently
168
+ const now = new Date().toISOString();
169
+ syncConfigRepo.setLastSync(now, 0);
170
+ // Create skills with old timestamps that would normally be filtered
171
+ const skills = [
172
+ createMockSkill('test/skill-1', new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString()),
173
+ createMockSkill('test/skill-2', new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString()),
174
+ ];
175
+ const apiClient = createMockApiClient({ skills });
176
+ const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
177
+ const result = await engine.sync({ force: true });
178
+ expect(result.success).toBe(true);
179
+ expect(result.skillsAdded).toBe(2); // All skills processed because force=true
180
+ });
181
+ });
182
+ describe('sync - dry run', () => {
183
+ it('should not modify database in dry run mode', async () => {
184
+ const skills = [createMockSkill('test/skill-1')];
185
+ const apiClient = createMockApiClient({ skills });
186
+ const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
187
+ const result = await engine.sync({ dryRun: true });
188
+ expect(result.success).toBe(true);
189
+ expect(result.dryRun).toBe(true);
190
+ expect(result.skillsAdded).toBe(1);
191
+ // Verify skill was NOT actually added
192
+ const skill = skillRepo.findById('test/skill-1');
193
+ expect(skill).toBeNull();
194
+ // Verify no history entry was created
195
+ const history = syncHistoryRepo.getHistory();
196
+ expect(history).toHaveLength(0);
197
+ });
198
+ });
199
+ describe('sync - progress callback', () => {
200
+ it('should call onProgress callback with phases', async () => {
201
+ const skills = [createMockSkill('test/skill-1')];
202
+ const apiClient = createMockApiClient({ skills });
203
+ const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
204
+ const progressCalls = [];
205
+ const onProgress = vi.fn((progress) => {
206
+ progressCalls.push(progress.phase);
207
+ });
208
+ await engine.sync({ onProgress });
209
+ expect(onProgress).toHaveBeenCalled();
210
+ expect(progressCalls).toContain('connecting');
211
+ expect(progressCalls).toContain('fetching');
212
+ expect(progressCalls).toContain('comparing');
213
+ // upserting and complete should be called for successful sync with skills
214
+ expect(progressCalls.some((p) => p === 'upserting' || p === 'complete')).toBe(true);
215
+ });
216
+ });
217
+ describe('sync - pagination', () => {
218
+ it('should handle pagination correctly', async () => {
219
+ // Create 150 skills (more than one page of 100)
220
+ const skills = Array.from({ length: 150 }, (_, i) => createMockSkill(`test/skill-${i}`));
221
+ const apiClient = createMockApiClient({ skills });
222
+ const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
223
+ const result = await engine.sync({ pageSize: 100 });
224
+ expect(result.success).toBe(true);
225
+ expect(result.skillsAdded).toBe(150);
226
+ expect(result.totalProcessed).toBe(150);
227
+ // Should have made 2 API calls (100 + 50)
228
+ expect(apiClient.search).toHaveBeenCalledTimes(2);
229
+ });
230
+ });
231
+ describe('sync - history tracking', () => {
232
+ it('should record sync history on success', async () => {
233
+ const skills = [createMockSkill('test/skill-1')];
234
+ const apiClient = createMockApiClient({ skills });
235
+ const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
236
+ await engine.sync();
237
+ const history = syncHistoryRepo.getHistory();
238
+ expect(history).toHaveLength(1);
239
+ expect(history[0].status).toBe('success');
240
+ expect(history[0].skillsAdded).toBe(1);
241
+ });
242
+ it('should record sync history on failure', async () => {
243
+ const apiClient = createMockApiClient({
244
+ throwOnSearch: new Error('Network failure'),
245
+ });
246
+ const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
247
+ await engine.sync();
248
+ const history = syncHistoryRepo.getHistory();
249
+ expect(history).toHaveLength(1);
250
+ expect(history[0].status).toBe('failed');
251
+ expect(history[0].errorMessage).toContain('Network failure');
252
+ });
253
+ it('should update sync config on success', async () => {
254
+ const skills = [createMockSkill('test/skill-1')];
255
+ const apiClient = createMockApiClient({ skills });
256
+ const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
257
+ await engine.sync();
258
+ const config = syncConfigRepo.getConfig();
259
+ expect(config.lastSyncAt).not.toBeNull();
260
+ expect(config.lastSyncCount).toBe(1);
261
+ expect(config.lastSyncError).toBeNull();
262
+ });
263
+ it('should set error in config on failure', async () => {
264
+ const apiClient = createMockApiClient({ offline: true });
265
+ const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
266
+ await engine.sync();
267
+ const config = syncConfigRepo.getConfig();
268
+ expect(config.lastSyncError).toBe('API client is in offline mode. Cannot sync.');
269
+ });
270
+ });
271
+ describe('getStatus', () => {
272
+ it('should return sync status summary', () => {
273
+ const apiClient = createMockApiClient();
274
+ const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
275
+ const status = engine.getStatus();
276
+ expect(status).toHaveProperty('config');
277
+ expect(status).toHaveProperty('lastRun');
278
+ expect(status).toHaveProperty('isRunning');
279
+ expect(status).toHaveProperty('isDue');
280
+ });
281
+ it('should show sync is due when never synced', () => {
282
+ const apiClient = createMockApiClient();
283
+ const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
284
+ const status = engine.getStatus();
285
+ expect(status.isDue).toBe(true);
286
+ expect(status.lastRun).toBeNull();
287
+ });
288
+ it('should reflect running state', async () => {
289
+ const apiClient = createMockApiClient();
290
+ const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
291
+ // Start a run manually
292
+ syncHistoryRepo.startRun();
293
+ const status = engine.getStatus();
294
+ expect(status.isRunning).toBe(true);
295
+ });
296
+ });
297
+ });
298
+ //# sourceMappingURL=SyncEngine.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SyncEngine.test.js","sourceRoot":"","sources":["../../../tests/sync/SyncEngine.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * SyncHistoryRepository Tests
3
+ *
4
+ * Tests for sync history tracking.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=SyncHistoryRepository.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SyncHistoryRepository.test.d.ts","sourceRoot":"","sources":["../../../tests/sync/SyncHistoryRepository.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}