From 1455090c761c6dafba532410f04456a72f515c12 Mon Sep 17 00:00:00 2001 From: AgentQit contributors <36336419+akimovWare@users.noreply.github.com> Date: Mon, 2 Nov 2026 03:24:26 +0000 Subject: [PATCH 1/2] Prepare 0.1.0 for PyPI and validate Python 3.14 --- .github/workflows/ci.yml | 8 ++++++-- AGENTS.md | 2 +- CHANGELOG.md | 5 +++-- README.md | 7 +++---- README.pypi.md | 11 +++++------ docs/compatibility.md | 8 ++++++++ docs/distribution.md | 37 +++++++++++++++++++++++-------------- docs/releases.md | 14 ++++++++++++++ docs/verification.md | 5 +++-- pyproject.toml | 8 +++++++- 10 files changed, 73 insertions(+), 32 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a4e1951..67bbfc2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-24.04, macos-15] - python: ["3.12", "3.13"] + python: ["3.12", "3.13", "3.14"] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 @@ -41,13 +41,17 @@ jobs: "$GITHUB_WORKSPACE/.installed-check/bin/python" -I "$GITHUB_WORKSPACE/tools/smoke_installed.py" --output "$RUNNER_TEMP/agentqit-smoke" browser: + strategy: + fail-fast: false + matrix: + python: ["3.12", "3.13", "3.14"] runs-on: ubuntu-24.04 steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0 with: version: "0.13.6" - python-version: "3.12" + python-version: ${{ matrix.python }} - run: uv sync --frozen --extra browser - run: uv run playwright install --with-deps chromium --only-shell - run: uv run pytest -m browser diff --git a/AGENTS.md b/AGENTS.md index 3ceeab1..2024fdc 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,7 +2,7 @@ ## Project -AgentQit is a public source preview. Read [the roadmap](docs/roadmap.md), +AgentQit provides application testing tools for AI agents. Read [the roadmap](docs/roadmap.md), [compatibility](docs/compatibility.md), and [the release guide](docs/releases.md) before changing code. Package publication requires an explicit maintainer instruction. Source changes use pull requests and the required CI checks. diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e56398..b31ceca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ # Changelog -## 0.1.0 - Unreleased +## 0.1.0 - 2026-11-02 +- CPython 3.12, 3.13, and 3.14 support on macOS and Linux. - Product-neutral runtime and CLI with public dependency sources. - Local YAML workspaces and independently installed product plugins. - Local stdio MCP with bounded discovery, plans, observations, invocation, and checkpoints. @@ -17,4 +18,4 @@ reviewed schema snapshots, and a documented compatibility/upgrade policy. - Reproducible CLI/MCP context accounting against synthetic local backend workflows. - Manual release preparation, source/tag/version checks, retained artifact hashes, - strict package metadata validation, and disabled-by-default Trusted Publishing. + strict package metadata validation, and protected Trusted Publishing. diff --git a/README.md b/README.md index b3a0192..98444d0 100644 --- a/README.md +++ b/README.md @@ -9,21 +9,20 @@ and local MCP. The agent selects checks from requirements; the runtime validates inputs, enforces execution limits, and returns observations with evidence. UI, API, database, and messaging observations can share a task journal. -**Availability:** source preview on GitHub. The PyPI package is not published. -Python 3.12+, macOS and Linux. +CPython 3.12, 3.13, and 3.14; macOS and Linux. ## Install With uv installed: ```sh -uv tool install --python 3.12 'agentqit[browser] @ git+https://github.com/akimovWare/AgentQit.git@main' +uv tool install --python 3.12 'agentqit[browser]>=0.1,<0.2' qa browser install --headless-only qa workspace init --directory ./my-qa --name sample ``` For backend-only use, omit `[browser]` and the browser provisioning command. -Pin a commit instead of `main` for a repeatable source installation. +For a reproducible installation, pin a reviewed version such as `==0.1.0`. The workspace contains your operation YAML, profile, and credential references. Configure reviewed operations, QA endpoints, and an explicit credential provider diff --git a/README.pypi.md b/README.pypi.md index 2123b4b..12f8e79 100644 --- a/README.pypi.md +++ b/README.pypi.md @@ -6,21 +6,20 @@ AgentQit exposes typed browser actions, reviewed backend operations, and observa with evidence. The agent selects checks from requirements and compares the returned facts with expected behavior. CLI and local stdio MCP share one execution runtime. -**Availability:** source preview on GitHub. The PyPI package is not published. -Python 3.12+, macOS and Linux. +CPython 3.12, 3.13, and 3.14; macOS and Linux. -## Install from Git +## Install With uv installed: ```sh -uv tool install --python 3.12 'agentqit[browser] @ git+https://github.com/akimovWare/AgentQit.git@main' +uv tool install --python 3.12 'agentqit[browser]>=0.1,<0.2' qa browser install --headless-only qa workspace init --directory ./my-qa --name sample ``` -For backend-only use, omit `[browser]` and browser provisioning. Pin a commit for -a repeatable source installation. +For backend-only use, omit `[browser]` and browser provisioning. Pin a reviewed +version such as `==0.1.0` for a reproducible installation. Configure the workspace with reviewed operation YAML, your QA endpoints, and explicit credential references. Ordinary integrations use YAML; reusable catalogs diff --git a/docs/compatibility.md b/docs/compatibility.md index 1669758..ca05f15 100644 --- a/docs/compatibility.md +++ b/docs/compatibility.md @@ -4,6 +4,14 @@ Package updates and configuration migrations are separate actions. AgentQit preserves workspace files during installation, startup, planning, and upgrade. +## Python and platforms + +Supported interpreters are standard CPython 3.12, 3.13, and 3.14 on macOS and +Linux. CI validates the offline suite, package build, and isolated installation +on both platforms for each version. Chromium acceptance runs on Linux for all +three versions. Free-threaded Python, PyPy, and Windows are outside the tested +support matrix. See [verification](verification.md). + ## Versioned contracts | Surface | Current contract | Promise | diff --git a/docs/distribution.md b/docs/distribution.md index ddeed84..522eda1 100644 --- a/docs/distribution.md +++ b/docs/distribution.md @@ -5,7 +5,27 @@ and shared runtime. Configuration lives in a separate workspace containing YAML catalogs, a profile, and credential references. Ordinary integrations require no Python code or runtime checkout. -The source is available on GitHub. The PyPI package is not published. +Supported interpreters are standard CPython 3.12, 3.13, and 3.14 on macOS and Linux. +The commands below select Python 3.12; use `--python 3.13` or `--python 3.14` to +select another supported version. + +## Install from PyPI + +With uv installed: + +```sh +uv tool install --python 3.12 'agentqit[browser]>=0.1,<0.2' +qa browser install --headless-only +qa workspace init --directory ./my-service-qa --name my-service +``` + +For backend-only use, select `'agentqit>=0.1,<0.2'` and omit browser provisioning. +The version range accepts compatible 0.1.x updates. Adopt a new minor series +after reading its migration notes. CI integrations should pin a reviewed version. + +uv installs executables on `PATH` and isolates dependencies from other projects. +`uv tool update-shell` adds its executable directory when needed. See +[uv tools](https://docs.astral.sh/uv/guides/tools/). ## Install from Git @@ -18,9 +38,7 @@ qa workspace init --directory ./my-service-qa --name my-service ``` For backend-only use, omit `[browser]` and browser provisioning. Use a commit SHA -instead of `main` to pin a source revision. uv installs executables on `PATH` and -isolates dependencies from other projects. `uv tool update-shell` adds its executable -directory when needed. See [uv tools](https://docs.astral.sh/uv/guides/tools/). +instead of `main` to pin a source revision. ## Install a built wheel @@ -74,16 +92,7 @@ qa browser install --headless-only See [Playwright browser versions](https://playwright.dev/python/docs/browsers). There is no background auto-updater or update-notification service. -## Package-index releases - -Index commands require a published package. The compatible 0.1 series uses: - -```sh -uv tool install --python 3.12 'agentqit[browser]>=0.1,<0.2' -``` - -For backend-only use, select `'agentqit>=0.1,<0.2'`. Adopt a new minor series after -reading its migration notes. CI integrations should pin a reviewed version. +## Pinning and rollback To select or roll back to a specific published version: diff --git a/docs/releases.md b/docs/releases.md index 1d5de81..ea62261 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -31,6 +31,20 @@ page. Keep their installation instructions and availability accurate. The index page uses absolute documentation URLs. Verify that its rendered Markdown and the built wheel description match. Include both files in the sdist. +## One-time PyPI setup + +Sign in to a personal PyPI account, verify its email address, and enable two-factor +authentication. Under [account publishing](https://pypi.org/manage/account/publishing/), +add a pending GitHub publisher using the exact values in the table above. The +workflow field is the filename `release.yml`, not its path or display name. + +The first successful upload creates the `agentqit` project under that account +and converts the pending publisher into a regular publisher. A pending publisher +does not reserve the package name. OIDC publishing needs no stored PyPI API token. + +The GitHub `pypi` environment must allow version tags and require a maintainer +review. After validation, the publishing job waits for that review before upload. + ## Validate a release Use an empty artifact directory and a new benchmark output directory: diff --git a/docs/verification.md b/docs/verification.md index e878032..3ff12d5 100644 --- a/docs/verification.md +++ b/docs/verification.md @@ -22,8 +22,9 @@ stale and changed references, credential input, screenshots, traces, native dialogs, and UI/API observations. Orders Lab supplies correct and deliberately defective UI behavior. Business assertions belong to the acceptance tests. -The standard suite runs without browser binaries. CI covers Python 3.12/3.13 on -macOS/Linux, plus Chromium, interface-payload, and publication-content checks. +The standard suite runs without browser binaries. CI covers CPython 3.12, 3.13, +and 3.14 on macOS/Linux, plus Chromium on all three Python versions on Linux. +Interface-payload and publication-content checks run separately. See [GitHub Actions](https://github.com/akimovWare/AgentQit/actions/workflows/ci.yml) for results on each commit. Windows is unsupported by the POSIX journal/artifact implementation. Model reasoning and independent LLM evaluations are outside the diff --git a/pyproject.toml b/pyproject.toml index 47da7e9..8d969b7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,13 @@ description = "Application testing tools for AI agents" readme = "README.pypi.md" license = "MIT" requires-python = ">=3.12" -classifiers = ["Operating System :: POSIX", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13"] +classifiers = [ + "Operating System :: POSIX", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: Implementation :: CPython", +] dependencies = [ "aiokafka>=0.12,<1", "anyio>=4.8,<5", From 635b356ef8c4435d9268848d4690630f87daa851 Mon Sep 17 00:00:00 2001 From: AgentQit contributors <36336419+akimovWare@users.noreply.github.com> Date: Mon, 2 Nov 2026 03:26:19 +0000 Subject: [PATCH 2/2] Require patched pytest for development --- pyproject.toml | 2 +- uv.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 8d969b7..9326b82 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,7 +50,7 @@ agentqit-mcp = "qa_mcp.__main__:main" dev = [ "packaging>=24,<27", "pre-commit>=4.6,<5", - "pytest>=8.3,<9", + "pytest>=9.0.3,<10", "pytest-cov>=7.1,<8", "ruff>=0.9,<1", "tiktoken>=0.12,<1", diff --git a/uv.lock b/uv.lock index bf197a0..d7c4c26 100644 --- a/uv.lock +++ b/uv.lock @@ -67,7 +67,7 @@ provides-extras = ["browser"] dev = [ { name = "packaging", specifier = ">=24,<27" }, { name = "pre-commit", specifier = ">=4.6,<5" }, - { name = "pytest", specifier = ">=8.3,<9" }, + { name = "pytest", specifier = ">=9.0.3,<10" }, { name = "pytest-cov", specifier = ">=7.1,<8" }, { name = "ruff", specifier = ">=0.9,<1" }, { name = "tiktoken", specifier = ">=0.12,<1" }, @@ -1428,7 +1428,7 @@ crypto = [ [[package]] name = "pytest" -version = "8.4.2" +version = "9.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -1437,9 +1437,9 @@ dependencies = [ { name = "pluggy" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } +sdist = { url = "https://files.pythonhosted.org/packages/79/42/bb4641652e58dedeac2ec51abc1f8cae4fee4ec63899a0999016229a0f2a/pytest-9.2.0.tar.gz", hash = "sha256:97c4f3b1f3c7414aa36465e09b8220f1d03627993bd51b1282e193753c80557b", size = 1797555, upload-time = "2026-10-27T21:30:20.728Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, + { url = "https://files.pythonhosted.org/packages/51/39/1f5d8c8877a0fa327db959c19341d4be61660de1ab6b7391f9eb805bcd67/pytest-9.2.0-py3-none-any.whl", hash = "sha256:07acdcf88ec174f907dc01af70bf52d49b014bbab03faeeade31c96b18c2e588", size = 411776, upload-time = "2026-10-27T21:30:19.131Z" }, ] [[package]]