feat(worker): add AgentFileService for filesystem agent management

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Mika Kuns
2026-04-14 11:39:24 +02:00
parent 54c4d3cf93
commit 8825351526
2 changed files with 160 additions and 0 deletions

View File

@@ -0,0 +1,84 @@
using ClaudeDo.Worker.Services;
namespace ClaudeDo.Worker.Tests.Services;
public sealed class AgentFileServiceTests : IDisposable
{
private readonly string _agentDir;
private readonly AgentFileService _service;
public AgentFileServiceTests()
{
_agentDir = Path.Combine(Path.GetTempPath(), $"claudedo_agents_test_{Guid.NewGuid():N}");
Directory.CreateDirectory(_agentDir);
_service = new AgentFileService(_agentDir);
}
[Fact]
public async Task Scan_Returns_Empty_For_Empty_Directory()
{
var agents = await _service.ScanAsync();
Assert.Empty(agents);
}
[Fact]
public async Task Scan_Parses_Frontmatter()
{
var content = "---\nname: Test Agent\ndescription: A test agent for unit tests\n---\n\nYou are a test agent.";
await File.WriteAllTextAsync(Path.Combine(_agentDir, "test.md"), content);
var agents = await _service.ScanAsync();
Assert.Single(agents);
Assert.Equal("Test Agent", agents[0].Name);
Assert.Equal("A test agent for unit tests", agents[0].Description);
Assert.EndsWith("test.md", agents[0].Path);
}
[Fact]
public async Task Scan_Uses_Filename_When_No_Frontmatter()
{
await File.WriteAllTextAsync(Path.Combine(_agentDir, "simple.md"), "Just instructions.");
var agents = await _service.ScanAsync();
Assert.Single(agents);
Assert.Equal("simple", agents[0].Name);
Assert.Equal("", agents[0].Description);
}
[Fact]
public async Task Write_And_Read_Roundtrips()
{
var path = Path.Combine(_agentDir, "new-agent.md");
var content = "---\nname: New\ndescription: Desc\n---\nBody";
await _service.WriteAsync(path, content);
var read = await _service.ReadAsync(path);
Assert.Equal(content, read);
}
[Fact]
public async Task Delete_Removes_File()
{
var path = Path.Combine(_agentDir, "to-delete.md");
await File.WriteAllTextAsync(path, "temp");
await _service.DeleteAsync(path);
Assert.False(File.Exists(path));
}
[Fact]
public async Task Scan_Ignores_Non_Md_Files()
{
await File.WriteAllTextAsync(Path.Combine(_agentDir, "notes.txt"), "not an agent");
await File.WriteAllTextAsync(Path.Combine(_agentDir, "agent.md"), "---\nname: Real\ndescription: Yes\n---\nBody");
var agents = await _service.ScanAsync();
Assert.Single(agents);
Assert.Equal("Real", agents[0].Name);
}
public void Dispose()
{
try { Directory.Delete(_agentDir, true); } catch { }
}
}