ContextVC is a Git-native context control plane for AI coding agents.
It stores project rules, decisions, failure memory, how-tos, preferences, and code maps inside .context/, then renders them into the native files used by Claude Code, Cursor, Codex, GitHub Copilot, Gemini, and Cline.
In one line: agent memory becomes repo-level infrastructure that can be versioned, reviewed, merged, checked in CI, and enforced before risky actions.
AI coding tools already have many places to put memory: prompts, rule files, chat summaries, vector stores, local preferences, and session logs.
Those systems help an agent remember, but they usually do not answer the engineering questions a repository needs:
- Did this memory go through review?
- Does it follow the branch and the pull request?
- Is the generated agent-facing file still in sync?
- Is the rule stale because the source file changed?
- Can a known-bad command be stopped before the agent runs it again?
- Can CI prove the context is healthy?
- Can two branches merge context without silently losing semantics?
ContextVC is built for those questions.
Install the tagged release from GitHub:
cargo install --locked --git https://github.com/HaochengLu/contextvc.git --tag v0.1.0
ctx --helpOr clone and install from source:
git clone https://github.com/HaochengLu/contextvc.git
cd contextvc
cargo install --locked --path .
ctx --helpYou need the Rust stable toolchain. If Rust is not installed, install it from rustup.rs.
Inside any repository:
ctx init --install-hooks
ctx status
ctx checkThis creates .context/, renders agent-facing files, installs local hook adapters, and writes MCP configuration.
Generated files can include:
.context/
AGENTS.md
CLAUDE.md
.cursor/rules/*.mdc
.github/copilot-instructions.md
GEMINI.md
.cline/memory-bank/contextvc.md
.mcp.json
ContextVC is local-first:
- no API key required
- no hosted service required
- no source upload
- local stdio MCP server
- long-lived context lives in the repo and can be reviewed with Git
Traditional memory management usually treats memory as a summary, a vector record, a user preference, or a private agent history. ContextVC treats memory as a repository control plane.
| Traditional memory usually lacks | ContextVC provides |
|---|---|
| Memory does not follow the repo | Durable objects live in .context/objects/ and move with branches, pull requests, clones, and forks |
| Memory can be recalled but not enforced | ctx precheck, MCP, and hooks return warn, ask, or block before risky actions |
| Memory writes skip review | Runtime learning creates proposals; ctx review accept is required before formalizing them |
| Memory does not know when code changed | file/source bindings store hashes; ctx check detects stale bindings |
| Every agent owns a separate rule file | .context/ is the source of truth; ctx render compiles native files for many agents |
| Retrieval cannot prove generated files are current | render.lock, schema validation, and managed-block drift checks run in CI |
| Branch conflicts are vague | ctx merge and ctx harvest persist semantic conflicts; conflicted constraints fail closed |
| Rollback is manual | ctx blame, ctx diff, and ctx revert use Git semantics for context objects |
| Clients can spoof event identity | MCP context_log rebuilds server-owned fields and redacts secrets |
| It is hard to measure whether memory prevents repeats | RepeatBench verifies that known failures are caught while safe actions still pass |
| Capability | Command / file | What it does |
|---|---|---|
| Initialize context | ctx init |
Creates .context/, projection files, and lockfile |
| Adopt existing rules | ctx adopt |
Imports AGENTS.md, CLAUDE.md, and Cursor rules into objects |
| Backfill codemap | ctx backfill |
Builds codemap objects from Git history |
| Render projections | ctx render |
Generates native agent files while preserving human-written regions |
| CI guard | ctx check |
Detects projection drift, stale bindings, schema errors, conflicts, and bad events |
| Project brief | ctx brief |
Prints concise context for an agent task |
| MCP runtime | ctx serve-mcp |
Serves local tools for brief, search, precheck, log, propose, and status |
| Hook install | ctx install |
Installs Claude / Cursor / Codex hooks, MCP config, and Git hooks |
| Pre-action gate | ctx precheck |
Checks commands or paths against constraints and failure memory |
| Gate snooze | ctx snooze |
Locally suppresses a specific gate hit |
| Failure writeback | ctx log-event / ctx hook stop |
Distills runtime failures into proposals |
| Human review | ctx review |
Accepts or rejects proposals before they enter the source of truth |
| Staleness check | ctx verify |
Validates object bindings against current file/source hashes |
| Semantic merge | ctx merge / ctx harvest |
Preserves semantic conflicts and blocks conflicted constraints |
| Git history | ctx log / ctx blame / ctx diff / ctx revert |
Tracks and rolls back context objects with Git semantics |
| Diagnostics | ctx doctor |
Checks config, lockfile, hooks, schema, and possible secrets |
| Schema | ctx schema |
Prints or writes the OCL object JSON Schema |
| Benchmark | ctx repeatbench |
Runs repeat-failure gate scenarios |
The same diagram is also available in docs/architecture.mmd.
Use this when a repository already has agent rules spread across files.
cd your-repo
ctx init --skip-adopt
ctx adopt
ctx render --force
ctx check
ctx install allWhat happens:
- existing agent instructions are imported into
.context/objects/ - native projection files are regenerated from one source of truth
- hooks and MCP config are installed locally
- CI can run
ctx checkto detect drift
Create a constraint once and let all supported agents consume it.
mkdir -p .context/objects/constraints
cat > .context/objects/constraints/use-pnpm.md <<'EOF'
---
id: c-usepnpm
type: constraint
title: Use pnpm
scope: ["**"]
status: active
trust: human
confidence: 1.0
evidence: []
bindings:
- kind: command
pattern: "npm install"
enforcement: block
created: init
---
Use `pnpm install`; do not run `npm install` in this repository.
EOF
ctx render --force
ctx check
ctx precheck --command "npm install"Expected behavior:
ctx renderprojects the constraint into agent-native filesctx precheckreturns a blocking gate hit fornpm install- safe commands that do not match the constraint are not blocked
Use the review queue instead of letting runtime learning silently mutate the source of truth.
ctx log-event \
--event-type failure \
--payload '{"target":"src/parser.rs","action":"cargo test parser","outcome":"failed","evidence":"parser fixture failed"}'
ctx hook stop
ctx review list
ctx review accept <proposal-id>
ctx render --force
ctx checkWhat happens:
- the failure event is appended locally
- a proposal is generated from repeated or meaningful evidence
- a human accepts or rejects it
- accepted memory becomes a formal
.context/objects/file - projections and lockfile are regenerated
RepeatBench checks whether known repeat failures are caught by the gate while false-positive actions remain safe.
Latest committed summary: benchmarks/repeatbench/results/latest-summary.json
{
"scenarios": 1,
"gate_hits": 1,
"misses": 0,
"repeat_failure_rate": 0.0
}Raw per-scenario output is stored at benchmarks/repeatbench/results/latest.json.
Run it yourself:
ctx repeatbench --json
ctx repeatbench --json --output benchmarks/repeatbench/results/latest.jsonUse ContextVC as a repository health check:
ctx checkThe included GitHub Actions workflow runs:
cargo fmt --all -- --check
cargo test --all --locked
cargo build --release --locked
target/release/ctx repeatbench --json
git diff --checkctx check fails on:
- missing
.context/VERSIONorrender.lock - object changes that were not rendered
- edited managed blocks
- stale file/source bindings
- invalid object schema fields
- corrupt event JSONL
- conflicted constraints
ContextVC stores durable knowledge as Markdown files with OCL frontmatter.
Object types:
constraint: hard or soft rule, often enforced by path or commanddecision: architectural or implementation decisionfailure: repeated failure or known pitfallhowto: task recipecodemap: important source area or high-churn filepreference: style, testing, formatting, or workflow preference
Managed projection files use ctx:begin / ctx:end blocks. Human-written text outside those blocks is preserved by ctx render.
- ContextVC reads and writes the current repository and local config files.
- Events and objects are redacted for common secret patterns before saving.
- MCP
context_logdoes not trust client-supplied actor/id fields. - Binding paths reject absolute paths, parent traversal, out-of-repo symlinks, and oversized files.
- Review accept uses preflight checks and render rollback.
- Conflicted constraints fail closed.
cargo fmt --all
cargo test --all
cargo build --release
target/release/ctx repeatbench --json --output target/repeatbench-results.jsonl
git diff --checkThe first public tag is v0.1.0.
git fetch --tags
git checkout v0.1.0
cargo install --locked --path .Apache-2.0. See LICENSE.

