[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DAE5F264BE3BQAGHWMGA24":3,"skill-same:01M6DAE5F264BE3BQAGHWMGA24":63},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":37,"linkOnly":38,"markdownContent":39,"markdownBody":40,"frontMatter":41,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":14,"repositoryHtmlUrl":46,"repositoryHomepageUrl":6,"ownerHtmlUrl":47,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":48,"install":49,"resources":62},"01M6DAE5F264BE3BQAGHWMGA24","cpp-testing",null,"Use only when writing\u002Fupdating\u002Ffixing C++ tests, configuring GoogleTest\u002FCTest, diagnosing failing or flaky tests, or adding coverage\u002Fsanitizers.","Prekzursil\u002Fagent-skills-toolchain","Prekzursil","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F54636077?v=4","01M6DACZ1PCQHD99SCR1YXG28B","Andrei Mihai Visalon","01M6DACZ670WZF535V3WYYSS4Z",0,"MIT","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Flibrary\u002Fskills\u002Fcpp-testing\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[27,28,29,30,31,32,33,34,35,36],"testing","cpp","cpp testing","writing","ctest","coverage","use","only","c++","tests","2026-11-10 10:12:30",false,"---\nname: cpp-testing\ndescription: Use only when writing\u002Fupdating\u002Ffixing C++ tests, configuring GoogleTest\u002FCTest, diagnosing failing or flaky tests, or adding coverage\u002Fsanitizers.\norigin: ECC\n---\n\n# C++ Testing (Agent Skill)\n\nAgent-focused testing workflow for modern C++ (C++17\u002F20) using GoogleTest\u002FGoogleMock with CMake\u002FCTest.\n\n## When to Use\n\n- Writing new C++ tests or fixing existing tests\n- Designing unit\u002Fintegration test coverage for C++ components\n- Adding test coverage, CI gating, or regression protection\n- Configuring CMake\u002FCTest workflows for consistent execution\n- Investigating test failures or flaky behavior\n- Enabling sanitizers for memory\u002Frace diagnostics\n\n### When NOT to Use\n\n- Implementing new product features without test changes\n- Large-scale refactors unrelated to test coverage or failures\n- Performance tuning without test regressions to validate\n- Non-C++ projects or non-test tasks\n\n## Core Concepts\n\n- **TDD loop**: red → green → refactor (tests first, minimal fix, then cleanups).\n- **Isolation**: prefer dependency injection and fakes over global state.\n- **Test layout**: `tests\u002Funit`, `tests\u002Fintegration`, `tests\u002Ftestdata`.\n- **Mocks vs fakes**: mock for interactions, fake for stateful behavior.\n- **CTest discovery**: use `gtest_discover_tests()` for stable test discovery.\n- **CI signal**: run subset first, then full suite with `--output-on-failure`.\n\n## TDD Workflow\n\nFollow the RED → GREEN → REFACTOR loop:\n\n1. **RED**: write a failing test that captures the new behavior\n2. **GREEN**: implement the smallest change to pass\n3. **REFACTOR**: clean up while tests stay green\n\n```cpp\n\u002F\u002F tests\u002Fadd_test.cpp\n#include \u003Cgtest\u002Fgtest.h>\n\nint Add(int a, int b); \u002F\u002F Provided by production code.\n\nTEST(AddTest, AddsTwoNumbers) { \u002F\u002F RED\n  EXPECT_EQ(Add(2, 3), 5);\n}\n\n\u002F\u002F src\u002Fadd.cpp\nint Add(int a, int b) { \u002F\u002F GREEN\n  return a + b;\n}\n\n\u002F\u002F REFACTOR: simplify\u002Frename once tests pass\n```\n\n## Code Examples\n\n### Basic Unit Test (gtest)\n\n```cpp\n\u002F\u002F tests\u002Fcalculator_test.cpp\n#include \u003Cgtest\u002Fgtest.h>\n\nint Add(int a, int b); \u002F\u002F Provided by production code.\n\nTEST(CalculatorTest, AddsTwoNumbers) {\n    EXPECT_EQ(Add(2, 3), 5);\n}\n```\n\n### Fixture (gtest)\n\n```cpp\n\u002F\u002F tests\u002Fuser_store_test.cpp\n\u002F\u002F Pseudocode stub: replace UserStore\u002FUser with project types.\n#include \u003Cgtest\u002Fgtest.h>\n#include \u003Cmemory>\n#include \u003Coptional>\n#include \u003Cstring>\n\nstruct User { std::string name; };\nclass UserStore {\npublic:\n    explicit UserStore(std::string \u002F*path*\u002F) {}\n    void Seed(std::initializer_list\u003CUser> \u002F*users*\u002F) {}\n    std::optional\u003CUser> Find(const std::string &\u002F*name*\u002F) { return User{\"alice\"}; }\n};\n\nclass UserStoreTest : public ::testing::Test {\nprotected:\n    void SetUp() override {\n        store = std::make_unique\u003CUserStore>(\":memory:\");\n        store->Seed({{\"alice\"}, {\"bob\"}});\n    }\n\n    std::unique_ptr\u003CUserStore> store;\n};\n\nTEST_F(UserStoreTest, FindsExistingUser) {\n    auto user = store->Find(\"alice\");\n    ASSERT_TRUE(user.has_value());\n    EXPECT_EQ(user->name, \"alice\");\n}\n```\n\n### Mock (gmock)\n\n```cpp\n\u002F\u002F tests\u002Fnotifier_test.cpp\n#include \u003Cgmock\u002Fgmock.h>\n#include \u003Cgtest\u002Fgtest.h>\n#include \u003Cstring>\n\nclass Notifier {\npublic:\n    virtual ~Notifier() = default;\n    virtual void Send(const std::string &message) = 0;\n};\n\nclass MockNotifier : public Notifier {\npublic:\n    MOCK_METHOD(void, Send, (const std::string &message), (override));\n};\n\nclass Service {\npublic:\n    explicit Service(Notifier &notifier) : notifier_(notifier) {}\n    void Publish(const std::string &message) { notifier_.Send(message); }\n\nprivate:\n    Notifier &notifier_;\n};\n\nTEST(ServiceTest, SendsNotifications) {\n    MockNotifier notifier;\n    Service service(notifier);\n\n    EXPECT_CALL(notifier, Send(\"hello\")).Times(1);\n    service.Publish(\"hello\");\n}\n```\n\n### CMake\u002FCTest Quickstart\n\n```cmake\n# CMakeLists.txt (excerpt)\ncmake_minimum_required(VERSION 3.20)\nproject(example LANGUAGES CXX)\n\nset(CMAKE_CXX_STANDARD 20)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n\ninclude(FetchContent)\n# Prefer project-locked versions. If using a tag, use a pinned version per project policy.\nset(GTEST_VERSION v1.17.0) # Adjust to project policy.\nFetchContent_Declare(\n  googletest\n  # Google Test framework (official repository)\n  URL https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fgoogletest\u002Farchive\u002Frefs\u002Ftags\u002F${GTEST_VERSION}.zip\n)\nFetchContent_MakeAvailable(googletest)\n\nadd_executable(example_tests\n  tests\u002Fcalculator_test.cpp\n  src\u002Fcalculator.cpp\n)\ntarget_link_libraries(example_tests GTest::gtest GTest::gmock GTest::gtest_main)\n\nenable_testing()\ninclude(GoogleTest)\ngtest_discover_tests(example_tests)\n```\n\n```bash\ncmake -S . -B build -DCMAKE_BUILD_TYPE=Debug\ncmake --build build -j\nctest --test-dir build --output-on-failure\n```\n\n## Running Tests\n\n```bash\nctest --test-dir build --output-on-failure\nctest --test-dir build -R ClampTest\nctest --test-dir build -R \"UserStoreTest.*\" --output-on-failure\n```\n\n```bash\n.\u002Fbuild\u002Fexample_tests --gtest_filter=ClampTest.*\n.\u002Fbuild\u002Fexample_tests --gtest_filter=UserStoreTest.FindsExistingUser\n```\n\n## Debugging Failures\n\n1. Re-run the single failing test with gtest filter.\n2. Add scoped logging around the failing assertion.\n3. Re-run with sanitizers enabled.\n4. Expand to full suite once the root cause is fixed.\n\n## Coverage\n\nPrefer target-level settings instead of global flags.\n\n```cmake\noption(ENABLE_COVERAGE \"Enable coverage flags\" OFF)\n\nif(ENABLE_COVERAGE)\n  if(CMAKE_CXX_COMPILER_ID MATCHES \"GNU\")\n    target_compile_options(example_tests PRIVATE --coverage)\n    target_link_options(example_tests PRIVATE --coverage)\n  elseif(CMAKE_CXX_COMPILER_ID MATCHES \"Clang\")\n    target_compile_options(example_tests PRIVATE -fprofile-instr-generate -fcoverage-mapping)\n    target_link_options(example_tests PRIVATE -fprofile-instr-generate)\n  endif()\nendif()\n```\n\nGCC + gcov + lcov:\n\n```bash\ncmake -S . -B build-cov -DENABLE_COVERAGE=ON\ncmake --build build-cov -j\nctest --test-dir build-cov\nlcov --capture --directory build-cov --output-file coverage.info\nlcov --remove coverage.info '\u002Fusr\u002F*' --output-file coverage.info\ngenhtml coverage.info --output-directory coverage\n```\n\nClang + llvm-cov:\n\n```bash\ncmake -S . -B build-llvm -DENABLE_COVERAGE=ON -DCMAKE_CXX_COMPILER=clang++\ncmake --build build-llvm -j\nLLVM_PROFILE_FILE=\"build-llvm\u002Fdefault.profraw\" ctest --test-dir build-llvm\nllvm-profdata merge -sparse build-llvm\u002Fdefault.profraw -o build-llvm\u002Fdefault.profdata\nllvm-cov report build-llvm\u002Fexample_tests -instr-profile=build-llvm\u002Fdefault.profdata\n```\n\n## Sanitizers\n\n```cmake\noption(ENABLE_ASAN \"Enable AddressSanitizer\" OFF)\noption(ENABLE_UBSAN \"Enable UndefinedBehaviorSanitizer\" OFF)\noption(ENABLE_TSAN \"Enable ThreadSanitizer\" OFF)\n\nif(ENABLE_ASAN)\n  add_compile_options(-fsanitize=address -fno-omit-frame-pointer)\n  add_link_options(-fsanitize=address)\nendif()\nif(ENABLE_UBSAN)\n  add_compile_options(-fsanitize=undefined -fno-omit-frame-pointer)\n  add_link_options(-fsanitize=undefined)\nendif()\nif(ENABLE_TSAN)\n  add_compile_options(-fsanitize=thread)\n  add_link_options(-fsanitize=thread)\nendif()\n```\n\n## Flaky Tests Guardrails\n\n- Never use `sleep` for synchronization; use condition variables or latches.\n- Make temp directories unique per test and always clean them.\n- Avoid real time, network, or filesystem dependencies in unit tests.\n- Use deterministic seeds for randomized inputs.\n\n## Best Practices\n\n### DO\n\n- Keep tests deterministic and isolated\n- Prefer dependency injection over globals\n- Use `ASSERT_*` for preconditions, `EXPECT_*` for multiple checks\n- Separate unit vs integration tests in CTest labels or directories\n- Run sanitizers in CI for memory and race detection\n\n### DON'T\n\n- Don't depend on real time or network in unit tests\n- Don't use sleeps as synchronization when a condition variable can be used\n- Don't over-mock simple value objects\n- Don't use brittle string matching for non-critical logs\n\n### Common Pitfalls\n\n- **Using fixed temp paths** → Generate unique temp directories per test and clean them.\n- **Relying on wall clock time** → Inject a clock or use fake time sources.\n- **Flaky concurrency tests** → Use condition variables\u002Flatches and bounded waits.\n- **Hidden global state** → Reset global state in fixtures or remove globals.\n- **Over-mocking** → Prefer fakes for stateful behavior and only mock interactions.\n- **Missing sanitizer runs** → Add ASan\u002FUBSan\u002FTSan builds in CI.\n- **Coverage on debug-only builds** → Ensure coverage targets use consistent flags.\n\n## Optional Appendix: Fuzzing \u002F Property Testing\n\nOnly use if the project already supports LLVM\u002FlibFuzzer or a property-testing library.\n\n- **libFuzzer**: best for pure functions with minimal I\u002FO.\n- **RapidCheck**: property-based tests to validate invariants.\n\nMinimal libFuzzer harness (pseudocode: replace ParseConfig):\n\n```cpp\n#include \u003Ccstddef>\n#include \u003Ccstdint>\n#include \u003Cstring>\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {\n    std::string input(reinterpret_cast\u003Cconst char *>(data), size);\n    \u002F\u002F ParseConfig(input); \u002F\u002F project function\n    return 0;\n}\n```\n\n## Alternatives to GoogleTest\n\n- **Catch2**: header-only, expressive matchers\n- **doctest**: lightweight, minimal compile overhead\n","# C++ Testing (Agent Skill)\n\nAgent-focused testing workflow for modern C++ (C++17\u002F20) using GoogleTest\u002FGoogleMock with CMake\u002FCTest.\n\n## When to Use\n\n- Writing new C++ tests or fixing existing tests\n- Designing unit\u002Fintegration test coverage for C++ components\n- Adding test coverage, CI gating, or regression protection\n- Configuring CMake\u002FCTest workflows for consistent execution\n- Investigating test failures or flaky behavior\n- Enabling sanitizers for memory\u002Frace diagnostics\n\n### When NOT to Use\n\n- Implementing new product features without test changes\n- Large-scale refactors unrelated to test coverage or failures\n- Performance tuning without test regressions to validate\n- Non-C++ projects or non-test tasks\n\n## Core Concepts\n\n- **TDD loop**: red → green → refactor (tests first, minimal fix, then cleanups).\n- **Isolation**: prefer dependency injection and fakes over global state.\n- **Test layout**: `tests\u002Funit`, `tests\u002Fintegration`, `tests\u002Ftestdata`.\n- **Mocks vs fakes**: mock for interactions, fake for stateful behavior.\n- **CTest discovery**: use `gtest_discover_tests()` for stable test discovery.\n- **CI signal**: run subset first, then full suite with `--output-on-failure`.\n\n## TDD Workflow\n\nFollow the RED → GREEN → REFACTOR loop:\n\n1. **RED**: write a failing test that captures the new behavior\n2. **GREEN**: implement the smallest change to pass\n3. **REFACTOR**: clean up while tests stay green\n\n```cpp\n\u002F\u002F tests\u002Fadd_test.cpp\n#include \u003Cgtest\u002Fgtest.h>\n\nint Add(int a, int b); \u002F\u002F Provided by production code.\n\nTEST(AddTest, AddsTwoNumbers) { \u002F\u002F RED\n  EXPECT_EQ(Add(2, 3), 5);\n}\n\n\u002F\u002F src\u002Fadd.cpp\nint Add(int a, int b) { \u002F\u002F GREEN\n  return a + b;\n}\n\n\u002F\u002F REFACTOR: simplify\u002Frename once tests pass\n```\n\n## Code Examples\n\n### Basic Unit Test (gtest)\n\n```cpp\n\u002F\u002F tests\u002Fcalculator_test.cpp\n#include \u003Cgtest\u002Fgtest.h>\n\nint Add(int a, int b); \u002F\u002F Provided by production code.\n\nTEST(CalculatorTest, AddsTwoNumbers) {\n    EXPECT_EQ(Add(2, 3), 5);\n}\n```\n\n### Fixture (gtest)\n\n```cpp\n\u002F\u002F tests\u002Fuser_store_test.cpp\n\u002F\u002F Pseudocode stub: replace UserStore\u002FUser with project types.\n#include \u003Cgtest\u002Fgtest.h>\n#include \u003Cmemory>\n#include \u003Coptional>\n#include \u003Cstring>\n\nstruct User { std::string name; };\nclass UserStore {\npublic:\n    explicit UserStore(std::string \u002F*path*\u002F) {}\n    void Seed(std::initializer_list\u003CUser> \u002F*users*\u002F) {}\n    std::optional\u003CUser> Find(const std::string &\u002F*name*\u002F) { return User{\"alice\"}; }\n};\n\nclass UserStoreTest : public ::testing::Test {\nprotected:\n    void SetUp() override {\n        store = std::make_unique\u003CUserStore>(\":memory:\");\n        store->Seed({{\"alice\"}, {\"bob\"}});\n    }\n\n    std::unique_ptr\u003CUserStore> store;\n};\n\nTEST_F(UserStoreTest, FindsExistingUser) {\n    auto user = store->Find(\"alice\");\n    ASSERT_TRUE(user.has_value());\n    EXPECT_EQ(user->name, \"alice\");\n}\n```\n\n### Mock (gmock)\n\n```cpp\n\u002F\u002F tests\u002Fnotifier_test.cpp\n#include \u003Cgmock\u002Fgmock.h>\n#include \u003Cgtest\u002Fgtest.h>\n#include \u003Cstring>\n\nclass Notifier {\npublic:\n    virtual ~Notifier() = default;\n    virtual void Send(const std::string &message) = 0;\n};\n\nclass MockNotifier : public Notifier {\npublic:\n    MOCK_METHOD(void, Send, (const std::string &message), (override));\n};\n\nclass Service {\npublic:\n    explicit Service(Notifier &notifier) : notifier_(notifier) {}\n    void Publish(const std::string &message) { notifier_.Send(message); }\n\nprivate:\n    Notifier &notifier_;\n};\n\nTEST(ServiceTest, SendsNotifications) {\n    MockNotifier notifier;\n    Service service(notifier);\n\n    EXPECT_CALL(notifier, Send(\"hello\")).Times(1);\n    service.Publish(\"hello\");\n}\n```\n\n### CMake\u002FCTest Quickstart\n\n```cmake\n# CMakeLists.txt (excerpt)\ncmake_minimum_required(VERSION 3.20)\nproject(example LANGUAGES CXX)\n\nset(CMAKE_CXX_STANDARD 20)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n\ninclude(FetchContent)\n# Prefer project-locked versions. If using a tag, use a pinned version per project policy.\nset(GTEST_VERSION v1.17.0) # Adjust to project policy.\nFetchContent_Declare(\n  googletest\n  # Google Test framework (official repository)\n  URL https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fgoogletest\u002Farchive\u002Frefs\u002Ftags\u002F${GTEST_VERSION}.zip\n)\nFetchContent_MakeAvailable(googletest)\n\nadd_executable(example_tests\n  tests\u002Fcalculator_test.cpp\n  src\u002Fcalculator.cpp\n)\ntarget_link_libraries(example_tests GTest::gtest GTest::gmock GTest::gtest_main)\n\nenable_testing()\ninclude(GoogleTest)\ngtest_discover_tests(example_tests)\n```\n\n```bash\ncmake -S . -B build -DCMAKE_BUILD_TYPE=Debug\ncmake --build build -j\nctest --test-dir build --output-on-failure\n```\n\n## Running Tests\n\n```bash\nctest --test-dir build --output-on-failure\nctest --test-dir build -R ClampTest\nctest --test-dir build -R \"UserStoreTest.*\" --output-on-failure\n```\n\n```bash\n.\u002Fbuild\u002Fexample_tests --gtest_filter=ClampTest.*\n.\u002Fbuild\u002Fexample_tests --gtest_filter=UserStoreTest.FindsExistingUser\n```\n\n## Debugging Failures\n\n1. Re-run the single failing test with gtest filter.\n2. Add scoped logging around the failing assertion.\n3. Re-run with sanitizers enabled.\n4. Expand to full suite once the root cause is fixed.\n\n## Coverage\n\nPrefer target-level settings instead of global flags.\n\n```cmake\noption(ENABLE_COVERAGE \"Enable coverage flags\" OFF)\n\nif(ENABLE_COVERAGE)\n  if(CMAKE_CXX_COMPILER_ID MATCHES \"GNU\")\n    target_compile_options(example_tests PRIVATE --coverage)\n    target_link_options(example_tests PRIVATE --coverage)\n  elseif(CMAKE_CXX_COMPILER_ID MATCHES \"Clang\")\n    target_compile_options(example_tests PRIVATE -fprofile-instr-generate -fcoverage-mapping)\n    target_link_options(example_tests PRIVATE -fprofile-instr-generate)\n  endif()\nendif()\n```\n\nGCC + gcov + lcov:\n\n```bash\ncmake -S . -B build-cov -DENABLE_COVERAGE=ON\ncmake --build build-cov -j\nctest --test-dir build-cov\nlcov --capture --directory build-cov --output-file coverage.info\nlcov --remove coverage.info '\u002Fusr\u002F*' --output-file coverage.info\ngenhtml coverage.info --output-directory coverage\n```\n\nClang + llvm-cov:\n\n```bash\ncmake -S . -B build-llvm -DENABLE_COVERAGE=ON -DCMAKE_CXX_COMPILER=clang++\ncmake --build build-llvm -j\nLLVM_PROFILE_FILE=\"build-llvm\u002Fdefault.profraw\" ctest --test-dir build-llvm\nllvm-profdata merge -sparse build-llvm\u002Fdefault.profraw -o build-llvm\u002Fdefault.profdata\nllvm-cov report build-llvm\u002Fexample_tests -instr-profile=build-llvm\u002Fdefault.profdata\n```\n\n## Sanitizers\n\n```cmake\noption(ENABLE_ASAN \"Enable AddressSanitizer\" OFF)\noption(ENABLE_UBSAN \"Enable UndefinedBehaviorSanitizer\" OFF)\noption(ENABLE_TSAN \"Enable ThreadSanitizer\" OFF)\n\nif(ENABLE_ASAN)\n  add_compile_options(-fsanitize=address -fno-omit-frame-pointer)\n  add_link_options(-fsanitize=address)\nendif()\nif(ENABLE_UBSAN)\n  add_compile_options(-fsanitize=undefined -fno-omit-frame-pointer)\n  add_link_options(-fsanitize=undefined)\nendif()\nif(ENABLE_TSAN)\n  add_compile_options(-fsanitize=thread)\n  add_link_options(-fsanitize=thread)\nendif()\n```\n\n## Flaky Tests Guardrails\n\n- Never use `sleep` for synchronization; use condition variables or latches.\n- Make temp directories unique per test and always clean them.\n- Avoid real time, network, or filesystem dependencies in unit tests.\n- Use deterministic seeds for randomized inputs.\n\n## Best Practices\n\n### DO\n\n- Keep tests deterministic and isolated\n- Prefer dependency injection over globals\n- Use `ASSERT_*` for preconditions, `EXPECT_*` for multiple checks\n- Separate unit vs integration tests in CTest labels or directories\n- Run sanitizers in CI for memory and race detection\n\n### DON'T\n\n- Don't depend on real time or network in unit tests\n- Don't use sleeps as synchronization when a condition variable can be used\n- Don't over-mock simple value objects\n- Don't use brittle string matching for non-critical logs\n\n### Common Pitfalls\n\n- **Using fixed temp paths** → Generate unique temp directories per test and clean them.\n- **Relying on wall clock time** → Inject a clock or use fake time sources.\n- **Flaky concurrency tests** → Use condition variables\u002Flatches and bounded waits.\n- **Hidden global state** → Reset global state in fixtures or remove globals.\n- **Over-mocking** → Prefer fakes for stateful behavior and only mock interactions.\n- **Missing sanitizer runs** → Add ASan\u002FUBSan\u002FTSan builds in CI.\n- **Coverage on debug-only builds** → Ensure coverage targets use consistent flags.\n\n## Optional Appendix: Fuzzing \u002F Property Testing\n\nOnly use if the project already supports LLVM\u002FlibFuzzer or a property-testing library.\n\n- **libFuzzer**: best for pure functions with minimal I\u002FO.\n- **RapidCheck**: property-based tests to validate invariants.\n\nMinimal libFuzzer harness (pseudocode: replace ParseConfig):\n\n```cpp\n#include \u003Ccstddef>\n#include \u003Ccstdint>\n#include \u003Cstring>\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {\n    std::string input(reinterpret_cast\u003Cconst char *>(data), size);\n    \u002F\u002F ParseConfig(input); \u002F\u002F project function\n    return 0;\n}\n```\n\n## Alternatives to GoogleTest\n\n- **Catch2**: header-only, expressive matchers\n- **doctest**: lightweight, minimal compile overhead\n",{"name":5,"origin":42,"description":7},"ECC","main","a298c929b6cbd662e1fce54302ce520d5ceea1a5",".agents\u002Flibrary\u002Fskills\u002Fcpp-testing","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain","https:\u002F\u002Fgithub.com\u002FPrekzursil","2026-11-02 14:30:57",{"source":8,"skillName":5,"commands":50,"prompt":60,"zipAvailable":61},[51,54,57],{"tool":52,"command":53},"npx","npx skills add Prekzursil\u002Fagent-skills-toolchain --skill cpp-testing",{"tool":55,"command":56},"bunx","bunx skills add Prekzursil\u002Fagent-skills-toolchain --skill cpp-testing",{"tool":58,"command":59},"pnpm","pnpm dlx skills add Prekzursil\u002Fagent-skills-toolchain --skill cpp-testing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Flibrary\u002Fskills\u002Fcpp-testing\u002FSKILL.md",true,[],[64,85,112,137,151,167],{"skillNo":65,"name":66,"nameZh":6,"description":67,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":68,"categories":69,"keywords":70,"publishedAt":37},"01M6DF7D7478R55P46REYH4QAC","clarify-requirements","Resolve genuine pre-execution ambiguity by scanning repo context, generating 1-6 grounded options, and asking 1-3 focused questions via AskUserQuestion. NOT for mid-task use (injection risk); NOT when the goal is already unambiguous; use to disambiguate vague prompts before any file edits.","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Fworkspace-hooks\u002Fskills\u002Fclarify-requirements\u002FSKILL.md",[],[71,72,73,74,75,76,77,78,79,33,80,81,82,83,84],"clarify requirements","clarify","requirements","risk","options","task","prompts","goal","scanning","context","repo","injection","execution","file",{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":92,"publishedAt":37},"01M6DF79CA4BHJS66J8EZDBPWJ","openmm-md","Run FREE, open-source, Windows-native GPU molecular dynamics via the openmm-md MCP (OpenMM + CUDA on the local NVIDIA GPU). Use for protein \u002F protein-ligand MD when you want a free stack or are on Windows without a Schrodinger license. Covers the full workflow (prepare, solvate, minimize, equilibrate, production, analyze, mmgbsa) AND an honest decision guide vs Schrodinger Desmond, including how to run Desmond legitimately on Linux or a cloud GPU with a real license. This is a deliberately LESSER free alternative and does NOT replace the schrodinger MCP tools. Do NOT use it to pick a free tool when a validated FEP+, WaterMap, IFD-MD, or Prime MM-GBSA result is actually required.","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Fmcp\u002Fopenmm-md-mcp\u002Fskill\u002Fopenmm-md\u002FSKILL.md",[91],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[93,94,95,96,97,98,99,100,101,102,103,104,105,106,33,107,108,109,110,111],"openmm md","how","decision","pick","linux","analyze","tool","stack","open","NVIDIA","gpu","license","workflow","windows","free","molecular dynamics","local","do","MCP",{"skillNo":113,"name":114,"nameZh":6,"description":115,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":122,"publishedAt":37},"01M6DF76C1MG85VEWP8VZCBNMN","visual-review","Take screenshots of web pages and UI using Playwright for visual review and iteration","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fvisual-review\u002FSKILL.md",[118,121],{"categoryNo":119,"categoryName":120,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[123,124,125,126,127,128,129,130,131,132,94,133,134,135,136],"review","visual","visual review","pages","web","false","iteration","take","check","slides","ui","screenshot","playwright","screenshots",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":143,"publishedAt":37},"01M6DF73AQVCBZKEN0YXEX9FXP","status","Diagnostic status report — shows metaswarm installation state, project setup, and potential issues","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fstatus\u002FSKILL.md",[],[139,144,145,146,147,148,149,150],"setup","report","project","installation","project setup","issues","state",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":158,"publishedAt":37},"01M6DF6X6C2XB0P6GX76P7TTYV","start","Use when starting work on any task, when the user mentions metaswarm, or when the user wants to begin tracked development work","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fstart\u002FSKILL.md",[157],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[153,159,76,160,161,162,33,163,164,165,166],"start issue","issue","ready","work on issue","user","work","work on","development",{"skillNo":168,"name":144,"nameZh":6,"description":169,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":170,"categories":171,"keywords":172,"publishedAt":37},"01M6DF6QMJ9AJKFKHHKRT005PQ","Interactive project setup — detects your project, configures metaswarm, writes project-local files","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fsetup\u002FSKILL.md",[],[144,146,109,173,148,174],"files","interactive"]