code-context-engine 0.4.3__py3-none-any.whl → 0.4.5__py3-none-any.whl

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.
@@ -1,14 +1,14 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-context-engine
3
- Version: 0.4.3
4
- Summary: Index your codebase. AI searches instead of re-reading files. Save 70%+ on tokens. Works with Claude Code, Cursor, VS Code, Gemini CLI, and Codex.
3
+ Version: 0.4.5
4
+ Summary: Index your codebase. AI searches instead of re-reading files. 93% token savings, benchmarked on FastAPI. Works with Claude Code, Cursor, VS Code, Gemini CLI, and Codex.
5
5
  Author-email: Fazle Elahee <felahee@gmail.com>, Raj <rajkumar.sakti@gmail.com>
6
6
  License-Expression: MIT
7
7
  Project-URL: Homepage, https://github.com/elara-labs/code-context-engine
8
8
  Project-URL: Repository, https://github.com/elara-labs/code-context-engine
9
9
  Project-URL: Issues, https://github.com/elara-labs/code-context-engine/issues
10
10
  Keywords: claude,context,mcp,llm,code-indexing,vector-search
11
- Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Development Status :: 4 - Beta
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: Programming Language :: Python :: 3
14
14
  Classifier: Programming Language :: Python :: 3.11
@@ -37,6 +37,7 @@ Requires-Dist: httpx>=0.27
37
37
  Requires-Dist: fastapi>=0.110
38
38
  Requires-Dist: uvicorn>=0.29
39
39
  Requires-Dist: aiohttp>=3.9
40
+ Requires-Dist: psutil>=5.9
40
41
  Provides-Extra: dev
41
42
  Requires-Dist: pytest>=8.0; extra == "dev"
42
43
  Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
@@ -57,6 +58,7 @@ Dynamic: license-file
57
58
  </p>
58
59
 
59
60
  <p align="center">
61
+ <a href="https://github.com/elara-labs/code-context-engine/actions/workflows/ci.yml"><img src="https://github.com/elara-labs/code-context-engine/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
60
62
  <a href="https://pypi.org/project/code-context-engine/"><img src="https://img.shields.io/pypi/v/code-context-engine?color=blue&label=PyPI" alt="PyPI"></a>
61
63
  <a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.11+-blue.svg" alt="Python 3.11+"></a>
62
64
  <a href="https://modelcontextprotocol.io"><img src="https://img.shields.io/badge/MCP-compatible-green.svg" alt="MCP Compatible"></a>
@@ -87,6 +89,14 @@ Dynamic: license-file
87
89
 
88
90
  ---
89
91
 
92
+ ## System requirements
93
+
94
+ - Python 3.11+
95
+ - A C compiler and `cmake` (needed to build tree-sitter grammars)
96
+ - **macOS:** `xcode-select --install`
97
+ - **Ubuntu/Debian:** `sudo apt install build-essential cmake`
98
+ - **Windows:** Visual Studio Build Tools (C++ workload)
99
+
90
100
  ## Install and see savings in 60 seconds
91
101
 
