Skip to content

Commit 1617a6a

Browse files
author
CometAPI
committed
chore: finalize 0.1.0 release
0.1.0 is approved for PyPI publication.
1 parent 3f82848 commit 1617a6a

10 files changed

Lines changed: 76 additions & 102 deletions

CHANGELOG.md

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,17 @@ All notable changes to this project are documented in this file. The project
44
follows Semantic Versioning and uses Conventional Commits for release-PR
55
automation.
66

7-
## [0.1.0](https://github.com/cometapi-dev/cometapi-python/compare/v0.1.0-alpha.1...v0.1.0) (2026-07-28)
7+
## [Unreleased]
88

9+
## [0.1.0] - 2026-07-28
910

1011
### Features
1112

12-
* prepare the stable release ([#19](https://github.com/cometapi-dev/cometapi-python/issues/19)) ([2e5407c](https://github.com/cometapi-dev/cometapi-python/commit/2e5407c106b6bc557c51e629b4713012dbce3744))
13-
13+
- Prepare the stable release ([#19](https://github.com/cometapi-dev/cometapi-python/issues/19)) ([2e5407c](https://github.com/cometapi-dev/cometapi-python/commit/2e5407c106b6bc557c51e629b4713012dbce3744)).
1414

1515
### Documentation
1616

17-
* record Registry Alpha release ([#18](https://github.com/cometapi-dev/cometapi-python/issues/18)) ([f39b4dc](https://github.com/cometapi-dev/cometapi-python/commit/f39b4dc9f2e18e91ab3cbac202246f85658f71fd))
18-
19-
## [Unreleased]
20-
21-
### Changed
17+
- Record Registry Alpha release evidence ([#18](https://github.com/cometapi-dev/cometapi-python/issues/18)) ([f39b4dc](https://github.com/cometapi-dev/cometapi-python/commit/f39b4dc9f2e18e91ab3cbac202246f85658f71fd)).
2218

2319
- Release documentation now records completed Registry Alpha publication,
2420
provenance, digest, clean-install, import, and mocked-call verification.
@@ -65,3 +61,5 @@ automation.
6561
- Unsupported aliases `CometClient` and `AsyncCometClient`.
6662
- Account, balance, token, log, task, and platform helpers from the 0.1 scope.
6763
- The provisional single-maintainer `CODEOWNERS` requirement.
64+
65+
[0.1.0]: https://github.com/cometapi-dev/cometapi-python/compare/v0.1.0-alpha.1%2Brecovery.1...v0.1.0

CONTRIBUTING.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
# Contributing to the CometAPI Python SDK
22

3-
Thank you for helping improve the SDK. The repository has released the
4-
`0.1.0a1` Registry Alpha. Contributions must stay within the supported 0.1
5-
scope described in `README.md`, `ROADMAP.md`, and `COMPATIBILITY.md`. The
6-
canonical repository is
3+
Thank you for helping improve the SDK. The repository targets the stable 0.1
4+
contract. Contributions must stay within the supported 0.1 scope described in
5+
`README.md`, `ROADMAP.md`, and `COMPATIBILITY.md`. The canonical repository is
76
<https://github.com/cometapi-dev/cometapi-python>.
87

98
## Development setup
@@ -79,7 +78,7 @@ Use Conventional Commit subjects where practical, for example:
7978
```text
8079
feat: add a supported client option
8180
fix: preserve an upstream error type
82-
docs: clarify alpha installation
81+
docs: clarify installation
8382
test: cover async response streaming
8483
```
8584

README.md

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# CometAPI Python SDK
22

3-
> **Pre-release:** `0.1.0a1` is available from PyPI. Its API may change before
4-
> `0.1.0`.
3+
> **Stable release:** `0.1.0` is approved for PyPI publication.
54
65
`cometapi` is a thin Python adapter over the official OpenAI SDK for the
76
OpenAI-compatible CometAPI endpoint. It changes the default API key and base
@@ -30,15 +29,15 @@ Project links: [CometAPI](https://www.cometapi.com),
3029

3130
## Installation
3231

33-
Install the exact alpha from PyPI with:
32+
Install the stable release from PyPI with:
3433

3534
```bash
36-
python -m pip install --pre 'cometapi==0.1.0a1'
35+
python -m pip install 'cometapi==0.1.0'
3736
```
3837

3938
See the immutable
40-
[GitHub prerelease](https://github.com/cometapi-dev/cometapi-python/releases/tag/v0.1.0-alpha.1%2Brecovery.1)
41-
and exact [PyPI release](https://pypi.org/project/cometapi/0.1.0a1/) for the
39+
[GitHub release](https://github.com/cometapi-dev/cometapi-python/releases/tag/v0.1.0)
40+
and exact [PyPI release](https://pypi.org/project/cometapi/0.1.0/) for the
4241
published artifact.
4342

4443
## Authentication and configuration
@@ -160,7 +159,7 @@ This is an interoperability option, not the primary `cometapi` experience.
160159

161160
## Explicit non-goals for 0.1
162161

163-
The alpha does not add Anthropic or Gemini adapters, CometAPI account or
162+
The 0.1 release does not add Anthropic or Gemini adapters, CometAPI account or
164163
platform resources, media APIs, provider-neutral message translation, CLI
165164
behavior, or custom HTTP/SSE/retry implementations. There are no compatibility
166165
aliases named `CometClient` or `AsyncCometClient`.

SECURITY.md

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
## Supported versions
44

5-
The SDK is in pre-release development. Published support claims begin only
6-
after a package is independently verified from PyPI.
5+
The SDK's supported 0.1 API surface is stable. Security support applies to
6+
packages that have been independently verified from PyPI.
77

88
| Version | Status |
99
| --- | --- |
10-
| `0.1.x` prereleases | Best-effort security fixes after verified publication |
11-
| `0.1.x` stable | Planned support after verified publication |
10+
| `0.1.x` stable | Supported |
11+
| `0.1.x` prereleases | Best-effort security fixes |
1212
| Older versions | Unsupported |
1313

1414
## Reporting a vulnerability
@@ -17,14 +17,13 @@ Do not disclose a suspected vulnerability, credential, customer data, or
1717
exploit details in a public issue.
1818

1919
Use the repository's
20-
[private security advisory form](https://github.com/cometapi-dev/cometapi-python/security/advisories/new)
21-
when it is available. During private validation, before GitHub Private
22-
Vulnerability Reporting is enabled, email `support@cometapi.com` with the
23-
subject "Security report" and only the minimum details needed to establish a
20+
[private security advisory form](https://github.com/cometapi-dev/cometapi-python/security/advisories/new).
21+
If that form is unavailable, email `support@cometapi.com` with the subject
22+
"Security report" and only the minimum details needed to establish a
2423
confidential follow-up channel. Do not disclose sensitive details publicly.
2524

2625
The maintainers will acknowledge and triage reports as soon as practical, but
27-
no response-time service-level agreement is promised for prereleases.
26+
no response-time service-level agreement is promised.
2827
Coordinated disclosure timing will be agreed with the reporter.
2928

3029
## Credential safety

SUPPORT.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
## Project status
44

5-
The SDK is in pre-release development. Support is best-effort, and no response
6-
or resolution time is guaranteed.
5+
The SDK's supported 0.1 API surface is stable. Support is best-effort, and no
6+
response or resolution time is guaranteed.
77

88
## Supported SDK surface
99

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ license = "MIT"
99
license-files = ["LICENSE"]
1010
keywords = ["ai", "cometapi", "openai", "sdk"]
1111
classifiers = [
12-
"Development Status :: 3 - Alpha",
12+
"Development Status :: 5 - Production/Stable",
1313
"Intended Audience :: Developers",
1414
"License :: OSI Approved :: MIT License",
1515
"Programming Language :: Python :: 3",

release-please-config.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@
33
"release-type": "python",
44
"include-component-in-tag": false,
55
"include-v-in-tag": true,
6-
"last-release-sha": "31b68904141489ca04932edbf305ccf88af09372",
7-
"prerelease": false,
8-
"versioning": "prerelease",
96
"packages": {
107
".": {
118
"package-name": "cometapi",

scripts/check_version.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def _artifact_version(path: Path) -> str:
6767
}
6868

6969

70-
def _require_canonical_tag(tag: str, project_version: str) -> str:
70+
def require_canonical_tag(tag: str, project_version: str) -> str:
7171
normalized = normalize_version(project_version)
7272
alpha = re.fullmatch(r"(?P<base>\d+\.\d+\.\d+)a(?P<number>\d+)", normalized)
7373
expected = (
@@ -310,7 +310,7 @@ def main() -> int:
310310
if args.expected:
311311
versions.append(("expected", args.expected))
312312
if args.tag:
313-
versions.append(("tag", _require_canonical_tag(args.tag, project)))
313+
versions.append(("tag", require_canonical_tag(args.tag, project)))
314314
for value in args.artifacts:
315315
path = Path(value)
316316
if not path.is_file():

tests/test_release_documents.py

Lines changed: 15 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@
1515
CANONICAL_SUPPORT,
1616
CheckError,
1717
)
18-
from scripts.check_version import require_public_preview_docs, require_releasable_docs
18+
from scripts.check_version import (
19+
require_canonical_tag,
20+
require_public_preview_docs,
21+
require_releasable_docs,
22+
)
1923

2024
PROJECT_ROOT = Path(__file__).resolve().parents[1]
2125
VERSION_SCRIPT = PROJECT_ROOT / "scripts" / "check_version.py"
@@ -233,64 +237,30 @@ def test_public_preview_cli_reports_aggregated_violations_and_fails(
233237
assert "SECURITY.md: missing canonical public value" in result.stderr
234238

235239

236-
def test_release_version_cli_accepts_approved_initial_alpha_recovery_tag(
237-
releasable_documents: Path,
238-
) -> None:
240+
def test_release_version_cli_accepts_current_stable_tag() -> None:
239241
result = subprocess.run(
240242
[
241243
sys.executable,
242244
str(VERSION_SCRIPT),
243245
"--tag",
244-
"v0.1.0-alpha.1+recovery.1",
246+
"v0.1.0",
245247
"--require-changelog",
246248
],
247-
cwd=releasable_documents,
249+
cwd=PROJECT_ROOT,
248250
text=True,
249251
check=False,
250252
capture_output=True,
251253
)
252254

253255
assert result.returncode == 0, result.stderr
254-
assert "version agreement passed: 0.1.0a1" in result.stdout
255-
256-
257-
def test_release_version_cli_rejects_tombstoned_initial_alpha_tag(
258-
releasable_documents: Path,
259-
) -> None:
260-
result = subprocess.run(
261-
[
262-
sys.executable,
263-
str(VERSION_SCRIPT),
264-
"--tag",
265-
"v0.1.0-alpha.1",
266-
"--require-changelog",
267-
],
268-
cwd=releasable_documents,
269-
text=True,
270-
check=False,
271-
capture_output=True,
272-
)
256+
assert "version agreement passed: 0.1.0" in result.stdout
273257

274-
assert result.returncode != 0
275-
assert "release tag must use an approved spelling" in result.stderr
276258

259+
def test_release_version_accepts_approved_initial_alpha_recovery_tag() -> None:
260+
assert require_canonical_tag("v0.1.0-alpha.1+recovery.1", "0.1.0a1") == "0.1.0a1"
277261

278-
def test_release_version_cli_rejects_unapproved_recovery_tag(
279-
releasable_documents: Path,
280-
) -> None:
281-
result = subprocess.run(
282-
[
283-
sys.executable,
284-
str(VERSION_SCRIPT),
285-
"--tag",
286-
"v0.1.0-alpha.1+recovery.2",
287-
"--require-changelog",
288-
],
289-
cwd=releasable_documents,
290-
text=True,
291-
check=False,
292-
capture_output=True,
293-
)
294262

295-
assert result.returncode != 0
296-
assert "release tag must use an approved spelling" in result.stderr
263+
@pytest.mark.parametrize("tag", ["v0.1.0-alpha.1", "v0.1.0-alpha.1+recovery.2"])
264+
def test_release_version_rejects_unapproved_initial_alpha_tag(tag: str) -> None:
265+
with pytest.raises(CheckError, match="release tag must use an approved spelling"):
266+
require_canonical_tag(tag, "0.1.0a1")

tests/test_release_workflow.py

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,19 @@
3030
TRUST_SCRIPT = PROJECT_ROOT / "scripts" / "verify_release_trust.sh"
3131

3232

33+
def _reviewed_release_please_bridge_config() -> str:
34+
stable = RELEASE_PLEASE_CONFIG.read_text(encoding="utf-8")
35+
marker = ' "include-v-in-tag": true,\n'
36+
if marker not in stable:
37+
raise AssertionError("stable Release Please config lost its tag contract")
38+
bridge = (
39+
' "last-release-sha": "31b68904141489ca04932edbf305ccf88af09372",\n'
40+
' "prerelease": false,\n'
41+
' "versioning": "prerelease",\n'
42+
)
43+
return stable.replace(marker, marker + bridge, 1)
44+
45+
3346
def _git(root: Path, *arguments: str, input_text: str | None = None) -> str:
3447
result = subprocess.run(
3548
["git", *arguments],
@@ -746,13 +759,20 @@ def test_current_release_please_workflow_is_disabled_by_default() -> None:
746759
check_release_please_workflow(RELEASE_PLEASE_WORKFLOW.read_text(encoding="utf-8"))
747760

748761

749-
def test_current_release_please_config_has_reviewed_stable_bridge() -> None:
762+
def test_current_release_please_config_has_reviewed_stable_cleanup() -> None:
750763
check_release_please_config(
751764
RELEASE_PLEASE_CONFIG.read_text(encoding="utf-8"),
752765
RELEASE_PLEASE_MANIFEST.read_text(encoding="utf-8"),
753766
)
754767

755768

769+
def test_release_please_config_accepts_reviewed_stable_bridge() -> None:
770+
check_release_please_config(
771+
_reviewed_release_please_bridge_config(),
772+
'{".": "0.1.0-alpha.1"}\n',
773+
)
774+
775+
756776
@pytest.mark.parametrize(
757777
("needle", "replacement", "message"),
758778
[
@@ -775,12 +795,12 @@ def test_current_release_please_config_has_reviewed_stable_bridge() -> None:
775795
def test_release_please_config_rejects_bridge_drift(
776796
needle: str, replacement: str, message: str
777797
) -> None:
778-
text = RELEASE_PLEASE_CONFIG.read_text(encoding="utf-8")
798+
text = _reviewed_release_please_bridge_config()
779799
assert needle in text
780800
with pytest.raises(RuntimeError, match=message):
781801
check_release_please_config(
782802
text.replace(needle, replacement, 1),
783-
RELEASE_PLEASE_MANIFEST.read_text(encoding="utf-8"),
803+
'{".": "0.1.0-alpha.1"}\n',
784804
)
785805

786806

@@ -806,34 +826,26 @@ def test_release_please_config_rejects_manifest_drift() -> None:
806826

807827

808828
def test_release_please_config_accepts_exact_stable_cleanup() -> None:
809-
config = RELEASE_PLEASE_CONFIG.read_text(encoding="utf-8")
810-
for line in (
811-
' "last-release-sha": "31b68904141489ca04932edbf305ccf88af09372",\n',
812-
' "prerelease": false,\n',
813-
' "versioning": "prerelease",\n',
814-
):
815-
config = config.replace(line, "", 1)
816-
check_release_please_config(config, '{".": "0.1.0"}\n')
829+
check_release_please_config(
830+
RELEASE_PLEASE_CONFIG.read_text(encoding="utf-8"),
831+
'{".": "0.1.0"}\n',
832+
)
817833

818834

819835
def test_release_please_config_rejects_stable_manifest_with_bridge() -> None:
820836
with pytest.raises(RuntimeError, match="remove the one-time bridge"):
821837
check_release_please_config(
822-
RELEASE_PLEASE_CONFIG.read_text(encoding="utf-8"),
838+
_reviewed_release_please_bridge_config(),
823839
'{".": "0.1.0"}\n',
824840
)
825841

826842

827843
def test_release_please_config_rejects_bridge_cleanup_before_stable() -> None:
828-
config = RELEASE_PLEASE_CONFIG.read_text(encoding="utf-8")
829-
for line in (
830-
' "last-release-sha": "31b68904141489ca04932edbf305ccf88af09372",\n',
831-
' "prerelease": false,\n',
832-
' "versioning": "prerelease",\n',
833-
):
834-
config = config.replace(line, "", 1)
835844
with pytest.raises(RuntimeError, match="only after stable"):
836-
check_release_please_config(config, '{".": "0.1.0-alpha.1"}\n')
845+
check_release_please_config(
846+
RELEASE_PLEASE_CONFIG.read_text(encoding="utf-8"),
847+
'{".": "0.1.0-alpha.1"}\n',
848+
)
837849

838850

839851
@pytest.mark.parametrize(

0 commit comments

Comments
 (0)