@skillsmith/mcp-server 0.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.
- package/dist/.tsbuildinfo +1 -0
- package/dist/src/__tests__/get-skill.test.d.ts +6 -0
- package/dist/src/__tests__/get-skill.test.d.ts.map +1 -0
- package/dist/src/__tests__/get-skill.test.js +88 -0
- package/dist/src/__tests__/get-skill.test.js.map +1 -0
- package/dist/src/__tests__/middleware/errorFormatter.test.d.ts +7 -0
- package/dist/src/__tests__/middleware/errorFormatter.test.d.ts.map +1 -0
- package/dist/src/__tests__/middleware/errorFormatter.test.js +304 -0
- package/dist/src/__tests__/middleware/errorFormatter.test.js.map +1 -0
- package/dist/src/__tests__/middleware/license.test.d.ts +7 -0
- package/dist/src/__tests__/middleware/license.test.d.ts.map +1 -0
- package/dist/src/__tests__/middleware/license.test.js +500 -0
- package/dist/src/__tests__/middleware/license.test.js.map +1 -0
- package/dist/src/__tests__/search.test.d.ts +6 -0
- package/dist/src/__tests__/search.test.d.ts.map +1 -0
- package/dist/src/__tests__/search.test.js +86 -0
- package/dist/src/__tests__/search.test.js.map +1 -0
- package/dist/src/__tests__/test-utils.d.ts +19 -0
- package/dist/src/__tests__/test-utils.d.ts.map +1 -0
- package/dist/src/__tests__/test-utils.js +87 -0
- package/dist/src/__tests__/test-utils.js.map +1 -0
- package/dist/src/context/index.d.ts +19 -0
- package/dist/src/context/index.d.ts.map +1 -0
- package/dist/src/context/index.js +25 -0
- package/dist/src/context/index.js.map +1 -0
- package/dist/src/context/project-detector.d.ts +145 -0
- package/dist/src/context/project-detector.d.ts.map +1 -0
- package/dist/src/context/project-detector.js +321 -0
- package/dist/src/context/project-detector.js.map +1 -0
- package/dist/src/context.d.ts +100 -0
- package/dist/src/context.d.ts.map +1 -0
- package/dist/src/context.js +157 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/core-shim.d.ts +7 -0
- package/dist/src/core-shim.d.ts.map +1 -0
- package/dist/src/core-shim.js +9 -0
- package/dist/src/core-shim.js.map +1 -0
- package/dist/src/health/healthCheck.d.ts +88 -0
- package/dist/src/health/healthCheck.d.ts.map +1 -0
- package/dist/src/health/healthCheck.js +117 -0
- package/dist/src/health/healthCheck.js.map +1 -0
- package/dist/src/health/index.d.ts +21 -0
- package/dist/src/health/index.d.ts.map +1 -0
- package/dist/src/health/index.js +21 -0
- package/dist/src/health/index.js.map +1 -0
- package/dist/src/health/readinessCheck.d.ts +139 -0
- package/dist/src/health/readinessCheck.d.ts.map +1 -0
- package/dist/src/health/readinessCheck.js +266 -0
- package/dist/src/health/readinessCheck.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +178 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/index.test.d.ts +2 -0
- package/dist/src/index.test.d.ts.map +1 -0
- package/dist/src/index.test.js +43 -0
- package/dist/src/index.test.js.map +1 -0
- package/dist/src/logger.d.ts +26 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +179 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/middleware/__tests__/csp.test.d.ts +2 -0
- package/dist/src/middleware/__tests__/csp.test.d.ts.map +1 -0
- package/dist/src/middleware/__tests__/csp.test.js +389 -0
- package/dist/src/middleware/__tests__/csp.test.js.map +1 -0
- package/dist/src/middleware/csp.d.ts +87 -0
- package/dist/src/middleware/csp.d.ts.map +1 -0
- package/dist/src/middleware/csp.js +273 -0
- package/dist/src/middleware/csp.js.map +1 -0
- package/dist/src/middleware/degradation.d.ts +99 -0
- package/dist/src/middleware/degradation.d.ts.map +1 -0
- package/dist/src/middleware/degradation.js +315 -0
- package/dist/src/middleware/degradation.js.map +1 -0
- package/dist/src/middleware/errorFormatter.d.ts +119 -0
- package/dist/src/middleware/errorFormatter.d.ts.map +1 -0
- package/dist/src/middleware/errorFormatter.js +294 -0
- package/dist/src/middleware/errorFormatter.js.map +1 -0
- package/dist/src/middleware/index.d.ts +10 -0
- package/dist/src/middleware/index.d.ts.map +1 -0
- package/dist/src/middleware/index.js +14 -0
- package/dist/src/middleware/index.js.map +1 -0
- package/dist/src/middleware/license.d.ts +161 -0
- package/dist/src/middleware/license.d.ts.map +1 -0
- package/dist/src/middleware/license.js +281 -0
- package/dist/src/middleware/license.js.map +1 -0
- package/dist/src/middleware/toolFeatureMapping.d.ts +36 -0
- package/dist/src/middleware/toolFeatureMapping.d.ts.map +1 -0
- package/dist/src/middleware/toolFeatureMapping.js +90 -0
- package/dist/src/middleware/toolFeatureMapping.js.map +1 -0
- package/dist/src/onboarding/first-run.d.ts +64 -0
- package/dist/src/onboarding/first-run.d.ts.map +1 -0
- package/dist/src/onboarding/first-run.js +77 -0
- package/dist/src/onboarding/first-run.js.map +1 -0
- package/dist/src/onboarding/index.d.ts +7 -0
- package/dist/src/onboarding/index.d.ts.map +1 -0
- package/dist/src/onboarding/index.js +7 -0
- package/dist/src/onboarding/index.js.map +1 -0
- package/dist/src/suggestions/index.d.ts +21 -0
- package/dist/src/suggestions/index.d.ts.map +1 -0
- package/dist/src/suggestions/index.js +20 -0
- package/dist/src/suggestions/index.js.map +1 -0
- package/dist/src/suggestions/suggestion-engine.d.ts +185 -0
- package/dist/src/suggestions/suggestion-engine.d.ts.map +1 -0
- package/dist/src/suggestions/suggestion-engine.js +352 -0
- package/dist/src/suggestions/suggestion-engine.js.map +1 -0
- package/dist/src/suggestions/types.d.ts +88 -0
- package/dist/src/suggestions/types.d.ts.map +1 -0
- package/dist/src/suggestions/types.js +21 -0
- package/dist/src/suggestions/types.js.map +1 -0
- package/dist/src/tools/analyze.d.ts +151 -0
- package/dist/src/tools/analyze.d.ts.map +1 -0
- package/dist/src/tools/analyze.js +205 -0
- package/dist/src/tools/analyze.js.map +1 -0
- package/dist/src/tools/compare.d.ts +149 -0
- package/dist/src/tools/compare.d.ts.map +1 -0
- package/dist/src/tools/compare.js +464 -0
- package/dist/src/tools/compare.js.map +1 -0
- package/dist/src/tools/get-skill.d.ts +116 -0
- package/dist/src/tools/get-skill.d.ts.map +1 -0
- package/dist/src/tools/get-skill.js +224 -0
- package/dist/src/tools/get-skill.js.map +1 -0
- package/dist/src/tools/index.d.ts +20 -0
- package/dist/src/tools/index.d.ts.map +1 -0
- package/dist/src/tools/index.js +20 -0
- package/dist/src/tools/index.js.map +1 -0
- package/dist/src/tools/install.d.ts +122 -0
- package/dist/src/tools/install.d.ts.map +1 -0
- package/dist/src/tools/install.js +314 -0
- package/dist/src/tools/install.js.map +1 -0
- package/dist/src/tools/recommend.d.ts +171 -0
- package/dist/src/tools/recommend.d.ts.map +1 -0
- package/dist/src/tools/recommend.js +325 -0
- package/dist/src/tools/recommend.js.map +1 -0
- package/dist/src/tools/search.d.ts +121 -0
- package/dist/src/tools/search.d.ts.map +1 -0
- package/dist/src/tools/search.js +249 -0
- package/dist/src/tools/search.js.map +1 -0
- package/dist/src/tools/suggest.d.ts +181 -0
- package/dist/src/tools/suggest.d.ts.map +1 -0
- package/dist/src/tools/suggest.js +342 -0
- package/dist/src/tools/suggest.js.map +1 -0
- package/dist/src/tools/uninstall.d.ts +123 -0
- package/dist/src/tools/uninstall.d.ts.map +1 -0
- package/dist/src/tools/uninstall.js +250 -0
- package/dist/src/tools/uninstall.js.map +1 -0
- package/dist/src/tools/validate.d.ts +122 -0
- package/dist/src/tools/validate.d.ts.map +1 -0
- package/dist/src/tools/validate.js +497 -0
- package/dist/src/tools/validate.js.map +1 -0
- package/dist/src/utils/installed-skills.d.ts +101 -0
- package/dist/src/utils/installed-skills.d.ts.map +1 -0
- package/dist/src/utils/installed-skills.js +220 -0
- package/dist/src/utils/installed-skills.js.map +1 -0
- package/dist/src/utils/validation.d.ts +76 -0
- package/dist/src/utils/validation.d.ts.map +1 -0
- package/dist/src/utils/validation.js +153 -0
- package/dist/src/utils/validation.js.map +1 -0
- package/dist/src/webhooks/index.d.ts +8 -0
- package/dist/src/webhooks/index.d.ts.map +1 -0
- package/dist/src/webhooks/index.js +9 -0
- package/dist/src/webhooks/index.js.map +1 -0
- package/dist/src/webhooks/webhook-endpoint.d.ts +149 -0
- package/dist/src/webhooks/webhook-endpoint.d.ts.map +1 -0
- package/dist/src/webhooks/webhook-endpoint.js +339 -0
- package/dist/src/webhooks/webhook-endpoint.js.map +1 -0
- package/dist/tests/compare.test.d.ts +6 -0
- package/dist/tests/compare.test.d.ts.map +1 -0
- package/dist/tests/compare.test.js +225 -0
- package/dist/tests/compare.test.js.map +1 -0
- package/dist/tests/context/project-detector.test.d.ts +6 -0
- package/dist/tests/context/project-detector.test.d.ts.map +1 -0
- package/dist/tests/context/project-detector.test.js +719 -0
- package/dist/tests/context/project-detector.test.js.map +1 -0
- package/dist/tests/e2e/compare.e2e.test.d.ts +10 -0
- package/dist/tests/e2e/compare.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/compare.e2e.test.js +286 -0
- package/dist/tests/e2e/compare.e2e.test.js.map +1 -0
- package/dist/tests/e2e/install-flow.e2e.test.d.ts +10 -0
- package/dist/tests/e2e/install-flow.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/install-flow.e2e.test.js +209 -0
- package/dist/tests/e2e/install-flow.e2e.test.js.map +1 -0
- package/dist/tests/e2e/recommend.e2e.test.d.ts +12 -0
- package/dist/tests/e2e/recommend.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/recommend.e2e.test.js +347 -0
- package/dist/tests/e2e/recommend.e2e.test.js.map +1 -0
- package/dist/tests/e2e/skill-flow.e2e.test.d.ts +10 -0
- package/dist/tests/e2e/skill-flow.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/skill-flow.e2e.test.js +280 -0
- package/dist/tests/e2e/skill-flow.e2e.test.js.map +1 -0
- package/dist/tests/e2e/suggest.e2e.test.d.ts +13 -0
- package/dist/tests/e2e/suggest.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/suggest.e2e.test.js +347 -0
- package/dist/tests/e2e/suggest.e2e.test.js.map +1 -0
- package/dist/tests/e2e/utils/baseline-collector.d.ts +107 -0
- package/dist/tests/e2e/utils/baseline-collector.d.ts.map +1 -0
- package/dist/tests/e2e/utils/baseline-collector.js +211 -0
- package/dist/tests/e2e/utils/baseline-collector.js.map +1 -0
- package/dist/tests/e2e/utils/hardcoded-detector.d.ts +46 -0
- package/dist/tests/e2e/utils/hardcoded-detector.d.ts.map +1 -0
- package/dist/tests/e2e/utils/hardcoded-detector.js +255 -0
- package/dist/tests/e2e/utils/hardcoded-detector.js.map +1 -0
- package/dist/tests/e2e/utils/index.d.ts +7 -0
- package/dist/tests/e2e/utils/index.d.ts.map +1 -0
- package/dist/tests/e2e/utils/index.js +7 -0
- package/dist/tests/e2e/utils/index.js.map +1 -0
- package/dist/tests/e2e/utils/linear-reporter.d.ts +60 -0
- package/dist/tests/e2e/utils/linear-reporter.d.ts.map +1 -0
- package/dist/tests/e2e/utils/linear-reporter.js +232 -0
- package/dist/tests/e2e/utils/linear-reporter.js.map +1 -0
- package/dist/tests/health.test.d.ts +9 -0
- package/dist/tests/health.test.d.ts.map +1 -0
- package/dist/tests/health.test.js +308 -0
- package/dist/tests/health.test.js.map +1 -0
- package/dist/tests/integration/analyze.integration.test.d.ts +2 -0
- package/dist/tests/integration/analyze.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/analyze.integration.test.js +244 -0
- package/dist/tests/integration/analyze.integration.test.js.map +1 -0
- package/dist/tests/integration/compare.integration.test.d.ts +2 -0
- package/dist/tests/integration/compare.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/compare.integration.test.js +120 -0
- package/dist/tests/integration/compare.integration.test.js.map +1 -0
- package/dist/tests/integration/fixtures/test-skills.d.ts +62 -0
- package/dist/tests/integration/fixtures/test-skills.d.ts.map +1 -0
- package/dist/tests/integration/fixtures/test-skills.js +644 -0
- package/dist/tests/integration/fixtures/test-skills.js.map +1 -0
- package/dist/tests/integration/get-skill.integration.test.d.ts +6 -0
- package/dist/tests/integration/get-skill.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/get-skill.integration.test.js +203 -0
- package/dist/tests/integration/get-skill.integration.test.js.map +1 -0
- package/dist/tests/integration/github-api.integration.test.d.ts +14 -0
- package/dist/tests/integration/github-api.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/github-api.integration.test.js +190 -0
- package/dist/tests/integration/github-api.integration.test.js.map +1 -0
- package/dist/tests/integration/install.integration.test.d.ts +6 -0
- package/dist/tests/integration/install.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/install.integration.test.js +282 -0
- package/dist/tests/integration/install.integration.test.js.map +1 -0
- package/dist/tests/integration/recommend.integration.test.d.ts +2 -0
- package/dist/tests/integration/recommend.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/recommend.integration.test.js +215 -0
- package/dist/tests/integration/recommend.integration.test.js.map +1 -0
- package/dist/tests/integration/search.integration.test.d.ts +6 -0
- package/dist/tests/integration/search.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/search.integration.test.js +229 -0
- package/dist/tests/integration/search.integration.test.js.map +1 -0
- package/dist/tests/integration/setup.d.ts +71 -0
- package/dist/tests/integration/setup.d.ts.map +1 -0
- package/dist/tests/integration/setup.js +124 -0
- package/dist/tests/integration/setup.js.map +1 -0
- package/dist/tests/integration/uninstall.integration.test.d.ts +6 -0
- package/dist/tests/integration/uninstall.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/uninstall.integration.test.js +296 -0
- package/dist/tests/integration/uninstall.integration.test.js.map +1 -0
- package/dist/tests/integration/validate.integration.test.d.ts +2 -0
- package/dist/tests/integration/validate.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/validate.integration.test.js +181 -0
- package/dist/tests/integration/validate.integration.test.js.map +1 -0
- package/dist/tests/onboarding/first-run.test.d.ts +7 -0
- package/dist/tests/onboarding/first-run.test.d.ts.map +1 -0
- package/dist/tests/onboarding/first-run.test.js +258 -0
- package/dist/tests/onboarding/first-run.test.js.map +1 -0
- package/dist/tests/performance/search-performance.test.d.ts +10 -0
- package/dist/tests/performance/search-performance.test.d.ts.map +1 -0
- package/dist/tests/performance/search-performance.test.js +218 -0
- package/dist/tests/performance/search-performance.test.js.map +1 -0
- package/dist/tests/recommend.test.d.ts +6 -0
- package/dist/tests/recommend.test.d.ts.map +1 -0
- package/dist/tests/recommend.test.js +208 -0
- package/dist/tests/recommend.test.js.map +1 -0
- package/dist/tests/suggestions/suggestion-engine.test.d.ts +6 -0
- package/dist/tests/suggestions/suggestion-engine.test.d.ts.map +1 -0
- package/dist/tests/suggestions/suggestion-engine.test.js +448 -0
- package/dist/tests/suggestions/suggestion-engine.test.js.map +1 -0
- package/dist/tests/test-utils.d.ts +74 -0
- package/dist/tests/test-utils.d.ts.map +1 -0
- package/dist/tests/test-utils.js +98 -0
- package/dist/tests/test-utils.js.map +1 -0
- package/dist/tests/tools.test.d.ts +5 -0
- package/dist/tests/tools.test.d.ts.map +1 -0
- package/dist/tests/tools.test.js +138 -0
- package/dist/tests/tools.test.js.map +1 -0
- package/dist/tests/unit/installed-skills.test.d.ts +6 -0
- package/dist/tests/unit/installed-skills.test.d.ts.map +1 -0
- package/dist/tests/unit/installed-skills.test.js +285 -0
- package/dist/tests/unit/installed-skills.test.js.map +1 -0
- package/dist/tests/unit/logger.test.d.ts +6 -0
- package/dist/tests/unit/logger.test.d.ts.map +1 -0
- package/dist/tests/unit/logger.test.js +281 -0
- package/dist/tests/unit/logger.test.js.map +1 -0
- package/dist/tests/validate.test.d.ts +5 -0
- package/dist/tests/validate.test.d.ts.map +1 -0
- package/dist/tests/validate.test.js +303 -0
- package/dist/tests/validate.test.js.map +1 -0
- package/dist/tests/webhooks/proxy-trust.security.test.d.ts +8 -0
- package/dist/tests/webhooks/proxy-trust.security.test.d.ts.map +1 -0
- package/dist/tests/webhooks/proxy-trust.security.test.js +145 -0
- package/dist/tests/webhooks/proxy-trust.security.test.js.map +1 -0
- package/dist/tests/webhooks/rate-limiter.security.test.d.ts +8 -0
- package/dist/tests/webhooks/rate-limiter.security.test.d.ts.map +1 -0
- package/dist/tests/webhooks/rate-limiter.security.test.js +122 -0
- package/dist/tests/webhooks/rate-limiter.security.test.js.map +1 -0
- package/dist/vitest.config.d.ts +6 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +13 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview MCP Uninstall Skill Tool for safely removing installed skills
|
|
3
|
+
* @module @skillsmith/mcp-server/tools/uninstall
|
|
4
|
+
* @see {@link https://github.com/wrsmith108/skillsmith|Skillsmith Repository}
|
|
5
|
+
*
|
|
6
|
+
* Provides skill uninstallation functionality with:
|
|
7
|
+
* - Manifest-based tracking of installed skills
|
|
8
|
+
* - Modification detection (warns if files changed since install)
|
|
9
|
+
* - Force removal option for modified or untracked skills
|
|
10
|
+
* - Clean removal from ~/.claude/skills/ directory
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* // Uninstall a skill
|
|
14
|
+
* const result = await uninstallSkill({ skillName: 'commit' });
|
|
15
|
+
* if (result.success) {
|
|
16
|
+
* console.log(result.message);
|
|
17
|
+
* }
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* // Force uninstall modified skill
|
|
21
|
+
* const result = await uninstallSkill({
|
|
22
|
+
* skillName: 'my-custom-skill',
|
|
23
|
+
* force: true
|
|
24
|
+
* });
|
|
25
|
+
*/
|
|
26
|
+
import { z } from 'zod';
|
|
27
|
+
import * as fs from 'fs/promises';
|
|
28
|
+
import * as path from 'path';
|
|
29
|
+
import * as os from 'os';
|
|
30
|
+
// Input schema
|
|
31
|
+
export const uninstallInputSchema = z.object({
|
|
32
|
+
skillName: z.string().min(1).describe('Name of the skill to uninstall'),
|
|
33
|
+
force: z.boolean().default(false).describe('Force removal even if modified'),
|
|
34
|
+
});
|
|
35
|
+
// Paths
|
|
36
|
+
const CLAUDE_SKILLS_DIR = path.join(os.homedir(), '.claude', 'skills');
|
|
37
|
+
const SKILLSMITH_DIR = path.join(os.homedir(), '.skillsmith');
|
|
38
|
+
const MANIFEST_PATH = path.join(SKILLSMITH_DIR, 'manifest.json');
|
|
39
|
+
/**
|
|
40
|
+
* Load manifest
|
|
41
|
+
*/
|
|
42
|
+
async function loadManifest() {
|
|
43
|
+
try {
|
|
44
|
+
const content = await fs.readFile(MANIFEST_PATH, 'utf-8');
|
|
45
|
+
return JSON.parse(content);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return {
|
|
49
|
+
version: '1.0.0',
|
|
50
|
+
installedSkills: {},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Save manifest
|
|
56
|
+
*/
|
|
57
|
+
async function saveManifest(manifest) {
|
|
58
|
+
await fs.mkdir(path.dirname(MANIFEST_PATH), { recursive: true });
|
|
59
|
+
await fs.writeFile(MANIFEST_PATH, JSON.stringify(manifest, null, 2));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Check if skill directory has been modified since installation
|
|
63
|
+
*/
|
|
64
|
+
async function checkForModifications(skillPath, installedAt) {
|
|
65
|
+
try {
|
|
66
|
+
const installDate = new Date(installedAt);
|
|
67
|
+
// Get all files in skill directory
|
|
68
|
+
const files = await fs.readdir(skillPath, { withFileTypes: true });
|
|
69
|
+
for (const file of files) {
|
|
70
|
+
if (file.isFile()) {
|
|
71
|
+
const filePath = path.join(skillPath, file.name);
|
|
72
|
+
const stats = await fs.stat(filePath);
|
|
73
|
+
// Check if modified after installation
|
|
74
|
+
if (stats.mtime > installDate) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Recursively remove directory
|
|
87
|
+
*/
|
|
88
|
+
async function removeDirectory(dirPath) {
|
|
89
|
+
await fs.rm(dirPath, { recursive: true, force: true });
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Uninstall a skill from the local Claude Code skills directory.
|
|
93
|
+
*
|
|
94
|
+
* This function:
|
|
95
|
+
* 1. Loads the manifest to find the skill
|
|
96
|
+
* 2. Checks for local modifications (warns unless force=true)
|
|
97
|
+
* 3. Removes the skill directory from ~/.claude/skills/
|
|
98
|
+
* 4. Updates the manifest to remove the skill entry
|
|
99
|
+
*
|
|
100
|
+
* If the skill exists on disk but not in manifest, force=true is required.
|
|
101
|
+
*
|
|
102
|
+
* @param input - Uninstall parameters
|
|
103
|
+
* @param input.skillName - Name of the skill to uninstall
|
|
104
|
+
* @param input.force - Force removal even if modified (default: false)
|
|
105
|
+
* @returns Promise resolving to uninstall result with success status
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* // Standard uninstall
|
|
109
|
+
* const result = await uninstallSkill({ skillName: 'jest-helper' });
|
|
110
|
+
* if (result.success) {
|
|
111
|
+
* console.log(`Removed from ${result.removedPath}`);
|
|
112
|
+
* }
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* // Handle modified skill
|
|
116
|
+
* const result = await uninstallSkill({ skillName: 'custom-skill' });
|
|
117
|
+
* if (!result.success && result.warning) {
|
|
118
|
+
* console.log(result.warning); // 'Local modifications will be lost...'
|
|
119
|
+
* // Ask user confirmation, then:
|
|
120
|
+
* await uninstallSkill({ skillName: 'custom-skill', force: true });
|
|
121
|
+
* }
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* // Check if skill is installed first
|
|
125
|
+
* const installed = await listInstalledSkills();
|
|
126
|
+
* if (installed.includes('my-skill')) {
|
|
127
|
+
* await uninstallSkill({ skillName: 'my-skill' });
|
|
128
|
+
* }
|
|
129
|
+
*/
|
|
130
|
+
export async function uninstallSkill(input, _context) {
|
|
131
|
+
const { skillName, force } = input;
|
|
132
|
+
try {
|
|
133
|
+
// Load manifest
|
|
134
|
+
const manifest = await loadManifest();
|
|
135
|
+
const skillEntry = manifest.installedSkills[skillName];
|
|
136
|
+
// Check if skill exists in manifest
|
|
137
|
+
if (!skillEntry) {
|
|
138
|
+
// Still try to check the filesystem
|
|
139
|
+
const potentialPath = path.join(CLAUDE_SKILLS_DIR, skillName);
|
|
140
|
+
try {
|
|
141
|
+
await fs.access(potentialPath);
|
|
142
|
+
// Skill exists on disk but not in manifest
|
|
143
|
+
if (!force) {
|
|
144
|
+
return {
|
|
145
|
+
success: false,
|
|
146
|
+
skillName,
|
|
147
|
+
message: `Skill "${skillName}" not in manifest but exists on disk. Use force=true to remove.`,
|
|
148
|
+
warning: 'This skill was not installed via Skillsmith.',
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
// Force remove
|
|
152
|
+
await removeDirectory(potentialPath);
|
|
153
|
+
return {
|
|
154
|
+
success: true,
|
|
155
|
+
skillName,
|
|
156
|
+
message: `Skill "${skillName}" removed from disk (was not in manifest).`,
|
|
157
|
+
removedPath: potentialPath,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return {
|
|
162
|
+
success: false,
|
|
163
|
+
skillName,
|
|
164
|
+
message: `Skill "${skillName}" is not installed.`,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Get install path
|
|
169
|
+
const installPath = skillEntry.installPath;
|
|
170
|
+
// Check for modifications
|
|
171
|
+
if (!force) {
|
|
172
|
+
const modified = await checkForModifications(installPath, skillEntry.installedAt);
|
|
173
|
+
if (modified) {
|
|
174
|
+
return {
|
|
175
|
+
success: false,
|
|
176
|
+
skillName,
|
|
177
|
+
message: `Skill "${skillName}" has been modified since installation. Use force=true to remove anyway.`,
|
|
178
|
+
warning: 'Local modifications will be lost if you force uninstall.',
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Remove skill directory
|
|
183
|
+
try {
|
|
184
|
+
await removeDirectory(installPath);
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
if (error.code !== 'ENOENT') {
|
|
188
|
+
throw error;
|
|
189
|
+
}
|
|
190
|
+
// Already removed, continue to update manifest
|
|
191
|
+
}
|
|
192
|
+
// Update manifest
|
|
193
|
+
delete manifest.installedSkills[skillName];
|
|
194
|
+
await saveManifest(manifest);
|
|
195
|
+
return {
|
|
196
|
+
success: true,
|
|
197
|
+
skillName,
|
|
198
|
+
message: `Skill "${skillName}" has been uninstalled successfully.`,
|
|
199
|
+
removedPath: installPath,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
return {
|
|
204
|
+
success: false,
|
|
205
|
+
skillName,
|
|
206
|
+
message: error instanceof Error ? error.message : 'Unknown error during uninstall',
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* List all skills currently installed via Skillsmith.
|
|
212
|
+
*
|
|
213
|
+
* Reads the manifest file and returns an array of skill names.
|
|
214
|
+
* This only includes skills tracked in the manifest, not skills
|
|
215
|
+
* manually placed in ~/.claude/skills/.
|
|
216
|
+
*
|
|
217
|
+
* @returns Promise resolving to array of installed skill names
|
|
218
|
+
*
|
|
219
|
+
* @example
|
|
220
|
+
* const skills = await listInstalledSkills();
|
|
221
|
+
* console.log(`${skills.length} skills installed:`);
|
|
222
|
+
* skills.forEach(s => console.log(` - ${s}`));
|
|
223
|
+
*/
|
|
224
|
+
export async function listInstalledSkills() {
|
|
225
|
+
const manifest = await loadManifest();
|
|
226
|
+
return Object.keys(manifest.installedSkills);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* MCP tool definition
|
|
230
|
+
*/
|
|
231
|
+
export const uninstallTool = {
|
|
232
|
+
name: 'uninstall_skill',
|
|
233
|
+
description: 'Uninstall a Claude Code skill from ~/.claude/skills/',
|
|
234
|
+
inputSchema: {
|
|
235
|
+
type: 'object',
|
|
236
|
+
properties: {
|
|
237
|
+
skillName: {
|
|
238
|
+
type: 'string',
|
|
239
|
+
description: 'Name of the skill to uninstall',
|
|
240
|
+
},
|
|
241
|
+
force: {
|
|
242
|
+
type: 'boolean',
|
|
243
|
+
description: 'Force removal even if skill has been modified',
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
required: ['skillName'],
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
export default uninstallTool;
|
|
250
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/tools/uninstall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview MCP Skill Validate Tool for validating SKILL.md files
|
|
3
|
+
* @module @skillsmith/mcp-server/tools/validate
|
|
4
|
+
* @see SMI-742: Add MCP Tool skill_validate
|
|
5
|
+
*
|
|
6
|
+
* Validates skill definition files against the Skillsmith specification:
|
|
7
|
+
* - YAML frontmatter structure
|
|
8
|
+
* - Required fields (name, description)
|
|
9
|
+
* - Field length limits
|
|
10
|
+
* - Security patterns (SSRF, path traversal)
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* // Basic validation
|
|
14
|
+
* const result = await executeValidate({
|
|
15
|
+
* skill_path: '/path/to/SKILL.md'
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* // Strict validation
|
|
20
|
+
* const result = await executeValidate({
|
|
21
|
+
* skill_path: '/path/to/skill-directory',
|
|
22
|
+
* strict: true
|
|
23
|
+
* });
|
|
24
|
+
*/
|
|
25
|
+
import { z } from 'zod';
|
|
26
|
+
import type { ToolContext } from '../context.js';
|
|
27
|
+
/**
|
|
28
|
+
* Zod schema for validate tool input
|
|
29
|
+
*/
|
|
30
|
+
export declare const validateInputSchema: z.ZodObject<{
|
|
31
|
+
/** Path to SKILL.md file or skill directory */
|
|
32
|
+
skill_path: z.ZodString;
|
|
33
|
+
/** Enable strict validation (default false) */
|
|
34
|
+
strict: z.ZodDefault<z.ZodBoolean>;
|
|
35
|
+
}, "strip", z.ZodTypeAny, {
|
|
36
|
+
skill_path: string;
|
|
37
|
+
strict: boolean;
|
|
38
|
+
}, {
|
|
39
|
+
skill_path: string;
|
|
40
|
+
strict?: boolean | undefined;
|
|
41
|
+
}>;
|
|
42
|
+
/**
|
|
43
|
+
* Input type (before parsing, allows optional fields)
|
|
44
|
+
*/
|
|
45
|
+
export type ValidateInput = z.input<typeof validateInputSchema>;
|
|
46
|
+
/**
|
|
47
|
+
* Validation error with severity
|
|
48
|
+
*/
|
|
49
|
+
export interface ValidationError {
|
|
50
|
+
/** Field that has the error */
|
|
51
|
+
field: string;
|
|
52
|
+
/** Error message */
|
|
53
|
+
message: string;
|
|
54
|
+
/** Severity level */
|
|
55
|
+
severity: 'error' | 'warning';
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Validation response
|
|
59
|
+
*/
|
|
60
|
+
export interface ValidateResponse {
|
|
61
|
+
/** Whether the skill is valid */
|
|
62
|
+
valid: boolean;
|
|
63
|
+
/** List of validation errors/warnings */
|
|
64
|
+
errors: ValidationError[];
|
|
65
|
+
/** Parsed metadata if valid */
|
|
66
|
+
metadata: Record<string, unknown> | null;
|
|
67
|
+
/** File path validated */
|
|
68
|
+
path: string;
|
|
69
|
+
/** Performance timing */
|
|
70
|
+
timing: {
|
|
71
|
+
totalMs: number;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* MCP tool schema definition for skill_validate
|
|
76
|
+
*/
|
|
77
|
+
export declare const validateToolSchema: {
|
|
78
|
+
name: string;
|
|
79
|
+
description: string;
|
|
80
|
+
inputSchema: {
|
|
81
|
+
type: "object";
|
|
82
|
+
properties: {
|
|
83
|
+
skill_path: {
|
|
84
|
+
type: string;
|
|
85
|
+
description: string;
|
|
86
|
+
};
|
|
87
|
+
strict: {
|
|
88
|
+
type: string;
|
|
89
|
+
description: string;
|
|
90
|
+
default: boolean;
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
required: string[];
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Execute skill validation.
|
|
98
|
+
*
|
|
99
|
+
* Validates a SKILL.md file against the Skillsmith specification.
|
|
100
|
+
* Checks structure, required fields, field lengths, and security patterns.
|
|
101
|
+
*
|
|
102
|
+
* @param input - Validation parameters
|
|
103
|
+
* @returns Promise resolving to validation response
|
|
104
|
+
* @throws {SkillsmithError} When path is invalid or file cannot be read
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* const response = await executeValidate({
|
|
108
|
+
* skill_path: './skills/my-skill/SKILL.md',
|
|
109
|
+
* strict: true
|
|
110
|
+
* });
|
|
111
|
+
* if (response.valid) {
|
|
112
|
+
* console.log('Skill is valid:', response.metadata);
|
|
113
|
+
* } else {
|
|
114
|
+
* console.log('Errors:', response.errors);
|
|
115
|
+
* }
|
|
116
|
+
*/
|
|
117
|
+
export declare function executeValidate(input: ValidateInput, _context?: ToolContext): Promise<ValidateResponse>;
|
|
118
|
+
/**
|
|
119
|
+
* Format validation results for terminal display
|
|
120
|
+
*/
|
|
121
|
+
export declare function formatValidationResults(response: ValidateResponse): string;
|
|
122
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/tools/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAEhD;;GAEG;AACH,eAAO,MAAM,mBAAmB;IAC9B,+CAA+C;;IAE/C,+CAA+C;;;;;;;;EAE/C,CAAA;AAEF;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAE/D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,qBAAqB;IACrB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAA;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,KAAK,EAAE,OAAO,CAAA;IACd,yCAAyC;IACzC,MAAM,EAAE,eAAe,EAAE,CAAA;IACzB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACxC,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,yBAAyB;IACzB,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;CACF;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;CAoB9B,CAAA;AA+TD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,aAAa,EACpB,QAAQ,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,gBAAgB,CAAC,CA2E3B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAqD1E"}
|