Contributing to Vens
July 22, 2026 · View on GitHub
Thank you for your interest in contributing to Vens! This guide tells you exactly what to expect from the review process, the coding standards we enforce, and how to get a first PR landed.
Ways to contribute
- Good first issues — look for the
good first issuelabel on the issue tracker. If the label list is empty or you have something else in mind, open aQuestionissue first and we'll help you scope it. - Bug reports — use the issue tracker with clear reproduction steps, the command line you ran, your
vens --version, and (if possible) redacted--debug-diroutput. - Documentation — doc-only PRs are welcome and land fast. Start with
docs/andmkdocs.yml. - New features / scanners / LLM providers — please open an issue first so we can agree on scope before you write the code.
- Security reports — please follow SECURITY.md; do not open public issues for vulnerabilities.
Development setup
Prerequisites:
- Go (see
go.modfor the minimum version; Vens pins viago.mod'sgodirective) makegolangci-lint(for linting — installed by the lint target on first run)- Trivy or Grype for generating local test inputs
git clone https://github.com/YOUR_USERNAME/vens.git
cd vens
# Download deps
go mod download
# Build the binary (outputs to _output/bin/)
make binaries
# Run the full test suite
make test
# Run the linter
make lint
Code style
- Go formatting — everything must pass
gofmt -sandgoimports. The Makefile targetmake fmtdoes both; run it before submitting a change. - Linting —
make lintruns golangci-lint, pinned viaGOLANGCI_VERSIONin the Makefile (the single source of truth for the linter version). Fix or justify every finding before asking for review. - Package layout — follow the structure already in
pkg/andcmd/vens/commands/. New LLM providers live underpkg/llm/, new scanners underpkg/scanner/, new output formats underpkg/outputhandler/. - Error wrapping — wrap with
fmt.Errorf("context: %w", err)so error chains stay inspectable. Do not discard errors silently. - Logging — use
log/slogwith the keyed form (slog.InfoContext(ctx, "message", "key", value)), neverlog.Printf. - Context propagation — plumb
context.Contextthrough any function that does I/O or calls the LLM. - No breaking config changes without an issue first —
config.yamlis a user-facing contract.
Tests
- Unit tests live next to the code they test, in
_test.gofiles. - End-to-end tests for the
vensCLI live undercmd/vens/testdata/script/asrsc.io/scriptscenarios. They use a mock LLM (internal/testutil/mockllm) so they run offline and deterministically. Add one scenario per CLI-visible behaviour change. - Run the whole suite with
make testbefore you open a PR. CI runs the same command. - Integration tests against real LLM providers are not required (and not recommended) for contributions — the mock LLM is the test contract.
Commit and PR style
- One logical change per commit. Squash noise before opening a PR (rebase interactively if needed).
- Commit messages use conventional-commits style when possible (
feat(...),fix(...),docs(...),build(deps): ...). Thegit logof the project is a good reference for tone. - PR titles under 72 characters. Use the body to describe intent, trade-offs and testing.
- Link the issue the PR addresses with
Fixes #NNNorRefs #NNN. - Mark the PR as draft until CI is green and you're ready for review.
Review process
- PRs are reviewed by the
venslabs/vensmaintainers. Expect a first response within a few working days. - We may ask you to split a PR if it bundles unrelated changes, or to open a design issue before we merge a larger change.
- Dependabot PRs are rebased and merged automatically once CI passes; human PRs always get at least one manual review.
- After approval, maintainers merge. We prefer squash-merge so
mainstays linear.
What's inspired this project
Vens' prompt structure and output-handler pattern are adapted from AkihiroSuda/vexllm. Credit is also preserved in the code comments of the relevant files. If you work on the prompt or the output pipeline, please keep those references up to date.
License
By contributing, you agree that your contributions will be licensed under the Apache License 2.0.