SQL 정적 분석과 PPT·HTML 품질 기준을 강화하고 언어 fallback을 고도화한다

- SQL 전용 정적 분석 계층을 추가해 PostgreSQL/MySQL/SQL Server/SQLite/Oracle 방언 추정, statement kind 분류, object 추출, destructive DDL·broad DML·transaction boundary 위험 감지를 지원한다

- CodeLanguageCatalog의 SQL manifest/build/test/lint 힌트와 fallback summary를 SQL 분석 결과 중심으로 보강해 no-LSP 환경에서도 dialect·risk·next checks를 직접 안내한다

- DeckPlanningService가 구조화된 content 슬라이드를 kpi_dashboard/comparison/roadmap/chart로 자동 승격하고 DeckQualityReviewService·DeckRepairGuideService가 KPI 근거, verdict, owner/timeline, takeaway 부족을 별도 진단·보정한다

- HtmlSkill에 kpi_panel 섹션을 추가하고 ArtifactQualityReviewService·ArtifactRepairGuideService가 board/strategy 문서의 KPI·evidence·decision 연결 부족을 더 정확히 감지하도록 확장한다

- README.md, docs/DEVELOPMENT.md, docs/NEXT_ROADMAP.md에 2026-04-15 11:17 (KST) 기준 작업 이력과 검증 결과를 반영했다

검증 결과

- dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify_sql_doc_batch\ -p:IntermediateOutputPath=obj\verify_sql_doc_batch\ : 경고 0 / 오류 0

- dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter SqlDialectDetectorTests|SqlAnalysisServiceTests|CodeLanguageCatalogTests|DeckPlanningServiceTests|DeckQualityReviewServiceTests|ArtifactQualityReviewServiceTests|ArtifactRepairGuideServiceTests|HtmlSkillConsultingSectionsTests|HtmlSkillGoldenReportTests|PptxSkillGoldenDeckTests -p:OutputPath=bin\verify_sql_doc_batch_tests\ -p:IntermediateOutputPath=obj\verify_sql_doc_batch_tests\ : 통과 47
This commit is contained in:
2026-04-15 11:19:55 +09:00
parent f283662d30
commit 93c3c647d9
19 changed files with 605 additions and 5 deletions

View File

@@ -39,6 +39,7 @@ public static class CodeLanguageCatalog
["ruby"] = ["Gemfile", "Gemfile.lock", "*.gemspec"],
["kotlin"] = ["build.gradle.kts", "settings.gradle.kts", "gradle.properties"],
["swift"] = ["Package.swift", "*.xcodeproj", "*.xcworkspace"],
["sql"] = ["migrations/*.sql", "schema.sql", "seed.sql", "*.sqlproj"],
};
private static readonly IReadOnlyDictionary<string, string[]> s_buildHints =
@@ -56,6 +57,7 @@ public static class CodeLanguageCatalog
["ruby"] = ["bundle exec rake", "ruby -c"],
["kotlin"] = ["gradle build", "./gradlew build"],
["swift"] = ["swift build", "xcodebuild build"],
["sql"] = ["apply in a disposable database first", "review migration order and dependency impact"],
};
private static readonly IReadOnlyDictionary<string, string[]> s_testHints =
@@ -73,6 +75,7 @@ public static class CodeLanguageCatalog
["ruby"] = ["bundle exec rspec", "bundle exec rake test"],
["kotlin"] = ["gradle test", "./gradlew test"],
["swift"] = ["swift test", "xcodebuild test"],
["sql"] = ["run the script against a disposable database", "verify affected row counts and dependent queries"],
};
private static readonly IReadOnlyDictionary<string, string[]> s_lintHints =
@@ -89,6 +92,7 @@ public static class CodeLanguageCatalog
["ruby"] = ["rubocop", "standardrb"],
["kotlin"] = ["./gradlew ktlintCheck", "./gradlew detekt"],
["swift"] = ["swiftformat --lint", "swiftlint"],
["sql"] = ["check destructive statements and transaction boundaries", "review index, constraint, and view impact"],
};
private static readonly ReadOnlyCollection<CodeLanguageCapability> s_all =
@@ -257,8 +261,8 @@ public static class CodeLanguageCatalog
"SQL",
[".sql"],
[
"Preserve migration ordering, transactional safety, and index/constraint compatibility.",
"Call out destructive or data-migrating changes explicitly."
"Preserve migration ordering, dialect assumptions, and transaction boundaries.",
"Call out destructive DDL, broad DML, and index or constraint impact explicitly."
]),
new(
"web",
@@ -351,7 +355,7 @@ public static class CodeLanguageCatalog
}
foreach (var capability in s_all.Where(x =>
x.Key is "csharp" or "python" or "java" or "cpp" or "typescript" or "javascript" or "go" or "rust" or "kotlin" or "swift"))
x.Key is "csharp" or "python" or "java" or "cpp" or "typescript" or "javascript" or "go" or "rust" or "kotlin" or "swift" or "sql"))
{
var summary = capability.Guidance.FirstOrDefault();
if (!string.IsNullOrWhiteSpace(summary))
@@ -437,6 +441,8 @@ public static class CodeLanguageCatalog
var primaryGuidance = capability.Guidance.FirstOrDefault();
if (!string.IsNullOrWhiteSpace(primaryGuidance))
parts.Add("focus: " + primaryGuidance);
if (string.Equals(capability.Key, "sql", StringComparison.OrdinalIgnoreCase))
parts.Add("analysis: detect dialect, statement kinds, destructive risk, and object dependencies");
if (parts.Count == 0)
return capability.DisplayName;
@@ -481,6 +487,8 @@ public static class CodeLanguageCatalog
public static string BuildFallbackSummary(string? filePathOrExtension)
{
var capability = ResolveCapabilityFromKeyOrExtension(filePathOrExtension);
if (capability != null && string.Equals(capability.Key, "sql", StringComparison.OrdinalIgnoreCase))
return SqlAnalysisService.BuildFallbackSummary(filePathOrExtension);
if (capability == null)
return "정적 fallback: 확장자와 프로젝트 매니페스트를 먼저 확인하고 관련 build/test/lint 힌트를 따라 수동 검증하세요.";