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.
- package/package.json +1 -1
- package/src/agents/AgentCheckDiscoveryService.js +180 -0
- package/src/agents/AgentCheckService.js +18 -261
- package/src/agents/AgentCheckStatisticsService.js +195 -0
- package/src/agents/EnvironmentConfigurationManager.js +31 -380
- package/src/agents/InstallationType.js +19 -6
- package/src/agents/SimpleAgentCheckService.js +472 -0
- package/src/agents/config-managers/ConfigUtils.js +72 -0
- package/src/agents/config-managers/DefaultConfig.js +58 -0
- package/src/agents/config-managers/EnvVarLoader.js +66 -0
- package/src/agents/config-managers/FileConfigLoader.js +124 -0
- package/src/agents/config-managers/TypeConverters.js +61 -0
- package/src/agents/config-managers/VariableMappings.js +92 -0
- package/src/agents/discovery/AgentDiscoveryService-refactored.js +272 -0
- package/src/agents/discovery/AgentDiscoveryService.js +29 -403
- package/src/agents/discovery/agent-validator.js +262 -0
- package/src/agents/discovery/discovery-results.js +176 -0
- package/src/agents/discovery/discovery-scanner.js +268 -0
- package/src/agents/discovery/discovery-utils.js +161 -0
- package/src/agents/discovery/executable-analyzer.js +290 -0
- package/src/agents/discovery/history-manager.js +310 -0
- package/src/agents/verification/ResultAnalyzer-refactored.js +341 -0
- package/src/agents/verification/ResultAnalyzer.js +30 -431
- package/src/agents/verification/analysis-utils.js +310 -0
- package/src/agents/verification/batch-analyzer.js +440 -0
- package/src/agents/verification/pattern-recognizer.js +369 -0
- package/src/agents/verification/report-generator.js +320 -0
- package/src/agents/verification/test-analyzer.js +290 -0
- package/src/agents/windows/InstallerFactory.js +4 -0
- package/src/agents/windows/VSCodeExtensionInstaller.js +404 -0
- package/src/analysis/analysis-engine.js +314 -0
- package/src/analysis/ast-analyzer.js +342 -0
- package/src/analysis/boundary-detector-refactored.js +378 -0
- package/src/analysis/boundary-detector.js +200 -603
- package/src/analysis/boundary-scanner.js +609 -0
- package/src/analysis/boundary-types.js +118 -0
- package/src/analysis/boundary-utils.js +293 -0
- package/src/analysis/deadline-priority-calculator.js +18 -0
- package/src/analysis/detection-methods.js +347 -0
- package/src/analysis/importance-priority-calculator.js +18 -0
- package/src/analysis/priority/factor-calculators.js +204 -0
- package/src/analysis/priority/factor-helpers.js +71 -0
- package/src/analysis/priority/priority-constants.js +73 -0
- package/src/analysis/priority/priority-factor-calculators.js +301 -0
- package/src/analysis/priority/reasons-generator.js +44 -0
- package/src/analysis/priority-calculator.js +15 -580
- package/src/analysis/strategy-generator.js +16 -66
- package/src/analysis/type-priority-calculator.js +18 -0
- package/src/analysis/urgency-priority-calculator.js +18 -0
- package/src/auto-mode/AutoModeBusinessLogic.js +2 -40
- package/src/commands/disable-requirement.js +60 -0
- package/src/commands/disable-spec.js +60 -0
- package/src/commands/enable-requirement.js +60 -0
- package/src/commands/enable-spec.js +60 -0
- package/src/commands/registry.js +1 -6
- package/src/commands/requirements.js +8 -2
- package/src/ide-integration/applescript-manager.cjs +9 -24
- package/src/ide-integration/cdp-handlers/chat-reader.js +44 -0
- package/src/ide-integration/cdp-handlers/connection-handler.js +88 -0
- package/src/ide-integration/cdp-handlers/continuation-handler.js +314 -0
- package/src/ide-integration/cdp-handlers/message-submitter.js +75 -0
- package/src/ide-integration/cdp-handlers/text-sender.js +138 -0
- package/src/ide-integration/cdp-manager.js +28 -573
- package/src/ide-integration/claude-code-cli-manager.cjs +48 -12
- package/src/ide-integration/ide-openers/claude-opener.js +171 -0
- package/src/ide-integration/ide-openers/cursor-opener.js +53 -0
- package/src/ide-integration/ide-openers/other-ides-opener.js +230 -0
- package/src/ide-integration/ide-openers/vscode-opener.js +147 -0
- package/src/ide-integration/macos-ide-manager.js +20 -582
- package/src/ide-integration/macos-quota-checker.js +164 -0
- package/src/ide-integration/macos-text-sender.js +19 -38
- package/src/ide-integration/provider-manager.cjs +52 -7
- package/src/index.cjs +6 -0
- package/src/index.js +10 -0
- package/src/llm/direct-llm-manager.cjs +501 -0
- package/src/localization/translations/en-part1.js +363 -0
- package/src/localization/translations/en-part2.js +320 -0
- package/src/localization/translations/en.js +4 -687
- package/src/localization/translations/es-part1.js +363 -0
- package/src/localization/translations/es-part2.js +320 -0
- package/src/localization/translations/es.js +4 -688
- package/src/models/file-analysis-collection.js +139 -0
- package/src/models/file-analysis-metrics.js +50 -0
- package/src/models/file-analysis.js +15 -262
- package/src/models/plan-manager.js +410 -0
- package/src/models/refactoring-models.js +380 -0
- package/src/models/refactoring-plan-refactored.js +81 -0
- package/src/models/refactoring-plan.js +2 -663
- package/src/monitoring/alert-system.js +4 -45
- package/src/monitoring/continuous-scan-notifications.js +37 -191
- package/src/monitoring/notification-handlers/base-handler.js +58 -0
- package/src/monitoring/notification-handlers/error-handler.js +36 -0
- package/src/monitoring/notification-handlers/index.js +21 -0
- package/src/monitoring/notification-handlers/new-violation-handler.js +91 -0
- package/src/monitoring/notification-handlers/progress-handler.js +48 -0
- package/src/monitoring/notification-handlers/resolved-violation-handler.js +54 -0
- package/src/monitoring/notification-handlers/threshold-handler.js +36 -0
- package/src/provider-registry.js +8 -0
- package/src/refactoring/boundary/boundary-detector-refactored.js +58 -0
- package/src/refactoring/boundary/boundary-detector.js +26 -596
- package/src/refactoring/boundary/detectors/boundary-analyzers.js +281 -0
- package/src/refactoring/boundary/detectors/boundary-core.js +167 -0
- package/src/refactoring/boundary/detectors/class-detector.js +247 -0
- package/src/refactoring/boundary/detectors/config-detector.js +270 -0
- package/src/refactoring/boundary/detectors/constant-detector.js +269 -0
- package/src/refactoring/boundary/detectors/function-detector.js +248 -0
- package/src/refactoring/boundary/detectors/module-detector.js +249 -0
- package/src/refactoring/boundary/detectors/object-detector.js +247 -0
- package/src/refactoring/boundary/detectors/type-detectors.js +338 -0
- package/src/refactoring/boundary/detectors/utility-detector.js +270 -0
- package/src/refactoring/circular-dependency-resolver-original.js +16 -76
- package/src/refactoring/code-mover-refactored.js +309 -0
- package/src/refactoring/code-mover.js +48 -355
- package/src/refactoring/execution-status.js +18 -0
- package/src/refactoring/execution-strategies.js +172 -0
- package/src/refactoring/file-splitter-core.js +568 -0
- package/src/refactoring/file-splitter-types.js +136 -0
- package/src/refactoring/file-splitter.js +2 -682
- package/src/refactoring/functionality-validator.js +11 -51
- package/src/refactoring/import-manager-refactored.js +385 -0
- package/src/refactoring/import-manager.js +112 -487
- package/src/refactoring/import-models.js +189 -0
- package/src/refactoring/import-parser.js +306 -0
- package/src/refactoring/move-executor.js +431 -0
- package/src/refactoring/move-utils.js +368 -0
- package/src/refactoring/operation-executor.js +76 -0
- package/src/refactoring/plan-creator.js +36 -0
- package/src/refactoring/plan-executor.js +143 -0
- package/src/refactoring/plan-validator.js +68 -0
- package/src/refactoring/refactoring-executor-result.js +70 -0
- package/src/refactoring/refactoring-executor.js +34 -569
- package/src/refactoring/refactoring-operation.js +94 -0
- package/src/refactoring/refactoring-plan.js +69 -0
- package/src/refactoring/refactoring-rollback.js +22 -527
- package/src/refactoring/rollback-handlers/RollbackExecutor.js +107 -0
- package/src/refactoring/rollback-handlers/RollbackManager.js +265 -0
- package/src/refactoring/rollback-handlers/RollbackOperation.js +105 -0
- package/src/refactoring/rollback-handlers/RollbackResult.js +109 -0
- package/src/refactoring/rollback-handlers/RollbackStatistics.js +77 -0
- package/src/refactoring/test-validator.js +32 -448
- package/src/refactoring/validation/baseline-runner.js +71 -0
- package/src/refactoring/validation/report-generator.js +136 -0
- package/src/refactoring/validation/result-comparator.js +92 -0
- package/src/refactoring/validation/test-suite.js +59 -0
- package/src/refactoring/validation/test-validation-result.js +83 -0
- package/src/refactoring/validation/validation-runner.js +95 -0
- package/src/refactoring/validation/validation-status.js +18 -0
- package/src/rui/commands/AgentCommandParser.js +60 -369
- package/src/rui/commands/AgentResponseFormatter.js +7 -47
- package/src/rui/commands/parsers/CommandMapper.js +148 -0
- package/src/rui/commands/parsers/CommandValidator.js +228 -0
- package/src/rui/commands/parsers/ComponentExtractor.js +100 -0
- package/src/rui/commands/parsers/TokenParser.js +69 -0
- package/src/rui/commands/parsers/tokenizer.js +153 -0
- package/src/utils/current-requirement-operations.js +50 -1
- package/src/utils/report-generator.js +18 -514
- package/src/utils/report-generators/analysis-generator.js +115 -0
- package/src/utils/report-generators/base-generator.js +141 -0
- package/src/utils/report-generators/compliance-generator.js +41 -0
- package/src/utils/report-generators/format-handlers.js +185 -0
- package/src/utils/report-generators/refactoring-generator.js +46 -0
- package/src/utils/report-generators/validation-generator.js +63 -0
- package/src/utils/requirement-enable-disable.js +265 -0
- package/src/utils/requirement-helpers/requirement-file-ops.js +69 -1
- package/src/utils/requirement-helpers/requirement-mover.js +88 -1
- package/src/utils/requirement-helpers.js +5 -2
- package/src/utils/smoke-test-cli.js +45 -8
- package/src/utils/specification-enable-disable.js +122 -0
- package/src/utils/specification-helpers.js +30 -4
- package/src/utils/specification-migration.js +5 -5
- package/src/utils/test-comparator.js +118 -0
- package/src/utils/test-config.js +54 -0
- package/src/utils/test-executor.js +133 -0
- package/src/utils/test-parser.js +215 -0
- package/src/utils/test-runner-baseline.js +63 -0
- package/src/utils/test-runner-core.js +98 -0
- package/src/utils/test-runner-report.js +39 -0
- package/src/utils/test-runner-validation.js +71 -0
- package/src/utils/test-runner.js +11 -535
- package/src/validation/comparison-analyzer.js +333 -0
- package/src/validation/compliance-reporter-new.js +282 -0
- package/src/validation/compliance-reporter-refactored.js +344 -0
- package/src/validation/compliance-reporter.js +278 -591
- package/src/validation/compliance-utils.js +278 -0
- package/src/validation/html-generator.js +446 -0
- package/src/validation/metrics/category-calculator.js +137 -0
- package/src/validation/metrics/metrics-helpers.js +155 -0
- package/src/validation/metrics/overview-calculator.js +85 -0
- package/src/validation/metrics/overview-metrics.js +41 -0
- package/src/validation/metrics/quality-calculator.js +166 -0
- package/src/validation/metrics/size-calculator.js +69 -0
- 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;
|