deciduous 0.15.0

Decision graph tooling for AI-assisted development. Track every goal, decision, and outcome. Survive context loss. Query your reasoning.
Documentation
name: CI

on:
  push:
    branches: [main, master]
  pull_request:
    branches: [main, master]
  workflow_dispatch:

jobs:
  format-check:
    name: Check Code Formatting
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt

      - name: Check Rust Formatting
        run: cargo fmt --check

      - name: Format Summary
        if: success()
        run: |
          echo "## Code Formatting ✓" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "All Rust code is properly formatted." >> $GITHUB_STEP_SUMMARY

      - name: Format Failure Summary
        if: failure()
        run: |
          echo "## Code Formatting ✗" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "Rust code is not properly formatted!" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "Run \`cargo fmt\` locally to fix formatting." >> $GITHUB_STEP_SUMMARY

  validate-types:
    name: Validate Type Synchronization
    runs-on: ubuntu-latest
    needs: format-check
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install jq
        run: sudo apt-get install -y jq

      - name: Run Type Validation
        run: ./scripts/validate-types.sh --verbose

      - name: Summary
        if: success()
        run: |
          echo "## Type Synchronization ✓" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "All type definitions are in sync across:" >> $GITHUB_STEP_SUMMARY
          echo "- \`src/db.rs\` (Rust backend)" >> $GITHUB_STEP_SUMMARY
          echo "- \`src/tui/types.rs\` (Rust TUI)" >> $GITHUB_STEP_SUMMARY
          echo "- \`web/src/types/graph.ts\` (TypeScript web)" >> $GITHUB_STEP_SUMMARY
          echo "- \`schema/decision-graph.schema.json\` (Canonical schema)" >> $GITHUB_STEP_SUMMARY

      - name: Failure Summary
        if: failure()
        run: |
          echo "## Type Synchronization ✗" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "Type definitions are out of sync!" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "Please ensure all type definitions match across:" >> $GITHUB_STEP_SUMMARY
          echo "- \`src/db.rs\` (Rust backend)" >> $GITHUB_STEP_SUMMARY
          echo "- \`src/tui/types.rs\` (Rust TUI)" >> $GITHUB_STEP_SUMMARY
          echo "- \`web/src/types/graph.ts\` (TypeScript web)" >> $GITHUB_STEP_SUMMARY
          echo "- \`schema/decision-graph.schema.json\` (Canonical schema)" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "Run \`./scripts/validate-types.sh --verbose\` locally to see details." >> $GITHUB_STEP_SUMMARY

  build-rust:
    name: Build and Test (Rust)
    runs-on: ubuntu-latest
    needs: validate-types
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Cache Rust
        uses: Swatinem/rust-cache@v2

      - name: Rust Unit Tests
        run: cargo test --lib

      - name: Rust Integration Tests
        run: cargo test --test cli_integration

      - name: Rust Property Tests (proptest)
        run: cargo test --lib -- proptests

      - name: Rust Clippy
        run: cargo clippy

      - name: Test Summary
        if: success()
        run: |
          echo "## Rust Test Results ✓" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "All Rust tests passed:" >> $GITHUB_STEP_SUMMARY
          echo "- Unit tests" >> $GITHUB_STEP_SUMMARY
          echo "- Integration tests" >> $GITHUB_STEP_SUMMARY
          echo "- Property-based tests (proptest)" >> $GITHUB_STEP_SUMMARY

  build-web:
    name: Build Web
    runs-on: ubuntu-latest
    needs: validate-types
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'
          cache-dependency-path: web/package-lock.json

      - name: Install Web Dependencies
        working-directory: web
        run: npm ci

      - name: TypeScript Type Check
        working-directory: web
        run: npx tsc --noEmit

      - name: Build Web
        working-directory: web
        run: npm run build

      - name: Web Build Summary
        if: success()
        run: |
          echo "## Web Build ✓" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "Web build completed successfully" >> $GITHUB_STEP_SUMMARY