@fprad0/skill-master-mcp 0.0.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.
Files changed (46) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +168 -0
  3. package/VERSION.md +9 -0
  4. package/bin/skill-master-configure-private-registry.mjs +3 -0
  5. package/bin/skill-master.mjs +3 -0
  6. package/dist/catalog.d.ts +11 -0
  7. package/dist/catalog.d.ts.map +1 -0
  8. package/dist/catalog.js +202 -0
  9. package/dist/catalog.js.map +1 -0
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +284 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/recommender.d.ts +6 -0
  15. package/dist/recommender.d.ts.map +1 -0
  16. package/dist/recommender.js +102 -0
  17. package/dist/recommender.js.map +1 -0
  18. package/dist/skill-network.d.ts +67 -0
  19. package/dist/skill-network.d.ts.map +1 -0
  20. package/dist/skill-network.js +226 -0
  21. package/dist/skill-network.js.map +1 -0
  22. package/dist/types.d.ts +89 -0
  23. package/dist/types.d.ts.map +1 -0
  24. package/dist/types.js +2 -0
  25. package/dist/types.js.map +1 -0
  26. package/dist/update.d.ts +45 -0
  27. package/dist/update.d.ts.map +1 -0
  28. package/dist/update.js +288 -0
  29. package/dist/update.js.map +1 -0
  30. package/docs/operations/GUIA_NPM_PRIVADO.md +250 -0
  31. package/examples/client-configs/claude-code.commands.md +17 -0
  32. package/examples/client-configs/claude-code.project.mcp.json +18 -0
  33. package/examples/client-configs/claude-desktop.macos.json +18 -0
  34. package/examples/client-configs/claude-desktop.windows.json +20 -0
  35. package/examples/client-configs/codex.windows.toml +11 -0
  36. package/examples/client-configs/gemini-code-assist.intellij.mcp.json +18 -0
  37. package/examples/client-configs/gemini.linux.settings.json +21 -0
  38. package/examples/client-configs/gemini.windows.settings.json +23 -0
  39. package/examples/client-configs/generic-stdio.json +16 -0
  40. package/manifests/channels/beta.json +25 -0
  41. package/manifests/channels/stable.json +26 -0
  42. package/network/approved-skills.json +5 -0
  43. package/package.json +60 -0
  44. package/scripts/configure-private-registry.mjs +124 -0
  45. package/scripts/lib/private-registry.mjs +56 -0
  46. package/sources.json +8 -0
