frely-cli 0.13.2 → 0.14.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 +11 -0
- package/README.zh-CN.md +11 -0
- package/dist/agent-help.d.ts +12 -0
- package/dist/agent-help.js +3 -1
- package/dist/agent-help.js.map +1 -1
- package/dist/auth.d.ts +1 -0
- package/dist/auth.js +52 -19
- package/dist/auth.js.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/runtime/diagnostics.js +1 -0
- package/dist/runtime/diagnostics.js.map +1 -1
- package/dist/runtime/mcp.js +1 -1
- package/dist/runtime/mcp.js.map +1 -1
- package/dist/runtime/sandbox.d.ts +3 -1
- package/dist/runtime/sandbox.js +27 -2
- package/dist/runtime/sandbox.js.map +1 -1
- package/dist/runtime/workspace.js +2 -2
- package/dist/runtime/workspace.js.map +1 -1
- package/dist/skill/access.js +7 -2
- package/dist/skill/access.js.map +1 -1
- package/dist/uninstall.d.ts +79 -0
- package/dist/uninstall.js +414 -0
- package/dist/uninstall.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
import { execFile as execFileCallback, spawn } from "node:child_process";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { lstat, readdir, readFile, realpath, rm, rmdir, unlink, access } from "node:fs/promises";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { delimiter, dirname, join, resolve } from "node:path";
|
|
6
|
+
import { promisify } from "node:util";
|
|
7
|
+
import { constants } from "node:fs";
|
|
8
|
+
import { inspectAuth, logout } from "./auth.js";
|
|
9
|
+
import { logoutCloud } from "./cloud.js";
|
|
10
|
+
import { revokeDevice } from "./device/control.js";
|
|
11
|
+
import { readDeviceBinding } from "./device/state.js";
|
|
12
|
+
import { inspectMcpMetadata, revokeMcpAuthorization } from "./mcp-authorization.js";
|
|
13
|
+
import { runNetwork } from "./network.js";
|
|
14
|
+
import { listLocalProviders } from "./provider/state.js";
|
|
15
|
+
import { serviceStatus, uninstallMcpService } from "./service.js";
|
|
16
|
+
import { removeSkillAdapter } from "./skill/access.js";
|
|
17
|
+
import { createNativeCredentialStore } from "./credential-native.js";
|
|
18
|
+
import { readAppInstall } from "./agent/app-install.js";
|
|
19
|
+
import { inspectInstallation } from "./update/installation.js";
|
|
20
|
+
const execFile = promisify(execFileCallback);
|
|
21
|
+
export const VAULT_SERVICE = "frely-cli-vault";
|
|
22
|
+
const STAGE_PATTERNS = [/^\.frely-install\./u, /^\.frely-update-/u, /^\.frely-update\.lock$/u];
|
|
23
|
+
const PROFILE_MARKER = "# Frely user bin";
|
|
24
|
+
const DISTRIBUTION_FILE = /^([A-Za-z0-9_-]{1,128})\.json$/u;
|
|
25
|
+
const NETWORK_HOST_ROOTS = (home) => [join(home, ".claude", "skills"), join(home, ".config", "opencode", "skills"), join(home, ".agents", "skills")];
|
|
26
|
+
export const defaultDeps = () => ({
|
|
27
|
+
platform: process.platform,
|
|
28
|
+
home: homedir(),
|
|
29
|
+
env: process.env,
|
|
30
|
+
pid: process.pid,
|
|
31
|
+
inspectInstallation: () => inspectInstallation(),
|
|
32
|
+
parentPid,
|
|
33
|
+
servicePid: async () => { const status = await serviceStatus(); return { installed: status.installed, active: status.active, ...(status.pid ? { pid: status.pid } : {}) }; },
|
|
34
|
+
isLoggedIn: async () => (await inspectAuth().catch(() => null))?.configured === true,
|
|
35
|
+
hasMcpAuthorization: async () => (await inspectMcpMetadata().catch(() => null)) !== null,
|
|
36
|
+
hasDeviceBinding: async () => (await readDeviceBinding().catch(() => null)) !== null,
|
|
37
|
+
revokeMcp: () => revokeMcpAuthorization(),
|
|
38
|
+
revokeDevice,
|
|
39
|
+
logoutCloud,
|
|
40
|
+
logoutNetwork: async () => { await runNetwork(["network", "logout", "--json"]); },
|
|
41
|
+
logout,
|
|
42
|
+
uninstallService: uninstallMcpService,
|
|
43
|
+
localProviderNames: async () => (await listLocalProviders().catch(() => [])).map((provider) => provider.name),
|
|
44
|
+
removeAgent: async (distributionId, home) => { await removeSkillAdapter(distributionId, home); },
|
|
45
|
+
deleteVaultKey: async (service, account) => { await createNativeCredentialStore().deletePassword(service, account); },
|
|
46
|
+
piNodePid: async () => {
|
|
47
|
+
const install = await readAppInstall().catch(() => null);
|
|
48
|
+
if (!install)
|
|
49
|
+
return null;
|
|
50
|
+
const endpoint = JSON.parse(await readFile(join(install.agentDir, "frely", "headless.json"), "utf8").catch(() => "null"));
|
|
51
|
+
return endpoint && Number.isSafeInteger(endpoint.pid) ? endpoint.pid : null;
|
|
52
|
+
},
|
|
53
|
+
terminate: terminateProcess,
|
|
54
|
+
runPackageManager: async (file, args) => { await execFile(file, args, { cwd: homedir(), timeout: 120_000, maxBuffer: 1024 * 1024 }); },
|
|
55
|
+
spawnDetached: (file, args, env) => { spawn(file, args, { detached: true, stdio: "ignore", windowsHide: true, env }).unref(); },
|
|
56
|
+
which: whichAll,
|
|
57
|
+
});
|
|
58
|
+
/** True when this process was started by the running Device Relay service, e.g. a command run through device MCP. */
|
|
59
|
+
export async function runsInsideService(deps) {
|
|
60
|
+
const service = await deps.servicePid().catch(() => null);
|
|
61
|
+
if (!service?.active || !service.pid)
|
|
62
|
+
return false;
|
|
63
|
+
let current = deps.pid;
|
|
64
|
+
for (let depth = 0; current && depth < 64; depth++) {
|
|
65
|
+
if (current === service.pid)
|
|
66
|
+
return true;
|
|
67
|
+
current = await deps.parentPid(current).catch(() => null);
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
export async function buildPlan(deps = defaultDeps()) {
|
|
72
|
+
const steps = [];
|
|
73
|
+
const keeps = [];
|
|
74
|
+
const notes = [];
|
|
75
|
+
const { home, env } = deps;
|
|
76
|
+
const configRoot = env.XDG_CONFIG_HOME || join(home, ".config");
|
|
77
|
+
const configDir = join(configRoot, "frely");
|
|
78
|
+
const stateDir = join(env.XDG_STATE_HOME || join(home, ".local", "state"), "frely");
|
|
79
|
+
const cacheDir = join(env.XDG_RUNTIME_DIR || join(home, ".cache"), "frely");
|
|
80
|
+
// A. Account side first: it needs the stored login.
|
|
81
|
+
if (await deps.isLoggedIn()) {
|
|
82
|
+
if (await deps.hasMcpAuthorization())
|
|
83
|
+
steps.push({ id: "revoke-mcp", group: "remote", label: "Revoke this device's Device MCP authorization", run: deps.revokeMcp });
|
|
84
|
+
if (await deps.hasDeviceBinding())
|
|
85
|
+
steps.push({ id: "revoke-device", group: "remote", label: "Remove this device from your Frely account", run: async () => {
|
|
86
|
+
await deps.revokeDevice();
|
|
87
|
+
} });
|
|
88
|
+
steps.push({ id: "logout-cloud", group: "remote", label: "Revoke Cloud authorization", run: deps.logoutCloud });
|
|
89
|
+
steps.push({ id: "logout-network", group: "remote", label: "Sign out of Frely Network", run: deps.logoutNetwork });
|
|
90
|
+
steps.push({ id: "logout", group: "remote", label: "Revoke the account login", run: deps.logout });
|
|
91
|
+
}
|
|
92
|
+
// B. Background service, and the Pi Node the App's service leaves running.
|
|
93
|
+
const service = await deps.servicePid().catch(() => ({ installed: false, active: false }));
|
|
94
|
+
const piPid = await deps.piNodePid().catch(() => null);
|
|
95
|
+
if (piPid)
|
|
96
|
+
steps.push({ id: "stop-pi-node", group: "service", label: `Stop the Frely App Pi Node process (pid ${piPid})`, run: () => deps.terminate(piPid) });
|
|
97
|
+
if (service.installed || service.active) {
|
|
98
|
+
steps.push({ id: "uninstall-service", group: "service", label: "Stop and uninstall the Device Relay background service", paths: servicePaths(deps), run: deps.uninstallService });
|
|
99
|
+
}
|
|
100
|
+
// E. Installed Agent Skills (they call `frely agent run`, so they stop working without the CLI).
|
|
101
|
+
const recordsDir = join(home, ".config", "frely", "skills");
|
|
102
|
+
for (const name of (await readdir(recordsDir).catch(() => [])).sort()) {
|
|
103
|
+
const id = DISTRIBUTION_FILE.exec(name)?.[1];
|
|
104
|
+
if (!id)
|
|
105
|
+
continue;
|
|
106
|
+
const skillPath = await readFile(join(recordsDir, name), "utf8").then((raw) => JSON.parse(raw).skillPath, () => undefined);
|
|
107
|
+
steps.push({ id: `agent:${id}`, group: "agents", label: `Remove installed Agent Skill ${id}`, ...(typeof skillPath === "string" ? { paths: [skillPath] } : {}), run: () => deps.removeAgent(id, home) });
|
|
108
|
+
}
|
|
109
|
+
for (const root of NETWORK_HOST_ROOTS(home)) {
|
|
110
|
+
const folder = join(root, "frely-network");
|
|
111
|
+
if (await managedNetworkSkill(folder))
|
|
112
|
+
steps.push({ id: `network-skill:${folder}`, group: "agents", label: "Remove the Frely Network Skill", paths: [folder], run: () => removeNetworkSkill(folder) });
|
|
113
|
+
}
|
|
114
|
+
// C/D. Local data, credentials, state and cache.
|
|
115
|
+
const providers = await deps.localProviderNames();
|
|
116
|
+
if (providers.length > 0)
|
|
117
|
+
notes.push(`${providers.length} local Provider(s) (${providers.join(", ")}) stay in your Frely account but go offline; delete them in the web console if you no longer need them.`);
|
|
118
|
+
const appJson = join(configDir, "app.json");
|
|
119
|
+
const appInstalled = await exists(appJson);
|
|
120
|
+
if (appInstalled)
|
|
121
|
+
keeps.push(`${appJson} (written by the Frely App, which uninstall does not remove; use \`frely app uninstall\` first if you want it gone)`);
|
|
122
|
+
const dataPaths = [];
|
|
123
|
+
const legacySkills = join(home, ".config", "frely", "skills");
|
|
124
|
+
for (const path of [configDir, stateDir, cacheDir, ...(legacySkills.startsWith(configDir + "/") || legacySkills.startsWith(configDir + "\\") ? [] : [legacySkills])])
|
|
125
|
+
if (await exists(path))
|
|
126
|
+
dataPaths.push(path);
|
|
127
|
+
if (dataPaths.length > 0) {
|
|
128
|
+
const vaultRoot = resolve(join(configDir, "system-credentials-v1"));
|
|
129
|
+
const hasVault = await exists(vaultRoot);
|
|
130
|
+
steps.push({ id: "remove-data", group: "data", label: "Delete saved login, device identity, MCP and Provider settings, service state and caches", paths: dataPaths, run: async () => {
|
|
131
|
+
const failures = [];
|
|
132
|
+
if (hasVault)
|
|
133
|
+
await deps.deleteVaultKey(VAULT_SERVICE, `v1:${createHash("sha256").update(vaultRoot).digest("hex")}`).catch(() => failures.push("the OS credential vault entry frely-cli-vault (delete it in Keychain Access / Credential Manager / your Secret Service)"));
|
|
134
|
+
for (const path of dataPaths) {
|
|
135
|
+
const preserved = path === configDir && appInstalled ? [appJson] : [];
|
|
136
|
+
failures.push(...await removeDirectory(path, preserved));
|
|
137
|
+
}
|
|
138
|
+
if (failures.length > 0)
|
|
139
|
+
throw new Error(`could not remove: ${failures.join(", ")}`);
|
|
140
|
+
} });
|
|
141
|
+
}
|
|
142
|
+
// H. The program itself, always last.
|
|
143
|
+
const installation = await deps.inspectInstallation().catch(() => null);
|
|
144
|
+
if (installation)
|
|
145
|
+
addProgramStep(steps, keeps, installation, deps);
|
|
146
|
+
for (const other of await deps.which("frely").catch(() => [])) {
|
|
147
|
+
if (installation && other !== installation.entry)
|
|
148
|
+
notes.push(`Another \`frely\` is on PATH at ${other}; uninstall it with the tool that installed it.`);
|
|
149
|
+
}
|
|
150
|
+
for (const profile of [".zshrc", ".bashrc", ".bash_profile", ".bash_login", ".profile"]) {
|
|
151
|
+
const path = join(home, profile);
|
|
152
|
+
if ((await readFile(path, "utf8").catch(() => "")).includes(PROFILE_MARKER))
|
|
153
|
+
notes.push(`${path} still has the "${PROFILE_MARKER}" PATH lines added by install.sh; they are harmless, remove them by hand if you want.`);
|
|
154
|
+
}
|
|
155
|
+
if (deps.platform === "darwin")
|
|
156
|
+
notes.push("macOS may still list Open Computer Use under Accessibility / Screen Recording; remove it in System Settings if you enabled computer use.");
|
|
157
|
+
notes.push("The Device MCP URL you added to MCP clients (Claude, ChatGPT, ...) stops working for this device; delete that connection in the client.");
|
|
158
|
+
notes.push("Marketplace items installed with `frely item install` (folders with .frely-managed.json) are not removed.");
|
|
159
|
+
return { steps, keeps, notes };
|
|
160
|
+
}
|
|
161
|
+
function addProgramStep(steps, keeps, installation, deps) {
|
|
162
|
+
const windows = installation.platform === "win32";
|
|
163
|
+
if (installation.method === "standalone") {
|
|
164
|
+
const directory = dirname(installation.entry);
|
|
165
|
+
if (windows) {
|
|
166
|
+
steps.push({ id: "remove-program", group: "program", label: "Remove the frely program after this command exits", paths: [installation.entry], run: async () => {
|
|
167
|
+
deps.spawnDetached(join(deps.env.SystemRoot || "C:\\Windows", "System32", "WindowsPowerShell", "v1.0", "powershell.exe"), ["-NoLogo", "-NoProfile", "-NonInteractive", "-Command", WINDOWS_REMOVE_SCRIPT], { ...deps.env, FRELY_UNINSTALL_PID: String(deps.pid), FRELY_UNINSTALL_FILE: installation.entry });
|
|
168
|
+
return "scheduled; finishes a moment after this command exits";
|
|
169
|
+
} });
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
steps.push({ id: "remove-program", group: "program", label: "Remove the frely program", paths: [installation.entry], run: async () => {
|
|
173
|
+
await unlink(installation.entry);
|
|
174
|
+
for (const name of await readdir(directory).catch(() => [])) {
|
|
175
|
+
if (STAGE_PATTERNS.some((pattern) => pattern.test(name)))
|
|
176
|
+
await rm(join(directory, name), { recursive: true, force: true });
|
|
177
|
+
}
|
|
178
|
+
} });
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else if (installation.method === "npm" || installation.method === "bun") {
|
|
182
|
+
const manager = installation.manager;
|
|
183
|
+
const args = installation.method === "npm" ? ["uninstall", "--global", "--prefix", installation.prefix, "frely-cli"] : ["remove", "--global", "frely-cli"];
|
|
184
|
+
const label = `Uninstall the frely-cli package (${installation.method} global)`;
|
|
185
|
+
if (windows) {
|
|
186
|
+
steps.push({ id: "remove-program", group: "program", label, run: async () => {
|
|
187
|
+
deps.spawnDetached(join(deps.env.SystemRoot || "C:\\Windows", "System32", "WindowsPowerShell", "v1.0", "powershell.exe"), ["-NoLogo", "-NoProfile", "-NonInteractive", "-Command", WINDOWS_PACKAGE_SCRIPT], { ...deps.env, FRELY_UNINSTALL_PID: String(deps.pid), FRELY_UNINSTALL_MANAGER: manager, FRELY_UNINSTALL_ARGS: JSON.stringify(args) });
|
|
188
|
+
return "scheduled; finishes a moment after this command exits";
|
|
189
|
+
} });
|
|
190
|
+
}
|
|
191
|
+
else
|
|
192
|
+
steps.push({ id: "remove-program", group: "program", label, run: () => deps.runPackageManager(manager, args) });
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
keeps.push(`${installation.entry} (${installation.reason ?? "installation not managed by an installer Frely recognises"}); remove it with the tool that installed it.`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/** Execution takes parameters only through the environment, never through the script text. */
|
|
199
|
+
const WINDOWS_REMOVE_SCRIPT = String.raw `
|
|
200
|
+
$ErrorActionPreference = 'SilentlyContinue'
|
|
201
|
+
$file = $env:FRELY_UNINSTALL_FILE
|
|
202
|
+
Wait-Process -Id ([int]$env:FRELY_UNINSTALL_PID) -Timeout 60
|
|
203
|
+
for ($i = 0; $i -lt 50 -and (Test-Path -LiteralPath $file); $i++) { Remove-Item -LiteralPath $file -Force; if (Test-Path -LiteralPath $file) { Start-Sleep -Milliseconds 200 } }
|
|
204
|
+
$dir = Split-Path -Parent $file
|
|
205
|
+
if ((Test-Path -LiteralPath $dir) -and -not (Get-ChildItem -LiteralPath $dir -Force | Where-Object { $_.Name -notlike '.frely-*' })) {
|
|
206
|
+
Get-ChildItem -LiteralPath $dir -Force | Remove-Item -Recurse -Force
|
|
207
|
+
Remove-Item -LiteralPath $dir -Force
|
|
208
|
+
$user = [Environment]::GetEnvironmentVariable('PATH', 'User')
|
|
209
|
+
if ($user) { [Environment]::SetEnvironmentVariable('PATH', (($user -split ';' | Where-Object { $_ -and $_ -ne $dir }) -join ';'), 'User') }
|
|
210
|
+
}
|
|
211
|
+
`;
|
|
212
|
+
const WINDOWS_PACKAGE_SCRIPT = String.raw `
|
|
213
|
+
$ErrorActionPreference = 'SilentlyContinue'
|
|
214
|
+
Wait-Process -Id ([int]$env:FRELY_UNINSTALL_PID) -Timeout 60
|
|
215
|
+
$arguments = $env:FRELY_UNINSTALL_ARGS | ConvertFrom-Json
|
|
216
|
+
& $env:FRELY_UNINSTALL_MANAGER @arguments
|
|
217
|
+
`;
|
|
218
|
+
export async function executePlan(plan, options) {
|
|
219
|
+
const results = [];
|
|
220
|
+
let proceed = true;
|
|
221
|
+
for (const [index, step] of plan.steps.entries()) {
|
|
222
|
+
if (!proceed) {
|
|
223
|
+
results.push(summary(step, "skipped", "not run: the account-side revocation failed"));
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
try {
|
|
227
|
+
const detail = await step.run();
|
|
228
|
+
results.push(summary(step, "removed", detail || undefined));
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
results.push(summary(step, "failed", error instanceof Error ? error.message : String(error)));
|
|
232
|
+
}
|
|
233
|
+
const next = plan.steps[index + 1];
|
|
234
|
+
if (step.group === "remote" && (!next || next.group !== "remote") && results.some((entry) => entry.group === "remote" && entry.status === "failed")) {
|
|
235
|
+
proceed = await options.continueAfterRemoteFailure(results.filter((entry) => entry.group === "remote" && entry.status === "failed"));
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
const failed = results.some((entry) => entry.status !== "removed");
|
|
239
|
+
return { ok: !failed, results, keeps: plan.keeps, notes: plan.notes };
|
|
240
|
+
}
|
|
241
|
+
const summary = (step, status, detail) => ({ id: step.id, group: step.group, label: step.label, status, ...(detail ? { detail } : {}) });
|
|
242
|
+
const GROUP_TITLES = {
|
|
243
|
+
remote: "Account and authorization (revoked first, while you are still signed in)",
|
|
244
|
+
service: "Background service",
|
|
245
|
+
agents: "Installed Agent Skills",
|
|
246
|
+
data: "Local data",
|
|
247
|
+
program: "Program",
|
|
248
|
+
};
|
|
249
|
+
export function formatPlan(plan) {
|
|
250
|
+
const lines = ["Frely will remove the following from this computer:\n"];
|
|
251
|
+
for (const group of Object.keys(GROUP_TITLES)) {
|
|
252
|
+
const steps = plan.steps.filter((step) => step.group === group);
|
|
253
|
+
if (steps.length === 0)
|
|
254
|
+
continue;
|
|
255
|
+
lines.push(`\n${GROUP_TITLES[group]}:\n`);
|
|
256
|
+
for (const step of steps) {
|
|
257
|
+
lines.push(` - ${step.label}\n`);
|
|
258
|
+
for (const path of step.paths ?? [])
|
|
259
|
+
lines.push(` ${path}\n`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (plan.steps.length === 0)
|
|
263
|
+
lines.push(" (nothing found)\n");
|
|
264
|
+
if (plan.keeps.length > 0)
|
|
265
|
+
lines.push("\nNot removed:\n", ...plan.keeps.map((item) => ` - ${item}\n`));
|
|
266
|
+
if (plan.notes.length > 0)
|
|
267
|
+
lines.push("\nGood to know:\n", ...plan.notes.map((item) => ` - ${item}\n`));
|
|
268
|
+
return lines.join("");
|
|
269
|
+
}
|
|
270
|
+
export function formatResult(result) {
|
|
271
|
+
const lines = [result.ok ? "Frely was uninstalled.\n" : "Frely was only partly uninstalled. These items need attention:\n"];
|
|
272
|
+
for (const entry of result.results) {
|
|
273
|
+
if (entry.status === "removed")
|
|
274
|
+
lines.push(` removed ${entry.label}${entry.detail ? ` (${entry.detail})` : ""}\n`);
|
|
275
|
+
else
|
|
276
|
+
lines.push(` ${entry.status === "failed" ? "FAILED " : "skipped"} ${entry.label}: ${entry.detail ?? ""}\n`);
|
|
277
|
+
}
|
|
278
|
+
for (const failed of result.results.filter((entry) => entry.status !== "removed")) {
|
|
279
|
+
if (failed.group === "remote")
|
|
280
|
+
lines.push("\nAuthorization on the Frely side may still be active. Review Device MCP and account security in the Frely web console and revoke it there.\n");
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
283
|
+
if (result.keeps.length > 0)
|
|
284
|
+
lines.push("\nNot removed:\n", ...result.keeps.map((item) => ` - ${item}\n`));
|
|
285
|
+
if (result.notes.length > 0)
|
|
286
|
+
lines.push("\nGood to know:\n", ...result.notes.map((item) => ` - ${item}\n`));
|
|
287
|
+
return lines.join("");
|
|
288
|
+
}
|
|
289
|
+
async function exists(path) { return lstat(path).then(() => true, () => false); }
|
|
290
|
+
/** Remove a directory tree without following links; a link at the top is removed itself, never its target. */
|
|
291
|
+
async function removeDirectory(path, preserve) {
|
|
292
|
+
const failures = [];
|
|
293
|
+
const info = await lstat(path).catch(() => null);
|
|
294
|
+
if (!info)
|
|
295
|
+
return failures;
|
|
296
|
+
if (info.isSymbolicLink() || !info.isDirectory()) {
|
|
297
|
+
await unlink(path).catch(() => failures.push(path));
|
|
298
|
+
return failures;
|
|
299
|
+
}
|
|
300
|
+
for (const name of await readdir(path)) {
|
|
301
|
+
const child = join(path, name);
|
|
302
|
+
if (preserve.includes(child))
|
|
303
|
+
continue;
|
|
304
|
+
await rm(child, { recursive: true, force: true }).catch(() => failures.push(child));
|
|
305
|
+
}
|
|
306
|
+
if (preserve.length === 0)
|
|
307
|
+
await rmdir(path).catch(() => failures.push(path));
|
|
308
|
+
return failures;
|
|
309
|
+
}
|
|
310
|
+
async function managedNetworkSkill(folder) {
|
|
311
|
+
const marker = await readFile(join(folder, ".frely-managed.json"), "utf8").then((raw) => JSON.parse(raw), () => null);
|
|
312
|
+
if (!marker || marker.version !== 1 || marker.owner !== "frely-network" || typeof marker.sha256 !== "string")
|
|
313
|
+
return false;
|
|
314
|
+
const text = await readFile(join(folder, "SKILL.md"), "utf8").catch(() => null);
|
|
315
|
+
return text !== null && createHash("sha256").update(text).digest("hex") === marker.sha256;
|
|
316
|
+
}
|
|
317
|
+
async function removeNetworkSkill(folder) {
|
|
318
|
+
if (!await managedNetworkSkill(folder))
|
|
319
|
+
throw new Error("the Skill was modified; left in place");
|
|
320
|
+
await unlink(join(folder, "SKILL.md"));
|
|
321
|
+
await unlink(join(folder, ".frely-managed.json"));
|
|
322
|
+
await rmdir(folder).catch(() => undefined);
|
|
323
|
+
}
|
|
324
|
+
function servicePaths(deps) {
|
|
325
|
+
const configRoot = deps.env.XDG_CONFIG_HOME || join(deps.home, ".config");
|
|
326
|
+
if (deps.platform === "darwin")
|
|
327
|
+
return [join(deps.home, "Library", "LaunchAgents", "cloud.frely.cli-mcp.plist")];
|
|
328
|
+
if (deps.platform === "linux")
|
|
329
|
+
return [join(configRoot, "systemd", "user", "frely-mcp.service")];
|
|
330
|
+
return [];
|
|
331
|
+
}
|
|
332
|
+
async function whichAll(name) {
|
|
333
|
+
const found = [];
|
|
334
|
+
for (const directory of (process.env.PATH ?? "").split(delimiter).filter(Boolean)) {
|
|
335
|
+
for (const suffix of process.platform === "win32" ? [".exe", ".cmd", ""] : [""]) {
|
|
336
|
+
const path = join(directory, name + suffix);
|
|
337
|
+
if (await access(path, constants.X_OK).then(() => true, () => false)) {
|
|
338
|
+
const real = await realpath(path).catch(() => path);
|
|
339
|
+
if (!found.includes(real))
|
|
340
|
+
found.push(real);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
return found;
|
|
345
|
+
}
|
|
346
|
+
async function parentPid(pid) {
|
|
347
|
+
if (process.platform === "linux") {
|
|
348
|
+
const stat = await readFile(`/proc/${pid}/stat`, "utf8");
|
|
349
|
+
const fields = stat.slice(stat.lastIndexOf(")") + 2).split(" ");
|
|
350
|
+
return Number(fields[1]) || null;
|
|
351
|
+
}
|
|
352
|
+
if (process.platform === "win32") {
|
|
353
|
+
const { stdout } = await execFile("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", `(Get-CimInstance Win32_Process -Filter "ProcessId=${Math.trunc(pid)}").ParentProcessId`], { timeout: 10_000 });
|
|
354
|
+
return Number(stdout.trim()) || null;
|
|
355
|
+
}
|
|
356
|
+
const { stdout } = await execFile("ps", ["-o", "ppid=", "-p", String(Math.trunc(pid))], { timeout: 5_000 });
|
|
357
|
+
return Number(stdout.trim()) || null;
|
|
358
|
+
}
|
|
359
|
+
function alive(pid) {
|
|
360
|
+
try {
|
|
361
|
+
process.kill(pid, 0);
|
|
362
|
+
return true;
|
|
363
|
+
}
|
|
364
|
+
catch (error) {
|
|
365
|
+
return error.code === "EPERM";
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
async function terminateProcess(pid) {
|
|
369
|
+
if (!alive(pid))
|
|
370
|
+
return;
|
|
371
|
+
process.kill(pid, "SIGTERM");
|
|
372
|
+
for (let waited = 0; waited < 5_000; waited += 100) {
|
|
373
|
+
if (!alive(pid))
|
|
374
|
+
return;
|
|
375
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
376
|
+
}
|
|
377
|
+
if (alive(pid))
|
|
378
|
+
process.kill(pid, "SIGKILL");
|
|
379
|
+
}
|
|
380
|
+
/** Entry point for `frely uninstall`. Returns the process exit code. */
|
|
381
|
+
export async function runUninstall(args, io, deps = defaultDeps()) {
|
|
382
|
+
const unknown = args.filter((arg) => arg !== "--yes" && arg !== "--json");
|
|
383
|
+
if (unknown.length > 0)
|
|
384
|
+
throw new Error("Usage: frely uninstall [--yes] [--json]");
|
|
385
|
+
const yes = args.includes("--yes");
|
|
386
|
+
const json = args.includes("--json");
|
|
387
|
+
// A command run through device MCP is a child of the service this command would stop.
|
|
388
|
+
if (await runsInsideService(deps))
|
|
389
|
+
throw new Error("`frely uninstall` stops the background service that is running this command. Run it in a terminal on this computer instead. Nothing was changed.");
|
|
390
|
+
const plan = await buildPlan(deps);
|
|
391
|
+
if (!yes && (json || !io.interactive || !io.prompt)) {
|
|
392
|
+
io.write(json ? `${JSON.stringify({ ok: false, confirmed: false, plan: planView(plan) })}\n` : `${formatPlan(plan)}\nNothing was removed. Run \`frely uninstall --yes\` to remove everything above.\n`);
|
|
393
|
+
return 1;
|
|
394
|
+
}
|
|
395
|
+
if (!yes) {
|
|
396
|
+
io.write(formatPlan(plan));
|
|
397
|
+
if ((await io.prompt("\nType yes to remove everything above: ")).trim().toLowerCase() !== "yes") {
|
|
398
|
+
io.write("Nothing was removed.\n");
|
|
399
|
+
return 1;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
const result = await executePlan(plan, {
|
|
403
|
+
continueAfterRemoteFailure: async (failed) => {
|
|
404
|
+
if (yes || !io.interactive || !io.prompt)
|
|
405
|
+
return true;
|
|
406
|
+
io.write(`\nThese account-side steps failed:\n${failed.map((entry) => ` - ${entry.label}: ${entry.detail ?? ""}\n`).join("")}`);
|
|
407
|
+
return (await io.prompt("Continue and delete local files anyway? Type yes to continue: ")).trim().toLowerCase() === "yes";
|
|
408
|
+
},
|
|
409
|
+
});
|
|
410
|
+
io.write(json ? `${JSON.stringify({ ok: result.ok, confirmed: true, results: result.results, keeps: result.keeps, notes: result.notes })}\n` : formatResult(result));
|
|
411
|
+
return result.ok ? 0 : 1;
|
|
412
|
+
}
|
|
413
|
+
const planView = (plan) => ({ steps: plan.steps.map((step) => ({ id: step.id, group: step.group, label: step.label, ...(step.paths ? { paths: step.paths } : {}) })), keeps: plan.keeps, notes: plan.notes });
|
|
414
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../src/uninstall.ts"],"names":[],"mappings":"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"}
|