diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 43f6109..784bcfb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,6 +24,7 @@ on: - "server.json" - "smithery.yaml" - "scripts/check_release_artifacts.py" + - "scripts/check_dist.py" - ".github/workflows/release.yml" concurrency: @@ -52,7 +53,9 @@ jobs: - name: Build sdist + wheel run: python -m build - name: License / package-boundary check on built archives - run: python scripts/check_release_artifacts.py dist + run: | + python scripts/check_release_artifacts.py dist + python scripts/check_dist.py dist/* - name: twine check run: twine check dist/* - name: Validate server.json against the MCP registry schema diff --git a/README.md b/README.md index 23f47c6..148524b 100644 --- a/README.md +++ b/README.md @@ -26,12 +26,10 @@ as a fabricated success. ## Install ```bash -# v2 is not yet published; install the current source: -pip install git+https://github.com/OpenAdaptAI/openadapt-agent +pip install openadapt-agent ``` -Once published, run it without installing — the intended MCP-client entry -point: +Or run it without installing — the intended MCP-client entry point: ```bash uvx openadapt-agent serve --bundles /path/to/bundles # read-only @@ -250,11 +248,11 @@ See [docs/DESIGN.md](docs/DESIGN.md) for the complete contract. ## Package history -The pre-v2 package was a wrapper for model-driven GUI agents. Its -execution responsibilities now live in `openadapt-flow`; the final -legacy release remains available as `openadapt-agent==0.1.0`. The -current package name is retained because this repository bridges both -MCP and Agent Skills; it is not an MCP-only package. +The pre-v2 codebase was a wrapper for model-driven GUI agents. Its +execution responsibilities now live in `openadapt-flow`; its source +history remains in this repository. The current package name is retained +because this repository bridges both MCP and Agent Skills; it is not an +MCP-only package. ## Install as an MCP server (registries) diff --git a/docs/DISTRIBUTION.md b/docs/DISTRIBUTION.md index 647c699..fd7d874 100644 --- a/docs/DISTRIBUTION.md +++ b/docs/DISTRIBUTION.md @@ -55,7 +55,7 @@ and [`../smithery.yaml`](../smithery.yaml). - **Name (reverse-DNS, official registry):** `io.github.OpenAdaptAI/openadapt-agent` - **Display name:** OpenAdapt Agent (openadapt-flow bridge) - **PyPI package:** `openadapt-agent` -- **Version:** `2.0.0.dev0` (Beta development release; pick the final release version at publish — see step 3.1) +- **Version:** `2.0.0` (Beta) - **Description:** Local Beta bridge for governed openadapt-flow workflows and attended actions. - **Homepage / docs:** https://docs.openadapt.ai - **Repository:** https://github.com/OpenAdaptAI/openadapt-agent @@ -139,14 +139,12 @@ No secret is ever committed; these live only in repo Settings -> Secrets. ### 3.1 Decide the release version -`2.0.0.dev0` is a dev pre-release; `pip install openadapt-agent` will not -select it without `--pre`. For a real launch choose one of: -- `2.0.0rc1` (recommended first public: pre-release, opt-in via `--pre`), or -- `2.0.0` (final; remove development-release caveats only when the evidence supports it). +The first public release is `2.0.0`. Future releases must keep the package, +module, and registry metadata versions synchronized. -Whatever you choose, set it in **three places that a CI test pins -together**: `pyproject.toml` `version`, `src/openadapt_agent/__init__.py` -`__version__`, and both `version` fields in `server.json`. The +Set every future version in **three places that a CI test pins together**: +`pyproject.toml` `version`, `src/openadapt_agent/__init__.py` `__version__`, +and both `version` fields in `server.json`. The `tests/test_distribution.py` guard fails if they drift. ### 3.2 Publish to PyPI — AUTOMATED (`pypi-publish` job) diff --git a/llms.txt b/llms.txt index ef7f02f..0e14064 100644 --- a/llms.txt +++ b/llms.txt @@ -26,7 +26,7 @@ All mutations require an exact capability digest, a stable idempotency key, acti ## Public capability vs private artifact -- The **package/MCP server is the public OpenAdapt capability**: inspect and, with explicit operator flags, run or attend a compiled workflow under governance. The v2 package is not yet published. +- The **package/MCP server is the public OpenAdapt capability**: inspect and, with explicit operator flags, run or attend a compiled workflow under governance. Install it from PyPI as `openadapt-agent`. - A user's **compiled workflow bundle is their private artifact**. It is supplied at server start via `--bundles` and is never embedded in the package, the `server.json`, or any registry listing. ## Key documents diff --git a/pyproject.toml b/pyproject.toml index 6184479..0929e05 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "openadapt-agent" -version = "2.0.0.dev0" +version = "2.0.0" description = "Local agent bridge for governed OpenAdapt workflows, attended actions, MCP, and Agent Skills" readme = "README.md" # openadapt-flow pins <3.13 (rapidocr-onnxruntime); this package inherits it. diff --git a/server.json b/server.json index c64b33f..65250df 100644 --- a/server.json +++ b/server.json @@ -8,13 +8,13 @@ "url": "https://github.com/OpenAdaptAI/openadapt-agent", "source": "github" }, - "version": "2.0.0.dev0", + "version": "2.0.0", "packages": [ { "registryType": "pypi", "registryBaseUrl": "https://pypi.org", "identifier": "openadapt-agent", - "version": "2.0.0.dev0", + "version": "2.0.0", "runtimeHint": "uvx", "transport": { "type": "stdio" diff --git a/src/openadapt_agent/__init__.py b/src/openadapt_agent/__init__.py index b3cc2d5..0b23e70 100644 --- a/src/openadapt_agent/__init__.py +++ b/src/openadapt_agent/__init__.py @@ -19,6 +19,6 @@ client in the same data boundary. """ -__version__ = "2.0.0.dev0" +__version__ = "2.0.0" __all__ = ["__version__"] diff --git a/tests/test_distribution.py b/tests/test_distribution.py index 702dc3a..5cb7bb4 100644 --- a/tests/test_distribution.py +++ b/tests/test_distribution.py @@ -23,6 +23,7 @@ SMITHERY_YAML = REPO_ROOT / "smithery.yaml" LLMS_TXT = REPO_ROOT / "llms.txt" PYPROJECT = REPO_ROOT / "pyproject.toml" +RELEASE_WORKFLOW = REPO_ROOT / ".github" / "workflows" / "release.yml" REVERSE_DNS_NAME = "io.github.OpenAdaptAI/openadapt-agent" PYPI_NAME = "openadapt-agent" @@ -62,6 +63,14 @@ def test_version_is_consistent_everywhere() -> None: assert _pyproject_version() == __version__ +def test_release_workflow_runs_the_complete_archive_boundary() -> None: + """The exact artifacts handed to publishers get both release guards.""" + workflow = RELEASE_WORKFLOW.read_text(encoding="utf-8") + assert '- "scripts/check_dist.py"' in workflow + assert "python scripts/check_release_artifacts.py dist" in workflow + assert "python scripts/check_dist.py dist/*" in workflow + + def test_serve_is_the_subcommand_and_bundles_is_required() -> None: args = _server_json()["packages"][0]["packageArguments"] positional = [a for a in args if a["type"] == "positional"]