CI Pipeline

The CI runs on every push to main and every pull request. It uses smart scoping to skip expensive jobs when only unrelated areas changed.

Job Overview

JobPurposeWhen it runs
docs-scopeDetect docs-only changesAlways
changed-scopeDetect which areas changed (node/macos/android/windows)Non-doc changes
checkTypeScript types, lint, formatNon-docs, node changes
check-docsMarkdown lint + broken link checkDocs changed
secretsDetect leaked secretsAlways
build-artifactsBuild dist once, share with release-checkPushes to main, node changes
release-checkValidate npm pack contentsPushes to main after build
checksNode tests + protocol check on PRs; Bun compat on pushNon-docs, node changes
compat-node22Minimum supported Node runtime compatibilityPushes to main, node changes
checks-windowsWindows-specific testsNon-docs, windows-relevant changes
macosSwift lint/build/test + TS testsPRs with macos changes
androidGradle build + testsNon-docs, android changes

Fail-Fast Order

Jobs are ordered so cheap checks fail before expensive ones run:

  1. docs-scope + changed-scope + check + secrets (parallel, cheap gates first)
  2. PRs: checks (Linux Node test split into 2 shards), checks-windows, macos, android
  3. Pushes to main: build-artifacts + release-check + Bun compat + compat-node22

Scope logic lives in scripts/ci-changed-scope.mjs and is covered by unit tests in src/scripts/ci-changed-scope.test.ts.

Runners

RunnerJobs
blacksmith-16vcpu-ubuntu-2404Most Linux jobs, including scope detection
blacksmith-32vcpu-windows-2025checks-windows
macos-latestmacos, ios

Local Equivalents

pnpm check          # types + lint + format
pnpm test           # vitest tests
pnpm check:docs     # docs format + lint + broken links
pnpm release:check  # validate npm pack