QA Flow welcomes contributions of all kinds — from bug reports and feature ideas to documentation improvements and code changes. This page explains the branching strategy, commit message format, pull request process, and how releases are created. Reading it before opening your first PR will help your contribution land smoothly.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/davidG97/qa-flow/llms.txt
Use this file to discover all available pages before exploring further.
Ways to Contribute
Report a Bug
Open an issue using the Bug Report template. Check existing issues first to avoid duplicates, and include steps to reproduce, expected behaviour, and actual behaviour.
Request a Feature
Open an issue using the Feature Request template. Describe your use case and the behaviour you’d expect — this helps collaborators understand the value before implementation begins.
Submit Code
Find an open issue (or create one), comment to claim it, then follow the PR process below. All code contributions target the
main branch.Git Flow
QA Flow uses a simplified fork-based flow where collaborators control all releases. Merging tomain does not automatically trigger a release — all releases are created manually.
If you are a first-time contributor, comment on the issue you’d like to work on before starting. This prevents duplicate work and gives collaborators a chance to share any context that might affect your approach.
Conventional Commits
QA Flow follows the Conventional Commits specification. Every commit message must start with a type and an optional scope, followed by a short description:Commit Types
| Type | Description |
|---|---|
feat | A new feature |
fix | A bug fix |
docs | Documentation only changes |
style | Code style changes (formatting, semicolons, etc.) |
refactor | Code change that neither fixes a bug nor adds a feature |
perf | Performance improvement |
test | Adding or updating tests |
chore | Maintenance tasks |
ci | CI/CD changes |
Examples
Pull Request Process
Create a branch from main
Always branch from an up-to-date Branch names should follow the pattern
main. Pull the latest changes from upstream before creating your branch to minimise merge conflicts later.<type>/<short-description>, for example feat/scroll-node, fix/timeout-handling, or docs/docker-guide.Make commits using the conventional format
Make small, focused commits as you work. Each commit should represent one logical change and use the conventional commit format described above.
Push to your fork
Push your branch to your fork on GitHub. If you’ve been working for a while, rebase against upstream main first to keep your branch clean.
Open a Pull Request targeting main
Open a PR from your fork’s branch to
davidG97/qa-flow:main. Fill in the PR template completely — describe what changed, why, and how to test it. Link any related issues using GitHub keywords (Closes #123, Fixes #456).Address review feedback and wait for merge
Collaborators will review your PR and may request changes. Push additional commits to your branch to address the feedback — do not force-push after review has started, as it makes the review history harder to follow. Once all feedback is addressed and CI passes, a collaborator will merge the PR.
PR Requirements Checklist
Before marking your PR as ready for review, confirm that all of the following are true:- All CI checks pass
- Code follows the style guidelines below
- Tests have been added or updated where applicable
- Documentation has been updated if the change affects user-facing behaviour
- There are no merge conflicts with
main
Release Process
Releases are created through GitHub Actions. Collaborators navigate to Actions → Release → Run workflow and choose two parameters:- Stable Release
- Beta Release
Select the version bump type
Choose
patch, minor, or major based on the nature of changes since the last release (see the version guide below).- A GitHub Release with an auto-generated changelog
- A Docker image tagged as
latestandX.Y.Z - An npm package at version
X.Y.Z
Version Bump Guide
| Type | When to use | Example |
|---|---|---|
patch | Bug fixes and small changes with no new features | 1.0.0 → 1.0.1 |
minor | New features that are backwards compatible | 1.0.1 → 1.1.0 |
major | Breaking changes to existing behaviour or APIs | 1.1.0 → 2.0.0 |
Style Guidelines
Consistent code style makes the codebase easier to read and review. The following conventions are enforced or expected across the project:TypeScript
TypeScript
- Use TypeScript for all new code — no plain
.jsfiles insrc/orserver/src/ - Enable and respect strict mode (
"strict": trueintsconfig.json) - Prefer
interfaceovertypefor describing object shapes - Use meaningful, self-documenting variable names — avoid abbreviations
- Use
.jsextensions on local imports in the backend (NodeNextmodule resolution requires this even for.tssource files)
React (Frontend)
React (Frontend)
- Use functional components with hooks — no class components
- Wrap node components in
memo()to prevent unnecessary React Flow re-renders - Keep components small and focused on a single responsibility
- Extract reusable stateful logic into custom hooks in
src/hooks/ - Avoid prop drilling — use context or custom hooks for cross-component state
Backend (Express)
Backend (Express)
- Follow the existing controller → service pattern: controllers handle HTTP parsing and response, services contain business logic
- Export singleton service objects rather than classes that callers must instantiate
- Keep route files thin — only
router.get(...)androuter.post(...)calls, no logic
CSS
CSS
- Use CSS variables for all colours and spacing values — avoid hardcoded hex codes or pixel values
- Follow BEM-like naming conventions for class names (
.block__element--modifier) - Keep styles in module-level files co-located with their component