# pyproject.toml — Thicket v1.0 # # Super-ingest + RAG console: batch-import PDF / EPUB / Markdown / # plain-text into an Obsidian vault, a Qdrant vector store, and an # optional LightRAG knowledge graph — wrapped in the MMD3-style # PySide6 console UI (same visual lineage as OpenTranscode). # # Publish with: # python -m build # twine upload dist/* [build-system] requires = ["setuptools>=68.0", "wheel"] build-backend = "setuptools.build_meta" [project] name = "thicket" version = "1.8.1" description = "Super-ingest + RAG console: documents -> Obsidian + Qdrant + LightRAG, with a PySide6 GUI" readme = "README.md" requires-python = ">=3.12" license = { text = "AGPL-3.0-or-later" } authors = [ { name = "Jeremy Anderson", email = "info@dcos.net" }, ] maintainers = [ { name = "Jeremy Anderson", email = "info@dcos.net" }, ] keywords = [ "obsidian", "qdrant", "lightrag", "rag", "thicket", "super-ingest", "second-brain", "embeddings", "knowledge-graph", "pyside6", "linux", ] classifiers = [ "Development Status :: 4 - Beta", "Environment :: X11 Applications :: Qt", "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Text Processing :: Indexing", "Typing :: Typed", ] # Core dependency is intentionally ONLY the GUI toolkit — the app # launches and probes even on a bare system, reporting exactly which # ingest extras are missing. Heavy pipelines deps live in extras so # a "vault-only" install (no vector DB, no graph) stays lightweight. dependencies = [ "PySide6>=6.6.0", ] [project.optional-dependencies] # Document parsing + vector indexing — install with: # pip install ".[ingest]" ingest = [ "beautifulsoup4>=4.12", "EbookLib>=0.18", "pypdf>=4.0", "python-slugify>=8.0", "fastembed>=0.3", "qdrant-client>=1.9", ] # LightRAG knowledge-graph stage — install with: # pip install ".[graph]" graph = [ "lightrag-hku>=1.0", ] # Embedded vector targets — one extra per target, or ".[targets]" for all chroma = ["chromadb>=0.5"] lancedb = ["lancedb>=0.15"] faiss = ["faiss-cpu>=1.8", "numpy>=1.26"] milvus = ["pymilvus[milvus_lite]>=2.4"] weaviate = ["weaviate-client>=4.6"] pgvector = ["psycopg[binary]>=3.1", "pgvector>=0.3"] duckdb = ["duckdb>=1.0"] sqlitevec = ["sqlite-vec>=0.1.6"] mariadb = ["PyMySQL>=1.1"] # Graphify graph engine — install with: pip install ".[graphify]" graphify = ["graphifyy[ollama]>=0.9"] # Vanna ask interaction (natural-language SQL over SQL targets) ask = ["vanna[ollama,postgres,mysql]>=2.0"] # MinIO object archive for source documents minio = ["minio>=7.2"] targets = [ "chromadb>=0.5", "lancedb>=0.15", "faiss-cpu>=1.8", "numpy>=1.26", "pymilvus[milvus_lite]>=2.4", "weaviate-client>=4.6", "psycopg[binary]>=3.1", "pgvector>=0.3", "duckdb>=1.0", "sqlite-vec>=0.1.6", "PyMySQL>=1.1", ] # Dev / test extras — install with: pip install -e ".[dev]" dev = [ "pytest>=8.0", "pytest-cov>=4.0", "build>=1.0", ] [project.urls] Homepage = "https://git.dcos.net/dcosnet/Thicket" Repository = "https://git.dcos.net/dcosnet/Thicket" Documentation = "https://git.dcos.net/dcosnet/Thicket/blob/main/README.md" "Bug Tracker" = "https://git.dcos.net/dcosnet/Thicket/issues" [project.scripts] # Console entry point — `thicket` command after `pip install thicket` thicket = "thicket.__main__:main" # ───────────────────────────────────────────────────────────────────────────── # Setuptools-specific config # ───────────────────────────────────────────────────────────────────────────── [tool.setuptools] # We're a pure-Python package — no extension modules. zip-safe = false [tool.setuptools.packages.find] # Auto-discover packages under thicket/ and widgets/ where = ["."] include = ["thicket*"] exclude = ["tests*"] [tool.setuptools.package-data] # Include the QSS theme + non-Python assets thicket = ["*.qss", "*.txt"] # ───────────────────────────────────────────────────────────────────────────── # Tool config # ───────────────────────────────────────────────────────────────────────────── [tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_*.py"] python_classes = ["Test*"] python_functions = ["test_*"] addopts = "-ra --strict-markers" markers = [ "slow: marks tests as slow (deselect with '-m \"not slow\"')", "e2e: marks tests as end-to-end (require running Qdrant / Ollama)", ] [tool.coverage.run] source = ["thicket"] omit = [ "*/tests/*", "*/__main__.py", ] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "if TYPE_CHECKING:", "raise NotImplementedError", "if __name__ == .__main__.:", ]