Files
tolaria/.github/workflows/ci.yml
Test c4960e8ee7 refactor: reduce complexity in parsing.rs and noteListHelpers.ts (gate: 9.31 → 9.33)
Refactored two files to improve code health:

1. src-tauri/src/vault/parsing.rs (7.9 → 8.54, +0.64)
   - Extracted helper functions to reduce nesting in strip_markdown_chars
     (process_wikilink, extract_wikilink_display, process_markdown_link)
   - Refactored strip_list_marker to eliminate bumpy road pattern
     (strip_unordered_marker, strip_ordered_marker)

2. src/utils/noteListHelpers.ts (9.28 → 10.0, +0.72)
   - Reduced cyclomatic complexity in isInboxEntry from 15 to ~4
     (hasAnyValidLinks, hasValidBodyLinks, hasValidFrontmatterLinks)
   - Extracted complex conditional into wasCreatedBeforeLastModification

Gate threshold raised: 9.31 → 9.33 (conservative, pending CodeScene re-analysis)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-27 07:10:06 +01:00

150 lines
5.9 KiB
YAML

name: CI
on:
push:
branches: [main, experiment/*]
pull_request:
branches: [main]
jobs:
test:
name: Tests & Quality Checks
runs-on: macos-15
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # Full history for CodeScene
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'pnpm'
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy, llvm-tools-preview
- name: Cache Rust dependencies
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
src-tauri/target
key: ${{ runner.os }}-cargo-${{ hashFiles('src-tauri/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-
- name: Install cargo-llvm-cov
uses: taiki-e/install-action@cargo-llvm-cov
- name: Install dependencies
run: pnpm install --frozen-lockfile
# ── 0. Build check (catches type errors and bundler failures) ─────────
- name: TypeScript type check
run: pnpm exec tsc --noEmit
- name: Vite build check
run: pnpm build
# ── 1. Tests ──────────────────────────────────────────────────────────
- name: Run frontend tests
run: pnpm test
- name: Bundle MCP server resources (required by Tauri build)
run: node scripts/bundle-mcp-server.mjs
- name: Run Rust tests
run: cargo test --manifest-path=src-tauri/Cargo.toml
# ── 2. Coverage (enforced — fails build if thresholds not met) ────────
- name: Frontend coverage (≥70% lines/functions/branches/statements)
run: pnpm test:coverage
# Thresholds configured in vite.config.ts — exits non-zero if coverage drops
- name: Rust coverage (≥85% lines)
run: |
cargo llvm-cov \
--manifest-path src-tauri/Cargo.toml \
--ignore-filename-regex 'lib\.rs|main\.rs|menu\.rs' \
--fail-under-lines 85
# cargo-llvm-cov exits non-zero if line coverage drops below 85%
# lib.rs/main.rs/menu.rs are Tauri boilerplate -- not meaningfully unit-testable.
# ── 3. Code Health (CodeScene — Hotspot + Average Code Health gates) ──
# Enforces minimum floors on BOTH hotspot and average code health.
# Hotspot: weighted avg of most-edited files (9.6 current | target 9.8)
# Average: project-wide avg across all files (8.9 current | target 9.5)
# Both gates must pass — average catches regressions in non-hotspot files.
- name: Code Health gates (Hotspot ≥9.5 + Average ≥9.0)
env:
CODESCENE_PAT: ${{ secrets.CODESCENE_PAT }}
CODESCENE_PROJECT_ID: ${{ secrets.CODESCENE_PROJECT_ID }}
run: |
HOTSPOT_THRESHOLD=9.5
AVERAGE_THRESHOLD=9.33
API_RESPONSE=$(curl -sf \
-H "Authorization: Bearer $CODESCENE_PAT" \
-H "Accept: application/json" \
"https://api.codescene.io/v2/projects/$CODESCENE_PROJECT_ID")
HOTSPOT_SCORE=$(echo "$API_RESPONSE" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['analysis']['hotspot_code_health']['now'])")
AVERAGE_SCORE=$(echo "$API_RESPONSE" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['analysis']['code_health']['now'])")
echo "Hotspot Code Health: $HOTSPOT_SCORE (threshold: $HOTSPOT_THRESHOLD)"
echo "Average Code Health: $AVERAGE_SCORE (threshold: $AVERAGE_THRESHOLD)"
python3 -c "
hotspot = float('$HOTSPOT_SCORE')
average = float('$AVERAGE_SCORE')
ht = float('$HOTSPOT_THRESHOLD')
at = float('$AVERAGE_THRESHOLD')
failed = False
if hotspot < ht:
print(f'❌ Hotspot Code Health {hotspot:.2f} is below threshold {ht}')
failed = True
else:
print(f'✅ Hotspot Code Health {hotspot:.2f} ≥ {ht}')
if average < at:
print(f'❌ Average Code Health {average:.2f} is below threshold {at}')
failed = True
else:
print(f'✅ Average Code Health {average:.2f} ≥ {at}')
if failed:
exit(1)
"
# ── 4. Documentation check (warning only — does not fail build) ───────
- name: Check docs are updated
continue-on-error: true
run: |
if git log -1 --pretty=%B | grep -i '\[skip docs\]' > /dev/null; then
echo "⏭️ Documentation check skipped"
exit 0
fi
if git diff --name-only origin/main | grep -E '^(src/|src-tauri/)' > /dev/null; then
if ! git diff --name-only origin/main | grep -E '^docs/' > /dev/null; then
echo "⚠️ Code files changed but docs/ not updated"
git diff --name-only origin/main | grep -E '^(src/|src-tauri/)'
echo "If this change affects architecture/abstractions/theme documented in docs/, update them."
echo "To suppress: include [skip docs] in your commit message."
fi
fi
echo "✅ Documentation check passed"
# ── 5. Lint & format ──────────────────────────────────────────────────
- name: Lint frontend
run: pnpm lint
- name: Clippy (Rust)
run: cargo clippy --manifest-path=src-tauri/Cargo.toml -- -D warnings
- name: Format check (Rust)
run: cargo fmt --manifest-path=src-tauri/Cargo.toml -- --check