@gonzih/skill-radar 0.1.0
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/LICENSE +21 -0
- package/README.md +105 -0
- package/SKILL.md +97 -0
- package/dist/data/resources.d.ts +12 -0
- package/dist/data/resources.d.ts.map +1 -0
- package/dist/data/resources.js +710 -0
- package/dist/data/resources.js.map +1 -0
- package/dist/data/trends.d.ts +17 -0
- package/dist/data/trends.d.ts.map +1 -0
- package/dist/data/trends.js +282 -0
- package/dist/data/trends.js.map +1 -0
- package/dist/db.d.ts +26 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +123 -0
- package/dist/db.js.map +1 -0
- package/dist/engine/analyzer.d.ts +28 -0
- package/dist/engine/analyzer.d.ts.map +1 -0
- package/dist/engine/analyzer.js +154 -0
- package/dist/engine/analyzer.js.map +1 -0
- package/dist/engine/planner.d.ts +33 -0
- package/dist/engine/planner.d.ts.map +1 -0
- package/dist/engine/planner.js +303 -0
- package/dist/engine/planner.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/index.d.ts +213 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +403 -0
- package/dist/tools/index.js.map +1 -0
- package/llms.txt +22 -0
- package/package.json +42 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
export declare const TOOL_DEFINITIONS: ({
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
inputSchema: {
|
|
5
|
+
type: string;
|
|
6
|
+
properties: {
|
|
7
|
+
profileId: {
|
|
8
|
+
type: string;
|
|
9
|
+
description: string;
|
|
10
|
+
};
|
|
11
|
+
role: {
|
|
12
|
+
type: string;
|
|
13
|
+
description: string;
|
|
14
|
+
};
|
|
15
|
+
currentSkills: {
|
|
16
|
+
type: string;
|
|
17
|
+
items: {
|
|
18
|
+
type: string;
|
|
19
|
+
};
|
|
20
|
+
description: string;
|
|
21
|
+
};
|
|
22
|
+
yearsExperience: {
|
|
23
|
+
type: string;
|
|
24
|
+
description: string;
|
|
25
|
+
};
|
|
26
|
+
target: {
|
|
27
|
+
type: string;
|
|
28
|
+
description: string;
|
|
29
|
+
};
|
|
30
|
+
focusSkills?: undefined;
|
|
31
|
+
hoursPerWeek?: undefined;
|
|
32
|
+
weekNumber?: undefined;
|
|
33
|
+
completedItems?: undefined;
|
|
34
|
+
notes?: undefined;
|
|
35
|
+
skill?: undefined;
|
|
36
|
+
level?: undefined;
|
|
37
|
+
maxHours?: undefined;
|
|
38
|
+
};
|
|
39
|
+
required: string[];
|
|
40
|
+
};
|
|
41
|
+
} | {
|
|
42
|
+
name: string;
|
|
43
|
+
description: string;
|
|
44
|
+
inputSchema: {
|
|
45
|
+
type: string;
|
|
46
|
+
properties: {
|
|
47
|
+
profileId: {
|
|
48
|
+
type: string;
|
|
49
|
+
description: string;
|
|
50
|
+
};
|
|
51
|
+
focusSkills: {
|
|
52
|
+
type: string;
|
|
53
|
+
items: {
|
|
54
|
+
type: string;
|
|
55
|
+
};
|
|
56
|
+
description: string;
|
|
57
|
+
};
|
|
58
|
+
hoursPerWeek: {
|
|
59
|
+
type: string;
|
|
60
|
+
description: string;
|
|
61
|
+
};
|
|
62
|
+
role?: undefined;
|
|
63
|
+
currentSkills?: undefined;
|
|
64
|
+
yearsExperience?: undefined;
|
|
65
|
+
target?: undefined;
|
|
66
|
+
weekNumber?: undefined;
|
|
67
|
+
completedItems?: undefined;
|
|
68
|
+
notes?: undefined;
|
|
69
|
+
skill?: undefined;
|
|
70
|
+
level?: undefined;
|
|
71
|
+
maxHours?: undefined;
|
|
72
|
+
};
|
|
73
|
+
required: string[];
|
|
74
|
+
};
|
|
75
|
+
} | {
|
|
76
|
+
name: string;
|
|
77
|
+
description: string;
|
|
78
|
+
inputSchema: {
|
|
79
|
+
type: string;
|
|
80
|
+
properties: {
|
|
81
|
+
role: {
|
|
82
|
+
type: string;
|
|
83
|
+
description: string;
|
|
84
|
+
};
|
|
85
|
+
profileId?: undefined;
|
|
86
|
+
currentSkills?: undefined;
|
|
87
|
+
yearsExperience?: undefined;
|
|
88
|
+
target?: undefined;
|
|
89
|
+
focusSkills?: undefined;
|
|
90
|
+
hoursPerWeek?: undefined;
|
|
91
|
+
weekNumber?: undefined;
|
|
92
|
+
completedItems?: undefined;
|
|
93
|
+
notes?: undefined;
|
|
94
|
+
skill?: undefined;
|
|
95
|
+
level?: undefined;
|
|
96
|
+
maxHours?: undefined;
|
|
97
|
+
};
|
|
98
|
+
required: string[];
|
|
99
|
+
};
|
|
100
|
+
} | {
|
|
101
|
+
name: string;
|
|
102
|
+
description: string;
|
|
103
|
+
inputSchema: {
|
|
104
|
+
type: string;
|
|
105
|
+
properties: {
|
|
106
|
+
profileId: {
|
|
107
|
+
type: string;
|
|
108
|
+
description: string;
|
|
109
|
+
};
|
|
110
|
+
weekNumber: {
|
|
111
|
+
type: string;
|
|
112
|
+
description: string;
|
|
113
|
+
};
|
|
114
|
+
completedItems: {
|
|
115
|
+
type: string;
|
|
116
|
+
items: {
|
|
117
|
+
type: string;
|
|
118
|
+
};
|
|
119
|
+
description: string;
|
|
120
|
+
};
|
|
121
|
+
notes: {
|
|
122
|
+
type: string;
|
|
123
|
+
description: string;
|
|
124
|
+
};
|
|
125
|
+
role?: undefined;
|
|
126
|
+
currentSkills?: undefined;
|
|
127
|
+
yearsExperience?: undefined;
|
|
128
|
+
target?: undefined;
|
|
129
|
+
focusSkills?: undefined;
|
|
130
|
+
hoursPerWeek?: undefined;
|
|
131
|
+
skill?: undefined;
|
|
132
|
+
level?: undefined;
|
|
133
|
+
maxHours?: undefined;
|
|
134
|
+
};
|
|
135
|
+
required: string[];
|
|
136
|
+
};
|
|
137
|
+
} | {
|
|
138
|
+
name: string;
|
|
139
|
+
description: string;
|
|
140
|
+
inputSchema: {
|
|
141
|
+
type: string;
|
|
142
|
+
properties: {
|
|
143
|
+
skill: {
|
|
144
|
+
type: string;
|
|
145
|
+
description: string;
|
|
146
|
+
};
|
|
147
|
+
level: {
|
|
148
|
+
type: string;
|
|
149
|
+
enum: string[];
|
|
150
|
+
description: string;
|
|
151
|
+
};
|
|
152
|
+
maxHours: {
|
|
153
|
+
type: string;
|
|
154
|
+
description: string;
|
|
155
|
+
};
|
|
156
|
+
profileId?: undefined;
|
|
157
|
+
role?: undefined;
|
|
158
|
+
currentSkills?: undefined;
|
|
159
|
+
yearsExperience?: undefined;
|
|
160
|
+
target?: undefined;
|
|
161
|
+
focusSkills?: undefined;
|
|
162
|
+
hoursPerWeek?: undefined;
|
|
163
|
+
weekNumber?: undefined;
|
|
164
|
+
completedItems?: undefined;
|
|
165
|
+
notes?: undefined;
|
|
166
|
+
};
|
|
167
|
+
required: string[];
|
|
168
|
+
};
|
|
169
|
+
} | {
|
|
170
|
+
name: string;
|
|
171
|
+
description: string;
|
|
172
|
+
inputSchema: {
|
|
173
|
+
type: string;
|
|
174
|
+
properties: {
|
|
175
|
+
profileId: {
|
|
176
|
+
type: string;
|
|
177
|
+
description: string;
|
|
178
|
+
};
|
|
179
|
+
role: {
|
|
180
|
+
type: string;
|
|
181
|
+
description: string;
|
|
182
|
+
};
|
|
183
|
+
currentSkills: {
|
|
184
|
+
type: string;
|
|
185
|
+
items: {
|
|
186
|
+
type: string;
|
|
187
|
+
};
|
|
188
|
+
description: string;
|
|
189
|
+
};
|
|
190
|
+
yearsExperience: {
|
|
191
|
+
type: string;
|
|
192
|
+
description: string;
|
|
193
|
+
};
|
|
194
|
+
target?: undefined;
|
|
195
|
+
focusSkills?: undefined;
|
|
196
|
+
hoursPerWeek?: undefined;
|
|
197
|
+
weekNumber?: undefined;
|
|
198
|
+
completedItems?: undefined;
|
|
199
|
+
notes?: undefined;
|
|
200
|
+
skill?: undefined;
|
|
201
|
+
level?: undefined;
|
|
202
|
+
maxHours?: undefined;
|
|
203
|
+
};
|
|
204
|
+
required: string[];
|
|
205
|
+
};
|
|
206
|
+
})[];
|
|
207
|
+
export declare function handleAnalyzeSkills(args: Record<string, unknown>): Promise<string>;
|
|
208
|
+
export declare function handleBuildPlan(args: Record<string, unknown>): Promise<string>;
|
|
209
|
+
export declare function handleGetTrendingSkills(args: Record<string, unknown>): Promise<string>;
|
|
210
|
+
export declare function handleWeeklyCheckin(args: Record<string, unknown>): Promise<string>;
|
|
211
|
+
export declare function handleGetResources(args: Record<string, unknown>): Promise<string>;
|
|
212
|
+
export declare function handleCompareToMarket(args: Record<string, unknown>): Promise<string>;
|
|
213
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA0J5B,CAAC;AAIF,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAmExF;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAiDpF;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CA4B5F;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CA0ExF;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBvF;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CA8E1F"}
|
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
+
import { analyzeSkills } from '../engine/analyzer.js';
|
|
3
|
+
import { buildPlan } from '../engine/planner.js';
|
|
4
|
+
import { ROLE_TRENDS, resolveCategory } from '../data/trends.js';
|
|
5
|
+
import { getResourcesForSkill } from '../data/resources.js';
|
|
6
|
+
import { saveProfile, saveCheckin, getCheckins } from '../db.js';
|
|
7
|
+
export const TOOL_DEFINITIONS = [
|
|
8
|
+
{
|
|
9
|
+
name: 'analyze_skills',
|
|
10
|
+
description: 'Analyze skill gaps for a professional. Returns gap score, prioritized skill gaps, strengths, and at-risk skills based on 2025-2026 market trends.',
|
|
11
|
+
inputSchema: {
|
|
12
|
+
type: 'object',
|
|
13
|
+
properties: {
|
|
14
|
+
profileId: {
|
|
15
|
+
type: 'string',
|
|
16
|
+
description: 'Unique identifier for this profile (use any string, e.g. "john-doe")',
|
|
17
|
+
},
|
|
18
|
+
role: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
description: 'Professional role or job title (e.g. "software engineer", "product manager", "data scientist")',
|
|
21
|
+
},
|
|
22
|
+
currentSkills: {
|
|
23
|
+
type: 'array',
|
|
24
|
+
items: { type: 'string' },
|
|
25
|
+
description: 'List of current skills (e.g. ["Python", "SQL", "Tableau"])',
|
|
26
|
+
},
|
|
27
|
+
yearsExperience: {
|
|
28
|
+
type: 'number',
|
|
29
|
+
description: 'Years of experience in the role',
|
|
30
|
+
},
|
|
31
|
+
target: {
|
|
32
|
+
type: 'string',
|
|
33
|
+
description: 'Career goal: "stay current", "get promoted", or "switch roles to [role]"',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
required: ['profileId', 'role', 'currentSkills', 'yearsExperience', 'target'],
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'build_plan',
|
|
41
|
+
description: 'Generate a personalized 90-day (12-week) learning plan with weekly themes, resources, practice exercises, and daily micro-actions.',
|
|
42
|
+
inputSchema: {
|
|
43
|
+
type: 'object',
|
|
44
|
+
properties: {
|
|
45
|
+
profileId: {
|
|
46
|
+
type: 'string',
|
|
47
|
+
description: 'Profile ID (from analyze_skills)',
|
|
48
|
+
},
|
|
49
|
+
focusSkills: {
|
|
50
|
+
type: 'array',
|
|
51
|
+
items: { type: 'string' },
|
|
52
|
+
description: 'Ordered list of skills to focus on (top gaps from analyze_skills)',
|
|
53
|
+
},
|
|
54
|
+
hoursPerWeek: {
|
|
55
|
+
type: 'number',
|
|
56
|
+
description: 'Available learning hours per week (e.g. 5)',
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
required: ['profileId', 'focusSkills', 'hoursPerWeek'],
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'get_trending_skills',
|
|
64
|
+
description: 'Get trending, emerging, and decaying skills for a given role or industry category.',
|
|
65
|
+
inputSchema: {
|
|
66
|
+
type: 'object',
|
|
67
|
+
properties: {
|
|
68
|
+
role: {
|
|
69
|
+
type: 'string',
|
|
70
|
+
description: 'Role or industry category (e.g. "software engineer", "marketing", "law")',
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
required: ['role'],
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: 'weekly_checkin',
|
|
78
|
+
description: 'Record a weekly learning check-in. Tracks progress against the plan and returns encouragement + next steps.',
|
|
79
|
+
inputSchema: {
|
|
80
|
+
type: 'object',
|
|
81
|
+
properties: {
|
|
82
|
+
profileId: {
|
|
83
|
+
type: 'string',
|
|
84
|
+
description: 'Profile ID',
|
|
85
|
+
},
|
|
86
|
+
weekNumber: {
|
|
87
|
+
type: 'number',
|
|
88
|
+
description: 'Current week number (1-12)',
|
|
89
|
+
},
|
|
90
|
+
completedItems: {
|
|
91
|
+
type: 'array',
|
|
92
|
+
items: { type: 'string' },
|
|
93
|
+
description: 'List of activities completed this week',
|
|
94
|
+
},
|
|
95
|
+
notes: {
|
|
96
|
+
type: 'string',
|
|
97
|
+
description: 'Optional notes or reflections for this week',
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
required: ['profileId', 'weekNumber', 'completedItems'],
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: 'get_resources',
|
|
105
|
+
description: 'Get curated free learning resources for a specific skill. Optionally filter by level and max hours.',
|
|
106
|
+
inputSchema: {
|
|
107
|
+
type: 'object',
|
|
108
|
+
properties: {
|
|
109
|
+
skill: {
|
|
110
|
+
type: 'string',
|
|
111
|
+
description: 'Skill to find resources for (e.g. "TypeScript", "SQL", "LLM APIs")',
|
|
112
|
+
},
|
|
113
|
+
level: {
|
|
114
|
+
type: 'string',
|
|
115
|
+
enum: ['beginner', 'intermediate', 'advanced'],
|
|
116
|
+
description: 'Optional: filter by difficulty level',
|
|
117
|
+
},
|
|
118
|
+
maxHours: {
|
|
119
|
+
type: 'number',
|
|
120
|
+
description: 'Optional: filter resources by max time commitment (hours)',
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
required: ['skill'],
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
name: 'compare_to_market',
|
|
128
|
+
description: 'Compare a professional profile to current market demands. Returns alignment score, unique strengths, critical gaps, and estimated salary impact.',
|
|
129
|
+
inputSchema: {
|
|
130
|
+
type: 'object',
|
|
131
|
+
properties: {
|
|
132
|
+
profileId: {
|
|
133
|
+
type: 'string',
|
|
134
|
+
description: 'Profile ID of an existing profile (from analyze_skills)',
|
|
135
|
+
},
|
|
136
|
+
role: {
|
|
137
|
+
type: 'string',
|
|
138
|
+
description: 'Role to compare against',
|
|
139
|
+
},
|
|
140
|
+
currentSkills: {
|
|
141
|
+
type: 'array',
|
|
142
|
+
items: { type: 'string' },
|
|
143
|
+
description: 'Current skills list',
|
|
144
|
+
},
|
|
145
|
+
yearsExperience: {
|
|
146
|
+
type: 'number',
|
|
147
|
+
description: 'Years of experience',
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
required: ['profileId', 'role', 'currentSkills', 'yearsExperience'],
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
];
|
|
154
|
+
// ── Tool handlers ────────────────────────────────────────────────────────────
|
|
155
|
+
export async function handleAnalyzeSkills(args) {
|
|
156
|
+
const profileId = String(args.profileId);
|
|
157
|
+
const role = String(args.role);
|
|
158
|
+
const currentSkills = args.currentSkills ?? [];
|
|
159
|
+
const yearsExperience = Number(args.yearsExperience) || 0;
|
|
160
|
+
const target = String(args.target ?? 'stay current');
|
|
161
|
+
const result = analyzeSkills({ profileId, role, currentSkills, yearsExperience, target });
|
|
162
|
+
// Persist profile
|
|
163
|
+
saveProfile({
|
|
164
|
+
id: uuidv4(),
|
|
165
|
+
profileId,
|
|
166
|
+
role,
|
|
167
|
+
skillsCurrent: currentSkills,
|
|
168
|
+
gapsIdentified: result.gaps.map((g) => g.skill),
|
|
169
|
+
planCreatedAt: new Date().toISOString(),
|
|
170
|
+
targetRole: target,
|
|
171
|
+
});
|
|
172
|
+
const lines = [
|
|
173
|
+
`## Skill Gap Analysis: ${role}`,
|
|
174
|
+
``,
|
|
175
|
+
`**Overall Gap Score:** ${result.gapScore}/100 (higher = more gaps to close)`,
|
|
176
|
+
``,
|
|
177
|
+
`### Top 5 Prioritized Gaps (by ROI)`,
|
|
178
|
+
];
|
|
179
|
+
for (const gap of result.prioritized) {
|
|
180
|
+
lines.push(`- **${gap.skill}** — Priority: ${gap.priority} | Gap: ${gap.gap}pts | Impact: ${gap.impactScore} | ROI: ${gap.roi.toFixed(2)}`);
|
|
181
|
+
}
|
|
182
|
+
if (result.strengths.length > 0) {
|
|
183
|
+
lines.push(``, `### Strengths (trending skills you already have)`);
|
|
184
|
+
result.strengths.forEach((s) => lines.push(`- ${s}`));
|
|
185
|
+
}
|
|
186
|
+
if (result.atRisk.length > 0) {
|
|
187
|
+
lines.push(``, `### At-Risk Skills (losing market value)`);
|
|
188
|
+
result.atRisk.forEach((s) => lines.push(`- ${s} ⚠️`));
|
|
189
|
+
}
|
|
190
|
+
if (result.underutilized.length > 0) {
|
|
191
|
+
lines.push(``, `### Underutilized (trending skills you have but may not emphasize)`);
|
|
192
|
+
result.underutilized.forEach((s) => lines.push(`- ${s}`));
|
|
193
|
+
}
|
|
194
|
+
lines.push(``, `### All Identified Gaps`, `| Skill | Priority | Current | Target | Gap |`, `|-------|----------|---------|--------|-----|`);
|
|
195
|
+
for (const gap of result.gaps) {
|
|
196
|
+
lines.push(`| ${gap.skill} | ${gap.priority} | ${gap.currentLevel} | ${gap.targetLevel} | ${gap.gap} |`);
|
|
197
|
+
}
|
|
198
|
+
lines.push(``, `*Use \`build_plan\` with the top gaps above to generate your 90-day learning plan.*`);
|
|
199
|
+
return lines.join('\n');
|
|
200
|
+
}
|
|
201
|
+
export async function handleBuildPlan(args) {
|
|
202
|
+
const profileId = String(args.profileId);
|
|
203
|
+
const focusSkills = args.focusSkills ?? [];
|
|
204
|
+
const hoursPerWeek = Number(args.hoursPerWeek) || 5;
|
|
205
|
+
if (focusSkills.length === 0) {
|
|
206
|
+
return 'Error: focusSkills must not be empty. Use analyze_skills first to identify your top gaps.';
|
|
207
|
+
}
|
|
208
|
+
const plan = buildPlan({ profileId, focusSkills, hoursPerWeek });
|
|
209
|
+
const lines = [
|
|
210
|
+
`## 90-Day Learning Plan`,
|
|
211
|
+
`**Profile:** ${profileId} | **Hours/week:** ${hoursPerWeek}`,
|
|
212
|
+
``,
|
|
213
|
+
`- **Month 1:** ${plan.month1Focus}`,
|
|
214
|
+
`- **Month 2:** ${plan.month2Focus}`,
|
|
215
|
+
`- **Month 3:** ${plan.month3Focus}`,
|
|
216
|
+
``,
|
|
217
|
+
`---`,
|
|
218
|
+
];
|
|
219
|
+
for (const week of plan.weeks) {
|
|
220
|
+
lines.push(``, `### Week ${week.weekNumber}: ${week.theme}`);
|
|
221
|
+
lines.push(`**Concept:** ${week.concept}`);
|
|
222
|
+
if (week.conceptResource) {
|
|
223
|
+
const r = week.conceptResource;
|
|
224
|
+
lines.push(`**Resource:** [${r.title}](${r.url}) — ${r.type}, ${r.estimatedHours}h, ${r.level}${r.free ? ' (free)' : ''}`);
|
|
225
|
+
}
|
|
226
|
+
lines.push(`**Practice Exercise:** ${week.practiceExercise}`);
|
|
227
|
+
lines.push(`**Stretch Goal:** ${week.stretchGoal}`);
|
|
228
|
+
lines.push(`**Estimated Hours:** ${week.estimatedHours}h`);
|
|
229
|
+
lines.push(``, `**Daily Micro-Actions:**`);
|
|
230
|
+
for (const action of week.dailyActions) {
|
|
231
|
+
lines.push(`- Day ${action.day} (${action.estimatedMinutes}min) [${action.type}]: ${action.action}`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
lines.push(``, `---`, `*Use \`weekly_checkin\` every week to track progress and stay on course.*`);
|
|
235
|
+
return lines.join('\n');
|
|
236
|
+
}
|
|
237
|
+
export async function handleGetTrendingSkills(args) {
|
|
238
|
+
const role = String(args.role ?? '');
|
|
239
|
+
const category = resolveCategory(role);
|
|
240
|
+
const trends = ROLE_TRENDS[category];
|
|
241
|
+
if (!trends) {
|
|
242
|
+
return `No trend data found for role: ${role}`;
|
|
243
|
+
}
|
|
244
|
+
const lines = [
|
|
245
|
+
`## Trending Skills: ${category}`,
|
|
246
|
+
`*(Data: 2025-2026)*`,
|
|
247
|
+
``,
|
|
248
|
+
`### In-Demand (learn these now)`,
|
|
249
|
+
...trends.trending.map((s) => `- ${s}`),
|
|
250
|
+
``,
|
|
251
|
+
`### Emerging (get ahead of the curve)`,
|
|
252
|
+
...trends.emerging.map((s) => `- ${s}`),
|
|
253
|
+
``,
|
|
254
|
+
`### Decaying (deprioritize or sunset)`,
|
|
255
|
+
...trends.decaying.map((s) => `- ${s} ↓`),
|
|
256
|
+
];
|
|
257
|
+
// Add all available categories
|
|
258
|
+
const allCategories = Object.keys(ROLE_TRENDS);
|
|
259
|
+
lines.push(``, `*Available categories: ${allCategories.join(', ')}*`);
|
|
260
|
+
return lines.join('\n');
|
|
261
|
+
}
|
|
262
|
+
export async function handleWeeklyCheckin(args) {
|
|
263
|
+
const profileId = String(args.profileId);
|
|
264
|
+
const weekNumber = Number(args.weekNumber) || 1;
|
|
265
|
+
const completedItems = args.completedItems ?? [];
|
|
266
|
+
const notes = String(args.notes ?? '');
|
|
267
|
+
// Save checkin
|
|
268
|
+
saveCheckin({
|
|
269
|
+
id: uuidv4(),
|
|
270
|
+
profileId,
|
|
271
|
+
weekNumber,
|
|
272
|
+
completedItems,
|
|
273
|
+
notes,
|
|
274
|
+
createdAt: new Date().toISOString(),
|
|
275
|
+
});
|
|
276
|
+
// Load all checkins to compute progress
|
|
277
|
+
const allCheckins = getCheckins(profileId);
|
|
278
|
+
const totalCompleted = allCheckins.reduce((sum, c) => sum + c.completedItems.length, 0);
|
|
279
|
+
const completionRate = completedItems.length > 0 ? 100 : 0;
|
|
280
|
+
// Encouraging messages based on progress
|
|
281
|
+
const encouragements = [
|
|
282
|
+
"Every expert was once a beginner. You're building something real.",
|
|
283
|
+
"Consistency beats intensity. Showing up this week compounds over 90 days.",
|
|
284
|
+
"The skills you're building today are your leverage for tomorrow.",
|
|
285
|
+
"You're in the top 5% — most people never act on their learning goals.",
|
|
286
|
+
"Small progress is still progress. Keep the streak alive.",
|
|
287
|
+
"The market rewards those who learn continuously. You're doing exactly that.",
|
|
288
|
+
"Your future self will thank you for the work you're putting in right now.",
|
|
289
|
+
];
|
|
290
|
+
const encouragement = encouragements[weekNumber % encouragements.length];
|
|
291
|
+
const lines = [
|
|
292
|
+
`## Week ${weekNumber} Check-In Saved`,
|
|
293
|
+
`**Profile:** ${profileId}`,
|
|
294
|
+
``,
|
|
295
|
+
`### This Week`,
|
|
296
|
+
`**Completed (${completedItems.length} items):**`,
|
|
297
|
+
...completedItems.map((item) => `- ✓ ${item}`),
|
|
298
|
+
];
|
|
299
|
+
if (notes) {
|
|
300
|
+
lines.push(``, `**Notes:** ${notes}`);
|
|
301
|
+
}
|
|
302
|
+
lines.push(``, `### Progress Summary`, `- Weeks checked in: ${allCheckins.length} / 12`, `- Total activities completed: ${totalCompleted}`, `- This week completion: ${completedItems.length > 0 ? 'Active' : 'Light week — push harder next week'}`, ``, `### Encouragement`, `> ${encouragement}`, ``, `### Next Steps`);
|
|
303
|
+
if (weekNumber < 4) {
|
|
304
|
+
lines.push(`- Continue Month 1 foundation work. Focus on concepts, not speed.`);
|
|
305
|
+
lines.push(`- Week ${weekNumber + 1}: deepen understanding with the practice exercise.`);
|
|
306
|
+
}
|
|
307
|
+
else if (weekNumber < 8) {
|
|
308
|
+
lines.push(`- Month 2: shift from learning to building. Make something real.`);
|
|
309
|
+
lines.push(`- Apply your skills to a concrete project or work challenge this week.`);
|
|
310
|
+
}
|
|
311
|
+
else if (weekNumber < 12) {
|
|
312
|
+
lines.push(`- Month 3: make your learning visible. Write, share, contribute.`);
|
|
313
|
+
lines.push(`- Update LinkedIn/resume with concrete outcomes from your 90-day work.`);
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
lines.push(`- 🎉 You've completed your 90-day plan! Time to run analyze_skills again to measure growth.`);
|
|
317
|
+
lines.push(`- Consider what your next 90-day cycle should focus on.`);
|
|
318
|
+
}
|
|
319
|
+
return lines.join('\n');
|
|
320
|
+
}
|
|
321
|
+
export async function handleGetResources(args) {
|
|
322
|
+
const skill = String(args.skill ?? '');
|
|
323
|
+
const level = args.level;
|
|
324
|
+
const maxHours = args.maxHours !== undefined ? Number(args.maxHours) : undefined;
|
|
325
|
+
const resources = getResourcesForSkill(skill, level, maxHours);
|
|
326
|
+
if (resources.length === 0) {
|
|
327
|
+
return `No resources found for "${skill}"${level ? ` at ${level} level` : ''}${maxHours !== undefined ? ` under ${maxHours}h` : ''}. Try a broader search term.`;
|
|
328
|
+
}
|
|
329
|
+
const lines = [
|
|
330
|
+
`## Learning Resources: ${skill}`,
|
|
331
|
+
`*Showing ${resources.length} result(s) — all free*`,
|
|
332
|
+
``,
|
|
333
|
+
];
|
|
334
|
+
for (const r of resources) {
|
|
335
|
+
lines.push(`### ${r.title}`);
|
|
336
|
+
lines.push(`- **Type:** ${r.type} | **Level:** ${r.level} | **Time:** ~${r.estimatedHours}h | **Free:** ${r.free ? 'Yes' : 'No'}`);
|
|
337
|
+
lines.push(`- **URL:** ${r.url}`);
|
|
338
|
+
lines.push(``);
|
|
339
|
+
}
|
|
340
|
+
return lines.join('\n');
|
|
341
|
+
}
|
|
342
|
+
export async function handleCompareToMarket(args) {
|
|
343
|
+
const profileId = String(args.profileId);
|
|
344
|
+
const role = String(args.role ?? '');
|
|
345
|
+
const currentSkills = args.currentSkills ?? [];
|
|
346
|
+
const yearsExperience = Number(args.yearsExperience) || 0;
|
|
347
|
+
const result = analyzeSkills({
|
|
348
|
+
profileId,
|
|
349
|
+
role,
|
|
350
|
+
currentSkills,
|
|
351
|
+
yearsExperience,
|
|
352
|
+
target: 'stay current',
|
|
353
|
+
});
|
|
354
|
+
const category = resolveCategory(role);
|
|
355
|
+
const trends = ROLE_TRENDS[category];
|
|
356
|
+
const totalTrending = trends.trending.length + trends.emerging.length;
|
|
357
|
+
const covered = result.strengths.length;
|
|
358
|
+
const alignmentScore = Math.round((covered / Math.max(totalTrending, 1)) * 100);
|
|
359
|
+
// Salary impact heuristic
|
|
360
|
+
const criticalGaps = result.gaps.filter((g) => g.priority === 'critical');
|
|
361
|
+
let salaryImpact;
|
|
362
|
+
if (criticalGaps.length === 0) {
|
|
363
|
+
salaryImpact = '+15-25% above market average (strong alignment)';
|
|
364
|
+
}
|
|
365
|
+
else if (criticalGaps.length <= 2) {
|
|
366
|
+
salaryImpact = 'At market average (+/- 5%) — closing 1-2 gaps could unlock +10-15%';
|
|
367
|
+
}
|
|
368
|
+
else if (criticalGaps.length <= 4) {
|
|
369
|
+
salaryImpact = '-10-20% below market peers — significant gaps in high-value skills';
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
salaryImpact = '-20-30% below market — foundational reskilling recommended';
|
|
373
|
+
}
|
|
374
|
+
const lines = [
|
|
375
|
+
`## Market Comparison: ${role}`,
|
|
376
|
+
`**Category:** ${category}`,
|
|
377
|
+
``,
|
|
378
|
+
`### Market Alignment Score: ${alignmentScore}%`,
|
|
379
|
+
`You have ${covered} of ${totalTrending} in-demand skills for your role.`,
|
|
380
|
+
``,
|
|
381
|
+
`### Unique Strengths`,
|
|
382
|
+
];
|
|
383
|
+
if (result.strengths.length > 0) {
|
|
384
|
+
result.strengths.forEach((s) => lines.push(`- ${s}`));
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
lines.push(`- No trending skills detected in your current skill list.`);
|
|
388
|
+
}
|
|
389
|
+
lines.push(``, `### Critical Gaps (highest market impact)`);
|
|
390
|
+
if (criticalGaps.length > 0) {
|
|
391
|
+
criticalGaps.forEach((g) => lines.push(`- **${g.skill}** — Impact: ${g.impactScore}/100, ROI: ${g.roi.toFixed(2)}`));
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
lines.push(`- No critical gaps — you're well-aligned with market demands!`);
|
|
395
|
+
}
|
|
396
|
+
if (result.atRisk.length > 0) {
|
|
397
|
+
lines.push(``, `### Skills Losing Value (at risk)`);
|
|
398
|
+
result.atRisk.forEach((s) => lines.push(`- ${s} — Consider deprioritizing or pivoting this skill`));
|
|
399
|
+
}
|
|
400
|
+
lines.push(``, `### Estimated Salary Impact`, `${salaryImpact}`, ``, `### Recommended Actions`, `1. Run \`build_plan\` with your top ${Math.min(4, criticalGaps.length)} critical gaps as focus skills`, `2. Dedicate 5-10 hours/week for 90 days to close your highest-ROI gaps`, `3. Use \`weekly_checkin\` to track progress and maintain momentum`);
|
|
401
|
+
return lines.join('\n');
|
|
402
|
+
}
|
|
403
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAc,WAAW,EAAoB,MAAM,UAAU,CAAC;AAE/F,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,mJAAmJ;QACrJ,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sEAAsE;iBACpF;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,gGAAgG;iBACnG;gBACD,aAAa,EAAE;oBACb,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,WAAW,EAAE,4DAA4D;iBAC1E;gBACD,eAAe,EAAE;oBACf,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,iCAAiC;iBAC/C;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,0EAA0E;iBAC7E;aACF;YACD,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,iBAAiB,EAAE,QAAQ,CAAC;SAC9E;KACF;IACD;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EACT,oIAAoI;QACtI,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kCAAkC;iBAChD;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,WAAW,EAAE,mEAAmE;iBACjF;gBACD,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,4CAA4C;iBAC1D;aACF;YACD,QAAQ,EAAE,CAAC,WAAW,EAAE,aAAa,EAAE,cAAc,CAAC;SACvD;KACF;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EACT,oFAAoF;QACtF,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,0EAA0E;iBACxF;aACF;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB;KACF;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,6GAA6G;QAC/G,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,YAAY;iBAC1B;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,4BAA4B;iBAC1C;gBACD,cAAc,EAAE;oBACd,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,WAAW,EAAE,wCAAwC;iBACtD;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,6CAA6C;iBAC3D;aACF;YACD,QAAQ,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,gBAAgB,CAAC;SACxD;KACF;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,qGAAqG;QACvG,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,oEAAoE;iBAClF;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,CAAC;oBAC9C,WAAW,EAAE,sCAAsC;iBACpD;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2DAA2D;iBACzE;aACF;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EACT,kJAAkJ;QACpJ,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yDAAyD;iBACvE;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yBAAyB;iBACvC;gBACD,aAAa,EAAE;oBACb,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,WAAW,EAAE,qBAAqB;iBACnC;gBACD,eAAe,EAAE;oBACf,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qBAAqB;iBACnC;aACF;YACD,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,iBAAiB,CAAC;SACpE;KACF;CACF,CAAC;AAEF,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAA6B;IACrE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,aAAa,GAAI,IAAI,CAAC,aAA0B,IAAI,EAAE,CAAC;IAC7D,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,cAAc,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC;IAE1F,kBAAkB;IAClB,WAAW,CAAC;QACV,EAAE,EAAE,MAAM,EAAE;QACZ,SAAS;QACT,IAAI;QACJ,aAAa,EAAE,aAAa;QAC5B,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAC/C,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACvC,UAAU,EAAE,MAAM;KACnB,CAAC,CAAC;IAEH,MAAM,KAAK,GAAa;QACtB,0BAA0B,IAAI,EAAE;QAChC,EAAE;QACF,0BAA0B,MAAM,CAAC,QAAQ,oCAAoC;QAC7E,EAAE;QACF,qCAAqC;KACtC,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CACR,OAAO,GAAG,CAAC,KAAK,kBAAkB,GAAG,CAAC,QAAQ,WAAW,GAAG,CAAC,GAAG,iBAAiB,GAAG,CAAC,WAAW,WAAW,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAChI,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,kDAAkD,CAAC,CAAC;QACnE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,0CAA0C,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,oEAAoE,CAAC,CAAC;QACrF,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAI,CACR,EAAE,EACF,yBAAyB,EACzB,+CAA+C,EAC/C,+CAA+C,CAChD,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CACR,KAAK,GAAG,CAAC,KAAK,MAAM,GAAG,CAAC,QAAQ,MAAM,GAAG,CAAC,YAAY,MAAM,GAAG,CAAC,WAAW,MAAM,GAAG,CAAC,GAAG,IAAI,CAC7F,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CACR,EAAE,EACF,qFAAqF,CACtF,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAA6B;IACjE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,WAAW,GAAI,IAAI,CAAC,WAAwB,IAAI,EAAE,CAAC;IACzD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAEpD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,2FAA2F,CAAC;IACrG,CAAC;IAED,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;IAEjE,MAAM,KAAK,GAAa;QACtB,yBAAyB;QACzB,gBAAgB,SAAS,sBAAsB,YAAY,EAAE;QAC7D,EAAE;QACF,kBAAkB,IAAI,CAAC,WAAW,EAAE;QACpC,kBAAkB,IAAI,CAAC,WAAW,EAAE;QACpC,kBAAkB,IAAI,CAAC,WAAW,EAAE;QACpC,EAAE;QACF,KAAK;KACN,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC;YAC/B,KAAK,CAAC,IAAI,CACR,kBAAkB,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,cAAc,MAAM,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/G,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC9D,KAAK,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,wBAAwB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,0BAA0B,CAAC,CAAC;QAC3C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CACR,SAAS,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,gBAAgB,SAAS,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,MAAM,EAAE,CACzF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CACR,EAAE,EACF,KAAK,EACL,2EAA2E,CAC5E,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAA6B;IACzE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAErC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,iCAAiC,IAAI,EAAE,CAAC;IACjD,CAAC;IAED,MAAM,KAAK,GAAa;QACtB,uBAAuB,QAAQ,EAAE;QACjC,qBAAqB;QACrB,EAAE;QACF,iCAAiC;QACjC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,EAAE;QACF,uCAAuC;QACvC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,EAAE;QACF,uCAAuC;QACvC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;KAC1C,CAAC;IAEF,+BAA+B;IAC/B,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,0BAA0B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEtE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAA6B;IACrE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,cAAc,GAAI,IAAI,CAAC,cAA2B,IAAI,EAAE,CAAC;IAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAEvC,eAAe;IACf,WAAW,CAAC;QACV,EAAE,EAAE,MAAM,EAAE;QACZ,SAAS;QACT,UAAU;QACV,cAAc;QACd,KAAK;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;IAEH,wCAAwC;IACxC,MAAM,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACxF,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3D,yCAAyC;IACzC,MAAM,cAAc,GAAG;QACrB,mEAAmE;QACnE,2EAA2E;QAC3E,kEAAkE;QAClE,uEAAuE;QACvE,0DAA0D;QAC1D,6EAA6E;QAC7E,2EAA2E;KAC5E,CAAC;IACF,MAAM,aAAa,GAAG,cAAc,CAAC,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAEzE,MAAM,KAAK,GAAa;QACtB,WAAW,UAAU,iBAAiB;QACtC,gBAAgB,SAAS,EAAE;QAC3B,EAAE;QACF,eAAe;QACf,gBAAgB,cAAc,CAAC,MAAM,YAAY;QACjD,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC;KAC/C,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,IAAI,CACR,EAAE,EACF,sBAAsB,EACtB,uBAAuB,WAAW,CAAC,MAAM,OAAO,EAChD,iCAAiC,cAAc,EAAE,EACjD,2BAA2B,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,oCAAoC,EAAE,EACxG,EAAE,EACF,mBAAmB,EACnB,KAAK,aAAa,EAAE,EACpB,EAAE,EACF,gBAAgB,CACjB,CAAC;IAEF,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;QAChF,KAAK,CAAC,IAAI,CAAC,UAAU,UAAU,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAC3F,CAAC;SAAM,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QAC/E,KAAK,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;IACvF,CAAC;SAAM,IAAI,UAAU,GAAG,EAAE,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QAC/E,KAAK,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;IACvF,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,6FAA6F,CAAC,CAAC;QAC1G,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAA6B;IACpE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAA2B,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEjF,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE/D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,2BAA2B,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,8BAA8B,CAAC;IACnK,CAAC;IAED,MAAM,KAAK,GAAa;QACtB,0BAA0B,KAAK,EAAE;QACjC,YAAY,SAAS,CAAC,MAAM,wBAAwB;QACpD,EAAE;KACH,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,KAAK,iBAAiB,CAAC,CAAC,cAAc,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACnI,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAA6B;IACvE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACrC,MAAM,aAAa,GAAI,IAAI,CAAC,aAA0B,IAAI,EAAE,CAAC;IAC7D,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAG,aAAa,CAAC;QAC3B,SAAS;QACT,IAAI;QACJ,aAAa;QACb,eAAe;QACf,MAAM,EAAE,cAAc;KACvB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAErC,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IACtE,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;IACxC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IAEhF,0BAA0B;IAC1B,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;IAC1E,IAAI,YAAoB,CAAC;IACzB,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,YAAY,GAAG,iDAAiD,CAAC;IACnE,CAAC;SAAM,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACpC,YAAY,GAAG,oEAAoE,CAAC;IACtF,CAAC;SAAM,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACpC,YAAY,GAAG,oEAAoE,CAAC;IACtF,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,4DAA4D,CAAC;IAC9E,CAAC;IAED,MAAM,KAAK,GAAa;QACtB,yBAAyB,IAAI,EAAE;QAC/B,iBAAiB,QAAQ,EAAE;QAC3B,EAAE;QACF,+BAA+B,cAAc,GAAG;QAChD,YAAY,OAAO,OAAO,aAAa,kCAAkC;QACzE,EAAE;QACF,sBAAsB;KACvB,CAAC;IAEF,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,2CAA2C,CAAC,CAAC;IAC5D,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACzB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,gBAAgB,CAAC,CAAC,WAAW,cAAc,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CACxF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,mCAAmC,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAC1B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,mDAAmD,CAAC,CACtE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CACR,EAAE,EACF,6BAA6B,EAC7B,GAAG,YAAY,EAAE,EACjB,EAAE,EACF,yBAAyB,EACzB,uCAAuC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,gCAAgC,EACvG,wEAAwE,EACxE,mEAAmE,CACpE,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
package/llms.txt
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# skill-radar
|
|
2
|
+
> Personalized skill gap analysis and 90-day learning plans for professionals
|
|
3
|
+
|
|
4
|
+
skill-radar is an MCP server that analyzes your professional role, current skills, and industry trends to identify specific skill gaps and build a personalized learning plan.
|
|
5
|
+
|
|
6
|
+
## Tools
|
|
7
|
+
- analyze_skills: Analyze skill gaps for a professional profile
|
|
8
|
+
- build_plan: Generate a 90-day learning plan
|
|
9
|
+
- get_trending_skills: Get trending skills by role/industry
|
|
10
|
+
- weekly_checkin: Track weekly learning progress
|
|
11
|
+
- get_resources: Get curated learning resources for a skill
|
|
12
|
+
- compare_to_market: Compare skills to current market demands
|
|
13
|
+
|
|
14
|
+
## Data Coverage
|
|
15
|
+
Role categories: Software Engineering, Product Management, Marketing, Finance/Accounting, Healthcare, Data Science/Analytics, Design, Leadership/Management, Law
|
|
16
|
+
Trend data: 2025-2026
|
|
17
|
+
|
|
18
|
+
## Installation
|
|
19
|
+
npm install -g @gonzih/skill-radar
|
|
20
|
+
|
|
21
|
+
## MCP Config
|
|
22
|
+
{ "mcpServers": { "skill-radar": { "command": "skill-radar" } } }
|