graphifyy 0.9.97__tar.gz → 0.9.99__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.97/graphifyy.egg-info → graphifyy-0.9.99}/PKG-INFO +2 -2
- {graphifyy-0.9.97 → graphifyy-0.9.99}/README.md +1 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/__main__.py +13 -3
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/analyze.py +14 -5
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/build.py +125 -4
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/cache.py +1 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/cli.py +23 -8
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/dedup.py +53 -6
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/export.py +1 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extract.py +69 -7
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/commonlisp.py +43 -2
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/csharp.py +87 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/engine.py +104 -26
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/go.py +146 -26
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/julia.py +11 -6
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/pascal_forms.py +2 -2
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/powershell.py +19 -3
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/resolution.py +53 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/rust.py +7 -6
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/solidity.py +19 -9
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/verilog.py +8 -3
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/file_slice.py +2 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/ids.py +68 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/install.py +54 -26
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/serve.py +325 -9
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-agents.md +1 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-aider.md +1 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-amp.md +1 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-claw.md +1 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-codex.md +1 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-copilot.md +1 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-devin.md +1 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-droid.md +1 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-kilo.md +1 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-kiro.md +1 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-opencode.md +1 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-pi.md +1 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-trae.md +1 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-vscode.md +1 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-windows.md +1 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill.md +1 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/watch.py +44 -11
- {graphifyy-0.9.97 → graphifyy-0.9.99/graphifyy.egg-info}/PKG-INFO +2 -2
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphifyy.egg-info/SOURCES.txt +10 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/pyproject.toml +1 -1
- graphifyy-0.9.99/tests/test_confidence_score_output.py +117 -0
- graphifyy-0.9.99/tests/test_csharp_method_owner_labels.py +288 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_dedup.py +180 -0
- graphifyy-0.9.99/tests/test_edge_also_seen.py +173 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_export.py +9 -1
- graphifyy-0.9.99/tests/test_file_id_collision_4854.py +386 -0
- graphifyy-0.9.99/tests/test_go_method_value_indirect_calls.py +97 -0
- graphifyy-0.9.99/tests/test_go_package_var_calls.py +63 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_go_receiver_member_calls.py +82 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_import_extension_resolution.py +58 -0
- graphifyy-0.9.99/tests/test_indirect_dispatch_module_attr.py +174 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_install.py +48 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_install_references.py +1 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_languages.py +119 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_opencode_plugin_refresh.py +14 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pascal.py +72 -0
- graphifyy-0.9.99/tests/test_path_confidence.py +163 -0
- graphifyy-0.9.99/tests/test_path_type_member.py +317 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pdf_slicing.py +42 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_serve.py +47 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_serve_http.py +29 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_skill_auto_refresh.py +8 -9
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_solidity_extractor.py +30 -0
- graphifyy-0.9.99/tests/test_undirected_two_file_import_cycle.py +163 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_uninstall_scope.py +24 -1
- {graphifyy-0.9.97 → graphifyy-0.9.99}/LICENSE +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/LICENSE-MIT +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/NOTICE +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/__init__.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/_minhash.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/affected.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/always_on/agents-md.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/always_on/antigravity-rules.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/always_on/claude-md.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/always_on/gemini-md.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/always_on/kiro-steering.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/always_on/vscode-instructions.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/benchmark.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/callflow_html.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/cargo_introspect.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/cluster.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/command-kilo.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/cross_repo_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/cross_repo_types.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/csharp_dispatch.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/detect.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/diagnostics.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/exporters/__init__.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/exporters/base.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/exporters/graphdb.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/exporters/html.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/__init__.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/apex.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/base.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/bash.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/blade.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/cobol.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/dart.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/dm.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/elixir.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/erlang.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/fortran.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/json_config.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/markdown.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/models.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/objc.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/ocaml.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/pascal.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/r.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/razor.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/robot.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/sln.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/sql.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/terraform.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/vbnet.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/yaml_config.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/zig.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/global_graph.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/google_workspace.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/hooks.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/ingest.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/interface_dispatch.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/llm.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/manifest.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/manifest_ingest.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/markdown_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/mcp_ingest.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/multigraph_compat.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/pascal_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/paths.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/pg_introspect.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/pi/index.ts +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/pi/package.json +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/prs.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/querylog.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/rcfile.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/reflect.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/report.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/resolver_registry.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/ruby_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/scip_ingest.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/security.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/semantic_cleanup.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/agents/references/add-watch.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/agents/references/exports.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/agents/references/extraction-spec.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/agents/references/github-and-merge.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/agents/references/hooks.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/agents/references/query.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/agents/references/transcribe.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/agents/references/update.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/amp/references/add-watch.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/amp/references/exports.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/amp/references/extraction-spec.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/amp/references/github-and-merge.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/amp/references/hooks.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/amp/references/query.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/amp/references/transcribe.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/amp/references/update.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claude/references/add-watch.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claude/references/exports.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claude/references/extraction-spec.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claude/references/github-and-merge.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claude/references/hooks.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claude/references/query.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claude/references/transcribe.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claude/references/update.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claw/references/add-watch.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claw/references/exports.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claw/references/extraction-spec.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claw/references/github-and-merge.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claw/references/hooks.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claw/references/query.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claw/references/transcribe.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claw/references/update.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/codex/references/add-watch.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/codex/references/exports.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/codex/references/extraction-spec.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/codex/references/github-and-merge.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/codex/references/hooks.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/codex/references/query.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/codex/references/transcribe.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/codex/references/update.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/copilot/references/add-watch.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/copilot/references/exports.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/copilot/references/extraction-spec.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/copilot/references/github-and-merge.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/copilot/references/hooks.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/copilot/references/query.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/copilot/references/transcribe.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/copilot/references/update.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/droid/references/add-watch.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/droid/references/exports.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/droid/references/extraction-spec.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/droid/references/github-and-merge.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/droid/references/hooks.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/droid/references/query.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/droid/references/transcribe.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/droid/references/update.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kilo/references/add-watch.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kilo/references/exports.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kilo/references/extraction-spec.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kilo/references/github-and-merge.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kilo/references/hooks.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kilo/references/query.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kilo/references/transcribe.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kilo/references/update.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kiro/references/add-watch.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kiro/references/exports.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kiro/references/extraction-spec.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kiro/references/github-and-merge.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kiro/references/hooks.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kiro/references/query.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kiro/references/transcribe.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kiro/references/update.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/opencode/references/add-watch.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/opencode/references/exports.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/opencode/references/extraction-spec.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/opencode/references/github-and-merge.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/opencode/references/hooks.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/opencode/references/query.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/opencode/references/transcribe.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/opencode/references/update.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/pi/references/add-watch.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/pi/references/exports.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/pi/references/extraction-spec.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/pi/references/github-and-merge.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/pi/references/hooks.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/pi/references/query.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/pi/references/transcribe.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/pi/references/update.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/trae/references/add-watch.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/trae/references/exports.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/trae/references/extraction-spec.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/trae/references/github-and-merge.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/trae/references/hooks.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/trae/references/query.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/trae/references/transcribe.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/trae/references/update.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/vscode/references/add-watch.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/vscode/references/exports.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/vscode/references/extraction-spec.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/vscode/references/github-and-merge.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/vscode/references/hooks.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/vscode/references/query.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/vscode/references/transcribe.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/vscode/references/update.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/windows/references/add-watch.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/windows/references/exports.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/windows/references/extraction-spec.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/windows/references/github-and-merge.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/windows/references/hooks.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/windows/references/query.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/windows/references/transcribe.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/windows/references/update.md +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/swift_dispatch.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/symbol_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/transcribe.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/tree_html.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/validate.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/wiki.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphifyy.egg-info/dependency_links.txt +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphifyy.egg-info/entry_points.txt +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphifyy.egg-info/requires.txt +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/graphifyy.egg-info/top_level.txt +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/setup.cfg +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_affected_cli.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_affected_defines.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_affected_member_seed.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_affected_overrides.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_affected_path_file_node.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_agents_platform.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_alias_folding.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_analyze.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_anthropic_custom_endpoint.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_antigravity_install.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_apm_fallback_version.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_architecture_doc.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_astro_extraction.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_astro_import_ids.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_atomic_canvas_export.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_atomic_version_stamp.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_atomic_writes.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_backend_env_isolation.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_backend_extras.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_backend_opt_in.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_benchmark.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_benchmark_raw_graph.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_benchmark_real_query.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_binary_media_words.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_blade_extractor.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_build.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_build_located_semantic_identity.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_build_merge_dedup_scope.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_build_merge_hyperedges_and_prune.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_build_merge_shrink_guard.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_builtin_global_type_refs.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_c_include_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cache.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cache_long_paths.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cache_stale_import_target.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_callflow_html.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cargo_introspect.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cargo_missing_manifest.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_carried_hyperedge_remap.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_case_sensitive_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_charmap_encoding.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_chunking.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cjs_module_extension.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_claude_cli_backend.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_claude_md.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cli_broken_pipe.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cli_export.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cli_help.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cloud_cta.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cluster.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cluster_ambiguous_scale.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cluster_exclude_hubs.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cobol_extractor.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_code_only_update_all_hosts.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_codebuddy.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_community_hub_labels.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_community_labels_skill.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_compact_graph_json.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_confidence.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_corrupt_graph_json.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cpp_method_declarations.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cpp_nested_and_cli.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cpp_objc_cross_file_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cpp_preprocess.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cpp_template_type_params.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cpp_type_alias.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cross_extension_reexport_self_cycle.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cross_language_call_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cross_repo_external_call_guards.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cross_repo_member_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cross_repo_shared_types.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_call_site_generic_args.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_delegate_declarations.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_enum_members.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_field_generic_args.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_foreach_loop_variable.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_generic_callsites.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_interface_dispatch.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_member_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_member_chain_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_member_nodes.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_object_creation.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_overloads.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_partial_classes.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_tuple_type_refs.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_type_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_underscore_collisions.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_var_call_return_type.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_verbatim_interpolation.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_dart.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_dedup_remaps_hyperedges.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_dedup_shrink_refuses_force_write.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_dedup_survivor_richness.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_definition_file_portability.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_detect.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_detect_jinja.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_devin.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_docx_to_markdown.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_dotnet.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_duplicate_annotation_edges.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ejs_extractor.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_elixir_defdelegate.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_elixir_import_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_elixir_keyword_def_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_elixir_qualified_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_elixir_unqualified_call_scope.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_erlang_extractor.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_evidence_binding.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_explain_cli.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_explain_same_file_tie.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_export_control_characters.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_export_direction.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_export_idempotent_writes.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_export_path_length.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ext_tagged_id_clash.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_external_stub_endpoints.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_extract.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_extract_cache_location.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_extract_cli.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_extract_code_only_cli.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_extract_cost_ledger.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_extract_path_memo.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_extract_php_closures.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_extraction_spec_ids.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_extractor_scan_root_context.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_extractors_registry.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_falkordb_integration.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_file_label_disambiguation.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_file_node_id_spec.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_file_slice.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_file_truncation_warning.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_forwarding_review_findings.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_frontmatter_and_ssrf_hardening.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_gemini_hook.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_git_head_stdin.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_global_add_tag_inference.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_global_graph.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_go_builtin_call_targets.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_go_generic_receiver_methods.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_go_generic_type_params.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_go_import_repoint.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_go_interface_methods.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_go_package_type_fold.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_go_qualified_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_go_type_alias.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_god_nodes_cli.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_god_nodes_exclude_hubs.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_google_workspace.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_grammar_cache_key.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_graph_invariance.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_graphdb_push_indexes.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hollow_chunks_arm_shrink_guard.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_home_sandbox.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hook_chain_survives_skip.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hook_guard.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hook_guard_token_match.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hook_nudge_wording.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hook_out_of_project_paths.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hook_strict.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hooks.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hooks_rewrite.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_html_script_breakout.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_html_theme.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hyperedge_member_shapes.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hyperedge_roundtrip.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hypergraph.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_id_normalization_contract.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ignore_file_encoding.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_image_vision.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_import_self_loops.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_imported_export_forwarding.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_incomplete_build_guard.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_incremental.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_incremental_mtime_collision.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_incremental_unscanned_placeholders.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_call_arrow_single_param_shadow.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_call_block_scoped_shadow.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_call_catch_binding_shadow.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_call_external_import_shadow.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_call_file_scope_callback_shadow.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_call_for_of_binding_shadow.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_call_function_expression_shadow.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_call_nested_closure_shadow.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_dispatch.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_dispatch_assign_return.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_dispatch_getattr.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_inferred_confidence_rubric.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ingest.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ingest_url_type.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_inherited_field_receivers.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_injection_sentinel_coverage.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_install_hook_identity.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_install_line_endings.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_install_roundtrip.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_install_strings.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_install_upgrade.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_install_version_stamp.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_install_version_warning.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_issue_3405_python_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_issue_3472_source_file_collision.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_java_anonymous_class.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_java_enum_members.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_java_member_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_java_type_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_callback_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_destructured_export.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_dynamic_import_affected.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_dynamic_imports.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_exported_fn_call_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_exported_scalar_bindings.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_import_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_member_call_bare_name_fallback.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_member_collisions.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_module_level_anonymous_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_nested_function_scope.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_require_binding_shadow.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_require_external_package_call.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_this_member_expressions.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_walk_order.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_jsconfig_baseurl.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_json_schema_config.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_jsx_component_usage_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_kotlin_generic_type_params.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_kotlin_grammar.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_kotlin_object_literal.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_kotlin_typealias_declarations.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_label_retry.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_labeling.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_language_override_imports.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_language_override_lifecycle.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_language_overrides.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_language_resolvers.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_llm_backends.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_llm_null_token_counts.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_llm_parser.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_llm_parser_reasoning.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_long_path_hashing.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_lookup_exit_codes.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_loose_sibling_import_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_lost_saved_semantic_nodes.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_lua_import.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_lua_method_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_manifest_ingest.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_manifest_tomli_required.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_markdown_code_spans.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_mcp_graph_view_cache.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_mcp_ingest.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_merge_chunks_validation.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_merge_graphs_cli.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_merge_sweeps_reextract_orphans.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_minhash.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_msbuild_dir_evidence.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_multigraph_compat.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_multigraph_diagnostics.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_multilang.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_no_cluster_run_only_keys.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_no_cluster_undeclared_endpoints.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_no_dedup_flag.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_node_id_canonical.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_non_regular_files.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_non_string_node_ids.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_objc_callable_markers.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_objc_category_interfaces.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_objc_category_portable_ids.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_objc_enum_declarations.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_objc_field_table_remap.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_objc_member_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_objc_property_ivar_receivers.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_obsidian_dangling_member.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_obsidian_filename_cap.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_obsidian_unicode_tags.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_obsidian_vault_migration.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ocaml.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_office_incremental.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_office_limits.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ollama.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ollama_ctx_sizing.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ollama_live.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ollama_native_chat.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ollama_retry_cap.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_openai_custom_endpoint.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_out_dir_evidence.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_oversized_document_slicing.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_owned_type_sources.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_package_json_subpath_imports.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_parked_call_site_file.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_partial_cache.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_partial_extraction_warning.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pascal_call_scoping.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pascal_record_methods.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pascal_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_path_cli.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_paths.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pdf_extra_warning.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pdf_token_estimate.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pg_introspect.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_phantom_cross_package_call.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_phantom_external_import.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_php_language_construct_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_php_object_creation.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_php_receiver_member_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_php_static_call_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_php_type_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_php_unparsed_casts.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pi_guard_install.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pin_hash_seed.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pipeline.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pnpm_workspace_globs.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pr10_csharp_overrides.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pr10_resolution_overrides.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pr10_watch_overrides.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_provider_registry.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_prs.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_prune_sweeps_orphans.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_decorators.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_forward_ref_file_id.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_import_never_resolves_to_itself.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_import_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_inherited_method_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_injected_factory_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_member_call_language_gate.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_member_collisions.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_module_call_exact_name.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_nested_class_identity.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_parse_memoization.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_property_reads.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_pytest_fixture_receivers.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_reexport_type_binding.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_self_type_ref.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_type_alias.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_typed_receiver_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_underscore_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_qualified_annotation_stub_bind.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_query_cli.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_query_fallback_edges.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_query_induced_edges.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_query_mcp_direction.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_query_names_its_graph.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_query_seed_order.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_query_seeds.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_querylog.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_r_extractor.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_rationale.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_read_hook.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_reflect.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_relation_collapse_precedence.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_replace_or_append_section.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_report.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_report_gap_thresholds.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_resolve_memoization.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ruby_bare_self_send_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ruby_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_rust_anonymous_const.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_rust_builtin_type_hubs.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_rust_case_collisions.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_rust_crate_use_scope.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_rust_in_file_call_binding.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_rust_macro_rules.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_rust_self_member_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_rust_type_alias_union.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_rust_use_trees.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_scala_abstract_methods.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_scala_context_bounds.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_scala_generic_type_params.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_scala_given_instances.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_scala_self_type.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_scala_top_level_binding.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_scala_type_definition.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_scip_ingest.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_search_hook.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_security.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_semantic_cache_basename_recovery.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_semantic_cache_out_root.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_semantic_cleanup.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_semantic_fragment_sanitize.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_semantic_id_remap_root.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_semantic_origin_stamp.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_semantic_similarity.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_settings_merge.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_skill_code_only_incremental_update.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_skill_codex_semantic_merge.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_skill_no_backtick_substitution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_skill_part_a_explicit_root.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_skill_persisted_scan_options.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_skill_semantic_all_cached.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_skill_version_warning.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_skillgen.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_skillgen_input_path_injection.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_solidity_inherited_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_source_file_encoding.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_source_key_memoization.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_sourceless_call_targets.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_sql_cross_file_tables.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_sql_go_batches.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_sql_tsql_procedures.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_src_layout_import_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_stale_prune.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_stat_index_husk.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_stat_index_multi_root.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_stat_index_portability.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_suggest_questions_ambiguous.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_svelte_extraction.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_swift_builtin_noise.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_swift_computed_properties.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_swift_cross_file_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_swift_generic_type_params.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_swift_import_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_swift_macro_declarations.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_swift_protocol_dispatch.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_swift_protocol_requirements.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_swift_self_type_ref.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_symbol_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_terraform.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_terraform_modules.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_trailing_newline_not_a_syntax_error.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_transcribe.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_tree_html.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_truncation_full_answer.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_abstract_methods.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_decorator_chains.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_decorators.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_export_type_star.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_generators.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_import_require.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_import_type_arguments.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_inheritance.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_namespace.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_new_expression_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_parse_warning.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_receiver_member_calls.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_type_only_import_cycles.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_typescript_enum_members.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_typescript_module_extensions.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_uninstall_purge_safety.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_uninstall_symlink.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_unmapped_at_alias_resolution.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_unverified_semantic_shrink.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_update_no_change_gate.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_validate.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_vbnet_extractor.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_vue_extraction.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_walk_python_tree_iterative.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_watch.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_watch_identity_cache.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_watch_manifest_location.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_wheel_packaging.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_wiki.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_wiki_case_only_relabel.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_wiki_link_filename_parity.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_wiki_truncation_indicator.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_word_count_cache.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_yaml_extraction.py +0 -0
- {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_zero_node_no_cache.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.99
|
|
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-Expression: Apache-2.0
|
|
6
6
|
Project-URL: Homepage, https://graphify.com
|
|
@@ -260,7 +260,7 @@ Shortest path (3 hops):
|
|
|
260
260
|
FastAPI --uses--> DefaultPlaceholder <--references-- get_request_handler() --references--> ModelField
|
|
261
261
|
```
|
|
262
262
|
|
|
263
|
-
Every edge carries a **confidence tag** (`EXTRACTED` = explicit in the source, `INFERRED` = derived by resolution), so you can tell what was read directly from what was inferred. `graphify query "<question>"` returns a scoped subgraph for a plain-language question, and `graphify path A B` traces how any two things connect.
|
|
263
|
+
Every edge carries a **confidence tag** (`EXTRACTED` = explicit in the source, `INFERRED` = derived by resolution), so you can tell what was read directly from what was inferred. `graphify query "<question>"` returns a scoped subgraph for a plain-language question, and `graphify path A B` traces how any two things connect, ending with the path's overall confidence: that of its weakest hop.
|
|
264
264
|
|
|
265
265
|
---
|
|
266
266
|
|
|
@@ -104,7 +104,7 @@ Shortest path (3 hops):
|
|
|
104
104
|
FastAPI --uses--> DefaultPlaceholder <--references-- get_request_handler() --references--> ModelField
|
|
105
105
|
```
|
|
106
106
|
|
|
107
|
-
Every edge carries a **confidence tag** (`EXTRACTED` = explicit in the source, `INFERRED` = derived by resolution), so you can tell what was read directly from what was inferred. `graphify query "<question>"` returns a scoped subgraph for a plain-language question, and `graphify path A B` traces how any two things connect.
|
|
107
|
+
Every edge carries a **confidence tag** (`EXTRACTED` = explicit in the source, `INFERRED` = derived by resolution), so you can tell what was read directly from what was inferred. `graphify query "<question>"` returns a scoped subgraph for a plain-language question, and `graphify path A B` traces how any two things connect, ending with the path's overall confidence: that of its weakest hop.
|
|
108
108
|
|
|
109
109
|
---
|
|
110
110
|
|
|
@@ -122,6 +122,7 @@ from graphify.install import ( # noqa: E402,F401
|
|
|
122
122
|
_OPENCODE_PLUGIN_HEADER,
|
|
123
123
|
_drop_opencode_config_entry,
|
|
124
124
|
_opencode_config_names_plugin,
|
|
125
|
+
_opencode_dir,
|
|
125
126
|
_opencode_plugin_is_v1_only,
|
|
126
127
|
_PLATFORM_CONFIG,
|
|
127
128
|
_skill_lock,
|
|
@@ -429,12 +430,21 @@ def _refresh_v1_opencode_plugins() -> None:
|
|
|
429
430
|
if os.environ.get("GRAPHIFY_NO_AUTO_REFRESH", "").strip().lower() in ("1", "true", "yes"):
|
|
430
431
|
return
|
|
431
432
|
try:
|
|
432
|
-
|
|
433
|
+
# The cwd and home .opencode dirs are where installs before #3398 wrote,
|
|
434
|
+
# ~/.config/opencode is the global install's dir since.
|
|
435
|
+
directories = dict.fromkeys(
|
|
436
|
+
d.resolve()
|
|
437
|
+
for d in (
|
|
438
|
+
_opencode_dir(project=True, project_dir=Path.cwd()),
|
|
439
|
+
_opencode_dir(project=True, project_dir=Path.home()),
|
|
440
|
+
_opencode_dir(project=False),
|
|
441
|
+
)
|
|
442
|
+
)
|
|
433
443
|
except (OSError, RuntimeError):
|
|
434
444
|
return
|
|
435
445
|
loadable: "bool | None" = None # asked once, and only when an old plugin is found
|
|
436
446
|
for directory in directories:
|
|
437
|
-
plugin_file = directory / _OPENCODE_PLUGIN_PATH
|
|
447
|
+
plugin_file = directory / _OPENCODE_PLUGIN_PATH.relative_to(".opencode")
|
|
438
448
|
|
|
439
449
|
def pending() -> "bool | None":
|
|
440
450
|
"""True for an old plugin, False for a stale entry only, None for neither."""
|
|
@@ -486,7 +496,7 @@ def _refresh_v1_opencode_plugins() -> None:
|
|
|
486
496
|
elif dropped:
|
|
487
497
|
print(
|
|
488
498
|
f"graphify: removed the stale graphify entry from "
|
|
489
|
-
f"{directory / _OPENCODE_CONFIG_PATH}; set GRAPHIFY_NO_AUTO_REFRESH=1 to disable",
|
|
499
|
+
f"{directory / _OPENCODE_CONFIG_PATH.name}; set GRAPHIFY_NO_AUTO_REFRESH=1 to disable",
|
|
490
500
|
file=sys.stderr,
|
|
491
501
|
)
|
|
492
502
|
|
|
@@ -82,9 +82,13 @@ def _is_file_node(G: nx.Graph, node_id: str) -> bool:
|
|
|
82
82
|
from graphify.build import _is_file_node_label
|
|
83
83
|
if _is_file_node_label(label, source_file):
|
|
84
84
|
return True
|
|
85
|
-
# Method stub: AST extractor labels methods as '.method_name()'
|
|
85
|
+
# Method stub: AST extractor labels methods as '.method_name()'; C# methods
|
|
86
|
+
# carry their owner for display ('Owner.method_name()', #4883).
|
|
86
87
|
if label.startswith(".") and label.endswith("()"):
|
|
87
88
|
return True
|
|
89
|
+
from graphify.extractors.csharp import bare_csharp_method_label
|
|
90
|
+
if bare_csharp_method_label(label, source_file) is not None:
|
|
91
|
+
return True
|
|
88
92
|
# Module-level function stub: labeled 'function_name()' - only has a contains edge
|
|
89
93
|
# These are real functions but structurally isolated by definition; not a gap worth flagging
|
|
90
94
|
if label.endswith("()") and G.degree(node_id) <= 1:
|
|
@@ -757,12 +761,14 @@ def find_import_cycles(
|
|
|
757
761
|
|
|
758
762
|
# Deferred `import(...)` edges are real dependencies but do not form a
|
|
759
763
|
# hard file-level cycle, so they are excluded from cycle detection (#1241).
|
|
760
|
-
if data.get("deferred"):
|
|
761
|
-
continue
|
|
762
764
|
# Type-only imports/re-exports (`import type` / `export type ... from`)
|
|
763
765
|
# are erased at compile time - a cycle that closes through one cannot
|
|
764
766
|
# exist at runtime (#3123). The edge itself stays in the graph.
|
|
765
|
-
|
|
767
|
+
forward = not data.get("deferred") and not data.get("type_only")
|
|
768
|
+
# An undirected build keeps one edge per file pair, so the other file's
|
|
769
|
+
# runtime import back is only a stamp on this edge (#4839).
|
|
770
|
+
reverse = bool(data.get("reverse_import"))
|
|
771
|
+
if not forward and not reverse:
|
|
766
772
|
continue
|
|
767
773
|
|
|
768
774
|
src_file_attr = data.get("source_file", "")
|
|
@@ -787,7 +793,10 @@ def find_import_cycles(
|
|
|
787
793
|
if not tgt_file:
|
|
788
794
|
continue
|
|
789
795
|
|
|
790
|
-
|
|
796
|
+
if forward:
|
|
797
|
+
file_graph.add_edge(src_file_attr, tgt_file)
|
|
798
|
+
if reverse:
|
|
799
|
+
file_graph.add_edge(tgt_file, src_file_attr)
|
|
791
800
|
|
|
792
801
|
if not file_graph.edges():
|
|
793
802
|
return []
|
|
@@ -189,6 +189,66 @@ _GENERIC_RELATIONS: frozenset[str] = frozenset({"references", "uses", "mentions"
|
|
|
189
189
|
# `calls` is not ranked here.
|
|
190
190
|
_STRUCTURAL_MEMBER_RELATIONS: frozenset[str] = frozenset({"method", "contains"})
|
|
191
191
|
_CONFIDENCE_RANK: dict[str, int] = {"EXTRACTED": 3, "INFERRED": 2, "AMBIGUOUS": 1}
|
|
192
|
+
# The fields that say how sure the graph is of an edge and where that came from.
|
|
193
|
+
# A same-relation collision keeps one edge; the loser's copy of these fields is
|
|
194
|
+
# folded into the winner's `also_seen` list instead of being discarded (#4881).
|
|
195
|
+
_EVIDENCE_KEYS: tuple[str, ...] = ("confidence", "confidence_score", "source_file", "source_location")
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def _evidence(attrs: dict) -> dict:
|
|
199
|
+
"""The provenance fields of one edge (or ``also_seen`` entry), scalars only."""
|
|
200
|
+
out: dict = {}
|
|
201
|
+
for key in _EVIDENCE_KEYS:
|
|
202
|
+
val = attrs.get(key)
|
|
203
|
+
if isinstance(val, bool) or val is None or val == "":
|
|
204
|
+
continue
|
|
205
|
+
if key == "confidence_score":
|
|
206
|
+
try:
|
|
207
|
+
val = float(val)
|
|
208
|
+
except (TypeError, ValueError):
|
|
209
|
+
continue
|
|
210
|
+
if not math.isfinite(val):
|
|
211
|
+
continue
|
|
212
|
+
elif not isinstance(val, (str, int, float)):
|
|
213
|
+
continue
|
|
214
|
+
out[key] = val
|
|
215
|
+
return out
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def _evidence_sort_key(ev: dict) -> tuple:
|
|
219
|
+
# Weakest first: lowest confidence tier, then lowest score.
|
|
220
|
+
score = ev.get("confidence_score")
|
|
221
|
+
return (
|
|
222
|
+
_CONFIDENCE_RANK.get(str(ev.get("confidence", "")), 0),
|
|
223
|
+
score is None,
|
|
224
|
+
score if score is not None else 0.0,
|
|
225
|
+
str(ev.get("source_file", "")),
|
|
226
|
+
str(ev.get("source_location", "")),
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def edge_evidence(d: dict) -> list[dict]:
|
|
231
|
+
"""Every provenance record an edge carries: its own, then each ``also_seen``."""
|
|
232
|
+
also = d.get("also_seen")
|
|
233
|
+
return [d, *(a for a in also if isinstance(a, dict))] if isinstance(also, list) else [d]
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def _fold_also_seen(winner: dict, loser: dict) -> None:
|
|
237
|
+
"""Record ``loser``'s provenance on ``winner`` when the two collapse (#4881).
|
|
238
|
+
|
|
239
|
+
Entries that repeat the winner's own provenance, or each other, are dropped,
|
|
240
|
+
so re-feeding a written graph.json through the build is idempotent.
|
|
241
|
+
"""
|
|
242
|
+
own = _evidence(winner)
|
|
243
|
+
kept: list[dict] = []
|
|
244
|
+
for raw in (*edge_evidence(winner)[1:], loser, *edge_evidence(loser)[1:]):
|
|
245
|
+
ev = _evidence(raw)
|
|
246
|
+
if ev and not ev.items() <= own.items() and ev not in kept:
|
|
247
|
+
kept.append(ev)
|
|
248
|
+
if kept:
|
|
249
|
+
winner["also_seen"] = sorted(kept, key=_evidence_sort_key)
|
|
250
|
+
else:
|
|
251
|
+
winner.pop("also_seen", None)
|
|
192
252
|
|
|
193
253
|
# Import-family relations whose target may legitimately be a module OUTSIDE the
|
|
194
254
|
# graph (stdlib, a third-party dependency, another repo). Historically the edge
|
|
@@ -815,6 +875,39 @@ def disambiguate_file_labels_in_nodes(nodes: "list") -> None:
|
|
|
815
875
|
nodes[i]["label"] = new_label
|
|
816
876
|
|
|
817
877
|
|
|
878
|
+
def _qualify_csharp_method_labels(G: "nx.Graph") -> None:
|
|
879
|
+
"""Give C# method nodes an ``Owner.Name()`` display label (#4883). Ids and
|
|
880
|
+
edges are never changed, and an undirected graph's owner side is read from
|
|
881
|
+
the edge's recorded ``_src``/``_tgt``. Idempotent."""
|
|
882
|
+
from graphify.extractors.csharp import csharp_method_label_reassignments
|
|
883
|
+
method_edges = [
|
|
884
|
+
(data.get("_src", u), data.get("_tgt", v))
|
|
885
|
+
for u, v, data in G.edges(data=True)
|
|
886
|
+
if data.get("relation") == "method"
|
|
887
|
+
]
|
|
888
|
+
for nid, new_label in csharp_method_label_reassignments(
|
|
889
|
+
G.nodes(data=True), method_edges
|
|
890
|
+
).items():
|
|
891
|
+
G.nodes[nid]["label"] = new_label
|
|
892
|
+
|
|
893
|
+
|
|
894
|
+
def qualify_csharp_method_labels_in_nodes(nodes: "list", edges: "list") -> None:
|
|
895
|
+
"""Raw node/edge-list form of :func:`_qualify_csharp_method_labels`, in
|
|
896
|
+
place, for the --no-cluster writers that bypass build_from_json (#4883)."""
|
|
897
|
+
from graphify.extractors.csharp import csharp_method_label_reassignments
|
|
898
|
+
method_edges = [
|
|
899
|
+
(e.get("source"), e.get("target"))
|
|
900
|
+
for e in edges
|
|
901
|
+
if isinstance(e, dict) and e.get("relation") == "method"
|
|
902
|
+
]
|
|
903
|
+
reassigned = csharp_method_label_reassignments(
|
|
904
|
+
((n.get("id"), n) for n in nodes if isinstance(n, dict)), method_edges
|
|
905
|
+
)
|
|
906
|
+
for n in nodes:
|
|
907
|
+
if isinstance(n, dict) and n.get("id") in reassigned:
|
|
908
|
+
n["label"] = reassigned[n["id"]]
|
|
909
|
+
|
|
910
|
+
|
|
818
911
|
def _infer_merge_root(graph_path: Path) -> str | None:
|
|
819
912
|
"""Best-effort scan root for relativizing paths in build_merge when the caller
|
|
820
913
|
passes no ``root`` (#1571).
|
|
@@ -1076,6 +1169,7 @@ def _alias_index(nodes: "Iterable[tuple[str, dict]]") -> dict[str, str]:
|
|
|
1076
1169
|
endpoint the same way (#4670).
|
|
1077
1170
|
"""
|
|
1078
1171
|
from graphify.extractors.base import _file_stem as _fs
|
|
1172
|
+
from graphify.extractors.csharp import bare_csharp_method_label
|
|
1079
1173
|
from graphify.extractors.resolution import _PYTHON_STDLIB_MODULE_NAMES
|
|
1080
1174
|
|
|
1081
1175
|
alias_candidates: dict[str, set[str]] = {}
|
|
@@ -1109,8 +1203,10 @@ def _alias_index(nodes: "Iterable[tuple[str, dict]]") -> dict[str, str]:
|
|
|
1109
1203
|
alias = old_stem + suffix
|
|
1110
1204
|
alias_candidates.setdefault(_normalize_id(alias), set()).add(nid)
|
|
1111
1205
|
alias_candidates.setdefault(alias, set()).add(nid)
|
|
1112
|
-
|
|
1113
|
-
|
|
1206
|
+
m_label = str(attrs.get("label", ""))
|
|
1207
|
+
m_label = bare_csharp_method_label(m_label.strip(), sf) or m_label
|
|
1208
|
+
if attrs.get("_origin") == "ast" and m_label.startswith("."):
|
|
1209
|
+
m_name = make_id(m_label.strip().removeprefix(".").removesuffix("()"))
|
|
1114
1210
|
m_alias = f"{new_stem}_{m_name}"
|
|
1115
1211
|
if _normalize_id(nid) != _normalize_id(m_alias):
|
|
1116
1212
|
alias_candidates.setdefault(_normalize_id(m_alias), set()).add(nid)
|
|
@@ -1515,6 +1611,7 @@ def build_from_json(extraction: dict, *, directed: bool = False, root: str | Pat
|
|
|
1515
1611
|
_noloc_nodes: dict[tuple[str, str], str] = {} # (source_file, label) -> ghost node id
|
|
1516
1612
|
_ast_file_nodes: list[tuple[str, str]] = [] # (node_id, source_file) for AST file-self nodes (#3344)
|
|
1517
1613
|
_ast_method_nodes: dict[tuple[str, str], list[str]] = {} # (source_file, norm_method) -> [ast_nid, ...]
|
|
1614
|
+
from graphify.extractors.csharp import bare_csharp_method_label
|
|
1518
1615
|
|
|
1519
1616
|
# Pass 1: collect canonical nodes — AST-origin nodes take precedence over LLM nodes.
|
|
1520
1617
|
# When 2+ AST nodes share a key (same-named symbols in same-named files across
|
|
@@ -1576,8 +1673,9 @@ def build_from_json(extraction: dict, *, directed: bool = False, root: str | Pat
|
|
|
1576
1673
|
# a dotfile label like `.env` is never mistaken for a method
|
|
1577
1674
|
# (#3705 follow-up). Key on the normalized name for parity with
|
|
1578
1675
|
# the alias index below and the rest of the dedup passes.
|
|
1579
|
-
|
|
1580
|
-
|
|
1676
|
+
m_label = bare_csharp_method_label(label, sf) or label
|
|
1677
|
+
if m_label.startswith(".") and m_label.endswith("()"):
|
|
1678
|
+
m_name = make_id(m_label.removeprefix(".").removesuffix("()"))
|
|
1581
1679
|
_ast_method_nodes.setdefault((sf, m_name), []).append(nid)
|
|
1582
1680
|
else:
|
|
1583
1681
|
# First non-AST node for this (file, label) wins as canonical; a
|
|
@@ -1782,6 +1880,8 @@ def build_from_json(extraction: dict, *, directed: bool = False, root: str | Pat
|
|
|
1782
1880
|
if not math.isfinite(_num_val) or _num_val < 0:
|
|
1783
1881
|
_num_val = 1.0
|
|
1784
1882
|
attrs[_num_key] = _num_val
|
|
1883
|
+
if "also_seen" in attrs:
|
|
1884
|
+
_fold_also_seen(attrs, {})
|
|
1785
1885
|
# Backfill source_file from the endpoint nodes (every node carries one).
|
|
1786
1886
|
# Semantic/LLM edges occasionally omit it, which downstream validation
|
|
1787
1887
|
# flags and leaves query results with no file reference (#1279).
|
|
@@ -1870,6 +1970,15 @@ def build_from_json(extraction: dict, *, directed: bool = False, root: str | Pat
|
|
|
1870
1970
|
incoming_rel = attrs.get("relation")
|
|
1871
1971
|
reverse = existing.get("_src") == tgt and existing.get("_tgt") == src
|
|
1872
1972
|
if reverse and existing_rel == incoming_rel:
|
|
1973
|
+
# For an import the dropped leg is the other half of a two-file
|
|
1974
|
+
# cycle. Stamp the kept edge so find_import_cycles still sees it
|
|
1975
|
+
# (#4839); a type-only or deferred import closes no cycle.
|
|
1976
|
+
if (
|
|
1977
|
+
incoming_rel in ("imports_from", "re_exports")
|
|
1978
|
+
and not attrs.get("type_only")
|
|
1979
|
+
and not attrs.get("deferred")
|
|
1980
|
+
):
|
|
1981
|
+
existing["reverse_import"] = True
|
|
1873
1982
|
continue
|
|
1874
1983
|
# Different relations in opposite directions are two facts that only
|
|
1875
1984
|
# share a pair because the graph is undirected. A type's
|
|
@@ -1910,9 +2019,11 @@ def build_from_json(extraction: dict, *, directed: bool = False, root: str | Pat
|
|
|
1910
2019
|
existing_rank = _CONFIDENCE_RANK.get(existing_conf, 0)
|
|
1911
2020
|
incoming_rank = _CONFIDENCE_RANK.get(incoming_conf, 0)
|
|
1912
2021
|
if existing_rank > incoming_rank:
|
|
2022
|
+
_fold_also_seen(existing_attrs, attrs)
|
|
1913
2023
|
continue
|
|
1914
2024
|
if existing_rank == incoming_rank:
|
|
1915
2025
|
if existing_attrs.get("source_location") and not attrs.get("source_location"):
|
|
2026
|
+
_fold_also_seen(existing_attrs, attrs)
|
|
1916
2027
|
continue
|
|
1917
2028
|
existing_score = existing_attrs.get("confidence_score")
|
|
1918
2029
|
incoming_score = attrs.get("confidence_score")
|
|
@@ -1921,7 +2032,14 @@ def build_from_json(extraction: dict, *, directed: bool = False, root: str | Pat
|
|
|
1921
2032
|
and incoming_score is not None
|
|
1922
2033
|
and existing_score > incoming_score
|
|
1923
2034
|
):
|
|
2035
|
+
_fold_also_seen(existing_attrs, attrs)
|
|
1924
2036
|
continue
|
|
2037
|
+
_fold_also_seen(attrs, existing_attrs)
|
|
2038
|
+
# add_edge merges into the stored dict: a field only the loser
|
|
2039
|
+
# carried (its score, its line) would otherwise stay on the winner.
|
|
2040
|
+
for _key in (*_EVIDENCE_KEYS, "also_seen"):
|
|
2041
|
+
if _key not in attrs:
|
|
2042
|
+
existing_attrs.pop(_key, None)
|
|
1925
2043
|
G.add_edge(src, tgt, **attrs)
|
|
1926
2044
|
if dropped_schema_edges:
|
|
1927
2045
|
print(
|
|
@@ -1989,6 +2107,9 @@ def build_from_json(extraction: dict, *, directed: bool = False, root: str | Pat
|
|
|
1989
2107
|
# directory-qualified display label so lookup/discovery can disambiguate
|
|
1990
2108
|
# them (#2032). Labels only — ids and edges are untouched.
|
|
1991
2109
|
_disambiguate_file_node_labels(G)
|
|
2110
|
+
# Also last, after the method-ghost passes above: C# methods display with
|
|
2111
|
+
# their owning type (#4883).
|
|
2112
|
+
_qualify_csharp_method_labels(G)
|
|
1992
2113
|
return G
|
|
1993
2114
|
|
|
1994
2115
|
|
|
@@ -38,7 +38,7 @@ except Exception:
|
|
|
38
38
|
_EXTRACTOR_VERSION = "unknown"
|
|
39
39
|
|
|
40
40
|
# Bump when AST cache-key semantics change independently of the package version.
|
|
41
|
-
_AST_CACHE_SCHEMA =
|
|
41
|
+
_AST_CACHE_SCHEMA = 31 # Go credits a call in a package-level `var` initialiser (and its closures) to the file node (#4867); a Go method value passed as an argument is linked as an `indirect_call` (#4868); a Go receiver's field whose struct is declared in a sibling file of the same package is typed so its member calls resolve (#4866); and a Python dispatch table's `module.func` values resolve to the referenced functions as `indirect_call`s (#4773), so cached Go and Python extractions re-run; prior (30): File and per-declaration ids are kept distinct so a top-level declaration sharing the file's name is not dropped (#4854); a SystemVerilog `function new(...)` constructor gets its own node, `method` edge and parameter refs (#4848); a Go `var x = T{}`/`var x = &T{}` types `x` as `T` for receiver resolution like `x := T{}` (#4843); a PowerShell `using module`/`using assembly` name drops its file extension (#4847); a Solidity free-function `using {a, b} for T` set emits `uses` edges (#4846); a CommonLisp forward-referenced superclass binds to its local node instead of a sourceless stub (#4845); and Pascal `inherited`/`inline` form component blocks are recognised so later `object` blocks keep their parent (#4844), so cached extractions across those languages re-run; prior (29): OCaml `and`-chained module/class bindings are all walked (only the first was, so later bindings were silently dropped, #4822), and a SystemVerilog class `task` method is modeled like a `function` one with its own node and parameter refs while its task-locals no longer leak as class fields (#4774), so cached OCaml and Verilog/SystemVerilog extractions re-run; prior (28): Markdown ATX headings parse per CommonMark (closing `#` runs dropped, 0-3 space indent, hash-only lines mint no node, #4790) and fenced code blocks are tracked by CommonMark rules so headings inside fences stop leaking (#4787); YAML keys carry their written spelling and real line and `on`/`off`/`yes`/`no` keys no longer fold to booleans (#4784); rationale labels redact more credential shapes before caching (#4647); Razor `@implements` interface edges are extracted (#4820); aliased Terraform providers get their own node and `provider =` refs resolve (#4819); COBOL paragraphs after a nested `END PROGRAM` reattach to the enclosing program (#4824); Blade `wire:click` binds the bare method name (#4823); a Pascal record is a type with its own methods (#4825); VB.NET operator declarations are extracted as members with their bodies walked (#4821); and a Fortran call resolves to the subroutine it names (#4795), so cached Markdown/YAML/rationale/Razor/Terraform/COBOL/Blade/Pascal/VB.NET/Fortran extractions re-run; prior (27): VB.NET external namespace/type stubs now carry a `source_file` sentinel (#4725); Python member calls resolve through injected fields and method-result types (#4726); a Rust `use` is scoped to the crate it names (#4699), so cached VB.NET/Python/Rust extractions re-run; prior (26): Zig no longer crosses a call between a method and a same-named free function (#4755), and a Dart unnamed `extension on T` is detected (#4741), so cached Zig and Dart extractions re-run; prior (25): Python/Go/C++/Rust explicit type aliases (and Rust `union` items) are extracted as type nodes so references resolve instead of minting sourceless stubs (#4578/#4579/#4580/#4581); each C# method overload gets its own node bound by arity (#4584); a package.json dependency's manifest entry links to its ref node (#4569), so cached extractions re-run; prior (24): Objective-C `NS_CLOSED_ENUM` declarations are extracted as enums like `NS_ENUM` (#4705), and a `CREATE TABLE` whose column default the SQL grammar rejects (MySQL `DEFAULT current_timestamp()`) is recovered from its ERROR node (#4613), so cached ObjC and SQL extractions re-run; prior (23): `.yaml`/`.yml` files are structurally extracted (keys as nodes, config-vs-data gated) and reclassified from document to code (#2214), so cached YAML re-extracts; prior (22): SQL labels drop T-SQL brackets and routine bodies emit `reads_from`/`writes_to` (#4635), and a `GO` batch separator ends a statement (#4651), so cached `.sql` extractions re-run; prior (21): a CommonJS `const X = require('./m')` binding no longer mints a module-scope node that shadows the class the required file exports, so `new X()` resolves to the required declaration (#4621); prior (20): Obsidian `[[wikilink]]` targets that start with the scan root's own folder names now resolve to the real page (#4559), so cached markdown extractions re-run; prior (19): Dart `typedef` declarations are extracted as aliases (not variables of type `typedef`); C++ Metal/CUDA GPU qualifiers no longer mint sourceless god nodes (#4550); a `.h` header containing `extern "C"` routes to the C++ extractor; prior (18): Kotlin `typealias` (#4553), C# `delegate` (#4552), and Swift `macro` declarations (#4551) are now extracted so references stop minting sourceless stubs; Rust `use` rooted at a `mod` declared in the same scope carries `_rust_use_name` (#4564); prior (17): Python pytest-fixture markers (`_py_fixture`/`_python_fixture_param`, #4332) and module-level class-id collision salting (#2810); TS `this.field` typed from any method incl. static (#4473); Solidity callables carry `metadata.arity` + inherited-call/`super`/modifier raw calls (#4379); Go type-decl and Rust file-item case-distinct node ids (#4444); prior (16): Rust `use` edges carry the imported name as written (`_rust_use_name`, #4439); (15): Go generic receiver types normalized (`Box[T]` -> `Box`) so methods attach to the type node; prior (14): C# receiver resolution for nameless/`new X()`/`foreach` receivers (defer + receiver-chain markers) and `_`/case-distinct node ids (underscore-salted); prior (13): Kotlin/Scala/C++/Swift generic & template type params no longer mint sourceless stubs; Objective-C NS_ENUM/NS_OPTIONS extraction and `_callable`/`_callable_class` markers; Go and PHP receiver-typed member calls park cross-repo (`go_type_table`/`php_type_table`, receiver fields); prior (12): Java inherited-supertype (`receiver_unbound`) and chained/new/cast receiver typing (`java_receiver_chain`, `_java_ret`); C/C++ quoted cross-directory include provenance (`include_kind`); JS external imports anchored to the package, not the path leaf; prior (11): Python property-accessor decorators / `Self`, Swift `Self`, Go generic type params, Python forward type-hint file node, PowerShell dot-source, C# verbatim-interpolated string recovery; (10): C# partial types carry `type_path`; (9): Python property-read raw calls and `_py_property` nodes; (8): Rust `use`-group per-binding edges; (7): Python opaque-base/super(args) markers + nested-class enclosing ids.
|
|
42
42
|
|
|
43
43
|
|
|
44
44
|
# Per-process memo: distributions() scans site-packages metadata, which is
|
|
@@ -1965,7 +1965,7 @@ def dispatch_command(cmd: str) -> None:
|
|
|
1965
1965
|
file=sys.stderr,
|
|
1966
1966
|
)
|
|
1967
1967
|
sys.exit(1)
|
|
1968
|
-
from graphify.serve import _is_ambiguity_refusal, _resolve_path_endpoint
|
|
1968
|
+
from graphify.serve import _confidence_tag, _is_ambiguity_refusal, _resolve_path_endpoint
|
|
1969
1969
|
from networkx.readwrite import json_graph
|
|
1970
1970
|
import networkx as _nx
|
|
1971
1971
|
|
|
@@ -2054,12 +2054,14 @@ def dispatch_command(cmd: str) -> None:
|
|
|
2054
2054
|
# returned an arbitrary route among equal-length paths that varied per
|
|
2055
2055
|
# process. Build a sorted, materialized graph so neighbor order — and
|
|
2056
2056
|
# thus the chosen path — is canonical for a given graph.json.
|
|
2057
|
+
from graphify.serve import _weakest_shortest_path
|
|
2057
2058
|
try:
|
|
2058
2059
|
if undirected:
|
|
2059
2060
|
_und = _nx.Graph()
|
|
2060
2061
|
_und.add_nodes_from(sorted(G.nodes))
|
|
2061
2062
|
_und.add_edges_from(sorted((min(u, v), max(u, v)) for u, v in G.edges()))
|
|
2062
|
-
path_nodes =
|
|
2063
|
+
path_nodes, _n_routes, _routes_capped = _weakest_shortest_path(
|
|
2064
|
+
_und, G, src_nid, tgt_nid)
|
|
2063
2065
|
else:
|
|
2064
2066
|
# Directed by default (#2487). True direction is NOT raw arc
|
|
2065
2067
|
# order: legacy canonicalized files persist a flipped arc with
|
|
@@ -2084,7 +2086,8 @@ def dispatch_command(cmd: str) -> None:
|
|
|
2084
2086
|
for u, v, d in G.edges(data=True)
|
|
2085
2087
|
if d.get("relation") == "contains"
|
|
2086
2088
|
))
|
|
2087
|
-
path_nodes =
|
|
2089
|
+
path_nodes, _n_routes, _routes_capped = _weakest_shortest_path(
|
|
2090
|
+
_dg, G, src_nid, tgt_nid)
|
|
2088
2091
|
except (_nx.NetworkXNoPath, _nx.NodeNotFound):
|
|
2089
2092
|
if undirected:
|
|
2090
2093
|
print(f"No path found between '{source_label}' and '{target_label}'.")
|
|
@@ -2097,7 +2100,9 @@ def dispatch_command(cmd: str) -> None:
|
|
|
2097
2100
|
sys.exit(0)
|
|
2098
2101
|
hops = len(path_nodes) - 1
|
|
2099
2102
|
segments = []
|
|
2100
|
-
|
|
2103
|
+
hop_datas: list[list[dict]] = []
|
|
2104
|
+
from graphify.build import edge_datas, edge_evidence
|
|
2105
|
+
from graphify.serve import _path_confidence_line
|
|
2101
2106
|
for i in range(len(path_nodes) - 1):
|
|
2102
2107
|
u, v = path_nodes[i], path_nodes[i + 1]
|
|
2103
2108
|
# Report the ACTUAL stored relation(s) of the traversed pair and
|
|
@@ -2116,10 +2121,11 @@ def dispatch_command(cmd: str) -> None:
|
|
|
2116
2121
|
for d in edge_datas(G, a, b):
|
|
2117
2122
|
(fwd if d.get("_src", a) == u else bwd).append(d)
|
|
2118
2123
|
datas = fwd or bwd
|
|
2124
|
+
hop_datas.append(datas)
|
|
2119
2125
|
forward = bool(fwd)
|
|
2120
2126
|
rels = sorted({d.get("relation") for d in datas if d.get("relation")})
|
|
2121
2127
|
rel = "/".join(rels) if rels else "related"
|
|
2122
|
-
confs = sorted({
|
|
2128
|
+
confs = sorted({_confidence_tag(e) for d in datas for e in edge_evidence(d) if e.get("confidence")})
|
|
2123
2129
|
conf_str = f" [{'/'.join(confs)}]" if confs else ""
|
|
2124
2130
|
if i == 0:
|
|
2125
2131
|
segments.append(G.nodes[u].get("label", u))
|
|
@@ -2128,6 +2134,13 @@ def dispatch_command(cmd: str) -> None:
|
|
|
2128
2134
|
else:
|
|
2129
2135
|
segments.append(f"<--{rel}{conf_str}-- {G.nodes[v].get('label', v)}")
|
|
2130
2136
|
print(f"Shortest path ({hops} hops):\n " + " ".join(segments))
|
|
2137
|
+
_summary = _path_confidence_line(hop_datas)
|
|
2138
|
+
if _summary and _n_routes > 1:
|
|
2139
|
+
# Several routes tie on length; report the weakest's confidence so it
|
|
2140
|
+
# never overstates how sure the connection is (#4881).
|
|
2141
|
+
_summary += f" (weakest of {'256+' if _routes_capped else _n_routes} equal-length routes)"
|
|
2142
|
+
if _summary:
|
|
2143
|
+
print(_summary)
|
|
2131
2144
|
from graphify import querylog
|
|
2132
2145
|
querylog.log_query(
|
|
2133
2146
|
kind="path",
|
|
@@ -2149,7 +2162,7 @@ def dispatch_command(cmd: str) -> None:
|
|
|
2149
2162
|
if len(sys.argv) == 3 and sys.argv[2] in ("--help", "-h"):
|
|
2150
2163
|
print(_explain_usage)
|
|
2151
2164
|
return
|
|
2152
|
-
from graphify.serve import _is_ambiguity_refusal, _resolve_single_node
|
|
2165
|
+
from graphify.serve import _confidence_tag, _is_ambiguity_refusal, _resolve_single_node
|
|
2153
2166
|
from networkx.readwrite import json_graph
|
|
2154
2167
|
|
|
2155
2168
|
label = sys.argv[2]
|
|
@@ -2232,7 +2245,7 @@ def dispatch_command(cmd: str) -> None:
|
|
|
2232
2245
|
shown = connections if show_all else connections[:20]
|
|
2233
2246
|
for direction, nb, edata in shown:
|
|
2234
2247
|
rel = edata.get("relation", "")
|
|
2235
|
-
conf = edata
|
|
2248
|
+
conf = _confidence_tag(edata)
|
|
2236
2249
|
arrow = "-->" if direction == "out" else "<--"
|
|
2237
2250
|
# Append the edge's location — the actual call/import/reference
|
|
2238
2251
|
# SITE (in the caller's file for an incoming call), not a def
|
|
@@ -4399,7 +4412,7 @@ def dispatch_command(cmd: str) -> None:
|
|
|
4399
4412
|
"_rust_impl_key", "_rust_declaration_count",
|
|
4400
4413
|
"_ts_public_twin", "_py_property", "_java_ret",
|
|
4401
4414
|
"_ts_fields", "_ts_static_fields",
|
|
4402
|
-
"_py_fixture", "_py_return_type",
|
|
4415
|
+
"_py_fixture", "_py_return_type", "_go_fields",
|
|
4403
4416
|
):
|
|
4404
4417
|
if _node.get(_marker):
|
|
4405
4418
|
_ctx_node[_marker] = _node[_marker]
|
|
@@ -4947,6 +4960,8 @@ def dispatch_command(cmd: str) -> None:
|
|
|
4947
4960
|
# gets this), so apply it directly on the merged node list.
|
|
4948
4961
|
from graphify.build import disambiguate_file_labels_in_nodes as _disamb_labels
|
|
4949
4962
|
_disamb_labels(merged["nodes"])
|
|
4963
|
+
from graphify.build import qualify_csharp_method_labels_in_nodes as _qualify_cs_methods
|
|
4964
|
+
_qualify_cs_methods(merged["nodes"], merged["edges"])
|
|
4950
4965
|
# Same endpoint rules as build_from_json (#2873): an import of an
|
|
4951
4966
|
# external module gets a typed stub node, and any other edge without
|
|
4952
4967
|
# two declared endpoints is dropped instead of shipping a phantom.
|
|
@@ -446,12 +446,14 @@ def _rank_path(source_file: str, root: Path | None) -> str:
|
|
|
446
446
|
|
|
447
447
|
|
|
448
448
|
def _collision_rank(node: dict, root: Path | None = None,
|
|
449
|
-
mentions: "frozenset | set" = frozenset()
|
|
449
|
+
mentions: "frozenset | set" = frozenset(),
|
|
450
|
+
outranked: "frozenset | set" = frozenset()) -> tuple:
|
|
450
451
|
"""A total order for choosing the survivor of an ID collision, independent of
|
|
451
452
|
the order the colliding nodes arrive in.
|
|
452
453
|
|
|
453
454
|
The winner is the node with the SMALLEST rank. A node whose ``source_file``
|
|
454
|
-
defines the ID always outranks a mere reference
|
|
455
|
+
defines the ID always outranks a mere reference, and a definer listed in
|
|
456
|
+
``outranked`` ranks behind the other definers (#4859); among equally-(non-)defining
|
|
455
457
|
nodes an active/in-progress path outranks an archived/done one (#2532); then
|
|
456
458
|
it prefers the shorter, more canonical label over a longer qualified variant,
|
|
457
459
|
then breaks any remaining tie lexically on label and finally on the REVERSED
|
|
@@ -470,6 +472,14 @@ def _collision_rank(node: dict, root: Path | None = None,
|
|
|
470
472
|
level up (#3775/#3786). It changes no collision between two sourced
|
|
471
473
|
nodes, since both sides of that key agree there.
|
|
472
474
|
|
|
475
|
+
``outranked`` (see ``_outranked_by_ast``) holds the ``(id, file)`` of non-AST
|
|
476
|
+
definers that another file's AST node also defines. A doc whose own path
|
|
477
|
+
prefixes a code entity's id (``pkg.md`` beside ``pkg/test_x.py``) defines it
|
|
478
|
+
too, and used to take it on a shorter label, so its next re-extract deleted the
|
|
479
|
+
code node (#4859). Such a definer now ranks right behind the other definers;
|
|
480
|
+
same-file pairs (#2091), same-stem twins, and collisions with one definer
|
|
481
|
+
rank as before.
|
|
482
|
+
|
|
473
483
|
``mentions`` (see ``_mentions``) holds the ``(id, file)`` of nodes read as a
|
|
474
484
|
mention of a document rather than the document itself. Such a node ranks as a
|
|
475
485
|
reference even though its id is a path slice, so a real document outranks it
|
|
@@ -481,8 +491,10 @@ def _collision_rank(node: dict, root: Path | None = None,
|
|
|
481
491
|
"""
|
|
482
492
|
label = node.get("label") or ""
|
|
483
493
|
rank_path = _rank_path(node.get("source_file") or "", root)
|
|
494
|
+
key = (node.get("id"), rank_path)
|
|
484
495
|
return (
|
|
485
|
-
not _defines_id(node) or
|
|
496
|
+
not _defines_id(node) or key in mentions,
|
|
497
|
+
key in outranked and node.get("_origin") != "ast", # (#4859)
|
|
486
498
|
not node.get("source_file"), # a located node beats a source-less one (#4492)
|
|
487
499
|
_lifecycle_penalty(rank_path), # active paths beat archived ones (#2532)
|
|
488
500
|
len(label), # shorter, more canonical label first
|
|
@@ -491,6 +503,40 @@ def _collision_rank(node: dict, root: Path | None = None,
|
|
|
491
503
|
)
|
|
492
504
|
|
|
493
505
|
|
|
506
|
+
def _outranked_by_ast(nodes: list[dict], root: Path | None,
|
|
507
|
+
mentions: "frozenset | set") -> set[tuple[str, str]]:
|
|
508
|
+
"""``(id, root-relative file)`` of non-AST definers that an AST node from
|
|
509
|
+
another file also defines, while their own file has no AST definer (#4859).
|
|
510
|
+
|
|
511
|
+
The AST node is extracted fact and the other is an inference about it, so the
|
|
512
|
+
AST node keeps the id. The check is strict on ``_origin == "ast"``, as in the
|
|
513
|
+
build ghost pass: fresh semantic chunks arrive unstamped. A file that has its
|
|
514
|
+
own AST definer (#2091 enrichment) is never listed, and an AST node with the
|
|
515
|
+
same full stem (an ``x.py``/``x.html`` twin, or a slug twin such as
|
|
516
|
+
``pkg/service.py`` and ``pkg_service.py``) never counts against it.
|
|
517
|
+
"""
|
|
518
|
+
ast_defs: dict[str, list[tuple[str, str]]] = defaultdict(list)
|
|
519
|
+
others: list[tuple[str, str, str]] = []
|
|
520
|
+
for node in nodes:
|
|
521
|
+
nid = node.get("id") or ""
|
|
522
|
+
source_file = node.get("source_file") or ""
|
|
523
|
+
rank_path = _rank_path(source_file, root)
|
|
524
|
+
if not nid or not _defines_id(node) or (nid, rank_path) in mentions:
|
|
525
|
+
continue
|
|
526
|
+
entry = (rank_path, _full_stem(source_file))
|
|
527
|
+
if node.get("_origin") == "ast":
|
|
528
|
+
ast_defs[nid].append(entry)
|
|
529
|
+
else:
|
|
530
|
+
others.append((nid, *entry))
|
|
531
|
+
outranked = set()
|
|
532
|
+
for nid, rank_path, stem in others:
|
|
533
|
+
defs = ast_defs.get(nid, [])
|
|
534
|
+
if (defs and rank_path not in {rp for rp, _ in defs}
|
|
535
|
+
and any(ast_stem != stem for _, ast_stem in defs)):
|
|
536
|
+
outranked.add((nid, rank_path))
|
|
537
|
+
return outranked
|
|
538
|
+
|
|
539
|
+
|
|
494
540
|
def _mentions(nodes: list[dict], edges: list[dict],
|
|
495
541
|
root: Path | None) -> set[tuple[str, str]]:
|
|
496
542
|
"""``(id, root-relative file)`` of nodes read as a MENTION of a document (#4281).
|
|
@@ -1104,6 +1150,7 @@ def deduplicate_entities(
|
|
|
1104
1150
|
nodes, edges, hyperedges, root_resolved,
|
|
1105
1151
|
)
|
|
1106
1152
|
mentions = _mentions(nodes, edges, root_resolved) | _slice_references(nodes, root_resolved)
|
|
1153
|
+
outranked = _outranked_by_ast(nodes, root_resolved, mentions)
|
|
1107
1154
|
seen_ids: dict[str, dict] = {}
|
|
1108
1155
|
dropped: dict[str, list[dict]] = defaultdict(list)
|
|
1109
1156
|
for node in nodes:
|
|
@@ -1113,8 +1160,8 @@ def deduplicate_entities(
|
|
|
1113
1160
|
incumbent = seen_ids.get(nid)
|
|
1114
1161
|
if incumbent is None:
|
|
1115
1162
|
seen_ids[nid] = node
|
|
1116
|
-
elif (_collision_rank(node, root_resolved, mentions)
|
|
1117
|
-
< _collision_rank(incumbent, root_resolved, mentions)):
|
|
1163
|
+
elif (_collision_rank(node, root_resolved, mentions, outranked)
|
|
1164
|
+
< _collision_rank(incumbent, root_resolved, mentions, outranked)):
|
|
1118
1165
|
# Smallest-ranked node wins; the min over a total order is independent
|
|
1119
1166
|
# of the order nodes arrive in, so the survivor no longer depends on
|
|
1120
1167
|
# chunk ordering (#1851).
|
|
@@ -1132,7 +1179,7 @@ def deduplicate_entities(
|
|
|
1132
1179
|
survivor = seen_ids[nid]
|
|
1133
1180
|
same_source = sorted(
|
|
1134
1181
|
(l for l in losers if _same_source_entity(survivor, l)),
|
|
1135
|
-
key=lambda l: _collision_rank(l, root_resolved, mentions),
|
|
1182
|
+
key=lambda l: _collision_rank(l, root_resolved, mentions, outranked),
|
|
1136
1183
|
)
|
|
1137
1184
|
for loser in same_source:
|
|
1138
1185
|
survivor = _merge_missing_attributes(survivor, loser)
|
|
@@ -564,7 +564,7 @@ def to_cypher(G: nx.Graph, output_path: str) -> None:
|
|
|
564
564
|
(data.get("file_type", "unknown") or "unknown").capitalize(),
|
|
565
565
|
"Entity",
|
|
566
566
|
)
|
|
567
|
-
lines.append(f"MERGE (n:{ftype} {{id: '{node_id_esc}'
|
|
567
|
+
lines.append(f"MERGE (n:{ftype} {{id: '{node_id_esc}'}}) SET n.label = '{label}';")
|
|
568
568
|
lines.append("")
|
|
569
569
|
for u, v, data in G.edges(data=True):
|
|
570
570
|
u, v = data.get("_src", u), data.get("_tgt", v)
|