@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.
Files changed (120) hide show
  1. package/README.md +44 -54
  2. package/bin/cli.js +1 -115
  3. package/bin/loxia-terminal-v2.js +3 -0
  4. package/bin/loxia-terminal.js +3 -0
  5. package/bin/start-with-terminal.js +3 -0
  6. package/package.json +15 -15
  7. package/scripts/install-scanners.js +1 -235
  8. package/src/analyzers/CSSAnalyzer.js +1 -297
  9. package/src/analyzers/ConfigValidator.js +1 -690
  10. package/src/analyzers/ESLintAnalyzer.js +1 -320
  11. package/src/analyzers/JavaScriptAnalyzer.js +1 -261
  12. package/src/analyzers/PrettierFormatter.js +1 -247
  13. package/src/analyzers/PythonAnalyzer.js +1 -266
  14. package/src/analyzers/SecurityAnalyzer.js +1 -729
  15. package/src/analyzers/TypeScriptAnalyzer.js +1 -247
  16. package/src/analyzers/codeCloneDetector/analyzer.js +1 -344
  17. package/src/analyzers/codeCloneDetector/detector.js +1 -203
  18. package/src/analyzers/codeCloneDetector/index.js +1 -160
  19. package/src/analyzers/codeCloneDetector/parser.js +1 -199
  20. package/src/analyzers/codeCloneDetector/reporter.js +1 -148
  21. package/src/analyzers/codeCloneDetector/scanner.js +1 -59
  22. package/src/core/agentPool.js +1 -1474
  23. package/src/core/agentScheduler.js +1 -2147
  24. package/src/core/contextManager.js +1 -709
  25. package/src/core/messageProcessor.js +1 -732
  26. package/src/core/orchestrator.js +1 -548
  27. package/src/core/stateManager.js +1 -877
  28. package/src/index.js +1 -631
  29. package/src/interfaces/cli.js +1 -549
  30. package/src/interfaces/terminal/__tests__/smoke/advancedFeatures.test.js +1 -0
  31. package/src/interfaces/terminal/__tests__/smoke/agentControl.test.js +1 -0
  32. package/src/interfaces/terminal/__tests__/smoke/agents.test.js +1 -0
  33. package/src/interfaces/terminal/__tests__/smoke/components.test.js +1 -0
  34. package/src/interfaces/terminal/__tests__/smoke/connection.test.js +1 -0
  35. package/src/interfaces/terminal/__tests__/smoke/enhancements.test.js +1 -0
  36. package/src/interfaces/terminal/__tests__/smoke/imports.test.js +1 -0
  37. package/src/interfaces/terminal/__tests__/smoke/messages.test.js +1 -0
  38. package/src/interfaces/terminal/__tests__/smoke/tools.test.js +1 -0
  39. package/src/interfaces/terminal/api/apiClient.js +1 -0
  40. package/src/interfaces/terminal/api/messageRouter.js +1 -0
  41. package/src/interfaces/terminal/api/session.js +1 -0
  42. package/src/interfaces/terminal/api/websocket.js +1 -0
  43. package/src/interfaces/terminal/components/AgentCreator.js +1 -0
  44. package/src/interfaces/terminal/components/AgentEditor.js +1 -0
  45. package/src/interfaces/terminal/components/AgentSwitcher.js +1 -0
  46. package/src/interfaces/terminal/components/ErrorBoundary.js +1 -0
  47. package/src/interfaces/terminal/components/ErrorPanel.js +1 -0
  48. package/src/interfaces/terminal/components/Header.js +1 -0
  49. package/src/interfaces/terminal/components/HelpPanel.js +1 -0
  50. package/src/interfaces/terminal/components/InputBox.js +1 -0
  51. package/src/interfaces/terminal/components/Layout.js +1 -0
  52. package/src/interfaces/terminal/components/LoadingSpinner.js +1 -0
  53. package/src/interfaces/terminal/components/MessageList.js +1 -0
  54. package/src/interfaces/terminal/components/MultilineTextInput.js +1 -0
  55. package/src/interfaces/terminal/components/SearchPanel.js +1 -0
  56. package/src/interfaces/terminal/components/SettingsPanel.js +1 -0
  57. package/src/interfaces/terminal/components/StatusBar.js +1 -0
  58. package/src/interfaces/terminal/components/TextInput.js +1 -0
  59. package/src/interfaces/terminal/config/agentEditorConstants.js +1 -0
  60. package/src/interfaces/terminal/config/constants.js +1 -0
  61. package/src/interfaces/terminal/index.js +1 -0
  62. package/src/interfaces/terminal/state/useAgentControl.js +1 -0
  63. package/src/interfaces/terminal/state/useAgents.js +1 -0
  64. package/src/interfaces/terminal/state/useConnection.js +1 -0
  65. package/src/interfaces/terminal/state/useMessages.js +1 -0
  66. package/src/interfaces/terminal/state/useTools.js +1 -0
  67. package/src/interfaces/terminal/utils/debugLogger.js +1 -0
  68. package/src/interfaces/terminal/utils/settingsStorage.js +1 -0
  69. package/src/interfaces/terminal/utils/theme.js +1 -0
  70. package/src/interfaces/webServer.js +1 -2162
  71. package/src/modules/fileExplorer/controller.js +1 -280
  72. package/src/modules/fileExplorer/index.js +1 -37
  73. package/src/modules/fileExplorer/middleware.js +1 -92
  74. package/src/modules/fileExplorer/routes.js +1 -125
  75. package/src/modules/fileExplorer/types.js +1 -44
  76. package/src/services/aiService.js +1 -1232
  77. package/src/services/apiKeyManager.js +1 -164
  78. package/src/services/benchmarkService.js +1 -366
  79. package/src/services/budgetService.js +1 -539
  80. package/src/services/contextInjectionService.js +1 -247
  81. package/src/services/conversationCompactionService.js +1 -637
  82. package/src/services/errorHandler.js +1 -810
  83. package/src/services/fileAttachmentService.js +1 -544
  84. package/src/services/modelRouterService.js +1 -366
  85. package/src/services/modelsService.js +1 -322
  86. package/src/services/qualityInspector.js +1 -796
  87. package/src/services/tokenCountingService.js +1 -536
  88. package/src/tools/agentCommunicationTool.js +1 -1344
  89. package/src/tools/agentDelayTool.js +1 -485
  90. package/src/tools/asyncToolManager.js +1 -604
  91. package/src/tools/baseTool.js +1 -800
  92. package/src/tools/browserTool.js +1 -920
  93. package/src/tools/cloneDetectionTool.js +1 -621
  94. package/src/tools/dependencyResolverTool.js +1 -1215
  95. package/src/tools/fileContentReplaceTool.js +1 -875
  96. package/src/tools/fileSystemTool.js +1 -1107
  97. package/src/tools/fileTreeTool.js +1 -853
  98. package/src/tools/imageTool.js +1 -901
  99. package/src/tools/importAnalyzerTool.js +1 -1060
  100. package/src/tools/jobDoneTool.js +1 -248
  101. package/src/tools/seekTool.js +1 -956
  102. package/src/tools/staticAnalysisTool.js +1 -1778
  103. package/src/tools/taskManagerTool.js +1 -2873
  104. package/src/tools/terminalTool.js +1 -2304
  105. package/src/tools/webTool.js +1 -1430
  106. package/src/types/agent.js +1 -519
  107. package/src/types/contextReference.js +1 -972
  108. package/src/types/conversation.js +1 -730
  109. package/src/types/toolCommand.js +1 -747
  110. package/src/utilities/attachmentValidator.js +1 -292
  111. package/src/utilities/configManager.js +1 -582
  112. package/src/utilities/constants.js +1 -722
  113. package/src/utilities/directoryAccessManager.js +1 -535
  114. package/src/utilities/fileProcessor.js +1 -307
  115. package/src/utilities/logger.js +1 -436
  116. package/src/utilities/tagParser.js +1 -1246
  117. package/src/utilities/toolConstants.js +1 -317
  118. package/web-ui/build/index.html +2 -2
  119. package/web-ui/build/static/{index-Dy2bYbOa.css → index-CClD1090.css} +1 -1
  120. package/web-ui/build/static/{index-CjkkcnFA.js → index-lCBai6dX.js} +66 -67
@@ -1,148 +1 @@
1
- import fs from 'fs';
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
- import { glob } from 'glob';
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;}}