From 34812ca93238ee43ff48853b9354cbaefb15b73e Mon Sep 17 00:00:00 2001 From: scosman Date: Tue, 6 Oct 2026 17:18:34 +0000 Subject: [PATCH] Prepare the 0.5.0 release Bump the version to 0.5.0, the first real release on PyPI (0.0.1 is the name-reservation placeholder). A scaffold from `seahaven new` now pins `seahaven~=0.5`, which excludes the placeholder. Declare the MIT licence in the package metadata (PEP 639) so LICENSE ships in the wheel and sdist, and mark the package Alpha on Python 3.14. Remove the bundled docs' warnings that Seahaven is unpublished and must be installed from a checkout: they ship in the wheel and would be wrong the moment it is on PyPI. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01UkCSvbssGtXeqthAaZsmmt --- pyproject.toml | 8 ++++++-- src/seahaven/docs/authoring.md | 10 ---------- src/seahaven/docs/http_apis.md | 6 +++--- src/seahaven/docs/reference/cli.md | 8 +------- src/seahaven/docs/serving_and_openenv.md | 20 +++++++------------- uv.lock | 2 +- 6 files changed, 18 insertions(+), 36 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 75cb56f..c257d7e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,16 +8,20 @@ build-backend = "uv_build" [project] name = "seahaven" -version = "0.0.1" +version = "0.5.0" description = "Synthetic world framework for agent evals and RL." readme = "README.md" requires-python = ">=3.14" +license = "MIT" +license-files = ["LICENSE"] authors = [{ name = "Steve Cosman" }] keywords = ["ai", "agents", "rl", "evaluation", "environments", "simulation"] classifiers = [ - "Development Status :: 1 - Planning", + "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.14", "Topic :: Scientific/Engineering :: Artificial Intelligence", ] # Lower bounds are the versions this project is known to work on, not the diff --git a/src/seahaven/docs/authoring.md b/src/seahaven/docs/authoring.md index 5e7180c..bc69355 100644 --- a/src/seahaven/docs/authoring.md +++ b/src/seahaven/docs/authoring.md @@ -47,16 +47,6 @@ notes/ tests/test_fixtures.py # the fixture recipe above, run into a temporary directory ``` -**Before you run the `uv sync` that `seahaven new` prints as its next step:** while Seahaven is -unpublished, that step does not do what it looks like. A scaffold depends on `seahaven~=0.0`, and -that resolves to a placeholder release on PyPI which contains none of the framework. `uv sync` -succeeds, and the world then fails at import with `ModuleNotFoundError: No module named -'seahaven.world'`, raised by the scaffold's own `middleware/error_handler.py`, which says nothing -about where the package came from. `seahaven check` does not even start, because the placeholder -ships no console script. Install the framework from a checkout instead (`uv pip install -e -/path/to/Seahaven`, with `[serve]` if the world will be served), or work in an environment that -already has it. This paragraph disappears when Seahaven is published. - Three rules about the layout are worth stating now. **A world is a package**, never a directory loaded by path. The tooling finds a world by importing diff --git a/src/seahaven/docs/http_apis.md b/src/seahaven/docs/http_apis.md index fbc4724..20493f8 100644 --- a/src/seahaven/docs/http_apis.md +++ b/src/seahaven/docs/http_apis.md @@ -158,9 +158,9 @@ Seahaven adds nothing for this. It is a plain function call. ### Install the server The server needs Starlette and uvicorn, which the `serve` extra installs. -[Install the extra from a checkout](serving_and_openenv.md#install-the-serve-extra) until Seahaven -is published. Without it, `seahaven.http.app` and `serve` raise an `ImportError` that says so, and -`serve_http.py` prints the same message and exits 1. +[Install the extra](serving_and_openenv.md#install-the-serve-extra). Without it, +`seahaven.http.app` and `serve` raise an `ImportError` that says so, and `serve_http.py` prints the +same message and exits 1. ### The script diff --git a/src/seahaven/docs/reference/cli.md b/src/seahaven/docs/reference/cli.md index c2040a4..d144b4f 100644 --- a/src/seahaven/docs/reference/cli.md +++ b/src/seahaven/docs/reference/cli.md @@ -73,13 +73,7 @@ reaches the scaffolded `world.py` verbatim, so a world it cannot import is refus directory is written. A name whose package has the same name as a standard library module or `seahaven` is refused too, because Python imports that module instead of the world. -The command finishes by printing what to do next. While Seahaven is unpublished, the `uv sync` in -that list is a trap: the scaffold's `seahaven~=0.0` resolves to a placeholder release that contains -none of the framework, so the sync succeeds and the world fails at import with `ModuleNotFoundError: -No module named 'seahaven.world'`. `seahaven check` itself cannot start either, because the -placeholder ships no console script. Install the framework from a checkout until publication. The -same applies to `--hub`: the `Dockerfile` it writes runs `uv sync --extra serve`, which today builds -an image whose container cannot start. +The command finishes by printing what to do next. ## `seahaven check` diff --git a/src/seahaven/docs/serving_and_openenv.md b/src/seahaven/docs/serving_and_openenv.md index e0113af..4c7ae5a 100644 --- a/src/seahaven/docs/serving_and_openenv.md +++ b/src/seahaven/docs/serving_and_openenv.md @@ -44,11 +44,12 @@ The server and the client are in Seahaven's `serve` extra, because OpenEnv's dep large and a world used in process should not pay for it. The environment needs a final CPython 3.14 or newer, not a release candidate. -**Do not run `pip install "seahaven[serve]"`.** The framework is not published yet. The `seahaven` -name on PyPI currently holds a placeholder release that contains none of this and has no `serve` -extra, so that command succeeds and installs nothing useful, which is worse than failing. Until -publication, install the framework and its extra from a checkout of the Seahaven repository, for -example `uv pip install -e "/path/to/Seahaven[serve]"` into the environment your world runs in. +A world made by `seahaven new` has a `serve` extra that installs Seahaven's. Run `uv sync --extra +serve` in the world's directory. In any other project, add `seahaven[serve]` as a dependency: + +```sh +uv add "seahaven[serve]" +``` ### The app file @@ -554,12 +555,6 @@ root `Dockerfile`, a root `__init__.py`, `client.py` and `models.py`. It adds no world that does not publish to a hub carries none of them. `client.py` is a single re-export, because the typed client for every Seahaven world is `SeahavenClient`. -**That `Dockerfile` does not build a working image today.** Its build step is `RUN uv sync --extra -serve`, and the world's `serve` extra is `seahaven[serve]`, which resolves to the placeholder -release described at the top of this page. The image builds, and the container cannot start: there -is no `seahaven.openenv` in it. Until publication, an image has to get the framework from a checkout -or a private index, which means editing that `RUN` line. - **The image is a checkout, and has to stay one.** The generated `Dockerfile` does `COPY . /app` and then `uv sync`, so the container holds the world's whole directory with the framework installed into its environment. Replace those two lines with a plain install of the world and the image builds, the @@ -602,8 +597,7 @@ document and no control tool. Two steps run a world in a client: -1. `uv run --extra mcp seahaven mcp`, in the world's own directory ([from a checkout until - publication](#install-the-serve-extra)). +1. `uv run --extra mcp seahaven mcp`, in the world's own directory. 2. Give a client that same command. The `.mcp.json` below is the whole configuration: ```json diff --git a/uv.lock b/uv.lock index 363ee1e..5933b58 100644 --- a/uv.lock +++ b/uv.lock @@ -1828,7 +1828,7 @@ wheels = [ [[package]] name = "seahaven" -version = "0.0.1" +version = "0.5.0" source = { editable = "." } dependencies = [ { name = "apsw" },