Contributing
Monorepo Structure
Section titled “Monorepo Structure”Rocky is a monorepo with four subprojects:
rocky-data/├── engine/ # Rust CLI + engine (20-crate Cargo workspace)│ ├── Cargo.toml│ ├── crates/│ │ ├── rocky-core/ # Generic transformation engine│ │ ├── rocky-sql/ # SQL parsing + validation│ │ ├── rocky-lang/ # Rocky DSL parser (.rocky files)│ │ ├── rocky-compiler/ # Type checking + semantic analysis│ │ ├── rocky-adapter-sdk/ # Adapter SDK + conformance tests│ │ ├── rocky-databricks/ # Databricks adapter│ │ ├── rocky-snowflake/ # Snowflake adapter│ │ ├── rocky-fivetran/ # Fivetran source adapter│ │ ├── rocky-duckdb/ # DuckDB local execution│ │ ├── rocky-engine/ # Local query engine (DataFusion + Arrow)│ │ ├── rocky-server/ # HTTP API + LSP server│ │ ├── rocky-cache/ # Three-tier caching│ │ ├── rocky-ai/ # AI intent layer│ │ ├── rocky-observe/ # Observability│ │ └── rocky-cli/ # CLI framework + Dagster Pipes│ └── rocky/ # Binary crate├── integrations/dagster/ # dagster-rocky Python package├── editors/vscode/ # VS Code extension (LSP client)├── examples/playground/ # POC catalog (28 POCs) + benchmarks├── docs/ # This documentation site (Astro + Starlight)├── justfile # Cross-project build orchestration└── CLAUDE.md # Monorepo conventionsDevelopment Setup
Section titled “Development Setup”Rocky Engine (Rust)
Section titled “Rocky Engine (Rust)”git clone https://github.com/rocky-data/rocky.gitcd rocky/engine
# Buildcargo buildcargo build --release
# Run testscargo test
# Lintcargo clippy -- -D warningscargo fmt -- --checkdagster-rocky (Python)
Section titled “dagster-rocky (Python)”cd rocky-data/integrations/dagster
# Install with dev dependenciesuv sync --dev
# Run testsuv run pytest -v
# Lintuv run ruff checkuv run ruff format --checkVS Code Extension (TypeScript)
Section titled “VS Code Extension (TypeScript)”cd rocky-data/editors/vscode
# Install dependenciesnpm install
# Compilenpm run compile
# Run testsnpm testBuild Orchestration
Section titled “Build Orchestration”The top-level justfile orchestrates common tasks across all subprojects:
just build # cargo build --release + uv build --wheel + npm compilejust test # cargo test + pytest + vitestjust lint # cargo clippy/fmt + ruff + eslintjust codegen # Export JSON schemas + regenerate Pydantic/TS bindingsjust --list # All recipesCoding Standards
Section titled “Coding Standards”- Edition: 2024 (MSRV 1.85)
- Error handling:
thiserrorfor library errors,anyhowfor binary/CLI errors - Logging:
tracingcrate (notprintln!) - SQL safety: All identifiers validated via
rocky-sql/validation.rsbefore interpolation - Tests: In the same file (
#[cfg(test)] mod tests) - Public types: Must derive
Debug,Clone,Serialize,Deserializewhere applicable
Python
Section titled “Python”- Target Python 3.10+
- Type annotations required (use modern syntax:
list[str],X | None) - Use
rufffor linting and formatting
TypeScript
Section titled “TypeScript”- Strict mode enabled
- ESLint + Prettier formatting
Git Conventions
Section titled “Git Conventions”- 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-Bytrailers
Cross-Project Changes
Section titled “Cross-Project Changes”When modifying the CLI’s JSON output schema:
- Edit the relevant
*Outputstruct inengine/crates/rocky-cli/src/output.rs - Run
just codegenfrom the monorepo root to regenerate bindings - 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):
engine/crates/rocky-lang/(parser + lexer)engine/crates/rocky-compiler/(type checking)editors/vscode/syntaxes/rocky.tmLanguage.json(TextMate grammar)editors/vscode/snippets/rocky.json(snippets)
Testing
Section titled “Testing”# Engine — all testscargo test
# Engine — single cratecargo test -p rocky-core
# Engine — E2E integration tests (DuckDB, no credentials)cargo test -p rocky-core --test e2e
# Engine — with outputcargo test -- --nocapture
# Dagster integrationcd integrations/dagster && uv run pytest -v
# VS Code extensioncd editors/vscode && npm test.github/workflows/ contains path-filtered workflows:
| Workflow | Trigger | What it does |
|---|---|---|
engine-ci.yml | engine/** changes | Tests, clippy, fmt |
engine-weekly.yml | Monday schedule + manual | Coverage (tarpaulin) + security audit |
engine-release.yml | engine-v* tag | Full 5-target matrix (macOS, Linux, Windows) |
engine-bench.yml | PRs labeled perf | Benchmark with 120% alert threshold |
dagster-ci.yml | integrations/dagster/** changes | pytest + ruff |
dagster-release.yml | dagster-v* tag | PyPI publish via OIDC |
vscode-ci.yml | editors/vscode/** changes | npm test + eslint |
vscode-release.yml | vscode-v* tag | VS Code Marketplace publish |
codegen-drift.yml | Any subproject | Validates committed bindings match just codegen output |
integration-ci.yml | 2+ subprojects touched | Cross-project integration tests |
Releases
Section titled “Releases”Tag-namespaced — each artifact ships independently. Engine releases build all platforms in CI via engine-release.yml on tag push. scripts/release.sh is a local-build fallback:
./scripts/release.sh engine 0.2.0 # local fallback (macOS + Linux)./scripts/release.sh dagster 0.4.0 --publish # wheel + PyPI./scripts/release.sh vscode 0.3.0 --publish # VSIX + MarketplaceOr via just release-engine <version>, just release-dagster <version> [--publish], just release-vscode <version> [--publish].