@skillsmith/cli 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -0
- package/assets/skillsmith-skill/SKILL.md +235 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/commands/index.d.ts +2 -0
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +4 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/install-skill.d.ts +13 -0
- package/dist/src/commands/install-skill.d.ts.map +1 -0
- package/dist/src/commands/install-skill.js +137 -0
- package/dist/src/commands/install-skill.js.map +1 -0
- package/dist/src/commands/manage.d.ts +4 -1
- package/dist/src/commands/manage.d.ts.map +1 -1
- package/dist/src/commands/manage.js +56 -10
- package/dist/src/commands/manage.js.map +1 -1
- package/dist/src/commands/merge.d.ts +17 -0
- package/dist/src/commands/merge.d.ts.map +1 -0
- package/dist/src/commands/merge.js +160 -0
- package/dist/src/commands/merge.js.map +1 -0
- package/dist/src/commands/recommend.d.ts +1 -4
- package/dist/src/commands/recommend.d.ts.map +1 -1
- package/dist/src/commands/recommend.helpers.d.ts +58 -0
- package/dist/src/commands/recommend.helpers.d.ts.map +1 -0
- package/dist/src/commands/recommend.helpers.js +428 -0
- package/dist/src/commands/recommend.helpers.js.map +1 -0
- package/dist/src/commands/recommend.js +50 -372
- package/dist/src/commands/recommend.js.map +1 -1
- package/dist/src/commands/recommend.types.d.ts +66 -0
- package/dist/src/commands/recommend.types.d.ts.map +1 -0
- package/dist/src/commands/recommend.types.js +14 -0
- package/dist/src/commands/recommend.types.js.map +1 -0
- package/dist/src/commands/search.d.ts.map +1 -1
- package/dist/src/commands/search.js +133 -18
- package/dist/src/commands/search.js.map +1 -1
- package/dist/src/config.d.ts +5 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +7 -0
- package/dist/src/config.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +11 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/utils/license.test.js +6 -1
- package/dist/src/utils/license.test.js.map +1 -1
- package/dist/src/utils/node-version.d.ts +41 -0
- package/dist/src/utils/node-version.d.ts.map +1 -0
- package/dist/src/utils/node-version.js +123 -0
- package/dist/src/utils/node-version.js.map +1 -0
- package/dist/tests/e2e/search.e2e.test.js +62 -6
- package/dist/tests/e2e/search.e2e.test.js.map +1 -1
- package/dist/tests/e2e/utils/hardcoded-detector.d.ts.map +1 -1
- package/dist/tests/e2e/utils/hardcoded-detector.js +44 -3
- package/dist/tests/e2e/utils/hardcoded-detector.js.map +1 -1
- package/dist/tests/install-skill.test.d.ts +8 -0
- package/dist/tests/install-skill.test.d.ts.map +1 -0
- package/dist/tests/install-skill.test.js +409 -0
- package/dist/tests/install-skill.test.js.map +1 -0
- package/dist/tests/manage.test.js +284 -8
- package/dist/tests/manage.test.js.map +1 -1
- package/dist/tests/node-version.test.d.ts +8 -0
- package/dist/tests/node-version.test.d.ts.map +1 -0
- package/dist/tests/node-version.test.js +200 -0
- package/dist/tests/node-version.test.js.map +1 -0
- package/dist/tests/recommend.test.js +94 -0
- package/dist/tests/recommend.test.js.map +1 -1
- package/package.json +3 -2
|
@@ -3,370 +3,16 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Analyzes a codebase and recommends relevant skills based on detected
|
|
5
5
|
* frameworks, dependencies, and patterns.
|
|
6
|
-
*
|
|
7
|
-
* References:
|
|
8
|
-
* - SMI-1283 (analyze command pattern)
|
|
9
|
-
* - packages/mcp-server/src/tools/recommend.ts (recommendation logic)
|
|
10
6
|
*/
|
|
11
7
|
import { Command } from 'commander';
|
|
12
8
|
import chalk from 'chalk';
|
|
13
9
|
import ora from 'ora';
|
|
14
|
-
import {
|
|
15
|
-
import { homedir } from 'node:os';
|
|
16
|
-
import { join } from 'node:path';
|
|
17
|
-
import { CodebaseAnalyzer, createApiClient, } from '@skillsmith/core';
|
|
10
|
+
import { CodebaseAnalyzer, createApiClient, SKILL_ROLES } from '@skillsmith/core';
|
|
18
11
|
import { sanitizeError } from '../utils/sanitize.js';
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
'verified',
|
|
24
|
-
'community',
|
|
25
|
-
'experimental',
|
|
26
|
-
'unknown',
|
|
27
|
-
];
|
|
28
|
-
/**
|
|
29
|
-
* Validate and normalize trust tier from API response (SMI-1354)
|
|
30
|
-
* Returns 'unknown' for invalid values
|
|
31
|
-
*/
|
|
32
|
-
function validateTrustTier(tier) {
|
|
33
|
-
if (typeof tier === 'string' && VALID_TRUST_TIERS.includes(tier)) {
|
|
34
|
-
return tier;
|
|
35
|
-
}
|
|
36
|
-
return 'unknown';
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Get trust badge for display (SMI-1357: Use TrustTier type)
|
|
40
|
-
*/
|
|
41
|
-
function getTrustBadge(tier) {
|
|
42
|
-
switch (tier) {
|
|
43
|
-
case 'verified':
|
|
44
|
-
return chalk.green('[VERIFIED]');
|
|
45
|
-
case 'community':
|
|
46
|
-
return chalk.blue('[COMMUNITY]');
|
|
47
|
-
case 'experimental':
|
|
48
|
-
return chalk.yellow('[EXPERIMENTAL]');
|
|
49
|
-
case 'unknown':
|
|
50
|
-
return chalk.gray('[UNKNOWN]');
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Format recommendations for terminal display
|
|
55
|
-
*/
|
|
56
|
-
function formatRecommendations(response, context) {
|
|
57
|
-
const lines = [];
|
|
58
|
-
lines.push('');
|
|
59
|
-
lines.push(chalk.bold.blue('=== Skill Recommendations ==='));
|
|
60
|
-
lines.push('');
|
|
61
|
-
if (context) {
|
|
62
|
-
// Show detected frameworks
|
|
63
|
-
if (context.frameworks.length > 0) {
|
|
64
|
-
const frameworks = context.frameworks
|
|
65
|
-
.slice(0, 3)
|
|
66
|
-
.map((f) => f.name)
|
|
67
|
-
.join(', ');
|
|
68
|
-
lines.push(chalk.dim(`Detected: ${frameworks}`));
|
|
69
|
-
lines.push('');
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
if (response.recommendations.length === 0) {
|
|
73
|
-
lines.push(chalk.yellow('No recommendations found.'));
|
|
74
|
-
lines.push('');
|
|
75
|
-
lines.push('Suggestions:');
|
|
76
|
-
lines.push(' - Ensure the project has a package.json');
|
|
77
|
-
lines.push(' - Try a project with more dependencies');
|
|
78
|
-
lines.push(' - Use --context to provide additional context');
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
lines.push(`Found ${chalk.bold(response.recommendations.length)} recommendation(s):`);
|
|
82
|
-
lines.push('');
|
|
83
|
-
response.recommendations.forEach((rec, index) => {
|
|
84
|
-
const trustBadge = getTrustBadge(rec.trust_tier);
|
|
85
|
-
const qualityColor = rec.quality_score >= 80 ? chalk.green : rec.quality_score >= 50 ? chalk.yellow : chalk.red;
|
|
86
|
-
// Format relevance - show N/A if not available from API (-1)
|
|
87
|
-
let relevanceDisplay;
|
|
88
|
-
if (rec.similarity_score < 0) {
|
|
89
|
-
relevanceDisplay = chalk.gray('N/A');
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
const relevanceColor = rec.similarity_score >= 0.7
|
|
93
|
-
? chalk.green
|
|
94
|
-
: rec.similarity_score >= 0.4
|
|
95
|
-
? chalk.yellow
|
|
96
|
-
: chalk.gray;
|
|
97
|
-
relevanceDisplay = relevanceColor(`${Math.round(rec.similarity_score * 100)}%`);
|
|
98
|
-
}
|
|
99
|
-
lines.push(`${chalk.bold(`${index + 1}.`)} ${chalk.bold(rec.name)} ${trustBadge}`);
|
|
100
|
-
lines.push(` Score: ${qualityColor(`${rec.quality_score}/100`)} | Relevance: ${relevanceDisplay}`);
|
|
101
|
-
lines.push(` ${chalk.dim(rec.reason)}`);
|
|
102
|
-
lines.push(` ${chalk.dim(`ID: ${rec.skill_id}`)}`);
|
|
103
|
-
lines.push('');
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
lines.push(chalk.dim('---'));
|
|
107
|
-
lines.push(chalk.dim(`Candidates considered: ${response.candidates_considered}`));
|
|
108
|
-
if (response.overlap_filtered > 0) {
|
|
109
|
-
lines.push(chalk.dim(`Filtered for overlap: ${response.overlap_filtered}`));
|
|
110
|
-
}
|
|
111
|
-
if (response.context.auto_detected) {
|
|
112
|
-
lines.push(chalk.dim(`Installed skills: ${response.context.installed_count} (auto-detected from ~/.claude/skills/)`));
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
lines.push(chalk.dim(`Installed skills: ${response.context.installed_count}`));
|
|
116
|
-
}
|
|
117
|
-
lines.push(chalk.dim(`Completed in ${response.timing.totalMs}ms`));
|
|
118
|
-
return lines.join('\n');
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Format recommendations as JSON
|
|
122
|
-
*/
|
|
123
|
-
function formatAsJson(response, context) {
|
|
124
|
-
const output = {
|
|
125
|
-
recommendations: response.recommendations,
|
|
126
|
-
analysis: context
|
|
127
|
-
? {
|
|
128
|
-
frameworks: context.frameworks.slice(0, 10).map((f) => ({
|
|
129
|
-
name: f.name,
|
|
130
|
-
confidence: Math.round(f.confidence * 100),
|
|
131
|
-
})),
|
|
132
|
-
dependencies: context.dependencies.slice(0, 20).map((d) => ({
|
|
133
|
-
name: d.name,
|
|
134
|
-
is_dev: d.isDev,
|
|
135
|
-
})),
|
|
136
|
-
stats: {
|
|
137
|
-
total_files: context.stats.totalFiles,
|
|
138
|
-
total_lines: context.stats.totalLines,
|
|
139
|
-
},
|
|
140
|
-
}
|
|
141
|
-
: null,
|
|
142
|
-
meta: {
|
|
143
|
-
candidates_considered: response.candidates_considered,
|
|
144
|
-
overlap_filtered: response.overlap_filtered,
|
|
145
|
-
installed_count: response.context.installed_count,
|
|
146
|
-
auto_detected: response.context.auto_detected,
|
|
147
|
-
timing_ms: response.timing.totalMs,
|
|
148
|
-
},
|
|
149
|
-
};
|
|
150
|
-
return JSON.stringify(output, null, 2);
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Build stack from codebase analysis
|
|
154
|
-
*/
|
|
155
|
-
function buildStackFromAnalysis(context) {
|
|
156
|
-
const stack = [];
|
|
157
|
-
// Add detected frameworks
|
|
158
|
-
for (const fw of context.frameworks.slice(0, 5)) {
|
|
159
|
-
stack.push(fw.name.toLowerCase());
|
|
160
|
-
}
|
|
161
|
-
// Add key dependencies
|
|
162
|
-
for (const dep of context.dependencies.slice(0, 10)) {
|
|
163
|
-
if (!dep.isDev) {
|
|
164
|
-
stack.push(dep.name.toLowerCase());
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
return [...new Set(stack)].slice(0, 10);
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* Check if error is a network-related error (SMI-1355)
|
|
171
|
-
*/
|
|
172
|
-
function isNetworkError(error) {
|
|
173
|
-
if (error instanceof Error) {
|
|
174
|
-
const message = error.message.toLowerCase();
|
|
175
|
-
return (message.includes('fetch failed') ||
|
|
176
|
-
message.includes('network') ||
|
|
177
|
-
message.includes('enotfound') ||
|
|
178
|
-
message.includes('econnrefused') ||
|
|
179
|
-
message.includes('timeout') ||
|
|
180
|
-
message.includes('socket') ||
|
|
181
|
-
error.name === 'AbortError');
|
|
182
|
-
}
|
|
183
|
-
return false;
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Format offline analysis results (SMI-1355)
|
|
187
|
-
*/
|
|
188
|
-
function formatOfflineResults(context, json) {
|
|
189
|
-
if (json) {
|
|
190
|
-
return JSON.stringify({
|
|
191
|
-
offline: true,
|
|
192
|
-
analysis: {
|
|
193
|
-
frameworks: context.frameworks.slice(0, 10).map((f) => ({
|
|
194
|
-
name: f.name,
|
|
195
|
-
confidence: Math.round(f.confidence * 100),
|
|
196
|
-
})),
|
|
197
|
-
dependencies: context.dependencies.slice(0, 20).map((d) => ({
|
|
198
|
-
name: d.name,
|
|
199
|
-
is_dev: d.isDev,
|
|
200
|
-
})),
|
|
201
|
-
stats: {
|
|
202
|
-
total_files: context.stats.totalFiles,
|
|
203
|
-
total_lines: context.stats.totalLines,
|
|
204
|
-
},
|
|
205
|
-
},
|
|
206
|
-
message: 'Unable to reach Skillsmith API. Showing analysis-only results.',
|
|
207
|
-
}, null, 2);
|
|
208
|
-
}
|
|
209
|
-
const lines = [];
|
|
210
|
-
lines.push('');
|
|
211
|
-
lines.push(chalk.yellow('⚠ Unable to reach Skillsmith API. Showing analysis-only results.'));
|
|
212
|
-
lines.push('');
|
|
213
|
-
lines.push(chalk.bold.blue('=== Codebase Analysis ==='));
|
|
214
|
-
lines.push('');
|
|
215
|
-
if (context.frameworks.length > 0) {
|
|
216
|
-
lines.push(chalk.bold('Detected Frameworks:'));
|
|
217
|
-
context.frameworks.slice(0, 5).forEach((f) => {
|
|
218
|
-
const confidence = Math.round(f.confidence * 100);
|
|
219
|
-
lines.push(` - ${f.name} (${confidence}% confidence)`);
|
|
220
|
-
});
|
|
221
|
-
lines.push('');
|
|
222
|
-
}
|
|
223
|
-
if (context.dependencies.length > 0) {
|
|
224
|
-
const prodDeps = context.dependencies.filter((d) => !d.isDev).slice(0, 10);
|
|
225
|
-
if (prodDeps.length > 0) {
|
|
226
|
-
lines.push(chalk.bold('Key Dependencies:'));
|
|
227
|
-
prodDeps.forEach((d) => lines.push(` - ${d.name}`));
|
|
228
|
-
lines.push('');
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
lines.push(chalk.dim('---'));
|
|
232
|
-
lines.push(chalk.dim(`Files analyzed: ${context.stats.totalFiles}`));
|
|
233
|
-
lines.push(chalk.dim(`Total lines: ${context.stats.totalLines.toLocaleString()}`));
|
|
234
|
-
lines.push('');
|
|
235
|
-
lines.push(chalk.cyan('To get skill recommendations, ensure network connectivity and retry.'));
|
|
236
|
-
return lines.join('\n');
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* Read installed skills from ~/.claude/skills/ directory (SMI-1358)
|
|
240
|
-
* Returns array of installed skill metadata
|
|
241
|
-
*/
|
|
242
|
-
function getInstalledSkills() {
|
|
243
|
-
const skillsDir = join(homedir(), '.claude', 'skills');
|
|
244
|
-
if (!existsSync(skillsDir)) {
|
|
245
|
-
return [];
|
|
246
|
-
}
|
|
247
|
-
const installedSkills = [];
|
|
248
|
-
try {
|
|
249
|
-
const entries = readdirSync(skillsDir);
|
|
250
|
-
for (const entry of entries) {
|
|
251
|
-
const skillPath = join(skillsDir, entry);
|
|
252
|
-
const stat = statSync(skillPath);
|
|
253
|
-
if (!stat.isDirectory()) {
|
|
254
|
-
continue;
|
|
255
|
-
}
|
|
256
|
-
// Try to read SKILL.md or skill.yaml for metadata
|
|
257
|
-
const skill = {
|
|
258
|
-
name: entry.toLowerCase(),
|
|
259
|
-
directory: entry,
|
|
260
|
-
tags: [],
|
|
261
|
-
category: null,
|
|
262
|
-
};
|
|
263
|
-
// Try to extract tags from SKILL.md frontmatter
|
|
264
|
-
const skillMdPath = join(skillPath, 'SKILL.md');
|
|
265
|
-
if (existsSync(skillMdPath)) {
|
|
266
|
-
try {
|
|
267
|
-
const content = readFileSync(skillMdPath, 'utf-8');
|
|
268
|
-
// Extract tags from YAML frontmatter
|
|
269
|
-
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
270
|
-
const frontmatter = frontmatterMatch?.[1];
|
|
271
|
-
if (frontmatter) {
|
|
272
|
-
// Extract tags
|
|
273
|
-
const tagsMatch = frontmatter.match(/tags:\s*\[(.*?)\]/);
|
|
274
|
-
const tagsContent = tagsMatch?.[1];
|
|
275
|
-
if (tagsContent) {
|
|
276
|
-
skill.tags = tagsContent
|
|
277
|
-
.split(',')
|
|
278
|
-
.map((t) => t.trim().replace(/['"]/g, '').toLowerCase())
|
|
279
|
-
.filter(Boolean);
|
|
280
|
-
}
|
|
281
|
-
// Extract category
|
|
282
|
-
const categoryMatch = frontmatter.match(/category:\s*["']?([^"'\n]+)["']?/);
|
|
283
|
-
const categoryContent = categoryMatch?.[1];
|
|
284
|
-
if (categoryContent) {
|
|
285
|
-
skill.category = categoryContent.trim().toLowerCase();
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
catch {
|
|
290
|
-
// Ignore read errors
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
installedSkills.push(skill);
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
catch {
|
|
297
|
-
// Return empty array if directory cannot be read
|
|
298
|
-
return [];
|
|
299
|
-
}
|
|
300
|
-
return installedSkills;
|
|
301
|
-
}
|
|
302
|
-
/**
|
|
303
|
-
* Normalize a skill name for comparison (SMI-1358)
|
|
304
|
-
* Removes common prefixes/suffixes and normalizes case
|
|
305
|
-
*/
|
|
306
|
-
function normalizeSkillName(name) {
|
|
307
|
-
return name
|
|
308
|
-
.toLowerCase()
|
|
309
|
-
.replace(/[-_]/g, '')
|
|
310
|
-
.replace(/^skill/, '')
|
|
311
|
-
.replace(/skill$/, '')
|
|
312
|
-
.replace(/^helper/, '')
|
|
313
|
-
.replace(/helper$/, '')
|
|
314
|
-
.trim();
|
|
315
|
-
}
|
|
316
|
-
/**
|
|
317
|
-
* Check if two skills overlap in functionality (SMI-1358)
|
|
318
|
-
* Uses name similarity, tag matching, and category comparison
|
|
319
|
-
*/
|
|
320
|
-
function skillsOverlap(installed, recommended) {
|
|
321
|
-
const installedName = normalizeSkillName(installed.name);
|
|
322
|
-
const recommendedName = normalizeSkillName(recommended.name);
|
|
323
|
-
const recommendedId = recommended.skill_id.toLowerCase();
|
|
324
|
-
// Direct name match (exact or normalized)
|
|
325
|
-
if (installedName === recommendedName) {
|
|
326
|
-
return true;
|
|
327
|
-
}
|
|
328
|
-
// Check if installed name is contained in recommended ID
|
|
329
|
-
// e.g., installed "jest" overlaps with "community/jest-helper"
|
|
330
|
-
if (recommendedId.includes(installed.name)) {
|
|
331
|
-
return true;
|
|
332
|
-
}
|
|
333
|
-
// Check if normalized names contain each other
|
|
334
|
-
if (installedName.includes(recommendedName) || recommendedName.includes(installedName)) {
|
|
335
|
-
// Only match if substantial overlap (at least 4 chars)
|
|
336
|
-
if (installedName.length >= 4 && recommendedName.length >= 4) {
|
|
337
|
-
return true;
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
// Tag-based overlap detection
|
|
341
|
-
if (installed.tags.length > 0) {
|
|
342
|
-
const recommendedNameParts = recommended.name.toLowerCase().split(/[-_\s]+/);
|
|
343
|
-
const hasTagOverlap = installed.tags.some((tag) => recommendedNameParts.includes(tag) || recommendedName.includes(tag));
|
|
344
|
-
if (hasTagOverlap) {
|
|
345
|
-
return true;
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
return false;
|
|
349
|
-
}
|
|
350
|
-
/**
|
|
351
|
-
* Filter recommendations to remove overlaps with installed skills (SMI-1358)
|
|
352
|
-
*/
|
|
353
|
-
function filterOverlappingSkills(recommendations, installedSkills) {
|
|
354
|
-
if (installedSkills.length === 0) {
|
|
355
|
-
return { filtered: recommendations, overlapCount: 0 };
|
|
356
|
-
}
|
|
357
|
-
const filtered = [];
|
|
358
|
-
let overlapCount = 0;
|
|
359
|
-
for (const rec of recommendations) {
|
|
360
|
-
const hasOverlap = installedSkills.some((installed) => skillsOverlap(installed, rec));
|
|
361
|
-
if (hasOverlap) {
|
|
362
|
-
overlapCount++;
|
|
363
|
-
}
|
|
364
|
-
else {
|
|
365
|
-
filtered.push(rec);
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
return { filtered, overlapCount };
|
|
369
|
-
}
|
|
12
|
+
import { validateTrustTier, isNetworkError, formatRecommendations, formatAsJson, formatOfflineResults, buildStackFromAnalysis, getInstalledSkills, inferRolesFromTags, filterOverlappingSkills, } from './recommend.helpers.js';
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// Main Workflow
|
|
15
|
+
// ============================================================================
|
|
370
16
|
/**
|
|
371
17
|
* Run recommendation workflow
|
|
372
18
|
*/
|
|
@@ -385,7 +31,6 @@ async function runRecommend(targetPath, options) {
|
|
|
385
31
|
// Step 2: Build recommendation request
|
|
386
32
|
spinner.start('Finding skill recommendations...');
|
|
387
33
|
const stack = buildStackFromAnalysis(codebaseContext);
|
|
388
|
-
// Add user-provided context
|
|
389
34
|
if (options.context) {
|
|
390
35
|
const contextWords = options.context
|
|
391
36
|
.toLowerCase()
|
|
@@ -400,24 +45,22 @@ async function runRecommend(targetPath, options) {
|
|
|
400
45
|
stack: stack.slice(0, 10),
|
|
401
46
|
limit: options.limit,
|
|
402
47
|
});
|
|
403
|
-
// Transform API response
|
|
48
|
+
// Transform API response
|
|
404
49
|
let recommendations = apiResponse.data.map((skill) => ({
|
|
405
50
|
skill_id: skill.id,
|
|
406
51
|
name: skill.name,
|
|
407
52
|
reason: `Matches your stack: ${stack.slice(0, 3).join(', ')}`,
|
|
408
|
-
similarity_score: -1,
|
|
53
|
+
similarity_score: -1,
|
|
409
54
|
trust_tier: validateTrustTier(skill.trust_tier),
|
|
410
55
|
quality_score: Math.round((skill.quality_score ?? 0.5) * 100),
|
|
56
|
+
roles: inferRolesFromTags(skill.tags || []),
|
|
411
57
|
}));
|
|
412
|
-
//
|
|
413
|
-
// noOverlap = true means user passed --no-overlap, so we should NOT filter
|
|
58
|
+
// Apply overlap filtering
|
|
414
59
|
let overlapFiltered = 0;
|
|
415
60
|
let installedSkills = [];
|
|
416
61
|
const autoDetected = !options.installed || options.installed.length === 0;
|
|
417
62
|
if (!options.noOverlap) {
|
|
418
|
-
// Get installed skills (auto-detect from ~/.claude/skills/ if not provided)
|
|
419
63
|
if (options.installed && options.installed.length > 0) {
|
|
420
|
-
// Convert provided skill IDs to InstalledSkill format
|
|
421
64
|
installedSkills = options.installed.map((id) => ({
|
|
422
65
|
name: id.toLowerCase().split('/').pop() ?? id.toLowerCase(),
|
|
423
66
|
directory: id,
|
|
@@ -426,7 +69,6 @@ async function runRecommend(targetPath, options) {
|
|
|
426
69
|
}));
|
|
427
70
|
}
|
|
428
71
|
else {
|
|
429
|
-
// Auto-detect installed skills
|
|
430
72
|
installedSkills = getInstalledSkills();
|
|
431
73
|
}
|
|
432
74
|
if (installedSkills.length > 0) {
|
|
@@ -435,21 +77,43 @@ async function runRecommend(targetPath, options) {
|
|
|
435
77
|
overlapFiltered = filterResult.overlapCount;
|
|
436
78
|
}
|
|
437
79
|
}
|
|
80
|
+
// Apply role-based filtering
|
|
81
|
+
let roleFiltered = 0;
|
|
82
|
+
if (options.role) {
|
|
83
|
+
const beforeRoleFilter = recommendations.length;
|
|
84
|
+
recommendations = recommendations.filter((rec) => rec.roles?.includes(options.role));
|
|
85
|
+
roleFiltered = beforeRoleFilter - recommendations.length;
|
|
86
|
+
recommendations = recommendations.map((rec) => ({
|
|
87
|
+
...rec,
|
|
88
|
+
quality_score: Math.min(100, rec.quality_score + 30),
|
|
89
|
+
reason: `${rec.reason} (role: ${options.role})`,
|
|
90
|
+
}));
|
|
91
|
+
recommendations.sort((a, b) => b.quality_score - a.quality_score);
|
|
92
|
+
}
|
|
438
93
|
const response = {
|
|
439
94
|
recommendations,
|
|
440
95
|
candidates_considered: apiResponse.data.length,
|
|
441
96
|
overlap_filtered: overlapFiltered,
|
|
97
|
+
role_filtered: roleFiltered,
|
|
442
98
|
context: {
|
|
443
99
|
installed_count: installedSkills.length,
|
|
444
100
|
has_project_context: !!options.context,
|
|
445
101
|
using_semantic_matching: true,
|
|
446
102
|
auto_detected: autoDetected,
|
|
103
|
+
...(options.role ? { role_filter: options.role } : {}),
|
|
447
104
|
},
|
|
448
|
-
timing: {
|
|
449
|
-
totalMs: codebaseContext.metadata.durationMs,
|
|
450
|
-
},
|
|
105
|
+
timing: { totalMs: codebaseContext.metadata.durationMs },
|
|
451
106
|
};
|
|
452
|
-
|
|
107
|
+
let filterMsg = '';
|
|
108
|
+
if (overlapFiltered > 0 || roleFiltered > 0) {
|
|
109
|
+
const parts = [];
|
|
110
|
+
if (overlapFiltered > 0)
|
|
111
|
+
parts.push(`${overlapFiltered} overlap`);
|
|
112
|
+
if (roleFiltered > 0)
|
|
113
|
+
parts.push(`${roleFiltered} role`);
|
|
114
|
+
filterMsg = ` (filtered: ${parts.join(', ')})`;
|
|
115
|
+
}
|
|
116
|
+
spinner.succeed(`Found ${response.recommendations.length} recommendations${filterMsg}`);
|
|
453
117
|
// Step 4: Output results
|
|
454
118
|
if (options.json) {
|
|
455
119
|
console.log(formatAsJson(response, codebaseContext));
|
|
@@ -459,7 +123,6 @@ async function runRecommend(targetPath, options) {
|
|
|
459
123
|
}
|
|
460
124
|
}
|
|
461
125
|
catch (error) {
|
|
462
|
-
// SMI-1355: Check if this is a network error and we have codebase context
|
|
463
126
|
if (isNetworkError(error) && codebaseContext) {
|
|
464
127
|
spinner.warn('Unable to reach API, showing analysis-only results');
|
|
465
128
|
console.log(formatOfflineResults(codebaseContext, options.json));
|
|
@@ -475,6 +138,9 @@ async function runRecommend(targetPath, options) {
|
|
|
475
138
|
process.exit(1);
|
|
476
139
|
}
|
|
477
140
|
}
|
|
141
|
+
// ============================================================================
|
|
142
|
+
// Command Creation
|
|
143
|
+
// ============================================================================
|
|
478
144
|
/**
|
|
479
145
|
* Create recommend command
|
|
480
146
|
*/
|
|
@@ -488,6 +154,7 @@ export function createRecommendCommand() {
|
|
|
488
154
|
.option('-i, --installed <skills...>', 'Currently installed skill IDs')
|
|
489
155
|
.option('--no-overlap', 'Disable overlap detection')
|
|
490
156
|
.option('-m, --max-files <number>', 'Maximum files to analyze', '1000')
|
|
157
|
+
.option('-r, --role <role>', `SMI-1631: Filter by skill role (${SKILL_ROLES.join(', ')}). Skills matching the role get a +30 score boost.`)
|
|
491
158
|
.action(async (targetPath, opts) => {
|
|
492
159
|
const limit = parseInt(opts['limit'], 10);
|
|
493
160
|
const maxFiles = parseInt(opts['max-files'], 10);
|
|
@@ -495,6 +162,16 @@ export function createRecommendCommand() {
|
|
|
495
162
|
const context = opts['context'];
|
|
496
163
|
const installed = opts['installed'];
|
|
497
164
|
const noOverlap = opts['overlap'] === false;
|
|
165
|
+
const roleInput = opts['role'];
|
|
166
|
+
let role;
|
|
167
|
+
if (roleInput) {
|
|
168
|
+
if (SKILL_ROLES.includes(roleInput)) {
|
|
169
|
+
role = roleInput;
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
console.error(chalk.yellow(`Warning: Invalid role "${roleInput}". Valid roles: ${SKILL_ROLES.join(', ')}`));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
498
175
|
await runRecommend(targetPath, {
|
|
499
176
|
limit: isNaN(limit) ? 5 : Math.min(Math.max(limit, 1), 50),
|
|
500
177
|
maxFiles: isNaN(maxFiles) ? 1000 : maxFiles,
|
|
@@ -502,6 +179,7 @@ export function createRecommendCommand() {
|
|
|
502
179
|
context,
|
|
503
180
|
installed,
|
|
504
181
|
noOverlap,
|
|
182
|
+
role,
|
|
505
183
|
});
|
|
506
184
|
});
|
|
507
185
|
return cmd;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recommend.js","sourceRoot":"","sources":["../../../src/commands/recommend.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"recommend.js","sourceRoot":"","sources":["../../../src/commands/recommend.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAkB,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACjG,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAOpD,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,wBAAwB,CAAA;AAE/B,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E;;GAEG;AACH,KAAK,UAAU,YAAY,CAAC,UAAkB,EAAE,OAAyB;IACvE,MAAM,OAAO,GAAG,GAAG,EAAE,CAAA;IACrB,IAAI,eAAe,GAA4D,IAAI,CAAA;IAEnF,IAAI,CAAC;QACH,2BAA2B;QAC3B,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;QACtC,MAAM,QAAQ,GAAG,IAAI,gBAAgB,EAAE,CAAA;QAEvC,eAAe,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE;YACnD,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,cAAc,EAAE,IAAI;SACrB,CAAC,CAAA;QAEF,OAAO,CAAC,OAAO,CACb,YAAY,eAAe,CAAC,KAAK,CAAC,UAAU,WAAW,eAAe,CAAC,UAAU,CAAC,MAAM,uBAAuB,CAChH,CAAA;QAED,uCAAuC;QACvC,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAA;QAEjD,MAAM,KAAK,GAAG,sBAAsB,CAAC,eAAe,CAAC,CAAA;QAErD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO;iBACjC,WAAW,EAAE;iBACb,KAAK,CAAC,KAAK,CAAC;iBACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;iBAC3B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACd,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAA;QAC7B,CAAC;QAED,kCAAkC;QAClC,MAAM,SAAS,GAAG,eAAe,EAAE,CAAA;QAEnC,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,kBAAkB,CAAC;YACrD,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YACzB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAA;QAEF,yBAAyB;QACzB,IAAI,eAAe,GAA0B,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5E,QAAQ,EAAE,KAAK,CAAC,EAAE;YAClB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,uBAAuB,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC7D,gBAAgB,EAAE,CAAC,CAAC;YACpB,UAAU,EAAE,iBAAiB,CAAC,KAAK,CAAC,UAAU,CAAC;YAC/C,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,aAAa,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC;YAC7D,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;SAC5C,CAAC,CAAC,CAAA;QAEH,0BAA0B;QAC1B,IAAI,eAAe,GAAG,CAAC,CAAA;QACvB,IAAI,eAAe,GAAmD,EAAE,CAAA;QACxE,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAA;QAEzE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACvB,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtD,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBAC/C,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE;oBAC3D,SAAS,EAAE,EAAE;oBACb,IAAI,EAAE,EAAE;oBACR,QAAQ,EAAE,IAAI;iBACf,CAAC,CAAC,CAAA;YACL,CAAC;iBAAM,CAAC;gBACN,eAAe,GAAG,kBAAkB,EAAE,CAAA;YACxC,CAAC;YAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,YAAY,GAAG,uBAAuB,CAAC,eAAe,EAAE,eAAe,CAAC,CAAA;gBAC9E,eAAe,GAAG,YAAY,CAAC,QAAQ,CAAA;gBACvC,eAAe,GAAG,YAAY,CAAC,YAAY,CAAA;YAC7C,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,IAAI,YAAY,GAAG,CAAC,CAAA;QACpB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAA;YAC/C,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAK,CAAC,CAAC,CAAA;YACrF,YAAY,GAAG,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAA;YAExD,eAAe,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC9C,GAAG,GAAG;gBACN,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,aAAa,GAAG,EAAE,CAAC;gBACpD,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,WAAW,OAAO,CAAC,IAAI,GAAG;aAChD,CAAC,CAAC,CAAA;YACH,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC,CAAA;QACnE,CAAC;QAED,MAAM,QAAQ,GAAsB;YAClC,eAAe;YACf,qBAAqB,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM;YAC9C,gBAAgB,EAAE,eAAe;YACjC,aAAa,EAAE,YAAY;YAC3B,OAAO,EAAE;gBACP,eAAe,EAAE,eAAe,CAAC,MAAM;gBACvC,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO;gBACtC,uBAAuB,EAAE,IAAI;gBAC7B,aAAa,EAAE,YAAY;gBAC3B,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvD;YACD,MAAM,EAAE,EAAE,OAAO,EAAE,eAAe,CAAC,QAAQ,CAAC,UAAU,EAAE;SACzD,CAAA;QAED,IAAI,SAAS,GAAG,EAAE,CAAA;QAClB,IAAI,eAAe,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAa,EAAE,CAAA;YAC1B,IAAI,eAAe,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,eAAe,UAAU,CAAC,CAAA;YACjE,IAAI,YAAY,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,OAAO,CAAC,CAAA;YACxD,SAAS,GAAG,eAAe,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAA;QAChD,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,SAAS,QAAQ,CAAC,eAAe,CAAC,MAAM,mBAAmB,SAAS,EAAE,CAAC,CAAA;QAEvF,yBAAyB;QACzB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAA;QACtD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAA;QAC/D,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,eAAe,EAAE,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAA;YAClE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;YAChE,OAAM;QACR,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;QAErC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;QAChE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAA;QAC1D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;SACjC,WAAW,CAAC,6EAA6E,CAAC;SAC1F,QAAQ,CAAC,QAAQ,EAAE,iCAAiC,EAAE,GAAG,CAAC;SAC1D,MAAM,CAAC,sBAAsB,EAAE,mCAAmC,EAAE,GAAG,CAAC;SACxE,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC;SAC9C,MAAM,CAAC,sBAAsB,EAAE,wCAAwC,CAAC;SACxE,MAAM,CAAC,6BAA6B,EAAE,+BAA+B,CAAC;SACtE,MAAM,CAAC,cAAc,EAAE,2BAA2B,CAAC;SACnD,MAAM,CAAC,0BAA0B,EAAE,0BAA0B,EAAE,MAAM,CAAC;SACtE,MAAM,CACL,mBAAmB,EACnB,mCAAmC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,oDAAoD,CAC9G;SACA,MAAM,CACL,KAAK,EAAE,UAAkB,EAAE,IAA6D,EAAE,EAAE;QAC1F,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAW,EAAE,EAAE,CAAC,CAAA;QACnD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAW,EAAE,EAAE,CAAC,CAAA;QAC1D,MAAM,IAAI,GAAI,IAAI,CAAC,MAAM,CAAa,KAAK,IAAI,CAAA;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAuB,CAAA;QACrD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAyB,CAAA;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,CAAA;QAE3C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAuB,CAAA;QACpD,IAAI,IAA2B,CAAA;QAC/B,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAsB,CAAC,EAAE,CAAC;gBACjD,IAAI,GAAG,SAAsB,CAAA;YAC/B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,MAAM,CACV,0BAA0B,SAAS,mBAAmB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/E,CACF,CAAA;YACH,CAAC;QACH,CAAC;QAED,MAAM,YAAY,CAAC,UAAU,EAAE;YAC7B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAC1D,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ;YAC3C,IAAI;YACJ,OAAO;YACP,SAAS;YACT,SAAS;YACT,IAAI;SACL,CAAC,CAAA;IACJ,CAAC,CACF,CAAA;IAEH,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,eAAe,sBAAsB,CAAA"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1299: CLI Recommend Command Types
|
|
3
|
+
* @module @skillsmith/cli/commands/recommend.types
|
|
4
|
+
*/
|
|
5
|
+
import type { TrustTier, SkillRole } from '@skillsmith/core';
|
|
6
|
+
/**
|
|
7
|
+
* Valid trust tier values
|
|
8
|
+
*/
|
|
9
|
+
export declare const VALID_TRUST_TIERS: readonly TrustTier[];
|
|
10
|
+
/**
|
|
11
|
+
* Skill recommendation from API
|
|
12
|
+
*/
|
|
13
|
+
export interface SkillRecommendation {
|
|
14
|
+
skill_id: string;
|
|
15
|
+
name: string;
|
|
16
|
+
reason: string;
|
|
17
|
+
similarity_score: number;
|
|
18
|
+
trust_tier: TrustTier;
|
|
19
|
+
quality_score: number;
|
|
20
|
+
/** SMI-1631: Skill roles for role-based filtering */
|
|
21
|
+
roles?: SkillRole[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Recommendation response
|
|
25
|
+
*/
|
|
26
|
+
export interface RecommendResponse {
|
|
27
|
+
recommendations: SkillRecommendation[];
|
|
28
|
+
candidates_considered: number;
|
|
29
|
+
overlap_filtered: number;
|
|
30
|
+
/** SMI-1631: Skills filtered due to role mismatch */
|
|
31
|
+
role_filtered: number;
|
|
32
|
+
context: {
|
|
33
|
+
installed_count: number;
|
|
34
|
+
has_project_context: boolean;
|
|
35
|
+
using_semantic_matching: boolean;
|
|
36
|
+
auto_detected: boolean;
|
|
37
|
+
/** SMI-1631: Role filter applied */
|
|
38
|
+
role_filter?: SkillRole;
|
|
39
|
+
};
|
|
40
|
+
timing: {
|
|
41
|
+
totalMs: number;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Installed skill metadata (SMI-1358)
|
|
46
|
+
*/
|
|
47
|
+
export interface InstalledSkill {
|
|
48
|
+
name: string;
|
|
49
|
+
directory: string;
|
|
50
|
+
tags: string[];
|
|
51
|
+
category: string | null;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Recommend command options
|
|
55
|
+
*/
|
|
56
|
+
export interface RecommendOptions {
|
|
57
|
+
limit: number;
|
|
58
|
+
json: boolean;
|
|
59
|
+
context: string | undefined;
|
|
60
|
+
installed: string[] | undefined;
|
|
61
|
+
noOverlap: boolean;
|
|
62
|
+
maxFiles: number;
|
|
63
|
+
/** SMI-1631: Filter by skill role */
|
|
64
|
+
role: SkillRole | undefined;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=recommend.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommend.types.d.ts","sourceRoot":"","sources":["../../../src/commands/recommend.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5D;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,SAAS,EAKxC,CAAA;AAEV;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE,MAAM,CAAA;IACxB,UAAU,EAAE,SAAS,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,qDAAqD;IACrD,KAAK,CAAC,EAAE,SAAS,EAAE,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,mBAAmB,EAAE,CAAA;IACtC,qBAAqB,EAAE,MAAM,CAAA;IAC7B,gBAAgB,EAAE,MAAM,CAAA;IACxB,qDAAqD;IACrD,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE;QACP,eAAe,EAAE,MAAM,CAAA;QACvB,mBAAmB,EAAE,OAAO,CAAA;QAC5B,uBAAuB,EAAE,OAAO,CAAA;QAChC,aAAa,EAAE,OAAO,CAAA;QACtB,oCAAoC;QACpC,WAAW,CAAC,EAAE,SAAS,CAAA;KACxB,CAAA;IACD,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;CACF;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;IAC/B,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,qCAAqC;IACrC,IAAI,EAAE,SAAS,GAAG,SAAS,CAAA;CAC5B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1299: CLI Recommend Command Types
|
|
3
|
+
* @module @skillsmith/cli/commands/recommend.types
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Valid trust tier values
|
|
7
|
+
*/
|
|
8
|
+
export const VALID_TRUST_TIERS = [
|
|
9
|
+
'verified',
|
|
10
|
+
'community',
|
|
11
|
+
'experimental',
|
|
12
|
+
'unknown',
|
|
13
|
+
];
|
|
14
|
+
//# sourceMappingURL=recommend.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommend.types.js","sourceRoot":"","sources":["../../../src/commands/recommend.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAyB;IACrD,UAAU;IACV,WAAW;IACX,cAAc;IACd,SAAS;CACD,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAwYnC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAkJ7C;AAED,eAAe,mBAAmB,CAAA"}
|