@skillsmith/mcp-server 0.4.3 → 0.4.5

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 (104) 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.helpers.d.ts +6 -0
  39. package/dist/src/tools/install.helpers.d.ts.map +1 -1
  40. package/dist/src/tools/install.helpers.js +21 -2
  41. package/dist/src/tools/install.helpers.js.map +1 -1
  42. package/dist/src/tools/install.js +27 -35
  43. package/dist/src/tools/install.js.map +1 -1
  44. package/dist/src/tools/install.types.d.ts +7 -0
  45. package/dist/src/tools/install.types.d.ts.map +1 -1
  46. package/dist/src/tools/install.types.js.map +1 -1
  47. package/dist/src/tools/merge.test.d.ts +9 -0
  48. package/dist/src/tools/merge.test.d.ts.map +1 -0
  49. package/dist/src/tools/merge.test.js +161 -0
  50. package/dist/src/tools/merge.test.js.map +1 -0
  51. package/dist/src/tools/outdated.d.ts +101 -0
  52. package/dist/src/tools/outdated.d.ts.map +1 -0
  53. package/dist/src/tools/outdated.js +214 -0
  54. package/dist/src/tools/outdated.js.map +1 -0
  55. package/dist/src/tools/outdated.test.d.ts +6 -0
  56. package/dist/src/tools/outdated.test.d.ts.map +1 -0
  57. package/dist/src/tools/outdated.test.js +287 -0
  58. package/dist/src/tools/outdated.test.js.map +1 -0
  59. package/dist/src/tools/recommend.types.d.ts +3 -3
  60. package/dist/src/tools/skill-audit.test.js +1 -1
  61. package/dist/src/tools/skill-audit.test.js.map +1 -1
  62. package/dist/src/tools/skill-diff.d.ts +2 -2
  63. package/dist/src/tools/skill-pack-audit.d.ts +96 -0
  64. package/dist/src/tools/skill-pack-audit.d.ts.map +1 -0
  65. package/dist/src/tools/skill-pack-audit.js +183 -0
  66. package/dist/src/tools/skill-pack-audit.js.map +1 -0
  67. package/dist/src/tools/suggest.d.ts +4 -4
  68. package/dist/src/tools/uninstall.d.ts +1 -1
  69. package/dist/src/tools/uninstall.d.ts.map +1 -1
  70. package/dist/src/tools/uninstall.js +9 -0
  71. package/dist/src/tools/uninstall.js.map +1 -1
  72. package/dist/src/tools/validate.d.ts.map +1 -1
  73. package/dist/src/tools/validate.dep.test.d.ts +6 -0
  74. package/dist/src/tools/validate.dep.test.d.ts.map +1 -0
  75. package/dist/src/tools/validate.dep.test.js +77 -0
  76. package/dist/src/tools/validate.dep.test.js.map +1 -0
  77. package/dist/src/tools/validate.helpers.d.ts +12 -0
  78. package/dist/src/tools/validate.helpers.d.ts.map +1 -1
  79. package/dist/src/tools/validate.helpers.js +59 -19
  80. package/dist/src/tools/validate.helpers.js.map +1 -1
  81. package/dist/src/tools/validate.js +3 -1
  82. package/dist/src/tools/validate.js.map +1 -1
  83. package/dist/tests/integration/recommend.integration.test.js +1 -0
  84. package/dist/tests/integration/recommend.integration.test.js.map +1 -1
  85. package/dist/tests/integration/setup.d.ts +2 -1
  86. package/dist/tests/integration/setup.d.ts.map +1 -1
  87. package/dist/tests/integration/setup.js +3 -1
  88. package/dist/tests/integration/setup.js.map +1 -1
  89. package/dist/tests/integration/validate.integration.test.js +4 -2
  90. package/dist/tests/integration/validate.integration.test.js.map +1 -1
  91. package/dist/tests/recommend.test.js +1 -0
  92. package/dist/tests/recommend.test.js.map +1 -1
  93. package/dist/tests/unit/install-helpers.test.js +41 -1
  94. package/dist/tests/unit/install-helpers.test.js.map +1 -1
  95. package/dist/tests/unit/skill-pack-audit.test.d.ts +8 -0
  96. package/dist/tests/unit/skill-pack-audit.test.d.ts.map +1 -0
  97. package/dist/tests/unit/skill-pack-audit.test.js +343 -0
  98. package/dist/tests/unit/skill-pack-audit.test.js.map +1 -0
  99. package/dist/tests/unit/validate-helpers.test.js +47 -4
  100. package/dist/tests/unit/validate-helpers.test.js.map +1 -1
  101. package/dist/tests/validate.test.js +4 -0
  102. package/dist/tests/validate.test.js.map +1 -1
  103. package/package.json +2 -2
  104. package/server.json +3 -3
