@skillsmith/mcp-server 0.4.2 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/__tests__/LocalIndexer.test.js +158 -0
- package/dist/src/__tests__/LocalIndexer.test.js.map +1 -1
- package/dist/src/__tests__/compare.test.d.ts +8 -0
- package/dist/src/__tests__/compare.test.d.ts.map +1 -0
- package/dist/src/__tests__/compare.test.js +162 -0
- package/dist/src/__tests__/compare.test.js.map +1 -0
- package/dist/src/__tests__/context.async.test.d.ts +8 -0
- package/dist/src/__tests__/context.async.test.d.ts.map +1 -0
- package/dist/src/__tests__/context.async.test.js +223 -0
- package/dist/src/__tests__/context.async.test.js.map +1 -0
- package/dist/src/__tests__/middleware/errorFormatter.builders.test.d.ts +10 -0
- package/dist/src/__tests__/middleware/errorFormatter.builders.test.d.ts.map +1 -0
- package/dist/src/__tests__/middleware/errorFormatter.builders.test.js +93 -0
- package/dist/src/__tests__/middleware/errorFormatter.builders.test.js.map +1 -0
- package/dist/src/__tests__/middleware/license-renewal.test.d.ts +10 -0
- package/dist/src/__tests__/middleware/license-renewal.test.d.ts.map +1 -0
- package/dist/src/__tests__/middleware/license-renewal.test.js +152 -0
- package/dist/src/__tests__/middleware/license-renewal.test.js.map +1 -0
- package/dist/src/__tests__/middleware/quota-helpers.test.d.ts +9 -0
- package/dist/src/__tests__/middleware/quota-helpers.test.d.ts.map +1 -0
- package/dist/src/__tests__/middleware/quota-helpers.test.js +105 -0
- package/dist/src/__tests__/middleware/quota-helpers.test.js.map +1 -0
- package/dist/src/__tests__/middleware/quota.test.d.ts +12 -0
- package/dist/src/__tests__/middleware/quota.test.d.ts.map +1 -0
- package/dist/src/__tests__/middleware/quota.test.js +189 -0
- package/dist/src/__tests__/middleware/quota.test.js.map +1 -0
- package/dist/src/__tests__/recommend-online-path.test.d.ts +10 -0
- package/dist/src/__tests__/recommend-online-path.test.d.ts.map +1 -0
- package/dist/src/__tests__/recommend-online-path.test.js +225 -0
- package/dist/src/__tests__/recommend-online-path.test.js.map +1 -0
- package/dist/src/__tests__/recommend.test.d.ts +2 -0
- package/dist/src/__tests__/recommend.test.d.ts.map +1 -1
- package/dist/src/__tests__/recommend.test.js +14 -2
- package/dist/src/__tests__/recommend.test.js.map +1 -1
- package/dist/src/__tests__/search-online-path.test.d.ts +10 -0
- package/dist/src/__tests__/search-online-path.test.d.ts.map +1 -0
- package/dist/src/__tests__/search-online-path.test.js +140 -0
- package/dist/src/__tests__/search-online-path.test.js.map +1 -0
- package/dist/src/__tests__/search.test.js +153 -5
- package/dist/src/__tests__/search.test.js.map +1 -1
- package/dist/src/context/project-detector.d.ts.map +1 -1
- package/dist/src/context/project-detector.js +1 -0
- package/dist/src/context/project-detector.js.map +1 -1
- package/dist/src/context.async.d.ts +48 -0
- package/dist/src/context.async.d.ts.map +1 -0
- package/dist/src/context.async.js +215 -0
- package/dist/src/context.async.js.map +1 -0
- package/dist/src/context.d.ts +5 -145
- package/dist/src/context.d.ts.map +1 -1
- package/dist/src/context.helpers.d.ts +25 -0
- package/dist/src/context.helpers.d.ts.map +1 -0
- package/dist/src/context.helpers.js +49 -0
- package/dist/src/context.helpers.js.map +1 -0
- package/dist/src/context.js +11 -228
- package/dist/src/context.js.map +1 -1
- package/dist/src/context.types.d.ts +110 -0
- package/dist/src/context.types.d.ts.map +1 -0
- package/dist/src/context.types.js +10 -0
- package/dist/src/context.types.js.map +1 -0
- package/dist/src/health/readinessCheck.d.ts +1 -1
- package/dist/src/health/readinessCheck.d.ts.map +1 -1
- package/dist/src/index.js +21 -152
- package/dist/src/index.js.map +1 -1
- package/dist/src/indexer/FrontmatterParser.d.ts +6 -0
- package/dist/src/indexer/FrontmatterParser.d.ts.map +1 -1
- package/dist/src/indexer/FrontmatterParser.js +15 -0
- package/dist/src/indexer/FrontmatterParser.js.map +1 -1
- package/dist/src/indexer/LocalIndexer.d.ts +4 -0
- package/dist/src/indexer/LocalIndexer.d.ts.map +1 -1
- package/dist/src/indexer/LocalIndexer.js +3 -0
- package/dist/src/indexer/LocalIndexer.js.map +1 -1
- package/dist/src/middleware/degradation.d.ts.map +1 -1
- package/dist/src/middleware/degradation.js +8 -0
- package/dist/src/middleware/degradation.js.map +1 -1
- package/dist/src/middleware/errorFormatter.builders.d.ts +49 -0
- package/dist/src/middleware/errorFormatter.builders.d.ts.map +1 -0
- package/dist/src/middleware/errorFormatter.builders.js +237 -0
- package/dist/src/middleware/errorFormatter.builders.js.map +1 -0
- package/dist/src/middleware/errorFormatter.d.ts +5 -100
- package/dist/src/middleware/errorFormatter.d.ts.map +1 -1
- package/dist/src/middleware/errorFormatter.js +16 -238
- package/dist/src/middleware/errorFormatter.js.map +1 -1
- package/dist/src/middleware/errorFormatter.types.d.ts +81 -0
- package/dist/src/middleware/errorFormatter.types.d.ts.map +1 -0
- package/dist/src/middleware/errorFormatter.types.js +34 -0
- package/dist/src/middleware/errorFormatter.types.js.map +1 -0
- package/dist/src/middleware/toolFeatureMapping.d.ts +1 -1
- package/dist/src/middleware/toolFeatureMapping.d.ts.map +1 -1
- package/dist/src/middleware/toolFeatureMapping.js +8 -0
- package/dist/src/middleware/toolFeatureMapping.js.map +1 -1
- package/dist/src/tool-dispatch.d.ts +27 -0
- package/dist/src/tool-dispatch.d.ts.map +1 -0
- package/dist/src/tool-dispatch.js +127 -0
- package/dist/src/tool-dispatch.js.map +1 -0
- package/dist/src/tools/LocalSkillSearch.d.ts.map +1 -1
- package/dist/src/tools/LocalSkillSearch.js +4 -0
- package/dist/src/tools/LocalSkillSearch.js.map +1 -1
- package/dist/src/tools/get-skill.d.ts.map +1 -1
- package/dist/src/tools/get-skill.js +14 -0
- package/dist/src/tools/get-skill.js.map +1 -1
- package/dist/src/tools/index.d.ts +6 -0
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +6 -0
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/install.d.ts +3 -35
- package/dist/src/tools/install.d.ts.map +1 -1
- package/dist/src/tools/install.js +22 -74
- package/dist/src/tools/install.js.map +1 -1
- package/dist/src/tools/install.optimize.d.ts +46 -0
- package/dist/src/tools/install.optimize.d.ts.map +1 -0
- package/dist/src/tools/install.optimize.js +67 -0
- package/dist/src/tools/install.optimize.js.map +1 -0
- package/dist/src/tools/install.tool.d.ts +44 -0
- package/dist/src/tools/install.tool.d.ts.map +1 -0
- package/dist/src/tools/install.tool.js +44 -0
- package/dist/src/tools/install.tool.js.map +1 -0
- package/dist/src/tools/install.types.d.ts +7 -1
- package/dist/src/tools/install.types.d.ts.map +1 -1
- package/dist/src/tools/recommend.d.ts +2 -4
- package/dist/src/tools/recommend.d.ts.map +1 -1
- package/dist/src/tools/recommend.format.d.ts +28 -0
- package/dist/src/tools/recommend.format.d.ts.map +1 -0
- package/dist/src/tools/recommend.format.js +111 -0
- package/dist/src/tools/recommend.format.js.map +1 -0
- package/dist/src/tools/recommend.js +6 -97
- package/dist/src/tools/recommend.js.map +1 -1
- package/dist/src/tools/recommend.types.d.ts +1 -1
- package/dist/src/tools/search.d.ts +24 -21
- package/dist/src/tools/search.d.ts.map +1 -1
- package/dist/src/tools/search.formatter.d.ts +30 -0
- package/dist/src/tools/search.formatter.d.ts.map +1 -0
- package/dist/src/tools/search.formatter.js +64 -0
- package/dist/src/tools/search.formatter.js.map +1 -0
- package/dist/src/tools/search.js +55 -54
- package/dist/src/tools/search.js.map +1 -1
- package/dist/src/tools/skill-audit.d.ts +98 -0
- package/dist/src/tools/skill-audit.d.ts.map +1 -0
- package/dist/src/tools/skill-audit.js +105 -0
- package/dist/src/tools/skill-audit.js.map +1 -0
- package/dist/src/tools/skill-audit.test.d.ts +6 -0
- package/dist/src/tools/skill-audit.test.d.ts.map +1 -0
- package/dist/src/tools/skill-audit.test.js +121 -0
- package/dist/src/tools/skill-audit.test.js.map +1 -0
- package/dist/src/tools/skill-diff.d.ts +107 -0
- package/dist/src/tools/skill-diff.d.ts.map +1 -0
- package/dist/src/tools/skill-diff.js +268 -0
- package/dist/src/tools/skill-diff.js.map +1 -0
- package/dist/src/tools/skill-diff.test.d.ts +6 -0
- package/dist/src/tools/skill-diff.test.d.ts.map +1 -0
- package/dist/src/tools/skill-diff.test.js +260 -0
- package/dist/src/tools/skill-diff.test.js.map +1 -0
- package/dist/src/tools/skill-updates.d.ts +1 -1
- package/dist/src/tools/skill-updates.d.ts.map +1 -1
- package/dist/src/tools/suggest.d.ts +4 -4
- package/dist/src/tools/uninstall.d.ts +1 -1
- package/dist/src/tools/validate.helpers.d.ts.map +1 -1
- package/dist/src/tools/validate.helpers.js +31 -0
- package/dist/src/tools/validate.helpers.js.map +1 -1
- package/dist/src/utils/validation.d.ts +13 -0
- package/dist/src/utils/validation.d.ts.map +1 -1
- package/dist/src/utils/validation.js +27 -0
- package/dist/src/utils/validation.js.map +1 -1
- package/dist/tests/health.test.js +4 -4
- package/dist/tests/health.test.js.map +1 -1
- package/dist/tests/integration/recommend.integration.test.js +2 -0
- package/dist/tests/integration/recommend.integration.test.js.map +1 -1
- package/dist/tests/integration/setup.d.ts +3 -1
- package/dist/tests/integration/setup.d.ts.map +1 -1
- package/dist/tests/integration/setup.js +4 -1
- package/dist/tests/integration/setup.js.map +1 -1
- package/dist/tests/recommend.test.js +2 -0
- package/dist/tests/recommend.test.js.map +1 -1
- package/dist/tests/unit/validate-helpers.test.js +54 -0
- package/dist/tests/unit/validate-helpers.test.js.map +1 -1
- package/package.json +2 -2
- package/server.json +2 -2
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview skill_audit MCP tool — check skills for security advisories
|
|
3
|
+
* @module @skillsmith/mcp-server/tools/skill-audit
|
|
4
|
+
* @see SMI-skill-version-tracking Wave 3
|
|
5
|
+
*
|
|
6
|
+
* Returns a summary of active security advisories for installed skills.
|
|
7
|
+
* The advisory system is in early access — advisories are published by the
|
|
8
|
+
* Skillsmith team as security issues are identified.
|
|
9
|
+
*
|
|
10
|
+
* Tier gate: Team (skill_security_audit feature flag).
|
|
11
|
+
* Community and Individual users receive a graceful license error response.
|
|
12
|
+
*/
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
import type { ToolContext } from '../context.js';
|
|
15
|
+
/**
|
|
16
|
+
* Input schema for skill_audit tool
|
|
17
|
+
*/
|
|
18
|
+
export declare const skillAuditInputSchema: z.ZodObject<{
|
|
19
|
+
/** Optional filter — check only the specified skill IDs */
|
|
20
|
+
skillIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
21
|
+
}, "strip", z.ZodTypeAny, {
|
|
22
|
+
skillIds?: string[] | undefined;
|
|
23
|
+
}, {
|
|
24
|
+
skillIds?: string[] | undefined;
|
|
25
|
+
}>;
|
|
26
|
+
export type SkillAuditInput = z.infer<typeof skillAuditInputSchema>;
|
|
27
|
+
/**
|
|
28
|
+
* Per-advisory summary entry in the audit response
|
|
29
|
+
*/
|
|
30
|
+
export interface AdvisoryEntry {
|
|
31
|
+
/** Registry skill identifier */
|
|
32
|
+
skillName: string;
|
|
33
|
+
/** Advisory severity */
|
|
34
|
+
severity: 'low' | 'medium' | 'high' | 'critical';
|
|
35
|
+
/** Short advisory title */
|
|
36
|
+
title: string;
|
|
37
|
+
/** Advisory identifier (SSA-YYYY-NNN format) */
|
|
38
|
+
id: string;
|
|
39
|
+
/** Whether a patched version is available */
|
|
40
|
+
fixAvailable: boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Advisory count summary by severity
|
|
44
|
+
*/
|
|
45
|
+
export interface AdvisorySummary {
|
|
46
|
+
critical: number;
|
|
47
|
+
high: number;
|
|
48
|
+
medium: number;
|
|
49
|
+
low: number;
|
|
50
|
+
total: number;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Response from skill_audit tool
|
|
54
|
+
*/
|
|
55
|
+
export interface SkillAuditResponse {
|
|
56
|
+
/** Whether advisories data is available */
|
|
57
|
+
advisoriesAvailable: boolean;
|
|
58
|
+
/** Early-access message when no advisories are in the database */
|
|
59
|
+
message?: string;
|
|
60
|
+
/** Counts by severity (only present when advisoriesAvailable: true) */
|
|
61
|
+
summary?: AdvisorySummary;
|
|
62
|
+
/** Per-advisory details (only present when advisoriesAvailable: true) */
|
|
63
|
+
advisories?: AdvisoryEntry[];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* MCP tool definition for skill_audit
|
|
67
|
+
*/
|
|
68
|
+
export declare const skillAuditToolSchema: {
|
|
69
|
+
name: "skill_audit";
|
|
70
|
+
description: string;
|
|
71
|
+
inputSchema: {
|
|
72
|
+
type: "object";
|
|
73
|
+
properties: {
|
|
74
|
+
skillIds: {
|
|
75
|
+
type: string;
|
|
76
|
+
items: {
|
|
77
|
+
type: string;
|
|
78
|
+
};
|
|
79
|
+
description: string;
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
required: never[];
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Execute the skill_audit tool.
|
|
87
|
+
*
|
|
88
|
+
* Reads active advisories from skill_advisories table (migration v6).
|
|
89
|
+
* When the table is empty, returns an early-access message instead of
|
|
90
|
+
* an empty result so users understand the system is operational but
|
|
91
|
+
* advisory data has not yet been synced.
|
|
92
|
+
*
|
|
93
|
+
* @param input Validated tool input
|
|
94
|
+
* @param context Tool context with database connection
|
|
95
|
+
* @returns SkillAuditResponse with advisory data or early-access message
|
|
96
|
+
*/
|
|
97
|
+
export declare function executeSkillAudit(input: SkillAuditInput, context: ToolContext): Promise<SkillAuditResponse>;
|
|
98
|
+
//# sourceMappingURL=skill-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-audit.d.ts","sourceRoot":"","sources":["../../../src/tools/skill-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAMhD;;GAEG;AACH,eAAO,MAAM,qBAAqB;IAChC,2DAA2D;;;;;;EAK3D,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEnE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,wBAAwB;IACxB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAA;IAChD,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAA;IACV,6CAA6C;IAC7C,YAAY,EAAE,OAAO,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,2CAA2C;IAC3C,mBAAmB,EAAE,OAAO,CAAA;IAC5B,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,uEAAuE;IACvE,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,yEAAyE;IACzE,UAAU,CAAC,EAAE,aAAa,EAAE,CAAA;CAC7B;AAMD;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;CAmBhC,CAAA;AAMD;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,kBAAkB,CAAC,CA0C7B"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview skill_audit MCP tool — check skills for security advisories
|
|
3
|
+
* @module @skillsmith/mcp-server/tools/skill-audit
|
|
4
|
+
* @see SMI-skill-version-tracking Wave 3
|
|
5
|
+
*
|
|
6
|
+
* Returns a summary of active security advisories for installed skills.
|
|
7
|
+
* The advisory system is in early access — advisories are published by the
|
|
8
|
+
* Skillsmith team as security issues are identified.
|
|
9
|
+
*
|
|
10
|
+
* Tier gate: Team (skill_security_audit feature flag).
|
|
11
|
+
* Community and Individual users receive a graceful license error response.
|
|
12
|
+
*/
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
import { AdvisoryRepository } from '@skillsmith/core';
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Input / Output types
|
|
17
|
+
// ============================================================================
|
|
18
|
+
/**
|
|
19
|
+
* Input schema for skill_audit tool
|
|
20
|
+
*/
|
|
21
|
+
export const skillAuditInputSchema = z.object({
|
|
22
|
+
/** Optional filter — check only the specified skill IDs */
|
|
23
|
+
skillIds: z
|
|
24
|
+
.array(z.string().min(1))
|
|
25
|
+
.optional()
|
|
26
|
+
.describe('Specific skill IDs to audit (omit to audit all skills with advisories)'),
|
|
27
|
+
});
|
|
28
|
+
// ============================================================================
|
|
29
|
+
// Tool schema (MCP tool definition)
|
|
30
|
+
// ============================================================================
|
|
31
|
+
/**
|
|
32
|
+
* MCP tool definition for skill_audit
|
|
33
|
+
*/
|
|
34
|
+
export const skillAuditToolSchema = {
|
|
35
|
+
name: 'skill_audit',
|
|
36
|
+
description: 'Check installed skills for known security advisories. ' +
|
|
37
|
+
'Requires Team tier or higher (skill_security_audit feature). ' +
|
|
38
|
+
'The advisory system is in early access — the Skillsmith team publishes advisories ' +
|
|
39
|
+
'as security issues are identified. Run `skillsmith sync` to fetch the latest advisories.',
|
|
40
|
+
inputSchema: {
|
|
41
|
+
type: 'object',
|
|
42
|
+
properties: {
|
|
43
|
+
skillIds: {
|
|
44
|
+
type: 'array',
|
|
45
|
+
items: { type: 'string' },
|
|
46
|
+
description: 'Specific skill IDs to audit (omit to return all skills with active advisories).',
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
required: [],
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
// ============================================================================
|
|
53
|
+
// Execution
|
|
54
|
+
// ============================================================================
|
|
55
|
+
/**
|
|
56
|
+
* Execute the skill_audit tool.
|
|
57
|
+
*
|
|
58
|
+
* Reads active advisories from skill_advisories table (migration v6).
|
|
59
|
+
* When the table is empty, returns an early-access message instead of
|
|
60
|
+
* an empty result so users understand the system is operational but
|
|
61
|
+
* advisory data has not yet been synced.
|
|
62
|
+
*
|
|
63
|
+
* @param input Validated tool input
|
|
64
|
+
* @param context Tool context with database connection
|
|
65
|
+
* @returns SkillAuditResponse with advisory data or early-access message
|
|
66
|
+
*/
|
|
67
|
+
export async function executeSkillAudit(input, context) {
|
|
68
|
+
const advisoryRepo = new AdvisoryRepository(context.db);
|
|
69
|
+
// Fetch advisories — filter by skillIds if provided
|
|
70
|
+
let advisories;
|
|
71
|
+
if (input.skillIds && input.skillIds.length > 0) {
|
|
72
|
+
advisories = input.skillIds.flatMap((id) => advisoryRepo.getAdvisoriesForSkill(id));
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
advisories = advisoryRepo.getActiveAdvisories();
|
|
76
|
+
}
|
|
77
|
+
// No advisories in DB — early-access message
|
|
78
|
+
if (advisories.length === 0) {
|
|
79
|
+
return {
|
|
80
|
+
advisoriesAvailable: false,
|
|
81
|
+
message: 'Advisory system is in early access — the Skillsmith team publishes advisories as ' +
|
|
82
|
+
'security issues are identified. Run `skillsmith sync` to fetch the latest.',
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// Build summary counts
|
|
86
|
+
const summary = { critical: 0, high: 0, medium: 0, low: 0, total: 0 };
|
|
87
|
+
for (const adv of advisories) {
|
|
88
|
+
summary[adv.severity]++;
|
|
89
|
+
summary.total++;
|
|
90
|
+
}
|
|
91
|
+
// Build per-advisory entries
|
|
92
|
+
const entries = advisories.map((adv) => ({
|
|
93
|
+
skillName: adv.skillId,
|
|
94
|
+
severity: adv.severity,
|
|
95
|
+
title: adv.title,
|
|
96
|
+
id: adv.id,
|
|
97
|
+
fixAvailable: Boolean(adv.patchedVersions),
|
|
98
|
+
}));
|
|
99
|
+
return {
|
|
100
|
+
advisoriesAvailable: true,
|
|
101
|
+
summary,
|
|
102
|
+
advisories: entries,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=skill-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-audit.js","sourceRoot":"","sources":["../../../src/tools/skill-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAGrD,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,2DAA2D;IAC3D,QAAQ,EAAE,CAAC;SACR,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACxB,QAAQ,EAAE;SACV,QAAQ,CAAC,wEAAwE,CAAC;CACtF,CAAC,CAAA;AA6CF,+EAA+E;AAC/E,oCAAoC;AACpC,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,aAAsB;IAC5B,WAAW,EACT,wDAAwD;QACxD,+DAA+D;QAC/D,oFAAoF;QACpF,0FAA0F;IAC5F,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EACT,iFAAiF;aACpF;SACF;QACD,QAAQ,EAAE,EAAE;KACb;CACF,CAAA;AAED,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAsB,EACtB,OAAoB;IAEpB,MAAM,YAAY,GAAG,IAAI,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAEvD,oDAAoD;IACpD,IAAI,UAAU,CAAA;IACd,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAA;IACrF,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,YAAY,CAAC,mBAAmB,EAAE,CAAA;IACjD,CAAC;IAED,6CAA6C;IAC7C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,mBAAmB,EAAE,KAAK;YAC1B,OAAO,EACL,mFAAmF;gBACnF,4EAA4E;SAC/E,CAAA;IACH,CAAC;IAED,uBAAuB;IACvB,MAAM,OAAO,GAAoB,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;IACtF,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAA;QACvB,OAAO,CAAC,KAAK,EAAE,CAAA;IACjB,CAAC;IAED,6BAA6B;IAC7B,MAAM,OAAO,GAAoB,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxD,SAAS,EAAE,GAAG,CAAC,OAAO;QACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;KAC3C,CAAC,CAAC,CAAA;IAEH,OAAO;QACL,mBAAmB,EAAE,IAAI;QACzB,OAAO;QACP,UAAU,EAAE,OAAO;KACpB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-audit.test.d.ts","sourceRoot":"","sources":["../../../src/tools/skill-audit.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Unit tests for skill_audit MCP tool
|
|
3
|
+
* @see SMI-skill-version-tracking Wave 3
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
6
|
+
import { AdvisoryRepository } from '@skillsmith/core';
|
|
7
|
+
import { createTestDatabase, closeDatabase } from '../../../core/tests/helpers/database.js';
|
|
8
|
+
import { executeSkillAudit } from './skill-audit.js';
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Helpers
|
|
11
|
+
// ============================================================================
|
|
12
|
+
function makeAdvisory(overrides = {}) {
|
|
13
|
+
return {
|
|
14
|
+
id: 'SSA-2026-001',
|
|
15
|
+
skillId: 'community/commit-helper',
|
|
16
|
+
severity: 'high',
|
|
17
|
+
title: 'Prompt injection in commit-helper',
|
|
18
|
+
description: 'A security advisory for testing.',
|
|
19
|
+
publishedAt: '2026-01-15T00:00:00Z',
|
|
20
|
+
...overrides,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function makeContext(db) {
|
|
24
|
+
return { db };
|
|
25
|
+
}
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// Tests
|
|
28
|
+
// ============================================================================
|
|
29
|
+
describe('executeSkillAudit', () => {
|
|
30
|
+
let db;
|
|
31
|
+
let advisoryRepo;
|
|
32
|
+
beforeEach(() => {
|
|
33
|
+
db = createTestDatabase();
|
|
34
|
+
advisoryRepo = new AdvisoryRepository(db);
|
|
35
|
+
});
|
|
36
|
+
afterEach(() => {
|
|
37
|
+
closeDatabase(db);
|
|
38
|
+
});
|
|
39
|
+
// --------------------------------------------------------------------------
|
|
40
|
+
// Empty database — early-access message
|
|
41
|
+
// --------------------------------------------------------------------------
|
|
42
|
+
it('returns advisoriesAvailable: false with early-access message when DB has no advisories', async () => {
|
|
43
|
+
const result = await executeSkillAudit({}, makeContext(db));
|
|
44
|
+
expect(result.advisoriesAvailable).toBe(false);
|
|
45
|
+
expect(result.message).toContain('early access');
|
|
46
|
+
expect(result.message).toContain('skillsmith sync');
|
|
47
|
+
expect(result.summary).toBeUndefined();
|
|
48
|
+
expect(result.advisories).toBeUndefined();
|
|
49
|
+
});
|
|
50
|
+
// --------------------------------------------------------------------------
|
|
51
|
+
// With advisories
|
|
52
|
+
// --------------------------------------------------------------------------
|
|
53
|
+
it('returns advisoriesAvailable: true with summary and entries when advisories exist', async () => {
|
|
54
|
+
advisoryRepo.upsertAdvisory(makeAdvisory({ id: 'SSA-2026-001', severity: 'critical' }));
|
|
55
|
+
advisoryRepo.upsertAdvisory(makeAdvisory({ id: 'SSA-2026-002', severity: 'high', skillId: 'community/other-skill' }));
|
|
56
|
+
const result = await executeSkillAudit({}, makeContext(db));
|
|
57
|
+
expect(result.advisoriesAvailable).toBe(true);
|
|
58
|
+
expect(result.message).toBeUndefined();
|
|
59
|
+
expect(result.summary).toBeDefined();
|
|
60
|
+
expect(result.summary.total).toBe(2);
|
|
61
|
+
expect(result.summary.critical).toBe(1);
|
|
62
|
+
expect(result.summary.high).toBe(1);
|
|
63
|
+
expect(result.summary.medium).toBe(0);
|
|
64
|
+
expect(result.summary.low).toBe(0);
|
|
65
|
+
expect(result.advisories).toHaveLength(2);
|
|
66
|
+
});
|
|
67
|
+
it('sets fixAvailable: true when patchedVersions is present', async () => {
|
|
68
|
+
advisoryRepo.upsertAdvisory(makeAdvisory({ patchedVersions: '[">=1.2.0"]' }));
|
|
69
|
+
const result = await executeSkillAudit({}, makeContext(db));
|
|
70
|
+
expect(result.advisories[0].fixAvailable).toBe(true);
|
|
71
|
+
});
|
|
72
|
+
it('sets fixAvailable: false when patchedVersions is absent', async () => {
|
|
73
|
+
advisoryRepo.upsertAdvisory(makeAdvisory());
|
|
74
|
+
const result = await executeSkillAudit({}, makeContext(db));
|
|
75
|
+
expect(result.advisories[0].fixAvailable).toBe(false);
|
|
76
|
+
});
|
|
77
|
+
// --------------------------------------------------------------------------
|
|
78
|
+
// skillIds filter
|
|
79
|
+
// --------------------------------------------------------------------------
|
|
80
|
+
it('filters by skillIds when provided', async () => {
|
|
81
|
+
advisoryRepo.upsertAdvisory(makeAdvisory({ id: 'SSA-2026-010', skillId: 'community/skill-a' }));
|
|
82
|
+
advisoryRepo.upsertAdvisory(makeAdvisory({ id: 'SSA-2026-011', skillId: 'community/skill-b' }));
|
|
83
|
+
const result = await executeSkillAudit({ skillIds: ['community/skill-a'] }, makeContext(db));
|
|
84
|
+
expect(result.advisoriesAvailable).toBe(true);
|
|
85
|
+
expect(result.advisories).toHaveLength(1);
|
|
86
|
+
expect(result.advisories[0].skillName).toBe('community/skill-a');
|
|
87
|
+
});
|
|
88
|
+
it('returns early-access message when skillIds filter matches no advisories', async () => {
|
|
89
|
+
advisoryRepo.upsertAdvisory(makeAdvisory({ skillId: 'community/skill-a' }));
|
|
90
|
+
const result = await executeSkillAudit({ skillIds: ['community/nonexistent'] }, makeContext(db));
|
|
91
|
+
expect(result.advisoriesAvailable).toBe(false);
|
|
92
|
+
expect(result.message).toContain('early access');
|
|
93
|
+
});
|
|
94
|
+
// --------------------------------------------------------------------------
|
|
95
|
+
// Withdrawn advisories excluded
|
|
96
|
+
// --------------------------------------------------------------------------
|
|
97
|
+
it('excludes withdrawn advisories from results', async () => {
|
|
98
|
+
advisoryRepo.upsertAdvisory(makeAdvisory({ id: 'SSA-2026-020' }));
|
|
99
|
+
advisoryRepo.withdrawAdvisory('SSA-2026-020');
|
|
100
|
+
const result = await executeSkillAudit({}, makeContext(db));
|
|
101
|
+
expect(result.advisoriesAvailable).toBe(false);
|
|
102
|
+
});
|
|
103
|
+
// --------------------------------------------------------------------------
|
|
104
|
+
// Advisory entry fields
|
|
105
|
+
// --------------------------------------------------------------------------
|
|
106
|
+
it('maps advisory fields correctly to entry shape', async () => {
|
|
107
|
+
advisoryRepo.upsertAdvisory(makeAdvisory({
|
|
108
|
+
id: 'SSA-2026-030',
|
|
109
|
+
skillId: 'community/commit-helper',
|
|
110
|
+
severity: 'critical',
|
|
111
|
+
title: 'Test advisory',
|
|
112
|
+
}));
|
|
113
|
+
const result = await executeSkillAudit({}, makeContext(db));
|
|
114
|
+
const entry = result.advisories[0];
|
|
115
|
+
expect(entry.id).toBe('SSA-2026-030');
|
|
116
|
+
expect(entry.skillName).toBe('community/commit-helper');
|
|
117
|
+
expect(entry.severity).toBe('critical');
|
|
118
|
+
expect(entry.title).toBe('Test advisory');
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=skill-audit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-audit.test.js","sourceRoot":"","sources":["../../../src/tools/skill-audit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview skill_diff MCP tool — section-level diff between skill versions
|
|
3
|
+
* @module @skillsmith/mcp-server/tools/skill-diff
|
|
4
|
+
* @see SMI-skill-version-tracking Wave 2
|
|
5
|
+
*
|
|
6
|
+
* Returns a structured JSON diff of heading-level (H2/H3) sections between
|
|
7
|
+
* the locally-installed SKILL.md and the latest version recorded in the
|
|
8
|
+
* skill_versions table. Avoids raw unified diffs — human language is used
|
|
9
|
+
* for section names instead.
|
|
10
|
+
*
|
|
11
|
+
* Tier gate: Individual (version_tracking feature flag).
|
|
12
|
+
*/
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
import type { ToolContext } from '../context.js';
|
|
15
|
+
/** Input schema for skill_diff tool */
|
|
16
|
+
export declare const skillDiffInputSchema: z.ZodObject<{
|
|
17
|
+
skillId: z.ZodString;
|
|
18
|
+
oldContent: z.ZodString;
|
|
19
|
+
newContent: z.ZodString;
|
|
20
|
+
oldRiskScore: z.ZodOptional<z.ZodNumber>;
|
|
21
|
+
newRiskScore: z.ZodOptional<z.ZodNumber>;
|
|
22
|
+
hasLocalModifications: z.ZodDefault<z.ZodBoolean>;
|
|
23
|
+
trustTier: z.ZodDefault<z.ZodEnum<["verified", "community", "experimental"]>>;
|
|
24
|
+
}, "strip", z.ZodTypeAny, {
|
|
25
|
+
trustTier: "verified" | "community" | "experimental";
|
|
26
|
+
skillId: string;
|
|
27
|
+
oldContent: string;
|
|
28
|
+
newContent: string;
|
|
29
|
+
hasLocalModifications: boolean;
|
|
30
|
+
oldRiskScore?: number | undefined;
|
|
31
|
+
newRiskScore?: number | undefined;
|
|
32
|
+
}, {
|
|
33
|
+
skillId: string;
|
|
34
|
+
oldContent: string;
|
|
35
|
+
newContent: string;
|
|
36
|
+
trustTier?: "verified" | "community" | "experimental" | undefined;
|
|
37
|
+
oldRiskScore?: number | undefined;
|
|
38
|
+
newRiskScore?: number | undefined;
|
|
39
|
+
hasLocalModifications?: boolean | undefined;
|
|
40
|
+
}>;
|
|
41
|
+
export type SkillDiffInput = z.infer<typeof skillDiffInputSchema>;
|
|
42
|
+
/** Structured section-level diff response */
|
|
43
|
+
export interface SkillDiffResponse {
|
|
44
|
+
skill: string;
|
|
45
|
+
changeType: 'major' | 'minor' | 'patch' | 'unknown';
|
|
46
|
+
sectionsAdded: string[];
|
|
47
|
+
sectionsRemoved: string[];
|
|
48
|
+
sectionsModified: string[];
|
|
49
|
+
riskScoreDelta: number | null;
|
|
50
|
+
changelog: string | null;
|
|
51
|
+
recommendation: 'auto-update' | 'review-then-update' | 'manual-review-required';
|
|
52
|
+
}
|
|
53
|
+
export declare const skillDiffToolSchema: {
|
|
54
|
+
name: "skill_diff";
|
|
55
|
+
description: string;
|
|
56
|
+
inputSchema: {
|
|
57
|
+
type: "object";
|
|
58
|
+
properties: {
|
|
59
|
+
skillId: {
|
|
60
|
+
type: string;
|
|
61
|
+
description: string;
|
|
62
|
+
};
|
|
63
|
+
oldContent: {
|
|
64
|
+
type: string;
|
|
65
|
+
description: string;
|
|
66
|
+
};
|
|
67
|
+
newContent: {
|
|
68
|
+
type: string;
|
|
69
|
+
description: string;
|
|
70
|
+
};
|
|
71
|
+
oldRiskScore: {
|
|
72
|
+
type: string;
|
|
73
|
+
description: string;
|
|
74
|
+
};
|
|
75
|
+
newRiskScore: {
|
|
76
|
+
type: string;
|
|
77
|
+
description: string;
|
|
78
|
+
};
|
|
79
|
+
hasLocalModifications: {
|
|
80
|
+
type: string;
|
|
81
|
+
description: string;
|
|
82
|
+
};
|
|
83
|
+
trustTier: {
|
|
84
|
+
type: string;
|
|
85
|
+
enum: string[];
|
|
86
|
+
description: string;
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
required: string[];
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Execute the skill_diff tool.
|
|
94
|
+
*
|
|
95
|
+
* Computes a section-level diff using heading analysis and delegates change
|
|
96
|
+
* classification and risk scoring to core utilities.
|
|
97
|
+
*
|
|
98
|
+
* @param input Validated tool input
|
|
99
|
+
* @param _context Tool context (unused — diff is purely content-based)
|
|
100
|
+
* @returns SkillDiffResponse with section diff and risk recommendation
|
|
101
|
+
*/
|
|
102
|
+
export declare function executeSkillDiff(input: SkillDiffInput, _context: ToolContext): Promise<SkillDiffResponse>;
|
|
103
|
+
/**
|
|
104
|
+
* Format a SkillDiffResponse as human-readable text
|
|
105
|
+
*/
|
|
106
|
+
export declare function formatSkillDiffResults(response: SkillDiffResponse): string;
|
|
107
|
+
//# sourceMappingURL=skill-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-diff.d.ts","sourceRoot":"","sources":["../../../src/tools/skill-diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAMhD,uCAAuC;AACvC,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;EA0B/B,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEjE,6CAA6C;AAC7C,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAA;IACnD,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,cAAc,EAAE,aAAa,GAAG,oBAAoB,GAAG,wBAAwB,CAAA;CAChF;AAMD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0C/B,CAAA;AA8GD;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAiD5B;AAMD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CAgC1E"}
|