Thank you for your interest in contributing! Whether it's a bug report, new feature, correction, or additional documentation, we greatly value feedback and contributions from our community.
Please read through this document before submitting any issues or pull requests to ensure we have all the necessary information to effectively respond to your bug report or contribution.
We welcome you to use GitHub Issues to report bugs or suggest features.
When filing an issue, please check existing issues first and try to include:
- A reproducible test case or series of steps
- The version of strands-compose being used
- Any modifications you've made relevant to the bug
- A minimal
config.yamlthat reproduces the issue
Looking at existing issues is a great way to find something to contribute. Before starting work:
- Check if someone is already assigned or working on it
- Comment on the issue to express your interest
- Wait for maintainer confirmation before beginning significant work
These principles guide every design decision in strands-compose. When contributing, please keep them in mind:
- Strands-first — if strands provides it, use it; don't wrap unnecessarily
- Composition over inheritance — small, focused components that compose
- Explicit over implicit — no auto-registration, no global singletons
- Single responsibility — each module does one thing
- Testable in isolation — no global state, unit-testable without other components
- Thin wrapper — translate YAML to Python objects, then get out of the way
- Python 3.11+
- uv package manager
- Git
git clone https://github.com/strands-compose/sdk-python
cd sdk-python
uv run just installThis installs all dependencies and wires the git hooks in one step. If you only want to (re-)install the hooks later:
uv run just install-hooksThree hook stages are registered automatically by just install-hooks:
| Stage | Triggered by | Runs |
|---|---|---|
pre-commit |
git commit |
ruff lint + format, file checks, detect-secrets |
pre-push |
git push |
same as above |
commit-msg |
git commit |
commitizen validates conventional commit format |
Note:
.git/hooks/is not tracked by git. Every fresh clone requires runninguv run just install-hooksonce.
uv run just check # format + lint + type check + security
uv run just test # pytest with coverage (≥70%)
uv run just format # auto-format with RuffAll coding standards — type annotations, docstrings, naming, module organization, testing, and security rules — are documented in AGENTS.md. This is the single source of truth for how code should be written in this project.
Contributions via pull requests are much appreciated. Before sending us a pull request, please ensure that:
- You are working against the latest source on the
mainbranch - You check existing open and recently merged pull requests to make sure someone else hasn't addressed the problem already
- You open an issue to discuss any significant work — we would hate for your time to be wasted
To send us a pull request:
- Create a branch from
main - Make your changes — focus on the specific contribution
- Run
uv run just check && uv run just test - Commit using Conventional Commits (
feat:,fix:,docs:,refactor:,test:,chore:) - Open a PR with a clear description of what and why
- Pay attention to any automated CI failures and stay involved in the conversation
- All checks pass (
uv run just check) - Tests pass with adequate coverage (
uv run just test) - New public APIs have docstrings and tests
- No hardcoded secrets or credentials
- Changes are focused — one concern per PR
If you discover a potential security issue in this project we ask that you notify us via GitHub Security Advisories. Please do not create a public GitHub issue.
See the LICENSE file for our project's licensing. We will ask you to confirm the licensing of your contribution.