# Enterprise (EE) Development

## File Conventions

- Enterprise files use the `*_ee.rs` suffix
- Source lives in `windmill-ee-private` (sibling repo), symlinked into each crate's `src/`
- `_ee.rs` files are gitignored in the main windmill repo — tracked only in `windmill-ee-private`
- Use feature flags: `#[cfg(feature = "enterprise")]` for enterprise logic
- The `private` feature flag gates compilation of `*_ee.rs` files
- The `license` feature flag gates features that require a valid license key at runtime
- Isolate enterprise code in separate modules

## Finding the EE Repo

- Standard location: `~/windmill-ee-private`
- Worktree location: `~/windmill-ee-private__worktrees/<branch-name>/`

## Detecting EE Changes

The `*_ee.rs` files in the windmill repo are symlinks — changes won't appear in `git diff` of the windmill repo. Check the EE repo directly: `git -C <ee-path> status --short`

## EE PR Workflow (MUST DO whenever the change has an EE companion PR)

If your work requires any change in `windmill-ee-private` (modifying `*_ee.rs`
files, adding new ones, adjusting EE-only modules, etc.) — i.e. you need to
open a companion PR on `windmill-ee-private` — then the windmill (OSS) PR
counts as an EE PR even when its own `git diff` only touches
`backend/ee-repo-ref.txt`. The symlinked `*_ee.rs` files won't appear in the
OSS diff, but the OSS build pulls them in via the EE ref, so reviewers need
to know.

1. **Prefix the windmill PR title** with `[ee]`: `[ee] <type>: <description>`
2. **Create a matching branch** in `windmill-ee-private` (same branch name)
3. **Commit and push** the `_ee.rs` changes in that branch
4. **Create a companion PR** on `windmill-ee-private` with a link to the windmill PR (no `[ee]` prefix on this one)
5. **Update `ee-repo-ref.txt`**: Run `bash write_latest_ee_ref.sh` from `backend/`
   - **Verify** it wrote the correct commit hash from your branch, not from main (the script may fall back to `~/windmill-ee-private` on main)
   - If wrong, manually write the correct hash
6. **Commit `ee-repo-ref.txt`** in the windmill repo so CI picks up the correct EE ref

## Validation

```bash
# EE code (always include private to compile *_ee.rs files)
cargo check --features enterprise,private

# EE code that also requires license validation
cargo check --features enterprise,private,license
```

## Troubleshooting

**`E0583: file not found for module <x>_ee` on `cargo check --features enterprise,private`**:
the EE worktree is behind the OSS code it must satisfy. Fast-forward it to EE
`origin/main` — EE worktrees are shallow clones, so run `git fetch --unshallow origin`
first or the merge fails with "refusing to merge unrelated histories". After the
fast-forward, any `*_ee.rs` file that is *new* since the worktree was created still
needs its OSS symlink made by hand (worktree setup only links files that existed then).
The EE repo has no `backend/` prefix — crates sit at its root. Use an absolute target
(a relative one would resolve against the link's directory, not your cwd):

```bash
# from the windmill repo root
ln -s ~/windmill-ee-private/<crate>/src/<x>_ee.rs backend/<crate>/src/<x>_ee.rs
```
