Files
Clément SAILLANTandGitHub 5efb380da5 feat: automate yiacad PR review lane (#18)
* feat: automate yiacad pr review lane

* fix: stabilize yiacad review and spec gates

* fix: scope kicad exports to repo hardware

* fix: ignore kicad block library sources in exports

* feat: Add infra VPS monitoring runbook and healthcheck scripts

- Created INFRA_VPS_RUNBOOK_2026.md detailing operational procedures for monitoring VPS services.
- Added infra_vps_healthcheck.sh script for automated health checks on DNS, TLS, TCP, and HTTP for VPS services.
- Introduced infra_vps_security_audit.sh for non-intrusive security checks on external VPS services.
- Established JSON schema for infra VPS inventory in infra_vps.schema.json.
- Developed integration for runtime status reporting in the Next.js API route.
- Implemented Playwright tests for smoke testing the application and ensuring core functionalities.
- Updated Makefile for development dependencies and testing commands.
- Created various test files for unit and end-to-end testing across different components.

* feat(agentics): update mesh agents, gates, prompts, and workflows
2026-03-29 17:14:16 +02:00

224 lines
6.1 KiB
YAML

name: CI
on:
push:
branches:
- main
pull_request:
workflow_dispatch:
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
python-stable:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Bootstrap repo-local venv
run: bash tools/bootstrap_python_env.sh
- name: Run stable Python suite
run: bash tools/test_python.sh --suite stable
firmware-lint:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install clang-format
run: sudo apt-get update && sudo apt-get install -y clang-format
- name: Lint firmware (clang-format)
run: bash tools/ci/lint_firmware.sh
firmware-native:
name: Firmware — Unity tests (native)
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install PlatformIO
run: |
pip install platformio
pio --version
- name: Run Unity tests (native env)
working-directory: firmware
run: pio test -e native
firmware-build:
name: Firmware — ESP32-S3 build
runs-on: ubuntu-latest
timeout-minutes: 30
needs: firmware-native
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install PlatformIO
run: pip install platformio
- name: Cache PlatformIO packages
uses: actions/cache@v4
with:
path: ~/.platformio
key: pio-esp32s3-${{ hashFiles('firmware/platformio.ini') }}
restore-keys: pio-esp32s3-
- name: Build esp32s3_waveshare
working-directory: firmware
run: pio run -e esp32s3_waveshare
- name: Upload firmware artifact
uses: actions/upload-artifact@v4
with:
name: firmware-bin
path: /tmp/kl_pio_build/esp32s3_waveshare/firmware.bin
retention-days: 30
firmware-sim:
name: Firmware — Wokwi simulation
runs-on: ubuntu-latest
timeout-minutes: 10
needs: firmware-build
if: ${{ vars.WOKWI_CLI_TOKEN != '' }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install PlatformIO & build ELF
run: |
pip install platformio
cd firmware && pio run -e esp32s3_waveshare
# pio uses build_dir=/tmp/kl_pio_build; copy artifacts to where wokwi.toml expects them
mkdir -p .pio/build/esp32s3_waveshare
cp /tmp/kl_pio_build/esp32s3_waveshare/firmware.bin .pio/build/esp32s3_waveshare/
cp /tmp/kl_pio_build/esp32s3_waveshare/firmware.elf .pio/build/esp32s3_waveshare/
- name: Wokwi CI simulation
continue-on-error: true
uses: wokwi/wokwi-ci-action@v1
with:
token: ${{ vars.WOKWI_CLI_TOKEN }}
path: firmware
timeout: 15000
scenario: scenario.yaml
hardware-export:
name: Hardware — KiCad ERC + exports
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install KiCad 10
run: |
sudo add-apt-repository -y ppa:kicad/kicad-10.0-releases
sudo apt-get update
sudo apt-get install -y kicad
kicad-cli version
- name: Run ERC
run: |
mkdir -p artifacts/hw
kicad-cli sch erc hardware/esp32_minimal/esp32_minimal.kicad_sch \
--format json --output artifacts/hw/erc_report.json
python3 -c "
import json, sys
d = json.load(open('artifacts/hw/erc_report.json'))
v = d['sheets'][0]['violations']
errs = [x for x in v if x['severity'] == 'error']
print(f'ERC: {len(errs)} errors, {len(v)-len(errs)} warnings')
if errs: sys.exit(1)
"
- name: Export SVG + PDF + netlist
run: |
mkdir -p artifacts/hw
kicad-cli sch export svg hardware/esp32_minimal/esp32_minimal.kicad_sch \
--output artifacts/hw/
kicad-cli sch export pdf hardware/esp32_minimal/esp32_minimal.kicad_sch \
--output artifacts/hw/schematic.pdf
kicad-cli sch export netlist hardware/esp32_minimal/esp32_minimal.kicad_sch \
--output artifacts/hw/netlist.xml
- name: Install KiBot
run: pip install kibot
- name: KiBot exports (SVG, PDF, BOM, netlist)
working-directory: hardware/esp32_minimal
continue-on-error: true
run: |
mkdir -p ../../artifacts/hw/kibot
kibot -c .kibot.yaml -e esp32_minimal.kicad_sch \
-d ../../artifacts/hw/kibot/ 2>&1 || echo "[kibot] non-zero exit (KiCad 10 compat)"
- name: Compliance validation (prototype profile)
run: |
python3 tools/compliance/validate.py --strict
- name: Upload hardware artifacts
uses: actions/upload-artifact@v4
with:
name: hardware-exports
path: artifacts/hw/
retention-days: 30
playwright-e2e:
name: Playwright E2E
runs-on: ubuntu-latest
timeout-minutes: 20
defaults:
run:
working-directory: web
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "npm"
cache-dependency-path: web/package-lock.json
- name: Install web dependencies
run: npm ci
- name: Install Chromium
run: npx playwright install --with-deps chromium
- name: Run smoke E2E
env:
CI: "true"
run: npx playwright test e2e/smoke.spec.ts
- name: Upload Playwright artifacts
if: always()
uses: actions/upload-artifact@v4
with:
name: playwright-e2e-artifacts
if-no-files-found: ignore
path: |
web/playwright-report/
web/test-results/
retention-days: 14