???? ???? ?? ????????? ????? ?? ????? 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

@@ -84,6 +84,15 @@ internal static class WorkspaceContextGenerator
sb.AppendLine();
}
var languageSnapshot = BuildLanguageSnapshot(extDist);
if (languageSnapshot.Count > 0)
{
sb.AppendLine("## Language Snapshot");
foreach (var line in languageSnapshot)
sb.AppendLine($"- {line}");
sb.AppendLine();
}
// 4. 기존 컨텍스트 파일 감지
var contextFiles = DetectContextFiles(workFolder);
if (contextFiles.Count > 0)
@@ -95,6 +104,24 @@ internal static class WorkspaceContextGenerator
}
// 5. README 요약
var agentContextSummary = DetectAgentContextSummary(workFolder);
if (agentContextSummary.Count > 0)
{
sb.AppendLine("## Agent Context");
foreach (var line in agentContextSummary)
sb.AppendLine($"- {line}");
sb.AppendLine();
}
var keyManifests = DetectKeyManifests(workFolder);
if (keyManifests.Count > 0)
{
sb.AppendLine("## Key Manifests");
foreach (var line in keyManifests)
sb.AppendLine($"- {line}");
sb.AppendLine();
}
var readmeSummary = ExtractReadmeSummary(workFolder);
if (readmeSummary != null)
{
@@ -328,6 +355,91 @@ internal static class WorkspaceContextGenerator
return files;
}
private static List<string> DetectAgentContextSummary(string folder)
{
var lines = new List<string>();
try
{
var claudeSkillsDir = Path.Combine(folder, ".claude", "skills");
if (Directory.Exists(claudeSkillsDir))
{
var skillFiles = Directory.GetFiles(claudeSkillsDir, "SKILL.md", SearchOption.AllDirectories);
if (skillFiles.Length > 0)
lines.Add($".claude/skills 호환 스킬 {skillFiles.Length}개 감지");
}
}
catch { }
try
{
var axRulesDir = Path.Combine(folder, ".ax", "rules");
if (Directory.Exists(axRulesDir))
{
var ruleFiles = Directory.GetFiles(axRulesDir, "*.md", SearchOption.TopDirectoryOnly);
if (ruleFiles.Length > 0)
lines.Add($".ax/rules 규칙 {ruleFiles.Length}개 감지");
}
}
catch { }
try
{
var memoryFile = Path.Combine(folder, "AXMEMORY.md");
if (File.Exists(memoryFile))
lines.Add("AXMEMORY.md 메모리 파일 감지");
}
catch { }
return lines;
}
private static List<string> DetectKeyManifests(string folder)
{
var manifests = new List<string>();
var patterns = new (string Pattern, string Label)[]
{
("*.sln", "Solution"),
("*.csproj", ".NET project"),
("package.json", "Node package"),
("pyproject.toml", "Python project"),
("requirements.txt", "Python requirements"),
("Cargo.toml", "Rust package"),
("go.mod", "Go module"),
("pom.xml", "Maven project"),
("build.gradle", "Gradle build"),
};
foreach (var (pattern, label) in patterns)
{
try
{
var matches = Directory.GetFiles(folder, pattern, SearchOption.TopDirectoryOnly)
.Select(Path.GetFileName)
.Where(name => !string.IsNullOrWhiteSpace(name))
.Cast<string>()
.Take(3)
.ToList();
if (matches.Count > 0)
manifests.Add($"{label}: {string.Join(", ", matches)}");
}
catch { }
}
return manifests;
}
private static List<string> BuildLanguageSnapshot(List<KeyValuePair<string, int>> extDist)
=> extDist
.Where(kv => kv.Value > 0)
.Select(kv => new { Language = GetLanguageName(kv.Key), kv.Value })
.GroupBy(x => x.Language, StringComparer.OrdinalIgnoreCase)
.Select(group => new { Language = group.Key, Count = group.Sum(item => item.Value) })
.OrderByDescending(x => x.Count)
.Take(6)
.Select(x => $"{x.Language}: {x.Count} file(s)")
.ToList();
private static async Task<(string? Branch, string? Remote)> GetGitInfoAsync(
string folder, CancellationToken ct)
{