Contributing to VaxLink¶
Repository Layout¶
apps/extension/— Chrome extension (Manifest V3), no build step, plain JSapps/extension-tests/— extension test suite (kept outsideapps/extension/so the Chrome Web Store zip stays clean)apps/web-next/— Next.js marketing site, deployed to GitHub Pagesscripts/— shell utilitiesskills/— Claude Code skill definitions for common extension workflows
Chrome Extension¶
Load apps/extension/ as an unpacked extension in chrome://extensions with Developer mode on to test manually.
# Syntax check individual files
node --check apps/extension/content.js
node --check apps/extension/popup.js
node --check apps/extension/popup-inventory.js
# Run the automated test suite
cd apps/extension-tests && npm test
See apps/extension/README.md for the module breakdown and storage model.
Next.js Site¶
Panorama DOM Fixtures¶
Never commit a live-session DOM capture. Panorama and similar EMR pages can contain real patient data (name, client ID, address). If you need a fixture to test or debug a selector:
- Capture from a training/UAT environment only, never production.
- Sanitize to the minimal structural fragment you actually need (e.g. the specific
<select>/<input>elements and their field IDs), not the full page. - See
apps/extension-tests/panorama-reason-consent.test.jsfor the pattern: inline HTML fragments embedded directly in the test, no fixture files on disk.
Pull Requests¶
- Keep
manifest.jsonidentical across branches — the extension name is stamped byscripts/package-extension.shat package time, never edited directly, sodev→mainmerges don't conflict. Onlyversionis bumped in git. - Run the relevant test suite (extension or
apps/web-nextlint/build) before opening a PR.