@loxia-labs/loxia-autopilot-one 1.0.1 → 1.0.4
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 +15 -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
|
+
function a0_0x5448(){const _0x47e155=['zhvWBgLJyxrPB25qzxjJzw50ywDL','ChjPB3jPDhLdB3vUDhm','CMvMywn0B3jPBMDbzhzPy2u','BwfW','jsbKDxbSAwnHDgLVBI4G','AgLNAa','nhnuEMn0Cq','Bg9N','CMvKDwnL','rhvWBgLJyxrPB24GugvYy2vUDgfNztOG','mZeWnJu3mgHMyKTABa','Aw1Wywn0u2nVCMu','zM9YBwf0q2XVBMu','mJyXwezIrKvn','mta5ouTwENrLwa','mtm2mte0mM9YzhPsvW','ChjPB3jPDhK','BgvUz3rO','Bwv0CMLJCW','vg90ywWGq2XVBMuGr3jVDxbZiezVDw5KoIa','y2XVBMvZ','C3vTBwfYEq','C2XPy2u','icaGu2L6ztOG','z2vUzxjHDgvszxbVCNq','Dg9gAxHLza','BgLUzunVDw50','BwvKAxvT','vg9WihbYAw9YAxr5oIa','CMvWzwf0','z2vUzxjHDgvtDw1Tyxj5','icbnzwrPDw0GuhjPB3jPDhK6ia','BwvZC2fNzq','DhLWzq','cLjLCg9YDcbZyxzLzcb0BZOG','ihrPBwvZlIa','rM91BMqG','Dg9Rzw5dB3vUDa','nJeYntmWvvrgtfrx','icbmB3CGuhjPB3jPDhK6ia','Dg90ywXeDxbSAwnHDgvKtgLUzxm','cLbYAw9YAxr5iejYzwfRzg93BJO','z2vUzxjHDgvbsvn1Bw1HCNK','zhvWBgLJyxrLzeXPBMvZ','mtm5ntK0neTes1rJsW','C3rYyxrLz3K','D3jPDgvgAwXLu3LUyW','jsbJB25MAwrLBMnLkq','ms4WlJa','y29UDgvUDa','icbiAwDOifbYAw9YAxr5oIa','mZiXmJK5zu5xtNLu','odq4uMfewNzR','ifbssu9ssvrzxq','ndy4mte0BNPjv1rK'];a0_0x5448=function(){return _0x47e155;};return a0_0x5448();}const a0_0x2d62a9=a0_0x3758;function a0_0x3758(_0x258be5,_0x6a2a0a){_0x258be5=_0x258be5-0x103;const _0x5448fa=a0_0x5448();let _0x37581c=_0x5448fa[_0x258be5];if(a0_0x3758['MZBvtl']===undefined){var _0x178065=function(_0x354e5a){const _0x4a6c8c='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x119c34='',_0x57f347='';for(let _0x48ef05=0x0,_0x5687d3,_0x2fd4c1,_0x28dbfa=0x0;_0x2fd4c1=_0x354e5a['charAt'](_0x28dbfa++);~_0x2fd4c1&&(_0x5687d3=_0x48ef05%0x4?_0x5687d3*0x40+_0x2fd4c1:_0x2fd4c1,_0x48ef05++%0x4)?_0x119c34+=String['fromCharCode'](0xff&_0x5687d3>>(-0x2*_0x48ef05&0x6)):0x0){_0x2fd4c1=_0x4a6c8c['indexOf'](_0x2fd4c1);}for(let _0x1977fe=0x0,_0x2e24f5=_0x119c34['length'];_0x1977fe<_0x2e24f5;_0x1977fe++){_0x57f347+='%'+('00'+_0x119c34['charCodeAt'](_0x1977fe)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x57f347);};a0_0x3758['aJRiZo']=_0x178065,a0_0x3758['zsJfML']={},a0_0x3758['MZBvtl']=!![];}const _0x4dea87=_0x5448fa[0x0],_0x3facf5=_0x258be5+_0x4dea87,_0x3b9e73=a0_0x3758['zsJfML'][_0x3facf5];return!_0x3b9e73?(_0x37581c=a0_0x3758['aJRiZo'](_0x37581c),a0_0x3758['zsJfML'][_0x3facf5]=_0x37581c):_0x37581c=_0x3b9e73,_0x37581c;}(function(_0x430f8,_0x2b2175){const _0x4908b2=a0_0x3758,_0x26a9cb=_0x430f8();while(!![]){try{const _0x503310=parseInt(_0x4908b2(0x11c))/0x1+parseInt(_0x4908b2(0x115))/0x2+-parseInt(_0x4908b2(0x12f))/0x3*(-parseInt(_0x4908b2(0x126))/0x4)+parseInt(_0x4908b2(0x12a))/0x5+parseInt(_0x4908b2(0x11f))/0x6+-parseInt(_0x4908b2(0x12e))/0x7*(parseInt(_0x4908b2(0x11d))/0x8)+-parseInt(_0x4908b2(0x12d))/0x9*(parseInt(_0x4908b2(0x10f))/0xa);if(_0x503310===_0x2b2175)break;else _0x26a9cb['push'](_0x26a9cb['shift']());}catch(_0x4e58fd){_0x26a9cb['push'](_0x26a9cb['shift']());}}}(a0_0x5448,0x5c9cb));import a0_0x119c34 from'fs';export class Reporter{[a0_0x2d62a9(0x138)](_0x57f347,_0x48ef05){const _0x256e72=a0_0x2d62a9,_0x5687d3=this['generateSummary'](_0x57f347,_0x48ef05);return{'summary':_0x5687d3,'clones':_0x57f347[_0x256e72(0x123)](_0x2fd4c1=>this[_0x256e72(0x12c)](_0x2fd4c1)),'metadata':{'generatedAt':new Date()['toISOString'](),'tool':'code-clone-detector','version':_0x256e72(0x119)}};}[a0_0x2d62a9(0x107)](_0x28dbfa,_0x1977fe){const _0x408cc9=a0_0x2d62a9,_0x2e24f5=_0x1977fe['length'],_0x1d6f5a=_0x28dbfa['length'],_0x54873e=_0x28dbfa['reduce']((_0x2661aa,_0x5f1f8c)=>_0x2661aa+_0x5f1f8c[_0x408cc9(0x132)][_0x408cc9(0x114)],0x0),_0x5a9bc2=_0x1977fe[_0x408cc9(0x128)]((_0xc76ce0,_0x553ad2)=>_0xc76ce0+_0x553ad2[_0x408cc9(0x11a)]['split']('\x0a')['length'],0x0),_0x3690e8=_0x5a9bc2>0x0?(_0x54873e/_0x5a9bc2*0x64)[_0x408cc9(0x139)](0x2):0x0,_0x37a01d={'high':_0x28dbfa['filter'](_0x13d0bb=>_0x13d0bb['refactoringAdvice'][_0x408cc9(0x130)]==='high')[_0x408cc9(0x131)],'medium':_0x28dbfa['filter'](_0x30fb1c=>_0x30fb1c['refactoringAdvice'][_0x408cc9(0x130)]===_0x408cc9(0x104))[_0x408cc9(0x131)],'low':_0x28dbfa['filter'](_0x5a4496=>_0x5a4496['refactoringAdvice']['priority']==='low')[_0x408cc9(0x131)]};return{'totalFiles':_0x2e24f5,'totalClones':_0x1d6f5a,'totalDuplicatedLines':_0x54873e,'duplicationPercentage':parseFloat(_0x3690e8),'priorityCounts':_0x37a01d,'topRefactoringOpportunities':_0x28dbfa['slice'](0x0,0x5)['map'](_0x4b1bb7=>_0x4b1bb7['id'])};}[a0_0x2d62a9(0x12c)](_0x251005){const _0x32b546=a0_0x2d62a9;return{'id':_0x251005['id'],'type':_0x251005['type'],'confidence':_0x251005['confidence'],'instances':_0x251005['instances'],'metrics':_0x251005[_0x32b546(0x132)],'refactoringAdvice':_0x251005[_0x32b546(0x122)]};}['saveReport'](_0x362bdd,_0x4345d0){const _0x5068a4=a0_0x2d62a9;try{return a0_0x119c34[_0x5068a4(0x117)](_0x4345d0,JSON['stringify'](_0x362bdd,null,0x2)),console[_0x5068a4(0x127)](_0x5068a4(0x10b)+_0x4345d0),!![];}catch(_0x236600){return console['error']('Error\x20saving\x20report:',_0x236600[_0x5068a4(0x109)]),![];}}['printSummary'](_0x167d9c){const _0x139793=a0_0x2d62a9,{summary:_0x464847}=_0x167d9c;console[_0x139793(0x127)]('\x0a'+'='['repeat'](0x3c)),console[_0x139793(0x127)]('CODE\x20CLONE\x20DETECTION\x20SUMMARY'),console[_0x139793(0x127)]('='[_0x139793(0x106)](0x3c)),console[_0x139793(0x127)]('Total\x20Files\x20Analyzed:\x20'+_0x464847['totalFiles']),console[_0x139793(0x127)](_0x139793(0x133)+_0x464847['totalClones']),console['log']('Total\x20Duplicated\x20Lines:\x20'+_0x464847[_0x139793(0x111)]),console['log'](_0x139793(0x129)+_0x464847[_0x139793(0x120)]+'%'),console[_0x139793(0x127)](_0x139793(0x112)),console[_0x139793(0x127)](_0x139793(0x11b)+_0x464847['priorityCounts'][_0x139793(0x125)]),console[_0x139793(0x127)](_0x139793(0x108)+_0x464847[_0x139793(0x121)]['medium']),console['log'](_0x139793(0x110)+_0x464847[_0x139793(0x121)]['low']),_0x167d9c[_0x139793(0x134)][_0x139793(0x131)]>0x0&&(console[_0x139793(0x127)]('\x0a'+'-'[_0x139793(0x106)](0x3c)),console['log']('TOP\x20REFACTORING\x20OPPORTUNITIES'),console['log']('-'['repeat'](0x3c)),_0x167d9c['clones'][_0x139793(0x136)](0x0,0x3)['forEach']((_0x326f17,_0xca10db)=>{const _0x58145a=_0x139793;console[_0x58145a(0x127)]('\x0a'+(_0xca10db+0x1)+'.\x20'+_0x326f17['id']+'\x20['+_0x326f17['refactoringAdvice'][_0x58145a(0x130)]['toUpperCase']()+_0x58145a(0x11e)),console['log']('\x20\x20\x20Type:\x20'+_0x326f17[_0x58145a(0x10a)]+'\x20('+(_0x326f17['confidence']*0x64)[_0x58145a(0x139)](0x0)+_0x58145a(0x118)),console['log']('\x20\x20\x20Instances:\x20'+_0x326f17['metrics']['instanceCount']+'\x20copies\x20across\x20'+_0x326f17['metrics']['filesCovered']+'\x20files'),console[_0x58145a(0x127)](_0x58145a(0x137)+_0x326f17[_0x58145a(0x132)][_0x58145a(0x103)]+'\x20lines,\x20'+_0x326f17['metrics'][_0x58145a(0x10e)]+'\x20tokens'),console[_0x58145a(0x127)]('\x20\x20\x20Impact\x20Score:\x20'+_0x326f17[_0x58145a(0x132)][_0x58145a(0x12b)]),console['log']('\x20\x20\x20Strategy:\x20'+_0x326f17[_0x58145a(0x122)][_0x58145a(0x116)]),console[_0x58145a(0x127)]('\x20\x20\x20Suggested\x20Name:\x20'+_0x326f17['refactoringAdvice']['suggestedName']),console['log']('\x20\x20\x20Reasoning:\x20'+_0x326f17[_0x58145a(0x122)]['reasoning']);})),console['log']('\x0a'+'='[_0x139793(0x106)](0x3c));}[a0_0x2d62a9(0x113)](_0x259c35){const _0x310b88=a0_0x2d62a9,_0x1100e9=_0x259c35[_0x310b88(0x134)][0x0];if(!_0x1100e9)return'No\x20significant\x20code\x20duplication\x20found\x20in\x20the\x20project.';let _0x4295a1=_0x310b88(0x10d)+_0x259c35[_0x310b88(0x135)]['totalClones']+'\x20code\x20clone\x20groups\x20with\x20'+_0x259c35[_0x310b88(0x135)][_0x310b88(0x120)]+_0x310b88(0x124);return _0x4295a1+=_0x310b88(0x105)+_0x1100e9['refactoringAdvice']['suggestedName']+'\x20appears\x20'+_0x1100e9['metrics']['instanceCount']+_0x310b88(0x10c),_0x4295a1+='Recommended\x20action:\x20'+_0x1100e9[_0x310b88(0x122)][_0x310b88(0x116)]+'.\x20',_0x4295a1+=_0x1100e9['refactoringAdvice']['reasoning'],_0x4295a1;}}
|
|
@@ -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(_0x2250c6,_0xfb21d6){const _0x240476=a0_0x2b56,_0x30f0b9=_0x2250c6();while(!![]){try{const _0x44330e=parseInt(_0x240476(0x1a1))/0x1*(parseInt(_0x240476(0x1af))/0x2)+-parseInt(_0x240476(0x1ac))/0x3*(parseInt(_0x240476(0x1a6))/0x4)+-parseInt(_0x240476(0x1a8))/0x5*(-parseInt(_0x240476(0x1a2))/0x6)+parseInt(_0x240476(0x1a0))/0x7+parseInt(_0x240476(0x1a4))/0x8+parseInt(_0x240476(0x1a3))/0x9+-parseInt(_0x240476(0x19f))/0xa*(parseInt(_0x240476(0x1ab))/0xb);if(_0x44330e===_0xfb21d6)break;else _0x30f0b9['push'](_0x30f0b9['shift']());}catch(_0x48414c){_0x30f0b9['push'](_0x30f0b9['shift']());}}}(a0_0x4bb5,0x2ad25));import{glob}from'glob';function a0_0x4bb5(){const _0xcb8826=['mta5ndm1n0Pfy1zRuG','ndvtzKjcshe','C3rHDfn5BMm','u2TPChbPBMCGBgfYz2uGzMLSztOG','mM1YDNDqqG','zxHJBhvKzq','Bwf4rMLSzvnPEMu','C2L6zq','rM91BMqG','odb3sePeBKC','mteWnJGXmLrXB1HqDW','mZqXmdaXvLLtywvK','nJa5mgTLsKrPvq','mJy4mZmWnvfJCgXpuq','mJCXntC2oe1qDgv3Bq','igzPBgvZihrVigfUywX5EMu','ndC2mZzOs0PzvKS','D2fYBG','nJvMuuPnuhu','y29UzMLN','CMvSyxrPDMu'];a0_0x4bb5=function(){return _0xcb8826;};return a0_0x4bb5();}import a0_0x1d4c82 from'fs';function a0_0x2b56(_0x479af2,_0x4380a2){_0x479af2=_0x479af2-0x19f;const _0x4bb5b1=a0_0x4bb5();let _0x2b560a=_0x4bb5b1[_0x479af2];if(a0_0x2b56['hMVGuE']===undefined){var _0x550549=function(_0x1e37e2){const _0x18463a='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1d4c82='',_0x3d8c2c='';for(let _0x1df0d3=0x0,_0x315898,_0x25e166,_0x57dc75=0x0;_0x25e166=_0x1e37e2['charAt'](_0x57dc75++);~_0x25e166&&(_0x315898=_0x1df0d3%0x4?_0x315898*0x40+_0x25e166:_0x25e166,_0x1df0d3++%0x4)?_0x1d4c82+=String['fromCharCode'](0xff&_0x315898>>(-0x2*_0x1df0d3&0x6)):0x0){_0x25e166=_0x18463a['indexOf'](_0x25e166);}for(let _0x1a499c=0x0,_0x4524b6=_0x1d4c82['length'];_0x1a499c<_0x4524b6;_0x1a499c++){_0x3d8c2c+='%'+('00'+_0x1d4c82['charCodeAt'](_0x1a499c)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x3d8c2c);};a0_0x2b56['aUBtUk']=_0x550549,a0_0x2b56['HOOxwA']={},a0_0x2b56['hMVGuE']=!![];}const _0x2094aa=_0x4bb5b1[0x0],_0x353993=_0x479af2+_0x2094aa,_0x1f59a5=a0_0x2b56['HOOxwA'][_0x353993];return!_0x1f59a5?(_0x2b560a=a0_0x2b56['aUBtUk'](_0x2b560a),a0_0x2b56['HOOxwA'][_0x353993]=_0x2b560a):_0x2b560a=_0x1f59a5,_0x2b560a;}import a0_0x3d8c2c from'path';export class FileScanner{constructor(_0x1df0d3){this['config']=_0x1df0d3;}async['scanProject'](_0x315898){const _0x1e187f=a0_0x2b56,_0x25e166=[];for(const _0x57dc75 of this[_0x1e187f(0x1a9)]['include']){const _0x1a499c=await glob(_0x57dc75,{'cwd':_0x315898,'ignore':this[_0x1e187f(0x1a9)][_0x1e187f(0x1b0)],'absolute':!![],'nodir':!![]});for(const _0x4524b6 of _0x1a499c){try{const _0x881af9=a0_0x1d4c82[_0x1e187f(0x1ad)](_0x4524b6);if(_0x881af9[_0x1e187f(0x1b2)]>this[_0x1e187f(0x1a9)][_0x1e187f(0x1b1)]){console[_0x1e187f(0x1a7)](_0x1e187f(0x1ae)+_0x4524b6);continue;}const _0x21462c=a0_0x1d4c82['readFileSync'](_0x4524b6,'utf-8'),_0x637863=a0_0x3d8c2c[_0x1e187f(0x1aa)](_0x315898,_0x4524b6);_0x25e166['push']({'path':_0x637863,'absolutePath':_0x4524b6,'content':_0x21462c,'size':_0x881af9[_0x1e187f(0x1b2)],'extension':a0_0x3d8c2c['extname'](_0x4524b6)});}catch(_0x1a6048){console['error']('Error\x20reading\x20file\x20'+_0x4524b6+':',_0x1a6048['message']);}}}return console['log'](_0x1e187f(0x1b3)+_0x25e166['length']+_0x1e187f(0x1a5)),_0x25e166;}}
|