???? ???? ?? ????????? ????? ?? ????? PPT ?? ???? ??

??:
- ?? ?? ???? ?? ?? ??, ?? ? ?? ?? ??, ?????? ???? ??? ? ?? ?????.
- ?? ?? ??? ??? ?? PPT? ?? ??? ?? ???? ?? ????? ????.

?? ????:
- AgentCommandQueue? steering, permission continuation, resume, user decision ? ??? ???? AgentLoopService?? ?? ???? ????? ??
- CodeLanguageCatalog? LspClientService? ??? Go, Rust, PHP, Ruby, Kotlin, Swift? ?? LSP ?? ???? ??
- SettingsWindow? SettingsViewModel?? ?? ? ?? ??? ?? ?? / LSP / ?? ???? ????? ??
- WorkspaceContextGenerator? Language Snapshot, Agent Context, Key Manifests ??? ???? .claude/skills, .ax/rules, AXMEMORY.md ??? ??
- DeckRepairGuideService? ???? PptxSkill ??? Deck repair guide? ?? ??
- ?? ?? ???? ?? ???? ?? ? ??

??:
- dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_master_batch\\ -p:IntermediateOutputPath=obj\\verify_master_batch\\
- dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter AgentCommandQueueTests,CodeLanguageCatalogTests,WorkspaceContextGeneratorTests,PptxSkillConsultingDeckTests,DeckRepairGuideServiceTests -p:OutputPath=bin\\verify_master_batch_tests\\ -p:IntermediateOutputPath=obj\\verify_master_batch_tests\\
This commit is contained in:
2026-04-15 00:21:15 +09:00
parent 59ec4a1371
commit f33ee7f7db
16 changed files with 422 additions and 14 deletions

View File

@@ -31,4 +31,25 @@ public class AgentCommandQueueTests
queue.DrainAll().Should().BeEmpty();
}
[Fact]
public void DrainAll_ShouldIncludeSteeringPermissionAndResumeKinds()
{
var queue = new AgentCommandQueue();
queue.EnqueueNotification("later-note");
queue.EnqueueResume("resume");
queue.EnqueuePermissionContinuation("continue-tool");
queue.EnqueueSteering("steer-now");
var drained = queue.DrainAll();
drained.Select(x => x.Kind).Should().Equal(
AgentCommandKind.Resume,
AgentCommandKind.PermissionContinuation,
AgentCommandKind.Steering,
AgentCommandKind.Notification);
drained[0].RequestInterrupt.Should().BeFalse();
drained[1].RequestInterrupt.Should().BeTrue();
drained[2].RequestInterrupt.Should().BeTrue();
}
}

View File

@@ -10,7 +10,9 @@ public class CodeLanguageCatalogTests
[InlineData(".cs", "csharp")]
[InlineData(".py", "python")]
[InlineData(".java", "java")]
[InlineData(".go", null)]
[InlineData(".go", "go")]
[InlineData(".rs", "rust")]
[InlineData(".php", "php")]
[InlineData(".unknown", null)]
public void DetectLspLanguageId_ShouldMatchCatalog(string extension, string? expected)
{
@@ -33,6 +35,15 @@ public class CodeLanguageCatalogTests
CodeLanguageCatalog.BuildStaticSupportDescription().Should().Contain("Go");
CodeLanguageCatalog.BuildStaticSupportDescription().Should().Contain("Rust");
CodeLanguageCatalog.BuildLspSupportDescription().Should().Contain("C# (.NET)");
CodeLanguageCatalog.BuildLspSupportDescription().Should().NotContain("Go");
CodeLanguageCatalog.BuildLspSupportDescription().Should().Contain("Go");
CodeLanguageCatalog.BuildLspSupportDescription().Should().Contain("Swift");
}
[Fact]
public void QuickSelectDescription_ShouldRemainFocusedOnUiShortlist()
{
CodeLanguageCatalog.BuildQuickSelectSupportDescription().Should().Contain("C# (.NET)");
CodeLanguageCatalog.BuildQuickSelectSupportDescription().Should().Contain("JavaScript / Vue");
CodeLanguageCatalog.BuildQuickSelectSupportDescription().Should().NotContain("Go");
}
}

View File

@@ -0,0 +1,38 @@
using AxCopilot.Services.Agent;
using FluentAssertions;
using Xunit;
namespace AxCopilot.Tests.Services;
public class DeckRepairGuideServiceTests
{
[Fact]
public void BuildGuide_ShouldReturnNone_WhenNoIssues()
{
var report = new DeckQualityReport(92, ["Includes Recommendation"], [], []);
var guide = DeckRepairGuideService.BuildGuide(report);
guide.Should().Be("Deck repair guide: none");
}
[Fact]
public void BuildGuide_ShouldTranslateDeckIssuesIntoActionableGuidance()
{
var report = new DeckQualityReport(
61,
[],
[
new DeckReviewIssue("Executive Summary slide is missing.", DeckReviewSeverity.Critical),
new DeckReviewIssue("Slide 3: content density is high and should be simplified.", DeckReviewSeverity.Warning),
new DeckReviewIssue("Evidence slides such as charts, tables, or comparisons are limited.", DeckReviewSeverity.Warning),
],
[]);
var guide = DeckRepairGuideService.BuildGuide(report);
guide.Should().Contain("Executive Summary");
guide.Should().Contain("Reduce text density");
guide.Should().Contain("evidence");
}
}

View File

@@ -102,6 +102,7 @@ public class PptxSkillConsultingDeckTests
result.Success.Should().BeTrue();
File.Exists(Path.Combine(workDir, "consulting-deck.pptx")).Should().BeTrue();
result.Output.Should().Contain("PPTX");
result.Output.Should().Contain("Deck repair guide:");
}
finally
{

View File

@@ -182,6 +182,30 @@ public class WorkspaceContextGeneratorTests
var result = await WorkspaceContextGenerator.GenerateAsync(tempDir);
result.Should().Contain("Node.js");
result.Should().Contain("## Key Manifests");
result.Should().Contain("Node package");
}
finally
{
Directory.Delete(tempDir, recursive: true);
}
}
[Fact]
public async Task GenerateAsync_IncludesLanguageSnapshot()
{
var tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N"));
Directory.CreateDirectory(tempDir);
try
{
File.WriteAllText(Path.Combine(tempDir, "main.go"), "package main");
File.WriteAllText(Path.Combine(tempDir, "worker.go"), "package main");
File.WriteAllText(Path.Combine(tempDir, "helper.py"), "print('hi')");
var result = await WorkspaceContextGenerator.GenerateAsync(tempDir);
result.Should().Contain("## Language Snapshot");
result.Should().Contain("Go:");
}
finally
{
@@ -217,10 +241,15 @@ public class WorkspaceContextGeneratorTests
try
{
File.WriteAllText(Path.Combine(tempDir, "AGENTS.md"), "Agent rules here");
var skillsDir = Path.Combine(tempDir, ".claude", "skills", "deck");
Directory.CreateDirectory(skillsDir);
File.WriteAllText(Path.Combine(skillsDir, "SKILL.md"), "# skill");
var result = await WorkspaceContextGenerator.GenerateAsync(tempDir);
result.Should().Contain("## Existing Context Files");
result.Should().Contain("AGENTS.md");
result.Should().Contain("## Agent Context");
result.Should().Contain(".claude/skills");
}
finally
{