@gulibs/safe-coder 0.0.4 → 0.0.6

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 (74) hide show
  1. package/README.md +112 -1
  2. package/dist/documentation/github-client.d.ts +3 -1
  3. package/dist/documentation/github-client.d.ts.map +1 -1
  4. package/dist/documentation/github-client.js +7 -5
  5. package/dist/documentation/github-client.js.map +1 -1
  6. package/dist/documentation/http-fetcher.d.ts +3 -0
  7. package/dist/documentation/http-fetcher.d.ts.map +1 -1
  8. package/dist/documentation/http-fetcher.js +6 -2
  9. package/dist/documentation/http-fetcher.js.map +1 -1
  10. package/dist/documentation/index.d.ts +5 -3
  11. package/dist/documentation/index.d.ts.map +1 -1
  12. package/dist/documentation/index.js +98 -14
  13. package/dist/documentation/index.js.map +1 -1
  14. package/dist/documentation/npm-client.d.ts +12 -0
  15. package/dist/documentation/npm-client.d.ts.map +1 -1
  16. package/dist/documentation/npm-client.js +150 -17
  17. package/dist/documentation/npm-client.js.map +1 -1
  18. package/dist/errors/api-validator.d.ts +9 -0
  19. package/dist/errors/api-validator.d.ts.map +1 -0
  20. package/dist/errors/api-validator.js +57 -0
  21. package/dist/errors/api-validator.js.map +1 -0
  22. package/dist/errors/contextual-analysis.d.ts +3 -0
  23. package/dist/errors/contextual-analysis.d.ts.map +1 -1
  24. package/dist/errors/contextual-analysis.js +102 -4
  25. package/dist/errors/contextual-analysis.js.map +1 -1
  26. package/dist/errors/cross-file-analyzer.d.ts +16 -0
  27. package/dist/errors/cross-file-analyzer.d.ts.map +1 -0
  28. package/dist/errors/cross-file-analyzer.js +172 -0
  29. package/dist/errors/cross-file-analyzer.js.map +1 -0
  30. package/dist/errors/eslint-integration.d.ts +1 -0
  31. package/dist/errors/eslint-integration.d.ts.map +1 -1
  32. package/dist/errors/eslint-integration.js +101 -22
  33. package/dist/errors/eslint-integration.js.map +1 -1
  34. package/dist/errors/framework-detector.d.ts +10 -0
  35. package/dist/errors/framework-detector.d.ts.map +1 -0
  36. package/dist/errors/framework-detector.js +126 -0
  37. package/dist/errors/framework-detector.js.map +1 -0
  38. package/dist/errors/index.d.ts +9 -2
  39. package/dist/errors/index.d.ts.map +1 -1
  40. package/dist/errors/index.js +78 -2
  41. package/dist/errors/index.js.map +1 -1
  42. package/dist/errors/patterns.d.ts.map +1 -1
  43. package/dist/errors/patterns.js +314 -0
  44. package/dist/errors/patterns.js.map +1 -1
  45. package/dist/errors/performance-detector.d.ts +11 -0
  46. package/dist/errors/performance-detector.d.ts.map +1 -0
  47. package/dist/errors/performance-detector.js +119 -0
  48. package/dist/errors/performance-detector.js.map +1 -0
  49. package/dist/errors/runtime-detector.d.ts +7 -0
  50. package/dist/errors/runtime-detector.d.ts.map +1 -0
  51. package/dist/errors/runtime-detector.js +86 -0
  52. package/dist/errors/runtime-detector.js.map +1 -0
  53. package/dist/errors/security-detector.d.ts +6 -0
  54. package/dist/errors/security-detector.d.ts.map +1 -0
  55. package/dist/errors/security-detector.js +75 -0
  56. package/dist/errors/security-detector.js.map +1 -0
  57. package/dist/index.js +10 -3
  58. package/dist/index.js.map +1 -1
  59. package/dist/server/mcp-server.d.ts.map +1 -1
  60. package/dist/server/mcp-server.js +155 -61
  61. package/dist/server/mcp-server.js.map +1 -1
  62. package/dist/utils/config.d.ts +12 -0
  63. package/dist/utils/config.d.ts.map +1 -1
  64. package/dist/utils/config.js +24 -0
  65. package/dist/utils/config.js.map +1 -1
  66. package/dist/utils/http-client.d.ts +17 -0
  67. package/dist/utils/http-client.d.ts.map +1 -0
  68. package/dist/utils/http-client.js +62 -0
  69. package/dist/utils/http-client.js.map +1 -0
  70. package/dist/utils/logger.d.ts +36 -0
  71. package/dist/utils/logger.d.ts.map +1 -0
  72. package/dist/utils/logger.js +128 -0
  73. package/dist/utils/logger.js.map +1 -0
  74. package/package.json +5 -4
