feat(engine): G9 accumulated multi-round scoring — Hearts plays to 10… #5
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Validate & Catalog Rulesets | |
| on: | |
| push: | |
| branches: [main] | |
| paths: | |
| - "rulesets/**" | |
| - "packages/schema/**" | |
| workflow_dispatch: | |
| jobs: | |
| validate-and-catalog: | |
| runs-on: ubuntu-latest | |
| container: oven/bun:slim | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Install dependencies | |
| run: bun install --frozen-lockfile | |
| - name: Validate rulesets | |
| run: bun run scripts/validate-rulesets.ts | |
| - name: Build catalog | |
| run: bun run scripts/build-catalog.ts | |
| - name: Upload catalog artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: catalog | |
| path: catalog.json | |
| deploy-pages: | |
| needs: validate-and-catalog | |
| if: github.ref == 'refs/heads/main' | |
| runs-on: ubuntu-latest | |
| container: oven/bun:slim | |
| permissions: | |
| pages: write | |
| id-token: write | |
| environment: | |
| name: github-pages | |
| url: ${{ steps.deployment.outputs.page_url }} | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Install dependencies | |
| run: bun install --frozen-lockfile | |
| - name: Build catalog | |
| run: bun run scripts/build-catalog.ts | |
| - name: Prepare Pages directory | |
| run: | | |
| mkdir -p _site | |
| cp catalog.json _site/ | |
| mkdir -p _site/rulesets | |
| cp rulesets/*.cardgame.json _site/rulesets/ | |
| cat > _site/index.html << 'HTMLEOF' | |
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Card Game Engine — Catalog</title> | |
| <style> | |
| *{margin:0;padding:0;box-sizing:border-box} | |
| body{font-family:system-ui,sans-serif;background:#0d1117;color:#e6edf3;padding:2rem;max-width:800px;margin:0 auto} | |
| h1{margin-bottom:.5rem} p.sub{color:#8b949e;margin-bottom:2rem} | |
| .game{background:#161b22;border:1px solid #30363d;border-radius:8px;padding:1.25rem;margin-bottom:1rem} | |
| .game h2{font-size:1.1rem;margin-bottom:.25rem} | |
| .game .desc{color:#8b949e;font-size:.9rem;margin-bottom:.5rem} | |
| .tags{display:flex;gap:.4rem;flex-wrap:wrap} | |
| .tag{background:#1f6feb22;color:#58a6ff;font-size:.75rem;padding:2px 8px;border-radius:12px;border:1px solid #1f6feb44} | |
| .meta{color:#8b949e;font-size:.8rem;margin-top:.5rem} | |
| a{color:#58a6ff;text-decoration:none} a:hover{text-decoration:underline} | |
| </style> | |
| </head> | |
| <body> | |
| <h1>🃏 Card Game Engine</h1> | |
| <p class="sub">Browse available game rulesets — <a href="catalog.json">catalog.json</a></p> | |
| <div id="games"></div> | |
| <script> | |
| fetch('catalog.json').then(r=>r.json()).then(({games})=>{ | |
| document.getElementById('games').innerHTML=games.map(g=>` | |
| <div class="game"> | |
| <h2>${g.name}</h2> | |
| ${g.description?`<p class="desc">${g.description}</p>`:''} | |
| ${g.tags?.length?`<div class="tags">${g.tags.map(t=>`<span class="tag">${t}</span>`).join('')}</div>`:''} | |
| <p class="meta">${g.players.min}–${g.players.max} players · v${g.version} · <a href="${g.file}">${g.slug}.cardgame.json</a></p> | |
| </div> | |
| `).join(''); | |
| }); | |
| </script> | |
| </body> | |
| </html> | |
| HTMLEOF | |
| - name: Upload Pages artifact | |
| uses: actions/upload-pages-artifact@v3 | |
| with: | |
| path: _site | |
| - name: Deploy to GitHub Pages | |
| id: deployment | |
| uses: actions/deploy-pages@v4 |