Thanks for your interest in improving artemisctl. This guide covers how to
report problems, propose changes, and get a pull request merged.
By participating you agree to keep the tone respectful and constructive — assume good faith, keep discussions technical, and help newcomers.
- Report a bug — open an issue with a clear reproduction.
- Request a feature — open an issue describing the use case before writing code, so we can agree on scope and design first.
- Improve docs — fixes to the README, this guide, or the design notes under
docs/design/are always welcome. - Send a pull request — bug fixes and features (see the workflow below).
If you are unsure whether a change is wanted, open an issue first. A small discussion up front is cheaper than a rejected pull request.
Search the existing issues first to avoid duplicates. A good bug report has:
- What you did — the exact
artemisctlcommand and flags. - What you expected vs what happened — include the full error output.
- Environment —
artemisctlversion (or commit), OS/arch, and the Artemis broker version you targeted. - A minimal reproduction — the smallest setup that still shows the problem.
For feature requests, describe the problem you are trying to solve, not just the solution you have in mind — it helps us find the best fit for the tool.
Please do not open a public issue for a security vulnerability. Report it privately to the maintainer (via the email on the GitHub profile, or a GitHub security advisory) so a fix can ship before disclosure.
You need Go (the version pinned in go.mod,
currently 1.25) and Docker running —
the integration tests boot a real Artemis broker via
Testcontainers, so Docker must be available.
git clone https://github.com/martikan/artemisctl.git
cd artemisctl
make build # compile to bin/artemisctl
make help # list every make target- Format with
gofmt— CI rejects any unformatted file.make testrunsgofmt -s -w .for you; you can also rungofmt -l .to list offenders. - Vet clean —
go vet ./...must pass (also part ofmake testand CI). - Match the surrounding code — naming, comment density, and idiom. Prefer small, focused functions and explain why in comments, not what.
- Keep changes focused — one logical change per pull request. Unrelated cleanups belong in their own PR.
make test # gofmt + go vet + the full suite (boots Artemis containers)
make coverage # same suite with -race + coverage, writes coverage.html- Add tests for every change. Bug fixes get a regression test; features get unit and/or integration coverage.
- Unit tests must not need a broker — they run under
go test -short. - Integration tests may boot a container; guard them with
if testing.Short() { t.Skip(...) }like the existing ones so-shortstays broker-free. - Coverage gate: CI enforces a project-wide 85% statement coverage
threshold (see
.github/workflows/quality-gate.yml). A pull request that drops coverage below the bar will fail. The workflow posts a coverage report as a PR comment.
- Use the imperative mood ("Add drain retry", not "Added" / "Adds").
- Keep the subject line short (≈50 chars) and lowercase-free of a trailing dot.
- Conventional Commits prefixes
(
feat:,fix:,docs:,test:,refactor:,chore:) are encouraged — they make history and release notes easier to read. - Explain the why in the body when it isn't obvious from the diff.
-
Fork the repo and create a topic branch off
main(git checkout -b fix/browse-offset). -
Make your change with tests, keeping the branch focused.
-
Run the gate locally before pushing:
gofmt -l . # must print nothing go vet ./... make coverage # tests pass, coverage stays >= 85%
-
Open the pull request against
main. Describe what changed and why, and link any related issue (Closes #123). -
Green CI is required. The
quality-gateworkflow runs lint, the full test suite, and the coverage check on every pull request. -
Address review feedback by pushing follow-up commits. A maintainer merges once CI is green and the review is resolved.
Keep pull requests small where you can — they are faster to review and safer to merge.
Releases are cut by maintainers by pushing a v* tag. That triggers the
ci-cd workflow, which produces
SLSA3 provenance-signed binaries on the GitHub Release and
pushes a container image to ghcr.io/martikan/artemisctl. Contributors do not
need to touch the release process.
Questions that don't fit an issue? Open a discussion or ask in the issue tracker. Thanks for contributing!