package/README.md CHANGED
@@ -69,6 +69,49 @@ npm run build
69
69
  - `ENABLE_AUTO_FIX` - 启用自动修复,默认:true
70
70
  - `RATE_LIMIT_REQUESTS` - 每个窗口的最大请求数,默认:100
71
71
  - `RATE_LIMIT_WINDOW_MS` - 速率限制窗口(毫秒),默认:60000
72
+ - `LOG_LEVEL` - 日志级别:`DEBUG`、`INFO`、`WARN`、`ERROR`,默认:`INFO`
73
+ - `LOG_COLORS` - 启用彩色日志输出,默认:`true`(设置为 `false` 禁用)
74
+
75
+ ### 代理配置(适用于国内网络环境)
76
+
77
+ 如果无法直接访问 npm registry 或 GitHub API,可以配置代理:
78
+
79
+ - `HTTP_PROXY` 或 `http_proxy` - HTTP 代理地址,例如:`http://127.0.0.1:7890`
80
+ - `HTTPS_PROXY` 或 `https_proxy` - HTTPS 代理地址,例如:`http://127.0.0.1:7890`
81
+ - `NO_PROXY` 或 `no_proxy` - 不使用代理的地址列表(逗号分隔),例如:`localhost,127.0.0.1`
82
+
83
+ **示例配置:**
84
+
85
+ ```bash
86
+ # 使用 HTTP/HTTPS 代理
87
+ export HTTP_PROXY=http://127.0.0.1:7890
88
+ export HTTPS_PROXY=http://127.0.0.1:7890
89
+
90
+ # 或者使用 SOCKS5 代理(如果代理支持)
91
+ export HTTP_PROXY=socks5://127.0.0.1:1080
92
+ export HTTPS_PROXY=socks5://127.0.0.1:1080
93
+
94
+ # 排除本地地址
95
+ export NO_PROXY=localhost,127.0.0.1,*.local
96
+ ```
97
+
98
+ **在 Cursor 配置文件中设置:**
99
+
100
+ ```json
101
+ {
102
+ "mcpServers": {
103
+ "safe-coder": {
104
+ "command": "npx",
105
+ "args": ["-y", "@gulibs/safe-coder"],
106
+ "env": {
107
+ "HTTP_PROXY": "http://127.0.0.1:7890",
108
+ "HTTPS_PROXY": "http://127.0.0.1:7890",
109
+ "NO_PROXY": "localhost,127.0.0.1"
110
+ }
111
+ }
112
+ }
113
+ }
114
+ ```
72
115
 
73
116
  ## 使用方法
74
117
 
@@ -85,7 +128,75 @@ npm start
85
128
 
86
129
  服务器通过 stdio 运行,使用 MCP 协议进行通信。
87
130
 
