# Gate every pull request into `main`. # # This repository had no workflows at all — the same hole phase 2 found in # Module-Rust, in the repo that ships the half running inside somebody's game # server. It is the one component here that cannot be compiled by CI: the plugin # is deployed as SOURCE and built by Oxide or Carbon against game assemblies that # exist only on a Rust server, so a build job is not available at any price. # # What is available is a reader, and the mistakes worth reading for are the ones # both frameworks make silent. Hooks bind by name and arity through reflection, # with no compile-time check and no warning when a name matches nothing, so: # # • a hook that is not in `ExpectedHooks` is invisible to `rg.hooks`, which is # the instrument this project relies on to answer "does this hook fire on # this framework" (CARBON.md §6); # • a hook that RETURNS something can cancel a death, swallow a player's # gathered wood, or refuse a login (PROTOCOL.md §8.7); # • a `ProtocolVersion` that disagrees with `overlay.toml` produces a bundle # that will not compose, and the game link has no handshake to catch it. # # `scripts/checkPlugin.js` asks all three, dependency-free, and its own test # suite breaks it seven ways — including the failure that would make every other # case meaningless, a method parser that silently matches nothing. # # Enforcement (one-time, in the Gitea UI): # Repository Settings → Branches → Branch Protection (rule for `main`) # • Enable Status Check # • Status check patterns: PR Checks / * # Gitea only lists a context after it has reported once; the glob matches # without the dropdown and keeps matching as jobs are added. name: PR Checks on: pull_request: branches: [main, edge] concurrency: group: pr-checks-${{ github.ref }} cancel-in-progress: true jobs: plugin-checks: runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 # No install step: the checks are dependency-free on purpose, which is also # how a contributor runs them. - name: Check the plugin's hooks, void rule and protocol declaration run: node scripts/checkPlugin.js # Named individually rather than `node --test scripts/`: directory mode is # not portable across the Node versions this project runs on. - name: Test the checker itself run: node --test scripts/checkPlugin.test.js