Thank you for your interest in contributing!
| Tool | Purpose |
|---|---|
| Go ≥ 1.22 | Operator development |
| uv | Python plugin development |
| kubectl | Cluster interaction |
| kind | Local Kubernetes cluster for e2e tests |
| golangci-lint | Go linting |
| Command | What it does |
|---|---|
make test |
Run unit tests with coverage |
make test-e2e |
Run e2e tests on a Kind cluster (creates + tears down automatically) |
make fmt |
Run go fmt |
make vet |
Run go vet |
make lint |
Run golangci-lint |
make lint-fix |
Auto-fix lint issues |
make build |
Build manager binary to bin/manager |
make manifests |
Regenerate CRD YAML and RBAC from type definitions |
make generate |
Regenerate DeepCopy methods |
make build-installer |
Regenerate deploy/install.yaml |
make run |
Run controller locally against current kubeconfig |
# Run a single test
go test ./internal/controller/... -run TestReconcile -v
# Run unit tests only (skip e2e)
make testImportant: After modifying types in api/v1alpha1/, always run make manifests && make generate and commit the generated files.
cd plugin
uv sync --dev
# Run all tests
uv run pytest tests -v
# Run a single test file
uv run pytest tests/test_deploy.py -v
# Type checking
uv run ty check kubectl_marimoInstall once, then hooks run automatically on git commit:
pip install pre-commit
pre-commit installRun manually against all files:
pre-commit run --all-filesmarimo-operator/
├── api/v1alpha1/ # CRD type definitions (edit here, then make manifests)
├── internal/controller/ # Reconciliation logic
├── pkg/resources/ # Pod, Service, PVC, ConfigMap builders
├── pkg/config/ # Configurable default images
├── config/ # Kustomize overlays (CRD, RBAC, manager)
├── deploy/ # Generated install.yaml (do not edit by hand)
├── test/e2e/ # E2E tests (Ginkgo)
├── plugin/ # kubectl-marimo Python plugin
│ ├── kubectl_marimo/ # CLI source
│ └── tests/ # Plugin unit tests
└── examples/ # Example deployments
- Fork the repo and create a branch from
main. - Make your changes and add tests for new behavior.
- Ensure
make lintandmake testpass (operator) anduv run pytestpasses (plugin). - If you modified CRD types, run
make manifestsand commit generated files. - Open a PR — the template will guide you through the checklist.
Every bug fix should include a regression test that fails before the fix and passes after.
Releases are for maintainers only. Tags trigger the publish workflow which builds and pushes the operator image and publishes the plugin to PyPI.