@skillsmith/mcp-server 0.3.6 → 0.3.8

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.
@@ -1,354 +0,0 @@
1
- /**
2
- * @fileoverview Unit Tests for Conflict Detection and Resolution
3
- * @module @skillsmith/mcp-server/tools/install.conflict.test
4
- * @see SMI-1868, SMI-1879
5
- *
6
- * Tests cover:
7
- * - checkForConflicts: Detect local modifications before update
8
- * - handleMergeAction: Three-way merge with conflict resolution
9
- *
10
- * Related test files:
11
- * - install.conflict-helpers.test.ts: hashContent, detectModifications, backups
12
- * - merge.test.ts: computeDiff, threeWayMerge
13
- */
14
- import { describe, it, expect, vi, beforeEach } from 'vitest';
15
- import * as fs from 'fs/promises';
16
- // Import functions under test
17
- import { hashContent } from './install.conflict-helpers.js';
18
- import { checkForConflicts, handleMergeAction } from './install.conflict.js';
19
- // Mock fs module
20
- vi.mock('fs/promises');
21
- const mockedFs = vi.mocked(fs);
22
- // Import the mocked helpers for configuration in tests
23
- import * as helpersModule from './install.helpers.js';
24
- // Mock install.helpers for updateManifestSafely
25
- vi.mock('./install.helpers.js', async (importOriginal) => {
26
- const actual = await importOriginal();
27
- return {
28
- ...actual,
29
- detectModifications: vi.fn(),
30
- createSkillBackup: vi.fn().mockResolvedValue('/backup/path'),
31
- storeOriginal: vi.fn().mockResolvedValue(undefined),
32
- loadOriginal: vi.fn(),
33
- cleanupOldBackups: vi.fn().mockResolvedValue(undefined),
34
- updateManifestSafely: vi.fn().mockResolvedValue(undefined),
35
- };
36
- });
37
- const mockedHelpers = vi.mocked(helpersModule);
38
- // ============================================================================
39
- // Tests for checkForConflicts
40
- // ============================================================================
41
- describe('checkForConflicts', () => {
42
- beforeEach(() => {
43
- vi.clearAllMocks();
44
- });
45
- it('should proceed when skill has no originalContentHash', async () => {
46
- const manifest = {
47
- version: '1.0.0',
48
- installedSkills: {
49
- 'test-skill': {
50
- id: 'owner/test-skill',
51
- name: 'test-skill',
52
- version: '1.0.0',
53
- source: 'github:owner/test-skill',
54
- installPath: '/path/to/skill',
55
- installedAt: '2025-01-01',
56
- lastUpdated: '2025-01-01',
57
- // No originalContentHash
58
- },
59
- },
60
- };
61
- const result = await checkForConflicts('test-skill', '/path/to/skill', manifest, undefined, 'owner/test-skill');
62
- expect(result.shouldProceed).toBe(true);
63
- });
64
- it('should proceed when skill is not modified', async () => {
65
- const content = 'Original content';
66
- const originalHash = hashContent(content);
67
- const manifest = {
68
- version: '1.0.0',
69
- installedSkills: {
70
- 'test-skill': {
71
- id: 'owner/test-skill',
72
- name: 'test-skill',
73
- version: '1.0.0',
74
- source: 'github:owner/test-skill',
75
- installPath: '/path/to/skill',
76
- installedAt: '2025-01-01',
77
- lastUpdated: '2025-01-01',
78
- originalContentHash: originalHash,
79
- },
80
- },
81
- };
82
- // Configure mock to return no modification
83
- mockedHelpers.detectModifications.mockResolvedValue({
84
- modified: false,
85
- currentHash: originalHash,
86
- originalHash: originalHash,
87
- });
88
- const result = await checkForConflicts('test-skill', '/path/to/skill', manifest, undefined, 'owner/test-skill');
89
- expect(result.shouldProceed).toBe(true);
90
- });
91
- it('should return conflict info when modified and no action specified', async () => {
92
- const originalContent = 'Original content';
93
- const modifiedContent = 'Modified content';
94
- const originalHash = hashContent(originalContent);
95
- const modifiedHash = hashContent(modifiedContent);
96
- const manifest = {
97
- version: '1.0.0',
98
- installedSkills: {
99
- 'test-skill': {
100
- id: 'owner/test-skill',
101
- name: 'test-skill',
102
- version: '1.0.0',
103
- source: 'github:owner/test-skill',
104
- installPath: '/path/to/skill',
105
- installedAt: '2025-01-01',
106
- lastUpdated: '2025-01-01',
107
- originalContentHash: originalHash,
108
- },
109
- },
110
- };
111
- // Configure mock to return modified
112
- mockedHelpers.detectModifications.mockResolvedValue({
113
- modified: true,
114
- currentHash: modifiedHash,
115
- originalHash: originalHash,
116
- });
117
- const result = await checkForConflicts('test-skill', '/path/to/skill', manifest, undefined, 'owner/test-skill');
118
- expect(result.shouldProceed).toBe(false);
119
- expect(result.earlyReturn).toBeDefined();
120
- expect(result.earlyReturn.conflict).toBeDefined();
121
- expect(result.earlyReturn.conflict.hasLocalModifications).toBe(true);
122
- expect(result.earlyReturn.requiresAction).toContain('overwrite');
123
- expect(result.earlyReturn.requiresAction).toContain('merge');
124
- expect(result.earlyReturn.requiresAction).toContain('cancel');
125
- });
126
- it('should cancel when action is cancel', async () => {
127
- const originalContent = 'Original content';
128
- const modifiedContent = 'Modified content';
129
- const originalHash = hashContent(originalContent);
130
- const modifiedHash = hashContent(modifiedContent);
131
- const manifest = {
132
- version: '1.0.0',
133
- installedSkills: {
134
- 'test-skill': {
135
- id: 'owner/test-skill',
136
- name: 'test-skill',
137
- version: '1.0.0',
138
- source: 'github:owner/test-skill',
139
- installPath: '/path/to/skill',
140
- installedAt: '2025-01-01',
141
- lastUpdated: '2025-01-01',
142
- originalContentHash: originalHash,
143
- },
144
- },
145
- };
146
- // Configure mock to return modified
147
- mockedHelpers.detectModifications.mockResolvedValue({
148
- modified: true,
149
- currentHash: modifiedHash,
150
- originalHash: originalHash,
151
- });
152
- const result = await checkForConflicts('test-skill', '/path/to/skill', manifest, 'cancel', 'owner/test-skill');
153
- expect(result.shouldProceed).toBe(false);
154
- expect(result.earlyReturn).toBeDefined();
155
- expect(result.earlyReturn.error).toContain('cancelled');
156
- });
157
- it('should create backup when action is overwrite', async () => {
158
- const originalContent = 'Original content';
159
- const modifiedContent = 'Modified content';
160
- const originalHash = hashContent(originalContent);
161
- const modifiedHash = hashContent(modifiedContent);
162
- const manifest = {
163
- version: '1.0.0',
164
- installedSkills: {
165
- 'test-skill': {
166
- id: 'owner/test-skill',
167
- name: 'test-skill',
168
- version: '1.0.0',
169
- source: 'github:owner/test-skill',
170
- installPath: '/path/to/skill',
171
- installedAt: '2025-01-01',
172
- lastUpdated: '2025-01-01',
173
- originalContentHash: originalHash,
174
- },
175
- },
176
- };
177
- // Configure mocks
178
- mockedHelpers.detectModifications.mockResolvedValue({
179
- modified: true,
180
- currentHash: modifiedHash,
181
- originalHash: originalHash,
182
- });
183
- mockedHelpers.createSkillBackup.mockResolvedValue('/backup/path/test-skill');
184
- const result = await checkForConflicts('test-skill', '/path/to/skill', manifest, 'overwrite', 'owner/test-skill');
185
- expect(result.shouldProceed).toBe(true);
186
- expect(result.backupPath).toBeDefined();
187
- });
188
- it('should proceed for merge action', async () => {
189
- const originalContent = 'Original content';
190
- const modifiedContent = 'Modified content';
191
- const originalHash = hashContent(originalContent);
192
- const modifiedHash = hashContent(modifiedContent);
193
- const manifest = {
194
- version: '1.0.0',
195
- installedSkills: {
196
- 'test-skill': {
197
- id: 'owner/test-skill',
198
- name: 'test-skill',
199
- version: '1.0.0',
200
- source: 'github:owner/test-skill',
201
- installPath: '/path/to/skill',
202
- installedAt: '2025-01-01',
203
- lastUpdated: '2025-01-01',
204
- originalContentHash: originalHash,
205
- },
206
- },
207
- };
208
- // Configure mock to return modified
209
- mockedHelpers.detectModifications.mockResolvedValue({
210
- modified: true,
211
- currentHash: modifiedHash,
212
- originalHash: originalHash,
213
- });
214
- const result = await checkForConflicts('test-skill', '/path/to/skill', manifest, 'merge', 'owner/test-skill');
215
- expect(result.shouldProceed).toBe(true);
216
- });
217
- });
218
- // ============================================================================
219
- // Tests for handleMergeAction
220
- // ============================================================================
221
- describe('handleMergeAction', () => {
222
- beforeEach(() => {
223
- vi.clearAllMocks();
224
- });
225
- it('should fallback to overwrite when no original content found', async () => {
226
- const manifest = {
227
- version: '1.0.0',
228
- installedSkills: {
229
- 'test-skill': {
230
- id: 'owner/test-skill',
231
- name: 'test-skill',
232
- version: '1.0.0',
233
- source: 'github:owner/test-skill',
234
- installPath: '/path/to/skill',
235
- installedAt: '2025-01-01',
236
- lastUpdated: '2025-01-01',
237
- },
238
- },
239
- };
240
- // loadOriginal returns null
241
- mockedHelpers.loadOriginal.mockResolvedValue(null);
242
- mockedFs.readFile.mockResolvedValue('Current content'); // current content
243
- const result = await handleMergeAction('test-skill', '/path/to/skill', 'Upstream content', manifest, 'owner', 'repo', 'owner/test-skill');
244
- expect(result.shouldProceed).toBe(true);
245
- });
246
- it('should return merged content on clean merge', async () => {
247
- const originalContent = `Line 1
248
- Line 2
249
- Line 3`;
250
- const currentContent = `Line 1
251
- Local Line 2
252
- Line 3`;
253
- const upstreamContent = `Line 1
254
- Line 2
255
- Upstream Line 3`;
256
- const manifest = {
257
- version: '1.0.0',
258
- installedSkills: {
259
- 'test-skill': {
260
- id: 'owner/test-skill',
261
- name: 'test-skill',
262
- version: '1.0.0',
263
- source: 'github:owner/test-skill',
264
- installPath: '/path/to/skill',
265
- installedAt: '2025-01-01',
266
- lastUpdated: '2025-01-01',
267
- },
268
- },
269
- };
270
- // loadOriginal returns original content
271
- mockedHelpers.loadOriginal.mockResolvedValue(originalContent);
272
- // current content read from fs
273
- mockedFs.readFile.mockResolvedValue(currentContent);
274
- const result = await handleMergeAction('test-skill', '/path/to/skill', upstreamContent, manifest, 'owner', 'repo', 'owner/test-skill');
275
- expect(result.shouldProceed).toBe(true);
276
- expect(result.mergedContent).toBeDefined();
277
- expect(result.mergedContent).toContain('Local Line 2');
278
- expect(result.mergedContent).toContain('Upstream Line 3');
279
- });
280
- it('should handle deleted local file as a conflict', async () => {
281
- const originalContent = 'Original content';
282
- const upstreamContent = 'Upstream content';
283
- const manifest = {
284
- version: '1.0.0',
285
- installedSkills: {
286
- 'test-skill': {
287
- id: 'owner/test-skill',
288
- name: 'test-skill',
289
- version: '1.0.0',
290
- source: 'github:owner/test-skill',
291
- installPath: '/path/to/skill',
292
- installedAt: '2025-01-01',
293
- lastUpdated: '2025-01-01',
294
- },
295
- },
296
- };
297
- // loadOriginal returns original content
298
- mockedHelpers.loadOriginal.mockResolvedValue(originalContent);
299
- // current content - file deleted (throws ENOENT, treated as empty)
300
- const error = new Error('ENOENT');
301
- error.code = 'ENOENT';
302
- mockedFs.readFile.mockRejectedValue(error);
303
- // createSkillBackup mock
304
- mockedHelpers.createSkillBackup.mockResolvedValue('/backup/path/test-skill');
305
- // fs operations for writing conflict file
306
- mockedFs.mkdir.mockResolvedValue(undefined);
307
- mockedFs.writeFile.mockResolvedValue(undefined);
308
- const result = await handleMergeAction('test-skill', '/path/to/skill', upstreamContent, manifest, 'owner', 'repo', 'owner/test-skill');
309
- // When local is deleted (empty) and upstream differs from original,
310
- // this is a conflict since both sides modified the content differently
311
- expect(result.shouldProceed).toBe(false);
312
- expect(result.backupPath).toBeDefined();
313
- expect(result.earlyReturn).toBeDefined();
314
- expect(result.earlyReturn.mergeResult).toBeDefined();
315
- expect(result.earlyReturn.mergeResult.conflicts).toBeDefined();
316
- });
317
- it('should create backup and write conflict markers on merge conflict', async () => {
318
- const originalContent = 'Original content';
319
- const currentContent = 'Local version';
320
- const upstreamContent = 'Upstream version';
321
- const manifest = {
322
- version: '1.0.0',
323
- installedSkills: {
324
- 'test-skill': {
325
- id: 'owner/test-skill',
326
- name: 'test-skill',
327
- version: '1.0.0',
328
- source: 'github:owner/test-skill',
329
- installPath: '/path/to/skill',
330
- installedAt: '2025-01-01',
331
- lastUpdated: '2025-01-01',
332
- },
333
- },
334
- };
335
- // loadOriginal returns original content
336
- mockedHelpers.loadOriginal.mockResolvedValue(originalContent);
337
- // current content read from fs
338
- mockedFs.readFile.mockResolvedValue(currentContent);
339
- // createSkillBackup mock
340
- mockedHelpers.createSkillBackup.mockResolvedValue('/backup/path/test-skill');
341
- // fs operations for writing conflict file
342
- mockedFs.mkdir.mockResolvedValue(undefined);
343
- mockedFs.writeFile.mockResolvedValue(undefined);
344
- const result = await handleMergeAction('test-skill', '/path/to/skill', upstreamContent, manifest, 'owner', 'repo', 'owner/test-skill');
345
- expect(result.shouldProceed).toBe(false);
346
- expect(result.backupPath).toBeDefined();
347
- expect(result.earlyReturn).toBeDefined();
348
- expect(result.earlyReturn.mergeResult).toBeDefined();
349
- expect(result.earlyReturn.mergeResult.conflicts.length).toBeGreaterThan(0);
350
- expect(result.earlyReturn.tips).toBeDefined();
351
- expect(result.earlyReturn.tips).toContainEqual(expect.stringContaining('conflict'));
352
- });
353
- });
354
- //# sourceMappingURL=install.conflict.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install.conflict.test.js","sourceRoot":"","sources":["../../../src/tools/install.conflict.test.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- /**
2
- * @fileoverview Unit Tests for Three-Way Merge Algorithm
3
- * @module @skillsmith/mcp-server/tools/merge.test
4
- * @see SMI-1868, SMI-1879
5
- *
6
- * Tests cover:
7
- * - computeDiff: Line-by-line diff detection
8
- * - threeWayMerge: Three-way merge with conflict detection
9
- */
10
- export {};
11
- //# sourceMappingURL=merge.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"merge.test.d.ts","sourceRoot":"","sources":["../../../src/tools/merge.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -1,224 +0,0 @@
1
- /**
2
- * @fileoverview Unit Tests for Three-Way Merge Algorithm
3
- * @module @skillsmith/mcp-server/tools/merge.test
4
- * @see SMI-1868, SMI-1879
5
- *
6
- * Tests cover:
7
- * - computeDiff: Line-by-line diff detection
8
- * - threeWayMerge: Three-way merge with conflict detection
9
- */
10
- import { describe, it, expect } from 'vitest';
11
- // Import functions under test
12
- import { threeWayMerge, computeDiff } from './merge.js';
13
- // ============================================================================
14
- // Tests for computeDiff
15
- // ============================================================================
16
- describe('computeDiff', () => {
17
- it('should detect no changes for identical content', () => {
18
- const content = `Line 1
19
- Line 2
20
- Line 3`;
21
- const result = computeDiff(content, content);
22
- expect(result.additions).toHaveLength(0);
23
- expect(result.deletions).toHaveLength(0);
24
- expect(result.unchanged).toEqual([1, 2, 3]);
25
- });
26
- it('should detect added lines', () => {
27
- const base = `Line 1
28
- Line 2`;
29
- const target = `Line 1
30
- Line 2
31
- Line 3`;
32
- const result = computeDiff(base, target);
33
- expect(result.additions).toContain(3);
34
- expect(result.deletions).toHaveLength(0);
35
- expect(result.unchanged).toEqual([1, 2]);
36
- });
37
- it('should detect deleted lines', () => {
38
- const base = `Line 1
39
- Line 2
40
- Line 3`;
41
- const target = `Line 1
42
- Line 3`;
43
- const result = computeDiff(base, target);
44
- expect(result.deletions).toContain(2);
45
- expect(result.unchanged).toEqual([1, 3]);
46
- });
47
- it('should detect modified lines', () => {
48
- const base = `Line 1
49
- Line 2
50
- Line 3`;
51
- const target = `Line 1
52
- Modified Line 2
53
- Line 3`;
54
- const result = computeDiff(base, target);
55
- expect(result.deletions).toContain(2);
56
- expect(result.additions).toContain(2);
57
- });
58
- it('should handle empty base', () => {
59
- const base = '';
60
- const target = 'New line';
61
- const result = computeDiff(base, target);
62
- // Empty string splits to [''], so there's 1 line that gets "deleted"
63
- // and 1 line that gets "added"
64
- expect(result.additions).toContain(1);
65
- // An empty string still has one "line" (empty line) that counts as a deletion
66
- expect(result.deletions).toHaveLength(1);
67
- });
68
- it('should handle empty target', () => {
69
- const base = 'Old line';
70
- const target = '';
71
- const result = computeDiff(base, target);
72
- expect(result.deletions).toContain(1);
73
- // An empty string still has one "line" (empty line) that counts as an addition
74
- expect(result.additions).toHaveLength(1);
75
- });
76
- });
77
- // ============================================================================
78
- // Tests for threeWayMerge
79
- // ============================================================================
80
- describe('threeWayMerge', () => {
81
- describe('edge cases', () => {
82
- it('should handle all empty content', () => {
83
- const result = threeWayMerge('', '', '');
84
- expect(result.success).toBe(true);
85
- expect(result.merged).toBe('');
86
- });
87
- it('should use upstream when local is empty and base is empty', () => {
88
- const upstream = 'New content';
89
- const result = threeWayMerge('', '', upstream);
90
- expect(result.success).toBe(true);
91
- expect(result.merged).toBe(upstream);
92
- });
93
- it('should use local when upstream is empty and base is empty', () => {
94
- const local = 'Local content';
95
- const result = threeWayMerge('', local, '');
96
- expect(result.success).toBe(true);
97
- expect(result.merged).toBe(local);
98
- });
99
- it('should conflict when both have content but no base', () => {
100
- const local = 'Local content';
101
- const upstream = 'Upstream content';
102
- const result = threeWayMerge('', local, upstream);
103
- expect(result.success).toBe(false);
104
- expect(result.conflicts).toHaveLength(1);
105
- expect(result.merged).toContain('<<<<<<< LOCAL');
106
- expect(result.merged).toContain('>>>>>>> UPSTREAM');
107
- });
108
- });
109
- describe('unchanged scenarios', () => {
110
- it('should use upstream when local is unchanged', () => {
111
- const base = 'Original content';
112
- const local = 'Original content';
113
- const upstream = 'Updated content';
114
- const result = threeWayMerge(base, local, upstream);
115
- expect(result.success).toBe(true);
116
- expect(result.merged).toBe(upstream);
117
- });
118
- it('should use local when upstream is unchanged', () => {
119
- const base = 'Original content';
120
- const local = 'Modified content';
121
- const upstream = 'Original content';
122
- const result = threeWayMerge(base, local, upstream);
123
- expect(result.success).toBe(true);
124
- expect(result.merged).toBe(local);
125
- });
126
- it('should use either when both have same changes', () => {
127
- const base = 'Original content';
128
- const local = 'Same modified content';
129
- const upstream = 'Same modified content';
130
- const result = threeWayMerge(base, local, upstream);
131
- expect(result.success).toBe(true);
132
- expect(result.merged).toBe(local);
133
- });
134
- });
135
- describe('clean merges', () => {
136
- it('should merge non-overlapping changes', () => {
137
- const base = `Line 1
138
- Line 2
139
- Line 3`;
140
- const local = `Line 1
141
- Modified Line 2
142
- Line 3`;
143
- const upstream = `Line 1
144
- Line 2
145
- Modified Line 3`;
146
- const result = threeWayMerge(base, local, upstream);
147
- expect(result.success).toBe(true);
148
- expect(result.merged).toContain('Modified Line 2');
149
- expect(result.merged).toContain('Modified Line 3');
150
- });
151
- it('should handle local additions at end', () => {
152
- const base = `Line 1
153
- Line 2`;
154
- const local = `Line 1
155
- Line 2
156
- New local line`;
157
- const upstream = `Modified Line 1
158
- Line 2`;
159
- const result = threeWayMerge(base, local, upstream);
160
- expect(result.success).toBe(true);
161
- expect(result.merged).toContain('Modified Line 1');
162
- expect(result.merged).toContain('New local line');
163
- });
164
- it('should handle upstream additions at end', () => {
165
- const base = `Line 1
166
- Line 2`;
167
- const local = `Modified Line 1
168
- Line 2`;
169
- const upstream = `Line 1
170
- Line 2
171
- New upstream line`;
172
- const result = threeWayMerge(base, local, upstream);
173
- expect(result.success).toBe(true);
174
- expect(result.merged).toContain('Modified Line 1');
175
- expect(result.merged).toContain('New upstream line');
176
- });
177
- });
178
- describe('conflicts', () => {
179
- it('should detect conflict when both modify same line', () => {
180
- const base = `Line 1
181
- Line 2
182
- Line 3`;
183
- const local = `Line 1
184
- Local change
185
- Line 3`;
186
- const upstream = `Line 1
187
- Upstream change
188
- Line 3`;
189
- const result = threeWayMerge(base, local, upstream);
190
- expect(result.success).toBe(false);
191
- expect(result.conflicts).toBeDefined();
192
- expect(result.conflicts.length).toBeGreaterThan(0);
193
- expect(result.merged).toContain('<<<<<<< LOCAL');
194
- expect(result.merged).toContain('=======');
195
- expect(result.merged).toContain('>>>>>>> UPSTREAM');
196
- });
197
- it('should include conflict markers in merged output', () => {
198
- const base = 'Original';
199
- const local = 'Local version';
200
- const upstream = 'Upstream version';
201
- const result = threeWayMerge(base, local, upstream);
202
- expect(result.success).toBe(false);
203
- expect(result.merged).toContain('<<<<<<< LOCAL');
204
- expect(result.merged).toContain('Local version');
205
- expect(result.merged).toContain('=======');
206
- expect(result.merged).toContain('Upstream version');
207
- expect(result.merged).toContain('>>>>>>> UPSTREAM');
208
- });
209
- it('should provide conflict details', () => {
210
- const base = 'Original';
211
- const local = 'Local version';
212
- const upstream = 'Upstream version';
213
- const result = threeWayMerge(base, local, upstream);
214
- expect(result.conflicts).toBeDefined();
215
- expect(result.conflicts[0]).toMatchObject({
216
- lineNumber: expect.any(Number),
217
- local: expect.stringContaining('Local'),
218
- upstream: expect.stringContaining('Upstream'),
219
- base: expect.any(String),
220
- });
221
- });
222
- });
223
- });
224
- //# sourceMappingURL=merge.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"merge.test.js","sourceRoot":"","sources":["../../../src/tools/merge.test.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- /**
2
- * SMI-1869: Conflict Resolution Flow Integration Tests
3
- * Tests for conflict detection and resolution during skill reinstallation
4
- *
5
- * Split from install.integration.test.ts per governance standards (SMI-1880)
6
- */
7
- export {};
8
- //# sourceMappingURL=install-conflict.integration.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-conflict.integration.test.d.ts","sourceRoot":"","sources":["../../../tests/integration/install-conflict.integration.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}