resolve-solo 0.5.3 → 0.7.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/README.md +56 -34
- package/dist/cli.js +180 -3
- package/dist/cli.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/doctor.d.ts +51 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +420 -0
- package/dist/doctor.js.map +1 -0
- package/dist/handlers.d.ts +20 -0
- package/dist/handlers.d.ts.map +1 -1
- package/dist/handlers.js +74 -1
- package/dist/handlers.js.map +1 -1
- package/dist/investigation.d.ts.map +1 -1
- package/dist/investigation.js +7 -3
- package/dist/investigation.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +101 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +15 -6
- package/dist/output.js.map +1 -1
- package/dist/repl.js +180 -7
- package/dist/repl.js.map +1 -1
- package/dist/timeline.d.ts.map +1 -1
- package/dist/timeline.js +2 -3
- package/dist/timeline.js.map +1 -1
- package/dist/uninstall.d.ts +41 -0
- package/dist/uninstall.d.ts.map +1 -0
- package/dist/uninstall.js +231 -0
- package/dist/uninstall.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uninstall Logic
|
|
3
|
+
*
|
|
4
|
+
* Handles detection of install method, data cleanup, and removal of resolve-solo.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'node:fs';
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
import * as os from 'node:os';
|
|
9
|
+
import { execSync } from 'node:child_process';
|
|
10
|
+
import { getResolveaiDir } from './storage.js';
|
|
11
|
+
import { cleanupClaudeIntegration } from './setup.js';
|
|
12
|
+
/**
|
|
13
|
+
* Detect how resolve-solo was installed
|
|
14
|
+
*/
|
|
15
|
+
export function detectInstallMethod() {
|
|
16
|
+
try {
|
|
17
|
+
// Check if installed globally via npm
|
|
18
|
+
const globalList = execSync('npm list -g resolve-solo --depth=0', {
|
|
19
|
+
stdio: 'pipe',
|
|
20
|
+
encoding: 'utf-8',
|
|
21
|
+
});
|
|
22
|
+
if (globalList.includes('resolve-solo@')) {
|
|
23
|
+
return 'npm-global';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// Not found globally
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
// Check if installed locally in current directory
|
|
31
|
+
const localList = execSync('npm list resolve-solo --depth=0', {
|
|
32
|
+
stdio: 'pipe',
|
|
33
|
+
encoding: 'utf-8',
|
|
34
|
+
});
|
|
35
|
+
if (localList.includes('resolve-solo@')) {
|
|
36
|
+
return 'npm-local';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Not found locally
|
|
41
|
+
}
|
|
42
|
+
// If we're running but not installed, probably npx or direct execution
|
|
43
|
+
// Check if node_modules exists in our package directory
|
|
44
|
+
try {
|
|
45
|
+
const whichResolve = execSync('which resolveai', {
|
|
46
|
+
stdio: 'pipe',
|
|
47
|
+
encoding: 'utf-8',
|
|
48
|
+
}).trim();
|
|
49
|
+
// If it's in a .npm/_npx directory, it's npx
|
|
50
|
+
if (whichResolve.includes('/_npx/') || whichResolve.includes('\\_npx\\')) {
|
|
51
|
+
return 'npx';
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// which command failed
|
|
56
|
+
}
|
|
57
|
+
return 'unknown';
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Calculate directory size in human-readable format
|
|
61
|
+
*/
|
|
62
|
+
function getDirectorySize(dirPath) {
|
|
63
|
+
if (!fs.existsSync(dirPath)) {
|
|
64
|
+
return '0 B';
|
|
65
|
+
}
|
|
66
|
+
let totalSize = 0;
|
|
67
|
+
function calculateSize(currentPath) {
|
|
68
|
+
const stats = fs.statSync(currentPath);
|
|
69
|
+
if (stats.isDirectory()) {
|
|
70
|
+
const files = fs.readdirSync(currentPath);
|
|
71
|
+
for (const file of files) {
|
|
72
|
+
calculateSize(path.join(currentPath, file));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
totalSize += stats.size;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
calculateSize(dirPath);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return 'unknown';
|
|
84
|
+
}
|
|
85
|
+
// Convert to human-readable
|
|
86
|
+
if (totalSize < 1024)
|
|
87
|
+
return `${totalSize} B`;
|
|
88
|
+
if (totalSize < 1024 * 1024)
|
|
89
|
+
return `${(totalSize / 1024).toFixed(1)} KB`;
|
|
90
|
+
if (totalSize < 1024 * 1024 * 1024)
|
|
91
|
+
return `${(totalSize / (1024 * 1024)).toFixed(1)} MB`;
|
|
92
|
+
return `${(totalSize / (1024 * 1024 * 1024)).toFixed(1)} GB`;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Check if Claude Code integration exists
|
|
96
|
+
*/
|
|
97
|
+
function hasClaudeIntegration() {
|
|
98
|
+
const homeDir = os.homedir();
|
|
99
|
+
const configPaths = [
|
|
100
|
+
path.join(homeDir, '.config', 'claude', 'config.json'),
|
|
101
|
+
path.join(homeDir, '.claude', 'config.json'),
|
|
102
|
+
path.join(homeDir, '.claude.json'),
|
|
103
|
+
];
|
|
104
|
+
for (const configPath of configPaths) {
|
|
105
|
+
if (fs.existsSync(configPath)) {
|
|
106
|
+
try {
|
|
107
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
108
|
+
if (config.mcpServers && config.mcpServers['resolve-solo']) {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Check agent file
|
|
118
|
+
const agentFile = path.join(homeDir, '.claude', 'agents', 'incident-investigator.md');
|
|
119
|
+
return fs.existsSync(agentFile);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Generate summary of what will be removed
|
|
123
|
+
*/
|
|
124
|
+
export function getUninstallSummary() {
|
|
125
|
+
const installMethod = detectInstallMethod();
|
|
126
|
+
const packageInstalled = installMethod !== 'npx' && installMethod !== 'unknown';
|
|
127
|
+
const dataDir = getResolveaiDir();
|
|
128
|
+
const dataExists = fs.existsSync(dataDir);
|
|
129
|
+
const dataSize = dataExists ? getDirectorySize(dataDir) : undefined;
|
|
130
|
+
const claudeIntegration = hasClaudeIntegration();
|
|
131
|
+
return {
|
|
132
|
+
installMethod,
|
|
133
|
+
packageInstalled,
|
|
134
|
+
dataExists,
|
|
135
|
+
dataSize,
|
|
136
|
+
claudeIntegration,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Remove npm package
|
|
141
|
+
*/
|
|
142
|
+
function removePackage(installMethod) {
|
|
143
|
+
if (installMethod === 'npm-global') {
|
|
144
|
+
try {
|
|
145
|
+
execSync('npm uninstall -g resolve-solo', { stdio: 'pipe' });
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
else if (installMethod === 'npm-local') {
|
|
153
|
+
try {
|
|
154
|
+
execSync('npm uninstall resolve-solo', { stdio: 'pipe' });
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// npx or unknown - nothing to remove
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Remove local data directory
|
|
166
|
+
*/
|
|
167
|
+
function removeData(dataDir) {
|
|
168
|
+
if (!fs.existsSync(dataDir)) {
|
|
169
|
+
return true; // Nothing to remove
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
fs.rmSync(dataDir, { recursive: true, force: true });
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Remove Claude Code integration
|
|
181
|
+
*/
|
|
182
|
+
function removeClaudeIntegration() {
|
|
183
|
+
const result = cleanupClaudeIntegration();
|
|
184
|
+
return result.success;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Perform uninstall
|
|
188
|
+
*/
|
|
189
|
+
export function performUninstall(options) {
|
|
190
|
+
const summary = getUninstallSummary();
|
|
191
|
+
const removed = {
|
|
192
|
+
package: false,
|
|
193
|
+
data: false,
|
|
194
|
+
claudeIntegration: false,
|
|
195
|
+
};
|
|
196
|
+
// Remove package if installed
|
|
197
|
+
if (summary.packageInstalled) {
|
|
198
|
+
removed.package = removePackage(summary.installMethod);
|
|
199
|
+
}
|
|
200
|
+
// Remove data unless --keep-data flag is set
|
|
201
|
+
if (summary.dataExists && !options.keepData) {
|
|
202
|
+
const dataDir = getResolveaiDir();
|
|
203
|
+
removed.data = removeData(dataDir);
|
|
204
|
+
}
|
|
205
|
+
// Remove Claude Code integration
|
|
206
|
+
if (summary.claudeIntegration) {
|
|
207
|
+
removed.claudeIntegration = removeClaudeIntegration();
|
|
208
|
+
}
|
|
209
|
+
// Determine success
|
|
210
|
+
const success = (!summary.packageInstalled || removed.package) &&
|
|
211
|
+
(!summary.dataExists || options.keepData || removed.data) &&
|
|
212
|
+
(!summary.claudeIntegration || removed.claudeIntegration);
|
|
213
|
+
// Build message
|
|
214
|
+
let message = 'Uninstall ';
|
|
215
|
+
if (success) {
|
|
216
|
+
message += 'completed successfully';
|
|
217
|
+
if (options.keepData && summary.dataExists) {
|
|
218
|
+
message += ' (data preserved)';
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
message += 'completed with errors';
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
success,
|
|
226
|
+
message,
|
|
227
|
+
summary,
|
|
228
|
+
removed,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../src/uninstall.ts"],"names":[],"mappings":"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"}
|