Local snapshots, turn indexing, and configurable semantic embeddings for AI-assisted coding.
Project description
AI Change Vault
AI Change Vault (aicv) is a local-first CLI for saving, indexing, and reverting AI-assisted code changes.
Its main job is to keep each turn searchable, compact, and recoverable without depending on Git or GitHub.
At a glance, aicv:
- creates local backups before and after a change
- indexes the turn, changed files, and validation result
- can generate embeddings with a configurable model for semantic search
- restores a whole project or a single file when a turn goes wrong
What it solves
When an AI changes code, the result is not always what the user expected.
aicv gives every turn a local backup, a structured index entry, searchable metadata, and a reversible snapshot.
Install
aicv is a Python CLI for any repository type, including Node.js repos.
Install it into a Python environment on your machine, then point it at the project you want to track.
pip install ai-change-vault
Local embeddings for that same Python environment:
pip install "ai-change-vault[embeddings-local]"
OpenAI embeddings:
pip install "ai-change-vault[embeddings-openai]"
If your Python environment is system-managed, you may need --break-system-packages, or you can use a
virtual environment instead.
Core flow
- Create a snapshot before touching files.
- Make the AI-driven code changes.
- Validate with tests, lint, or build.
- Create a second snapshot after validation.
- Index the turn with request, changed files, and validation result.
- Search later by turn, file, or request.
- Revert the full project or a single file if needed.
Commands
aicv init .
aicv --version
aicv doctor
aicv backup --message "before refactor navbar"
aicv index --turn 1 --request "Change login button color" --files "src/components/Navbar.tsx" --validation "lint + tests OK"
aicv list
aicv search "navbar login"
aicv search --turn turn-1
aicv search --file Navbar.tsx
aicv revert --turn turn-1
aicv revert --turn turn-1 --file src/components/Navbar.tsx
aicv config
aicv embeddings status
aicv embeddings rebuild
What it stores
- Snapshots in
.aicv/backups/ - Turn documents in
.aicv/rag/turns/ - Keyword index in
.aicv/rag/index.json - Optional turn, diff, and snippet embedding vectors in
.aicv/rag/embeddings.json - Human-readable session log in
AI_SESSION_LOG.md - Compact turn backups in
.aicv/backups/when both before and after snapshots are indexed
Search modes
aicv uses a hybrid retrieval model:
- Keyword search is always available.
- Embeddings are optional and only used when configured.
Keyword search is exact and fast.
Embeddings improve semantic recall, for example when the user asks for "header spacing" and the turn was indexed as "navbar layout".
If a local embedding model cannot be downloaded, aicv keeps the rest of the workflow usable and falls back to keyword-only behavior.
Indexing And Embeddings
Each turn stores a canonical document with the request, changed files, validation result, and
backup references. When embeddings are enabled, aicv also generates vectors for the turn summary
and for changed-file diffs/snippets using the configured model.
Embeddings
Embeddings are opt-in. The default install uses keyword search only.
Providers
none: keyword-only modesentence-transformers: local semantic embeddingsopenai: hosted embeddingsollama: local HTTP embedding endpoint
Recommended models
Use the model name configured in .aicv.config.yaml or AICV_EMBEDDING_MODEL.
Good starting points are modern retrieval-oriented models from the BGE, E5, or OpenAI embeddings families.
Example config
backup_dir: .aicv/backups
backup_retention: 20
rag_dir: .aicv/rag
embedding_provider: sentence-transformers
embedding_model: BAAI/bge-base-en-v1.5
embedding_weight: 0.7
keyword_weight: 0.3
auto_index: false
excludes:
- .git/
- .aicv/
- node_modules/
- dist/
- build/
Behavior
- Each turn stores a canonical text representation in the embedding index.
- Changed files also generate diff and snippet payloads when a before snapshot is available.
- Search ranks results using keywords first and semantic similarity second.
- If embeddings are misconfigured or unavailable,
aicvfalls back to keyword search. aicv embeddings rebuildreports model download or provider errors without crashing the rest of the CLI.
Reverting
Full project:
aicv revert --turn turn-1
Single file:
aicv revert --turn turn-1 --file src/components/Navbar.tsx
Use --state after to restore the post-change backup when available.
Configuration
Create .aicv.config.yaml in the project root:
backup_dir: .aicv/backups
backup_retention: 20
rag_dir: .aicv/rag
embedding_provider: none
embedding_model: sentence-transformers/all-MiniLM-L6-v2
embedding_base_url: http://localhost:11434
embedding_endpoint: /api/embed
embedding_batch_size: 16
embedding_weight: 0.65
keyword_weight: 0.35
auto_index: false
Environment variables with the AICV_ prefix override config values:
AICV_BACKUP_DIR=.vault/backups aicv backup "custom dir"
If you are migrating an older project, .aicv.yaml is still accepted as a legacy fallback.
List stored data
aicv list
aicv list --kind turns
aicv list --kind backups
aicv list --json
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 ai_change_vault-0.2.2.tar.gz.
File metadata
- Download URL: ai_change_vault-0.2.2.tar.gz
- Upload date:
- Size: 33.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
51ec644301a6ce202865e8fa4a1d2f8c3eb278a30780b06ad51531b54989e30c
|
|
| MD5 |
33ef6de5a18fe9e98c5c6604d5a735a0
|
|
| BLAKE2b-256 |
46a0343ff0eec9c94c1d7ca97acf80e87c48f95afe0769d568349e24fd7fdc47
|
Provenance
The following attestation bundles were made for ai_change_vault-0.2.2.tar.gz:
Publisher:
publish.yml on dagnon-dev/ai-change-vault
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ai_change_vault-0.2.2.tar.gz -
Subject digest:
51ec644301a6ce202865e8fa4a1d2f8c3eb278a30780b06ad51531b54989e30c - Sigstore transparency entry: 2088480003
- Sigstore integration time:
-
Permalink:
dagnon-dev/ai-change-vault@0e9c4d677bea7a53bffa10225732fa93e3c2c77b -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/dagnon-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0e9c4d677bea7a53bffa10225732fa93e3c2c77b -
Trigger Event:
push
-
Statement type:
File details
Details for the file ai_change_vault-0.2.2-py3-none-any.whl.
File metadata
- Download URL: ai_change_vault-0.2.2-py3-none-any.whl
- Upload date:
- Size: 28.4 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 |
d703428a48c99ae5e1a036c9313a92228ad4b410f33675796ff3e01550eba112
|
|
| MD5 |
e01e790e7bf94019c44815a8e4571d33
|
|
| BLAKE2b-256 |
da94bc42abe40ca13ec277e8f5e0ff12f538298b665ef08222390eb15667c5df
|
Provenance
The following attestation bundles were made for ai_change_vault-0.2.2-py3-none-any.whl:
Publisher:
publish.yml on dagnon-dev/ai-change-vault
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ai_change_vault-0.2.2-py3-none-any.whl -
Subject digest:
d703428a48c99ae5e1a036c9313a92228ad4b410f33675796ff3e01550eba112 - Sigstore transparency entry: 2088480257
- Sigstore integration time:
-
Permalink:
dagnon-dev/ai-change-vault@0e9c4d677bea7a53bffa10225732fa93e3c2c77b -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/dagnon-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0e9c4d677bea7a53bffa10225732fa93e3c2c77b -
Trigger Event:
push
-
Statement type: