name: CI on: pull_request: branches: [master] paths-ignore: - 'packages/docs/**' - 'openspec/**' - '*.md' concurrency: group: ci-${{ github.ref }} cancel-in-progress: true jobs: check: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Pull LFS files run: git lfs pull - uses: oven-sh/setup-bun@v2 - uses: actions/cache@v4 with: path: ~/.bun/install/cache key: bun-${{ runner.os }}-${{ hashFiles('bun.lock') }} restore-keys: bun-${{ runner.os }}- - run: bun install --frozen-lockfile - name: Lint run: bun run lint - name: Typecheck run: bunx tsgo --noEmit - name: Unit tests run: bun test tests/engine/ env: BUN_HEAVY_TESTS: '1' - name: Copy-paste detection run: bun run test:dupes preview: runs-on: ubuntu-latest permissions: contents: read deployments: write pull-requests: write environment: name: preview url: ${{ steps.deploy.outputs.deployment-url }} steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v2 - uses: actions/cache@v4 with: path: ~/.bun/install/cache key: bun-${{ runner.os }}-${{ hashFiles('bun.lock') }} restore-keys: bun-${{ runner.os }}- - run: bun install --frozen-lockfile - run: bun run build - uses: cloudflare/wrangler-action@v3 id: deploy with: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} command: pages deploy dist --project-name=openpencil-app --branch=${{ github.head_ref }} - name: Comment preview URL uses: actions/github-script@v7 with: script: | const url = '${{ steps.deploy.outputs.deployment-url }}'; const marker = ''; const body = `${marker}\nšŸ”— Preview: ${url}`; const { data: comments } = await github.rest.issues.listComments({ ...context.repo, issue_number: context.issue.number }); const existing = comments.find(c => c.body.includes(marker)); if (existing) { await github.rest.issues.updateComment({ ...context.repo, comment_id: existing.id, body }); } else { await github.rest.issues.createComment({ ...context.repo, issue_number: context.issue.number, body }); }