cinna-cli 0.1.5__tar.gz → 0.1.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/PKG-INFO +1 -1
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/docs/README.md +39 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/pyproject.toml +1 -1
- cinna_cli-0.1.6/src/cinna/__init__.py +8 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/tests/test_main.py +5 -1
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/uv.lock +1 -1
- cinna_cli-0.1.5/src/cinna/__init__.py +0 -3
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/.github/workflows/publish.yml +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/.gitignore +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/LICENSE.md +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/README.md +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/docs/interface.md +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/docs/mutagen_capabilities.md +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/src/cinna/auth.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/src/cinna/bootstrap.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/src/cinna/client.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/src/cinna/config.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/src/cinna/console.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/src/cinna/context.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/src/cinna/errors.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/src/cinna/logging.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/src/cinna/main.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/src/cinna/mcp_proxy.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/src/cinna/mutagen_runtime.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/src/cinna/sync.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/src/cinna/sync_session.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/src/cinna/sync_ssh_shim.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/src/cinna/sync_tui.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/src/cinna/templates/CLAUDE.md.template +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/src/cinna/templates/__init__.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/tests/__init__.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/tests/conftest.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/tests/test_auth.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/tests/test_bootstrap.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/tests/test_client.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/tests/test_config.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/tests/test_context.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/tests/test_mutagen_runtime.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/tests/test_sync.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/tests/test_sync_session.py +0 -0
- {cinna_cli-0.1.5 → cinna_cli-0.1.6}/tests/test_sync_ssh_shim.py +0 -0
|
@@ -442,6 +442,45 @@ uv run ruff format --check src/
|
|
|
442
442
|
|
|
443
443
|
---
|
|
444
444
|
|
|
445
|
+
## Release Management
|
|
446
|
+
|
|
447
|
+
The CLI is published to [PyPI](https://pypi.org/project/cinna-cli/) by `.github/workflows/publish.yml`, which runs on any pushed tag matching `v*` (and via manual `workflow_dispatch`). It builds the sdist + wheel with `uv build`, runs `twine check`, then publishes through PyPI **Trusted Publishing** (OIDC — no stored API token) from the GitHub `pypi` environment.
|
|
448
|
+
|
|
449
|
+
### Cutting a release
|
|
450
|
+
|
|
451
|
+
Versioning is SemVer (`MAJOR.MINOR.PATCH`); a patch release is the common case. From a clean `main` with the changes you want to ship already merged:
|
|
452
|
+
|
|
453
|
+
1. **Bump the version** — edit `version` in `pyproject.toml` (e.g. `0.1.4` → `0.1.5`).
|
|
454
|
+
2. **Refresh the lockfile** — run `uv lock` so the `cinna-cli` entry in `uv.lock` matches the new version. These two files are the *only* changes in a release commit.
|
|
455
|
+
3. **Commit** with the exact message `release vX.Y.Z` (this is the established convention — release commits touch nothing but `pyproject.toml` + `uv.lock`).
|
|
456
|
+
4. **Tag** the release commit: `git tag vX.Y.Z` (lightweight tag, on the `release` commit).
|
|
457
|
+
5. **Push both** the branch and the tag: `git push origin main && git push origin vX.Y.Z`. Pushing the tag is what triggers the publish workflow.
|
|
458
|
+
|
|
459
|
+
```bash
|
|
460
|
+
# version already bumped in pyproject.toml
|
|
461
|
+
uv lock
|
|
462
|
+
git add pyproject.toml uv.lock
|
|
463
|
+
git commit -m "release v0.1.5"
|
|
464
|
+
git tag v0.1.5
|
|
465
|
+
git push origin main && git push origin v0.1.5
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
### Manual approval gate
|
|
469
|
+
|
|
470
|
+
> **The release manager must manually approve the PyPI publish.** Pushing the tag only *starts* the workflow — the `publish` job targets the protected `pypi` environment, which requires a reviewer to sign off before it runs. Go to **https://github.com/opencinna/cinna-cli/actions**, open the run for the tag you just pushed, and **approve the deployment**. Until you approve, the build completes but nothing is published to PyPI.
|
|
471
|
+
|
|
472
|
+
### Required changes checklist
|
|
473
|
+
|
|
474
|
+
| File | Change | Why |
|
|
475
|
+
|------|--------|-----|
|
|
476
|
+
| `pyproject.toml` | `version = "X.Y.Z"` | The single source of truth for the published package version. |
|
|
477
|
+
| `uv.lock` | regenerated via `uv lock` | Keeps the lockfile's `cinna-cli` entry in sync; CI builds from a consistent tree. |
|
|
478
|
+
| git tag `vX.Y.Z` | created on the release commit | The only trigger for the publish workflow. |
|
|
479
|
+
|
|
480
|
+
`pyproject.toml` is the **only** place the version lives. `src/cinna/__init__.py` derives `__version__` at runtime from the installed package metadata (`importlib.metadata.version("cinna-cli")`), which is what `cinna --version` reports — so it tracks `pyproject.toml` automatically and never needs a manual bump. (It falls back to `0.0.0+unknown` only when run from a source tree with no installed metadata.)
|
|
481
|
+
|
|
482
|
+
---
|
|
483
|
+
|
|
445
484
|
## Tech Stack
|
|
446
485
|
|
|
447
486
|
| Component | Choice | Rationale |
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"""cinna-cli — Local development CLI for Cinna Core agents."""
|
|
2
|
+
|
|
3
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
4
|
+
|
|
5
|
+
try:
|
|
6
|
+
__version__ = version("cinna-cli")
|
|
7
|
+
except PackageNotFoundError: # not installed (e.g. running from a source tree without metadata)
|
|
8
|
+
__version__ = "0.0.0+unknown"
|
|
@@ -13,9 +13,13 @@ def runner():
|
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
def test_version(runner):
|
|
16
|
+
from cinna import __version__
|
|
17
|
+
|
|
16
18
|
result = runner.invoke(cli, ["--version"])
|
|
17
19
|
assert result.exit_code == 0
|
|
18
|
-
|
|
20
|
+
# __version__ is derived from package metadata, not hard-coded — assert the
|
|
21
|
+
# CLI reports whatever the installed package version is.
|
|
22
|
+
assert __version__ in result.output
|
|
19
23
|
|
|
20
24
|
|
|
21
25
|
def test_status_no_workspace(runner):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|