diff --git a/.github/workflows/compatibility.yml b/.github/workflows/compatibility.yml index 25642e7..2165d73 100644 --- a/.github/workflows/compatibility.yml +++ b/.github/workflows/compatibility.yml @@ -8,7 +8,7 @@ on: workflow_dispatch: inputs: upcoming_base_cli: - description: "Optional pip requirement suffix for an upcoming build, for example ==0.4.4rc1" + description: "Optional pip requirement suffix for an upcoming build, for example ==0.5.1rc1" required: false type: string @@ -29,9 +29,9 @@ jobs: python-version: ["3.10", "3.13"] base_cli: - name: minimum released - spec: "==0.4.3" + spec: "==0.5.0" - name: latest supported - spec: ">=0.4.3,<0.5" + spec: ">=0.5.0,<0.6" steps: - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - name: Set up Python diff --git a/.github/workflows/published-release-assets.yml b/.github/workflows/published-release-assets.yml index 2133009..f42af5a 100644 --- a/.github/workflows/published-release-assets.yml +++ b/.github/workflows/published-release-assets.yml @@ -32,10 +32,10 @@ jobs: matrix: python-version: ["3.10", "3.13"] base_cli: - - name: minimum-0.4.3 - spec: "==0.4.3" + - name: minimum-0.5.0 + spec: "==0.5.0" - name: latest-supported - spec: ">=0.4.3,<0.5" + spec: ">=0.5.0,<0.6" steps: - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 with: @@ -120,7 +120,7 @@ jobs: run: | { printf 'Release tag: %s\n' "$RELEASE_TAG" - printf 'Declared Base-CLI range: base-cli>=0.4.3,<0.5\n\n' + printf 'Declared Base-CLI range: base-cli>=0.5.0,<0.6\n\n' find release-dist/compatibility-evidence -name compatibility.txt -print -exec cat {} \; } > release-dist/COMPATIBILITY.txt sha256sum release-dist/*.whl release-dist/*.tar.gz release-dist/COMPATIBILITY.txt > release-dist/SHA256SUMS.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d7ba3a..f56b246 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and versions are tracked in the repo-root `VERSION` file. ## [Unreleased] +### Changed + +- Align the reference consumer, compatibility matrix, release evidence, and + documentation with the Base-CLI 0.5.0 API line; successful telemetry spans + now assert the 0.5.0 `status=OK` lifecycle contract. + ## [0.1.0] - 2026-09-02 ### Added diff --git a/README.md b/README.md index dbcd4cb..f1a3add 100644 --- a/README.md +++ b/README.md @@ -39,12 +39,17 @@ $ northstar --quiet status ### Install an existing release -The first immutable demo release is not published yet. The documented -from-source install above is the supported path until -[#28](https://github.com/basefoundry/base-cli-demo/issues/28) completes the -release readiness gates. After publication, this section should be restored -with the verified wheel URL, checksum, and matching `base-cli` dependency line; -do not infer a release from the source `VERSION` file. +To install the first published demo release without cloning the repository: + +```bash +python -m pip install \ + "https://github.com/basefoundry/base-cli-demo/releases/download/v0.1.0/base_cli_demo-0.1.0-py3-none-any.whl" +``` + +Verify the artifact against `SHA256SUMS.txt` on the same GitHub Release. The +published `v0.1.0` wheel depends on the released `base-cli>=0.4.3,<0.5` +API line. The current source and next demo release target the +`base-cli>=0.5.0,<0.6` line; neither installs Base or requires a Base workspace. The default environment is `dev`. Select another fixture environment with the framework lifecycle option: @@ -138,9 +143,8 @@ python -m pip install ".[dev]" ``` The package requires Python 3.10 or newer and pins the supported Base-CLI line -to `>=0.4.3,<0.5`. This checkout carries source version `0.1.0`; immutable -publication is tracked separately in #28, and demo release versioning remains -independent from framework versioning. +to `>=0.5.0,<0.6`. This checkout targets the next demo release after `v0.1.0`; +demo release versioning remains separate from framework versioning. ## Documentation @@ -151,8 +155,8 @@ release. To start with a minimal consumer rather than the full demo, use the For framework-level material, start at the [Base-CLI repository](https://github.com/basefoundry/base-cli), its -[getting-started guide](https://github.com/basefoundry/base-cli/blob/v0.4.3/README.md#quick-start), -or the [public API reference](https://github.com/basefoundry/base-cli/blob/v0.4.3/docs/api-reference.md). +[getting-started guide](https://github.com/basefoundry/base-cli/blob/v0.5.0/README.md#quick-start), +or the [public API reference](https://github.com/basefoundry/base-cli/blob/v0.5.0/docs/api-reference.md). ## Repository shape diff --git a/docs/README.md b/docs/README.md index 62236df..0873ccc 100644 --- a/docs/README.md +++ b/docs/README.md @@ -26,5 +26,5 @@ the complete Northstar consumer: For the framework's complete material, start at the [Base-CLI repository](https://github.com/basefoundry/base-cli), its -[getting-started guide](https://github.com/basefoundry/base-cli/blob/v0.4.3/README.md#quick-start), -or the [public API reference](https://github.com/basefoundry/base-cli/blob/v0.4.3/docs/api-reference.md). +[getting-started guide](https://github.com/basefoundry/base-cli/blob/v0.5.0/README.md#quick-start), +or the [public API reference](https://github.com/basefoundry/base-cli/blob/v0.5.0/docs/api-reference.md). diff --git a/docs/compatibility.md b/docs/compatibility.md index 2cd2ddf..ab3136d 100644 --- a/docs/compatibility.md +++ b/docs/compatibility.md @@ -4,12 +4,12 @@ The demo is a consumer of the published `base-cli` package, not a source checkout consumer. Its declared support range is visible in `pyproject.toml`: ```text -base-cli>=0.4.3,<0.5 +base-cli>=0.5.0,<0.6 ``` The [Compatibility workflow](../.github/workflows/compatibility.yml) builds a -wheel from this repository, installs the minimum released Base-CLI (`0.4.3`) -and the latest release in the supported `<0.5` line, then installs the demo +wheel from this repository, installs the minimum released Base-CLI (`0.5.0`) +and the latest release in the supported `<0.6` line, then installs the demo wheel without dependencies before running the tests. It covers Python 3.10 and 3.13, the ends of the supported interpreter range used by this repository. @@ -20,9 +20,9 @@ quickstart appear healthy. The update policy is intentionally explicit: -- `0.4.3` is the minimum compatibility floor and changes only with a support +- `0.5.0` is the minimum compatibility floor and changes only with a support decision. -- `<0.5` keeps the demo on the released 0.4 API line until a future issue +- `<0.6` keeps the demo on the released 0.5 API line until a future issue evaluates the next minor API boundary. - A pull request or release should update the range, tests, and this document together when the supported Base-CLI line changes. @@ -30,6 +30,6 @@ The update policy is intentionally explicit: ## Upcoming builds Run the workflow manually and provide a pip requirement suffix such as -`==0.4.4rc1` in the `upcoming_base_cli` input. The `upcoming` job is explicitly +`==0.5.1rc1` in the `upcoming_base_cli` input. The `upcoming` job is explicitly non-blocking, so it provides early compatibility evidence without turning an unreleased framework build into the supported release gate. diff --git a/docs/learning-path.md b/docs/learning-path.md index e4f25b4..84a6424 100644 --- a/docs/learning-path.md +++ b/docs/learning-path.md @@ -103,10 +103,10 @@ Open `src/base_cli_demo/cli.py` while following the examples: repository conventions mandatory. For deeper framework context, continue with the Base-CLI -[API reference](https://github.com/basefoundry/base-cli/blob/v0.4.3/docs/api-reference.md), -[consumer profiles](https://github.com/basefoundry/base-cli/blob/v0.4.3/docs/consumer-profiles.md), -[output contracts](https://github.com/basefoundry/base-cli/blob/v0.4.3/docs/output-contracts.md), -[JSON contracts](https://github.com/basefoundry/base-cli/blob/v0.4.3/docs/json-contracts.md), +[API reference](https://github.com/basefoundry/base-cli/blob/v0.5.0/docs/api-reference.md), +[consumer profiles](https://github.com/basefoundry/base-cli/blob/v0.5.0/docs/consumer-profiles.md), +[output contracts](https://github.com/basefoundry/base-cli/blob/v0.5.0/docs/output-contracts.md), +[JSON contracts](https://github.com/basefoundry/base-cli/blob/v0.5.0/docs/json-contracts.md), and [testing guide](https://github.com/basefoundry/base-cli/blob/main/docs/testing.md). ## Current behavior and future scope diff --git a/docs/optional-integrations.md b/docs/optional-integrations.md index db73071..d75c3bf 100644 --- a/docs/optional-integrations.md +++ b/docs/optional-integrations.md @@ -55,6 +55,9 @@ Without the extra, the command reports `telemetry=unavailable (install records the span in an in-memory exporter and prints its name/status; it does not attach argv, configuration, paths, or secrets. +Successful invocations report `status=OK`; failed invocations report an error +status while preserving the command's primary exit result. + The focused tests run in both modes: the normal CI job exercises the minimal fallbacks, while the optional-integration CI job installs all three extras and exercises the enabled adapters. diff --git a/docs/should-i-use-base-cli.md b/docs/should-i-use-base-cli.md index dcab520..f222c7c 100644 --- a/docs/should-i-use-base-cli.md +++ b/docs/should-i-use-base-cli.md @@ -2,13 +2,13 @@ ## Status and compatibility -As of this guide, the newest published Base-CLI release is `0.4.3`; the package -is pre-1.0 and classified as Beta. The demo currently tests the released -`>=0.4.3,<0.5` line. This is not a promise that every future pre-1.0 minor line +As of this guide, the target Base-CLI release is `0.5.0`; the package is pre-1.0 +and classified as Beta. The demo tests the released `>=0.5.0,<0.6` line. This +is not a promise that every future pre-1.0 minor line is compatible: Base-CLI's published policy treats patch releases as compatible and allows a minor release before 1.0 to be a compatibility boundary. Read the -[API stability policy](https://github.com/basefoundry/base-cli/blob/v0.4.3/docs/api-stability.md) -and [migration notes](https://github.com/basefoundry/base-cli/blob/v0.4.3/docs/migrations.md) +[API stability policy](https://github.com/basefoundry/base-cli/blob/v0.5.0/docs/api-stability.md) +and [migration notes](https://github.com/basefoundry/base-cli/blob/v0.5.0/docs/migrations.md) when changing the dependency range. The demo's lockfile records a reproducible resolved environment; readers moving to the 0.5 line should also read the [0.5 migration notes](https://github.com/basefoundry/base-cli/blob/main/docs/migration-0.5.md). @@ -50,8 +50,8 @@ and domain policy, but its entry point and tests now follow Base-CLI's invocation model. The consuming team must maintain its supported dependency range, lock or otherwise reproduce the environment, and run compatibility tests when upgrading. Before 1.0, a minor framework upgrade may require a -compatibility review or code changes; this demo's `<0.5` bound deliberately -does not follow a future 0.5 line automatically. +compatibility review or code changes; this demo's `<0.6` bound deliberately +does not follow a future 0.6 line automatically. ## Alternatives and trade-offs @@ -63,7 +63,7 @@ does not follow a future 0.5 line automatically. | Base-CLI with Click or Typer | A shared lifecycle and documented automation/output boundary around a familiar parser. | One more dependency, an integration model to learn, and compatibility work as the framework evolves. | For the parser-focused comparison maintained by the framework project, see its -[framework choice guide](https://github.com/basefoundry/base-cli/blob/v0.4.3/docs/framework-choice.md). +[framework choice guide](https://github.com/basefoundry/base-cli/blob/v0.5.0/docs/framework-choice.md). For primary references, see the official [argparse documentation](https://docs.python.org/3/library/argparse.html), [Click documentation](https://click.palletsprojects.com/), and diff --git a/docs/use-in-your-project.md b/docs/use-in-your-project.md index b5de47c..e6231c1 100644 --- a/docs/use-in-your-project.md +++ b/docs/use-in-your-project.md @@ -7,7 +7,7 @@ invocation lifecycle. Install the released framework line used by this demo: ```bash -python -m pip install "base-cli>=0.4.3,<0.5" "click>=8.1,<8.6" +python -m pip install "base-cli>=0.5.0,<0.6" "click>=8.1,<8.6" ``` Save this as `hello.py`: @@ -48,5 +48,5 @@ consumer-owned configuration, and structured output. The `App` and `attach` calls establish the framework boundary; the Click function remains your command. See the framework's [consumer quickstart](https://github.com/basefoundry/base-cli/blob/main/docs/consumer-quickstart.md) -and [API reference](https://github.com/basefoundry/base-cli/blob/v0.4.3/docs/api-reference.md) +and [API reference](https://github.com/basefoundry/base-cli/blob/v0.5.0/docs/api-reference.md) for the public interfaces. diff --git a/pyproject.toml b/pyproject.toml index 1a86836..1f9a1b1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ description = "Reference consumer and learning application for the base-cli fram readme = "README.md" requires-python = ">=3.10" dependencies = [ - "base-cli>=0.4.3,<0.5", + "base-cli>=0.5.0,<0.6", "click>=8.1,<8.6", ] @@ -26,7 +26,7 @@ rich = [ "rich>=13.7,<15", ] yaml = [ - "base-cli[yaml]>=0.4.3,<0.5", + "base-cli[yaml]>=0.5.0,<0.6", ] telemetry = [ "opentelemetry-api>=1.24,<2", diff --git a/tests/test_documentation.py b/tests/test_documentation.py index c8abd26..7b7e9fb 100644 --- a/tests/test_documentation.py +++ b/tests/test_documentation.py @@ -37,7 +37,7 @@ def test_documented_dependency_windows_match_project_metadata() -> None: metadata = Path("pyproject.toml").read_text(encoding="utf-8") starter = Path("docs/use-in-your-project.md").read_text(encoding="utf-8") - for requirement in ('"base-cli>=0.4.3,<0.5"', '"click>=8.1,<8.6"'): + for requirement in ('"base-cli>=0.5.0,<0.6"', '"click>=8.1,<8.6"'): assert requirement in metadata assert requirement.strip('"') in starter diff --git a/tests/test_optional_scenarios.py b/tests/test_optional_scenarios.py index f23849f..752f69c 100644 --- a/tests/test_optional_scenarios.py +++ b/tests/test_optional_scenarios.py @@ -114,7 +114,7 @@ def test_telemetry_sdk_records_the_base_cli_lifecycle_span(tmp_path: Path) -> No assert result.returncode == 0, result.stderr assert "recorded_spans=1" in result.stdout assert "span=base_cli.run" in result.stdout - assert "status=UNSET" in result.stdout + assert "status=OK" in result.stdout def test_rich_human_renderer_runs_on_a_real_terminal(tmp_path: Path) -> None: diff --git a/uv.lock b/uv.lock index a32f7c9..480bcc3 100644 --- a/uv.lock +++ b/uv.lock @@ -22,14 +22,14 @@ wheels = [ [[package]] name = "base-cli" -version = "0.4.3" +version = "0.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/85/aa/cb963f3a1e26b84e44992d2dd08a31539bd94454b4d26104f30e9d3d375a/base_cli-0.4.3.tar.gz", hash = "sha256:d9d05ff479c2f0ff03334a69f4f20cb17b2e1844d94e8727f837e5b8dfe3fc95", size = 320272, upload-time = "2026-08-29T04:19:08.582Z" } +sdist = { url = "https://files.pythonhosted.org/packages/59/65/bf7f021710d7c56321cafbadbfe5550aee7a4b917e010aa69abce470a2e5/base_cli-0.5.0.tar.gz", hash = "sha256:262b66a303f4ca821484e6a603c56379c26bf7f3526bc2cf1ae3b2c9a9027396", size = 411984, upload-time = "2026-10-10T01:20:39.682Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/d3/8ad3a107480e55b9ac956a84460616d9152c4ca7055c50acec12ca40785e/base_cli-0.4.3-py3-none-any.whl", hash = "sha256:b4bf684d164b9fdf31d1d0176dfcb5359cedf9b22434d6f6a5483243e27c9b89", size = 123477, upload-time = "2026-08-29T04:19:07.27Z" }, + { url = "https://files.pythonhosted.org/packages/cd/da/5144962d9f50943e367ef6afeb4938021868be1841a80af45c2ddfe3f186/base_cli-0.5.0-py3-none-any.whl", hash = "sha256:68ea16c38bc5bff49a328e2d03a6c2f2d182be1967a366f542c7092332da0d98", size = 144776, upload-time = "2026-10-10T01:20:38.314Z" }, ] [package.optional-dependencies] @@ -67,8 +67,8 @@ yaml = [ [package.metadata] requires-dist = [ - { name = "base-cli", specifier = ">=0.4.3,<0.5" }, - { name = "base-cli", extras = ["yaml"], marker = "extra == 'yaml'", specifier = ">=0.4.3,<0.5" }, + { name = "base-cli", specifier = ">=0.5.0,<0.6" }, + { name = "base-cli", extras = ["yaml"], marker = "extra == 'yaml'", specifier = ">=0.5.0,<0.6" }, { name = "build", marker = "extra == 'dev'", specifier = ">=1.2,<2" }, { name = "click", specifier = ">=8.1,<8.6" }, { name = "opentelemetry-api", marker = "extra == 'telemetry'", specifier = ">=1.24,<2" },