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.
- package/.github/workflows/publish.yml +41 -0
- package/.github/workflows/test.yml +37 -0
- package/ACTION_CHECKLIST.md +342 -0
- package/APPCLEAN_SUMMARY.md +309 -0
- package/CHANGELOG.md +205 -0
- package/CODE_OF_CONDUCT.md +49 -0
- package/CODE_REVIEW_REPORT.md +447 -0
- package/COMMUNITY_POSTS.md +307 -0
- package/CONTRIBUTING.md +121 -0
- package/DEPLOYMENT_GUIDE.md +345 -0
- package/DEPLOYMENT_STATUS.md +182 -0
- package/EXECUTIVE_REPORT.md +393 -0
- package/GITHUB_OPTIMIZATION.md +383 -0
- package/INDEX.md +165 -0
- package/LICENSE +21 -0
- package/MARKETING_SUMMARY.md +352 -0
- package/NPM_PACKAGE_OPTIMIZATION.md +281 -0
- package/NPM_PUBLISH.md +116 -0
- package/PROJECT_SUMMARY.txt +249 -0
- package/QUICKSTART.md +219 -0
- package/README.md +548 -0
- package/SECURITY.md +104 -0
- package/SETUP_GITHUB.md +237 -0
- package/TESTING_SUMMARY.md +379 -0
- package/dist/core/appUpdateChecker.d.ts +23 -0
- package/dist/core/appUpdateChecker.d.ts.map +1 -0
- package/dist/core/appUpdateChecker.js +159 -0
- package/dist/core/appUpdateChecker.js.map +1 -0
- package/dist/core/detector.d.ts +13 -0
- package/dist/core/detector.d.ts.map +1 -0
- package/dist/core/detector.js +99 -0
- package/dist/core/detector.js.map +1 -0
- package/dist/core/duplicateFileFinder.d.ts +14 -0
- package/dist/core/duplicateFileFinder.d.ts.map +1 -0
- package/dist/core/duplicateFileFinder.js +80 -0
- package/dist/core/duplicateFileFinder.js.map +1 -0
- package/dist/core/orphanedDependencyDetector.d.ts +19 -0
- package/dist/core/orphanedDependencyDetector.d.ts.map +1 -0
- package/dist/core/orphanedDependencyDetector.js +148 -0
- package/dist/core/orphanedDependencyDetector.js.map +1 -0
- package/dist/core/performanceOptimizer.d.ts +37 -0
- package/dist/core/performanceOptimizer.d.ts.map +1 -0
- package/dist/core/performanceOptimizer.js +128 -0
- package/dist/core/performanceOptimizer.js.map +1 -0
- package/dist/core/permissionHandler.d.ts +9 -0
- package/dist/core/permissionHandler.d.ts.map +1 -0
- package/dist/core/permissionHandler.js +89 -0
- package/dist/core/permissionHandler.js.map +1 -0
- package/dist/core/pluginSystem.d.ts +39 -0
- package/dist/core/pluginSystem.d.ts.map +1 -0
- package/dist/core/pluginSystem.js +120 -0
- package/dist/core/pluginSystem.js.map +1 -0
- package/dist/core/removalRecorder.d.ts +32 -0
- package/dist/core/removalRecorder.d.ts.map +1 -0
- package/dist/core/removalRecorder.js +79 -0
- package/dist/core/removalRecorder.js.map +1 -0
- package/dist/core/remover.d.ts +15 -0
- package/dist/core/remover.d.ts.map +1 -0
- package/dist/core/remover.js +225 -0
- package/dist/core/remover.js.map +1 -0
- package/dist/core/reportGenerator.d.ts +9 -0
- package/dist/core/reportGenerator.d.ts.map +1 -0
- package/dist/core/reportGenerator.js +328 -0
- package/dist/core/reportGenerator.js.map +1 -0
- package/dist/core/scheduledCleanup.d.ts +38 -0
- package/dist/core/scheduledCleanup.d.ts.map +1 -0
- package/dist/core/scheduledCleanup.js +127 -0
- package/dist/core/scheduledCleanup.js.map +1 -0
- package/dist/core/serviceFileDetector.d.ts +18 -0
- package/dist/core/serviceFileDetector.d.ts.map +1 -0
- package/dist/core/serviceFileDetector.js +136 -0
- package/dist/core/serviceFileDetector.js.map +1 -0
- package/dist/core/verificationModule.d.ts +14 -0
- package/dist/core/verificationModule.d.ts.map +1 -0
- package/dist/core/verificationModule.js +102 -0
- package/dist/core/verificationModule.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +333 -0
- package/dist/index.js.map +1 -0
- package/dist/managers/brewManager.d.ts +10 -0
- package/dist/managers/brewManager.d.ts.map +1 -0
- package/dist/managers/brewManager.js +130 -0
- package/dist/managers/brewManager.js.map +1 -0
- package/dist/managers/customManager.d.ts +8 -0
- package/dist/managers/customManager.d.ts.map +1 -0
- package/dist/managers/customManager.js +139 -0
- package/dist/managers/customManager.js.map +1 -0
- package/dist/managers/linuxManager.d.ts +10 -0
- package/dist/managers/linuxManager.d.ts.map +1 -0
- package/dist/managers/linuxManager.js +191 -0
- package/dist/managers/linuxManager.js.map +1 -0
- package/dist/managers/npmManager.d.ts +10 -0
- package/dist/managers/npmManager.d.ts.map +1 -0
- package/dist/managers/npmManager.js +119 -0
- package/dist/managers/npmManager.js.map +1 -0
- package/dist/types/index.d.ts +44 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/guiServer.d.ts +10 -0
- package/dist/ui/guiServer.d.ts.map +1 -0
- package/dist/ui/guiServer.js +134 -0
- package/dist/ui/guiServer.js.map +1 -0
- package/dist/ui/menu.d.ts +6 -0
- package/dist/ui/menu.d.ts.map +1 -0
- package/dist/ui/menu.js +93 -0
- package/dist/ui/menu.js.map +1 -0
- package/dist/ui/prompts.d.ts +13 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/dist/ui/prompts.js +161 -0
- package/dist/ui/prompts.js.map +1 -0
- package/dist/utils/filesystem.d.ts +13 -0
- package/dist/utils/filesystem.d.ts.map +1 -0
- package/dist/utils/filesystem.js +152 -0
- package/dist/utils/filesystem.js.map +1 -0
- package/dist/utils/logger.d.ts +12 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +49 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/platform.d.ts +9 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +75 -0
- package/dist/utils/platform.js.map +1 -0
- package/jest.config.js +20 -0
- package/logo.svg +60 -0
- package/package.json +55 -0
- package/setup-github.sh +125 -0
- package/src/core/appUpdateChecker.ts +220 -0
- package/src/core/detector.ts +133 -0
- package/src/core/duplicateFileFinder.ts +113 -0
- package/src/core/orphanedDependencyDetector.ts +195 -0
- package/src/core/performanceOptimizer.ts +209 -0
- package/src/core/permissionHandler.ts +121 -0
- package/src/core/pluginSystem.ts +194 -0
- package/src/core/removalRecorder.ts +146 -0
- package/src/core/remover.ts +280 -0
- package/src/core/reportGenerator.ts +354 -0
- package/src/core/scheduledCleanup.ts +204 -0
- package/src/core/serviceFileDetector.ts +181 -0
- package/src/core/verificationModule.ts +140 -0
- package/src/index.ts +449 -0
- package/src/managers/brewManager.ts +149 -0
- package/src/managers/customManager.ts +167 -0
- package/src/managers/linuxManager.ts +210 -0
- package/src/managers/npmManager.ts +137 -0
- package/src/types/index.ts +59 -0
- package/src/ui/guiServer.ts +155 -0
- package/src/ui/menu.ts +100 -0
- package/src/ui/prompts.ts +177 -0
- package/src/utils/filesystem.ts +145 -0
- package/src/utils/logger.ts +48 -0
- package/src/utils/platform.ts +75 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { InstalledApp, ArtifactPath } from '../types';
|
|
2
|
+
export declare class LinuxManager {
|
|
3
|
+
private packageManager;
|
|
4
|
+
constructor();
|
|
5
|
+
private detectPackageManager;
|
|
6
|
+
getInstalledPackages(): Promise<InstalledApp[]>;
|
|
7
|
+
findArtifacts(appName: string): Promise<ArtifactPath[]>;
|
|
8
|
+
removePackage(appName: string): Promise<boolean>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=linuxManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linuxManager.d.ts","sourceRoot":"","sources":["../../src/managers/linuxManager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGtD,qBAAa,YAAY;IACvB,OAAO,CAAC,cAAc,CAAgD;;IAMtE,OAAO,CAAC,oBAAoB;IAmBtB,oBAAoB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAyD/C,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAsGvD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAiBvD"}
|
|
@@ -0,0 +1,191 @@
|
|
|
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.LinuxManager = void 0;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const platform_1 = require("../utils/platform");
|
|
10
|
+
const filesystem_1 = require("../utils/filesystem");
|
|
11
|
+
const logger_1 = require("../utils/logger");
|
|
12
|
+
class LinuxManager {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.packageManager = 'unknown';
|
|
15
|
+
this.packageManager = this.detectPackageManager();
|
|
16
|
+
}
|
|
17
|
+
detectPackageManager() {
|
|
18
|
+
try {
|
|
19
|
+
(0, child_process_1.execSync)('which apt', { stdio: 'ignore' });
|
|
20
|
+
return 'apt';
|
|
21
|
+
}
|
|
22
|
+
catch { }
|
|
23
|
+
try {
|
|
24
|
+
(0, child_process_1.execSync)('which dnf', { stdio: 'ignore' });
|
|
25
|
+
return 'dnf';
|
|
26
|
+
}
|
|
27
|
+
catch { }
|
|
28
|
+
try {
|
|
29
|
+
(0, child_process_1.execSync)('which yum', { stdio: 'ignore' });
|
|
30
|
+
return 'yum';
|
|
31
|
+
}
|
|
32
|
+
catch { }
|
|
33
|
+
return 'unknown';
|
|
34
|
+
}
|
|
35
|
+
async getInstalledPackages() {
|
|
36
|
+
const packages = [];
|
|
37
|
+
if (this.packageManager === 'unknown') {
|
|
38
|
+
return packages;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
let output;
|
|
42
|
+
if (this.packageManager === 'apt') {
|
|
43
|
+
output = (0, child_process_1.execSync)('apt list --installed 2>/dev/null').toString();
|
|
44
|
+
const lines = output.split('\n').slice(1);
|
|
45
|
+
for (const line of lines) {
|
|
46
|
+
if (!line.trim())
|
|
47
|
+
continue;
|
|
48
|
+
const parts = line.split('/');
|
|
49
|
+
if (parts[0]) {
|
|
50
|
+
packages.push({
|
|
51
|
+
name: parts[0].trim(),
|
|
52
|
+
version: 'unknown',
|
|
53
|
+
installMethod: 'apt',
|
|
54
|
+
mainPath: '',
|
|
55
|
+
installedDate: undefined,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
try {
|
|
62
|
+
output = (0, child_process_1.execSync)(`${this.packageManager} list installed`).toString();
|
|
63
|
+
const lines = output.split('\n');
|
|
64
|
+
for (const line of lines) {
|
|
65
|
+
if (!line.trim())
|
|
66
|
+
continue;
|
|
67
|
+
const parts = line.split(/\s+/);
|
|
68
|
+
if (parts[0]) {
|
|
69
|
+
packages.push({
|
|
70
|
+
name: parts[0].split('.')[0],
|
|
71
|
+
version: parts[1] || 'unknown',
|
|
72
|
+
installMethod: this.packageManager,
|
|
73
|
+
mainPath: '',
|
|
74
|
+
installedDate: undefined,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
logger_1.Logger.debug(`Failed to query ${this.packageManager}: ` + error.message);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
logger_1.Logger.debug('Failed to get system packages: ' + error.message);
|
|
86
|
+
}
|
|
87
|
+
return packages;
|
|
88
|
+
}
|
|
89
|
+
async findArtifacts(appName) {
|
|
90
|
+
const artifacts = [];
|
|
91
|
+
const home = (0, platform_1.getHomeDir)();
|
|
92
|
+
const binPaths = [
|
|
93
|
+
`/usr/bin/${appName}`,
|
|
94
|
+
`/usr/local/bin/${appName}`,
|
|
95
|
+
`${home}/.local/bin/${appName}`,
|
|
96
|
+
];
|
|
97
|
+
for (const binPath of binPaths) {
|
|
98
|
+
if ((0, filesystem_1.pathExists)(binPath)) {
|
|
99
|
+
artifacts.push({
|
|
100
|
+
path: binPath,
|
|
101
|
+
type: 'binary',
|
|
102
|
+
size: 0,
|
|
103
|
+
description: 'Binary executable',
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const configPaths = [
|
|
108
|
+
path_1.default.join(home, `.config`, appName),
|
|
109
|
+
path_1.default.join(home, `.${appName}rc`),
|
|
110
|
+
path_1.default.join(home, `.${appName}`),
|
|
111
|
+
`/etc/${appName}`,
|
|
112
|
+
`/etc/${appName}.conf`,
|
|
113
|
+
];
|
|
114
|
+
for (const configPath of configPaths) {
|
|
115
|
+
if ((0, filesystem_1.pathExists)(configPath)) {
|
|
116
|
+
artifacts.push({
|
|
117
|
+
path: configPath,
|
|
118
|
+
type: 'config',
|
|
119
|
+
size: 0,
|
|
120
|
+
description: 'Configuration directory/file',
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const cachePaths = [
|
|
125
|
+
path_1.default.join(home, `.cache`, appName),
|
|
126
|
+
path_1.default.join(home, `.${appName}_cache`),
|
|
127
|
+
];
|
|
128
|
+
for (const cachePath of cachePaths) {
|
|
129
|
+
if ((0, filesystem_1.pathExists)(cachePath)) {
|
|
130
|
+
artifacts.push({
|
|
131
|
+
path: cachePath,
|
|
132
|
+
type: 'cache',
|
|
133
|
+
size: 0,
|
|
134
|
+
description: 'Cache directory',
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const dataPath = path_1.default.join(home, `.local`, `share`, appName);
|
|
139
|
+
if ((0, filesystem_1.pathExists)(dataPath)) {
|
|
140
|
+
artifacts.push({
|
|
141
|
+
path: dataPath,
|
|
142
|
+
type: 'data',
|
|
143
|
+
size: 0,
|
|
144
|
+
description: 'Data directory',
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
const logPaths = [
|
|
148
|
+
`/var/log/${appName}`,
|
|
149
|
+
`/var/log/${appName}.log`,
|
|
150
|
+
path_1.default.join(home, `.local`, `share`, `log`, appName),
|
|
151
|
+
];
|
|
152
|
+
for (const logPath of logPaths) {
|
|
153
|
+
if ((0, filesystem_1.pathExists)(logPath)) {
|
|
154
|
+
artifacts.push({
|
|
155
|
+
path: logPath,
|
|
156
|
+
type: 'log',
|
|
157
|
+
size: 0,
|
|
158
|
+
description: 'Log file/directory',
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const systemdPath = `/etc/systemd/system/${appName}.service`;
|
|
163
|
+
if ((0, filesystem_1.pathExists)(systemdPath)) {
|
|
164
|
+
artifacts.push({
|
|
165
|
+
path: systemdPath,
|
|
166
|
+
type: 'service',
|
|
167
|
+
size: 0,
|
|
168
|
+
description: 'Systemd service file',
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
return artifacts;
|
|
172
|
+
}
|
|
173
|
+
async removePackage(appName) {
|
|
174
|
+
if (this.packageManager === 'unknown') {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
const command = this.packageManager === 'apt'
|
|
179
|
+
? `apt-get remove -y ${appName}`
|
|
180
|
+
: `${this.packageManager} remove -y ${appName}`;
|
|
181
|
+
(0, child_process_1.execSync)(command, { stdio: 'pipe' });
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
logger_1.Logger.debug(`Failed to uninstall ${appName}: ` + error.message);
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
exports.LinuxManager = LinuxManager;
|
|
191
|
+
//# sourceMappingURL=linuxManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linuxManager.js","sourceRoot":"","sources":["../../src/managers/linuxManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { InstalledApp, ArtifactPath } from '../types';
|
|
2
|
+
export declare class NpmManager {
|
|
3
|
+
private globalNpmPath;
|
|
4
|
+
constructor();
|
|
5
|
+
private getNpmGlobalPath;
|
|
6
|
+
getInstalledPackages(): Promise<InstalledApp[]>;
|
|
7
|
+
findArtifacts(appName: string): Promise<ArtifactPath[]>;
|
|
8
|
+
removePackage(appName: string): Promise<boolean>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=npmManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npmManager.d.ts","sourceRoot":"","sources":["../../src/managers/npmManager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGtD,qBAAa,UAAU;IACrB,OAAO,CAAC,aAAa,CAAS;;IAM9B,OAAO,CAAC,gBAAgB;IAQlB,oBAAoB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAyB/C,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAgFvD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CASvD"}
|
|
@@ -0,0 +1,119 @@
|
|
|
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.NpmManager = void 0;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const platform_1 = require("../utils/platform");
|
|
10
|
+
const filesystem_1 = require("../utils/filesystem");
|
|
11
|
+
const logger_1 = require("../utils/logger");
|
|
12
|
+
class NpmManager {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.globalNpmPath = this.getNpmGlobalPath();
|
|
15
|
+
}
|
|
16
|
+
getNpmGlobalPath() {
|
|
17
|
+
try {
|
|
18
|
+
return (0, child_process_1.execSync)('npm config get prefix').toString().trim();
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return path_1.default.join((0, platform_1.getHomeDir)(), '.npm-global');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async getInstalledPackages() {
|
|
25
|
+
const packages = [];
|
|
26
|
+
try {
|
|
27
|
+
const output = (0, child_process_1.execSync)('npm list -g --json --depth=0').toString();
|
|
28
|
+
const data = JSON.parse(output);
|
|
29
|
+
const dependencies = data.dependencies || {};
|
|
30
|
+
for (const [name, pkg] of Object.entries(dependencies)) {
|
|
31
|
+
const typedPkg = pkg;
|
|
32
|
+
packages.push({
|
|
33
|
+
name,
|
|
34
|
+
version: typedPkg.version || 'unknown',
|
|
35
|
+
installMethod: 'npm',
|
|
36
|
+
mainPath: path_1.default.join(this.globalNpmPath, 'lib', 'node_modules', name),
|
|
37
|
+
installedDate: undefined,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
logger_1.Logger.debug('Failed to get npm packages: ' + error.message);
|
|
43
|
+
}
|
|
44
|
+
return packages;
|
|
45
|
+
}
|
|
46
|
+
async findArtifacts(appName) {
|
|
47
|
+
const artifacts = [];
|
|
48
|
+
const home = (0, platform_1.getHomeDir)();
|
|
49
|
+
const packagePath = path_1.default.join(this.globalNpmPath, 'lib', 'node_modules', appName);
|
|
50
|
+
if ((0, filesystem_1.pathExists)(packagePath)) {
|
|
51
|
+
artifacts.push({
|
|
52
|
+
path: packagePath,
|
|
53
|
+
type: 'other',
|
|
54
|
+
size: 0,
|
|
55
|
+
description: 'Package directory',
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
const binPath = path_1.default.join(this.globalNpmPath, 'bin', appName);
|
|
59
|
+
if ((0, filesystem_1.pathExists)(binPath)) {
|
|
60
|
+
artifacts.push({
|
|
61
|
+
path: binPath,
|
|
62
|
+
type: 'binary',
|
|
63
|
+
size: 0,
|
|
64
|
+
description: 'Executable binary',
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
const configPaths = [
|
|
68
|
+
path_1.default.join(home, `.${appName}rc`),
|
|
69
|
+
path_1.default.join(home, `.${appName}rc.json`),
|
|
70
|
+
path_1.default.join(home, `.config`, appName),
|
|
71
|
+
];
|
|
72
|
+
for (const configPath of configPaths) {
|
|
73
|
+
if ((0, filesystem_1.pathExists)(configPath)) {
|
|
74
|
+
artifacts.push({
|
|
75
|
+
path: configPath,
|
|
76
|
+
type: 'config',
|
|
77
|
+
size: 0,
|
|
78
|
+
description: `${appName} configuration`,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const cachePaths = [
|
|
83
|
+
path_1.default.join(home, `.cache`, appName),
|
|
84
|
+
path_1.default.join(home, `Library`, `Caches`, appName),
|
|
85
|
+
];
|
|
86
|
+
for (const cachePath of cachePaths) {
|
|
87
|
+
if ((0, filesystem_1.pathExists)(cachePath)) {
|
|
88
|
+
artifacts.push({
|
|
89
|
+
path: cachePath,
|
|
90
|
+
type: 'cache',
|
|
91
|
+
size: 0,
|
|
92
|
+
description: `${appName} cache`,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const dataPath = path_1.default.join(home, `.local`, `share`, appName);
|
|
97
|
+
if ((0, filesystem_1.pathExists)(dataPath)) {
|
|
98
|
+
artifacts.push({
|
|
99
|
+
path: dataPath,
|
|
100
|
+
type: 'data',
|
|
101
|
+
size: 0,
|
|
102
|
+
description: `${appName} data files`,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return artifacts;
|
|
106
|
+
}
|
|
107
|
+
async removePackage(appName) {
|
|
108
|
+
try {
|
|
109
|
+
(0, child_process_1.execSync)(`npm uninstall -g ${appName}`);
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
logger_1.Logger.debug('Failed to uninstall npm package: ' + error.message);
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.NpmManager = NpmManager;
|
|
119
|
+
//# sourceMappingURL=npmManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npmManager.js","sourceRoot":"","sources":["../../src/managers/npmManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export type Platform = 'darwin' | 'linux' | 'win32';
|
|
2
|
+
export type InstallMethod = 'npm' | 'yarn' | 'pnpm' | 'brew' | 'apt' | 'yum' | 'dnf' | 'custom' | 'unknown';
|
|
3
|
+
export interface InstalledApp {
|
|
4
|
+
name: string;
|
|
5
|
+
version: string;
|
|
6
|
+
installMethod: InstallMethod;
|
|
7
|
+
mainPath: string;
|
|
8
|
+
installedDate?: Date;
|
|
9
|
+
size?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface ArtifactPath {
|
|
12
|
+
path: string;
|
|
13
|
+
type: 'binary' | 'config' | 'cache' | 'log' | 'data' | 'service' | 'other';
|
|
14
|
+
size: number;
|
|
15
|
+
description: string;
|
|
16
|
+
}
|
|
17
|
+
export interface AppAnalysis {
|
|
18
|
+
app: InstalledApp;
|
|
19
|
+
artifacts: ArtifactPath[];
|
|
20
|
+
totalSize: number;
|
|
21
|
+
dependents?: string[];
|
|
22
|
+
}
|
|
23
|
+
export interface RemovalOptions {
|
|
24
|
+
dryRun?: boolean;
|
|
25
|
+
createBackup?: boolean;
|
|
26
|
+
backupPath?: string;
|
|
27
|
+
force?: boolean;
|
|
28
|
+
userConsent?: boolean;
|
|
29
|
+
reportFormat?: 'html' | 'text';
|
|
30
|
+
}
|
|
31
|
+
export interface RemovalResult {
|
|
32
|
+
success: boolean;
|
|
33
|
+
appName: string;
|
|
34
|
+
removedFiles: number;
|
|
35
|
+
freedSpace: number;
|
|
36
|
+
backupPath?: string;
|
|
37
|
+
errors?: string[];
|
|
38
|
+
}
|
|
39
|
+
export interface SearchOptions {
|
|
40
|
+
query?: string;
|
|
41
|
+
installMethod?: InstallMethod;
|
|
42
|
+
sortBy?: 'name' | 'date' | 'size';
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpD,MAAM,MAAM,aAAa,GACrB,KAAK,GACL,MAAM,GACN,MAAM,GACN,MAAM,GACN,KAAK,GACL,KAAK,GACL,KAAK,GACL,QAAQ,GACR,SAAS,CAAC;AAEd,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,YAAY,CAAC;IAClB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CACnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guiServer.d.ts","sourceRoot":"","sources":["../../src/ui/guiServer.ts"],"names":[],"mappings":"AASA,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,MAAM,CAAM;gBAER,IAAI,GAAE,MAAa;IAOzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,YAAY;CA4FrB"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GUIServer = void 0;
|
|
4
|
+
const http_1 = require("http");
|
|
5
|
+
const logger_1 = require("../utils/logger");
|
|
6
|
+
class GUIServer {
|
|
7
|
+
constructor(port = 3000) {
|
|
8
|
+
this.port = 3000;
|
|
9
|
+
this.port = port;
|
|
10
|
+
}
|
|
11
|
+
async start() {
|
|
12
|
+
logger_1.Logger.info(`Starting AppClean GUI server on port ${this.port}...`);
|
|
13
|
+
this.server = (0, http_1.createServer)((req, res) => {
|
|
14
|
+
if (req.url === '/') {
|
|
15
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
16
|
+
res.end(this.getIndexHTML());
|
|
17
|
+
}
|
|
18
|
+
else if (req.url?.startsWith('/api/')) {
|
|
19
|
+
this.handleAPIRequest(req, res);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
23
|
+
res.end('Not Found');
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
this.server.listen(this.port, () => {
|
|
27
|
+
logger_1.Logger.success(`GUI server running at http://localhost:${this.port}`);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
async stop() {
|
|
31
|
+
if (this.server) {
|
|
32
|
+
this.server.close();
|
|
33
|
+
logger_1.Logger.info('GUI server stopped');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
handleAPIRequest(req, res) {
|
|
37
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
38
|
+
res.end(JSON.stringify({ message: 'API endpoint' }));
|
|
39
|
+
}
|
|
40
|
+
getIndexHTML() {
|
|
41
|
+
return `
|
|
42
|
+
<!DOCTYPE html>
|
|
43
|
+
<html lang="en">
|
|
44
|
+
<head>
|
|
45
|
+
<meta charset="UTF-8">
|
|
46
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
47
|
+
<title>AppClean GUI - v1.2.0</title>
|
|
48
|
+
<style>
|
|
49
|
+
* {
|
|
50
|
+
margin: 0;
|
|
51
|
+
padding: 0;
|
|
52
|
+
box-sizing: border-box;
|
|
53
|
+
}
|
|
54
|
+
body {
|
|
55
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
56
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
57
|
+
min-height: 100vh;
|
|
58
|
+
display: flex;
|
|
59
|
+
align-items: center;
|
|
60
|
+
justify-content: center;
|
|
61
|
+
padding: 20px;
|
|
62
|
+
}
|
|
63
|
+
.container {
|
|
64
|
+
background: white;
|
|
65
|
+
border-radius: 12px;
|
|
66
|
+
box-shadow: 0 20px 60px rgba(0,0,0,0.3);
|
|
67
|
+
max-width: 800px;
|
|
68
|
+
width: 100%;
|
|
69
|
+
padding: 40px;
|
|
70
|
+
}
|
|
71
|
+
h1 {
|
|
72
|
+
color: #333;
|
|
73
|
+
margin-bottom: 10px;
|
|
74
|
+
}
|
|
75
|
+
.version {
|
|
76
|
+
color: #666;
|
|
77
|
+
font-size: 14px;
|
|
78
|
+
margin-bottom: 30px;
|
|
79
|
+
}
|
|
80
|
+
.feature-badge {
|
|
81
|
+
display: inline-block;
|
|
82
|
+
background: #667eea;
|
|
83
|
+
color: white;
|
|
84
|
+
padding: 8px 16px;
|
|
85
|
+
border-radius: 20px;
|
|
86
|
+
font-size: 12px;
|
|
87
|
+
font-weight: 600;
|
|
88
|
+
margin-bottom: 20px;
|
|
89
|
+
}
|
|
90
|
+
p {
|
|
91
|
+
color: #666;
|
|
92
|
+
line-height: 1.6;
|
|
93
|
+
margin-bottom: 20px;
|
|
94
|
+
}
|
|
95
|
+
.coming-soon {
|
|
96
|
+
background: #f0f4ff;
|
|
97
|
+
border-left: 4px solid #667eea;
|
|
98
|
+
padding: 20px;
|
|
99
|
+
border-radius: 4px;
|
|
100
|
+
margin-top: 30px;
|
|
101
|
+
}
|
|
102
|
+
</style>
|
|
103
|
+
</head>
|
|
104
|
+
<body>
|
|
105
|
+
<div class="container">
|
|
106
|
+
<h1>🎨 AppClean GUI</h1>
|
|
107
|
+
<p class="version">v1.2.0 - GUI Application Feature</p>
|
|
108
|
+
<span class="feature-badge">Coming Soon</span>
|
|
109
|
+
|
|
110
|
+
<p>
|
|
111
|
+
A beautiful, intuitive graphical user interface for AppClean, bringing the power of
|
|
112
|
+
intelligent app removal to users who prefer a visual interface.
|
|
113
|
+
</p>
|
|
114
|
+
|
|
115
|
+
<div class="coming-soon">
|
|
116
|
+
<h3>🚀 Features Coming in v1.2.0</h3>
|
|
117
|
+
<ul style="margin-left: 20px; margin-top: 10px;">
|
|
118
|
+
<li>✨ Modern, responsive GUI design</li>
|
|
119
|
+
<li>🖥️ Cross-platform support (macOS, Linux, Windows)</li>
|
|
120
|
+
<li>🔍 Visual app search and discovery</li>
|
|
121
|
+
<li>📊 Beautiful artifact visualization</li>
|
|
122
|
+
<li>🗑️ Drag-and-drop app removal</li>
|
|
123
|
+
<li>📈 Real-time removal progress</li>
|
|
124
|
+
<li>📋 Interactive report viewer</li>
|
|
125
|
+
</ul>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
</body>
|
|
129
|
+
</html>
|
|
130
|
+
`;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
exports.GUIServer = GUIServer;
|
|
134
|
+
//# sourceMappingURL=guiServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guiServer.js","sourceRoot":"","sources":["../../src/ui/guiServer.ts"],"names":[],"mappings":";;;AAMA,+BAAoC;AACpC,4CAAyC;AAEzC,MAAa,SAAS;IAIpB,YAAY,OAAe,IAAI;QAHvB,SAAI,GAAW,IAAI,CAAC;QAI1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAKD,KAAK,CAAC,KAAK;QACT,eAAM,CAAC,IAAI,CAAC,wCAAwC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;QAEpE,IAAI,CAAC,MAAM,GAAG,IAAA,mBAAY,EAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACtC,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;gBACpB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;gBACpD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;YAC/B,CAAC;iBAAM,IAAI,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;YACjC,eAAM,CAAC,OAAO,CAAC,0CAA0C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;IACL,CAAC;IAKD,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpB,eAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAKO,gBAAgB,CAAC,GAAQ,EAAE,GAAQ;QAEzC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC;IAKO,YAAY;QAClB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAyFN,CAAC;IACJ,CAAC;CACF;AAjJD,8BAiJC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type MainMenuAction = 'search' | 'browse' | 'list-all' | 'help' | 'exit';
|
|
2
|
+
export declare function showMainMenu(): Promise<MainMenuAction>;
|
|
3
|
+
export declare function showAppMenu(): Promise<'remove' | 'details' | 'back'>;
|
|
4
|
+
export declare function showHeader(): void;
|
|
5
|
+
export declare function showHelp(): void;
|
|
6
|
+
//# sourceMappingURL=menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/ui/menu.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GACtB,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,MAAM,GACN,MAAM,CAAC;AAEX,wBAAsB,YAAY,IAAI,OAAO,CAAC,cAAc,CAAC,CAgB5D;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC,CAe1E;AAED,wBAAgB,UAAU,IAAI,IAAI,CAYjC;AAED,wBAAgB,QAAQ,IAAI,IAAI,CAwC/B"}
|