probe-search 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- probe_search-0.2.0/.github/workflows/ci.yml +21 -0
- probe_search-0.2.0/.gitignore +7 -0
- probe_search-0.2.0/CHANGELOG.md +17 -0
- probe_search-0.2.0/LICENSE +21 -0
- probe_search-0.2.0/PKG-INFO +239 -0
- probe_search-0.2.0/README.md +210 -0
- probe_search-0.2.0/docs/superpowers/plans/2026-04-17-smoother-ux-and-auto-reindex.md +1792 -0
- probe_search-0.2.0/docs/superpowers/specs/2026-04-17-smoother-ux-and-auto-reindex-design.md +283 -0
- probe_search-0.2.0/pyproject.toml +54 -0
- probe_search-0.2.0/src/probe/__init__.py +3 -0
- probe_search-0.2.0/src/probe/cli.py +500 -0
- probe_search-0.2.0/src/probe/config.py +87 -0
- probe_search-0.2.0/src/probe/indexer/__init__.py +0 -0
- probe_search-0.2.0/src/probe/indexer/chunkers.py +197 -0
- probe_search-0.2.0/src/probe/indexer/discovery.py +70 -0
- probe_search-0.2.0/src/probe/indexer/extractors.py +40 -0
- probe_search-0.2.0/src/probe/indexer/pipeline.py +253 -0
- probe_search-0.2.0/src/probe/indexer/refresh_gate.py +51 -0
- probe_search-0.2.0/src/probe/mcp/__init__.py +0 -0
- probe_search-0.2.0/src/probe/mcp/server.py +260 -0
- probe_search-0.2.0/src/probe/models.py +55 -0
- probe_search-0.2.0/src/probe/providers/__init__.py +0 -0
- probe_search-0.2.0/src/probe/providers/base.py +32 -0
- probe_search-0.2.0/src/probe/providers/cohere.py +48 -0
- probe_search-0.2.0/src/probe/providers/openai.py +25 -0
- probe_search-0.2.0/src/probe/providers/zeroentropy.py +44 -0
- probe_search-0.2.0/src/probe/search/__init__.py +0 -0
- probe_search-0.2.0/src/probe/search/bm25.py +14 -0
- probe_search-0.2.0/src/probe/search/engine.py +129 -0
- probe_search-0.2.0/src/probe/search/vector.py +68 -0
- probe_search-0.2.0/src/probe/store/__init__.py +0 -0
- probe_search-0.2.0/src/probe/store/database.py +210 -0
- probe_search-0.2.0/tests/conftest.py +39 -0
- probe_search-0.2.0/tests/fixtures/sample_project/README.md +9 -0
- probe_search-0.2.0/tests/fixtures/sample_project/docs/api-reference.md +28 -0
- probe_search-0.2.0/tests/fixtures/sample_project/docs/design.md +33 -0
- probe_search-0.2.0/tests/fixtures/sample_project/notes.txt +10 -0
- probe_search-0.2.0/tests/fixtures/sample_project/src/auth.py +33 -0
- probe_search-0.2.0/tests/test_bm25.py +36 -0
- probe_search-0.2.0/tests/test_chunkers.py +73 -0
- probe_search-0.2.0/tests/test_cli.py +384 -0
- probe_search-0.2.0/tests/test_config.py +51 -0
- probe_search-0.2.0/tests/test_database.py +130 -0
- probe_search-0.2.0/tests/test_discovery.py +73 -0
- probe_search-0.2.0/tests/test_engine.py +90 -0
- probe_search-0.2.0/tests/test_extractors.py +37 -0
- probe_search-0.2.0/tests/test_mcp.py +142 -0
- probe_search-0.2.0/tests/test_pipeline.py +154 -0
- probe_search-0.2.0/tests/test_providers.py +134 -0
- probe_search-0.2.0/tests/test_refresh_gate.py +76 -0
- probe_search-0.2.0/tests/test_vector.py +43 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
test:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
strategy:
|
|
12
|
+
matrix:
|
|
13
|
+
python-version: ["3.10", "3.11", "3.12"]
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
- uses: actions/setup-python@v5
|
|
17
|
+
with:
|
|
18
|
+
python-version: ${{ matrix.python-version }}
|
|
19
|
+
- run: pip install -e ".[dev]"
|
|
20
|
+
- run: python -m pytest tests/ -v
|
|
21
|
+
- run: ruff check src/
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to probe are documented here.
|
|
4
|
+
|
|
5
|
+
## 0.2.0 — 2026-04-17
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- `probe install` / `probe uninstall` for one-command Claude Code integration via `claude mcp add --scope user`.
|
|
9
|
+
- Refresh-before-search: the index incrementally updates when files change, driven by a two-phase (stat → hash) algorithm with a TTL debounce (`PROBE_REFRESH_TTL`, default 5s).
|
|
10
|
+
- `refreshed` field on every `probe_search` MCP response with counts of added/changed/removed files.
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
- MCP `probe_search` no longer needs a separate `probe_index` call — auto-index is subsumed into the unified refresh path.
|
|
14
|
+
- `files` table schema gains `mtime_ns` and `size` columns (migration is automatic and backwards-compatible).
|
|
15
|
+
|
|
16
|
+
### Removed
|
|
17
|
+
- The "File system watcher" roadmap item (refresh-before-search covers the same UX need without a daemon).
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 ZeroEntropy
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: probe-search
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: AI Agent Context Engine — give your coding agent a brain beyond code
|
|
5
|
+
Author-email: ZeroEntropy <founders@zeroentropy.dev>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Requires-Python: >=3.10
|
|
9
|
+
Requires-Dist: click>=8.0
|
|
10
|
+
Requires-Dist: mcp>=1.0
|
|
11
|
+
Requires-Dist: numpy>=1.24
|
|
12
|
+
Requires-Dist: pymupdf>=1.24
|
|
13
|
+
Requires-Dist: pyyaml>=6.0
|
|
14
|
+
Requires-Dist: rich>=13.0
|
|
15
|
+
Requires-Dist: tiktoken>=0.7
|
|
16
|
+
Requires-Dist: zeroentropy>=0.1.0a1
|
|
17
|
+
Provides-Extra: all
|
|
18
|
+
Requires-Dist: cohere>=5.0; extra == 'all'
|
|
19
|
+
Requires-Dist: openai>=1.0; extra == 'all'
|
|
20
|
+
Provides-Extra: cohere
|
|
21
|
+
Requires-Dist: cohere>=5.0; extra == 'cohere'
|
|
22
|
+
Provides-Extra: dev
|
|
23
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
|
|
24
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
25
|
+
Requires-Dist: ruff>=0.4; extra == 'dev'
|
|
26
|
+
Provides-Extra: openai
|
|
27
|
+
Requires-Dist: openai>=1.0; extra == 'openai'
|
|
28
|
+
Description-Content-Type: text/markdown
|
|
29
|
+
|
|
30
|
+
# probe
|
|
31
|
+
|
|
32
|
+
**Give your AI agent a brain beyond code.**
|
|
33
|
+
|
|
34
|
+
probe is a CLI tool and MCP server that indexes your project's documentation, specs, and code, then serves curated, reranked context to AI coding agents in milliseconds.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## The Problem
|
|
39
|
+
|
|
40
|
+
AI coding agents waste time searching. When you ask Claude Code or Cursor "how does our auth flow work?", they `grep` through files, read them one by one, and piece together an answer over multiple tool calls. On a large project with docs, specs, ADRs, and runbooks, this takes 30-60 seconds and often misses the most relevant context entirely.
|
|
41
|
+
|
|
42
|
+
probe makes this instant. It indexes everything -- markdown docs, code, PDFs, plain text -- into a hybrid search engine powered by [ZeroEntropy's](https://www.zeroentropy.dev) state-of-the-art embedding and reranking models. One query, one API call, sub-second results with the best context from docs AND code ranked together.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Quick Start
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# 1. Get a free API key at https://dashboard.zeroentropy.dev
|
|
50
|
+
# 2. Install
|
|
51
|
+
pip install probe-search
|
|
52
|
+
|
|
53
|
+
# 3. Register probe with Claude Code (one-time, machine-wide)
|
|
54
|
+
probe install
|
|
55
|
+
|
|
56
|
+
# Now open any project in Claude Code and ask a question —
|
|
57
|
+
# probe will auto-index on first search and refresh on subsequent ones.
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
For CLI-only use:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
export ZEROENTROPY_API_KEY="ze_xxx"
|
|
64
|
+
probe index .
|
|
65
|
+
probe search "how does authentication work"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
The index auto-refreshes before each search; set `PROBE_REFRESH_TTL=0` to
|
|
69
|
+
force refresh every time, or `-1` to disable refresh.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## MCP Server Setup (Claude Code, Cursor)
|
|
74
|
+
|
|
75
|
+
**Claude Code users**: `probe install` (see Quick Start) does this automatically.
|
|
76
|
+
|
|
77
|
+
**For Cursor or advanced use**: add a `.mcp.json` file to your project root:
|
|
78
|
+
|
|
79
|
+
```json
|
|
80
|
+
{
|
|
81
|
+
"mcpServers": {
|
|
82
|
+
"probe": {
|
|
83
|
+
"command": "uvx",
|
|
84
|
+
"args": ["probe-search", "mcp"],
|
|
85
|
+
"env": {
|
|
86
|
+
"ZEROENTROPY_API_KEY": "ze_xxx"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
This works with Claude Code, Cursor, and any MCP-compatible agent. No `pip install` required -- `uvx` handles it.
|
|
94
|
+
|
|
95
|
+
On first use, probe automatically indexes your project. No manual setup needed -- just ask your agent a question and it works.
|
|
96
|
+
|
|
97
|
+
Your agent gains four tools:
|
|
98
|
+
|
|
99
|
+
| Tool | What it does |
|
|
100
|
+
|------|-------------|
|
|
101
|
+
| `probe_search` | Semantic search across docs and code with reranking |
|
|
102
|
+
| `probe_index` | Index or re-index project files |
|
|
103
|
+
| `probe_status` | Show what's indexed |
|
|
104
|
+
| `probe_read` | Read a specific file by path |
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## How It Works
|
|
109
|
+
|
|
110
|
+
**1. Hybrid Retrieval**
|
|
111
|
+
Each query runs through two parallel search paths: semantic vector search (cosine similarity against [zembed-1](https://www.zeroentropy.dev/articles/introducing-zembed-1-the-worlds-best-multilingual-text-embedding-model) embeddings) and keyword search (BM25 via SQLite FTS5). This catches both conceptual matches and exact term hits.
|
|
112
|
+
|
|
113
|
+
**2. Cross-Source Reranking**
|
|
114
|
+
Results from both paths are fused using Reciprocal Rank Fusion, then passed through [zerank-2](https://www.zeroentropy.dev/articles/zerank-2-advanced-instruction-following-multilingual-reranker), a neural cross-encoder reranker that scores each chunk against the original query. Docs and code are ranked together -- the best answer wins regardless of file type.
|
|
115
|
+
|
|
116
|
+
**3. Smart Context Assembly**
|
|
117
|
+
Results are deduplicated, trimmed to your token budget, and returned with source citations. Each result includes its file path, location metadata (header paths for markdown, symbol names for code, page numbers for PDFs), and a relevance score.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Example Output
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
$ probe search "how does authentication work"
|
|
125
|
+
|
|
126
|
+
Found 5 results (342 chunks searched)
|
|
127
|
+
|
|
128
|
+
[0.94] docs/design/auth.md > Authentication > OAuth Flow
|
|
129
|
+
We use PKCE-based OAuth 2.0 with Auth0 as the identity provider.
|
|
130
|
+
The flow works as follows: 1) Client generates a code verifier
|
|
131
|
+
and challenge, 2) User is redirected to Auth0's /authorize...
|
|
132
|
+
|
|
133
|
+
[0.87] src/auth/oauth.py > class OAuthHandler
|
|
134
|
+
class OAuthHandler:
|
|
135
|
+
"""Handles OAuth2 PKCE flow for web and mobile clients."""
|
|
136
|
+
def __init__(self, client_id: str, redirect_uri: str):
|
|
137
|
+
self.client_id = client_id...
|
|
138
|
+
|
|
139
|
+
[0.82] docs/adr/003-auth-provider.md > ADR-003: Auth Provider Selection
|
|
140
|
+
## Decision
|
|
141
|
+
We chose Auth0 over Cognito because: 1) Better PKCE support,
|
|
142
|
+
2) Built-in MFA, 3) Superior documentation...
|
|
143
|
+
|
|
144
|
+
------------------------------------------
|
|
145
|
+
zembed-1 + zerank-2 | 1,847 tokens | 0.3s
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
One query returns the design spec, the implementation code, and the architectural decision record -- ranked by relevance, in under a second.
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## CLI Reference
|
|
153
|
+
|
|
154
|
+
| Command | Description |
|
|
155
|
+
|---------|-------------|
|
|
156
|
+
| `probe index [paths...]` | Index project files for semantic search |
|
|
157
|
+
| `probe index --full` | Force full re-index (ignore file hashes) |
|
|
158
|
+
| `probe install` | Register probe as a user-scope MCP server in Claude Code |
|
|
159
|
+
| `probe search "query"` | Search project knowledge with natural language |
|
|
160
|
+
| `probe search --top-k N` | Limit number of results (default: 10) |
|
|
161
|
+
| `probe search --type code` | Filter by file type (markdown, code, pdf, text) |
|
|
162
|
+
| `probe search --no-rerank` | Skip reranking (faster, lower quality) |
|
|
163
|
+
| `probe search --max-tokens N` | Token budget for results (default: 4096) |
|
|
164
|
+
| `probe status` | Show index stats and provider config |
|
|
165
|
+
| `probe list` | List all indexed files |
|
|
166
|
+
| `probe config` | Show current provider configuration |
|
|
167
|
+
| `probe init` | Auto-detect provider and save config |
|
|
168
|
+
| `probe mcp` | Start MCP server (stdio transport) |
|
|
169
|
+
| `probe uninstall [--purge]` | Unregister probe; `--purge` also deletes `.probe/` in cwd |
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Multi-Provider Support
|
|
174
|
+
|
|
175
|
+
probe defaults to ZeroEntropy but works with other providers:
|
|
176
|
+
|
|
177
|
+
| Provider | Embedding | Reranker | Install |
|
|
178
|
+
|----------|-----------|----------|---------|
|
|
179
|
+
| **[ZeroEntropy](https://www.zeroentropy.dev)** (default) | zembed-1 | zerank-2 | included |
|
|
180
|
+
| OpenAI | text-embedding-3-large | -- | `pip install "probe-search[openai]"` |
|
|
181
|
+
| Cohere | embed-v4.0 | rerank-v3.5 | `pip install "probe-search[cohere]"` |
|
|
182
|
+
|
|
183
|
+
Set the corresponding API key (`ZEROENTROPY_API_KEY`, `OPENAI_API_KEY`, or `COHERE_API_KEY`) and run `probe init`. You can mix providers -- for example, OpenAI for embeddings with ZeroEntropy for reranking.
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Why ZeroEntropy?
|
|
188
|
+
|
|
189
|
+
[zembed-1](https://www.zeroentropy.dev/articles/introducing-zembed-1-the-worlds-best-multilingual-text-embedding-model) is a 4B-parameter open-weight embedding model that outperforms OpenAI, Cohere, and Voyage across nine domains including code, legal, finance, and healthcare. Combined with [zerank-2](https://www.zeroentropy.dev/articles/zerank-2-advanced-instruction-following-multilingual-reranker) for cross-encoder reranking, it delivers the best retrieval quality available.
|
|
190
|
+
|
|
191
|
+
Pricing: $0.05 per 1M tokens for embeddings, $0.025 per 1M tokens for reranking. [Free trial available](https://www.zeroentropy.dev/pricing).
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Configuration
|
|
196
|
+
|
|
197
|
+
probe stores its index and config in `.probe/` at your project root. Add it to `.gitignore`.
|
|
198
|
+
|
|
199
|
+
```yaml
|
|
200
|
+
# .probe/config.yaml
|
|
201
|
+
providers:
|
|
202
|
+
embedding:
|
|
203
|
+
name: zeroentropy
|
|
204
|
+
model: zembed-1
|
|
205
|
+
dimensions: 1280
|
|
206
|
+
reranker:
|
|
207
|
+
name: zeroentropy
|
|
208
|
+
model: zerank-2
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## How Data Is Handled
|
|
214
|
+
|
|
215
|
+
Documents are chunked and stored locally in `.probe/` (SQLite + numpy). Only chunk text is sent to the embedding/reranking API for processing. Documents are never uploaded or stored on any external server.
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## What's NOT in v1
|
|
220
|
+
|
|
221
|
+
- Web sources (Notion, Confluence, Google Docs)
|
|
222
|
+
- Git-aware context (commit history, blame)
|
|
223
|
+
- Image/diagram understanding within PDFs
|
|
224
|
+
- Custom chunking strategies
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Links
|
|
229
|
+
|
|
230
|
+
- [ZeroEntropy](https://www.zeroentropy.dev) -- the AI retrieval engine powering probe
|
|
231
|
+
- [API Dashboard](https://dashboard.zeroentropy.dev) -- get your API key
|
|
232
|
+
- [Documentation](https://docs.zeroentropy.dev) -- ZeroEntropy API docs
|
|
233
|
+
- [Models](https://docs.zeroentropy.dev/models) -- zembed-1 and zerank-2 details
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## License
|
|
238
|
+
|
|
239
|
+
MIT -- see [LICENSE](LICENSE) for details.
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# probe
|
|
2
|
+
|
|
3
|
+
**Give your AI agent a brain beyond code.**
|
|
4
|
+
|
|
5
|
+
probe is a CLI tool and MCP server that indexes your project's documentation, specs, and code, then serves curated, reranked context to AI coding agents in milliseconds.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## The Problem
|
|
10
|
+
|
|
11
|
+
AI coding agents waste time searching. When you ask Claude Code or Cursor "how does our auth flow work?", they `grep` through files, read them one by one, and piece together an answer over multiple tool calls. On a large project with docs, specs, ADRs, and runbooks, this takes 30-60 seconds and often misses the most relevant context entirely.
|
|
12
|
+
|
|
13
|
+
probe makes this instant. It indexes everything -- markdown docs, code, PDFs, plain text -- into a hybrid search engine powered by [ZeroEntropy's](https://www.zeroentropy.dev) state-of-the-art embedding and reranking models. One query, one API call, sub-second results with the best context from docs AND code ranked together.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# 1. Get a free API key at https://dashboard.zeroentropy.dev
|
|
21
|
+
# 2. Install
|
|
22
|
+
pip install probe-search
|
|
23
|
+
|
|
24
|
+
# 3. Register probe with Claude Code (one-time, machine-wide)
|
|
25
|
+
probe install
|
|
26
|
+
|
|
27
|
+
# Now open any project in Claude Code and ask a question —
|
|
28
|
+
# probe will auto-index on first search and refresh on subsequent ones.
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
For CLI-only use:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
export ZEROENTROPY_API_KEY="ze_xxx"
|
|
35
|
+
probe index .
|
|
36
|
+
probe search "how does authentication work"
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The index auto-refreshes before each search; set `PROBE_REFRESH_TTL=0` to
|
|
40
|
+
force refresh every time, or `-1` to disable refresh.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## MCP Server Setup (Claude Code, Cursor)
|
|
45
|
+
|
|
46
|
+
**Claude Code users**: `probe install` (see Quick Start) does this automatically.
|
|
47
|
+
|
|
48
|
+
**For Cursor or advanced use**: add a `.mcp.json` file to your project root:
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"mcpServers": {
|
|
53
|
+
"probe": {
|
|
54
|
+
"command": "uvx",
|
|
55
|
+
"args": ["probe-search", "mcp"],
|
|
56
|
+
"env": {
|
|
57
|
+
"ZEROENTROPY_API_KEY": "ze_xxx"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
This works with Claude Code, Cursor, and any MCP-compatible agent. No `pip install` required -- `uvx` handles it.
|
|
65
|
+
|
|
66
|
+
On first use, probe automatically indexes your project. No manual setup needed -- just ask your agent a question and it works.
|
|
67
|
+
|
|
68
|
+
Your agent gains four tools:
|
|
69
|
+
|
|
70
|
+
| Tool | What it does |
|
|
71
|
+
|------|-------------|
|
|
72
|
+
| `probe_search` | Semantic search across docs and code with reranking |
|
|
73
|
+
| `probe_index` | Index or re-index project files |
|
|
74
|
+
| `probe_status` | Show what's indexed |
|
|
75
|
+
| `probe_read` | Read a specific file by path |
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## How It Works
|
|
80
|
+
|
|
81
|
+
**1. Hybrid Retrieval**
|
|
82
|
+
Each query runs through two parallel search paths: semantic vector search (cosine similarity against [zembed-1](https://www.zeroentropy.dev/articles/introducing-zembed-1-the-worlds-best-multilingual-text-embedding-model) embeddings) and keyword search (BM25 via SQLite FTS5). This catches both conceptual matches and exact term hits.
|
|
83
|
+
|
|
84
|
+
**2. Cross-Source Reranking**
|
|
85
|
+
Results from both paths are fused using Reciprocal Rank Fusion, then passed through [zerank-2](https://www.zeroentropy.dev/articles/zerank-2-advanced-instruction-following-multilingual-reranker), a neural cross-encoder reranker that scores each chunk against the original query. Docs and code are ranked together -- the best answer wins regardless of file type.
|
|
86
|
+
|
|
87
|
+
**3. Smart Context Assembly**
|
|
88
|
+
Results are deduplicated, trimmed to your token budget, and returned with source citations. Each result includes its file path, location metadata (header paths for markdown, symbol names for code, page numbers for PDFs), and a relevance score.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Example Output
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
$ probe search "how does authentication work"
|
|
96
|
+
|
|
97
|
+
Found 5 results (342 chunks searched)
|
|
98
|
+
|
|
99
|
+
[0.94] docs/design/auth.md > Authentication > OAuth Flow
|
|
100
|
+
We use PKCE-based OAuth 2.0 with Auth0 as the identity provider.
|
|
101
|
+
The flow works as follows: 1) Client generates a code verifier
|
|
102
|
+
and challenge, 2) User is redirected to Auth0's /authorize...
|
|
103
|
+
|
|
104
|
+
[0.87] src/auth/oauth.py > class OAuthHandler
|
|
105
|
+
class OAuthHandler:
|
|
106
|
+
"""Handles OAuth2 PKCE flow for web and mobile clients."""
|
|
107
|
+
def __init__(self, client_id: str, redirect_uri: str):
|
|
108
|
+
self.client_id = client_id...
|
|
109
|
+
|
|
110
|
+
[0.82] docs/adr/003-auth-provider.md > ADR-003: Auth Provider Selection
|
|
111
|
+
## Decision
|
|
112
|
+
We chose Auth0 over Cognito because: 1) Better PKCE support,
|
|
113
|
+
2) Built-in MFA, 3) Superior documentation...
|
|
114
|
+
|
|
115
|
+
------------------------------------------
|
|
116
|
+
zembed-1 + zerank-2 | 1,847 tokens | 0.3s
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
One query returns the design spec, the implementation code, and the architectural decision record -- ranked by relevance, in under a second.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## CLI Reference
|
|
124
|
+
|
|
125
|
+
| Command | Description |
|
|
126
|
+
|---------|-------------|
|
|
127
|
+
| `probe index [paths...]` | Index project files for semantic search |
|
|
128
|
+
| `probe index --full` | Force full re-index (ignore file hashes) |
|
|
129
|
+
| `probe install` | Register probe as a user-scope MCP server in Claude Code |
|
|
130
|
+
| `probe search "query"` | Search project knowledge with natural language |
|
|
131
|
+
| `probe search --top-k N` | Limit number of results (default: 10) |
|
|
132
|
+
| `probe search --type code` | Filter by file type (markdown, code, pdf, text) |
|
|
133
|
+
| `probe search --no-rerank` | Skip reranking (faster, lower quality) |
|
|
134
|
+
| `probe search --max-tokens N` | Token budget for results (default: 4096) |
|
|
135
|
+
| `probe status` | Show index stats and provider config |
|
|
136
|
+
| `probe list` | List all indexed files |
|
|
137
|
+
| `probe config` | Show current provider configuration |
|
|
138
|
+
| `probe init` | Auto-detect provider and save config |
|
|
139
|
+
| `probe mcp` | Start MCP server (stdio transport) |
|
|
140
|
+
| `probe uninstall [--purge]` | Unregister probe; `--purge` also deletes `.probe/` in cwd |
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Multi-Provider Support
|
|
145
|
+
|
|
146
|
+
probe defaults to ZeroEntropy but works with other providers:
|
|
147
|
+
|
|
148
|
+
| Provider | Embedding | Reranker | Install |
|
|
149
|
+
|----------|-----------|----------|---------|
|
|
150
|
+
| **[ZeroEntropy](https://www.zeroentropy.dev)** (default) | zembed-1 | zerank-2 | included |
|
|
151
|
+
| OpenAI | text-embedding-3-large | -- | `pip install "probe-search[openai]"` |
|
|
152
|
+
| Cohere | embed-v4.0 | rerank-v3.5 | `pip install "probe-search[cohere]"` |
|
|
153
|
+
|
|
154
|
+
Set the corresponding API key (`ZEROENTROPY_API_KEY`, `OPENAI_API_KEY`, or `COHERE_API_KEY`) and run `probe init`. You can mix providers -- for example, OpenAI for embeddings with ZeroEntropy for reranking.
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Why ZeroEntropy?
|
|
159
|
+
|
|
160
|
+
[zembed-1](https://www.zeroentropy.dev/articles/introducing-zembed-1-the-worlds-best-multilingual-text-embedding-model) is a 4B-parameter open-weight embedding model that outperforms OpenAI, Cohere, and Voyage across nine domains including code, legal, finance, and healthcare. Combined with [zerank-2](https://www.zeroentropy.dev/articles/zerank-2-advanced-instruction-following-multilingual-reranker) for cross-encoder reranking, it delivers the best retrieval quality available.
|
|
161
|
+
|
|
162
|
+
Pricing: $0.05 per 1M tokens for embeddings, $0.025 per 1M tokens for reranking. [Free trial available](https://www.zeroentropy.dev/pricing).
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Configuration
|
|
167
|
+
|
|
168
|
+
probe stores its index and config in `.probe/` at your project root. Add it to `.gitignore`.
|
|
169
|
+
|
|
170
|
+
```yaml
|
|
171
|
+
# .probe/config.yaml
|
|
172
|
+
providers:
|
|
173
|
+
embedding:
|
|
174
|
+
name: zeroentropy
|
|
175
|
+
model: zembed-1
|
|
176
|
+
dimensions: 1280
|
|
177
|
+
reranker:
|
|
178
|
+
name: zeroentropy
|
|
179
|
+
model: zerank-2
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## How Data Is Handled
|
|
185
|
+
|
|
186
|
+
Documents are chunked and stored locally in `.probe/` (SQLite + numpy). Only chunk text is sent to the embedding/reranking API for processing. Documents are never uploaded or stored on any external server.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## What's NOT in v1
|
|
191
|
+
|
|
192
|
+
- Web sources (Notion, Confluence, Google Docs)
|
|
193
|
+
- Git-aware context (commit history, blame)
|
|
194
|
+
- Image/diagram understanding within PDFs
|
|
195
|
+
- Custom chunking strategies
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## Links
|
|
200
|
+
|
|
201
|
+
- [ZeroEntropy](https://www.zeroentropy.dev) -- the AI retrieval engine powering probe
|
|
202
|
+
- [API Dashboard](https://dashboard.zeroentropy.dev) -- get your API key
|
|
203
|
+
- [Documentation](https://docs.zeroentropy.dev) -- ZeroEntropy API docs
|
|
204
|
+
- [Models](https://docs.zeroentropy.dev/models) -- zembed-1 and zerank-2 details
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## License
|
|
209
|
+
|
|
210
|
+
MIT -- see [LICENSE](LICENSE) for details.
|