@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,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 @@
|
|
|
1
|
+
{"version":3,"file":"outdated.test.d.ts","sourceRoot":"","sources":["../../../src/tools/outdated.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Unit tests for skill_outdated MCP tool
|
|
3
|
+
* @see SMI-3138: Wave 5 — Dependency intelligence outdated tool
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
6
|
+
import { SkillVersionRepository, SkillDependencyRepository } from '@skillsmith/core';
|
|
7
|
+
import { createTestDatabase, closeDatabase } from '../../../core/tests/helpers/database.js';
|
|
8
|
+
import { executeOutdated } from './outdated.js';
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Mocks
|
|
11
|
+
// ============================================================================
|
|
12
|
+
vi.mock('./install.helpers.js', () => ({
|
|
13
|
+
loadManifest: vi.fn(),
|
|
14
|
+
}));
|
|
15
|
+
vi.mock('./install.conflict-helpers.js', () => ({
|
|
16
|
+
hashContent: vi.fn((content) => {
|
|
17
|
+
// Simple deterministic mock hash
|
|
18
|
+
if (content === 'latest-content')
|
|
19
|
+
return 'aabbccdd11223344';
|
|
20
|
+
if (content === 'old-content')
|
|
21
|
+
return '11223344aabbccdd';
|
|
22
|
+
return '0000000000000000';
|
|
23
|
+
}),
|
|
24
|
+
}));
|
|
25
|
+
vi.mock('fs', async () => {
|
|
26
|
+
const actual = await vi.importActual('fs');
|
|
27
|
+
return {
|
|
28
|
+
...actual,
|
|
29
|
+
promises: {
|
|
30
|
+
...actual.promises,
|
|
31
|
+
readFile: vi.fn(),
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
import { loadManifest } from './install.helpers.js';
|
|
36
|
+
import { promises as fs } from 'fs';
|
|
37
|
+
const mockedLoadManifest = vi.mocked(loadManifest);
|
|
38
|
+
const mockedReadFile = vi.mocked(fs.readFile);
|
|
39
|
+
// ============================================================================
|
|
40
|
+
// Helpers
|
|
41
|
+
// ============================================================================
|
|
42
|
+
function makeContext(db) {
|
|
43
|
+
return {
|
|
44
|
+
db,
|
|
45
|
+
skillDependencyRepository: new SkillDependencyRepository(db),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function emptyManifest() {
|
|
49
|
+
return { version: '1', installedSkills: {} };
|
|
50
|
+
}
|
|
51
|
+
function manifestWithSkills(skills) {
|
|
52
|
+
const installedSkills = {};
|
|
53
|
+
for (const s of skills) {
|
|
54
|
+
installedSkills[s.name] = {
|
|
55
|
+
id: s.id,
|
|
56
|
+
name: s.name,
|
|
57
|
+
version: '1.0.0',
|
|
58
|
+
source: 'registry',
|
|
59
|
+
installPath: s.installPath,
|
|
60
|
+
installedAt: '2026-01-01T00:00:00Z',
|
|
61
|
+
lastUpdated: '2026-01-01T00:00:00Z',
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return { version: '1', installedSkills };
|
|
65
|
+
}
|
|
66
|
+
// ============================================================================
|
|
67
|
+
// Tests
|
|
68
|
+
// ============================================================================
|
|
69
|
+
describe('executeOutdated', () => {
|
|
70
|
+
let db;
|
|
71
|
+
let versionRepo;
|
|
72
|
+
beforeEach(() => {
|
|
73
|
+
db = createTestDatabase();
|
|
74
|
+
versionRepo = new SkillVersionRepository(db);
|
|
75
|
+
vi.clearAllMocks();
|
|
76
|
+
});
|
|
77
|
+
afterEach(() => {
|
|
78
|
+
closeDatabase(db);
|
|
79
|
+
});
|
|
80
|
+
it('returns empty result when manifest has no installed skills', async () => {
|
|
81
|
+
mockedLoadManifest.mockResolvedValue(emptyManifest());
|
|
82
|
+
const result = await executeOutdated({ include_deps: true }, makeContext(db));
|
|
83
|
+
expect(result.skills).toHaveLength(0);
|
|
84
|
+
expect(result.summary.total_installed).toBe(0);
|
|
85
|
+
expect(result.summary.outdated).toBe(0);
|
|
86
|
+
expect(result.summary.up_to_date).toBe(0);
|
|
87
|
+
expect(result.summary.unknown).toBe(0);
|
|
88
|
+
expect(result.summary.missing_deps).toBe(0);
|
|
89
|
+
});
|
|
90
|
+
it('reports all skills as current when hashes match', async () => {
|
|
91
|
+
const skillId = 'community/test-skill';
|
|
92
|
+
mockedLoadManifest.mockResolvedValue(manifestWithSkills([
|
|
93
|
+
{ id: skillId, name: 'test-skill', installPath: '/tmp/skills/test-skill' },
|
|
94
|
+
]));
|
|
95
|
+
mockedReadFile.mockResolvedValue('latest-content');
|
|
96
|
+
// Insert a version record with the same hash as hashContent('latest-content')
|
|
97
|
+
await versionRepo.recordVersion(skillId, 'aabbccdd11223344', '1.2.0');
|
|
98
|
+
const result = await executeOutdated({ include_deps: true }, makeContext(db));
|
|
99
|
+
expect(result.skills).toHaveLength(1);
|
|
100
|
+
expect(result.skills[0].status).toBe('current');
|
|
101
|
+
expect(result.skills[0].installed_hash).toBe('aabbccdd');
|
|
102
|
+
expect(result.skills[0].latest_hash).toBe('aabbccdd');
|
|
103
|
+
expect(result.skills[0].semver).toBe('1.2.0');
|
|
104
|
+
expect(result.summary.up_to_date).toBe(1);
|
|
105
|
+
expect(result.summary.outdated).toBe(0);
|
|
106
|
+
});
|
|
107
|
+
it('reports skill as outdated when hashes differ', async () => {
|
|
108
|
+
const skillId = 'community/outdated-skill';
|
|
109
|
+
mockedLoadManifest.mockResolvedValue(manifestWithSkills([
|
|
110
|
+
{ id: skillId, name: 'outdated-skill', installPath: '/tmp/skills/outdated-skill' },
|
|
111
|
+
]));
|
|
112
|
+
// Local content is old → hashContent returns '11223344aabbccdd'
|
|
113
|
+
mockedReadFile.mockResolvedValue('old-content');
|
|
114
|
+
// Registry has a different hash
|
|
115
|
+
await versionRepo.recordVersion(skillId, 'aabbccdd11223344', '2.0.0');
|
|
116
|
+
const result = await executeOutdated({ include_deps: true }, makeContext(db));
|
|
117
|
+
expect(result.skills).toHaveLength(1);
|
|
118
|
+
expect(result.skills[0].status).toBe('outdated');
|
|
119
|
+
expect(result.skills[0].installed_hash).toBe('11223344');
|
|
120
|
+
expect(result.skills[0].latest_hash).toBe('aabbccdd');
|
|
121
|
+
expect(result.skills[0].semver).toBe('2.0.0');
|
|
122
|
+
expect(result.summary.outdated).toBe(1);
|
|
123
|
+
expect(result.summary.up_to_date).toBe(0);
|
|
124
|
+
});
|
|
125
|
+
it('reports unknown when no version history exists', async () => {
|
|
126
|
+
const skillId = 'community/new-skill';
|
|
127
|
+
mockedLoadManifest.mockResolvedValue(manifestWithSkills([{ id: skillId, name: 'new-skill', installPath: '/tmp/skills/new-skill' }]));
|
|
128
|
+
mockedReadFile.mockResolvedValue('latest-content');
|
|
129
|
+
// No version records in DB for this skill
|
|
130
|
+
const result = await executeOutdated({ include_deps: true }, makeContext(db));
|
|
131
|
+
expect(result.skills).toHaveLength(1);
|
|
132
|
+
expect(result.skills[0].status).toBe('unknown');
|
|
133
|
+
expect(result.summary.unknown).toBe(1);
|
|
134
|
+
});
|
|
135
|
+
it('includes dependency status when include_deps is true', async () => {
|
|
136
|
+
const skillId = 'community/dep-skill';
|
|
137
|
+
const depSkillId = 'community/required-skill';
|
|
138
|
+
mockedLoadManifest.mockResolvedValue(manifestWithSkills([
|
|
139
|
+
{ id: skillId, name: 'dep-skill', installPath: '/tmp/skills/dep-skill' },
|
|
140
|
+
{ id: depSkillId, name: 'required-skill', installPath: '/tmp/skills/required-skill' },
|
|
141
|
+
]));
|
|
142
|
+
mockedReadFile.mockResolvedValue('latest-content');
|
|
143
|
+
await versionRepo.recordVersion(skillId, 'aabbccdd11223344', '1.0.0');
|
|
144
|
+
await versionRepo.recordVersion(depSkillId, 'aabbccdd11223344', '1.0.0');
|
|
145
|
+
// Add a dependency: dep-skill depends on required-skill (which IS installed)
|
|
146
|
+
const depRepo = new SkillDependencyRepository(db);
|
|
147
|
+
depRepo.setDependencies(skillId, [
|
|
148
|
+
{
|
|
149
|
+
skill_id: skillId,
|
|
150
|
+
dep_type: 'skill_hard',
|
|
151
|
+
dep_target: depSkillId,
|
|
152
|
+
dep_version: '*',
|
|
153
|
+
dep_source: 'declared',
|
|
154
|
+
confidence: 1.0,
|
|
155
|
+
metadata: null,
|
|
156
|
+
},
|
|
157
|
+
], 'declared');
|
|
158
|
+
const result = await executeOutdated({ include_deps: true }, makeContext(db));
|
|
159
|
+
const depSkill = result.skills.find((s) => s.id === skillId);
|
|
160
|
+
expect(depSkill?.dependencies).toBeDefined();
|
|
161
|
+
expect(depSkill.dependencies.total).toBe(1);
|
|
162
|
+
expect(depSkill.dependencies.satisfied).toHaveLength(1);
|
|
163
|
+
expect(depSkill.dependencies.missing).toHaveLength(0);
|
|
164
|
+
expect(result.summary.missing_deps).toBe(0);
|
|
165
|
+
});
|
|
166
|
+
it('omits dependency status when include_deps is false', async () => {
|
|
167
|
+
const skillId = 'community/no-dep-check';
|
|
168
|
+
mockedLoadManifest.mockResolvedValue(manifestWithSkills([
|
|
169
|
+
{ id: skillId, name: 'no-dep-check', installPath: '/tmp/skills/no-dep-check' },
|
|
170
|
+
]));
|
|
171
|
+
mockedReadFile.mockResolvedValue('latest-content');
|
|
172
|
+
await versionRepo.recordVersion(skillId, 'aabbccdd11223344', '1.0.0');
|
|
173
|
+
const result = await executeOutdated({ include_deps: false }, makeContext(db));
|
|
174
|
+
expect(result.skills).toHaveLength(1);
|
|
175
|
+
expect(result.skills[0].dependencies).toBeUndefined();
|
|
176
|
+
});
|
|
177
|
+
it('counts missing deps in summary when a skill dep is not installed', async () => {
|
|
178
|
+
const skillId = 'community/lonely-skill';
|
|
179
|
+
mockedLoadManifest.mockResolvedValue(manifestWithSkills([
|
|
180
|
+
{ id: skillId, name: 'lonely-skill', installPath: '/tmp/skills/lonely-skill' },
|
|
181
|
+
]));
|
|
182
|
+
mockedReadFile.mockResolvedValue('latest-content');
|
|
183
|
+
await versionRepo.recordVersion(skillId, 'aabbccdd11223344', '1.0.0');
|
|
184
|
+
// Add a dependency on a skill that is NOT installed
|
|
185
|
+
const depRepo = new SkillDependencyRepository(db);
|
|
186
|
+
depRepo.setDependencies(skillId, [
|
|
187
|
+
{
|
|
188
|
+
skill_id: skillId,
|
|
189
|
+
dep_type: 'skill_hard',
|
|
190
|
+
dep_target: 'community/missing-skill',
|
|
191
|
+
dep_version: '*',
|
|
192
|
+
dep_source: 'declared',
|
|
193
|
+
confidence: 1.0,
|
|
194
|
+
metadata: null,
|
|
195
|
+
},
|
|
196
|
+
], 'declared');
|
|
197
|
+
const result = await executeOutdated({ include_deps: true }, makeContext(db));
|
|
198
|
+
const skill = result.skills[0];
|
|
199
|
+
expect(skill.dependencies.missing).toHaveLength(1);
|
|
200
|
+
expect(skill.dependencies.missing[0]).toContain('missing-skill');
|
|
201
|
+
expect(result.summary.missing_deps).toBe(1);
|
|
202
|
+
});
|
|
203
|
+
// ===========================================================================
|
|
204
|
+
// SMI-3177: Corrupt manifest entries (missing installPath)
|
|
205
|
+
// ===========================================================================
|
|
206
|
+
it('handles manifest entry with missing installPath gracefully', async () => {
|
|
207
|
+
// Simulate corrupt manifest entry (runtime JSON, not type-checked)
|
|
208
|
+
const corruptManifest = {
|
|
209
|
+
version: '1',
|
|
210
|
+
installedSkills: {
|
|
211
|
+
'test-skill': {
|
|
212
|
+
id: 'test/test-skill',
|
|
213
|
+
name: 'test-skill',
|
|
214
|
+
version: '1.0.0',
|
|
215
|
+
source: 'registry',
|
|
216
|
+
installedAt: '2026-01-01T00:00:00Z',
|
|
217
|
+
lastUpdated: '2026-01-01T00:00:00Z',
|
|
218
|
+
}, // Cast to bypass TS required field
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
mockedLoadManifest.mockResolvedValue(corruptManifest);
|
|
222
|
+
const result = await executeOutdated({ include_deps: true }, makeContext(db));
|
|
223
|
+
expect(result.skills).toHaveLength(1);
|
|
224
|
+
expect(result.skills[0].status).toBe('unknown');
|
|
225
|
+
expect(result.skills[0].installed_hash).toBe('--------');
|
|
226
|
+
expect(result.skills[0].id).toBe('test/test-skill');
|
|
227
|
+
expect(result.skills[0].dependencies).toEqual({ total: 0, satisfied: [], missing: [] });
|
|
228
|
+
expect(result.summary.unknown).toBe(1);
|
|
229
|
+
expect(result.summary.total_installed).toBe(1);
|
|
230
|
+
});
|
|
231
|
+
it('processes valid entries alongside corrupt entries', async () => {
|
|
232
|
+
const manifest = {
|
|
233
|
+
version: '1',
|
|
234
|
+
installedSkills: {
|
|
235
|
+
'good-skill': {
|
|
236
|
+
id: 'community/good-skill',
|
|
237
|
+
name: 'good-skill',
|
|
238
|
+
version: '1.0.0',
|
|
239
|
+
source: 'registry',
|
|
240
|
+
installPath: '/tmp/skills/good-skill',
|
|
241
|
+
installedAt: '2026-01-01T00:00:00Z',
|
|
242
|
+
lastUpdated: '2026-01-01T00:00:00Z',
|
|
243
|
+
},
|
|
244
|
+
'bad-skill': {
|
|
245
|
+
id: 'test/bad-skill',
|
|
246
|
+
name: 'bad-skill',
|
|
247
|
+
version: '1.0.0',
|
|
248
|
+
source: 'registry',
|
|
249
|
+
installedAt: '2026-01-01T00:00:00Z',
|
|
250
|
+
lastUpdated: '2026-01-01T00:00:00Z',
|
|
251
|
+
},
|
|
252
|
+
},
|
|
253
|
+
};
|
|
254
|
+
mockedLoadManifest.mockResolvedValue(manifest);
|
|
255
|
+
mockedReadFile.mockResolvedValue('latest-content');
|
|
256
|
+
await versionRepo.recordVersion('community/good-skill', 'aabbccdd11223344', '1.0.0');
|
|
257
|
+
const result = await executeOutdated({ include_deps: true }, makeContext(db));
|
|
258
|
+
expect(result.skills).toHaveLength(2);
|
|
259
|
+
expect(result.summary.total_installed).toBe(2);
|
|
260
|
+
const good = result.skills.find((s) => s.id === 'community/good-skill');
|
|
261
|
+
const bad = result.skills.find((s) => s.id === 'test/bad-skill');
|
|
262
|
+
expect(good?.status).toBe('current');
|
|
263
|
+
expect(bad?.status).toBe('unknown');
|
|
264
|
+
expect(bad?.installed_hash).toBe('--------');
|
|
265
|
+
});
|
|
266
|
+
it('handles corrupt entry with include_deps false', async () => {
|
|
267
|
+
const corruptManifest = {
|
|
268
|
+
version: '1',
|
|
269
|
+
installedSkills: {
|
|
270
|
+
broken: {
|
|
271
|
+
id: 'test/broken',
|
|
272
|
+
name: 'broken',
|
|
273
|
+
version: '1.0.0',
|
|
274
|
+
source: 'registry',
|
|
275
|
+
installedAt: '2026-01-01T00:00:00Z',
|
|
276
|
+
lastUpdated: '2026-01-01T00:00:00Z',
|
|
277
|
+
},
|
|
278
|
+
},
|
|
279
|
+
};
|
|
280
|
+
mockedLoadManifest.mockResolvedValue(corruptManifest);
|
|
281
|
+
const result = await executeOutdated({ include_deps: false }, makeContext(db));
|
|
282
|
+
expect(result.skills).toHaveLength(1);
|
|
283
|
+
expect(result.skills[0].status).toBe('unknown');
|
|
284
|
+
expect(result.skills[0].dependencies).toBeUndefined();
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
//# sourceMappingURL=outdated.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outdated.test.js","sourceRoot":"","sources":["../../../src/tools/outdated.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,14 +30,14 @@ export declare const recommendInputSchema: z.ZodObject<{
|
|
|
30
30
|
detect_overlap: boolean;
|
|
31
31
|
min_similarity: number;
|
|
32
32
|
project_context?: string | undefined;
|
|
33
|
-
role?: "testing" | "
|
|
33
|
+
role?: "testing" | "code-quality" | "documentation" | "workflow" | "security" | "development-partner" | undefined;
|
|
34
34
|
}, {
|
|
35
35
|
installed_skills?: string[] | undefined;
|
|
36
|
-
limit?: number | undefined;
|
|
37
36
|
project_context?: string | undefined;
|
|
37
|
+
limit?: number | undefined;
|
|
38
38
|
detect_overlap?: boolean | undefined;
|
|
39
39
|
min_similarity?: number | undefined;
|
|
40
|
-
role?: "testing" | "
|
|
40
|
+
role?: "testing" | "code-quality" | "documentation" | "workflow" | "security" | "development-partner" | undefined;
|
|
41
41
|
}>;
|
|
42
42
|
/**
|
|
43
43
|
* Input type (before parsing, allows optional fields)
|
|
@@ -22,21 +22,21 @@ export declare const skillDiffInputSchema: z.ZodObject<{
|
|
|
22
22
|
hasLocalModifications: z.ZodDefault<z.ZodBoolean>;
|
|
23
23
|
trustTier: z.ZodDefault<z.ZodEnum<["verified", "community", "experimental"]>>;
|
|
24
24
|
}, "strip", z.ZodTypeAny, {
|
|
25
|
-
trustTier: "verified" | "community" | "experimental";
|
|
26
25
|
skillId: string;
|
|
27
26
|
oldContent: string;
|
|
28
27
|
newContent: string;
|
|
29
28
|
hasLocalModifications: boolean;
|
|
29
|
+
trustTier: "community" | "verified" | "experimental";
|
|
30
30
|
oldRiskScore?: number | undefined;
|
|
31
31
|
newRiskScore?: number | undefined;
|
|
32
32
|
}, {
|
|
33
33
|
skillId: string;
|
|
34
34
|
oldContent: string;
|
|
35
35
|
newContent: string;
|
|
36
|
-
trustTier?: "verified" | "community" | "experimental" | undefined;
|
|
37
36
|
oldRiskScore?: number | undefined;
|
|
38
37
|
newRiskScore?: number | undefined;
|
|
39
38
|
hasLocalModifications?: boolean | undefined;
|
|
39
|
+
trustTier?: "community" | "verified" | "experimental" | undefined;
|
|
40
40
|
}>;
|
|
41
41
|
export type SkillDiffInput = z.infer<typeof skillDiffInputSchema>;
|
|
42
42
|
/** Structured section-level diff response */
|