Objetivo: Llevar VectorCode v0.1.0 a un estado production-ready cubriendo todos los pendientes de la sección 18 del as-built document.
Antes de entrar al plan, mi lectura honesta del proyecto:
Tip
Lo bueno — y hay MUCHO bueno aquí
- 375 tests, 0 clippy warnings, strict TDD. Esto no es un MVP tirado con duct tape. Cada módulo tiene tests unitarios sólidos, los integration tests del MCP son reales (spawn del binario, JSON-RPC), y el coverage estimado >80% es creíble por la forma en que se escribieron.
- Arquitectura limpia. La separación
cli/,mcp/,engine/,store/,embedder/,watcher/,config/es exactamente lo que esperarías de un proyecto que va a escalar. No hay globals, no hay estado compartido fuera deAppState, y elEmbeddertrait es un diseño de libro. - Error handling.
VectorCodeErrorcon 10 variantes tipadas,Fromimpls para rusqlite y io, mensajes actionable para el usuario. Esto es lo que quiero ver en producción. - Pragmatismo en las decisiones. El fallback
vectors_datacon JSON mientras sqlite-vec no está integrado fue la decisión correcta — entregar funcionalidad sin bloquear en una extensión C.
Warning
Lo que necesita trabajo
- El elefante en la sala: sin ONNX model bundled, el provider default no funciona. El binario se construye, pero
vectorcode initcon el provider default termina usandoMockEmbedder. Esto es el blocker #1. - Brute-force vector search. Funciona para demos y proyectos chicos (<5K chunks), pero un monorepo de 50K+ chunks va a ser inaceptablemente lento. sqlite-vec no es optional — es NECESARIO para el caso de uso target.
- El flaky test es un code smell.
temp_env_varcon closures no es thread-safe. En CI con--test-threads=Nesto va a explotar. Es un fix rápido pero bloqueante para CI. - El
upgradestub. Sin self-update, la distribución es manual. No es blocker para v0.1, pero sí para adoption.
Note
Veredicto: El proyecto está bien construido. La deuda técnica es CONOCIDA y DOCUMENTADA (lo cual es mejor que la mayoría de los proyectos que veo). El camino a producción es claro y acotado.
| Decision | Choice | Rationale |
|---|---|---|
| ONNX model | Download on-demand during vectorcode init |
Binary liviano (~17MB), el usuario elige provider interactivamente |
| sqlite-vec | Compilación estática en build.rs |
Zero runtime deps, self-contained binary |
| GitHub org | alejandro-technology/vectorcode |
Releases, CI, self-update apuntan aquí |
| Homebrew | Tap separado: alejandro-technology/homebrew-vectorcode |
Estándar para herramientas propias |
| Self-update | GitHub Releases binaries pre-compilados | Descarga + SHA256 verify + replace |
Las fases están ordenadas por dependencia — cada fase se puede implementar y testear independientemente.
Arreglar problemas conocidos antes de agregar funcionalidad nueva.
- Reemplazar
temp_env_varhelper conserial_testotemp-envcrate para eliminar el race condition del test flaky (§19.1) - Los tests que modifican env vars se ejecutarán en serie
- Crear archivo
LICENSEcon texto MIT (§18.2.3 — trivial pero bloqueante para open source)
El modelo NO se embebe en el binario. Se descarga la primera vez que el usuario ejecuta vectorcode init con provider onnx.
ModelManagerstruct con lógica de descarga y cache:model_dir()→~/.vectorcode/models/minilm-l6-v2-q8/is_downloaded() -> bool— verifica simodel.onnxytokenizer.jsonexistendownload_model() -> Result<()>— descarga desde HuggingFace:model.onnx:https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/onnx/model_quantized.onnxtokenizer.json:https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer.json
- Progress bar durante descarga (indicatif)
- Verificación de integridad post-descarga (file size sanity check)
load_model() -> Result<(Vec<u8>, Vec<u8>)>— lee archivos del cache
- Agregar
OnnxEmbedder::from_cache()que usaModelManagerpara cargar desde~/.vectorcode/models/ - Mantener
OnnxEmbedder::new(model_bytes, tokenizer_bytes)para custom models
- Interactive provider selection cuando no se pasa
--provider:Select embedding provider: 1. onnx — Local, offline, no API key needed (~23MB download) 2. gemini — Google API, requires GEMINI_API_KEY 3. ollama — Local Ollama server, requires `ollama serve` 4. openai — OpenAI API, requires OPENAI_API_KEY > - Si elige
onnxy el modelo no está descargado → llamarModelManager::download_model() - Si elige API provider → pedir API key interactivamente y guardar en config
- Si
--providerse pasa como argumento, skip el prompt interactivo
- Actualizar
create_embedder_from_configpara que "onnx" useOnnxEmbedder::from_cache() - Error claro si el modelo no está descargado: "Run
vectorcode initto download the ONNX model"
Compilación estática — el binario incluye sqlite-vec sin deps runtime.
- Agregar
sqlite-veccomo build dependency para compilar la extensión C - O usar el crate
sqlite-vec-rssi existe en crates.io
- Descargar/incluir source de sqlite-vec (C)
- Compilar con
cccrate como extensión estática - Linkar con rusqlite via
auto_extension
- Registrar sqlite-vec como auto-extension al abrir la DB:
unsafe { rusqlite::ffi::sqlite3_auto_extension(Some(sqlite3_vec_init)); }
- Modificar
init_schema()para crearvec_chunksvirtual table convec0 - Mantener
vectors_datacomo fallback SOLO si la extensión falla (defensive) - Schema migration (v1 → v2): detectar si
vectors_datatiene datos y migrar avec_chunks
insert_vector(): insertar envec_chunks(primary), fallback avectors_datasi no hay extensiónsearch_similar(): usar query nativo sqlite-vec:SELECT c.*, v.distance FROM vec_chunks v JOIN chunks c ON c.id = v.chunk_id WHERE v.embedding MATCH ?query_vec AND k = ?limit ORDER BY v.distance ASC
delete_vectors_for_chunk(): borrar de tabla activa- Eliminar
cosine_similarity()manual (la mantiene sqlite-vec internamente) - Benchmark: validar 10-100x speedup vs brute-force en tests
- Implementar
check_latest_version()via GitHub API:GET https://api.github.com/repos/alejandro-technology/vectorcode/releases/latest - Implementar
download_and_replace():- Detectar OS/arch actual (
std::env::consts::{OS, ARCH}) - Construir URL:
https://github.com/alejandro-technology/vectorcode/releases/download/v{ver}/vectorcode-{os}-{arch}.tar.gz - Descargar tarball
- Verificar checksum SHA256 contra
checksums.txtdel release - Reemplazar binario actual (
self_replacecrate para atomic swap) chmod +xen Unix
- Detectar OS/arch actual (
- Flags:
--check(solo verificar),--version <VER>(versión específica)
- Agregar
self_replace = "1"para atomic binary replacement
- Test job:
cargo test,cargo clippy -- -D warnings,cargo fmt --check - Build job: matrix build para 5 targets:
x86_64-apple-darwinaarch64-apple-darwinx86_64-unknown-linux-gnuaarch64-unknown-linux-gnux86_64-pc-windows-msvc
- Release job (on tag push
v*):- Build release binaries para cada target
- Strip symbols
- Crear tarball (
.tar.gzUnix) / zip (Windows) - Compute SHA256 checksums →
checksums.txt - Publicar como GitHub Release en
alejandro-technology/vectorcodecon assets
- Job con
cargo-llvm-cov(más preciso que tarpaulin para Rust) - Generar reporte lcov y HTML
- Upload a Codecov o similar
- Badge en README
- Agregar
serial_test = "3"a dev-dependencies (para los env var tests)
- Agregar gramáticas tree-sitter:
tree-sitter-c-sharp,tree-sitter-c,tree-sitter-cpp,tree-sitter-ruby,tree-sitter-swift,tree-sitter-kotlin
- Extender
SupportedLanguageenum con:CSharp,C,Cpp,Ruby,Swift,Kotlin - Agregar lazy
OnceLockpara cada nueva gramática - Mapear extensiones:
.cs,.c,.h,.cpp,.hpp,.cc,.rb,.swift,.kt,.kts
- Agregar chunkable node types para cada lenguaje nuevo:
- C#:
method_declaration,class_declaration,interface_declaration,enum_declaration,namespace_declaration - C:
function_definition,struct_specifier - C++:
function_definition,class_specifier,namespace_definition - Ruby:
method,class,module,singleton_method - Swift:
function_declaration,class_declaration,protocol_declaration,enum_declaration - Kotlin:
function_declaration,class_declaration,object_declaration
- C#:
- Fixture files para cada lenguaje nuevo con tests de integración
- Script PowerShell equivalente a
install.sh:- Detectar arquitectura Windows
- Descargar de
https://github.com/alejandro-technology/vectorcode/releases/ - Instalar en
$env:USERPROFILE\.vectorcode\bin\ - Agregar al PATH del usuario
- Homebrew formula
vectorcode.rbcon:desc,homepage,urlapuntando ahttps://github.com/alejandro-technology/vectorcode/releases/sha256checksums por plataforma (macOS arm64 + x86_64)- Install from pre-compiled release tarball
- Usuarios instalan con:
brew install alejandro-technology/vectorcode/vectorcode
- Contenido exacto de spec §15.2
- Agregar copia de
SKILL.mda.agents/skills/semantic-search/SKILL.md(per-project) - Agregar copia global a
~/.agents/skills/semantic-search/SKILL.md - Agregar escritura de
instructions.mda~/.gemini/antigravity/mcp/vectorcode/instructions.md - Contenido embebido como
conststrings (no files externos)
- Considerar cambiar
--no-watchpor--watchcon default true (evaluar viabilidad con clap)
- Agregar
indicatif = "0.17"para progress bars
- Reemplazar
tracing::info!de progreso conindicatif::ProgressBarpara el CLI - Mantener
tracing::info!para modo MCP (stderr)
Estos se implementan si queda tiempo/energía. Están priorizados por impacto:
- Agregar
kind: "code"parameter avec_searchtool - Si
kind == "code", embeder el snippet directamente sin enrichment
- Expandir acrónimos comunes (auth → authentication, db → database, etc.)
- Agregar sinónimos de dominio configurable
- Agregar tabla FTS5 en
init_schema() - Combinar scores:
final_score = α * vector_score + (1-α) * fts_score
- Feature flag:
cargo build --features gpu - CUDA/Metal execution providers para ort
- Quantizar vectores a int8 post-embedding
- Nuevo tool
vec_search_multique acepta múltiples project paths
- Alternativa a stdio para CI/multi-user
# All tests pass (existing + new)
cargo test
# No warnings
cargo clippy -- -D warnings
# Formatting
cargo fmt --check
# ONNX model download and embedding
cargo test -- embedder::model_manager::tests
# sqlite-vec search works
cargo test -- store::vectors::tests
# Self-update version check (mocked)
cargo test -- cli::upgrade::tests
# New language chunking
cargo test --test chunker_integration_test
# MCP integration (all tools)
cargo test --test mcp_integration_testcargo build --release→ binary < 50MBvectorcode init→ uses real ONNX model (not MockEmbedder)vectorcode index→ produces real embeddings, stores in sqlite-vecvectorcode search "payment retry logic"→ returns relevant results from fixturesvectorcode serve --mcp→ MCP server responds correctlyvectorcode upgrade --check→ reports version info- CI pipeline: push tag → builds 5 platform binaries → creates GitHub Release
| Phase | Priority | Effort | Dependencies |
|---|---|---|---|
| 1. Foundation fixes | CRITICAL | ~1h | None |
| 2. ONNX bundling | CRITICAL | ~3h | Phase 1 |
| 3. sqlite-vec | CRITICAL | ~4h | Phase 1 |
| 4. Self-update | CRITICAL | ~3h | None |
| 5. CI/CD | HIGH | ~3h | Phase 1-4 |
| 6. Test coverage | HIGH | ~1h | Phase 5 |
| 7. More languages | HIGH | ~3h | None |
| 8. Distribution | HIGH | ~2h | Phase 5 |
| 9. Skill files | MEDIUM | ~1h | None |
| 10. UX improvements | MEDIUM | ~2h | None |
| 11. Low enhancements | LOW | ~8h+ | Phases 1-3 |
Estimación total (CRITICAL + HIGH): ~20h Estimación total (todo): ~31h+