mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-02-11 02:33:51 +08:00
feat: Implement Skills Manager View and Notifier Module
- Added `skills-manager.js` for managing Claude Code skills with functionalities for loading, displaying, and editing skills. - Introduced a Notifier module in `notifier.ts` for CLI to server communication, enabling notifications for UI updates on data changes. - Created comprehensive documentation for the Chain Search implementation, including usage examples and performance tips. - Developed a test suite for the Chain Search engine, covering basic search, quick search, symbol search, and files-only search functionalities.
This commit is contained in:
146
codex-lens/test_chain_search.py
Normal file
146
codex-lens/test_chain_search.py
Normal file
@@ -0,0 +1,146 @@
|
||||
"""Test script for chain search engine functionality."""
|
||||
|
||||
from pathlib import Path
|
||||
from codexlens.search import ChainSearchEngine, SearchOptions, quick_search
|
||||
from codexlens.storage.registry import RegistryStore
|
||||
from codexlens.storage.path_mapper import PathMapper
|
||||
|
||||
|
||||
def test_basic_search():
|
||||
"""Test basic chain search functionality."""
|
||||
print("=== Testing Chain Search Engine ===\n")
|
||||
|
||||
# Initialize components
|
||||
registry = RegistryStore()
|
||||
registry.initialize()
|
||||
mapper = PathMapper()
|
||||
|
||||
# Create engine
|
||||
engine = ChainSearchEngine(registry, mapper)
|
||||
print(f"[OK] ChainSearchEngine initialized")
|
||||
|
||||
# Test search options
|
||||
options = SearchOptions(
|
||||
depth=-1,
|
||||
max_workers=4,
|
||||
limit_per_dir=10,
|
||||
total_limit=50,
|
||||
include_symbols=False,
|
||||
files_only=False
|
||||
)
|
||||
print(f"[OK] SearchOptions configured: depth={options.depth}, workers={options.max_workers}")
|
||||
|
||||
# Test path that exists in the current project
|
||||
test_path = Path("D:/Claude_dms3/codex-lens/src/codexlens")
|
||||
|
||||
if test_path.exists():
|
||||
print(f"\n[OK] Test path exists: {test_path}")
|
||||
|
||||
# Perform search
|
||||
result = engine.search("search", test_path, options)
|
||||
|
||||
print(f"\n=== Search Results ===")
|
||||
print(f"Query: '{result.query}'")
|
||||
print(f"Directories searched: {result.stats.dirs_searched}")
|
||||
print(f"Files matched: {result.stats.files_matched}")
|
||||
print(f"Time: {result.stats.time_ms:.2f}ms")
|
||||
|
||||
if result.stats.errors:
|
||||
print(f"Errors: {len(result.stats.errors)}")
|
||||
for err in result.stats.errors[:3]:
|
||||
print(f" - {err}")
|
||||
|
||||
print(f"\nTop Results (showing first 5):")
|
||||
for i, res in enumerate(result.results[:5], 1):
|
||||
print(f"{i}. {res.path}")
|
||||
print(f" Score: {res.score:.2f}")
|
||||
if res.excerpt:
|
||||
excerpt = res.excerpt.replace('\n', ' ')[:100]
|
||||
print(f" Excerpt: {excerpt}...")
|
||||
else:
|
||||
print(f"\n[SKIP] Test path does not exist: {test_path}")
|
||||
print(" (Index may not be built yet)")
|
||||
|
||||
registry.close()
|
||||
print("\n[OK] Test completed")
|
||||
|
||||
|
||||
def test_quick_search():
|
||||
"""Test quick_search convenience function."""
|
||||
print("\n\n=== Testing Quick Search ===\n")
|
||||
|
||||
test_path = Path("D:/Claude_dms3/codex-lens/src")
|
||||
|
||||
if test_path.exists():
|
||||
results = quick_search("index", test_path, depth=2)
|
||||
print(f"[OK] Quick search completed")
|
||||
print(f" Found {len(results)} results")
|
||||
if results:
|
||||
print(f" Top result: {results[0].path}")
|
||||
else:
|
||||
print(f"[SKIP] Test path does not exist: {test_path}")
|
||||
|
||||
print("\n[OK] Quick search test completed")
|
||||
|
||||
|
||||
def test_symbol_search():
|
||||
"""Test symbol search functionality."""
|
||||
print("\n\n=== Testing Symbol Search ===\n")
|
||||
|
||||
registry = RegistryStore()
|
||||
registry.initialize()
|
||||
mapper = PathMapper()
|
||||
engine = ChainSearchEngine(registry, mapper)
|
||||
|
||||
test_path = Path("D:/Claude_dms3/codex-lens/src/codexlens")
|
||||
|
||||
if test_path.exists():
|
||||
symbols = engine.search_symbols("search", test_path, kind=None)
|
||||
print(f"[OK] Symbol search completed")
|
||||
print(f" Found {len(symbols)} symbols")
|
||||
for i, sym in enumerate(symbols[:5], 1):
|
||||
print(f" {i}. {sym.name} ({sym.kind}) - lines {sym.range[0]}-{sym.range[1]}")
|
||||
else:
|
||||
print(f"[SKIP] Test path does not exist: {test_path}")
|
||||
|
||||
registry.close()
|
||||
print("\n[OK] Symbol search test completed")
|
||||
|
||||
|
||||
def test_files_only_search():
|
||||
"""Test files-only search mode."""
|
||||
print("\n\n=== Testing Files-Only Search ===\n")
|
||||
|
||||
registry = RegistryStore()
|
||||
registry.initialize()
|
||||
mapper = PathMapper()
|
||||
engine = ChainSearchEngine(registry, mapper)
|
||||
|
||||
test_path = Path("D:/Claude_dms3/codex-lens/src")
|
||||
|
||||
if test_path.exists():
|
||||
file_paths = engine.search_files_only("class", test_path)
|
||||
print(f"[OK] Files-only search completed")
|
||||
print(f" Found {len(file_paths)} files")
|
||||
for i, path in enumerate(file_paths[:5], 1):
|
||||
print(f" {i}. {path}")
|
||||
else:
|
||||
print(f"[SKIP] Test path does not exist: {test_path}")
|
||||
|
||||
registry.close()
|
||||
print("\n[OK] Files-only search test completed")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
test_basic_search()
|
||||
test_quick_search()
|
||||
test_symbol_search()
|
||||
test_files_only_search()
|
||||
print("\n" + "=" * 50)
|
||||
print("All tests completed successfully!")
|
||||
print("=" * 50)
|
||||
except Exception as e:
|
||||
print(f"\n[ERROR] Test failed with error: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
Reference in New Issue
Block a user