The schtasks delete is now only legacy-migration cleanup; current installs autostart via a Startup-folder shortcut. Clarifies the constant and comment. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
46 lines
1.5 KiB
C#
46 lines
1.5 KiB
C#
using System.Diagnostics;
|
|
using System.IO;
|
|
using ClaudeDo.Installer.Core;
|
|
|
|
namespace ClaudeDo.Installer.Steps;
|
|
|
|
public sealed class StopWorkerStep : IInstallStep
|
|
{
|
|
public const string LegacyTaskName = "ClaudeDoWorker";
|
|
public const string ProcessName = "ClaudeDo.Worker";
|
|
|
|
public string Name => "Stop Worker";
|
|
|
|
public async Task<StepResult> ExecuteAsync(InstallContext ctx, IProgress<string> progress, CancellationToken ct)
|
|
{
|
|
progress.Report("Stopping worker process (if running)...");
|
|
var installDir = ctx.InstallDirectory;
|
|
foreach (var p in Process.GetProcessesByName(ProcessName))
|
|
{
|
|
try
|
|
{
|
|
var path = p.MainModule?.FileName;
|
|
if (path is not null && !IsUnder(path, installDir)) continue;
|
|
p.Kill(entireProcessTree: true);
|
|
p.WaitForExit(10000);
|
|
}
|
|
catch { /* process may have exited or be inaccessible */ }
|
|
finally { p.Dispose(); }
|
|
}
|
|
await Task.CompletedTask;
|
|
return StepResult.Ok();
|
|
}
|
|
|
|
private static bool IsUnder(string filePath, string dir)
|
|
{
|
|
try
|
|
{
|
|
if (string.IsNullOrWhiteSpace(dir)) return true; // can't scope — be permissive
|
|
var full = Path.GetFullPath(filePath);
|
|
var root = Path.GetFullPath(dir).TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar;
|
|
return full.StartsWith(root, StringComparison.OrdinalIgnoreCase);
|
|
}
|
|
catch { return false; }
|
|
}
|
|
}
|