pub-mcp 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 (63) hide show
  1. package/.dockerignore +13 -0
  2. package/.editorconfig +14 -0
  3. package/.env.example +15 -0
  4. package/.eslintrc.cjs +21 -0
  5. package/.github/workflows/ci.yml +63 -0
  6. package/.prettierrc +7 -0
  7. package/CHANGELOG.md +84 -0
  8. package/CODE_OF_CONDUCT.md +34 -0
  9. package/CONTRIBUTING.md +55 -0
  10. package/Dockerfile +13 -0
  11. package/LICENSE +21 -0
  12. package/README.md +287 -0
  13. package/dist/cache/cache.d.ts +27 -0
  14. package/dist/cache/cache.d.ts.map +1 -0
  15. package/dist/cache/cache.js +94 -0
  16. package/dist/cache/cache.js.map +1 -0
  17. package/dist/cli.d.ts +3 -0
  18. package/dist/cli.d.ts.map +1 -0
  19. package/dist/cli.js +286 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/clients/githubClient.d.ts +33 -0
  22. package/dist/clients/githubClient.d.ts.map +1 -0
  23. package/dist/clients/githubClient.js +126 -0
  24. package/dist/clients/githubClient.js.map +1 -0
  25. package/dist/clients/pubClient.d.ts +28 -0
  26. package/dist/clients/pubClient.d.ts.map +1 -0
  27. package/dist/clients/pubClient.js +223 -0
  28. package/dist/clients/pubClient.js.map +1 -0
  29. package/dist/server-http.d.ts +7 -0
  30. package/dist/server-http.d.ts.map +1 -0
  31. package/dist/server-http.js +139 -0
  32. package/dist/server-http.js.map +1 -0
  33. package/dist/server.d.ts +2 -0
  34. package/dist/server.d.ts.map +1 -0
  35. package/dist/server.js +69 -0
  36. package/dist/server.js.map +1 -0
  37. package/dist/toolRegistry.d.ts +74 -0
  38. package/dist/toolRegistry.d.ts.map +1 -0
  39. package/dist/toolRegistry.js +80 -0
  40. package/dist/toolRegistry.js.map +1 -0
  41. package/dist/tools/index.d.ts +142 -0
  42. package/dist/tools/index.d.ts.map +1 -0
  43. package/dist/tools/index.js +214 -0
  44. package/dist/tools/index.js.map +1 -0
  45. package/dist/types/index.d.ts +55 -0
  46. package/dist/types/index.d.ts.map +1 -0
  47. package/dist/types/index.js +2 -0
  48. package/dist/types/index.js.map +1 -0
  49. package/dist/utils/rateLimiter.d.ts +13 -0
  50. package/dist/utils/rateLimiter.d.ts.map +1 -0
  51. package/dist/utils/rateLimiter.js +42 -0
  52. package/dist/utils/rateLimiter.js.map +1 -0
  53. package/package.json +72 -0
  54. package/skills-lock.json +25 -0
  55. package/src/cache/cache.ts +124 -0
  56. package/src/cli.ts +350 -0
  57. package/src/clients/githubClient.ts +169 -0
  58. package/src/clients/pubClient.ts +312 -0
  59. package/src/tools/index.ts +266 -0
  60. package/src/types/index.ts +61 -0
  61. package/src/utils/rateLimiter.ts +56 -0
  62. package/tsconfig.json +24 -0
  63. package/vitest.config.ts +14 -0
