witan-core
Shared core for the two witan MCP servers — witan (dist witan-council,
mcp/servers/witan) and witan-code (mcp/servers/witan-code). It is the third
shared packages/ sibling alongside
agent-config-kit, wired into both servers via
a [tool.uv.sources] editable path (dev/CI) plus a published PyPI version range.
Why
The two servers were built copy-paste-and-diverge and carried an explicit "deliberately duplicated — no cross-package import" convention. As the shared surface grew, fixes had to be applied twice and silently drifted — including code that is contractually required to stay identical (the repo-key canonicalizer behind the cross-layer symbol join key; the pinned omnigraph binary version, kept in lockstep by a fragile Renovate custom manager).
witan-core deliberately reverses that convention. The full rationale, scope,
and per-extraction contracts live in
docs/internals/design/witan-core-extraction-spec.md.
Invariant
witan_core imports neither witan nor witan_code. It is a leaf below
both, preserving the one-directional witan → witan_code optional-mount DAG
(witan mounts witan-code as witan code; witan-code never imports witan).
Dependencies
The base package is stdlib-only. Heavier concerns are gated behind extras so neither server pulls weight it doesn't use:
witan-core[cli]→cyclopts,rich,agent-config-kit(CLI scaffolding, styled installer output)witan-core[mcp]→fastmcp(MCP elicitation primitives)witan-core[remote]→httpx2,fastmcp(the ADR-0005 client stack: OIDC device-auth + token cache, and the MCP-client proxy)witan-core[observability]→structlog, OpenTelemetry (structured logs and traces; the OTel halves are imported defensively so an install without an exporter still works)witan-core[sentry]→sentry-sdk
sentry is additive to observability, not an alternative to it:
telemetry.py imports observability.logging, which imports structlog at
module scope, so sentry on its own is an ImportError rather than a lighter
build. The split lets a deployment take logs and traces without shipping
errors to Sentry, not the reverse. Both servers request both.
What's here
Extracted so far (each deletes the duplicated copies from both servers):
_detach.popen_detached— cross-platform detached subprocess spawningomnigraph_install— the pinned-omnigraph-binary installer (single source of the version;richimported lazily)elicit— theconfirm/textMCP elicitation primitives (needs themcpextra; not re-exported from the package root)repo_key—normalise+find_git_config, the cross-layer repo-key canonicalizer, with a golden contract testtimeutil.now_isomaintenance— the throttled-optimize stamp/interval/due mechanicsomnigraph.OmnigraphClient— the omnigraph-CLI subprocess wrapper base (write lock, retry/repair, admission-cap backoff); each server subclasses it (witan addsapply_schema; witan-code adds branch ops + bulkload)config_file.load_toml— shared config.toml loading (WITAN_CONFIGenv var). Both servers read the same file, so one[targets.<name>]block can override both at once.target_config— the[targets.<name>]match/select logic:match_target(prioritymatch_paths>match_repos>match_hosts>match_orgs),parse_target_tables,to_list,local_project_path. Each server keeps its own typed target model (different override fields — witan'sserver/graph/token/…, witan-code'scode_dir) and calls into this shared matcher, which is structurally typed over just the fourmatch_*lists.
Later additions, past the original extraction list:
cli— shared CLI scaffolding (make_app,resolve_author,report_install), used by both servers'setupcommands. Needs thecliextra. This is no longer local to each server; what stays local is each server's own commands and setup behaviour.identity— Keycloaksub→ omnigraph actor id (ADR-0004). witan maps the claim server-side off a validated JWT; witan-code maps the same claim client-side off its cached token to name the branch views it owns. One derivation, so the two agree.remote/— the client-side remote-access layer behindwitan login(ADR-0005 path a):config(RemoteConfig),oidc(device-auth grant + shared token cache),proxy(MCP-client proxy). Needs theremoteextra.observability/— structlog configuration plus OpenTelemetry, patterned aftermitol-django-observabilityso witan reports the way the rest of the estate does. Includes the ASGI and MCP middleware andtelemetry.configure_sentry.omnigraph_http— pooled HTTP transport for a deployed omnigraph-server, so a remote read need not pay for a CLI subprocess. Gated byWITAN_OMNIGRAPH_HTTP; the CLI path beneath it stays maintained and is still the only route toload,branch, andoptimize.chunking— splits a bulk load into batches omnigraph-server will accept, rather than dying on a413part-way through a repo-scale index.caching— server-declared cache directives fortools/listand friends (MCP 2026-07-28, SEP-2549), so a client stops re-fetching a surface that only changes on deploy.
Release files for witan-core 0.36.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 | |
|---|---|---|---|
| witan_core-0.36.0.tar.gz | 273.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| witan_core-0.36.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 431.2 kB
Release files / witan_core-0.36.0.tar.gz
| Download URL | witan_core-0.36.0.tar.gz |
|---|---|
| Size | 273.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bf4a1811924e4ee0c5a3c7c559ed0886d4a3d11aeb9f4cd3d73942a5c33212ef
|
|
BLAKE2b-256 checksum How to use checksums |
d553f299e2d92ae77dbc9843a167d1cb3a015f25a907b8a54a24da826e3b949a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 16, 2026.
Transparency logRelease files / witan_core-0.36.0-py3-none-any.whl
| Download URL | witan_core-0.36.0-py3-none-any.whl |
|---|---|
| Size | 157.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
90e5a9216a947221413860db0f54942d995e745261f34a5fc13394571083bc2a
|
|
BLAKE2b-256 checksum How to use checksums |
9eb96fe4bd71171386962c3172fef15ef742db45fad05f4a42ac6a1e51db24ed
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 16, 2026.
Transparency log