Skip to content

release: 2.1.0 - #14

Merged
null-result merged 5 commits into
mainfrom
release/2.1.0
Aug 30, 2026
Merged

release: 2.1.0#14
null-result merged 5 commits into
mainfrom
release/2.1.0

Conversation

@null-result

Copy link
Copy Markdown
Owner

What this changes

Releases 2.1.0: Kivax becomes a pip package. pipx install kivax is the whole installation on Windows, macOS, and Linux, and pipx upgrade kivax is the whole upgrade.

Rolls up #13 from develop.

Why

install.py reimplemented what pip already does — dependency resolution (with a --break-system-packages workaround for PEP 668), PATH placement, and a kivax.bat shim on Windows — and it let the CLI and the global store drift, since updating one didn't update the other. The store now ships as package data inside the wheel, so the two are one artifact.

What a reviewer should know

Breaking for existing users. install.py is gone. Anyone who installed by cloning must pipx install kivax and remove ~/.kivax plus the old ~/.local/bin/kivax symlink, which would otherwise keep shadowing the installed CLI. kivax version and kivax doctor detect the leftovers and say so. Projects need no migration — everything kivax init wrote is already committed.

Editing the store by hand no longer works. It was never supported (agents are generated, kivax upgrade overwrites project copies), so this stops pretending rather than removing a feature. README documents the alternatives: the agents: block for models, upstream for behavior, KIVAX_HOME for a vendored store.

Release mechanics are new and untested end to end. This is the first tag that .github/workflows/release.yml will act on. It validates the tag against src/kivax/data/VERSION (so the tag must be v2.1.0), builds, and publishes to PyPI via Trusted Publishing. A failed publish burns nothing — PyPI only rejects a re-upload of a version that landed — so the job can be re-run.

Verified

All checks green on #13 across Linux, macOS, and Windows: 482 tests, coverage 96.89%, ruff clean.

The package job is the one that matters here — it builds the wheel, asserts its store file count matches the tree exactly (46/46), installs it into a clean virtualenv with no access to the checkout, and drives a real init / feature new / doctor / validate. That last one confirms the os.execv switch to python -m kivax.lib.<mod> survives a real install.

Checklist

  • pytest tests passes
  • Coverage stays at or above the 90% gate — 96.89%
  • ruff check . passes
  • Behavior changes are covered by tests
  • Agents and skills under src/kivax/data/ updated — the sample CI gate now installs with pip install kivax
  • The package CI job passes on all three runners
  • README updated — install, upgrade, uninstall, troubleshooting, layout, and a pre-2.1 migration note

🤖 Generated with Claude Code

null-result and others added 5 commits August 2, 2026 10:09
chore: back-merge v2.0.0 release into develop
Kivax was installed by cloning the repo and running install.py, which copied
share/ into ~/.kivax and symlinked the CLI onto PATH. That installer was a
reimplementation of what pip already does — dependency resolution (with a
--break-system-packages workaround for PEP 668), PATH placement, and a
kivax.bat shim on Windows — and it let the CLI and the store drift apart,
since updating one didn't update the other.

The global store is now package data at src/kivax/data/, so the CLI and the
material it copies into projects ship as one artifact and cannot disagree
about which version they are. `pipx install kivax` is the install, and
`pipx upgrade kivax` is the entire upgrade path.

- bin/kivax -> src/kivax/cli.py, exposed as the `kivax` console script
- share/lib/*.py -> src/kivax/lib/, a real package with relative imports
  instead of sys.path.insert; passthrough subcommands re-exec via
  `python -m kivax.lib.kivax_<name>` rather than a path to a script file
- share/{agents,runtime,templates,ci} + the two catalogs -> src/kivax/data/
- KIVAX_HOME still overrides the store, which is now the contributor flow
  and the escape hatch for a vendored one
- the rendered-agent cache moves to ~/.cache/kivax, since site-packages must
  be treated as read-only; it stays inside KIVAX_HOME when that is set, so
  two stores never share one cache

BREAKING CHANGE: install.py is gone. Existing users must `pipx install kivax`
and remove ~/.kivax plus the old ~/.local/bin/kivax symlink, which would
otherwise keep shadowing the installed CLI. `kivax version` and `kivax doctor`
detect the leftovers and say so. Projects need no migration.

Editing the store by hand is no longer possible. It was never supported —
agents are generated and `kivax upgrade` overwrites a project's copies — and
the README now documents the two real options: the `agents:` block in
config.yml for models, upstream changes for behavior.

The suite runs against src/ on sys.path, where a wrong package-data glob is
invisible, so a `package` CI job builds the wheel, asserts its store file
count matches the tree, installs it into a clean virtualenv, and drives a
real init/feature/doctor/validate from a temp directory. The install job it
replaces tested an installer that no longer exists.

Co-Authored-By: Claude <noreply@anthropic.com>
The template still told contributors to run `--cov=.`, `ruff check . bin/kivax`,
and to update agents under `share/` — all three obsolete as of the packaging
change. Adds a line for the `package` job, which is the only check that sees
the built wheel and so the only one that can catch a broken package-data glob.

Co-Authored-By: Claude <noreply@anthropic.com>
The package job asserts that 'kivax feature new' is refused before project
setup, by piping the failing command into grep. That worked in the install
job this replaces, whose steps ran under the implicit `bash -e {0}`. Adding
`defaults.run.shell: bash` for the Windows leg of the matrix switches the
invocation to `bash -eo pipefail {0}`, and under pipefail a pipeline whose
first command fails on purpose fails the step — so the job went red on all
three runners while the packaging it was checking was fine.

Captures the output instead, and asserts both halves in one invocation: that
the command is refused, and that it says why.

Co-Authored-By: Claude <noreply@anthropic.com>
feat(packaging): ship kivax as a pip package with the store inside it
@null-result
null-result merged commit 2f29111 into main Aug 30, 2026
27 checks passed
@null-result
null-result deleted the release/2.1.0 branch August 30, 2026 10:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant