Skip to content

docs(clients): make the PyPI pages answer what Caura is and how to use it - #1587

Merged
erni-a merged 2 commits into
mainfrom
docs/pypi-discovery-pages
Sep 19, 2026
Merged

erni-a merged 2 commits into
mainfrom
docs/pypi-discovery-pages

Conversation

@erni-a

@erni-a erni-a commented Sep 18, 2026

Copy link
Copy Markdown
Contributor

Why

AI answer engines cite pypi.org 506 times in our GEO benchmark (27 May to 11 Sep 2026); Mem0 has 45 attributed PyPI pages, Caura has 0. Engines read only the release metadata and the rendered long description. Checked against the PyPI JSON API on 18 Sep: caura and caura-sdk have a 4-line description, no keywords and no classifiers; caura-client opens with a retirement blockquote and leaked <!-- legacy-name-… --> markers and never says what Caura is beyond one line.

What changes

Every Caura-owned PyPI page now opens with the same header block (what Caura is, the former name, MCP/REST/Rail access, tenant isolation, visibility scope and trust level), and all three packages share one summary style, keyword set, classifier set and project-URL set (Homepage, Documentation, Source, Issues, Changelog, Benchmark → LongMemEval harness).

  • caura becomes the product page: install, a 60-second write/search/recall quickstart, the MCP client config block, the three ways agents use memory (Rail, MCP/REST, Interviewer), links. Under a screen and a half.
  • caura-sdk: same page with its own install line; import package stays caura_sdk.
  • caura-client: header block, one-line rename notice, then the API README. Strict-writes (422) notes move below the API sections; Benchmark and "what Caura is" links go above the API table.
  • Publish workflows strip the legacy-name lint markers from README.md before python -m build and fail if any HTML comment survives. The source keeps the markers so the rename ratchet still accounts for each mention; the published long description no longer carries them.

memclaw-client is intentionally untouched: 0.5.0 is yanked and its source was removed in #1244.

Not in this PR

No version bumps. Metadata only reaches PyPI on a release, so once this is merged a follow-up bump (caura 1.0.2, caura-sdk 1.0.1, caura-client 1.0.3) plus the caura-meta-v* / caura-sdk-v* / caura-client-v* tags ship it. Merging #1561 first keeps the client version file and README in one place.

