name: Pull Request Validation
permissions:
contents: read
pull-requests: write
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
branches: [main]
jobs:
validate:
name: Validate PR
runs-on: ubuntu-latest
# Skip draft PRs
if: github.event.pull_request.draft == false
steps:
- uses: actions/checkout@v4
- uses: wyvox/action-setup-pnpm@v3
with:
node-version: 18
- name: Install dependencies
run: pnpm install
# Enforce conventional commits in PR title
- name: Validate PR title
uses: amannn/action-semantic-pull-request@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
# Configure which types are allowed (newline-delimited)
types: |
feat
fix
docs
style
refactor
test
chore
# Check for lint issues
- name: Run ESLint
run: pnpm lint:strict
# Run TypeScript checks
- name: Type check
run: |
pnpm --filter "@mcpify/core" typecheck
pnpm --filter "@mcpify/demo" typecheck
pnpm --filter "@mcpify/tests" typecheck
# Build verification
- name: Build packages
run: pnpm build
# Run tests with timing to identify slow tests
- name: Run tests with performance checks
run: pnpm test -- --reporter=verbose
# Generate test coverage
- name: Run tests with coverage
run: pnpm test:coverage
- uses: codecov/codecov-action@v3
with:
files: ./coverage/coverage-final.json
fail_ci_if_error: false
# Check for excessive dependencies being added
- name: Check for dependency changes
uses: hiwelo/new-dependencies-action@1.0.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
# Post PR comment with validation results
- name: Post validation results
if: always()
uses: actions/github-script@v6
with:
script: |
const status = '${{ job.status }}';
const emoji = status === 'success' ? '✅' : '❌';
const header = `## ${emoji} PR Validation Results`;
const details = [
'### Code Quality Checks',
'- **Conventional Commit Format**: ' + (status === 'success' ? 'Passed' : 'Failed'),
'- **Linting**: ' + (status === 'success' ? 'Passed' : 'Failed'),
'- **Type Checking**: ' + (status === 'success' ? 'Passed' : 'Failed'),
'- **Tests**: ' + (status === 'success' ? 'Passed' : 'Failed'),
'',
'Please ensure all tests pass and code quality checks are addressed before merging.',
].join('\n');
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `${header}\n\n${details}`
});