mcp-adr-analysis-server 2.0.5 → 2.0.7
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/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +249 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/tools/deployment-guidance-tool.d.ts +21 -0
- package/dist/src/tools/deployment-guidance-tool.d.ts.map +1 -0
- package/dist/src/tools/deployment-guidance-tool.js +289 -0
- package/dist/src/tools/deployment-guidance-tool.js.map +1 -0
- package/dist/src/tools/smart-git-push-tool.d.ts +24 -0
- package/dist/src/tools/smart-git-push-tool.d.ts.map +1 -0
- package/dist/src/tools/smart-git-push-tool.js +526 -0
- package/dist/src/tools/smart-git-push-tool.js.map +1 -0
- package/dist/src/tools/todo-management-tool.d.ts +166 -0
- package/dist/src/tools/todo-management-tool.d.ts.map +1 -0
- package/dist/src/tools/todo-management-tool.js +472 -0
- package/dist/src/tools/todo-management-tool.js.map +1 -0
- package/dist/src/utils/enhanced-sensitive-detector.d.ts +61 -0
- package/dist/src/utils/enhanced-sensitive-detector.d.ts.map +1 -0
- package/dist/src/utils/enhanced-sensitive-detector.js +437 -0
- package/dist/src/utils/enhanced-sensitive-detector.js.map +1 -0
- package/dist/src/utils/interactive-approval.d.ts +63 -0
- package/dist/src/utils/interactive-approval.d.ts.map +1 -0
- package/dist/src/utils/interactive-approval.js +441 -0
- package/dist/src/utils/interactive-approval.js.map +1 -0
- package/dist/src/utils/llm-artifact-detector.d.ts +76 -0
- package/dist/src/utils/llm-artifact-detector.d.ts.map +1 -0
- package/dist/src/utils/llm-artifact-detector.js +422 -0
- package/dist/src/utils/llm-artifact-detector.js.map +1 -0
- package/dist/src/utils/location-filter.d.ts +79 -0
- package/dist/src/utils/location-filter.d.ts.map +1 -0
- package/dist/src/utils/location-filter.js +327 -0
- package/dist/src/utils/location-filter.js.map +1 -0
- package/dist/src/utils/release-readiness-detector.d.ts +47 -0
- package/dist/src/utils/release-readiness-detector.d.ts.map +1 -0
- package/dist/src/utils/release-readiness-detector.js +413 -0
- package/dist/src/utils/release-readiness-detector.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced sensitive content detector for smart git push
|
|
3
|
+
*
|
|
4
|
+
* Integrates with existing content-masking-tool.ts and adds git-specific patterns
|
|
5
|
+
*/
|
|
6
|
+
export interface SensitivePattern {
|
|
7
|
+
name: string;
|
|
8
|
+
pattern: RegExp;
|
|
9
|
+
description: string;
|
|
10
|
+
category: 'credentials' | 'secrets' | 'personal' | 'infrastructure' | 'development';
|
|
11
|
+
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
12
|
+
falsePositivePatterns?: RegExp[];
|
|
13
|
+
contextRequired?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface SensitiveMatch {
|
|
16
|
+
pattern: SensitivePattern;
|
|
17
|
+
match: string;
|
|
18
|
+
line: number;
|
|
19
|
+
column: number;
|
|
20
|
+
context: string;
|
|
21
|
+
confidence: number;
|
|
22
|
+
suggestions: string[];
|
|
23
|
+
}
|
|
24
|
+
export interface SensitiveContentResult {
|
|
25
|
+
filePath: string;
|
|
26
|
+
hasIssues: boolean;
|
|
27
|
+
matches: SensitiveMatch[];
|
|
28
|
+
summary: {
|
|
29
|
+
criticalCount: number;
|
|
30
|
+
highCount: number;
|
|
31
|
+
mediumCount: number;
|
|
32
|
+
lowCount: number;
|
|
33
|
+
totalCount: number;
|
|
34
|
+
};
|
|
35
|
+
recommendations: string[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Enhanced sensitive patterns for git context
|
|
39
|
+
*/
|
|
40
|
+
export declare const GIT_SENSITIVE_PATTERNS: SensitivePattern[];
|
|
41
|
+
/**
|
|
42
|
+
* Analyze content for sensitive information
|
|
43
|
+
*/
|
|
44
|
+
export declare function analyzeSensitiveContent(filePath: string, content: string, customPatterns?: SensitivePattern[]): Promise<SensitiveContentResult>;
|
|
45
|
+
/**
|
|
46
|
+
* Integration with existing content masking tool
|
|
47
|
+
*/
|
|
48
|
+
export declare function integrateWithContentMasking(filePath: string, content: string): Promise<{
|
|
49
|
+
sensitiveAnalysis: SensitiveContentResult;
|
|
50
|
+
maskingPrompt?: string;
|
|
51
|
+
combinedRecommendations: string[];
|
|
52
|
+
}>;
|
|
53
|
+
/**
|
|
54
|
+
* Quick check for obviously sensitive files
|
|
55
|
+
*/
|
|
56
|
+
export declare function isObviouslySensitive(filePath: string): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Create a custom sensitive pattern
|
|
59
|
+
*/
|
|
60
|
+
export declare function createSensitivePattern(name: string, pattern: string, description: string, category: SensitivePattern['category'], severity: SensitivePattern['severity']): SensitivePattern;
|
|
61
|
+
//# sourceMappingURL=enhanced-sensitive-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhanced-sensitive-detector.d.ts","sourceRoot":"","sources":["../../../src/utils/enhanced-sensitive-detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,gBAAgB,GAAG,aAAa,CAAC;IACpF,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,OAAO,EAAE;QACP,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,gBAAgB,EA8JpD,CAAC;AAEF;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,cAAc,GAAE,gBAAgB,EAAO,GACtC,OAAO,CAAC,sBAAsB,CAAC,CA8EjC;AAkJD;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IACT,iBAAiB,EAAE,sBAAsB,CAAC;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uBAAuB,EAAE,MAAM,EAAE,CAAC;CACnC,CAAC,CA8CD;AA2BD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAmB9D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,gBAAgB,CAAC,UAAU,CAAC,EACtC,QAAQ,EAAE,gBAAgB,CAAC,UAAU,CAAC,GACrC,gBAAgB,CAQlB"}
|
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced sensitive content detector for smart git push
|
|
3
|
+
*
|
|
4
|
+
* Integrates with existing content-masking-tool.ts and adds git-specific patterns
|
|
5
|
+
*/
|
|
6
|
+
import { basename, extname } from 'path';
|
|
7
|
+
/**
|
|
8
|
+
* Enhanced sensitive patterns for git context
|
|
9
|
+
*/
|
|
10
|
+
export const GIT_SENSITIVE_PATTERNS = [
|
|
11
|
+
// API Keys and Tokens
|
|
12
|
+
{
|
|
13
|
+
name: 'github-token',
|
|
14
|
+
pattern: /ghp_[a-zA-Z0-9]{36}|github_pat_[a-zA-Z0-9_]{82}/,
|
|
15
|
+
description: 'GitHub Personal Access Token',
|
|
16
|
+
category: 'credentials',
|
|
17
|
+
severity: 'critical'
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'aws-access-key',
|
|
21
|
+
pattern: /AKIA[0-9A-Z]{16}/,
|
|
22
|
+
description: 'AWS Access Key ID',
|
|
23
|
+
category: 'credentials',
|
|
24
|
+
severity: 'critical'
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'aws-secret-key',
|
|
28
|
+
pattern: /[0-9a-zA-Z\/+=]{40}/,
|
|
29
|
+
description: 'AWS Secret Access Key',
|
|
30
|
+
category: 'credentials',
|
|
31
|
+
severity: 'critical',
|
|
32
|
+
contextRequired: true
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'generic-api-key',
|
|
36
|
+
pattern: /[Aa][Pp][Ii][_-]?[Kk][Ee][Yy]['"\s]*[:=]['"\s]*[a-zA-Z0-9_\-]{20,}/,
|
|
37
|
+
description: 'Generic API Key',
|
|
38
|
+
category: 'credentials',
|
|
39
|
+
severity: 'high'
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'generic-secret',
|
|
43
|
+
pattern: /[Ss]ecret['"\s]*[:=]['"\s]*[a-zA-Z0-9_\-]{15,}/,
|
|
44
|
+
description: 'Generic Secret',
|
|
45
|
+
category: 'secrets',
|
|
46
|
+
severity: 'high'
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'generic-token',
|
|
50
|
+
pattern: /[Tt]oken['"\s]*[:=]['"\s]*[a-zA-Z0-9_\-]{20,}/,
|
|
51
|
+
description: 'Generic Token',
|
|
52
|
+
category: 'credentials',
|
|
53
|
+
severity: 'high'
|
|
54
|
+
},
|
|
55
|
+
// Database Credentials
|
|
56
|
+
{
|
|
57
|
+
name: 'database-url',
|
|
58
|
+
pattern: /(postgres|mysql|mongodb):\/\/[^:\s]+:[^@\s]+@[^:\s\/]+/,
|
|
59
|
+
description: 'Database connection URL with credentials',
|
|
60
|
+
category: 'credentials',
|
|
61
|
+
severity: 'critical'
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: 'database-password',
|
|
65
|
+
pattern: /[Dd]b[_-]?[Pp]assword['"\s]*[:=]['"\s]*[^\s'"]{8,}/,
|
|
66
|
+
description: 'Database password',
|
|
67
|
+
category: 'credentials',
|
|
68
|
+
severity: 'high'
|
|
69
|
+
},
|
|
70
|
+
// Private Keys
|
|
71
|
+
{
|
|
72
|
+
name: 'private-key',
|
|
73
|
+
pattern: /-----BEGIN [A-Z ]+PRIVATE KEY-----/,
|
|
74
|
+
description: 'Private key',
|
|
75
|
+
category: 'credentials',
|
|
76
|
+
severity: 'critical'
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: 'ssh-private-key',
|
|
80
|
+
pattern: /-----BEGIN OPENSSH PRIVATE KEY-----/,
|
|
81
|
+
description: 'SSH private key',
|
|
82
|
+
category: 'credentials',
|
|
83
|
+
severity: 'critical'
|
|
84
|
+
},
|
|
85
|
+
// Personal Information
|
|
86
|
+
{
|
|
87
|
+
name: 'email-address',
|
|
88
|
+
pattern: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/,
|
|
89
|
+
description: 'Email address',
|
|
90
|
+
category: 'personal',
|
|
91
|
+
severity: 'low',
|
|
92
|
+
falsePositivePatterns: [
|
|
93
|
+
/example\.com|test\.com|localhost|no-reply|noreply/,
|
|
94
|
+
/email@example\.com|test@test\.com|user@domain\.com/
|
|
95
|
+
]
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: 'phone-number',
|
|
99
|
+
pattern: /\+?1?[-.\s]?\(?[0-9]{3}\)?[-.\s]?[0-9]{3}[-.\s]?[0-9]{4}/,
|
|
100
|
+
description: 'Phone number',
|
|
101
|
+
category: 'personal',
|
|
102
|
+
severity: 'medium'
|
|
103
|
+
},
|
|
104
|
+
// Infrastructure
|
|
105
|
+
{
|
|
106
|
+
name: 'ip-address',
|
|
107
|
+
pattern: /(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/,
|
|
108
|
+
description: 'IP address',
|
|
109
|
+
category: 'infrastructure',
|
|
110
|
+
severity: 'medium',
|
|
111
|
+
falsePositivePatterns: [
|
|
112
|
+
/127\.0\.0\.1|localhost|0\.0\.0\.0|192\.168\.|10\.|172\.16\./
|
|
113
|
+
]
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: 'domain-name',
|
|
117
|
+
pattern: /https?:\/\/[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/,
|
|
118
|
+
description: 'Domain name or URL',
|
|
119
|
+
category: 'infrastructure',
|
|
120
|
+
severity: 'low',
|
|
121
|
+
falsePositivePatterns: [
|
|
122
|
+
/example\.com|test\.com|localhost|github\.com|stackoverflow\.com/
|
|
123
|
+
]
|
|
124
|
+
},
|
|
125
|
+
// Development Secrets
|
|
126
|
+
{
|
|
127
|
+
name: 'jwt-secret',
|
|
128
|
+
pattern: /[Jj]wt[_-]?[Ss]ecret['"\s]*[:=]['"\s]*[a-zA-Z0-9_\-]{32,}/,
|
|
129
|
+
description: 'JWT secret key',
|
|
130
|
+
category: 'secrets',
|
|
131
|
+
severity: 'high'
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: 'encryption-key',
|
|
135
|
+
pattern: /[Ee]ncryption[_-]?[Kk]ey['"\s]*[:=]['"\s]*[a-zA-Z0-9_\-+\/=]{32,}/,
|
|
136
|
+
description: 'Encryption key',
|
|
137
|
+
category: 'secrets',
|
|
138
|
+
severity: 'high'
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
name: 'session-secret',
|
|
142
|
+
pattern: /[Ss]ession[_-]?[Ss]ecret['"\s]*[:=]['"\s]*[a-zA-Z0-9_\-]{20,}/,
|
|
143
|
+
description: 'Session secret',
|
|
144
|
+
category: 'secrets',
|
|
145
|
+
severity: 'high'
|
|
146
|
+
},
|
|
147
|
+
// Development/Debug Information
|
|
148
|
+
{
|
|
149
|
+
name: 'debug-info',
|
|
150
|
+
pattern: /console\.log\(.*(?:password|secret|token|key).*\)/i,
|
|
151
|
+
description: 'Debug logging of sensitive information',
|
|
152
|
+
category: 'development',
|
|
153
|
+
severity: 'medium'
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
name: 'hardcoded-password',
|
|
157
|
+
pattern: /password['"\s]*[:=]['"\s]*(?!.*\$\{|.*process\.env)['"]*[a-zA-Z0-9!@#$%^&*()_+\-=]{8,}['"]*(?!['"]*\s*\+|\s*\$\{)/,
|
|
158
|
+
description: 'Hardcoded password',
|
|
159
|
+
category: 'credentials',
|
|
160
|
+
severity: 'high'
|
|
161
|
+
}
|
|
162
|
+
];
|
|
163
|
+
/**
|
|
164
|
+
* Analyze content for sensitive information
|
|
165
|
+
*/
|
|
166
|
+
export async function analyzeSensitiveContent(filePath, content, customPatterns = []) {
|
|
167
|
+
const allPatterns = [...GIT_SENSITIVE_PATTERNS, ...customPatterns];
|
|
168
|
+
const matches = [];
|
|
169
|
+
const lines = content.split('\n');
|
|
170
|
+
// Check each line for sensitive patterns
|
|
171
|
+
for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
|
|
172
|
+
const line = lines[lineIndex];
|
|
173
|
+
const lineNumber = lineIndex + 1;
|
|
174
|
+
if (!line)
|
|
175
|
+
continue;
|
|
176
|
+
for (const pattern of allPatterns) {
|
|
177
|
+
const regex = new RegExp(pattern.pattern, 'g');
|
|
178
|
+
let match;
|
|
179
|
+
while ((match = regex.exec(line)) !== null) {
|
|
180
|
+
// Check for false positives
|
|
181
|
+
if (pattern.falsePositivePatterns) {
|
|
182
|
+
const isFalsePositive = pattern.falsePositivePatterns.some(fp => fp.test(match[0]));
|
|
183
|
+
if (isFalsePositive) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Get context around the match
|
|
188
|
+
const contextStart = Math.max(0, lineIndex - 2);
|
|
189
|
+
const contextEnd = Math.min(lines.length, lineIndex + 3);
|
|
190
|
+
const context = lines.slice(contextStart, contextEnd).join('\n');
|
|
191
|
+
// Calculate confidence based on context and pattern specificity
|
|
192
|
+
const confidence = calculateConfidence(pattern, match[0], context, filePath);
|
|
193
|
+
// Generate suggestions
|
|
194
|
+
const suggestions = generateSuggestions(pattern, filePath);
|
|
195
|
+
matches.push({
|
|
196
|
+
pattern,
|
|
197
|
+
match: match[0],
|
|
198
|
+
line: lineNumber,
|
|
199
|
+
column: match.index || 0,
|
|
200
|
+
context,
|
|
201
|
+
confidence,
|
|
202
|
+
suggestions
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Sort matches by severity and confidence
|
|
208
|
+
matches.sort((a, b) => {
|
|
209
|
+
const severityOrder = { critical: 4, high: 3, medium: 2, low: 1 };
|
|
210
|
+
const severityDiff = severityOrder[b.pattern.severity] - severityOrder[a.pattern.severity];
|
|
211
|
+
if (severityDiff !== 0)
|
|
212
|
+
return severityDiff;
|
|
213
|
+
return b.confidence - a.confidence;
|
|
214
|
+
});
|
|
215
|
+
// Generate summary
|
|
216
|
+
const summary = {
|
|
217
|
+
criticalCount: matches.filter(m => m.pattern.severity === 'critical').length,
|
|
218
|
+
highCount: matches.filter(m => m.pattern.severity === 'high').length,
|
|
219
|
+
mediumCount: matches.filter(m => m.pattern.severity === 'medium').length,
|
|
220
|
+
lowCount: matches.filter(m => m.pattern.severity === 'low').length,
|
|
221
|
+
totalCount: matches.length
|
|
222
|
+
};
|
|
223
|
+
// Generate recommendations
|
|
224
|
+
const recommendations = generateRecommendations(matches);
|
|
225
|
+
return {
|
|
226
|
+
filePath,
|
|
227
|
+
hasIssues: matches.length > 0,
|
|
228
|
+
matches,
|
|
229
|
+
summary,
|
|
230
|
+
recommendations
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Calculate confidence score for a match
|
|
235
|
+
*/
|
|
236
|
+
function calculateConfidence(pattern, match, context, filePath) {
|
|
237
|
+
let confidence = 0.5; // Base confidence
|
|
238
|
+
// Pattern-specific confidence adjustments
|
|
239
|
+
if (pattern.name.includes('github') || pattern.name.includes('aws')) {
|
|
240
|
+
confidence += 0.3; // Service-specific patterns are more reliable
|
|
241
|
+
}
|
|
242
|
+
if (pattern.severity === 'critical') {
|
|
243
|
+
confidence += 0.2;
|
|
244
|
+
}
|
|
245
|
+
// Context-based adjustments
|
|
246
|
+
if (context.toLowerCase().includes('example') || context.toLowerCase().includes('test')) {
|
|
247
|
+
confidence -= 0.3; // Likely example/test data
|
|
248
|
+
}
|
|
249
|
+
if (context.toLowerCase().includes('placeholder') || context.toLowerCase().includes('dummy')) {
|
|
250
|
+
confidence -= 0.4; // Likely placeholder
|
|
251
|
+
}
|
|
252
|
+
// File-based adjustments
|
|
253
|
+
const fileName = basename(filePath);
|
|
254
|
+
const fileExt = extname(filePath);
|
|
255
|
+
if (fileName.includes('example') || fileName.includes('test') || fileName.includes('demo')) {
|
|
256
|
+
confidence -= 0.2;
|
|
257
|
+
}
|
|
258
|
+
if (fileExt === '.md' || fileExt === '.txt') {
|
|
259
|
+
confidence -= 0.1; // Documentation files are less likely to contain real secrets
|
|
260
|
+
}
|
|
261
|
+
if (fileExt === '.env' || fileName === '.env' || fileName.includes('config')) {
|
|
262
|
+
confidence += 0.2; // Config files are more likely to contain real secrets
|
|
263
|
+
}
|
|
264
|
+
// Match length adjustments
|
|
265
|
+
if (match.length > 50) {
|
|
266
|
+
confidence += 0.1; // Longer matches are more likely to be real
|
|
267
|
+
}
|
|
268
|
+
return Math.max(0, Math.min(1, confidence));
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Generate suggestions for handling sensitive content
|
|
272
|
+
*/
|
|
273
|
+
function generateSuggestions(pattern, filePath) {
|
|
274
|
+
const suggestions = [];
|
|
275
|
+
const fileName = basename(filePath);
|
|
276
|
+
switch (pattern.category) {
|
|
277
|
+
case 'credentials':
|
|
278
|
+
suggestions.push('Move to environment variables');
|
|
279
|
+
suggestions.push('Use a secrets management service');
|
|
280
|
+
suggestions.push('Add to .gitignore and use .env.example');
|
|
281
|
+
if (pattern.severity === 'critical') {
|
|
282
|
+
suggestions.push('🚨 ROTATE THIS CREDENTIAL IMMEDIATELY');
|
|
283
|
+
}
|
|
284
|
+
break;
|
|
285
|
+
case 'secrets':
|
|
286
|
+
suggestions.push('Store in secure environment variables');
|
|
287
|
+
suggestions.push('Use a key management service');
|
|
288
|
+
suggestions.push('Consider using encrypted configuration');
|
|
289
|
+
break;
|
|
290
|
+
case 'personal':
|
|
291
|
+
suggestions.push('Replace with placeholder values');
|
|
292
|
+
suggestions.push('Use fake data for examples');
|
|
293
|
+
suggestions.push('Move to private configuration');
|
|
294
|
+
break;
|
|
295
|
+
case 'infrastructure':
|
|
296
|
+
suggestions.push('Use configuration variables');
|
|
297
|
+
suggestions.push('Consider if this information should be public');
|
|
298
|
+
suggestions.push('Use localhost or example.com for demos');
|
|
299
|
+
break;
|
|
300
|
+
case 'development':
|
|
301
|
+
suggestions.push('Remove debug logging');
|
|
302
|
+
suggestions.push('Use proper logging framework');
|
|
303
|
+
suggestions.push('Consider development vs production builds');
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
// File-specific suggestions
|
|
307
|
+
if (fileName.includes('example') || fileName.includes('demo')) {
|
|
308
|
+
suggestions.push('Use obviously fake placeholder values');
|
|
309
|
+
}
|
|
310
|
+
if (fileName.includes('test')) {
|
|
311
|
+
suggestions.push('Use test-specific dummy data');
|
|
312
|
+
}
|
|
313
|
+
return suggestions;
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Generate overall recommendations
|
|
317
|
+
*/
|
|
318
|
+
function generateRecommendations(matches) {
|
|
319
|
+
const recommendations = [];
|
|
320
|
+
if (matches.length === 0) {
|
|
321
|
+
return ['No sensitive content detected'];
|
|
322
|
+
}
|
|
323
|
+
const criticalCount = matches.filter(m => m.pattern.severity === 'critical').length;
|
|
324
|
+
const highCount = matches.filter(m => m.pattern.severity === 'high').length;
|
|
325
|
+
if (criticalCount > 0) {
|
|
326
|
+
recommendations.push(`🚨 ${criticalCount} CRITICAL security issue(s) found - DO NOT COMMIT`);
|
|
327
|
+
recommendations.push('Rotate any exposed credentials immediately');
|
|
328
|
+
}
|
|
329
|
+
if (highCount > 0) {
|
|
330
|
+
recommendations.push(`⚠️ ${highCount} HIGH severity issue(s) found`);
|
|
331
|
+
recommendations.push('Review and secure sensitive information');
|
|
332
|
+
}
|
|
333
|
+
// General recommendations
|
|
334
|
+
recommendations.push('Use environment variables for sensitive configuration');
|
|
335
|
+
recommendations.push('Consider using a secrets management service');
|
|
336
|
+
recommendations.push('Add sensitive files to .gitignore');
|
|
337
|
+
recommendations.push('Use the content masking tool to sanitize content');
|
|
338
|
+
return recommendations;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Integration with existing content masking tool
|
|
342
|
+
*/
|
|
343
|
+
export async function integrateWithContentMasking(filePath, content) {
|
|
344
|
+
// Get our enhanced analysis
|
|
345
|
+
const sensitiveAnalysis = await analyzeSensitiveContent(filePath, content);
|
|
346
|
+
// Try to use existing content masking tool
|
|
347
|
+
let maskingPrompt;
|
|
348
|
+
let existingRecommendations = [];
|
|
349
|
+
try {
|
|
350
|
+
const { analyzeContentSecurity } = await import('../tools/content-masking-tool.js');
|
|
351
|
+
const maskingResult = await analyzeContentSecurity({
|
|
352
|
+
content,
|
|
353
|
+
contentType: getContentType(filePath),
|
|
354
|
+
enhancedMode: false,
|
|
355
|
+
knowledgeEnhancement: false
|
|
356
|
+
});
|
|
357
|
+
// Extract prompt and recommendations from the result
|
|
358
|
+
if (maskingResult.content && maskingResult.content[0]) {
|
|
359
|
+
const resultText = maskingResult.content[0].text;
|
|
360
|
+
const promptMatch = resultText.match(/## AI.*Prompt\n\n(.*?)(?=\n##|$)/s);
|
|
361
|
+
if (promptMatch) {
|
|
362
|
+
maskingPrompt = promptMatch[1];
|
|
363
|
+
}
|
|
364
|
+
// Extract existing recommendations
|
|
365
|
+
const recMatch = resultText.match(/## Next Steps\n\n(.*?)(?=\n##|$)/s);
|
|
366
|
+
if (recMatch) {
|
|
367
|
+
existingRecommendations = recMatch[1].split('\n').filter((line) => line.trim());
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
catch (error) {
|
|
372
|
+
console.warn('Could not integrate with existing content masking tool:', error);
|
|
373
|
+
}
|
|
374
|
+
// Combine recommendations
|
|
375
|
+
const combinedRecommendations = [
|
|
376
|
+
...sensitiveAnalysis.recommendations,
|
|
377
|
+
...existingRecommendations
|
|
378
|
+
].filter((rec, index, arr) => arr.indexOf(rec) === index); // Remove duplicates
|
|
379
|
+
return {
|
|
380
|
+
sensitiveAnalysis,
|
|
381
|
+
...(maskingPrompt && { maskingPrompt }),
|
|
382
|
+
combinedRecommendations
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Get content type for file
|
|
387
|
+
*/
|
|
388
|
+
function getContentType(filePath) {
|
|
389
|
+
const ext = extname(filePath).toLowerCase();
|
|
390
|
+
if (['.js', '.ts', '.py', '.java', '.cpp', '.c', '.go', '.rs', '.rb', '.php'].includes(ext)) {
|
|
391
|
+
return 'code';
|
|
392
|
+
}
|
|
393
|
+
if (['.md', '.txt', '.rst', '.doc', '.docx'].includes(ext)) {
|
|
394
|
+
return 'documentation';
|
|
395
|
+
}
|
|
396
|
+
if (['.json', '.yaml', '.yml', '.ini', '.conf', '.config', '.env'].includes(ext)) {
|
|
397
|
+
return 'configuration';
|
|
398
|
+
}
|
|
399
|
+
if (['.log', '.out', '.err'].includes(ext)) {
|
|
400
|
+
return 'logs';
|
|
401
|
+
}
|
|
402
|
+
return 'general';
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Quick check for obviously sensitive files
|
|
406
|
+
*/
|
|
407
|
+
export function isObviouslySensitive(filePath) {
|
|
408
|
+
const fileName = basename(filePath).toLowerCase();
|
|
409
|
+
const sensitiveFilePatterns = [
|
|
410
|
+
/^\.env$/,
|
|
411
|
+
/^\.env\./,
|
|
412
|
+
/secrets?\./,
|
|
413
|
+
/credentials?\./,
|
|
414
|
+
/private.*key/,
|
|
415
|
+
/id_rsa$/,
|
|
416
|
+
/id_ed25519$/,
|
|
417
|
+
/\.pem$/,
|
|
418
|
+
/\.p12$/,
|
|
419
|
+
/\.pfx$/,
|
|
420
|
+
/keystore/,
|
|
421
|
+
/truststore/
|
|
422
|
+
];
|
|
423
|
+
return sensitiveFilePatterns.some(pattern => pattern.test(fileName));
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Create a custom sensitive pattern
|
|
427
|
+
*/
|
|
428
|
+
export function createSensitivePattern(name, pattern, description, category, severity) {
|
|
429
|
+
return {
|
|
430
|
+
name,
|
|
431
|
+
pattern: new RegExp(pattern, 'g'),
|
|
432
|
+
description,
|
|
433
|
+
category,
|
|
434
|
+
severity
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
//# sourceMappingURL=enhanced-sensitive-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhanced-sensitive-detector.js","sourceRoot":"","sources":["../../../src/utils/enhanced-sensitive-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive approval workflow for smart git push
|
|
3
|
+
*
|
|
4
|
+
* Handles user interaction for approving/rejecting files with issues
|
|
5
|
+
*/
|
|
6
|
+
export interface ApprovalItem {
|
|
7
|
+
filePath: string;
|
|
8
|
+
issues: ApprovalIssue[];
|
|
9
|
+
suggestions: string[];
|
|
10
|
+
severity: 'error' | 'warning' | 'info';
|
|
11
|
+
allowedInLocation: boolean;
|
|
12
|
+
confidence: number;
|
|
13
|
+
}
|
|
14
|
+
export interface ApprovalIssue {
|
|
15
|
+
type: 'sensitive-content' | 'llm-artifact' | 'location-violation' | 'temporary-file' | 'wrong-location';
|
|
16
|
+
message: string;
|
|
17
|
+
severity: 'error' | 'warning' | 'info';
|
|
18
|
+
pattern?: string;
|
|
19
|
+
line?: number;
|
|
20
|
+
context?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ApprovalResult {
|
|
23
|
+
approved: string[];
|
|
24
|
+
rejected: string[];
|
|
25
|
+
moved: Array<{
|
|
26
|
+
from: string;
|
|
27
|
+
to: string;
|
|
28
|
+
}>;
|
|
29
|
+
ignored: string[];
|
|
30
|
+
actions: ApprovalAction[];
|
|
31
|
+
proceed: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface ApprovalAction {
|
|
34
|
+
type: 'approve' | 'reject' | 'move' | 'ignore' | 'edit';
|
|
35
|
+
filePath: string;
|
|
36
|
+
target?: string | undefined;
|
|
37
|
+
reason?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface ApprovalOptions {
|
|
40
|
+
interactiveMode: boolean;
|
|
41
|
+
autoApproveInfo: boolean;
|
|
42
|
+
autoRejectErrors: boolean;
|
|
43
|
+
dryRun: boolean;
|
|
44
|
+
batchMode: boolean;
|
|
45
|
+
timeout?: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Main interactive approval function
|
|
49
|
+
*/
|
|
50
|
+
export declare function handleInteractiveApproval(items: ApprovalItem[], options: ApprovalOptions): Promise<ApprovalResult>;
|
|
51
|
+
/**
|
|
52
|
+
* Batch approval for similar files
|
|
53
|
+
*/
|
|
54
|
+
export declare function batchApproval(items: ApprovalItem[], action: ApprovalAction, criteria: {
|
|
55
|
+
sameSeverity?: boolean;
|
|
56
|
+
sameIssueType?: boolean;
|
|
57
|
+
samePattern?: boolean;
|
|
58
|
+
}): ApprovalAction[];
|
|
59
|
+
/**
|
|
60
|
+
* Save approval preferences for future use
|
|
61
|
+
*/
|
|
62
|
+
export declare function saveApprovalPreferences(actions: ApprovalAction[], configPath?: string): void;
|
|
63
|
+
//# sourceMappingURL=interactive-approval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive-approval.d.ts","sourceRoot":"","sources":["../../../src/utils/interactive-approval.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,mBAAmB,GAAG,cAAc,GAAG,oBAAoB,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;IACxG,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,YAAY,EAAE,EACrB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC,CAuEzB;AAyXD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,YAAY,EAAE,EACrB,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE;IACR,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GACA,cAAc,EAAE,CAkClB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,cAAc,EAAE,EACzB,UAAU,GAAE,MAAmC,GAC9C,IAAI,CAiBN"}
|