92
102
  ```bash
@@ -210,6 +220,14 @@ cce savings --all # see savings across all projects
210
220
 
211
221
  ---
212
222
 
223
+ ## How is CCE different?
224
+
225
+ CCE is editor-agnostic, local-first, and gives you measurable token savings. Your code never leaves your machine. Unlike built-in indexing (Cursor, Continue), CCE works across Claude Code, VS Code, Cursor, Gemini CLI, and Codex with a single index. Unlike cloud tools (Greptile), it's free and private.
226
+
227
+ See the [full comparison with alternatives](docs/comparison.md) for an honest look at trade-offs.
228
+
229
+ ---
230
+
213
231
  ## How it works (the short version)
214
232
 
215
233
  1. **Index:** Tree-sitter parses your code into semantic chunks (functions, classes, modules). Stored as vector embeddings locally.
@@ -1,8 +1,8 @@
1
- code_context_engine-0.4.3.dist-info/licenses/LICENSE,sha256=vLbw0GGCVJSIRppMus7Oq0PyMDhDXz-dfvz2rPpWtjQ,1069
1
+ code_context_engine-0.4.5.dist-info/licenses/LICENSE,sha256=vLbw0GGCVJSIRppMus7Oq0PyMDhDXz-dfvz2rPpWtjQ,1069
2
2
  context_engine/__init__.py,sha256=qThGxB7xfZi5M9jDpUno0MKBp7KKrEOdH1hG4wHMuLc,193
3
- context_engine/cli.py,sha256=t4w1kxuMnE1WeSdKut8nmZawL6AhI7GXu5H1JkiAY9U,113160
3
+ context_engine/cli.py,sha256=KcOO3WSbo8joKcSPJlKKhpVFsnLDIffKmqTLx5PGs14,113198
4
4
  context_engine/cli_style.py,sha256=a3l3Smq1gIN2asbNalFUz0i_5x7Tmkp_wEhyGMoo8a4,2460
5
- context_engine/config.py,sha256=FU8Hn8-9KCLGhjImsMbmV9WGNZyWp_qOtWW4BxI-URQ,7202
5
+ context_engine/config.py,sha256=2pCe-nJbB1IgrFwT3iMOmUSZMaaH2IBamm867CULdnY,7129
6
6
  context_engine/editors.py,sha256=LT_WdYwyB1EeH1xsB6DDtJlbGMKXOTIVSOWXOOfXh1U,8970
7
7
  context_engine/event_bus.py,sha256=g4r9QKuC-Y7RmrjOTlUrJSB-bBTpAqp0-_IXeMUg4wo,775
8
8
  context_engine/models.py,sha256=XBbM0CUqNDQ5MOp6F3STST2qLqy2Zk0m050ZtWdXkrk,2048
@@ -19,7 +19,7 @@ context_engine/compression/prompts.py,sha256=jZnpqhr77uI9R3S0vm3Dj17JYy03AXq24E6
19
19
  context_engine/compression/quality.py,sha256=F6fyxDdWjq-Hgtw4xFIaE4BqPoJw1W1EQSn3RXDgdHc,1676
20
20
  context_engine/dashboard/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  context_engine/dashboard/_page.py,sha256=EdFBGlrL-6j3XVpi-TViFJjUHzMvTorH4CDos8w-oMI,70579
22
- context_engine/dashboard/server.py,sha256=8NgIsMIqGhEtL3svjCpd4g781L7owZkdVu93k_viR88,17379
22
+ context_engine/dashboard/server.py,sha256=N-QVaDCUL1h70QUgKrIy6QhQIedasf0KYHcV5LACZ0U,17437
23
23
  context_engine/indexer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
24
  context_engine/indexer/chunker.py,sha256=f0n7gJughdHP1fmMd1sbHAxLmVlCnIq6scHOeGFmBS8,6503
25
25
  context_engine/indexer/embedder.py,sha256=jHCybuliTtVyHWJYokA8XfznaDX4I_OZH-_RGA4YDQc,5580
@@ -56,8 +56,8 @@ context_engine/storage/graph_store.py,sha256=mftuJFvlkFeBlzMsQorY5YS4l5wsDUxCMw5
56
56
  context_engine/storage/local_backend.py,sha256=5MVoAn6Jkiltho-9BjClisLkyXMkSZZc2Z_h3N7Vfcg,4200
57
57
  context_engine/storage/remote_backend.py,sha256=u77lnGIvqrL3PwInjT6nfRgyNn6oVxW92KUK66oWrvI,5504
58
58
  context_engine/storage/vector_store.py,sha256=tA0ol_v5B2KRNMt2hE2kI4qnYe_AoYP_HSp1MvzcsFU,14704
59
- code_context_engine-0.4.3.dist-info/METADATA,sha256=iPoiteCiDaqoZjINmcaYnM0LMVfv8oK1KMMhWqixkEg,17592
60
- code_context_engine-0.4.3.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
61
- code_context_engine-0.4.3.dist-info/entry_points.txt,sha256=DQuRWUuVFM7nPcXtDmJzlem7QA0IboD_4N8AnTtDD9Q,144
62
- code_context_engine-0.4.3.dist-info/top_level.txt,sha256=X1-RUqb61WXBjy3JjsW2oXwfvqk2ydXKDNidxmw4CZ4,15
63
- code_context_engine-0.4.3.dist-info/RECORD,,
59
+ code_context_engine-0.4.5.dist-info/METADATA,sha256=Xf-6Rk_H3Z0GjLZBQE0G1i1HgUquXbya5UuQiwskt14,18539
60
+ code_context_engine-0.4.5.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
61
+ code_context_engine-0.4.5.dist-info/entry_points.txt,sha256=DQuRWUuVFM7nPcXtDmJzlem7QA0IboD_4N8AnTtDD9Q,144
62
+ code_context_engine-0.4.5.dist-info/top_level.txt,sha256=X1-RUqb61WXBjy3JjsW2oXwfvqk2ydXKDNidxmw4CZ4,15
63
+ code_context_engine-0.4.5.dist-info/RECORD,,
context_engine/cli.py CHANGED
@@ -1249,8 +1249,8 @@ def _run_savings_report(config, *, as_json: bool = False, all_projects: bool = F
1249
1249
  baseline = max(full_file, raw) if full_file > 0 else raw
1250
1250
  served = served_legacy
1251
1251
 
1252
- tokens_saved = max(0, baseline - served)
1253
- saved_pct = int(tokens_saved / baseline * 100) if baseline > 0 else 0
1252
+ tokens_saved = max(0, baseline - served) if queries > 0 else 0
1253
+ saved_pct = int(tokens_saved / baseline * 100) if baseline > 0 and queries > 0 else 0
1254
1254
 
1255
1255
  q_label = "query" if queries == 1 else "queries"
1256
1256
 
context_engine/config.py CHANGED
@@ -90,11 +90,8 @@ class Config:
90
90
  storage_path: str = str(_CCE_HOME / "projects")
91
91
 
92
92
  def detect_resource_profile(self) -> str:
93
- try:
94
- import psutil
95
- ram_gb = psutil.virtual_memory().total / (1024 ** 3)
96
- except ImportError:
97
- ram_gb = 16
93
+ import psutil
94
+ ram_gb = psutil.virtual_memory().total / (1024 ** 3)
98
95
  if ram_gb >= 32:
99
96
  return "full"
100
97
  if ram_gb >= 12:
@@ -142,8 +142,9 @@ def create_app(config: Config, project_dir: Path) -> FastAPI:
142
142
 
143
143
  full_file = stats.get("full_file_tokens", 0)
144
144
  served = stats.get("served_tokens", 0)
145
+ queries = stats.get("queries", 0)
145
146
  baseline = full_file if full_file > 0 else stats.get("raw_tokens", 0)
146
- saved_pct = max(0, int((1 - served / baseline) * 100)) if baseline > 0 else 0
147
+ saved_pct = max(0, int((1 - served / baseline) * 100)) if baseline > 0 and queries > 0 else 0
147
148
 
148
149
  output_level = state.get("output_level", config.output_compression)
149
150