Skip to content

Contributing

Yasunobu edited this page Jun 26, 2026 · 1 revision

Contributing

Thanks for your interest! This page covers the workflow and the quality bar a change must clear. KeepPressing is licensed under Apache-2.0; contributions are accepted under the same license.

Branch & PR workflow

  • main is protected. Direct pushes are not allowed — all changes land via pull request, and CI must be green before merge.
  • Branch off main, make your change, open a PR against main.
  • The PR template asks for a summary, the change details, a verification checklist, and any related issue. Fill it in.
  • Opening an issue first (with the Bug report or Feature request template) is appreciated for anything non-trivial.

The bar your PR must clear

Run these locally before pushing — they're exactly what CI runs (see CI/CD):

just build   # Debug build; warnings are errors — analyzer/style warnings fail
just test    # all unit tests must pass
  • Warnings are errors in Debug. Don't suppress warnings to get green; fix them. (See the code-quality regime in Building & Tasks.)
  • Keep Win32 out of Core. Anything OS-touching belongs in KeepPressing/Interop/ behind an interface; KeepPressing.Core stays pure. See Architecture.
  • Core stays ConfigureAwait(false)-clean (CA2007 is an error there) for the reasons in Threading & ConfigureAwait.
  • Add/maintain tests. New domain behavior → KeepPressing.Core.Tests; ViewModel/presentation behavior → KeepPressing.App.Tests. See Testing Strategy.

Commit messages

Follow the existing conventional-commit style. Dependency bots already use:

  • chore(deps): … — NuGet updates
  • chore(ci): … — GitHub Actions updates

Use matching, descriptive prefixes (feat:, fix:, docs:, refactor:, test:, …). Clear messages feed the auto-generated release notes (Release Process).

Coding conventions

  • Nullable reference types and implicit usings are on solution-wide (Directory.Build.props).
  • .editorconfig (root) defines formatting (UTF-8, final newline, trimmed trailing whitespace, indent sizes) and excludes generated code from analysis. EnforceCodeStyleInBuild means style is checked at build time.
  • Match the surrounding code: the codebase favors closed ADTs, a single side-effect boundary, and a single source of truth for UI option lists.

Local development

See Development Setup for installing mise + the pinned toolchain, and Building & Tasks for the full recipe list.


Related: Development Setup · CI/CD · Testing Strategy

Clone this wiki locally