climble
A thin Typer CLI wrapper around semble — instant code search for any local or git repo, from your shell.
climble mirrors the two operations exposed by semble's MCP server (search and find_related) so its output is interchangeable with what an MCP-connected agent would see.
Some of the helpers in src/climble/cli.py are adapted from semble's src/semble/mcp.py under the MIT license — see THIRD_PARTY_LICENSES.md.
Install
# from PyPI (once published)
uv add climble
# or, in this repo:
uv sync
Usage
# Search the current directory
uv run climble search "save model to disk"
# Search a remote repo (cloned to a temp dir; no cache between invocations)
uv run climble search "tokenizer chunking" --repo https://github.com/MinishLab/semble -k 10
# Pick a search mode (hybrid|semantic|bm25)
uv run climble search "BM25" --mode bm25
# Find chunks semantically similar to a specific location, using
# file_path:line from a prior `search` result
uv run climble find-related src/climble/cli.py 67
Options
Both commands accept:
--repo, -r— git URL or local path. Default:.--top-k, -k— number of results. Default:5--ref— branch/tag (git URLs only)
search additionally accepts:
--mode, -m—hybrid(default),semantic, orbm25
Notes
Each invocation re-indexes from scratch — there is no persistent on-disk cache. For repeated queries against the same repo, run semble's MCP server directly, which caches indexes in-process for the lifetime of the session.
Development
make install # uv sync --group dev + pre-commit install
make test # uv run pytest
make lint # ruff check + format check + ty
make check # lint + test
make format # ruff --fix + format in place
Releasing
Releases are cut through GitHub Releases — not a manual publish command. Publishing a release fires .github/workflows/publish.yml, which runs uv build && uv publish --trusted-publishing always inside the pypi environment via OIDC. There are no stored PyPI tokens to rotate.
The flow:
- Land changes on
main. Ensure CI is green (style+testworkflows). - Bump
versioninpyproject.tomland__version__insrc/climble/__init__.py. Keep them in sync. Pre-1.0: minor bump for new features, patch bump for fixes. - Promote the
## Unreleasedsection inCHANGELOG.mdto## X.Y.Z — YYYY-MM-DD. Add a fresh empty## Unreleasedabove it. - Commit as
chore(release): vX.Y.Z. Duplicate the CHANGELOG section into the commit body so the commit stands alone. - Push:
git push origin main. - Tag with the full release notes in the annotation. Write the new CHANGELOG entry's body to a temp file, then:
git tag -a vX.Y.Z --cleanup=verbatim -F notes.md && git push origin vX.Y.Z. - Create the GitHub Release from the tag:
gh release create vX.Y.Z --notes-from-tag --title vX.Y.Z(or use the web UI). Publication triggers the publish workflow.
Why steps 6 and 7 look like this. gh release create --notes-from-tag copies the tag annotation verbatim into the release body, so the annotation is the release notes — -m vX.Y.Z produces an effectively empty release body. -F notes.md fills the annotation from a real file. --cleanup=verbatim is required to keep ## markdown headers — without it, git strips every line starting with # as a comment, so your section structure disappears before it ever reaches GitHub.
The make pypi target is a manual fallback only, not the canonical path. It runs uv build && uv publish locally and requires a PyPI token in the environment; it bypasses CI's clean build and the version/tag/changelog discipline above. Avoid it unless Trusted Publishing is down.
One-time setup before the first release
- PyPI Trusted Publisher: register this repo as a Trusted Publisher on PyPI for the
climbleproject. Workflow filename:publish.yml. Environment:pypi. (Until this is configured, the publish workflow will fail with an OIDC error.) - GitHub Environment: create an environment named
pypiin the repo settings. No secrets needed (OIDC). - PyPI name availability:
climbleis currently un-claimed on PyPI as of writing; if it gets taken, fall back toclimble-clifor the distribution name (the import name and CLI command stayclimble) — see how croc handles this incroc-cli.
License
MIT — see LICENSE and THIRD_PARTY_LICENSES.md.
Metadata
Release files for climble 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| climble-0.1.0.tar.gz | 68.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| climble-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 74.7 kB
Release files / climble-0.1.0.tar.gz
| Download URL | climble-0.1.0.tar.gz |
|---|---|
| Size | 68.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
56c33db9cb65490a85634c4ef65f3c0a0ca0218d75eaabc83c851f56a2392146
|
|
BLAKE2b-256 checksum How to use checksums |
34f79e3b1cf3d0fc0f66ac638856b6ec7f441cc1ee6767d27a58672e4e9a81ed
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / climble-0.1.0-py3-none-any.whl
| Download URL | climble-0.1.0-py3-none-any.whl |
|---|---|
| Size | 6.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
137cb3cf60d87d0eed7bfab1bb5a2910ee36a2a34ebbb197b448793ddc4ac5ad
|
|
BLAKE2b-256 checksum How to use checksums |
0a7b0108ab024df4e974260a179c7b4a9d4d9e1d0e74abf63d0419b82d0b5ec1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|