cc-recommender 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.
Files changed (184) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE +21 -0
  3. package/README.ja.md +201 -0
  4. package/README.md +201 -0
  5. package/data/mcp-servers.json +34777 -0
  6. package/data/plugins.json +1571 -0
  7. package/data/skills.json +3233 -0
  8. package/dist/config/constants.d.ts +18 -0
  9. package/dist/config/constants.d.ts.map +1 -0
  10. package/dist/config/constants.js +34 -0
  11. package/dist/config/constants.js.map +1 -0
  12. package/dist/config/file-mappings.d.ts +13 -0
  13. package/dist/config/file-mappings.d.ts.map +1 -0
  14. package/dist/config/file-mappings.js +70 -0
  15. package/dist/config/file-mappings.js.map +1 -0
  16. package/dist/config/index.d.ts +9 -0
  17. package/dist/config/index.d.ts.map +1 -0
  18. package/dist/config/index.js +9 -0
  19. package/dist/config/index.js.map +1 -0
  20. package/dist/config/scoring-config.d.ts +27 -0
  21. package/dist/config/scoring-config.d.ts.map +1 -0
  22. package/dist/config/scoring-config.js +27 -0
  23. package/dist/config/scoring-config.js.map +1 -0
  24. package/dist/index.d.ts +9 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +25 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/repositories/index.d.ts +7 -0
  29. package/dist/repositories/index.d.ts.map +1 -0
  30. package/dist/repositories/index.js +7 -0
  31. package/dist/repositories/index.js.map +1 -0
  32. package/dist/repositories/recommendation.repository.d.ts +56 -0
  33. package/dist/repositories/recommendation.repository.d.ts.map +1 -0
  34. package/dist/repositories/recommendation.repository.js +142 -0
  35. package/dist/repositories/recommendation.repository.js.map +1 -0
  36. package/dist/repositories/remote-data.repository.d.ts +20 -0
  37. package/dist/repositories/remote-data.repository.d.ts.map +1 -0
  38. package/dist/repositories/remote-data.repository.js +307 -0
  39. package/dist/repositories/remote-data.repository.js.map +1 -0
  40. package/dist/schemas/index.d.ts +7 -0
  41. package/dist/schemas/index.d.ts.map +1 -0
  42. package/dist/schemas/index.js +7 -0
  43. package/dist/schemas/index.js.map +1 -0
  44. package/dist/schemas/tool-schemas.d.ts +55 -0
  45. package/dist/schemas/tool-schemas.d.ts.map +1 -0
  46. package/dist/schemas/tool-schemas.js +36 -0
  47. package/dist/schemas/tool-schemas.js.map +1 -0
  48. package/dist/server/index.d.ts +8 -0
  49. package/dist/server/index.d.ts.map +1 -0
  50. package/dist/server/index.js +8 -0
  51. package/dist/server/index.js.map +1 -0
  52. package/dist/server/mcp-server.d.ts +11 -0
  53. package/dist/server/mcp-server.d.ts.map +1 -0
  54. package/dist/server/mcp-server.js +27 -0
  55. package/dist/server/mcp-server.js.map +1 -0
  56. package/dist/server/tool-registry.d.ts +12 -0
  57. package/dist/server/tool-registry.d.ts.map +1 -0
  58. package/dist/server/tool-registry.js +114 -0
  59. package/dist/server/tool-registry.js.map +1 -0
  60. package/dist/services/analyzer/index.d.ts +7 -0
  61. package/dist/services/analyzer/index.d.ts.map +1 -0
  62. package/dist/services/analyzer/index.js +7 -0
  63. package/dist/services/analyzer/index.js.map +1 -0
  64. package/dist/services/analyzer/parsers/go-mod.parser.d.ts +11 -0
  65. package/dist/services/analyzer/parsers/go-mod.parser.d.ts.map +1 -0
  66. package/dist/services/analyzer/parsers/go-mod.parser.js +34 -0
  67. package/dist/services/analyzer/parsers/go-mod.parser.js.map +1 -0
  68. package/dist/services/analyzer/parsers/index.d.ts +9 -0
  69. package/dist/services/analyzer/parsers/index.d.ts.map +1 -0
  70. package/dist/services/analyzer/parsers/index.js +9 -0
  71. package/dist/services/analyzer/parsers/index.js.map +1 -0
  72. package/dist/services/analyzer/parsers/package-json.parser.d.ts +11 -0
  73. package/dist/services/analyzer/parsers/package-json.parser.d.ts.map +1 -0
  74. package/dist/services/analyzer/parsers/package-json.parser.js +61 -0
  75. package/dist/services/analyzer/parsers/package-json.parser.js.map +1 -0
  76. package/dist/services/analyzer/parsers/requirements-txt.parser.d.ts +11 -0
  77. package/dist/services/analyzer/parsers/requirements-txt.parser.d.ts.map +1 -0
  78. package/dist/services/analyzer/parsers/requirements-txt.parser.js +49 -0
  79. package/dist/services/analyzer/parsers/requirements-txt.parser.js.map +1 -0
  80. package/dist/services/analyzer/project-analyzer.service.d.ts +11 -0
  81. package/dist/services/analyzer/project-analyzer.service.d.ts.map +1 -0
  82. package/dist/services/analyzer/project-analyzer.service.js +101 -0
  83. package/dist/services/analyzer/project-analyzer.service.js.map +1 -0
  84. package/dist/services/analyzer.d.ts +8 -0
  85. package/dist/services/analyzer.d.ts.map +1 -0
  86. package/dist/services/analyzer.js +8 -0
  87. package/dist/services/analyzer.js.map +1 -0
  88. package/dist/services/mcp-fetcher.d.ts +12 -0
  89. package/dist/services/mcp-fetcher.d.ts.map +1 -0
  90. package/dist/services/mcp-fetcher.js +262 -0
  91. package/dist/services/mcp-fetcher.js.map +1 -0
  92. package/dist/services/plugin-fetcher.d.ts +12 -0
  93. package/dist/services/plugin-fetcher.d.ts.map +1 -0
  94. package/dist/services/plugin-fetcher.js +149 -0
  95. package/dist/services/plugin-fetcher.js.map +1 -0
  96. package/dist/services/recommender/formatters.d.ts +22 -0
  97. package/dist/services/recommender/formatters.d.ts.map +1 -0
  98. package/dist/services/recommender/formatters.js +90 -0
  99. package/dist/services/recommender/formatters.js.map +1 -0
  100. package/dist/services/recommender/index.d.ts +10 -0
  101. package/dist/services/recommender/index.d.ts.map +1 -0
  102. package/dist/services/recommender/index.js +10 -0
  103. package/dist/services/recommender/index.js.map +1 -0
  104. package/dist/services/recommender/recommendation.service.d.ts +27 -0
  105. package/dist/services/recommender/recommendation.service.d.ts.map +1 -0
  106. package/dist/services/recommender/recommendation.service.js +34 -0
  107. package/dist/services/recommender/recommendation.service.js.map +1 -0
  108. package/dist/services/recommender/scoring/index.d.ts +7 -0
  109. package/dist/services/recommender/scoring/index.d.ts.map +1 -0
  110. package/dist/services/recommender/scoring/index.js +7 -0
  111. package/dist/services/recommender/scoring/index.js.map +1 -0
  112. package/dist/services/recommender/scoring/scorer.d.ts +27 -0
  113. package/dist/services/recommender/scoring/scorer.d.ts.map +1 -0
  114. package/dist/services/recommender/scoring/scorer.js +100 -0
  115. package/dist/services/recommender/scoring/scorer.js.map +1 -0
  116. package/dist/services/recommender/search.service.d.ts +24 -0
  117. package/dist/services/recommender/search.service.d.ts.map +1 -0
  118. package/dist/services/recommender/search.service.js +57 -0
  119. package/dist/services/recommender/search.service.js.map +1 -0
  120. package/dist/services/recommender.d.ts +11 -0
  121. package/dist/services/recommender.d.ts.map +1 -0
  122. package/dist/services/recommender.js +11 -0
  123. package/dist/services/recommender.js.map +1 -0
  124. package/dist/services/security-scanner.service.d.ts +48 -0
  125. package/dist/services/security-scanner.service.d.ts.map +1 -0
  126. package/dist/services/security-scanner.service.js +98 -0
  127. package/dist/services/security-scanner.service.js.map +1 -0
  128. package/dist/services/skill-fetcher.d.ts +12 -0
  129. package/dist/services/skill-fetcher.d.ts.map +1 -0
  130. package/dist/services/skill-fetcher.js +307 -0
  131. package/dist/services/skill-fetcher.js.map +1 -0
  132. package/dist/tools/handlers/get-skill-details.tool.d.ts +25 -0
  133. package/dist/tools/handlers/get-skill-details.tool.d.ts.map +1 -0
  134. package/dist/tools/handlers/get-skill-details.tool.js +29 -0
  135. package/dist/tools/handlers/get-skill-details.tool.js.map +1 -0
  136. package/dist/tools/handlers/get-stats.tool.d.ts +19 -0
  137. package/dist/tools/handlers/get-stats.tool.d.ts.map +1 -0
  138. package/dist/tools/handlers/get-stats.tool.js +32 -0
  139. package/dist/tools/handlers/get-stats.tool.js.map +1 -0
  140. package/dist/tools/handlers/index.d.ts +11 -0
  141. package/dist/tools/handlers/index.d.ts.map +1 -0
  142. package/dist/tools/handlers/index.js +11 -0
  143. package/dist/tools/handlers/index.js.map +1 -0
  144. package/dist/tools/handlers/list-categories.tool.d.ts +19 -0
  145. package/dist/tools/handlers/list-categories.tool.d.ts.map +1 -0
  146. package/dist/tools/handlers/list-categories.tool.js +33 -0
  147. package/dist/tools/handlers/list-categories.tool.js.map +1 -0
  148. package/dist/tools/handlers/recommend-skills.tool.d.ts +32 -0
  149. package/dist/tools/handlers/recommend-skills.tool.d.ts.map +1 -0
  150. package/dist/tools/handlers/recommend-skills.tool.js +43 -0
  151. package/dist/tools/handlers/recommend-skills.tool.js.map +1 -0
  152. package/dist/tools/handlers/search-skills.tool.d.ts +27 -0
  153. package/dist/tools/handlers/search-skills.tool.d.ts.map +1 -0
  154. package/dist/tools/handlers/search-skills.tool.js +31 -0
  155. package/dist/tools/handlers/search-skills.tool.js.map +1 -0
  156. package/dist/tools/index.d.ts +9 -0
  157. package/dist/tools/index.d.ts.map +1 -0
  158. package/dist/tools/index.js +11 -0
  159. package/dist/tools/index.js.map +1 -0
  160. package/dist/types/domain-types.d.ts +102 -0
  161. package/dist/types/domain-types.d.ts.map +1 -0
  162. package/dist/types/domain-types.js +7 -0
  163. package/dist/types/domain-types.js.map +1 -0
  164. package/dist/types/index.d.ts +9 -0
  165. package/dist/types/index.d.ts.map +1 -0
  166. package/dist/types/index.js +7 -0
  167. package/dist/types/index.js.map +1 -0
  168. package/dist/types/raw-types.d.ts +46 -0
  169. package/dist/types/raw-types.d.ts.map +1 -0
  170. package/dist/types/raw-types.js +7 -0
  171. package/dist/types/raw-types.js.map +1 -0
  172. package/dist/types/service-types.d.ts +28 -0
  173. package/dist/types/service-types.d.ts.map +1 -0
  174. package/dist/types/service-types.js +7 -0
  175. package/dist/types/service-types.js.map +1 -0
  176. package/dist/utils/glob-matcher.d.ts +24 -0
  177. package/dist/utils/glob-matcher.d.ts.map +1 -0
  178. package/dist/utils/glob-matcher.js +34 -0
  179. package/dist/utils/glob-matcher.js.map +1 -0
  180. package/dist/utils/index.d.ts +7 -0
  181. package/dist/utils/index.d.ts.map +1 -0
  182. package/dist/utils/index.js +7 -0
  183. package/dist/utils/index.js.map +1 -0
  184. package/package.json +82 -0
