Skip to content

chore(deps-dev): bump the minor-and-patch group in /packages/openclaw-qveris-plugin with 2 updates #324

chore(deps-dev): bump the minor-and-patch group in /packages/openclaw-qveris-plugin with 2 updates

chore(deps-dev): bump the minor-and-patch group in /packages/openclaw-qveris-plugin with 2 updates #324

name: Contract tests
# Keep contract consumers aligned on PRs without rerunning the same full matrix
# after merge. A weekly full run retains Windows coverage; package release
# workflows keep their own release-time matrices.
on:
pull_request:
paths:
- "package.json"
- "package-lock.json"
- "docs/openapi/**"
- "packages/cli/src/**"
- "packages/cli/test/**"
- "packages/cli/scripts/**"
- "packages/cli/bin/**"
- "packages/python-sdk/qveris/**"
- "packages/python-sdk/tests/**"
- "packages/python-sdk/examples/**"
- "packages/python-sdk/docs-api/**"
- "packages/js-sdk/src/**"
- "packages/js-sdk/test/**"
- "packages/js-sdk/docs-api/**"
- "packages/js-sdk/package.json"
- "packages/js-sdk/package-lock.json"
- "packages/cli/package.json"
- "packages/cli/package-lock.json"
- "packages/python-sdk/pyproject.toml"
- "packages/python-sdk/uv.lock"
- "packages/mcp/src/**"
- "packages/mcp/test/**"
- "packages/mcp/scripts/**"
- "packages/mcp/schemas/**"
- "packages/mcp/package.json"
- "packages/mcp/package-lock.json"
- "packages/mcp/tsconfig.json"
- "packages/openclaw-qveris-plugin/**"
- "packages/js-sdk/examples/**"
- "packages/js-sdk/tsconfig.examples.json"
- "packages/mcp/examples/**"
- "packages/mcp/tsconfig.examples.json"
- "packages/cli/examples/**"
- "benchmarks/discover-call/**"
- ".prettierrc.json"
- ".prettierignore"
- "packages/*/eslint.config.mjs"
- "scripts/plan-contract-tests.mjs"
- "scripts/plan-contract-tests.test.mjs"
- ".github/workflows/contract-tests.yml"
schedule:
- cron: "23 3 * * 0"
workflow_dispatch:
permissions:
contents: read
concurrency:
group: contract-tests-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
plan:
name: Plan affected contract tests
runs-on: ubuntu-latest
outputs:
benchmark: ${{ steps.plan.outputs.benchmark }}
cli: ${{ steps.plan.outputs.cli }}
python: ${{ steps.plan.outputs.python }}
js: ${{ steps.plan.outputs.js }}
mcp: ${{ steps.plan.outputs.mcp }}
plugin: ${{ steps.plan.outputs.plugin }}
lint: ${{ steps.plan.outputs.lint }}
lint_cli: ${{ steps.plan.outputs.lint_cli }}
lint_python: ${{ steps.plan.outputs.lint_python }}
lint_js: ${{ steps.plan.outputs.lint_js }}
lint_mcp: ${{ steps.plan.outputs.lint_mcp }}
lint_plugin: ${{ steps.plan.outputs.lint_plugin }}
examples: ${{ steps.plan.outputs.examples }}
os_matrix: ${{ steps.plan.outputs.os_matrix }}
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0
- name: Test the affected-target planner
run: node --test scripts/plan-contract-tests.test.mjs
- name: Classify changed targets
id: plan
env:
CONTRACT_TEST_FULL: ${{ github.event_name != 'pull_request' }}
CONTRACT_TEST_BASE_SHA: ${{ github.event.pull_request.base.sha }}
CONTRACT_TEST_HEAD_SHA: ${{ github.event.pull_request.head.sha }}
run: node scripts/plan-contract-tests.mjs
discover-call-benchmark:
needs: plan
if: needs.plan.outputs.benchmark == 'true'
strategy:
fail-fast: false
matrix:
os: ${{ fromJSON(needs.plan.outputs.os_matrix) }}
runs-on: ${{ matrix.os }}
defaults:
run:
working-directory: benchmarks/discover-call
steps:
- uses: actions/checkout@v7
- uses: actions/setup-node@v7
with:
node-version: 20
cache: "npm"
cache-dependency-path: benchmarks/discover-call/package-lock.json
- name: Install dependencies
run: npm ci
- name: Validate task set and scorer fixtures
run: npm run validate
- name: Benchmark harness tests
run: npm test
cli-contract:
needs: plan
if: needs.plan.outputs.cli == 'true'
strategy:
fail-fast: false
matrix:
os: ${{ fromJSON(needs.plan.outputs.os_matrix) }}
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v7
- uses: actions/setup-node@v7
with:
node-version: 20
cache: "npm"
cache-dependency-path: packages/cli/package-lock.json
- name: Install dependencies
working-directory: packages/cli
run: npm ci
- name: CLI tests with coverage (Linux)
if: runner.os == 'Linux'
working-directory: packages/cli
run: npm run test:coverage
- name: CLI tests (Windows)
if: runner.os == 'Windows'
working-directory: packages/cli
run: npm test
python-contract:
needs: plan
if: needs.plan.outputs.python == 'true'
strategy:
fail-fast: false
matrix:
os: ${{ fromJSON(needs.plan.outputs.os_matrix) }}
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v7
with:
python-version: "3.11"
- uses: astral-sh/setup-uv@v7
with:
enable-cache: true
cache-dependency-glob: packages/python-sdk/uv.lock
- name: Python SDK tests with coverage (Linux)
if: runner.os == 'Linux'
working-directory: packages/python-sdk
run: uv run --extra dev pytest -q --cov=qveris --cov-fail-under=82
- name: Python SDK tests (Windows)
if: runner.os == 'Windows'
working-directory: packages/python-sdk
run: uv run --extra dev pytest -q
js-sdk-tests:
needs: plan
if: needs.plan.outputs.js == 'true'
strategy:
fail-fast: false
matrix:
os: ${{ fromJSON(needs.plan.outputs.os_matrix) }}
runs-on: ${{ matrix.os }}
defaults:
run:
working-directory: packages/js-sdk
steps:
- uses: actions/checkout@v7
- uses: actions/setup-node@v7
with:
node-version: 20
cache: "npm"
cache-dependency-path: packages/js-sdk/package-lock.json
- name: Install dependencies
run: npm ci
- name: Type check
run: npm run typecheck
- name: Type check examples
run: npm run typecheck:examples
- name: JS SDK client tests with coverage (Linux)
if: runner.os == 'Linux'
run: npm run test:coverage
- name: JS SDK client tests (Windows)
if: runner.os == 'Windows'
run: npm test
mcp-tests:
needs: plan
if: needs.plan.outputs.mcp == 'true'
strategy:
fail-fast: false
matrix:
os: ${{ fromJSON(needs.plan.outputs.os_matrix) }}
runs-on: ${{ matrix.os }}
defaults:
run:
working-directory: packages/mcp
steps:
- uses: actions/checkout@v7
- uses: actions/setup-node@v7
with:
node-version: 20
cache: "npm"
cache-dependency-path: packages/mcp/package-lock.json
- name: Install dependencies
run: npm ci
- name: Type check
run: npm run typecheck
- name: Type check examples
run: npm run typecheck:examples
- name: MCP server tests with coverage (Linux)
if: runner.os == 'Linux'
run: npm run test:coverage
- name: MCP server tests (Windows)
if: runner.os == 'Windows'
run: npm test
# Non-blocking by design: a red mcp-tests job always means "generated
# card is invalid" (validated by vitest against the vendored pinned
# schema); upstream schema-URL availability is only reported here as an
# annotation without failing the build.
- name: Probe upstream Server Card schema URL (non-blocking)
run: node scripts/check-server-card-schema-url.mjs
openclaw-plugin-tests:
needs: plan
if: needs.plan.outputs.plugin == 'true'
strategy:
fail-fast: false
matrix:
os: ${{ fromJSON(needs.plan.outputs.os_matrix) }}
runs-on: ${{ matrix.os }}
defaults:
run:
working-directory: packages/openclaw-qveris-plugin
steps:
- uses: actions/checkout@v7
- uses: actions/setup-node@v7
with:
node-version: 22.22.3
cache: "npm"
cache-dependency-path: packages/openclaw-qveris-plugin/package-lock.json
- name: Install dependencies
run: npm ci
- name: Type check
run: npm run typecheck
- name: Plugin tests with coverage (Linux)
if: runner.os == 'Linux'
run: npm run test:coverage
- name: Plugin tests (Windows)
if: runner.os == 'Windows'
run: npm test
- name: Verify npm package contents
run: npm run check:pack
env:
NPM_CONFIG_OFFLINE: "true"
- name: Verify runtime contract with locked latest stable OpenClaw
run: npm run check:runtime
- name: Verify packed-package installation with latest stable OpenClaw
if: runner.os == 'Linux'
run: npm run check:runtime:packed
- name: Verify minimum and extended-stable OpenClaw compatibility
if: runner.os == 'Linux'
run: |
set -euo pipefail
for version in 2026.6.11 2026.6.33; do
npm install --no-save --package-lock=false "openclaw@${version}"
npm run check:runtime
done
lint:
needs: plan
if: needs.plan.outputs.lint == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-node@v7
if: needs.plan.outputs.lint_mcp == 'true' || needs.plan.outputs.lint_js == 'true' || needs.plan.outputs.lint_cli == 'true' || needs.plan.outputs.lint_plugin == 'true'
with:
node-version: 22.22.3
- uses: astral-sh/setup-uv@v7
if: needs.plan.outputs.lint_python == 'true'
with:
enable-cache: true
cache-dependency-glob: packages/python-sdk/uv.lock
- name: Lint mcp
if: needs.plan.outputs.lint_mcp == 'true'
working-directory: packages/mcp
run: npm ci && npm run lint
- name: Lint js-sdk
if: needs.plan.outputs.lint_js == 'true'
working-directory: packages/js-sdk
run: npm ci && npm run lint
- name: Lint cli
if: needs.plan.outputs.lint_cli == 'true'
working-directory: packages/cli
run: npm ci && npm run lint
- name: Lint openclaw plugin
if: needs.plan.outputs.lint_plugin == 'true'
working-directory: packages/openclaw-qveris-plugin
run: npm ci && npm run lint
- name: Lint python-sdk (ruff)
if: needs.plan.outputs.lint_python == 'true'
working-directory: packages/python-sdk
run: |
uv run --extra dev ruff check qveris tests examples docs-api
uv run --extra dev ruff format --check qveris tests examples docs-api
# Shellcheck the CLI scripting examples. The TypeScript examples are type
# checked in the js-sdk-tests / mcp-tests jobs; the Python examples are linted
# by the ruff step above; the recipe run.sh scripts are checked in
# ecosystem-validate.yml (which triggers on recipes/**).
examples:
needs: plan
if: needs.plan.outputs.examples == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- name: Shellcheck CLI example scripts
run: shellcheck packages/cli/examples/*.sh