Exev converts Claude Code and Codex sessions into privacy-safe training datasets with review gates, background sync, and MCP memory retrieval.
- Run
exev setuponce. - Run
exev export --no-pushto produce a local reviewed dataset. - Run
exev confirm ...to pass review gates. - Run
exev export --publish-attestation "..."only after explicit approval.
- Running plain
exevopens the full-screen TUI. - Running
exev export ...keeps the scripted CLI flow.
- Turn day-to-day coding sessions into structured, reusable training data.
- Keep privacy controls first-class with redaction and manual review gates.
- Preserve historical problem-solving context through MCP-accessible session memory.
- Multi-source ingestion:
- Claude Code and Codex session discovery and parsing.
- Experimental adapter routing for Cursor, Windsurf, Aider, Continue.dev, Antigravity, VS Code, Zed, and Xcode beta logs.
- Privacy-aware export:
- Secret and PII redaction, username anonymization, and project-level exclusions.
- Layered privacy engine: regex baseline + optional ML NER (
exev[pii-ml]).
- Controlled publishing workflow:
- Local export, user review attestations, confirm gate, then push.
- Immutable dataset version snapshots + dedupe index on publish.
- Continuous mode:
- Background watch daemon for incremental sync.
- Memory tooling:
- MCP server with search, project patterns, trajectory stats, session lookup, graph similarity retrieval, and index refresh.
pip install exevOptional extras:
pip install "exev[pii-ml]" # Presidio + spaCy detection layer
pip install "exev[mcp]" # MCP server runtime
pip install "exev[finetune]" # Experimental local fine-tune scaffoldingFrom source:
git clone https://github.com/ychampion/exev.git
cd exev
pip install -e ".[dev]"Check installed version:
exev --version# Guided onboarding (HF auth help, repo setup, project scope, MCP, watcher)
exev setup
# Reset local setup for a clean re-test (config/state/MCP entry)
exev reset --all --yes
# Verify environment and connected scope
exev doctor
exev projects --source both
exev stats
exev diff --format json
exev config --encryption status
# Export locally first
exev export --no-push
# Review and confirm
exev confirm \
--full-name "YOUR FULL NAME" \
--attest-full-name "Asked for full name and scanned export." \
--attest-sensitive "Reviewed for company/client/private identifiers." \
--attest-manual-scan "Manually reviewed representative sessions."
# Publish only after explicit approval
exev export --publish-attestation "User explicitly approved publishing to Hugging Face."
# Optional one-command sharing flow
exev share --publish --publish-attestation "User explicitly approved publishing to Hugging Face."| Command | Description |
|---|---|
exev status |
Show current stage and next steps (JSON) |
exev prep |
Discover projects and auth state |
exev setup |
Guided onboarding (HF, dataset repo, projects, MCP, watcher) |
exev doctor |
Verify logs, HF auth, MCP registration, and runtime PATH/version diagnostics |
exev stats |
Show session, token, redaction, and export metrics |
exev stats --skill |
Include trajectory-based growth metrics |
exev diff |
Preview exactly what would be redacted before confirm |
exev projects |
Manage connected project scope |
| `exev reset [--all | --config |
exev list |
List projects with source, size, and exclusion state |
exev config ... |
Configure repo, sources, exclusions, and redactions |
| `exev config --encryption on | off |
exev export --no-push |
Export locally for review |
exev export --dry-run |
Preview what would be exported/published without writing files |
exev confirm ... |
Run checks and unlock push gate |
exev export --publish-attestation "..." |
Push dataset after approval |
exev share [--publish] |
Fast export flow with optional publish + dataset card update |
| `exev watch --start | --stop |
exev watch --logs [--follow] |
View daemon logs with optional streaming |
exev watch --monitor [--follow] |
Live watch monitor (status + recent activity) |
exev watch --switch-project "<name>" |
Quickly scope watcher to one project |
exev watch --set-projects "a,b" |
Set connected project scope directly |
exev console |
Interactive slash-command terminal (/status, /logs, /scope, /run) |
exev tui |
Full-screen TUI with activity feed, slash commands, jobs, and plugins |
exev serve |
Start MCP server over stdio |
exev install-mcp |
Register MCP server in Claude config |
exev finetune --experimental |
Preview fine-tune scaffold for local experimentation |
exev synthesize --project <name> |
Generate EXEV.md from synced sessions |
exev update-skill claude |
Install/update local Exev skill |
Additional source filters are available for adapter-backed ingestion:
cursor,windsurf,aider,continue,antigravity,vscode,zed,xcode-beta
Watch transparency examples:
exev watch --status
exev watch --monitor --follow
exev watch --logs --follow
exev watch --pause
exev watch --resume
exev watch --switch-project "codex:exev"Interactive console mode:
exev console --source codex
# Then inside the prompt:
/status
/projects
/scope codex:exev
/logs 80
/run export --no-pushFull-screen TUI mode:
exev
# equivalent explicit command:
exev tui --source bothIf plain exev prints export/confirm JSON instead of opening TUI, you are on an older build.
Upgrade and verify:
pip install --upgrade exev
exev --versionInside the TUI:
/help
/status
/source codex
/watch on
/logs 80
/projects
/scope codex:exev
/export --dry-run
/jobs
/plugins list
Minimal local plugin example (./plugins/echo):
plugins/
echo/
plugin.json
plugin.py
plugin.json:
{
"name": "echo",
"version": "0.1.0",
"entrypoint": "plugin.py",
"description": "Simple echo command"
}plugin.py:
from exev.tui.types import CommandResult
def register(ctx):
def _echo(_app, args):
return CommandResult(ok=True, message=" ".join(args) if args else "echo")
ctx.register_command("echo", _echo, "Echo input text", usage="/echo <text>")Install optional MCP dependency:
pip install "exev[mcp]"
exev install-mcpAvailable MCP tools:
search_past_solutions(query, max_results=5)get_project_patterns(project=None)get_trajectory_stats()get_session(session_id)find_similar_sessions(context, max_results=5)refresh_index()
Exev is designed for private-by-default workflows:
- path and username anonymization
- secret and high-entropy token detection
- custom redaction lists
- manual confirmation and attestation gates before publish
- encryption-at-rest support for local artifacts with keyring-backed key management
Automated redaction is not perfect. Always review local exports before publishing.
- Primary: PyPI (
pip install exev) - Release artifacts: wheel/sdist are attached to each GitHub tag release.
- Optional: publish to a secondary PyPI-compatible index by setting repository secrets:
SECONDARY_PYPI_REPOSITORY_URLSECONDARY_PYPI_USERNAMESECONDARY_PYPI_PASSWORD
README command docs are enforced in CI:
tests/test_docs_consistency.pyvalidates command naming and branding markers.- A CLI help parity test ensures README command rows stay aligned with the real CLI surface.
If commands change, CI fails until README is updated.
- Contribution guide: CONTRIBUTING.md
- Security policy: SECURITY.md
- Support channels: SUPPORT.md
- Code of conduct: CODE_OF_CONDUCT.md
- Release process: RELEASE.md
MIT - see LICENSE.