@@ -0,0 +1,307 @@
1
+ /**
2
+ * Skill Fetcher
3
+ *
4
+ * Fetches skills, workflows, hooks, commands from awesome-claude-code
5
+ * Source: https://github.com/hesreallyhim/awesome-claude-code
6
+ */
7
+ const CSV_URL = "https://raw.githubusercontent.com/hesreallyhim/awesome-claude-code/main/THE_RESOURCES_TABLE.csv";
8
+ /** Category to type mappings */
9
+ const CATEGORY_TO_TYPE = {
10
+ "agent skills": "skill",
11
+ skills: "skill",
12
+ workflows: "workflow",
13
+ "workflows & knowledge guides": "workflow",
14
+ hooks: "hook",
15
+ "slash-commands": "command",
16
+ "slash commands": "command",
17
+ commands: "command",
18
+ tooling: "plugin",
19
+ "ide integrations": "plugin",
20
+ "usage monitors": "plugin",
21
+ orchestrators: "plugin",
22
+ "status lines": "plugin",
23
+ "claude.md files": "skill",
24
+ claudemd: "skill",
25
+ "alternative clients": "plugin",
26
+ };
27
+ /**
28
+ * Fetch skills from awesome-claude-code CSV
29
+ */
30
+ export async function fetchSkills() {
31
+ console.log("🎯 Fetching skills from awesome-claude-code...");
32
+ try {
33
+ const response = await fetch(CSV_URL);
34
+ if (!response.ok) {
35
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
36
+ }
37
+ const csvText = await response.text();
38
+ const entries = parseCSV(csvText);
39
+ const recommendations = entries
40
+ .map(transformSkillEntry)
41
+ .filter((r) => r !== null);
42
+ console.log(` ✓ Fetched ${recommendations.length} skills/workflows`);
43
+ return recommendations;
44
+ }
45
+ catch (error) {
46
+ console.error(" ✗ Failed to fetch skills:", error);
47
+ return [];
48
+ }
49
+ }
50
+ /**
51
+ * Parse CSV to extract skill entries
52
+ */
53
+ function parseCSV(csvText) {
54
+ const lines = csvText.split("\n");
55
+ if (lines.length < 2)
56
+ return [];
57
+ // Parse header
58
+ const header = parseCSVLine(lines[0]);
59
+ const nameIdx = findColumnIndex(header, ["display name", "name", "resource", "title"]);
60
+ const urlIdx = findColumnIndex(header, ["primary link", "url", "link", "github"]);
61
+ const authorIdx = findColumnIndex(header, ["author name", "author", "creator", "by"]);
62
+ const authorUrlIdx = findColumnIndex(header, [
63
+ "author link",
64
+ "author_url",
65
+ "author url",
66
+ "authorurl",
67
+ ]);
68
+ const licenseIdx = findColumnIndex(header, ["license"]);
69
+ const descIdx = findColumnIndex(header, ["description", "desc", "summary"]);
70
+ const categoryIdx = findColumnIndex(header, ["category", "type", "section"]);
71
+ const entries = [];
72
+ for (let i = 1; i < lines.length; i++) {
73
+ const line = lines[i].trim();
74
+ if (!line)
75
+ continue;
76
+ const values = parseCSVLine(line);
77
+ if (values.length < 2)
78
+ continue;
79
+ const entry = {
80
+ name: nameIdx >= 0 ? values[nameIdx]?.trim() || "" : "",
81
+ url: urlIdx >= 0 ? values[urlIdx]?.trim() || "" : "",
82
+ author: authorIdx >= 0 ? values[authorIdx]?.trim() || "" : "Unknown",
83
+ authorUrl: authorUrlIdx >= 0 ? values[authorUrlIdx]?.trim() || "" : "",
84
+ license: licenseIdx >= 0 ? values[licenseIdx]?.trim() : undefined,
85
+ description: descIdx >= 0 ? values[descIdx]?.trim() || "" : "",
86
+ category: categoryIdx >= 0 ? values[categoryIdx]?.trim() || "General" : "General",
87
+ };
88
+ // Skip entries without name or URL
89
+ if (!entry.name || !entry.url)
90
+ continue;
91
+ entries.push(entry);
92
+ }
93
+ return entries;
94
+ }
95
+ /**
96
+ * Parse a single CSV line handling quoted values
97
+ */
98
+ function parseCSVLine(line) {
99
+ const result = [];
100
+ let current = "";
101
+ let inQuotes = false;
102
+ for (let i = 0; i < line.length; i++) {
103
+ const char = line[i];
104
+ if (char === '"') {
105
+ if (inQuotes && line[i + 1] === '"') {
106
+ current += '"';
107
+ i++;
108
+ }
109
+ else {
110
+ inQuotes = !inQuotes;
111
+ }
112
+ }
113
+ else if (char === "," && !inQuotes) {
114
+ result.push(current);
115
+ current = "";
116
+ }
117
+ else {
118
+ current += char;
119
+ }
120
+ }
121
+ result.push(current);
122
+ return result;
123
+ }
124
+ /**
125
+ * Find column index by possible names
126
+ */
127
+ function findColumnIndex(header, possibleNames) {
128
+ const normalized = header.map((h) => h.toLowerCase().trim());
129
+ for (const name of possibleNames) {
130
+ const idx = normalized.indexOf(name.toLowerCase());
131
+ if (idx >= 0)
132
+ return idx;
133
+ }
134
+ return -1;
135
+ }
136
+ /**
137
+ * Transform raw skill entry to unified Recommendation
138
+ */
139
+ function transformSkillEntry(raw) {
140
+ try {
141
+ // Determine type from category
142
+ const normalizedCategory = raw.category.toLowerCase();
143
+ let type = "skill";
144
+ for (const [cat, t] of Object.entries(CATEGORY_TO_TYPE)) {
145
+ if (normalizedCategory.includes(cat)) {
146
+ type = t;
147
+ break;
148
+ }
149
+ }
150
+ // Extract owner/repo from GitHub URL
151
+ const repoMatch = raw.url.match(/github\.com\/([^/]+)\/([^/\s#?]+)/);
152
+ const _owner = repoMatch ? repoMatch[1] : raw.author;
153
+ const _repo = repoMatch ? repoMatch[2].replace(/\.git$/, "") : raw.name;
154
+ // Build detection rules
155
+ const detection = buildDetectionRules(raw);
156
+ // Build tags
157
+ const tags = [raw.category.toLowerCase(), type];
158
+ if (raw.license) {
159
+ tags.push(raw.license.toLowerCase());
160
+ }
161
+ // Sanitize name for ID
162
+ const sanitizedName = raw.name
163
+ .toLowerCase()
164
+ .replace(/[^a-z0-9]+/g, "-")
165
+ .replace(/^-|-$/g, "");
166
+ return {
167
+ id: `skill-${sanitizedName}`,
168
+ name: raw.name,
169
+ type,
170
+ url: raw.url,
171
+ description: raw.description,
172
+ author: {
173
+ name: raw.author,
174
+ url: raw.authorUrl || undefined,
175
+ },
176
+ category: raw.category,
177
+ tags,
178
+ detection,
179
+ metrics: {
180
+ source: "awesome-list",
181
+ isOfficial: false,
182
+ },
183
+ install: {
184
+ method: "manual",
185
+ command: repoMatch ? `git clone ${raw.url}` : undefined,
186
+ },
187
+ };
188
+ }
189
+ catch {
190
+ console.warn(` ⚠ Failed to transform skill: ${raw.name}`);
191
+ return null;
192
+ }
193
+ }
194
+ /**
195
+ * Build detection rules from skill entry
196
+ */
197
+ function buildDetectionRules(raw) {
198
+ const rules = {
199
+ keywords: [],
200
+ };
201
+ // Extract keywords from name and description
202
+ const text = `${raw.name} ${raw.description}`.toLowerCase();
203
+ // Technology keywords
204
+ const techKeywords = [
205
+ "react",
206
+ "nextjs",
207
+ "next.js",
208
+ "vue",
209
+ "angular",
210
+ "svelte",
211
+ "typescript",
212
+ "javascript",
213
+ "python",
214
+ "rust",
215
+ "go",
216
+ "java",
217
+ "node",
218
+ "deno",
219
+ "bun",
220
+ "docker",
221
+ "kubernetes",
222
+ "k8s",
223
+ "aws",
224
+ "gcp",
225
+ "azure",
226
+ "postgres",
227
+ "mysql",
228
+ "mongodb",
229
+ "redis",
230
+ "git",
231
+ "github",
232
+ "gitlab",
233
+ "api",
234
+ "rest",
235
+ "graphql",
236
+ "test",
237
+ "testing",
238
+ "jest",
239
+ "vitest",
240
+ "ci",
241
+ "cd",
242
+ "devops",
243
+ "security",
244
+ "auth",
245
+ "ai",
246
+ "ml",
247
+ "llm",
248
+ ];
249
+ for (const keyword of techKeywords) {
250
+ if (text.includes(keyword)) {
251
+ rules.keywords?.push(keyword);
252
+ }
253
+ }
254
+ // Category-based rules
255
+ const categoryRules = getCategoryRules(raw.category);
256
+ if (categoryRules.keywords) {
257
+ rules.keywords = [...(rules.keywords ?? []), ...categoryRules.keywords];
258
+ }
259
+ if (categoryRules.dependencies) {
260
+ rules.dependencies = categoryRules.dependencies;
261
+ }
262
+ if (categoryRules.files) {
263
+ rules.files = categoryRules.files;
264
+ }
265
+ if (categoryRules.frameworks) {
266
+ rules.frameworks = categoryRules.frameworks;
267
+ }
268
+ // Deduplicate keywords
269
+ rules.keywords = [...new Set(rules.keywords)];
270
+ return rules;
271
+ }
272
+ /**
273
+ * Get detection rules based on category
274
+ */
275
+ function getCategoryRules(category) {
276
+ const normalized = category.toLowerCase();
277
+ const mappings = {
278
+ workflows: {
279
+ keywords: ["workflow", "automation", "pipeline"],
280
+ files: ["CLAUDE.md", ".claude/*"],
281
+ },
282
+ hooks: {
283
+ keywords: ["hook", "git", "pre-commit", "post-commit"],
284
+ files: [".claude/hooks/*", ".husky/*"],
285
+ },
286
+ "slash-commands": {
287
+ keywords: ["command", "slash", "cli"],
288
+ files: [".claude/commands/*"],
289
+ },
290
+ tooling: {
291
+ keywords: ["tool", "utility", "helper"],
292
+ },
293
+ ide: {
294
+ keywords: ["ide", "editor", "vscode", "vim", "emacs"],
295
+ },
296
+ orchestrators: {
297
+ keywords: ["orchestration", "multi-agent", "swarm"],
298
+ },
299
+ };
300
+ for (const [cat, rules] of Object.entries(mappings)) {
301
+ if (normalized.includes(cat)) {
302
+ return rules;
303
+ }
304
+ }
305
+ return {};
306
+ }
307
+ //# sourceMappingURL=skill-fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-fetcher.js","sourceRoot":"","sources":["../../src/services/skill-fetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Get Skill Details Tool
3
+ *
4
+ * Gets detailed information about a specific skill/plugin/MCP
5
+ */
6
+ import type { GetSkillDetailsInput } from "../../schemas/tool-schemas.js";
7
+ import type { Recommendation, RecommendationDatabase } from "../../types/domain-types.js";
8
+ export type GetSkillDetailsResult = {
9
+ id: string;
10
+ name: string;
11
+ type: Recommendation["type"];
12
+ description: string;
13
+ url: string;
14
+ author: Recommendation["author"];
15
+ category: string;
16
+ tags: string[];
17
+ install: Recommendation["install"];
18
+ metrics: Recommendation["metrics"];
19
+ detection: Recommendation["detection"];
20
+ };
21
+ /**
22
+ * Get detailed information about a specific item
23
+ */
24
+ export declare function getSkillDetails(input: GetSkillDetailsInput, database: RecommendationDatabase): Promise<GetSkillDetailsResult | null>;
25
+ //# sourceMappingURL=get-skill-details.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-skill-details.tool.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/get-skill-details.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAE1F,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IACnC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IACnC,SAAS,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;CACxC,CAAC;AAEF;;GAEG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,EAAE,sBAAsB,GAC/B,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAwBvC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Get Skill Details Tool
3
+ *
4
+ * Gets detailed information about a specific skill/plugin/MCP
5
+ */
6
+ /**
7
+ * Get detailed information about a specific item
8
+ */
9
+ export async function getSkillDetails(input, database) {
10
+ const item = database.items.find((i) => i.name.toLowerCase() === input.name.toLowerCase() ||
11
+ i.id.toLowerCase() === input.name.toLowerCase());
12
+ if (!item) {
13
+ return null;
14
+ }
15
+ return {
16
+ id: item.id,
17
+ name: item.name,
18
+ type: item.type,
19
+ description: item.description,
20
+ url: item.url,
21
+ author: item.author,
22
+ category: item.category,
23
+ tags: item.tags,
24
+ install: item.install,
25
+ metrics: item.metrics,
26
+ detection: item.detection,
27
+ };
28
+ }
29
+ //# sourceMappingURL=get-skill-details.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-skill-details.tool.js","sourceRoot":"","sources":["../../../src/tools/handlers/get-skill-details.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmBH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAA2B,EAC3B,QAAgC;IAEhC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAC9B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE;QACjD,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAClD,CAAC;IAEF,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Get Stats Tool
3
+ *
4
+ * Gets database statistics
5
+ */
6
+ import type { RecommendationDatabase } from "../../types/domain-types.js";
7
+ export type GetStatsResult = {
8
+ version: string;
9
+ lastUpdated: string;
10
+ totalItems: number;
11
+ byType: Record<string, number>;
12
+ bySource: Record<string, number>;
13
+ officialCount: number;
14
+ };
15
+ /**
16
+ * Get database statistics
17
+ */
18
+ export declare function getStats(database: RecommendationDatabase): Promise<GetStatsResult>;
19
+ //# sourceMappingURL=get-stats.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-stats.tool.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/get-stats.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAE1E,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;GAEG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAAC,cAAc,CAAC,CA0BxF"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Get Stats Tool
3
+ *
4
+ * Gets database statistics
5
+ */
6
+ /**
7
+ * Get database statistics
8
+ */
9
+ export async function getStats(database) {
10
+ const typeCount = new Map();
11
+ const sourceCount = new Map();
12
+ let officialCount = 0;
13
+ for (const item of database.items) {
14
+ // Count by type
15
+ typeCount.set(item.type, (typeCount.get(item.type) || 0) + 1);
16
+ // Count by source
17
+ sourceCount.set(item.metrics.source, (sourceCount.get(item.metrics.source) || 0) + 1);
18
+ // Count official
19
+ if (item.metrics.isOfficial) {
20
+ officialCount++;
21
+ }
22
+ }
23
+ return {
24
+ version: database.version,
25
+ lastUpdated: database.lastUpdated,
26
+ totalItems: database.items.length,
27
+ byType: Object.fromEntries(typeCount),
28
+ bySource: Object.fromEntries(sourceCount),
29
+ officialCount,
30
+ };
31
+ }
32
+ //# sourceMappingURL=get-stats.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-stats.tool.js","sourceRoot":"","sources":["../../../src/tools/handlers/get-stats.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgC;IAC7D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,gBAAgB;QAChB,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE9D,kBAAkB;QAClB,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAEtF,iBAAiB;QACjB,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC5B,aAAa,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM;QACjC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC;QACrC,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC;QACzC,aAAa;KACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Tool Handlers (Public API)
3
+ *
4
+ * MCP ツールの公開 API
5
+ */
6
+ export { type GetSkillDetailsResult, getSkillDetails, } from "./get-skill-details.tool.js";
7
+ export { type GetStatsResult, getStats } from "./get-stats.tool.js";
8
+ export { type ListCategoriesResult, listCategories, } from "./list-categories.tool.js";
9
+ export { type RecommendSkillsResult, recommendSkills, } from "./recommend-skills.tool.js";
10
+ export { type SearchSkillsResult, searchSkills, } from "./search-skills.tool.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,KAAK,qBAAqB,EAC1B,eAAe,GAChB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,cAAc,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EACL,KAAK,oBAAoB,EACzB,cAAc,GACf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,KAAK,qBAAqB,EAC1B,eAAe,GAChB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,KAAK,kBAAkB,EACvB,YAAY,GACb,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Tool Handlers (Public API)
3
+ *
4
+ * MCP ツールの公開 API
5
+ */
6
+ export { getSkillDetails, } from "./get-skill-details.tool.js";
7
+ export { getStats } from "./get-stats.tool.js";
8
+ export { listCategories, } from "./list-categories.tool.js";
9
+ export { recommendSkills, } from "./recommend-skills.tool.js";
10
+ export { searchSkills, } from "./search-skills.tool.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/handlers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEL,eAAe,GAChB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAuB,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAEL,cAAc,GACf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAEL,eAAe,GAChB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAEL,YAAY,GACb,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * List Categories Tool
3
+ *
4
+ * Lists all available categories with counts
5
+ */
6
+ import type { RecommendationDatabase } from "../../types/domain-types.js";
7
+ export type ListCategoriesResult = {
8
+ categories: Array<{
9
+ name: string;
10
+ count: number;
11
+ types: string[];
12
+ }>;
13
+ totalItems: number;
14
+ };
15
+ /**
16
+ * List all categories
17
+ */
18
+ export declare function listCategories(database: RecommendationDatabase): Promise<ListCategoriesResult>;
19
+ //# sourceMappingURL=list-categories.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-categories.tool.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/list-categories.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAE1E,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE,KAAK,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC,CAAC;IACH,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,sBAAsB,GAC/B,OAAO,CAAC,oBAAoB,CAAC,CA0B/B"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * List Categories Tool
3
+ *
4
+ * Lists all available categories with counts
5
+ */
6
+ /**
7
+ * List all categories
8
+ */
9
+ export async function listCategories(database) {
10
+ const categoryMap = new Map();
11
+ for (const item of database.items) {
12
+ const cat = item.category;
13
+ let entry = categoryMap.get(cat);
14
+ if (entry === undefined) {
15
+ entry = { count: 0, types: new Set() };
16
+ categoryMap.set(cat, entry);
17
+ }
18
+ entry.count++;
19
+ entry.types.add(item.type);
20
+ }
21
+ const categories = Array.from(categoryMap.entries())
22
+ .map(([name, data]) => ({
23
+ name,
24
+ count: data.count,
25
+ types: Array.from(data.types),
26
+ }))
27
+ .sort((a, b) => b.count - a.count);
28
+ return {
29
+ categories,
30
+ totalItems: database.items.length,
31
+ };
32
+ }
33
+ //# sourceMappingURL=list-categories.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-categories.tool.js","sourceRoot":"","sources":["../../../src/tools/handlers/list-categories.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgC;IAEhC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAiD,CAAC;IAE7E,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC1B,IAAI,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,GAAG,EAAU,EAAE,CAAC;YAC/C,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;SACjD,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,IAAI;QACJ,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;KAC9B,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAErC,OAAO;QACL,UAAU;QACV,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM;KAClC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Recommend Skills Tool
3
+ *
4
+ * Analyzes a project and recommends suitable skills, plugins, and MCP servers
5
+ */
6
+ import type { RecommendSkillsInput } from "../../schemas/tool-schemas.js";
7
+ import type { Recommendation, RecommendationDatabase } from "../../types/domain-types.js";
8
+ export type RecommendSkillsResult = {
9
+ project: {
10
+ path: string;
11
+ languages: string[];
12
+ frameworks: string[];
13
+ dependencyCount: number;
14
+ };
15
+ recommendations: Array<{
16
+ name: string;
17
+ type: Recommendation["type"];
18
+ description: string;
19
+ score: number;
20
+ reasons: string[];
21
+ url: string;
22
+ install: Recommendation["install"];
23
+ isOfficial?: boolean;
24
+ }>;
25
+ formatted: string;
26
+ totalFound: number;
27
+ };
28
+ /**
29
+ * Recommend skills based on project analysis
30
+ */
31
+ export declare function recommendSkills(input: RecommendSkillsInput, database: RecommendationDatabase): Promise<RecommendSkillsResult>;
32
+ //# sourceMappingURL=recommend-skills.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommend-skills.tool.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/recommend-skills.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAI1E,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAE1F,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,eAAe,EAAE,KAAK,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;QAC7B,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;QACnC,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC,CAAC;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,EAAE,sBAAsB,GAC/B,OAAO,CAAC,qBAAqB,CAAC,CAiChC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Recommend Skills Tool
3
+ *
4
+ * Analyzes a project and recommends suitable skills, plugins, and MCP servers
5
+ */
6
+ import { analyzeProject } from "../../services/analyzer/project-analyzer.service.js";
7
+ import { formatRecommendations } from "../../services/recommender/formatters.js";
8
+ import { recommend } from "../../services/recommender/recommendation.service.js";
9
+ /**
10
+ * Recommend skills based on project analysis
11
+ */
12
+ export async function recommendSkills(input, database) {
13
+ // Analyze the project
14
+ const projectInfo = await analyzeProject(input.project_path);
15
+ // Get recommendations
16
+ const recommendations = recommend(database, projectInfo, input.description, {
17
+ maxResults: input.max_results,
18
+ types: input.types,
19
+ });
20
+ // Format for display
21
+ const formatted = formatRecommendations(recommendations);
22
+ return {
23
+ project: {
24
+ path: projectInfo.path,
25
+ languages: projectInfo.languages,
26
+ frameworks: projectInfo.frameworks,
27
+ dependencyCount: projectInfo.dependencies.length,
28
+ },
29
+ recommendations: recommendations.map((r) => ({
30
+ name: r.item.name,
31
+ type: r.item.type,
32
+ description: r.item.description,
33
+ score: r.score,
34
+ reasons: r.reasons,
35
+ url: r.item.url,
36
+ install: r.item.install,
37
+ isOfficial: r.item.metrics.isOfficial,
38
+ })),
39
+ formatted,
40
+ totalFound: recommendations.length,
41
+ };
42
+ }
43
+ //# sourceMappingURL=recommend-skills.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommend-skills.tool.js","sourceRoot":"","sources":["../../../src/tools/handlers/recommend-skills.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,qDAAqD,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,sDAAsD,CAAC;AAwBjF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAA2B,EAC3B,QAAgC;IAEhC,sBAAsB;IACtB,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAE7D,sBAAsB;IACtB,MAAM,eAAe,GAAG,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE;QAC1E,UAAU,EAAE,KAAK,CAAC,WAAW;QAC7B,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAC,CAAC;IAEH,qBAAqB;IACrB,MAAM,SAAS,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;IAEzD,OAAO;QACL,OAAO,EAAE;YACP,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,SAAS,EAAE,WAAW,CAAC,SAAS;YAChC,UAAU,EAAE,WAAW,CAAC,UAAU;YAClC,eAAe,EAAE,WAAW,CAAC,YAAY,CAAC,MAAM;SACjD;QACD,eAAe,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;YACjB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;YACjB,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW;YAC/B,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG;YACf,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO;YACvB,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU;SACtC,CAAC,CAAC;QACH,SAAS;QACT,UAAU,EAAE,eAAe,CAAC,MAAM;KACnC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Search Skills Tool
3
+ *
4
+ * Searches for skills, plugins, and MCP servers by keyword
5
+ */
6
+ import type { SearchSkillsInput } from "../../schemas/tool-schemas.js";
7
+ import type { Recommendation, RecommendationDatabase } from "../../types/domain-types.js";
8
+ export type SearchSkillsResult = {
9
+ query: string;
10
+ results: Array<{
11
+ name: string;
12
+ type: Recommendation["type"];
13
+ description: string;
14
+ score: number;
15
+ reasons: string[];
16
+ url: string;
17
+ install: Recommendation["install"];
18
+ isOfficial?: boolean;
19
+ category: string;
20
+ }>;
21
+ totalFound: number;
22
+ };
23
+ /**
24
+ * Search for skills by keyword
25
+ */
26
+ export declare function searchSkills(input: SearchSkillsInput, database: RecommendationDatabase): Promise<SearchSkillsResult>;
27
+ //# sourceMappingURL=search-skills.tool.d.ts.map