name: Lint permissions: contents: read on: pull_request: jobs: changes: name: Detect changes runs-on: ubuntu-latest permissions: contents: read pull-requests: read outputs: code: ${{ steps.filter.outputs.code }} steps: - name: Filter changed paths uses: dorny/paths-filter@v3 id: filter with: # `**/!(*.md)` excludes Markdown so docs-only changes don't trigger linting. filters: | code: - 'packages/**/!(*.md)' - 'spec/**/!(*.md)' - '.oxlintrc.json' - '.prettierrc' - '.prettierignore' - '.editorconfig' - 'pnpm-lock.yaml' - 'pnpm-workspace.yaml' - 'package.json' - '.tool-versions' - '.github/workflows/lint.yml' lint: name: Lint needs: changes if: ${{ needs.changes.outputs.code == 'true' }} runs-on: ubuntu-latest steps: - name: Checkout Repo uses: actions/checkout@v4 - name: Parse .tool-versions uses: wistia/parse-tool-versions@v2.1.1 with: filename: '.tool-versions' uppercase: 'true' prefix: 'tool_version_' - uses: pnpm/action-setup@v4 with: version: '${{ env.TOOL_VERSION_PNPM }}' - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: '${{ env.TOOL_VERSION_NODEJS }}' cache: pnpm - name: Configure pnpm run: | pnpm config set auto-install-peers true pnpm config set exclude-links-from-lockfile true - name: Install dependencies run: pnpm install --frozen-lockfile - name: Install uv uses: astral-sh/setup-uv@v6 with: version: '${{ env.TOOL_VERSION_UV }}' python-version: '${{ env.TOOL_VERSION_PYTHON }}' enable-cache: true - name: Install Python dependencies working-directory: packages/python-sdk run: | uv sync --locked - name: Run linting run: | pnpm run lint - name: Run formatting run: | pnpm run format - name: Check for uncommitted changes run: | if [[ -n $(git status --porcelain) ]]; then echo "❌ Files are not formatted properly:" git status --short git diff exit 1 else echo "✅ No changes detected." fi