@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.
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 +14 -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
+ 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
- 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 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;}}