vibecodingmachine-core 2026.2.20-438 → 2026.2.26-1739
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/README.md +240 -0
- package/package.json +10 -2
- package/src/agents/Agent.js +300 -0
- package/src/agents/AgentAdditionService.js +311 -0
- package/src/agents/AgentCheckService.js +690 -0
- package/src/agents/AgentInstallationService.js +140 -0
- package/src/agents/AgentSetupService.js +467 -0
- package/src/agents/AgentStatus.js +183 -0
- package/src/agents/AgentVerificationService.js +634 -0
- package/src/agents/ConfigurationSchemaValidator.js +543 -0
- package/src/agents/EnvironmentConfigurationManager.js +602 -0
- package/src/agents/InstallationErrorHandler.js +372 -0
- package/src/agents/InstallationLog.js +363 -0
- package/src/agents/InstallationMethod.js +510 -0
- package/src/agents/InstallationOrchestrator.js +352 -0
- package/src/agents/InstallationProgressReporter.js +372 -0
- package/src/agents/InstallationRetryManager.js +322 -0
- package/src/agents/InstallationType.js +254 -0
- package/src/agents/OperationTypes.js +310 -0
- package/src/agents/PerformanceMetricsCollector.js +493 -0
- package/src/agents/SecurityValidationService.js +534 -0
- package/src/agents/VerificationTest.js +354 -0
- package/src/agents/VerificationType.js +226 -0
- package/src/agents/WindowsPermissionHandler.js +518 -0
- package/src/agents/config/AgentConfigManager.js +393 -0
- package/src/agents/config/AgentDefaultsRegistry.js +373 -0
- package/src/agents/config/ConfigValidator.js +281 -0
- package/src/agents/discovery/AgentDiscoveryService.js +707 -0
- package/src/agents/logging/AgentLogger.js +511 -0
- package/src/agents/status/AgentStatusManager.js +481 -0
- package/src/agents/storage/FileManager.js +454 -0
- package/src/agents/verification/AgentCommunicationTester.js +474 -0
- package/src/agents/verification/BaseVerifier.js +430 -0
- package/src/agents/verification/CommandVerifier.js +480 -0
- package/src/agents/verification/FileOperationVerifier.js +453 -0
- package/src/agents/verification/ResultAnalyzer.js +707 -0
- package/src/agents/verification/TestRequirementManager.js +495 -0
- package/src/agents/verification/VerificationRunner.js +433 -0
- package/src/agents/windows/BaseWindowsInstaller.js +441 -0
- package/src/agents/windows/ChocolateyInstaller.js +509 -0
- package/src/agents/windows/DirectInstaller.js +443 -0
- package/src/agents/windows/InstallerFactory.js +391 -0
- package/src/agents/windows/NpmInstaller.js +505 -0
- package/src/agents/windows/PowerShellInstaller.js +458 -0
- package/src/agents/windows/WinGetInstaller.js +390 -0
- package/src/analysis/analysis-reporter.js +132 -0
- package/src/analysis/boundary-detector.js +712 -0
- package/src/analysis/categorizer.js +340 -0
- package/src/analysis/codebase-scanner.js +384 -0
- package/src/analysis/line-counter.js +513 -0
- package/src/analysis/priority-calculator.js +679 -0
- package/src/analysis/report/analysis-report.js +250 -0
- package/src/analysis/report/package-analyzer.js +278 -0
- package/src/analysis/report/recommendation-generator.js +382 -0
- package/src/analysis/report/statistics-generator.js +515 -0
- package/src/analysis/reports/analysis-report-model.js +101 -0
- package/src/analysis/reports/recommendation-generator.js +283 -0
- package/src/analysis/reports/report-generators.js +191 -0
- package/src/analysis/reports/statistics-calculator.js +231 -0
- package/src/analysis/reports/trend-analyzer.js +219 -0
- package/src/analysis/strategy-generator.js +814 -0
- package/src/auto-mode/AutoModeBusinessLogic.js +836 -0
- package/src/config/refactoring-config.js +307 -0
- package/src/health-tracking/json-storage.js +38 -2
- package/src/ide-integration/applescript-manager-core.js +233 -0
- package/src/ide-integration/applescript-manager.cjs +357 -28
- package/src/ide-integration/applescript-manager.js +89 -3599
- package/src/ide-integration/cdp-manager.js +306 -0
- package/src/ide-integration/claude-code-cli-manager.cjs +1 -1
- package/src/ide-integration/continuation-handler.js +337 -0
- package/src/ide-integration/ide-status-checker.js +292 -0
- package/src/ide-integration/macos-ide-manager.js +627 -0
- package/src/ide-integration/macos-text-sender.js +528 -0
- package/src/ide-integration/response-reader.js +548 -0
- package/src/ide-integration/windows-automation-manager.js +121 -0
- package/src/ide-integration/windows-ide-manager.js +373 -0
- package/src/index.cjs +25 -3
- package/src/index.js +15 -1
- package/src/llm/direct-llm-manager.cjs +90 -2
- package/src/models/compliance-report.js +538 -0
- package/src/models/file-analysis.js +681 -0
- package/src/models/refactoring-plan.js +770 -0
- package/src/monitoring/alert-system.js +834 -0
- package/src/monitoring/compliance-progress-tracker.js +437 -0
- package/src/monitoring/continuous-scan-notifications.js +661 -0
- package/src/monitoring/continuous-scanner.js +279 -0
- package/src/monitoring/file-monitor/file-analyzer.js +262 -0
- package/src/monitoring/file-monitor/file-monitor.js +237 -0
- package/src/monitoring/file-monitor/watcher.js +194 -0
- package/src/monitoring/file-monitor.js +17 -0
- package/src/monitoring/notification-manager.js +437 -0
- package/src/monitoring/scanner-core.js +368 -0
- package/src/monitoring/scanner-events.js +214 -0
- package/src/monitoring/violation-notification-system.js +515 -0
- package/src/refactoring/boundaries/cohesion-analyzer.js +316 -0
- package/src/refactoring/boundaries/extraction-result.js +285 -0
- package/src/refactoring/boundaries/extraction-strategies.js +392 -0
- package/src/refactoring/boundaries/module-boundary.js +209 -0
- package/src/refactoring/boundary/boundary-detector.js +741 -0
- package/src/refactoring/boundary/boundary-types.js +405 -0
- package/src/refactoring/boundary/extraction-strategies.js +554 -0
- package/src/refactoring/boundary-extraction-result.js +77 -0
- package/src/refactoring/boundary-extraction-strategies.js +330 -0
- package/src/refactoring/boundary-extractor.js +384 -0
- package/src/refactoring/boundary-types.js +46 -0
- package/src/refactoring/circular/circular-dependency.js +88 -0
- package/src/refactoring/circular/cycle-detection.js +147 -0
- package/src/refactoring/circular/dependency-node.js +82 -0
- package/src/refactoring/circular/dependency-result.js +107 -0
- package/src/refactoring/circular/dependency-types.js +58 -0
- package/src/refactoring/circular/graph-builder.js +213 -0
- package/src/refactoring/circular/resolution-strategy.js +72 -0
- package/src/refactoring/circular/strategy-generator.js +229 -0
- package/src/refactoring/circular-dependency-resolver-original.js +809 -0
- package/src/refactoring/circular-dependency-resolver.js +200 -0
- package/src/refactoring/code-mover.js +761 -0
- package/src/refactoring/file-splitter.js +696 -0
- package/src/refactoring/functionality-validator.js +816 -0
- package/src/refactoring/import-manager.js +774 -0
- package/src/refactoring/module-boundary.js +107 -0
- package/src/refactoring/refactoring-executor.js +672 -0
- package/src/refactoring/refactoring-rollback.js +614 -0
- package/src/refactoring/test-validator.js +631 -0
- package/src/requirement-management/default-requirement-manager.js +321 -0
- package/src/requirement-management/requirement-file-parser.js +159 -0
- package/src/requirement-management/requirement-sequencer.js +221 -0
- package/src/rui/commands/AgentCommandParser.js +600 -0
- package/src/rui/commands/AgentCommands.js +487 -0
- package/src/rui/commands/AgentResponseFormatter.js +832 -0
- package/src/scripts/verify-full-compliance.js +269 -0
- package/src/sync/sync-engine-core.js +1 -0
- package/src/sync/sync-engine-remote-handlers.js +135 -0
- package/src/task-generation/automated-task-generator.js +351 -0
- package/src/task-generation/prioritizer.js +287 -0
- package/src/task-generation/task-list-updater.js +215 -0
- package/src/task-generation/task-management-integration.js +480 -0
- package/src/task-generation/task-manager-integration.js +270 -0
- package/src/task-generation/violation-task-generator.js +474 -0
- package/src/task-management/continuous-scan-integration.js +342 -0
- package/src/timeout-management/index.js +12 -3
- package/src/timeout-management/response-time-tracker.js +167 -0
- package/src/timeout-management/timeout-calculator.js +159 -0
- package/src/timeout-management/timeout-config-manager.js +172 -0
- package/src/utils/ast-analyzer.js +417 -0
- package/src/utils/current-requirement-manager.js +276 -0
- package/src/utils/current-requirement-operations.js +472 -0
- package/src/utils/dependency-mapper.js +456 -0
- package/src/utils/download-with-progress.js +4 -2
- package/src/utils/electron-update-checker.js +4 -1
- package/src/utils/file-size-analyzer.js +272 -0
- package/src/utils/import-updater.js +280 -0
- package/src/utils/refactoring-tools.js +512 -0
- package/src/utils/report-generator.js +569 -0
- package/src/utils/reports/report-analysis.js +218 -0
- package/src/utils/reports/report-types.js +55 -0
- package/src/utils/reports/summary-generators.js +102 -0
- package/src/utils/requirement-file-management.js +157 -0
- package/src/utils/requirement-helpers/requirement-file-ops.js +392 -0
- package/src/utils/requirement-helpers/requirement-mover.js +414 -0
- package/src/utils/requirement-helpers/requirement-parser.js +326 -0
- package/src/utils/requirement-helpers/requirement-status.js +320 -0
- package/src/utils/requirement-helpers-new.js +55 -0
- package/src/utils/requirement-helpers-refactored.js +367 -0
- package/src/utils/requirement-helpers.js +291 -1191
- package/src/utils/requirement-movement-operations.js +450 -0
- package/src/utils/requirement-movement.js +312 -0
- package/src/utils/requirement-parsing-helpers.js +56 -0
- package/src/utils/requirement-statistics.js +200 -0
- package/src/utils/requirement-text-utils.js +58 -0
- package/src/utils/rollback/rollback-handlers.js +125 -0
- package/src/utils/rollback/rollback-operation.js +63 -0
- package/src/utils/rollback/rollback-recorder.js +166 -0
- package/src/utils/rollback/rollback-state-manager.js +175 -0
- package/src/utils/rollback/rollback-types.js +33 -0
- package/src/utils/rollback/rollback-utils.js +110 -0
- package/src/utils/rollback-manager-original.js +569 -0
- package/src/utils/rollback-manager.js +202 -0
- package/src/utils/smoke-test-cli.js +362 -0
- package/src/utils/smoke-test-gui.js +351 -0
- package/src/utils/smoke-test-orchestrator.js +321 -0
- package/src/utils/smoke-test-runner.js +60 -0
- package/src/utils/smoke-test-web.js +347 -0
- package/src/utils/specification-helpers.js +39 -13
- package/src/utils/specification-migration.js +97 -0
- package/src/utils/test-runner.js +579 -0
- package/src/utils/validation-framework.js +518 -0
- package/src/validation/compliance-analyzer.js +197 -0
- package/src/validation/compliance-report-generator.js +343 -0
- package/src/validation/compliance-reporter.js +711 -0
- package/src/validation/compliance-rules.js +127 -0
- package/src/validation/constitution-validator-new.js +196 -0
- package/src/validation/constitution-validator.js +17 -0
- package/src/validation/file-validators.js +170 -0
- package/src/validation/line-limit/file-analyzer.js +201 -0
- package/src/validation/line-limit/line-limit-validator.js +208 -0
- package/src/validation/line-limit/validation-result.js +144 -0
- package/src/validation/line-limit-core.js +225 -0
- package/src/validation/line-limit-reporter.js +134 -0
- package/src/validation/line-limit-result.js +125 -0
- package/src/validation/line-limit-validator.js +41 -0
- package/src/validation/metrics-calculator.js +660 -0
- package/src/sync/sync-engine-backup.js +0 -559
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Violation Task Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates specific refactoring tasks for files that violate the 555-line limit
|
|
5
|
+
* and other constitutional requirements.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Task generator class
|
|
13
|
+
*/
|
|
14
|
+
class ViolationTaskGenerator {
|
|
15
|
+
constructor(options = {}) {
|
|
16
|
+
this.options = {
|
|
17
|
+
maxFileSize: options.maxFileSize || 555,
|
|
18
|
+
taskTemplate: options.taskTemplate || this.getDefaultTaskTemplate(),
|
|
19
|
+
outputFormat: options.outputFormat || 'markdown',
|
|
20
|
+
...options
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Generate tasks for violations
|
|
26
|
+
*/
|
|
27
|
+
generateTasks(violations, options = {}) {
|
|
28
|
+
const tasks = [];
|
|
29
|
+
const taskOptions = { ...this.options, ...options };
|
|
30
|
+
|
|
31
|
+
for (const violation of violations) {
|
|
32
|
+
const task = this.generateTaskForViolation(violation, taskOptions);
|
|
33
|
+
if (task) {
|
|
34
|
+
tasks.push(task);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return tasks;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Generate task for single violation
|
|
43
|
+
*/
|
|
44
|
+
generateTaskForViolation(violation, options) {
|
|
45
|
+
const task = {
|
|
46
|
+
id: this.generateTaskId(violation.filePath),
|
|
47
|
+
priority: this.calculatePriority(violation),
|
|
48
|
+
estimatedEffort: this.estimateEffort(violation),
|
|
49
|
+
description: this.generateDescription(violation),
|
|
50
|
+
filePath: violation.filePath,
|
|
51
|
+
violations: this.extractViolations(violation),
|
|
52
|
+
recommendations: this.generateRecommendations(violation),
|
|
53
|
+
dependencies: this.identifyDependencies(violation),
|
|
54
|
+
generatedAt: new Date().toISOString()
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
return task;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Generate task ID
|
|
62
|
+
*/
|
|
63
|
+
generateTaskId(filePath) {
|
|
64
|
+
const relativePath = path.relative(process.cwd(), filePath);
|
|
65
|
+
const sanitized = relativePath.replace(/[^a-zA-Z0-9]/g, '-').toLowerCase();
|
|
66
|
+
return `refactor-${sanitized}`;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Calculate task priority
|
|
71
|
+
*/
|
|
72
|
+
calculatePriority(violation) {
|
|
73
|
+
let score = 0;
|
|
74
|
+
|
|
75
|
+
// Base score from line count
|
|
76
|
+
if (violation.lineCount > 2000) score += 100;
|
|
77
|
+
else if (violation.lineCount > 1000) score += 80;
|
|
78
|
+
else if (violation.lineCount > 800) score += 60;
|
|
79
|
+
else if (violation.lineCount > 600) score += 40;
|
|
80
|
+
else if (violation.lineCount > 555) score += 20;
|
|
81
|
+
|
|
82
|
+
// Critical violations increase priority
|
|
83
|
+
if (violation.constitutionalValidation) {
|
|
84
|
+
const criticalIssues = violation.constitutionalValidation.filter(r => r.severity === 'critical');
|
|
85
|
+
score += criticalIssues.length * 30;
|
|
86
|
+
|
|
87
|
+
const errorIssues = violation.constitutionalValidation.filter(r => r.severity === 'error');
|
|
88
|
+
score += errorIssues.length * 20;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// File type considerations
|
|
92
|
+
const ext = path.extname(violation.filePath);
|
|
93
|
+
if (['.js', '.jsx', '.ts', '.tsx'].includes(ext)) {
|
|
94
|
+
score += 10; // Source code files are higher priority
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Convert score to priority level
|
|
98
|
+
if (score >= 90) return 'critical';
|
|
99
|
+
if (score >= 70) return 'high';
|
|
100
|
+
if (score >= 40) return 'medium';
|
|
101
|
+
return 'low';
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Estimate effort in hours
|
|
106
|
+
*/
|
|
107
|
+
estimateEffort(violation) {
|
|
108
|
+
let hours = 0;
|
|
109
|
+
|
|
110
|
+
// Base effort from line count
|
|
111
|
+
const linesToRefactor = violation.lineCount - this.options.maxFileSize;
|
|
112
|
+
if (linesToRefactor > 0) {
|
|
113
|
+
hours += Math.ceil(linesToRefactor / 100); // ~100 lines per hour
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Additional effort for constitutional violations
|
|
117
|
+
if (violation.constitutionalValidation) {
|
|
118
|
+
const nonWarningIssues = violation.constitutionalValidation.filter(r => r.severity !== 'warning');
|
|
119
|
+
hours += nonWarningIssues.length * 0.5; // 30 minutes per issue
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Complexity multiplier based on file type
|
|
123
|
+
const ext = path.extname(violation.filePath);
|
|
124
|
+
if (['.js', '.jsx', '.ts', '.tsx'].includes(ext)) {
|
|
125
|
+
hours *= 1.2; // Source code is more complex
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return Math.max(1, Math.ceil(hours));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Generate task description
|
|
133
|
+
*/
|
|
134
|
+
generateDescription(violation) {
|
|
135
|
+
const relativePath = path.relative(process.cwd(), violation.filePath);
|
|
136
|
+
const lineCount = violation.lineCount;
|
|
137
|
+
const excessLines = lineCount - this.options.maxFileSize;
|
|
138
|
+
|
|
139
|
+
let description = `Refactor ${relativePath} to comply with 555-line limit`;
|
|
140
|
+
|
|
141
|
+
if (excessLines > 0) {
|
|
142
|
+
description += ` (currently ${lineCount} lines, ${excessLines} over limit)`;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (violation.constitutionalValidation && violation.constitutionalValidation.length > 0) {
|
|
146
|
+
const issueCount = violation.constitutionalValidation.filter(r => r.severity !== 'warning').length;
|
|
147
|
+
description += ` and resolve ${issueCount} constitutional violations`;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return description;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Extract violations from scan result
|
|
155
|
+
*/
|
|
156
|
+
extractViolations(violation) {
|
|
157
|
+
const violations = [];
|
|
158
|
+
|
|
159
|
+
// Line limit violation
|
|
160
|
+
if (violation.lineLimitValidation && !violation.lineLimitValidation.isValid) {
|
|
161
|
+
violations.push({
|
|
162
|
+
type: 'file_size',
|
|
163
|
+
severity: violation.lineLimitValidation.violation?.severity || 'error',
|
|
164
|
+
description: violation.lineLimitValidation.violation?.message || 'File exceeds size limit',
|
|
165
|
+
details: {
|
|
166
|
+
lineCount: violation.lineCount,
|
|
167
|
+
limit: this.options.maxFileSize,
|
|
168
|
+
excessLines: violation.lineCount - this.options.maxFileSize
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Constitutional violations
|
|
174
|
+
if (violation.constitutionalValidation) {
|
|
175
|
+
for (const issue of violation.constitutionalValidation) {
|
|
176
|
+
if (issue.severity !== 'warning') {
|
|
177
|
+
violations.push({
|
|
178
|
+
type: issue.category,
|
|
179
|
+
severity: issue.severity,
|
|
180
|
+
description: issue.message,
|
|
181
|
+
details: {
|
|
182
|
+
rule: issue.rule,
|
|
183
|
+
lineNumber: issue.lineNumber,
|
|
184
|
+
suggestion: issue.suggestion
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return violations;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Generate recommendations
|
|
196
|
+
*/
|
|
197
|
+
generateRecommendations(violation) {
|
|
198
|
+
const recommendations = [];
|
|
199
|
+
|
|
200
|
+
// File size recommendations
|
|
201
|
+
if (violation.lineCount > this.options.maxFileSize) {
|
|
202
|
+
const excessLines = violation.lineCount - this.options.maxFileSize;
|
|
203
|
+
|
|
204
|
+
if (excessLines > 1000) {
|
|
205
|
+
recommendations.push({
|
|
206
|
+
action: 'split_into_multiple_files',
|
|
207
|
+
description: `Split into ${Math.ceil(excessLines / 500) + 1} focused modules`,
|
|
208
|
+
priority: 'high'
|
|
209
|
+
});
|
|
210
|
+
} else if (excessLines > 500) {
|
|
211
|
+
recommendations.push({
|
|
212
|
+
action: 'extract_large_functions',
|
|
213
|
+
description: 'Extract large functions and classes into separate modules',
|
|
214
|
+
priority: 'medium'
|
|
215
|
+
});
|
|
216
|
+
} else {
|
|
217
|
+
recommendations.push({
|
|
218
|
+
action: 'minor_refactoring',
|
|
219
|
+
description: 'Minor refactoring to reduce file size',
|
|
220
|
+
priority: 'low'
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// General refactoring recommendations
|
|
225
|
+
recommendations.push({
|
|
226
|
+
action: 'extract_related_functionality',
|
|
227
|
+
description: 'Group related functionality into logical modules',
|
|
228
|
+
priority: 'medium'
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
recommendations.push({
|
|
232
|
+
action: 'remove_duplicate_code',
|
|
233
|
+
description: 'Identify and remove duplicate code patterns',
|
|
234
|
+
priority: 'medium'
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Constitutional recommendations
|
|
239
|
+
if (violation.constitutionalValidation) {
|
|
240
|
+
for (const issue of violation.constitutionalValidation) {
|
|
241
|
+
if (issue.suggestion && issue.severity !== 'warning') {
|
|
242
|
+
recommendations.push({
|
|
243
|
+
action: 'fix_constitutional_issue',
|
|
244
|
+
description: issue.suggestion,
|
|
245
|
+
priority: issue.severity === 'critical' ? 'high' : 'medium',
|
|
246
|
+
category: issue.category
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
return recommendations;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Identify dependencies
|
|
257
|
+
*/
|
|
258
|
+
identifyDependencies(violation) {
|
|
259
|
+
const dependencies = [];
|
|
260
|
+
|
|
261
|
+
try {
|
|
262
|
+
const content = fs.readFileSync(violation.filePath, 'utf8');
|
|
263
|
+
|
|
264
|
+
// Find import statements
|
|
265
|
+
const importRegex = /(?:import|require)\s+['"]([^'"]+)['"]/g;
|
|
266
|
+
const imports = [];
|
|
267
|
+
let match;
|
|
268
|
+
|
|
269
|
+
while ((match = importRegex.exec(content)) !== null) {
|
|
270
|
+
const importPath = match[1];
|
|
271
|
+
|
|
272
|
+
// Only include local imports
|
|
273
|
+
if (importPath.startsWith('./') || importPath.startsWith('../')) {
|
|
274
|
+
const absolutePath = path.resolve(path.dirname(violation.filePath), importPath);
|
|
275
|
+
|
|
276
|
+
// Try different extensions
|
|
277
|
+
const possiblePaths = [
|
|
278
|
+
absolutePath,
|
|
279
|
+
absolutePath + '.js',
|
|
280
|
+
absolutePath + '.jsx',
|
|
281
|
+
absolutePath + '.ts',
|
|
282
|
+
absolutePath + '.tsx',
|
|
283
|
+
path.join(absolutePath, 'index.js'),
|
|
284
|
+
path.join(absolutePath, 'index.jsx'),
|
|
285
|
+
path.join(absolutePath, 'index.ts'),
|
|
286
|
+
path.join(absolutePath, 'index.tsx')
|
|
287
|
+
];
|
|
288
|
+
|
|
289
|
+
for (const possiblePath of possiblePaths) {
|
|
290
|
+
if (fs.existsSync(possiblePath)) {
|
|
291
|
+
imports.push(possiblePath);
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
dependencies.push(...imports);
|
|
299
|
+
} catch (error) {
|
|
300
|
+
// Skip dependency analysis if file can't be read
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return dependencies;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Generate tasks in markdown format
|
|
308
|
+
*/
|
|
309
|
+
generateMarkdownTasks(tasks) {
|
|
310
|
+
let markdown = '# Generated Refactoring Tasks\n\n';
|
|
311
|
+
markdown += `Generated on: ${new Date().toISOString()}\n`;
|
|
312
|
+
markdown += `Total tasks: ${tasks.length}\n\n`;
|
|
313
|
+
|
|
314
|
+
// Group by priority
|
|
315
|
+
const grouped = this.groupTasksByPriority(tasks);
|
|
316
|
+
|
|
317
|
+
for (const [priority, priorityTasks] of Object.entries(grouped)) {
|
|
318
|
+
markdown += `## ${priority.toUpperCase()} Priority Tasks\n\n`;
|
|
319
|
+
|
|
320
|
+
for (const task of priorityTasks) {
|
|
321
|
+
markdown += `### ${task.id}\n\n`;
|
|
322
|
+
markdown += `- [ ] **${task.description}**\n`;
|
|
323
|
+
markdown += ` - **File:** \`${task.filePath}\`\n`;
|
|
324
|
+
markdown += ` - **Lines:** ${task.lineCount || 'unknown'}\n`;
|
|
325
|
+
markdown += ` - **Priority:** ${task.priority}\n`;
|
|
326
|
+
markdown += ` - **Estimated Effort:** ${task.estimatedEffort} hours\n`;
|
|
327
|
+
|
|
328
|
+
if (task.violations && task.violations.length > 0) {
|
|
329
|
+
markdown += ` - **Violations:**\n`;
|
|
330
|
+
for (const violation of task.violations) {
|
|
331
|
+
markdown += ` - ${violation.type}: ${violation.description}\n`;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
if (task.recommendations && task.recommendations.length > 0) {
|
|
336
|
+
markdown += ` - **Recommendations:**\n`;
|
|
337
|
+
for (const rec of task.recommendations) {
|
|
338
|
+
markdown += ` - ${rec.action}: ${rec.description}\n`;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
if (task.dependencies && task.dependencies.length > 0) {
|
|
343
|
+
markdown += ` - **Dependencies:** ${task.dependencies.length} files\n`;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
markdown += '\n';
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
return markdown;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Group tasks by priority
|
|
355
|
+
*/
|
|
356
|
+
groupTasksByPriority(tasks) {
|
|
357
|
+
const grouped = {
|
|
358
|
+
critical: [],
|
|
359
|
+
high: [],
|
|
360
|
+
medium: [],
|
|
361
|
+
low: []
|
|
362
|
+
};
|
|
363
|
+
|
|
364
|
+
for (const task of tasks) {
|
|
365
|
+
grouped[task.priority].push(task);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// Sort within each priority by effort (highest first)
|
|
369
|
+
for (const priority in grouped) {
|
|
370
|
+
grouped[priority].sort((a, b) => b.estimatedEffort - a.estimatedEffort);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
return grouped;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* Get default task template
|
|
378
|
+
*/
|
|
379
|
+
getDefaultTaskTemplate() {
|
|
380
|
+
return {
|
|
381
|
+
id: '',
|
|
382
|
+
priority: 'medium',
|
|
383
|
+
estimatedEffort: 4,
|
|
384
|
+
description: '',
|
|
385
|
+
filePath: '',
|
|
386
|
+
violations: [],
|
|
387
|
+
recommendations: [],
|
|
388
|
+
dependencies: [],
|
|
389
|
+
generatedAt: ''
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Export tasks to file
|
|
395
|
+
*/
|
|
396
|
+
async exportTasks(tasks, filePath, format = 'markdown') {
|
|
397
|
+
let content;
|
|
398
|
+
|
|
399
|
+
switch (format.toLowerCase()) {
|
|
400
|
+
case 'markdown':
|
|
401
|
+
content = this.generateMarkdownTasks(tasks);
|
|
402
|
+
break;
|
|
403
|
+
case 'json':
|
|
404
|
+
content = JSON.stringify({
|
|
405
|
+
metadata: {
|
|
406
|
+
exportedAt: new Date().toISOString(),
|
|
407
|
+
totalTasks: tasks.length,
|
|
408
|
+
generatorVersion: '1.0.0'
|
|
409
|
+
},
|
|
410
|
+
tasks
|
|
411
|
+
}, null, 2);
|
|
412
|
+
break;
|
|
413
|
+
default:
|
|
414
|
+
throw new Error(`Unsupported format: ${format}`);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
// Ensure directory exists
|
|
418
|
+
const dir = path.dirname(filePath);
|
|
419
|
+
if (!fs.existsSync(dir)) {
|
|
420
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
fs.writeFileSync(filePath, content, 'utf8');
|
|
424
|
+
return filePath;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
* Generate summary statistics
|
|
429
|
+
*/
|
|
430
|
+
generateSummary(tasks) {
|
|
431
|
+
const summary = {
|
|
432
|
+
totalTasks: tasks.length,
|
|
433
|
+
totalEstimatedHours: tasks.reduce((sum, task) => sum + task.estimatedEffort, 0),
|
|
434
|
+
priorityBreakdown: {},
|
|
435
|
+
violationTypes: {},
|
|
436
|
+
averageEffort: 0,
|
|
437
|
+
largestFile: null,
|
|
438
|
+
mostComplexTask: null
|
|
439
|
+
};
|
|
440
|
+
|
|
441
|
+
// Priority breakdown
|
|
442
|
+
for (const task of tasks) {
|
|
443
|
+
summary.priorityBreakdown[task.priority] = (summary.priorityBreakdown[task.priority] || 0) + 1;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// Violation types
|
|
447
|
+
for (const task of tasks) {
|
|
448
|
+
for (const violation of task.violations) {
|
|
449
|
+
summary.violationTypes[violation.type] = (summary.violationTypes[violation.type] || 0) + 1;
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
// Average effort
|
|
454
|
+
if (tasks.length > 0) {
|
|
455
|
+
summary.averageEffort = summary.totalEstimatedHours / tasks.length;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// Find largest file
|
|
459
|
+
const taskWithLargestFile = tasks.reduce((max, task) => {
|
|
460
|
+
return (!max || (task.lineCount || 0) > (max.lineCount || 0)) ? task : max;
|
|
461
|
+
}, null);
|
|
462
|
+
summary.largestFile = taskWithLargestFile;
|
|
463
|
+
|
|
464
|
+
// Find most complex task (most violations)
|
|
465
|
+
const mostComplexTask = tasks.reduce((max, task) => {
|
|
466
|
+
return (!max || task.violations.length > max.violations.length) ? task : max;
|
|
467
|
+
}, null);
|
|
468
|
+
summary.mostComplexTask = mostComplexTask;
|
|
469
|
+
|
|
470
|
+
return summary;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
module.exports = ViolationTaskGenerator;
|