@@ -0,0 +1,161 @@
1
+ /**
2
+ * SMI-3416: Three-Way Merge Algorithm Tests
3
+ *
4
+ * Tests for LCS-based diff3 merge in merge.ts:
5
+ * - computeDiff: line-level diff between two texts
6
+ * - threeWayMerge: three-way merge with conflict detection
7
+ */
8
+ import { describe, it, expect } from 'vitest';
9
+ import { computeDiff, threeWayMerge } from './merge.js';
10
+ // ============================================================================
11
+ // computeDiff
12
+ // ============================================================================
13
+ describe('computeDiff', () => {
14
+ it('should return empty diff for identical content', () => {
15
+ const result = computeDiff('a\nb\nc', 'a\nb\nc');
16
+ expect(result.additions).toEqual([]);
17
+ expect(result.deletions).toEqual([]);
18
+ expect(result.unchanged).toEqual([1, 2, 3]);
19
+ });
20
+ it('should detect additions', () => {
21
+ const result = computeDiff('a\nc', 'a\nb\nc');
22
+ expect(result.additions.length).toBeGreaterThan(0);
23
+ expect(result.deletions).toEqual([]);
24
+ });
25
+ it('should detect deletions', () => {
26
+ const result = computeDiff('a\nb\nc', 'a\nc');
27
+ expect(result.deletions.length).toBeGreaterThan(0);
28
+ expect(result.additions).toEqual([]);
29
+ });
30
+ it('should detect modifications', () => {
31
+ const result = computeDiff('a\nb\nc', 'a\nB\nc');
32
+ expect(result.additions.length).toBeGreaterThan(0);
33
+ expect(result.deletions.length).toBeGreaterThan(0);
34
+ expect(result.unchanged).toContain(1); // 'a' unchanged
35
+ expect(result.unchanged).toContain(3); // 'c' unchanged
36
+ });
37
+ it('should handle empty base', () => {
38
+ const result = computeDiff('', 'a\nb');
39
+ expect(result.additions.length).toBeGreaterThan(0);
40
+ // Empty string splits to [''], so there's 1 base "line" that may count as deleted
41
+ expect(result.deletions.length).toBeLessThanOrEqual(1);
42
+ });
43
+ it('should handle empty target', () => {
44
+ const result = computeDiff('a\nb', '');
45
+ expect(result.deletions.length).toBeGreaterThan(0);
46
+ // Empty string splits to [''], so there's 1 "line" in the target
47
+ // which counts as an addition if it doesn't match any base line
48
+ expect(result.additions.length).toBeLessThanOrEqual(1);
49
+ });
50
+ it('should handle single-line content', () => {
51
+ const result = computeDiff('hello', 'world');
52
+ expect(result.deletions).toEqual([1]);
53
+ expect(result.additions).toEqual([1]);
54
+ });
55
+ });
56
+ // ============================================================================
57
+ // threeWayMerge — edge cases
58
+ // ============================================================================
59
+ describe('threeWayMerge', () => {
60
+ describe('edge cases', () => {
61
+ it('should return empty for three empty inputs', () => {
62
+ const result = threeWayMerge('', '', '');
63
+ expect(result.success).toBe(true);
64
+ expect(result.merged).toBe('');
65
+ });
66
+ it('should return upstream when local is empty and base is empty', () => {
67
+ const result = threeWayMerge('', '', 'new content');
68
+ expect(result.success).toBe(true);
69
+ expect(result.merged).toBe('new content');
70
+ });
71
+ it('should return local when upstream is empty and base is empty', () => {
72
+ const result = threeWayMerge('', 'local content', '');
73
+ expect(result.success).toBe(true);
74
+ expect(result.merged).toBe('local content');
75
+ });
76
+ it('should conflict when both have content but base is empty', () => {
77
+ const result = threeWayMerge('', 'local', 'upstream');
78
+ expect(result.success).toBe(false);
79
+ expect(result.conflicts).toHaveLength(1);
80
+ expect(result.merged).toContain('<<<<<<< LOCAL');
81
+ expect(result.merged).toContain('>>>>>>> UPSTREAM');
82
+ });
83
+ });
84
+ describe('no-conflict cases', () => {
85
+ it('should return upstream when local is unchanged from base', () => {
86
+ const result = threeWayMerge('base', 'base', 'upstream');
87
+ expect(result.success).toBe(true);
88
+ expect(result.merged).toBe('upstream');
89
+ });
90
+ it('should return local when upstream is unchanged from base', () => {
91
+ const result = threeWayMerge('base', 'local', 'base');
92
+ expect(result.success).toBe(true);
93
+ expect(result.merged).toBe('local');
94
+ });
95
+ it('should return local when both made same change', () => {
96
+ const result = threeWayMerge('base', 'same', 'same');
97
+ expect(result.success).toBe(true);
98
+ expect(result.merged).toBe('same');
99
+ });
100
+ it('should merge non-overlapping changes', () => {
101
+ const base = 'line1\nline2\nline3\nline4\nline5';
102
+ const local = 'LINE1\nline2\nline3\nline4\nline5'; // changed line 1
103
+ const upstream = 'line1\nline2\nline3\nline4\nLINE5'; // changed line 5
104
+ const result = threeWayMerge(base, local, upstream);
105
+ expect(result.success).toBe(true);
106
+ expect(result.merged).toContain('LINE1');
107
+ expect(result.merged).toContain('LINE5');
108
+ });
109
+ });
110
+ describe('conflict cases', () => {
111
+ it('should detect conflict when both modify same region', () => {
112
+ const base = 'line1\nline2\nline3';
113
+ const local = 'line1\nLOCAL\nline3';
114
+ const upstream = 'line1\nUPSTREAM\nline3';
115
+ const result = threeWayMerge(base, local, upstream);
116
+ expect(result.success).toBe(false);
117
+ expect(result.conflicts).toBeDefined();
118
+ expect(result.conflicts.length).toBeGreaterThan(0);
119
+ expect(result.merged).toContain('<<<<<<< LOCAL');
120
+ expect(result.merged).toContain('=======');
121
+ expect(result.merged).toContain('>>>>>>> UPSTREAM');
122
+ });
123
+ it('should preserve unchanged lines around conflicts', () => {
124
+ const base = 'a\nb\nc';
125
+ const local = 'a\nB-local\nc';
126
+ const upstream = 'a\nB-upstream\nc';
127
+ const result = threeWayMerge(base, local, upstream);
128
+ expect(result.merged).toContain('a');
129
+ expect(result.merged).toContain('c');
130
+ });
131
+ it('conflict should include line number', () => {
132
+ const base = 'a\nb\nc';
133
+ const local = 'a\nX\nc';
134
+ const upstream = 'a\nY\nc';
135
+ const result = threeWayMerge(base, local, upstream);
136
+ expect(result.conflicts).toBeDefined();
137
+ expect(result.conflicts[0].lineNumber).toBeGreaterThan(0);
138
+ expect(result.conflicts[0].local).toBe('X');
139
+ expect(result.conflicts[0].upstream).toBe('Y');
140
+ });
141
+ });
142
+ describe('multiline changes', () => {
143
+ it('should handle additions by one side', () => {
144
+ const base = 'a\nc';
145
+ const local = 'a\nb\nc'; // inserted 'b'
146
+ const upstream = 'a\nc'; // unchanged
147
+ const result = threeWayMerge(base, local, upstream);
148
+ expect(result.success).toBe(true);
149
+ expect(result.merged).toContain('b');
150
+ });
151
+ it('should handle deletions by one side', () => {
152
+ const base = 'a\nb\nc';
153
+ const local = 'a\nc'; // deleted 'b'
154
+ const upstream = 'a\nb\nc'; // unchanged
155
+ const result = threeWayMerge(base, local, upstream);
156
+ expect(result.success).toBe(true);
157
+ expect(result.merged).not.toContain('\nb\n');
158
+ });
159
+ });
160
+ });
161
+ //# sourceMappingURL=merge.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.test.js","sourceRoot":"","sources":["../../../src/tools/merge.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * @fileoverview skill_outdated MCP tool — check installed skills for updates and dependency status
3
+ * @module @skillsmith/mcp-server/tools/outdated
4
+ * @see SMI-3138: Wave 5 — Dependency intelligence outdated tool
5
+ *
6
+ * Reads the local manifest (~/.skillsmith/manifest.json), hashes each installed
7
+ * SKILL.md, and compares against the latest content hash in skill_versions.
8
+ * Optionally includes dependency satisfaction status from skill_dependencies.
9
+ *
10
+ * Tier gate: Community (null feature flag — no license required).
11
+ *
12
+ * Hash display: truncated to 8 chars for human readability (full hash stored).
13
+ */
14
+ import { z } from 'zod';
15
+ import type { ToolContext } from '../context.js';
16
+ /**
17
+ * Input schema for skill_outdated tool
18
+ */
19
+ export declare const outdatedInputSchema: z.ZodObject<{
20
+ /** Include dependency satisfaction status in results (default: true) */
21
+ include_deps: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
22
+ }, "strip", z.ZodTypeAny, {
23
+ include_deps: boolean;
24
+ }, {
25
+ include_deps?: boolean | undefined;
26
+ }>;
27
+ export type OutdatedInput = z.infer<typeof outdatedInputSchema>;
28
+ /**
29
+ * Dependency satisfaction details for a single skill
30
+ */
31
+ export interface DependencyStatus {
32
+ total: number;
33
+ satisfied: string[];
34
+ missing: string[];
35
+ }
36
+ /**
37
+ * Per-skill outdated information returned by the tool
38
+ */
39
+ export interface OutdatedSkillInfo {
40
+ /** Registry skill identifier (e.g. "author/skill-name") */
41
+ id: string;
42
+ /** 8-char prefix of the locally-installed content hash */
43
+ installed_hash: string;
44
+ /** 8-char prefix of the latest registry hash */
45
+ latest_hash: string;
46
+ /** Status of the skill: current, outdated, or unknown (no registry data) */
47
+ status: 'current' | 'outdated' | 'unknown';
48
+ /** Semver from the latest version record, if available */
49
+ semver: string | null;
50
+ /** Dependency satisfaction details (omitted when include_deps is false) */
51
+ dependencies?: DependencyStatus;
52
+ }
53
+ /**
54
+ * Summary counts for the outdated check
55
+ */
56
+ export interface OutdatedSummary {
57
+ total_installed: number;
58
+ outdated: number;
59
+ up_to_date: number;
60
+ unknown: number;
61
+ missing_deps: number;
62
+ }
63
+ /**
64
+ * Response from skill_outdated tool
65
+ */
66
+ export interface OutdatedResponse {
67
+ skills: OutdatedSkillInfo[];
68
+ summary: OutdatedSummary;
69
+ }
70
+ /**
71
+ * MCP tool definition for skill_outdated
72
+ */
73
+ export declare const outdatedToolSchema: {
74
+ name: "skill_outdated";
75
+ description: string;
76
+ inputSchema: {
77
+ type: "object";
78
+ properties: {
79
+ include_deps: {
80
+ type: string;
81
+ description: string;
82
+ };
83
+ };
84
+ required: never[];
85
+ };
86
+ };
87
+ /**
88
+ * Execute the skill_outdated tool.
89
+ *
90
+ * 1. Reads the manifest. If missing/empty, returns an empty result.
91
+ * 2. For each installed skill, hashes the local SKILL.md and compares
92
+ * against the latest entry in skill_versions.
93
+ * 3. If include_deps is true, queries skill_dependencies for each skill
94
+ * and checks whether skill-type deps are installed.
95
+ *
96
+ * @param input Validated tool input
97
+ * @param context Tool context with database connection
98
+ * @returns OutdatedResponse with per-skill status and summary
99
+ */
100
+ export declare function executeOutdated(input: OutdatedInput, context: ToolContext): Promise<OutdatedResponse>;
101
+ //# sourceMappingURL=outdated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outdated.d.ts","sourceRoot":"","sources":["../../../src/tools/outdated.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAShD;;GAEG;AACH,eAAO,MAAM,mBAAmB;IAC9B,wEAAwE;;;;;;EAMxE,CAAA;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAE/D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,2DAA2D;IAC3D,EAAE,EAAE,MAAM,CAAA;IACV,0DAA0D;IAC1D,cAAc,EAAE,MAAM,CAAA;IACtB,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAA;IACnB,4EAA4E;IAC5E,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAA;IAC1C,0DAA0D;IAC1D,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,gBAAgB,CAAA;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,iBAAiB,EAAE,CAAA;IAC3B,OAAO,EAAE,eAAe,CAAA;CACzB;AAMD;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;CAgB9B,CAAA;AA0DD;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,gBAAgB,CAAC,CA8G3B"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * @fileoverview skill_outdated MCP tool — check installed skills for updates and dependency status
3
+ * @module @skillsmith/mcp-server/tools/outdated
4
+ * @see SMI-3138: Wave 5 — Dependency intelligence outdated tool
5
+ *
6
+ * Reads the local manifest (~/.skillsmith/manifest.json), hashes each installed
7
+ * SKILL.md, and compares against the latest content hash in skill_versions.
8
+ * Optionally includes dependency satisfaction status from skill_dependencies.
9
+ *
10
+ * Tier gate: Community (null feature flag — no license required).
11
+ *
12
+ * Hash display: truncated to 8 chars for human readability (full hash stored).
13
+ */
14
+ import { z } from 'zod';
15
+ import { promises as fs } from 'fs';
16
+ import * as path from 'path';
17
+ import { SkillVersionRepository } from '@skillsmith/core';
18
+ import { hashContent } from './install.conflict-helpers.js';
19
+ import { loadManifest } from './install.helpers.js';
20
+ // ============================================================================
21
+ // Input / Output types
22
+ // ============================================================================
23
+ /**
24
+ * Input schema for skill_outdated tool
25
+ */
26
+ export const outdatedInputSchema = z.object({
27
+ /** Include dependency satisfaction status in results (default: true) */
28
+ include_deps: z
29
+ .boolean()
30
+ .optional()
31
+ .default(true)
32
+ .describe('Include dependency satisfaction status (default: true)'),
33
+ });
34
+ // ============================================================================
35
+ // Tool schema (MCP tool definition)
36
+ // ============================================================================
37
+ /**
38
+ * MCP tool definition for skill_outdated
39
+ */
40
+ export const outdatedToolSchema = {
41
+ name: 'skill_outdated',
42
+ description: 'Check installed skills for available updates and dependency satisfaction status. ' +
43
+ 'Reads the local manifest, hashes each installed SKILL.md, and compares against the ' +
44
+ 'latest registry state. Community tier — no license required.',
45
+ inputSchema: {
46
+ type: 'object',
47
+ properties: {
48
+ include_deps: {
49
+ type: 'boolean',
50
+ description: 'Include dependency satisfaction status (default: true)',
51
+ },
52
+ },
53
+ required: [],
54
+ },
55
+ };
56
+ // ============================================================================
57
+ // Helpers
58
+ // ============================================================================
59
+ /**
60
+ * Read and hash the installed SKILL.md content.
61
+ * Returns null if the file cannot be read.
62
+ */
63
+ async function readInstalledHash(installPath) {
64
+ const skillMdPath = path.join(installPath, 'SKILL.md');
65
+ try {
66
+ const content = await fs.readFile(skillMdPath, 'utf-8');
67
+ return hashContent(content);
68
+ }
69
+ catch {
70
+ return null;
71
+ }
72
+ }
73
+ /**
74
+ * Check dependency satisfaction for a skill.
75
+ * - skill_hard / skill_soft / skill_peer: satisfied if dep_target is in installedSkillIds
76
+ * - mcp_server / model_minimum / other: marked satisfied (best-effort, can't verify)
77
+ */
78
+ function checkDependencies(deps, installedSkillIds) {
79
+ const satisfied = [];
80
+ const missing = [];
81
+ for (const dep of deps) {
82
+ const label = `${dep.dep_type}:${dep.dep_target}`;
83
+ if (dep.dep_type === 'skill_hard' ||
84
+ dep.dep_type === 'skill_soft' ||
85
+ dep.dep_type === 'skill_peer') {
86
+ if (installedSkillIds.has(dep.dep_target)) {
87
+ satisfied.push(label);
88
+ }
89
+ else {
90
+ missing.push(label);
91
+ }
92
+ }
93
+ else {
94
+ // mcp_server, model_minimum, etc. — can't reliably verify, mark satisfied
95
+ satisfied.push(label);
96
+ }
97
+ }
98
+ return { total: deps.length, satisfied, missing };
99
+ }
100
+ // ============================================================================
101
+ // Execution
102
+ // ============================================================================
103
+ /**
104
+ * Execute the skill_outdated tool.
105
+ *
106
+ * 1. Reads the manifest. If missing/empty, returns an empty result.
107
+ * 2. For each installed skill, hashes the local SKILL.md and compares
108
+ * against the latest entry in skill_versions.
109
+ * 3. If include_deps is true, queries skill_dependencies for each skill
110
+ * and checks whether skill-type deps are installed.
111
+ *
112
+ * @param input Validated tool input
113
+ * @param context Tool context with database connection
114
+ * @returns OutdatedResponse with per-skill status and summary
115
+ */
116
+ export async function executeOutdated(input, context) {
117
+ const manifest = await loadManifest();
118
+ const entries = Object.values(manifest.installedSkills);
119
+ if (entries.length === 0) {
120
+ return {
121
+ skills: [],
122
+ summary: {
123
+ total_installed: 0,
124
+ outdated: 0,
125
+ up_to_date: 0,
126
+ unknown: 0,
127
+ missing_deps: 0,
128
+ },
129
+ };
130
+ }
131
+ const versionRepo = new SkillVersionRepository(context.db);
132
+ const depRepo = context.skillDependencyRepository;
133
+ // Build set of installed skill IDs for dependency checking — filter out corrupt entries
134
+ const installedSkillIds = new Set(entries.filter((e) => e.id).map((e) => e.id));
135
+ const skills = [];
136
+ let outdatedCount = 0;
137
+ let upToDateCount = 0;
138
+ let unknownCount = 0;
139
+ let missingDepsCount = 0;
140
+ for (const entry of entries) {
141
+ // SMI-3177: Skip corrupt manifest entries with missing installPath
142
+ if (!entry.installPath) {
143
+ console.warn(`[skill_outdated] Skipping corrupt manifest entry (missing installPath): ${entry.id ?? 'unknown'}`);
144
+ skills.push({
145
+ id: entry.id ?? 'unknown',
146
+ installed_hash: '--------',
147
+ latest_hash: '--------',
148
+ status: 'unknown',
149
+ semver: null,
150
+ ...(input.include_deps ? { dependencies: { total: 0, satisfied: [], missing: [] } } : {}),
151
+ });
152
+ unknownCount++;
153
+ continue;
154
+ }
155
+ // Hash the currently installed SKILL.md
156
+ const localHash = await readInstalledHash(entry.installPath);
157
+ // Get latest version from registry cache
158
+ const history = await versionRepo.getVersionHistory(entry.id, 1);
159
+ let status;
160
+ let latestHash;
161
+ let semver = null;
162
+ if (history.length === 0 || localHash === null) {
163
+ status = 'unknown';
164
+ latestHash = localHash?.slice(0, 8) ?? '--------';
165
+ unknownCount++;
166
+ }
167
+ else {
168
+ const latest = history[0];
169
+ semver = latest.semver;
170
+ latestHash = latest.content_hash.slice(0, 8);
171
+ if (localHash === latest.content_hash) {
172
+ status = 'current';
173
+ upToDateCount++;
174
+ }
175
+ else {
176
+ status = 'outdated';
177
+ outdatedCount++;
178
+ }
179
+ }
180
+ const skillInfo = {
181
+ id: entry.id,
182
+ installed_hash: localHash?.slice(0, 8) ?? '--------',
183
+ latest_hash: latestHash,
184
+ status,
185
+ semver,
186
+ };
187
+ // Dependency satisfaction
188
+ if (input.include_deps) {
189
+ const deps = depRepo.getDependencies(entry.id);
190
+ if (deps.length > 0) {
191
+ const depStatus = checkDependencies(deps, installedSkillIds);
192
+ skillInfo.dependencies = depStatus;
193
+ if (depStatus.missing.length > 0) {
194
+ missingDepsCount++;
195
+ }
196
+ }
197
+ else {
198
+ skillInfo.dependencies = { total: 0, satisfied: [], missing: [] };
199
+ }
200
+ }
201
+ skills.push(skillInfo);
202
+ }
203
+ return {
204
+ skills,
205
+ summary: {
206
+ total_installed: entries.length,
207
+ outdated: outdatedCount,
208
+ up_to_date: upToDateCount,
209
+ unknown: unknownCount,
210
+ missing_deps: missingDepsCount,
211
+ },
212
+ };
213
+ }
214
+ //# sourceMappingURL=outdated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outdated.js","sourceRoot":"","sources":["../../../src/tools/outdated.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @fileoverview Unit tests for skill_outdated MCP tool
3
+ * @see SMI-3138: Wave 5 — Dependency intelligence outdated tool
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=outdated.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outdated.test.d.ts","sourceRoot":"","sources":["../../../src/tools/outdated.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}