Contributing
TruePPM is in its early days and contributions are welcome. The project uses GitLab for issue tracking and merge requests.
Getting set up
Section titled “Getting set up”git clone git@gitlab.com:trueppm/trueppm.gitcd trueppmmake setup # installs git hooks via pre-commitmake doctor # verifies all prerequisitesSee Installation for Docker Compose setup.
Branching
Section titled “Branching”Branch from main with a conventional prefix:
git checkout main && git pull origin maingit checkout -b feat/my-feature # or fix/, docs/, chore/, test/, refactor/Never commit or push directly to main — all changes go through a feature branch and merge request.
Commits
Section titled “Commits”Follow Conventional Commits:
feat(web): add board/kanban viewfix(api): prevent duplicate membership creationdocs(scheduler): add Monte Carlo CLI examplestest(api): add permission tests for task deletionchore(ci): upgrade Node to 22 in CI imageScopes: scheduler, api, web, helm, sync, docs, ci.
Changelog
Section titled “Changelog”Every MR that touches source code must include a changelog fragment in changelog.d/:
# Naming: <slug>.<type>.md# Types: added, changed, fixed, securityecho "Add board/kanban view with drag-and-drop" > changelog.d/kanban-view.added.mdThe CI changelog:check job blocks the pipeline if the fragment is missing. Fragments are assembled automatically at release time — never edit CHANGELOG.md directly.
Exempt: CI config, dependency bumps, test-only changes, docs-only changes.
Testing
Section titled “Testing”make test # runs all packages# Or per-package:cd packages/scheduler && pytestcd packages/api && pytestcd packages/web && npm test- Scheduler: pytest, coverage >= 80%
- API: pytest with testcontainers PostgreSQL, coverage >= 65%
- Web: vitest, coverage >= 80%
All MRs require a green pipeline before merge.
Code style
Section titled “Code style”| Package | Formatter | Linter | Type checker |
|---|---|---|---|
| Scheduler | ruff format | ruff check | mypy |
| API | ruff format | ruff check | mypy —strict |
| Web | prettier | eslint | tsc —noEmit |
make lint # runs all lintersmake typecheck # runs all type checkersMerge requests
Section titled “Merge requests”- Push your branch and open an MR targeting
main - Wait for a green pipeline
- Include: description, testing done, screenshots (if UI), issue link
- Don’t merge with a failing pipeline — fix the root cause on the branch
OSS / Enterprise boundary
Section titled “OSS / Enterprise boundary”Before writing code for a new feature, determine if it belongs in the community or enterprise repo:
- Community (this repo): features an individual PM or small team needs
- Enterprise (separate repo): features requiring cross-project, cross-team, or organizational coordination
The community edition must never import from trueppm_enterprise. Verify with:
grep -r "trueppm_enterprise" packages/# Must return zero results