@loxia-labs/loxia-autopilot-one 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -54
- package/bin/cli.js +1 -115
- package/bin/loxia-terminal-v2.js +3 -0
- package/bin/loxia-terminal.js +3 -0
- package/bin/start-with-terminal.js +3 -0
- package/package.json +14 -15
- package/scripts/install-scanners.js +1 -235
- package/src/analyzers/CSSAnalyzer.js +1 -297
- package/src/analyzers/ConfigValidator.js +1 -690
- package/src/analyzers/ESLintAnalyzer.js +1 -320
- package/src/analyzers/JavaScriptAnalyzer.js +1 -261
- package/src/analyzers/PrettierFormatter.js +1 -247
- package/src/analyzers/PythonAnalyzer.js +1 -266
- package/src/analyzers/SecurityAnalyzer.js +1 -729
- package/src/analyzers/TypeScriptAnalyzer.js +1 -247
- package/src/analyzers/codeCloneDetector/analyzer.js +1 -344
- package/src/analyzers/codeCloneDetector/detector.js +1 -203
- package/src/analyzers/codeCloneDetector/index.js +1 -160
- package/src/analyzers/codeCloneDetector/parser.js +1 -199
- package/src/analyzers/codeCloneDetector/reporter.js +1 -148
- package/src/analyzers/codeCloneDetector/scanner.js +1 -59
- package/src/core/agentPool.js +1 -1474
- package/src/core/agentScheduler.js +1 -2147
- package/src/core/contextManager.js +1 -709
- package/src/core/messageProcessor.js +1 -732
- package/src/core/orchestrator.js +1 -548
- package/src/core/stateManager.js +1 -877
- package/src/index.js +1 -631
- package/src/interfaces/cli.js +1 -549
- package/src/interfaces/terminal/__tests__/smoke/advancedFeatures.test.js +1 -0
- package/src/interfaces/terminal/__tests__/smoke/agentControl.test.js +1 -0
- package/src/interfaces/terminal/__tests__/smoke/agents.test.js +1 -0
- package/src/interfaces/terminal/__tests__/smoke/components.test.js +1 -0
- package/src/interfaces/terminal/__tests__/smoke/connection.test.js +1 -0
- package/src/interfaces/terminal/__tests__/smoke/enhancements.test.js +1 -0
- package/src/interfaces/terminal/__tests__/smoke/imports.test.js +1 -0
- package/src/interfaces/terminal/__tests__/smoke/messages.test.js +1 -0
- package/src/interfaces/terminal/__tests__/smoke/tools.test.js +1 -0
- package/src/interfaces/terminal/api/apiClient.js +1 -0
- package/src/interfaces/terminal/api/messageRouter.js +1 -0
- package/src/interfaces/terminal/api/session.js +1 -0
- package/src/interfaces/terminal/api/websocket.js +1 -0
- package/src/interfaces/terminal/components/AgentCreator.js +1 -0
- package/src/interfaces/terminal/components/AgentEditor.js +1 -0
- package/src/interfaces/terminal/components/AgentSwitcher.js +1 -0
- package/src/interfaces/terminal/components/ErrorBoundary.js +1 -0
- package/src/interfaces/terminal/components/ErrorPanel.js +1 -0
- package/src/interfaces/terminal/components/Header.js +1 -0
- package/src/interfaces/terminal/components/HelpPanel.js +1 -0
- package/src/interfaces/terminal/components/InputBox.js +1 -0
- package/src/interfaces/terminal/components/Layout.js +1 -0
- package/src/interfaces/terminal/components/LoadingSpinner.js +1 -0
- package/src/interfaces/terminal/components/MessageList.js +1 -0
- package/src/interfaces/terminal/components/MultilineTextInput.js +1 -0
- package/src/interfaces/terminal/components/SearchPanel.js +1 -0
- package/src/interfaces/terminal/components/SettingsPanel.js +1 -0
- package/src/interfaces/terminal/components/StatusBar.js +1 -0
- package/src/interfaces/terminal/components/TextInput.js +1 -0
- package/src/interfaces/terminal/config/agentEditorConstants.js +1 -0
- package/src/interfaces/terminal/config/constants.js +1 -0
- package/src/interfaces/terminal/index.js +1 -0
- package/src/interfaces/terminal/state/useAgentControl.js +1 -0
- package/src/interfaces/terminal/state/useAgents.js +1 -0
- package/src/interfaces/terminal/state/useConnection.js +1 -0
- package/src/interfaces/terminal/state/useMessages.js +1 -0
- package/src/interfaces/terminal/state/useTools.js +1 -0
- package/src/interfaces/terminal/utils/debugLogger.js +1 -0
- package/src/interfaces/terminal/utils/settingsStorage.js +1 -0
- package/src/interfaces/terminal/utils/theme.js +1 -0
- package/src/interfaces/webServer.js +1 -2162
- package/src/modules/fileExplorer/controller.js +1 -280
- package/src/modules/fileExplorer/index.js +1 -37
- package/src/modules/fileExplorer/middleware.js +1 -92
- package/src/modules/fileExplorer/routes.js +1 -125
- package/src/modules/fileExplorer/types.js +1 -44
- package/src/services/aiService.js +1 -1232
- package/src/services/apiKeyManager.js +1 -164
- package/src/services/benchmarkService.js +1 -366
- package/src/services/budgetService.js +1 -539
- package/src/services/contextInjectionService.js +1 -247
- package/src/services/conversationCompactionService.js +1 -637
- package/src/services/errorHandler.js +1 -810
- package/src/services/fileAttachmentService.js +1 -544
- package/src/services/modelRouterService.js +1 -366
- package/src/services/modelsService.js +1 -322
- package/src/services/qualityInspector.js +1 -796
- package/src/services/tokenCountingService.js +1 -536
- package/src/tools/agentCommunicationTool.js +1 -1344
- package/src/tools/agentDelayTool.js +1 -485
- package/src/tools/asyncToolManager.js +1 -604
- package/src/tools/baseTool.js +1 -800
- package/src/tools/browserTool.js +1 -920
- package/src/tools/cloneDetectionTool.js +1 -621
- package/src/tools/dependencyResolverTool.js +1 -1215
- package/src/tools/fileContentReplaceTool.js +1 -875
- package/src/tools/fileSystemTool.js +1 -1107
- package/src/tools/fileTreeTool.js +1 -853
- package/src/tools/imageTool.js +1 -901
- package/src/tools/importAnalyzerTool.js +1 -1060
- package/src/tools/jobDoneTool.js +1 -248
- package/src/tools/seekTool.js +1 -956
- package/src/tools/staticAnalysisTool.js +1 -1778
- package/src/tools/taskManagerTool.js +1 -2873
- package/src/tools/terminalTool.js +1 -2304
- package/src/tools/webTool.js +1 -1430
- package/src/types/agent.js +1 -519
- package/src/types/contextReference.js +1 -972
- package/src/types/conversation.js +1 -730
- package/src/types/toolCommand.js +1 -747
- package/src/utilities/attachmentValidator.js +1 -292
- package/src/utilities/configManager.js +1 -582
- package/src/utilities/constants.js +1 -722
- package/src/utilities/directoryAccessManager.js +1 -535
- package/src/utilities/fileProcessor.js +1 -307
- package/src/utilities/logger.js +1 -436
- package/src/utilities/tagParser.js +1 -1246
- package/src/utilities/toolConstants.js +1 -317
- package/web-ui/build/index.html +2 -2
- package/web-ui/build/static/{index-Dy2bYbOa.css → index-CClD1090.css} +1 -1
- package/web-ui/build/static/{index-CjkkcnFA.js → index-lCBai6dX.js} +66 -67
|
@@ -1,148 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Formats and outputs clone detection results
|
|
5
|
-
*/
|
|
6
|
-
export class Reporter {
|
|
7
|
-
/**
|
|
8
|
-
* Generate comprehensive report
|
|
9
|
-
* @param {Array} clones - Analyzed clones with refactoring advice
|
|
10
|
-
* @param {Array} files - Parsed files
|
|
11
|
-
* @returns {Object} Report object
|
|
12
|
-
*/
|
|
13
|
-
generateReport(clones, files) {
|
|
14
|
-
const summary = this.generateSummary(clones, files);
|
|
15
|
-
|
|
16
|
-
return {
|
|
17
|
-
summary,
|
|
18
|
-
clones: clones.map(clone => this.formatClone(clone)),
|
|
19
|
-
metadata: {
|
|
20
|
-
generatedAt: new Date().toISOString(),
|
|
21
|
-
tool: 'code-clone-detector',
|
|
22
|
-
version: '1.0.0'
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Generate summary statistics
|
|
29
|
-
*/
|
|
30
|
-
generateSummary(clones, files) {
|
|
31
|
-
const totalFiles = files.length;
|
|
32
|
-
const totalClones = clones.length;
|
|
33
|
-
|
|
34
|
-
// Calculate total duplicated lines
|
|
35
|
-
const totalDuplicatedLines = clones.reduce((sum, clone) =>
|
|
36
|
-
sum + clone.metrics.duplicatedLines, 0
|
|
37
|
-
);
|
|
38
|
-
|
|
39
|
-
// Calculate total lines of code
|
|
40
|
-
const totalLines = files.reduce((sum, file) =>
|
|
41
|
-
sum + file.content.split('\n').length, 0
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
const duplicationPercentage = totalLines > 0
|
|
45
|
-
? ((totalDuplicatedLines / totalLines) * 100).toFixed(2)
|
|
46
|
-
: 0;
|
|
47
|
-
|
|
48
|
-
// Priority breakdown
|
|
49
|
-
const priorityCounts = {
|
|
50
|
-
high: clones.filter(c => c.refactoringAdvice.priority === 'high').length,
|
|
51
|
-
medium: clones.filter(c => c.refactoringAdvice.priority === 'medium').length,
|
|
52
|
-
low: clones.filter(c => c.refactoringAdvice.priority === 'low').length
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
return {
|
|
56
|
-
totalFiles,
|
|
57
|
-
totalClones,
|
|
58
|
-
totalDuplicatedLines,
|
|
59
|
-
duplicationPercentage: parseFloat(duplicationPercentage),
|
|
60
|
-
priorityCounts,
|
|
61
|
-
topRefactoringOpportunities: clones.slice(0, 5).map(c => c.id)
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Format clone for output
|
|
67
|
-
*/
|
|
68
|
-
formatClone(clone) {
|
|
69
|
-
return {
|
|
70
|
-
id: clone.id,
|
|
71
|
-
type: clone.type,
|
|
72
|
-
confidence: clone.confidence,
|
|
73
|
-
instances: clone.instances,
|
|
74
|
-
metrics: clone.metrics,
|
|
75
|
-
refactoringAdvice: clone.refactoringAdvice
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Save report to file
|
|
81
|
-
*/
|
|
82
|
-
saveReport(report, outputPath) {
|
|
83
|
-
try {
|
|
84
|
-
fs.writeFileSync(outputPath, JSON.stringify(report, null, 2));
|
|
85
|
-
console.log(`\nReport saved to: ${outputPath}`);
|
|
86
|
-
return true;
|
|
87
|
-
} catch (error) {
|
|
88
|
-
console.error('Error saving report:', error.message);
|
|
89
|
-
return false;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Print summary to console
|
|
95
|
-
*/
|
|
96
|
-
printSummary(report) {
|
|
97
|
-
const { summary } = report;
|
|
98
|
-
|
|
99
|
-
console.log('\n' + '='.repeat(60));
|
|
100
|
-
console.log('CODE CLONE DETECTION SUMMARY');
|
|
101
|
-
console.log('='.repeat(60));
|
|
102
|
-
console.log(`Total Files Analyzed: ${summary.totalFiles}`);
|
|
103
|
-
console.log(`Total Clone Groups Found: ${summary.totalClones}`);
|
|
104
|
-
console.log(`Total Duplicated Lines: ${summary.totalDuplicatedLines}`);
|
|
105
|
-
console.log(`Duplication Percentage: ${summary.duplicationPercentage}%`);
|
|
106
|
-
console.log('\nPriority Breakdown:');
|
|
107
|
-
console.log(` High Priority: ${summary.priorityCounts.high}`);
|
|
108
|
-
console.log(` Medium Priority: ${summary.priorityCounts.medium}`);
|
|
109
|
-
console.log(` Low Priority: ${summary.priorityCounts.low}`);
|
|
110
|
-
|
|
111
|
-
if (report.clones.length > 0) {
|
|
112
|
-
console.log('\n' + '-'.repeat(60));
|
|
113
|
-
console.log('TOP REFACTORING OPPORTUNITIES');
|
|
114
|
-
console.log('-'.repeat(60));
|
|
115
|
-
|
|
116
|
-
report.clones.slice(0, 3).forEach((clone, idx) => {
|
|
117
|
-
console.log(`\n${idx + 1}. ${clone.id} [${clone.refactoringAdvice.priority.toUpperCase()} PRIORITY]`);
|
|
118
|
-
console.log(` Type: ${clone.type} (${(clone.confidence * 100).toFixed(0)}% confidence)`);
|
|
119
|
-
console.log(` Instances: ${clone.metrics.instanceCount} copies across ${clone.metrics.filesCovered} files`);
|
|
120
|
-
console.log(` Size: ${clone.metrics.lineCount} lines, ${clone.metrics.tokenCount} tokens`);
|
|
121
|
-
console.log(` Impact Score: ${clone.metrics.impactScore}`);
|
|
122
|
-
console.log(` Strategy: ${clone.refactoringAdvice.strategy}`);
|
|
123
|
-
console.log(` Suggested Name: ${clone.refactoringAdvice.suggestedName}`);
|
|
124
|
-
console.log(` Reasoning: ${clone.refactoringAdvice.reasoning}`);
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
console.log('\n' + '='.repeat(60));
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Generate AI-friendly summary
|
|
133
|
-
*/
|
|
134
|
-
generateAISummary(report) {
|
|
135
|
-
const topClone = report.clones[0];
|
|
136
|
-
|
|
137
|
-
if (!topClone) {
|
|
138
|
-
return 'No significant code duplication found in the project.';
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
let summary = `Found ${report.summary.totalClones} code clone groups with ${report.summary.duplicationPercentage}% duplication. `;
|
|
142
|
-
summary += `Top priority: ${topClone.refactoringAdvice.suggestedName} appears ${topClone.metrics.instanceCount} times. `;
|
|
143
|
-
summary += `Recommended action: ${topClone.refactoringAdvice.strategy}. `;
|
|
144
|
-
summary += topClone.refactoringAdvice.reasoning;
|
|
145
|
-
|
|
146
|
-
return summary;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
1
|
+
const a0_0x179fa4=a0_0x5d17;function a0_0x1e3b(){const _0x12ef24=['AgLNAa','icaGu3vNz2vZDgvKie5HBwu6ia','mZu0oti0mgftugv1yG','zM9YBwf0q2XVBMu','ve9qifjfrKfdve9ssu5hie9que9svfvosvrjrvm','mJfLCLvqthK','mZzeAw5ZuxG','mZy5nZa0mtbbtfnMEMy','mJq0nda3ChzdCufp','ChjPB3jPDhK','BwvKAxvT','BgvUz3rO','ihrVA2vUCW','BgLUzunVDw50','cLbYAw9YAxr5iejYzwfRzg93BJO','Aw5ZDgfUy2vZ','igXPBMvZlca','y2XVBMvZ','Bg93','CMvKDwnL','tM8GC2LNBMLMAwnHBNqGy29KzsbKDxbSAwnHDgLVBIbMB3vUzcbPBIb0AguGChjVAMvJDc4','ihrPBwvZlIa','Dg9vChbLCKnHC2u','vg90ywWGrhvWBgLJyxrLzcbmAw5LCZOG','icbiAwDOifbYAw9YAxr5oIa','rxjYB3iGC2f2Aw5NihjLCg9YDdO','zMLSDgvY','icbmB3CGuhjPB3jPDhK6ia','BwfW','ngL0AgPACW','Bwv0CMLJCW','uMvJB21Tzw5KzwqGywn0Aw9UoIa','icaGsw5ZDgfUy2vZoIa','Bg9N','ChjPB3jPDhLdB3vUDhm','C2XPy2u','ignVzguGy2XVBMuGz3jVDxbZihDPDgGG','icaGu3rYyxrLz3K6ia','zM9YrwfJAa','Dg90ywXeDxbSAwnHDgvKtgLUzxm','CMvMywn0B3jPBMDbzhzPy2u','zhvWBgLJyxrPB25qzxjJzw50ywDL','D3jPDgvgAwXLu3LUyW','Dg90ywXdBg9Uzxm','y29UzMLKzw5Jzq','C3bSAxq','mtaZodqZnvf1tw5YAW','mtCXotiZmMH4t2v2ua','rhvWBgLJyxrPB24GugvYy2vUDgfNztOG','mJaYndmWD2rhDNjP','z2vUzxjHDgvtDw1Tyxj5','y29Kzs1JBg9Uzs1KzxrLy3rVCG','C3vTBwfYEq','C3rYAw5NAwz5','Dg9ju09tDhjPBMC','DhLWzq','CMvHC29UAw5N','mte2ndiXm0jXCwDUyq','CMvWzwf0','BwvZC2fNzq','ChjPBNrtDw1Tyxj5','Aw5ZDgfUy2vdB3vUDa','z2vUzxjHDgvbsvn1Bw1HCNK','ifbssu9ssvrzxq','vg90ywWGq2XVBMuGr3jVDxbZiezVDw5KoIa'];a0_0x1e3b=function(){return _0x12ef24;};return a0_0x1e3b();}(function(_0x5c4b65,_0x2f78c9){const _0x344b68=a0_0x5d17,_0x4ba55a=_0x5c4b65();while(!![]){try{const _0x44eef0=-parseInt(_0x344b68(0xf5))/0x1+-parseInt(_0x344b68(0x125))/0x2*(parseInt(_0x344b68(0x110))/0x3)+-parseInt(_0x344b68(0x10a))/0x4+parseInt(_0x344b68(0xf8))/0x5*(-parseInt(_0x344b68(0x10e))/0x6)+-parseInt(_0x344b68(0x10d))/0x7*(parseInt(_0x344b68(0xf6))/0x8)+-parseInt(_0x344b68(0x100))/0x9+parseInt(_0x344b68(0x10f))/0xa;if(_0x44eef0===_0x2f78c9)break;else _0x4ba55a['push'](_0x4ba55a['shift']());}catch(_0x4b910a){_0x4ba55a['push'](_0x4ba55a['shift']());}}}(a0_0x1e3b,0x9060d));function a0_0x5d17(_0x412856,_0x2a0caf){_0x412856=_0x412856-0xe5;const _0x1e3bcf=a0_0x1e3b();let _0x5d1784=_0x1e3bcf[_0x412856];if(a0_0x5d17['oTDptV']===undefined){var _0x958c3b=function(_0x373af6){const _0x13b4fc='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2a7081='',_0x4fa87e='';for(let _0x17a744=0x0,_0x518025,_0x38e4df,_0x3f9b93=0x0;_0x38e4df=_0x373af6['charAt'](_0x3f9b93++);~_0x38e4df&&(_0x518025=_0x17a744%0x4?_0x518025*0x40+_0x38e4df:_0x38e4df,_0x17a744++%0x4)?_0x2a7081+=String['fromCharCode'](0xff&_0x518025>>(-0x2*_0x17a744&0x6)):0x0){_0x38e4df=_0x13b4fc['indexOf'](_0x38e4df);}for(let _0x37a7da=0x0,_0x363b24=_0x2a7081['length'];_0x37a7da<_0x363b24;_0x37a7da++){_0x4fa87e+='%'+('00'+_0x2a7081['charCodeAt'](_0x37a7da)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4fa87e);};a0_0x5d17['KcHjnk']=_0x958c3b,a0_0x5d17['guSEQv']={},a0_0x5d17['oTDptV']=!![];}const _0x419249=_0x1e3bcf[0x0],_0x183bf4=_0x412856+_0x419249,_0x37fa78=a0_0x5d17['guSEQv'][_0x183bf4];return!_0x37fa78?(_0x5d1784=a0_0x5d17['KcHjnk'](_0x5d1784),a0_0x5d17['guSEQv'][_0x183bf4]=_0x5d1784):_0x5d1784=_0x37fa78,_0x5d1784;}import a0_0x2a7081 from'fs';export class Reporter{['generateReport'](_0x4fa87e,_0x17a744){const _0x2a3467=a0_0x5d17,_0x518025=this[_0x2a3467(0xf9)](_0x4fa87e,_0x17a744);return{'summary':_0x518025,'clones':_0x4fa87e[_0x2a3467(0x124)](_0x38e4df=>this[_0x2a3467(0x10b)](_0x38e4df)),'metadata':{'generatedAt':new Date()[_0x2a3467(0xfd)](),'tool':_0x2a3467(0xfa),'version':'1.0.0'}};}[a0_0x179fa4(0xf9)](_0x3f9b93,_0x37a7da){const _0x344f59=a0_0x179fa4,_0x363b24=_0x37a7da['length'],_0x545177=_0x3f9b93['length'],_0x37d4b8=_0x3f9b93['reduce']((_0x4f02cd,_0x3313a3)=>_0x4f02cd+_0x3313a3[_0x344f59(0xe5)]['duplicatedLines'],0x0),_0x13e47e=_0x37a7da[_0x344f59(0x11b)]((_0x3198bf,_0x4e6073)=>_0x3198bf+_0x4e6073['content'][_0x344f59(0xf4)]('\x0a')[_0x344f59(0x113)],0x0),_0x38af05=_0x13e47e>0x0?(_0x37d4b8/_0x13e47e*0x64)['toFixed'](0x2):0x0,_0xdf42ee={'high':_0x3f9b93[_0x344f59(0x122)](_0x19adf8=>_0x19adf8['refactoringAdvice'][_0x344f59(0x111)]==='high')['length'],'medium':_0x3f9b93['filter'](_0x43294c=>_0x43294c['refactoringAdvice'][_0x344f59(0x111)]===_0x344f59(0x112))[_0x344f59(0x113)],'low':_0x3f9b93['filter'](_0x1e901f=>_0x1e901f['refactoringAdvice'][_0x344f59(0x111)]==='low')[_0x344f59(0x113)]};return{'totalFiles':_0x363b24,'totalClones':_0x545177,'totalDuplicatedLines':_0x37d4b8,'duplicationPercentage':parseFloat(_0x38af05),'priorityCounts':_0xdf42ee,'topRefactoringOpportunities':_0x3f9b93[_0x344f59(0xea)](0x0,0x5)['map'](_0x25c125=>_0x25c125['id'])};}[a0_0x179fa4(0x10b)](_0x49c834){const _0x122b44=a0_0x179fa4;return{'id':_0x49c834['id'],'type':_0x49c834[_0x122b44(0xfe)],'confidence':_0x49c834['confidence'],'instances':_0x49c834[_0x122b44(0x117)],'metrics':_0x49c834['metrics'],'refactoringAdvice':_0x49c834[_0x122b44(0xef)]};}['saveReport'](_0x1fb6ba,_0xe6c3db){const _0x1fabaa=a0_0x179fa4;try{return a0_0x2a7081[_0x1fabaa(0xf1)](_0xe6c3db,JSON[_0x1fabaa(0xfc)](_0x1fb6ba,null,0x2)),console[_0x1fabaa(0xe8)]('\x0aReport\x20saved\x20to:\x20'+_0xe6c3db),!![];}catch(_0x482278){return console['error'](_0x1fabaa(0x121),_0x482278[_0x1fabaa(0x102)]),![];}}[a0_0x179fa4(0x103)](_0x4a771d){const _0x455252=a0_0x179fa4,{summary:_0x2b8184}=_0x4a771d;console[_0x455252(0xe8)]('\x0a'+'='[_0x455252(0x101)](0x3c)),console['log']('CODE\x20CLONE\x20DETECTION\x20SUMMARY'),console['log']('='['repeat'](0x3c)),console['log']('Total\x20Files\x20Analyzed:\x20'+_0x2b8184['totalFiles']),console['log'](_0x455252(0x107)+_0x2b8184[_0x455252(0xf2)]),console[_0x455252(0xe8)](_0x455252(0x11f)+_0x2b8184[_0x455252(0xee)]),console['log'](_0x455252(0xf7)+_0x2b8184[_0x455252(0xf0)]+'%'),console[_0x455252(0xe8)](_0x455252(0x116)),console['log'](_0x455252(0x120)+_0x2b8184[_0x455252(0xe9)][_0x455252(0x108)]),console[_0x455252(0xe8)]('\x20\x20Medium\x20Priority:\x20'+_0x2b8184['priorityCounts'][_0x455252(0x112)]),console[_0x455252(0xe8)](_0x455252(0x123)+_0x2b8184[_0x455252(0xe9)][_0x455252(0x11a)]),_0x4a771d[_0x455252(0x119)][_0x455252(0x113)]>0x0&&(console[_0x455252(0xe8)]('\x0a'+'-'[_0x455252(0x101)](0x3c)),console['log'](_0x455252(0x10c)),console['log']('-'['repeat'](0x3c)),_0x4a771d['clones']['slice'](0x0,0x3)[_0x455252(0xed)]((_0x51aa9b,_0x5a5de3)=>{const _0x496ac0=_0x455252;console[_0x496ac0(0xe8)]('\x0a'+(_0x5a5de3+0x1)+'.\x20'+_0x51aa9b['id']+'\x20['+_0x51aa9b['refactoringAdvice'][_0x496ac0(0x111)][_0x496ac0(0x11e)]()+_0x496ac0(0x106)),console[_0x496ac0(0xe8)]('\x20\x20\x20Type:\x20'+_0x51aa9b['type']+'\x20('+(_0x51aa9b[_0x496ac0(0xf3)]*0x64)['toFixed'](0x0)+'%\x20confidence)'),console[_0x496ac0(0xe8)](_0x496ac0(0xe7)+_0x51aa9b[_0x496ac0(0xe5)][_0x496ac0(0x104)]+'\x20copies\x20across\x20'+_0x51aa9b['metrics']['filesCovered']+'\x20files'),console['log']('\x20\x20\x20Size:\x20'+_0x51aa9b[_0x496ac0(0xe5)][_0x496ac0(0x115)]+_0x496ac0(0x118)+_0x51aa9b['metrics']['tokenCount']+_0x496ac0(0x114)),console['log']('\x20\x20\x20Impact\x20Score:\x20'+_0x51aa9b['metrics']['impactScore']),console['log'](_0x496ac0(0xec)+_0x51aa9b['refactoringAdvice']['strategy']),console[_0x496ac0(0xe8)](_0x496ac0(0x109)+_0x51aa9b[_0x496ac0(0xef)]['suggestedName']),console[_0x496ac0(0xe8)]('\x20\x20\x20Reasoning:\x20'+_0x51aa9b[_0x496ac0(0xef)][_0x496ac0(0xff)]);})),console['log']('\x0a'+'='[_0x455252(0x101)](0x3c));}[a0_0x179fa4(0x105)](_0x357a2a){const _0x2c78d8=a0_0x179fa4,_0x527880=_0x357a2a[_0x2c78d8(0x119)][0x0];if(!_0x527880)return _0x2c78d8(0x11c);let _0x4bb159='Found\x20'+_0x357a2a[_0x2c78d8(0xfb)]['totalClones']+_0x2c78d8(0xeb)+_0x357a2a['summary'][_0x2c78d8(0xf0)]+'%\x20duplication.\x20';return _0x4bb159+='Top\x20priority:\x20'+_0x527880['refactoringAdvice']['suggestedName']+'\x20appears\x20'+_0x527880['metrics']['instanceCount']+_0x2c78d8(0x11d),_0x4bb159+=_0x2c78d8(0xe6)+_0x527880[_0x2c78d8(0xef)]['strategy']+'.\x20',_0x4bb159+=_0x527880['refactoringAdvice'][_0x2c78d8(0xff)],_0x4bb159;}}
|
|
@@ -1,59 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Scans project directory for source files
|
|
7
|
-
*/
|
|
8
|
-
export class FileScanner {
|
|
9
|
-
constructor(config) {
|
|
10
|
-
this.config = config;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Find all files matching the configuration
|
|
15
|
-
* @param {string} projectPath - Root directory to scan
|
|
16
|
-
* @returns {Promise<Array>} Array of file objects with path and content
|
|
17
|
-
*/
|
|
18
|
-
async scanProject(projectPath) {
|
|
19
|
-
const files = [];
|
|
20
|
-
|
|
21
|
-
// Find all matching files
|
|
22
|
-
for (const pattern of this.config.include) {
|
|
23
|
-
const matches = await glob(pattern, {
|
|
24
|
-
cwd: projectPath,
|
|
25
|
-
ignore: this.config.exclude,
|
|
26
|
-
absolute: true,
|
|
27
|
-
nodir: true
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
for (const filePath of matches) {
|
|
31
|
-
try {
|
|
32
|
-
const stats = fs.statSync(filePath);
|
|
33
|
-
|
|
34
|
-
// Skip files that are too large
|
|
35
|
-
if (stats.size > this.config.maxFileSize) {
|
|
36
|
-
console.warn(`Skipping large file: ${filePath}`);
|
|
37
|
-
continue;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const content = fs.readFileSync(filePath, 'utf-8');
|
|
41
|
-
const relativePath = path.relative(projectPath, filePath);
|
|
42
|
-
|
|
43
|
-
files.push({
|
|
44
|
-
path: relativePath,
|
|
45
|
-
absolutePath: filePath,
|
|
46
|
-
content,
|
|
47
|
-
size: stats.size,
|
|
48
|
-
extension: path.extname(filePath)
|
|
49
|
-
});
|
|
50
|
-
} catch (error) {
|
|
51
|
-
console.error(`Error reading file ${filePath}:`, error.message);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
console.log(`Found ${files.length} files to analyze`);
|
|
57
|
-
return files;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
1
|
+
function a0_0x26a3(_0x59b507,_0x41f50b){_0x59b507=_0x59b507-0x1e6;const _0x545b77=a0_0x545b();let _0x26a3d0=_0x545b77[_0x59b507];if(a0_0x26a3['ioCeoS']===undefined){var _0x1477b4=function(_0x3df5b3){const _0x907e16='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3cf719='',_0x52c288='';for(let _0xae9e03=0x0,_0x4b9813,_0x137e53,_0x49d5e2=0x0;_0x137e53=_0x3df5b3['charAt'](_0x49d5e2++);~_0x137e53&&(_0x4b9813=_0xae9e03%0x4?_0x4b9813*0x40+_0x137e53:_0x137e53,_0xae9e03++%0x4)?_0x3cf719+=String['fromCharCode'](0xff&_0x4b9813>>(-0x2*_0xae9e03&0x6)):0x0){_0x137e53=_0x907e16['indexOf'](_0x137e53);}for(let _0x52641b=0x0,_0x46b1ee=_0x3cf719['length'];_0x52641b<_0x46b1ee;_0x52641b++){_0x52c288+='%'+('00'+_0x3cf719['charCodeAt'](_0x52641b)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x52c288);};a0_0x26a3['hetNlj']=_0x1477b4,a0_0x26a3['UqlCmh']={},a0_0x26a3['ioCeoS']=!![];}const _0x58300d=_0x545b77[0x0],_0x496f0d=_0x59b507+_0x58300d,_0x3c409e=a0_0x26a3['UqlCmh'][_0x496f0d];return!_0x3c409e?(_0x26a3d0=a0_0x26a3['hetNlj'](_0x26a3d0),a0_0x26a3['UqlCmh'][_0x496f0d]=_0x26a3d0):_0x26a3d0=_0x3c409e,_0x26a3d0;}const a0_0x4bd2b2=a0_0x26a3;function a0_0x545b(){const _0x400331=['mJaYmMLisNzfDG','mJqYmJyWofj6Cw54tG','C2L6zq','y29UzMLN','nduWnJeXwfzfuLDT','zxH0BMfTzq','mJaZmtKXoer0AfLzsa','igzPBgvZihrVigfUywX5EMu','nJKZmtfSDxrss0S','ndy5nNLJuK9dwa','DxrMltG','C2nHBLbYB2PLy3q','ogv1vKDdsq','nJiWy2r5t2TA','ndq4nJK1mfL2zNvkwG','CMvSyxrPDMu','mtC0nKHOtw54yq','ndCZnu5dzg1grG','zxjYB3i','zxHJBhvKzq','rxjYB3iGCMvHzgLUzYbMAwXLia','mM5tu29jvG'];a0_0x545b=function(){return _0x400331;};return a0_0x545b();}(function(_0x15c364,_0x49686e){const _0x4f98ef=a0_0x26a3,_0x3f1549=_0x15c364();while(!![]){try{const _0x174445=parseInt(_0x4f98ef(0x1f2))/0x1*(parseInt(_0x4f98ef(0x1ed))/0x2)+parseInt(_0x4f98ef(0x1e8))/0x3*(parseInt(_0x4f98ef(0x1f7))/0x4)+-parseInt(_0x4f98ef(0x1e9))/0x5*(parseInt(_0x4f98ef(0x1ee))/0x6)+parseInt(_0x4f98ef(0x1f4))/0x7*(-parseInt(_0x4f98ef(0x1fa))/0x8)+parseInt(_0x4f98ef(0x1e6))/0x9+-parseInt(_0x4f98ef(0x1fb))/0xa*(parseInt(_0x4f98ef(0x1f6))/0xb)+-parseInt(_0x4f98ef(0x1ef))/0xc;if(_0x174445===_0x49686e)break;else _0x3f1549['push'](_0x3f1549['shift']());}catch(_0x23a176){_0x3f1549['push'](_0x3f1549['shift']());}}}(a0_0x545b,0x69186));import{glob}from'glob';import a0_0x3cf719 from'fs';import a0_0x52c288 from'path';export class FileScanner{constructor(_0xae9e03){this['config']=_0xae9e03;}async[a0_0x4bd2b2(0x1f9)](_0x4b9813){const _0x276f1f=a0_0x4bd2b2,_0x137e53=[];for(const _0x49d5e2 of this[_0x276f1f(0x1f1)]['include']){const _0x52641b=await glob(_0x49d5e2,{'cwd':_0x4b9813,'ignore':this[_0x276f1f(0x1f1)][_0x276f1f(0x1eb)],'absolute':!![],'nodir':!![]});for(const _0x46b1ee of _0x52641b){try{const _0x1db456=a0_0x3cf719['statSync'](_0x46b1ee);if(_0x1db456[_0x276f1f(0x1f0)]>this['config']['maxFileSize']){console['warn']('Skipping\x20large\x20file:\x20'+_0x46b1ee);continue;}const _0x4a0ed3=a0_0x3cf719['readFileSync'](_0x46b1ee,_0x276f1f(0x1f8)),_0x71bfaf=a0_0x52c288[_0x276f1f(0x1e7)](_0x4b9813,_0x46b1ee);_0x137e53['push']({'path':_0x71bfaf,'absolutePath':_0x46b1ee,'content':_0x4a0ed3,'size':_0x1db456['size'],'extension':a0_0x52c288[_0x276f1f(0x1f3)](_0x46b1ee)});}catch(_0xa9b2b6){console[_0x276f1f(0x1ea)](_0x276f1f(0x1ec)+_0x46b1ee+':',_0xa9b2b6['message']);}}}return console['log']('Found\x20'+_0x137e53['length']+_0x276f1f(0x1f5)),_0x137e53;}}
|