[build-system] requires = ["hatchling>=1.27"] build-backend = "hatchling.build" [project] name = "semahash" version = "0.5.5" description = "Content-addressed semantics for multi-agent coordination. When the hash is the word." readme = "README.md" requires-python = ">=3.10" license = "MIT AND CC-BY-4.0" license-files = ["LICENSE", "LICENSE-CONTENT", "THIRD_PARTY_NOTICES.md"] authors = [ { name = "Henrik Westerberg", email = "henrik@emergentwisdom.org" }, ] keywords = ["ai", "agents", "mcp", "semantics", "coordination", "content-addressing", "vocabulary"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", ] dependencies = [ "typer>=0.9", "rich>=13.0", "pydantic>=2.0", "httpx>=0.24", "platformdirs>=3.0", "numpy>=1.24", "networkx>=3.0", "fastembed>=0.2", # Rule 5.2 (data_schema must be valid JSON Schema) is only enforced when # jsonschema is importable — declare it so validation is deterministic # across installs instead of silently skipped (issue #47). "jsonschema>=4.0", ] [project.optional-dependencies] full = [ "fastapi>=0.100", "uvicorn>=0.20", "mcp>=1.0,<2", ] mcp = [ "mcp>=1.0,<2", ] api = [ "fastapi>=0.100", "uvicorn>=0.20", ] embeddings = [] # fastembed is now a base dependency paper = [ "tiktoken>=0.7", ] [project.urls] Homepage = "https://semahash.org" Repository = "https://github.com/emergent-wisdom/sema" Paper = "https://github.com/emergent-wisdom/sema/blob/main/paper/sema.pdf" [project.scripts] sema = "sema.cli.main:main" [tool.hatch.build] artifacts = [ "src/sema/server/static/assets/**", "src/sema/server/static/__spa-fallback.html", "src/sema/server/static/llms.txt", ] [tool.hatch.build.targets.wheel] packages = ["src/sema"] [tool.hatch.build.targets.wheel.force-include] # data/experimental.db is a deprecated repository-only snapshot and is # intentionally excluded from all distributions. "data/vocabulary" = "sema/data/vocabulary" "data/taxonomy.db" = "sema/data/taxonomy.db" "data/graph.json" = "sema/data/graph.json" "data/presets" = "sema/data/presets" ".claude-plugin" = "sema/.claude-plugin" "skills" = "sema/skills" "docs/specification/canonicalization-v2-test-vectors.json" = "sema/specification/canonicalization-v2-test-vectors.json" [tool.hatch.build.targets.sdist] include = [ "src/sema/", "data/vocabulary/", "data/taxonomy.db", "data/graph.json", "data/presets/", ".claude-plugin/", "skills/", "docs/specification/canonicalization-v2-test-vectors.json", "scripts/test_hash_verification.py", "/README.md", "/LICENSE", "/LICENSE-CONTENT", "/THIRD_PARTY_NOTICES.md", ] [tool.ruff] exclude = [ ".bzr", ".direnv", ".eggs", ".git", ".git-rewrite", ".hg", ".mypy_cache", ".nox", ".pants.d", ".pytype", ".ruff_cache", ".svn", ".tox", ".venv", "__pypackages__", "_build", "buck-out", "build", "dist", "node_modules", "venv", ] line-length = 100 target-version = "py310" [tool.ruff.lint] select = ["E", "F", "I", "B", "UP"] ignore = ["E501", "E701", "E402"] fixable = ["ALL"] unfixable = [] [tool.ruff.lint.per-file-ignores] "__init__.py" = ["F401"] [tool.ruff.format] quote-style = "double" indent-style = "space" skip-magic-trailing-comma = false line-ending = "auto" [tool.pytest.ini_options] pythonpath = "src" testpaths = ["src/sema/audit/tests", "src/sema/cli/tests", "src/sema/core/tests", "src/sema/mcp/tests", "src/sema/server/tests", "hooks/tests"] addopts = "-v"