A LocalSystem Windows service can't see the logged-in user's Claude CLI authentication, so the worker now runs as the current user via a hidden per-user logon Scheduled Task with restart-on-failure. - Worker is WinExe (no console window) with a Serilog rolling file sink and a single-instance mutex so the logon task, app ensure-running, and Restart button can't fight over the SignalR port. - Installer replaces the service steps (register/start/stop) with autostart task steps, migrates the legacy ClaudeDoWorker service away on update, and removes the task on uninstall. ServicePage drops the service-account UI. - UI gains a WorkerLocator; the app ensures the worker is running at startup and the Restart button kills+relaunches this install's worker process. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
37 lines
1.2 KiB
C#
37 lines
1.2 KiB
C#
using ClaudeDo.Ui.Services;
|
|
using Xunit;
|
|
|
|
namespace ClaudeDo.Ui.Tests.Services;
|
|
|
|
public class WorkerLocatorTests
|
|
{
|
|
[Fact]
|
|
public void FindByWalkingUp_FindsWorkerExeBesideInstallJson()
|
|
{
|
|
var root = Path.Combine(Path.GetTempPath(), "claudedo_wl_" + Guid.NewGuid().ToString("N"));
|
|
var appDir = Path.Combine(root, "app");
|
|
var workerDir = Path.Combine(root, "worker");
|
|
Directory.CreateDirectory(appDir);
|
|
Directory.CreateDirectory(workerDir);
|
|
File.WriteAllText(Path.Combine(root, "install.json"), "{}");
|
|
var exe = Path.Combine(workerDir, "ClaudeDo.Worker.exe");
|
|
File.WriteAllText(exe, "");
|
|
|
|
try
|
|
{
|
|
var found = new WorkerLocator().FindByWalkingUp(appDir);
|
|
Assert.Equal(exe, found);
|
|
}
|
|
finally { Directory.Delete(root, recursive: true); }
|
|
}
|
|
|
|
[Fact]
|
|
public void FindByWalkingUp_ReturnsNullWhenNoManifest()
|
|
{
|
|
var dir = Path.Combine(Path.GetTempPath(), "claudedo_wl_none_" + Guid.NewGuid().ToString("N"));
|
|
Directory.CreateDirectory(dir);
|
|
try { Assert.Null(new WorkerLocator().FindByWalkingUp(dir)); }
|
|
finally { Directory.Delete(dir, recursive: true); }
|
|
}
|
|
}
|