graphifyy 0.9.0__tar.gz → 0.9.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {graphifyy-0.9.0/graphifyy.egg-info → graphifyy-0.9.2}/PKG-INFO +4 -1
- {graphifyy-0.9.0 → graphifyy-0.9.2}/README.md +3 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/__main__.py +35 -3
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/always_on/agents-md.md +1 -1
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/cache.py +38 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/export.py +9 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/extract.py +441 -95
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/llm.py +26 -4
- graphifyy-0.9.2/graphify/resolver_registry.py +85 -0
- graphifyy-0.9.2/graphify/ruby_resolution.py +125 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/watch.py +31 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2/graphifyy.egg-info}/PKG-INFO +4 -1
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphifyy.egg-info/SOURCES.txt +4 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/pyproject.toml +1 -2
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_cache.py +90 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_export.py +17 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_extract.py +85 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_incremental.py +37 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_install_strings.py +14 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_java_type_resolution.py +13 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_js_import_resolution.py +291 -0
- graphifyy-0.9.2/tests/test_language_resolvers.py +74 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_languages.py +178 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_llm_backends.py +104 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_reflect.py +21 -0
- graphifyy-0.9.2/tests/test_ruby_resolution.py +195 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_skillgen.py +29 -1
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_swift_cross_file_calls.py +23 -13
- {graphifyy-0.9.0 → graphifyy-0.9.2}/LICENSE +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/__init__.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/_minhash.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/affected.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/always_on/antigravity-rules.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/always_on/claude-md.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/always_on/gemini-md.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/always_on/kiro-steering.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/always_on/vscode-instructions.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/analyze.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/benchmark.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/build.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/callflow_html.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/cargo_introspect.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/cluster.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/command-kilo.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/dedup.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/detect.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/diagnostics.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/extractors/__init__.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/extractors/base.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/extractors/blade.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/extractors/csharp.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/extractors/elixir.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/extractors/razor.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/extractors/zig.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/file_slice.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/global_graph.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/google_workspace.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/hooks.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/ids.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/ingest.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/manifest.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/manifest_ingest.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/mcp_ingest.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/multigraph_compat.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/paths.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/pg_introspect.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/prs.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/querylog.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/reflect.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/report.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/scip_ingest.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/security.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/semantic_cleanup.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/serve.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-agents.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-aider.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-amp.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-claw.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-codex.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-copilot.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-devin.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-droid.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-kilo.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-kiro.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-opencode.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-pi.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-trae.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-vscode.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-windows.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/agents/references/add-watch.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/agents/references/exports.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/agents/references/extraction-spec.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/agents/references/github-and-merge.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/agents/references/hooks.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/agents/references/query.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/agents/references/transcribe.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/agents/references/update.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/amp/references/add-watch.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/amp/references/exports.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/amp/references/extraction-spec.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/amp/references/github-and-merge.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/amp/references/hooks.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/amp/references/query.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/amp/references/transcribe.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/amp/references/update.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claude/references/add-watch.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claude/references/exports.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claude/references/extraction-spec.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claude/references/github-and-merge.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claude/references/hooks.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claude/references/query.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claude/references/transcribe.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claude/references/update.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claw/references/add-watch.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claw/references/exports.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claw/references/extraction-spec.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claw/references/github-and-merge.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claw/references/hooks.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claw/references/query.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claw/references/transcribe.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claw/references/update.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/codex/references/add-watch.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/codex/references/exports.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/codex/references/extraction-spec.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/codex/references/github-and-merge.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/codex/references/hooks.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/codex/references/query.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/codex/references/transcribe.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/codex/references/update.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/copilot/references/add-watch.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/copilot/references/exports.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/copilot/references/extraction-spec.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/copilot/references/github-and-merge.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/copilot/references/hooks.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/copilot/references/query.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/copilot/references/transcribe.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/copilot/references/update.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/droid/references/add-watch.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/droid/references/exports.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/droid/references/extraction-spec.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/droid/references/github-and-merge.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/droid/references/hooks.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/droid/references/query.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/droid/references/transcribe.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/droid/references/update.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kilo/references/add-watch.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kilo/references/exports.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kilo/references/extraction-spec.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kilo/references/github-and-merge.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kilo/references/hooks.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kilo/references/query.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kilo/references/transcribe.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kilo/references/update.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kiro/references/add-watch.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kiro/references/exports.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kiro/references/extraction-spec.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kiro/references/github-and-merge.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kiro/references/hooks.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kiro/references/query.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kiro/references/transcribe.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kiro/references/update.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/opencode/references/add-watch.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/opencode/references/exports.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/opencode/references/extraction-spec.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/opencode/references/github-and-merge.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/opencode/references/hooks.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/opencode/references/query.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/opencode/references/transcribe.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/opencode/references/update.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/pi/references/add-watch.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/pi/references/exports.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/pi/references/extraction-spec.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/pi/references/github-and-merge.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/pi/references/hooks.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/pi/references/query.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/pi/references/transcribe.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/pi/references/update.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/trae/references/add-watch.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/trae/references/exports.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/trae/references/extraction-spec.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/trae/references/github-and-merge.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/trae/references/hooks.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/trae/references/query.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/trae/references/transcribe.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/trae/references/update.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/vscode/references/add-watch.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/vscode/references/exports.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/vscode/references/extraction-spec.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/vscode/references/github-and-merge.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/vscode/references/hooks.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/vscode/references/query.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/vscode/references/transcribe.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/vscode/references/update.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/windows/references/add-watch.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/windows/references/exports.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/windows/references/extraction-spec.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/windows/references/github-and-merge.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/windows/references/hooks.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/windows/references/query.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/windows/references/transcribe.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/windows/references/update.md +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/symbol_resolution.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/transcribe.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/tree_html.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/validate.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/wiki.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphifyy.egg-info/dependency_links.txt +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphifyy.egg-info/entry_points.txt +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphifyy.egg-info/requires.txt +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/graphifyy.egg-info/top_level.txt +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/setup.cfg +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_affected_cli.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_agents_platform.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_analyze.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_anthropic_custom_endpoint.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_antigravity_install.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_astro_extraction.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_backend_extras.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_benchmark.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_build.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_callflow_html.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_cargo_introspect.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_charmap_encoding.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_chunking.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_claude_cli_backend.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_claude_md.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_cli_export.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_cluster.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_codebuddy.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_confidence.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_cpp_preprocess.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_csharp_type_resolution.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_dart.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_dedup.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_detect.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_devin.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_dotnet.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_explain_cli.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_extract_cli.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_extraction_spec_ids.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_falkordb_integration.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_file_node_id_spec.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_file_slice.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_global_graph.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_google_workspace.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_hooks.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_hypergraph.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_id_normalization_contract.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_image_vision.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_import_extension_resolution.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_ingest.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_install.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_install_references.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_install_roundtrip.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_install_upgrade.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_label_retry.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_labeling.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_llm_parser.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_manifest_ingest.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_mcp_ingest.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_minhash.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_multigraph_compat.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_multigraph_diagnostics.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_multilang.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_obsidian_dangling_member.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_obsidian_filename_cap.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_office_limits.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_ollama.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_openai_custom_endpoint.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_pascal.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_path_cli.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_pg_introspect.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_pipeline.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_provider_registry.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_prs.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_python_import_resolution.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_query_cli.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_querylog.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_rationale.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_read_hook.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_report.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_scip_ingest.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_security.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_semantic_cleanup.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_semantic_similarity.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_serve.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_serve_http.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_swift_import_resolution.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_symbol_resolution.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_terraform.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_transcribe.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_ts_inheritance.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_validate.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_vue_extraction.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_watch.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_wheel_packaging.py +0 -0
- {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_wiki.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: graphifyy
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.2
|
|
4
4
|
Summary: AI coding assistant skill (Claude Code, CodeBuddy, 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
|
|
5
5
|
License: MIT License
|
|
6
6
|
|
|
@@ -145,6 +145,7 @@ Dynamic: license-file
|
|
|
145
145
|
|
|
146
146
|
<p align="center">
|
|
147
147
|
<a href="https://www.ycombinator.com/companies/graphify"><img src="https://img.shields.io/badge/Y%20Combinator-S26-F0652F?style=flat&logo=ycombinator&logoColor=white" alt="YC S26"/></a>
|
|
148
|
+
<a href="https://discord.gg/598Ad9zQZ"><img src="https://img.shields.io/badge/Discord-Join-5865F2?style=flat&logo=discord&logoColor=white" alt="Discord"/></a>
|
|
148
149
|
<a href="https://safishamsi.gumroad.com/l/qetvlo"><img src="https://img.shields.io/badge/Book-The%20Memory%20Layer-2ea44f?style=flat&logo=gitbook&logoColor=white" alt="The Memory Layer"/></a>
|
|
149
150
|
<a href="https://github.com/safishamsi/graphify/actions/workflows/ci.yml"><img src="https://github.com/safishamsi/graphify/actions/workflows/ci.yml/badge.svg?branch=v8" alt="CI"/></a>
|
|
150
151
|
<a href="https://pypi.org/project/graphifyy/"><img src="https://img.shields.io/pypi/v/graphifyy" alt="PyPI"/></a>
|
|
@@ -562,6 +563,7 @@ These are only needed for **headless / CI extraction** (`graphify extract`). Whe
|
|
|
562
563
|
| `GRAPHIFY_MAX_WORKERS` | AST parallelism thread count | optional — also `--max-workers` flag |
|
|
563
564
|
| `GRAPHIFY_MAX_OUTPUT_TOKENS` | Raise output cap for dense corpora | optional — e.g. `32768` for large files |
|
|
564
565
|
| `GRAPHIFY_API_TIMEOUT` | Per-call timeout in seconds for HTTP, claude-cli, and Anthropic SDK backends (default: 600) | optional — also `--api-timeout` flag |
|
|
566
|
+
| `GRAPHIFY_MAX_RETRIES` | How many times to retry a rate-limited (429) request before giving up (default: 6; honors `Retry-After`) | optional — raise for strict per-org limits (e.g. kimi); `0` disables |
|
|
565
567
|
| `GRAPHIFY_FORCE` | Force graph rebuild even with fewer nodes | optional — also `--force` flag |
|
|
566
568
|
| `GRAPHIFY_GOOGLE_WORKSPACE` | Auto-enable Google Workspace export | optional — set to `1` |
|
|
567
569
|
| `GRAPHIFY_TRIAGE_BACKEND` | Backend for `graphify prs --triage` | optional — auto-detected from available keys |
|
|
@@ -755,6 +757,7 @@ graphify extract ./docs --api-timeout 900 # longer HTTP timeout for slow lo
|
|
|
755
757
|
graphify extract ./docs --google-workspace # export .gdoc/.gsheet/.gslides via gws before extraction
|
|
756
758
|
graphify extract ./docs --mode deep # richer semantic extraction via extended system prompt
|
|
757
759
|
graphify extract ./docs --no-cluster # raw extraction only, skip clustering
|
|
760
|
+
graphify extract ./docs --timing # print per-stage wall-clock timings to stderr (also works on cluster-only)
|
|
758
761
|
graphify extract ./docs --force # overwrite graph.json even if new graph has fewer nodes (use after refactors or to clear ghost duplicates)
|
|
759
762
|
graphify extract ./docs --dedup-llm # LLM tiebreaker for ambiguous entity pairs (uses same API key)
|
|
760
763
|
graphify extract ./docs --global --as myrepo # extract and register into the cross-project global graph
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
10
|
<a href="https://www.ycombinator.com/companies/graphify"><img src="https://img.shields.io/badge/Y%20Combinator-S26-F0652F?style=flat&logo=ycombinator&logoColor=white" alt="YC S26"/></a>
|
|
11
|
+
<a href="https://discord.gg/598Ad9zQZ"><img src="https://img.shields.io/badge/Discord-Join-5865F2?style=flat&logo=discord&logoColor=white" alt="Discord"/></a>
|
|
11
12
|
<a href="https://safishamsi.gumroad.com/l/qetvlo"><img src="https://img.shields.io/badge/Book-The%20Memory%20Layer-2ea44f?style=flat&logo=gitbook&logoColor=white" alt="The Memory Layer"/></a>
|
|
12
13
|
<a href="https://github.com/safishamsi/graphify/actions/workflows/ci.yml"><img src="https://github.com/safishamsi/graphify/actions/workflows/ci.yml/badge.svg?branch=v8" alt="CI"/></a>
|
|
13
14
|
<a href="https://pypi.org/project/graphifyy/"><img src="https://img.shields.io/pypi/v/graphifyy" alt="PyPI"/></a>
|
|
@@ -425,6 +426,7 @@ These are only needed for **headless / CI extraction** (`graphify extract`). Whe
|
|
|
425
426
|
| `GRAPHIFY_MAX_WORKERS` | AST parallelism thread count | optional — also `--max-workers` flag |
|
|
426
427
|
| `GRAPHIFY_MAX_OUTPUT_TOKENS` | Raise output cap for dense corpora | optional — e.g. `32768` for large files |
|
|
427
428
|
| `GRAPHIFY_API_TIMEOUT` | Per-call timeout in seconds for HTTP, claude-cli, and Anthropic SDK backends (default: 600) | optional — also `--api-timeout` flag |
|
|
429
|
+
| `GRAPHIFY_MAX_RETRIES` | How many times to retry a rate-limited (429) request before giving up (default: 6; honors `Retry-After`) | optional — raise for strict per-org limits (e.g. kimi); `0` disables |
|
|
428
430
|
| `GRAPHIFY_FORCE` | Force graph rebuild even with fewer nodes | optional — also `--force` flag |
|
|
429
431
|
| `GRAPHIFY_GOOGLE_WORKSPACE` | Auto-enable Google Workspace export | optional — set to `1` |
|
|
430
432
|
| `GRAPHIFY_TRIAGE_BACKEND` | Backend for `graphify prs --triage` | optional — auto-detected from available keys |
|
|
@@ -618,6 +620,7 @@ graphify extract ./docs --api-timeout 900 # longer HTTP timeout for slow lo
|
|
|
618
620
|
graphify extract ./docs --google-workspace # export .gdoc/.gsheet/.gslides via gws before extraction
|
|
619
621
|
graphify extract ./docs --mode deep # richer semantic extraction via extended system prompt
|
|
620
622
|
graphify extract ./docs --no-cluster # raw extraction only, skip clustering
|
|
623
|
+
graphify extract ./docs --timing # print per-stage wall-clock timings to stderr (also works on cluster-only)
|
|
621
624
|
graphify extract ./docs --force # overwrite graph.json even if new graph has fewer nodes (use after refactors or to clear ghost duplicates)
|
|
622
625
|
graphify extract ./docs --dedup-llm # LLM tiebreaker for ambiguous entity pairs (uses same API key)
|
|
623
626
|
graphify extract ./docs --global --as myrepo # extract and register into the cross-project global graph
|
|
@@ -462,8 +462,8 @@ def _skill_registration(skill_path: str = "~/.claude/skills/graphify/SKILL.md")
|
|
|
462
462
|
"\n# graphify\n"
|
|
463
463
|
f"- **graphify** (`{skill_path}`) "
|
|
464
464
|
"- any input to knowledge graph. Trigger: `/graphify`\n"
|
|
465
|
-
"When the user types `/graphify`,
|
|
466
|
-
"
|
|
465
|
+
"When the user types `/graphify`, use the installed graphify skill "
|
|
466
|
+
"or instructions before doing anything else.\n"
|
|
467
467
|
)
|
|
468
468
|
|
|
469
469
|
|
|
@@ -2970,13 +2970,18 @@ def main() -> None:
|
|
|
2970
2970
|
|
|
2971
2971
|
p = _ap.ArgumentParser(prog="graphify save-result")
|
|
2972
2972
|
p.add_argument("--question", required=True)
|
|
2973
|
-
p.add_argument("--answer",
|
|
2973
|
+
p.add_argument("--answer", default=None)
|
|
2974
|
+
p.add_argument("--answer-file", dest="answer_file", default=None)
|
|
2974
2975
|
p.add_argument("--type", dest="query_type", default="query")
|
|
2975
2976
|
p.add_argument("--nodes", nargs="*", default=[])
|
|
2976
2977
|
p.add_argument("--outcome", choices=("useful", "dead_end", "corrected"), default=None)
|
|
2977
2978
|
p.add_argument("--correction", default=None)
|
|
2978
2979
|
p.add_argument("--memory-dir", default=str(Path(_GRAPHIFY_OUT) / "memory"))
|
|
2979
2980
|
opts = p.parse_args(sys.argv[2:])
|
|
2981
|
+
if opts.answer_file:
|
|
2982
|
+
opts.answer = Path(opts.answer_file).read_text(encoding="utf-8").strip()
|
|
2983
|
+
elif not opts.answer:
|
|
2984
|
+
p.error("--answer or --answer-file is required")
|
|
2980
2985
|
from graphify.ingest import save_query_result as _sqr
|
|
2981
2986
|
|
|
2982
2987
|
out = _sqr(
|
|
@@ -4546,6 +4551,7 @@ def main() -> None:
|
|
|
4546
4551
|
# Semantic extraction on docs/papers/images. Check cache first.
|
|
4547
4552
|
from graphify.cache import (
|
|
4548
4553
|
check_semantic_cache as _check_semantic_cache,
|
|
4554
|
+
prune_semantic_cache as _prune_semantic_cache,
|
|
4549
4555
|
save_semantic_cache as _save_semantic_cache,
|
|
4550
4556
|
)
|
|
4551
4557
|
sem_result: dict = {
|
|
@@ -4636,6 +4642,32 @@ def main() -> None:
|
|
|
4636
4642
|
sem_result["hyperedges"].extend(fresh.get("hyperedges", []))
|
|
4637
4643
|
sem_result["input_tokens"] += fresh.get("input_tokens", 0)
|
|
4638
4644
|
sem_result["output_tokens"] += fresh.get("output_tokens", 0)
|
|
4645
|
+
|
|
4646
|
+
# Prune orphaned semantic cache entries. The semantic cache is
|
|
4647
|
+
# content-hash-keyed and unversioned, so it is never swept by the AST
|
|
4648
|
+
# version-cleanup: every content change or file deletion leaves a
|
|
4649
|
+
# permanent orphan that accumulates unbounded (#1527). Sweep it against
|
|
4650
|
+
# the FULL live document set (``files_by_type`` — present in both the
|
|
4651
|
+
# incremental and full branches), NOT the incremental ``semantic_files``
|
|
4652
|
+
# changed-subset, which would delete every unchanged doc's valid entry.
|
|
4653
|
+
# Best-effort: a prune failure must never break extraction.
|
|
4654
|
+
try:
|
|
4655
|
+
from graphify.cache import file_hash as _file_hash
|
|
4656
|
+
_live_hashes: set[str] = set()
|
|
4657
|
+
for _kind in ("document", "paper", "image"):
|
|
4658
|
+
for _fp in files_by_type.get(_kind, []):
|
|
4659
|
+
_abs = Path(_fp)
|
|
4660
|
+
if not _abs.is_absolute():
|
|
4661
|
+
_abs = Path(out_root) / _abs
|
|
4662
|
+
if not _abs.is_file():
|
|
4663
|
+
continue # deleted/missing — leave out so its entry is pruned
|
|
4664
|
+
try:
|
|
4665
|
+
_live_hashes.add(_file_hash(_abs, out_root))
|
|
4666
|
+
except OSError:
|
|
4667
|
+
pass
|
|
4668
|
+
_prune_semantic_cache(out_root, _live_hashes)
|
|
4669
|
+
except Exception as exc:
|
|
4670
|
+
print(f"[graphify extract] warning: could not prune semantic cache: {exc}", file=sys.stderr)
|
|
4639
4671
|
stages.mark("semantic extract")
|
|
4640
4672
|
|
|
4641
4673
|
pg_result: dict = {"nodes": [], "edges": []}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
This project has a knowledge graph at graphify-out/ with god nodes, community structure, and cross-file relationships.
|
|
4
4
|
|
|
5
|
-
When the user types `/graphify`,
|
|
5
|
+
When the user types `/graphify`, use the installed graphify skill or instructions before doing anything else.
|
|
6
6
|
|
|
7
7
|
Rules:
|
|
8
8
|
- For codebase questions, first run `graphify query "<question>"` when graphify-out/graph.json exists. Use `graphify path "<A>" "<B>"` for relationships and `graphify explain "<concept>"` for focused concepts. These return a scoped subgraph, usually much smaller than GRAPH_REPORT.md or raw grep output.
|
|
@@ -407,6 +407,44 @@ def clear_cache(root: Path = Path(".")) -> None:
|
|
|
407
407
|
f.unlink()
|
|
408
408
|
|
|
409
409
|
|
|
410
|
+
def prune_semantic_cache(root: Path, live_hashes: set[str]) -> int:
|
|
411
|
+
"""Remove orphaned semantic cache entries, returning the count pruned.
|
|
412
|
+
|
|
413
|
+
The semantic cache is content-hash-keyed (``{file_hash}.json`` under
|
|
414
|
+
``cache/semantic/``) and deliberately UNVERSIONED — entries are produced by
|
|
415
|
+
the LLM from file contents, so invalidating them on every release would
|
|
416
|
+
re-bill extraction. Because it is unversioned it is also never swept by the
|
|
417
|
+
AST version-cleanup, so every content change or file deletion leaves a
|
|
418
|
+
permanent orphan entry that accumulates unbounded.
|
|
419
|
+
|
|
420
|
+
This sweeps ``cache/semantic/*.json`` and deletes any entry whose stem (the
|
|
421
|
+
content hash) is not in ``live_hashes`` — the hashes of the current live
|
|
422
|
+
document set. ``*.tmp`` atomic-write temporaries are skipped, and only this
|
|
423
|
+
directory is touched (never ``cache/ast/**`` or anything else). The
|
|
424
|
+
unversioned design is preserved: we prune by liveness, not by version.
|
|
425
|
+
|
|
426
|
+
Best-effort, mirroring :func:`_cleanup_stale_ast_entries`: each unlink is
|
|
427
|
+
wrapped in ``try/except OSError`` and a failure is ignored. The worst-case
|
|
428
|
+
failure mode is benign — a surviving orphan costs only one re-extraction of
|
|
429
|
+
one doc on a future run, never incorrect output.
|
|
430
|
+
"""
|
|
431
|
+
_out = Path(_GRAPHIFY_OUT)
|
|
432
|
+
base = _out if _out.is_absolute() else Path(root).resolve() / _out
|
|
433
|
+
semantic_dir = base / "cache" / "semantic"
|
|
434
|
+
if not semantic_dir.is_dir():
|
|
435
|
+
return 0
|
|
436
|
+
pruned = 0
|
|
437
|
+
for entry in semantic_dir.glob("*.json"):
|
|
438
|
+
if entry.stem in live_hashes:
|
|
439
|
+
continue
|
|
440
|
+
try:
|
|
441
|
+
entry.unlink()
|
|
442
|
+
pruned += 1
|
|
443
|
+
except OSError:
|
|
444
|
+
pass
|
|
445
|
+
return pruned
|
|
446
|
+
|
|
447
|
+
|
|
410
448
|
def check_semantic_cache(
|
|
411
449
|
files: list[str],
|
|
412
450
|
root: Path = Path("."),
|
|
@@ -1535,6 +1535,15 @@ def to_graphml(
|
|
|
1535
1535
|
for _, _, attrs in H.edges(data=True):
|
|
1536
1536
|
for k in [k for k in attrs if k.startswith("_")]:
|
|
1537
1537
|
del attrs[k]
|
|
1538
|
+
# nx.write_graphml raises ValueError on None attribute values; replace with "".
|
|
1539
|
+
for node_id in H.nodes():
|
|
1540
|
+
for key, val in list(H.nodes[node_id].items()):
|
|
1541
|
+
if val is None:
|
|
1542
|
+
H.nodes[node_id][key] = ""
|
|
1543
|
+
for u, v in H.edges():
|
|
1544
|
+
for key, val in list(H.edges[u, v].items()):
|
|
1545
|
+
if val is None:
|
|
1546
|
+
H.edges[u, v][key] = ""
|
|
1538
1547
|
nx.write_graphml(H, output_path)
|
|
1539
1548
|
|
|
1540
1549
|
|