vibecodingmachine-core 2026.2.26-1739 → 2026.3.9-850

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 (192) hide show
  1. package/package.json +1 -1
  2. package/src/agents/AgentCheckDiscoveryService.js +180 -0
  3. package/src/agents/AgentCheckService.js +18 -261
  4. package/src/agents/AgentCheckStatisticsService.js +195 -0
  5. package/src/agents/EnvironmentConfigurationManager.js +31 -380
  6. package/src/agents/InstallationType.js +19 -6
  7. package/src/agents/SimpleAgentCheckService.js +472 -0
  8. package/src/agents/config-managers/ConfigUtils.js +72 -0
  9. package/src/agents/config-managers/DefaultConfig.js +58 -0
  10. package/src/agents/config-managers/EnvVarLoader.js +66 -0
  11. package/src/agents/config-managers/FileConfigLoader.js +124 -0
  12. package/src/agents/config-managers/TypeConverters.js +61 -0
  13. package/src/agents/config-managers/VariableMappings.js +92 -0
  14. package/src/agents/discovery/AgentDiscoveryService-refactored.js +272 -0
  15. package/src/agents/discovery/AgentDiscoveryService.js +29 -403
  16. package/src/agents/discovery/agent-validator.js +262 -0
  17. package/src/agents/discovery/discovery-results.js +176 -0
  18. package/src/agents/discovery/discovery-scanner.js +268 -0
  19. package/src/agents/discovery/discovery-utils.js +161 -0
  20. package/src/agents/discovery/executable-analyzer.js +290 -0
  21. package/src/agents/discovery/history-manager.js +310 -0
  22. package/src/agents/verification/ResultAnalyzer-refactored.js +341 -0
  23. package/src/agents/verification/ResultAnalyzer.js +30 -431
  24. package/src/agents/verification/analysis-utils.js +310 -0
  25. package/src/agents/verification/batch-analyzer.js +440 -0
  26. package/src/agents/verification/pattern-recognizer.js +369 -0
  27. package/src/agents/verification/report-generator.js +320 -0
  28. package/src/agents/verification/test-analyzer.js +290 -0
  29. package/src/agents/windows/InstallerFactory.js +4 -0
  30. package/src/agents/windows/VSCodeExtensionInstaller.js +404 -0
  31. package/src/analysis/analysis-engine.js +314 -0
  32. package/src/analysis/ast-analyzer.js +342 -0
  33. package/src/analysis/boundary-detector-refactored.js +378 -0
  34. package/src/analysis/boundary-detector.js +200 -603
  35. package/src/analysis/boundary-scanner.js +609 -0
  36. package/src/analysis/boundary-types.js +118 -0
  37. package/src/analysis/boundary-utils.js +293 -0
  38. package/src/analysis/deadline-priority-calculator.js +18 -0
  39. package/src/analysis/detection-methods.js +347 -0
  40. package/src/analysis/importance-priority-calculator.js +18 -0
  41. package/src/analysis/priority/factor-calculators.js +204 -0
  42. package/src/analysis/priority/factor-helpers.js +71 -0
  43. package/src/analysis/priority/priority-constants.js +73 -0
  44. package/src/analysis/priority/priority-factor-calculators.js +301 -0
  45. package/src/analysis/priority/reasons-generator.js +44 -0
  46. package/src/analysis/priority-calculator.js +15 -580
  47. package/src/analysis/strategy-generator.js +16 -66
  48. package/src/analysis/type-priority-calculator.js +18 -0
  49. package/src/analysis/urgency-priority-calculator.js +18 -0
  50. package/src/auto-mode/AutoModeBusinessLogic.js +2 -40
  51. package/src/commands/disable-requirement.js +60 -0
  52. package/src/commands/disable-spec.js +60 -0
  53. package/src/commands/enable-requirement.js +60 -0
  54. package/src/commands/enable-spec.js +60 -0
  55. package/src/commands/registry.js +1 -6
  56. package/src/commands/requirements.js +8 -2
  57. package/src/ide-integration/applescript-manager.cjs +9 -24
  58. package/src/ide-integration/cdp-handlers/chat-reader.js +44 -0
  59. package/src/ide-integration/cdp-handlers/connection-handler.js +88 -0
  60. package/src/ide-integration/cdp-handlers/continuation-handler.js +314 -0
  61. package/src/ide-integration/cdp-handlers/message-submitter.js +75 -0
  62. package/src/ide-integration/cdp-handlers/text-sender.js +138 -0
  63. package/src/ide-integration/cdp-manager.js +28 -573
  64. package/src/ide-integration/claude-code-cli-manager.cjs +48 -12
  65. package/src/ide-integration/ide-openers/claude-opener.js +171 -0
  66. package/src/ide-integration/ide-openers/cursor-opener.js +53 -0
  67. package/src/ide-integration/ide-openers/other-ides-opener.js +230 -0
  68. package/src/ide-integration/ide-openers/vscode-opener.js +147 -0
  69. package/src/ide-integration/macos-ide-manager.js +20 -582
  70. package/src/ide-integration/macos-quota-checker.js +164 -0
  71. package/src/ide-integration/macos-text-sender.js +19 -38
  72. package/src/ide-integration/provider-manager.cjs +52 -7
  73. package/src/index.cjs +6 -0
  74. package/src/index.js +10 -0
  75. package/src/llm/direct-llm-manager.cjs +501 -0
  76. package/src/localization/translations/en-part1.js +363 -0
  77. package/src/localization/translations/en-part2.js +320 -0
  78. package/src/localization/translations/en.js +4 -687
  79. package/src/localization/translations/es-part1.js +363 -0
  80. package/src/localization/translations/es-part2.js +320 -0
  81. package/src/localization/translations/es.js +4 -688
  82. package/src/models/file-analysis-collection.js +139 -0
  83. package/src/models/file-analysis-metrics.js +50 -0
  84. package/src/models/file-analysis.js +15 -262
  85. package/src/models/plan-manager.js +410 -0
  86. package/src/models/refactoring-models.js +380 -0
  87. package/src/models/refactoring-plan-refactored.js +81 -0
  88. package/src/models/refactoring-plan.js +2 -663
  89. package/src/monitoring/alert-system.js +4 -45
  90. package/src/monitoring/continuous-scan-notifications.js +37 -191
  91. package/src/monitoring/notification-handlers/base-handler.js +58 -0
  92. package/src/monitoring/notification-handlers/error-handler.js +36 -0
  93. package/src/monitoring/notification-handlers/index.js +21 -0
  94. package/src/monitoring/notification-handlers/new-violation-handler.js +91 -0
  95. package/src/monitoring/notification-handlers/progress-handler.js +48 -0
  96. package/src/monitoring/notification-handlers/resolved-violation-handler.js +54 -0
  97. package/src/monitoring/notification-handlers/threshold-handler.js +36 -0
  98. package/src/provider-registry.js +8 -0
  99. package/src/refactoring/boundary/boundary-detector-refactored.js +58 -0
  100. package/src/refactoring/boundary/boundary-detector.js +26 -596
  101. package/src/refactoring/boundary/detectors/boundary-analyzers.js +281 -0
  102. package/src/refactoring/boundary/detectors/boundary-core.js +167 -0
  103. package/src/refactoring/boundary/detectors/class-detector.js +247 -0
  104. package/src/refactoring/boundary/detectors/config-detector.js +270 -0
  105. package/src/refactoring/boundary/detectors/constant-detector.js +269 -0
  106. package/src/refactoring/boundary/detectors/function-detector.js +248 -0
  107. package/src/refactoring/boundary/detectors/module-detector.js +249 -0
  108. package/src/refactoring/boundary/detectors/object-detector.js +247 -0
  109. package/src/refactoring/boundary/detectors/type-detectors.js +338 -0
  110. package/src/refactoring/boundary/detectors/utility-detector.js +270 -0
  111. package/src/refactoring/circular-dependency-resolver-original.js +16 -76
  112. package/src/refactoring/code-mover-refactored.js +309 -0
  113. package/src/refactoring/code-mover.js +48 -355
  114. package/src/refactoring/execution-status.js +18 -0
  115. package/src/refactoring/execution-strategies.js +172 -0
  116. package/src/refactoring/file-splitter-core.js +568 -0
  117. package/src/refactoring/file-splitter-types.js +136 -0
  118. package/src/refactoring/file-splitter.js +2 -682
  119. package/src/refactoring/functionality-validator.js +11 -51
  120. package/src/refactoring/import-manager-refactored.js +385 -0
  121. package/src/refactoring/import-manager.js +112 -487
  122. package/src/refactoring/import-models.js +189 -0
  123. package/src/refactoring/import-parser.js +306 -0
  124. package/src/refactoring/move-executor.js +431 -0
  125. package/src/refactoring/move-utils.js +368 -0
  126. package/src/refactoring/operation-executor.js +76 -0
  127. package/src/refactoring/plan-creator.js +36 -0
  128. package/src/refactoring/plan-executor.js +143 -0
  129. package/src/refactoring/plan-validator.js +68 -0
  130. package/src/refactoring/refactoring-executor-result.js +70 -0
  131. package/src/refactoring/refactoring-executor.js +34 -569
  132. package/src/refactoring/refactoring-operation.js +94 -0
  133. package/src/refactoring/refactoring-plan.js +69 -0
  134. package/src/refactoring/refactoring-rollback.js +22 -527
  135. package/src/refactoring/rollback-handlers/RollbackExecutor.js +107 -0
  136. package/src/refactoring/rollback-handlers/RollbackManager.js +265 -0
  137. package/src/refactoring/rollback-handlers/RollbackOperation.js +105 -0
  138. package/src/refactoring/rollback-handlers/RollbackResult.js +109 -0
  139. package/src/refactoring/rollback-handlers/RollbackStatistics.js +77 -0
  140. package/src/refactoring/test-validator.js +32 -448
  141. package/src/refactoring/validation/baseline-runner.js +71 -0
  142. package/src/refactoring/validation/report-generator.js +136 -0
  143. package/src/refactoring/validation/result-comparator.js +92 -0
  144. package/src/refactoring/validation/test-suite.js +59 -0
  145. package/src/refactoring/validation/test-validation-result.js +83 -0
  146. package/src/refactoring/validation/validation-runner.js +95 -0
  147. package/src/refactoring/validation/validation-status.js +18 -0
  148. package/src/rui/commands/AgentCommandParser.js +60 -369
  149. package/src/rui/commands/AgentResponseFormatter.js +7 -47
  150. package/src/rui/commands/parsers/CommandMapper.js +148 -0
  151. package/src/rui/commands/parsers/CommandValidator.js +228 -0
  152. package/src/rui/commands/parsers/ComponentExtractor.js +100 -0
  153. package/src/rui/commands/parsers/TokenParser.js +69 -0
  154. package/src/rui/commands/parsers/tokenizer.js +153 -0
  155. package/src/utils/current-requirement-operations.js +50 -1
  156. package/src/utils/report-generator.js +18 -514
  157. package/src/utils/report-generators/analysis-generator.js +115 -0
  158. package/src/utils/report-generators/base-generator.js +141 -0
  159. package/src/utils/report-generators/compliance-generator.js +41 -0
  160. package/src/utils/report-generators/format-handlers.js +185 -0
  161. package/src/utils/report-generators/refactoring-generator.js +46 -0
  162. package/src/utils/report-generators/validation-generator.js +63 -0
  163. package/src/utils/requirement-enable-disable.js +265 -0
  164. package/src/utils/requirement-helpers/requirement-file-ops.js +69 -1
  165. package/src/utils/requirement-helpers/requirement-mover.js +88 -1
  166. package/src/utils/requirement-helpers.js +5 -2
  167. package/src/utils/smoke-test-cli.js +45 -8
  168. package/src/utils/specification-enable-disable.js +122 -0
  169. package/src/utils/specification-helpers.js +30 -4
  170. package/src/utils/specification-migration.js +5 -5
  171. package/src/utils/test-comparator.js +118 -0
  172. package/src/utils/test-config.js +54 -0
  173. package/src/utils/test-executor.js +133 -0
  174. package/src/utils/test-parser.js +215 -0
  175. package/src/utils/test-runner-baseline.js +63 -0
  176. package/src/utils/test-runner-core.js +98 -0
  177. package/src/utils/test-runner-report.js +39 -0
  178. package/src/utils/test-runner-validation.js +71 -0
  179. package/src/utils/test-runner.js +11 -535
  180. package/src/validation/comparison-analyzer.js +333 -0
  181. package/src/validation/compliance-reporter-new.js +282 -0
  182. package/src/validation/compliance-reporter-refactored.js +344 -0
  183. package/src/validation/compliance-reporter.js +278 -591
  184. package/src/validation/compliance-utils.js +278 -0
  185. package/src/validation/html-generator.js +446 -0
  186. package/src/validation/metrics/category-calculator.js +137 -0
  187. package/src/validation/metrics/metrics-helpers.js +155 -0
  188. package/src/validation/metrics/overview-calculator.js +85 -0
  189. package/src/validation/metrics/overview-metrics.js +41 -0
  190. package/src/validation/metrics/quality-calculator.js +166 -0
  191. package/src/validation/metrics/size-calculator.js +69 -0
  192. package/src/validation/metrics-calculator.js +27 -551
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Config Boundary Detection
3
+ */
4
+
5
+ const { BOUNDARY_TYPES } = require('../boundary-types');
6
+
7
+ /**
8
+ * Config boundary detector
9
+ */
10
+ class ConfigDetector {
11
+ constructor() {
12
+ this.patterns = this.initializePatterns();
13
+ }
14
+
15
+ /**
16
+ * Initialize detection patterns
17
+ * @returns {Object} Detection patterns
18
+ */
19
+ initializePatterns() {
20
+ return {
21
+ config: [
22
+ /(?:const|let|var)\s+\w*config\w*\s*=/,
23
+ /(?:const|let|var)\s+\w*Config\w*\s*=/,
24
+ /(?:const|let|var)\s+\w*Settings\w*\s*=/
25
+ ]
26
+ };
27
+ }
28
+
29
+ /**
30
+ * Detect config boundaries
31
+ * @param {Array} lines - Source code lines
32
+ * @param {string} filePath - File path
33
+ * @returns {Array} Array of config boundaries
34
+ */
35
+ detectConfigBoundaries(lines, filePath) {
36
+ const boundaries = [];
37
+
38
+ // Look for config object patterns
39
+ for (let i = 0; i < lines.length; i++) {
40
+ const line = lines[i].trim();
41
+
42
+ // Config object patterns
43
+ if (this.isConfigObject(line)) {
44
+ const configName = this.extractConfigObjectName(line);
45
+ if (configName) {
46
+ const boundary = this.createBoundary(
47
+ BOUNDARY_TYPES.CONFIG,
48
+ configName,
49
+ lines,
50
+ filePath,
51
+ i
52
+ );
53
+
54
+ if (boundary) {
55
+ boundaries.push(boundary);
56
+ }
57
+ }
58
+ }
59
+ }
60
+
61
+ return boundaries;
62
+ }
63
+
64
+ /**
65
+ * Check if line is config object
66
+ * @param {string} line - Code line
67
+ * @returns {boolean} Whether line is config object
68
+ */
69
+ isConfigObject(line) {
70
+ return this.patterns.config.some(pattern => pattern.test(line));
71
+ }
72
+
73
+ /**
74
+ * Extract config object name
75
+ * @param {string} line - Code line
76
+ * @returns {string|null} Config name
77
+ */
78
+ extractConfigObjectName(line) {
79
+ const match = line.match(/(?:const|let|var)\s+(\w*config\w*|\w*Config\w*|\w*Settings\w*)\s*=/);
80
+ return match ? match[1] : null;
81
+ }
82
+
83
+ /**
84
+ * Create boundary from detection
85
+ * @param {string} type - Boundary type
86
+ * @param {string} name - Boundary name
87
+ * @param {Array} lines - Source code lines
88
+ * @param {string} filePath - File path
89
+ * @param {number} startIndex - Start index in source
90
+ * @returns {Object|null} Boundary object or null
91
+ */
92
+ createBoundary(type, name, lines, filePath, startIndex) {
93
+ const { startLine, endLine } = this.findBoundaryExtent(lines, startIndex, type);
94
+
95
+ if (startLine === -1 || endLine === -1) {
96
+ return null;
97
+ }
98
+
99
+ const { ModuleBoundary } = require('../boundary-types');
100
+ const boundary = new ModuleBoundary(type, name, startLine + 1, endLine + 1, filePath);
101
+
102
+ // Basic analysis
103
+ this.analyzeBoundary(boundary, lines, startLine, endLine);
104
+
105
+ return boundary;
106
+ }
107
+
108
+ /**
109
+ * Find extent of a boundary
110
+ * @param {Array} lines - Source code lines
111
+ * @param {number} startIndex - Start index
112
+ * @param {string} type - Boundary type
113
+ * @returns {Object} Start and end line numbers
114
+ */
115
+ findBoundaryExtent(lines, startIndex, type) {
116
+ let startLine = -1;
117
+ let endLine = -1;
118
+ let braceCount = 0;
119
+ let inString = false;
120
+ let stringChar = null;
121
+
122
+ for (let i = startIndex; i < lines.length; i++) {
123
+ const line = lines[i];
124
+
125
+ // Track string literals
126
+ for (let j = 0; j < line.length; j++) {
127
+ const char = line[j];
128
+
129
+ if (!inString && (char === '"' || char === "'" || char === '`')) {
130
+ inString = true;
131
+ stringChar = char;
132
+ } else if (inString && char === stringChar) {
133
+ inString = false;
134
+ stringChar = null;
135
+ }
136
+ }
137
+
138
+ // Skip lines inside strings
139
+ if (inString) continue;
140
+
141
+ // Count braces for block detection
142
+ const openBraces = (line.match(/\{/g) || []).length;
143
+ const closeBraces = (line.match(/\}/g) || []).length;
144
+
145
+ braceCount += openBraces - closeBraces;
146
+
147
+ // Set start line on first detection
148
+ if (startLine === -1) {
149
+ startLine = i;
150
+ }
151
+
152
+ // End when braces are balanced and we're past start
153
+ if (braceCount <= 0 && i > startIndex) {
154
+ endLine = i;
155
+ break;
156
+ }
157
+ }
158
+
159
+ return { startLine, endLine };
160
+ }
161
+
162
+ /**
163
+ * Analyze boundary properties
164
+ * @param {Object} boundary - Boundary object
165
+ * @param {Array} lines - Source code lines
166
+ * @param {number} startLine - Start line number
167
+ * @param {number} endLine - End line number
168
+ */
169
+ analyzeBoundary(boundary, lines, startLine, endLine) {
170
+ const boundaryLines = lines.slice(startLine, endLine + 1);
171
+ const sourceCode = boundaryLines.join('\n');
172
+
173
+ // Calculate complexity
174
+ const complexity = this.calculateComplexity(sourceCode);
175
+ boundary.setComplexity(complexity);
176
+
177
+ // Find dependencies
178
+ const dependencies = this.findDependencies(sourceCode);
179
+ for (const dep of dependencies) {
180
+ boundary.addDependency(dep);
181
+ }
182
+
183
+ // Find exports
184
+ const exports = this.findExports(sourceCode, boundary.type);
185
+ for (const exp of exports) {
186
+ boundary.addExport(exp);
187
+ }
188
+ }
189
+
190
+ /**
191
+ * Calculate complexity score
192
+ * @param {string} sourceCode - Source code
193
+ * @returns {number} Complexity score
194
+ */
195
+ calculateComplexity(sourceCode) {
196
+ let complexity = 0;
197
+
198
+ // Cyclomatic complexity indicators
199
+ complexity += (sourceCode.match(/if\s*\(/g) || []).length * 1;
200
+ complexity += (sourceCode.match(/else\s+if/g) || []).length * 1;
201
+ complexity += (sourceCode.match(/while\s*\(/g) || []).length * 2;
202
+ complexity += (sourceCode.match(/for\s*\(/g) || []).length * 2;
203
+ complexity += (sourceCode.match(/switch\s*\(/g) || []).length * 2;
204
+ complexity += (sourceCode.match(/catch\s*\(/g) || []).length * 2;
205
+ complexity += (sourceCode.match(/&&/g) || []).length * 1;
206
+ complexity += (sourceCode.match(/\|\|/g) || []).length * 1;
207
+
208
+ // Length complexity
209
+ const lineCount = sourceCode.split('\n').length;
210
+ if (lineCount > 50) complexity += 5;
211
+ if (lineCount > 100) complexity += 10;
212
+ if (lineCount > 200) complexity += 20;
213
+
214
+ return Math.min(100, complexity);
215
+ }
216
+
217
+ /**
218
+ * Find dependencies in boundary
219
+ * @param {string} sourceCode - Source code
220
+ * @returns {Array} Array of dependencies
221
+ */
222
+ findDependencies(sourceCode) {
223
+ const dependencies = [];
224
+
225
+ // Import statements
226
+ const importMatches = sourceCode.match(/import\s+.+from\s+['"]([^'"]+)['"]/g);
227
+ if (importMatches) {
228
+ for (const match of importMatches) {
229
+ dependencies.push(match[1]);
230
+ }
231
+ }
232
+
233
+ // Require statements
234
+ const requireMatches = sourceCode.match(/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g);
235
+ if (requireMatches) {
236
+ for (const match of requireMatches) {
237
+ dependencies.push(match[1]);
238
+ }
239
+ }
240
+
241
+ return [...new Set(dependencies)];
242
+ }
243
+
244
+ /**
245
+ * Find exports in boundary
246
+ * @param {string} sourceCode - Source code
247
+ * @param {string} type - Boundary type
248
+ * @returns {Array} Array of exports
249
+ */
250
+ findExports(sourceCode, type) {
251
+ const exports = [];
252
+
253
+ if (type === BOUNDARY_TYPES.CONFIG) {
254
+ // Look for explicit exports
255
+ const exportMatches = sourceCode.match(/export\s+(?:default\s+)?(?:\w+|\{[^}]+\})/g);
256
+ if (exportMatches) {
257
+ for (const match of exportMatches) {
258
+ const exportName = match.replace(/export\s+(?:default\s+)?/, '').trim();
259
+ if (exportName && exportName !== '{' && exportName !== '}') {
260
+ exports.push(exportName);
261
+ }
262
+ }
263
+ }
264
+ }
265
+
266
+ return exports;
267
+ }
268
+ }
269
+
270
+ module.exports = ConfigDetector;
@@ -0,0 +1,269 @@
1
+ /**
2
+ * Constant Boundary Detection
3
+ */
4
+
5
+ const { BOUNDARY_TYPES } = require('../boundary-types');
6
+
7
+ /**
8
+ * Constant boundary detector
9
+ */
10
+ class ConstantDetector {
11
+ constructor() {
12
+ this.patterns = this.initializePatterns();
13
+ }
14
+
15
+ /**
16
+ * Initialize detection patterns
17
+ * @returns {Object} Detection patterns
18
+ */
19
+ initializePatterns() {
20
+ return {
21
+ constant: [
22
+ /const\s+[A-Z_][A-Z0-9_]*\s*=/,
23
+ /(?:const|let|var)\s+[A-Z_][A-Z0-9_]*/
24
+ ]
25
+ };
26
+ }
27
+
28
+ /**
29
+ * Detect constant boundaries
30
+ * @param {Array} lines - Source code lines
31
+ * @param {string} filePath - File path
32
+ * @returns {Array} Array of constant boundaries
33
+ */
34
+ detectConstantBoundaries(lines, filePath) {
35
+ const boundaries = [];
36
+
37
+ // Look for constant patterns
38
+ for (let i = 0; i < lines.length; i++) {
39
+ const line = lines[i].trim();
40
+
41
+ // Constant patterns
42
+ if (this.isConstantDeclaration(line)) {
43
+ const constantName = this.extractConstantName(line);
44
+ if (constantName) {
45
+ const boundary = this.createBoundary(
46
+ BOUNDARY_TYPES.CONSTANT,
47
+ constantName,
48
+ lines,
49
+ filePath,
50
+ i
51
+ );
52
+
53
+ if (boundary) {
54
+ boundaries.push(boundary);
55
+ }
56
+ }
57
+ }
58
+ }
59
+
60
+ return boundaries;
61
+ }
62
+
63
+ /**
64
+ * Check if line is constant declaration
65
+ * @param {string} line - Code line
66
+ * @returns {boolean} Whether line is constant declaration
67
+ */
68
+ isConstantDeclaration(line) {
69
+ return this.patterns.constant.some(pattern => pattern.test(line));
70
+ }
71
+
72
+ /**
73
+ * Extract constant name
74
+ * @param {string} line - Code line
75
+ * @returns {string|null} Constant name
76
+ */
77
+ extractConstantName(line) {
78
+ const match = line.match(/(?:const|let|var)\s+([A-Z_][A-Z0-9_]*)\s*=/);
79
+ return match ? match[1] : null;
80
+ }
81
+
82
+ /**
83
+ * Create boundary from detection
84
+ * @param {string} type - Boundary type
85
+ * @param {string} name - Boundary name
86
+ * @param {Array} lines - Source code lines
87
+ * @param {string} filePath - File path
88
+ * @param {number} startIndex - Start index in source
89
+ * @returns {Object|null} Boundary object or null
90
+ */
91
+ createBoundary(type, name, lines, filePath, startIndex) {
92
+ const { startLine, endLine } = this.findBoundaryExtent(lines, startIndex, type);
93
+
94
+ if (startLine === -1 || endLine === -1) {
95
+ return null;
96
+ }
97
+
98
+ const { ModuleBoundary } = require('../boundary-types');
99
+ const boundary = new ModuleBoundary(type, name, startLine + 1, endLine + 1, filePath);
100
+
101
+ // Basic analysis
102
+ this.analyzeBoundary(boundary, lines, startLine, endLine);
103
+
104
+ return boundary;
105
+ }
106
+
107
+ /**
108
+ * Find extent of a boundary
109
+ * @param {Array} lines - Source code lines
110
+ * @param {number} startIndex - Start index
111
+ * @param {string} type - Boundary type
112
+ * @returns {Object} Start and end line numbers
113
+ */
114
+ findBoundaryExtent(lines, startIndex, type) {
115
+ let startLine = -1;
116
+ let endLine = -1;
117
+ let braceCount = 0;
118
+ let inString = false;
119
+ let stringChar = null;
120
+
121
+ for (let i = startIndex; i < lines.length; i++) {
122
+ const line = lines[i];
123
+
124
+ // Track string literals
125
+ for (let j = 0; j < line.length; j++) {
126
+ const char = line[j];
127
+
128
+ if (!inString && (char === '"' || char === "'" || char === '`')) {
129
+ inString = true;
130
+ stringChar = char;
131
+ } else if (inString && char === stringChar) {
132
+ inString = false;
133
+ stringChar = null;
134
+ }
135
+ }
136
+
137
+ // Skip lines inside strings
138
+ if (inString) continue;
139
+
140
+ // Count braces for block detection
141
+ const openBraces = (line.match(/\{/g) || []).length;
142
+ const closeBraces = (line.match(/\}/g) || []).length;
143
+
144
+ braceCount += openBraces - closeBraces;
145
+
146
+ // Set start line on first detection
147
+ if (startLine === -1) {
148
+ startLine = i;
149
+ }
150
+
151
+ // End when braces are balanced and we're past start
152
+ if (braceCount <= 0 && i > startIndex) {
153
+ endLine = i;
154
+ break;
155
+ }
156
+ }
157
+
158
+ return { startLine, endLine };
159
+ }
160
+
161
+ /**
162
+ * Analyze boundary properties
163
+ * @param {Object} boundary - Boundary object
164
+ * @param {Array} lines - Source code lines
165
+ * @param {number} startLine - Start line number
166
+ * @param {number} endLine - End line number
167
+ */
168
+ analyzeBoundary(boundary, lines, startLine, endLine) {
169
+ const boundaryLines = lines.slice(startLine, endLine + 1);
170
+ const sourceCode = boundaryLines.join('\n');
171
+
172
+ // Calculate complexity
173
+ const complexity = this.calculateComplexity(sourceCode);
174
+ boundary.setComplexity(complexity);
175
+
176
+ // Find dependencies
177
+ const dependencies = this.findDependencies(sourceCode);
178
+ for (const dep of dependencies) {
179
+ boundary.addDependency(dep);
180
+ }
181
+
182
+ // Find exports
183
+ const exports = this.findExports(sourceCode, boundary.type);
184
+ for (const exp of exports) {
185
+ boundary.addExport(exp);
186
+ }
187
+ }
188
+
189
+ /**
190
+ * Calculate complexity score
191
+ * @param {string} sourceCode - Source code
192
+ * @returns {number} Complexity score
193
+ */
194
+ calculateComplexity(sourceCode) {
195
+ let complexity = 0;
196
+
197
+ // Cyclomatic complexity indicators
198
+ complexity += (sourceCode.match(/if\s*\(/g) || []).length * 1;
199
+ complexity += (sourceCode.match(/else\s+if/g) || []).length * 1;
200
+ complexity += (sourceCode.match(/while\s*\(/g) || []).length * 2;
201
+ complexity += (sourceCode.match(/for\s*\(/g) || []).length * 2;
202
+ complexity += (sourceCode.match(/switch\s*\(/g) || []).length * 2;
203
+ complexity += (sourceCode.match(/catch\s*\(/g) || []).length * 2;
204
+ complexity += (sourceCode.match(/&&/g) || []).length * 1;
205
+ complexity += (sourceCode.match(/\|\|/g) || []).length * 1;
206
+
207
+ // Length complexity
208
+ const lineCount = sourceCode.split('\n').length;
209
+ if (lineCount > 50) complexity += 5;
210
+ if (lineCount > 100) complexity += 10;
211
+ if (lineCount > 200) complexity += 20;
212
+
213
+ return Math.min(100, complexity);
214
+ }
215
+
216
+ /**
217
+ * Find dependencies in boundary
218
+ * @param {string} sourceCode - Source code
219
+ * @returns {Array} Array of dependencies
220
+ */
221
+ findDependencies(sourceCode) {
222
+ const dependencies = [];
223
+
224
+ // Import statements
225
+ const importMatches = sourceCode.match(/import\s+.+from\s+['"]([^'"]+)['"]/g);
226
+ if (importMatches) {
227
+ for (const match of importMatches) {
228
+ dependencies.push(match[1]);
229
+ }
230
+ }
231
+
232
+ // Require statements
233
+ const requireMatches = sourceCode.match(/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g);
234
+ if (requireMatches) {
235
+ for (const match of requireMatches) {
236
+ dependencies.push(match[1]);
237
+ }
238
+ }
239
+
240
+ return [...new Set(dependencies)];
241
+ }
242
+
243
+ /**
244
+ * Find exports in boundary
245
+ * @param {string} sourceCode - Source code
246
+ * @param {string} type - Boundary type
247
+ * @returns {Array} Array of exports
248
+ */
249
+ findExports(sourceCode, type) {
250
+ const exports = [];
251
+
252
+ if (type === BOUNDARY_TYPES.CONSTANT) {
253
+ // Look for explicit exports
254
+ const exportMatches = sourceCode.match(/export\s+(?:default\s+)?(?:\w+|\{[^}]+\})/g);
255
+ if (exportMatches) {
256
+ for (const match of exportMatches) {
257
+ const exportName = match.replace(/export\s+(?:default\s+)?/, '').trim();
258
+ if (exportName && exportName !== '{' && exportName !== '}') {
259
+ exports.push(exportName);
260
+ }
261
+ }
262
+ }
263
+ }
264
+
265
+ return exports;
266
+ }
267
+ }
268
+
269
+ module.exports = ConstantDetector;