Files
graphify/pyproject.toml
T
SafiandClaude Sonnet 4.6 7467c1b6a4 feat/fix: land PRs #1118 #1110 #1159 #1107 #1103 (graph quality + new features)
#1118 — prune stale AST nodes on full re-extraction (#1116)
Stamps every AST-extracted node with _origin="ast" in extract(). On a
full rebuild _rebuild_code drops any AST-marked node absent from the
fresh output even when its source file survives, fixing stale symbols.
Backward-compat: marker-less nodes from pre-1118 graphs survive one
cycle then self-heal.

#1110 — stop reading images and PDFs as garbage in headless extract
Images route through per-backend vision payloads (base64/data-URI/bytes
for claude/openai/bedrock); non-vision backends get _strip_pixels for
graceful degradation. PDFs reuse pypdf. 5MB cap, 20-image chunk limit.

#1159 — Salesforce Apex extractor (.cls, .trigger)
Regex-based extractor: classes, interfaces, enums, methods, triggers,
SOQL/DML edges. No new dependency. Dispatched as .cls and .trigger.

#1107 — Azure OpenAI Service backend (--backend azure)
Uses AzureOpenAI SDK client (from existing openai package). Auto-detects
when AZURE_OPENAI_API_KEY + AZURE_OPENAI_ENDPOINT both set. Uses
max_completion_tokens (not deprecated max_tokens).

#1103 — live PostgreSQL introspection (--postgres DSN)
graphify extract --postgres "postgresql://..." introspects tables, views,
routines, and FK relations via information_schema (SERIALIZABLE READ ONLY).
Credentials sanitized on error. New graphify[postgres] extra (psycopg3).