88
- ### 2. 在 Cursor 中配置
131
+ ### 2. 监控服务状态
132
+
133
+ #### 查看日志
134
+
135
+ 所有日志输出到 `stderr`(标准错误输出),包括:
136
+ - 服务器启动信息
137
+ - 工具调用记录(请求 ID、参数、执行时间)
138
+ - 错误和警告信息
139
+
140
+ **日志格式示例:**
141
+
142
+ ```
143
+ [2024-01-01T12:00:00.000Z] [INFO] Safe Coder MCP server started {"version":"1.0.0","pid":12345}
144
+ [2024-01-01T12:00:00.100Z] [INFO] MCP server connected to transport
145
+ [2024-01-01T12:00:00.200Z] [INFO] Tool invoked: get_documentation {"requestId":"req-1234567890-1","tool":"get_documentation","params":{"packageName":"react"}}
146
+ [2024-01-01T12:00:00.500Z] [INFO] Tool completed: get_documentation {"requestId":"req-1234567890-1","tool":"get_documentation","duration":"500ms","success":true}
147
+ ```
148
+
149
+ **日志级别(通过 `LOG_LEVEL` 环境变量设置):**
150
+ - `DEBUG` - 详细调试信息
151
+ - `INFO` - 一般信息(工具调用、完成)默认
152
+ - `WARN` - 警告信息
153
+ - `ERROR` - 错误信息
154
+
155
+ #### 使用 get_status 工具
156
+
157
+ 在 Cursor 中,你可以调用 `get_status` 工具来查看服务器状态:
158
+
159
+ ```json
160
+ {
161
+ "status": "running",
162
+ "uptime": 3600,
163
+ "version": "1.0.0",
164
+ "tools": ["get_documentation", "detect_errors", "validate_code", "resolve_error", "get_status"],
165
+ "cacheSize": 10,
166
+ "pid": 12345
167
+ }
168
+ ```
169
+
170
+ #### 在 Cursor 中查看日志
171
+
172
+ 1. **打开 Cursor 的开发者工具**:
173
+ - macOS: `Cmd + Shift + P` → "Developer: Toggle Developer Tools"
174
+ - Windows/Linux: `Ctrl + Shift + P` → "Developer: Toggle Developer Tools"
175
+
176
+ 2. **查看控制台**:
177
+ - 在开发者工具中切换到 "Console" 标签
178
+ - MCP 服务器的日志会显示在这里
179
+
180
+ 3. **启用调试模式**:
181
+
182
+ 在 Cursor 配置中添加:
183
+
184
+ ```json
185
+ {
186
+ "mcpServers": {
187
+ "safe-coder": {
188
+ "command": "npx",
189
+ "args": ["-y", "@gulibs/safe-coder"],
190
+ "env": {
191
+ "LOG_LEVEL": "DEBUG",
192
+ "LOG_COLORS": "true"
193
+ }
194
+ }
195
+ }
196
+ }
197
+ ```
198
+
199
+ ### 3. 在 Cursor 中配置
89
200
 
90
201
  > **⚠️ 重要提示**:如果包还没有发布到 npm,请使用"本地开发配置"方式。
91
202
 
@@ -1,8 +1,10 @@
1
1
  import type { Documentation, DocumentationSource } from '../types/documentation.js';
