From 2b071d14b0f5a3cdc726f1bb25f25e4e60e7c14b Mon Sep 17 00:00:00 2001 From: Marius1311 Date: Tue, 13 Oct 2026 12:05:06 +0200 Subject: [PATCH 1/2] Release 0.2.2; the version bump is the whole release The marketplace now follows main, so a plugin.json version bump releases; a workflow tags vX.Y.Z on merge. Co-Authored-By: Claude Opus 5.5 --- .claude-plugin/plugin.json | 2 +- .github/workflows/tag.yaml | 22 ++++++++++++++++++++++ README.md | 7 ++++--- pyproject.toml | 2 +- uv.lock | 2 +- 5 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/tag.yaml diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 29fb669..67fd0f1 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "analysis-workflow", - "version": "0.2.1", + "version": "0.2.2", "description": "Conventions for analysis repos where humans (notebooks) and coding agents (scripts) work side by side: one task per session, worktree and directory; worktree-safe output paths; additive write-back to AnnData zarr working objects. Ships a skill, guard hooks and the analysis_workflow Python package.", "author": { "name": "quadbio" diff --git a/.github/workflows/tag.yaml b/.github/workflows/tag.yaml new file mode 100644 index 0000000..4db17d1 --- /dev/null +++ b/.github/workflows/tag.yaml @@ -0,0 +1,22 @@ +name: Tag release + +on: + push: + branches: [main] + paths: [.claude-plugin/plugin.json] + +permissions: + contents: write + +jobs: + tag: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - name: Tag the version in plugin.json, if new + run: | + tag="v$(jq -r .version .claude-plugin/plugin.json)" + if ! git ls-remote --exit-code --tags origin "refs/tags/$tag" > /dev/null; then + git tag "$tag" + git push origin "$tag" + fi diff --git a/README.md b/README.md index ff8d056..43cdfa3 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ their committed `.claude/settings.json`, as [analysis_template](https://github.c ```toml [pypi-dependencies] -analysis-workflow = { git = "https://github.com/quadbio/analysis-workflow", tag = "v0.2.1" } +analysis-workflow = { git = "https://github.com/quadbio/analysis-workflow", tag = "v0.2.2" } ``` ## Develop @@ -70,8 +70,9 @@ For live package edits in an analysis repo, depend on the checkout instead: ## Release -Bump `version` in both `pyproject.toml` and `.claude-plugin/plugin.json` (a test checks they agree), tag -`vX.Y.Z`, then bump the `ref` in [quadbio/claude-plugins](https://github.com/quadbio/claude-plugins). +Bump `version` in both `pyproject.toml` and `.claude-plugin/plugin.json` (a test checks they agree). +That is the release: the marketplace follows `main`, users update when the version changes, and the merge tags +`vX.Y.Z`, which analysis repos pin. ## License diff --git a/pyproject.toml b/pyproject.toml index dcb49bb..485d667 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ requires = [ "hatchling" ] [project] name = "analysis-workflow" -version = "0.2.1" +version = "0.2.2" description = "Task paths, additive AnnData write-back and layout checks for agent-run analysis repos." readme = "README.md" license = "MIT" diff --git a/uv.lock b/uv.lock index e966cb4..228c03e 100644 --- a/uv.lock +++ b/uv.lock @@ -12,7 +12,7 @@ resolution-markers = [ [[package]] name = "analysis-workflow" -version = "0.2.1" +version = "0.2.2" source = { editable = "." } dependencies = [ { name = "anndata" }, From b625744b3b8e1175684c4d8d9c7f97f78dfab6d1 Mon Sep 17 00:00:00 2001 From: Marius1311 Date: Tue, 13 Oct 2026 12:14:33 +0200 Subject: [PATCH 2/2] Release: plugin.json holds the only version; no tag workflow, no pinned versions in docs Co-Authored-By: Claude Opus 5.5 --- .github/workflows/tag.yaml | 22 ---------------------- README.md | 9 ++++----- pyproject.toml | 4 +++- tests/test_plugin.py | 9 +-------- uv.lock | 1 - 5 files changed, 8 insertions(+), 37 deletions(-) delete mode 100644 .github/workflows/tag.yaml diff --git a/.github/workflows/tag.yaml b/.github/workflows/tag.yaml deleted file mode 100644 index 4db17d1..0000000 --- a/.github/workflows/tag.yaml +++ /dev/null @@ -1,22 +0,0 @@ -name: Tag release - -on: - push: - branches: [main] - paths: [.claude-plugin/plugin.json] - -permissions: - contents: write - -jobs: - tag: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v5 - - name: Tag the version in plugin.json, if new - run: | - tag="v$(jq -r .version .claude-plugin/plugin.json)" - if ! git ls-remote --exit-code --tags origin "refs/tags/$tag" > /dev/null; then - git tag "$tag" - git push origin "$tag" - fi diff --git a/README.md b/README.md index 43cdfa3..3bc76cf 100644 --- a/README.md +++ b/README.md @@ -48,11 +48,11 @@ their committed `.claude/settings.json`, as [analysis_template](https://github.c } ``` -**The package**, in the analysis repo's `pixi.toml`: +**The package**, in the analysis repo's `pixi.toml` (its lock pins the commit; `pixi update` moves it): ```toml [pypi-dependencies] -analysis-workflow = { git = "https://github.com/quadbio/analysis-workflow", tag = "v0.2.2" } +analysis-workflow = { git = "https://github.com/quadbio/analysis-workflow" } ``` ## Develop @@ -70,9 +70,8 @@ For live package edits in an analysis repo, depend on the checkout instead: ## Release -Bump `version` in both `pyproject.toml` and `.claude-plugin/plugin.json` (a test checks they agree). -That is the release: the marketplace follows `main`, users update when the version changes, and the merge tags -`vX.Y.Z`, which analysis repos pin. +Bump `version` in `.claude-plugin/plugin.json` and merge: the marketplace follows `main`, and users update when the +version changes. ## License diff --git a/pyproject.toml b/pyproject.toml index 485d667..48a515c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,6 @@ requires = [ "hatchling" ] [project] name = "analysis-workflow" -version = "0.2.2" description = "Task paths, additive AnnData write-back and layout checks for agent-run analysis repos." readme = "README.md" license = "MIT" @@ -16,6 +15,7 @@ classifiers = [ "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", ] +dynamic = [ "version" ] dependencies = [ "anndata>=0.12", "numpy", "pandas", "scipy", "typer", "zarr>=3" ] urls.Source = "https://github.com/quadbio/analysis-workflow" scripts.analysis-workflow = "analysis_workflow.cli:app" @@ -24,6 +24,8 @@ scripts.analysis-workflow = "analysis_workflow.cli:app" dev = [ "pre-commit", "pytest" ] [tool.hatch] +version.path = ".claude-plugin/plugin.json" +version.pattern = '"version": "(?P[^"]+)"' build.targets.wheel.packages = [ "src/analysis_workflow" ] [tool.ruff] diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 1df3307..06d0e38 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -1,18 +1,11 @@ -"""The plugin manifest and the Python package describe the same release.""" +"""The plugin manifest points at files that exist.""" import json -import tomllib from pathlib import Path ROOT = Path(__file__).parents[1] -def test_versions_agree(): - plugin = json.loads((ROOT / ".claude-plugin" / "plugin.json").read_text()) - package = tomllib.loads((ROOT / "pyproject.toml").read_text())["project"] - assert plugin["version"] == package["version"] - - def test_hook_scripts_exist(): hooks = json.loads((ROOT / "hooks" / "hooks.json").read_text())["hooks"] commands = [h["command"] for groups in hooks.values() for group in groups for h in group["hooks"]] diff --git a/uv.lock b/uv.lock index 228c03e..20e8077 100644 --- a/uv.lock +++ b/uv.lock @@ -12,7 +12,6 @@ resolution-markers = [ [[package]] name = "analysis-workflow" -version = "0.2.2" source = { editable = "." } dependencies = [ { name = "anndata" },