Union-resolved llm.py conflict: Azure functions + bedrock images= param.
Fixed test_image_vision.py mock to accept timeout= kwarg (our #1112).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-07 01:20:38 +01:00

139 lines
4.7 KiB
TOML

[build-system]
requires = ["setuptools>=68"]
build-backend = "setuptools.build_meta"
[project]
name = "graphifyy"
version = "0.8.33"
description = "AI coding assistant skill (Claude Code, Codex, OpenCode, Kilo Code, Cursor, Gemini CLI, Aider, OpenClaw, Factory Droid, Trae, Hermes, Kiro, Pi, Devin CLI, Google Antigravity) - turn any folder of code, docs, papers, images, or videos into a queryable knowledge graph"
readme = "README.md"
license = { file = "LICENSE" }
keywords = ["claude", "claude-code", "codex", "opencode", "kilo", "cursor", "gemini", "aider", "kiro", "pi", "devin", "knowledge-graph", "rag", "graphrag", "obsidian", "community-detection", "tree-sitter", "leiden", "llm"]
requires-python = ">=3.10"
dependencies = [
"networkx>=3.4",
"datasketch>=1.6",
"rapidfuzz>=3.0",
"tree-sitter>=0.23.0",
"tree-sitter-python",
"tree-sitter-javascript",
"tree-sitter-typescript",
"tree-sitter-go",
"tree-sitter-rust",
"tree-sitter-java",
"tree-sitter-groovy",
"tree-sitter-c",
"tree-sitter-cpp",
"tree-sitter-ruby",
"tree-sitter-c-sharp",
"tree-sitter-kotlin",
"tree-sitter-scala",
"tree-sitter-php",
"tree-sitter-swift",
"tree-sitter-lua",
"tree-sitter-zig",
"tree-sitter-powershell",
"tree-sitter-elixir",
"tree-sitter-objc",
"tree-sitter-julia",
"tree-sitter-verilog",
"tree-sitter-fortran",
"tree-sitter-bash",
"tree-sitter-json",
]
[project.urls]
Homepage = "https://github.com/safishamsi/graphify"
Repository = "https://github.com/safishamsi/graphify"
Issues = "https://github.com/safishamsi/graphify/issues"
[project.optional-dependencies]
mcp = ["mcp"]
neo4j = ["neo4j"]
pdf = ["pypdf", "markdownify"]
watch = ["watchdog"]
svg = ["matplotlib"]
leiden = ["graspologic; python_version < '3.13'"]
office = ["python-docx", "openpyxl"]
google = ["openpyxl"]
postgres = ["psycopg[binary]"]
video = ["faster-whisper; python_version >= '3.11'", "yt-dlp"]
kimi = ["openai", "tiktoken"]
ollama = ["openai"]
bedrock = ["boto3"]
anthropic = ["anthropic"]
gemini = ["openai", "tiktoken"]
openai = ["openai", "tiktoken"]
chinese = ["jieba"]
sql = ["tree-sitter-sql"]
# tree-sitter-dm (BYOND DreamMaker) ships only a Windows wheel, so on Linux/Mac it
# must compile from source (needs a C toolchain + python3-dev). Keeping it optional
# avoids breaking the default `uv tool install graphifyy` for everyone (#1104).
dm = ["tree-sitter-dm"]
terraform = ["tree-sitter-hcl"]
all = ["mcp", "neo4j", "pypdf", "markdownify", "watchdog", "graspologic; python_version < '3.13'", "python-docx", "openpyxl", "faster-whisper; python_version >= '3.11'", "yt-dlp", "matplotlib", "openai", "tiktoken", "boto3", "anthropic", "tree-sitter-sql", "jieba", "tree-sitter-dm", "tree-sitter-hcl"]
[project.scripts]
graphify = "graphify.__main__:main"
[dependency-groups]
dev = [
"bandit>=1.9.4",
"build>=1.5.0",
"hypothesis>=6.152.7",
"nuitka>=4.1",
"patchelf>=0.17.2.4 ; sys_platform != 'win32'",
"pip-audit>=2.10.0",
"pre-commit>=4.6.0",
"pyright>=1.1.409",
"pytest>=9.0.3",
"pytest-cov>=7.1.0",
"ruff>=0.15.13",
"safety>=3.7.0",
"setuptools>=82.0.1",
"wheel>=0.47.0",
"tomli>=2.0 ; python_version < '3.11'",
"tree-sitter-hcl>=1.2.0",
]
[tool.uv]
# Install via: uv tool install graphifyy
# Run without installing: uvx graphifyy install
package = true
[tool.setuptools]
packages = ["graphify"]
include-package-data = false
[tool.setuptools.package-data]
# The skill bodies ship as graphify/skill*.md (the SKILL.md a host installs is
# copied from one of these). The progressive-disclosure references sidecar ships
# under graphify/skills/<host>/references/, and the always-on injection blocks
# under graphify/always_on/. There is no graphify/skills/<host>/SKILL.md in the
# repo, so no SKILL.md glob is needed here.
graphify = ["skill.md", "skill-codex.md", "skill-opencode.md", "skill-kilo.md", "command-kilo.md", "skill-aider.md", "skill-amp.md", "skill-copilot.md", "skill-claw.md", "skill-windows.md", "skill-droid.md", "skill-trae.md", "skill-kiro.md", "skill-vscode.md", "skill-pi.md", "skill-devin.md", "skills/*/references/*.md", "always_on/*.md"]
[tool.pytest.ini_options]
testpaths = ["tests"]
norecursedirs = [
"graphify-benchmark", "graphify_eval", "graphify_test",
"worked", "llm-stack-corpus", "llm-stack-demo", "product-site",
"scripts", "ebook", ".github", "dist", "build",
]
[tool.bandit]
skips = ["B404"]
[tool.ruff]
line-length = 100
target-version = "py310"
[tool.ruff.lint]
# Keep the committed baseline conservative until upstream adopts a broader lint policy.
select = ["E9", "F63", "F7", "F82"]
[tool.pyright]
include = ["graphify", "tests"]
pythonVersion = "3.10"
typeCheckingMode = "basic"