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" },