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.
- package/LICENSE +21 -0
- package/README.md +536 -0
- package/bin/cli.js +182 -0
- package/dist/analysis/claimMatcher.d.ts +48 -0
- package/dist/analysis/claimMatcher.js +131 -0
- package/dist/analysis/claimMatcher.js.map +1 -0
- package/dist/analysis/claimRelationship.d.ts +15 -0
- package/dist/analysis/claimRelationship.js +12 -0
- package/dist/analysis/claimRelationship.js.map +1 -0
- package/dist/analysis/confidenceScorer.d.ts +40 -0
- package/dist/analysis/confidenceScorer.js +59 -0
- package/dist/analysis/confidenceScorer.js.map +1 -0
- package/dist/analysis/contextAnalyzer.d.ts +13 -0
- package/dist/analysis/contextAnalyzer.js +187 -0
- package/dist/analysis/contextAnalyzer.js.map +1 -0
- package/dist/analysis/contradictionClassifier.d.ts +16 -0
- package/dist/analysis/contradictionClassifier.js +141 -0
- package/dist/analysis/contradictionClassifier.js.map +1 -0
- package/dist/analysis/contradictionEngine.d.ts +29 -0
- package/dist/analysis/contradictionEngine.js +284 -0
- package/dist/analysis/contradictionEngine.js.map +1 -0
- package/dist/analysis/explanationBuilder.d.ts +36 -0
- package/dist/analysis/explanationBuilder.js +77 -0
- package/dist/analysis/explanationBuilder.js.map +1 -0
- package/dist/analysis/valueComparator.d.ts +38 -0
- package/dist/analysis/valueComparator.js +418 -0
- package/dist/analysis/valueComparator.js.map +1 -0
- package/dist/config/env.d.ts +46 -0
- package/dist/config/env.js +34 -0
- package/dist/config/env.js.map +1 -0
- package/dist/connectors/base/connectorUtils.d.ts +26 -0
- package/dist/connectors/base/connectorUtils.js +63 -0
- package/dist/connectors/base/connectorUtils.js.map +1 -0
- package/dist/connectors/base/security.d.ts +11 -0
- package/dist/connectors/base/security.js +9 -0
- package/dist/connectors/base/security.js.map +1 -0
- package/dist/connectors/connectorRegistry.d.ts +43 -0
- package/dist/connectors/connectorRegistry.js +91 -0
- package/dist/connectors/connectorRegistry.js.map +1 -0
- package/dist/connectors/document/documentConnector.d.ts +45 -0
- package/dist/connectors/document/documentConnector.js +410 -0
- package/dist/connectors/document/documentConnector.js.map +1 -0
- package/dist/connectors/github/githubClient.d.ts +52 -0
- package/dist/connectors/github/githubClient.js +207 -0
- package/dist/connectors/github/githubClient.js.map +1 -0
- package/dist/connectors/github/githubConnector.d.ts +26 -0
- package/dist/connectors/github/githubConnector.js +169 -0
- package/dist/connectors/github/githubConnector.js.map +1 -0
- package/dist/connectors/github/githubExtractor.d.ts +26 -0
- package/dist/connectors/github/githubExtractor.js +469 -0
- package/dist/connectors/github/githubExtractor.js.map +1 -0
- package/dist/connectors/github/githubNormalizer.d.ts +11 -0
- package/dist/connectors/github/githubNormalizer.js +24 -0
- package/dist/connectors/github/githubNormalizer.js.map +1 -0
- package/dist/connectors/github/githubTypes.d.ts +55 -0
- package/dist/connectors/github/githubTypes.js +2 -0
- package/dist/connectors/github/githubTypes.js.map +1 -0
- package/dist/connectors/syncService.d.ts +60 -0
- package/dist/connectors/syncService.js +176 -0
- package/dist/connectors/syncService.js.map +1 -0
- package/dist/connectors/types/connector.d.ts +34 -0
- package/dist/connectors/types/connector.js +2 -0
- package/dist/connectors/types/connector.js.map +1 -0
- package/dist/connectors/types/fetchResult.d.ts +39 -0
- package/dist/connectors/types/fetchResult.js +2 -0
- package/dist/connectors/types/fetchResult.js.map +1 -0
- package/dist/connectors/website/ssrfGuard.d.ts +11 -0
- package/dist/connectors/website/ssrfGuard.js +122 -0
- package/dist/connectors/website/ssrfGuard.js.map +1 -0
- package/dist/connectors/website/websiteConnector.d.ts +30 -0
- package/dist/connectors/website/websiteConnector.js +231 -0
- package/dist/connectors/website/websiteConnector.js.map +1 -0
- package/dist/discovery/candidateGenerator.d.ts +12 -0
- package/dist/discovery/candidateGenerator.js +110 -0
- package/dist/discovery/candidateGenerator.js.map +1 -0
- package/dist/discovery/contradictionScanner.d.ts +30 -0
- package/dist/discovery/contradictionScanner.js +47 -0
- package/dist/discovery/contradictionScanner.js.map +1 -0
- package/dist/discovery/discoveryService.d.ts +37 -0
- package/dist/discovery/discoveryService.js +131 -0
- package/dist/discovery/discoveryService.js.map +1 -0
- package/dist/discovery/rankingService.d.ts +34 -0
- package/dist/discovery/rankingService.js +52 -0
- package/dist/discovery/rankingService.js.map +1 -0
- package/dist/discovery/similarityIndex.d.ts +20 -0
- package/dist/discovery/similarityIndex.js +89 -0
- package/dist/discovery/similarityIndex.js.map +1 -0
- package/dist/domain/entities/claim.d.ts +99 -0
- package/dist/domain/entities/claim.js +92 -0
- package/dist/domain/entities/claim.js.map +1 -0
- package/dist/domain/entities/contradiction.d.ts +110 -0
- package/dist/domain/entities/contradiction.js +74 -0
- package/dist/domain/entities/contradiction.js.map +1 -0
- package/dist/domain/entities/source.d.ts +43 -0
- package/dist/domain/entities/source.js +35 -0
- package/dist/domain/entities/source.js.map +1 -0
- package/dist/domain/types/common.d.ts +46 -0
- package/dist/domain/types/common.js +74 -0
- package/dist/domain/types/common.js.map +1 -0
- package/dist/httpServer.d.ts +25 -0
- package/dist/httpServer.js +164 -0
- package/dist/httpServer.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +94 -0
- package/dist/index.js.map +1 -0
- package/dist/intelligence/authorityScorer.d.ts +20 -0
- package/dist/intelligence/authorityScorer.js +103 -0
- package/dist/intelligence/authorityScorer.js.map +1 -0
- package/dist/intelligence/entityResolver.d.ts +33 -0
- package/dist/intelligence/entityResolver.js +152 -0
- package/dist/intelligence/entityResolver.js.map +1 -0
- package/dist/intelligence/evidenceEvaluator.d.ts +15 -0
- package/dist/intelligence/evidenceEvaluator.js +63 -0
- package/dist/intelligence/evidenceEvaluator.js.map +1 -0
- package/dist/intelligence/freshnessScorer.d.ts +25 -0
- package/dist/intelligence/freshnessScorer.js +90 -0
- package/dist/intelligence/freshnessScorer.js.map +1 -0
- package/dist/intelligence/provenanceAnalyzer.d.ts +19 -0
- package/dist/intelligence/provenanceAnalyzer.js +33 -0
- package/dist/intelligence/provenanceAnalyzer.js.map +1 -0
- package/dist/intelligence/resolutionAdvisor.d.ts +40 -0
- package/dist/intelligence/resolutionAdvisor.js +118 -0
- package/dist/intelligence/resolutionAdvisor.js.map +1 -0
- package/dist/intelligence/semanticMatcher.d.ts +21 -0
- package/dist/intelligence/semanticMatcher.js +71 -0
- package/dist/intelligence/semanticMatcher.js.map +1 -0
- package/dist/scripts/comprehensiveVerification.d.ts +5 -0
- package/dist/scripts/comprehensiveVerification.js +961 -0
- package/dist/scripts/comprehensiveVerification.js.map +1 -0
- package/dist/scripts/finalLiveDemo.d.ts +5 -0
- package/dist/scripts/finalLiveDemo.js +226 -0
- package/dist/scripts/finalLiveDemo.js.map +1 -0
- package/dist/scripts/liveMcpSmoke.d.ts +1 -0
- package/dist/scripts/liveMcpSmoke.js +89 -0
- package/dist/scripts/liveMcpSmoke.js.map +1 -0
- package/dist/scripts/seedDemoData.d.ts +6 -0
- package/dist/scripts/seedDemoData.js +179 -0
- package/dist/scripts/seedDemoData.js.map +1 -0
- package/dist/server.d.ts +28 -0
- package/dist/server.js +1264 -0
- package/dist/server.js.map +1 -0
- package/dist/services/analysisService.d.ts +40 -0
- package/dist/services/analysisService.js +65 -0
- package/dist/services/analysisService.js.map +1 -0
- package/dist/services/healthService.d.ts +42 -0
- package/dist/services/healthService.js +50 -0
- package/dist/services/healthService.js.map +1 -0
- package/dist/services/metricsService.d.ts +35 -0
- package/dist/services/metricsService.js +57 -0
- package/dist/services/metricsService.js.map +1 -0
- package/dist/services/rateLimiter.d.ts +23 -0
- package/dist/services/rateLimiter.js +45 -0
- package/dist/services/rateLimiter.js.map +1 -0
- package/dist/services/reviewService.d.ts +32 -0
- package/dist/services/reviewService.js +94 -0
- package/dist/services/reviewService.js.map +1 -0
- package/dist/services/schedulerService.d.ts +30 -0
- package/dist/services/schedulerService.js +89 -0
- package/dist/services/schedulerService.js.map +1 -0
- package/dist/storage/backupService.d.ts +14 -0
- package/dist/storage/backupService.js +90 -0
- package/dist/storage/backupService.js.map +1 -0
- package/dist/storage/database.d.ts +119 -0
- package/dist/storage/database.js +935 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/migrations/001_initial.sql +63 -0
- package/dist/storage/migrations/002_discovery_uniqueness.sql +8 -0
- package/dist/storage/migrations/003_connector_identity.sql +7 -0
- package/dist/storage/migrations/004_claim_context.sql +15 -0
- package/dist/storage/migrations/005_claim_history.sql +26 -0
- package/dist/storage/migrations/006_contradiction_resolution.sql +27 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.js +48 -0
- package/dist/utils/logger.js.map +1 -0
- 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 @@
|
|
|
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
|
+
}
|