git-doc-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 (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +543 -0
  3. package/dist/audit/index.d.ts +2 -0
  4. package/dist/audit/index.d.ts.map +1 -0
  5. package/dist/audit/index.js +2 -0
  6. package/dist/audit/index.js.map +1 -0
  7. package/dist/audit/logger.d.ts +81 -0
  8. package/dist/audit/logger.d.ts.map +1 -0
  9. package/dist/audit/logger.js +179 -0
  10. package/dist/audit/logger.js.map +1 -0
  11. package/dist/cli/commands/serve.d.ts +44 -0
  12. package/dist/cli/commands/serve.d.ts.map +1 -0
  13. package/dist/cli/commands/serve.js +360 -0
  14. package/dist/cli/commands/serve.js.map +1 -0
  15. package/dist/cli/index.d.ts +21 -0
  16. package/dist/cli/index.d.ts.map +1 -0
  17. package/dist/cli/index.js +71 -0
  18. package/dist/cli/index.js.map +1 -0
  19. package/dist/http/client.d.ts +39 -0
  20. package/dist/http/client.d.ts.map +1 -0
  21. package/dist/http/client.js +114 -0
  22. package/dist/http/client.js.map +1 -0
  23. package/dist/http/index.d.ts +7 -0
  24. package/dist/http/index.d.ts.map +1 -0
  25. package/dist/http/index.js +7 -0
  26. package/dist/http/index.js.map +1 -0
  27. package/dist/http/redirect-utils.d.ts +27 -0
  28. package/dist/http/redirect-utils.d.ts.map +1 -0
  29. package/dist/http/redirect-utils.js +73 -0
  30. package/dist/http/redirect-utils.js.map +1 -0
  31. package/dist/index.d.ts +36 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +44 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/manifest/index.d.ts +7 -0
  36. package/dist/manifest/index.d.ts.map +1 -0
  37. package/dist/manifest/index.js +7 -0
  38. package/dist/manifest/index.js.map +1 -0
  39. package/dist/manifest/loader.d.ts +55 -0
  40. package/dist/manifest/loader.d.ts.map +1 -0
  41. package/dist/manifest/loader.js +222 -0
  42. package/dist/manifest/loader.js.map +1 -0
  43. package/dist/manifest/schema.d.ts +909 -0
  44. package/dist/manifest/schema.d.ts.map +1 -0
  45. package/dist/manifest/schema.js +148 -0
  46. package/dist/manifest/schema.js.map +1 -0
  47. package/dist/rate-limit/index.d.ts +6 -0
  48. package/dist/rate-limit/index.d.ts.map +1 -0
  49. package/dist/rate-limit/index.js +6 -0
  50. package/dist/rate-limit/index.js.map +1 -0
  51. package/dist/rate-limit/limiter.d.ts +38 -0
  52. package/dist/rate-limit/limiter.d.ts.map +1 -0
  53. package/dist/rate-limit/limiter.js +55 -0
  54. package/dist/rate-limit/limiter.js.map +1 -0
  55. package/dist/sandbox/context.d.ts +69 -0
  56. package/dist/sandbox/context.d.ts.map +1 -0
  57. package/dist/sandbox/context.js +134 -0
  58. package/dist/sandbox/context.js.map +1 -0
  59. package/dist/sandbox/executor.d.ts +50 -0
  60. package/dist/sandbox/executor.d.ts.map +1 -0
  61. package/dist/sandbox/executor.js +259 -0
  62. package/dist/sandbox/executor.js.map +1 -0
  63. package/dist/sandbox/index.d.ts +8 -0
  64. package/dist/sandbox/index.d.ts.map +1 -0
  65. package/dist/sandbox/index.js +8 -0
  66. package/dist/sandbox/index.js.map +1 -0
  67. package/dist/sandbox/url-validator.d.ts +40 -0
  68. package/dist/sandbox/url-validator.d.ts.map +1 -0
  69. package/dist/sandbox/url-validator.js +178 -0
  70. package/dist/sandbox/url-validator.js.map +1 -0
  71. package/dist/secrets/index.d.ts +7 -0
  72. package/dist/secrets/index.d.ts.map +1 -0
  73. package/dist/secrets/index.js +7 -0
  74. package/dist/secrets/index.js.map +1 -0
  75. package/dist/secrets/manager.d.ts +55 -0
  76. package/dist/secrets/manager.d.ts.map +1 -0
  77. package/dist/secrets/manager.js +94 -0
  78. package/dist/secrets/manager.js.map +1 -0
  79. package/dist/secrets/patterns.d.ts +33 -0
  80. package/dist/secrets/patterns.d.ts.map +1 -0
  81. package/dist/secrets/patterns.js +71 -0
  82. package/dist/secrets/patterns.js.map +1 -0
  83. package/dist/server/index.d.ts +6 -0
  84. package/dist/server/index.d.ts.map +1 -0
  85. package/dist/server/index.js +6 -0
  86. package/dist/server/index.js.map +1 -0
  87. package/dist/server/mcp.d.ts +60 -0
  88. package/dist/server/mcp.d.ts.map +1 -0
  89. package/dist/server/mcp.js +173 -0
  90. package/dist/server/mcp.js.map +1 -0
  91. package/dist/worker/index.d.ts +7 -0
  92. package/dist/worker/index.d.ts.map +1 -0
  93. package/dist/worker/index.js +7 -0
  94. package/dist/worker/index.js.map +1 -0
  95. package/dist/worker/process.d.ts +64 -0
  96. package/dist/worker/process.d.ts.map +1 -0
  97. package/dist/worker/process.js +222 -0
  98. package/dist/worker/process.js.map +1 -0
  99. package/dist/worker/protocol.d.ts +83 -0
  100. package/dist/worker/protocol.d.ts.map +1 -0
  101. package/dist/worker/protocol.js +55 -0
  102. package/dist/worker/protocol.js.map +1 -0
  103. package/dist/worker/worker-entry.d.ts +30 -0
  104. package/dist/worker/worker-entry.d.ts.map +1 -0
  105. package/dist/worker/worker-entry.js +136 -0
  106. package/dist/worker/worker-entry.js.map +1 -0
  107. package/package.json +55 -0
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Manifest loader - fetches manifest from URL or local file.
3
+ * @module manifest/loader
4
+ */
5
+ import * as fs from 'node:fs/promises';
6
+ import * as path from 'node:path';
7
+ import * as crypto from 'node:crypto';
8
+ import * as yaml from 'js-yaml';
9
+ import { parseManifest } from './schema.js';
10
+ import { validateUrl, validateRedirect } from '../sandbox/url-validator.js';
11
+ import { stripCrossOriginHeaders } from '../http/redirect-utils.js';
12
+ /**
13
+ * Check if path is a URL.
14
+ */
15
+ export function isUrl(path) {
16
+ return path.startsWith('http://') || path.startsWith('https://') || path.startsWith('file://');
17
+ }
18
+ /**
19
+ * Compute SHA-256 hash of content.
20
+ */
21
+ export function computeHash(content) {
22
+ return 'sha256:' + crypto.createHash('sha256').update(content).digest('hex');
23
+ }
24
+ /**
25
+ * Load manifest from URL or local file.
26
+ */
27
+ export async function loadManifest(options) {
28
+ const { manifestPath, headers = {}, timeout = 30000, auditLogger, allowHttp = false } = options;
29
+ if (manifestPath.startsWith('file://')) {
30
+ return loadFromFile(new URL(manifestPath).pathname, auditLogger);
31
+ }
32
+ if (manifestPath.startsWith('http://') || manifestPath.startsWith('https://')) {
33
+ return loadFromUrl(manifestPath, headers, timeout, auditLogger, allowHttp);
34
+ }
35
+ // Local file path
36
+ return loadFromFile(manifestPath, auditLogger);
37
+ }
38
+ /**
39
+ * Load manifest from local file.
40
+ */
41
+ async function loadFromFile(filePath, auditLogger) {
42
+ const absolutePath = path.isAbsolute(filePath)
43
+ ? filePath
44
+ : path.resolve(process.cwd(), filePath);
45
+ let content;
46
+ try {
47
+ content = await fs.readFile(absolutePath, 'utf-8');
48
+ }
49
+ catch (err) {
50
+ auditLogger?.logError('Manifest file read failed', {
51
+ path: absolutePath,
52
+ error: err instanceof Error ? err.message : String(err),
53
+ });
54
+ throw err;
55
+ }
56
+ const hash = computeHash(content);
57
+ const manifest = parseManifest(content, yaml.load);
58
+ return {
59
+ manifest,
60
+ hash,
61
+ source: absolutePath,
62
+ };
63
+ }
64
+ /**
65
+ * Maximum number of redirects to follow when loading a manifest.
66
+ */
67
+ const MAX_REDIRECTS = 5;
68
+ /**
69
+ * Load manifest from HTTP URL with SSRF protection.
70
+ */
71
+ async function loadFromUrl(url, headers, timeout, auditLogger, allowHttp = false) {
72
+ const controller = new AbortController();
73
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
74
+ const allowedSchemes = allowHttp ? ['https', 'http'] : ['https'];
75
+ const validationOptions = { allowedSchemes };
76
+ try {
77
+ // Validate the initial URL against SSRF before fetching
78
+ await validateUrl(url, validationOptions);
79
+ let currentUrl = url;
80
+ let redirectCount = 0;
81
+ // Fetch with manual redirect following and SSRF validation at each hop
82
+ let response = await fetch(currentUrl, {
83
+ method: 'GET',
84
+ headers: {
85
+ 'Accept': 'application/x-yaml, text/yaml, text/plain, */*',
86
+ ...headers,
87
+ },
88
+ signal: controller.signal,
89
+ redirect: 'manual',
90
+ });
91
+ while (response.status >= 300 && response.status < 400) {
92
+ const location = response.headers.get('location');
93
+ if (!location) {
94
+ auditLogger?.logError('Redirect without location header', { url: currentUrl, status: response.status });
95
+ throw new Error(`Redirect response ${response.status} missing Location header`);
96
+ }
97
+ redirectCount++;
98
+ if (redirectCount > MAX_REDIRECTS) {
99
+ auditLogger?.logError('Too many redirects loading manifest', { url, maxRedirects: MAX_REDIRECTS });
100
+ throw new Error(`Too many redirects (max ${MAX_REDIRECTS}) loading manifest from ${url}`);
101
+ }
102
+ // Resolve relative redirect URLs
103
+ const redirectTarget = new URL(location, currentUrl).href;
104
+ // Validate the redirect target for SSRF
105
+ await validateRedirect(redirectTarget, url, validationOptions);
106
+ // Strip sensitive headers on cross-origin redirect
107
+ headers = stripCrossOriginHeaders(headers, currentUrl, redirectTarget);
108
+ currentUrl = redirectTarget;
109
+ response = await fetch(currentUrl, {
110
+ method: 'GET',
111
+ headers: {
112
+ 'Accept': 'application/x-yaml, text/yaml, text/plain, */*',
113
+ ...headers,
114
+ },
115
+ signal: controller.signal,
116
+ redirect: 'manual',
117
+ });
118
+ }
119
+ if (!response.ok) {
120
+ auditLogger?.logError('Manifest fetch failed', { url: currentUrl, status: response.status });
121
+ throw new Error(`Failed to fetch manifest: ${response.status} ${response.statusText}`);
122
+ }
123
+ const content = await response.text();
124
+ try {
125
+ const hash = computeHash(content);
126
+ const manifest = parseManifest(content, yaml.load);
127
+ const responseEtag = response.headers.get('etag');
128
+ const responseLastModified = response.headers.get('last-modified');
129
+ return {
130
+ manifest,
131
+ hash,
132
+ source: url,
133
+ ...(responseEtag ? { etag: responseEtag } : {}),
134
+ ...(responseLastModified ? { lastModified: responseLastModified } : {}),
135
+ };
136
+ }
137
+ catch (err) {
138
+ auditLogger?.logError('Manifest parse failed', {
139
+ url: currentUrl,
140
+ error: err instanceof Error ? err.message : String(err),
141
+ });
142
+ throw err;
143
+ }
144
+ }
145
+ finally {
146
+ clearTimeout(timeoutId);
147
+ }
148
+ }
149
+ /**
150
+ * Check if manifest has changed using ETag.
151
+ */
152
+ export async function checkManifestUpdate(url, etag, headers = {}, timeout = 30000, allowHttp = false) {
153
+ const controller = new AbortController();
154
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
155
+ const allowedSchemes = allowHttp ? ['https', 'http'] : ['https'];
156
+ const validationOptions = { allowedSchemes };
157
+ try {
158
+ // Validate the URL against SSRF before fetching
159
+ await validateUrl(url, validationOptions);
160
+ let currentUrl = url;
161
+ let redirectCount = 0;
162
+ let response = await fetch(currentUrl, {
163
+ method: 'GET',
164
+ headers: {
165
+ 'Accept': 'application/x-yaml, text/yaml, text/plain, */*',
166
+ 'If-None-Match': etag,
167
+ ...headers,
168
+ },
169
+ signal: controller.signal,
170
+ redirect: 'manual',
171
+ });
172
+ while (response.status >= 300 && response.status < 400 && response.status !== 304) {
173
+ const location = response.headers.get('location');
174
+ if (!location) {
175
+ throw new Error(`Redirect response ${response.status} missing Location header`);
176
+ }
177
+ redirectCount++;
178
+ if (redirectCount > MAX_REDIRECTS) {
179
+ throw new Error(`Too many redirects (max ${MAX_REDIRECTS}) checking manifest update from ${url}`);
180
+ }
181
+ const redirectTarget = new URL(location, currentUrl).href;
182
+ await validateRedirect(redirectTarget, url, validationOptions);
183
+ headers = stripCrossOriginHeaders(headers, currentUrl, redirectTarget);
184
+ currentUrl = redirectTarget;
185
+ response = await fetch(currentUrl, {
186
+ method: 'GET',
187
+ headers: {
188
+ 'Accept': 'application/x-yaml, text/yaml, text/plain, */*',
189
+ 'If-None-Match': etag,
190
+ ...headers,
191
+ },
192
+ signal: controller.signal,
193
+ redirect: 'manual',
194
+ });
195
+ }
196
+ if (response.status === 304) {
197
+ return { changed: false };
198
+ }
199
+ if (!response.ok) {
200
+ throw new Error(`Failed to check manifest: ${response.status} ${response.statusText}`);
201
+ }
202
+ const content = await response.text();
203
+ const hash = computeHash(content);
204
+ const manifest = parseManifest(content, yaml.load);
205
+ const responseEtag = response.headers.get('etag');
206
+ const responseLastModified = response.headers.get('last-modified');
207
+ return {
208
+ changed: true,
209
+ result: {
210
+ manifest,
211
+ hash,
212
+ source: url,
213
+ ...(responseEtag ? { etag: responseEtag } : {}),
214
+ ...(responseLastModified ? { lastModified: responseLastModified } : {}),
215
+ },
216
+ };
217
+ }
218
+ finally {
219
+ clearTimeout(timeoutId);
220
+ }
221
+ }
222
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/manifest/loader.ts"],"names":[],"mappings":"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"}