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,127 @@
|
|
|
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.ScheduledCleanup = void 0;
|
|
7
|
+
const platform_1 = require("../utils/platform");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
const logger_1 = require("../utils/logger");
|
|
11
|
+
class ScheduledCleanup {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.schedules = new Map();
|
|
14
|
+
const home = (0, platform_1.getHomeDir)();
|
|
15
|
+
this.schedulesFile = path_1.default.join(home, '.appclean-schedules.json');
|
|
16
|
+
this.loadSchedules();
|
|
17
|
+
}
|
|
18
|
+
createSchedule(appName, frequency, options) {
|
|
19
|
+
const id = `schedule-${Date.now()}`;
|
|
20
|
+
const schedule = {
|
|
21
|
+
id,
|
|
22
|
+
appName,
|
|
23
|
+
frequency,
|
|
24
|
+
enabled: true,
|
|
25
|
+
dryRun: options?.dryRun ?? false,
|
|
26
|
+
createBackup: options?.createBackup ?? true,
|
|
27
|
+
...options,
|
|
28
|
+
};
|
|
29
|
+
this.schedules.set(id, schedule);
|
|
30
|
+
this.saveSchedules();
|
|
31
|
+
logger_1.Logger.info(`Cleanup schedule created: ${id} for ${appName} (${frequency})`);
|
|
32
|
+
return schedule;
|
|
33
|
+
}
|
|
34
|
+
deleteSchedule(scheduleId) {
|
|
35
|
+
const deleted = this.schedules.delete(scheduleId);
|
|
36
|
+
if (deleted) {
|
|
37
|
+
this.saveSchedules();
|
|
38
|
+
logger_1.Logger.info(`Cleanup schedule deleted: ${scheduleId}`);
|
|
39
|
+
}
|
|
40
|
+
return deleted;
|
|
41
|
+
}
|
|
42
|
+
getSchedules() {
|
|
43
|
+
return Array.from(this.schedules.values());
|
|
44
|
+
}
|
|
45
|
+
getSchedule(scheduleId) {
|
|
46
|
+
return this.schedules.get(scheduleId) || null;
|
|
47
|
+
}
|
|
48
|
+
updateSchedule(scheduleId, updates) {
|
|
49
|
+
const schedule = this.schedules.get(scheduleId);
|
|
50
|
+
if (schedule) {
|
|
51
|
+
Object.assign(schedule, updates);
|
|
52
|
+
this.saveSchedules();
|
|
53
|
+
logger_1.Logger.info(`Cleanup schedule updated: ${scheduleId}`);
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
setScheduleEnabled(scheduleId, enabled) {
|
|
59
|
+
const schedule = this.schedules.get(scheduleId);
|
|
60
|
+
if (schedule) {
|
|
61
|
+
schedule.enabled = enabled;
|
|
62
|
+
this.saveSchedules();
|
|
63
|
+
logger_1.Logger.info(`Cleanup schedule ${scheduleId} ${enabled ? 'enabled' : 'disabled'}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
calculateNextRun(schedule) {
|
|
67
|
+
const now = new Date();
|
|
68
|
+
switch (schedule.frequency) {
|
|
69
|
+
case 'daily':
|
|
70
|
+
return new Date(now.getTime() + 24 * 60 * 60 * 1000);
|
|
71
|
+
case 'weekly':
|
|
72
|
+
return new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);
|
|
73
|
+
case 'monthly':
|
|
74
|
+
return new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000);
|
|
75
|
+
case 'custom':
|
|
76
|
+
return new Date(now.getTime() + 24 * 60 * 60 * 1000);
|
|
77
|
+
default:
|
|
78
|
+
return now;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
getSchedulesDue() {
|
|
82
|
+
const now = new Date();
|
|
83
|
+
return this.getSchedules().filter((schedule) => {
|
|
84
|
+
if (!schedule.enabled)
|
|
85
|
+
return false;
|
|
86
|
+
if (!schedule.nextRun)
|
|
87
|
+
return true;
|
|
88
|
+
return schedule.nextRun <= now;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
recordResult(result) {
|
|
92
|
+
const home = (0, platform_1.getHomeDir)();
|
|
93
|
+
const resultsDir = path_1.default.join(home, '.appclean-cleanup-results');
|
|
94
|
+
if (!fs_1.default.existsSync(resultsDir)) {
|
|
95
|
+
fs_1.default.mkdirSync(resultsDir, { recursive: true });
|
|
96
|
+
}
|
|
97
|
+
const filename = `${result.scheduleId}-${result.timestamp.getTime()}.json`;
|
|
98
|
+
const filepath = path_1.default.join(resultsDir, filename);
|
|
99
|
+
fs_1.default.writeFileSync(filepath, JSON.stringify(result, null, 2), 'utf-8');
|
|
100
|
+
logger_1.Logger.debug(`Cleanup result recorded: ${filepath}`);
|
|
101
|
+
}
|
|
102
|
+
loadSchedules() {
|
|
103
|
+
try {
|
|
104
|
+
if (fs_1.default.existsSync(this.schedulesFile)) {
|
|
105
|
+
const content = fs_1.default.readFileSync(this.schedulesFile, 'utf-8');
|
|
106
|
+
const data = JSON.parse(content);
|
|
107
|
+
for (const schedule of data) {
|
|
108
|
+
this.schedules.set(schedule.id, schedule);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
logger_1.Logger.debug(`Failed to load schedules: ${error.message}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
saveSchedules() {
|
|
117
|
+
try {
|
|
118
|
+
const data = Array.from(this.schedules.values());
|
|
119
|
+
fs_1.default.writeFileSync(this.schedulesFile, JSON.stringify(data, null, 2), 'utf-8');
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
logger_1.Logger.error(`Failed to save schedules: ${error.message}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
exports.ScheduledCleanup = ScheduledCleanup;
|
|
127
|
+
//# sourceMappingURL=scheduledCleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduledCleanup.js","sourceRoot":"","sources":["../../src/core/scheduledCleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ArtifactPath } from '../types';
|
|
2
|
+
export interface ServiceFile {
|
|
3
|
+
path: string;
|
|
4
|
+
type: 'launchagent' | 'launchdaemon' | 'systemd' | 'service';
|
|
5
|
+
appName: string;
|
|
6
|
+
requiresManualCleanup: boolean;
|
|
7
|
+
dependencies?: string[];
|
|
8
|
+
manualCleanupInstructions: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class ServiceFileDetector {
|
|
11
|
+
findServiceFiles(appName: string): Promise<ServiceFile[]>;
|
|
12
|
+
private findMacOSServiceFiles;
|
|
13
|
+
private findLinuxServiceFiles;
|
|
14
|
+
private checkDependencies;
|
|
15
|
+
convertToArtifacts(serviceFiles: ServiceFile[]): ArtifactPath[];
|
|
16
|
+
getManualCleanupInstructions(serviceFiles: ServiceFile[]): string;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=serviceFileDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceFileDetector.d.ts","sourceRoot":"","sources":["../../src/core/serviceFileDetector.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,SAAS,GAAG,SAAS,CAAC;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,yBAAyB,EAAE,MAAM,CAAC;CACnC;AAED,qBAAa,mBAAmB;IAIxB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YAiBjD,qBAAqB;YA8CrB,qBAAqB;IAkDnC,OAAO,CAAC,iBAAiB;IAmBzB,kBAAkB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,YAAY,EAAE;IAY/D,4BAA4B,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,MAAM;CAkBlE"}
|
|
@@ -0,0 +1,136 @@
|
|
|
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.ServiceFileDetector = void 0;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const platform_1 = require("../utils/platform");
|
|
9
|
+
const filesystem_1 = require("../utils/filesystem");
|
|
10
|
+
class ServiceFileDetector {
|
|
11
|
+
async findServiceFiles(appName) {
|
|
12
|
+
const serviceFiles = [];
|
|
13
|
+
if ((0, platform_1.isMacOS)()) {
|
|
14
|
+
serviceFiles.push(...(await this.findMacOSServiceFiles(appName)));
|
|
15
|
+
}
|
|
16
|
+
if ((0, platform_1.isLinux)()) {
|
|
17
|
+
serviceFiles.push(...(await this.findLinuxServiceFiles(appName)));
|
|
18
|
+
}
|
|
19
|
+
return serviceFiles;
|
|
20
|
+
}
|
|
21
|
+
async findMacOSServiceFiles(appName) {
|
|
22
|
+
const home = (0, platform_1.getHomeDir)();
|
|
23
|
+
const serviceFiles = [];
|
|
24
|
+
const launchAgentsPath = path_1.default.join(home, 'Library', 'LaunchAgents');
|
|
25
|
+
if ((0, filesystem_1.pathExists)(launchAgentsPath)) {
|
|
26
|
+
const agents = (0, filesystem_1.listDirectory)(launchAgentsPath);
|
|
27
|
+
for (const agent of agents) {
|
|
28
|
+
if (agent.toLowerCase().includes(appName.toLowerCase())) {
|
|
29
|
+
const fullPath = path_1.default.join(launchAgentsPath, agent);
|
|
30
|
+
serviceFiles.push({
|
|
31
|
+
path: fullPath,
|
|
32
|
+
type: 'launchagent',
|
|
33
|
+
appName,
|
|
34
|
+
requiresManualCleanup: this.checkDependencies(fullPath, appName),
|
|
35
|
+
manualCleanupInstructions: `To manually remove: rm "${fullPath}"`,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const launchDaemonsPath = path_1.default.join(home, 'Library', 'LaunchDaemons');
|
|
41
|
+
if ((0, filesystem_1.pathExists)(launchDaemonsPath)) {
|
|
42
|
+
const daemons = (0, filesystem_1.listDirectory)(launchDaemonsPath);
|
|
43
|
+
for (const daemon of daemons) {
|
|
44
|
+
if (daemon.toLowerCase().includes(appName.toLowerCase())) {
|
|
45
|
+
const fullPath = path_1.default.join(launchDaemonsPath, daemon);
|
|
46
|
+
serviceFiles.push({
|
|
47
|
+
path: fullPath,
|
|
48
|
+
type: 'launchdaemon',
|
|
49
|
+
appName,
|
|
50
|
+
requiresManualCleanup: true,
|
|
51
|
+
manualCleanupInstructions: `To manually remove: sudo rm "${fullPath}" && sudo launchctl unload "${fullPath}"`,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return serviceFiles;
|
|
57
|
+
}
|
|
58
|
+
async findLinuxServiceFiles(appName) {
|
|
59
|
+
const home = (0, platform_1.getHomeDir)();
|
|
60
|
+
const serviceFiles = [];
|
|
61
|
+
const userSystemdPath = path_1.default.join(home, '.config', 'systemd', 'user');
|
|
62
|
+
if ((0, filesystem_1.pathExists)(userSystemdPath)) {
|
|
63
|
+
const services = (0, filesystem_1.listDirectory)(userSystemdPath);
|
|
64
|
+
for (const service of services) {
|
|
65
|
+
if (service.includes(appName)) {
|
|
66
|
+
const fullPath = path_1.default.join(userSystemdPath, service);
|
|
67
|
+
serviceFiles.push({
|
|
68
|
+
path: fullPath,
|
|
69
|
+
type: 'systemd',
|
|
70
|
+
appName,
|
|
71
|
+
requiresManualCleanup: this.checkDependencies(fullPath, appName),
|
|
72
|
+
manualCleanupInstructions: `To manually remove: systemctl --user stop ${service} && rm "${fullPath}" && systemctl --user daemon-reload`,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const systemServicePath = '/etc/systemd/system';
|
|
78
|
+
if ((0, filesystem_1.pathExists)(systemServicePath)) {
|
|
79
|
+
try {
|
|
80
|
+
const services = (0, filesystem_1.listDirectory)(systemServicePath);
|
|
81
|
+
for (const service of services) {
|
|
82
|
+
if (service.includes(appName)) {
|
|
83
|
+
const fullPath = path_1.default.join(systemServicePath, service);
|
|
84
|
+
serviceFiles.push({
|
|
85
|
+
path: fullPath,
|
|
86
|
+
type: 'service',
|
|
87
|
+
appName,
|
|
88
|
+
requiresManualCleanup: true,
|
|
89
|
+
manualCleanupInstructions: `To manually remove: sudo systemctl stop ${service} && sudo rm "${fullPath}" && sudo systemctl daemon-reload`,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return serviceFiles;
|
|
98
|
+
}
|
|
99
|
+
checkDependencies(filePath, appName) {
|
|
100
|
+
try {
|
|
101
|
+
const content = (0, filesystem_1.readFile)(filePath);
|
|
102
|
+
if (!content)
|
|
103
|
+
return false;
|
|
104
|
+
return (content.includes('KeepAlive') ||
|
|
105
|
+
content.includes('RunAtLoad') ||
|
|
106
|
+
content.includes('StartCalendarInterval'));
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
convertToArtifacts(serviceFiles) {
|
|
113
|
+
return serviceFiles.map((file) => ({
|
|
114
|
+
path: file.path,
|
|
115
|
+
type: 'service',
|
|
116
|
+
size: 0,
|
|
117
|
+
description: `${file.type} service file (requires manual cleanup)`,
|
|
118
|
+
}));
|
|
119
|
+
}
|
|
120
|
+
getManualCleanupInstructions(serviceFiles) {
|
|
121
|
+
if (serviceFiles.length === 0) {
|
|
122
|
+
return '';
|
|
123
|
+
}
|
|
124
|
+
let instructions = '\nā ļø Manual Cleanup Required:\n\n';
|
|
125
|
+
instructions += 'The following service files require manual cleanup:\n\n';
|
|
126
|
+
serviceFiles.forEach((file, index) => {
|
|
127
|
+
instructions += `${index + 1}. ${file.type.toUpperCase()}\n`;
|
|
128
|
+
instructions += ` Path: ${file.path}\n`;
|
|
129
|
+
instructions += ` Command: ${file.manualCleanupInstructions}\n\n`;
|
|
130
|
+
});
|
|
131
|
+
instructions += 'Run these commands in your terminal to complete the cleanup.\n';
|
|
132
|
+
return instructions;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.ServiceFileDetector = ServiceFileDetector;
|
|
136
|
+
//# sourceMappingURL=serviceFileDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceFileDetector.js","sourceRoot":"","sources":["../../src/core/serviceFileDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type VerificationStatus = 'verified_removed' | 'still_exists' | 'partial_removal' | 'unknown';
|
|
2
|
+
export interface VerificationResult {
|
|
3
|
+
status: VerificationStatus;
|
|
4
|
+
remainingPaths: string[];
|
|
5
|
+
commandOutput: string;
|
|
6
|
+
timestamp: Date;
|
|
7
|
+
}
|
|
8
|
+
export declare class VerificationModule {
|
|
9
|
+
verifyRemoval(appName: string, artifactPaths: string[]): Promise<VerificationResult>;
|
|
10
|
+
private verifyViaCommand;
|
|
11
|
+
getStatusMessage(status: VerificationStatus): string;
|
|
12
|
+
getDetailedReport(result: VerificationResult): string;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=verificationModule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verificationModule.d.ts","sourceRoot":"","sources":["../../src/core/verificationModule.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,kBAAkB,GAAG,kBAAkB,GAAG,cAAc,GAAG,iBAAiB,GAAG,SAAS,CAAC;AAErG,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,qBAAa,kBAAkB;IAIvB,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,kBAAkB,CAAC;YAsChB,gBAAgB;IA+C9B,gBAAgB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM;IAcpD,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM;CAoBtD"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VerificationModule = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const platform_1 = require("../utils/platform");
|
|
6
|
+
const filesystem_1 = require("../utils/filesystem");
|
|
7
|
+
class VerificationModule {
|
|
8
|
+
async verifyRemoval(appName, artifactPaths) {
|
|
9
|
+
const result = {
|
|
10
|
+
status: 'unknown',
|
|
11
|
+
remainingPaths: [],
|
|
12
|
+
commandOutput: '',
|
|
13
|
+
timestamp: new Date(),
|
|
14
|
+
};
|
|
15
|
+
try {
|
|
16
|
+
const remainingPaths = artifactPaths.filter((path) => (0, filesystem_1.pathExists)(path));
|
|
17
|
+
result.remainingPaths = remainingPaths;
|
|
18
|
+
const commandStatus = await this.verifyViaCommand(appName);
|
|
19
|
+
result.commandOutput = commandStatus;
|
|
20
|
+
if (remainingPaths.length === 0 && !commandStatus) {
|
|
21
|
+
result.status = 'verified_removed';
|
|
22
|
+
}
|
|
23
|
+
else if (remainingPaths.length === 0 && commandStatus) {
|
|
24
|
+
result.status = 'unknown';
|
|
25
|
+
}
|
|
26
|
+
else if (remainingPaths.length > 0 && remainingPaths.length < artifactPaths.length) {
|
|
27
|
+
result.status = 'partial_removal';
|
|
28
|
+
}
|
|
29
|
+
else if (remainingPaths.length === artifactPaths.length) {
|
|
30
|
+
result.status = 'still_exists';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
result.status = 'unknown';
|
|
35
|
+
result.commandOutput = error.message;
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
async verifyViaCommand(appName) {
|
|
40
|
+
try {
|
|
41
|
+
if ((0, platform_1.isMacOS)() || (0, platform_1.isLinux)()) {
|
|
42
|
+
try {
|
|
43
|
+
const output = (0, child_process_1.execSync)(`which ${appName} 2>/dev/null || true`).toString().trim();
|
|
44
|
+
if (output) {
|
|
45
|
+
return `Found at: ${output}`;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
(0, child_process_1.execSync)(`${appName} --version 2>/dev/null || true`).toString().trim();
|
|
52
|
+
return `App still responds to --version`;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
}
|
|
56
|
+
return '';
|
|
57
|
+
}
|
|
58
|
+
if ((0, platform_1.isWindows)()) {
|
|
59
|
+
try {
|
|
60
|
+
const output = (0, child_process_1.execSync)(`where ${appName} 2>nul || echo ""`).toString().trim();
|
|
61
|
+
if (output && output !== '""') {
|
|
62
|
+
return `Found at: ${output}`;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
}
|
|
67
|
+
return '';
|
|
68
|
+
}
|
|
69
|
+
return '';
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return '';
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
getStatusMessage(status) {
|
|
76
|
+
const messages = {
|
|
77
|
+
verified_removed: 'ā Application successfully removed',
|
|
78
|
+
still_exists: 'ā Application still exists on system',
|
|
79
|
+
partial_removal: 'ā Application partially removed (some files remain)',
|
|
80
|
+
unknown: '? Verification status unknown',
|
|
81
|
+
};
|
|
82
|
+
return messages[status] || messages['unknown'];
|
|
83
|
+
}
|
|
84
|
+
getDetailedReport(result) {
|
|
85
|
+
let report = `\nš Verification Report\n`;
|
|
86
|
+
report += `${'ā'.repeat(40)}\n`;
|
|
87
|
+
report += `Status: ${this.getStatusMessage(result.status)}\n`;
|
|
88
|
+
if (result.remainingPaths.length > 0) {
|
|
89
|
+
report += `\nRemaining Files/Folders:\n`;
|
|
90
|
+
result.remainingPaths.forEach((path) => {
|
|
91
|
+
report += ` - ${path}\n`;
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if (result.commandOutput) {
|
|
95
|
+
report += `\nCommand Output: ${result.commandOutput}\n`;
|
|
96
|
+
}
|
|
97
|
+
report += `Verified at: ${result.timestamp.toISOString()}\n`;
|
|
98
|
+
return report;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
exports.VerificationModule = VerificationModule;
|
|
102
|
+
//# sourceMappingURL=verificationModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verificationModule.js","sourceRoot":"","sources":["../../src/core/verificationModule.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|