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,526 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Git Push MCP Tool
|
|
3
|
+
*
|
|
4
|
+
* Intelligent git push with sensitive content and LLM artifact filtering
|
|
5
|
+
* Leverages existing content security tools and git CLI integration
|
|
6
|
+
*/
|
|
7
|
+
import { McpAdrError } from '../types/index.js';
|
|
8
|
+
import { execSync } from 'child_process';
|
|
9
|
+
import { readFileSync, existsSync, statSync } from 'fs';
|
|
10
|
+
import { join, basename } from 'path';
|
|
11
|
+
/**
|
|
12
|
+
* Main smart git push function
|
|
13
|
+
*/
|
|
14
|
+
export async function smartGitPush(args) {
|
|
15
|
+
const { branch, message, skipValidation = false, allowedArtifacts = [], sensitivityLevel = 'moderate', interactiveMode = true, dryRun = false, projectPath = process.cwd(), checkReleaseReadiness = false, releaseType = 'minor' } = args;
|
|
16
|
+
try {
|
|
17
|
+
// Step 1: Check release readiness if requested
|
|
18
|
+
let releaseReadinessResult = null;
|
|
19
|
+
if (checkReleaseReadiness) {
|
|
20
|
+
const { analyzeReleaseReadiness } = await import('../utils/release-readiness-detector.js');
|
|
21
|
+
releaseReadinessResult = await analyzeReleaseReadiness({
|
|
22
|
+
projectPath,
|
|
23
|
+
releaseType,
|
|
24
|
+
includeAnalysis: true
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
// Step 2: Get staged files using git CLI
|
|
28
|
+
const stagedFiles = await getStagedFiles(projectPath);
|
|
29
|
+
if (stagedFiles.length === 0) {
|
|
30
|
+
let responseText = `# Smart Git Push - No Changes
|
|
31
|
+
|
|
32
|
+
## Status
|
|
33
|
+
No staged files found. Use \`git add\` to stage files before pushing.
|
|
34
|
+
|
|
35
|
+
## Available Commands
|
|
36
|
+
- \`git add .\` - Stage all changes
|
|
37
|
+
- \`git add <file>\` - Stage specific file
|
|
38
|
+
- \`git status\` - Check current status
|
|
39
|
+
`;
|
|
40
|
+
// Add release readiness info if checked
|
|
41
|
+
if (releaseReadinessResult) {
|
|
42
|
+
responseText += `
|
|
43
|
+
## Release Readiness Analysis
|
|
44
|
+
${releaseReadinessResult.summary}
|
|
45
|
+
|
|
46
|
+
### Recommendations
|
|
47
|
+
${releaseReadinessResult.recommendations.map(r => `- ${r}`).join('\n')}
|
|
48
|
+
|
|
49
|
+
${releaseReadinessResult.isReady ?
|
|
50
|
+
'✅ **Project is ready for release!** Consider creating a release after staging files.' :
|
|
51
|
+
'❌ **Project is not ready for release.** Address blockers before proceeding.'}
|
|
52
|
+
`;
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
content: [{
|
|
56
|
+
type: 'text',
|
|
57
|
+
text: responseText
|
|
58
|
+
}]
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// Step 3: Analyze staged files if validation is enabled
|
|
62
|
+
let validationResults = [];
|
|
63
|
+
if (!skipValidation) {
|
|
64
|
+
validationResults = await validateStagedFiles(stagedFiles, {
|
|
65
|
+
sensitivityLevel,
|
|
66
|
+
allowedArtifacts,
|
|
67
|
+
projectPath
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
// Step 4: Handle interactive approval if needed
|
|
71
|
+
const issues = validationResults.filter(r => r.issues.length > 0);
|
|
72
|
+
// Check if release readiness should block push
|
|
73
|
+
let releaseReadinessBlocked = false;
|
|
74
|
+
if (releaseReadinessResult && !releaseReadinessResult.isReady) {
|
|
75
|
+
const criticalBlockers = releaseReadinessResult.blockers.filter(b => b.severity === 'error');
|
|
76
|
+
if (criticalBlockers.length > 0) {
|
|
77
|
+
releaseReadinessBlocked = true;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if ((issues.length > 0 || releaseReadinessBlocked) && interactiveMode) {
|
|
81
|
+
const approvalResult = await handleInteractiveApproval(issues, dryRun);
|
|
82
|
+
if (!approvalResult.proceed) {
|
|
83
|
+
let cancelText = `# Smart Git Push - Cancelled
|
|
84
|
+
|
|
85
|
+
## User Decision
|
|
86
|
+
Push cancelled due to validation issues.
|
|
87
|
+
|
|
88
|
+
## Issues Found
|
|
89
|
+
${issues.map(issue => `
|
|
90
|
+
### ${issue.file}
|
|
91
|
+
${issue.issues.map(i => `- **${i.severity.toUpperCase()}**: ${i.message}`).join('\n')}
|
|
92
|
+
|
|
93
|
+
**Suggestions:**
|
|
94
|
+
${issue.suggestions.map(s => `- ${s}`).join('\n')}
|
|
95
|
+
`).join('\n')}
|
|
96
|
+
`;
|
|
97
|
+
// Add release readiness info if checked and blocked
|
|
98
|
+
if (releaseReadinessResult && releaseReadinessBlocked) {
|
|
99
|
+
cancelText += `
|
|
100
|
+
## Release Readiness Issues
|
|
101
|
+
${releaseReadinessResult.summary}
|
|
102
|
+
|
|
103
|
+
### Critical Blockers
|
|
104
|
+
${releaseReadinessResult.blockers.filter(b => b.severity === 'error').map(b => `- **${b.type}**: ${b.message}`).join('\n')}
|
|
105
|
+
|
|
106
|
+
### Recommendations
|
|
107
|
+
${releaseReadinessResult.recommendations.map(r => `- ${r}`).join('\n')}
|
|
108
|
+
`;
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
content: [{
|
|
112
|
+
type: 'text',
|
|
113
|
+
text: cancelText
|
|
114
|
+
}]
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Step 5: Execute git push if not dry run
|
|
119
|
+
if (!dryRun) {
|
|
120
|
+
const pushResult = await executePush(projectPath, branch, message);
|
|
121
|
+
let successText = `# Smart Git Push - Success ✅
|
|
122
|
+
|
|
123
|
+
## Push Details
|
|
124
|
+
- **Branch**: ${branch || 'current'}
|
|
125
|
+
- **Files**: ${stagedFiles.length} staged files
|
|
126
|
+
- **Validation**: ${skipValidation ? 'Skipped' : 'Completed'}
|
|
127
|
+
- **Issues Found**: ${issues.length}
|
|
128
|
+
- **Sensitivity Level**: ${sensitivityLevel}
|
|
129
|
+
${checkReleaseReadiness ? `- **Release Readiness**: ${releaseReadinessResult?.isReady ? '✅ Ready' : '❌ Not Ready'}` : ''}
|
|
130
|
+
|
|
131
|
+
## Files Pushed
|
|
132
|
+
${stagedFiles.map(f => `- ${f.path} (${f.status})`).join('\n')}
|
|
133
|
+
|
|
134
|
+
${issues.length > 0 ? `
|
|
135
|
+
## Validation Issues (Approved)
|
|
136
|
+
${issues.map(issue => `
|
|
137
|
+
### ${issue.file}
|
|
138
|
+
${issue.issues.map(i => `- **${i.severity.toUpperCase()}**: ${i.message}`).join('\n')}
|
|
139
|
+
`).join('\n')}
|
|
140
|
+
` : ''}
|
|
141
|
+
|
|
142
|
+
${releaseReadinessResult ? `
|
|
143
|
+
## Release Readiness Analysis
|
|
144
|
+
${releaseReadinessResult.summary}
|
|
145
|
+
|
|
146
|
+
### Post-Push Recommendations
|
|
147
|
+
${releaseReadinessResult.recommendations.map(r => `- ${r}`).join('\n')}
|
|
148
|
+
|
|
149
|
+
${releaseReadinessResult.isReady ?
|
|
150
|
+
'🎉 **Congratulations!** This push completed a release-ready state. Consider creating a release tag.' :
|
|
151
|
+
'📋 **Next Steps**: Address remaining blockers to achieve release readiness.'}
|
|
152
|
+
` : ''}
|
|
153
|
+
|
|
154
|
+
## Git Output
|
|
155
|
+
\`\`\`
|
|
156
|
+
${pushResult.output}
|
|
157
|
+
\`\`\`
|
|
158
|
+
|
|
159
|
+
## Next Steps
|
|
160
|
+
- Monitor CI/CD pipeline for build status
|
|
161
|
+
- Review any deployment processes
|
|
162
|
+
- Check for any post-push hooks or workflows
|
|
163
|
+
${releaseReadinessResult?.isReady ? '- Consider creating a release tag or publishing' : ''}
|
|
164
|
+
`;
|
|
165
|
+
return {
|
|
166
|
+
content: [{
|
|
167
|
+
type: 'text',
|
|
168
|
+
text: successText
|
|
169
|
+
}]
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
// Dry run - show what would happen
|
|
174
|
+
let dryRunText = `# Smart Git Push - Dry Run 🔍
|
|
175
|
+
|
|
176
|
+
## Analysis Complete
|
|
177
|
+
- **Files to Push**: ${stagedFiles.length}
|
|
178
|
+
- **Validation Issues**: ${issues.length}
|
|
179
|
+
- **Sensitivity Level**: ${sensitivityLevel}
|
|
180
|
+
- **Would Push to**: ${branch || 'current branch'}
|
|
181
|
+
${checkReleaseReadiness ? `- **Release Readiness**: ${releaseReadinessResult?.isReady ? '✅ Ready' : '❌ Not Ready'}` : ''}
|
|
182
|
+
|
|
183
|
+
## Staged Files
|
|
184
|
+
${stagedFiles.map(f => `- ${f.path} (${f.status}) - ${f.size} bytes`).join('\n')}
|
|
185
|
+
|
|
186
|
+
${issues.length > 0 ? `
|
|
187
|
+
## Validation Issues Found
|
|
188
|
+
${issues.map(issue => `
|
|
189
|
+
### ${issue.file}
|
|
190
|
+
${issue.issues.map(i => `- **${i.severity.toUpperCase()}**: ${i.message}`).join('\n')}
|
|
191
|
+
|
|
192
|
+
**Suggestions:**
|
|
193
|
+
${issue.suggestions.map(s => `- ${s}`).join('\n')}
|
|
194
|
+
`).join('\n')}
|
|
195
|
+
` : '## ✅ No Validation Issues Found'}
|
|
196
|
+
|
|
197
|
+
${releaseReadinessResult ? `
|
|
198
|
+
## Release Readiness Analysis
|
|
199
|
+
${releaseReadinessResult.summary}
|
|
200
|
+
|
|
201
|
+
### Pre-Push Recommendations
|
|
202
|
+
${releaseReadinessResult.recommendations.map(r => `- ${r}`).join('\n')}
|
|
203
|
+
|
|
204
|
+
${releaseReadinessResult.isReady ?
|
|
205
|
+
'🎉 **Ready for Release!** This push would complete all release requirements.' :
|
|
206
|
+
'📋 **Release Blockers**: Address these issues before considering this a release.'}
|
|
207
|
+
` : ''}
|
|
208
|
+
|
|
209
|
+
## Command to Execute
|
|
210
|
+
\`\`\`bash
|
|
211
|
+
# Run without dry run to actually push
|
|
212
|
+
git push${branch ? ` origin ${branch}` : ''}
|
|
213
|
+
\`\`\`
|
|
214
|
+
|
|
215
|
+
**Note:** This was a dry run. No files were actually pushed.
|
|
216
|
+
`;
|
|
217
|
+
return {
|
|
218
|
+
content: [{
|
|
219
|
+
type: 'text',
|
|
220
|
+
text: dryRunText
|
|
221
|
+
}]
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
throw new McpAdrError(`Smart git push failed: ${error instanceof Error ? error.message : String(error)}`, 'GIT_PUSH_ERROR');
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Get staged files using git CLI
|
|
231
|
+
*/
|
|
232
|
+
async function getStagedFiles(projectPath) {
|
|
233
|
+
try {
|
|
234
|
+
// Get staged files with status
|
|
235
|
+
const gitOutput = execSync('git diff --cached --name-status', {
|
|
236
|
+
cwd: projectPath,
|
|
237
|
+
encoding: 'utf8'
|
|
238
|
+
});
|
|
239
|
+
if (!gitOutput.trim()) {
|
|
240
|
+
return [];
|
|
241
|
+
}
|
|
242
|
+
const files = [];
|
|
243
|
+
const lines = gitOutput.trim().split('\n');
|
|
244
|
+
for (const line of lines) {
|
|
245
|
+
const [status, ...pathParts] = line.split('\t');
|
|
246
|
+
const path = pathParts.join('\t'); // Handle filenames with tabs
|
|
247
|
+
const fullPath = join(projectPath, path);
|
|
248
|
+
let content;
|
|
249
|
+
let size = 0;
|
|
250
|
+
// Read file content if it exists (not for deleted files)
|
|
251
|
+
if (status !== 'D' && existsSync(fullPath)) {
|
|
252
|
+
try {
|
|
253
|
+
const stats = statSync(fullPath);
|
|
254
|
+
size = stats.size;
|
|
255
|
+
// Only read content for small files (< 100KB)
|
|
256
|
+
if (size < 100 * 1024) {
|
|
257
|
+
content = readFileSync(fullPath, 'utf8');
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
catch (err) {
|
|
261
|
+
console.error(`Warning: Could not read file ${path}:`, err);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
files.push({
|
|
265
|
+
path,
|
|
266
|
+
status: mapGitStatus(status || 'M'),
|
|
267
|
+
content: content || '',
|
|
268
|
+
size
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
return files;
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
throw new McpAdrError(`Failed to get staged files: ${error instanceof Error ? error.message : String(error)}`, 'GIT_STATUS_ERROR');
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Map git status codes to readable names
|
|
279
|
+
*/
|
|
280
|
+
function mapGitStatus(status) {
|
|
281
|
+
switch (status) {
|
|
282
|
+
case 'A': return 'added';
|
|
283
|
+
case 'M': return 'modified';
|
|
284
|
+
case 'D': return 'deleted';
|
|
285
|
+
case 'R': return 'renamed';
|
|
286
|
+
default: return 'modified';
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Validate staged files for issues
|
|
291
|
+
*/
|
|
292
|
+
async function validateStagedFiles(files, options) {
|
|
293
|
+
const results = [];
|
|
294
|
+
for (const file of files) {
|
|
295
|
+
const issues = [];
|
|
296
|
+
const suggestions = [];
|
|
297
|
+
// Skip validation for deleted files
|
|
298
|
+
if (file.status === 'deleted') {
|
|
299
|
+
results.push({ file: file.path, issues, suggestions, approved: true });
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
// 1. Check for sensitive content
|
|
303
|
+
if (file.content) {
|
|
304
|
+
const sensitiveIssues = await checkSensitiveContent(file.content, file.path);
|
|
305
|
+
issues.push(...sensitiveIssues);
|
|
306
|
+
}
|
|
307
|
+
// 2. Check for LLM artifacts
|
|
308
|
+
const llmIssues = await checkLLMArtifacts(file.path, file.content);
|
|
309
|
+
issues.push(...llmIssues);
|
|
310
|
+
// 3. Check location rules
|
|
311
|
+
const locationIssues = await checkLocationRules(file.path, options.allowedArtifacts);
|
|
312
|
+
issues.push(...locationIssues);
|
|
313
|
+
// 4. Generate suggestions
|
|
314
|
+
const fileSuggestions = generateSuggestions(file.path, issues);
|
|
315
|
+
suggestions.push(...fileSuggestions);
|
|
316
|
+
results.push({
|
|
317
|
+
file: file.path,
|
|
318
|
+
issues,
|
|
319
|
+
suggestions,
|
|
320
|
+
approved: issues.length === 0 || issues.every(i => i.severity === 'info')
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
return results;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Check for sensitive content using enhanced sensitive detector
|
|
327
|
+
*/
|
|
328
|
+
async function checkSensitiveContent(content, filePath) {
|
|
329
|
+
try {
|
|
330
|
+
// Use enhanced sensitive detector
|
|
331
|
+
const { analyzeSensitiveContent } = await import('../utils/enhanced-sensitive-detector.js');
|
|
332
|
+
const result = await analyzeSensitiveContent(filePath, content);
|
|
333
|
+
// Convert to ValidationIssue format
|
|
334
|
+
const issues = [];
|
|
335
|
+
for (const match of result.matches) {
|
|
336
|
+
issues.push({
|
|
337
|
+
type: 'sensitive-content',
|
|
338
|
+
severity: match.pattern.severity === 'critical' ? 'error' :
|
|
339
|
+
match.pattern.severity === 'high' ? 'error' :
|
|
340
|
+
match.pattern.severity === 'medium' ? 'warning' : 'info',
|
|
341
|
+
message: `${match.pattern.description}: ${match.match}`,
|
|
342
|
+
pattern: match.pattern.name,
|
|
343
|
+
line: match.line
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
return issues;
|
|
347
|
+
}
|
|
348
|
+
catch (error) {
|
|
349
|
+
console.error('Sensitive content check failed:', error);
|
|
350
|
+
return [];
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Check for LLM artifacts using enhanced detector
|
|
355
|
+
*/
|
|
356
|
+
async function checkLLMArtifacts(filePath, content) {
|
|
357
|
+
try {
|
|
358
|
+
// Use enhanced LLM artifact detector
|
|
359
|
+
const { detectLLMArtifacts } = await import('../utils/llm-artifact-detector.js');
|
|
360
|
+
const result = detectLLMArtifacts(filePath, content || '');
|
|
361
|
+
// Convert to ValidationIssue format
|
|
362
|
+
const issues = [];
|
|
363
|
+
for (const match of result.matches) {
|
|
364
|
+
const issue = {
|
|
365
|
+
type: 'llm-artifact',
|
|
366
|
+
severity: match.pattern.severity === 'error' ? 'error' :
|
|
367
|
+
match.pattern.severity === 'warning' ? 'warning' : 'info',
|
|
368
|
+
message: `${match.pattern.description}: ${match.match}`,
|
|
369
|
+
pattern: match.pattern.name
|
|
370
|
+
};
|
|
371
|
+
if (match.line !== undefined) {
|
|
372
|
+
issue.line = match.line;
|
|
373
|
+
}
|
|
374
|
+
issues.push(issue);
|
|
375
|
+
}
|
|
376
|
+
return issues;
|
|
377
|
+
}
|
|
378
|
+
catch (error) {
|
|
379
|
+
console.error('LLM artifact check failed:', error);
|
|
380
|
+
return [];
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Check location rules using enhanced location filter
|
|
385
|
+
*/
|
|
386
|
+
async function checkLocationRules(filePath, allowedArtifacts) {
|
|
387
|
+
try {
|
|
388
|
+
// Use enhanced location filter
|
|
389
|
+
const { validateFileLocation } = await import('../utils/location-filter.js');
|
|
390
|
+
// Skip if explicitly allowed
|
|
391
|
+
if (allowedArtifacts.includes(basename(filePath)) || allowedArtifacts.includes(filePath)) {
|
|
392
|
+
return [];
|
|
393
|
+
}
|
|
394
|
+
const result = validateFileLocation(filePath);
|
|
395
|
+
if (!result.isValid) {
|
|
396
|
+
return [{
|
|
397
|
+
type: 'wrong-location',
|
|
398
|
+
severity: result.severity === 'error' ? 'error' :
|
|
399
|
+
result.severity === 'warning' ? 'warning' : 'info',
|
|
400
|
+
message: result.message,
|
|
401
|
+
pattern: result.rule?.name || 'location-rule'
|
|
402
|
+
}];
|
|
403
|
+
}
|
|
404
|
+
return [];
|
|
405
|
+
}
|
|
406
|
+
catch (error) {
|
|
407
|
+
console.error('Location rule check failed:', error);
|
|
408
|
+
return [];
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Generate suggestions for issues
|
|
413
|
+
*/
|
|
414
|
+
function generateSuggestions(filePath, issues) {
|
|
415
|
+
const suggestions = [];
|
|
416
|
+
const fileName = basename(filePath);
|
|
417
|
+
for (const issue of issues) {
|
|
418
|
+
switch (issue.type) {
|
|
419
|
+
case 'sensitive-content':
|
|
420
|
+
suggestions.push(`Use content masking tool: analyze_content_security`);
|
|
421
|
+
suggestions.push(`Move sensitive data to environment variables`);
|
|
422
|
+
suggestions.push(`Add ${filePath} to .gitignore if it's config`);
|
|
423
|
+
break;
|
|
424
|
+
case 'llm-artifact':
|
|
425
|
+
suggestions.push(`Move ${fileName} to tests/ directory`);
|
|
426
|
+
suggestions.push(`Move ${fileName} to scripts/ directory`);
|
|
427
|
+
suggestions.push(`Add ${filePath} to .gitignore`);
|
|
428
|
+
suggestions.push(`Remove file if it's temporary`);
|
|
429
|
+
break;
|
|
430
|
+
case 'wrong-location':
|
|
431
|
+
suggestions.push(`Move ${fileName} to tests/ directory`);
|
|
432
|
+
suggestions.push(`Move ${fileName} to scripts/ directory`);
|
|
433
|
+
suggestions.push(`Move ${fileName} to tools/ directory`);
|
|
434
|
+
break;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
return [...new Set(suggestions)]; // Remove duplicates
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Handle interactive approval using enhanced approval system
|
|
441
|
+
*/
|
|
442
|
+
async function handleInteractiveApproval(issues, dryRun) {
|
|
443
|
+
try {
|
|
444
|
+
// Use enhanced interactive approval
|
|
445
|
+
const { handleInteractiveApproval } = await import('../utils/interactive-approval.js');
|
|
446
|
+
// Convert ValidationResult to ApprovalItem format
|
|
447
|
+
const approvalItems = issues.map(issue => ({
|
|
448
|
+
filePath: issue.file,
|
|
449
|
+
issues: issue.issues.map(i => ({
|
|
450
|
+
type: i.type,
|
|
451
|
+
message: i.message,
|
|
452
|
+
severity: i.severity,
|
|
453
|
+
...(i.pattern && { pattern: i.pattern }),
|
|
454
|
+
...(i.line && { line: i.line })
|
|
455
|
+
})),
|
|
456
|
+
suggestions: issue.suggestions,
|
|
457
|
+
severity: issue.issues.reduce((highest, i) => {
|
|
458
|
+
const severityOrder = { error: 3, warning: 2, info: 1 };
|
|
459
|
+
return severityOrder[i.severity] > severityOrder[highest] ? i.severity : highest;
|
|
460
|
+
}, 'info'),
|
|
461
|
+
allowedInLocation: true, // Simplified for now
|
|
462
|
+
confidence: 0.8 // Default confidence
|
|
463
|
+
}));
|
|
464
|
+
const options = {
|
|
465
|
+
interactiveMode: true,
|
|
466
|
+
autoApproveInfo: false,
|
|
467
|
+
autoRejectErrors: false,
|
|
468
|
+
dryRun,
|
|
469
|
+
batchMode: false
|
|
470
|
+
};
|
|
471
|
+
const result = await handleInteractiveApproval(approvalItems, options);
|
|
472
|
+
return {
|
|
473
|
+
proceed: result.proceed,
|
|
474
|
+
approved: result.approved
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
catch (error) {
|
|
478
|
+
console.error('Interactive approval failed:', error);
|
|
479
|
+
// Fallback to simple approval
|
|
480
|
+
console.log('\n=== Smart Git Push - Validation Issues ===');
|
|
481
|
+
console.log(`Found ${issues.length} files with issues:`);
|
|
482
|
+
for (const issue of issues) {
|
|
483
|
+
console.log(`\n${issue.file}:`);
|
|
484
|
+
for (const i of issue.issues) {
|
|
485
|
+
console.log(` - ${i.severity.toUpperCase()}: ${i.message}`);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
if (dryRun) {
|
|
489
|
+
return { proceed: true, approved: [] };
|
|
490
|
+
}
|
|
491
|
+
// Auto-approve info and warnings, block errors
|
|
492
|
+
const hasErrors = issues.some(issue => issue.issues.some(i => i.severity === 'error'));
|
|
493
|
+
return {
|
|
494
|
+
proceed: !hasErrors,
|
|
495
|
+
approved: hasErrors ? [] : issues.map(i => i.file)
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* Execute git push
|
|
501
|
+
*/
|
|
502
|
+
async function executePush(projectPath, branch, message) {
|
|
503
|
+
try {
|
|
504
|
+
let output = '';
|
|
505
|
+
// Commit if there are staged changes and a message is provided
|
|
506
|
+
if (message) {
|
|
507
|
+
const commitOutput = execSync(`git commit -m "${message}"`, {
|
|
508
|
+
cwd: projectPath,
|
|
509
|
+
encoding: 'utf8'
|
|
510
|
+
});
|
|
511
|
+
output += `Commit:\n${commitOutput}\n\n`;
|
|
512
|
+
}
|
|
513
|
+
// Push to the specified branch or current branch
|
|
514
|
+
const pushCommand = branch ? `git push origin ${branch}` : 'git push';
|
|
515
|
+
const pushOutput = execSync(pushCommand, {
|
|
516
|
+
cwd: projectPath,
|
|
517
|
+
encoding: 'utf8'
|
|
518
|
+
});
|
|
519
|
+
output += `Push:\n${pushOutput}`;
|
|
520
|
+
return { output, success: true };
|
|
521
|
+
}
|
|
522
|
+
catch (error) {
|
|
523
|
+
throw new McpAdrError(`Git push failed: ${error instanceof Error ? error.message : String(error)}`, 'GIT_PUSH_FAILED');
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
//# sourceMappingURL=smart-git-push-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-git-push-tool.js","sourceRoot":"","sources":["../../../src/tools/smart-git-push-tool.ts"],"names":[],"mappings":"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"}
|