@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.
Files changed (92) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/src/context.async.d.ts.map +1 -1
  3. package/dist/src/context.async.js +3 -1
  4. package/dist/src/context.async.js.map +1 -1
  5. package/dist/src/context.d.ts.map +1 -1
  6. package/dist/src/context.js +3 -1
  7. package/dist/src/context.js.map +1 -1
  8. package/dist/src/context.types.d.ts +3 -1
  9. package/dist/src/context.types.d.ts.map +1 -1
  10. package/dist/src/index.js +4 -0
  11. package/dist/src/index.js.map +1 -1
  12. package/dist/src/middleware/toolFeatureMapping.d.ts.map +1 -1
  13. package/dist/src/middleware/toolFeatureMapping.js +2 -0
  14. package/dist/src/middleware/toolFeatureMapping.js.map +1 -1
  15. package/dist/src/tool-dispatch.d.ts.map +1 -1
  16. package/dist/src/tool-dispatch.js +15 -0
  17. package/dist/src/tool-dispatch.js.map +1 -1
  18. package/dist/src/tools/compare.types.d.ts +5 -1
  19. package/dist/src/tools/compare.types.d.ts.map +1 -1
  20. package/dist/src/tools/compare.types.js.map +1 -1
  21. package/dist/src/tools/get-skill.d.ts.map +1 -1
  22. package/dist/src/tools/get-skill.js +16 -0
  23. package/dist/src/tools/get-skill.js.map +1 -1
  24. package/dist/src/tools/index.d.ts +2 -0
  25. package/dist/src/tools/index.d.ts.map +1 -1
  26. package/dist/src/tools/index.js +2 -0
  27. package/dist/src/tools/index.js.map +1 -1
  28. package/dist/src/tools/install.d.ts +4 -23
  29. package/dist/src/tools/install.d.ts.map +1 -1
  30. package/dist/src/tools/install.dep-helpers.d.ts +41 -0
  31. package/dist/src/tools/install.dep-helpers.d.ts.map +1 -0
  32. package/dist/src/tools/install.dep-helpers.js +68 -0
  33. package/dist/src/tools/install.dep-helpers.js.map +1 -0
  34. package/dist/src/tools/install.dep-helpers.test.d.ts +6 -0
  35. package/dist/src/tools/install.dep-helpers.test.d.ts.map +1 -0
  36. package/dist/src/tools/install.dep-helpers.test.js +109 -0
  37. package/dist/src/tools/install.dep-helpers.test.js.map +1 -0
  38. package/dist/src/tools/install.js +27 -35
  39. package/dist/src/tools/install.js.map +1 -1
  40. package/dist/src/tools/install.types.d.ts +7 -0
  41. package/dist/src/tools/install.types.d.ts.map +1 -1
  42. package/dist/src/tools/install.types.js.map +1 -1
  43. package/dist/src/tools/outdated.d.ts +101 -0
  44. package/dist/src/tools/outdated.d.ts.map +1 -0
  45. package/dist/src/tools/outdated.js +214 -0
  46. package/dist/src/tools/outdated.js.map +1 -0
  47. package/dist/src/tools/outdated.test.d.ts +6 -0
  48. package/dist/src/tools/outdated.test.d.ts.map +1 -0
  49. package/dist/src/tools/outdated.test.js +287 -0
  50. package/dist/src/tools/outdated.test.js.map +1 -0
  51. package/dist/src/tools/recommend.types.d.ts +3 -3
  52. package/dist/src/tools/skill-diff.d.ts +2 -2
  53. package/dist/src/tools/skill-pack-audit.d.ts +96 -0
  54. package/dist/src/tools/skill-pack-audit.d.ts.map +1 -0
  55. package/dist/src/tools/skill-pack-audit.js +183 -0
  56. package/dist/src/tools/skill-pack-audit.js.map +1 -0
  57. package/dist/src/tools/suggest.d.ts +4 -4
  58. package/dist/src/tools/uninstall.d.ts +1 -1
  59. package/dist/src/tools/uninstall.d.ts.map +1 -1
  60. package/dist/src/tools/uninstall.js +9 -0
  61. package/dist/src/tools/uninstall.js.map +1 -1
  62. package/dist/src/tools/validate.d.ts.map +1 -1
  63. package/dist/src/tools/validate.dep.test.d.ts +6 -0
  64. package/dist/src/tools/validate.dep.test.d.ts.map +1 -0
  65. package/dist/src/tools/validate.dep.test.js +77 -0
  66. package/dist/src/tools/validate.dep.test.js.map +1 -0
  67. package/dist/src/tools/validate.helpers.d.ts +12 -0
  68. package/dist/src/tools/validate.helpers.d.ts.map +1 -1
  69. package/dist/src/tools/validate.helpers.js +59 -19
  70. package/dist/src/tools/validate.helpers.js.map +1 -1
  71. package/dist/src/tools/validate.js +3 -1
  72. package/dist/src/tools/validate.js.map +1 -1
  73. package/dist/tests/integration/recommend.integration.test.js +1 -0
  74. package/dist/tests/integration/recommend.integration.test.js.map +1 -1
  75. package/dist/tests/integration/setup.d.ts +2 -1
  76. package/dist/tests/integration/setup.d.ts.map +1 -1
  77. package/dist/tests/integration/setup.js +3 -1
  78. package/dist/tests/integration/setup.js.map +1 -1
  79. package/dist/tests/integration/validate.integration.test.js +4 -2
  80. package/dist/tests/integration/validate.integration.test.js.map +1 -1
  81. package/dist/tests/recommend.test.js +1 -0
  82. package/dist/tests/recommend.test.js.map +1 -1
  83. package/dist/tests/unit/skill-pack-audit.test.d.ts +8 -0
  84. package/dist/tests/unit/skill-pack-audit.test.d.ts.map +1 -0
  85. package/dist/tests/unit/skill-pack-audit.test.js +342 -0
  86. package/dist/tests/unit/skill-pack-audit.test.js.map +1 -0
  87. package/dist/tests/unit/validate-helpers.test.js +47 -4
  88. package/dist/tests/unit/validate-helpers.test.js.map +1 -1
  89. package/dist/tests/validate.test.js +4 -0
  90. package/dist/tests/validate.test.js.map +1 -1
  91. package/package.json +1 -1
  92. 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,CAuF1B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAG7D;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;CAiBzB,CAAA;AAED,eAAe,aAAa,CAAA"}
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;AAY3F,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,CAqF3B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAqD1E"}
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,6 @@
1
+ /**
2
+ * @fileoverview Unit tests for validateDependencies helper
3
+ * @see SMI-3137: Wave 4 — Surface dependency intelligence
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=validate.dep.test.d.ts.map
@@ -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":"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"}
@@ -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;AAEH,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,CA+MnB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAqBjE"}
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 !== undefined) {
166
- if (typeof metadata.version !== 'string') {
167
- errors.push({
168
- field: 'version',
169
- message: 'Field "version" must be a string',
170
- severity: 'error',
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 (strict) {
173
+ else if (typeof metadata.version !== 'string') {
182
174
  errors.push({
183
175
  field: 'version',
184
- message: 'Field "version" is recommended',
185
- severity: 'warning',
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