npx claudepluginhub issacchaos/local-marketplace --plugin test-engineeringThis skill uses the workspace's default tool permissions.
**Metadata**:
Generates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
Metadata:
applies_to:
language: C++
frameworks: [Catch2, LowLevelTests]
project_indicators: ["*.Build.cs", "TestHarness.h"]
capabilities:
- source_discovery
- coverage_analysis
- function_extraction
- dependency_analysis
Calculate module-level test coverage for Unreal Engine LowLevelTests.
Shared Reference: See llt-common/SKILL.md for response format, data structures, validation rules, and logging instructions.
Analyzes .Build.cs files to build a module dependency graph and calculates test coverage based on which runtime modules have test modules depending on them. A module is "covered" if at least one test module (directly or transitively) depends on it.
Additionally supports function-level coverage analysis by extracting C++ functions from source files and matching them against test file references.
To analyze coverage for a UE project:
--project-root, --output-format (json/table/summary), optional --module filterEngine/Source/Runtime and FortniteGame/Plugins for .Build.cs files--output-format# Calculate coverage with JSON output (default)
python -m llt_coverage --project-root /path/to/ue5 --output-format json
# Show detailed table with all modules
python -m llt_coverage --project-root /path/to/ue5 --output-format table
# Show brief summary
python -m llt_coverage --project-root /path/to/ue5 --output-format summary
# Filter to specific module
python -m llt_coverage --project-root /path/to/ue5 --module Core --output-format table
| Argument | Required | Description |
|---|---|---|
--project-root PATH | Yes | Path to UE project root containing Engine/ and FortniteGame/ |
--output-format {json|table|summary} | No | Output format (default: json) |
--module NAME | No | Filter results to a specific module name |
Returns standard LLT JSON envelope (see llt-common/SKILL.md). The data field contains:
{
"data": {
"build_cs_files_found": 450,
"modules_parsed": 442,
"coverage": [
{
"module_name": "Core",
"covered": true,
"test_modules": ["CoreTests", "FoundationTests"]
},
{
"module_name": "UntestedModule",
"covered": false,
"test_modules": []
}
],
"statistics": {
"total_modules": 300,
"covered_modules": 275,
"uncovered_modules": 25,
"coverage_percentage": 91.67,
"uncovered_module_names": ["UntestedModule1", "UntestedModule2"]
}
}
}
.Build.cs files in Engine/Source/Runtime and FortniteGame/PluginsPublicDependencyModuleNames and PrivateDependencyModuleNamesExcluded from coverage calculations: Catch2, OnlineTestsCore, LowLevelTestsRunner
When performing function-level coverage analysis, extract functions and methods from C++ source files using either Clang AST parsing (preferred) or regex-based fallback.
For each extracted function, capture:
OpenInventory)FSaveFramework::OpenInventory)void, bool)Use libclang Python bindings (clang.cindex) when available:
clang.cindex.Index and parse the source file as a translation unit.compile_commands.json exists (search upward from module root), use it for accurate include resolution. Otherwise parse with -x c++ -std=c++17 -I. and PARSE_SKIP_FUNCTION_BODIES.CLASS_DECL and STRUCT_DECL nodes: record the class name and recurse into children with that class context.FUNCTION_DECL, CXX_METHOD, CONSTRUCTOR, DESTRUCTOR nodes: extract the function signature.spelling (name), result_type.spelling (return type), access_specifier (public/private), is_static_method(), is_const_method(), and cursor kind (constructor/destructor).qualified_name as ClassName::FunctionName when inside a class context.When Clang is unavailable, use line-by-line regex parsing:
(?:class|struct)\s+(\w+)\s*(?::\s*public\s+\w+\s*)?{ to detect class declarations.{ and }. When depth returns to 0, exit class context.// (comments) or # (preprocessor directives).(\w+(?:\s*\*|\s*&)?)\s+(?:(\w+)::)?(\w+)\s*\([^)]*\)\s*(const)?\s*(?:override)?\s*{
ClassName::Method out-of-class definitions)~).public: tracking for accuracy (regex approach cannot reliably detect this).To extract functions from an entire module:
.cpp files under the module directory.compile_commands.json by searching upward from the module root.After extraction, filter to testable functions:
Get*, Is*, Has*, Can*) for completeness, but note they may inflate counts.Analyze test files to determine which runtime functions are being tested, then match references back to extracted function signatures.
For each test file (.cpp and *Test*.h files under the test module):
//).(\w+)::(\w+)\s*\( -- captures qualified method calls->(\w+)\s*\( -- captures pointer-to-member calls\.(\w+)\s*\( -- captures object member calls(?:CHECK|REQUIRE|REQUIRE_FALSE|CHECK_FALSE)\s*\(\s*(\w+(?:::\w+)*)\s*\( -- captures function calls inside Catch2 assertionsEXPECT_CALL\s*\([^,]+,\s*(\w+)\s*\) -- captures mocked method names::, store the full Class::Method form (up to the opening parenthesis)._.Compare test file references against the extracted runtime function signatures:
qualified_name exactly (e.g., FSaveFramework::OpenInventory).name only. This is less reliable because multiple classes may have methods with the same name.covered_count / total_count * 100.Produce a report containing:
_free_functions_ key.Build and analyze a directed module dependency graph from parsed .Build.cs data to map runtime modules to their test modules.
The dependency graph consists of:
module_name -> set of modules it depends onmodule_name -> set of modules that depend on itFrom a list of parsed .Build.cs module data:
Catch2, OnlineTestsCore, LowLevelTestsRunner) from both sets.PublicDependencyModuleNames and PrivateDependencyModuleNames into a single dependency set.module -> dependencydependency -> moduleUse iterative DFS with memoization:
For each test module in the graph:
For each runtime module (optionally filtered to a subset):
{module_name, covered, test_modules}.From the list of coverage records, compute:
covered == truetotal - coveredcovered / total * 100, rounded to 2 decimal places| Error | Behavior |
|---|---|
| Invalid project root | Returns error |
| No .Build.cs files found | Returns error |
| Parse failures | Continues processing; includes warnings |
| Module not found (with --module) | Returns error |
| Clang unavailable | Falls back to regex-based extraction with a warning |
| File read failures | Skips file with warning, continues processing |
When analyzing module dependencies for coverage, read .Build.cs files directly and extract dependency information.
Use Glob to find all .Build.cs files under the project root:
Glob("**/*.Build.cs")
The module name is derived from the filename:
Core.Build.cs -> module name: CoreOnlineServicesMcp.Build.cs -> module name: OnlineServicesMcpStrip the .Build.cs suffix from the filename.
Look for two dependency arrays in each file:
1. PublicDependencyModuleNames - modules visible to dependents 2. PrivateDependencyModuleNames - modules used only internally
Each appears in one of these C# patterns:
AddRange format (most common):
PublicDependencyModuleNames.AddRange(new string[] {
"Core",
"CoreUObject",
"Engine"
});
Assignment format (less common):
PublicDependencyModuleNames = new List<string> {
"Core",
"CoreUObject"
};
Extraction method: Read the file content, find the {...} block after each dependency type, and extract all quoted strings within it. Ignore:
// comment/* comment */A module is a test module if either:
TestModuleRules (look for : TestModuleRules in the file).Build.cs file is located under a Tests/ directoryThese modules are test infrastructure, not production code. Exclude them from coverage analysis:
Catch2OnlineTestsCoreLowLevelTestsRunnerFor each parsed .Build.cs file, produce:
{
"module_name": "OnlineServicesMcp",
"public_dependencies": ["Core", "CoreUObject", "Engine"],
"private_dependencies": ["HTTP", "Json"],
"is_test_module": false,
"build_cs_path": "Source/OnlineServicesMcp/OnlineServicesMcp.Build.cs"
}
For large projects (1600+ .Build.cs files):
Glob("**/*.Build.cs") to get all pathsGrep(": TestModuleRules") across all files