skillpkg-core 0.5.5 → 0.5.7
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/adapters/adapter-manager.d.ts +51 -0
- package/dist/adapters/adapter-manager.d.ts.map +1 -0
- package/dist/adapters/adapter-manager.js +147 -0
- package/dist/adapters/adapter-manager.js.map +1 -0
- package/dist/adapters/base.d.ts.map +1 -1
- package/dist/adapters/base.js +14 -3
- package/dist/adapters/base.js.map +1 -1
- package/dist/adapters/index.d.ts +1 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +1 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/config/types.d.ts +3 -3
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +0 -1
- package/dist/config/types.js.map +1 -1
- package/dist/discovery/discovery-manager.d.ts +55 -0
- package/dist/discovery/discovery-manager.d.ts.map +1 -0
- package/dist/discovery/discovery-manager.js +217 -0
- package/dist/discovery/discovery-manager.js.map +1 -0
- package/dist/discovery/index.d.ts +20 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +21 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/manager.d.ts +53 -0
- package/dist/discovery/manager.d.ts.map +1 -0
- package/dist/discovery/manager.js +203 -0
- package/dist/discovery/manager.js.map +1 -0
- package/dist/discovery/providers/awesome.d.ts +72 -0
- package/dist/discovery/providers/awesome.d.ts.map +1 -0
- package/dist/discovery/providers/awesome.js +214 -0
- package/dist/discovery/providers/awesome.js.map +1 -0
- package/dist/discovery/providers/github.d.ts +44 -0
- package/dist/discovery/providers/github.d.ts.map +1 -0
- package/dist/discovery/providers/github.js +82 -0
- package/dist/discovery/providers/github.js.map +1 -0
- package/dist/discovery/providers/index.d.ts +9 -0
- package/dist/discovery/providers/index.d.ts.map +1 -0
- package/dist/discovery/providers/index.js +9 -0
- package/dist/discovery/providers/index.js.map +1 -0
- package/dist/discovery/providers/local.d.ts +38 -0
- package/dist/discovery/providers/local.d.ts.map +1 -0
- package/dist/discovery/providers/local.js +75 -0
- package/dist/discovery/providers/local.js.map +1 -0
- package/dist/discovery/providers/priority.d.ts +89 -0
- package/dist/discovery/providers/priority.d.ts.map +1 -0
- package/dist/discovery/providers/priority.js +258 -0
- package/dist/discovery/providers/priority.js.map +1 -0
- package/dist/discovery/providers/skillsmp.d.ts +66 -0
- package/dist/discovery/providers/skillsmp.d.ts.map +1 -0
- package/dist/discovery/providers/skillsmp.js +134 -0
- package/dist/discovery/providers/skillsmp.js.map +1 -0
- package/dist/discovery/types.d.ts +108 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +5 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/doctor/doctor.d.ts +62 -0
- package/dist/doctor/doctor.d.ts.map +1 -0
- package/dist/doctor/doctor.js +399 -0
- package/dist/doctor/doctor.js.map +1 -0
- package/dist/doctor/index.d.ts +6 -0
- package/dist/doctor/index.d.ts.map +1 -0
- package/dist/doctor/index.js +6 -0
- package/dist/doctor/index.js.map +1 -0
- package/dist/doctor/types.d.ts +68 -0
- package/dist/doctor/types.d.ts.map +1 -0
- package/dist/doctor/types.js +2 -0
- package/dist/doctor/types.js.map +1 -0
- package/dist/fetcher/fetcher.d.ts.map +1 -1
- package/dist/fetcher/fetcher.js +265 -25
- package/dist/fetcher/fetcher.js.map +1 -1
- package/dist/fetcher/source-parser.d.ts +8 -6
- package/dist/fetcher/source-parser.d.ts.map +1 -1
- package/dist/fetcher/source-parser.js +37 -16
- package/dist/fetcher/source-parser.js.map +1 -1
- package/dist/fetcher/types.d.ts +17 -4
- package/dist/fetcher/types.d.ts.map +1 -1
- package/dist/fetcher/types.js.map +1 -1
- package/dist/importer/importer.js +1 -1
- package/dist/importer/importer.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/installer/installer.d.ts +1 -1
- package/dist/installer/installer.d.ts.map +1 -1
- package/dist/installer/installer.js +15 -7
- package/dist/installer/installer.js.map +1 -1
- package/dist/installer/types.d.ts +15 -13
- package/dist/installer/types.d.ts.map +1 -1
- package/dist/matching/engine.d.ts +57 -0
- package/dist/matching/engine.d.ts.map +1 -0
- package/dist/matching/engine.js +419 -0
- package/dist/matching/engine.js.map +1 -0
- package/dist/matching/index.d.ts +9 -0
- package/dist/matching/index.d.ts.map +1 -0
- package/dist/matching/index.js +8 -0
- package/dist/matching/index.js.map +1 -0
- package/dist/matching/types.d.ts +91 -0
- package/dist/matching/types.d.ts.map +1 -0
- package/dist/matching/types.js +13 -0
- package/dist/matching/types.js.map +1 -0
- package/dist/parser/schema.d.ts +61 -8
- package/dist/parser/schema.d.ts.map +1 -1
- package/dist/parser/schema.js +59 -9
- package/dist/parser/schema.js.map +1 -1
- package/dist/resolver/dependency-resolver.d.ts.map +1 -1
- package/dist/resolver/dependency-resolver.js +15 -3
- package/dist/resolver/dependency-resolver.js.map +1 -1
- package/dist/resolver/index.d.ts +1 -1
- package/dist/resolver/index.d.ts.map +1 -1
- package/dist/resolver/index.js.map +1 -1
- package/dist/resolver/types.d.ts +13 -0
- package/dist/resolver/types.d.ts.map +1 -1
- package/dist/skill/reader.d.ts.map +1 -1
- package/dist/skill/reader.js +12 -11
- package/dist/skill/reader.js.map +1 -1
- package/dist/skill/types.d.ts +28 -2
- package/dist/skill/types.d.ts.map +1 -1
- package/dist/state/state-manager.d.ts +19 -0
- package/dist/state/state-manager.d.ts.map +1 -1
- package/dist/state/state-manager.js +50 -0
- package/dist/state/state-manager.js.map +1 -1
- package/dist/store/config.d.ts.map +1 -1
- package/dist/store/config.js +7 -0
- package/dist/store/config.js.map +1 -1
- package/dist/store/index.d.ts +2 -2
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +1 -1
- package/dist/store/index.js.map +1 -1
- package/dist/store/manager.d.ts +2 -0
- package/dist/store/manager.d.ts.map +1 -1
- package/dist/store/manager.js +19 -1
- package/dist/store/manager.js.map +1 -1
- package/dist/store/store-manager.d.ts +123 -0
- package/dist/store/store-manager.d.ts.map +1 -0
- package/dist/store/store-manager.js +312 -0
- package/dist/store/store-manager.js.map +1 -0
- package/dist/syncer/syncer.d.ts +4 -0
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +91 -27
- package/dist/syncer/syncer.js.map +1 -1
- package/dist/syncer/types.d.ts +16 -8
- package/dist/syncer/types.d.ts.map +1 -1
- package/dist/syncer/types.js +29 -32
- package/dist/syncer/types.js.map +1 -1
- package/dist/types.d.ts +33 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +9 -2
- package/dist/types.js.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Matching Engine
|
|
3
|
+
*
|
|
4
|
+
* Analyzes user goals and recommends relevant skills based on
|
|
5
|
+
* keyword matching with configurable weights.
|
|
6
|
+
*/
|
|
7
|
+
import { DEFAULT_WEIGHTS } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Priority order for sorting (higher = better)
|
|
10
|
+
*/
|
|
11
|
+
const PRIORITY_ORDER = {
|
|
12
|
+
high: 3,
|
|
13
|
+
medium: 2,
|
|
14
|
+
low: 1,
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Skill Matching Engine
|
|
18
|
+
*/
|
|
19
|
+
export class MatchingEngine {
|
|
20
|
+
weights;
|
|
21
|
+
minConfidence;
|
|
22
|
+
researchThreshold;
|
|
23
|
+
maxResults;
|
|
24
|
+
constructor(options = {}) {
|
|
25
|
+
this.weights = { ...DEFAULT_WEIGHTS, ...options.weights };
|
|
26
|
+
this.minConfidence = options.minConfidence ?? 0.3;
|
|
27
|
+
this.researchThreshold = options.researchThreshold ?? 0.5;
|
|
28
|
+
this.maxResults = options.maxResults ?? 5;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Extract keywords from user goal
|
|
32
|
+
*/
|
|
33
|
+
extractKeywords(goal) {
|
|
34
|
+
// Normalize: lowercase and split by common delimiters
|
|
35
|
+
const normalized = goal.toLowerCase();
|
|
36
|
+
// Split by spaces, punctuation, and common separators
|
|
37
|
+
const words = normalized
|
|
38
|
+
.split(/[\s,.\-_:;!?()[\]{}'"、。,!?]+/)
|
|
39
|
+
.filter((word) => word.length > 1);
|
|
40
|
+
// Remove common stop words (basic set for both English and Chinese)
|
|
41
|
+
const stopWords = new Set([
|
|
42
|
+
// English
|
|
43
|
+
'a',
|
|
44
|
+
'an',
|
|
45
|
+
'the',
|
|
46
|
+
'is',
|
|
47
|
+
'are',
|
|
48
|
+
'was',
|
|
49
|
+
'were',
|
|
50
|
+
'be',
|
|
51
|
+
'been',
|
|
52
|
+
'being',
|
|
53
|
+
'have',
|
|
54
|
+
'has',
|
|
55
|
+
'had',
|
|
56
|
+
'do',
|
|
57
|
+
'does',
|
|
58
|
+
'did',
|
|
59
|
+
'will',
|
|
60
|
+
'would',
|
|
61
|
+
'could',
|
|
62
|
+
'should',
|
|
63
|
+
'may',
|
|
64
|
+
'might',
|
|
65
|
+
'must',
|
|
66
|
+
'shall',
|
|
67
|
+
'can',
|
|
68
|
+
'need',
|
|
69
|
+
'dare',
|
|
70
|
+
'ought',
|
|
71
|
+
'used',
|
|
72
|
+
'want',
|
|
73
|
+
'to',
|
|
74
|
+
'of',
|
|
75
|
+
'in',
|
|
76
|
+
'for',
|
|
77
|
+
'on',
|
|
78
|
+
'with',
|
|
79
|
+
'at',
|
|
80
|
+
'by',
|
|
81
|
+
'from',
|
|
82
|
+
'as',
|
|
83
|
+
'into',
|
|
84
|
+
'through',
|
|
85
|
+
'during',
|
|
86
|
+
'before',
|
|
87
|
+
'after',
|
|
88
|
+
'above',
|
|
89
|
+
'below',
|
|
90
|
+
'between',
|
|
91
|
+
'under',
|
|
92
|
+
'again',
|
|
93
|
+
'further',
|
|
94
|
+
'then',
|
|
95
|
+
'once',
|
|
96
|
+
'here',
|
|
97
|
+
'there',
|
|
98
|
+
'when',
|
|
99
|
+
'where',
|
|
100
|
+
'why',
|
|
101
|
+
'how',
|
|
102
|
+
'all',
|
|
103
|
+
'each',
|
|
104
|
+
'few',
|
|
105
|
+
'more',
|
|
106
|
+
'most',
|
|
107
|
+
'other',
|
|
108
|
+
'some',
|
|
109
|
+
'such',
|
|
110
|
+
'no',
|
|
111
|
+
'nor',
|
|
112
|
+
'not',
|
|
113
|
+
'only',
|
|
114
|
+
'own',
|
|
115
|
+
'same',
|
|
116
|
+
'so',
|
|
117
|
+
'than',
|
|
118
|
+
'too',
|
|
119
|
+
'very',
|
|
120
|
+
'just',
|
|
121
|
+
'and',
|
|
122
|
+
'but',
|
|
123
|
+
'if',
|
|
124
|
+
'or',
|
|
125
|
+
'because',
|
|
126
|
+
'until',
|
|
127
|
+
'while',
|
|
128
|
+
'about',
|
|
129
|
+
'against',
|
|
130
|
+
'i',
|
|
131
|
+
'me',
|
|
132
|
+
'my',
|
|
133
|
+
'myself',
|
|
134
|
+
'we',
|
|
135
|
+
'our',
|
|
136
|
+
'you',
|
|
137
|
+
'your',
|
|
138
|
+
'he',
|
|
139
|
+
'him',
|
|
140
|
+
'his',
|
|
141
|
+
'she',
|
|
142
|
+
'her',
|
|
143
|
+
'it',
|
|
144
|
+
'its',
|
|
145
|
+
'they',
|
|
146
|
+
'them',
|
|
147
|
+
'their',
|
|
148
|
+
'what',
|
|
149
|
+
'which',
|
|
150
|
+
'who',
|
|
151
|
+
'whom',
|
|
152
|
+
'this',
|
|
153
|
+
'that',
|
|
154
|
+
'these',
|
|
155
|
+
'those',
|
|
156
|
+
'am',
|
|
157
|
+
// Chinese
|
|
158
|
+
'的',
|
|
159
|
+
'了',
|
|
160
|
+
'是',
|
|
161
|
+
'在',
|
|
162
|
+
'我',
|
|
163
|
+
'有',
|
|
164
|
+
'和',
|
|
165
|
+
'就',
|
|
166
|
+
'不',
|
|
167
|
+
'人',
|
|
168
|
+
'都',
|
|
169
|
+
'一',
|
|
170
|
+
'一個',
|
|
171
|
+
'上',
|
|
172
|
+
'也',
|
|
173
|
+
'很',
|
|
174
|
+
'到',
|
|
175
|
+
'說',
|
|
176
|
+
'要',
|
|
177
|
+
'去',
|
|
178
|
+
'你',
|
|
179
|
+
'會',
|
|
180
|
+
'著',
|
|
181
|
+
'沒有',
|
|
182
|
+
'看',
|
|
183
|
+
'好',
|
|
184
|
+
'自己',
|
|
185
|
+
'這',
|
|
186
|
+
'那',
|
|
187
|
+
'什麼',
|
|
188
|
+
'嗎',
|
|
189
|
+
'想',
|
|
190
|
+
'他',
|
|
191
|
+
'她',
|
|
192
|
+
'它',
|
|
193
|
+
'們',
|
|
194
|
+
'來',
|
|
195
|
+
'讓',
|
|
196
|
+
'把',
|
|
197
|
+
'給',
|
|
198
|
+
'用',
|
|
199
|
+
'做',
|
|
200
|
+
'幫',
|
|
201
|
+
'能',
|
|
202
|
+
'可以',
|
|
203
|
+
'需要',
|
|
204
|
+
'想要',
|
|
205
|
+
'請',
|
|
206
|
+
'怎麼',
|
|
207
|
+
'如何',
|
|
208
|
+
]);
|
|
209
|
+
return words.filter((word) => !stopWords.has(word));
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Normalize triggers to structured format
|
|
213
|
+
*/
|
|
214
|
+
normalizeTriggers(triggers) {
|
|
215
|
+
if (!triggers) {
|
|
216
|
+
return {};
|
|
217
|
+
}
|
|
218
|
+
// Legacy format: array of strings -> treat as primary keywords
|
|
219
|
+
if (Array.isArray(triggers)) {
|
|
220
|
+
return {
|
|
221
|
+
keywords: {
|
|
222
|
+
primary: triggers.map((t) => t.toLowerCase()),
|
|
223
|
+
secondary: [],
|
|
224
|
+
},
|
|
225
|
+
context_boost: [],
|
|
226
|
+
context_penalty: [],
|
|
227
|
+
priority: 'medium',
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
// Normalize all keywords to lowercase
|
|
231
|
+
return {
|
|
232
|
+
keywords: {
|
|
233
|
+
primary: (triggers.keywords?.primary || []).map((k) => k.toLowerCase()),
|
|
234
|
+
secondary: (triggers.keywords?.secondary || []).map((k) => k.toLowerCase()),
|
|
235
|
+
},
|
|
236
|
+
context_boost: (triggers.context_boost || []).map((k) => k.toLowerCase()),
|
|
237
|
+
context_penalty: (triggers.context_penalty || []).map((k) => k.toLowerCase()),
|
|
238
|
+
priority: triggers.priority || 'medium',
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Calculate match score for a skill
|
|
243
|
+
*/
|
|
244
|
+
calculateScore(keywords, triggers) {
|
|
245
|
+
let score = 0;
|
|
246
|
+
const matchedKeywords = [];
|
|
247
|
+
let hasPrimary = false;
|
|
248
|
+
let hasSecondary = false;
|
|
249
|
+
const primarySet = new Set(triggers.keywords?.primary || []);
|
|
250
|
+
const secondarySet = new Set(triggers.keywords?.secondary || []);
|
|
251
|
+
const boostSet = new Set(triggers.context_boost || []);
|
|
252
|
+
const penaltySet = new Set(triggers.context_penalty || []);
|
|
253
|
+
for (const keyword of keywords) {
|
|
254
|
+
const lowerKeyword = keyword.toLowerCase();
|
|
255
|
+
// Check primary keywords
|
|
256
|
+
if (primarySet.has(lowerKeyword)) {
|
|
257
|
+
score += this.weights.primary;
|
|
258
|
+
matchedKeywords.push(keyword);
|
|
259
|
+
hasPrimary = true;
|
|
260
|
+
}
|
|
261
|
+
// Check secondary keywords
|
|
262
|
+
else if (secondarySet.has(lowerKeyword)) {
|
|
263
|
+
score += this.weights.secondary;
|
|
264
|
+
matchedKeywords.push(keyword);
|
|
265
|
+
hasSecondary = true;
|
|
266
|
+
}
|
|
267
|
+
// Check context boost
|
|
268
|
+
if (boostSet.has(lowerKeyword)) {
|
|
269
|
+
score += this.weights.contextBoost;
|
|
270
|
+
}
|
|
271
|
+
// Check context penalty
|
|
272
|
+
if (penaltySet.has(lowerKeyword)) {
|
|
273
|
+
score += this.weights.contextPenalty; // This is negative
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// Determine match type
|
|
277
|
+
let matchType = 'secondary';
|
|
278
|
+
if (hasPrimary && hasSecondary) {
|
|
279
|
+
matchType = 'mixed';
|
|
280
|
+
}
|
|
281
|
+
else if (hasPrimary) {
|
|
282
|
+
matchType = 'primary';
|
|
283
|
+
}
|
|
284
|
+
return { score, matchedKeywords, matchType };
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Calculate confidence from score (normalized to 0-1)
|
|
288
|
+
*/
|
|
289
|
+
calculateConfidence(score) {
|
|
290
|
+
// Normalize score to 0-1 range
|
|
291
|
+
// Score of 2.0 or higher = 1.0 confidence
|
|
292
|
+
const confidence = Math.min(score / 2.0, 1.0);
|
|
293
|
+
return Math.max(0, confidence);
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Match a single skill against keywords
|
|
297
|
+
*/
|
|
298
|
+
matchSkill(skill, keywords) {
|
|
299
|
+
const triggers = this.normalizeTriggers(skill.triggers);
|
|
300
|
+
const { score, matchedKeywords, matchType } = this.calculateScore(keywords, triggers);
|
|
301
|
+
if (matchedKeywords.length === 0) {
|
|
302
|
+
return null;
|
|
303
|
+
}
|
|
304
|
+
const confidence = this.calculateConfidence(score);
|
|
305
|
+
if (confidence < this.minConfidence) {
|
|
306
|
+
return null;
|
|
307
|
+
}
|
|
308
|
+
const priority = triggers.priority || 'medium';
|
|
309
|
+
return {
|
|
310
|
+
name: skill.name,
|
|
311
|
+
confidence,
|
|
312
|
+
matchedKeywords,
|
|
313
|
+
matchType,
|
|
314
|
+
priority,
|
|
315
|
+
reason: this.generateReason(skill, matchedKeywords, matchType),
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Generate human-readable reason for recommendation
|
|
320
|
+
*/
|
|
321
|
+
generateReason(_skill, matchedKeywords, matchType) {
|
|
322
|
+
const keywordStr = matchedKeywords.slice(0, 3).join(', ');
|
|
323
|
+
const moreCount = matchedKeywords.length - 3;
|
|
324
|
+
if (matchType === 'primary') {
|
|
325
|
+
return `Direct match for "${keywordStr}"${moreCount > 0 ? ` +${moreCount} more` : ''}`;
|
|
326
|
+
}
|
|
327
|
+
else if (matchType === 'mixed') {
|
|
328
|
+
return `Strong match for "${keywordStr}"${moreCount > 0 ? ` +${moreCount} more` : ''}`;
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
return `Related to "${keywordStr}"${moreCount > 0 ? ` +${moreCount} more` : ''}`;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Match skills against a user goal
|
|
336
|
+
*/
|
|
337
|
+
matchSkills(goal, skills) {
|
|
338
|
+
const keywords = this.extractKeywords(goal);
|
|
339
|
+
const matches = [];
|
|
340
|
+
for (const skill of skills) {
|
|
341
|
+
const match = this.matchSkill(skill, keywords);
|
|
342
|
+
if (match) {
|
|
343
|
+
matches.push(match);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// Sort by confidence (desc), then priority (desc), then name (asc)
|
|
347
|
+
matches.sort((a, b) => {
|
|
348
|
+
if (b.confidence !== a.confidence) {
|
|
349
|
+
return b.confidence - a.confidence;
|
|
350
|
+
}
|
|
351
|
+
const priorityDiff = PRIORITY_ORDER[b.priority] - PRIORITY_ORDER[a.priority];
|
|
352
|
+
if (priorityDiff !== 0) {
|
|
353
|
+
return priorityDiff;
|
|
354
|
+
}
|
|
355
|
+
return a.name.localeCompare(b.name);
|
|
356
|
+
});
|
|
357
|
+
return {
|
|
358
|
+
matches: matches.slice(0, this.maxResults),
|
|
359
|
+
extractedKeywords: keywords,
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Analyze a goal and return full recommendation
|
|
364
|
+
*/
|
|
365
|
+
analyze(goal, skills) {
|
|
366
|
+
const keywords = this.extractKeywords(goal);
|
|
367
|
+
// Separate domain and software skills
|
|
368
|
+
const domainSkills = skills.filter((s) => s.type === 'domain');
|
|
369
|
+
const softwareSkills = skills.filter((s) => s.type === 'software');
|
|
370
|
+
// Match both types
|
|
371
|
+
const domainMatches = this.matchSkills(goal, domainSkills);
|
|
372
|
+
const softwareMatches = this.matchSkills(goal, softwareSkills);
|
|
373
|
+
// Collect software skills from domain skill dependencies
|
|
374
|
+
const fromDependencies = new Set();
|
|
375
|
+
for (const match of domainMatches.matches) {
|
|
376
|
+
const skill = domainSkills.find((s) => s.name === match.name);
|
|
377
|
+
if (skill?.dependencies?.['software-skills']) {
|
|
378
|
+
for (const dep of skill.dependencies['software-skills']) {
|
|
379
|
+
fromDependencies.add(dep);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
// Calculate overall confidence
|
|
384
|
+
const allMatches = [...domainMatches.matches, ...softwareMatches.matches];
|
|
385
|
+
const overallConfidence = allMatches.length > 0
|
|
386
|
+
? allMatches.reduce((sum, m) => sum + m.confidence, 0) / allMatches.length
|
|
387
|
+
: 0;
|
|
388
|
+
// Determine if research mode should be triggered
|
|
389
|
+
const researchMode = overallConfidence < this.researchThreshold;
|
|
390
|
+
// Generate research suggestions if in research mode
|
|
391
|
+
const researchSuggestions = researchMode ? this.generateResearchSuggestions(goal, keywords) : undefined;
|
|
392
|
+
return {
|
|
393
|
+
goal,
|
|
394
|
+
extractedKeywords: keywords,
|
|
395
|
+
domain_skills: domainMatches.matches,
|
|
396
|
+
software_skills: softwareMatches.matches,
|
|
397
|
+
from_dependencies: Array.from(fromDependencies),
|
|
398
|
+
overall_confidence: overallConfidence,
|
|
399
|
+
research_mode: researchMode,
|
|
400
|
+
research_suggestions: researchSuggestions,
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Generate research suggestions when confidence is low
|
|
405
|
+
*/
|
|
406
|
+
generateResearchSuggestions(goal, keywords) {
|
|
407
|
+
const suggestions = [];
|
|
408
|
+
// Suggest searching for skills related to main keywords
|
|
409
|
+
if (keywords.length > 0) {
|
|
410
|
+
suggestions.push(`Search external skill registries for: ${keywords.slice(0, 3).join(', ')}`);
|
|
411
|
+
}
|
|
412
|
+
// Suggest web search for domain knowledge
|
|
413
|
+
suggestions.push(`Web search for best practices: "${goal}"`);
|
|
414
|
+
// Suggest asking user for clarification
|
|
415
|
+
suggestions.push('Ask user to clarify specific requirements or technologies');
|
|
416
|
+
return suggestions;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/matching/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Matching Engine
|
|
3
|
+
*
|
|
4
|
+
* @module matching
|
|
5
|
+
*/
|
|
6
|
+
export { MatchingEngine } from './engine.js';
|
|
7
|
+
export type { MatchingWeights, MatchingOptions, SkillData, SkillMatch, SkillRecommendation, } from './types.js';
|
|
8
|
+
export { DEFAULT_WEIGHTS } from './types.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/matching/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EACV,eAAe,EACf,eAAe,EACf,SAAS,EACT,UAAU,EACV,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/matching/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQ7C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for skill matching engine
|
|
3
|
+
*/
|
|
4
|
+
import type { SkillTriggers } from '../skill/types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Matching weights configuration
|
|
7
|
+
*/
|
|
8
|
+
export interface MatchingWeights {
|
|
9
|
+
/** Weight for primary keyword matches (default: 1.0) */
|
|
10
|
+
primary: number;
|
|
11
|
+
/** Weight for secondary keyword matches (default: 0.6) */
|
|
12
|
+
secondary: number;
|
|
13
|
+
/** Bonus for context_boost matches (default: 0.2) */
|
|
14
|
+
contextBoost: number;
|
|
15
|
+
/** Penalty for context_penalty matches (default: -0.3) */
|
|
16
|
+
contextPenalty: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Default matching weights
|
|
20
|
+
*/
|
|
21
|
+
export declare const DEFAULT_WEIGHTS: MatchingWeights;
|
|
22
|
+
/**
|
|
23
|
+
* Individual skill match result
|
|
24
|
+
*/
|
|
25
|
+
export interface SkillMatch {
|
|
26
|
+
/** Skill name */
|
|
27
|
+
name: string;
|
|
28
|
+
/** Match confidence score (0-1) */
|
|
29
|
+
confidence: number;
|
|
30
|
+
/** Keywords that matched */
|
|
31
|
+
matchedKeywords: string[];
|
|
32
|
+
/** Match type (primary or secondary) */
|
|
33
|
+
matchType: 'primary' | 'secondary' | 'mixed';
|
|
34
|
+
/** Priority from skill triggers */
|
|
35
|
+
priority: 'high' | 'medium' | 'low';
|
|
36
|
+
/** Reason for recommendation */
|
|
37
|
+
reason: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Skill recommendation result from matching engine
|
|
41
|
+
*/
|
|
42
|
+
export interface SkillRecommendation {
|
|
43
|
+
/** Original user goal/query */
|
|
44
|
+
goal: string;
|
|
45
|
+
/** Extracted keywords from goal */
|
|
46
|
+
extractedKeywords: string[];
|
|
47
|
+
/** Matched domain skills */
|
|
48
|
+
domain_skills: SkillMatch[];
|
|
49
|
+
/** Matched software skills */
|
|
50
|
+
software_skills: SkillMatch[];
|
|
51
|
+
/** Software skills from domain skill dependencies */
|
|
52
|
+
from_dependencies: string[];
|
|
53
|
+
/** Overall confidence score (0-1) */
|
|
54
|
+
overall_confidence: number;
|
|
55
|
+
/** Whether research mode should be triggered (confidence < 0.5) */
|
|
56
|
+
research_mode: boolean;
|
|
57
|
+
/** Suggested research topics if research_mode is true */
|
|
58
|
+
research_suggestions?: string[];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Skill data for matching
|
|
62
|
+
*/
|
|
63
|
+
export interface SkillData {
|
|
64
|
+
/** Skill name */
|
|
65
|
+
name: string;
|
|
66
|
+
/** Skill description */
|
|
67
|
+
description: string;
|
|
68
|
+
/** Skill type */
|
|
69
|
+
type: 'domain' | 'software';
|
|
70
|
+
/** Triggers configuration */
|
|
71
|
+
triggers?: string[] | SkillTriggers;
|
|
72
|
+
/** Dependencies */
|
|
73
|
+
dependencies?: {
|
|
74
|
+
skills?: string[];
|
|
75
|
+
'software-skills'?: string[];
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Matching engine options
|
|
80
|
+
*/
|
|
81
|
+
export interface MatchingOptions {
|
|
82
|
+
/** Custom weights */
|
|
83
|
+
weights?: Partial<MatchingWeights>;
|
|
84
|
+
/** Minimum confidence threshold (default: 0.3) */
|
|
85
|
+
minConfidence?: number;
|
|
86
|
+
/** Research mode threshold (default: 0.5) */
|
|
87
|
+
researchThreshold?: number;
|
|
88
|
+
/** Maximum results per category (default: 5) */
|
|
89
|
+
maxResults?: number;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/matching/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,eAK7B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,wCAAwC;IACxC,SAAS,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IAC7C,mCAAmC;IACnC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,4BAA4B;IAC5B,aAAa,EAAE,UAAU,EAAE,CAAC;IAC5B,8BAA8B;IAC9B,eAAe,EAAE,UAAU,EAAE,CAAC;IAC9B,qDAAqD;IACrD,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,qCAAqC;IACrC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mEAAmE;IACnE,aAAa,EAAE,OAAO,CAAC;IACvB,yDAAyD;IACzD,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB;IACjB,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC5B,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC;IACpC,mBAAmB;IACnB,YAAY,CAAC,EAAE;QACb,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC9B,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,qBAAqB;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACnC,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6CAA6C;IAC7C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/matching/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkBH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C,OAAO,EAAE,GAAG;IACZ,SAAS,EAAE,GAAG;IACd,YAAY,EAAE,GAAG;IACjB,cAAc,EAAE,CAAC,GAAG;CACrB,CAAC"}
|
package/dist/parser/schema.d.ts
CHANGED
|
@@ -76,11 +76,57 @@ export declare const skillSchema: {
|
|
|
76
76
|
readonly description: "Keywords for search";
|
|
77
77
|
};
|
|
78
78
|
readonly triggers: {
|
|
79
|
-
readonly
|
|
80
|
-
|
|
81
|
-
readonly
|
|
82
|
-
|
|
83
|
-
|
|
79
|
+
readonly oneOf: readonly [{
|
|
80
|
+
readonly type: "array";
|
|
81
|
+
readonly items: {
|
|
82
|
+
readonly type: "string";
|
|
83
|
+
};
|
|
84
|
+
}, {
|
|
85
|
+
readonly type: "object";
|
|
86
|
+
readonly properties: {
|
|
87
|
+
readonly keywords: {
|
|
88
|
+
readonly type: "object";
|
|
89
|
+
readonly properties: {
|
|
90
|
+
readonly primary: {
|
|
91
|
+
readonly type: "array";
|
|
92
|
+
readonly items: {
|
|
93
|
+
readonly type: "string";
|
|
94
|
+
};
|
|
95
|
+
readonly description: "Primary keywords (weight: 1.0) - direct match triggers";
|
|
96
|
+
};
|
|
97
|
+
readonly secondary: {
|
|
98
|
+
readonly type: "array";
|
|
99
|
+
readonly items: {
|
|
100
|
+
readonly type: "string";
|
|
101
|
+
};
|
|
102
|
+
readonly description: "Secondary keywords (weight: 0.6) - candidate match";
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
readonly additionalProperties: false;
|
|
106
|
+
};
|
|
107
|
+
readonly context_boost: {
|
|
108
|
+
readonly type: "array";
|
|
109
|
+
readonly items: {
|
|
110
|
+
readonly type: "string";
|
|
111
|
+
};
|
|
112
|
+
readonly description: "Context words that boost score (+0.2 when co-occurring)";
|
|
113
|
+
};
|
|
114
|
+
readonly context_penalty: {
|
|
115
|
+
readonly type: "array";
|
|
116
|
+
readonly items: {
|
|
117
|
+
readonly type: "string";
|
|
118
|
+
};
|
|
119
|
+
readonly description: "Context words that reduce score (-0.3 when co-occurring)";
|
|
120
|
+
};
|
|
121
|
+
readonly priority: {
|
|
122
|
+
readonly type: "string";
|
|
123
|
+
readonly enum: readonly ["high", "medium", "low"];
|
|
124
|
+
readonly description: "Priority for tie-breaking (default: medium)";
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
readonly additionalProperties: false;
|
|
128
|
+
}];
|
|
129
|
+
readonly description: "Trigger words or structured matching configuration";
|
|
84
130
|
};
|
|
85
131
|
readonly capabilities: {
|
|
86
132
|
readonly type: "array";
|
|
@@ -153,6 +199,13 @@ export declare const skillSchema: {
|
|
|
153
199
|
};
|
|
154
200
|
readonly description: "Skill dependencies (names or sources)";
|
|
155
201
|
};
|
|
202
|
+
readonly 'software-skills': {
|
|
203
|
+
readonly type: "array";
|
|
204
|
+
readonly items: {
|
|
205
|
+
readonly type: "string";
|
|
206
|
+
};
|
|
207
|
+
readonly description: "Software skill dependencies for domain skills (cross-domain)";
|
|
208
|
+
};
|
|
156
209
|
readonly mcp: {
|
|
157
210
|
readonly type: "array";
|
|
158
211
|
readonly items: {
|
|
@@ -163,11 +216,11 @@ export declare const skillSchema: {
|
|
|
163
216
|
};
|
|
164
217
|
readonly additionalProperties: false;
|
|
165
218
|
}];
|
|
166
|
-
readonly description: "Skill and MCP dependencies";
|
|
219
|
+
readonly description: "Skill, software-skill, and MCP dependencies";
|
|
167
220
|
};
|
|
168
221
|
};
|
|
169
|
-
readonly required: readonly ["
|
|
170
|
-
readonly additionalProperties:
|
|
222
|
+
readonly required: readonly ["name", "description"];
|
|
223
|
+
readonly additionalProperties: true;
|
|
171
224
|
};
|
|
172
225
|
/**
|
|
173
226
|
* Human-readable field descriptions for error messages
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/parser/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,eAAO,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/parser/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgMd,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAcpD,CAAC"}
|