feat(worker): add Claude CLI preflight on startup

Worker now runs `claude --version` before listening; on non-zero exit
it logs critical and exits with code 1. Skippable via env var
CLAUDEDO_SKIP_CLI_PREFLIGHT=1 for environments without the CLI (tests,
dev). Closes verification step 2 / open.md item 3.1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
mika kuns
2026-04-30 14:17:44 +02:00
parent 4c92da55ad
commit df66c4af46
3 changed files with 83 additions and 0 deletions

View File

@@ -0,0 +1,29 @@
using ClaudeDo.Worker.Lifecycle;
using Xunit;
namespace ClaudeDo.Worker.Tests.Lifecycle;
public sealed class ClaudeCliPreflightTests
{
[Fact]
public async Task NonExistentBinary_ReturnsNotOk_WithError()
{
var result = await ClaudeCliPreflight.CheckAsync("definitely-not-a-real-bin-xyz123");
Assert.False(result.Ok);
Assert.NotEqual(0, result.ExitCode);
Assert.NotEmpty(result.Error);
}
[Fact]
public async Task BinaryAcceptingVersionFlag_ReturnsOk_WithVersionOutput()
{
// `dotnet --version` is always available in this build environment, exits 0,
// and prints the SDK version on stdout — same shape as `claude --version`.
var result = await ClaudeCliPreflight.CheckAsync("dotnet");
Assert.True(result.Ok, $"expected ok, got exit={result.ExitCode} err='{result.Error}'");
Assert.Equal(0, result.ExitCode);
Assert.NotEmpty(result.Version);
}
}