feat: detect host operating system at startup and provide platform-specific guidance

This commit is contained in:
dh
2026-08-06 08:16:55 +02:00
parent 59ba70ca11
commit 13a70c2375
14 changed files with 312 additions and 2 deletions
@@ -41,6 +41,19 @@ public sealed class HealthEndpointTests : IClassFixture<WebApplicationFactory<Pr
Assert.Equal("ok", body?.Status);
}
[Fact]
public async Task ApplicationStartupRegistersDetectedHostOperatingSystemOnce()
{
using var client = factory.CreateClient();
using var response = await client.GetAsync("/health");
var first = factory.Services.GetRequiredService<HostOperatingSystem>();
var second = factory.Services.GetRequiredService<HostOperatingSystem>();
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
Assert.Same(first, second);
Assert.Equal(HostOperatingSystem.DetectCurrent(), first);
}
[Fact]
public async Task ApplicationStartupDeletesStaleTemporaryRecordings()
{
@@ -732,6 +732,7 @@ public sealed class WorkflowRulesEditorTests
var root = Path.Combine(Path.GetTempPath(), "meeting-assistant-tests", Guid.NewGuid().ToString("N"));
var rulesPath = Path.Combine(root, "rules.yaml");
var builder = new WorkflowRulesEditorInstructionBuilder(
HostOperatingSystem.DetectCurrent(),
NullLogger<WorkflowRulesEditorInstructionBuilder>.Instance);
var instructions = await builder.BuildAsync(new MeetingAssistantOptions
@@ -749,10 +750,61 @@ public sealed class WorkflowRulesEditorTests
Assert.Contains("list_recent_summaries", instructions);
}
[Fact]
public async Task InstructionBuilderUsesWindowsCommandsAndConceptsOnWindows()
{
var builder = new WorkflowRulesEditorInstructionBuilder(
new HostOperatingSystem(HostOperatingSystemKind.Windows),
NullLogger<WorkflowRulesEditorInstructionBuilder>.Instance);
var instructions = await builder.BuildAsync(new MeetingAssistantOptions(), CancellationToken.None);
Assert.Contains("Detected host operating system: Windows", instructions);
Assert.Contains("PowerShell", instructions);
Assert.Contains("Windows-style paths", instructions);
Assert.Contains("Windows services", instructions);
Assert.Contains("Task Manager", instructions);
Assert.Contains("Do not use macOS-only commands or concepts", instructions);
Assert.Contains("does not make unavailable integrations available", instructions);
}
[Fact]
public async Task InstructionBuilderUsesMacOSCommandsAndConceptsOnMacOS()
{
var builder = new WorkflowRulesEditorInstructionBuilder(
new HostOperatingSystem(HostOperatingSystemKind.MacOS),
NullLogger<WorkflowRulesEditorInstructionBuilder>.Instance);
var instructions = await builder.BuildAsync(new MeetingAssistantOptions(), CancellationToken.None);
Assert.Contains("Detected host operating system: macOS", instructions);
Assert.Contains("zsh", instructions);
Assert.Contains("POSIX-style paths", instructions);
Assert.Contains("launchd and LaunchAgents", instructions);
Assert.Contains("Activity Monitor", instructions);
Assert.Contains("Do not use Windows-only commands or concepts", instructions);
Assert.Contains("does not make unavailable integrations available", instructions);
}
[Fact]
public async Task InstructionBuilderUsesPortableConceptsOnUnsupportedHosts()
{
var builder = new WorkflowRulesEditorInstructionBuilder(
new HostOperatingSystem(HostOperatingSystemKind.Unsupported),
NullLogger<WorkflowRulesEditorInstructionBuilder>.Instance);
var instructions = await builder.BuildAsync(new MeetingAssistantOptions(), CancellationToken.None);
Assert.Contains("Detected host operating system: unsupported", instructions);
Assert.Contains("portable .NET concepts", instructions);
Assert.Contains("Do not assume Windows or macOS", instructions);
}
[Fact]
public async Task InstructionBuilderIncludesProjectSyncGuidanceForCorrectedMeetingNotes()
{
var builder = new WorkflowRulesEditorInstructionBuilder(
HostOperatingSystem.DetectCurrent(),
NullLogger<WorkflowRulesEditorInstructionBuilder>.Instance);
var instructions = await builder.BuildAsync(new MeetingAssistantOptions(), CancellationToken.None);
@@ -767,6 +819,7 @@ public sealed class WorkflowRulesEditorTests
public async Task InstructionBuilderTreatsAssistantContextAsMeetingMemoryDuringRepairs()
{
var builder = new WorkflowRulesEditorInstructionBuilder(
new HostOperatingSystem(HostOperatingSystemKind.MacOS),
NullLogger<WorkflowRulesEditorInstructionBuilder>.Instance);
var options = new MeetingAssistantOptions
{
@@ -784,6 +837,8 @@ public sealed class WorkflowRulesEditorTests
Assert.Contains("read the matching assistant context", instructions);
Assert.Contains("problems, missing information, assumptions, prior fixes, and conclusions", instructions);
Assert.Contains("append a concise record of your fixes and conclusions", instructions);
Assert.Contains("Detected host operating system: macOS", instructions);
Assert.Contains("zsh", instructions);
}
[Fact]