Files
wehub-resource-sync 426e9eeabd
Benchmark Bridge Tests / benchmark (bunx @biomejs/biome check packages/lifeops-bench/src, benchmark-lint) (push) Waiting to run
Benchmark Bridge Tests / benchmark (bunx vitest run --config packages/lifeops-bench/vitest.config.ts --root packages/lifeops-bench --passWithNoTests, benchmark-tests) (push) Waiting to run
Build Agent Image / build-and-push (push) Waiting to run
Chat shell gestures / Chat shell gesture + parity e2e (push) Waiting to run
ci / test (push) Waiting to run
ci / lint-and-format (push) Waiting to run
ci / build (push) Waiting to run
ci / dev-startup (push) Waiting to run
Cloud Gateway Discord / Test (push) Waiting to run
Cloud Gateway Webhook / Test (push) Waiting to run
Cloud Tests / lint-and-types (push) Waiting to run
Cloud Tests / unit-tests (push) Waiting to run
Cloud Tests / integration-tests (push) Waiting to run
Cloud Tests / e2e-tests (push) Blocked by required conditions
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
Deploy Apps Worker (Product 2) / Determine environment (push) Waiting to run
Deploy Apps Worker (Product 2) / Deploy apps worker to apps-control host (${{ needs.determine-env.outputs.environment }}) (push) Blocked by required conditions
Deploy Eliza Provisioning Worker / Determine environment (push) Waiting to run
Deploy Eliza Provisioning Worker / Deploy worker to Hetzner host (${{ needs.determine-env.outputs.environment }} @ ${{ needs.determine-env.outputs.deployment_sha }}) (push) Blocked by required conditions
Dev Smoke / Classify changed paths (push) Waiting to run
Dev Smoke / bun run dev onboarding chat (push) Blocked by required conditions
Dev Smoke / Vite HMR dependency-level smoke (push) Blocked by required conditions
Electrobun Submodule Guard / electrobun gitlink is fetchable (push) Waiting to run
gitleaks / gitleaks (push) Waiting to run
Markdown Links / Relative Markdown Links (push) Waiting to run
Publish @elizaos/example-code / check_npm (push) Waiting to run
Publish @elizaos/example-code / publish_npm (push) Blocked by required conditions
Publish @elizaos/plugin-elizacloud / verify_version (push) Waiting to run
Publish @elizaos/plugin-elizacloud / publish_npm (push) Blocked by required conditions
Quality (Extended) / Homepage Build (PR smoke) (push) Waiting to run
Quality (Extended) / Comment-only diff guard (push) Waiting to run
Quality (Extended) / Format + Type Safety Ratchet (push) Waiting to run
Quality (Extended) / Develop Gate (secret scan + UI determinism) (push) Waiting to run
Quality (Extended) / Develop Gate (lint) (push) Waiting to run
Sandbox Live Smoke / Sandbox live smoke (push) Waiting to run
Snap Build & Test / Build Snap (amd64) (push) Waiting to run
Snap Build & Test / Build Snap (arm64) (push) Waiting to run
supply-chain / sbom (push) Waiting to run
supply-chain / vulnerability-scan (push) Waiting to run
Build, Push & Deploy to Phala Cloud / build-and-push (push) Waiting to run
Test Packaging / Validate Packaging Configs (push) Waiting to run
Test Packaging / PyPI on Python ${{ matrix.python }} (push) Waiting to run
Test Packaging / Pack & Test JS Tarballs (push) Waiting to run
Test Packaging / elizaos CLI global-install smoke (node + bun) (push) Waiting to run
UI Fixture E2E / ui-fixture-e2e (push) Waiting to run
UI Fixture E2E / fixture-e2e (push) Waiting to run
UI Story Gate / story-gate (push) Waiting to run
vault-ci / test (macos-latest) (push) Waiting to run
vault-ci / test (ubuntu-latest) (push) Waiting to run
vault-ci / test (windows-latest) (push) Waiting to run
vault-ci / app-core wiring tests (push) Waiting to run
verify-patches / verify patches/CHECKSUMS.sha256 (push) Waiting to run
Voice Benchmark Smoke / voice-emotion fixture smoke (push) Waiting to run
Voice Benchmark Smoke / voiceagentbench fixture smoke (push) Waiting to run
Voice Benchmark Smoke / voicebench-quality unit smoke (push) Waiting to run
Voice Benchmark Smoke / voicebench TypeScript unit (no audio) (push) Waiting to run
Voice Benchmark Smoke / voice bench smoke summary (push) Blocked by required conditions
Windows CI / windows ([bun run --cwd packages/app-core test bun run --cwd packages/elizaos test bun run --cwd packages/cloud/shared test], app-and-cli) (push) Waiting to run
Windows CI / windows ([bun run --cwd packages/scenario-runner test bun run --cwd packages/vault test bun run --cwd packages/security test bun run --cwd plugins/plugin-coding-tools test], framework-packages) (push) Waiting to run
Windows CI / windows ([bun run --cwd plugins/plugin-elizacloud test bun run --cwd plugins/plugin-discord test bun run --cwd plugins/plugin-anthropic test bun run --cwd plugins/plugin-openai test bun run --cwd plugins/plugin-app-control test bun run --cwd plugins/pl… (push) Waiting to run
Windows CI / windows ([node packages/scripts/run-turbo.mjs run build --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/agent --concurrency=4 node packages/scripts/run-bash-linux-only.mjs scripts/verify-riscv64-buildpaths.sh node packages/scripts/run… (push) Waiting to run
Windows CI / windows ([node packages/scripts/run-turbo.mjs run typecheck --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/cloud-shared --concurrency=4 bun run --cwd packages/core test bun run --cwd packages/shared test], core-runtime, 75) (push) Waiting to run
Test Packaging / Build & Test PyPI Package (push) Waiting to run
Voice Workbench / headless workbench (mocked backends) (push) Has been cancelled
Voice Workbench / real acoustic lane (nightly, provisioned only) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:43:05 +08:00

346 lines
14 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: Quality (Extended)
# Additional quality gates layered on top of `ci.yaml`. These are the
# eliza-derived checks that have no equivalent job in the canonical
# eliza CI: the homepage build (so PRs that touch packages/homepage
# don't first regress on `develop` push) and a workspace-level
# typecheck/biome format gate.
on:
# PRs to `develop` use the lightweight lint/typecheck/build gate
# (develop-pr.yml); these extended quality gates run on `main` PRs and
# post-merge on push to both branches.
pull_request:
branches: [main]
paths-ignore:
- "docs/**"
- "packages/docs/**"
- "CHANGELOG.md"
- "LICENSE"
- ".github/ISSUE_TEMPLATE/**"
- ".github/pull_request_template.md"
push:
branches: [main, develop]
paths-ignore:
- "docs/**"
- "packages/docs/**"
- "CHANGELOG.md"
- "LICENSE"
- ".github/ISSUE_TEMPLATE/**"
- ".github/pull_request_template.md"
workflow_dispatch:
# CI fan-out fix: the PR-scoped concurrency from #14069 fell back to
# github.run_id on push, so every develop push got a unique group and
# nothing ever superseded. A 37-merge wave queued thousands of push runs
# and starved the self-hosted fleet. Fall back to github.ref (all develop
# pushes share a group) and cancel superseded runs on push too. PR behavior
# is unchanged (pull_request.number still wins the key); merge_group and
# schedule events are not in the cancel set, so the merge queue and nightly
# runs always complete.
concurrency:
group: quality-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' || github.event_name == 'push' }}
env:
BUN_VERSION: "canary"
NODE_VERSION: "24.15.0"
# Default to least privilege. Override per-job where needed.
permissions:
contents: read
jobs:
homepage-build:
name: Homepage Build (PR smoke)
runs-on: ${{ fromJSON(vars.HETZNER_FLEET_ONLINE == 'false' && '["ubuntu-24.04"]' || '["self-hosted","hetzner-robot"]') }}
timeout-minutes: 15
permissions:
contents: write
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
submodules: false
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
with:
node-version: ${{ env.NODE_VERSION }}
- name: Setup workspace dependencies
uses: ./.github/actions/setup-bun-workspace
env:
# The legacy fixture bundle contains stale visual baselines; homepage
# tests must use the expectations committed with the checked-out SHA.
ELIZA_SKIP_ARTIFACT_SYNC: "1"
with:
bun-version: ${{ env.BUN_VERSION }}
install-command: bun install --ignore-scripts --no-frozen-lockfile
install-native-deps: "false"
skip-avatar-clone: "true"
no-vision-deps: "true"
- name: Check homepage smoke scope
id: homepage-scope
shell: bash
run: |
set -euo pipefail
if [ "${{ github.event_name }}" != "pull_request" ]; then
echo "run=true" >> "$GITHUB_OUTPUT"
exit 0
fi
git fetch --no-tags origin "${{ github.base_ref }}"
if merge_base="$(git merge-base "origin/${{ github.base_ref }}" HEAD)"; then
changed_files="$(git diff --name-only "${merge_base}" HEAD)"
else
echo "No merge base found with origin/${{ github.base_ref }}; falling back to direct base/head diff." >&2
changed_files="$(git diff --name-only "origin/${{ github.base_ref }}" HEAD)"
fi
if grep -Eq '^(packages/homepage/|packages/shared/|packages/app-core/scripts/write-homepage-release-data\.mjs|\.github/workflows/(deploy-homepage|release-electrobun|release-orchestrator)\.yml)' <<< "${changed_files}"; then
echo "run=true" >> "$GITHUB_OUTPUT"
else
echo "run=false" >> "$GITHUB_OUTPUT"
fi
- name: Skip unrelated homepage smoke
if: steps.homepage-scope.outputs.run != 'true'
run: echo "Skipping homepage smoke; this PR does not touch homepage release surfaces."
- name: Build homepage
if: steps.homepage-scope.outputs.run == 'true'
working-directory: packages/homepage
run: bun run build
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Install homepage browser
if: steps.homepage-scope.outputs.run == 'true'
working-directory: packages/homepage
run: ./node_modules/.bin/playwright install --with-deps chromium
- name: Generate missing snapshot baselines
if: steps.homepage-scope.outputs.run == 'true'
id: gen-baselines
working-directory: packages/homepage
run: |
SNAP_DIR="tests/e2e/visual.spec.ts-snapshots"
# 5 routes × 2 viewports × 1 browser project = 10 expected snapshots
EXPECTED=10
ACTUAL=$(ls "$SNAP_DIR"/*.png 2>/dev/null | wc -l || echo 0)
if [ "$ACTUAL" -lt "$EXPECTED" ]; then
echo "Found $ACTUAL of $EXPECTED snapshot baselines — regenerating all."
rm -f "$SNAP_DIR"/*.png 2>/dev/null || true
bun run test:e2e -- --update-snapshots || true
echo "generated=true" >> "$GITHUB_OUTPUT"
else
echo "generated=false" >> "$GITHUB_OUTPUT"
fi
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Commit new snapshot baselines
if: steps.homepage-scope.outputs.run == 'true' && steps.gen-baselines.outputs.generated == 'true'
continue-on-error: true
run: |
SNAP_DIR="packages/homepage/tests/e2e/visual.spec.ts-snapshots"
if [ -n "$(git status --porcelain $SNAP_DIR)" ]; then
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add $SNAP_DIR
git commit -m "chore: generate visual regression snapshot baselines [skip ci]"
git push origin HEAD:${{ github.ref_name }} || (git pull --rebase origin ${{ github.ref_name }} && git push origin HEAD:${{ github.ref_name }})
echo "Pushed new snapshot baselines."
fi
- name: Test homepage downloads
if: steps.homepage-scope.outputs.run == 'true' && steps.gen-baselines.outputs.generated == 'false'
working-directory: packages/homepage
run: bun run test:e2e
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
comment-only-diff:
name: Comment-only diff guard
runs-on: ${{ fromJSON(vars.HETZNER_FLEET_ONLINE == 'false' && '["ubuntu-24.04"]' || '["self-hosted","hetzner-robot"]') }}
timeout-minutes: 5
if: github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'comment-cleanup')
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
submodules: false
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
with:
node-version: ${{ env.NODE_VERSION }}
- name: Setup workspace dependencies
uses: ./.github/actions/setup-bun-workspace
with:
bun-version: ${{ env.BUN_VERSION }}
install-command: bun install --ignore-scripts --no-frozen-lockfile
install-native-deps: "false"
setup-python: "false"
install-protoc: "false"
run-postinstall: "false"
- name: Run comment-only guard self-test
run: node scripts/assert-comment-only-diff.mjs --self-test
- name: Check comment-only diff
run: bun run check:comment-only origin/${{ github.base_ref }}
format-check:
name: Format + Type Safety Ratchet
runs-on: ${{ fromJSON(vars.HETZNER_FLEET_ONLINE == 'false' && '["ubuntu-24.04"]' || '["self-hosted","hetzner-robot"]') }}
timeout-minutes: 5
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
submodules: false
- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
with:
node-version: ${{ env.NODE_VERSION }}
- name: Setup workspace dependencies
uses: ./.github/actions/setup-bun-workspace
with:
bun-version: ${{ env.BUN_VERSION }}
install-command: bun install --ignore-scripts --no-frozen-lockfile
install-native-deps: "false"
# Biome only needs JS dependencies; skipping Python/protoc keeps this
# 5-minute format gate away from apt mirrors and Rust build tooling.
setup-python: "false"
install-protoc: "false"
run-postinstall: "false"
- name: Run CLAUDE/AGENTS guide parity self-test
run: node --test scripts/assert-agents-claude-identical.test.mjs
- name: Run CLAUDE/AGENTS guide parity
run: bun run check:agents-claude
- name: Run type-safety ratchet self-test
run: bun run audit:type-safety-ratchet:self-test
- name: Run type-safety ratchet
run: bun run audit:type-safety-ratchet
# The type-duplication finder is advisory (it never fails the build); only
# its AST classifier is gated here so the candidate-report tooling stays
# honest. The full scan + `--check` drift report is run on demand /
# periodically, not on the hot path (#10195, #10201).
- name: Run type-duplication finder self-test
run: bun run audit:type-duplication:self-test
- name: Run biome format check
run: bun run format:check
# Develop-gate extension (#10104): the canonical `ci.yaml` quality job — which
# runs the prompt-secret scan, UI-determinism gate, and biome lint — fires only
# on PRs to `main` (`ci.yaml` `pull_request: branches: [main]`), while the
# default merge target is `develop`. So these checks never gated a develop PR.
# The static job below re-runs the build-free pair on develop (and main) PRs,
# mirroring the lean install used by `format-check`.
develop-static-gate:
name: Develop Gate (secret scan + UI determinism)
runs-on: ${{ fromJSON(vars.HETZNER_FLEET_ONLINE == 'false' && '["ubuntu-24.04"]' || '["self-hosted","hetzner-robot"]') }}
timeout-minutes: 8
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
submodules: false
# `audit:test-realness` compares touched tests against origin/develop.
# Keep the merge base available so the diff-scoped ratchet runs in CI.
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
with:
node-version: ${{ env.NODE_VERSION }}
- name: Setup workspace dependencies
uses: ./.github/actions/setup-bun-workspace
with:
bun-version: ${{ env.BUN_VERSION }}
install-command: bun install --ignore-scripts --no-frozen-lockfile
install-native-deps: "false"
# Both gates are static AST/text scans over source — no Python/protoc,
# Rust, or postinstall artifacts needed (same lean install as the
# format gate above).
setup-python: "false"
install-protoc: "false"
run-postinstall: "false"
- name: Prompt secret scan
run: cd packages/prompts && bun run check:secrets
- name: UI determinism self-test
run: bun run audit:ui-determinism:self-test
- name: UI determinism gate
run: bun run audit:ui-determinism
# Develop PRs do not run the canonical `ci.yaml` main-branch quality job,
# so keep the anti-larp/test-realness gates enforced here too.
- name: Anti-larp test gate self-test
run: bun run audit:focused-tests:self-test
- name: Anti-larp test gate
run: bun run audit:focused-tests
- name: Test realness ratchet
run: bun run audit:test-realness
# `bun run lint` is intentionally separate from the static scans above: the
# Turbo lint task depends on selected package builds, so it needs the normal
# build-enabled workspace setup rather than the lean no-postinstall path.
develop-lint-gate:
name: Develop Gate (lint)
runs-on: ${{ fromJSON(vars.HETZNER_FLEET_ONLINE == 'false' && '["ubuntu-24.04"]' || '["self-hosted","hetzner-robot"]') }}
timeout-minutes: 25
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
submodules: false
# Full history so `turbo run lint --affected` can resolve the PR's
# merge base (#12341); on a shallow clone turbo safely degrades to
# linting the whole graph.
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
with:
node-version: ${{ env.NODE_VERSION }}
- name: Setup workspace dependencies
uses: ./.github/actions/setup-bun-workspace
with:
bun-version: ${{ env.BUN_VERSION }}
install-command: bun install
install-native-deps: "false"
install-protoc: "false"
setup-python: "false"
skip-avatar-clone: "true"
no-vision-deps: "true"
# PR lane: lint only the packages in the merge base's dependency cone; on
# push/merge_group lint the whole graph (exhaustive + turbo cache seeding).
# Turbo re-derives per-task hashes, so affected scoping never under-lints a
# genuinely changed package (#12341).
- name: Run lint (affected — PR)
if: github.event_name == 'pull_request'
run: node packages/scripts/run-turbo.mjs run lint --affected
env:
TURBO_SCM_BASE: ${{ github.event.pull_request.base.sha }}
- name: Run lint (full — push/merge_group)
if: github.event_name != 'pull_request'
run: bun run lint