2
+ import { HttpClient } from '../utils/http-client.js';
2
3
  export declare class GitHubClient implements DocumentationSource {
3
4
  private readonly apiUrl;
4
5
  private readonly token?;
5
- constructor(token?: string);
6
+ private httpClient;
7
+ constructor(token?: string, httpClient?: HttpClient);
6
8
  fetch(packageName: string, version?: string): Promise<Documentation>;
7
9
  private parseRepository;
8
10
  private fetchReadme;
@@ -1 +1 @@
1
- {"version":3,"file":"github-client.d.ts","sourceRoot":"","sources":["../../src/documentation/github-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEpF,qBAAa,YAAa,YAAW,mBAAmB;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAS;gBAEpB,KAAK,CAAC,EAAE,MAAM;IAIpB,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA8B1E,OAAO,CAAC,eAAe;YAST,WAAW;YAoBX,SAAS;CAqCxB"}
1
+ {"version":3,"file":"github-client.d.ts","sourceRoot":"","sources":["../../src/documentation/github-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,qBAAa,YAAa,YAAW,mBAAmB;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAS;IAChC,OAAO,CAAC,UAAU,CAAa;gBAEnB,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU;IAK7C,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA8B1E,OAAO,CAAC,eAAe;YAST,WAAW;YAoBX,SAAS;CAqCxB"}
@@ -1,9 +1,11 @@
1
- import axios from 'axios';
1
+ import { HttpClient } from '../utils/http-client.js';
2
2
  export class GitHubClient {
3
3
  apiUrl = 'https://api.github.com';
4
4
  token;
5
- constructor(token) {
5
+ httpClient;
6
+ constructor(token, httpClient) {
6
7
  this.token = token || process.env.GITHUB_TOKEN;
8
+ this.httpClient = httpClient || new HttpClient();
7
9
  }
8
10
  async fetch(packageName, version) {
9
11
  try {
@@ -48,7 +50,7 @@ export class GitHubClient {
48
50
  if (this.token) {
49
51
  headers['Authorization'] = `token ${this.token}`;
50
52
  }
51
- const response = await axios.get(url, { headers });
53
+ const response = await this.httpClient.get(url, { headers });
52
54
  return response.data;
53
55
  }
54
56
  catch (error) {
@@ -64,13 +66,13 @@ export class GitHubClient {
64
66
  if (this.token) {
65
67
  headers['Authorization'] = `token ${this.token}`;
66
68
  }
67
- const response = await axios.get(url, { headers });
69
+ const response = await this.httpClient.get(url, { headers });
68
70
  // If docs is a directory, fetch all markdown files
69
71
  if (Array.isArray(response.data)) {
70
72
  const markdownFiles = response.data.filter((file) => file.type === 'file' && file.name.endsWith('.md'));
71
73
  const contents = await Promise.all(markdownFiles.map(async (file) => {
72
74
  const fileUrl = `${this.apiUrl}/repos/${owner}/${repo}/contents/${file.path}${refParam}`;
73
- const fileResponse = await axios.get(fileUrl, {
75
+ const fileResponse = await this.httpClient.get(fileUrl, {
74
76
  headers: { ...headers, 'Accept': 'application/vnd.github.v3.raw' }
75
77
  });
76
78
  return `## ${file.name}\n\n${fileResponse.data}`;
@@ -1 +1 @@
1
- {"version":3,"file":"github-client.js","sourceRoot":"","sources":["../../src/documentation/github-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"github-client.js","sourceRoot":"","sources":["../../src/documentation/github-client.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,8 @@
1
1
  import type { Documentation, DocumentationSource } from '../types/documentation.js';
2
+ import { HttpClient } from '../utils/http-client.js';
2
3
  export declare class HttpFetcher implements DocumentationSource {
4
+ private httpClient;
5
+ constructor(httpClient?: HttpClient);
3
6
  fetch(packageName: string, version?: string): Promise<Documentation>;
4
7
  }
5
8
  //# sourceMappingURL=http-fetcher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http-fetcher.d.ts","sourceRoot":"","sources":["../../src/documentation/http-fetcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEpF,qBAAa,WAAY,YAAW,mBAAmB;IAC/C,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CAwB3E"}
1
+ {"version":3,"file":"http-fetcher.d.ts","sourceRoot":"","sources":["../../src/documentation/http-fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,qBAAa,WAAY,YAAW,mBAAmB;IACrD,OAAO,CAAC,UAAU,CAAa;gBAEnB,UAAU,CAAC,EAAE,UAAU;IAI7B,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CAwB3E"}
@@ -1,10 +1,14 @@
1
- import axios from 'axios';
1
+ import { HttpClient } from '../utils/http-client.js';
2
2
  export class HttpFetcher {
3
+ httpClient;
4
+ constructor(httpClient) {
5
+ this.httpClient = httpClient || new HttpClient();
6
+ }
3
7
  async fetch(packageName, version) {
4
8
  try {
5
9
  // packageName should be a URL for HTTP fetcher
6
10
  const url = packageName.startsWith('http') ? packageName : `https://${packageName}`;
7
- const response = await axios.get(url, {
11
+ const response = await this.httpClient.get(url, {
8
12
  timeout: 10000,
9
13
  headers: {
10
14
  'User-Agent': 'Safe-Coder-MCP/1.0.0',
@@ -1 +1 @@
1
- {"version":3,"file":"http-fetcher.js","sourceRoot":"","sources":["../../src/documentation/http-fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,OAAO,WAAW;IACtB,KAAK,CAAC,KAAK,CAAC,WAAmB,EAAE,OAAgB;QAC/C,IAAI,CAAC;YACH,+CAA+C;YAC/C,MAAM,GAAG,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,WAAW,EAAE,CAAC;YAEpF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;gBACpC,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE;oBACP,YAAY,EAAE,sBAAsB;iBACrC;aACF,CAAC,CAAC;YAEH,OAAO;gBACL,IAAI,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ;gBAC3B,OAAO;gBACP,OAAO,EAAE,QAAQ,CAAC,IAAI;gBACtB,MAAM,EAAE,MAAM;gBACd,GAAG;gBACH,WAAW,EAAE,IAAI,IAAI,EAAE;aACxB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACrH,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"http-fetcher.js","sourceRoot":"","sources":["../../src/documentation/http-fetcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,OAAO,WAAW;IACd,UAAU,CAAa;IAE/B,YAAY,UAAuB;QACjC,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,IAAI,UAAU,EAAE,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,WAAmB,EAAE,OAAgB;QAC/C,IAAI,CAAC;YACH,+CAA+C;YAC/C,MAAM,GAAG,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,WAAW,EAAE,CAAC;YAEpF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC9C,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE;oBACP,YAAY,EAAE,sBAAsB;iBACrC;aACF,CAAC,CAAC;YAEH,OAAO;gBACL,IAAI,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ;gBAC3B,OAAO;gBACP,OAAO,EAAE,QAAQ,CAAC,IAAI;gBACtB,MAAM,EAAE,MAAM;gBACd,GAAG;gBACH,WAAW,EAAE,IAAI,IAAI,EAAE;aACxB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACrH,CAAC;IACH,CAAC;CACF"}
@@ -1,14 +1,16 @@
1
1
  import { DocumentationCache } from './cache.js';
2
2
  import type { Documentation } from '../types/documentation.js';
3
+ import type { ProxyConfig } from '../utils/http-client.js';
3
4
  export declare class DocumentationService {
4
5
  private cache;
5
6
  private npmClient;
6
7
  private githubClient;
7
8
  private httpFetcher;
8
9
  private normalizer;
9
- constructor(cacheTTLMinutes?: number, githubToken?: string);
10
- getDocumentation(packageName: string, version?: string, source?: 'npm' | 'github' | 'http'): Promise<Documentation>;
11
- refreshDocumentation(packageName: string, version?: string): Promise<void>;
10
+ constructor(cacheTTLMinutes?: number, githubToken?: string, proxyConfig?: ProxyConfig);
11
+ getDocumentation(packageName: string, version?: string, source?: 'npm' | 'github' | 'http', forceRefresh?: boolean): Promise<Documentation>;
12
+ refreshDocumentation(packageName: string, version?: string): Promise<Documentation>;
13
+ checkForUpdates(packageName: string, version?: string): Promise<boolean>;
12
14
  getCache(): DocumentationCache;
13
15
  }
14
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/documentation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAKhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAA0B;gBAEhC,eAAe,GAAE,MAAW,EAAE,WAAW,CAAC,EAAE,MAAM;IAQxD,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GACjC,OAAO,CAAC,aAAa,CAAC;IAoDnB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhF,QAAQ,IAAI,kBAAkB;CAG/B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/documentation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAKhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAA0B;gBAEhC,eAAe,GAAE,MAAW,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW;IASnF,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,EAClC,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,aAAa,CAAC;IA+GnB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAKnF,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyB9E,QAAQ,IAAI,kBAAkB;CAG/B"}
@@ -3,25 +3,29 @@ import { NpmRegistryClient } from './npm-client.js';
3
3
  import { GitHubClient } from './github-client.js';
4
4
  import { HttpFetcher } from './http-fetcher.js';
5
5
  import { DocumentationNormalizer } from './normalizer.js';
6
+ import { HttpClient } from '../utils/http-client.js';
6
7
  export class DocumentationService {
7
8
  cache;
8
9
  npmClient;
9
10
  githubClient;
10
11
  httpFetcher;
11
12
  normalizer;
12
- constructor(cacheTTLMinutes = 60, githubToken) {
13
+ constructor(cacheTTLMinutes = 60, githubToken, proxyConfig) {
13
14
  this.cache = new DocumentationCache(cacheTTLMinutes);
14
- this.npmClient = new NpmRegistryClient();
15
- this.githubClient = new GitHubClient(githubToken);
16
- this.httpFetcher = new HttpFetcher();
15
+ const httpClient = proxyConfig ? new HttpClient(proxyConfig) : new HttpClient();
16
+ this.npmClient = new NpmRegistryClient(httpClient);
17
+ this.githubClient = new GitHubClient(githubToken, httpClient);
18
+ this.httpFetcher = new HttpFetcher(httpClient);
17
19
  this.normalizer = new DocumentationNormalizer();
18
20
  }
19
- async getDocumentation(packageName, version, source) {
21
+ async getDocumentation(packageName, version, source, forceRefresh = false) {
20
22
  const cacheKey = this.cache.generateKey(packageName, version);
21
- // Check cache first
22
- const cached = this.cache.get(cacheKey);
23
- if (cached) {
24
- return cached;
23
+ // Check cache first (unless force refresh)
24
+ if (!forceRefresh) {
25
+ const cached = this.cache.get(cacheKey);
26
+ if (cached) {
27
+ return cached;
28
+ }
25
29
  }
26
30
  // Determine source if not specified
27
31
  let actualSource = source;
@@ -36,12 +40,39 @@ export class DocumentationService {
36
40
  actualSource = 'npm';
37
41
  }
38
42
  }
39
- // Fetch documentation
43
+ // Fetch documentation with fallback strategy
40
44
  let documentation;
45
+ let lastError = null;
41
46
  try {
42
47
  switch (actualSource) {
43
48
  case 'npm':
44
49
  documentation = await this.npmClient.fetch(packageName, version);
50
+ // If npm returns minimal content (fallback message), try GitHub as backup
51
+ if (documentation.content.includes('⚠️ No documentation found') && !version) {
52
+ try {
53
+ // Try to extract GitHub repo from npm metadata
54
+ const npmData = await this.npmClient.getPackageMetadata(packageName);
55
+ if (npmData?.repository?.url) {
56
+ const githubMatch = npmData.repository.url.match(/github\.com[\/:]([^\/]+)\/([^\/]+?)(?:\.git)?$/);
57
+ if (githubMatch) {
58
+ const [, owner, repo] = githubMatch;
59
+ try {
60
+ const githubDoc = await this.githubClient.fetch(`${owner}/${repo}`, version);
61
+ if (githubDoc.content && !githubDoc.content.includes('No documentation found')) {
62
+ documentation = githubDoc;
63
+ documentation.name = packageName; // Keep original package name
64
+ }
65
+ }
66
+ catch (githubError) {
67
+ // GitHub also failed, keep npm result
68
+ }
69
+ }
70
+ }
71
+ }
72
+ catch (fallbackError) {
73
+ // Fallback failed, keep npm result
74
+ }
75
+ }
45
76
  break;
46
77
  case 'github':
47
78
  documentation = await this.githubClient.fetch(packageName, version);
@@ -55,18 +86,71 @@ export class DocumentationService {
55
86
  // Normalize documentation
56
87
  const normalized = this.normalizer.normalize(documentation.content, actualSource);
57
88
  documentation = { ...documentation, sections: normalized.sections };
58
- // Cache the result
89
+ // Cache the result (even if it's a fallback message)
59
90
  this.cache.set(cacheKey, documentation);
60
91
  return documentation;
61
92
  }
62
93
  catch (error) {
63
- throw new Error(`Failed to fetch documentation: ${error instanceof Error ? error.message : 'Unknown error'}`);
94
+ lastError = error instanceof Error ? error : new Error(String(error));
95
+ // If primary source failed and we haven't tried fallback, try fallback
96
+ if (actualSource === 'npm' && !version) {
97
+ try {
98
+ // Try GitHub as fallback
99
+ const npmData = await this.npmClient.getPackageMetadata(packageName);
100
+ if (npmData?.repository?.url) {
101
+ const githubMatch = npmData.repository.url.match(/github\.com[\/:]([^\/]+)\/([^\/]+?)(?:\.git)?$/);
102
+ if (githubMatch) {
103
+ const [, owner, repo] = githubMatch;
104
+ try {
105
+ const githubDoc = await this.githubClient.fetch(`${owner}/${repo}`, version);
106
+ if (githubDoc.content && !githubDoc.content.includes('No documentation found')) {
107
+ documentation = githubDoc;
108
+ documentation.name = packageName;
109
+ const normalized = this.normalizer.normalize(documentation.content, 'github');
110
+ documentation = { ...documentation, sections: normalized.sections };
111
+ this.cache.set(cacheKey, documentation);
112
+ return documentation;
113
+ }
114
+ }
115
+ catch (githubError) {
116
+ // GitHub also failed
117
+ }
118
+ }
119
+ }
120
+ }
121
+ catch (fallbackError) {
122
+ // Fallback failed
123
+ }
124
+ }
125
+ throw new Error(`Failed to fetch documentation: ${lastError.message}`);
64
126
  }
65
127
  }
66
- // Background refresh for popular packages
128
+ // Force refresh documentation (bypass cache)
67
129
  async refreshDocumentation(packageName, version) {
130
+ return this.getDocumentation(packageName, version, undefined, true);
131
+ }
132
+ // Check if cached documentation is still up-to-date
133
+ async checkForUpdates(packageName, version) {
68
134
  const cacheKey = this.cache.generateKey(packageName, version);
69
- this.cache.set(cacheKey, await this.getDocumentation(packageName, version), 0); // Force refresh
135
+ const cached = this.cache.get(cacheKey);
136
+ if (!cached) {
137
+ return true; // No cache, needs update
138
+ }
139
+ // For npm packages, check if newer version exists
140
+ if (cached.source === 'npm') {
141
+ try {
142
+ const fresh = await this.npmClient.fetch(packageName, version);
143
+ // Compare publish times
144
+ if (fresh.lastUpdated > cached.lastUpdated) {
145
+ return true; // Newer version available
146
+ }
147
+ }
148
+ catch (error) {
149
+ // If check fails, assume cached is still valid
150
+ return false;
151
+ }
152
+ }
153
+ return false; // Cached version is still latest
70
154
  }
71
155
  getCache() {
72
156
  return this.cache;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/documentation/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/documentation/index.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,19 @@
1
1
  import type { Documentation, DocumentationSource } from '../types/documentation.js';
2
+ import { HttpClient } from '../utils/http-client.js';
2
3
  export declare class NpmRegistryClient implements DocumentationSource {
3
4
  private readonly registryUrl;
5
+ private httpClient;
6
+ constructor(httpClient?: HttpClient);
7
+ getPackageMetadata(packageName: string): Promise<{
8
+ repository?: {
9
+ url?: string;
10
+ type?: string;
11
+ };
12
+ homepage?: string;
13
+ } | null>;
4
14
  fetch(packageName: string, version?: string): Promise<Documentation>;
5
15
  private fetchFromRepository;
16
+ private fetchFromHomepage;
17
+ private generateFallbackMessage;
6
18
  }
7
19
  //# sourceMappingURL=npm-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"npm-client.d.ts","sourceRoot":"","sources":["../../src/documentation/npm-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEpF,qBAAa,iBAAkB,YAAW,mBAAmB;IAC3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgC;IAEtD,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;YAoC5D,mBAAmB;CAelC"}
1
+ {"version":3,"file":"npm-client.d.ts","sourceRoot":"","sources":["../../src/documentation/npm-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,qBAAa,iBAAkB,YAAW,mBAAmB;IAC3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgC;IAC5D,OAAO,CAAC,UAAU,CAAa;gBAEnB,UAAU,CAAC,EAAE,UAAU;IAK7B,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QACrD,UAAU,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,CAAC;IAqBH,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;YAmE5D,mBAAmB;YAoCnB,iBAAiB;IAsC/B,OAAO,CAAC,uBAAuB;CAmChC"}