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,405 @@
1
+ /**
2
+ * Boundary Types and Data Structures
3
+ */
4
+
5
+ /**
6
+ * Boundary types
7
+ */
8
+ const BOUNDARY_TYPES = {
9
+ FUNCTION: 'function',
10
+ CLASS: 'class',
11
+ OBJECT: 'object',
12
+ MODULE: 'module',
13
+ UTILITY: 'utility',
14
+ CONFIG: 'config',
15
+ CONSTANT: 'constant'
16
+ };
17
+
18
+ /**
19
+ * Cohesion levels
20
+ */
21
+ const COHESION_LEVELS = {
22
+ HIGH: 'high',
23
+ MEDIUM: 'medium',
24
+ LOW: 'low',
25
+ NONE: 'none'
26
+ };
27
+
28
+ /**
29
+ * Module boundary class
30
+ */
31
+ class ModuleBoundary {
32
+ constructor(type, name, startLine, endLine, filePath) {
33
+ this.id = this.generateId();
34
+ this.type = type;
35
+ this.name = name;
36
+ this.startLine = startLine;
37
+ this.endLine = endLine;
38
+ this.filePath = filePath;
39
+ this.lineCount = endLine - startLine + 1;
40
+ this.cohesion = COHESION_LEVELS.NONE;
41
+ this.complexity = 0;
42
+ this.dependencies = [];
43
+ this.exports = [];
44
+ this.internalReferences = [];
45
+ this.externalReferences = [];
46
+ this.metadata = {
47
+ createdAt: new Date().toISOString(),
48
+ confidence: 0.5,
49
+ extractable: false
50
+ };
51
+ }
52
+
53
+ /**
54
+ * Generate unique boundary ID
55
+ * @returns {string} Generated ID
56
+ */
57
+ generateId() {
58
+ return `boundary_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
59
+ }
60
+
61
+ /**
62
+ * Set cohesion level
63
+ * @param {string} cohesion - Cohesion level
64
+ */
65
+ setCohesion(cohesion) {
66
+ this.cohesion = cohesion;
67
+ }
68
+
69
+ /**
70
+ * Set complexity score
71
+ * @param {number} complexity - Complexity score
72
+ */
73
+ setComplexity(complexity) {
74
+ this.complexity = complexity;
75
+ }
76
+
77
+ /**
78
+ * Add dependency
79
+ * @param {string} dependency - Dependency name
80
+ */
81
+ addDependency(dependency) {
82
+ if (!this.dependencies.includes(dependency)) {
83
+ this.dependencies.push(dependency);
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Add export
89
+ * @param {string} exportName - Export name
90
+ */
91
+ addExport(exportName) {
92
+ if (!this.exports.includes(exportName)) {
93
+ this.exports.push(exportName);
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Add internal reference
99
+ * @param {string} reference - Reference name
100
+ */
101
+ addInternalReference(reference) {
102
+ if (!this.internalReferences.includes(reference)) {
103
+ this.internalReferences.push(reference);
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Add external reference
109
+ * @param {string} reference - Reference name
110
+ */
111
+ addExternalReference(reference) {
112
+ if (!this.externalReferences.includes(reference)) {
113
+ this.externalReferences.push(reference);
114
+ }
115
+ }
116
+
117
+ /**
118
+ * Set extractable flag
119
+ * @param {boolean} extractable - Whether boundary is extractable
120
+ */
121
+ setExtractable(extractable) {
122
+ this.metadata.extractable = extractable;
123
+ }
124
+
125
+ /**
126
+ * Set confidence score
127
+ * @param {number} confidence - Confidence score (0-1)
128
+ */
129
+ setConfidence(confidence) {
130
+ this.metadata.confidence = Math.min(1.0, Math.max(0.0, confidence));
131
+ }
132
+
133
+ /**
134
+ * Check if boundary is extractable
135
+ * @returns {boolean} Whether boundary is extractable
136
+ */
137
+ isExtractable() {
138
+ return this.metadata.extractable;
139
+ }
140
+
141
+ /**
142
+ * Get boundary summary
143
+ * @returns {Object} Boundary summary
144
+ */
145
+ getSummary() {
146
+ return {
147
+ id: this.id,
148
+ type: this.type,
149
+ name: this.name,
150
+ lineCount: this.lineCount,
151
+ cohesion: this.cohesion,
152
+ complexity: this.complexity,
153
+ dependencies: this.dependencies.length,
154
+ exports: this.exports.length,
155
+ extractable: this.isExtractable(),
156
+ confidence: this.metadata.confidence
157
+ };
158
+ }
159
+
160
+ /**
161
+ * Validate boundary data
162
+ * @returns {Object} Validation result
163
+ */
164
+ validate() {
165
+ const errors = [];
166
+
167
+ if (!this.type || !Object.values(BOUNDARY_TYPES).includes(this.type)) {
168
+ errors.push('Invalid boundary type');
169
+ }
170
+
171
+ if (!this.name || !this.name.trim()) {
172
+ errors.push('Boundary name is required');
173
+ }
174
+
175
+ if (this.startLine < 1) {
176
+ errors.push('Start line must be positive');
177
+ }
178
+
179
+ if (this.endLine < this.startLine) {
180
+ errors.push('End line must be after start line');
181
+ }
182
+
183
+ if (this.lineCount < 1) {
184
+ errors.push('Boundary must contain at least one line');
185
+ }
186
+
187
+ return {
188
+ isValid: errors.length === 0,
189
+ errors
190
+ };
191
+ }
192
+
193
+ /**
194
+ * Calculate boundary score for prioritization
195
+ * @returns {number} Boundary score
196
+ */
197
+ calculateScore() {
198
+ let score = 0;
199
+
200
+ // Score from cohesion
201
+ const cohesionScores = {
202
+ [COHESION_LEVELS.HIGH]: 100,
203
+ [COHESION_LEVELS.MEDIUM]: 75,
204
+ [COHESION_LEVELS.LOW]: 50,
205
+ [COHESION_LEVELS.NONE]: 25
206
+ };
207
+ score += cohesionScores[this.cohesion] || 25;
208
+
209
+ // Score from extractability
210
+ if (this.isExtractable()) {
211
+ score += 50;
212
+ }
213
+
214
+ // Score from size (prefer smaller boundaries)
215
+ if (this.lineCount <= 50) {
216
+ score += 30;
217
+ } else if (this.lineCount <= 100) {
218
+ score += 20;
219
+ } else if (this.lineCount <= 200) {
220
+ score += 10;
221
+ }
222
+
223
+ // Score from confidence
224
+ score += this.metadata.confidence * 20;
225
+
226
+ // Deduct for high complexity
227
+ if (this.complexity > 50) {
228
+ score -= 20;
229
+ } else if (this.complexity > 30) {
230
+ score -= 10;
231
+ }
232
+
233
+ return Math.max(0, Math.min(100, score));
234
+ }
235
+
236
+ /**
237
+ * Convert to JSON
238
+ * @returns {Object} Boundary as JSON object
239
+ */
240
+ toJSON() {
241
+ return {
242
+ id: this.id,
243
+ type: this.type,
244
+ name: this.name,
245
+ startLine: this.startLine,
246
+ endLine: this.endLine,
247
+ filePath: this.filePath,
248
+ lineCount: this.lineCount,
249
+ cohesion: this.cohesion,
250
+ complexity: this.complexity,
251
+ dependencies: this.dependencies,
252
+ exports: this.exports,
253
+ internalReferences: this.internalReferences,
254
+ externalReferences: this.externalReferences,
255
+ metadata: this.metadata
256
+ };
257
+ }
258
+ }
259
+
260
+ /**
261
+ * Boundary collection class
262
+ */
263
+ class BoundaryCollection {
264
+ constructor() {
265
+ this.boundaries = new Map();
266
+ this.metadata = {
267
+ createdAt: new Date().toISOString(),
268
+ filePath: null,
269
+ totalBoundaries: 0,
270
+ extractableBoundaries: 0
271
+ };
272
+ }
273
+
274
+ /**
275
+ * Add boundary to collection
276
+ * @param {ModuleBoundary} boundary - Boundary to add
277
+ */
278
+ addBoundary(boundary) {
279
+ if (boundary.validate().isValid) {
280
+ this.boundaries.set(boundary.id, boundary);
281
+ this.updateMetadata();
282
+ }
283
+ }
284
+
285
+ /**
286
+ * Get boundary by ID
287
+ * @param {string} id - Boundary ID
288
+ * @returns {ModuleBoundary|null} Boundary or null
289
+ */
290
+ getBoundary(id) {
291
+ return this.boundaries.get(id) || null;
292
+ }
293
+
294
+ /**
295
+ * Get all boundaries
296
+ * @returns {Array} Array of boundaries
297
+ */
298
+ getAllBoundaries() {
299
+ return Array.from(this.boundaries.values());
300
+ }
301
+
302
+ /**
303
+ * Get boundaries by type
304
+ * @param {string} type - Boundary type
305
+ * @returns {Array} Array of boundaries
306
+ */
307
+ getBoundariesByType(type) {
308
+ return this.getAllBoundaries().filter(b => b.type === type);
309
+ }
310
+
311
+ /**
312
+ * Get extractable boundaries
313
+ * @returns {Array} Array of extractable boundaries
314
+ */
315
+ getExtractableBoundaries() {
316
+ return this.getAllBoundaries().filter(b => b.isExtractable());
317
+ }
318
+
319
+ /**
320
+ * Get boundaries sorted by score
321
+ * @returns {Array} Sorted boundaries
322
+ */
323
+ getBoundariesByScore() {
324
+ return this.getAllBoundaries()
325
+ .sort((a, b) => b.calculateScore() - a.calculateScore());
326
+ }
327
+
328
+ /**
329
+ * Update collection metadata
330
+ */
331
+ updateMetadata() {
332
+ this.metadata.totalBoundaries = this.boundaries.size;
333
+ this.metadata.extractableBoundaries = this.getExtractableBoundaries().length;
334
+ }
335
+
336
+ /**
337
+ * Get collection summary
338
+ * @returns {Object} Collection summary
339
+ */
340
+ getSummary() {
341
+ const boundaries = this.getAllBoundaries();
342
+ const extractable = this.getExtractableBoundaries();
343
+
344
+ return {
345
+ totalBoundaries: boundaries.length,
346
+ extractableBoundaries: extractable.length,
347
+ averageComplexity: boundaries.length > 0
348
+ ? Math.round(boundaries.reduce((sum, b) => sum + b.complexity, 0) / boundaries.length)
349
+ : 0,
350
+ averageCohesion: this.calculateAverageCohesion(),
351
+ boundaryTypes: this.getBoundaryTypeDistribution(),
352
+ extractablePercentage: boundaries.length > 0
353
+ ? Math.round((extractable.length / boundaries.length) * 100)
354
+ : 0
355
+ };
356
+ }
357
+
358
+ /**
359
+ * Calculate average cohesion
360
+ * @returns {string} Average cohesion level
361
+ */
362
+ calculateAverageCohesion() {
363
+ const boundaries = this.getAllBoundaries();
364
+ if (boundaries.length === 0) return COHESION_LEVELS.NONE;
365
+
366
+ const cohesionValues = {
367
+ [COHESION_LEVELS.HIGH]: 4,
368
+ [COHESION_LEVELS.MEDIUM]: 3,
369
+ [COHESION_LEVELS.LOW]: 2,
370
+ [COHESION_LEVELS.NONE]: 1
371
+ };
372
+
373
+ const totalScore = boundaries.reduce((sum, b) => {
374
+ return sum + (cohesionValues[b.cohesion] || 1);
375
+ }, 0);
376
+
377
+ const average = totalScore / boundaries.length;
378
+
379
+ if (average >= 3.5) return COHESION_LEVELS.HIGH;
380
+ if (average >= 2.5) return COHESION_LEVELS.MEDIUM;
381
+ if (average >= 1.5) return COHESION_LEVELS.LOW;
382
+ return COHESION_LEVELS.NONE;
383
+ }
384
+
385
+ /**
386
+ * Get boundary type distribution
387
+ * @returns {Object} Type distribution
388
+ */
389
+ getBoundaryTypeDistribution() {
390
+ const distribution = {};
391
+
392
+ for (const type of Object.values(BOUNDARY_TYPES)) {
393
+ distribution[type] = this.getBoundariesByType(type).length;
394
+ }
395
+
396
+ return distribution;
397
+ }
398
+ }
399
+
400
+ module.exports = {
401
+ BOUNDARY_TYPES,
402
+ COHESION_LEVELS,
403
+ ModuleBoundary,
404
+ BoundaryCollection
405
+ };