appclean 1.8.0

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 (154) hide show
  1. package/.github/workflows/publish.yml +41 -0
  2. package/.github/workflows/test.yml +37 -0
  3. package/ACTION_CHECKLIST.md +342 -0
  4. package/APPCLEAN_SUMMARY.md +309 -0
  5. package/CHANGELOG.md +205 -0
  6. package/CODE_OF_CONDUCT.md +49 -0
  7. package/CODE_REVIEW_REPORT.md +447 -0
  8. package/COMMUNITY_POSTS.md +307 -0
  9. package/CONTRIBUTING.md +121 -0
  10. package/DEPLOYMENT_GUIDE.md +345 -0
  11. package/DEPLOYMENT_STATUS.md +182 -0
  12. package/EXECUTIVE_REPORT.md +393 -0
  13. package/GITHUB_OPTIMIZATION.md +383 -0
  14. package/INDEX.md +165 -0
  15. package/LICENSE +21 -0
  16. package/MARKETING_SUMMARY.md +352 -0
  17. package/NPM_PACKAGE_OPTIMIZATION.md +281 -0
  18. package/NPM_PUBLISH.md +116 -0
  19. package/PROJECT_SUMMARY.txt +249 -0
  20. package/QUICKSTART.md +219 -0
  21. package/README.md +548 -0
  22. package/SECURITY.md +104 -0
  23. package/SETUP_GITHUB.md +237 -0
  24. package/TESTING_SUMMARY.md +379 -0
  25. package/dist/core/appUpdateChecker.d.ts +23 -0
  26. package/dist/core/appUpdateChecker.d.ts.map +1 -0
  27. package/dist/core/appUpdateChecker.js +159 -0
  28. package/dist/core/appUpdateChecker.js.map +1 -0
  29. package/dist/core/detector.d.ts +13 -0
  30. package/dist/core/detector.d.ts.map +1 -0
  31. package/dist/core/detector.js +99 -0
  32. package/dist/core/detector.js.map +1 -0
  33. package/dist/core/duplicateFileFinder.d.ts +14 -0
  34. package/dist/core/duplicateFileFinder.d.ts.map +1 -0
  35. package/dist/core/duplicateFileFinder.js +80 -0
  36. package/dist/core/duplicateFileFinder.js.map +1 -0
  37. package/dist/core/orphanedDependencyDetector.d.ts +19 -0
  38. package/dist/core/orphanedDependencyDetector.d.ts.map +1 -0
  39. package/dist/core/orphanedDependencyDetector.js +148 -0
  40. package/dist/core/orphanedDependencyDetector.js.map +1 -0
  41. package/dist/core/performanceOptimizer.d.ts +37 -0
  42. package/dist/core/performanceOptimizer.d.ts.map +1 -0
  43. package/dist/core/performanceOptimizer.js +128 -0
  44. package/dist/core/performanceOptimizer.js.map +1 -0
  45. package/dist/core/permissionHandler.d.ts +9 -0
  46. package/dist/core/permissionHandler.d.ts.map +1 -0
  47. package/dist/core/permissionHandler.js +89 -0
  48. package/dist/core/permissionHandler.js.map +1 -0
  49. package/dist/core/pluginSystem.d.ts +39 -0
  50. package/dist/core/pluginSystem.d.ts.map +1 -0
  51. package/dist/core/pluginSystem.js +120 -0
  52. package/dist/core/pluginSystem.js.map +1 -0
  53. package/dist/core/removalRecorder.d.ts +32 -0
  54. package/dist/core/removalRecorder.d.ts.map +1 -0
  55. package/dist/core/removalRecorder.js +79 -0
  56. package/dist/core/removalRecorder.js.map +1 -0
  57. package/dist/core/remover.d.ts +15 -0
  58. package/dist/core/remover.d.ts.map +1 -0
  59. package/dist/core/remover.js +225 -0
  60. package/dist/core/remover.js.map +1 -0
  61. package/dist/core/reportGenerator.d.ts +9 -0
  62. package/dist/core/reportGenerator.d.ts.map +1 -0
  63. package/dist/core/reportGenerator.js +328 -0
  64. package/dist/core/reportGenerator.js.map +1 -0
  65. package/dist/core/scheduledCleanup.d.ts +38 -0
  66. package/dist/core/scheduledCleanup.d.ts.map +1 -0
  67. package/dist/core/scheduledCleanup.js +127 -0
  68. package/dist/core/scheduledCleanup.js.map +1 -0
  69. package/dist/core/serviceFileDetector.d.ts +18 -0
  70. package/dist/core/serviceFileDetector.d.ts.map +1 -0
  71. package/dist/core/serviceFileDetector.js +136 -0
  72. package/dist/core/serviceFileDetector.js.map +1 -0
  73. package/dist/core/verificationModule.d.ts +14 -0
  74. package/dist/core/verificationModule.d.ts.map +1 -0
  75. package/dist/core/verificationModule.js +102 -0
  76. package/dist/core/verificationModule.js.map +1 -0
  77. package/dist/index.d.ts +3 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +333 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/managers/brewManager.d.ts +10 -0
  82. package/dist/managers/brewManager.d.ts.map +1 -0
  83. package/dist/managers/brewManager.js +130 -0
  84. package/dist/managers/brewManager.js.map +1 -0
  85. package/dist/managers/customManager.d.ts +8 -0
  86. package/dist/managers/customManager.d.ts.map +1 -0
  87. package/dist/managers/customManager.js +139 -0
  88. package/dist/managers/customManager.js.map +1 -0
  89. package/dist/managers/linuxManager.d.ts +10 -0
  90. package/dist/managers/linuxManager.d.ts.map +1 -0
  91. package/dist/managers/linuxManager.js +191 -0
  92. package/dist/managers/linuxManager.js.map +1 -0
  93. package/dist/managers/npmManager.d.ts +10 -0
  94. package/dist/managers/npmManager.d.ts.map +1 -0
  95. package/dist/managers/npmManager.js +119 -0
  96. package/dist/managers/npmManager.js.map +1 -0
  97. package/dist/types/index.d.ts +44 -0
  98. package/dist/types/index.d.ts.map +1 -0
  99. package/dist/types/index.js +3 -0
  100. package/dist/types/index.js.map +1 -0
  101. package/dist/ui/guiServer.d.ts +10 -0
  102. package/dist/ui/guiServer.d.ts.map +1 -0
  103. package/dist/ui/guiServer.js +134 -0
  104. package/dist/ui/guiServer.js.map +1 -0
  105. package/dist/ui/menu.d.ts +6 -0
  106. package/dist/ui/menu.d.ts.map +1 -0
  107. package/dist/ui/menu.js +93 -0
  108. package/dist/ui/menu.js.map +1 -0
  109. package/dist/ui/prompts.d.ts +13 -0
  110. package/dist/ui/prompts.d.ts.map +1 -0
  111. package/dist/ui/prompts.js +161 -0
  112. package/dist/ui/prompts.js.map +1 -0
  113. package/dist/utils/filesystem.d.ts +13 -0
  114. package/dist/utils/filesystem.d.ts.map +1 -0
  115. package/dist/utils/filesystem.js +152 -0
  116. package/dist/utils/filesystem.js.map +1 -0
  117. package/dist/utils/logger.d.ts +12 -0
  118. package/dist/utils/logger.d.ts.map +1 -0
  119. package/dist/utils/logger.js +49 -0
  120. package/dist/utils/logger.js.map +1 -0
  121. package/dist/utils/platform.d.ts +9 -0
  122. package/dist/utils/platform.d.ts.map +1 -0
  123. package/dist/utils/platform.js +75 -0
  124. package/dist/utils/platform.js.map +1 -0
  125. package/jest.config.js +20 -0
  126. package/logo.svg +60 -0
  127. package/package.json +55 -0
  128. package/setup-github.sh +125 -0
  129. package/src/core/appUpdateChecker.ts +220 -0
  130. package/src/core/detector.ts +133 -0
  131. package/src/core/duplicateFileFinder.ts +113 -0
  132. package/src/core/orphanedDependencyDetector.ts +195 -0
  133. package/src/core/performanceOptimizer.ts +209 -0
  134. package/src/core/permissionHandler.ts +121 -0
  135. package/src/core/pluginSystem.ts +194 -0
  136. package/src/core/removalRecorder.ts +146 -0
  137. package/src/core/remover.ts +280 -0
  138. package/src/core/reportGenerator.ts +354 -0
  139. package/src/core/scheduledCleanup.ts +204 -0
  140. package/src/core/serviceFileDetector.ts +181 -0
  141. package/src/core/verificationModule.ts +140 -0
  142. package/src/index.ts +449 -0
  143. package/src/managers/brewManager.ts +149 -0
  144. package/src/managers/customManager.ts +167 -0
  145. package/src/managers/linuxManager.ts +210 -0
  146. package/src/managers/npmManager.ts +137 -0
  147. package/src/types/index.ts +59 -0
  148. package/src/ui/guiServer.ts +155 -0
  149. package/src/ui/menu.ts +100 -0
  150. package/src/ui/prompts.ts +177 -0
  151. package/src/utils/filesystem.ts +145 -0
  152. package/src/utils/logger.ts +48 -0
  153. package/src/utils/platform.ts +75 -0
  154. package/tsconfig.json +20 -0
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AppUpdateChecker = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const logger_1 = require("../utils/logger");
6
+ class AppUpdateChecker {
7
+ async checkForUpdate(app) {
8
+ logger_1.Logger.info(`Checking for updates: ${app.name}...`);
9
+ const info = {
10
+ appName: app.name,
11
+ currentVersion: app.version,
12
+ latestVersion: app.version,
13
+ hasUpdate: false,
14
+ };
15
+ try {
16
+ switch (app.installMethod) {
17
+ case 'npm':
18
+ await this.checkNpmUpdate(info);
19
+ break;
20
+ case 'yarn':
21
+ await this.checkYarnUpdate(info);
22
+ break;
23
+ case 'pnpm':
24
+ await this.checkPnpmUpdate(info);
25
+ break;
26
+ case 'brew':
27
+ await this.checkBrewUpdate(info);
28
+ break;
29
+ case 'apt':
30
+ await this.checkAptUpdate(info);
31
+ break;
32
+ case 'yum':
33
+ case 'dnf':
34
+ await this.checkYumUpdate(info);
35
+ break;
36
+ default:
37
+ logger_1.Logger.warn(`No update checker available for ${app.installMethod}`);
38
+ }
39
+ }
40
+ catch (error) {
41
+ logger_1.Logger.debug(`Update check failed for ${app.name}: ${error.message}`);
42
+ }
43
+ return info;
44
+ }
45
+ async checkForUpdates(apps) {
46
+ const updates = [];
47
+ for (const app of apps) {
48
+ const update = await this.checkForUpdate(app);
49
+ updates.push(update);
50
+ }
51
+ return updates;
52
+ }
53
+ async checkNpmUpdate(info) {
54
+ try {
55
+ const output = (0, child_process_1.execSync)(`npm view ${info.appName} version 2>/dev/null`).toString().trim();
56
+ if (output) {
57
+ info.latestVersion = output;
58
+ info.hasUpdate = this.compareVersions(info.currentVersion, output) < 0;
59
+ info.installCommand = `npm install -g ${info.appName}@latest`;
60
+ }
61
+ }
62
+ catch {
63
+ }
64
+ }
65
+ async checkYarnUpdate(info) {
66
+ try {
67
+ const output = (0, child_process_1.execSync)(`yarn info ${info.appName} version 2>/dev/null`).toString().trim();
68
+ if (output) {
69
+ info.latestVersion = output;
70
+ info.hasUpdate = this.compareVersions(info.currentVersion, output) < 0;
71
+ info.installCommand = `yarn global upgrade ${info.appName}`;
72
+ }
73
+ }
74
+ catch {
75
+ }
76
+ }
77
+ async checkPnpmUpdate(info) {
78
+ try {
79
+ const output = (0, child_process_1.execSync)(`pnpm view ${info.appName} version 2>/dev/null`).toString().trim();
80
+ if (output) {
81
+ info.latestVersion = output;
82
+ info.hasUpdate = this.compareVersions(info.currentVersion, output) < 0;
83
+ info.installCommand = `pnpm add -g ${info.appName}@latest`;
84
+ }
85
+ }
86
+ catch {
87
+ }
88
+ }
89
+ async checkBrewUpdate(info) {
90
+ try {
91
+ const output = (0, child_process_1.execSync)(`brew info ${info.appName} 2>/dev/null | grep "stable"`).toString();
92
+ const match = output.match(/(\d+\.\d+\.\d+)/);
93
+ if (match) {
94
+ info.latestVersion = match[1];
95
+ info.hasUpdate = this.compareVersions(info.currentVersion, match[1]) < 0;
96
+ info.installCommand = `brew upgrade ${info.appName}`;
97
+ }
98
+ }
99
+ catch {
100
+ }
101
+ }
102
+ async checkAptUpdate(info) {
103
+ try {
104
+ const output = (0, child_process_1.execSync)(`apt-cache policy ${info.appName} 2>/dev/null`).toString();
105
+ const match = output.match(/Candidate: (\S+)/);
106
+ if (match) {
107
+ info.latestVersion = match[1];
108
+ info.hasUpdate = this.compareVersions(info.currentVersion, match[1]) < 0;
109
+ info.installCommand = `sudo apt update && sudo apt upgrade ${info.appName}`;
110
+ }
111
+ }
112
+ catch {
113
+ }
114
+ }
115
+ async checkYumUpdate(info) {
116
+ try {
117
+ const output = (0, child_process_1.execSync)(`yum info ${info.appName} 2>/dev/null`).toString();
118
+ const match = output.match(/Version\s+:\s+(\S+)/);
119
+ if (match) {
120
+ info.latestVersion = match[1];
121
+ info.hasUpdate = this.compareVersions(info.currentVersion, match[1]) < 0;
122
+ info.installCommand = `sudo yum update ${info.appName}`;
123
+ }
124
+ }
125
+ catch {
126
+ }
127
+ }
128
+ compareVersions(v1, v2) {
129
+ const parts1 = v1.split('.').map((p) => parseInt(p, 10));
130
+ const parts2 = v2.split('.').map((p) => parseInt(p, 10));
131
+ for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
132
+ const p1 = parts1[i] || 0;
133
+ const p2 = parts2[i] || 0;
134
+ if (p1 < p2)
135
+ return -1;
136
+ if (p1 > p2)
137
+ return 1;
138
+ }
139
+ return 0;
140
+ }
141
+ getUpdateSummary(updates) {
142
+ const available = updates.filter((u) => u.hasUpdate);
143
+ if (available.length === 0) {
144
+ return 'All applications are up to date!';
145
+ }
146
+ let summary = `Found ${available.length} update(s) available:\n\n`;
147
+ available.forEach((update) => {
148
+ summary += `📦 ${update.appName}\n`;
149
+ summary += ` Current: ${update.currentVersion} → Latest: ${update.latestVersion}\n`;
150
+ if (update.installCommand) {
151
+ summary += ` Install: ${update.installCommand}\n`;
152
+ }
153
+ summary += '\n';
154
+ });
155
+ return summary;
156
+ }
157
+ }
158
+ exports.AppUpdateChecker = AppUpdateChecker;
159
+ //# sourceMappingURL=appUpdateChecker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appUpdateChecker.js","sourceRoot":"","sources":["../../src/core/appUpdateChecker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { InstalledApp, ArtifactPath, SearchOptions } from '../types';
2
+ export declare class Detector {
3
+ private npmManager;
4
+ private brewManager?;
5
+ private linuxManager?;
6
+ private customManager;
7
+ constructor();
8
+ detectAllApps(): Promise<InstalledApp[]>;
9
+ searchApps(options: SearchOptions): Promise<InstalledApp[]>;
10
+ findArtifacts(appName: string, installMethod: string): Promise<ArtifactPath[]>;
11
+ estimateSpaceFreed(appName: string, installMethod: string): Promise<number>;
12
+ }
13
+ //# sourceMappingURL=detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/core/detector.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGrE,qBAAa,QAAQ;IACnB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,aAAa,CAAgB;;IAe/B,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAgCxC,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAqC3D,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAgC9E,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAIlF"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Detector = void 0;
4
+ const npmManager_1 = require("../managers/npmManager");
5
+ const brewManager_1 = require("../managers/brewManager");
6
+ const linuxManager_1 = require("../managers/linuxManager");
7
+ const customManager_1 = require("../managers/customManager");
8
+ const platform_1 = require("../utils/platform");
9
+ const filesystem_1 = require("../utils/filesystem");
10
+ class Detector {
11
+ constructor() {
12
+ this.npmManager = new npmManager_1.NpmManager();
13
+ this.customManager = new customManager_1.CustomManager();
14
+ if ((0, platform_1.isMacOS)()) {
15
+ this.brewManager = new brewManager_1.BrewManager();
16
+ }
17
+ if ((0, platform_1.isLinux)()) {
18
+ this.linuxManager = new linuxManager_1.LinuxManager();
19
+ }
20
+ }
21
+ async detectAllApps() {
22
+ const allApps = [];
23
+ const npmApps = await this.npmManager.getInstalledPackages();
24
+ allApps.push(...npmApps);
25
+ if (this.brewManager) {
26
+ const brewApps = await this.brewManager.getInstalledPackages();
27
+ allApps.push(...brewApps);
28
+ }
29
+ if (this.linuxManager) {
30
+ const linuxApps = await this.linuxManager.getInstalledPackages();
31
+ allApps.push(...linuxApps);
32
+ }
33
+ const customApps = await this.customManager.findCustomInstalledApps();
34
+ allApps.push(...customApps);
35
+ const seen = new Set();
36
+ return allApps.filter((app) => {
37
+ if (seen.has(app.name))
38
+ return false;
39
+ seen.add(app.name);
40
+ return true;
41
+ });
42
+ }
43
+ async searchApps(options) {
44
+ const allApps = await this.detectAllApps();
45
+ let filtered = allApps;
46
+ if (options.query) {
47
+ const query = options.query.toLowerCase();
48
+ filtered = filtered.filter((app) => app.name.toLowerCase().includes(query));
49
+ }
50
+ if (options.installMethod) {
51
+ filtered = filtered.filter((app) => app.installMethod === options.installMethod);
52
+ }
53
+ switch (options.sortBy) {
54
+ case 'name':
55
+ filtered.sort((a, b) => a.name.localeCompare(b.name));
56
+ break;
57
+ case 'date':
58
+ filtered.sort((a, b) => (b.installedDate?.getTime() || 0) - (a.installedDate?.getTime() || 0));
59
+ break;
60
+ case 'size':
61
+ filtered.sort((a, b) => (b.size || 0) - (a.size || 0));
62
+ break;
63
+ }
64
+ return filtered;
65
+ }
66
+ async findArtifacts(appName, installMethod) {
67
+ const artifacts = [];
68
+ switch (installMethod) {
69
+ case 'npm':
70
+ artifacts.push(...(await this.npmManager.findArtifacts(appName)));
71
+ break;
72
+ case 'brew':
73
+ if (this.brewManager) {
74
+ artifacts.push(...(await this.brewManager.findArtifacts(appName)));
75
+ }
76
+ break;
77
+ case 'apt':
78
+ case 'yum':
79
+ case 'dnf':
80
+ if (this.linuxManager) {
81
+ artifacts.push(...(await this.linuxManager.findArtifacts(appName)));
82
+ }
83
+ break;
84
+ case 'custom':
85
+ artifacts.push(...(await this.customManager.findArtifacts(appName)));
86
+ break;
87
+ }
88
+ for (const artifact of artifacts) {
89
+ artifact.size = (0, filesystem_1.getFileSize)(artifact.path);
90
+ }
91
+ return artifacts;
92
+ }
93
+ async estimateSpaceFreed(appName, installMethod) {
94
+ const artifacts = await this.findArtifacts(appName, installMethod);
95
+ return artifacts.reduce((total, artifact) => total + artifact.size, 0);
96
+ }
97
+ }
98
+ exports.Detector = Detector;
99
+ //# sourceMappingURL=detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/core/detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface DuplicateFile {
2
+ hash: string;
3
+ size: number;
4
+ paths: string[];
5
+ potentialSavings: number;
6
+ }
7
+ export declare class DuplicateFileFinder {
8
+ findDuplicates(directories: string[]): Promise<DuplicateFile[]>;
9
+ private calculateHash;
10
+ private scanDirectory;
11
+ getSummary(duplicates: DuplicateFile[]): string;
12
+ private formatBytes;
13
+ }
14
+ //# sourceMappingURL=duplicateFileFinder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicateFileFinder.d.ts","sourceRoot":"","sources":["../../src/core/duplicateFileFinder.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,mBAAmB;IAIxB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YA4BvD,aAAa;YAcb,aAAa;IA+B3B,UAAU,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,MAAM;IAU/C,OAAO,CAAC,WAAW;CAOpB"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DuplicateFileFinder = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const crypto_1 = __importDefault(require("crypto"));
10
+ const logger_1 = require("../utils/logger");
11
+ class DuplicateFileFinder {
12
+ async findDuplicates(directories) {
13
+ logger_1.Logger.info('Scanning for duplicate files...');
14
+ const fileHashes = new Map();
15
+ for (const directory of directories) {
16
+ await this.scanDirectory(directory, fileHashes);
17
+ }
18
+ const duplicates = [];
19
+ for (const [hash, data] of fileHashes.entries()) {
20
+ if (data.paths.length > 1) {
21
+ duplicates.push({
22
+ hash,
23
+ size: data.size,
24
+ paths: data.paths,
25
+ potentialSavings: data.size * (data.paths.length - 1),
26
+ });
27
+ }
28
+ }
29
+ return duplicates.sort((a, b) => b.potentialSavings - a.potentialSavings);
30
+ }
31
+ async calculateHash(filePath) {
32
+ return new Promise((resolve, reject) => {
33
+ const hash = crypto_1.default.createHash('sha256');
34
+ const stream = fs_1.default.createReadStream(filePath);
35
+ stream.on('data', (data) => hash.update(data));
36
+ stream.on('end', () => resolve(hash.digest('hex')));
37
+ stream.on('error', reject);
38
+ });
39
+ }
40
+ async scanDirectory(directory, fileHashes) {
41
+ try {
42
+ const entries = fs_1.default.readdirSync(directory);
43
+ for (const entry of entries) {
44
+ const fullPath = path_1.default.join(directory, entry);
45
+ const stats = fs_1.default.statSync(fullPath);
46
+ if (stats.isDirectory()) {
47
+ await this.scanDirectory(fullPath, fileHashes);
48
+ }
49
+ else if (stats.isFile()) {
50
+ const hash = await this.calculateHash(fullPath);
51
+ if (!fileHashes.has(hash)) {
52
+ fileHashes.set(hash, { size: stats.size, paths: [] });
53
+ }
54
+ fileHashes.get(hash).paths.push(fullPath);
55
+ }
56
+ }
57
+ }
58
+ catch (error) {
59
+ logger_1.Logger.debug(`Error scanning directory ${directory}: ${error.message}`);
60
+ }
61
+ }
62
+ getSummary(duplicates) {
63
+ const totalSize = duplicates.reduce((sum, d) => sum + d.potentialSavings, 0);
64
+ const totalFiles = duplicates.reduce((sum, d) => sum + (d.paths.length - 1), 0);
65
+ return `
66
+ Found ${duplicates.length} duplicate groups with ${totalFiles} duplicate files
67
+ Potential space savings: ${this.formatBytes(totalSize)}
68
+ `;
69
+ }
70
+ formatBytes(bytes) {
71
+ if (bytes === 0)
72
+ return '0 B';
73
+ const k = 1024;
74
+ const sizes = ['B', 'KB', 'MB', 'GB'];
75
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
76
+ return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];
77
+ }
78
+ }
79
+ exports.DuplicateFileFinder = DuplicateFileFinder;
80
+ //# sourceMappingURL=duplicateFileFinder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicateFileFinder.js","sourceRoot":"","sources":["../../src/core/duplicateFileFinder.ts"],"names":[],"mappings":";;;;;;AAMA,4CAAoB;AACpB,gDAAwB;AACxB,oDAA4B;AAC5B,4CAAyC;AASzC,MAAa,mBAAmB;IAI9B,KAAK,CAAC,cAAc,CAAC,WAAqB;QACxC,eAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAE/C,MAAM,UAAU,GAAG,IAAI,GAAG,EAA6C,CAAC;QAExE,KAAK,MAAM,SAAS,IAAI,WAAW,EAAE,CAAC;YACpC,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAClD,CAAC;QAGD,MAAM,UAAU,GAAoB,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI;oBACJ,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,gBAAgB,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;iBACtD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5E,CAAC;IAKO,KAAK,CAAC,aAAa,CAAC,QAAgB;QAC1C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,IAAI,GAAG,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,YAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAE7C,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACpD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAKO,KAAK,CAAC,aAAa,CACzB,SAAiB,EACjB,UAA0D;QAE1D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAE1C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAC7C,MAAM,KAAK,GAAG,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAEpC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBACjD,CAAC;qBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;oBAC1B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;oBAEhD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC1B,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;oBACxD,CAAC;oBAED,UAAU,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC,4BAA4B,SAAS,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAKD,UAAU,CAAC,UAA2B;QACpC,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;QAC7E,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEhF,OAAO;QACH,UAAU,CAAC,MAAM,0BAA0B,UAAU;2BAClC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;KACjD,CAAC;IACJ,CAAC;IAEO,WAAW,CAAC,KAAa;QAC/B,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC9B,MAAM,CAAC,GAAG,IAAI,CAAC;QACf,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3E,CAAC;CACF;AA9FD,kDA8FC"}
@@ -0,0 +1,19 @@
1
+ export interface OrphanedPackage {
2
+ name: string;
3
+ version: string;
4
+ location: string;
5
+ size: number;
6
+ lastModified: Date;
7
+ isOrphaned: boolean;
8
+ dependedBy: string[];
9
+ }
10
+ export declare class OrphanedDependencyDetector {
11
+ detectOrphanedPackages(): Promise<OrphanedPackage[]>;
12
+ private getGlobalPackages;
13
+ private getProjectPackages;
14
+ private findPackageJsonFiles;
15
+ private checkDependencies;
16
+ private findPackageLocation;
17
+ private getDirectorySize;
18
+ }
19
+ //# sourceMappingURL=orphanedDependencyDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphanedDependencyDetector.d.ts","sourceRoot":"","sources":["../../src/core/orphanedDependencyDetector.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,IAAI,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,qBAAa,0BAA0B;IAI/B,sBAAsB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAqC1D,OAAO,CAAC,iBAAiB;IAkCzB,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,oBAAoB;IAoC5B,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,gBAAgB;CAqBzB"}
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OrphanedDependencyDetector = void 0;
7
+ const child_process_1 = require("child_process");
8
+ const platform_1 = require("../utils/platform");
9
+ const path_1 = __importDefault(require("path"));
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const logger_1 = require("../utils/logger");
12
+ class OrphanedDependencyDetector {
13
+ async detectOrphanedPackages() {
14
+ logger_1.Logger.info('Scanning for orphaned dependencies...');
15
+ try {
16
+ const globalPackages = this.getGlobalPackages();
17
+ const projectPackages = this.getProjectPackages();
18
+ const orphaned = [];
19
+ for (const pkg of globalPackages) {
20
+ const dependedBy = this.checkDependencies(pkg.name, projectPackages);
21
+ if (dependedBy.length === 0) {
22
+ orphaned.push({
23
+ ...pkg,
24
+ isOrphaned: true,
25
+ dependedBy: [],
26
+ });
27
+ }
28
+ else {
29
+ orphaned.push({
30
+ ...pkg,
31
+ isOrphaned: false,
32
+ dependedBy,
33
+ });
34
+ }
35
+ }
36
+ return orphaned.filter((p) => p.isOrphaned);
37
+ }
38
+ catch (error) {
39
+ logger_1.Logger.error(`Error detecting orphaned packages: ${error.message}`);
40
+ return [];
41
+ }
42
+ }
43
+ getGlobalPackages() {
44
+ try {
45
+ const output = (0, child_process_1.execSync)('npm list -g --json 2>/dev/null || echo "{}"').toString();
46
+ const data = JSON.parse(output);
47
+ const packages = [];
48
+ if (data.dependencies) {
49
+ for (const [name, pkg] of Object.entries(data.dependencies)) {
50
+ const location = this.findPackageLocation(name);
51
+ if (location) {
52
+ const stats = fs_1.default.statSync(location);
53
+ packages.push({
54
+ name,
55
+ version: pkg.version || 'unknown',
56
+ location,
57
+ size: this.getDirectorySize(location),
58
+ lastModified: stats.mtime,
59
+ isOrphaned: false,
60
+ dependedBy: [],
61
+ });
62
+ }
63
+ }
64
+ }
65
+ return packages;
66
+ }
67
+ catch {
68
+ return [];
69
+ }
70
+ }
71
+ getProjectPackages() {
72
+ const packages = new Set();
73
+ try {
74
+ const home = (0, platform_1.getHomeDir)();
75
+ const searchPaths = [home, '/usr/local'];
76
+ for (const searchPath of searchPaths) {
77
+ this.findPackageJsonFiles(searchPath, packages);
78
+ }
79
+ }
80
+ catch {
81
+ }
82
+ return packages;
83
+ }
84
+ findPackageJsonFiles(dir, packages, depth = 0) {
85
+ if (depth > 3)
86
+ return;
87
+ try {
88
+ const entries = fs_1.default.readdirSync(dir);
89
+ for (const entry of entries) {
90
+ if (entry === 'package.json') {
91
+ try {
92
+ const content = fs_1.default.readFileSync(path_1.default.join(dir, entry), 'utf-8');
93
+ const json = JSON.parse(content);
94
+ if (json.dependencies) {
95
+ Object.keys(json.dependencies).forEach((dep) => packages.add(dep));
96
+ }
97
+ if (json.devDependencies) {
98
+ Object.keys(json.devDependencies).forEach((dep) => packages.add(dep));
99
+ }
100
+ }
101
+ catch {
102
+ }
103
+ }
104
+ const fullPath = path_1.default.join(dir, entry);
105
+ if (fs_1.default.statSync(fullPath).isDirectory() && !entry.startsWith('.')) {
106
+ this.findPackageJsonFiles(fullPath, packages, depth + 1);
107
+ }
108
+ }
109
+ }
110
+ catch {
111
+ }
112
+ }
113
+ checkDependencies(packageName, projectPackages) {
114
+ return Array.from(projectPackages).filter((p) => p === packageName);
115
+ }
116
+ findPackageLocation(packageName) {
117
+ try {
118
+ const result = (0, child_process_1.execSync)(`npm list -g ${packageName} --json 2>/dev/null || echo "{}"`).toString();
119
+ const data = JSON.parse(result);
120
+ return data.dependencies?.[packageName]?.resolved || null;
121
+ }
122
+ catch {
123
+ return null;
124
+ }
125
+ }
126
+ getDirectorySize(dir) {
127
+ try {
128
+ let size = 0;
129
+ const entries = fs_1.default.readdirSync(dir);
130
+ for (const entry of entries) {
131
+ const fullPath = path_1.default.join(dir, entry);
132
+ const stats = fs_1.default.statSync(fullPath);
133
+ if (stats.isDirectory()) {
134
+ size += this.getDirectorySize(fullPath);
135
+ }
136
+ else {
137
+ size += stats.size;
138
+ }
139
+ }
140
+ return size;
141
+ }
142
+ catch {
143
+ return 0;
144
+ }
145
+ }
146
+ }
147
+ exports.OrphanedDependencyDetector = OrphanedDependencyDetector;
148
+ //# sourceMappingURL=orphanedDependencyDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphanedDependencyDetector.js","sourceRoot":"","sources":["../../src/core/orphanedDependencyDetector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export interface ScanMetrics {
2
+ startTime: Date;
3
+ endTime?: Date;
4
+ filesScanned: number;
5
+ directoriesScanned: number;
6
+ totalSize: number;
7
+ duration?: number;
8
+ averageFileSize: number;
9
+ scanSpeed: number;
10
+ }
11
+ export interface OptimizationSettings {
12
+ parallelScanThreads: number;
13
+ cacheResults: boolean;
14
+ skipSymlinks: boolean;
15
+ maxDirectoryDepth: number;
16
+ excludePatterns: string[];
17
+ indexSystemDirectories: boolean;
18
+ }
19
+ export declare class PerformanceOptimizer {
20
+ private metrics;
21
+ private cache;
22
+ private settings;
23
+ constructor(settings?: Partial<OptimizationSettings>);
24
+ startMetrics(scanId: string): ScanMetrics;
25
+ endMetrics(scanId: string): ScanMetrics | null;
26
+ getMetrics(scanId: string): ScanMetrics | null;
27
+ updateMetrics(scanId: string, data: Partial<ScanMetrics>): void;
28
+ cacheResult(key: string, value: any, ttl?: number): void;
29
+ getCachedResult(key: string): any | null;
30
+ clearCache(): void;
31
+ updateSettings(settings: Partial<OptimizationSettings>): void;
32
+ getSettings(): OptimizationSettings;
33
+ shouldScanPath(path: string, depth: number): boolean;
34
+ getRecommendations(metrics: ScanMetrics): string[];
35
+ private formatBytes;
36
+ }
37
+ //# sourceMappingURL=performanceOptimizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performanceOptimizer.d.ts","sourceRoot":"","sources":["../../src/core/performanceOptimizer.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,sBAAsB,EAAE,OAAO,CAAC;CACjC;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,QAAQ,CAAuB;gBAE3B,QAAQ,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC;IAepD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW;IAkBzC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAyB9C,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAO9C,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAU/D,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAaxD,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI;IAgBxC,UAAU,IAAI,IAAI;IAQlB,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,IAAI;IAQ7D,WAAW,IAAI,oBAAoB;IAOnC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAmBpD,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,EAAE;IAsBlD,OAAO,CAAC,WAAW;CAOpB"}