
Semantic Indexer
- Updated June 3, 2026
- amoscicki/aromatt
Provides semantic codebase search backed by pgvector with multi-project support and a persistent daemon. A developer uses it to find relevant code by meaning rather than keywords, running it before grep or glob to speed navigation in large repositories.
Key points
- Semantic code search with pgvector
- Multi-project, persistent daemon
- Use before grep/glob
Semantic Indexer by the numbers
- Data as of Jul 7, 2026 (Skillselion catalog sync)
/plugin marketplace add amoscicki/aromatt/plugin install semantic-indexer@amoscicki-pluginsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Last updated | June 3, 2026 |
|---|---|
| Repository | amoscicki/aromatt ↗ |
What it does
Semantic code search across projects via pgvector and a persistent daemon, used before grep/glob to find relevant code.
README.md
Semantic Codebase Indexer
Semantic codebase search plugin for Claude Code using CocoIndex, pgvector, and Gemini embeddings.
Architecture
- Orchestrator: CocoIndex (Python) - file watching & AST parsing
- Parsing Engine: Tree-sitter (language-aware chunking)
- Embedding Model: Google Gemini gemini-embedding-001
- Vector Store: PostgreSQL with pgvector
Features
- Semantic search - Find code by meaning, not just keywords
- Multi-project support - One pgvector container serves all projects
- Persistent daemon - Background indexer runs independently of Claude
- AST-aware chunking - Tree-sitter extracts functions/classes for better results
- SHA-256 deduplication - Only re-embeds changed code
- Gitignore-aware - Respects
.gitignorepatterns - Shared runtime state - Uses
~/.semantic-indexerso multiple agent installs share projects/credentials
Prerequisites
- Docker - For pgvector container
- Python 3.8+ - For CocoIndex
- Node.js 18+ - For CLI wrappers
- Gemini API key - For embeddings
Quick Start
# 1. Install Node.js dependencies
cd semantic-indexer
npm install
# 2. Start pgvector container
node scripts/setup.js docker-up
# 3. Install CocoIndex Python dependencies
node scripts/setup.js install-python
# 4. Set Gemini API key
node scripts/setup.js auth set-key --key "your-api-key"
# 5. Check setup
node scripts/setup.js check-env
# 6. Start daemon
node scripts/daemon.js start
# 7. Add project to index
node scripts/projects.js add .
# 8. Search!
node scripts/search.js --query "user authentication" --project .
Directory Structure
semantic-indexer/
├── cocoindex/
│ ├── main.py # CocoIndex flow definition
│ └── requirements.txt # Python dependencies
├── docker/
│ ├── docker-compose.yml # pgvector container
│ └── init.sql # Database schema
├── scripts/
│ ├── setup.js # Docker + auth + Python install
│ ├── daemon.js # Start/stop background indexer
│ ├── projects.js # Project management
│ ├── search.js # Semantic search CLI
│ ├── watcher-main.js # Spawns CocoIndex daemon
│ └── lib/ # Node.js libraries
└── skills/
└── semantic-search/ # Claude Code skill
Commands
Setup
node scripts/setup.js docker-up # Start container
node scripts/setup.js docker-down # Stop container
node scripts/setup.js install-python # Install CocoIndex
node scripts/setup.js auth set --file <path> # Set API key from JSON
node scripts/setup.js auth paste-win # Set from clipboard (Windows)
node scripts/setup.js check-env # Verify setup
Daemon
node scripts/daemon.js start # Start background indexer (uses CocoIndex)
node scripts/daemon.js stop # Stop indexer
node scripts/daemon.js status # Check status
node scripts/daemon.js logs # View logs
Projects
node scripts/projects.js add <path> # Add project to watch
node scripts/projects.js remove <path> # Stop watching
node scripts/projects.js list # List all projects
node scripts/projects.js reindex <path> # Force reindex
node scripts/projects.js clear <path> # Remove from DB
Search
node scripts/search.js --query "..." --project . --limit 10 --threshold 0.7
How It Works
- CocoIndex watches configured project directories
- When files change, Tree-sitter parses them into AST nodes
- Functions, classes, and methods are extracted as semantic chunks
- Each chunk is hashed (SHA-256) for deduplication
- Changed chunks are embedded using Gemini gemini-embedding-001
- Embeddings are stored in pgvector for fast similarity search
Environment Variables
| Variable | Default | Description |
|---|---|---|
GEMINI_API_KEY |
- | Gemini API key (fallback if no credentials file) |
SEMANTIC_INDEXER_HOME |
~/.semantic-indexer |
Shared runtime state directory |
SEMANTIC_INDEXER_WATCH_FALLBACK_SECONDS |
60 |
Fallback one-shot reindex interval when watcher is idle |
COCOINDEX_DATABASE_URL |
See below | Full Postgres connection URL |
PGVECTOR_HOST |
localhost | Database host |
PGVECTOR_PORT |
5433 | Database port |
PGVECTOR_DB |
codebase_index | Database name |
PGVECTOR_USER |
indexer | Database user |
PGVECTOR_PASSWORD |
indexer_dev | Database password |
Credentials Format
credentials.json:
{
"gemini_api_key": "AIza..."
}
Database Schema
CREATE TABLE codebase_segments (
id SERIAL PRIMARY KEY,
project_root TEXT NOT NULL,
file_path TEXT NOT NULL,
file_name TEXT NOT NULL,
content TEXT NOT NULL,
start_line INTEGER NOT NULL,
end_line INTEGER NOT NULL,
symbol_name TEXT,
node_type TEXT,
content_hash TEXT NOT NULL,
embedding vector(3072),
updated_at TIMESTAMP DEFAULT NOW()
);
Supported Languages (via Tree-sitter)
- TypeScript/JavaScript (
.ts,.tsx,.js,.jsx) - Python (
.py) - Go (
.go) - Rust (
.rs) - Java (
.java) - C/C++ (
.c,.cpp,.h) - And 25+ more languages
Sources
License
MIT