diff --git a/codex-lens-v2/conftest.py b/codex-lens-v2/conftest.py index abc6f46c..9753a55a 100644 --- a/codex-lens-v2/conftest.py +++ b/codex-lens-v2/conftest.py @@ -1,5 +1,5 @@ import sys import os -# Ensure the local src directory takes precedence over any installed codexlens package +# Ensure the local src directory takes precedence over any installed codexlens_search package sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src")) diff --git a/codex-lens-v2/pyproject.toml b/codex-lens-v2/pyproject.toml index c5834b00..e37317f3 100644 --- a/codex-lens-v2/pyproject.toml +++ b/codex-lens-v2/pyproject.toml @@ -3,9 +3,9 @@ requires = ["hatchling"] build-backend = "hatchling.build" [project] -name = "codex-lens-v2" -version = "0.1.0" -description = "Minimal code semantic search library with 2-stage pipeline" +name = "codexlens-search" +version = "0.2.0" +description = "Lightweight semantic code search engine — 2-stage vector + FTS + RRF fusion" requires-python = ">=3.10" dependencies = [] @@ -33,4 +33,4 @@ dev = [ ] [tool.hatch.build.targets.wheel] -packages = ["src/codexlens"] +packages = ["src/codexlens_search"] diff --git a/codex-lens-v2/scripts/index_and_search.py b/codex-lens-v2/scripts/index_and_search.py index bad0e666..d20c1ef4 100644 --- a/codex-lens-v2/scripts/index_and_search.py +++ b/codex-lens-v2/scripts/index_and_search.py @@ -9,13 +9,13 @@ from pathlib import Path # 确保 src 可被导入 sys.path.insert(0, str(Path(__file__).parent.parent / "src")) -from codexlens.config import Config -from codexlens.core.factory import create_ann_index, create_binary_index -from codexlens.embed.local import FastEmbedEmbedder -from codexlens.indexing import IndexingPipeline -from codexlens.rerank.local import FastEmbedReranker -from codexlens.search.fts import FTSEngine -from codexlens.search.pipeline import SearchPipeline +from codexlens_search.config import Config +from codexlens_search.core.factory import create_ann_index, create_binary_index +from codexlens_search.embed.local import FastEmbedEmbedder +from codexlens_search.indexing import IndexingPipeline +from codexlens_search.rerank.local import FastEmbedReranker +from codexlens_search.search.fts import FTSEngine +from codexlens_search.search.pipeline import SearchPipeline # ─── 配置 ────────────────────────────────────────────────────────────────── REPO_ROOT = Path("D:/Claude_dms3") diff --git a/codex-lens-v2/scripts/test_small_e2e.py b/codex-lens-v2/scripts/test_small_e2e.py index 1e6b3b64..796789a8 100644 --- a/codex-lens-v2/scripts/test_small_e2e.py +++ b/codex-lens-v2/scripts/test_small_e2e.py @@ -11,13 +11,13 @@ from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent / "src")) import numpy as np -from codexlens.config import Config -from codexlens.core.factory import create_ann_index, create_binary_index -from codexlens.embed.local import FastEmbedEmbedder -from codexlens.indexing import IndexingPipeline -from codexlens.rerank.base import BaseReranker -from codexlens.search.fts import FTSEngine -from codexlens.search.pipeline import SearchPipeline +from codexlens_search.config import Config +from codexlens_search.core.factory import create_ann_index, create_binary_index +from codexlens_search.embed.local import FastEmbedEmbedder +from codexlens_search.indexing import IndexingPipeline +from codexlens_search.rerank.base import BaseReranker +from codexlens_search.search.fts import FTSEngine +from codexlens_search.search.pipeline import SearchPipeline class KeywordReranker(BaseReranker): @@ -32,7 +32,7 @@ class KeywordReranker(BaseReranker): return scores PROJECT = Path(__file__).parent.parent -TARGET_DIR = PROJECT / "src" / "codexlens" # ~21 .py files, small +TARGET_DIR = PROJECT / "src" / "codexlens_search" # ~21 .py files, small INDEX_DIR = PROJECT / ".test_index_cache" EXTENSIONS = {".py"} diff --git a/codex-lens-v2/src/codexlens/__init__.py b/codex-lens-v2/src/codexlens/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/codex-lens-v2/src/codexlens_search/__init__.py b/codex-lens-v2/src/codexlens_search/__init__.py new file mode 100644 index 00000000..979f92db --- /dev/null +++ b/codex-lens-v2/src/codexlens_search/__init__.py @@ -0,0 +1,20 @@ +"""codexlens-search: Lightweight semantic code search engine. + +Public API for consumers (e.g. codex-lens): + + from codexlens_search import SearchPipeline, IndexingPipeline, Config + from codexlens_search.core import create_ann_index, create_binary_index + from codexlens_search.embed.local import FastEmbedEmbedder + from codexlens_search.rerank.api import APIReranker +""" +from codexlens_search.config import Config +from codexlens_search.indexing import IndexingPipeline, IndexStats +from codexlens_search.search.pipeline import SearchPipeline, SearchResult + +__all__ = [ + "Config", + "IndexingPipeline", + "IndexStats", + "SearchPipeline", + "SearchResult", +] diff --git a/codex-lens-v2/src/codexlens/config.py b/codex-lens-v2/src/codexlens_search/config.py similarity index 100% rename from codex-lens-v2/src/codexlens/config.py rename to codex-lens-v2/src/codexlens_search/config.py diff --git a/codex-lens-v2/src/codexlens/core/__init__.py b/codex-lens-v2/src/codexlens_search/core/__init__.py similarity index 100% rename from codex-lens-v2/src/codexlens/core/__init__.py rename to codex-lens-v2/src/codexlens_search/core/__init__.py diff --git a/codex-lens-v2/src/codexlens/core/base.py b/codex-lens-v2/src/codexlens_search/core/base.py similarity index 100% rename from codex-lens-v2/src/codexlens/core/base.py rename to codex-lens-v2/src/codexlens_search/core/base.py diff --git a/codex-lens-v2/src/codexlens/core/binary.py b/codex-lens-v2/src/codexlens_search/core/binary.py similarity index 98% rename from codex-lens-v2/src/codexlens/core/binary.py rename to codex-lens-v2/src/codexlens_search/core/binary.py index 59f5a432..e8ba543e 100644 --- a/codex-lens-v2/src/codexlens/core/binary.py +++ b/codex-lens-v2/src/codexlens_search/core/binary.py @@ -6,8 +6,8 @@ from pathlib import Path import numpy as np -from codexlens.config import Config -from codexlens.core.base import BaseBinaryIndex +from codexlens_search.config import Config +from codexlens_search.core.base import BaseBinaryIndex logger = logging.getLogger(__name__) diff --git a/codex-lens-v2/src/codexlens/core/factory.py b/codex-lens-v2/src/codexlens_search/core/factory.py similarity index 82% rename from codex-lens-v2/src/codexlens/core/factory.py rename to codex-lens-v2/src/codexlens_search/core/factory.py index c1d0f2a8..ed7758e6 100644 --- a/codex-lens-v2/src/codexlens/core/factory.py +++ b/codex-lens-v2/src/codexlens_search/core/factory.py @@ -3,8 +3,8 @@ from __future__ import annotations import logging from pathlib import Path -from codexlens.config import Config -from codexlens.core.base import BaseANNIndex, BaseBinaryIndex +from codexlens_search.config import Config +from codexlens_search.core.base import BaseANNIndex, BaseBinaryIndex logger = logging.getLogger(__name__) @@ -52,22 +52,22 @@ def create_ann_index(path: str | Path, dim: int, config: Config) -> BaseANNIndex backend = config.ann_backend if backend == "faiss": - from codexlens.core.faiss_index import FAISSANNIndex + from codexlens_search.core.faiss_index import FAISSANNIndex return FAISSANNIndex(path, dim, config) if backend == "hnswlib": - from codexlens.core.index import ANNIndex + from codexlens_search.core.index import ANNIndex return ANNIndex(path, dim, config) # auto: try faiss first, then hnswlib if _FAISS_AVAILABLE: - from codexlens.core.faiss_index import FAISSANNIndex + from codexlens_search.core.faiss_index import FAISSANNIndex gpu_tag = " (GPU available)" if _has_faiss_gpu() else " (CPU)" logger.info("Auto-selected FAISS ANN backend%s", gpu_tag) return FAISSANNIndex(path, dim, config) if _HNSWLIB_AVAILABLE: - from codexlens.core.index import ANNIndex + from codexlens_search.core.index import ANNIndex logger.info("Auto-selected hnswlib ANN backend") return ANNIndex(path, dim, config) @@ -97,20 +97,20 @@ def create_binary_index( backend = config.binary_backend if backend == "faiss": - from codexlens.core.faiss_index import FAISSBinaryIndex + from codexlens_search.core.faiss_index import FAISSBinaryIndex return FAISSBinaryIndex(path, dim, config) if backend == "hnswlib": - from codexlens.core.binary import BinaryStore + from codexlens_search.core.binary import BinaryStore return BinaryStore(path, dim, config) # auto: try faiss first, then numpy-based BinaryStore if _FAISS_AVAILABLE: - from codexlens.core.faiss_index import FAISSBinaryIndex + from codexlens_search.core.faiss_index import FAISSBinaryIndex logger.info("Auto-selected FAISS binary backend") return FAISSBinaryIndex(path, dim, config) # numpy BinaryStore is always available (no extra deps) - from codexlens.core.binary import BinaryStore + from codexlens_search.core.binary import BinaryStore logger.info("Auto-selected numpy BinaryStore backend") return BinaryStore(path, dim, config) diff --git a/codex-lens-v2/src/codexlens/core/faiss_index.py b/codex-lens-v2/src/codexlens_search/core/faiss_index.py similarity index 98% rename from codex-lens-v2/src/codexlens/core/faiss_index.py rename to codex-lens-v2/src/codexlens_search/core/faiss_index.py index e076af50..e3277527 100644 --- a/codex-lens-v2/src/codexlens/core/faiss_index.py +++ b/codex-lens-v2/src/codexlens_search/core/faiss_index.py @@ -7,8 +7,8 @@ from pathlib import Path import numpy as np -from codexlens.config import Config -from codexlens.core.base import BaseANNIndex, BaseBinaryIndex +from codexlens_search.config import Config +from codexlens_search.core.base import BaseANNIndex, BaseBinaryIndex logger = logging.getLogger(__name__) diff --git a/codex-lens-v2/src/codexlens/core/index.py b/codex-lens-v2/src/codexlens_search/core/index.py similarity index 97% rename from codex-lens-v2/src/codexlens/core/index.py rename to codex-lens-v2/src/codexlens_search/core/index.py index dc92d581..1a7e4e93 100644 --- a/codex-lens-v2/src/codexlens/core/index.py +++ b/codex-lens-v2/src/codexlens_search/core/index.py @@ -6,8 +6,8 @@ from pathlib import Path import numpy as np -from codexlens.config import Config -from codexlens.core.base import BaseANNIndex +from codexlens_search.config import Config +from codexlens_search.core.base import BaseANNIndex logger = logging.getLogger(__name__) diff --git a/codex-lens-v2/src/codexlens/embed/__init__.py b/codex-lens-v2/src/codexlens_search/embed/__init__.py similarity index 100% rename from codex-lens-v2/src/codexlens/embed/__init__.py rename to codex-lens-v2/src/codexlens_search/embed/__init__.py diff --git a/codex-lens-v2/src/codexlens/embed/base.py b/codex-lens-v2/src/codexlens_search/embed/base.py similarity index 100% rename from codex-lens-v2/src/codexlens/embed/base.py rename to codex-lens-v2/src/codexlens_search/embed/base.py diff --git a/codex-lens-v2/src/codexlens/embed/local.py b/codex-lens-v2/src/codexlens_search/embed/local.py similarity index 100% rename from codex-lens-v2/src/codexlens/embed/local.py rename to codex-lens-v2/src/codexlens_search/embed/local.py diff --git a/codex-lens-v2/src/codexlens/indexing/__init__.py b/codex-lens-v2/src/codexlens_search/indexing/__init__.py similarity index 100% rename from codex-lens-v2/src/codexlens/indexing/__init__.py rename to codex-lens-v2/src/codexlens_search/indexing/__init__.py diff --git a/codex-lens-v2/src/codexlens/indexing/pipeline.py b/codex-lens-v2/src/codexlens_search/indexing/pipeline.py similarity index 97% rename from codex-lens-v2/src/codexlens/indexing/pipeline.py rename to codex-lens-v2/src/codexlens_search/indexing/pipeline.py index 8e11c4c7..0818867c 100644 --- a/codex-lens-v2/src/codexlens/indexing/pipeline.py +++ b/codex-lens-v2/src/codexlens_search/indexing/pipeline.py @@ -14,11 +14,11 @@ from pathlib import Path import numpy as np -from codexlens.config import Config -from codexlens.core.binary import BinaryStore -from codexlens.core.index import ANNIndex -from codexlens.embed.base import BaseEmbedder -from codexlens.search.fts import FTSEngine +from codexlens_search.config import Config +from codexlens_search.core.binary import BinaryStore +from codexlens_search.core.index import ANNIndex +from codexlens_search.embed.base import BaseEmbedder +from codexlens_search.search.fts import FTSEngine logger = logging.getLogger(__name__) diff --git a/codex-lens-v2/src/codexlens/rerank/__init__.py b/codex-lens-v2/src/codexlens_search/rerank/__init__.py similarity index 100% rename from codex-lens-v2/src/codexlens/rerank/__init__.py rename to codex-lens-v2/src/codexlens_search/rerank/__init__.py diff --git a/codex-lens-v2/src/codexlens/rerank/api.py b/codex-lens-v2/src/codexlens_search/rerank/api.py similarity index 98% rename from codex-lens-v2/src/codexlens/rerank/api.py rename to codex-lens-v2/src/codexlens_search/rerank/api.py index c56a221f..8633a9ea 100644 --- a/codex-lens-v2/src/codexlens/rerank/api.py +++ b/codex-lens-v2/src/codexlens_search/rerank/api.py @@ -5,7 +5,7 @@ import time import httpx -from codexlens.config import Config +from codexlens_search.config import Config from .base import BaseReranker logger = logging.getLogger(__name__) diff --git a/codex-lens-v2/src/codexlens/rerank/base.py b/codex-lens-v2/src/codexlens_search/rerank/base.py similarity index 100% rename from codex-lens-v2/src/codexlens/rerank/base.py rename to codex-lens-v2/src/codexlens_search/rerank/base.py diff --git a/codex-lens-v2/src/codexlens/rerank/local.py b/codex-lens-v2/src/codexlens_search/rerank/local.py similarity index 94% rename from codex-lens-v2/src/codexlens/rerank/local.py rename to codex-lens-v2/src/codexlens_search/rerank/local.py index f14ea5cd..5af60fb2 100644 --- a/codex-lens-v2/src/codexlens/rerank/local.py +++ b/codex-lens-v2/src/codexlens_search/rerank/local.py @@ -1,6 +1,6 @@ from __future__ import annotations -from codexlens.config import Config +from codexlens_search.config import Config from .base import BaseReranker diff --git a/codex-lens-v2/src/codexlens/search/__init__.py b/codex-lens-v2/src/codexlens_search/search/__init__.py similarity index 100% rename from codex-lens-v2/src/codexlens/search/__init__.py rename to codex-lens-v2/src/codexlens_search/search/__init__.py diff --git a/codex-lens-v2/src/codexlens/search/fts.py b/codex-lens-v2/src/codexlens_search/search/fts.py similarity index 100% rename from codex-lens-v2/src/codexlens/search/fts.py rename to codex-lens-v2/src/codexlens_search/search/fts.py diff --git a/codex-lens-v2/src/codexlens/search/fusion.py b/codex-lens-v2/src/codexlens_search/search/fusion.py similarity index 100% rename from codex-lens-v2/src/codexlens/search/fusion.py rename to codex-lens-v2/src/codexlens_search/search/fusion.py diff --git a/codex-lens-v2/src/codexlens/search/pipeline.py b/codex-lens-v2/src/codexlens_search/search/pipeline.py similarity index 100% rename from codex-lens-v2/src/codexlens/search/pipeline.py rename to codex-lens-v2/src/codexlens_search/search/pipeline.py diff --git a/codex-lens-v2/tests/integration/conftest.py b/codex-lens-v2/tests/integration/conftest.py index d8353a1c..9c6012e8 100644 --- a/codex-lens-v2/tests/integration/conftest.py +++ b/codex-lens-v2/tests/integration/conftest.py @@ -3,12 +3,12 @@ import numpy as np import tempfile from pathlib import Path -from codexlens.config import Config -from codexlens.core import ANNIndex, BinaryStore -from codexlens.embed.base import BaseEmbedder -from codexlens.rerank.base import BaseReranker -from codexlens.search.fts import FTSEngine -from codexlens.search.pipeline import SearchPipeline +from codexlens_search.config import Config +from codexlens_search.core import ANNIndex, BinaryStore +from codexlens_search.embed.base import BaseEmbedder +from codexlens_search.rerank.base import BaseReranker +from codexlens_search.search.fts import FTSEngine +from codexlens_search.search.pipeline import SearchPipeline # Test documents: 20 code snippets with id, path, content TEST_DOCS = [ diff --git a/codex-lens-v2/tests/unit/test_config.py b/codex-lens-v2/tests/unit/test_config.py index 1c037975..e9e4b056 100644 --- a/codex-lens-v2/tests/unit/test_config.py +++ b/codex-lens-v2/tests/unit/test_config.py @@ -1,4 +1,4 @@ -from codexlens.config import Config +from codexlens_search.config import Config def test_config_instantiates_no_args(): diff --git a/codex-lens-v2/tests/unit/test_core.py b/codex-lens-v2/tests/unit/test_core.py index 7cf2a513..41834446 100644 --- a/codex-lens-v2/tests/unit/test_core.py +++ b/codex-lens-v2/tests/unit/test_core.py @@ -8,8 +8,8 @@ from pathlib import Path import numpy as np import pytest -from codexlens.config import Config -from codexlens.core import ANNIndex, BinaryStore +from codexlens_search.config import Config +from codexlens_search.core import ANNIndex, BinaryStore DIM = 32 diff --git a/codex-lens-v2/tests/unit/test_embed.py b/codex-lens-v2/tests/unit/test_embed.py index 03e28585..afa19a1a 100644 --- a/codex-lens-v2/tests/unit/test_embed.py +++ b/codex-lens-v2/tests/unit/test_embed.py @@ -18,9 +18,9 @@ def _make_fastembed_mock(): _make_fastembed_mock() -from codexlens.config import Config # noqa: E402 -from codexlens.embed.base import BaseEmbedder # noqa: E402 -from codexlens.embed.local import EMBED_PROFILES, FastEmbedEmbedder # noqa: E402 +from codexlens_search.config import Config # noqa: E402 +from codexlens_search.embed.base import BaseEmbedder # noqa: E402 +from codexlens_search.embed.local import EMBED_PROFILES, FastEmbedEmbedder # noqa: E402 class TestEmbedSingle(unittest.TestCase): diff --git a/codex-lens-v2/tests/unit/test_rerank.py b/codex-lens-v2/tests/unit/test_rerank.py index 36a3f4eb..b75073fb 100644 --- a/codex-lens-v2/tests/unit/test_rerank.py +++ b/codex-lens-v2/tests/unit/test_rerank.py @@ -5,10 +5,10 @@ from unittest.mock import MagicMock, patch import pytest -from codexlens.config import Config -from codexlens.rerank.base import BaseReranker -from codexlens.rerank.local import FastEmbedReranker -from codexlens.rerank.api import APIReranker +from codexlens_search.config import Config +from codexlens_search.rerank.base import BaseReranker +from codexlens_search.rerank.local import FastEmbedReranker +from codexlens_search.rerank.api import APIReranker # --------------------------------------------------------------------------- diff --git a/codex-lens-v2/tests/unit/test_search.py b/codex-lens-v2/tests/unit/test_search.py index 1e1093d7..5544665c 100644 --- a/codex-lens-v2/tests/unit/test_search.py +++ b/codex-lens-v2/tests/unit/test_search.py @@ -5,16 +5,16 @@ from unittest.mock import MagicMock import pytest -from codexlens.search.fts import FTSEngine -from codexlens.search.fusion import ( +from codexlens_search.search.fts import FTSEngine +from codexlens_search.search.fusion import ( DEFAULT_WEIGHTS, QueryIntent, detect_query_intent, get_adaptive_weights, reciprocal_rank_fusion, ) -from codexlens.search.pipeline import SearchPipeline, SearchResult -from codexlens.config import Config +from codexlens_search.search.pipeline import SearchPipeline, SearchResult +from codexlens_search.config import Config # ---------------------------------------------------------------------------