contradiction-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 (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +536 -0
  3. package/bin/cli.js +182 -0
  4. package/dist/analysis/claimMatcher.d.ts +48 -0
  5. package/dist/analysis/claimMatcher.js +131 -0
  6. package/dist/analysis/claimMatcher.js.map +1 -0
  7. package/dist/analysis/claimRelationship.d.ts +15 -0
  8. package/dist/analysis/claimRelationship.js +12 -0
  9. package/dist/analysis/claimRelationship.js.map +1 -0
  10. package/dist/analysis/confidenceScorer.d.ts +40 -0
  11. package/dist/analysis/confidenceScorer.js +59 -0
  12. package/dist/analysis/confidenceScorer.js.map +1 -0
  13. package/dist/analysis/contextAnalyzer.d.ts +13 -0
  14. package/dist/analysis/contextAnalyzer.js +187 -0
  15. package/dist/analysis/contextAnalyzer.js.map +1 -0
  16. package/dist/analysis/contradictionClassifier.d.ts +16 -0
  17. package/dist/analysis/contradictionClassifier.js +141 -0
  18. package/dist/analysis/contradictionClassifier.js.map +1 -0
  19. package/dist/analysis/contradictionEngine.d.ts +29 -0
  20. package/dist/analysis/contradictionEngine.js +284 -0
  21. package/dist/analysis/contradictionEngine.js.map +1 -0
  22. package/dist/analysis/explanationBuilder.d.ts +36 -0
  23. package/dist/analysis/explanationBuilder.js +77 -0
  24. package/dist/analysis/explanationBuilder.js.map +1 -0
  25. package/dist/analysis/valueComparator.d.ts +38 -0
  26. package/dist/analysis/valueComparator.js +418 -0
  27. package/dist/analysis/valueComparator.js.map +1 -0
  28. package/dist/config/env.d.ts +46 -0
  29. package/dist/config/env.js +34 -0
  30. package/dist/config/env.js.map +1 -0
  31. package/dist/connectors/base/connectorUtils.d.ts +26 -0
  32. package/dist/connectors/base/connectorUtils.js +63 -0
  33. package/dist/connectors/base/connectorUtils.js.map +1 -0
  34. package/dist/connectors/base/security.d.ts +11 -0
  35. package/dist/connectors/base/security.js +9 -0
  36. package/dist/connectors/base/security.js.map +1 -0
  37. package/dist/connectors/connectorRegistry.d.ts +43 -0
  38. package/dist/connectors/connectorRegistry.js +91 -0
  39. package/dist/connectors/connectorRegistry.js.map +1 -0
  40. package/dist/connectors/document/documentConnector.d.ts +45 -0
  41. package/dist/connectors/document/documentConnector.js +410 -0
  42. package/dist/connectors/document/documentConnector.js.map +1 -0
  43. package/dist/connectors/github/githubClient.d.ts +52 -0
  44. package/dist/connectors/github/githubClient.js +207 -0
  45. package/dist/connectors/github/githubClient.js.map +1 -0
  46. package/dist/connectors/github/githubConnector.d.ts +26 -0
  47. package/dist/connectors/github/githubConnector.js +169 -0
  48. package/dist/connectors/github/githubConnector.js.map +1 -0
  49. package/dist/connectors/github/githubExtractor.d.ts +26 -0
  50. package/dist/connectors/github/githubExtractor.js +469 -0
  51. package/dist/connectors/github/githubExtractor.js.map +1 -0
  52. package/dist/connectors/github/githubNormalizer.d.ts +11 -0
  53. package/dist/connectors/github/githubNormalizer.js +24 -0
  54. package/dist/connectors/github/githubNormalizer.js.map +1 -0
  55. package/dist/connectors/github/githubTypes.d.ts +55 -0
  56. package/dist/connectors/github/githubTypes.js +2 -0
  57. package/dist/connectors/github/githubTypes.js.map +1 -0
  58. package/dist/connectors/syncService.d.ts +60 -0
  59. package/dist/connectors/syncService.js +176 -0
  60. package/dist/connectors/syncService.js.map +1 -0
  61. package/dist/connectors/types/connector.d.ts +34 -0
  62. package/dist/connectors/types/connector.js +2 -0
  63. package/dist/connectors/types/connector.js.map +1 -0
  64. package/dist/connectors/types/fetchResult.d.ts +39 -0
  65. package/dist/connectors/types/fetchResult.js +2 -0
  66. package/dist/connectors/types/fetchResult.js.map +1 -0
  67. package/dist/connectors/website/ssrfGuard.d.ts +11 -0
  68. package/dist/connectors/website/ssrfGuard.js +122 -0
  69. package/dist/connectors/website/ssrfGuard.js.map +1 -0
  70. package/dist/connectors/website/websiteConnector.d.ts +30 -0
  71. package/dist/connectors/website/websiteConnector.js +231 -0
  72. package/dist/connectors/website/websiteConnector.js.map +1 -0
  73. package/dist/discovery/candidateGenerator.d.ts +12 -0
  74. package/dist/discovery/candidateGenerator.js +110 -0
  75. package/dist/discovery/candidateGenerator.js.map +1 -0
  76. package/dist/discovery/contradictionScanner.d.ts +30 -0
  77. package/dist/discovery/contradictionScanner.js +47 -0
  78. package/dist/discovery/contradictionScanner.js.map +1 -0
  79. package/dist/discovery/discoveryService.d.ts +37 -0
  80. package/dist/discovery/discoveryService.js +131 -0
  81. package/dist/discovery/discoveryService.js.map +1 -0
  82. package/dist/discovery/rankingService.d.ts +34 -0
  83. package/dist/discovery/rankingService.js +52 -0
  84. package/dist/discovery/rankingService.js.map +1 -0
  85. package/dist/discovery/similarityIndex.d.ts +20 -0
  86. package/dist/discovery/similarityIndex.js +89 -0
  87. package/dist/discovery/similarityIndex.js.map +1 -0
  88. package/dist/domain/entities/claim.d.ts +99 -0
  89. package/dist/domain/entities/claim.js +92 -0
  90. package/dist/domain/entities/claim.js.map +1 -0
  91. package/dist/domain/entities/contradiction.d.ts +110 -0
  92. package/dist/domain/entities/contradiction.js +74 -0
  93. package/dist/domain/entities/contradiction.js.map +1 -0
  94. package/dist/domain/entities/source.d.ts +43 -0
  95. package/dist/domain/entities/source.js +35 -0
  96. package/dist/domain/entities/source.js.map +1 -0
  97. package/dist/domain/types/common.d.ts +46 -0
  98. package/dist/domain/types/common.js +74 -0
  99. package/dist/domain/types/common.js.map +1 -0
  100. package/dist/httpServer.d.ts +25 -0
  101. package/dist/httpServer.js +164 -0
  102. package/dist/httpServer.js.map +1 -0
  103. package/dist/index.d.ts +1 -0
  104. package/dist/index.js +94 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/intelligence/authorityScorer.d.ts +20 -0
  107. package/dist/intelligence/authorityScorer.js +103 -0
  108. package/dist/intelligence/authorityScorer.js.map +1 -0
  109. package/dist/intelligence/entityResolver.d.ts +33 -0
  110. package/dist/intelligence/entityResolver.js +152 -0
  111. package/dist/intelligence/entityResolver.js.map +1 -0
  112. package/dist/intelligence/evidenceEvaluator.d.ts +15 -0
  113. package/dist/intelligence/evidenceEvaluator.js +63 -0
  114. package/dist/intelligence/evidenceEvaluator.js.map +1 -0
  115. package/dist/intelligence/freshnessScorer.d.ts +25 -0
  116. package/dist/intelligence/freshnessScorer.js +90 -0
  117. package/dist/intelligence/freshnessScorer.js.map +1 -0
  118. package/dist/intelligence/provenanceAnalyzer.d.ts +19 -0
  119. package/dist/intelligence/provenanceAnalyzer.js +33 -0
  120. package/dist/intelligence/provenanceAnalyzer.js.map +1 -0
  121. package/dist/intelligence/resolutionAdvisor.d.ts +40 -0
  122. package/dist/intelligence/resolutionAdvisor.js +118 -0
  123. package/dist/intelligence/resolutionAdvisor.js.map +1 -0
  124. package/dist/intelligence/semanticMatcher.d.ts +21 -0
  125. package/dist/intelligence/semanticMatcher.js +71 -0
  126. package/dist/intelligence/semanticMatcher.js.map +1 -0
  127. package/dist/scripts/comprehensiveVerification.d.ts +5 -0
  128. package/dist/scripts/comprehensiveVerification.js +961 -0
  129. package/dist/scripts/comprehensiveVerification.js.map +1 -0
  130. package/dist/scripts/finalLiveDemo.d.ts +5 -0
  131. package/dist/scripts/finalLiveDemo.js +226 -0
  132. package/dist/scripts/finalLiveDemo.js.map +1 -0
  133. package/dist/scripts/liveMcpSmoke.d.ts +1 -0
  134. package/dist/scripts/liveMcpSmoke.js +89 -0
  135. package/dist/scripts/liveMcpSmoke.js.map +1 -0
  136. package/dist/scripts/seedDemoData.d.ts +6 -0
  137. package/dist/scripts/seedDemoData.js +179 -0
  138. package/dist/scripts/seedDemoData.js.map +1 -0
  139. package/dist/server.d.ts +28 -0
  140. package/dist/server.js +1264 -0
  141. package/dist/server.js.map +1 -0
  142. package/dist/services/analysisService.d.ts +40 -0
  143. package/dist/services/analysisService.js +65 -0
  144. package/dist/services/analysisService.js.map +1 -0
  145. package/dist/services/healthService.d.ts +42 -0
  146. package/dist/services/healthService.js +50 -0
  147. package/dist/services/healthService.js.map +1 -0
  148. package/dist/services/metricsService.d.ts +35 -0
  149. package/dist/services/metricsService.js +57 -0
  150. package/dist/services/metricsService.js.map +1 -0
  151. package/dist/services/rateLimiter.d.ts +23 -0
  152. package/dist/services/rateLimiter.js +45 -0
  153. package/dist/services/rateLimiter.js.map +1 -0
  154. package/dist/services/reviewService.d.ts +32 -0
  155. package/dist/services/reviewService.js +94 -0
  156. package/dist/services/reviewService.js.map +1 -0
  157. package/dist/services/schedulerService.d.ts +30 -0
  158. package/dist/services/schedulerService.js +89 -0
  159. package/dist/services/schedulerService.js.map +1 -0
  160. package/dist/storage/backupService.d.ts +14 -0
  161. package/dist/storage/backupService.js +90 -0
  162. package/dist/storage/backupService.js.map +1 -0
  163. package/dist/storage/database.d.ts +119 -0
  164. package/dist/storage/database.js +935 -0
  165. package/dist/storage/database.js.map +1 -0
  166. package/dist/storage/migrations/001_initial.sql +63 -0
  167. package/dist/storage/migrations/002_discovery_uniqueness.sql +8 -0
  168. package/dist/storage/migrations/003_connector_identity.sql +7 -0
  169. package/dist/storage/migrations/004_claim_context.sql +15 -0
  170. package/dist/storage/migrations/005_claim_history.sql +26 -0
  171. package/dist/storage/migrations/006_contradiction_resolution.sql +27 -0
  172. package/dist/utils/logger.d.ts +20 -0
  173. package/dist/utils/logger.js +48 -0
  174. package/dist/utils/logger.js.map +1 -0
  175. package/package.json +73 -0
@@ -0,0 +1,469 @@
1
+ import { createClaimExternalId, sanitizeSecrets } from '../base/connectorUtils.js';
2
+ export class GitHubExtractor {
3
+ /**
4
+ * Extracts factual claims from a set of repository files.
5
+ */
6
+ extractClaims(repo, sourceExternalId, files) {
7
+ const claims = [];
8
+ const subject = repo.fullName; // Canonical subject: "owner/repo"
9
+ for (const file of files) {
10
+ const lowerPath = file.path.toLowerCase();
11
+ if (lowerPath === 'package.json' || lowerPath.endsWith('/package.json')) {
12
+ claims.push(...this.extractFromPackageJson(repo, sourceExternalId, subject, file));
13
+ }
14
+ else if (lowerPath === 'dockerfile' ||
15
+ lowerPath.endsWith('/dockerfile') ||
16
+ lowerPath.includes('dockerfile.')) {
17
+ claims.push(...this.extractFromDockerfile(repo, sourceExternalId, subject, file));
18
+ }
19
+ else if (lowerPath === 'readme.md' ||
20
+ lowerPath.endsWith('/readme.md') ||
21
+ lowerPath === 'readme') {
22
+ claims.push(...this.extractFromReadme(repo, sourceExternalId, subject, file));
23
+ }
24
+ else if (lowerPath.startsWith('.github/workflows/') &&
25
+ (lowerPath.endsWith('.yml') || lowerPath.endsWith('.yaml'))) {
26
+ claims.push(...this.extractFromWorkflow(repo, sourceExternalId, subject, file));
27
+ }
28
+ }
29
+ return claims;
30
+ }
31
+ /**
32
+ * Extracts factual claims from package.json.
33
+ */
34
+ extractFromPackageJson(repo, sourceExternalId, subject, file) {
35
+ const claims = [];
36
+ let pkg;
37
+ try {
38
+ pkg = JSON.parse(file.content);
39
+ }
40
+ catch {
41
+ return claims;
42
+ }
43
+ const lines = file.content.split('\n');
44
+ // 1. Engines (node, npm, pnpm, yarn)
45
+ if (pkg.engines && typeof pkg.engines === 'object') {
46
+ const engines = pkg.engines;
47
+ for (const [engineName, engineVal] of Object.entries(engines)) {
48
+ if (typeof engineVal === 'string' && engineVal.trim()) {
49
+ const predicate = `${engineName.toLowerCase()}_version`;
50
+ const lineNum = this.findLineNumber(lines, `"${engineName}"`);
51
+ const evidence = this.extractEvidence(lines, lineNum);
52
+ const rawVal = engineVal.trim();
53
+ const isRange = /[><=~^\s*|]/.test(rawVal);
54
+ claims.push({
55
+ subject,
56
+ predicate,
57
+ value: rawVal,
58
+ valueType: 'version',
59
+ confidence: 0.95,
60
+ environment: 'production',
61
+ scope: 'package',
62
+ sourceRole: 'configuration',
63
+ isHistorical: false,
64
+ valueConstraint: isRange ? rawVal : null,
65
+ externalId: createClaimExternalId(sourceExternalId, file.path, predicate),
66
+ provenance: {
67
+ connector: 'github',
68
+ repository: repo.fullName,
69
+ filePath: file.path,
70
+ url: file.url,
71
+ extractionMethod: 'package-engines',
72
+ lineRange: lineNum > 0 ? [lineNum, lineNum] : undefined,
73
+ observedAt: new Date().toISOString(),
74
+ evidence,
75
+ },
76
+ });
77
+ }
78
+ }
79
+ }
80
+ // 2. High-value dependencies
81
+ const highValueDeps = [
82
+ { name: 'typescript', predicate: 'typescript_version' },
83
+ { name: 'react', predicate: 'react_version' },
84
+ { name: 'next', predicate: 'next_version' },
85
+ { name: 'express', predicate: 'express_version' },
86
+ { name: '@modelcontextprotocol/sdk', predicate: 'mcp_sdk_version' },
87
+ ];
88
+ const prodDeps = pkg.dependencies || {};
89
+ const devDeps = pkg.devDependencies || {};
90
+ for (const dep of highValueDeps) {
91
+ const isDev = dep.name in devDeps;
92
+ const versionVal = prodDeps[dep.name] ?? devDeps[dep.name];
93
+ if (typeof versionVal === 'string' && versionVal.trim()) {
94
+ const lineNum = this.findLineNumber(lines, `"${dep.name}"`);
95
+ const evidence = this.extractEvidence(lines, lineNum);
96
+ const rawVal = versionVal.trim();
97
+ const isRange = /[><=~^\s*|]/.test(rawVal);
98
+ claims.push({
99
+ subject,
100
+ predicate: dep.predicate,
101
+ value: rawVal,
102
+ valueType: 'version',
103
+ confidence: 0.9,
104
+ environment: isDev ? 'development' : 'production',
105
+ scope: 'package',
106
+ sourceRole: 'configuration',
107
+ isHistorical: false,
108
+ valueConstraint: isRange ? rawVal : null,
109
+ externalId: createClaimExternalId(sourceExternalId, file.path, dep.predicate),
110
+ provenance: {
111
+ connector: 'github',
112
+ repository: repo.fullName,
113
+ filePath: file.path,
114
+ url: file.url,
115
+ extractionMethod: 'package-dependency',
116
+ lineRange: lineNum > 0 ? [lineNum, lineNum] : undefined,
117
+ observedAt: new Date().toISOString(),
118
+ evidence,
119
+ },
120
+ });
121
+ }
122
+ }
123
+ // 3. Scripts port specification
124
+ if (pkg.scripts && typeof pkg.scripts === 'object') {
125
+ const scripts = pkg.scripts;
126
+ for (const [scriptName, scriptVal] of Object.entries(scripts)) {
127
+ if (typeof scriptVal === 'string') {
128
+ const portMatch = scriptVal.match(/(?:--port\s+|PORT=)(\d{2,5})/i);
129
+ if (portMatch) {
130
+ const lineNum = this.findLineNumber(lines, `"${scriptName}"`);
131
+ const evidence = this.extractEvidence(lines, lineNum);
132
+ const isDev = scriptName.toLowerCase().includes('dev') || scriptName.toLowerCase().includes('test');
133
+ claims.push({
134
+ subject,
135
+ predicate: 'port',
136
+ value: portMatch[1],
137
+ valueType: 'quantity',
138
+ confidence: 0.85,
139
+ environment: isDev ? 'development' : 'production',
140
+ scope: 'service',
141
+ sourceRole: 'configuration',
142
+ isHistorical: false,
143
+ externalId: createClaimExternalId(sourceExternalId, file.path, 'port', scriptName),
144
+ provenance: {
145
+ connector: 'github',
146
+ repository: repo.fullName,
147
+ filePath: file.path,
148
+ url: file.url,
149
+ extractionMethod: 'package-script-port',
150
+ lineRange: lineNum > 0 ? [lineNum, lineNum] : undefined,
151
+ observedAt: new Date().toISOString(),
152
+ evidence,
153
+ },
154
+ });
155
+ }
156
+ }
157
+ }
158
+ }
159
+ return claims;
160
+ }
161
+ /**
162
+ * Extracts factual claims from Dockerfile.
163
+ */
164
+ extractFromDockerfile(repo, sourceExternalId, subject, file) {
165
+ const claims = [];
166
+ const lines = file.content.split('\n');
167
+ for (let i = 0; i < lines.length; i++) {
168
+ const line = lines[i].trim();
169
+ const lineNum = i + 1;
170
+ // 1. FROM instruction
171
+ const fromMatch = line.match(/^FROM\s+(?:--platform=\S+\s+)?([a-zA-Z0-9_./-]+)(?::([a-zA-Z0-9_.-]+))?/i);
172
+ if (fromMatch) {
173
+ const image = fromMatch[1].toLowerCase();
174
+ const tag = fromMatch[2];
175
+ if (image.includes('node') && tag) {
176
+ const versionOnly = tag.split('-')[0]; // e.g. 20-alpine -> 20
177
+ claims.push({
178
+ subject,
179
+ predicate: 'node_version',
180
+ value: versionOnly,
181
+ valueType: 'version',
182
+ confidence: 0.9,
183
+ environment: 'deployment',
184
+ scope: 'service',
185
+ sourceRole: 'configuration',
186
+ isHistorical: false,
187
+ externalId: createClaimExternalId(sourceExternalId, file.path, 'node_version'),
188
+ provenance: {
189
+ connector: 'github',
190
+ repository: repo.fullName,
191
+ filePath: file.path,
192
+ url: file.url,
193
+ extractionMethod: 'dockerfile-base-image',
194
+ lineRange: [lineNum, lineNum],
195
+ observedAt: new Date().toISOString(),
196
+ evidence: line,
197
+ },
198
+ });
199
+ }
200
+ else if (image.includes('python') && tag) {
201
+ const versionOnly = tag.split('-')[0];
202
+ claims.push({
203
+ subject,
204
+ predicate: 'python_version',
205
+ value: versionOnly,
206
+ valueType: 'version',
207
+ confidence: 0.9,
208
+ environment: 'deployment',
209
+ scope: 'service',
210
+ sourceRole: 'configuration',
211
+ isHistorical: false,
212
+ externalId: createClaimExternalId(sourceExternalId, file.path, 'python_version'),
213
+ provenance: {
214
+ connector: 'github',
215
+ repository: repo.fullName,
216
+ filePath: file.path,
217
+ url: file.url,
218
+ extractionMethod: 'dockerfile-base-image',
219
+ lineRange: [lineNum, lineNum],
220
+ observedAt: new Date().toISOString(),
221
+ evidence: line,
222
+ },
223
+ });
224
+ }
225
+ else if (image.includes('postgres') && tag) {
226
+ const versionOnly = tag.split('-')[0];
227
+ claims.push({
228
+ subject,
229
+ predicate: 'postgres_version',
230
+ value: versionOnly,
231
+ valueType: 'version',
232
+ confidence: 0.9,
233
+ environment: 'deployment',
234
+ scope: 'service',
235
+ sourceRole: 'configuration',
236
+ isHistorical: false,
237
+ externalId: createClaimExternalId(sourceExternalId, file.path, 'postgres_version'),
238
+ provenance: {
239
+ connector: 'github',
240
+ repository: repo.fullName,
241
+ filePath: file.path,
242
+ url: file.url,
243
+ extractionMethod: 'dockerfile-base-image',
244
+ lineRange: [lineNum, lineNum],
245
+ observedAt: new Date().toISOString(),
246
+ evidence: line,
247
+ },
248
+ });
249
+ }
250
+ }
251
+ // 2. EXPOSE instruction
252
+ const exposeMatch = line.match(/^EXPOSE\s+(\d{2,5})/i);
253
+ if (exposeMatch) {
254
+ claims.push({
255
+ subject,
256
+ predicate: 'port',
257
+ value: exposeMatch[1],
258
+ valueType: 'quantity',
259
+ confidence: 0.9,
260
+ environment: 'deployment',
261
+ scope: 'service',
262
+ sourceRole: 'configuration',
263
+ isHistorical: false,
264
+ externalId: createClaimExternalId(sourceExternalId, file.path, 'port', exposeMatch[1]),
265
+ provenance: {
266
+ connector: 'github',
267
+ repository: repo.fullName,
268
+ filePath: file.path,
269
+ url: file.url,
270
+ extractionMethod: 'dockerfile-expose-port',
271
+ lineRange: [lineNum, lineNum],
272
+ observedAt: new Date().toISOString(),
273
+ evidence: line,
274
+ },
275
+ });
276
+ }
277
+ }
278
+ return claims;
279
+ }
280
+ /**
281
+ * Extracts factual claims from README.md.
282
+ */
283
+ extractFromReadme(repo, sourceExternalId, subject, file) {
284
+ const claims = [];
285
+ const lines = file.content.split('\n');
286
+ for (let i = 0; i < lines.length; i++) {
287
+ const line = lines[i];
288
+ const lineNum = i + 1;
289
+ const lower = line.toLowerCase();
290
+ const isHistorical = /(?:previously|deprecated|former|legacy|dropped\s+support|used\s+to)/i.test(lower);
291
+ const isExample = /(?:for\s+example|e\.g\.|sample|tutorial|docker\s+run)/i.test(lower);
292
+ const sourceRole = isExample ? 'example' : isHistorical ? 'historical' : 'documentation';
293
+ // 1. Node version pattern
294
+ const nodeMatch = line.match(/(?:(?:requires?|prerequisites?|built with|runs on)\s+)?node(?:\.js)?\s*(?:version)?\s*[:=~^>=<]*\s*([vV]?\d+(?:\.\d+)*)/i);
295
+ if (nodeMatch && !lower.includes('npm')) {
296
+ const rawVersion = nodeMatch[1];
297
+ if (rawVersion !== '0' && !rawVersion.startsWith('202') && !rawVersion.startsWith('199')) {
298
+ const isRange = /[><=~^\s*|]/.test(line);
299
+ claims.push({
300
+ subject,
301
+ predicate: 'node_version',
302
+ value: rawVersion,
303
+ valueType: 'version',
304
+ confidence: 0.8,
305
+ environment: 'documentation',
306
+ scope: 'repository',
307
+ sourceRole,
308
+ isHistorical,
309
+ valueConstraint: isRange ? line.trim().slice(0, 50) : null,
310
+ externalId: createClaimExternalId(sourceExternalId, file.path, 'node_version', isHistorical ? 'historical' : undefined),
311
+ provenance: {
312
+ connector: 'github',
313
+ repository: repo.fullName,
314
+ filePath: file.path,
315
+ url: file.url,
316
+ extractionMethod: 'readme-node-version-pattern',
317
+ lineRange: [lineNum, lineNum],
318
+ observedAt: new Date().toISOString(),
319
+ evidence: line.trim().slice(0, 160),
320
+ },
321
+ });
322
+ }
323
+ }
324
+ // 2. Port pattern
325
+ const portMatch = line.match(/(?:default\s+port|(?:runs?|running|listening|server)\s+(?:on\s+)?port|port\s*:)\s*[:=]?\s*(\d{2,5})\b/i);
326
+ if (portMatch) {
327
+ claims.push({
328
+ subject,
329
+ predicate: 'port',
330
+ value: portMatch[1],
331
+ valueType: 'quantity',
332
+ confidence: 0.8,
333
+ environment: 'documentation',
334
+ scope: 'repository',
335
+ sourceRole,
336
+ isHistorical,
337
+ externalId: createClaimExternalId(sourceExternalId, file.path, 'port', portMatch[1]),
338
+ provenance: {
339
+ connector: 'github',
340
+ repository: repo.fullName,
341
+ filePath: file.path,
342
+ url: file.url,
343
+ extractionMethod: 'readme-port-pattern',
344
+ lineRange: [lineNum, lineNum],
345
+ observedAt: new Date().toISOString(),
346
+ evidence: line.trim().slice(0, 160),
347
+ },
348
+ });
349
+ }
350
+ }
351
+ return claims;
352
+ }
353
+ /**
354
+ * Extracts factual claims from GitHub Actions workflow files.
355
+ */
356
+ extractFromWorkflow(repo, sourceExternalId, subject, file) {
357
+ const claims = [];
358
+ const lines = file.content.split('\n');
359
+ for (let i = 0; i < lines.length; i++) {
360
+ const line = lines[i];
361
+ const lineNum = i + 1;
362
+ // 1. Node version in setup-node step or matrix
363
+ const nodeVersionMatch = line.match(/node-version:\s*(?:\[([^\]]+)\]|['"]?([0-9.x]+)['"]?)/i);
364
+ if (nodeVersionMatch) {
365
+ if (nodeVersionMatch[2]) {
366
+ const version = nodeVersionMatch[2].replace(/\.x$/, '');
367
+ claims.push({
368
+ subject,
369
+ predicate: 'node_version',
370
+ value: version,
371
+ valueType: 'version',
372
+ confidence: 0.9,
373
+ environment: 'ci',
374
+ scope: 'workflow',
375
+ sourceRole: 'configuration',
376
+ isHistorical: false,
377
+ multiValueContext: 'ci_step',
378
+ externalId: createClaimExternalId(sourceExternalId, file.path, 'node_version', version),
379
+ provenance: {
380
+ connector: 'github',
381
+ repository: repo.fullName,
382
+ filePath: file.path,
383
+ url: file.url,
384
+ extractionMethod: 'github-workflow-node-version',
385
+ lineRange: [lineNum, lineNum],
386
+ observedAt: new Date().toISOString(),
387
+ evidence: line.trim().slice(0, 160),
388
+ },
389
+ });
390
+ }
391
+ else if (nodeVersionMatch[1]) {
392
+ const items = nodeVersionMatch[1]
393
+ .split(',')
394
+ .map((s) => s.trim().replace(/['"]/g, '').replace(/\.x$/, ''));
395
+ for (const item of items) {
396
+ if (item) {
397
+ claims.push({
398
+ subject,
399
+ predicate: 'node_version',
400
+ value: item,
401
+ valueType: 'version',
402
+ confidence: 0.9,
403
+ environment: 'ci',
404
+ scope: 'workflow',
405
+ sourceRole: 'configuration',
406
+ isHistorical: false,
407
+ multiValueContext: 'ci_matrix',
408
+ externalId: createClaimExternalId(sourceExternalId, file.path, 'node_version', item),
409
+ provenance: {
410
+ connector: 'github',
411
+ repository: repo.fullName,
412
+ filePath: file.path,
413
+ url: file.url,
414
+ extractionMethod: 'github-workflow-node-matrix',
415
+ lineRange: [lineNum, lineNum],
416
+ observedAt: new Date().toISOString(),
417
+ evidence: line.trim().slice(0, 160),
418
+ },
419
+ });
420
+ }
421
+ }
422
+ }
423
+ }
424
+ // 2. CI Runner OS
425
+ const runsOnMatch = line.match(/runs-on:\s*([a-zA-Z0-9_.-]+)/i);
426
+ if (runsOnMatch) {
427
+ const os = runsOnMatch[1].trim();
428
+ claims.push({
429
+ subject,
430
+ predicate: 'ci_runner_os',
431
+ value: os,
432
+ valueType: 'name',
433
+ confidence: 0.95,
434
+ environment: 'ci',
435
+ scope: 'workflow',
436
+ sourceRole: 'configuration',
437
+ isHistorical: false,
438
+ multiValueContext: 'ci_runner',
439
+ externalId: createClaimExternalId(sourceExternalId, file.path, 'ci_runner_os', os),
440
+ provenance: {
441
+ connector: 'github',
442
+ repository: repo.fullName,
443
+ filePath: file.path,
444
+ url: file.url,
445
+ extractionMethod: 'github-workflow-runner',
446
+ lineRange: [lineNum, lineNum],
447
+ observedAt: new Date().toISOString(),
448
+ evidence: line.trim().slice(0, 160),
449
+ },
450
+ });
451
+ }
452
+ }
453
+ return claims;
454
+ }
455
+ findLineNumber(lines, text) {
456
+ for (let i = 0; i < lines.length; i++) {
457
+ if (lines[i].includes(text)) {
458
+ return i + 1;
459
+ }
460
+ }
461
+ return 1;
462
+ }
463
+ extractEvidence(lines, lineNum) {
464
+ const targetIdx = Math.max(0, lineNum - 1);
465
+ const line = lines[targetIdx] || '';
466
+ return sanitizeSecrets(line.trim().slice(0, 200));
467
+ }
468
+ }
469
+ //# sourceMappingURL=githubExtractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubExtractor.js","sourceRoot":"","sources":["../../../src/connectors/github/githubExtractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { ExtractedClaim } from '../types/fetchResult.js';
2
+ import { ValueComparator } from '../../analysis/valueComparator.js';
3
+ export declare class GitHubNormalizer {
4
+ private readonly comparator;
5
+ constructor(comparator?: ValueComparator);
6
+ /**
7
+ * Normalizes subject, predicate, and values of extracted claims
8
+ * so they are consistent with the contradiction engine's comparator and matcher.
9
+ */
10
+ normalizeClaims(claims: ExtractedClaim[]): ExtractedClaim[];
11
+ }
@@ -0,0 +1,24 @@
1
+ import { normalizeText } from '../../analysis/claimMatcher.js';
2
+ import { ValueComparator } from '../../analysis/valueComparator.js';
3
+ export class GitHubNormalizer {
4
+ comparator;
5
+ constructor(comparator) {
6
+ this.comparator = comparator || new ValueComparator();
7
+ }
8
+ /**
9
+ * Normalizes subject, predicate, and values of extracted claims
10
+ * so they are consistent with the contradiction engine's comparator and matcher.
11
+ */
12
+ normalizeClaims(claims) {
13
+ return claims.map((claim) => {
14
+ const normPredicate = normalizeText(claim.predicate).replace(/\s+/g, '_');
15
+ const comparison = this.comparator.compare(claim.value, claim.value, claim.valueType);
16
+ return {
17
+ ...claim,
18
+ predicate: normPredicate,
19
+ normalizedValue: comparison.normalizedA || claim.value.trim(),
20
+ };
21
+ });
22
+ }
23
+ }
24
+ //# sourceMappingURL=githubNormalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubNormalizer.js","sourceRoot":"","sources":["../../../src/connectors/github/githubNormalizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE,MAAM,OAAO,gBAAgB;IACV,UAAU,CAAkB;IAE7C,YAAY,UAA4B;QACtC,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,IAAI,eAAe,EAAE,CAAC;IACxD,CAAC;IAED;;;OAGG;IACI,eAAe,CAAC,MAAwB;QAC7C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAC1B,MAAM,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YAEtF,OAAO;gBACL,GAAG,KAAK;gBACR,SAAS,EAAE,aAAa;gBACxB,eAAe,EAAE,UAAU,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;aAC9D,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,55 @@
1
+ export interface GitHubRepoResponse {
2
+ id: number;
3
+ name: string;
4
+ full_name: string;
5
+ owner: {
6
+ login: string;
7
+ };
8
+ private: boolean;
9
+ html_url: string;
10
+ description: string | null;
11
+ default_branch: string;
12
+ }
13
+ export interface GitHubContentFile {
14
+ type: 'file' | 'dir' | 'symlink' | 'submodule';
15
+ name: string;
16
+ path: string;
17
+ sha: string;
18
+ size: number;
19
+ url: string;
20
+ html_url: string;
21
+ download_url: string | null;
22
+ content?: string;
23
+ encoding?: string;
24
+ }
25
+ export interface GitHubRateLimitInfo {
26
+ limit: number;
27
+ remaining: number;
28
+ resetAt: Date;
29
+ }
30
+ export interface GitHubConnectorInput {
31
+ owner: string;
32
+ repo: string;
33
+ branch?: string;
34
+ targetFiles?: string[];
35
+ }
36
+ export interface GitHubFilePayload {
37
+ path: string;
38
+ content: string;
39
+ url: string;
40
+ sha: string;
41
+ size: number;
42
+ }
43
+ export interface GitHubRepoInfo {
44
+ owner: string;
45
+ repo: string;
46
+ fullName: string;
47
+ defaultBranch: string;
48
+ htmlUrl: string;
49
+ description: string | null;
50
+ }
51
+ export interface GitHubFetchData {
52
+ repository: GitHubRepoInfo;
53
+ files: GitHubFilePayload[];
54
+ rateLimit?: GitHubRateLimitInfo;
55
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=githubTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubTypes.js","sourceRoot":"","sources":["../../../src/connectors/github/githubTypes.ts"],"names":[],"mappings":""}
@@ -0,0 +1,60 @@
1
+ import { DatabaseManager } from '../storage/database.js';
2
+ import { ConnectorRegistry } from './connectorRegistry.js';
3
+ import { DiscoveryService } from '../discovery/discoveryService.js';
4
+ export interface SyncOptions {
5
+ runDiscoveryAfterSync?: boolean;
6
+ minConfidence?: number;
7
+ }
8
+ export interface SyncSummary {
9
+ status: 'completed' | 'failed';
10
+ source: {
11
+ id: string;
12
+ type: string;
13
+ name: string;
14
+ externalId: string;
15
+ };
16
+ repository?: string;
17
+ filesInspected: number;
18
+ claimsExtracted: number;
19
+ claimsCreated: number;
20
+ claimsUpdated: number;
21
+ durationMs: number;
22
+ contradictionsFound?: number;
23
+ newContradictions?: number;
24
+ error?: string;
25
+ }
26
+ export declare class SyncService {
27
+ private readonly dbManager;
28
+ private readonly registry;
29
+ private readonly discoveryService?;
30
+ constructor(dbManager: DatabaseManager, registry: ConnectorRegistry, discoveryService?: DiscoveryService);
31
+ /**
32
+ * Synchronizes an external source using its registered connector,
33
+ * extracts and normalizes claims, idempotently upserts them in SQLite,
34
+ * and optionally runs incremental contradiction discovery.
35
+ */
36
+ syncSource(connectorType: string, input: unknown, options?: SyncOptions): Promise<SyncSummary>;
37
+ /**
38
+ * Synchronizes multiple external sources with bounded concurrency and failure isolation.
39
+ */
40
+ syncSources(requests: Array<{
41
+ connector: string;
42
+ input: unknown;
43
+ }>, options?: SyncOptions & {
44
+ concurrency?: number;
45
+ }): Promise<{
46
+ sourcesRequested: number;
47
+ sourcesSucceeded: number;
48
+ sourcesFailed: number;
49
+ claimsCreated: number;
50
+ claimsUpdated: number;
51
+ contradictionsFound: number;
52
+ durationMs: number;
53
+ results: Array<{
54
+ connector: string;
55
+ status: 'completed' | 'failed';
56
+ summary?: SyncSummary;
57
+ error?: string;
58
+ }>;
59
+ }>;
60
+ }