Git Workflow
Git conventions for contributing to Nevermore. These apply to both Luau packages and TypeScript CLI tools.
Commit messages
Use conventional commits: feat(scope):, fix(scope):, chore(scope):, docs:, refactor(scope):. Messages describe impact, not reasoning.
feat(cli): add GitHub Actions job summary reporter
fix(blend): handle nil parent during cleanup
chore(devcontainer): add GitHub CLI feature
docs: update testing guide with job summary details
The scope is typically the package name or area of the codebase. Omit the scope for cross-cutting changes.
Interactive rebase
Use git rebase -i to craft clean commit history before pushing or requesting review:
- Squash related work into cohesive commits (e.g., implementation + fix-ups become one commit)
- Separate unrelated changes into distinct commits (e.g., a feature commit and a devcontainer fix should be separate)
- Rebase onto the target branch to resolve conflicts cleanly rather than creating merge commits
- Reword commit messages to be clear and descriptive after squashing
# Rebase onto main and clean up commits interactively
git fetch origin main
git rebase -i origin/main
# In the editor: pick, squash (s), fixup (f), reword (r)
# Then force-push the cleaned branch
git push --force-with-lease
When to squash vs. keep separate
A PR with three commits like this is ideal:
feat(cli): add job summary reporter # the feature
chore(devcontainer): add GitHub CLI # unrelated improvement, separate commit
docs: document job summary and git rebase # docs follow-up
A PR where every save was a commit should be squashed down. The goal is that each commit in the final history is a coherent, self-contained change.
Pull request descriptions
PR descriptions are for reviewers and future readers browsing git history. They should answer "what changed and why?" — not "how was it implemented?" The code already shows the how.
Good — says what changed from the user's perspective:
Test and deploy results now appear on the GitHub Actions run summary page in addition to PR comments.
Also reorganizes the GitHub reporter code into `reporting/github/` with shared formatting and a separate API module.
Keep descriptions to 1-3 sentences of plain prose. No markdown headers, checklists, or "generated by" badges. If a PR needs a long explanation, that's usually a sign it should be split up.
The best PRs include a demo — a screenshot or short video showing the change in action. This is especially valuable for UI changes, new CLI output, or CI improvements where the effect isn't obvious from code alone. For performance or infrastructure changes, include before/after numbers — wall-clock times, request counts, or resource usage. Concrete measurements are more convincing than qualitative claims and help reviewers gauge whether the trade-offs are worth it.
Branching
- Branch from
mainfor all work - Use
users/{username}/{description}branch names:users/quenty/job-summary-reporter,users/quenty/fix-spinner-cursor - Rebase onto latest
mainbefore merging — the repo requires branches to be up-to-date withmain - Releases are CI-driven via
auto shipit— never release locally
Commit authorship
Commits are attributed to the person who authored them. Do not add Co-Authored-By trailers — Nevermore is open source and each commit should have a single clear author.