ctx-manager
A provider-agnostic context engineering CLI + MCP server for multi-language agentic development.
ctx-manager sits between your Docs/ folder (PRDs, architecture docs,
phase plans, API specs) and AI coding agents (Claude Code, Cursor,
Windsurf), cutting token spend two ways:
- Deterministic, header-based document slicing — pull exactly the section you need from a blueprint file, not the whole thing. Structural (regex over Markdown headers), not RAG/embeddings.
- An append-only, git-validated
Memory_Ledger.md— accurate session state so agents don't re-derive or hallucinate what's already been built. Every entry is checked against realgit statusoutput before being marked verified.
Works identically across Rust, Go, TypeScript, Python, or any other stack
-- ctx-manager never touches your application source code, only Docs/.
Install
uvx --from ctx-manager ctx --help
No virtualenv setup, no global install required.
Usage
Slice a blueprint file by header:
ctx build --slice "PRD.md > 5. Feature List"
Prints the matched section's content to stdout — pipe it into CLAUDE.md
or wherever your agent reads context from.
Auto-slice the next phase, based on ledger history:
ctx build --auto-phase
Reads Memory_Ledger.md for the latest completed phase, and slices the
next phase's section out of Phase_file.md automatically — no manual
--slice target needed. Falls back to Phase 0 with a warning if the
ledger has no completed-phase entries yet.
Append a verified entry to the session ledger:
ctx append-ledger --summary "Implemented the login endpoint" --category completed
Checks git status against your project before writing, and prefixes the
entry [Verified: N files changed], [Reasoning/State Only], or
[Unverified: not a git repo] depending on what it finds -- so an agent's
self-reported "done" claim is checked against what actually happened on
disk.
Run as an MCP stdio server (for Cursor, Windsurf, Claude Desktop):
ctx mcp
Exposes query_slice, append_ledger_entry, and get_current_phase as
MCP tools, calling the exact same code path as the CLI commands above.
Configuration
ctx-manager searches upward from your current directory for
.context/config.toml. If none is found, it uses sane defaults
(Docs/ folder, Memory_Ledger.md, etc.) and warns once.
[project]
docs_dir = "Docs/"
ledger_file = "Memory_Ledger.md"
phase_file = "Phase_file.md"
[blueprint_files]
files = ["PRD.md", "Architecture.md", "API_Spec.md"]
[git]
scope = "docs_dir" # or "repo_root"
Override the search entirely with --project-root.
Claude Code integration
Example SessionStart/SessionEnd hooks (auto-refresh CLAUDE.md before
a session via --auto-phase, auto-log to the ledger after) are in
examples/claude_code_hooks/.
Design principles
Docs/in,Docs/out — never touches application source, in any language.- Cheap before heavy — stdlib
rebefore embeddings,subprocess gitbefore a git library, local stdio before any network service. - Append-only ledger — no code path overwrites
Memory_Ledger.mdwholesale. Ever. - Fail loud, not silent — a missing header or missing file returns an explicit error, never empty content an agent could hallucinate on.
See Docs/Architecture.md and
Docs/PRD.md for the full design writeup (this project
dogfoods itself -- its own Docs/ folder is sliced and tracked by
ctx-manager during its own development).
Limitations
ctx-manager cannot prevent an agent from bypassing it. Nothing here
stops an agent with raw filesystem access from reading Docs/PRD.md
directly instead of going through ctx build. This is a structural limit,
not a missing feature -- a subprocess-based CLI has no hook into another
process's file-read tool calls.
If you need actual enforcement (not just convention), that has to come from the agent runtime itself:
- Claude Code: use
permissions.denyrules in.claude/settings.jsonto block the Read tool from touchingDocs/*.mddirectly, forcing reliance on theCLAUDE.mdthatctx build --auto-phasegenerates. See Claude Code's own permissions docs -- this is not somethingctx-managerconfigures for you. - MCP clients (Cursor, Windsurf, etc.): whatever filesystem-access
controls that client exposes, if any -- outside
ctx-manager's control.
Without one of those, ctx-manager is a convention the agent is expected
to follow, backed by verified session history (the ledger) -- not a
sandbox.
Development
git clone <this-repo>
cd ctx-manager
uv sync
uv run pytest
License
MIT — see LICENSE.
Metadata
Release files for ctx-manager 0.2.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 | Provenance | Actions |
|---|---|---|---|---|
| ctx_manager-0.2.0.tar.gz | 9.8 kB | Without provenance | Details for ctx_manager-0.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| ctx_manager-0.2.0-py3-none-any.whl | Python 3 | none | any | Details for ctx_manager-0.2.0-py3-none-any.whl |
Total release size: 23.6 kB
Release files / ctx_manager-0.2.0.tar.gz
| Download URL | ctx_manager-0.2.0.tar.gz |
|---|---|
| Size | 9.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4ad00f427eaaea031f27ebc84c6b2d31a9371a89c6019db76b3bb281b85d8efe
|
|
BLAKE2b-256 checksum How to use checksums |
da558ccf52554b0b6a1d3d96433b2eea5d6bcb1fe04ae925d18fceb6f31e2d69
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Fedora Linux","version":"44","id":"","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / ctx_manager-0.2.0-py3-none-any.whl
| Download URL | ctx_manager-0.2.0-py3-none-any.whl |
|---|---|
| Size | 13.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fa1bebb182c3004c706f292bfbe2ee0cad9d57d25a73c0758181137efa62c2b0
|
|
BLAKE2b-256 checksum How to use checksums |
a89db8a61da887c100bcf811c3e27ca22ef28ffc4bc3716086eed82b84db05bb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Fedora Linux","version":"44","id":"","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for ctx-manager 0.2.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.