Thank you for your interest in contributing to Godspeed! This guide will help you get started.
-
Fork and clone the repository:
gh repo fork t-timms/godspeed-coding-agent --clone cd godspeed -
Create a virtual environment and install dependencies:
uv sync --all-extras
-
Install pre-commit hooks:
pre-commit install
-
Run tests to verify your setup:
uv run pytest --cov
-
Create a branch from
main:git checkout -b feat/your-feature-name
-
Make your changes following the code standards below.
-
Run the full check suite:
uv run ruff check . --fix && uv run ruff format . # lint + format uv run ty check src/ # type check uv run pip-audit --ignore-vuln CVE-2026-28684 --ignore-vuln CVE-2026-3219 # security scan uv run bandit -r src/ -ll # static analysis uv run pytest --cov # tests + coverage
-
Commit using Conventional Commits:
git commit -m "feat: add new tool for X" -
Push and open a PR:
git push -u origin feat/your-feature-name gh pr create
- Type hints on all public functions (
from __future__ import annotations) - No
print()in production — uselogging.getLogger(__name__) - Specific exceptions — never bare
except: - Ruff for linting and formatting (line length 100)
- Tests for every new feature, especially security-related code
Security is Godspeed's core differentiator. If you're contributing to the security module:
- Every dangerous command pattern needs a test
- Every secret detection pattern needs a test with real-world examples
- Permission engine changes need edge case tests
- Audit trail changes must maintain hash chain integrity
Godspeed follows Semantic Versioning under a strict interpretation, because the version number is a signal to users about stability and to reviewers about project maturity. Inflated versions damage both.
| Bump | When | Evidence required in PR |
|---|---|---|
Patch (2.4.0 → 2.4.1) |
Bug fix, dependency refresh, documentation, internal refactor | Linked issue or CHANGELOG entry under Fixed |
Minor (2.4.0 → 2.5.0) |
New user-facing capability added without breaking existing usage | New CLI command / tool / configuration field documented in README or CHANGELOG under Added |
Major (2.x.y → 3.0.0) |
A breaking change to a documented public API or CLI surface | Breaking-change note in CHANGELOG under Changed with migration guidance, AND the PR description states the break explicitly |
A release with no user-observable change must not bump any digit. Lockfile refreshes, CI tweaks, and internal hardening go out as patch releases at most, and usually ride the next feature release.
Version numbers are a conversation with your users. A project that ships v2.x
after 5 days implies stability guarantees it cannot keep, and a reviewer seeing
13 releases in a week will read that as version-number inflation, not momentum.
For comparison: the `Development Status :: 3 - Alpha` classifier in
`pyproject.toml` says "breaking changes are expected" — which is incompatible
with shipping major versions as fast as we can open PRs.
Checklist before bumping the major digit:
- Is there a documented public API or CLI that this PR changes in a way users must adapt to?
- Is the breaking change called out in the CHANGELOG under Changed with migration guidance?
- Has the
Development Statusclassifier graduated past Alpha? If no, reconsider.
If any answer is "no," bump minor or patch.
See SECURITY.md for our vulnerability disclosure policy.