@@ -0,0 +1,94 @@
1
+ export class LRUCache {
2
+ cache;
3
+ ttl;
4
+ maxItems;
5
+ constructor(options) {
6
+ this.cache = new Map();
7
+ this.ttl = options.ttl * 1000;
8
+ this.maxItems = options.maxItems;
9
+ }
10
+ get(key) {
11
+ const entry = this.cache.get(key);
12
+ if (!entry) {
13
+ return undefined;
14
+ }
15
+ if (Date.now() > entry.expiry) {
16
+ this.cache.delete(key);
17
+ return undefined;
18
+ }
19
+ this.cache.delete(key);
20
+ this.cache.set(key, entry);
21
+ return entry.value;
22
+ }
23
+ set(key, value, ttl) {
24
+ if (this.cache.size >= this.maxItems) {
25
+ const firstKey = this.cache.keys().next().value;
26
+ if (firstKey !== undefined) {
27
+ this.cache.delete(firstKey);
28
+ }
29
+ }
30
+ const expiryTime = ttl ? Date.now() + ttl * 1000 : Date.now() + this.ttl;
31
+ this.cache.set(key, { value, expiry: expiryTime });
32
+ }
33
+ has(key) {
34
+ const entry = this.cache.get(key);
35
+ if (!entry)
36
+ return false;
37
+ if (Date.now() > entry.expiry) {
38
+ this.cache.delete(key);
39
+ return false;
40
+ }
41
+ return true;
42
+ }
43
+ delete(key) {
44
+ this.cache.delete(key);
45
+ }
46
+ clear() {
47
+ this.cache.clear();
48
+ }
49
+ size() {
50
+ this.cleanup();
51
+ return this.cache.size;
52
+ }
53
+ cleanup() {
54
+ const now = Date.now();
55
+ for (const [key, entry] of this.cache.entries()) {
56
+ if (now > entry.expiry) {
57
+ this.cache.delete(key);
58
+ }
59
+ }
60
+ }
61
+ stats() {
62
+ return {
63
+ size: this.cache.size,
64
+ hits: 0,
65
+ misses: 0,
66
+ };
67
+ }
68
+ }
69
+ export function createCache(options) {
70
+ return new LRUCache(options);
71
+ }
72
+ const defaultCacheOptions = {
73
+ ttl: parseInt(process.env.CACHE_TTL || '3600', 10),
74
+ maxItems: parseInt(process.env.CACHE_MAX_ITEMS || '500', 10),
75
+ };
76
+ let packageCache = null;
77
+ let searchCache = null;
78
+ export function getPackageCache() {
79
+ if (!packageCache) {
80
+ packageCache = new LRUCache(defaultCacheOptions);
81
+ }
82
+ return packageCache;
83
+ }
84
+ export function getSearchCache() {
85
+ if (!searchCache) {
86
+ searchCache = new LRUCache({ ...defaultCacheOptions, ttl: 600 });
87
+ }
88
+ return searchCache;
89
+ }
90
+ export function clearAllCaches() {
91
+ packageCache?.clear();
92
+ searchCache?.clear();
93
+ }
94
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/cache/cache.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,286 @@
1
+ #!/usr/bin/env node
2
+ import { parseArgs } from 'util';
3
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
4
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
5
+ import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
6
+ import { PubClient } from './clients/pubClient.js';
7
+ import { GitHubClient } from './clients/githubClient.js';
8
+ import { tools, handleSearchPackages, handleGetPackageInfo, handleGetPackageVersions, handleGetReadme, handleGetDependencies, handleGetPackageScore, handleGetChangelog, handleGetPackageMetrics, } from './tools/index.js';
9
+ import pino from 'pino';
10
+ import express from 'express';
11
+ import cors from 'cors';
12
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
13
+ const logger = pino({ level: process.env.LOG_LEVEL || 'info' });
14
+ const VERSION = '0.1.0';
15
+ const client = new PubClient();
16
+ const githubClient = new GitHubClient();
17
+ function createServer() {
18
+ const server = new Server({
19
+ name: 'pub-mcp',
20
+ version: VERSION,
21
+ }, {
22
+ capabilities: {
23
+ tools: {},
24
+ resources: {},
25
+ },
26
+ });
27
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
28
+ return { tools };
29
+ });
30
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
31
+ return {
32
+ resources: [
33
+ {
34
+ uri: 'pub://popular-packages',
35
+ name: 'popular_packages',
36
+ description: 'List of popular Dart/Flutter packages from pub.dev',
37
+ mimeType: 'application/json',
38
+ },
39
+ {
40
+ uri: 'pub://package/{name}',
41
+ name: 'package_docs',
42
+ description: 'Get package documentation and metrics',
43
+ mimeType: 'application/json',
44
+ },
45
+ ],
46
+ };
47
+ });
48
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
49
+ const { uri } = request.params;
50
+ try {
51
+ if (uri === 'pub://popular-packages') {
52
+ const result = await client.searchPackages('', 20);
53
+ return {
54
+ contents: [
55
+ {
56
+ uri: 'pub://popular-packages',
57
+ mimeType: 'application/json',
58
+ text: JSON.stringify(result.packages),
59
+ },
60
+ ],
61
+ };
62
+ }
63
+ if (uri.startsWith('pub://package/')) {
64
+ const name = uri.replace('pub://package/', '');
65
+ const [info, score, versions] = await Promise.all([
66
+ client.getPackage(name),
67
+ client.getPackageScore(name),
68
+ client.getPackageVersions(name),
69
+ ]);
70
+ return {
71
+ contents: [
72
+ {
73
+ uri,
74
+ mimeType: 'application/json',
75
+ text: JSON.stringify({ info, score, versionCount: versions.length }),
76
+ },
77
+ ],
78
+ };
79
+ }
80
+ throw new Error(`Unknown resource: ${uri}`);
81
+ }
82
+ catch (error) {
83
+ const message = error instanceof Error ? error.message : String(error);
84
+ return {
85
+ contents: [
86
+ {
87
+ uri,
88
+ mimeType: 'text/plain',
89
+ text: JSON.stringify({ error: message }),
90
+ },
91
+ ],
92
+ isError: true,
93
+ };
94
+ }
95
+ });
96
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
97
+ const { name, arguments: args } = request.params;
98
+ logger.info({ tool: name, args }, 'Tool called');
99
+ try {
100
+ let result;
101
+ switch (name) {
102
+ case 'ping':
103
+ return {
104
+ content: [{ type: 'text', text: 'pong' }],
105
+ };
106
+ case 'health':
107
+ return {
108
+ content: [{ type: 'text', text: JSON.stringify({ status: 'ok', version: VERSION }) }],
109
+ };
110
+ case 'search_packages':
111
+ result = await handleSearchPackages(client, args);
112
+ break;
113
+ case 'get_package_info':
114
+ result = await handleGetPackageInfo(client, args);
115
+ break;
116
+ case 'get_package_versions':
117
+ result = await handleGetPackageVersions(client, args);
118
+ break;
119
+ case 'get_readme':
120
+ result = await handleGetReadme(client, githubClient, args);
121
+ break;
122
+ case 'get_dependencies':
123
+ result = await handleGetDependencies(client, args);
124
+ break;
125
+ case 'get_package_score':
126
+ result = await handleGetPackageScore(client, args);
127
+ break;
128
+ case 'get_changelog':
129
+ result = await handleGetChangelog(client, args);
130
+ break;
131
+ case 'get_package_metrics':
132
+ result = await handleGetPackageMetrics(client, args);
133
+ break;
134
+ default:
135
+ throw new Error(`Unknown tool: ${name}`);
136
+ }
137
+ return {
138
+ content: [{ type: 'text', text: JSON.stringify(result) }],
139
+ };
140
+ }
141
+ catch (error) {
142
+ const message = error instanceof Error ? error.message : String(error);
143
+ logger.error({ tool: name, error: message }, 'Tool error');
144
+ return {
145
+ content: [{ type: 'text', text: JSON.stringify({ error: message }) }],
146
+ isError: true,
147
+ };
148
+ }
149
+ });
150
+ return server;
151
+ }
152
+ async function startStdio() {
153
+ const server = createServer();
154
+ const transport = new StdioServerTransport();
155
+ await server.connect(transport);
156
+ logger.info('pub-mcp server running on stdio');
157
+ }
158
+ async function startHttp(port) {
159
+ const app = express();
160
+ app.use(express.json());
161
+ const transports = new Map();
162
+ app.use(cors({
163
+ exposedHeaders: ['WWW-Authenticate', 'Mcp-Session-Id', 'Mcp-Protocol-Version'],
164
+ origin: '*',
165
+ }));
166
+ app.post('/mcp', async (req, res) => {
167
+ const sessionId = req.headers['mcp-session-id'];
168
+ if (sessionId && transports.has(sessionId)) {
169
+ await transports.get(sessionId).handleRequest(req, res, req.body);
170
+ }
171
+ else {
172
+ const transport = new StreamableHTTPServerTransport({
173
+ sessionIdGenerator: () => crypto.randomUUID(),
174
+ onsessioninitialized: (sid) => {
175
+ transports.set(sid, transport);
176
+ },
177
+ });
178
+ transport.onclose = () => {
179
+ if (transport.sessionId) {
180
+ transports.delete(transport.sessionId);
181
+ }
182
+ };
183
+ const server = createServer();
184
+ await server.connect(transport);
185
+ await transport.handleRequest(req, res, req.body);
186
+ }
187
+ });
188
+ app.get('/health', (_req, res) => {
189
+ res.json({ status: 'ok', version: VERSION });
190
+ });
191
+ app.get('/', (_req, res) => {
192
+ res.json({
193
+ name: 'pub-mcp',
194
+ version: VERSION,
195
+ description: 'MCP server for pub.dev',
196
+ endpoints: {
197
+ mcp: 'POST /mcp',
198
+ health: 'GET /health',
199
+ },
200
+ });
201
+ });
202
+ return new Promise((resolve) => {
203
+ app.listen(port, () => {
204
+ logger.info(`pub-mcp HTTP server listening on port ${port}`);
205
+ resolve();
206
+ });
207
+ });
208
+ }
209
+ async function runHealthCheck() {
210
+ console.log('Checking pub.dev API...');
211
+ try {
212
+ await client.getPackage('http');
213
+ console.log('✓ pub.dev API is reachable');
214
+ console.log(JSON.stringify({ status: 'ok', version: VERSION }));
215
+ }
216
+ catch (error) {
217
+ console.error('✗ pub.dev API is not reachable');
218
+ console.error(error);
219
+ process.exit(1);
220
+ }
221
+ }
222
+ function showVersion() {
223
+ console.log(`pub-mcp version ${VERSION}`);
224
+ }
225
+ async function main() {
226
+ const { values, positionals } = parseArgs({
227
+ options: {
228
+ help: { type: 'boolean', short: 'h' },
229
+ version: { type: 'boolean', short: 'v' },
230
+ health: { type: 'boolean' },
231
+ http: { type: 'boolean', default: false },
232
+ stdio: { type: 'boolean', default: false },
233
+ port: { type: 'string', default: '3000' },
234
+ },
235
+ allowPositionals: true,
236
+ });
237
+ const subcommand = positionals[0]?.toLowerCase();
238
+ const isMcpCommand = subcommand === 'mcp' || subcommand === 'server';
239
+ if (values.help || (!isMcpCommand && positionals.length > 0)) {
240
+ showHelp();
241
+ return;
242
+ }
243
+ if (values.version) {
244
+ showVersion();
245
+ return;
246
+ }
247
+ if (values.health) {
248
+ await runHealthCheck();
249
+ return;
250
+ }
251
+ const useHttp = values.http || (!values.stdio && positionals.length === 0);
252
+ const useStdio = values.stdio || (!values.http && positionals.length === 0);
253
+ const port = parseInt(values.port, 10);
254
+ if (useHttp && useStdio) {
255
+ logger.info('Starting both stdio and HTTP servers');
256
+ await Promise.all([startStdio(), startHttp(port)]);
257
+ }
258
+ else if (useHttp) {
259
+ await startHttp(port);
260
+ }
261
+ else if (useStdio) {
262
+ await startStdio();
263
+ }
264
+ }
265
+ function showHelp() {
266
+ console.log(`pub-mcp - MCP server for pub.dev
267
+
268
+ Usage:
269
+ pub-mcp Start MCP server with both transports
270
+ pub-mcp --stdio Start MCP server (stdio only)
271
+ pub-mcp --http Start MCP server (HTTP only)
272
+ pub-mcp --http --port 8080 Start HTTP on port 8080
273
+ pub-mcp --version Show version
274
+ pub-mcp --health Check pub.dev API connectivity
275
+ pub-mcp --help Show this help
276
+
277
+ HTTP Endpoints:
278
+ POST /mcp MCP protocol endpoint
279
+ GET /health Health check
280
+ GET / Server info`);
281
+ }
282
+ main().catch((error) => {
283
+ console.error('Fatal error:', error);
284
+ process.exit(1);
285
+ });
286
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export interface GitHubClientOptions {
2
+ baseUrl?: string;
3
+ token?: string;
4
+ timeout?: number;
5
+ }
6
+ export declare class GitHubClientError extends Error {
7
+ statusCode?: number | undefined;
8
+ constructor(message: string, statusCode?: number | undefined);
9
+ }
10
+ export declare class GitHubClient {
11
+ private baseUrl;
12
+ private token?;
13
+ private timeout;
14
+ constructor(options?: GitHubClientOptions);
15
+ private fetchWithTimeout;
16
+ getRepositoryReadme(owner: string, repo: string): Promise<string>;
17
+ getChangelog(owner: string, repo: string): Promise<string>;
18
+ getLatestRelease(owner: string, repo: string): Promise<{
19
+ tag: string;
20
+ body: string;
21
+ } | null>;
22
+ getRepositoryInfo(owner: string, repo: string): Promise<{
23
+ description: string;
24
+ stars: number;
25
+ forks: number;
26
+ url: string;
27
+ } | null>;
28
+ }
29
+ export declare function parseGitHubUrl(url: string): {
30
+ owner: string;
31
+ repo: string;
32
+ } | null;
33
+ //# sourceMappingURL=githubClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubClient.d.ts","sourceRoot":"","sources":["../../src/clients/githubClient.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IACN,UAAU,CAAC,EAAE,MAAM;gBAA3C,OAAO,EAAE,MAAM,EAAS,UAAU,CAAC,EAAE,MAAM,YAAA;CAIxD;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,mBAAwB;YAM/B,gBAAgB;IAyBxB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBjE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgC1D,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAmB5F,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAC5D,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;KACb,GAAG,IAAI,CAAC;CA0BV;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAclF"}
@@ -0,0 +1,126 @@
1
+ export class GitHubClientError extends Error {
2
+ statusCode;
3
+ constructor(message, statusCode) {
4
+ super(message);
5
+ this.statusCode = statusCode;
6
+ this.name = 'GitHubClientError';
7
+ }
8
+ }
9
+ export class GitHubClient {
10
+ baseUrl;
11
+ token;
12
+ timeout;
13
+ constructor(options = {}) {
14
+ this.baseUrl = options.baseUrl || process.env.GITHUB_API_URL || 'https://api.github.com';
15
+ this.token = options.token || process.env.GITHUB_TOKEN;
16
+ this.timeout = options.timeout || 10000;
17
+ }
18
+ async fetchWithTimeout(url, options = {}) {
19
+ const controller = new AbortController();
20
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
21
+ const headers = {
22
+ Accept: 'application/vnd.github.v3+json',
23
+ ...(options.headers || {}),
24
+ };
25
+ if (this.token) {
26
+ headers.Authorization = `Bearer ${this.token}`;
27
+ }
28
+ try {
29
+ const response = await fetch(url, {
30
+ ...options,
31
+ headers,
32
+ signal: controller.signal,
33
+ });
34
+ return response;
35
+ }
36
+ finally {
37
+ clearTimeout(timeoutId);
38
+ }
39
+ }
40
+ async getRepositoryReadme(owner, repo) {
41
+ const url = `${this.baseUrl}/repos/${owner}/${repo}/readme`;
42
+ const response = await this.fetchWithTimeout(url);
43
+ if (response.status === 404) {
44
+ return '';
45
+ }
46
+ if (!response.ok) {
47
+ throw new GitHubClientError(`Failed to fetch README: ${response.statusText}`, response.status);
48
+ }
49
+ const data = await response.json();
50
+ if (data.content) {
51
+ return Buffer.from(data.content, 'base64').toString('utf-8');
52
+ }
53
+ return '';
54
+ }
55
+ async getChangelog(owner, repo) {
56
+ const url = `${this.baseUrl}/repos/${owner}/${repo}/contents/CHANGELOG.md`;
57
+ const response = await this.fetchWithTimeout(url);
58
+ if (response.status === 404) {
59
+ const altUrls = ['CHANGELOG.md', 'changelog.md', 'HISTORY.md', 'history.md'];
60
+ for (const altUrl of altUrls) {
61
+ const altResponse = await this.fetchWithTimeout(`${this.baseUrl}/repos/${owner}/${repo}/contents/${altUrl}`);
62
+ if (altResponse.ok) {
63
+ const data = await altResponse.json();
64
+ if (data.content) {
65
+ return Buffer.from(data.content, 'base64').toString('utf-8');
66
+ }
67
+ }
68
+ }
69
+ return '';
70
+ }
71
+ if (!response.ok) {
72
+ throw new GitHubClientError(`Failed to fetch changelog: ${response.statusText}`, response.status);
73
+ }
74
+ const data = await response.json();
75
+ if (data.content) {
76
+ return Buffer.from(data.content, 'base64').toString('utf-8');
77
+ }
78
+ return '';
79
+ }
80
+ async getLatestRelease(owner, repo) {
81
+ const url = `${this.baseUrl}/repos/${owner}/${repo}/releases/latest`;
82
+ const response = await this.fetchWithTimeout(url);
83
+ if (response.status === 404) {
84
+ return null;
85
+ }
86
+ if (!response.ok) {
87
+ throw new GitHubClientError(`Failed to fetch release: ${response.statusText}`, response.status);
88
+ }
89
+ const data = await response.json();
90
+ return {
91
+ tag: data.tag_name || '',
92
+ body: data.body || '',
93
+ };
94
+ }
95
+ async getRepositoryInfo(owner, repo) {
96
+ const url = `${this.baseUrl}/repos/${owner}/${repo}`;
97
+ const response = await this.fetchWithTimeout(url);
98
+ if (response.status === 404) {
99
+ return null;
100
+ }
101
+ if (!response.ok) {
102
+ throw new GitHubClientError(`Failed to fetch repo info: ${response.statusText}`, response.status);
103
+ }
104
+ const data = await response.json();
105
+ return {
106
+ description: data.description || '',
107
+ stars: data.stargazers_count || 0,
108
+ forks: data.forks_count || 0,
109
+ url: data.html_url || '',
110
+ };
111
+ }
112
+ }
113
+ export function parseGitHubUrl(url) {
114
+ const patterns = [
115
+ /github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/,
116
+ /github\.com\/([^/]+)\/([^/]+)/,
117
+ ];
118
+ for (const pattern of patterns) {
119
+ const match = url.match(pattern);
120
+ if (match) {
121
+ return { owner: match[1], repo: match[2] };
122
+ }
123
+ }
124
+ return null;
125
+ }
126
+ //# sourceMappingURL=githubClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubClient.js","sourceRoot":"","sources":["../../src/clients/githubClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { PackageInfo, PackageVersion, SearchResult, PackageScore, PackageChangelog } from '../types/index.js';
2
+ export interface PubClientOptions {
3
+ baseUrl?: string;
4
+ timeout?: number;
5
+ retries?: number;
6
+ }
7
+ export declare class PubClientError extends Error {
8
+ statusCode?: number | undefined;
9
+ isRetryable: boolean;
10
+ constructor(message: string, statusCode?: number | undefined, isRetryable?: boolean);
11
+ }
12
+ export declare class PubClient {
13
+ private baseUrl;
14
+ private timeout;
15
+ private retries;
16
+ constructor(options?: PubClientOptions);
17
+ private fetchWithTimeout;
18
+ private fetchWithRetry;
19
+ private delay;
20
+ searchPackages(query: string, limit?: number): Promise<SearchResult>;
21
+ getPackage(name: string): Promise<PackageInfo>;
22
+ getPackageVersions(name: string): Promise<PackageVersion[]>;
23
+ getReadme(name: string, version?: string): Promise<string>;
24
+ getDependencies(name: string, version?: string): Promise<Record<string, string>>;
25
+ getPackageScore(name: string): Promise<PackageScore>;
26
+ getChangelog(name: string, version?: string): Promise<PackageChangelog | null>;
27
+ }
28
+ //# sourceMappingURL=pubClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pubClient.d.ts","sourceRoot":"","sources":["../../src/clients/pubClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAM3B,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,KAAK;IAG9B,UAAU,CAAC,EAAE,MAAM;IACnB,WAAW,EAAE,OAAO;gBAF3B,OAAO,EAAE,MAAM,EACR,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,WAAW,GAAE,OAAe;CAKtC;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,gBAAqB;YAM5B,gBAAgB;YAehB,cAAc;IAkC5B,OAAO,CAAC,KAAK;IAIP,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA8BxE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAqC9C,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA2B3D,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4B1D,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAwBhF,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAkCpD,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;CAsCrF"}