W22: coverage metric + network tests + Tool stream feedback + stdin pipe + session path + dependency check (W22.1-W22.6)
Some checks failed
CI / Determine matrix (push) Has been cancelled
CI / ${{ matrix.os }} / ${{ matrix.build_type }} (push) Has been cancelled
CI / Sanitizer (ASan+UBSan) / ubuntu-24.04 (push) Has been cancelled
CI / Coverage (gcovr) / ubuntu-24.04 (push) Has been cancelled

- W22.1: gcovr 覆盖率度量 + CI coverage job(40% 阈值 warning)
- W22.2: network_plugin 单元测试(parse_headers_json/extract_host_port/SSE/异常保护)
- W22.3: Tool Calling 流式反馈(chat_stream + "[工具调用]/[工具结果]" 状态行)
- W22.4: --prompt stdin pipe(--prompt - 从 stdin 读取)
- W22.5: session 路径健壮化(static 缓存 + mkdir + fallback)
- W22.6: 插件依赖拓扑静态校验(validate_dependencies 循环/缺失检测)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-27 21:21:24 +08:00
parent b2b381b9b3
commit df3bf298ee
13 changed files with 753 additions and 23 deletions

View File

@@ -224,3 +224,107 @@ jobs:
- name: Test (Sanitizer)
shell: bash
run: ctest --preset ci-sanitize --output-on-failure
# ── Coverage (PR + push master, Linux clang-18, gcovr) ──
coverage:
name: Coverage (gcovr) / ubuntu-24.04
runs-on: ubuntu-24.04
steps:
# ── 1. 源码检出 ──────────────────────────────────────
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 1
# ── 2. 工具链 (clang-18) ─────────────────────────────
- name: Install toolchain (Ubuntu)
run: |
sudo apt-get update -qq
sudo apt-get install -y -qq clang-18 ninja-build
echo "CC=clang-18" >> $GITHUB_ENV
echo "CXX=clang++-18" >> $GITHUB_ENV
# ── 3. Python + Conan ─────────────────────────────────
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install Conan + gcovr
run: pip install conan gcovr
# ── 4. Conan 依赖缓存 ─────────────────────────────────
- name: Cache Conan
uses: actions/cache@v4
with:
path: |
~/.conan2
~/.conan2/p
key: ${{ runner.os }}-conan-Release-${{ hashFiles('deps/conanfile.txt') }}
restore-keys: |
${{ runner.os }}-conan-Release-
${{ runner.os }}-conan-
# ── 5. Conan 依赖安装 ─────────────────────────────────
- name: Install Conan dependencies
shell: bash
run: |
conan profile detect --force
conan install deps --build=missing -s build_type=Release
# ── 6. CMake 配置 ─────────────────────────────────────
- name: Configure CMake (Coverage)
shell: bash
run: cmake --preset ci-coverage
# ── 7. 构建 ───────────────────────────────────────────
- name: Build (Coverage)
shell: bash
run: cmake --build --preset ci-coverage
# ── 8. 测试 ──────────────────────────────────────────
- name: Test (Coverage)
shell: bash
run: ctest --preset ci-coverage --output-on-failure
# ── 9. 覆盖率报告 ────────────────────────────────────
- name: Coverage report
id: coverage
shell: bash
run: |
gcovr -r . --object-directory=build/ci-coverage \
--gcov-executable "llvm-cov-18 gcov" \
--print-summary > coverage_summary.txt 2>&1 || true
cat coverage_summary.txt
# Extract line coverage percentage
LINE_COV=$(grep -oP 'lines:\s*\K[\d.]+' coverage_summary.txt || echo "0")
echo "line_rate=${LINE_COV}" >> $GITHUB_OUTPUT
# Also generate HTML report
mkdir -p build/ci-coverage/coverage
gcovr -r . --object-directory=build/ci-coverage \
--gcov-executable "llvm-cov-18 gcov" \
--html --html-details \
-o build/ci-coverage/coverage/index.html || true
echo "HTML report: build/ci-coverage/coverage/index.html"
# ── 10. 覆盖率摘要 + 阈值门禁 ─────────────────────────
- name: Coverage summary
if: always()
shell: bash
run: |
LINE_COV="${{ steps.coverage.outputs.line_rate }}"
THRESHOLD=40
echo "## Coverage Report" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Metric | Value | Threshold | Status |" >> $GITHUB_STEP_SUMMARY
echo "|--------|-------|-----------|--------|" >> $GITHUB_STEP_SUMMARY
if [ -z "$LINE_COV" ] || [ "$LINE_COV" = "0" ]; then
echo "| Line Coverage | N/A | ${THRESHOLD}% | :grey_question: (no data) |" >> $GITHUB_STEP_SUMMARY
elif awk "BEGIN {exit !($LINE_COV < $THRESHOLD)}"; then
echo "| Line Coverage | ${LINE_COV}% | ${THRESHOLD}% | :warning: BELOW THRESHOLD |" >> $GITHUB_STEP_SUMMARY
echo "::warning title=Coverage below threshold::Line coverage ${LINE_COV}% is below ${THRESHOLD}% threshold"
else
echo "| Line Coverage | ${LINE_COV}% | ${THRESHOLD}% | :white_check_mark: OK |" >> $GITHUB_STEP_SUMMARY
echo "Line coverage ${LINE_COV}% >= ${THRESHOLD}% threshold - OK"
fi