Skip to content

Contributing

Rocky is a monorepo with four subprojects:

rocky-data/
├── engine/ # Rust CLI + engine (23-crate Cargo workspace)
├── integrations/dagster/ # dagster-rocky Python package
├── editors/vscode/ # VS Code extension (LSP client)
├── examples/playground/ # POC catalog + benchmarks
├── docs/ # Documentation site (Astro + Starlight)
├── justfile # Cross-project build orchestration
└── CLAUDE.md # Monorepo conventions

For the full crate-level breakdown of engine/, see Architecture.

Terminal window
git clone https://github.com/rocky-data/rocky.git
cd rocky/engine
# Build
cargo build
cargo build --release
# Run tests
cargo test
# Lint
cargo clippy -- -D warnings
cargo fmt -- --check
Terminal window
cd rocky-data/integrations/dagster
# Install with dev dependencies
uv sync --dev
# Run tests
uv run pytest -v
# Lint
uv run ruff check
uv run ruff format --check
Terminal window
cd rocky-data/editors/vscode
# Install dependencies
npm install
# Compile
npm run compile
# Run tests
npm test

The top-level justfile orchestrates common tasks across all subprojects:

Terminal window
just build # cargo build --release + uv build --wheel + npm compile
just test # cargo test + pytest + vitest
just lint # cargo clippy/fmt + ruff + eslint
just codegen # Export JSON schemas + regenerate Pydantic/TS bindings
just --list # All recipes
  • Edition: 2024 (MSRV 1.88)
  • Error handling: thiserror for library errors, anyhow for binary/CLI errors
  • Logging: tracing crate (not println!)
  • SQL safety: All identifiers validated via rocky-sql/validation.rs before interpolation
  • Tests: In the same file (#[cfg(test)] mod tests)
  • Public types: Must derive Debug, Clone, Serialize, Deserialize where applicable
  • Target Python 3.10+
  • Type annotations required (use modern syntax: list[str], X | None)
  • Use ruff for linting and formatting
  • Strict mode enabled
  • ESLint + Prettier formatting
  • Use conventional commits: feat:, fix:, refactor:, test:, docs:, chore:
  • Scope by subproject or crate: feat(engine/rocky-databricks): add OAuth M2M auth, fix(dagster): handle partial-success exit codes, chore(vscode): bump vscode-languageclient
  • Never include Co-Authored-By trailers

When modifying the CLI’s JSON output schema:

  1. Edit the relevant *Output struct in engine/crates/rocky-cli/src/output.rs
  2. Run just codegen from the monorepo root to regenerate bindings
  3. Commit the schema and regenerated bindings together with the Rust change

The codegen-drift CI workflow fails any PR where the committed bindings drift from what just codegen produces locally.

When modifying Rocky DSL syntax (.rocky files):

  1. engine/crates/rocky-lang/ (parser + lexer)
  2. engine/crates/rocky-compiler/ (type checking)
  3. editors/vscode/syntaxes/rocky.tmLanguage.json (TextMate grammar)
  4. editors/vscode/snippets/rocky.json (snippets)
Terminal window
# Engine — all tests
cargo test
# Engine — single crate
cargo test -p rocky-core
# Engine — E2E integration tests (DuckDB, no credentials)
cargo test -p rocky-core --test e2e
# Engine — with output
cargo test -- --nocapture
# Dagster integration
cd integrations/dagster && uv run pytest -v
# VS Code extension
cd editors/vscode && npm test

.github/workflows/ contains path-filtered workflows:

WorkflowTriggerWhat it does
engine-ci.ymlengine/** changesTests, clippy, fmt
engine-weekly.ymlMonday schedule + manualCoverage (tarpaulin) + security audit
engine-release.ymlengine-v* tagFull 5-target matrix (macOS, Linux, Windows)
engine-bench.ymlPRs labeled perfBenchmark with 120% alert threshold
dagster-ci.ymlintegrations/dagster/** changespytest + ruff
dagster-release.ymldagster-v* tagPyPI publish via OIDC
vscode-ci.ymleditors/vscode/** changesnpm test + eslint
vscode-release.ymlvscode-v* tagVS Code Marketplace publish
codegen-drift.ymlAny subprojectValidates committed bindings match just codegen output
integration-ci.yml2+ subprojects touchedCross-project integration tests

Tag-namespaced — each artifact ships independently. All three are CI-driven: land a release PR (version bump + CHANGELOG entry), tag the merged commit, push the tag.

ArtifactTagWorkflow
Rocky CLI binaryengine-v*engine-release.yml — 5-target matrix (macOS ARM64/Intel, Linux x86_64/ARM64, Windows)
dagster-rocky wheeldagster-v*dagster-release.yml — PyPI publish via OIDC
Rocky VSIXvscode-v*vscode-release.yml — VS Code Marketplace publish
Terminal window
git tag engine-v<version>
git push origin engine-v<version> # CI builds + publishes

The scripts/release.sh helper remains as a local-build fallback for hotfix scenarios; just release-engine <version>, just release-dagster <version> [--publish], and just release-vscode <version> [--publish] wrap it.