From 3d267b3a34e8cb1b247a485700e1efe52c0b9b07 Mon Sep 17 00:00:00 2001 From: Andrey V Date: Sun, 9 Aug 2026 12:14:03 +0300 Subject: [PATCH] feat(release): add Python 3.14 support for 1.51 --- .agents/plugins/marketplace.json | 2 +- .claude-plugin/marketplace.json | 4 +- .claude-plugin/plugin.json | 2 +- .codex-plugin/plugin.json | 2 +- .cursor-plugin/marketplace.json | 4 +- .cursor-plugin/plugin.json | 2 +- .github/workflows/ci.yml | 2 +- .github/workflows/matrix.yml | 2 +- .github/workflows/neutrality.yml | 2 +- .github/workflows/publish.yml | 4 +- .github/workflows/release.yml | 4 +- CHANGELOG.md | 13 ++++ README.md | 6 +- adapters/claude/.claude-plugin/plugin.json | 2 +- adapters/codex/.codex-plugin/plugin.json | 2 +- adapters/cursor/.cursor-plugin/plugin.json | 2 +- docs/README.md | 3 + docs/guides/quickstart.md | 12 ++-- docs/reference/cli.md | 9 +++ docs/ru/README.md | 4 +- docs/ru/quickstart.md | 10 +-- docs/ru/reference/cli.md | 9 +++ pyproject.toml | 5 +- src/agent_lifecycle/_version.py | 2 +- tests/package/run_packaging_smoke.py | 83 ++++++++++++++++++---- tests/package/test_foundation.py | 8 +-- tests/release/test_docs_gates.py | 26 ++++++- tests/release/test_release_workflows.py | 32 +++++++++ tools/release/validate_docs_compat.py | 8 +++ uv.lock | 4 +- 30 files changed, 212 insertions(+), 58 deletions(-) create mode 100644 tests/release/test_release_workflows.py diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json index 1535760c..421d618e 100644 --- a/.agents/plugins/marketplace.json +++ b/.agents/plugins/marketplace.json @@ -9,7 +9,7 @@ "source": { "source": "url", "url": "https://github.com/avksp/agent-lifecycle-kit.git", - "ref": "v1.50.2" + "ref": "v1.51.0" }, "policy": { "installation": "AVAILABLE", diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 6c3973d7..a8b7bf5a 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -9,10 +9,10 @@ "source": { "source": "github", "repo": "avksp/agent-lifecycle-kit", - "ref": "v1.50.2" + "ref": "v1.51.0" }, "description": "Reviewed SDD planning, budgeted execution, adapter conformance, implementation audit, and final proof.", - "version": "1.50.2", + "version": "1.51.0", "author": { "name": "Agent Lifecycle Kit contributors" }, diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 689d6537..3aa34cc4 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agent-lifecycle-kit", - "version": "1.50.2", + "version": "1.51.0", "description": "Provider-neutral lifecycle kit for reviewed SDD planning, budgeted execution, adapter conformance, independent audits, and final proof.", "author": { "name": "Agent Lifecycle Kit contributors" diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 124c3535..f8a590d6 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agent-lifecycle-kit", - "version": "1.50.2", + "version": "1.51.0", "description": "Provider-neutral lifecycle kit for reviewed SDD planning, budgeted execution, adapter conformance, independent audits, and final proof.", "author": { "name": "Agent Lifecycle Kit contributors", diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index b7ae8f2d..b66d8bb0 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -5,14 +5,14 @@ }, "metadata": { "description": "Provider-neutral lifecycle kit for reviewed SDD planning, budgeted execution, adapter conformance, independent audits, and final proof.", - "version": "1.50.2" + "version": "1.51.0" }, "plugins": [ { "name": "agent-lifecycle-kit", "source": ".", "description": "Reviewed SDD planning, budgeted execution, adapter conformance, implementation audit, and final proof.", - "version": "1.50.2", + "version": "1.51.0", "author": { "name": "Agent Lifecycle Kit contributors" }, diff --git a/.cursor-plugin/plugin.json b/.cursor-plugin/plugin.json index 068ea3a6..bf987ede 100644 --- a/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agent-lifecycle-kit", - "version": "1.50.2", + "version": "1.51.0", "description": "Provider-neutral lifecycle kit for reviewed SDD planning, budgeted execution, adapter conformance, independent audits, and final proof.", "author": { "name": "Agent Lifecycle Kit contributors" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9531ad23..3dff3718 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python: ["3.11", "3.12", "3.13"] + python: ["3.11", "3.12", "3.13", "3.14"] steps: - name: Set git line ending policy run: git config --global core.autocrlf false diff --git a/.github/workflows/matrix.yml b/.github/workflows/matrix.yml index 594c5ec2..e89b01fe 100644 --- a/.github/workflows/matrix.yml +++ b/.github/workflows/matrix.yml @@ -14,7 +14,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python: ["3.11", "3.12", "3.13"] + python: ["3.11", "3.12", "3.13", "3.14"] steps: - name: Set git line ending policy run: git config --global core.autocrlf false diff --git a/.github/workflows/neutrality.yml b/.github/workflows/neutrality.yml index a2082f02..532e7525 100644 --- a/.github/workflows/neutrality.yml +++ b/.github/workflows/neutrality.yml @@ -16,7 +16,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.11", "3.12", "3.13"] + python-version: ["3.11", "3.12", "3.13", "3.14"] steps: - name: Set git line ending policy run: git config --global core.autocrlf false diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 78aa11b4..6ad4fa08 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -21,7 +21,7 @@ jobs: - uses: actions/checkout@v5 - uses: actions/setup-python@v6 with: - python-version: "3.11" + python-version: "3.14" - name: Validate publication versions env: RELEASE_TAG: ${{ github.event.release.tag_name }} @@ -33,6 +33,6 @@ jobs: - name: Install build frontend run: python -m pip install build - name: Build and smoke-test distribution - run: python tests/package/run_packaging_smoke.py --dist-dir dist --evidence /tmp/packaging-smoke.json + run: python tests/package/run_packaging_smoke.py --dist-dir dist --python python --evidence /tmp/packaging-smoke.json - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 699fc713..5c2d7932 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@v5 - uses: actions/setup-python@v6 with: - python-version: "3.11" + python-version: "3.14" - name: Install package run: python -m pip install -e . - name: Prepare evidence directories @@ -69,4 +69,4 @@ jobs: - name: Install build frontend run: python -m pip install build - name: Run packaging smoke - run: python tests/package/run_packaging_smoke.py --dist-dir /tmp/agent-lifecycle-r03-dist --evidence "$EVIDENCE_DIR"/packaging-smoke.json + run: python tests/package/run_packaging_smoke.py --dist-dir /tmp/agent-lifecycle-r03-dist --python python --evidence "$EVIDENCE_DIR"/packaging-smoke.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 64a12bc4..5eab2453 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,19 @@ - No changes yet. +## 1.51.0 - 2026-08-09 + +- Added Python 3.14 to package metadata and the tested CI, release, publication + and neutrality workflow matrices while keeping Python 3.15 outside the + supported range. +- Extended packaging smoke validation to build wheel and source distribution, + install each in a separate clean environment and record both outcomes in one + portable receipt. +- Documented the official versioned PyPI installation path and Python + 3.11-3.14 support in English and Russian. +- Updated package, plugin, marketplace and quickstart publication metadata to + `1.51.0`. + ## 1.50.2 - 2026-08-09 - Blocked generic descriptor-driven host launches and wildcard environment diff --git a/README.md b/README.md index 62da7b6a..76efdca1 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![License: Apache-2.0](https://img.shields.io/badge/license-Apache--2.0-green.svg)](LICENSE) [![Release](https://img.shields.io/github/v/release/avksp/agent-lifecycle-kit?label=release)](https://github.com/avksp/agent-lifecycle-kit/releases) -![Python](https://img.shields.io/badge/python-3.11--3.13-blue.svg) +![Python](https://img.shields.io/badge/python-3.11--3.14-blue.svg) **Agent Lifecycle Kit (ALK)** gives coding agents one delivery workflow from request to verified result. It turns a user task into a reviewed specification, @@ -29,8 +29,8 @@ agent-lifecycle diagnose --no-install-plans agent-lifecycle adapter validate --descriptor adapters/codex/adapter.descriptor.json ``` -Package install, when available for the release: -`python -m pip install agent-lifecycle-kit==1.50.2`. +The official [PyPI package](https://pypi.org/project/agent-lifecycle-kit/) supports Python 3.11-3.14. +Install the exact release with `python -m pip install agent-lifecycle-kit==1.51.0`. For a short walkthrough, use [Quickstart](docs/guides/quickstart.md) and the [Lifecycle cookbook](docs/guides/lifecycle-cookbook.md). For structure and positioning, see [System architecture](docs/architecture/system-architecture.md) and [Project comparison](docs/reference/project-comparison.md). Russian documentation starts at [Документация на русском](docs/ru/README.md). diff --git a/adapters/claude/.claude-plugin/plugin.json b/adapters/claude/.claude-plugin/plugin.json index 4bd4f5e9..e720cc57 100644 --- a/adapters/claude/.claude-plugin/plugin.json +++ b/adapters/claude/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agent-lifecycle-kit", - "version": "1.50.2", + "version": "1.51.0", "description": "Lifecycle skills and adapter metadata for reviewed planning, budgeted execution, adapter conformance, audit, and final proof.", "author": { "name": "Agent Lifecycle Kit contributors" diff --git a/adapters/codex/.codex-plugin/plugin.json b/adapters/codex/.codex-plugin/plugin.json index 86531108..581ff397 100644 --- a/adapters/codex/.codex-plugin/plugin.json +++ b/adapters/codex/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agent-lifecycle-kit", - "version": "1.50.2", + "version": "1.51.0", "description": "Provider-neutral lifecycle kit and adapter metadata for reviewed planning, budgeted execution, adapter conformance, audit, and final proof.", "author": { "name": "Agent Lifecycle Kit contributors" diff --git a/adapters/cursor/.cursor-plugin/plugin.json b/adapters/cursor/.cursor-plugin/plugin.json index 0ca102d4..7965a74f 100644 --- a/adapters/cursor/.cursor-plugin/plugin.json +++ b/adapters/cursor/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agent-lifecycle-kit", - "version": "1.50.2", + "version": "1.51.0", "description": "Agent lifecycle planning, budgeted execution, adapter conformance, audit, and final proof for Cursor.", "author": { "name": "Agent Lifecycle Kit contributors" diff --git a/docs/README.md b/docs/README.md index 71ca36b8..692899cb 100644 --- a/docs/README.md +++ b/docs/README.md @@ -13,6 +13,9 @@ project. ## Quick start +- Official PyPI package for Python 3.11-3.14: + `python -m pip install agent-lifecycle-kit==1.51.0` from + [agent-lifecycle-kit](https://pypi.org/project/agent-lifecycle-kit/). - [Quickstart](guides/quickstart.md) - [Lifecycle cookbook](guides/lifecycle-cookbook.md) - [System architecture](architecture/system-architecture.md) diff --git a/docs/guides/quickstart.md b/docs/guides/quickstart.md index 1bd6dc8c..af2dd421 100644 --- a/docs/guides/quickstart.md +++ b/docs/guides/quickstart.md @@ -23,16 +23,18 @@ PYTHONPATH=src python -m agent_lifecycle version ## Install from package -When the package is available for the release, install the exact semver version: +The official [PyPI project](https://pypi.org/project/agent-lifecycle-kit/) +supports Python 3.11-3.14. When the package is available for the requested +version, install the exact semantic version: ```bash -python -m pip install agent-lifecycle-kit==1.50.2 +python -m pip install agent-lifecycle-kit==1.51.0 agent-lifecycle version ``` -If the package is not available yet, use the source checkout path above. A Git -tag alone is not enough for plugin installation; plugin manifests inside the -tag must also carry the same version. See +If a requested version has not been published to PyPI, use the source checkout +path above. A Git tag alone is not enough for plugin installation; plugin +manifests inside the tag must also carry the same version. See [Plugin publication](../reference/plugin-publication.md). ## Check readiness diff --git a/docs/reference/cli.md b/docs/reference/cli.md index 3a97c87f..2169ccfc 100644 --- a/docs/reference/cli.md +++ b/docs/reference/cli.md @@ -4,6 +4,15 @@ The CLI prints JSON for machine-readable commands. Commands that mutate state record receipts or require explicit input files; diagnostic commands stay read-only unless their own help says otherwise. +## Installation + +Python 3.11-3.14 is supported. Install the exact release from the official +[PyPI project](https://pypi.org/project/agent-lifecycle-kit/): + +```bash +python -m pip install agent-lifecycle-kit==1.51.0 +``` + ## Foundation - `agent-lifecycle version`: print package version. diff --git a/docs/ru/README.md b/docs/ru/README.md index 8553b9ed..411fe28e 100644 --- a/docs/ru/README.md +++ b/docs/ru/README.md @@ -16,10 +16,10 @@ OpenInterpreter, Pi, Grok Build и других. Ядро не зависит о Главная цель проекта - закрывать задачу полностью, с максимально возможным качеством для выбранной модели, без оверинжиринга и с контролем расхода токенов. -**Лицензия:** Apache-2.0 · **Версия:** 1.50.2 · **Python:** 3.11-3.13 +**Лицензия:** Apache-2.0 · **Версия:** 1.51.0 · **Python:** 3.11-3.14 ## Быстрый старт - +Официальный [пакет в PyPI](https://pypi.org/project/agent-lifecycle-kit/) для Python 3.11-3.14: `python -m pip install agent-lifecycle-kit==1.51.0`. Из исходного дерева: ```bash diff --git a/docs/ru/quickstart.md b/docs/ru/quickstart.md index 7dbc4486..febed9fa 100644 --- a/docs/ru/quickstart.md +++ b/docs/ru/quickstart.md @@ -22,15 +22,17 @@ PYTHONPATH=src python -m agent_lifecycle version ## Установка из пакета -Если пакет опубликован для нужного релиза, устанавливайте точную -семантическую версию: +Официальный [проект в PyPI](https://pypi.org/project/agent-lifecycle-kit/) +поддерживает Python 3.11-3.14. Если пакет опубликован для нужной версии, +устанавливайте точную семантическую версию: ```bash -python -m pip install agent-lifecycle-kit==1.50.2 +python -m pip install agent-lifecycle-kit==1.51.0 agent-lifecycle version ``` -Если пакет ещё не опубликован, используйте установку из исходного дерева выше. +Если нужная версия ещё не опубликована в PyPI, используйте установку из +исходного дерева выше. Одного Git-тега недостаточно для установки плагина: манифесты плагина внутри тега тоже должны содержать ту же версию. Подробнее: [публикация плагинов](reference/plugin-publication.md). diff --git a/docs/ru/reference/cli.md b/docs/ru/reference/cli.md index 08d86932..171c3125 100644 --- a/docs/ru/reference/cli.md +++ b/docs/ru/reference/cli.md @@ -3,6 +3,15 @@ Основная команда называется `agent-lifecycle`. Она возвращает структурированный JSON, чтобы результат можно было проверять автоматически. +## Установка + +Поддерживаются Python 3.11-3.14. Установите точную версию из официального +[проекта в PyPI](https://pypi.org/project/agent-lifecycle-kit/): + +```bash +python -m pip install agent-lifecycle-kit==1.51.0 +``` + ## Основа - `agent-lifecycle version`: версия пакета. diff --git a/pyproject.toml b/pyproject.toml index 5ce205cd..013a6da9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,10 +4,10 @@ build-backend = "setuptools.build_meta" [project] name = "agent-lifecycle-kit" -version = "1.50.2" +version = "1.51.0" description = "Provider-neutral lifecycle control layer that helps coding agents plan, execute, validate, and prove software tasks to completion." readme = "README.md" -requires-python = ">=3.11,<3.14" +requires-python = ">=3.11,<3.15" license = { text = "Apache-2.0" } authors = [{ name = "Agent Lifecycle Kit contributors" }] keywords = [ @@ -34,6 +34,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Typing :: Typed", ] dependencies = [] diff --git a/src/agent_lifecycle/_version.py b/src/agent_lifecycle/_version.py index e08d067b..2fa726c7 100644 --- a/src/agent_lifecycle/_version.py +++ b/src/agent_lifecycle/_version.py @@ -1,3 +1,3 @@ """Package version.""" -__version__ = "1.50.2" +__version__ = "1.51.0" diff --git a/tests/package/run_packaging_smoke.py b/tests/package/run_packaging_smoke.py index c1bffcd8..c40579bb 100644 --- a/tests/package/run_packaging_smoke.py +++ b/tests/package/run_packaging_smoke.py @@ -7,7 +7,6 @@ import subprocess import sys import tempfile -import venv from pathlib import Path, PurePosixPath, PureWindowsPath from typing import Any @@ -17,6 +16,7 @@ def main() -> int: parser = argparse.ArgumentParser() parser.add_argument("--dist-dir", required=True) + parser.add_argument("--python", default=sys.executable) parser.add_argument("--evidence", required=True) args = parser.parse_args() @@ -24,32 +24,47 @@ def main() -> int: evidence_path = Path(args.evidence) blockers: list[dict[str, Any]] = [] commands: list[dict[str, Any]] = [] + artifact_checks: list[dict[str, Any]] = [] if dist_dir.exists(): shutil.rmtree(dist_dir) dist_dir.mkdir(parents=True) - _run_command([sys.executable, "-m", "build", "--outdir", str(dist_dir)], commands, blockers) + _run_command( + [args.python, "-m", "build", "--wheel", "--sdist", "--outdir", str(dist_dir)], + commands, + blockers, + ) wheels = sorted(dist_dir.glob("*.whl")) + source_distributions = sorted([*dist_dir.glob("*.tar.gz"), *dist_dir.glob("*.zip")]) if not wheels: blockers.append({"code": "wheel-not-built", "message": "build did not produce a wheel"}) - else: - with tempfile.TemporaryDirectory() as tmp: - venv_dir = Path(tmp) / "venv" - venv.EnvBuilder(with_pip=True).create(venv_dir) - python = _venv_python(venv_dir) - _run_command([str(python), "-m", "pip", "install", "--force-reinstall", str(wheels[0])], commands, blockers) - _run_command([str(_venv_script(venv_dir, "agent-lifecycle")), "version"], commands, blockers) - _run_command([str(_venv_script(venv_dir, "agent-lifecycle-neutrality")), "--help"], commands, blockers) - marker = _probe_type_marker(python) - commands.append({"argv": _portable_argv([str(python), "-c", "py.typed probe"]), "returncode": 0 if marker else 1}) - if not marker: - blockers.append({"code": "py-typed-missing", "message": "installed wheel does not include agent_lifecycle/py.typed"}) + if not source_distributions: + blockers.append({"code": "sdist-not-built", "message": "build did not produce a source distribution"}) + with tempfile.TemporaryDirectory() as tmp: + artifact_root = Path(tmp) + if wheels: + artifact_checks.append( + _check_artifact("wheel", wheels[0], args.python, artifact_root / "wheel-venv", commands, blockers) + ) + if source_distributions: + artifact_checks.append( + _check_artifact( + "sdist", + source_distributions[0], + args.python, + artifact_root / "sdist-venv", + commands, + blockers, + ) + ) status = "PASS" if not blockers else "FAIL" evidence = { "schemaVersion": "agent-packaging-smoke-evidence.v1", "status": status, "distDir": _portable_path(dist_dir), + "python": _portable_path(args.python, executable=True), + "artifactChecks": artifact_checks, "commands": commands, "blockers": blockers, "productionPromotionClaimed": False, @@ -59,7 +74,39 @@ def main() -> int: return 0 if status == "PASS" else 1 -def _run_command(argv: list[str], commands: list[dict[str, Any]], blockers: list[dict[str, Any]]) -> None: +def _check_artifact( + kind: str, + artifact: Path, + python_executable: str, + venv_dir: Path, + commands: list[dict[str, Any]], + blockers: list[dict[str, Any]], +) -> dict[str, Any]: + command_start = len(commands) + blocker_start = len(blockers) + created = _run_command([python_executable, "-m", "venv", str(venv_dir)], commands, blockers) == 0 + if created: + python = _venv_python(venv_dir) + _run_command([str(python), "-m", "pip", "install", "--force-reinstall", str(artifact)], commands, blockers) + _run_command([str(_venv_script(venv_dir, "agent-lifecycle")), "version"], commands, blockers) + _run_command([str(_venv_script(venv_dir, "agent-lifecycle-neutrality")), "--help"], commands, blockers) + marker = _probe_type_marker(python) + commands.append( + {"argv": _portable_argv([str(python), "-c", "py.typed probe"]), "returncode": 0 if marker else 1} + ) + if not marker: + blockers.append( + {"code": "py-typed-missing", "artifactKind": kind, "message": "installed package lacks py.typed"} + ) + return { + "kind": kind, + "status": "PASS" if len(blockers) == blocker_start else "FAIL", + "artifactIdentity": _file_identity(artifact), + "commandRange": {"start": command_start, "end": len(commands)}, + } + + +def _run_command(argv: list[str], commands: list[dict[str, Any]], blockers: list[dict[str, Any]]) -> int: result = subprocess.run(argv, cwd=ROOT, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=False) portable_argv = _portable_argv(argv) commands.append({"argv": portable_argv, "returncode": result.returncode}) @@ -72,6 +119,7 @@ def _run_command(argv: list[str], commands: list[dict[str, Any]], blockers: list "stderrIdentity": _stream_identity(result.stderr), } ) + return result.returncode def _portable_argv(argv: list[str]) -> list[str]: @@ -102,6 +150,11 @@ def _stream_identity(value: str) -> dict[str, Any]: return {"bytes": len(encoded), "sha256": hashlib.sha256(encoded).hexdigest()} +def _file_identity(path: Path) -> dict[str, Any]: + payload = path.read_bytes() + return {"name": path.name, "bytes": len(payload), "sha256": hashlib.sha256(payload).hexdigest()} + + def _probe_type_marker(python: Path) -> bool: code = ( "import importlib.resources as r; " diff --git a/tests/package/test_foundation.py b/tests/package/test_foundation.py index 5caf5408..bb0291e3 100644 --- a/tests/package/test_foundation.py +++ b/tests/package/test_foundation.py @@ -18,8 +18,8 @@ def test_package_metadata_is_stable(self) -> None: pyproject = tomllib.loads((ROOT / "pyproject.toml").read_text(encoding="utf-8")) project = pyproject["project"] self.assertEqual(project["name"], "agent-lifecycle-kit") - self.assertEqual(project["version"], "1.50.2") - self.assertEqual(project["requires-python"], ">=3.11,<3.14") + self.assertEqual(project["version"], "1.51.0") + self.assertEqual(project["requires-python"], ">=3.11,<3.15") self.assertEqual(project["license"]["text"], "Apache-2.0") self.assertEqual(project["dependencies"], []) self.assertIn("Development Status :: 5 - Production/Stable", project["classifiers"]) @@ -59,10 +59,10 @@ def test_crlf_conversion_changes_content_addressed_fixture_identity(self) -> Non def test_uv_lock_declares_runtime_graph(self) -> None: lock = tomllib.loads((ROOT / "uv.lock").read_text(encoding="utf-8")) self.assertEqual(lock["version"], 1) - self.assertEqual(lock["requires-python"], ">=3.11,<3.14") + self.assertEqual(lock["requires-python"], ">=3.11, <3.15") packages = {package["name"]: package for package in lock["package"]} self.assertIn("agent-lifecycle-kit", packages) - self.assertEqual(packages["agent-lifecycle-kit"]["version"], "1.50.2") + self.assertEqual(packages["agent-lifecycle-kit"]["version"], "1.51.0") def test_foundation_ci_uses_stdlib_unittest(self) -> None: pyproject = tomllib.loads((ROOT / "pyproject.toml").read_text(encoding="utf-8")) diff --git a/tests/release/test_docs_gates.py b/tests/release/test_docs_gates.py index 1750800b..cc65594f 100644 --- a/tests/release/test_docs_gates.py +++ b/tests/release/test_docs_gates.py @@ -5,10 +5,12 @@ import subprocess import sys import tempfile +import tomllib import unittest from pathlib import Path ROOT = Path(__file__).resolve().parents[2] +TARGET_VERSION = tomllib.loads((ROOT / "pyproject.toml").read_text(encoding="utf-8"))["project"]["version"] class ReleaseDocumentationGateTests(unittest.TestCase): @@ -139,6 +141,24 @@ def test_quickstart_and_adapter_docs_cover_bounded_commands(self) -> None: ): self.assertIn(command, install) + def test_python_package_guidance_is_synchronized(self) -> None: + package_url = "https://pypi.org/project/agent-lifecycle-kit/" + install_command = f"python -m pip install agent-lifecycle-kit=={TARGET_VERSION}" + for relative_path in ( + "README.md", + "docs/README.md", + "docs/ru/README.md", + "docs/guides/quickstart.md", + "docs/ru/quickstart.md", + "docs/reference/cli.md", + "docs/ru/reference/cli.md", + ): + with self.subTest(path=relative_path): + text = (ROOT / relative_path).read_text(encoding="utf-8") + self.assertIn(package_url, text) + self.assertIn(install_command, text) + self.assertIn("Python 3.11-3.14", text) + def test_security_docs_describe_blocked_launch_and_fail_closed_receipts(self) -> None: managed_sessions = [ ROOT / "docs/reference/managed-adapter-sessions.md", @@ -316,11 +336,11 @@ def _assert_links_resolve(path: Path) -> None: def _write_min_docs(root: Path, *, unsupported_verified_row: bool) -> None: _write_text( root / "README.md", - "`VERIFIED` for Codex CLI 0.145.0. `VERIFIED` for Claude Code 2.1.220. `VERIFIED` for OpenCode CLI 1.18.9. `VERIFIED` for Hermes Agent v0.19.0. `VERIFIED` for Qwen Code 0.21.0. `EXPERIMENTAL` means bounded live host conformance and usage/resource calibration are required. Public contracts live in docs/reference/public-contracts.md. `completionCheck` requires `agent-completion-check-receipt.v1`. `agent-goal-record.v1` produces `agent-objective-snapshot.v1`. `agent-runner-state.v1` produces `agent-runner-snapshot.v1`. `agent-follow-up-register.v1` produces `agent-follow-up-summary.v1`. `agent-worktree-isolation-policy.v1` validates `agent-worktree-attempt-receipt.v1`. `agent-adapter-event-stream-receipt.v1` validates `agent-adapter-event-capture-validation.v1`. `agent-review-verdict.v1` produces `agent-review-routing-summary.v1`. `agent-optional-quality-pack.v1`. `agent-behavior-check-run.v1`. `agent-diagnostic-bundle.v1`. `agent-readonly-status-view.v1`. `agent-workflow-event-feed.v1`. `agent-lifecycle-progress-view.v1`.\n", + "`VERIFIED` for Codex CLI 0.145.0. `VERIFIED` for Claude Code 2.1.220. `VERIFIED` for OpenCode CLI 1.18.9. `VERIFIED` for Hermes Agent v0.19.0. `VERIFIED` for Qwen Code 0.21.0. `EXPERIMENTAL` means bounded live host conformance and usage/resource calibration are required. Public contracts live in docs/reference/public-contracts.md. https://pypi.org/project/agent-lifecycle-kit/ supports Python 3.11-3.14. `completionCheck` requires `agent-completion-check-receipt.v1`. `agent-goal-record.v1` produces `agent-objective-snapshot.v1`. `agent-runner-state.v1` produces `agent-runner-snapshot.v1`. `agent-follow-up-register.v1` produces `agent-follow-up-summary.v1`. `agent-worktree-isolation-policy.v1` validates `agent-worktree-attempt-receipt.v1`. `agent-adapter-event-stream-receipt.v1` validates `agent-adapter-event-capture-validation.v1`. `agent-review-verdict.v1` produces `agent-review-routing-summary.v1`. `agent-optional-quality-pack.v1`. `agent-behavior-check-run.v1`. `agent-diagnostic-bundle.v1`. `agent-readonly-status-view.v1`. `agent-workflow-event-feed.v1`. `agent-lifecycle-progress-view.v1`.\n", ) _write_text( root / "docs/ru/README.md", - "`VERIFIED` для Codex CLI 0.145.0. `VERIFIED` для Claude Code 2.1.220. `VERIFIED` для OpenCode CLI 1.18.9. `VERIFIED` для Hermes Agent v0.19.0. `VERIFIED` для Qwen Code 0.21.0. `EXPERIMENTAL` означает, что без калибровки расхода продвижение запрещено. Список в Публичных контрактах: reference/public-contracts.md. `completionCheck` требует `agent-completion-check-receipt.v1`. `agent-goal-record.v1` создаёт `agent-objective-snapshot.v1`. `agent-runner-state.v1` создаёт `agent-runner-snapshot.v1`. `agent-follow-up-register.v1` создаёт `agent-follow-up-summary.v1`. `agent-worktree-isolation-policy.v1` проверяет `agent-worktree-attempt-receipt.v1`. `agent-adapter-event-stream-receipt.v1` проверяет `agent-adapter-event-capture-validation.v1`. `agent-review-verdict.v1` создаёт `agent-review-routing-summary.v1`. `agent-optional-quality-pack.v1`. `agent-behavior-check-run.v1`. `agent-diagnostic-bundle.v1`. `agent-readonly-status-view.v1`. `agent-workflow-event-feed.v1`. `agent-lifecycle-progress-view.v1`.\n", + "`VERIFIED` для Codex CLI 0.145.0. `VERIFIED` для Claude Code 2.1.220. `VERIFIED` для OpenCode CLI 1.18.9. `VERIFIED` для Hermes Agent v0.19.0. `VERIFIED` для Qwen Code 0.21.0. `EXPERIMENTAL` означает, что без калибровки расхода продвижение запрещено. Список в Публичных контрактах: reference/public-contracts.md. https://pypi.org/project/agent-lifecycle-kit/ поддерживает Python 3.11-3.14. `completionCheck` требует `agent-completion-check-receipt.v1`. `agent-goal-record.v1` создаёт `agent-objective-snapshot.v1`. `agent-runner-state.v1` создаёт `agent-runner-snapshot.v1`. `agent-follow-up-register.v1` создаёт `agent-follow-up-summary.v1`. `agent-worktree-isolation-policy.v1` проверяет `agent-worktree-attempt-receipt.v1`. `agent-adapter-event-stream-receipt.v1` проверяет `agent-adapter-event-capture-validation.v1`. `agent-review-verdict.v1` создаёт `agent-review-routing-summary.v1`. `agent-optional-quality-pack.v1`. `agent-behavior-check-run.v1`. `agent-diagnostic-bundle.v1`. `agent-readonly-status-view.v1`. `agent-workflow-event-feed.v1`. `agent-lifecycle-progress-view.v1`.\n", ) public_contracts = ( "`completionCheck`.\n" @@ -402,6 +422,8 @@ def _write_min_docs(root: Path, *, unsupported_verified_row: bool) -> None: "adapter run.\n" "`WAITING_FOR_TASK`.\n" "`agent-adapter-session-receipt.v1`.\n" + "https://pypi.org/project/agent-lifecycle-kit/.\n" + f"python -m pip install agent-lifecycle-kit=={TARGET_VERSION}.\n" ) _write_text(root / "docs/reference/cli.md", cli) _write_text(root / "docs/ru/reference/cli.md", cli) diff --git a/tests/release/test_release_workflows.py b/tests/release/test_release_workflows.py new file mode 100644 index 00000000..45087f6b --- /dev/null +++ b/tests/release/test_release_workflows.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +import unittest +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[2] + + +class ReleaseWorkflowTests(unittest.TestCase): + def test_test_matrices_include_python_3_14(self) -> None: + for relative_path in [ + ".github/workflows/ci.yml", + ".github/workflows/matrix.yml", + ".github/workflows/neutrality.yml", + ]: + workflow = (ROOT / relative_path).read_text(encoding="utf-8") + self.assertIn('"3.14"', workflow, relative_path) + + def test_release_and_publication_use_python_3_14_packaging_smoke(self) -> None: + for relative_path in [ + ".github/workflows/release.yml", + ".github/workflows/publish.yml", + ]: + workflow = (ROOT / relative_path).read_text(encoding="utf-8") + self.assertIn('python-version: "3.14"', workflow, relative_path) + self.assertIn("tests/package/run_packaging_smoke.py", workflow, relative_path) + self.assertIn("--python python", workflow, relative_path) + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/release/validate_docs_compat.py b/tools/release/validate_docs_compat.py index c04a9667..6517ace6 100644 --- a/tools/release/validate_docs_compat.py +++ b/tools/release/validate_docs_compat.py @@ -23,6 +23,8 @@ "usage/resource calibration", "Public contracts", "docs/reference/public-contracts.md", + "https://pypi.org/project/agent-lifecycle-kit/", + "Python 3.11-3.14", ), ), ( @@ -37,6 +39,8 @@ "калибровки расхода", "Публичных контрактах", "reference/public-contracts.md", + "https://pypi.org/project/agent-lifecycle-kit/", + "Python 3.11-3.14", ), ), ( @@ -558,6 +562,8 @@ "adapter run", "`WAITING_FOR_TASK`", "`agent-adapter-session-receipt.v1`", + "https://pypi.org/project/agent-lifecycle-kit/", + "python -m pip install agent-lifecycle-kit==", ), ), ( @@ -570,6 +576,8 @@ "adapter run", "`WAITING_FOR_TASK`", "`agent-adapter-session-receipt.v1`", + "https://pypi.org/project/agent-lifecycle-kit/", + "python -m pip install agent-lifecycle-kit==", ), ), ( diff --git a/uv.lock b/uv.lock index bdbfcf65..25ffc016 100644 --- a/uv.lock +++ b/uv.lock @@ -1,8 +1,8 @@ version = 1 revision = 3 -requires-python = ">=3.11,<3.14" +requires-python = ">=3.11, <3.15" [[package]] name = "agent-lifecycle-kit" -version = "1.50.2" +version = "1.51.0" source = { editable = "." }