@skillsmith/mcp-server 0.4.3 → 0.4.4
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 -1
- package/dist/src/context.async.d.ts.map +1 -1
- package/dist/src/context.async.js +3 -1
- package/dist/src/context.async.js.map +1 -1
- package/dist/src/context.d.ts.map +1 -1
- package/dist/src/context.js +3 -1
- package/dist/src/context.js.map +1 -1
- package/dist/src/context.types.d.ts +3 -1
- package/dist/src/context.types.d.ts.map +1 -1
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/middleware/toolFeatureMapping.d.ts.map +1 -1
- package/dist/src/middleware/toolFeatureMapping.js +2 -0
- package/dist/src/middleware/toolFeatureMapping.js.map +1 -1
- package/dist/src/tool-dispatch.d.ts.map +1 -1
- package/dist/src/tool-dispatch.js +15 -0
- package/dist/src/tool-dispatch.js.map +1 -1
- package/dist/src/tools/compare.types.d.ts +5 -1
- package/dist/src/tools/compare.types.d.ts.map +1 -1
- package/dist/src/tools/compare.types.js.map +1 -1
- package/dist/src/tools/get-skill.d.ts.map +1 -1
- package/dist/src/tools/get-skill.js +16 -0
- package/dist/src/tools/get-skill.js.map +1 -1
- package/dist/src/tools/index.d.ts +2 -0
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +2 -0
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/install.d.ts +4 -23
- package/dist/src/tools/install.d.ts.map +1 -1
- package/dist/src/tools/install.dep-helpers.d.ts +41 -0
- package/dist/src/tools/install.dep-helpers.d.ts.map +1 -0
- package/dist/src/tools/install.dep-helpers.js +68 -0
- package/dist/src/tools/install.dep-helpers.js.map +1 -0
- package/dist/src/tools/install.dep-helpers.test.d.ts +6 -0
- package/dist/src/tools/install.dep-helpers.test.d.ts.map +1 -0
- package/dist/src/tools/install.dep-helpers.test.js +109 -0
- package/dist/src/tools/install.dep-helpers.test.js.map +1 -0
- package/dist/src/tools/install.js +27 -35
- package/dist/src/tools/install.js.map +1 -1
- package/dist/src/tools/install.types.d.ts +7 -0
- package/dist/src/tools/install.types.d.ts.map +1 -1
- package/dist/src/tools/install.types.js.map +1 -1
- package/dist/src/tools/outdated.d.ts +101 -0
- package/dist/src/tools/outdated.d.ts.map +1 -0
- package/dist/src/tools/outdated.js +214 -0
- package/dist/src/tools/outdated.js.map +1 -0
- package/dist/src/tools/outdated.test.d.ts +6 -0
- package/dist/src/tools/outdated.test.d.ts.map +1 -0
- package/dist/src/tools/outdated.test.js +287 -0
- package/dist/src/tools/outdated.test.js.map +1 -0
- package/dist/src/tools/recommend.types.d.ts +3 -3
- package/dist/src/tools/skill-diff.d.ts +2 -2
- package/dist/src/tools/skill-pack-audit.d.ts +96 -0
- package/dist/src/tools/skill-pack-audit.d.ts.map +1 -0
- package/dist/src/tools/skill-pack-audit.js +183 -0
- package/dist/src/tools/skill-pack-audit.js.map +1 -0
- package/dist/src/tools/suggest.d.ts +4 -4
- package/dist/src/tools/uninstall.d.ts +1 -1
- package/dist/src/tools/uninstall.d.ts.map +1 -1
- package/dist/src/tools/uninstall.js +9 -0
- package/dist/src/tools/uninstall.js.map +1 -1
- package/dist/src/tools/validate.d.ts.map +1 -1
- package/dist/src/tools/validate.dep.test.d.ts +6 -0
- package/dist/src/tools/validate.dep.test.d.ts.map +1 -0
- package/dist/src/tools/validate.dep.test.js +77 -0
- package/dist/src/tools/validate.dep.test.js.map +1 -0
- package/dist/src/tools/validate.helpers.d.ts +12 -0
- package/dist/src/tools/validate.helpers.d.ts.map +1 -1
- package/dist/src/tools/validate.helpers.js +59 -19
- package/dist/src/tools/validate.helpers.js.map +1 -1
- package/dist/src/tools/validate.js +3 -1
- package/dist/src/tools/validate.js.map +1 -1
- package/dist/tests/integration/recommend.integration.test.js +1 -0
- package/dist/tests/integration/recommend.integration.test.js.map +1 -1
- package/dist/tests/integration/setup.d.ts +2 -1
- package/dist/tests/integration/setup.d.ts.map +1 -1
- package/dist/tests/integration/setup.js +3 -1
- package/dist/tests/integration/setup.js.map +1 -1
- package/dist/tests/integration/validate.integration.test.js +4 -2
- package/dist/tests/integration/validate.integration.test.js.map +1 -1
- package/dist/tests/recommend.test.js +1 -0
- package/dist/tests/recommend.test.js.map +1 -1
- package/dist/tests/unit/skill-pack-audit.test.d.ts +8 -0
- package/dist/tests/unit/skill-pack-audit.test.d.ts.map +1 -0
- package/dist/tests/unit/skill-pack-audit.test.js +342 -0
- package/dist/tests/unit/skill-pack-audit.test.js.map +1 -0
- package/dist/tests/unit/validate-helpers.test.js +47 -4
- package/dist/tests/unit/validate-helpers.test.js.map +1 -1
- package/dist/tests/validate.test.js +4 -0
- package/dist/tests/validate.test.js.map +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview skill_pack_audit MCP tool — detect version drift in a skill pack
|
|
3
|
+
* @module @skillsmith/mcp-server/tools/skill-pack-audit
|
|
4
|
+
* @see SMI-2905: Skill registry version drift detection
|
|
5
|
+
*
|
|
6
|
+
* Scans a skill pack directory (pack_path/skills/{name}/SKILL.md), reads each
|
|
7
|
+
* skill's bundled version: frontmatter, and compares it against the latest
|
|
8
|
+
* semver recorded in the local skill_versions registry cache.
|
|
9
|
+
*
|
|
10
|
+
* Status values:
|
|
11
|
+
* - current — bundled version matches registry
|
|
12
|
+
* - outdated — registry has a newer version
|
|
13
|
+
* - ahead — bundled version is newer than registry cache
|
|
14
|
+
* - no_registry_data — skill not found in local skill_versions cache
|
|
15
|
+
* - missing_version — SKILL.md has no valid version: field
|
|
16
|
+
*
|
|
17
|
+
* Tier gate: Individual (version_tracking feature flag).
|
|
18
|
+
* Community users see a graceful license error response, never a hard throw.
|
|
19
|
+
*/
|
|
20
|
+
import { z } from 'zod';
|
|
21
|
+
import type { ToolContext } from '../context.js';
|
|
22
|
+
/**
|
|
23
|
+
* Input schema for skill_pack_audit tool
|
|
24
|
+
*/
|
|
25
|
+
export declare const skillPackAuditInputSchema: z.ZodObject<{
|
|
26
|
+
pack_path: z.ZodString;
|
|
27
|
+
}, "strip", z.ZodTypeAny, {
|
|
28
|
+
pack_path: string;
|
|
29
|
+
}, {
|
|
30
|
+
pack_path: string;
|
|
31
|
+
}>;
|
|
32
|
+
export type SkillPackAuditInput = z.infer<typeof skillPackAuditInputSchema>;
|
|
33
|
+
/**
|
|
34
|
+
* Drift status for a single skill in the pack
|
|
35
|
+
*/
|
|
36
|
+
export type PackSkillStatus = 'current' | 'outdated' | 'ahead' | 'no_registry_data' | 'missing_version';
|
|
37
|
+
/**
|
|
38
|
+
* Per-skill audit result
|
|
39
|
+
*/
|
|
40
|
+
export interface PackSkillEntry {
|
|
41
|
+
/** Skill name from SKILL.md frontmatter (falls back to directory name) */
|
|
42
|
+
name: string;
|
|
43
|
+
/** Version string from the pack's SKILL.md frontmatter, or null if absent */
|
|
44
|
+
bundledVersion: string | null;
|
|
45
|
+
/** Latest semver from the local skill_versions registry cache, or null */
|
|
46
|
+
registryVersion: string | null;
|
|
47
|
+
/** Registry skill identifier (e.g. "author/skill-name") or null if not found */
|
|
48
|
+
skillId: string | null;
|
|
49
|
+
/** Drift status */
|
|
50
|
+
status: PackSkillStatus;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Full response from skill_pack_audit tool
|
|
54
|
+
*/
|
|
55
|
+
export interface SkillPackAuditResponse {
|
|
56
|
+
/** Resolved absolute path to the pack */
|
|
57
|
+
packPath: string;
|
|
58
|
+
/** Total number of skills found in the pack */
|
|
59
|
+
skillCount: number;
|
|
60
|
+
/** Number of skills where bundled version differs from registry (outdated + ahead) */
|
|
61
|
+
driftCount: number;
|
|
62
|
+
/** Number of skills not found in the local registry cache */
|
|
63
|
+
noRegistryDataCount: number;
|
|
64
|
+
/** Per-skill audit results, sorted alphabetically by name */
|
|
65
|
+
skills: PackSkillEntry[];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* MCP tool definition for skill_pack_audit
|
|
69
|
+
*/
|
|
70
|
+
export declare const skillPackAuditToolSchema: {
|
|
71
|
+
name: "skill_pack_audit";
|
|
72
|
+
description: string;
|
|
73
|
+
inputSchema: {
|
|
74
|
+
type: "object";
|
|
75
|
+
properties: {
|
|
76
|
+
pack_path: {
|
|
77
|
+
type: string;
|
|
78
|
+
description: string;
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
required: string[];
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Execute the skill_pack_audit tool.
|
|
86
|
+
*
|
|
87
|
+
* Scans pack_path/skills/{name}/SKILL.md, parses each skill's name and version
|
|
88
|
+
* from frontmatter, and compares the bundled version against the most recently
|
|
89
|
+
* recorded semver in the local skill_versions table (matched by skill name suffix).
|
|
90
|
+
*
|
|
91
|
+
* @param input Validated tool input
|
|
92
|
+
* @param context Tool context with database connection
|
|
93
|
+
* @returns SkillPackAuditResponse with per-skill drift status
|
|
94
|
+
*/
|
|
95
|
+
export declare function executeSkillPackAudit(input: SkillPackAuditInput, context: ToolContext): Promise<SkillPackAuditResponse>;
|
|
96
|
+
//# sourceMappingURL=skill-pack-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-pack-audit.d.ts","sourceRoot":"","sources":["../../../src/tools/skill-pack-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAMhD;;GAEG;AACH,eAAO,MAAM,yBAAyB;;;;;;EAQpC,CAAA;AAEF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAE3E;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,UAAU,GACV,OAAO,GACP,kBAAkB,GAClB,iBAAiB,CAAA;AAErB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAA;IACZ,6EAA6E;IAC7E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,0EAA0E;IAC1E,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,gFAAgF;IAChF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,mBAAmB;IACnB,MAAM,EAAE,eAAe,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAA;IAChB,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAA;IAClB,sFAAsF;IACtF,UAAU,EAAE,MAAM,CAAA;IAClB,6DAA6D;IAC7D,mBAAmB,EAAE,MAAM,CAAA;IAC3B,6DAA6D;IAC7D,MAAM,EAAE,cAAc,EAAE,CAAA;CACzB;AAMD;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;CAkBpC,CAAA;AA4BD;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,mBAAmB,EAC1B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,sBAAsB,CAAC,CAuGjC"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview skill_pack_audit MCP tool — detect version drift in a skill pack
|
|
3
|
+
* @module @skillsmith/mcp-server/tools/skill-pack-audit
|
|
4
|
+
* @see SMI-2905: Skill registry version drift detection
|
|
5
|
+
*
|
|
6
|
+
* Scans a skill pack directory (pack_path/skills/{name}/SKILL.md), reads each
|
|
7
|
+
* skill's bundled version: frontmatter, and compares it against the latest
|
|
8
|
+
* semver recorded in the local skill_versions registry cache.
|
|
9
|
+
*
|
|
10
|
+
* Status values:
|
|
11
|
+
* - current — bundled version matches registry
|
|
12
|
+
* - outdated — registry has a newer version
|
|
13
|
+
* - ahead — bundled version is newer than registry cache
|
|
14
|
+
* - no_registry_data — skill not found in local skill_versions cache
|
|
15
|
+
* - missing_version — SKILL.md has no valid version: field
|
|
16
|
+
*
|
|
17
|
+
* Tier gate: Individual (version_tracking feature flag).
|
|
18
|
+
* Community users see a graceful license error response, never a hard throw.
|
|
19
|
+
*/
|
|
20
|
+
import { z } from 'zod';
|
|
21
|
+
import { promises as fs } from 'fs';
|
|
22
|
+
import { join, resolve, sep } from 'path';
|
|
23
|
+
import { SkillsmithError, ErrorCodes } from '@skillsmith/core';
|
|
24
|
+
import { parseYamlFrontmatter, hasPathTraversal } from './validate.helpers.js';
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Input / Output types
|
|
27
|
+
// ============================================================================
|
|
28
|
+
/**
|
|
29
|
+
* Input schema for skill_pack_audit tool
|
|
30
|
+
*/
|
|
31
|
+
export const skillPackAuditInputSchema = z.object({
|
|
32
|
+
pack_path: z
|
|
33
|
+
.string()
|
|
34
|
+
.min(1)
|
|
35
|
+
.describe('Absolute path to the skill pack root directory. ' +
|
|
36
|
+
'Must contain a skills/ subdirectory with skill folders each containing SKILL.md.'),
|
|
37
|
+
});
|
|
38
|
+
// ============================================================================
|
|
39
|
+
// Tool schema (MCP tool definition)
|
|
40
|
+
// ============================================================================
|
|
41
|
+
/**
|
|
42
|
+
* MCP tool definition for skill_pack_audit
|
|
43
|
+
*/
|
|
44
|
+
export const skillPackAuditToolSchema = {
|
|
45
|
+
name: 'skill_pack_audit',
|
|
46
|
+
description: 'Audit a skill pack directory for version drift by comparing each bundled SKILL.md ' +
|
|
47
|
+
'version against the Skillsmith registry cache. Reports which skills are current, ' +
|
|
48
|
+
'outdated, ahead, or missing from the registry. ' +
|
|
49
|
+
'Requires Individual tier or higher.',
|
|
50
|
+
inputSchema: {
|
|
51
|
+
type: 'object',
|
|
52
|
+
properties: {
|
|
53
|
+
pack_path: {
|
|
54
|
+
type: 'string',
|
|
55
|
+
description: 'Absolute path to the skill pack root directory (must contain a skills/ subdirectory).',
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
required: ['pack_path'],
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
// ============================================================================
|
|
62
|
+
// Internal helpers
|
|
63
|
+
// ============================================================================
|
|
64
|
+
/**
|
|
65
|
+
* Compare two semver strings.
|
|
66
|
+
* Returns: 1 if a > b, -1 if a < b, 0 if equal.
|
|
67
|
+
* Both inputs must be valid "X.Y.Z" semver strings.
|
|
68
|
+
*/
|
|
69
|
+
function compareSemver(a, b) {
|
|
70
|
+
const pa = a.split('.').map(Number);
|
|
71
|
+
const pb = b.split('.').map(Number);
|
|
72
|
+
for (let i = 0; i < 3; i++) {
|
|
73
|
+
if ((pa[i] ?? 0) > (pb[i] ?? 0))
|
|
74
|
+
return 1;
|
|
75
|
+
if ((pa[i] ?? 0) < (pb[i] ?? 0))
|
|
76
|
+
return -1;
|
|
77
|
+
}
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
/** Semver validation regex — matches only X.Y.Z (no pre-release) */
|
|
81
|
+
const SEMVER_RE = /^\d+\.\d+\.\d+$/;
|
|
82
|
+
// ============================================================================
|
|
83
|
+
// Execution
|
|
84
|
+
// ============================================================================
|
|
85
|
+
/**
|
|
86
|
+
* Execute the skill_pack_audit tool.
|
|
87
|
+
*
|
|
88
|
+
* Scans pack_path/skills/{name}/SKILL.md, parses each skill's name and version
|
|
89
|
+
* from frontmatter, and compares the bundled version against the most recently
|
|
90
|
+
* recorded semver in the local skill_versions table (matched by skill name suffix).
|
|
91
|
+
*
|
|
92
|
+
* @param input Validated tool input
|
|
93
|
+
* @param context Tool context with database connection
|
|
94
|
+
* @returns SkillPackAuditResponse with per-skill drift status
|
|
95
|
+
*/
|
|
96
|
+
export async function executeSkillPackAudit(input, context) {
|
|
97
|
+
// Security: reject path traversal in the pack_path itself
|
|
98
|
+
if (hasPathTraversal(input.pack_path)) {
|
|
99
|
+
throw new SkillsmithError(ErrorCodes.VALIDATION_INVALID_TYPE, 'pack_path contains a path traversal pattern');
|
|
100
|
+
}
|
|
101
|
+
const packPath = resolve(input.pack_path);
|
|
102
|
+
const skillsDir = join(packPath, 'skills');
|
|
103
|
+
// Discover subdirectories in skills/
|
|
104
|
+
let skillDirNames;
|
|
105
|
+
try {
|
|
106
|
+
const entries = await fs.readdir(skillsDir, { withFileTypes: true });
|
|
107
|
+
skillDirNames = entries.filter((e) => e.isDirectory()).map((e) => e.name);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
throw new SkillsmithError(ErrorCodes.SKILL_NOT_FOUND, `No skills/ directory found at ${skillsDir}`);
|
|
111
|
+
}
|
|
112
|
+
if (skillDirNames.length > 500) {
|
|
113
|
+
throw new SkillsmithError(ErrorCodes.VALIDATION_INVALID_TYPE, `Pack contains ${skillDirNames.length} skill directories; maximum is 500`);
|
|
114
|
+
}
|
|
115
|
+
const skills = [];
|
|
116
|
+
for (const dirName of skillDirNames) {
|
|
117
|
+
const skillMdPath = join(skillsDir, dirName, 'SKILL.md');
|
|
118
|
+
let resolvedMdPath;
|
|
119
|
+
try {
|
|
120
|
+
resolvedMdPath = await fs.realpath(skillMdPath);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (!resolvedMdPath.startsWith(packPath + sep))
|
|
126
|
+
continue;
|
|
127
|
+
let content;
|
|
128
|
+
try {
|
|
129
|
+
content = await fs.readFile(resolvedMdPath, 'utf-8');
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const metadata = parseYamlFrontmatter(content);
|
|
135
|
+
const name = typeof metadata?.name === 'string' && metadata.name ? metadata.name : dirName;
|
|
136
|
+
const rawVersion = typeof metadata?.version === 'string' ? metadata.version : null;
|
|
137
|
+
const bundledVersion = rawVersion && SEMVER_RE.test(rawVersion) ? rawVersion : null;
|
|
138
|
+
// Look up the most recently recorded registry version for this skill name.
|
|
139
|
+
// skill_id format is "author/skill-name"; we match by name suffix.
|
|
140
|
+
// Escape LIKE special characters in name to prevent injection.
|
|
141
|
+
// Backslash must be escaped first (before adding backslash-prefixed escapes for % and _).
|
|
142
|
+
const escapedName = name.replace(/\\/g, '\\\\').replace(/%/g, '\\%').replace(/_/g, '\\_');
|
|
143
|
+
const row = context.db
|
|
144
|
+
.prepare(`SELECT skill_id, semver
|
|
145
|
+
FROM skill_versions
|
|
146
|
+
WHERE skill_id LIKE '%/' || ? ESCAPE '\\'
|
|
147
|
+
ORDER BY recorded_at DESC
|
|
148
|
+
LIMIT 1`)
|
|
149
|
+
.get(escapedName);
|
|
150
|
+
let status;
|
|
151
|
+
let registryVersion = null;
|
|
152
|
+
let skillId = null;
|
|
153
|
+
if (!bundledVersion) {
|
|
154
|
+
status = 'missing_version';
|
|
155
|
+
}
|
|
156
|
+
else if (!row || !row.semver || !SEMVER_RE.test(row.semver)) {
|
|
157
|
+
status = 'no_registry_data';
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
registryVersion = row.semver;
|
|
161
|
+
skillId = row.skill_id;
|
|
162
|
+
const cmp = compareSemver(bundledVersion, registryVersion);
|
|
163
|
+
if (cmp === 0)
|
|
164
|
+
status = 'current';
|
|
165
|
+
else if (cmp < 0)
|
|
166
|
+
status = 'outdated';
|
|
167
|
+
else
|
|
168
|
+
status = 'ahead';
|
|
169
|
+
}
|
|
170
|
+
skills.push({ name, bundledVersion, registryVersion, skillId, status });
|
|
171
|
+
}
|
|
172
|
+
skills.sort((a, b) => a.name.localeCompare(b.name));
|
|
173
|
+
const driftCount = skills.filter((s) => s.status === 'outdated' || s.status === 'ahead').length;
|
|
174
|
+
const noRegistryDataCount = skills.filter((s) => s.status === 'no_registry_data').length;
|
|
175
|
+
return {
|
|
176
|
+
packPath,
|
|
177
|
+
skillCount: skills.length,
|
|
178
|
+
driftCount,
|
|
179
|
+
noRegistryDataCount,
|
|
180
|
+
skills,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=skill-pack-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-pack-audit.js","sourceRoot":"","sources":["../../../src/tools/skill-pack-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAA;AACnC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAG9E,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CACP,kDAAkD;QAChD,kFAAkF,CACrF;CACJ,CAAC,CAAA;AA8CF,+EAA+E;AAC/E,oCAAoC;AACpC,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,IAAI,EAAE,kBAA2B;IACjC,WAAW,EACT,oFAAoF;QACpF,mFAAmF;QACnF,iDAAiD;QACjD,qCAAqC;IACvC,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,uFAAuF;aAC1F;SACF;QACD,QAAQ,EAAE,CAAC,WAAW,CAAC;KACxB;CACF,CAAA;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;;GAIG;AACH,SAAS,aAAa,CAAC,CAAS,EAAE,CAAS;IACzC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACnC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,CAAA;QACzC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,CAAA;IAC5C,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,oEAAoE;AACpE,MAAM,SAAS,GAAG,iBAAiB,CAAA;AAEnC,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAA0B,EAC1B,OAAoB;IAEpB,0DAA0D;IAC1D,IAAI,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,eAAe,CACvB,UAAU,CAAC,uBAAuB,EAClC,6CAA6C,CAC9C,CAAA;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAE1C,qCAAqC;IACrC,IAAI,aAAuB,CAAA;IAC3B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;QACpE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,eAAe,CACvB,UAAU,CAAC,eAAe,EAC1B,iCAAiC,SAAS,EAAE,CAC7C,CAAA;IACH,CAAC;IAED,IAAI,aAAa,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAC/B,MAAM,IAAI,eAAe,CACvB,UAAU,CAAC,uBAAuB,EAClC,iBAAiB,aAAa,CAAC,MAAM,oCAAoC,CAC1E,CAAA;IACH,CAAC;IAED,MAAM,MAAM,GAAqB,EAAE,CAAA;IAEnC,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;QAExD,IAAI,cAAsB,CAAA;QAC1B,IAAI,CAAC;YACH,cAAc,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,CAAC;YAAE,SAAQ;QAExD,IAAI,OAAe,CAAA;QACnB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,SAAQ;QACV,CAAC;QAED,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAA;QAC9C,MAAM,IAAI,GAAG,OAAO,QAAQ,EAAE,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAA;QAC1F,MAAM,UAAU,GAAG,OAAO,QAAQ,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;QAClF,MAAM,cAAc,GAAG,UAAU,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAA;QAEnF,2EAA2E;QAC3E,mEAAmE;QACnE,+DAA+D;QAC/D,0FAA0F;QAC1F,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACzF,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE;aACnB,OAAO,CACN;;;;kBAIU,CACX;aACA,GAAG,CAAC,WAAW,CAA4D,CAAA;QAE9E,IAAI,MAAuB,CAAA;QAC3B,IAAI,eAAe,GAAkB,IAAI,CAAA;QACzC,IAAI,OAAO,GAAkB,IAAI,CAAA;QAEjC,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,GAAG,iBAAiB,CAAA;QAC5B,CAAC;aAAM,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9D,MAAM,GAAG,kBAAkB,CAAA;QAC7B,CAAC;aAAM,CAAC;YACN,eAAe,GAAG,GAAG,CAAC,MAAM,CAAA;YAC5B,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAA;YACtB,MAAM,GAAG,GAAG,aAAa,CAAC,cAAc,EAAE,eAAe,CAAC,CAAA;YAC1D,IAAI,GAAG,KAAK,CAAC;gBAAE,MAAM,GAAG,SAAS,CAAA;iBAC5B,IAAI,GAAG,GAAG,CAAC;gBAAE,MAAM,GAAG,UAAU,CAAA;;gBAChC,MAAM,GAAG,OAAO,CAAA;QACvB,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;IACzE,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAEnD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM,CAAA;IAC/F,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,kBAAkB,CAAC,CAAC,MAAM,CAAA;IAExF,OAAO;QACL,QAAQ;QACR,UAAU,EAAE,MAAM,CAAC,MAAM;QACzB,UAAU;QACV,mBAAmB;QACnB,MAAM;KACP,CAAA;AACH,CAAC"}
|
|
@@ -45,20 +45,20 @@ export declare const suggestInputSchema: z.ZodObject<{
|
|
|
45
45
|
/** Session identifier (optional, for informational purposes) */
|
|
46
46
|
session_id: z.ZodDefault<z.ZodString>;
|
|
47
47
|
}, "strip", z.ZodTypeAny, {
|
|
48
|
-
project_path: string;
|
|
49
|
-
recent_commands: string[];
|
|
50
48
|
installed_skills: string[];
|
|
51
49
|
limit: number;
|
|
50
|
+
project_path: string;
|
|
51
|
+
recent_commands: string[];
|
|
52
52
|
session_id: string;
|
|
53
53
|
current_file?: string | undefined;
|
|
54
54
|
error_message?: string | undefined;
|
|
55
55
|
}, {
|
|
56
56
|
project_path: string;
|
|
57
|
+
installed_skills?: string[] | undefined;
|
|
58
|
+
limit?: number | undefined;
|
|
57
59
|
current_file?: string | undefined;
|
|
58
60
|
recent_commands?: string[] | undefined;
|
|
59
61
|
error_message?: string | undefined;
|
|
60
|
-
installed_skills?: string[] | undefined;
|
|
61
|
-
limit?: number | undefined;
|
|
62
62
|
session_id?: string | undefined;
|
|
63
63
|
}>;
|
|
64
64
|
/**
|
|
@@ -29,8 +29,8 @@ export declare const uninstallInputSchema: z.ZodObject<{
|
|
|
29
29
|
skillName: z.ZodString;
|
|
30
30
|
force: z.ZodDefault<z.ZodBoolean>;
|
|
31
31
|
}, "strip", z.ZodTypeAny, {
|
|
32
|
-
skillName: string;
|
|
33
32
|
force: boolean;
|
|
33
|
+
skillName: string;
|
|
34
34
|
}, {
|
|
35
35
|
skillName: string;
|
|
36
36
|
force?: boolean | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/tools/uninstall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD,eAAO,MAAM,oBAAoB;;;;;;;;;EAG/B,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAGjE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAiFD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,cAAc,EACrB,QAAQ,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/tools/uninstall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD,eAAO,MAAM,oBAAoB;;;;;;;;;EAG/B,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAGjE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAiFD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,cAAc,EACrB,QAAQ,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,eAAe,CAAC,CAgG1B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAG7D;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;CAiBzB,CAAA;AAED,eAAe,aAAa,CAAA"}
|
|
@@ -189,6 +189,15 @@ export async function uninstallSkill(input, _context) {
|
|
|
189
189
|
}
|
|
190
190
|
// Already removed, continue to update manifest
|
|
191
191
|
}
|
|
192
|
+
// SMI-3137: Clean up dependency records
|
|
193
|
+
if (_context?.skillDependencyRepository) {
|
|
194
|
+
try {
|
|
195
|
+
_context.skillDependencyRepository.clearAll(skillEntry.id);
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
// Dependency cleanup is best-effort — table may not exist pre-migration
|
|
199
|
+
}
|
|
200
|
+
}
|
|
192
201
|
// Update manifest
|
|
193
202
|
delete manifest.installedSkills[skillName];
|
|
194
203
|
await saveManifest(manifest);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/tools/uninstall.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/tools/uninstall.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/tools/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAmB,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/tools/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAmB,MAAM,qBAAqB,CAAA;AAa3F,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC3F,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAE7E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,aAAa,EACpB,QAAQ,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAwF3B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAqD1E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.dep.test.d.ts","sourceRoot":"","sources":["../../../src/tools/validate.dep.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Unit tests for validateDependencies helper
|
|
3
|
+
* @see SMI-3137: Wave 4 — Surface dependency intelligence
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect } from 'vitest';
|
|
6
|
+
import { validateDependencies } from './validate.helpers.js';
|
|
7
|
+
describe('validateDependencies', () => {
|
|
8
|
+
it('returns empty array when no dependencies or MCP refs', () => {
|
|
9
|
+
const errors = validateDependencies({}, 'Just a plain skill body with no MCP calls.');
|
|
10
|
+
expect(errors).toEqual([]);
|
|
11
|
+
});
|
|
12
|
+
it('warns on deprecated composes field', () => {
|
|
13
|
+
const metadata = { composes: ['other-skill'] };
|
|
14
|
+
const errors = validateDependencies(metadata, 'Some body content.');
|
|
15
|
+
expect(errors).toHaveLength(1);
|
|
16
|
+
expect(errors[0].field).toBe('composes');
|
|
17
|
+
expect(errors[0].severity).toBe('warning');
|
|
18
|
+
expect(errors[0].message).toContain('deprecated');
|
|
19
|
+
expect(errors[0].message).toContain('dependencies.skills');
|
|
20
|
+
});
|
|
21
|
+
it('detects high-confidence MCP references in prose', () => {
|
|
22
|
+
const body = `
|
|
23
|
+
# My Skill
|
|
24
|
+
|
|
25
|
+
This skill uses mcp__linear__save_issue to create issues
|
|
26
|
+
and mcp__linear__list_issues to query them.
|
|
27
|
+
`;
|
|
28
|
+
const errors = validateDependencies({}, body);
|
|
29
|
+
expect(errors).toHaveLength(1);
|
|
30
|
+
expect(errors[0].field).toBe('dependencies');
|
|
31
|
+
expect(errors[0].severity).toBe('warning');
|
|
32
|
+
expect(errors[0].message).toContain("'linear'");
|
|
33
|
+
expect(errors[0].message).toContain('dependencies.platform.mcp_servers');
|
|
34
|
+
});
|
|
35
|
+
it('does not warn on MCP references inside code blocks', () => {
|
|
36
|
+
const body = `
|
|
37
|
+
# My Skill
|
|
38
|
+
|
|
39
|
+
Here is an example:
|
|
40
|
+
|
|
41
|
+
\`\`\`bash
|
|
42
|
+
mcp__linear__save_issue
|
|
43
|
+
\`\`\`
|
|
44
|
+
`;
|
|
45
|
+
const errors = validateDependencies({}, body);
|
|
46
|
+
// Code-block-only references are not high-confidence
|
|
47
|
+
expect(errors).toEqual([]);
|
|
48
|
+
});
|
|
49
|
+
it('detects multiple high-confidence MCP servers', () => {
|
|
50
|
+
const body = `
|
|
51
|
+
Use mcp__linear__save_issue for issues.
|
|
52
|
+
Use mcp__slack__send_message for notifications.
|
|
53
|
+
`;
|
|
54
|
+
const errors = validateDependencies({}, body);
|
|
55
|
+
expect(errors).toHaveLength(2);
|
|
56
|
+
const servers = errors.map((e) => e.message);
|
|
57
|
+
expect(servers.some((m) => m.includes("'linear'"))).toBe(true);
|
|
58
|
+
expect(servers.some((m) => m.includes("'slack'"))).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
it('combines composes warning with MCP ref warnings', () => {
|
|
61
|
+
const metadata = { composes: ['other-skill'] };
|
|
62
|
+
const body = 'Use mcp__github__create_issue for tracking.';
|
|
63
|
+
const errors = validateDependencies(metadata, body);
|
|
64
|
+
expect(errors).toHaveLength(2);
|
|
65
|
+
expect(errors[0].field).toBe('composes');
|
|
66
|
+
expect(errors[1].field).toBe('dependencies');
|
|
67
|
+
});
|
|
68
|
+
it('handles empty body gracefully', () => {
|
|
69
|
+
const errors = validateDependencies({}, '');
|
|
70
|
+
expect(errors).toEqual([]);
|
|
71
|
+
});
|
|
72
|
+
it('handles empty metadata gracefully', () => {
|
|
73
|
+
const errors = validateDependencies({}, 'No MCP refs here.');
|
|
74
|
+
expect(errors).toEqual([]);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=validate.dep.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.dep.test.js","sourceRoot":"","sources":["../../../src/tools/validate.dep.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAE5D,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,EAAE,4CAA4C,CAAC,CAAA;QACrF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,QAAQ,GAAG,EAAE,QAAQ,EAAE,CAAC,aAAa,CAAC,EAAE,CAAA;QAC9C,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAA;QAEnE,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QACjD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAA;IAC5D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG;;;;;CAKhB,CAAA;QACG,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QAE7C,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAA;IAC1E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,IAAI,GAAG;;;;;;;;CAQhB,CAAA;QACG,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QAE7C,qDAAqD;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG;;;CAGhB,CAAA;QACG,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QAE7C,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;QAC5C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,QAAQ,GAAG,EAAE,QAAQ,EAAE,CAAC,aAAa,CAAC,EAAE,CAAA;QAC9C,MAAM,IAAI,GAAG,6CAA6C,CAAA;QAE1D,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAEnD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAA;QAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -25,4 +25,16 @@ export declare function validateMetadata(metadata: Record<string, unknown>, stri
|
|
|
25
25
|
* This is a heuristic check — false positives are possible.
|
|
26
26
|
*/
|
|
27
27
|
export declare function detectClaudeMdModification(body: string): string[];
|
|
28
|
+
/**
|
|
29
|
+
* SMI-3137: Validate dependency declarations and detect inferred MCP dependencies.
|
|
30
|
+
*
|
|
31
|
+
* Checks for:
|
|
32
|
+
* 1. Deprecated 'composes' field (suggest migration to dependencies.skills)
|
|
33
|
+
* 2. MCP tool references in skill body (suggest declaring in dependencies.platform)
|
|
34
|
+
*
|
|
35
|
+
* @param metadata - Parsed frontmatter metadata (may be empty object)
|
|
36
|
+
* @param body - Skill body content (markdown after frontmatter)
|
|
37
|
+
* @returns Array of dependency-related validation warnings
|
|
38
|
+
*/
|
|
39
|
+
export declare function validateDependencies(metadata: Record<string, unknown>, body: string): ValidationError[];
|
|
28
40
|
//# sourceMappingURL=validate.helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.helpers.d.ts","sourceRoot":"","sources":["../../../src/tools/validate.helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"validate.helpers.d.ts","sourceRoot":"","sources":["../../../src/tools/validate.helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAI1D;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAqFpF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,MAAM,EAAE,OAAO,GACd,eAAe,EAAE,CAoNnB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAqBjE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,IAAI,EAAE,MAAM,GACX,eAAe,EAAE,CA4BnB"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Validate Tool Helper Functions
|
|
3
3
|
* @module @skillsmith/mcp-server/tools/validate.helpers
|
|
4
4
|
*/
|
|
5
|
+
import { extractMcpReferences } from '@skillsmith/core';
|
|
5
6
|
import { FIELD_LIMITS, SSRF_PATTERNS, PATH_TRAVERSAL_PATTERNS } from './validate.types.js';
|
|
6
7
|
import { KNOWN_IDES, KNOWN_LLMS } from '../utils/validation.js';
|
|
7
8
|
/**
|
|
@@ -161,28 +162,33 @@ export function validateMetadata(metadata, strict) {
|
|
|
161
162
|
});
|
|
162
163
|
}
|
|
163
164
|
}
|
|
164
|
-
// Version validation
|
|
165
|
-
if (metadata.version
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
else if (metadata.version.length > FIELD_LIMITS.version) {
|
|
174
|
-
errors.push({
|
|
175
|
-
field: 'version',
|
|
176
|
-
message: `Field "version" exceeds maximum length of ${FIELD_LIMITS.version} characters`,
|
|
177
|
-
severity: 'error',
|
|
178
|
-
});
|
|
179
|
-
}
|
|
165
|
+
// Version validation (SMI-2902: required field, must be semver)
|
|
166
|
+
if (metadata.version === undefined) {
|
|
167
|
+
errors.push({
|
|
168
|
+
field: 'version',
|
|
169
|
+
message: 'Required field "version" is missing. Add version: "1.0.0" to your SKILL.md frontmatter.',
|
|
170
|
+
severity: 'error',
|
|
171
|
+
});
|
|
180
172
|
}
|
|
181
|
-
else if (
|
|
173
|
+
else if (typeof metadata.version !== 'string') {
|
|
182
174
|
errors.push({
|
|
183
175
|
field: 'version',
|
|
184
|
-
message: 'Field "version"
|
|
185
|
-
severity: '
|
|
176
|
+
message: 'Field "version" must be a string',
|
|
177
|
+
severity: 'error',
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
else if (!/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/.test(metadata.version)) {
|
|
181
|
+
errors.push({
|
|
182
|
+
field: 'version',
|
|
183
|
+
message: `Field "version" must use semver format (e.g. "1.0.0"). Got: "${metadata.version}". Add version: "1.0.0" to your SKILL.md frontmatter.`,
|
|
184
|
+
severity: 'error',
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
else if (metadata.version.length > FIELD_LIMITS.version) {
|
|
188
|
+
errors.push({
|
|
189
|
+
field: 'version',
|
|
190
|
+
message: `Field "version" exceeds maximum length of ${FIELD_LIMITS.version} characters`,
|
|
191
|
+
severity: 'error',
|
|
186
192
|
});
|
|
187
193
|
}
|
|
188
194
|
// Tags validation
|
|
@@ -325,4 +331,38 @@ export function detectClaudeMdModification(body) {
|
|
|
325
331
|
}
|
|
326
332
|
return warnings;
|
|
327
333
|
}
|
|
334
|
+
/**
|
|
335
|
+
* SMI-3137: Validate dependency declarations and detect inferred MCP dependencies.
|
|
336
|
+
*
|
|
337
|
+
* Checks for:
|
|
338
|
+
* 1. Deprecated 'composes' field (suggest migration to dependencies.skills)
|
|
339
|
+
* 2. MCP tool references in skill body (suggest declaring in dependencies.platform)
|
|
340
|
+
*
|
|
341
|
+
* @param metadata - Parsed frontmatter metadata (may be empty object)
|
|
342
|
+
* @param body - Skill body content (markdown after frontmatter)
|
|
343
|
+
* @returns Array of dependency-related validation warnings
|
|
344
|
+
*/
|
|
345
|
+
export function validateDependencies(metadata, body) {
|
|
346
|
+
const errors = [];
|
|
347
|
+
// 1. Check for deprecated 'composes' field
|
|
348
|
+
if (metadata.composes) {
|
|
349
|
+
errors.push({
|
|
350
|
+
field: 'composes',
|
|
351
|
+
message: "'composes' is deprecated. Migrate to 'dependencies.skills' with type: hard/soft/peer.",
|
|
352
|
+
severity: 'warning',
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
// 2. Extract MCP references from body
|
|
356
|
+
const mcpResult = extractMcpReferences(body);
|
|
357
|
+
// 3. For each high-confidence server, add an informational warning
|
|
358
|
+
for (const server of mcpResult.highConfidenceServers) {
|
|
359
|
+
errors.push({
|
|
360
|
+
field: 'dependencies',
|
|
361
|
+
message: `Inferred MCP dependency: '${server}' (referenced in skill body). ` +
|
|
362
|
+
'Consider declaring in dependencies.platform.mcp_servers.',
|
|
363
|
+
severity: 'warning',
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
return errors;
|
|
367
|
+
}
|
|
328
368
|
//# sourceMappingURL=validate.helpers.js.map
|