@skillsmith/mcp-server 0.3.7 → 0.3.9

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skillsmith/mcp-server",
3
- "version": "0.3.7",
3
+ "version": "0.3.9",
4
4
  "description": "MCP server for Skillsmith skill discovery",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -20,7 +20,7 @@
20
20
  },
21
21
  "dependencies": {
22
22
  "@modelcontextprotocol/sdk": "1.25.3",
23
- "@skillsmith/core": "0.4.1",
23
+ "@skillsmith/core": "0.4.4",
24
24
  "esbuild": "0.27.2"
25
25
  },
26
26
  "devDependencies": {
@@ -5,43 +5,7 @@ description: "Discover, install, compare, and manage Claude Code skills. Use whe
5
5
 
6
6
  # Skillsmith
7
7
 
8
- Skillsmith is loaded. I can help you with:
9
-
10
- ## Top Features
11
-
12
- **Parallel Agent Spawning**
13
- - Generate companion subagents for any skill with `author subagent`
14
- - Transform existing skills into agent-ready workflows with `author transform`
15
- - Batch process multiple skills for team-wide agent deployment
16
-
17
- **Skill Optimization**
18
- - A/B test original vs optimized skills (Team+ tier)
19
- - Benchmark skill performance with controlled experiments
20
- - Generate detailed optimization analysis reports
21
-
22
- ## Discovery
23
- - Search 14,000+ skills by keyword, category, or trust tier
24
- - Get stack-aware recommendations based on your project context
25
- - Compare multiple skills side-by-side with quality scores
26
-
27
- ## Management
28
- - Install skills to `~/.claude/skills/` with security scanning
29
- - Uninstall skills you no longer need
30
- - Validate skill structure before publishing
31
-
32
- ## Security
33
- - All skills are scanned before installation
34
- - Trust tiers indicate verification level (Official → Verified → Community → Unverified)
35
- - Typosquatting and blocklist protection
36
-
37
- What would you like to do? Some examples:
38
- - "Search for testing skills"
39
- - "Find verified skills for git"
40
- - "Recommend skills for my React project"
41
- - "Install the commit skill"
42
- - "Compare jest-helper and vitest-helper"
43
- - "Generate subagent for my skill"
44
- - "Transform my skills to support agents"
8
+ Skillsmith is your skill discovery and management system for Claude Code. It provides access to 500+ community skills with trust verification, quality scoring, and security scanning.
45
9
 
46
10
  ## Quick Reference: MCP Tools
47
11
 
@@ -54,34 +18,7 @@ What would you like to do? Some examples:
54
18
  | `skill_recommend` | Getting contextual recommendations | "Recommend skills for my React project" |
55
19
  | `skill_validate` | Checking skill structure before manual install | "Validate this skill" |
56
20
  | `skill_compare` | Comparing 2-5 skills side-by-side | "Compare jest-helper and vitest-helper" |
57
-
58
- ## CLI Commands for Agents & Optimization
59
-
60
- | Command | Description |
61
- |---------|-------------|
62
- | `author subagent [path]` | Generate companion subagent for a skill |
63
- | `author transform [path]` | Upgrade existing skill with subagent configuration |
64
- | `author transform --batch` | Batch process multiple skills |
65
- | `ab-test --skill <name>` | Run A/B testing experiments (Team+ tier) |
66
-
67
- ### Subagent Generation Options
68
-
69
- ```bash
70
- skillsmith author subagent ./my-skill
71
- --tools "Read,Write,Bash" # Override detected tools
72
- --model sonnet # Model: sonnet|opus|haiku
73
- --force # Overwrite existing subagent
74
- ```
75
-
76
- ### Batch Transform Example
77
-
78
- ```bash
79
- # Transform all skills in ~/.claude/skills/
80
- skillsmith author transform ~/.claude/skills --batch
81
-
82
- # Transform specific skills
83
- skillsmith author transform skill1,skill2,skill3 --batch --force
84
- ```
21
+ | `skill_suggest` | Getting suggestions based on current work | Automatic based on context |
85
22
 
86
23
  ## Trust Tiers
87
24
 
@@ -1,15 +0,0 @@
1
- /**
2
- * @fileoverview Unit Tests for Install Conflict Helpers
3
- * @module @skillsmith/mcp-server/tools/install.conflict-helpers.test
4
- * @see SMI-1868, SMI-1879
5
- *
6
- * Tests cover:
7
- * - hashContent: SHA-256 content hashing
8
- * - detectModifications: Detect if skill files were modified
9
- * - createSkillBackup: Create timestamped backups
10
- * - storeOriginal: Store original content for merge
11
- * - loadOriginal: Load stored original content
12
- * - cleanupOldBackups: Manage backup retention
13
- */
14
- export {};
15
- //# sourceMappingURL=install.conflict-helpers.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install.conflict-helpers.test.d.ts","sourceRoot":"","sources":["../../../src/tools/install.conflict-helpers.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -1,243 +0,0 @@
1
- /**
2
- * @fileoverview Unit Tests for Install Conflict Helpers
3
- * @module @skillsmith/mcp-server/tools/install.conflict-helpers.test
4
- * @see SMI-1868, SMI-1879
5
- *
6
- * Tests cover:
7
- * - hashContent: SHA-256 content hashing
8
- * - detectModifications: Detect if skill files were modified
9
- * - createSkillBackup: Create timestamped backups
10
- * - storeOriginal: Store original content for merge
11
- * - loadOriginal: Load stored original content
12
- * - cleanupOldBackups: Manage backup retention
13
- */
14
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
15
- import * as fs from 'fs/promises';
16
- // Import functions under test
17
- import { hashContent, detectModifications, createSkillBackup, storeOriginal, loadOriginal, cleanupOldBackups, } from './install.conflict-helpers.js';
18
- // Mock fs module
19
- vi.mock('fs/promises');
20
- const mockedFs = vi.mocked(fs);
21
- // ============================================================================
22
- // Tests for hashContent
23
- // ============================================================================
24
- describe('hashContent', () => {
25
- it('should return consistent SHA-256 hash for same content', () => {
26
- const content = 'Hello, World!';
27
- const hash1 = hashContent(content);
28
- const hash2 = hashContent(content);
29
- expect(hash1).toBe(hash2);
30
- expect(hash1).toHaveLength(64); // SHA-256 produces 64 hex characters
31
- });
32
- it('should return different hashes for different content', () => {
33
- const hash1 = hashContent('Hello');
34
- const hash2 = hashContent('World');
35
- expect(hash1).not.toBe(hash2);
36
- });
37
- it('should handle empty string', () => {
38
- const hash = hashContent('');
39
- // SHA-256 of empty string
40
- expect(hash).toBe('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855');
41
- });
42
- it('should handle unicode content', () => {
43
- const hash = hashContent('Hello, World!');
44
- expect(hash).toHaveLength(64);
45
- });
46
- it('should handle multiline content', () => {
47
- const content = `Line 1
48
- Line 2
49
- Line 3`;
50
- const hash = hashContent(content);
51
- expect(hash).toHaveLength(64);
52
- });
53
- });
54
- // ============================================================================
55
- // Tests for detectModifications
56
- // ============================================================================
57
- describe('detectModifications', () => {
58
- beforeEach(() => {
59
- vi.clearAllMocks();
60
- });
61
- it('should detect no modification when hashes match', async () => {
62
- const content = 'Original content';
63
- const originalHash = hashContent(content);
64
- mockedFs.readFile.mockResolvedValue(content);
65
- const result = await detectModifications('/path/to/skill', originalHash);
66
- expect(result.modified).toBe(false);
67
- expect(result.currentHash).toBe(originalHash);
68
- expect(result.originalHash).toBe(originalHash);
69
- });
70
- it('should detect modification when hashes differ', async () => {
71
- const originalContent = 'Original content';
72
- const modifiedContent = 'Modified content';
73
- const originalHash = hashContent(originalContent);
74
- mockedFs.readFile.mockResolvedValue(modifiedContent);
75
- const result = await detectModifications('/path/to/skill', originalHash);
76
- expect(result.modified).toBe(true);
77
- expect(result.currentHash).not.toBe(originalHash);
78
- expect(result.originalHash).toBe(originalHash);
79
- });
80
- it('should treat deleted file as modified', async () => {
81
- const originalHash = hashContent('Original content');
82
- const error = new Error('ENOENT');
83
- error.code = 'ENOENT';
84
- mockedFs.readFile.mockRejectedValue(error);
85
- const result = await detectModifications('/path/to/skill', originalHash);
86
- expect(result.modified).toBe(true);
87
- expect(result.currentHash).toBe('');
88
- expect(result.originalHash).toBe(originalHash);
89
- });
90
- it('should propagate other file system errors', async () => {
91
- const originalHash = hashContent('Original content');
92
- const error = new Error('EACCES');
93
- error.code = 'EACCES';
94
- mockedFs.readFile.mockRejectedValue(error);
95
- await expect(detectModifications('/path/to/skill', originalHash)).rejects.toThrow('EACCES');
96
- });
97
- });
98
- // ============================================================================
99
- // Tests for createSkillBackup
100
- // ============================================================================
101
- describe('createSkillBackup', () => {
102
- beforeEach(() => {
103
- vi.clearAllMocks();
104
- vi.useFakeTimers();
105
- vi.setSystemTime(new Date('2025-01-27T10:30:00.000Z'));
106
- });
107
- afterEach(() => {
108
- vi.useRealTimers();
109
- });
110
- it('should create backup directory with timestamp and reason', async () => {
111
- mockedFs.mkdir.mockResolvedValue(undefined);
112
- mockedFs.readdir.mockResolvedValue([
113
- { name: 'SKILL.md', isFile: () => true, isDirectory: () => false },
114
- ]);
115
- mockedFs.copyFile.mockResolvedValue(undefined);
116
- const backupPath = await createSkillBackup('test-skill', '/path/to/skill', 'pre-update');
117
- expect(backupPath).toContain('test-skill');
118
- expect(backupPath).toContain('2025-01-27T10-30-00-000Z');
119
- expect(backupPath).toContain('pre-update');
120
- expect(mockedFs.mkdir).toHaveBeenCalled();
121
- });
122
- it('should copy all files from install path', async () => {
123
- mockedFs.mkdir.mockResolvedValue(undefined);
124
- mockedFs.readdir.mockResolvedValue([
125
- { name: 'SKILL.md', isFile: () => true, isDirectory: () => false },
126
- { name: 'subskill.md', isFile: () => true, isDirectory: () => false },
127
- ]);
128
- mockedFs.copyFile.mockResolvedValue(undefined);
129
- await createSkillBackup('test-skill', '/path/to/skill', 'pre-update');
130
- expect(mockedFs.copyFile).toHaveBeenCalledTimes(2);
131
- });
132
- it('should recursively copy directories', async () => {
133
- mockedFs.mkdir.mockResolvedValue(undefined);
134
- mockedFs.readdir.mockImplementation(async (dirPath) => {
135
- if (String(dirPath).includes('subdir')) {
136
- return [
137
- { name: 'nested.md', isFile: () => true, isDirectory: () => false },
138
- ];
139
- }
140
- return [
141
- { name: 'SKILL.md', isFile: () => true, isDirectory: () => false },
142
- { name: 'subdir', isFile: () => false, isDirectory: () => true },
143
- ];
144
- });
145
- mockedFs.copyFile.mockResolvedValue(undefined);
146
- await createSkillBackup('test-skill', '/path/to/skill', 'pre-update');
147
- // Should copy SKILL.md and nested.md
148
- expect(mockedFs.copyFile).toHaveBeenCalledTimes(2);
149
- // Should create main backup dir and subdir
150
- expect(mockedFs.mkdir).toHaveBeenCalledTimes(2);
151
- });
152
- });
153
- // ============================================================================
154
- // Tests for storeOriginal and loadOriginal
155
- // ============================================================================
156
- describe('storeOriginal', () => {
157
- beforeEach(() => {
158
- vi.clearAllMocks();
159
- });
160
- it('should store SKILL.md content and metadata', async () => {
161
- mockedFs.mkdir.mockResolvedValue(undefined);
162
- mockedFs.writeFile.mockResolvedValue(undefined);
163
- const content = '# Test Skill';
164
- const metadata = { version: '1.0.0', source: 'github:owner/repo' };
165
- await storeOriginal('test-skill', content, metadata);
166
- expect(mockedFs.mkdir).toHaveBeenCalledWith(expect.stringContaining('.original'), { recursive: true });
167
- expect(mockedFs.writeFile).toHaveBeenCalledWith(expect.stringContaining('SKILL.md'), content, 'utf-8');
168
- expect(mockedFs.writeFile).toHaveBeenCalledWith(expect.stringContaining('metadata.json'), JSON.stringify(metadata, null, 2));
169
- });
170
- });
171
- describe('loadOriginal', () => {
172
- beforeEach(() => {
173
- vi.clearAllMocks();
174
- });
175
- it('should load stored original content', async () => {
176
- const content = '# Test Skill';
177
- mockedFs.readFile.mockResolvedValue(content);
178
- const result = await loadOriginal('test-skill');
179
- expect(result).toBe(content);
180
- });
181
- it('should return null when original does not exist', async () => {
182
- const error = new Error('ENOENT');
183
- error.code = 'ENOENT';
184
- mockedFs.readFile.mockRejectedValue(error);
185
- const result = await loadOriginal('test-skill');
186
- expect(result).toBeNull();
187
- });
188
- it('should propagate other errors', async () => {
189
- const error = new Error('EACCES');
190
- error.code = 'EACCES';
191
- mockedFs.readFile.mockRejectedValue(error);
192
- await expect(loadOriginal('test-skill')).rejects.toThrow('EACCES');
193
- });
194
- });
195
- // ============================================================================
196
- // Tests for cleanupOldBackups
197
- // ============================================================================
198
- describe('cleanupOldBackups', () => {
199
- beforeEach(() => {
200
- vi.clearAllMocks();
201
- });
202
- it('should keep only the most recent backups', async () => {
203
- mockedFs.readdir.mockResolvedValue([
204
- { name: '.original', isDirectory: () => true },
205
- { name: '2025-01-25T10-00-00_backup', isDirectory: () => true },
206
- { name: '2025-01-26T10-00-00_backup', isDirectory: () => true },
207
- { name: '2025-01-27T10-00-00_backup', isDirectory: () => true },
208
- { name: '2025-01-27T12-00-00_backup', isDirectory: () => true },
209
- { name: '2025-01-27T14-00-00_backup', isDirectory: () => true },
210
- ]);
211
- mockedFs.rm.mockResolvedValue(undefined);
212
- await cleanupOldBackups('test-skill', 3);
213
- // Should delete 2 oldest backups (keeping 3 most recent + .original)
214
- expect(mockedFs.rm).toHaveBeenCalledTimes(2);
215
- expect(mockedFs.rm).toHaveBeenCalledWith(expect.stringContaining('2025-01-25'), { recursive: true, force: true });
216
- expect(mockedFs.rm).toHaveBeenCalledWith(expect.stringContaining('2025-01-26'), { recursive: true, force: true });
217
- });
218
- it('should never delete .original directory', async () => {
219
- mockedFs.readdir.mockResolvedValue([
220
- { name: '.original', isDirectory: () => true },
221
- { name: '2025-01-27T10-00-00_backup', isDirectory: () => true },
222
- ]);
223
- mockedFs.rm.mockResolvedValue(undefined);
224
- await cleanupOldBackups('test-skill', 0);
225
- // Should only delete the backup, not .original
226
- expect(mockedFs.rm).toHaveBeenCalledTimes(1);
227
- expect(mockedFs.rm).not.toHaveBeenCalledWith(expect.stringContaining('.original'), expect.any(Object));
228
- });
229
- it('should handle non-existent backup directory', async () => {
230
- const error = new Error('ENOENT');
231
- error.code = 'ENOENT';
232
- mockedFs.readdir.mockRejectedValue(error);
233
- // Should not throw
234
- await expect(cleanupOldBackups('test-skill')).resolves.toBeUndefined();
235
- });
236
- it('should propagate other errors', async () => {
237
- const error = new Error('EACCES');
238
- error.code = 'EACCES';
239
- mockedFs.readdir.mockRejectedValue(error);
240
- await expect(cleanupOldBackups('test-skill')).rejects.toThrow('EACCES');
241
- });
242
- });
243
- //# sourceMappingURL=install.conflict-helpers.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install.conflict-helpers.test.js","sourceRoot":"","sources":["../../../src/tools/install.conflict-helpers.test.ts"],"names":[],"mappings":"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"}
@@ -1,15 +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
- export {};
15
- //# sourceMappingURL=install.conflict.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install.conflict.test.d.ts","sourceRoot":"","sources":["../../../src/tools/install.conflict.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}