Verification

  • python -m build + twine check dist/* + python -m readme_renderer README.md on all three packages with markers stripped: PASSED, built METADATA has 0 HTML comments, first description line is the header block.
  • scripts/legacy_name_ratchet.py --base origin/main: no new lines (2 exempt lines removed, 4 floor mentions and 3 aliases listed).
  • tests/test_client_metapackages.py: 18 passed.
  • clients/python: ruff check src tests clean, pytest 150 passed.

Done-when check after release, from any shell:

curl -s https://pypi.org/pypi/caura/json | python -c "import json,sys; i=json.load(sys.stdin)['info']; print(i['summary']); print(i['keywords']); print(i['project_urls']); print(i['description'][:400])"

…e it

AI answer engines cite pypi.org for "how do I install/use X" questions and
read only the release metadata: summary, keywords, classifiers, project URLs
and the rendered long description. Our three Python pages did not say what
Caura is in the first screen, the two metapackage pages had no keywords or
classifiers, and the caura-client page opened with an internal-sounding
retirement notice plus leaked lint markers.

Every Caura-owned package now opens with the same header block: what Caura
is, the former name, the three access paths, and the governance model. The
summary starts with "Caura" and names the former name; all three carry the
same keyword set, the same classifiers and the same project URLs (Homepage,
Documentation, Source, Issues, Changelog, Benchmark).

- clients/caura-meta: becomes the product page. Install, a write/search/recall
  quickstart, the MCP client config, the three ways agents use memory
  (Rail, MCP/REST, Interviewer), links.
- clients/caura-sdk-meta: same page with its own install line and the alias
  note; import package stays caura_sdk.
- clients/python: header block, one-line rename notice, then the API README.
  The strict-writes (422) note moves below the API sections. Benchmark and
  "what Caura is" links sit above the API table.
- publish workflows: strip the legacy-name lint markers from README.md before
  `python -m build` and fail if any HTML comment survives. The source keeps the
  markers so the rename ratchet still accounts for each mention; the published
  long description no longer carries them.

No version bumps here. Metadata only reaches PyPI on a release, so a
follow-up bump (caura 1.0.2, caura-sdk 1.0.1, caura-client 1.0.3) and the
matching tags ship this once it is merged.

Verified locally: `python -m build` + `twine check` + `readme_renderer` on all
three packages with markers stripped (0 HTML comments in the built METADATA),
`scripts/legacy_name_ratchet.py --base origin/main` (no new lines),
tests/test_client_metapackages.py (18 passed), clients/python ruff + pytest
(150 passed).

Signed-off-by: erni <erni@caura.ai>
@erni-a
erni-a requested a review from a team as a code owner September 18, 2026 06:42
@github-actions

Copy link
Copy Markdown
Contributor

Claude Code Review — skipped: PR author 'erni-a' is not a public member of the 'caura-ai' org

@github-actions

Copy link
Copy Markdown
Contributor

Claude Code Review — skipped: PR author 'erni-a' is not a public member of the 'caura-ai' org

@erni-a
erni-a merged commit f5e4c5c into main Sep 19, 2026
15 checks passed
@erni-a
erni-a deleted the docs/pypi-discovery-pages branch September 19, 2026 13:57
@caura-deploy-bot caura-deploy-bot Bot mentioned this pull request Sep 19, 2026
erni-a added a commit that referenced this pull request Sep 19, 2026
…1619)

Version bumps only, so the PyPI page work from #1587 reaches the index.
Metadata changes only reach PyPI on a new release.

| Package | Directory | Version | Tag to push after merge |
|---|---|---|---|
| `caura` | `clients/caura-meta` | 1.0.1 → 1.0.2 | `caura-meta-v1.0.2` |
| `caura-sdk` | `clients/caura-sdk-meta` | 1.0.0 → 1.0.1 |
`caura-sdk-v1.0.1` |
| `caura-client` | `clients/python` | 1.0.2 → 1.0.3 |
`caura-client-v1.0.3` |

The `caura-client` bump also updates `__version__` in
`caura_client/__init__.py`. If #1561 (SDK User-Agent header) merges
first, this PR needs a one-line rebase to set the version in the
`_version.py` it introduces instead, and 1.0.3 then ships the User-Agent
header too. If this merges first, #1561 ships in a later 1.0.4.

Each publish workflow checks the tag against `pyproject.toml` and then
confirms PyPI serves the version.

Signed-off-by: erni <erni@caura.ai>
erni-a pushed a commit that referenced this pull request Sep 19, 2026
🤖 I have created a release *beep* *boop*
---


<details><summary>backend: 3.17.0</summary>

##
[3.17.0](backend-v3.16.3...backend-v3.17.0)
(2026-09-19)


### Features

* **clients:** identify the SDK with a User-Agent header
([#1561](#1561))
([42e537b](42e537b))
* **core-api:** send an anonymous daily heartbeat from self-hosted
servers ([#1577](#1577))
([35ef4ca](35ef4ca))
* **plugin:** identify the plugin with a User-Agent header
([#1578](#1578))
([3cdb2f7](3cdb2f7))


### Bug Fixes

* **clients:** wrap network failures in the SDK error hierarchy
([#1588](#1588))
([99ee1ea](99ee1ea))
* **events:** make a failed publish visible to the platform, not just
the SDK ([#1617](#1617))
([f26e45d](f26e45d))
* **storage:** name the phase when cross-link discovery times out
([#1620](#1620))
([7d3fbcb](7d3fbcb))


### Dependencies

* update alembic requirement from &lt;2,&gt;=1.19.1 to &gt;=1.20.0,&lt;2
([#1569](#1569))
([3f07940](3f07940))
* update google-cloud-aiplatform requirement from &lt;3,&gt;=2.0.1 to
&gt;=2.1.0,&lt;3
([#1570](#1570))
([132981b](132981b))


### Documentation

* **clients:** make the PyPI pages answer what Caura is and how to use
it ([#1587](#1587))
([f5e4c5c](f5e4c5c))


### Code Refactoring

* **storage:** drop three zero-caller service methods, and gate the
topic registry ([#1618](#1618))
([1c206e0](1c206e0))
</details>

<details><summary>plugin: 2.23.0</summary>

##
[2.23.0](plugin-v2.22.3...plugin-v2.23.0)
(2026-09-19)


### Features

* **plugin:** identify the plugin with a User-Agent header
([#1578](#1578))
([3cdb2f7](3cdb2f7))
</details>

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: release-please[bot] <release-please[bot]@users.noreply.github.com>
Co-authored-by: caura-deploy-bot[bot] <265395343+caura-deploy-bot[bot]@users.noreply.github.com>
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.

2 participants