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.
Files changed (202) hide show
  1. package/README.md +240 -0
  2. package/package.json +10 -2
  3. package/src/agents/Agent.js +300 -0
  4. package/src/agents/AgentAdditionService.js +311 -0
  5. package/src/agents/AgentCheckService.js +690 -0
  6. package/src/agents/AgentInstallationService.js +140 -0
  7. package/src/agents/AgentSetupService.js +467 -0
  8. package/src/agents/AgentStatus.js +183 -0
  9. package/src/agents/AgentVerificationService.js +634 -0
  10. package/src/agents/ConfigurationSchemaValidator.js +543 -0
  11. package/src/agents/EnvironmentConfigurationManager.js +602 -0
  12. package/src/agents/InstallationErrorHandler.js +372 -0
  13. package/src/agents/InstallationLog.js +363 -0
  14. package/src/agents/InstallationMethod.js +510 -0
  15. package/src/agents/InstallationOrchestrator.js +352 -0
  16. package/src/agents/InstallationProgressReporter.js +372 -0
  17. package/src/agents/InstallationRetryManager.js +322 -0
  18. package/src/agents/InstallationType.js +254 -0
  19. package/src/agents/OperationTypes.js +310 -0
  20. package/src/agents/PerformanceMetricsCollector.js +493 -0
  21. package/src/agents/SecurityValidationService.js +534 -0
  22. package/src/agents/VerificationTest.js +354 -0
  23. package/src/agents/VerificationType.js +226 -0
  24. package/src/agents/WindowsPermissionHandler.js +518 -0
  25. package/src/agents/config/AgentConfigManager.js +393 -0
  26. package/src/agents/config/AgentDefaultsRegistry.js +373 -0
  27. package/src/agents/config/ConfigValidator.js +281 -0
  28. package/src/agents/discovery/AgentDiscoveryService.js +707 -0
  29. package/src/agents/logging/AgentLogger.js +511 -0
  30. package/src/agents/status/AgentStatusManager.js +481 -0
  31. package/src/agents/storage/FileManager.js +454 -0
  32. package/src/agents/verification/AgentCommunicationTester.js +474 -0
  33. package/src/agents/verification/BaseVerifier.js +430 -0
  34. package/src/agents/verification/CommandVerifier.js +480 -0
  35. package/src/agents/verification/FileOperationVerifier.js +453 -0
  36. package/src/agents/verification/ResultAnalyzer.js +707 -0
  37. package/src/agents/verification/TestRequirementManager.js +495 -0
  38. package/src/agents/verification/VerificationRunner.js +433 -0
  39. package/src/agents/windows/BaseWindowsInstaller.js +441 -0
  40. package/src/agents/windows/ChocolateyInstaller.js +509 -0
  41. package/src/agents/windows/DirectInstaller.js +443 -0
  42. package/src/agents/windows/InstallerFactory.js +391 -0
  43. package/src/agents/windows/NpmInstaller.js +505 -0
  44. package/src/agents/windows/PowerShellInstaller.js +458 -0
  45. package/src/agents/windows/WinGetInstaller.js +390 -0
  46. package/src/analysis/analysis-reporter.js +132 -0
  47. package/src/analysis/boundary-detector.js +712 -0
  48. package/src/analysis/categorizer.js +340 -0
  49. package/src/analysis/codebase-scanner.js +384 -0
  50. package/src/analysis/line-counter.js +513 -0
  51. package/src/analysis/priority-calculator.js +679 -0
  52. package/src/analysis/report/analysis-report.js +250 -0
  53. package/src/analysis/report/package-analyzer.js +278 -0
  54. package/src/analysis/report/recommendation-generator.js +382 -0
  55. package/src/analysis/report/statistics-generator.js +515 -0
  56. package/src/analysis/reports/analysis-report-model.js +101 -0
  57. package/src/analysis/reports/recommendation-generator.js +283 -0
  58. package/src/analysis/reports/report-generators.js +191 -0
  59. package/src/analysis/reports/statistics-calculator.js +231 -0
  60. package/src/analysis/reports/trend-analyzer.js +219 -0
  61. package/src/analysis/strategy-generator.js +814 -0
  62. package/src/auto-mode/AutoModeBusinessLogic.js +836 -0
  63. package/src/config/refactoring-config.js +307 -0
  64. package/src/health-tracking/json-storage.js +38 -2
  65. package/src/ide-integration/applescript-manager-core.js +233 -0
  66. package/src/ide-integration/applescript-manager.cjs +357 -28
  67. package/src/ide-integration/applescript-manager.js +89 -3599
  68. package/src/ide-integration/cdp-manager.js +306 -0
  69. package/src/ide-integration/claude-code-cli-manager.cjs +1 -1
  70. package/src/ide-integration/continuation-handler.js +337 -0
  71. package/src/ide-integration/ide-status-checker.js +292 -0
  72. package/src/ide-integration/macos-ide-manager.js +627 -0
  73. package/src/ide-integration/macos-text-sender.js +528 -0
  74. package/src/ide-integration/response-reader.js +548 -0
  75. package/src/ide-integration/windows-automation-manager.js +121 -0
  76. package/src/ide-integration/windows-ide-manager.js +373 -0
  77. package/src/index.cjs +25 -3
  78. package/src/index.js +15 -1
  79. package/src/llm/direct-llm-manager.cjs +90 -2
  80. package/src/models/compliance-report.js +538 -0
  81. package/src/models/file-analysis.js +681 -0
  82. package/src/models/refactoring-plan.js +770 -0
  83. package/src/monitoring/alert-system.js +834 -0
  84. package/src/monitoring/compliance-progress-tracker.js +437 -0
  85. package/src/monitoring/continuous-scan-notifications.js +661 -0
  86. package/src/monitoring/continuous-scanner.js +279 -0
  87. package/src/monitoring/file-monitor/file-analyzer.js +262 -0
  88. package/src/monitoring/file-monitor/file-monitor.js +237 -0
  89. package/src/monitoring/file-monitor/watcher.js +194 -0
  90. package/src/monitoring/file-monitor.js +17 -0
  91. package/src/monitoring/notification-manager.js +437 -0
  92. package/src/monitoring/scanner-core.js +368 -0
  93. package/src/monitoring/scanner-events.js +214 -0
  94. package/src/monitoring/violation-notification-system.js +515 -0
  95. package/src/refactoring/boundaries/cohesion-analyzer.js +316 -0
  96. package/src/refactoring/boundaries/extraction-result.js +285 -0
  97. package/src/refactoring/boundaries/extraction-strategies.js +392 -0
  98. package/src/refactoring/boundaries/module-boundary.js +209 -0
  99. package/src/refactoring/boundary/boundary-detector.js +741 -0
  100. package/src/refactoring/boundary/boundary-types.js +405 -0
  101. package/src/refactoring/boundary/extraction-strategies.js +554 -0
  102. package/src/refactoring/boundary-extraction-result.js +77 -0
  103. package/src/refactoring/boundary-extraction-strategies.js +330 -0
  104. package/src/refactoring/boundary-extractor.js +384 -0
  105. package/src/refactoring/boundary-types.js +46 -0
  106. package/src/refactoring/circular/circular-dependency.js +88 -0
  107. package/src/refactoring/circular/cycle-detection.js +147 -0
  108. package/src/refactoring/circular/dependency-node.js +82 -0
  109. package/src/refactoring/circular/dependency-result.js +107 -0
  110. package/src/refactoring/circular/dependency-types.js +58 -0
  111. package/src/refactoring/circular/graph-builder.js +213 -0
  112. package/src/refactoring/circular/resolution-strategy.js +72 -0
  113. package/src/refactoring/circular/strategy-generator.js +229 -0
  114. package/src/refactoring/circular-dependency-resolver-original.js +809 -0
  115. package/src/refactoring/circular-dependency-resolver.js +200 -0
  116. package/src/refactoring/code-mover.js +761 -0
  117. package/src/refactoring/file-splitter.js +696 -0
  118. package/src/refactoring/functionality-validator.js +816 -0
  119. package/src/refactoring/import-manager.js +774 -0
  120. package/src/refactoring/module-boundary.js +107 -0
  121. package/src/refactoring/refactoring-executor.js +672 -0
  122. package/src/refactoring/refactoring-rollback.js +614 -0
  123. package/src/refactoring/test-validator.js +631 -0
  124. package/src/requirement-management/default-requirement-manager.js +321 -0
  125. package/src/requirement-management/requirement-file-parser.js +159 -0
  126. package/src/requirement-management/requirement-sequencer.js +221 -0
  127. package/src/rui/commands/AgentCommandParser.js +600 -0
  128. package/src/rui/commands/AgentCommands.js +487 -0
  129. package/src/rui/commands/AgentResponseFormatter.js +832 -0
  130. package/src/scripts/verify-full-compliance.js +269 -0
  131. package/src/sync/sync-engine-core.js +1 -0
  132. package/src/sync/sync-engine-remote-handlers.js +135 -0
  133. package/src/task-generation/automated-task-generator.js +351 -0
  134. package/src/task-generation/prioritizer.js +287 -0
  135. package/src/task-generation/task-list-updater.js +215 -0
  136. package/src/task-generation/task-management-integration.js +480 -0
  137. package/src/task-generation/task-manager-integration.js +270 -0
  138. package/src/task-generation/violation-task-generator.js +474 -0
  139. package/src/task-management/continuous-scan-integration.js +342 -0
  140. package/src/timeout-management/index.js +12 -3
  141. package/src/timeout-management/response-time-tracker.js +167 -0
  142. package/src/timeout-management/timeout-calculator.js +159 -0
  143. package/src/timeout-management/timeout-config-manager.js +172 -0
  144. package/src/utils/ast-analyzer.js +417 -0
  145. package/src/utils/current-requirement-manager.js +276 -0
  146. package/src/utils/current-requirement-operations.js +472 -0
  147. package/src/utils/dependency-mapper.js +456 -0
  148. package/src/utils/download-with-progress.js +4 -2
  149. package/src/utils/electron-update-checker.js +4 -1
  150. package/src/utils/file-size-analyzer.js +272 -0
  151. package/src/utils/import-updater.js +280 -0
  152. package/src/utils/refactoring-tools.js +512 -0
  153. package/src/utils/report-generator.js +569 -0
  154. package/src/utils/reports/report-analysis.js +218 -0
  155. package/src/utils/reports/report-types.js +55 -0
  156. package/src/utils/reports/summary-generators.js +102 -0
  157. package/src/utils/requirement-file-management.js +157 -0
  158. package/src/utils/requirement-helpers/requirement-file-ops.js +392 -0
  159. package/src/utils/requirement-helpers/requirement-mover.js +414 -0
  160. package/src/utils/requirement-helpers/requirement-parser.js +326 -0
  161. package/src/utils/requirement-helpers/requirement-status.js +320 -0
  162. package/src/utils/requirement-helpers-new.js +55 -0
  163. package/src/utils/requirement-helpers-refactored.js +367 -0
  164. package/src/utils/requirement-helpers.js +291 -1191
  165. package/src/utils/requirement-movement-operations.js +450 -0
  166. package/src/utils/requirement-movement.js +312 -0
  167. package/src/utils/requirement-parsing-helpers.js +56 -0
  168. package/src/utils/requirement-statistics.js +200 -0
  169. package/src/utils/requirement-text-utils.js +58 -0
  170. package/src/utils/rollback/rollback-handlers.js +125 -0
  171. package/src/utils/rollback/rollback-operation.js +63 -0
  172. package/src/utils/rollback/rollback-recorder.js +166 -0
  173. package/src/utils/rollback/rollback-state-manager.js +175 -0
  174. package/src/utils/rollback/rollback-types.js +33 -0
  175. package/src/utils/rollback/rollback-utils.js +110 -0
  176. package/src/utils/rollback-manager-original.js +569 -0
  177. package/src/utils/rollback-manager.js +202 -0
  178. package/src/utils/smoke-test-cli.js +362 -0
  179. package/src/utils/smoke-test-gui.js +351 -0
  180. package/src/utils/smoke-test-orchestrator.js +321 -0
  181. package/src/utils/smoke-test-runner.js +60 -0
  182. package/src/utils/smoke-test-web.js +347 -0
  183. package/src/utils/specification-helpers.js +39 -13
  184. package/src/utils/specification-migration.js +97 -0
  185. package/src/utils/test-runner.js +579 -0
  186. package/src/utils/validation-framework.js +518 -0
  187. package/src/validation/compliance-analyzer.js +197 -0
  188. package/src/validation/compliance-report-generator.js +343 -0
  189. package/src/validation/compliance-reporter.js +711 -0
  190. package/src/validation/compliance-rules.js +127 -0
  191. package/src/validation/constitution-validator-new.js +196 -0
  192. package/src/validation/constitution-validator.js +17 -0
  193. package/src/validation/file-validators.js +170 -0
  194. package/src/validation/line-limit/file-analyzer.js +201 -0
  195. package/src/validation/line-limit/line-limit-validator.js +208 -0
  196. package/src/validation/line-limit/validation-result.js +144 -0
  197. package/src/validation/line-limit-core.js +225 -0
  198. package/src/validation/line-limit-reporter.js +134 -0
  199. package/src/validation/line-limit-result.js +125 -0
  200. package/src/validation/line-limit-validator.js +41 -0
  201. package/src/validation/metrics-calculator.js +660 -0
  202. 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;