Brain layer for Kagura harnesses — headless CLI coding-agent launcher (claude -p today), subscription-auth hygiene, verdict, doctor primitives
Project description
kagura-brain
The provider-neutral "brain" layer shared by Kagura's CLI-brain harnesses
(kagura-engineer, kagura-planner, kagura-code-reviewer).
These tools run a headless CLI coding agent as their brain. They were each re-implementing the same seams: launching the agent, stripping stale provider credentials so subscription auth wins, parsing exit codes and sentinel markers, and normalizing output. This package centralizes those seams.
Two adapters ship today — Claude Code (claude -p) and Codex CLI
(codex exec) — as thin siblings over one shared launcher core (core._run +
verdict + extract_block). Each strips its provider's credential/endpoint
overrides from the child env so the CLI's subscription login wins:
claude deny-sets ANTHROPIC_*; codex prefix-scrubs OPENAI_*/CODEX_*
(including OPENAI_BASE_URL and CODEX_HOME).
from kagura_brain import claude, codex
claude.invoke("…prompt…", mcp_config=".mcp.json") # claude -p
codex.invoke("…prompt…", sandbox="read-only") # codex exec
MCP / approval differs by provider. Claude takes per-call --mcp-config /
--allowedTools (see claude.mcp_args). Codex manages MCP servers persistently
via codex mcp / ~/.codex/config.toml (no per-call flag), and its sandbox /
approval is opt-in: pass sandbox= (read-only | workspace-write |
danger-full-access) or bypass_approvals=True — neither is loosened by default.
BYO endpoint (opt-in)
By default both adapters strip the provider's endpoint/credential env so the
subscription login wins. To deliberately route at a caller-chosen
endpoint (Ollama Cloud / any compatible gateway), pass endpoint + api_key
together — they are injected after the scrub, so only these explicit
values reach the child while an ambient *_BASE_URL override stays stripped
(#2):
# Codex → Ollama Cloud (OpenAI-compatible). "ollama-cloud" is an alias for
# codex.OLLAMA_CLOUD_ENDPOINT ("https://ollama.com/v1").
codex.invoke("…prompt…", endpoint="ollama-cloud", api_key="…")
# Codex → a LOCAL ollama/lmstudio backend (no endpoint/key needed):
codex.invoke("…prompt…", local_provider="ollama")
# Claude → a caller-supplied Anthropic-compatible gateway (no Ollama preset:
# Ollama Cloud is OpenAI-, not Anthropic-, compatible):
claude.invoke("…prompt…", endpoint="https://my-gateway/v1", api_key="…")
Supplying only one of endpoint/api_key raises ValueError; a non-https
endpoint emits a UserWarning (prompt + code context goes off-box). With none
of these set, the default subscription-auth path is byte-for-byte unchanged.
Why a separate package (not folded into the memory SDK)
Harness-support code splits cleanly along two axes:
| Axis | Belongs in | Examples |
|---|---|---|
| memory | kagura-memory-python-sdk |
sync client facade, .mcp.json setup, auth resolution, recall |
| brain | this package | CLI-agent launcher (claude -p + codex exec), subscription-auth hygiene, verdict contract, doctor primitives |
Pushing CLI-agent spawning into a memory SDK would invert the layers ("memory spawns the agent"). So the brain axis lives here, and this package depends on no memory package — the two support libs are mutually independent.
kagura-engineer kagura-planner kagura-code-reviewer
\ | /
`--> kagura-brain + kagura-memory-python-sdk <--'
(brain axis) (memory axis)
Install
pip install kagura-brain
# or: uv add kagura-brain
Requires Python 3.11+. It has no Python runtime dependencies (stdlib-only) — and by design depends on no memory package (see the axis split above).
Prerequisites: the provider CLIs
kagura-brain is a launcher — it drives the provider CLIs as subprocesses, so
each adapter needs its own CLI installed and on PATH. These are external
tools, not pip dependencies; install only the one(s) you use:
| Adapter | Needs | Auth (default path) |
|---|---|---|
claude.invoke() |
Claude Code CLI (claude) — see docs |
signed in to your Claude subscription (the adapter strips ANTHROPIC_* so the subscription login wins) |
codex.invoke() |
Codex CLI (codex) — see docs |
codex login (ChatGPT subscription; the adapter strips OPENAI_*/CODEX_*). Verified against Codex 0.133.0 (codex._CODEX_VERIFIED_VERSION) |
The CLI binary is required even in BYO-endpoint mode —
only the auth source changes: instead of the subscription login, the
caller-supplied endpoint + api_key (or, for Codex, a local
--oss --local-provider backend) are used. No subscription login is needed for
the BYO path, but claude / codex must still be installed.
doctor primitives to check CLI launchability are planned (see Status).
Status
Public surface is built incrementally under TDD, one consumer migration per PR:
-
core— shared seam:BrainResult,_run(subprocess + env-scrub + timeout + utf-8 decode),as_text,extract_block -
claude.invoke()— headlessclaude -plauncher (ANTHROPIC_*deny-set,---guarded prompt,mcp_args, opt-in BYOendpoint/api_key) -
codex.invoke()— headlesscodex execlauncher (OPENAI_*/CODEX_*prefix scrub,---guarded prompt, opt-in sandbox, BYOendpoint/api_key+local_provider) -
verdict—PROCEEDset + exit-code map (contract only) -
doctor— git/claude/gh/ollama/reachability check primitives
Development
uv sync --extra dev
uv run pytest # tests
uv run ruff check . # lint
uv run ruff format . # format
uv run mypy # type check
See CONTRIBUTING.md for the full workflow and CHANGELOG.md for release history.
License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kagura_brain-0.1.0.tar.gz.
File metadata
- Download URL: kagura_brain-0.1.0.tar.gz
- Upload date:
- Size: 63.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
16c905afaeef6e838b1a185dfab0a9d856f483ccf0942f14cc4165b6407fd1c9
|
|
| MD5 |
2f031510ad0dc9f35366dd48d66d73fe
|
|
| BLAKE2b-256 |
69027ebbad53e6c1cc5a33549de5bb7a5f4a88b20b710805176f02135c0a6929
|
Provenance
The following attestation bundles were made for kagura_brain-0.1.0.tar.gz:
Publisher:
publish.yml on kagura-ai/kagura-brain
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kagura_brain-0.1.0.tar.gz -
Subject digest:
16c905afaeef6e838b1a185dfab0a9d856f483ccf0942f14cc4165b6407fd1c9 - Sigstore transparency entry: 1768524984
- Sigstore integration time:
-
Permalink:
kagura-ai/kagura-brain@c8a26015a1cfd798645a526b91c81f66024da628 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/kagura-ai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c8a26015a1cfd798645a526b91c81f66024da628 -
Trigger Event:
push
-
Statement type:
File details
Details for the file kagura_brain-0.1.0-py3-none-any.whl.
File metadata
- Download URL: kagura_brain-0.1.0-py3-none-any.whl
- Upload date:
- Size: 20.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b3211865a4adb37ddc61ac0d8b8e9da9fd0840305920eaaa8816f8eda4422db6
|
|
| MD5 |
c9340622bc2b21ee6cb5b72deb719ef6
|
|
| BLAKE2b-256 |
642d712084989bc061642ca825b5b2aae9be580429c1c94a5add8a3d097376d4
|
Provenance
The following attestation bundles were made for kagura_brain-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on kagura-ai/kagura-brain
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kagura_brain-0.1.0-py3-none-any.whl -
Subject digest:
b3211865a4adb37ddc61ac0d8b8e9da9fd0840305920eaaa8816f8eda4422db6 - Sigstore transparency entry: 1768525168
- Sigstore integration time:
-
Permalink:
kagura-ai/kagura-brain@c8a26015a1cfd798645a526b91c81f66024da628 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/kagura-ai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c8a26015a1cfd798645a526b91c81f66024da628 -
Trigger Event:
push
-
Statement type: