diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index f77b335..cb7fffc 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "ragops", - "version": "2.0.1", + "version": "2.0.2", "description": "Explainable regression tests and release gates for RAG systems and AI agents.", "author": { "name": "Thang Luu", diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 130d4f0..43f4e65 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "ragops", - "version": "2.0.1", + "version": "2.0.2", "description": "Offline, explainable release gates and evidence bundles for RAG systems and AI agents.", "author": { "name": "Thang Luu", diff --git a/.kimi-plugin/plugin.json b/.kimi-plugin/plugin.json index 43e6c41..ae2ad2a 100644 --- a/.kimi-plugin/plugin.json +++ b/.kimi-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "ragops", - "version": "2.0.1", + "version": "2.0.2", "description": "Explainable regression tests and release gates for RAG systems and AI agents.", "author": { "name": "Thang Luu", diff --git a/CHANGELOG.md b/CHANGELOG.md index bf79030..591fbea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,25 @@ ## Unreleased +## [2.0.2] - 2026-08-24 + ### English -- Added a synthetic retrieval-poisoning Failure Zoo specimen, a published-package Windows smoke test, CodeQL scanning, and explicit local-only usage evidence. +- Added a deterministic synthetic retrieval-poisoning Failure Zoo specimen with explicit unsupported-citation, unsupported-claim, and forbidden-output findings. +- Added checkout-free Windows verification of the published package, least-privilege CodeQL scanning, and protected-branch release gates. +- Added disabled-by-default local usage evidence that records only command, exit code, version, and UTC timestamp without arguments or paths. + +### Tiếng Việt + +- Bổ sung mẫu synthetic retrieval poisoning xác định với các finding rõ ràng về citation không được hỗ trợ, claim không có căn cứ và output bị cấm. +- Bổ sung kiểm tra Windows không checkout từ package đã public, CodeQL theo least privilege và release gate bảo vệ nhánh chính. +- Bổ sung bằng chứng sử dụng local mặc định tắt, chỉ ghi command, exit code, version và UTC timestamp, không ghi arguments hoặc paths. + +### 日本語 + +- unsupported citation、unsupported claim、forbidden output を明示する決定的な synthetic retrieval-poisoning Failure Zoo specimen を追加しました。 +- 公開 package の checkout-free Windows 検証、least-privilege CodeQL、保護 branch release gate を追加しました。 +- デフォルト無効で、引数や path を記録せず command、exit code、version、UTC timestamp のみを残す local usage evidence を追加しました。 ## [2.0.1] - 2026-08-23 @@ -84,6 +100,7 @@ - リポジトリ所有の GitHub Actions をすべて削除し、リリースゲートはローカル CLI と API で引き続き利用できます。 - 公開タグとパッケージ版を `v1.0.0` に統一しました。 +[2.0.2]: https://github.com/thangldw/ragops/releases/tag/v2.0.2 [2.0.1]: https://github.com/thangldw/ragops/releases/tag/v2.0.1 [2.0.0]: https://github.com/thangldw/ragops/releases/tag/v2.0.0 [1.2.0]: https://github.com/thangldw/ragops/releases/tag/v1.2.0 diff --git a/README.md b/README.md index 0058521..e5d0cd7 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ RAGOps compares recorded candidate behavior with an accepted baseline, applies a Requirements: Python 3.11+. -Current technical references: [architecture](docs/ARCHITECTURE.md), [contracts](docs/CONTRACTS.md), [governance](docs/governance.md), [operations](docs/OPERATIONS.md), [security](SECURITY.md), and [v2.0.1 release notes](docs/releases/v2.0.1.md). +Current technical references: [architecture](docs/ARCHITECTURE.md), [contracts](docs/CONTRACTS.md), [governance](docs/governance.md), [operations](docs/OPERATIONS.md), [security](SECURITY.md), and [v2.0.2 release notes](docs/releases/v2.0.2.md). The repository is also a skills-only plugin for ChatGPT, Codex, Claude Code and Cowork. It does not include a hosted MCP connector. See the [directory submission package](docs/submission/DIRECTORY_SUBMISSION.md), [privacy policy](PRIVACY.md), [terms](TERMS.md), and [support guidance](SUPPORT.md). diff --git a/docs/examples/github-actions-ragops.yml b/docs/examples/github-actions-ragops.yml index 23a1e99..ba1c513 100644 --- a/docs/examples/github-actions-ragops.yml +++ b/docs/examples/github-actions-ragops.yml @@ -16,7 +16,7 @@ jobs: - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: "3.12" - - run: python -m pip install --disable-pip-version-check "ragops==2.0.1" + - run: python -m pip install --disable-pip-version-check "ragops==2.0.2" - name: Evaluate release candidate run: ragops demo --profile engineer --output ragops-output - name: Verify evidence bundle diff --git a/docs/examples/gitlab-ci-ragops.yml b/docs/examples/gitlab-ci-ragops.yml index bf331aa..aa8bb32 100644 --- a/docs/examples/gitlab-ci-ragops.yml +++ b/docs/examples/gitlab-ci-ragops.yml @@ -2,7 +2,7 @@ ragops_release_gate: stage: test image: python:3.12-slim variables: - RAGOPS_VERSION: "2.0.1" + RAGOPS_VERSION: "2.0.2" RAGOPS_SCENARIO: "scenarios/japanese_troubleshooting/benchmark-v0.2.json" RAGOPS_BASELINE: "scenarios/japanese_troubleshooting/benchmark-baseline.json" RAGOPS_CANDIDATE: "scenarios/japanese_troubleshooting/benchmark-regressed.json" diff --git a/docs/releases/v2.0.2.md b/docs/releases/v2.0.2.md new file mode 100644 index 0000000..6f93313 --- /dev/null +++ b/docs/releases/v2.0.2.md @@ -0,0 +1,19 @@ +# RAGOps v2.0.2 + +RAGOps 2.0.2 hardens the public 2.0 release path without changing the offline evaluation contract or supported readers. + +- Adds a deterministic synthetic retrieval-poisoning Failure Zoo specimen that blocks on `unsupported_citation`, `unsupported_claim`, and `forbidden_output_term`. +- Verifies the published package on checkout-free Windows and preserves the same synthetic `BLOCK` decision and evidence verification. +- Adds least-privilege CodeQL scanning and protected-main release gates for Python 3.11, 3.12, 3.13, Windows, and CodeQL. +- Adds disabled-by-default local usage evidence containing only UTC timestamp, RAGOps version, top-level command, and exit code. Arguments and paths are not recorded, and no event is sent over the network. + +The credential-free flagship demo still intentionally blocks a synthetic regression: citation coverage `1.0 -> 0.5`, citation precision `1.0 -> 0.5`, and lexical groundedness `1.0 -> 0.6`. This is reproducible synthetic evidence, not production adoption evidence. + +## Compatibility + +- Python 3.11 or newer. +- Dependency-free core remains offline with zero required runtime dependencies. +- Existing scenario 0.1/0.2 and trace 0.3/0.4 readers remain supported. +- Existing CLI commands, exit codes, and canonical `PASS`, `WARN`, and `BLOCK` decisions are unchanged. +- FastAPI/Uvicorn remain optional through `ragops[api]`. +- No hosted MCP connector is included; the ChatGPT package remains a skills-only plugin. diff --git a/docs/submission/DIRECTORY_SUBMISSION.md b/docs/submission/DIRECTORY_SUBMISSION.md index afeaee1..55a562c 100644 --- a/docs/submission/DIRECTORY_SUBMISSION.md +++ b/docs/submission/DIRECTORY_SUBMISSION.md @@ -1,12 +1,12 @@ # RAGOps directory submission -Prepared: 2026-08-23 +Prepared: 2026-08-24 Published on the OpenAI Plugin Directory: https://chatgpt.com/plugins/plugins_6a6ed9e25c60819194c48f4233ae507e -PyPI release target: https://pypi.org/project/ragops/2.0.1/ +PyPI release target: https://pypi.org/project/ragops/2.0.2/ -Submission artifact: `dist/ragops-chatgpt-plugin-2.0.1.zip` +Submission artifact: `dist/ragops-chatgpt-plugin-2.0.2.zip` ## Submission choice @@ -61,9 +61,9 @@ Submission artifact: `dist/ragops-chatgpt-plugin-2.0.1.zip` No account or credential is required. Use Python 3.11+ and run the bundled wrapper at `skills/evaluate-ai-release/scripts/run_ragops.py`. The OpenAI ZIP stores review fixtures under `skills/evaluate-ai-release/references/fixtures/japanese_troubleshooting`; the GitHub plugin uses the canonical copies under `scenarios/japanese_troubleshooting`. A gate block may return exit code 2; this is an expected evaluated outcome. -## v2.0 update notes +## v2.0.2 update notes -RAGOps 2.0 adds content-addressed evidence bundles, slice-aware policy, calibration, trace graphs, dataset leakage checks, CI-native output, portable import profiles, and audited blind review. The plugin remains skills-only and does not include a hosted MCP connector. The optional local API/workbench is distributed through the Python package, not as a remote ChatGPT connector. +RAGOps 2.0.2 adds a synthetic retrieval-poisoning regression specimen, verified checkout-free Windows use of the published package, CodeQL and protected-branch gates, and explicit opt-in local usage evidence. It retains the 2.0 content-addressed evidence, slice-aware policy, calibration, trace-graph, dataset leakage, CI output, portable import, and blind-review contracts. The plugin remains skills-only and does not include a hosted MCP connector. The optional local API/workbench is distributed through the Python package, not as a remote ChatGPT connector. ## Final portal checks diff --git a/docs/superpowers/plans/2026-08-24-ragops-2.0.2-release.md b/docs/superpowers/plans/2026-08-24-ragops-2.0.2-release.md new file mode 100644 index 0000000..9b146e1 --- /dev/null +++ b/docs/superpowers/plans/2026-08-24-ragops-2.0.2-release.md @@ -0,0 +1,212 @@ +# RAGOps 2.0.2 Release Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Publish the verified post-2.0.1 hardening changes as RAGOps 2.0.2 on GitHub and PyPI, then prepare the ChatGPT Plugin 2.0.2 draft for owner attestations. + +**Architecture:** Treat package metadata, plugin manifests, release notes, and copyable CI recipes as one versioned release contract. Build every promoted artifact from the protected-branch commit, publish the exact GitHub assets through tag-bound PyPI Trusted Publishing, and keep the currently published package in the checkout-free Windows smoke until 2.0.2 is available from PyPI. + +**Tech Stack:** Python 3.11-3.13, pytest, Ruff, PyPA build, CycloneDX, GitHub Actions, PyPI Trusted Publishing, ChatGPT Plugin Directory. + +**Spec:** `docs/superpowers/specs/2026-08-23-ragops-production-flagship-adoption-design.md` + +## Global Constraints + +- Python remains `>=3.11` with zero required runtime dependencies. +- The dependency-free core performs no network calls. +- Synthetic evidence is never described as production adoption evidence. +- Existing CLI commands, schemas, decisions, and exit codes remain compatible. +- GitHub Release, PyPI publication, ChatGPT submission, approval, and publication are independently verified states. +- Do not attest or submit on behalf of DUC THANG LUU without action-time confirmation. +- Do not perform final ChatGPT Publish without a separate action-time confirmation. +- Preserve workflow run `30749103590` as audit history if GitHub still rejects cancellation; do not delete it. + +--- + +### Task 1: Versioned release contract + +**Files:** +- Create: `docs/releases/v2.0.2.md` +- Modify: `pyproject.toml` +- Modify: `src/ragops/__init__.py` +- Modify: `.codex-plugin/plugin.json` +- Modify: `.claude-plugin/plugin.json` +- Modify: `.kimi-plugin/plugin.json` +- Modify: `CHANGELOG.md` +- Modify: `README.md` +- Modify: `docs/submission/DIRECTORY_SUBMISSION.md` +- Modify: `docs/examples/github-actions-ragops.yml` +- Modify: `docs/examples/gitlab-ci-ragops.yml` +- Modify: `tests/test_release_version.py` +- Modify: `tests/test_plugin_release.py` +- Modify: `tests/test_local_release.py` +- Modify: `tests/test_public_api.py` +- Modify: `tests/test_usage.py` +- Modify: `tests/test_adoption_recipes.py` +- Modify: `tests/test_github_workflows.py` +- Test: `tests/test_release_version.py` +- Test: `tests/test_plugin_release.py` +- Test: `tests/test_local_release.py` +- Test: `tests/test_public_api.py` +- Test: `tests/test_usage.py` +- Test: `tests/test_adoption_recipes.py` +- Test: `tests/test_github_workflows.py` + +**Interfaces:** +- Consumes: merged post-release hardening commit `2596bc42a4218a06b4806eabe7bbb4608ff84c84` and published 2.0.1 compatibility contract. +- Produces: package/plugin version `2.0.2`, release notes dated 2026-08-24, and copyable consumer recipes pinned to `ragops==2.0.2`. + +- [x] **Step 1: Change release-contract expectations to 2.0.2** + +Update literal current-version assertions in the six test files. Keep historical local-usage event fixtures at 2.0.1, and keep the live checkout-free Windows workflow pinned to the last published package 2.0.1 until Task 4. + +- [x] **Step 2: Run focused tests and verify RED** + +Run: + +```bash +PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 .venv/bin/python -m pytest -q \ + tests/test_release_version.py tests/test_plugin_release.py \ + tests/test_local_release.py tests/test_public_api.py \ + tests/test_usage.py tests/test_adoption_recipes.py \ + tests/test_github_workflows.py +``` + +Expected: failures identify package/plugin/docs/recipe version 2.0.1 where 2.0.2 is required. + +- [x] **Step 3: Apply the minimal version and documentation update** + +Set package and all plugin manifests to 2.0.2. Move the Unreleased hardening note into a multilingual `2.0.2` changelog section dated 2026-08-24, add the tag link, write release notes that enumerate retrieval-poisoning coverage, checkout-free Windows verification, CodeQL/repository governance, and opt-in local usage evidence, and preserve the synthetic-only limitation. Update current README, submission artifact/PyPI target, and consumer recipes. + +- [x] **Step 4: Run focused tests and verify GREEN** + +Run the Step 2 command. Expected: all focused tests pass. + +- [x] **Step 5: Commit the release contract** + +```bash +git add pyproject.toml src/ragops/__init__.py .codex-plugin/plugin.json \ + .claude-plugin/plugin.json .kimi-plugin/plugin.json CHANGELOG.md README.md \ + docs/releases/v2.0.2.md docs/submission/DIRECTORY_SUBMISSION.md \ + docs/examples/github-actions-ragops.yml docs/examples/gitlab-ci-ragops.yml \ + tests/test_release_version.py tests/test_plugin_release.py \ + tests/test_local_release.py tests/test_public_api.py tests/test_usage.py \ + tests/test_adoption_recipes.py tests/test_github_workflows.py \ + docs/superpowers/plans/2026-08-24-ragops-2.0.2-release.md +git commit -m "chore: prepare RAGOps 2.0.2 release" +``` + +### Task 2: Local owner-acceptance evidence + +**Files:** +- Generate, do not commit: `dist/*` + +**Interfaces:** +- Consumes: clean 2.0.2 release-contract commit. +- Produces: wheel, sdist, deterministic ChatGPT plugin ZIP, CycloneDX SBOM, SHA-256 manifest, and local release evidence bound to the commit. + +- [ ] **Step 1: Run complete source verification** + +```bash +.venv/bin/ruff check . +PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 .venv/bin/python -m pytest -q +git diff --check +``` + +Expected: Ruff clean, all tests pass, and no whitespace errors. + +- [ ] **Step 2: Run the release verifier** + +```bash +.venv/bin/python scripts/local_release.py verify --tag v2.0.2 +``` + +Expected: evaluate passes, regression comparison exits with the expected evaluated BLOCK, the wheel clean-installs and runs the demo/evidence verifier, and all six release artifacts are created. + +- [ ] **Step 3: Validate artifacts independently** + +```bash +(cd dist && shasum -a 256 -c SHA256SUMS) +.venv/bin/python -m twine check dist/ragops-2.0.2.tar.gz dist/ragops-2.0.2-py3-none-any.whl +.venv/bin/python -m zipfile --list dist/ragops-chatgpt-plugin-2.0.2.zip +``` + +Expected: every digest and distribution validates, and the plugin ZIP contains only the manifest, asset, skill, vendored dependency-free core, schemas, and synthetic review fixtures. + +### Task 3: Protected-branch integration + +**Files:** +- All committed Task 1 files. + +**Interfaces:** +- Consumes: verified release branch and GitHub ruleset `Protect main`. +- Produces: merged `main` commit after required Python 3.11/3.12/3.13, Windows, and CodeQL checks. + +- [ ] **Step 1: Push and open the release PR** + +```bash +git push -u origin codex/release-2.0.2 +gh pr create --repo thangldw/ragops --base main --head codex/release-2.0.2 \ + --title "Release RAGOps 2.0.2" \ + --body-file docs/releases/v2.0.2.md +``` + +- [ ] **Step 2: Wait for and inspect every required check** + +Run `gh pr checks --watch` and verify the required contexts are successful with no unresolved review threads. + +- [ ] **Step 3: Merge through the ruleset and verify main** + +Merge the PR without bypass or force-push, fetch `origin/main`, and verify the merged commit contains the exact release contract. + +### Task 4: GitHub and PyPI publication + +**Files:** +- Promote: exact `dist/*` rebuilt from the merged `main` commit. +- Post-publish modify: `.github/workflows/ci.yml` +- Post-publish modify: `tests/test_github_workflows.py` + +**Interfaces:** +- Consumes: protected merged 2.0.2 commit and tag-bound Trusted Publishing workflow. +- Produces: annotated `v2.0.2`, GitHub Release assets, PyPI 2.0.2, and a checkout-free Windows smoke pinned to the newly public package. + +- [ ] **Step 1: Rebuild from the exact merged commit** + +Create a clean release worktree at the merged commit, run `scripts/local_release.py verify --tag v2.0.2`, and compare the artifact manifest with Task 2. If the merge commit differs only by Git history, record the new commit-bound evidence and promote only this rebuild. + +- [ ] **Step 2: Tag and create the GitHub Release** + +Run `scripts/local_release.py publish-github --tag v2.0.2 --yes`; verify tag target, release state, asset count, and every checksum downloaded from GitHub. + +- [ ] **Step 3: Publish with PyPI Trusted Publishing** + +Dispatch `.github/workflows/publish-pypi.yml` with input `tag=v2.0.2`, wait for success, verify the PyPI JSON API reports 2.0.2, and clean-install `ragops==2.0.2` from PyPI in a temporary environment. + +- [ ] **Step 4: Advance the Windows public-package smoke** + +In a follow-up protected PR, change both the Windows workflow and its test from 2.0.1 to 2.0.2, run focused/full verification, merge after all required checks, and confirm the checkout-free Windows job succeeds against PyPI. + +### Task 5: ChatGPT Plugin 2.0.2 draft + +**Files:** +- Upload: verified GitHub Release asset `ragops-chatgpt-plugin-2.0.2.zip` + +**Interfaces:** +- Consumes: publicly verified PyPI/GitHub 2.0.2 and authenticated plugin `plugins_6a6ed9e25c60819194c48f4233ae507e`. +- Produces: one 2.0.2 update draft with passed automated checks and verified metadata; no duplicate submission. + +- [ ] **Step 1: Create one version-update draft** + +Open the existing plugin, start its update flow, upload the checksum-verified 2.0.2 plugin ZIP, and record the draft ID. + +- [ ] **Step 2: Monitor automated checks** + +If checks fail, inspect the visible error and official OpenAI documentation, make only safe in-scope corrections, rebuild/re-upload to the same draft, and never create a duplicate submission. + +- [ ] **Step 3: Verify draft metadata** + +Confirm version 2.0.2, name RAGOps, developer DUC THANG LUU, category, descriptions, legal/support/source URLs, permissions, starter prompts, and update notes match the repository evidence. + +- [ ] **Step 4: Stop before legal attestations and submission** + +Do not check the four policy attestations or click Confirm and submit. Request action-time confirmation from the user to attest and submit on behalf of DUC THANG LUU. After confirmation, submit and monitor review. Request a separate action-time confirmation before final Publish. diff --git a/pyproject.toml b/pyproject.toml index 3de3b2e..82a4e5a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "ragops" -version = "2.0.1" +version = "2.0.2" description = "Regression tests and explainable release gates for RAG and AI agents" readme = "README.md" requires-python = ">=3.11" diff --git a/src/ragops/__init__.py b/src/ragops/__init__.py index 4f40e15..e6ce797 100644 --- a/src/ragops/__init__.py +++ b/src/ragops/__init__.py @@ -12,7 +12,7 @@ replay_bundle_from_dict, ) -__version__ = "2.0.1" +__version__ = "2.0.2" __all__ = [ "compare", diff --git a/tests/test_adoption_recipes.py b/tests/test_adoption_recipes.py index 2c9a57f..8573d0f 100644 --- a/tests/test_adoption_recipes.py +++ b/tests/test_adoption_recipes.py @@ -5,7 +5,7 @@ def test_gitlab_recipe_preserves_evidence_and_exit_code() -> None: recipe = Path("docs/examples/gitlab-ci-ragops.yml").read_text(encoding="utf-8") - assert 'RAGOPS_VERSION: "2.0.1"' in recipe + assert 'RAGOPS_VERSION: "2.0.2"' in recipe assert 'if: \'$CI_PIPELINE_SOURCE == "merge_request_event"\'' in recipe assert "gate_exit=$?" in recipe assert 'exit "$gate_exit"' in recipe @@ -40,6 +40,6 @@ def test_github_caller_is_read_only_and_verifies_evidence() -> None: assert "id-token: write" not in recipe assert "persist-credentials: false" in recipe assert re.search(r"actions/checkout@[0-9a-f]{40}", recipe) - assert '"ragops==2.0.1"' in recipe + assert '"ragops==2.0.2"' in recipe assert "ragops evidence verify" in recipe assert '>> "$GITHUB_STEP_SUMMARY"' in recipe diff --git a/tests/test_github_workflows.py b/tests/test_github_workflows.py index b1c4739..0e3f265 100644 --- a/tests/test_github_workflows.py +++ b/tests/test_github_workflows.py @@ -62,7 +62,7 @@ def test_current_operations_are_linked() -> None: for guide in ( "docs/ARCHITECTURE.md", "docs/OPERATIONS.md", - "docs/releases/v2.0.1.md", + "docs/releases/v2.0.2.md", ): assert Path(guide).is_file() assert guide in readme diff --git a/tests/test_local_release.py b/tests/test_local_release.py index 94bff2d..f6fb845 100644 --- a/tests/test_local_release.py +++ b/tests/test_local_release.py @@ -8,7 +8,7 @@ def test_tag_must_match_package_version() -> None: - assert local_release.assert_tag(local_release.milestone_tag()) == "v2.0.1" + assert local_release.assert_tag(local_release.milestone_tag()) == "v2.0.2" def test_checksum_manifest_is_deterministic(tmp_path, monkeypatch) -> None: diff --git a/tests/test_plugin_release.py b/tests/test_plugin_release.py index ef3f195..7188e77 100644 --- a/tests/test_plugin_release.py +++ b/tests/test_plugin_release.py @@ -16,15 +16,15 @@ def test_chatgpt_plugin_bundle_is_deterministic_and_self_contained(tmp_path, monkeypatch): monkeypatch.setattr(local_release, "DIST", tmp_path) - first = local_release.build_plugin_bundle("2.0.1") + first = local_release.build_plugin_bundle("2.0.2") first_bytes = first.read_bytes() - second = local_release.build_plugin_bundle("2.0.1") + second = local_release.build_plugin_bundle("2.0.2") assert second.read_bytes() == first_bytes with zipfile.ZipFile(first) as archive: names = archive.namelist() manifest = json.loads(archive.read(".codex-plugin/plugin.json")) - assert manifest["version"] == "2.0.1" + assert manifest["version"] == "2.0.2" assert "skills/evaluate-ai-release/SKILL.md" in names assert "skills/evaluate-ai-release/scripts/run_ragops.py" in names assert "skills/evaluate-ai-release/scripts/vendor/ragops/cli.py" in names @@ -35,7 +35,7 @@ def test_chatgpt_plugin_bundle_is_deterministic_and_self_contained(tmp_path, mon def test_extracted_chatgpt_bundle_runs_without_install(tmp_path, monkeypatch): monkeypatch.setattr(local_release, "DIST", tmp_path) - bundle = local_release.build_plugin_bundle("2.0.1") + bundle = local_release.build_plugin_bundle("2.0.2") extracted = tmp_path / "plugin" with zipfile.ZipFile(bundle) as archive: archive.extractall(extracted) @@ -49,4 +49,4 @@ def test_extracted_chatgpt_bundle_runs_without_install(tmp_path, monkeypatch): text=True, ) - assert result.stdout.strip() == "ragops 2.0.1" + assert result.stdout.strip() == "ragops 2.0.2" diff --git a/tests/test_public_api.py b/tests/test_public_api.py index aabfc0b..a6e8d57 100644 --- a/tests/test_public_api.py +++ b/tests/test_public_api.py @@ -3,7 +3,7 @@ def test_stable_version() -> None: - assert __version__ == "2.0.1" + assert __version__ == "2.0.2" def test_cli_exposes_version(capsys) -> None: diff --git a/tests/test_release_version.py b/tests/test_release_version.py index 2dd087b..5f38997 100644 --- a/tests/test_release_version.py +++ b/tests/test_release_version.py @@ -10,9 +10,9 @@ def test_package_and_release_metadata_versions_match() -> None: version = metadata["project"]["version"] changelog = Path("CHANGELOG.md").read_text(encoding="utf-8") - assert version == __version__ == "2.0.1" + assert version == __version__ == "2.0.2" assert f"## [{version}]" in changelog - assert Path("docs/releases/v2.0.1.md").is_file() + assert Path("docs/releases/v2.0.2.md").is_file() def test_plugin_manifests_match_package_version() -> None: @@ -25,4 +25,4 @@ def test_plugin_manifests_match_package_version() -> None: ) } - assert versions == {"2.0.1"} + assert versions == {"2.0.2"} diff --git a/tests/test_usage.py b/tests/test_usage.py index 7d29f53..200c0a3 100644 --- a/tests/test_usage.py +++ b/tests/test_usage.py @@ -103,7 +103,7 @@ def test_usage_log_failure_does_not_change_command_exit_code(tmp_path: Path) -> result = run_cli("--version", usage_log=tmp_path) assert result.returncode == 0 - assert result.stdout.strip() == "ragops 2.0.1" + assert result.stdout.strip() == "ragops 2.0.2" assert "usage log warning" in result.stderr