e923b9b2

Your first flake

Adds a `flake.nix` so the project can be built, tested and checked with Nix (and run on NixCI).

It provides:

* `packages.default` — builds the dspy wheel (`python -m build`).
* `packages.test-env` — the full test virtualenv, resolved from `uv.lock` via uv2nix.
* `devShells.default` — python + uv + ruff + pre-commit development environment.
* `checks` — the package, the devShell, a ruff lint gate mirroring the existing CI,
  and **`pytest`, which runs the offline test suite (984 tests) entirely inside `nix build`**.
* `packages.impure-test` + `nix-ci.nix` — runs the *full* suite (991 tests, including
  the few that fetch real URLs) as a NixCI impure `test` job.

`nix flake check` builds every package/devShell and runs the offline test suite.

Suite timing

Time to Start Worker time Duration Time to finish Idle
Config 16s 7s 7s 23s 16s
Eval 23s 23s 23s 47s 0s
Build 6m02s 27m35s 27m35s 33m38s 5m16s
Test 33m36s 26m32s 26m32s 1h00m09s 0s
Suite 16s 54m39s 59m53s 1h00m09s 5m32s

Timeline

0s7m8m9m10m11m12m13m14m15m16m17m18m19m20m21m22m23m24m25m26m27m28m29m30m31m32m33m34m35m36m37m38m39m40m41m42m43m44m45m46m47m48m49m50m51m52m53m54m55m56m57m58m59m1h0m