Repository navigation
EN Contribute Before A Pull Request
Français · How-to · Published, partly reviewed by a person · Applies from: 4.5.0
One list of what to run and check before opening a pull request on the engine, so that CI confirms what you already know instead of telling you.
Audience, context, and the statuses of what this page rests on
Audience: contributor · Context: engine repository
A branch whose fast tier is green on your machine (format, lint, types, unit tests, the sample game's gates), whose behaviour change is owned, whose CHANGELOG fragment is there, and whose pull request description says what changed and what is left.
The engine repository, on a branch named as Conventions says. The commands are
those of 4.4.0; the CHANGELOG fragments exist since 4.1.9, release-check:local since 4.1.17.
- A prepared repository: Developer setup, with Python and its modules (the asset tests need them) and Playwright Chromium.
- Your change made with The dev loop.
In the engine repository, on your machine, on your branch. Run one test suite at a time: two suites side by side compete for the same cores and leave orphan workers behind when interrupted.
-
Keep the content rules.
- Gameplay stays declarative in
games/<id>/; geometry belongs inlayout/*.json, never typed by hand. - Every schema-3 rule, choice, topic, listener, persistent block and script step has a stable id.
npm run ids -- --write --mapwrites the missing ones into the sources (State and saves). - No private source asset, nothing whose commercial rights are unclear.
- Gameplay stays declarative in
-
Format, lint and types.
# in the engine repository npm run qualityIt runs, in this order:
format:check(Biome formatting),lint:code(Biome lint),knip(unused files, exports and dependencies),tsc --noEmitwithtsconfig.json,tsc --noEmit -p tsconfig.strictest.json(every index access checked insrc/), andlint:content(the content lint).npm run formatwrites the formatting; a commit that only reformats is its own commit, listed in.git-blame-ignore-revs(Conventions).
-
The unit suite.
# in the engine repository npm run checkcheckselects the game, type-checks, then runstest:node: every test file except the heavy solver tests (the nightly and the candidate run those) and the two asset tests (next step).
-
The asset tests, which need Python and its image modules.
# in the engine repository npm run test:assets
-
The game's gates.
# in the engine repository npm run verify:gameIt runs
validate,solve,solve -- --chapters,verify:variants,i18n -- status, the content lint andplaytests, on the current game.
-
The behaviour baseline. A change meant to keep behaviour leaves it identical:
# in the engine repository npm run quality:baseline -- --checkA change that alters behaviour on purpose, or adds a test, rewrites it with
npm run quality:baseline(which also writes the READMEs' figures) and commits the result. See The quality baseline.
-
The documentation, when you touched it or the code a page rests on:
# in the engine repository npm run docs:truth npm run wiki -- checkwiki -- checkends with✔ … 0 error(s); Writing documentation says how pages are written and checked.
-
The CHANGELOG fragment. A branch that changes
src/,bridge/,tools/,scripts/,cli/,connectors/orgames/carrieschanges/<slug>.md(andchanges/<slug>.log.mdfor a LOG entry):# in the engine repository npm run changes -- --checkIt prints
✔ … a fragment or a CHANGELOG edit is there, or no code moved, or the refusal and what to write (Conventions).
-
A browser or visual change: build for production, serve it, play it, and look at the screenshots.
# in the engine repository npm run build:game npm run preview -- --port 5173 & npm run e2e:smoke -- http://127.0.0.1:5173/
e2e:smokeplays the production build with the generic harness in a 844 × 390 Chromium; the screenshots land inE2E_OUT(default/tmp/e2e). Open them. Stop the preview server afterwards (kill %1in the same shell).
-
The same, in one line.
release-check:localchains most of the above:# in the engine repository npm run release-check:localIt runs
quality,docs:truth,test:node,build:game(the game's gates, the bundle,verify:dist, the spoiler check, the asset audit) andquality:baseline -- --check --dist. It does not runtest:assets,changes -- --check,wiki -- checknor the browser.
-
Open the pull request from
.github/PULL_REQUEST_TEMPLATE.md, its title as Conventions says. Fill every section: "What changes" (what a player, an author or a host sees differently), "Checked", and "Not done, said as such" ("Nothing" when nothing is left). A visual change carries a screenshot in the description.
Limit ·
template-checklistThe template's "Checked" list namesnpm run qualityandnpm testonly. The list on this page is the complete one:knip(insidequality),check,test:assetsandverify:gameare expected too.
The roadmap of the v1.3 to v2 milestones held its own list, run at every milestone; it is kept here as it was written:
-
npm run validate && npm run solve && npm test && npm run buildgreen, CI green, the asset audit green. - The demo uses every new primitive at least once and the e2e goes through it (844 × 390 captures).
- A save made with the previous version of the demo loads after migration (a unit test on a JSON frozen per
milestone). Today one golden save per release since 3.0 lives in
tests/fixtures/saves/and is played to its end bytests/save-v3.test.tsand the baseline. - A copy of
src/engineinto the private game: its tests, solver and e2e unchanged (the French roadmap gives the figures of that time: 37 tests, a 62-action solution, the private game's e2e). - MCP:
npm run -s mcplists the updated tools; a fresh AI session adds a script or an event to the demo following only the content guide. - A tagged release with notes, and the README's "Releases" table updated. The README now names the current release in its Documentation section instead of a table; releases are made as Releasing says.
Every command above ends green. On the pull request, pr-gate is green once every job of the plan succeeded
(CI explained); a job the plan spares says "not needed by the plan" and succeeds.
| Symptom | Cause | Fix |
|---|---|---|
format:check fails |
A file is not formatted |
npm run format, in a commit of its own if it reformats more than your change |
knip names an unused export or file |
Dead code left by the change | Remove it, or use it |
✖ this branch changes the code and carries no fragment |
No changes/<slug>.md
|
Write it (Conventions) |
✖ behaviour moved from tests/quality-baseline.json |
A digest, a verdict, a golden save or the API surface moved, or a README figure lags | The quality baseline |
test:assets fails at import |
Python modules missing | python3 -m pip install --require-hashes -r requirements.txt |
| CI's coverage job warns "coverage ratchet" | A floor is three points or more below what the tests reach | Not blocking on a pull request; raise it (The coverage ratchet) |
npm run format rewrites source files; npm run quality:baseline rewrites tests/quality-baseline.json and the
figures of README.md and README.fr.md; npm run ids -- --write --map writes ids into games/<id>/. The checks
themselves write only under .cache/ and /tmp/e2e.
A rewrite you did not mean (format, quality:baseline) is undone with git restore <file>. An interrupted test run
can leave Vitest workers running: stop them by their process id (ps then kill <pid>), not by a pattern.
- Which tests run when, CI explained.
- Conventions, The quality baseline, The coverage ratchet.
-
CONTRIBUTING.md,.github/PULL_REQUEST_TEMPLATE.md.
Generated publication · publication générée — current documentation · documentation courante: quest'n'click 4.5.3 r1, documentation revision · révision de la documentation b061c4ae6fbeb0be47a11ba8a442ba7e23ecb0a1.
Latest documentation · dernière documentation: https://quest-n-click.cleverapps.io/docs · https://quest-n-click.cleverapps.io/fr/docs; earlier versions · versions précédentes: each release's quest-n-click-docs-<version>.tar.gz · l'archive quest-n-click-docs-<version>.tar.gz de chaque release, https://github.com/Quest-n-Click/quest-n-click/releases
An edit made in this wiki is overwritten at the next publication · une modification faite dans ce wiki est écrasée à la publication suivante.
Edit the source · Modifier la source · Report an error · Signaler une erreur
Index (6)
Start (6)
Play (9)
Install (18)
- Requirements
- Install from the release archive
- Install from npm
- Install from the repository to work on the engine
- doctor: checking your machine
- Image toolchain
- Audio toolchain: ffmpeg, fluidsynth, Furnace, uv
- Upgrade
- Upgrade notes: 4.5
- Upgrade notes: 4.4
- Upgrade notes: 4.3
- Upgrade notes: 4.2
- Upgrade notes: 4.1
- Upgrade notes: v3
- Upgrade notes: v2 to v3
- Coming from web-scumm
- Package reference
- Install troubleshooting
Create a game (55)
- Your first game
- Layout of a created project and of the engine repository
- The working loop
- Content principles and the identity contract
- Rooms
- Geometry: placement, walk zones, masks, layers, camera
- Something is visible but unreachable
- Reactions
- Game commands
- Conditions
- Flags, variables and events: which to use
- Custom code
- Characters
- Items and inventory
- World map
- Dialogues
- Scripts and events
- Moving characters: patrols and walks
- Exits
- Chapters and objectives
- State and saves: persistent or temporary, renaming an id, migrations
- Staging: wide rooms and animations
- The stage: lights, particles, floors
- Skin and fonts
- Title and credits
- Heroes: several characters and hero choice
- Built-in minigames
- A custom minigame
- Translations
- Music in stems
- Sound effects
- Voices: per language and per hero
- Images: prompts, cutting sheets, transparency, scale
- Asset provenance
- The storyboard, source of truth
- Puzzle design
- Classic mechanics
- Review pages
- DSL reference
- Checking your game
- What the solver proves
- Solver options
- Playtests
- Remix
- Speedrun for authors
- The sealed ending
- Production template
- Example games
- Working with an AI
- Build and release a game
- Publish on GitHub Pages
- The static game on Clever Cloud
- Other static hosts
- Sub-path, cache and service worker, incomplete deploys, going back
- Testing on a phone over the LAN
Local Studio (24)
- The local Studio: overview and launch
- Edit a room
- Placement and stage
- Preview, apply, undo
- Storyboard
- Assets and cutting
- Check: validator, solver, critical path, heat, health, coverage
- Before and after captures
- Semantic diff
- Play and replay a session
- Rule explainer
- Language and objectives
- Voices and the heroes × languages matrix
- Map
- Notes
- Remix in the Studio
- Music
- The Assistant: bring your own key
- Demo mode and studio-apply
- Local and LAN security
- Studio API
- Local MCP: setting up each client
- MCP tools
- Studio troubleshooting
Team Studio (21)
- What runs where
- Concepts: revision, transaction, span, lease, preview, build
- Starting as an invited dev
- Working together day to day
- Roles and actions: the full matrix
- Invitations
- Managing members
- Write refused on the hosted Studio: stale base revision (409)
- Write refused on the hosted Studio: span locked (423)
- Recovering after a lost lease, a disconnection or a stale preview
- Comments
- Map and semantic diff
- Publishing builds
- Remote MCP
- The game in Git
- Upgrading the engine of a hosted game
- Hosted assets
- The server's command line
- Health and metrics routes
- Trying it locally with compose.yml
- Known limits
Clever Cloud (23)
- Clever Cloud: overview, cost and prerequisites
- Apps and add-ons
- Domains and TLS
- Keycloak
- Generic OIDC and GitLab
- Configuration
- First deployment
- Backups
- RPO and RTO
- Restore the Studio on a fresh installation
- Redeploys
- Upgrading the server and checking state after a migration
- Limits of going back
- Monitoring
- Security
- Rotating keys
- Recovering admin access
- Changing domain or OIDC provider
- Worker, PostgreSQL or Cellar down
- Exporting the game and leaving the installation
- Retention
- Clever Cloud troubleshooting
- Costs and teardown
Reality Bridge and connectors (16)
- The Reality Bridge: what it is
- Quick start
- Guarantees
- Install and run the Bridge
- Backup and restore
- Several tenants
- Signals and the manifest
- The Bridge's command line
- Connectors overview
- Email connector
- Telnet connector
- SSH connector
- Open Badges connector
- The connector SDK
- Security: Biscuit and signatures
- Bridge and connector troubleshooting
Contribute (25)
- Welcome
- Developer setup
- The dev loop
- Before a pull request
- Conventions
- Writing documentation
- Architecture
- Code tour
- Import boundaries
- Which tests run when
- Mutation testing
- The coverage ratchet
- The quality baseline
- CI explained
- Field passes
- Benchmarks
- Releasing
- npm packages
- Decisions and ADRs
- Governance
- Bot pull requests
- Contributing with AI agents
- Security policy
- Code of conduct
- Licences and credits