package/dist/index.js ADDED
@@ -0,0 +1,284 @@
1
+ import path from 'node:path';
2
+ import os from 'node:os';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { promises as fs } from 'node:fs';
5
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
7
+ import { z } from 'zod';
8
+ import { buildCatalog, loadConfig, readCatalog, saveCatalog, tokenize } from './catalog.js';
9
+ import { recommendSkills } from './recommender.js';
10
+ import { prepareSkillContribution, readApprovedSkillIndex, reviewSkillContribution, } from './skill-network.js';
11
+ import { buildSyncStatus, buildUpdatePlan } from './update.js';
12
+ const here = path.dirname(fileURLToPath(import.meta.url));
13
+ const projectRoot = path.resolve(here, '..');
14
+ const skillMasterHome = process.env.SKILL_MASTER_HOME ?? path.join(os.homedir(), '.skill-master');
15
+ const userConfigPath = path.join(skillMasterHome, 'sources.json');
16
+ const packagedConfigPath = path.join(projectRoot, 'sources.json');
17
+ const configPath = process.env.SKILL_MASTER_CONFIG ?? (await fs.access(userConfigPath).then(() => userConfigPath).catch(() => packagedConfigPath));
18
+ const catalogPath = process.env.SKILL_MASTER_CACHE ?? path.join(skillMasterHome, 'data', 'catalog.json');
19
+ const versionFile = process.env.SKILL_MASTER_VERSION_FILE ?? path.join(projectRoot, 'VERSION.md');
20
+ const approvedSkillIndexPath = process.env.SKILL_MASTER_APPROVED_SKILLS_INDEX
21
+ ?? path.join(projectRoot, 'network', 'approved-skills.json');
22
+ const contributionsDir = process.env.SKILL_MASTER_CONTRIBUTIONS_DIR
23
+ ?? path.join(skillMasterHome, 'data', 'contributions');
24
+ const workspace = process.env.SKILL_MASTER_WORKSPACE ?? process.cwd();
25
+ const manifestUrl = process.env.SKILL_MASTER_MANIFEST_URL
26
+ ?? 'https://raw.githubusercontent.com/FPrad0/skill-master-mcp/main/manifests/channels/stable.json';
27
+ const updateChannel = process.env.SKILL_MASTER_UPDATE_CHANNEL ?? 'stable';
28
+ const releaseBranch = process.env.SKILL_MASTER_RELEASE_BRANCH ?? 'main';
29
+ const CHARACTER_LIMIT = 25_000;
30
+ const initialSnapshot = {
31
+ generatedAt: new Date(0).toISOString(),
32
+ skills: [],
33
+ warnings: ['Catálogo ainda não foi atualizado.'],
34
+ };
35
+ let snapshot = await readCatalog(catalogPath) ?? initialSnapshot;
36
+ const saveSnapshot = async (nextSnapshot) => {
37
+ snapshot = nextSnapshot;
38
+ await saveCatalog(catalogPath, snapshot);
39
+ };
40
+ const refresh = async (includeWeb) => {
41
+ const config = await loadConfig(configPath);
42
+ const updated = await buildCatalog(config, { cwd: workspace, includeWeb });
43
+ if (!includeWeb) {
44
+ const localNames = new Set(updated.skills.map((skill) => skill.name.toLowerCase()));
45
+ updated.skills.push(...snapshot.skills.filter((skill) => skill.sourceKind === 'web' && !localNames.has(skill.name.toLowerCase())));
46
+ updated.skills.sort((a, b) => a.name.localeCompare(b.name));
47
+ }
48
+ await saveSnapshot(updated);
49
+ return updated;
50
+ };
51
+ await refresh(false).catch(() => snapshot);
52
+ const response = (data, markdown) => ({
53
+ content: [{ type: 'text', text: markdown.slice(0, CHARACTER_LIMIT) }],
54
+ structuredContent: data,
55
+ });
56
+ const server = new McpServer({ name: 'skill-master-mcp-server', version: '0.0.1' });
57
+ server.registerTool('skill_master_list_sources', {
58
+ title: 'List skill sources',
59
+ description: 'Show configured local, workspace, plugin, and curated web sources plus trust rules.',
60
+ inputSchema: {},
61
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
62
+ }, async () => {
63
+ const config = await loadConfig(configPath);
64
+ return response(config, [
65
+ '# Skill Master sources',
66
+ ...config.localRoots.map((root) => `- Local: ${root}`),
67
+ ...config.workspaceRoots.map((root) => `- Workspace: ${root}`),
68
+ ...config.webSources.map((source) => `- Web: ${source.repository} (${source.enabled ? 'active' : 'inactive'}, untrusted)`),
69
+ ].join('\n'));
70
+ });
71
+ server.registerTool('skill_master_search', {
72
+ title: 'Search the skill catalog',
73
+ description: 'Search cataloged skills by name, description, heading, source, or keyword without reading every SKILL.md into model context.',
74
+ inputSchema: {
75
+ query: z.string().min(2).max(500),
76
+ limit: z.number().int().min(1).max(100).default(20),
77
+ include_web: z.boolean().default(false),
78
+ response_format: z.enum(['markdown', 'json']).default('markdown'),
79
+ },
80
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
81
+ }, async ({ query, limit, include_web, response_format }) => {
82
+ const tokens = tokenize(query);
83
+ const matches = snapshot.skills.filter((skill) => {
84
+ if (!include_web && skill.sourceKind === 'web')
85
+ return false;
86
+ const haystack = `${skill.name} ${skill.description} ${skill.headings.join(' ')}`.toLowerCase();
87
+ return tokens.every((token) => haystack.includes(token));
88
+ }).slice(0, limit);
89
+ const payload = { count: matches.length, skills: matches };
90
+ const markdown = matches.length
91
+ ? matches.map((skill) => `- **${skill.name}** (${skill.sourceKind}) — ${skill.description}\n ${skill.location}`).join('\n')
92
+ : 'Nenhuma skill encontrada.';
93
+ return response(payload, response_format === 'json' ? JSON.stringify(payload, null, 2) : markdown);
94
+ });
95
+ server.registerTool('skill_master_recommend', {
96
+ title: 'Recommend skills for a prompt',
97
+ description: 'Analyze a simple or detailed objective and return the best installed or cataloged skills, ordered by execution phase, with reasons and trust/source information. This does not install or execute skills.',
98
+ inputSchema: {
99
+ prompt: z.string().min(3).max(20_000),
100
+ limit: z.number().int().min(1).max(30).default(12),
101
+ source_scope: z.enum(['all', 'trusted', 'workspace', 'web']).default('trusted'),
102
+ response_format: z.enum(['markdown', 'json']).default('markdown'),
103
+ },
104
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
105
+ }, async ({ prompt, limit, source_scope, response_format }) => {
106
+ const scopes = {
107
+ all: undefined,
108
+ trusted: ['workspace', 'local', 'plugin'],
109
+ workspace: ['workspace'],
110
+ web: ['web'],
111
+ };
112
+ const sourceKinds = scopes[source_scope];
113
+ const recommendations = recommendSkills(snapshot.skills, prompt, sourceKinds ? { limit, sourceKinds } : { limit });
114
+ const payload = {
115
+ objective: prompt,
116
+ generated_at: new Date().toISOString(),
117
+ catalog_generated_at: snapshot.generatedAt,
118
+ recommendations: recommendations.map((entry, index) => ({
119
+ order: index + 1,
120
+ name: entry.skill.name,
121
+ phase: entry.phase,
122
+ required: entry.required,
123
+ score: entry.score,
124
+ reasons: entry.reasons,
125
+ source: entry.skill.sourceKind,
126
+ trusted: entry.skill.trusted,
127
+ location: entry.skill.location,
128
+ description: entry.skill.description,
129
+ })),
130
+ warnings: snapshot.warnings,
131
+ };
132
+ const markdown = recommendations.length
133
+ ? ['# Skills recomendadas', '', ...recommendations.map((entry, index) => `${index + 1}. **${entry.skill.name}** — ${entry.phase}\n ${entry.reasons.join('; ')}. Fonte: ${entry.skill.sourceKind}${entry.skill.trusted ? '' : ' (não confiável)'}.`), '', 'Use as skills na ordem das fases. Leia cada SKILL.md antes de agir; recomendações web exigem revisão humana e instalação explícita.'].join('\n')
134
+ : 'Nenhuma skill atingiu relevância suficiente. Atualize o catálogo ou detalhe tecnologias, ação e resultado esperado.';
135
+ return response(payload, response_format === 'json' ? JSON.stringify(payload, null, 2) : markdown);
136
+ });
137
+ server.registerTool('skill_master_sync_status', {
138
+ title: 'Show sync status',
139
+ description: 'Report local version, remote manifest status, Git state, and whether an update is available for this machine.',
140
+ inputSchema: {},
141
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
142
+ }, async () => {
143
+ const status = await buildSyncStatus({
144
+ repoRoot: projectRoot,
145
+ manifestUrl,
146
+ versionFile,
147
+ channel: updateChannel,
148
+ branch: releaseBranch,
149
+ });
150
+ return response(status, [
151
+ '# Sync status',
152
+ `- Local: ${status.localVersion} (${status.localSemver})`,
153
+ `- Branch: ${status.localBranch}`,
154
+ `- Commit: ${status.localCommit}`,
155
+ `- Clean tree: ${status.localClean ? 'yes' : 'no'}`,
156
+ status.remoteVersion ? `- Remote: ${status.remoteVersion} (${status.remoteSemver})` : '- Remote: unavailable',
157
+ `- Update available: ${status.updateAvailable ? 'yes' : 'no'}`,
158
+ `- Action: ${status.recommendedAction}`,
159
+ ].join('\n'));
160
+ });
161
+ server.registerTool('skill_master_update_plan', {
162
+ title: 'Create update plan',
163
+ description: 'Explain the safe steps the launcher should take to update the installed MCP without applying changes inside the tool.',
164
+ inputSchema: {},
165
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
166
+ }, async () => {
167
+ const steps = await buildUpdatePlan({
168
+ repoRoot: projectRoot,
169
+ manifestUrl,
170
+ versionFile,
171
+ channel: updateChannel,
172
+ branch: releaseBranch,
173
+ });
174
+ return response({ steps }, ['# Update plan', '', ...steps.map((step) => `- ${step}`)].join('\n'));
175
+ });
176
+ server.registerTool('skill_master_refresh_catalog', {
177
+ title: 'Refresh catalog',
178
+ description: 'Rescan configured local/workspace roots and optionally fetch metadata from allowlisted GitHub repositories. Web content is cataloged as untrusted and is never installed or executed.',
179
+ inputSchema: { include_web: z.boolean().default(false) },
180
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },
181
+ }, async ({ include_web }) => {
182
+ const updated = await refresh(include_web);
183
+ const counts = updated.skills.reduce((accumulator, skill) => {
184
+ accumulator[skill.sourceKind] = (accumulator[skill.sourceKind] ?? 0) + 1;
185
+ return accumulator;
186
+ }, {});
187
+ const payload = {
188
+ generated_at: updated.generatedAt,
189
+ total: updated.skills.length,
190
+ counts,
191
+ warnings: updated.warnings,
192
+ };
193
+ return response(payload, `Catálogo atualizado: ${updated.skills.length} skills. Avisos: ${updated.warnings.length}.`);
194
+ });
195
+ server.registerTool('skill_master_prepare_skill_contribution', {
196
+ title: 'Prepare a safe skill contribution draft',
197
+ description: 'Create a local, reviewable contribution package with newly discovered local skills. It never uploads files, never executes skills, and excludes raw bodies/full paths by default.',
198
+ inputSchema: {
199
+ refresh_first: z.boolean().default(true),
200
+ include_body_preview: z.boolean().default(false),
201
+ include_workspace: z.boolean().default(false),
202
+ include_plugin: z.boolean().default(false),
203
+ machine_label: z.string().max(120).optional(),
204
+ max_candidates: z.number().int().min(1).max(500).default(100),
205
+ output_dir: z.string().max(1000).optional(),
206
+ response_format: z.enum(['markdown', 'json']).default('markdown'),
207
+ },
208
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
209
+ }, async ({ refresh_first, include_body_preview, include_workspace, include_plugin, machine_label, max_candidates, output_dir, response_format, }) => {
210
+ if (refresh_first) {
211
+ await refresh(false);
212
+ }
213
+ const approvedIndex = await readApprovedSkillIndex(approvedSkillIndexPath);
214
+ const result = await prepareSkillContribution({
215
+ snapshotSkills: snapshot.skills,
216
+ approvedIndex,
217
+ outputDir: output_dir ?? contributionsDir,
218
+ machineLabel: machine_label,
219
+ includeBodyPreview: include_body_preview,
220
+ includeWorkspace: include_workspace,
221
+ includePlugin: include_plugin,
222
+ maxCandidates: max_candidates,
223
+ });
224
+ const highRiskCandidates = result.draft.candidates.filter((candidate) => candidate.riskFlags.length > 0).length;
225
+ const payload = {
226
+ generated_at: result.draft.generatedAt,
227
+ file_path: result.filePath,
228
+ candidates: result.draft.candidates.length,
229
+ high_risk_candidates: highRiskCandidates,
230
+ skipped: result.draft.skipped,
231
+ privacy: result.draft.privacy,
232
+ approved_index_path: approvedSkillIndexPath,
233
+ };
234
+ const markdown = [
235
+ '# Skill contribution draft',
236
+ `- File: ${result.filePath}`,
237
+ `- Candidates: ${result.draft.candidates.length}`,
238
+ `- Candidates with risk flags: ${highRiskCandidates}`,
239
+ `- Already known by name: ${result.draft.skipped.alreadyKnownByName}`,
240
+ `- Already known by hash: ${result.draft.skipped.alreadyKnownByHash}`,
241
+ `- Unsupported or opt-in source skipped: ${result.draft.skipped.unsupportedSource}`,
242
+ `- Missing content hash: ${result.draft.skipped.missingContentHash}`,
243
+ `- Body preview included: ${result.draft.privacy.bodyPreviewIncluded ? 'yes' : 'no'}`,
244
+ '',
245
+ 'No upload was performed. Review this JSON before opening a PR or sharing it with another machine.',
246
+ ].join('\n');
247
+ return response(payload, response_format === 'json' ? JSON.stringify(payload, null, 2) : markdown);
248
+ });
249
+ server.registerTool('skill_master_review_skill_contribution', {
250
+ title: 'Review a skill contribution draft',
251
+ description: 'Inspect a previously generated contribution package and report duplicate, privacy, and risk findings before human approval.',
252
+ inputSchema: {
253
+ file_path: z.string().min(1).max(1000),
254
+ response_format: z.enum(['markdown', 'json']).default('markdown'),
255
+ },
256
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
257
+ }, async ({ file_path, response_format }) => {
258
+ const approvedIndex = await readApprovedSkillIndex(approvedSkillIndexPath);
259
+ const review = await reviewSkillContribution({
260
+ contributionPath: file_path,
261
+ approvedIndex,
262
+ });
263
+ const payload = {
264
+ ...review,
265
+ approved_index_path: approvedSkillIndexPath,
266
+ };
267
+ const markdown = [
268
+ '# Skill contribution review',
269
+ `- Recommendation: ${review.recommendation}`,
270
+ `- Total candidates: ${review.totalCandidates}`,
271
+ `- High-risk candidates: ${review.highRiskCandidates}`,
272
+ `- Already approved by hash: ${review.alreadyApprovedByHash}`,
273
+ `- Already approved by name: ${review.alreadyApprovedByName}`,
274
+ '',
275
+ 'Findings:',
276
+ ...review.findings.map((finding) => `- ${finding}`),
277
+ '',
278
+ 'Human approval is required before any candidate becomes part of the shared approved index.',
279
+ ].join('\n');
280
+ return response(payload, response_format === 'json' ? JSON.stringify(payload, null, 2) : markdown);
281
+ });
282
+ const transport = new StdioServerTransport();
283
+ await server.connect(transport);
284
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Recommendation, SkillRecord, SkillSourceKind } from './types.js';
2
+ export declare const recommendSkills: (skills: SkillRecord[], prompt: string, options: {
3
+ limit: number;
4
+ sourceKinds?: SkillSourceKind[];
5
+ }) => Recommendation[];
6
+ //# sourceMappingURL=recommender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommender.d.ts","sourceRoot":"","sources":["../src/recommender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAsD/E,eAAO,MAAM,eAAe,GAC1B,QAAQ,WAAW,EAAE,EACrB,QAAQ,MAAM,EACd,SAAS;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,eAAe,EAAE,CAAA;CAAE,KAC1D,cAAc,EA8ChB,CAAC"}
@@ -0,0 +1,102 @@
1
+ import { tokenize } from './catalog.js';
2
+ const STOP_WORDS = new Set([
3
+ 'a', 'as', 'ao', 'aos', 'de', 'do', 'dos', 'e', 'em', 'na', 'nas', 'no', 'nos', 'o', 'os',
4
+ 'para', 'por', 'com', 'uma', 'um', 'que', 'the', 'and', 'for', 'this', 'that', 'use', 'usar',
5
+ ]);
6
+ const sourceBoost = { workspace: 7, local: 5, plugin: 4, web: 0 };
7
+ const INTENT_EXPANSIONS = [
8
+ { triggers: ['frontend', 'interface', 'tela', 'layout', 'ui', 'ux', 'react', 'componente'], add: ['frontend', 'design', 'ui', 'ux', 'react', 'component', 'responsive', 'web'] },
9
+ { triggers: ['planejar', 'planejamento', 'arquitetura', 'estrategia'], add: ['plan', 'planning', 'architecture', 'system', 'design', 'roadmap'] },
10
+ { triggers: ['teste', 'testes', 'testar', 'validar', 'validacao'], add: ['test', 'testing', 'integration', 'unit', 'loop', 'quality', 'verification'] },
11
+ { triggers: ['acessibilidade', 'acessivel', 'a11y'], add: ['accessibility', 'a11y', 'web', 'quality'] },
12
+ { triggers: ['desempenho', 'performance', 'otimizar'], add: ['performance', 'optimize', 'react', 'web'] },
13
+ { triggers: ['commit', 'branch', 'pr'], add: ['git', 'commit', 'pull', 'request', 'devflow'] },
14
+ { triggers: ['bug', 'erro', 'corrigir', 'falha'], add: ['bug', 'debug', 'repro', 'fix', 'test'] },
15
+ { triggers: ['supabase', 'banco', 'sql', 'migracao'], add: ['supabase', 'database', 'sql', 'migration', 'postgres'] },
16
+ { triggers: ['mcp', 'servidor'], add: ['mcp', 'server', 'builder', 'protocol'] },
17
+ ];
18
+ const PHASE_RULES = [
19
+ { phase: '1. Descoberta e diagnóstico', terms: ['audit', 'diagnos', 'debug', 'research', 'orientation', 'repro', 'triage'] },
20
+ { phase: '2. Planejamento e arquitetura', terms: ['planner', 'planning', 'architecture', 'system-design', 'roadmap', 'modeling', 'prompt', 'ticket-breakdown'] },
21
+ { phase: '4. Validação e qualidade', terms: ['test', 'quality', 'accessibility', 'performance', 'security', 'doctor', 'spaghetti', 'guidelines', 'audit'] },
22
+ { phase: '5. Entrega', terms: ['commit', 'deploy', 'release', 'pull-request', 'devflow', 'yeet'] },
23
+ ];
24
+ const inferPhase = (skill) => {
25
+ const name = skill.name.toLowerCase();
26
+ return PHASE_RULES.find((rule) => rule.terms.some((term) => name.includes(term)))?.phase
27
+ ?? '3. Implementação';
28
+ };
29
+ const expandPromptTokens = (prompt) => {
30
+ const base = tokenize(prompt).filter((token) => !STOP_WORDS.has(token));
31
+ const expanded = new Set(base);
32
+ for (const rule of INTENT_EXPANSIONS) {
33
+ if (rule.triggers.some((trigger) => base.some((token) => token.includes(trigger)))) {
34
+ rule.add.forEach((token) => expanded.add(token));
35
+ }
36
+ }
37
+ return [...expanded];
38
+ };
39
+ const isRequired = (skill, prompt) => {
40
+ const normalized = prompt.toLowerCase();
41
+ const skillName = skill.name.toLowerCase();
42
+ return normalized.includes(`$${skillName}`)
43
+ || normalized.includes(`skill ${skillName}`)
44
+ || normalized.includes(`use ${skillName}`)
45
+ || normalized.includes(`utilize ${skillName}`);
46
+ };
47
+ export const recommendSkills = (skills, prompt, options) => {
48
+ const originalTokens = tokenize(prompt).filter((token) => !STOP_WORDS.has(token));
49
+ const promptTokens = expandPromptTokens(prompt);
50
+ const explicitNames = skills.filter((skill) => isRequired(skill, prompt)).map((skill) => skill.name);
51
+ const ranked = skills
52
+ .filter((skill) => !options.sourceKinds || options.sourceKinds.includes(skill.sourceKind))
53
+ .map((skill) => {
54
+ const reasons = [];
55
+ const required = explicitNames.includes(skill.name);
56
+ const nameTokens = new Set(tokenize(skill.name));
57
+ const descriptionTokens = new Set(tokenize(`${skill.description} ${skill.headings.join(' ')}`));
58
+ const exactName = prompt.toLowerCase().includes(skill.name.toLowerCase());
59
+ const nameMatches = promptTokens.filter((token) => nameTokens.has(token));
60
+ const descriptionMatches = promptTokens.filter((token) => descriptionTokens.has(token));
61
+ const originalDescriptionMatches = originalTokens.filter((token) => descriptionTokens.has(token));
62
+ const hasIntentMatch = required || exactName || nameMatches.length > 0 || originalDescriptionMatches.length > 0;
63
+ let score = sourceBoost[skill.sourceKind];
64
+ if (required) {
65
+ score += 100;
66
+ reasons.push('mencionada explicitamente no prompt');
67
+ }
68
+ else if (exactName) {
69
+ score += 45;
70
+ reasons.push('nome identificado diretamente no objetivo');
71
+ }
72
+ score += nameMatches.length * 14;
73
+ score += descriptionMatches.length * 3;
74
+ if (!hasIntentMatch)
75
+ score = Number.NEGATIVE_INFINITY;
76
+ if (nameMatches.length)
77
+ reasons.push(`correspondência no nome: ${nameMatches.slice(0, 4).join(', ')}`);
78
+ if (descriptionMatches.length)
79
+ reasons.push(`cobre: ${descriptionMatches.slice(0, 5).join(', ')}`);
80
+ if (skill.sourceKind === 'workspace')
81
+ reasons.push('especializada no workspace atual');
82
+ if (skill.sourceKind === 'web')
83
+ reasons.push('fonte web não confiável; revisar antes de instalar ou usar');
84
+ return { skill, score, reasons, phase: inferPhase(skill), required };
85
+ })
86
+ .filter((entry) => entry.required || entry.score >= 9)
87
+ .sort((a, b) => Number(b.required) - Number(a.required) || b.score - a.score || a.skill.name.localeCompare(b.skill.name));
88
+ const selected = [];
89
+ for (const phase of PHASE_RULES.map((rule) => rule.phase).concat('3. Implementação')) {
90
+ const bestInPhase = ranked.find((entry) => entry.phase === phase && !selected.includes(entry));
91
+ if (bestInPhase && selected.length < options.limit)
92
+ selected.push(bestInPhase);
93
+ }
94
+ for (const entry of ranked) {
95
+ if (selected.length >= options.limit)
96
+ break;
97
+ if (!selected.includes(entry))
98
+ selected.push(entry);
99
+ }
100
+ return selected.sort((a, b) => Number(b.required) - Number(a.required) || a.phase.localeCompare(b.phase) || b.score - a.score);
101
+ };
102
+ //# sourceMappingURL=recommender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommender.js","sourceRoot":"","sources":["../src/recommender.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import type { ApprovedSkillIndex, SkillRecord, SkillSourceKind } from './types.js';
2
+ declare const CONTRIBUTION_SCHEMA_VERSION = "skill-master-contribution-v1";
3
+ declare const POLICY_VERSION = "safe-skill-network-v1";
4
+ type ContributionScope = Extract<SkillSourceKind, 'local' | 'workspace' | 'plugin'>;
5
+ export type SkillContributionCandidate = {
6
+ name: string;
7
+ description: string;
8
+ contentHash: string;
9
+ sourceKind: ContributionScope;
10
+ sourceLabel: string;
11
+ locationHint: string;
12
+ locationHash: string;
13
+ headings: string[];
14
+ keywords: string[];
15
+ modifiedAt?: string;
16
+ riskFlags: string[];
17
+ bodyPreview?: string;
18
+ };
19
+ export type SkillContributionDraft = {
20
+ schemaVersion: typeof CONTRIBUTION_SCHEMA_VERSION;
21
+ generatedAt: string;
22
+ policyVersion: typeof POLICY_VERSION;
23
+ machineLabel?: string;
24
+ privacy: {
25
+ fullPathsIncluded: false;
26
+ rawSkillBodiesIncluded: false;
27
+ bodyPreviewIncluded: boolean;
28
+ };
29
+ candidates: SkillContributionCandidate[];
30
+ skipped: {
31
+ alreadyKnownByName: number;
32
+ alreadyKnownByHash: number;
33
+ unsupportedSource: number;
34
+ missingContentHash: number;
35
+ };
36
+ };
37
+ export type ContributionReview = {
38
+ schemaVersion: string;
39
+ generatedAt?: string;
40
+ totalCandidates: number;
41
+ highRiskCandidates: number;
42
+ alreadyApprovedByHash: number;
43
+ alreadyApprovedByName: number;
44
+ recommendation: 'safe-to-review' | 'needs-human-security-review' | 'invalid';
45
+ findings: string[];
46
+ };
47
+ export declare const emptyApprovedSkillIndex: () => ApprovedSkillIndex;
48
+ export declare const readApprovedSkillIndex: (indexPath: string) => Promise<ApprovedSkillIndex>;
49
+ export declare const prepareSkillContribution: ({ snapshotSkills, approvedIndex, outputDir, machineLabel, includeBodyPreview, includeWorkspace, includePlugin, maxCandidates, }: {
50
+ snapshotSkills: SkillRecord[];
51
+ approvedIndex: ApprovedSkillIndex;
52
+ outputDir: string;
53
+ machineLabel?: string;
54
+ includeBodyPreview: boolean;
55
+ includeWorkspace: boolean;
56
+ includePlugin: boolean;
57
+ maxCandidates: number;
58
+ }) => Promise<{
59
+ draft: SkillContributionDraft;
60
+ filePath: string;
61
+ }>;
62
+ export declare const reviewSkillContribution: ({ contributionPath, approvedIndex, }: {
63
+ contributionPath: string;
64
+ approvedIndex: ApprovedSkillIndex;
65
+ }) => Promise<ContributionReview>;
66
+ export {};
67
+ //# sourceMappingURL=skill-network.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-network.d.ts","sourceRoot":"","sources":["../src/skill-network.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEnF,QAAA,MAAM,2BAA2B,iCAAiC,CAAC;AACnE,QAAA,MAAM,cAAc,0BAA0B,CAAC;AAG/C,KAAK,iBAAiB,GAAG,OAAO,CAAC,eAAe,EAAE,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC,CAAC;AAEpF,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,EAAE,OAAO,2BAA2B,CAAC;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,OAAO,cAAc,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE;QACP,iBAAiB,EAAE,KAAK,CAAC;QACzB,sBAAsB,EAAE,KAAK,CAAC;QAC9B,mBAAmB,EAAE,OAAO,CAAC;KAC9B,CAAC;IACF,UAAU,EAAE,0BAA0B,EAAE,CAAC;IACzC,OAAO,EAAE;QACP,kBAAkB,EAAE,MAAM,CAAC;QAC3B,kBAAkB,EAAE,MAAM,CAAC;QAC3B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,cAAc,EAAE,gBAAgB,GAAG,6BAA6B,GAAG,SAAS,CAAC;IAC7E,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAgEF,eAAO,MAAM,uBAAuB,QAAO,kBAIzC,CAAC;AAEH,eAAO,MAAM,sBAAsB,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,kBAAkB,CAY1F,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,iIAS5C;IACD,cAAc,EAAE,WAAW,EAAE,CAAC;IAC9B,aAAa,EAAE,kBAAkB,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB,KAAG,OAAO,CAAC;IAAE,KAAK,EAAE,sBAAsB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAwF9D,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,sCAG3C;IACD,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,kBAAkB,CAAC;CACnC,KAAG,OAAO,CAAC,kBAAkB,CAgE7B,CAAC"}