CONTRIBUTING.md
September 5, 2026 ยท View on GitHub
Setting the Environment Up
- Install Node.js
26.5.1, then install dependencies for the root project and both maintained Meteor fixtures with Yarn. Install Just 1.57 or newer to use the repository helper recipes.
yarn setup
yarn test:e2e:install
The second command installs the Chromium revision pinned to Playwright. The browser binary is cached outside the repository and is not part of Yarn's dependency graph.
The repository pins Yarn through the packageManager field. Because Node 26
does not bundle Corepack, install and enable it first when your Node
distribution does not provide it:
npm install --global corepack@0.36.0
corepack enable
- Run the extension locally
yarn dev # default chrome
yarn dev:chrome # for chrome
yarn dev:firefox # for firefox
This command builds and watches the extension, runs
devapp-3.5in parallel, and launches a private Chrome or Firefox instance with the extension installed when both are ready.
-
Hack away!
Open a Pull Request from your fork to our repo once it is done or need a review.
Helper Recipes
Run just to list the cross-platform repository helpers:
just
- Setup extension and test project Dependencies
just setup
- Start development mode (Chrome by default)
just develop
just develop firefox
- Build release archives for both browsers
just build
Build
- Chrome
yarn build:chrome
yarn validate:chrome
- Firefox
yarn build:firefox
yarn validate:firefox
Verification
Run the same primary checks enforced by CI:
yarn install --immutable
yarn lint
yarn typecheck
yarn test
yarn build:chrome
yarn validate:chrome
yarn test:e2e:all
yarn build:firefox
yarn validate:firefox
yarn audit
yarn audit:devapp
yarn audit:all additionally reports development-only advisories without
blocking CI when no patched upstream release exists.
The Playwright suite starts the real Meteor 3.5.1 and 2.16 fixtures and loads
the production Chrome extension against each generation. It covers
service-worker startup, page injection, rich deterministic data, DDP method and
publication lifecycles, connection isolation, subscriptions, mutations,
Minimongo snapshots, Performance events, and packaged panel rendering. Run it
after the Chrome build validator. Use yarn test:e2e for Meteor 3 only or
yarn test:e2e:meteor2 for Meteor 2 only.
For UI work, build Chrome and run yarn test:ui for headless packaged-panel
geometry, keyboard, and dialog checks without starting Meteor. The same tests
also run in the full integration suites. Browser tests always run headlessly.
Each fixture renders a Fixture controls catalog for repeatable manual
validation. Wait until its status is ready, then trigger one bounded scenario
at a time while inspecting the corresponding DevTools panel. Use Reset
fixture after mutation-oriented inspection. Playwright calls the equivalent
fixture-only globalThis.__meteorDevtoolsFixture hook so automation and manual
testing exercise the same scenario implementations.
Playwright cannot address a custom Chrome DevTools panel through a supported page target. Complete that browser-owned boundary manually before release:
- Run
yarn dev:chromeand openhttp://127.0.0.1:2100. - Open DevTools and select the Meteor panel.
- Confirm the default and additional connections are available.
- Confirm DDP traffic, the 750-record primary corpus, unnamed and client-only
collections, and the
linkssubscription contain live fixture data. - Trigger method, publication, mutation, burst, and local Performance controls and confirm each corresponding panel updates.
Repeat the browser-owned boundary on Meteor 2 by running yarn devapp:2 and
yarn wxt -b chrome in separate terminals, opening
http://127.0.0.1:2200, and repeating the catalog checks with the Meteor 2
callback/synchronous implementation.
UI architecture
Custom component styles use co-located .module.css files. Shared palette,
spacing, and shell dimensions live in src/Styles/Tokens.css, loaded by the
application stylesheet. Use tokens for shared values and local classes for
component-owned elements. Keep Tailwind utilities and Blueprint controls where
already used; do not introduce another runtime styling engine.
src/Components owns reusable controls and their DOM/ref contracts.
src/Pages/Panel/PanelLayout.tsx owns shell geometry. Feature directories own
their presentation; Playground composes separate editor, results, catalog,
matrix, saved-record, comparison, transfer, and evidence components. State
and side effects stay in the existing stores and adapters.
Use scoped :global(...) selectors only for intentional cross-component hooks
or Blueprint classes. Apply dialog module classes directly to portaled dialog
roots. Use typed CSS custom properties for dynamic dimensions. Preserve the
shared Button's active and content hooks used by navigation and collection
controls. Do not pass styling-only props to native elements.
Verify rendered geometry and interactions in headless browser tests; avoid
tests that assert CSS template text in React source. See
specs/2026-09-05-ui-css-modules-architecture.md for the migration contracts.
Guidelines & Objectives
- The code must be linted and properly formatted, that can be easily done with the right IDE -- I use JetBrains WebStorm. Perhaps some git hooks would come in handy in the future.
- Every feature needs to take into account the Meteor community as a whole and not the interest of a few in detriment of others.
- Be friendly and supportive, no one is perfect, and we all have limited time, especially in these difficult times.