Pull Requests
Branching, commit style, tests, and what review looks like.
This page describes how to make a patch that lands quickly.
Before you start
For anything beyond a one-line fix, open a draft PR or an issue first. A two-line message that says "I'm thinking of doing X, OK?" prevents spending time on something that would be redirected.
Things that almost never need pre-approval:
- Typo fixes.
- Doc clarifications.
- Test additions for existing behaviour.
- Error-message improvements.
Things that benefit from a heads-up:
- New CLI commands or new flags.
- Changes to JSON envelope fields.
- New entitlements.
- Anything that touches system state (system proxy, TUN, helpers).
- Any breaking change.
Branching
Fork the repo, then branch from main:
git checkout -b fix-overrides-merge-orderWe don't enforce a branch naming convention, but <type>-<short-summary>
keeps the PR list readable. Useful types: fix, feat, docs,
refactor, test, chore.
Commit style
We don't require Conventional Commits, but we appreciate them.
A good commit message:
- Has a subject line under 72 characters that describes the change in the imperative ("Add", not "Added").
- If the subject isn't enough, includes a body that explains why and links to the issue.
- Stays focused. One change per commit. Squash WIPs before requesting review.
Example:
fix(overrides): respect explicit `delete-rules` after a `+rules` prepend
The override merge applied `delete-rules` against the original rule list
instead of the prepended one, so user deletes silently no-oped when paired
with prepend operations.
Fixes #142Tests
A change without a test is a regression waiting to happen.
KumoCoreKitchanges must come with a SwiftPM test underTests/KumoCoreTests. The bar is "would this test have failed before the fix?"KumoCLIKitchanges should come with a test underTests/KumoCLITests. CLI tests can exercise commands without spawning a process.KumoAppchanges are harder to unit-test. At minimum, exercise the flow manually and describe the steps in the PR body.
Run before pushing:
make swift-test
# or, if you want the full pipeline:
make checkmake check builds the app, runs the tests, and smoke-checks
kumo status --json.
Documentation
If your PR changes any of the following, update the matching doc in the same PR:
- Product behaviour (Getting Started → relevant page).
- CLI surface (Advanced →
cli-reference). - Profile / override semantics (Advanced →
profiles-reference/overrides). - Permissions (Advanced →
permissions). - File locations (Advanced →
file-locations). - Architecture or build (Contributing →
architecture/build-from-source).
Engineering docs under KumoApp/docs/ also need updating when product
behaviour, architecture, persistence, permissions, testing expectations,
or UI information architecture meaningfully change.
Opening the PR
The PR description should answer:
- What changes? A one-paragraph summary.
- Why? Link to the issue, or describe the motivation if there isn't one.
- How was it tested? Test names, manual steps, before/after screenshots for UI changes.
- Any follow-ups? Things you noticed but deliberately scoped out.
Add screenshots for any visible change. For CLI changes, paste the new output. Reviewers should not have to run the branch to know what changed.
Review
What reviewers look for, in order:
- The diff matches the description. No surprise rewrites.
- The change respects the architecture invariants. Especially: CLI works without GUI, JSON is stable, dry-run exists.
- Tests fail without the fix.
- Errors are actionable. A new
error.codeshould tell the user what went wrong and what to try. - UI copy follows
AGENTS.md— concise, native controls, no redundant labels. - Docs ship with the change.
We'll comment in line and ask questions. A Changes requested review is
not a rejection — it is a step on the way to merge.
Merging
We squash-merge by default. Your final commit message will be the PR title plus the squash-summary body. Edit both before merge.
If a maintainer asks you to amend, please force-push to your branch
(git push --force-with-lease). We'd rather see a clean history than a
chain of "fix review", "fix review again" commits.
After merge, the change is in main. It ships in the next tagged
release. If the fix is urgent, you can build from main
yourself — see Build From Source.
Code of conduct
Be kind. Assume good intent. Give credit. If a conversation gets heated, walk away for an hour. Kumo is built by people who like building Kumo, and we want to keep it that way.