Thanks for your interest in improving the JointFM Python SDK. This repository
ships the public jointfm-client package on PyPI, so every change is shipped to
external users — please read this guide before opening a pull request.
- The SDK is licensed under Apache-2.0. By contributing, you agree that your contribution is licensed under the same terms (inbound = outbound).
- Follow the project rules in AGENTS.md. They take precedence over anything stated here.
- Be respectful in issues, reviews, and discussions.
- Bugs and feature requests: open a GitHub issue at
datarobot/joint-client-python
with a minimal reproduction, the SDK version (
uv run python -c "import jointfm_client; print(jointfm_client.__version__)"), and the Python version. - Security issues: do not open a public issue. Follow the disclosure process in SECURITY.md (if present) or email the DataRobot security team directly.
curl -LsSf https://astral.sh/uv/install.sh | sh
sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b ~/.local/bin
task setuptask setup creates .venv, installs dev dependencies, registers pre-commit
hooks (including the commit-msg hook), and ensures typos is available.
Supported development platforms: Ubuntu, AWS Linux, and macOS. Windows is not supported for development; do not add Windows-specific code paths.
| Command | Purpose |
|---|---|
task lint |
Ruff lint (read-only) |
task format |
Ruff format (rewrites files) |
task typecheck |
ty static type check |
task test |
Unit test suite |
task coverage |
Tests with coverage floor enforcement |
task check |
Read-only static gates (typos, lint, format check, typecheck) |
task pre-commit |
Run every pre-commit hook on all files |
task build |
Build the sdist + wheel and validate metadata |
You must run task pre-commit and fix every reported issue before reporting a
change as done. After it succeeds, review the resulting diff and explain why
each hunk is necessary in the pull request.
- Fork the repository (or branch directly if you are a DataRobot maintainer).
- Create a feature branch off
mainwith a descriptive name. - Make focused commits that pass
task pre-commitlocally. - Open a pull request against
main. Describe what changed, why, and how you verified it. - Keep pull requests small and reviewable. Refactors, formatting-only changes, and behavior changes should be separate commits and ideally separate pull requests.
Every commit subject must follow Conventional Commits:
<type>(<optional scope>): <imperative summary>
See the Versioning & Commits section of README.md for the
full list of accepted types, when each one triggers a SemVer bump, and how
to mark breaking changes. The commit-msg pre-commit hook runs cz check
and rejects malformed messages locally.
The SDK's public surface is everything re-exported from
src/jointfm_client/__init__.py. Names that
start with an underscore are implementation details.
- Adding to
__all__is afeat. - Removing from
__all__, renaming an exported name, or changing the shape of a public class, function, or exception is a breaking change. Use the Conventional Commits!marker or aBREAKING CHANGE:footer. - The wire contract pinned by
schema_versionis owned by the JointFM service team. Do not change the request or response shape unilaterally. - New public exports must also be documented in docs/api-reference.md in the same change.
- Add or update tests for every behavior change. The pre-commit gate enforces a coverage floor; uncovered new code will fail the gate.
- Tests must be fast. The live DataRobot smoke test (tests/test_live_smoke.py) is gated by environment variables and skipped by default.
Releases are cut by maintainers using Commitizen. See the Cutting a release
section of README.md. Do not hand-edit the version = line in
pyproject.toml, __version__ in src/jointfm_client/__init__.py, or the
"Current SDK package version" line in README.md — those are owned by
cz bump.
Never run destructive git operations unless a maintainer explicitly asks for
that specific command — no git push --force, no git reset --hard, no
history rewrites, no --no-verify to bypass hooks, and no discarding of
uncommitted work.